diff --git a/CHANGELOG.md b/CHANGELOG.md index 54b68114..e73a1d66 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,18 @@ 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: +- 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) Other improvements: 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" 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/SharedConfig.purs b/client/src/Try/SharedConfig.purs index 5fd129aa..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.8" +pursVersion = "v0.15.13" pursReleaseUrl :: String pursReleaseUrl = "https://github.com/purescript/purescript/releases/tag/" <> pursVersion packageSetVersion :: String -packageSetVersion = "0.15.7-20230306" +packageSetVersion = "0.15.13-20231219" packageSetPackageJsonUrl :: String packageSetPackageJsonUrl = "https://github.com/purescript/package-sets/blob/psc-" <> packageSetVersion <> "/packages.json" 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" diff --git a/stack.yaml b/stack.yaml index e54cf96c..1949f546 100644 --- a/stack.yaml +++ b/stack.yaml @@ -3,7 +3,7 @@ packages: - "." extra-deps: - - purescript-0.15.8 + - 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 1622cf74..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.7-20230306/packages.dhall - sha256:0757626c7422b8b5b5b1d0df3d3628e5deac755d7f89c433a9bf89009787dcbd + 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 18bf87d0..44f5caf0 100644 --- a/staging/spago.dhall +++ b/staging/spago.dhall @@ -11,6 +11,7 @@ , "affjax-node" , "affjax-web" , "ansi" + , "applicative-phases" , "argonaut" , "argonaut-aeson-generic" , "argonaut-codecs" @@ -24,6 +25,7 @@ , "arraybuffer-builder" , "arraybuffer-types" , "arrays" + , "arrays-extra" , "arrays-zipper" , "ask" , "assert" @@ -32,29 +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,8 +69,9 @@ , "control" , "convertable-options" , "coroutines" - , "crypto" , "css" + , "css-frameworks" + , "data-mvc" , "datetime" , "datetime-parsing" , "debug" @@ -85,11 +81,12 @@ , "deno" , "dissect" , "distributive" - , "dodo-printer" , "dom-filereader" , "dom-indexed" , "dotenv" , "droplet" + , "dts" + , "dual-numbers" , "dynamic-buffer" , "echarts-simple" , "effect" @@ -104,6 +101,7 @@ , "enums" , "env-names" , "error" + , "eta-conversion" , "exceptions" , "exists" , "exitcodes" @@ -116,14 +114,17 @@ , "fetch-core" , "fetch-yoga-json" , "filterable" + , "fix-functor" , "fixed-points" , "fixed-precision" , "flame" , "float32" + , "fmt" , "foldable-traversable" , "foreign" , "foreign-object" , "foreign-readwrite" + , "forgetmenot" , "fork" , "form-urlencoded" , "formatters" @@ -139,12 +140,11 @@ , "gen" , "generate-values" , "generic-router" + , "geojson" , "geometry-plane" - , "github-actions-toolkit" , "grain" , "grain-router" , "grain-virtualized" - , "graphql-client" , "graphs" , "group" , "halogen" @@ -159,16 +159,14 @@ , "halogen-storybook" , "halogen-subscriptions" , "halogen-svg-elems" + , "halogen-typewriter" , "halogen-vdom" , "halogen-vdom-string-renderer" , "heckin" , "heterogeneous" , "homogeneous" , "http-methods" - , "httpure" , "httpurple" - , "httpurple-argonaut" - , "httpurple-yoga-json" , "humdrum" , "hyrule" , "identity" @@ -187,34 +185,41 @@ , "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" - , "language-cst-parser" + , "labeled-data" , "lazy" , "lazy-joe" , "lcg" , "leibniz" + , "liminal" , "linalg" , "lists" , "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" @@ -229,47 +234,53 @@ , "morello" , "mote" , "motsunabe" + , "mvc" , "mysql" , "n3" , "nano-id" + , "nanoid" , "naturals" , "nested-functor" , "newtype" , "nextjs" , "nextui" , "node-buffer" - , "node-buffer-blob" , "node-child-process" , "node-event-emitter" , "node-execa" , "node-fs" - , "node-fs-aff" + , "node-glob-basic" , "node-http" + , "node-http2" , "node-human-signals" , "node-net" + , "node-os" , "node-path" , "node-process" , "node-readline" , "node-sqlite3" , "node-streams" - , "node-streams-aff" + , "node-tls" , "node-url" - , "nodemailer" + , "node-zlib" , "nonempty" , "now" , "npm-package-json" , "nullable" + , "numberfield" , "numbers" + , "oak" + , "oak-debug" , "object-maps" , "ocarina" , "open-folds" , "open-memoize" , "open-pairing" , "options" - , "optparse" , "ordered-collections" , "ordered-set" , "orders" + , "owoify" , "pairs" , "parallel" , "parsing" @@ -278,8 +289,10 @@ , "pathy" , "pha" , "phaser" + , "phylio" , "pipes" , "pirates-charm" + , "pmock" , "point-free" , "pointed-list" , "polymorphic-vectors" @@ -291,9 +304,7 @@ , "profunctor" , "profunctor-lenses" , "protobuf" - , "ps-cst" , "psa-utils" - , "psc-ide" , "psci-support" , "qualified-do" , "quantities" @@ -339,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" @@ -354,7 +365,7 @@ , "sparse-matrices" , "sparse-polynomials" , "spec" - , "spec-discovery" + , "spec-mocha" , "spec-quickcheck" , "splitmix" , "ssrs" @@ -366,7 +377,6 @@ , "strings-extra" , "stringutils" , "substitute" - , "sunde" , "supply" , "svg-parser" , "systemd-journald" @@ -378,10 +388,10 @@ , "thermite" , "thermite-dom" , "these" - , "toppokki" , "transformation-matrix" , "transformers" , "tree-rose" + , "ts-bridge" , "tuples" , "two-or-more" , "type-equality" @@ -390,6 +400,7 @@ , "typelevel-lists" , "typelevel-peano" , "typelevel-prelude" + , "typelevel-regex" , "typelevel-rows" , "uint" , "ulid" @@ -410,6 +421,7 @@ , "uuidv4" , "validation" , "variant" + , "variant-encodings" , "vectorfield" , "vectors" , "versions" @@ -440,12 +452,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" ]