From 7f5fd390ee083a3d03edb35412f1f32284b6dfe9 Mon Sep 17 00:00:00 2001 From: Saravanan M Date: Mon, 13 Mar 2023 22:37:03 +0530 Subject: [PATCH 1/5] fix: Fixed fallback github content url --- client/config/dev/Try.Config.purs | 2 +- client/config/prod/Try.Config.purs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/config/dev/Try.Config.purs b/client/config/dev/Try.Config.purs index b3551a5c..7c91b991 100644 --- a/client/config/dev/Try.Config.purs +++ b/client/config/dev/Try.Config.purs @@ -12,4 +12,4 @@ tag :: String tag = "master" mainGitHubExample :: String -mainGitHubExample = "/purescript/trypurescript/" <> tag <> "/client/examples/Main.purs" +mainGitHubExample = "purescript/trypurescript/" <> tag <> "/client/examples/Main.purs" diff --git a/client/config/prod/Try.Config.purs b/client/config/prod/Try.Config.purs index 936b4b10..9bd64d68 100644 --- a/client/config/prod/Try.Config.purs +++ b/client/config/prod/Try.Config.purs @@ -12,4 +12,4 @@ tag :: String tag = "master" mainGitHubExample :: String -mainGitHubExample = "/purescript/trypurescript/" <> tag <> "/client/examples/Main.purs" +mainGitHubExample = "purescript/trypurescript/" <> tag <> "/client/examples/Main.purs" From fa1e9bab652201eced0aab5e06a27bb1a3a19348 Mon Sep 17 00:00:00 2001 From: JordanMartinez Date: Tue, 18 Jul 2023 17:50:58 -0700 Subject: [PATCH 2/5] Update to purs 0.15.10 (#310) --- CHANGELOG.md | 6 ++++++ client/src/Try/SharedConfig.purs | 4 ++-- stack.yaml | 2 +- staging/packages.dhall | 4 ++-- staging/spago.dhall | 27 +++++++++++++++++++++++++-- 5 files changed, 36 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 54b68114..10c1cd16 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,12 @@ Bugfixes: Other improvements: +## [v2023-07-18.1](https://github.com/purescript/trypurescript/releases/tag/v2023-07-18.1) + +Other improvements: +- Bump PureScript to `0.15.10` (#306 by @JordanMartinez) +- Update to latest package set (#306 by @JordanMartinez) + ## [v2023-03-06.1](https://github.com/purescript/trypurescript/releases/tag/v2023-03-06.1) Other improvements: diff --git a/client/src/Try/SharedConfig.purs b/client/src/Try/SharedConfig.purs index 5fd129aa..2d7a3b3c 100644 --- a/client/src/Try/SharedConfig.purs +++ b/client/src/Try/SharedConfig.purs @@ -6,13 +6,13 @@ module Try.SharedConfig where import Prelude pursVersion :: String -pursVersion = "v0.15.8" +pursVersion = "v0.15.10" pursReleaseUrl :: String pursReleaseUrl = "https://github.com/purescript/purescript/releases/tag/" <> pursVersion packageSetVersion :: String -packageSetVersion = "0.15.7-20230306" +packageSetVersion = "0.15.9-20230718" packageSetPackageJsonUrl :: String packageSetPackageJsonUrl = "https://github.com/purescript/package-sets/blob/psc-" <> packageSetVersion <> "/packages.json" diff --git a/stack.yaml b/stack.yaml index e54cf96c..c73039fc 100644 --- a/stack.yaml +++ b/stack.yaml @@ -3,7 +3,7 @@ packages: - "." extra-deps: - - purescript-0.15.8 + - purescript-0.15.10 - language-javascript-0.7.0.0 - process-1.6.13.1 # The Cabal library is not in Stackage diff --git a/staging/packages.dhall b/staging/packages.dhall index 1622cf74..83198a26 100644 --- a/staging/packages.dhall +++ b/staging/packages.dhall @@ -1,6 +1,6 @@ let upstream = - https://github.com/purescript/package-sets/releases/download/psc-0.15.7-20230306/packages.dhall - sha256:0757626c7422b8b5b5b1d0df3d3628e5deac755d7f89c433a9bf89009787dcbd + https://github.com/purescript/package-sets/releases/download/psc-0.15.9-20230718/packages.dhall + sha256:661c257c997f37bba1b169020a87ae6ea08eb998e931875cb92e86ac9ea26846 in upstream with metadata.version = "v0.15.8" diff --git a/staging/spago.dhall b/staging/spago.dhall index 18bf87d0..5c1a57cf 100644 --- a/staging/spago.dhall +++ b/staging/spago.dhall @@ -1,7 +1,6 @@ { name = "try-purescript-server" , dependencies = - [ "abc-parser" - , "ace" + [ "ace" , "aff" , "aff-bus" , "aff-coroutines" @@ -36,6 +35,7 @@ , "bifunctors" , "bigints" , "bolson" + , "bookhound" , "bower-json" , "bucketchain" , "bucketchain-basic-auth" @@ -76,6 +76,7 @@ , "coroutines" , "crypto" , "css" + , "css-frameworks" , "datetime" , "datetime-parsing" , "debug" @@ -90,6 +91,7 @@ , "dom-indexed" , "dotenv" , "droplet" + , "dts" , "dynamic-buffer" , "echarts-simple" , "effect" @@ -124,6 +126,7 @@ , "foreign" , "foreign-object" , "foreign-readwrite" + , "forgetmenot" , "fork" , "form-urlencoded" , "formatters" @@ -139,6 +142,7 @@ , "gen" , "generate-values" , "generic-router" + , "geojson" , "geometry-plane" , "github-actions-toolkit" , "grain" @@ -159,6 +163,7 @@ , "halogen-storybook" , "halogen-subscriptions" , "halogen-svg-elems" + , "halogen-typewriter" , "halogen-vdom" , "halogen-vdom-string-renderer" , "heckin" @@ -188,6 +193,8 @@ , "js-bigints" , "js-date" , "js-fileio" + , "js-iterators" + , "js-maps" , "js-promise" , "js-promise-aff" , "js-timers" @@ -195,11 +202,13 @@ , "json-codecs" , "justifill" , "jwt" + , "labeled-data" , "language-cst-parser" , "lazy" , "lazy-joe" , "lcg" , "leibniz" + , "liminal" , "linalg" , "lists" , "literals" @@ -232,6 +241,7 @@ , "mysql" , "n3" , "nano-id" + , "nanoid" , "naturals" , "nested-functor" , "newtype" @@ -240,6 +250,7 @@ , "node-buffer" , "node-buffer-blob" , "node-child-process" + , "node-env-paths" , "node-event-emitter" , "node-execa" , "node-fs" @@ -247,6 +258,7 @@ , "node-http" , "node-human-signals" , "node-net" + , "node-os" , "node-path" , "node-process" , "node-readline" @@ -259,7 +271,10 @@ , "now" , "npm-package-json" , "nullable" + , "numberfield" , "numbers" + , "oak" + , "oak-debug" , "object-maps" , "ocarina" , "open-folds" @@ -278,8 +293,10 @@ , "pathy" , "pha" , "phaser" + , "phylio" , "pipes" , "pirates-charm" + , "pmock" , "point-free" , "pointed-list" , "polymorphic-vectors" @@ -355,6 +372,7 @@ , "sparse-polynomials" , "spec" , "spec-discovery" + , "spec-golden" , "spec-quickcheck" , "splitmix" , "ssrs" @@ -382,6 +400,7 @@ , "transformation-matrix" , "transformers" , "tree-rose" + , "ts-bridge" , "tuples" , "two-or-more" , "type-equality" @@ -410,6 +429,7 @@ , "uuidv4" , "validation" , "variant" + , "variant-encodings" , "vectorfield" , "vectors" , "versions" @@ -426,6 +446,7 @@ , "web-file" , "web-geometry" , "web-html" + , "web-intl" , "web-pointerevents" , "web-proletarian" , "web-promise" @@ -440,12 +461,14 @@ , "web-workers" , "web-xhr" , "webextension-polyfill" + , "webgpu" , "which" , "yoga-fetch" , "yoga-json" , "yoga-om" , "yoga-postgres" , "yoga-tree" + , "z3" ] , packages = ./packages.dhall , sources = [ "src/**/*.purs" ] From 735dda25982dbe9290712d34b41736d29f03c20b Mon Sep 17 00:00:00 2001 From: Thomas Honeyman Date: Tue, 18 Jul 2023 21:37:10 -0400 Subject: [PATCH 3/5] Fix PR reference in changelog (#311) --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 10c1cd16..36e46c28 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,8 +15,8 @@ Other improvements: ## [v2023-07-18.1](https://github.com/purescript/trypurescript/releases/tag/v2023-07-18.1) Other improvements: -- Bump PureScript to `0.15.10` (#306 by @JordanMartinez) -- Update to latest package set (#306 by @JordanMartinez) +- Bump PureScript to `0.15.10` (#310 by @JordanMartinez) +- Update to latest package set (#310 by @JordanMartinez) ## [v2023-03-06.1](https://github.com/purescript/trypurescript/releases/tag/v2023-03-06.1) From eb86967947f05d6318a50cbe0e5c5a3598bc085d Mon Sep 17 00:00:00 2001 From: JordanMartinez Date: Fri, 22 Dec 2023 09:53:00 -0800 Subject: [PATCH 4/5] Update to 0.15.13 & latest set (#312) --- CHANGELOG.md | 6 +++ client/src/Try/SharedConfig.purs | 4 +- stack.yaml | 2 +- stack.yaml.lock | 8 ++-- staging/packages.dhall | 6 +-- staging/spago.dhall | 69 ++++++++++++++------------------ 6 files changed, 46 insertions(+), 49 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 36e46c28..e73a1d66 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,12 @@ Bugfixes: Other improvements: +## [v2023-12-22.1](https://github.com/purescript/trypurescript/releases/tag/v2023-12-22.1) + +Other improvements: +- Bump PureScript to `0.15.13` (#306 by @JordanMartinez) +- Update to latest package set (#306 by @JordanMartinez) + ## [v2023-07-18.1](https://github.com/purescript/trypurescript/releases/tag/v2023-07-18.1) Other improvements: diff --git a/client/src/Try/SharedConfig.purs b/client/src/Try/SharedConfig.purs index 2d7a3b3c..257f6f73 100644 --- a/client/src/Try/SharedConfig.purs +++ b/client/src/Try/SharedConfig.purs @@ -6,13 +6,13 @@ module Try.SharedConfig where import Prelude pursVersion :: String -pursVersion = "v0.15.10" +pursVersion = "v0.15.13" pursReleaseUrl :: String pursReleaseUrl = "https://github.com/purescript/purescript/releases/tag/" <> pursVersion packageSetVersion :: String -packageSetVersion = "0.15.9-20230718" +packageSetVersion = "0.15.13-20231219" packageSetPackageJsonUrl :: String packageSetPackageJsonUrl = "https://github.com/purescript/package-sets/blob/psc-" <> packageSetVersion <> "/packages.json" diff --git a/stack.yaml b/stack.yaml index c73039fc..1949f546 100644 --- a/stack.yaml +++ b/stack.yaml @@ -3,7 +3,7 @@ packages: - "." extra-deps: - - purescript-0.15.10 + - purescript-0.15.13 - language-javascript-0.7.0.0 - process-1.6.13.1 # The Cabal library is not in Stackage diff --git a/stack.yaml.lock b/stack.yaml.lock index a7b0a777..7dccce77 100644 --- a/stack.yaml.lock +++ b/stack.yaml.lock @@ -5,12 +5,12 @@ packages: - completed: - hackage: purescript-0.15.8@sha256:5d7c19e5a49f83acbe8ecc43bf93feb0e075bb11992df9b83af4467aea0bf41d,21427 + hackage: purescript-0.15.13@sha256:ed7e4d3561ff6cbc7f950af2450a51f71648c47fece8b9a2b5100f0157a47615,21378 pantry-tree: - sha256: 79dde609e3b525e30234fd76b0901f72d48dea47a879d547864d959f85b81760 - size: 156457 + sha256: f91a02104c2bb596613dca4cf460e8e218488791b8d2f1d0641cd0e73c9eb072 + size: 159072 original: - hackage: purescript-0.15.8 + hackage: purescript-0.15.13 - completed: hackage: language-javascript-0.7.0.0@sha256:3eab0262b8ac5621936a4beab6a0f97d0e00a63455a8b0e3ac1547b4088dae7d,3898 pantry-tree: diff --git a/staging/packages.dhall b/staging/packages.dhall index 83198a26..d64e8014 100644 --- a/staging/packages.dhall +++ b/staging/packages.dhall @@ -1,6 +1,6 @@ let upstream = - https://github.com/purescript/package-sets/releases/download/psc-0.15.9-20230718/packages.dhall - sha256:661c257c997f37bba1b169020a87ae6ea08eb998e931875cb92e86ac9ea26846 + https://github.com/purescript/package-sets/releases/download/psc-0.15.13-20231219/packages.dhall + sha256:35b9271b0a49390a9681995c609dbf7357402a1f209e0549d840bca295abe57b in upstream - with metadata.version = "v0.15.8" + with metadata.version = "v0.15.13" diff --git a/staging/spago.dhall b/staging/spago.dhall index 5c1a57cf..44f5caf0 100644 --- a/staging/spago.dhall +++ b/staging/spago.dhall @@ -1,6 +1,7 @@ { name = "try-purescript-server" , dependencies = - [ "ace" + [ "abc-parser" + , "ace" , "aff" , "aff-bus" , "aff-coroutines" @@ -10,6 +11,7 @@ , "affjax-node" , "affjax-web" , "ansi" + , "applicative-phases" , "argonaut" , "argonaut-aeson-generic" , "argonaut-codecs" @@ -23,6 +25,7 @@ , "arraybuffer-builder" , "arraybuffer-types" , "arrays" + , "arrays-extra" , "arrays-zipper" , "ask" , "assert" @@ -31,30 +34,21 @@ , "b64" , "barbies" , "barlow-lens" - , "basic-auth" , "bifunctors" , "bigints" , "bolson" , "bookhound" , "bower-json" - , "bucketchain" - , "bucketchain-basic-auth" - , "bucketchain-conditional" - , "bucketchain-cors" - , "bucketchain-csrf" - , "bucketchain-header-utils" - , "bucketchain-health" - , "bucketchain-history-api-fallback" - , "bucketchain-logger" - , "bucketchain-secure" - , "bucketchain-simple-api" - , "bucketchain-sslify" - , "bucketchain-static" , "call-by-name" , "canvas" , "canvas-action" , "cartesian" , "catenable-lists" + , "chameleon" + , "chameleon-halogen" + , "chameleon-react-basic" + , "chameleon-styled" + , "chameleon-transformers" , "channel" , "checked-exceptions" , "classless" @@ -64,6 +58,7 @@ , "classnames" , "codec" , "codec-argonaut" + , "codec-json" , "colors" , "concur-core" , "concur-react" @@ -74,9 +69,9 @@ , "control" , "convertable-options" , "coroutines" - , "crypto" , "css" , "css-frameworks" + , "data-mvc" , "datetime" , "datetime-parsing" , "debug" @@ -86,12 +81,12 @@ , "deno" , "dissect" , "distributive" - , "dodo-printer" , "dom-filereader" , "dom-indexed" , "dotenv" , "droplet" , "dts" + , "dual-numbers" , "dynamic-buffer" , "echarts-simple" , "effect" @@ -106,6 +101,7 @@ , "enums" , "env-names" , "error" + , "eta-conversion" , "exceptions" , "exists" , "exitcodes" @@ -118,10 +114,12 @@ , "fetch-core" , "fetch-yoga-json" , "filterable" + , "fix-functor" , "fixed-points" , "fixed-precision" , "flame" , "float32" + , "fmt" , "foldable-traversable" , "foreign" , "foreign-object" @@ -144,11 +142,9 @@ , "generic-router" , "geojson" , "geometry-plane" - , "github-actions-toolkit" , "grain" , "grain-router" , "grain-virtualized" - , "graphql-client" , "graphs" , "group" , "halogen" @@ -170,10 +166,7 @@ , "heterogeneous" , "homogeneous" , "http-methods" - , "httpure" , "httpurple" - , "httpurple-argonaut" - , "httpurple-yoga-json" , "humdrum" , "hyrule" , "identity" @@ -192,18 +185,20 @@ , "js-abort-controller" , "js-bigints" , "js-date" + , "js-fetch" , "js-fileio" + , "js-intl" , "js-iterators" , "js-maps" , "js-promise" , "js-promise-aff" , "js-timers" , "js-uri" + , "json" , "json-codecs" , "justifill" , "jwt" , "labeled-data" - , "language-cst-parser" , "lazy" , "lazy-joe" , "lcg" @@ -214,16 +209,17 @@ , "literals" , "logging" , "logging-journald" + , "lumi-components" , "machines" , "maps-eager" , "marionette" - , "marionette-commander" , "marionette-react-basic-hooks" + , "marked" , "matrices" , "matryoshka" , "maybe" - , "mdast-util-from-markdown" , "media-types" + , "meowclient" , "metadata" , "midi" , "milkis" @@ -238,6 +234,7 @@ , "morello" , "mote" , "motsunabe" + , "mvc" , "mysql" , "n3" , "nano-id" @@ -248,14 +245,13 @@ , "nextjs" , "nextui" , "node-buffer" - , "node-buffer-blob" , "node-child-process" - , "node-env-paths" , "node-event-emitter" , "node-execa" , "node-fs" - , "node-fs-aff" + , "node-glob-basic" , "node-http" + , "node-http2" , "node-human-signals" , "node-net" , "node-os" @@ -264,9 +260,9 @@ , "node-readline" , "node-sqlite3" , "node-streams" - , "node-streams-aff" + , "node-tls" , "node-url" - , "nodemailer" + , "node-zlib" , "nonempty" , "now" , "npm-package-json" @@ -281,10 +277,10 @@ , "open-memoize" , "open-pairing" , "options" - , "optparse" , "ordered-collections" , "ordered-set" , "orders" + , "owoify" , "pairs" , "parallel" , "parsing" @@ -308,9 +304,7 @@ , "profunctor" , "profunctor-lenses" , "protobuf" - , "ps-cst" , "psa-utils" - , "psc-ide" , "psci-support" , "qualified-do" , "quantities" @@ -356,12 +350,12 @@ , "safely" , "school-of-music" , "selection-foldable" + , "selective-functors" , "semirings" , "signal" , "simple-emitter" , "simple-i18n" , "simple-json" - , "simple-jwt" , "simple-ulid" , "sized-matrices" , "sized-vectors" @@ -371,8 +365,7 @@ , "sparse-matrices" , "sparse-polynomials" , "spec" - , "spec-discovery" - , "spec-golden" + , "spec-mocha" , "spec-quickcheck" , "splitmix" , "ssrs" @@ -384,7 +377,6 @@ , "strings-extra" , "stringutils" , "substitute" - , "sunde" , "supply" , "svg-parser" , "systemd-journald" @@ -396,7 +388,6 @@ , "thermite" , "thermite-dom" , "these" - , "toppokki" , "transformation-matrix" , "transformers" , "tree-rose" @@ -409,6 +400,7 @@ , "typelevel-lists" , "typelevel-peano" , "typelevel-prelude" + , "typelevel-regex" , "typelevel-rows" , "uint" , "ulid" @@ -446,7 +438,6 @@ , "web-file" , "web-geometry" , "web-html" - , "web-intl" , "web-pointerevents" , "web-proletarian" , "web-promise" From df33f590f2557bcd7a6b6e07bcef9e7b51009c1d Mon Sep 17 00:00:00 2001 From: Saravanan M Date: Tue, 3 Sep 2024 22:21:07 +0530 Subject: [PATCH 5/5] added support for cst parse --- client/packages.dhall | 66 ++++++++++++++++++++ client/public/css/index.css | 30 +++++++++ client/spago.dhall | 4 ++ client/src/Try/CSTTree.js | 1 + client/src/Try/CSTTree.purs | 113 ++++++++++++++++++++++++++++++++++ client/src/Try/Container.purs | 103 ++++++++++++++++++++++++------- client/src/Try/Utils.purs | 25 ++++++++ 7 files changed, 320 insertions(+), 22 deletions(-) create mode 100644 client/src/Try/CSTTree.js create mode 100644 client/src/Try/CSTTree.purs create mode 100644 client/src/Try/Utils.purs diff --git a/client/packages.dhall b/client/packages.dhall index c21f1de2..8141c0fc 100644 --- a/client/packages.dhall +++ b/client/packages.dhall @@ -3,3 +3,69 @@ let upstream = sha256:60eee64b04ca0013fae3e02a69fc3b176105c6baa2f31865c67cd5f881a412fd in upstream + with foreign-generic = + { dependencies = + [ "arrays" + , "assert" + , "bifunctors" + , "console" + , "control" + , "effect" + , "either" + , "exceptions" + , "foldable-traversable" + , "foreign" + , "foreign-object" + , "identity" + , "lists" + , "maybe" + , "newtype" + , "partial" + , "prelude" + , "typelevel-prelude" + , "record" + , "strings" + , "transformers" + , "tuples" + , "unsafe-coerce" + ] + , repo = "https://github.com/imsaravana369/purescript-foreign-generic.git" + , version = "v0.15.0-updates" + } + with language-cst-parser = + { dependencies = + [ "arrays" + , "console" + , "const" + , "control" + , "effect" + , "either" + , "enums" + , "foldable-traversable" + , "free" + , "functions" + , "functors" + , "identity" + , "integers" + , "lazy" + , "lists" + , "maybe" + , "newtype" + , "node-process" + , "numbers" + , "ordered-collections" + , "partial" + , "prelude" + , "st" + , "strings" + , "transformers" + , "tuples" + , "typelevel-prelude" + , "unfoldable" + , "unsafe-coerce" + , "foreign" + , "foreign-generic" + ] + , repo = "https://github.com/imsaravana369/purescript-language-cst-parser.git" + , version = "main" + } diff --git a/client/public/css/index.css b/client/public/css/index.css index acd2322f..58b06a46 100644 --- a/client/public/css/index.css +++ b/client/public/css/index.css @@ -311,3 +311,33 @@ footer { display: none; } } + + +details { + padding-left: 1em; +} + +summary { + cursor: pointer; + font-weight: bold; + +} + +details .tree-content { + margin-left: 1em; +} + + +details { + padding-left: 1em; +} + +summary { + cursor: pointer; + font-weight: bold; + +} + +details .tree-content { + margin-left: 1em; +} diff --git a/client/spago.dhall b/client/spago.dhall index 44a9bbdf..dfd9c04c 100644 --- a/client/spago.dhall +++ b/client/spago.dhall @@ -16,6 +16,9 @@ , "either" , "exceptions" , "foldable-traversable" + , "foreign" + , "language-cst-parser" + , "foreign-generic" , "foreign-object" , "functions" , "functors" @@ -39,6 +42,7 @@ , "tuples" , "unsafe-coerce" , "web-html" + , "debug" ] , packages = ./packages.dhall , sources = [ "src/**/*.purs", "test/**/*.purs" ] diff --git a/client/src/Try/CSTTree.js b/client/src/Try/CSTTree.js new file mode 100644 index 00000000..5a00746d --- /dev/null +++ b/client/src/Try/CSTTree.js @@ -0,0 +1 @@ +export const toString = (fgn) => JSON.stringify(fgn) diff --git a/client/src/Try/CSTTree.purs b/client/src/Try/CSTTree.purs new file mode 100644 index 00000000..0d089315 --- /dev/null +++ b/client/src/Try/CSTTree.purs @@ -0,0 +1,113 @@ +module Try.CSTBuilder where + +import Control.Alt +import Prelude + +import Control.Monad.Except (runExcept) +import Data.Array (length, null) +import Data.Either (hush) +import Data.Generic.Rep (class Generic) +import Data.Maybe (Maybe(..), maybe) +import Data.Traversable (traverse) +import Data.TraversableWithIndex (traverseWithIndex) +import Debug (spy, traceM) +import Effect.Aff (Aff) +import Foreign (F, Foreign, ForeignError(..), fail, readArray) +import Foreign.Generic (defaultOptions, genericDecode) +import Foreign.Generic.Class (class Decode, decode, encode) +import Foreign.Index (readProp) +import Foreign.Object (Object) +import Foreign.Object (toArrayWithKey) +import Foreign.Object as Object +import Halogen as H +import Halogen.HTML as HH +import Halogen.HTML.Properties as HP +import Unsafe.Coerce (unsafeCoerce) + +foreign import toString :: Foreign -> String + +data Tree = NodeArr (Maybe String) (Array Tree) + | NodeObject (Maybe String) (Object Tree) + | Leaf Foreign + +readMTag :: Foreign -> Maybe String +readMTag fgn = hush $ runExcept do + t <- readProp "tag" fgn + decode t + +decodeArr :: Foreign -> F Tree +decodeArr fgn = do + let mTag = readMTag fgn + case mTag of + Just tag -> do + arr <- readProp "contents" fgn >>= readArray + NodeArr mTag <$> (traverse decode arr) + Nothing -> do + arr <- readArray fgn + NodeArr Nothing <$> (traverse decode arr) + + +decodeObject :: Foreign -> F Tree +decodeObject fgn = do + let mTag = readMTag fgn + case mTag of + Just tag -> do + obj <- readProp "contents" fgn + NodeObject mTag <$> (decode obj) + Nothing -> NodeObject Nothing <$> (decode fgn) + +instance Decode Tree where + decode fgn = decodeArr fgn <|> (decodeObject fgn) <|> (pure $ Leaf fgn) + +component :: forall q i o. H.Component q Tree o Aff +component = H.mkComponent + { initialState + , render + , eval: H.mkEval $ H.defaultEval + } + where + initialState i = i + render :: Tree -> H.ComponentHTML Unit () Aff + render tree = renderTree tree + + + + +createNested :: forall w i .Maybe String -> Array (HH.HTML w i) -> HH.HTML w i +createNested mTag children = case mTag of + Just tag -> HH.details_ [ HH.summary_ [ HH.text tag ] , content] + Nothing -> content + where + content + | null children = HH.text "[]" + | otherwise = HH.div + [ HP.class_ $ HH.ClassName "tree-content" ] + children + + +renderArr :: forall w i. Maybe String -> Array Tree -> HH.HTML w i +renderArr tag children = createNested tag (renderTree <$> children) + +renderObj :: forall w i. Maybe String -> Object Tree -> HH.HTML w i +renderObj tag children = createNested tag (toArrayWithKey renderKeyVal children) + +renderKeyVal :: forall w i. String -> Tree -> HH.HTML w i +renderKeyVal key valTree = + HH.div_ + [ HH.i_ [ HH.text (key <> ": ") ] + , renderTree valTree + ] + +renderTree :: forall w i. Tree -> HH.HTML w i +renderTree (NodeArr tag children) = renderArr tag children +renderTree (NodeObject tag children) = renderObj tag children +renderTree (Leaf fgn) = HH.text (toString fgn) + + + + + + + + + diff --git a/client/src/Try/Container.purs b/client/src/Try/Container.purs index 9a2c27be..6adecce1 100644 --- a/client/src/Try/Container.purs +++ b/client/src/Try/Container.purs @@ -3,14 +3,15 @@ module Try.Container where import Prelude import Ace (Annotation) -import Control.Monad.Except (runExceptT) +import Control.Monad.Except (runExcept, runExceptT) +import Data.Array (elem) import Data.Array as Array import Data.Either (Either(..), either) import Data.Foldable (for_, oneOf, fold, traverse_) import Data.FoldableWithIndex (foldMapWithIndex) import Data.Maybe (Maybe(..), fromMaybe, isNothing) -import Data.String as String import Data.String (Pattern(..)) +import Data.String as String import Data.String.Regex as Regex import Data.String.Regex.Flags as RegexFlags import Effect (Effect) @@ -18,13 +19,14 @@ import Effect.Aff (Aff, Milliseconds(..), delay, makeAff) import Effect.Aff as Aff import Effect.Class.Console (error) import Effect.Uncurried (EffectFn3, runEffectFn3) -import Partial.Unsafe (unsafeCrashWith) import Halogen as H import Halogen.HTML as HH import Halogen.HTML.Events as HE import Halogen.HTML.Properties as HP +import Partial.Unsafe (unsafeCrashWith) import Try.API (CompileError(..), CompileResult(..), CompilerError, ErrorPosition) import Try.API as API +import Try.CSTBuilder as CSTBuilder import Try.Config as Config import Try.Editor (MarkerType(..), toStringMarkerType) import Try.Editor as Editor @@ -32,25 +34,33 @@ import Try.Gist (getGistById, tryLoadFileFromGist) import Try.GitHub (getRawGitHubFile) import Try.QueryString (compressToEncodedURIComponent, decompressFromEncodedURIComponent, getQueryStringMaybe, setQueryString) import Try.SharedConfig as SharedConfig +import Try.Utils (toParsedTree) import Type.Proxy (Proxy(..)) import Web.HTML (window) import Web.HTML.Location (href) import Web.HTML.Window (alert, location) -type Slots = ( editor :: Editor.Slot Unit, shareButton :: forall q o. H.Slot q o Unit ) +type Slots = ( editor :: Editor.Slot Unit + , shareButton :: forall q o. H.Slot q o Unit + , cst :: forall q o. H.Slot q o Unit + ) data SourceFile = GitHub String | Gist String +data ShowMode = JS | CST | None + +derive instance Eq ShowMode + type Settings = { autoCompile :: Boolean - , showJs :: Boolean + , showMode :: ShowMode , viewMode :: ViewMode } defaultSettings :: Settings defaultSettings = { autoCompile: true - , showJs: false + , showMode : None , viewMode: SideBySide } @@ -58,6 +68,8 @@ type State = { settings :: Settings , sourceFile :: Maybe SourceFile , compiled :: Maybe (Either String CompileResult) + , parsed :: Maybe (Either String CSTBuilder.Tree) + -- , parsed :: Maybe CSTBuilder.Tree } data ViewMode @@ -79,6 +91,7 @@ data Action | EncodeInURL String | UpdateSettings (Settings -> Settings) | Compile (Maybe String) + | Parse (Maybe String) | HandleEditor Editor.Output _editor :: Proxy "editor" @@ -105,6 +118,7 @@ component = H.mkComponent { settings: defaultSettings , sourceFile: Nothing , compiled: Nothing + , parsed : Nothing } handleAction :: Action -> H.HalogenM State Action Slots o Aff Unit @@ -116,14 +130,17 @@ component = H.mkComponent mbViewModeParam <- H.liftEffect $ getQueryStringMaybe "view" let viewMode = fromMaybe SideBySide $ parseViewModeParam =<< mbViewModeParam - mbShowJsParam <- H.liftEffect $ getQueryStringMaybe "js" - let showJs = mbShowJsParam == Just "true" - + mbShowJsParam <- H.liftEffect $ getQueryStringMaybe "show" + let showMode = case fromMaybe "" mbShowJsParam of + "js" -> JS + "cst" -> CST + otherwise -> None + mbAutoCompile <- H.liftEffect $ getQueryStringMaybe "compile" let autoCompile = mbAutoCompile /= Just "false" H.modify_ _ - { settings = { viewMode, showJs, autoCompile } + { settings = { viewMode, showMode , autoCompile } , sourceFile = sourceFile } @@ -134,17 +151,30 @@ component = H.mkComponent UpdateSettings k -> do old <- H.get new <- H.modify \state -> state { settings = k state.settings } - when (old.settings.showJs /= new.settings.showJs) do - if new.settings.showJs then + when (old.settings.showMode /= new.settings.showMode) do + if JS `elem` [new.settings.showMode, old.settings.showMode] then H.liftEffect teardownIFrame else - handleAction $ Compile Nothing + case new.settings.showMode of + CST -> handleAction $ Parse Nothing + JS -> handleAction $ Compile Nothing + otherwise -> pure unit EncodeInURL text -> H.liftEffect do setQueryString "code" $ compressToEncodedURIComponent text + + Parse mbCode -> do + code <- case mbCode of + Nothing -> do + mbText <- H.request _editor unit $ Editor.GetEditorContent + pure $ fold $ join mbText + Just text -> + pure text + H.modify_ _{ parsed = Just $ toParsedTree code } Compile mbCode -> do H.modify_ _ { compiled = Nothing } + code <- case mbCode of Nothing -> do mbText <- H.request _editor unit $ Editor.GetEditorContent @@ -178,7 +208,7 @@ component = H.mkComponent Right res@(Right (CompileSuccess { js, warnings })) -> do { settings } <- H.get - if settings.showJs then do + if settings.showMode /= None then do H.liftEffect teardownIFrame H.modify_ _ { compiled = Just res } else do @@ -205,8 +235,12 @@ component = H.mkComponent HandleEditor (Editor.TextChanged text) -> do _ <- H.fork $ handleAction $ EncodeInURL text - { autoCompile } <- H.gets _.settings - when autoCompile $ handleAction $ Compile $ Just text + { autoCompile, showMode } <- H.gets _.settings + when autoCompile $ + case showMode of + JS -> handleAction $ Compile $ Just text + CST -> handleAction $ Parse $ Just text + None -> pure unit render :: State -> H.ComponentHTML Action Slots Aff render state = @@ -320,13 +354,13 @@ component = H.mkComponent , HH.li [ HP.class_ $ HH.ClassName "menu-item nowrap" ] [ HH.input - [ HP.id "showjs" + [ HP.id "howjs" , HP.name "showjs" , HP.title "Show resulting JavaScript code instead of output" , HP.value "showjs" , HP.type_ HP.InputCheckbox - , HP.checked state.settings.showJs - , HE.onChecked \bool -> UpdateSettings (_ { showJs = bool }) + , HP.checked $ state.settings.showMode == JS + , HE.onChecked \bool -> UpdateSettings (_ { showMode = if bool then JS else None }) ] , HH.label [ HP.id "showjs_label" @@ -335,6 +369,24 @@ component = H.mkComponent ] [ HH.text "Show JS" ] ] + , HH.li + [ HP.class_ $ HH.ClassName "menu-item nowrap" ] + [ HH.input + [ HP.id "showcst" + , HP.name "showcst" + , HP.title "Show CST" + , HP.value "showcst" + , HP.type_ HP.InputCheckbox + , HP.checked $ state.settings.showMode == CST + , HE.onChecked \bool -> UpdateSettings (_ { showMode = if bool then CST else None }) + ] + , HH.label + [ HP.id "showcst_label" + , HP.for "showcst" + , HP.title "Show CST" + ] + [ HH.text "Show CST" ] + ] , HH.slot_ (Proxy :: _ "shareButton") unit shareButton unit , HH.li [ HP.class_ $ HH.ClassName "menu-item" ] @@ -377,8 +429,12 @@ component = H.mkComponent [ HP.id "column2_wrapper" ] [ HH.div [ HP.id "column2" ] - [ maybeElem state.compiled renderCompiled ] - , whenElem (isNothing state.compiled) \_ -> + [ if state.settings.showMode == CST + then maybeElem state.parsed renderParsed + else maybeElem state.compiled renderCompiled + ] + , whenElem ((state.settings.showMode == CST && isNothing state.parsed) + && (state.settings.showMode /= JS && isNothing state.compiled)) \_ -> HH.div [ HP.id "loading" ] [ ] @@ -404,6 +460,9 @@ component = H.mkComponent , footerLink "Package set version:" SharedConfig.packageSetVersion SharedConfig.packageSetPackageJsonUrl ] + renderParsed (Left err) = renderPlaintext err + renderParsed (Right c) = HH.slot_ (Proxy @"cst") unit CSTBuilder.component c + renderCompiled = case _ of Left err -> renderPlaintext err @@ -414,7 +473,7 @@ component = H.mkComponent CompilerErrors errs -> HH.div_ $ renderCompilerErrors errs CompileSuccess { js } -> - whenElem state.settings.showJs \_ -> + whenElem (state.settings.showMode == JS) \_ -> renderPlaintext js whenElem :: forall w i. Boolean -> (Unit -> HH.HTML w i) -> HH.HTML w i diff --git a/client/src/Try/Utils.purs b/client/src/Try/Utils.purs new file mode 100644 index 00000000..add1323b --- /dev/null +++ b/client/src/Try/Utils.purs @@ -0,0 +1,25 @@ +module Try.Utils where + +import Data.Array.NonEmpty +import Data.Either +import Data.Maybe +import Foreign.Generic.Class +import Prelude +import PureScript.CST +import PureScript.CST.Errors + +import Control.Monad.Except (runExcept) +import Data.Bifunctor (lmap) +import Try.CSTBuilder as CSTBuilder + +toParsedTree :: String -> Either String CSTBuilder.Tree +toParsedTree code = case parseModule code of + ParseSucceeded cst -> lmap (const $ "shouldn't happen: decode failed") $ runExcept do + let cstJson = encode cst + decode cstJson + ParseSucceededWithErrors _ err -> Left $ foldMap1 renderError err + + ParseFailed err -> Left $ renderError err + + where + renderError { error, position} = printParseError error <> " " <> (show position) <> "\n"