├── README.md ├── .gitignore ├── .tidyrc.json ├── package.json ├── test └── Main.purs ├── .github └── workflows │ └── ci.yml ├── spago.yaml ├── LICENSE ├── src └── Node │ └── Glob │ └── Basic.purs └── spago.lock /README.md: -------------------------------------------------------------------------------- 1 | # purescript-node-glob-basic 2 | 3 | A very basic glob library. Only supports `*` and `**`. Who could ask for anything more? 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /bower_components/ 2 | /node_modules/ 3 | /.pulp-cache/ 4 | /output/ 5 | /generated-docs/ 6 | /.psc-package/ 7 | /.psc* 8 | /.purs* 9 | /.psa* 10 | /.spago 11 | /.vscode 12 | -------------------------------------------------------------------------------- /.tidyrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "importSort": "ide", 3 | "importWrap": "source", 4 | "indent": 2, 5 | "operatorsFile": null, 6 | "ribbon": 1, 7 | "typeArrowPlacement": "first", 8 | "unicode": "never", 9 | "width": null 10 | } 11 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "type": "module", 4 | "scripts": { 5 | "build": "spago build", 6 | "test": "spago test", 7 | "format": "purs-tidy format-in-place src test" 8 | }, 9 | "devDependencies": { 10 | "purescript": "^0.15.15", 11 | "purs-tidy": "^0.10.1", 12 | "spago": "^0.93.42" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /test/Main.purs: -------------------------------------------------------------------------------- 1 | module Test.Main where 2 | 3 | import Prelude 4 | 5 | import Data.FoldableWithIndex (forWithIndex_) 6 | import Data.Map as Map 7 | import Effect (Effect) 8 | import Effect.Aff (launchAff_) 9 | import Effect.Class (liftEffect) 10 | import Effect.Class.Console (log) 11 | import Node.Glob.Basic (expandGlobsWithStatsCwd) 12 | import Node.Process (cwd) 13 | 14 | main :: Effect Unit 15 | main = launchAff_ do 16 | dir <- liftEffect cwd 17 | files <- 18 | expandGlobsWithStatsCwd 19 | [ "./src/**/*.purs" 20 | , "./test/**/*.purs" 21 | , dir <> "/.spago/*/*/src/**/*.purs" 22 | ] 23 | forWithIndex_ files \path _ -> log path 24 | log $ show (Map.size files) <> " files" 25 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: [main] 6 | pull_request: 7 | 8 | jobs: 9 | build: 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | - uses: actions/checkout@v4 14 | 15 | - uses: purescript-contrib/setup-purescript@main 16 | with: 17 | purescript: "0.15.15" 18 | purs-tidy: "latest" 19 | spago: "unstable" 20 | 21 | - name: Cache PureScript dependencies 22 | uses: actions/cache@v4 23 | with: 24 | key: ${{ runner.os }}-spago-${{ hashFiles('**/spago.lock') }} 25 | path: | 26 | .spago 27 | output 28 | 29 | - name: Build source 30 | run: spago build --pure --pedantic-packages 31 | 32 | - name: Run tests 33 | run: spago test --pure --offline 34 | 35 | - name: Verify formatting 36 | run: purs-tidy check src test 37 | -------------------------------------------------------------------------------- /spago.yaml: -------------------------------------------------------------------------------- 1 | package: 2 | name: node-glob-basic 3 | description: "A very basic glob library. No NPM dependencies." 4 | publish: 5 | version: 2.0.0 6 | license: MIT 7 | location: 8 | githubOwner: natefaubion 9 | githubRepo: purescript-node-glob-basic 10 | build: 11 | strict: true 12 | dependencies: 13 | - aff: ">=8.0.0 <9.0.0" 14 | - effect: ">=4.0.0 <5.0.0" 15 | - either: ">=6.1.0 <7.0.0" 16 | - foldable-traversable: ">=6.0.0 <7.0.0" 17 | - lists: ">=7.0.0 <8.0.0" 18 | - maybe: ">=6.0.0 <7.0.0" 19 | - node-fs: ">=9.2.0 <10.0.0" 20 | - node-path: ">=5.0.1 <6.0.0" 21 | - node-process: ">=11.2.0 <12.0.0" 22 | - ordered-collections: ">=3.2.0 <4.0.0" 23 | - parallel: ">=7.0.0 <8.0.0" 24 | - prelude: ">=6.0.1 <7.0.0" 25 | - refs: ">=6.0.0 <7.0.0" 26 | - strings: ">=6.0.1 <7.0.0" 27 | - tuples: ">=7.0.0 <8.0.0" 28 | test: 29 | main: Test.Main 30 | dependencies: 31 | - console 32 | workspace: {} 33 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2021 Nathan Faubion 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /src/Node/Glob/Basic.purs: -------------------------------------------------------------------------------- 1 | module Node.Glob.Basic 2 | ( expandGlobs 3 | , expandGlobsCwd 4 | , expandGlobsWithStats 5 | , expandGlobsWithStatsCwd 6 | ) where 7 | 8 | import Prelude 9 | 10 | import Control.Parallel (parallel, sequential) 11 | import Data.Either (Either(..)) 12 | import Data.Foldable (class Foldable, foldMap, foldr) 13 | import Data.FoldableWithIndex (forWithIndex_) 14 | import Data.List (List(..), (:)) 15 | import Data.List as List 16 | import Data.Map (Map, SemigroupMap(..)) 17 | import Data.Map as Map 18 | import Data.Maybe (Maybe(..)) 19 | import Data.Monoid (guard) 20 | import Data.Set (Set) 21 | import Data.Set as Set 22 | import Data.String (Pattern(..), Replacement(..)) 23 | import Data.String as String 24 | import Data.String.CodeUnits as SCU 25 | import Data.Tuple (Tuple(..)) 26 | import Effect.Aff (Aff, attempt, catchError) 27 | import Effect.Class (liftEffect) 28 | import Effect.Ref as Ref 29 | import Node.FS.Aff as FS 30 | import Node.FS.Stats (Stats) 31 | import Node.FS.Stats as Stats 32 | import Node.Path (FilePath) 33 | import Node.Path as Path 34 | import Node.Process as Process 35 | 36 | -- | Expands globs relative to the current working directory. 37 | expandGlobsCwd :: Array String -> Aff (Set FilePath) 38 | expandGlobsCwd globs = do 39 | cwd <- liftEffect Process.cwd 40 | expandGlobs cwd globs 41 | 42 | -- | Expands globs relative to the provided directory. 43 | expandGlobs :: FilePath -> Array String -> Aff (Set FilePath) 44 | expandGlobs pwd = map Map.keys <<< expandGlobsWithStats pwd 45 | 46 | -- | Expands globs relative to the current working directory, returning Stats. 47 | expandGlobsWithStatsCwd :: Array String -> Aff (Map FilePath Stats) 48 | expandGlobsWithStatsCwd globs = do 49 | cwd <- liftEffect Process.cwd 50 | expandGlobsWithStats cwd globs 51 | 52 | -- | Expands globs relative to the provided directory, returning Stats. 53 | expandGlobsWithStats :: FilePath -> Array String -> Aff (Map FilePath Stats) 54 | expandGlobsWithStats pwd initGlobs = do 55 | result <- liftEffect $ Ref.new Map.empty 56 | let 57 | insertMatch :: FilePath -> Stats -> Aff Unit 58 | insertMatch path stat = liftEffect $ Ref.modify_ (Map.insert path stat) result 59 | 60 | go :: FilePath -> Set Glob' -> Aff Unit 61 | go cwd globs = do 62 | let 63 | prefix = globs # foldMap \glob -> 64 | case fixedPrefix glob of 65 | Nothing -> { left: Set.singleton glob, right: mempty } 66 | Just pr -> { left: mempty, right: pr } 67 | 68 | dirMatches <- 69 | guard (not (Set.isEmpty prefix.left)) 70 | $ flip catchError mempty 71 | $ match prefix.left <<< List.fromFoldable <$> FS.readdir cwd 72 | 73 | sequential $ forWithIndex_ (prefix.right <> dirMatches) \path m -> parallel do 74 | let fullPath = Path.concat [ cwd, path ] 75 | attempt (FS.stat fullPath) >>= case m, _ of 76 | MatchMore matchDir gs, Right stat | Stats.isDirectory stat -> do 77 | when matchDir $ insertMatch fullPath stat 78 | go fullPath gs 79 | MatchMore true _, Right stat -> 80 | insertMatch fullPath stat 81 | Match, Right stat -> 82 | insertMatch fullPath stat 83 | _, _ -> 84 | mempty 85 | 86 | globsWithDir = 87 | initGlobs 88 | # map (rootOrRelative pwd <<< fromPathWithSeparator Path.sep <<< fixupGlobPath) 89 | # Map.fromFoldableWith (<>) 90 | 91 | sequential $ forWithIndex_ globsWithDir \dir globs -> parallel do 92 | go dir globs 93 | 94 | liftEffect $ Ref.read result 95 | 96 | fixupGlobPath :: String -> String 97 | fixupGlobPath glob 98 | | Path.sep /= "/" = String.replaceAll (Pattern "/") (Replacement Path.sep) glob 99 | | otherwise = glob 100 | 101 | rootOrRelative :: FilePath -> Glob' -> Tuple FilePath (Set Glob') 102 | rootOrRelative pwd = case _ of 103 | GlobSegment ("" : Nil) : glob -> Tuple Path.sep (Set.singleton glob) 104 | glob -> Tuple pwd (Set.singleton glob) 105 | 106 | data Glob 107 | = GlobStar 108 | | GlobSegment (List String) 109 | 110 | derive instance eqGlob :: Eq Glob 111 | derive instance ordGlob :: Ord Glob 112 | 113 | type Glob' = List Glob 114 | 115 | fromString :: String -> Glob 116 | fromString = case _ of 117 | "**" -> GlobStar 118 | str -> GlobSegment $ List.fromFoldable $ String.split (Pattern "*") str 119 | 120 | fromFoldable :: forall f. Foldable f => f String -> Glob' 121 | fromFoldable = foldr (Cons <<< fromString) Nil 122 | 123 | fromPathWithSeparator :: String -> FilePath -> Glob' 124 | fromPathWithSeparator sep = String.split (Pattern sep) >>> fromFoldable 125 | 126 | fixedPrefix :: Glob' -> Maybe (SemigroupMap String Match) 127 | fixedPrefix = case _ of 128 | GlobSegment (path : Nil) : glob | path /= "" -> 129 | if List.null glob then 130 | Just $ SemigroupMap $ Map.singleton path Match 131 | else 132 | Just $ SemigroupMap $ Map.singleton path $ MatchMore false (Set.singleton glob) 133 | _ -> 134 | Nothing 135 | 136 | match :: Set Glob' -> List FilePath -> SemigroupMap String Match 137 | match globs = foldMap \path -> 138 | globs 139 | # foldMap (matchListing path) 140 | # foldMap (SemigroupMap <<< Map.singleton path) 141 | 142 | data Match = Match | MatchMore Boolean (Set Glob') 143 | 144 | isMatch :: Maybe Match -> Boolean 145 | isMatch = case _ of 146 | Just Match -> true 147 | _ -> false 148 | 149 | instance semigroupMatch :: Semigroup Match where 150 | append a b = 151 | case a of 152 | MatchMore am as -> 153 | case b of 154 | MatchMore bm bs -> MatchMore (am || bm) (as <> bs) 155 | _ -> a 156 | Match -> 157 | case b of 158 | MatchMore _ bs -> MatchMore true bs 159 | _ -> a 160 | 161 | matchListing :: FilePath -> Glob' -> Maybe Match 162 | matchListing path = case _ of 163 | GlobStar : GlobStar : glob -> 164 | matchListing path (GlobStar : glob) 165 | GlobStar : glob -> 166 | Just $ MatchMore (isMatch (matchListing path glob)) $ Set.fromFoldable [ glob, GlobStar : glob ] 167 | GlobSegment segment : glob -> 168 | if matchSegment path segment then 169 | if List.null glob then 170 | Just Match 171 | else 172 | Just $ MatchMore false $ Set.singleton glob 173 | else 174 | Nothing 175 | Nil -> 176 | Nothing 177 | 178 | matchSegment :: String -> List String -> Boolean 179 | matchSegment = go1 180 | where 181 | go1 str = case _ of 182 | Nil -> str == "" 183 | "" : ps -> go2 str ps 184 | p : ps -> 185 | case String.stripPrefix (Pattern p) str of 186 | Nothing -> false 187 | Just str' -> go2 str' ps 188 | 189 | go2 str = case _ of 190 | Nil -> str == "" 191 | "" : Nil -> true 192 | "" : ps -> go2 str ps 193 | p : ps -> 194 | case SCU.indexOf (Pattern p) str of 195 | Nothing -> false 196 | Just ix -> go2 (SCU.drop (ix + SCU.length p) str) ps 197 | -------------------------------------------------------------------------------- /spago.lock: -------------------------------------------------------------------------------- 1 | { 2 | "workspace": { 3 | "packages": { 4 | "node-glob-basic": { 5 | "path": "./", 6 | "core": { 7 | "dependencies": [ 8 | { 9 | "aff": ">=8.0.0 <9.0.0" 10 | }, 11 | { 12 | "effect": ">=4.0.0 <5.0.0" 13 | }, 14 | { 15 | "either": ">=6.1.0 <7.0.0" 16 | }, 17 | { 18 | "foldable-traversable": ">=6.0.0 <7.0.0" 19 | }, 20 | { 21 | "lists": ">=7.0.0 <8.0.0" 22 | }, 23 | { 24 | "maybe": ">=6.0.0 <7.0.0" 25 | }, 26 | { 27 | "node-fs": ">=9.2.0 <10.0.0" 28 | }, 29 | { 30 | "node-path": ">=5.0.1 <6.0.0" 31 | }, 32 | { 33 | "node-process": ">=11.2.0 <12.0.0" 34 | }, 35 | { 36 | "ordered-collections": ">=3.2.0 <4.0.0" 37 | }, 38 | { 39 | "parallel": ">=7.0.0 <8.0.0" 40 | }, 41 | { 42 | "prelude": ">=6.0.1 <7.0.0" 43 | }, 44 | { 45 | "refs": ">=6.0.0 <7.0.0" 46 | }, 47 | { 48 | "strings": ">=6.0.1 <7.0.0" 49 | }, 50 | { 51 | "tuples": ">=7.0.0 <8.0.0" 52 | } 53 | ], 54 | "build_plan": [ 55 | "aff", 56 | "arraybuffer-types", 57 | "arrays", 58 | "bifunctors", 59 | "const", 60 | "contravariant", 61 | "control", 62 | "datetime", 63 | "distributive", 64 | "effect", 65 | "either", 66 | "enums", 67 | "exceptions", 68 | "exists", 69 | "foldable-traversable", 70 | "foreign", 71 | "foreign-object", 72 | "functions", 73 | "functors", 74 | "gen", 75 | "identity", 76 | "integers", 77 | "invariant", 78 | "js-date", 79 | "lazy", 80 | "lists", 81 | "maybe", 82 | "newtype", 83 | "node-buffer", 84 | "node-event-emitter", 85 | "node-fs", 86 | "node-path", 87 | "node-process", 88 | "node-streams", 89 | "nonempty", 90 | "now", 91 | "nullable", 92 | "numbers", 93 | "ordered-collections", 94 | "orders", 95 | "parallel", 96 | "partial", 97 | "posix-types", 98 | "prelude", 99 | "profunctor", 100 | "refs", 101 | "safe-coerce", 102 | "st", 103 | "strings", 104 | "tailrec", 105 | "transformers", 106 | "tuples", 107 | "type-equality", 108 | "typelevel-prelude", 109 | "unfoldable", 110 | "unsafe-coerce" 111 | ] 112 | }, 113 | "test": { 114 | "dependencies": [ 115 | "console" 116 | ], 117 | "build_plan": [ 118 | "console", 119 | "effect", 120 | "prelude" 121 | ] 122 | } 123 | } 124 | }, 125 | "extra_packages": {} 126 | }, 127 | "packages": { 128 | "aff": { 129 | "type": "registry", 130 | "version": "8.0.0", 131 | "integrity": "sha256-5MmdI4+0RHBtSBy+YlU3/Cq4R5W2ih3OaRedJIrVHdk=", 132 | "dependencies": [ 133 | "bifunctors", 134 | "control", 135 | "datetime", 136 | "effect", 137 | "either", 138 | "exceptions", 139 | "foldable-traversable", 140 | "functions", 141 | "maybe", 142 | "newtype", 143 | "parallel", 144 | "prelude", 145 | "refs", 146 | "tailrec", 147 | "transformers", 148 | "unsafe-coerce" 149 | ] 150 | }, 151 | "arraybuffer-types": { 152 | "type": "registry", 153 | "version": "3.0.2", 154 | "integrity": "sha256-mQKokysYVkooS4uXbO+yovmV/s8b138Ws3zQvOwIHRA=", 155 | "dependencies": [] 156 | }, 157 | "arrays": { 158 | "type": "registry", 159 | "version": "7.3.0", 160 | "integrity": "sha256-tmcklBlc/muUtUfr9RapdCPwnlQeB3aSrC4dK85gQlc=", 161 | "dependencies": [ 162 | "bifunctors", 163 | "control", 164 | "foldable-traversable", 165 | "functions", 166 | "maybe", 167 | "nonempty", 168 | "partial", 169 | "prelude", 170 | "safe-coerce", 171 | "st", 172 | "tailrec", 173 | "tuples", 174 | "unfoldable", 175 | "unsafe-coerce" 176 | ] 177 | }, 178 | "bifunctors": { 179 | "type": "registry", 180 | "version": "6.0.0", 181 | "integrity": "sha256-/gZwC9YhNxZNQpnHa5BIYerCGM2jeX9ukZiEvYxm5Nw=", 182 | "dependencies": [ 183 | "const", 184 | "either", 185 | "newtype", 186 | "prelude", 187 | "tuples" 188 | ] 189 | }, 190 | "console": { 191 | "type": "registry", 192 | "version": "6.1.0", 193 | "integrity": "sha256-CxmAzjgyuGDmt9FZW51VhV6rBPwR6o0YeKUzA9rSzcM=", 194 | "dependencies": [ 195 | "effect", 196 | "prelude" 197 | ] 198 | }, 199 | "const": { 200 | "type": "registry", 201 | "version": "6.0.0", 202 | "integrity": "sha256-tNrxDW8D8H4jdHE2HiPzpLy08zkzJMmGHdRqt5BQuTc=", 203 | "dependencies": [ 204 | "invariant", 205 | "newtype", 206 | "prelude" 207 | ] 208 | }, 209 | "contravariant": { 210 | "type": "registry", 211 | "version": "6.0.0", 212 | "integrity": "sha256-TP+ooAp3vvmdjfQsQJSichF5B4BPDHp3wAJoWchip6c=", 213 | "dependencies": [ 214 | "const", 215 | "either", 216 | "newtype", 217 | "prelude", 218 | "tuples" 219 | ] 220 | }, 221 | "control": { 222 | "type": "registry", 223 | "version": "6.0.0", 224 | "integrity": "sha256-sH7Pg9E96JCPF9PIA6oQ8+BjTyO/BH1ZuE/bOcyj4Jk=", 225 | "dependencies": [ 226 | "newtype", 227 | "prelude" 228 | ] 229 | }, 230 | "datetime": { 231 | "type": "registry", 232 | "version": "6.1.0", 233 | "integrity": "sha256-g/5X5BBegQWLpI9IWD+sY6mcaYpzzlW5lz5NBzaMtyI=", 234 | "dependencies": [ 235 | "bifunctors", 236 | "control", 237 | "either", 238 | "enums", 239 | "foldable-traversable", 240 | "functions", 241 | "gen", 242 | "integers", 243 | "lists", 244 | "maybe", 245 | "newtype", 246 | "numbers", 247 | "ordered-collections", 248 | "partial", 249 | "prelude", 250 | "tuples" 251 | ] 252 | }, 253 | "distributive": { 254 | "type": "registry", 255 | "version": "6.0.0", 256 | "integrity": "sha256-HTDdmEnzigMl+02SJB88j+gAXDx9VKsbvR4MJGDPbOQ=", 257 | "dependencies": [ 258 | "identity", 259 | "newtype", 260 | "prelude", 261 | "tuples", 262 | "type-equality" 263 | ] 264 | }, 265 | "effect": { 266 | "type": "registry", 267 | "version": "4.0.0", 268 | "integrity": "sha256-eBtZu+HZcMa5HilvI6kaDyVX3ji8p0W9MGKy2K4T6+M=", 269 | "dependencies": [ 270 | "prelude" 271 | ] 272 | }, 273 | "either": { 274 | "type": "registry", 275 | "version": "6.1.0", 276 | "integrity": "sha256-6hgTPisnMWVwQivOu2PKYcH8uqjEOOqDyaDQVUchTpY=", 277 | "dependencies": [ 278 | "control", 279 | "invariant", 280 | "maybe", 281 | "prelude" 282 | ] 283 | }, 284 | "enums": { 285 | "type": "registry", 286 | "version": "6.0.1", 287 | "integrity": "sha256-HWaD73JFLorc4A6trKIRUeDMdzE+GpkJaEOM1nTNkC8=", 288 | "dependencies": [ 289 | "control", 290 | "either", 291 | "gen", 292 | "maybe", 293 | "newtype", 294 | "nonempty", 295 | "partial", 296 | "prelude", 297 | "tuples", 298 | "unfoldable" 299 | ] 300 | }, 301 | "exceptions": { 302 | "type": "registry", 303 | "version": "6.1.0", 304 | "integrity": "sha256-K0T89IHtF3vBY7eSAO7eDOqSb2J9kZGAcDN5+IKsF8E=", 305 | "dependencies": [ 306 | "effect", 307 | "either", 308 | "maybe", 309 | "prelude" 310 | ] 311 | }, 312 | "exists": { 313 | "type": "registry", 314 | "version": "6.0.0", 315 | "integrity": "sha256-A0JQHpTfo1dNOj9U5/Fd3xndlRSE0g2IQWOGor2yXn8=", 316 | "dependencies": [ 317 | "unsafe-coerce" 318 | ] 319 | }, 320 | "foldable-traversable": { 321 | "type": "registry", 322 | "version": "6.0.0", 323 | "integrity": "sha256-fLeqRYM4jUrZD5H4WqcwUgzU7XfYkzO4zhgtNc3jcWM=", 324 | "dependencies": [ 325 | "bifunctors", 326 | "const", 327 | "control", 328 | "either", 329 | "functors", 330 | "identity", 331 | "maybe", 332 | "newtype", 333 | "orders", 334 | "prelude", 335 | "tuples" 336 | ] 337 | }, 338 | "foreign": { 339 | "type": "registry", 340 | "version": "7.0.0", 341 | "integrity": "sha256-1ORiqoS3HW+qfwSZAppHPWy4/6AQysxZ2t29jcdUMNA=", 342 | "dependencies": [ 343 | "either", 344 | "functions", 345 | "identity", 346 | "integers", 347 | "lists", 348 | "maybe", 349 | "prelude", 350 | "strings", 351 | "transformers" 352 | ] 353 | }, 354 | "foreign-object": { 355 | "type": "registry", 356 | "version": "4.1.0", 357 | "integrity": "sha256-q24okj6mT+yGHYQ+ei/pYPj5ih6sTbu7eDv/WU56JVo=", 358 | "dependencies": [ 359 | "arrays", 360 | "foldable-traversable", 361 | "functions", 362 | "gen", 363 | "lists", 364 | "maybe", 365 | "prelude", 366 | "st", 367 | "tailrec", 368 | "tuples", 369 | "typelevel-prelude", 370 | "unfoldable" 371 | ] 372 | }, 373 | "functions": { 374 | "type": "registry", 375 | "version": "6.0.0", 376 | "integrity": "sha256-adMyJNEnhGde2unHHAP79gPtlNjNqzgLB8arEOn9hLI=", 377 | "dependencies": [ 378 | "prelude" 379 | ] 380 | }, 381 | "functors": { 382 | "type": "registry", 383 | "version": "5.0.0", 384 | "integrity": "sha256-zfPWWYisbD84MqwpJSZFlvM6v86McM68ob8p9s27ywU=", 385 | "dependencies": [ 386 | "bifunctors", 387 | "const", 388 | "contravariant", 389 | "control", 390 | "distributive", 391 | "either", 392 | "invariant", 393 | "maybe", 394 | "newtype", 395 | "prelude", 396 | "profunctor", 397 | "tuples", 398 | "unsafe-coerce" 399 | ] 400 | }, 401 | "gen": { 402 | "type": "registry", 403 | "version": "4.0.0", 404 | "integrity": "sha256-f7yzAXWwr+xnaqEOcvyO3ezKdoes8+WXWdXIHDBCAPI=", 405 | "dependencies": [ 406 | "either", 407 | "foldable-traversable", 408 | "identity", 409 | "maybe", 410 | "newtype", 411 | "nonempty", 412 | "prelude", 413 | "tailrec", 414 | "tuples", 415 | "unfoldable" 416 | ] 417 | }, 418 | "identity": { 419 | "type": "registry", 420 | "version": "6.0.0", 421 | "integrity": "sha256-4wY0XZbAksjY6UAg99WkuKyJlQlWAfTi2ssadH0wVMY=", 422 | "dependencies": [ 423 | "control", 424 | "invariant", 425 | "newtype", 426 | "prelude" 427 | ] 428 | }, 429 | "integers": { 430 | "type": "registry", 431 | "version": "6.0.0", 432 | "integrity": "sha256-sf+sK26R1hzwl3NhXR7WAu9zCDjQnfoXwcyGoseX158=", 433 | "dependencies": [ 434 | "maybe", 435 | "numbers", 436 | "prelude" 437 | ] 438 | }, 439 | "invariant": { 440 | "type": "registry", 441 | "version": "6.0.0", 442 | "integrity": "sha256-RGWWyYrz0Hs1KjPDA+87Kia67ZFBhfJ5lMGOMCEFoLo=", 443 | "dependencies": [ 444 | "control", 445 | "prelude" 446 | ] 447 | }, 448 | "js-date": { 449 | "type": "registry", 450 | "version": "8.0.0", 451 | "integrity": "sha256-6TVF4DWg5JL+jRAsoMssYw8rgOVALMUHT1CuNZt8NRo=", 452 | "dependencies": [ 453 | "datetime", 454 | "effect", 455 | "exceptions", 456 | "foreign", 457 | "integers", 458 | "now" 459 | ] 460 | }, 461 | "lazy": { 462 | "type": "registry", 463 | "version": "6.0.0", 464 | "integrity": "sha256-lMsfFOnlqfe4KzRRiW8ot5ge6HtcU3Eyh2XkXcP5IgU=", 465 | "dependencies": [ 466 | "control", 467 | "foldable-traversable", 468 | "invariant", 469 | "prelude" 470 | ] 471 | }, 472 | "lists": { 473 | "type": "registry", 474 | "version": "7.0.0", 475 | "integrity": "sha256-EKF15qYqucuXP2lT/xPxhqy58f0FFT6KHdIB/yBOayI=", 476 | "dependencies": [ 477 | "bifunctors", 478 | "control", 479 | "foldable-traversable", 480 | "lazy", 481 | "maybe", 482 | "newtype", 483 | "nonempty", 484 | "partial", 485 | "prelude", 486 | "tailrec", 487 | "tuples", 488 | "unfoldable" 489 | ] 490 | }, 491 | "maybe": { 492 | "type": "registry", 493 | "version": "6.0.0", 494 | "integrity": "sha256-5cCIb0wPwbat2PRkQhUeZO0jcAmf8jCt2qE0wbC3v2Q=", 495 | "dependencies": [ 496 | "control", 497 | "invariant", 498 | "newtype", 499 | "prelude" 500 | ] 501 | }, 502 | "newtype": { 503 | "type": "registry", 504 | "version": "5.0.0", 505 | "integrity": "sha256-gdrQu8oGe9eZE6L3wOI8ql/igOg+zEGB5ITh2g+uttw=", 506 | "dependencies": [ 507 | "prelude", 508 | "safe-coerce" 509 | ] 510 | }, 511 | "node-buffer": { 512 | "type": "registry", 513 | "version": "9.0.0", 514 | "integrity": "sha256-PWE2DJ5ruBLCmeA/fUiuySEFmUJ/VuRfyrnCuVZBlu4=", 515 | "dependencies": [ 516 | "arraybuffer-types", 517 | "effect", 518 | "maybe", 519 | "nullable", 520 | "st", 521 | "unsafe-coerce" 522 | ] 523 | }, 524 | "node-event-emitter": { 525 | "type": "registry", 526 | "version": "3.0.0", 527 | "integrity": "sha256-Qw0MjsT4xRH2j2i4K8JmRjcMKnH5z1Cw39t00q4LE4w=", 528 | "dependencies": [ 529 | "effect", 530 | "either", 531 | "functions", 532 | "maybe", 533 | "nullable", 534 | "prelude", 535 | "unsafe-coerce" 536 | ] 537 | }, 538 | "node-fs": { 539 | "type": "registry", 540 | "version": "9.2.0", 541 | "integrity": "sha256-Sg0vkXycEzkEerX6hLccz21Ygd9w1+QSk1thotRZPGI=", 542 | "dependencies": [ 543 | "datetime", 544 | "effect", 545 | "either", 546 | "enums", 547 | "exceptions", 548 | "functions", 549 | "integers", 550 | "js-date", 551 | "maybe", 552 | "node-buffer", 553 | "node-path", 554 | "node-streams", 555 | "nullable", 556 | "partial", 557 | "prelude", 558 | "strings", 559 | "unsafe-coerce" 560 | ] 561 | }, 562 | "node-path": { 563 | "type": "registry", 564 | "version": "5.0.1", 565 | "integrity": "sha256-ePOElFamHkffhwJcS0Ozq4A14rflnkasFU6X2B8/yXs=", 566 | "dependencies": [ 567 | "effect" 568 | ] 569 | }, 570 | "node-process": { 571 | "type": "registry", 572 | "version": "11.2.0", 573 | "integrity": "sha256-+2MQDYChjGbVbapCyJtuWYwD41jk+BntF/kcOTKBMVs=", 574 | "dependencies": [ 575 | "effect", 576 | "foreign", 577 | "foreign-object", 578 | "maybe", 579 | "node-event-emitter", 580 | "node-streams", 581 | "posix-types", 582 | "prelude", 583 | "unsafe-coerce" 584 | ] 585 | }, 586 | "node-streams": { 587 | "type": "registry", 588 | "version": "9.0.1", 589 | "integrity": "sha256-7RJ6RqjOlhW+QlDFQNUHlkCG/CuYTTLT8yary5jhhsU=", 590 | "dependencies": [ 591 | "aff", 592 | "arrays", 593 | "effect", 594 | "either", 595 | "exceptions", 596 | "maybe", 597 | "node-buffer", 598 | "node-event-emitter", 599 | "nullable", 600 | "prelude", 601 | "refs", 602 | "st", 603 | "tailrec", 604 | "unsafe-coerce" 605 | ] 606 | }, 607 | "nonempty": { 608 | "type": "registry", 609 | "version": "7.0.0", 610 | "integrity": "sha256-54ablJZUHGvvlTJzi3oXyPCuvY6zsrWJuH/dMJ/MFLs=", 611 | "dependencies": [ 612 | "control", 613 | "foldable-traversable", 614 | "maybe", 615 | "prelude", 616 | "tuples", 617 | "unfoldable" 618 | ] 619 | }, 620 | "now": { 621 | "type": "registry", 622 | "version": "6.0.0", 623 | "integrity": "sha256-xZ7x37ZMREfs6GCDw/h+FaKHV/3sPWmtqBZRGTxybQY=", 624 | "dependencies": [ 625 | "datetime", 626 | "effect" 627 | ] 628 | }, 629 | "nullable": { 630 | "type": "registry", 631 | "version": "6.0.0", 632 | "integrity": "sha256-yiGBVl3AD+Guy4kNWWeN+zl1gCiJK+oeIFtZtPCw4+o=", 633 | "dependencies": [ 634 | "effect", 635 | "functions", 636 | "maybe" 637 | ] 638 | }, 639 | "numbers": { 640 | "type": "registry", 641 | "version": "9.0.1", 642 | "integrity": "sha256-/9M6aeMDBdB4cwYDeJvLFprAHZ49EbtKQLIJsneXLIk=", 643 | "dependencies": [ 644 | "functions", 645 | "maybe" 646 | ] 647 | }, 648 | "ordered-collections": { 649 | "type": "registry", 650 | "version": "3.2.0", 651 | "integrity": "sha256-o9jqsj5rpJmMdoe/zyufWHFjYYFTTsJpgcuCnqCO6PM=", 652 | "dependencies": [ 653 | "arrays", 654 | "foldable-traversable", 655 | "gen", 656 | "lists", 657 | "maybe", 658 | "partial", 659 | "prelude", 660 | "st", 661 | "tailrec", 662 | "tuples", 663 | "unfoldable" 664 | ] 665 | }, 666 | "orders": { 667 | "type": "registry", 668 | "version": "6.0.0", 669 | "integrity": "sha256-nBA0g3/ai0euH8q9pSbGqk53W2q6agm/dECZTHcoink=", 670 | "dependencies": [ 671 | "newtype", 672 | "prelude" 673 | ] 674 | }, 675 | "parallel": { 676 | "type": "registry", 677 | "version": "7.0.0", 678 | "integrity": "sha256-gUC9i4Txnx9K9RcMLsjujbwZz6BB1bnE2MLvw4GIw5o=", 679 | "dependencies": [ 680 | "control", 681 | "effect", 682 | "either", 683 | "foldable-traversable", 684 | "functors", 685 | "maybe", 686 | "newtype", 687 | "prelude", 688 | "profunctor", 689 | "refs", 690 | "transformers" 691 | ] 692 | }, 693 | "partial": { 694 | "type": "registry", 695 | "version": "4.0.0", 696 | "integrity": "sha256-fwXerld6Xw1VkReh8yeQsdtLVrjfGiVuC5bA1Wyo/J4=", 697 | "dependencies": [] 698 | }, 699 | "posix-types": { 700 | "type": "registry", 701 | "version": "6.0.0", 702 | "integrity": "sha256-ZfFz8RR1lee/o/Prccyeut3Q+9tYd08mlR72sIh6GzA=", 703 | "dependencies": [ 704 | "maybe", 705 | "prelude" 706 | ] 707 | }, 708 | "prelude": { 709 | "type": "registry", 710 | "version": "6.0.1", 711 | "integrity": "sha256-o8p6SLYmVPqzXZhQFd2hGAWEwBoXl1swxLG/scpJ0V0=", 712 | "dependencies": [] 713 | }, 714 | "profunctor": { 715 | "type": "registry", 716 | "version": "6.0.1", 717 | "integrity": "sha256-E58hSYdJvF2Qjf9dnWLPlJKh2Z2fLfFLkQoYi16vsFk=", 718 | "dependencies": [ 719 | "control", 720 | "distributive", 721 | "either", 722 | "exists", 723 | "invariant", 724 | "newtype", 725 | "prelude", 726 | "tuples" 727 | ] 728 | }, 729 | "refs": { 730 | "type": "registry", 731 | "version": "6.0.0", 732 | "integrity": "sha256-Vgwne7jIbD3ZMoLNNETLT8Litw6lIYo3MfYNdtYWj9s=", 733 | "dependencies": [ 734 | "effect", 735 | "prelude" 736 | ] 737 | }, 738 | "safe-coerce": { 739 | "type": "registry", 740 | "version": "2.0.0", 741 | "integrity": "sha256-a1ibQkiUcbODbLE/WAq7Ttbbh9ex+x33VCQ7GngKudU=", 742 | "dependencies": [ 743 | "unsafe-coerce" 744 | ] 745 | }, 746 | "st": { 747 | "type": "registry", 748 | "version": "6.2.0", 749 | "integrity": "sha256-z9X0WsOUlPwNx9GlCC+YccCyz8MejC8Wb0C4+9fiBRY=", 750 | "dependencies": [ 751 | "partial", 752 | "prelude", 753 | "tailrec", 754 | "unsafe-coerce" 755 | ] 756 | }, 757 | "strings": { 758 | "type": "registry", 759 | "version": "6.0.1", 760 | "integrity": "sha256-WssD3DbX4OPzxSdjvRMX0yvc9+pS7n5gyPv5I2Trb7k=", 761 | "dependencies": [ 762 | "arrays", 763 | "control", 764 | "either", 765 | "enums", 766 | "foldable-traversable", 767 | "gen", 768 | "integers", 769 | "maybe", 770 | "newtype", 771 | "nonempty", 772 | "partial", 773 | "prelude", 774 | "tailrec", 775 | "tuples", 776 | "unfoldable", 777 | "unsafe-coerce" 778 | ] 779 | }, 780 | "tailrec": { 781 | "type": "registry", 782 | "version": "6.1.0", 783 | "integrity": "sha256-Xx19ECVDRrDWpz9D2GxQHHV89vd61dnXxQm0IcYQHGk=", 784 | "dependencies": [ 785 | "bifunctors", 786 | "effect", 787 | "either", 788 | "identity", 789 | "maybe", 790 | "partial", 791 | "prelude", 792 | "refs" 793 | ] 794 | }, 795 | "transformers": { 796 | "type": "registry", 797 | "version": "6.1.0", 798 | "integrity": "sha256-3Bm+Z6tsC/paG888XkywDngJ2JMos+JfOhRlkVfb7gI=", 799 | "dependencies": [ 800 | "control", 801 | "distributive", 802 | "effect", 803 | "either", 804 | "exceptions", 805 | "foldable-traversable", 806 | "identity", 807 | "lazy", 808 | "maybe", 809 | "newtype", 810 | "prelude", 811 | "st", 812 | "tailrec", 813 | "tuples", 814 | "unfoldable" 815 | ] 816 | }, 817 | "tuples": { 818 | "type": "registry", 819 | "version": "7.0.0", 820 | "integrity": "sha256-1rXgTomes9105BjgXqIw0FL6Fz1lqqUTLWOumhWec1M=", 821 | "dependencies": [ 822 | "control", 823 | "invariant", 824 | "prelude" 825 | ] 826 | }, 827 | "type-equality": { 828 | "type": "registry", 829 | "version": "4.0.1", 830 | "integrity": "sha256-Hs9D6Y71zFi/b+qu5NSbuadUQXe5iv5iWx0226vOHUw=", 831 | "dependencies": [] 832 | }, 833 | "typelevel-prelude": { 834 | "type": "registry", 835 | "version": "7.0.0", 836 | "integrity": "sha256-uFF2ph+vHcQpfPuPf2a3ukJDFmLhApmkpTMviHIWgJM=", 837 | "dependencies": [ 838 | "prelude", 839 | "type-equality" 840 | ] 841 | }, 842 | "unfoldable": { 843 | "type": "registry", 844 | "version": "6.0.0", 845 | "integrity": "sha256-JtikvJdktRap7vr/K4ITlxUX1QexpnqBq0G/InLr6eg=", 846 | "dependencies": [ 847 | "foldable-traversable", 848 | "maybe", 849 | "partial", 850 | "prelude", 851 | "tuples" 852 | ] 853 | }, 854 | "unsafe-coerce": { 855 | "type": "registry", 856 | "version": "6.0.0", 857 | "integrity": "sha256-IqIYW4Vkevn8sI+6aUwRGvd87tVL36BBeOr0cGAE7t0=", 858 | "dependencies": [] 859 | } 860 | } 861 | } 862 | --------------------------------------------------------------------------------