├── .github └── workflows │ └── build.yaml ├── .gitignore ├── .stylish-haskell.yaml ├── ChangeLog.md ├── LICENSE ├── README.md ├── Setup.hs ├── app └── Main.hs ├── doctests.hs ├── example ├── .gitignore ├── build.sh ├── package-lock.json ├── package.json ├── spago.yaml ├── src │ └── Main.purs └── user.mts ├── package.yaml ├── src └── Language │ └── PureScript │ ├── CodeGen │ └── Tsd │ │ ├── Identifier.hs │ │ └── Types.hs │ ├── Constants │ └── Compat.hs │ ├── Environment │ └── Compat.hs │ ├── Externs │ └── Compat.hs │ ├── Kinds │ └── Compat.hs │ ├── Pretty │ └── Compat.hs │ └── TsdGen │ ├── Hardwired.hs │ ├── Module.hs │ ├── Module │ └── ReadExterns.hs │ └── Types.hs ├── stack-purs0.15.0.yaml ├── stack-purs0.15.10.yaml ├── stack-purs0.15.12.yaml ├── stack-purs0.15.13.yaml ├── stack-purs0.15.14.yaml ├── stack-purs0.15.15.yaml ├── stack-purs0.15.2.yaml ├── stack-purs0.15.3.yaml ├── stack-purs0.15.4.yaml ├── stack-purs0.15.5.yaml ├── stack-purs0.15.6.yaml ├── stack-purs0.15.7.yaml ├── stack-purs0.15.8.yaml └── stack-purs0.15.9.yaml /.github/workflows/build.yaml: -------------------------------------------------------------------------------- 1 | on: [push, pull_request] 2 | name: build and test 3 | jobs: 4 | build-and-test: 5 | name: build and test 6 | runs-on: ubuntu-latest 7 | strategy: 8 | matrix: 9 | include: 10 | - purs: '0.15.0' 11 | - purs: '0.15.2' 12 | - purs: '0.15.3' 13 | - purs: '0.15.4' 14 | registry: '10.0.0' 15 | - purs: '0.15.5' 16 | - purs: '0.15.6' 17 | - purs: '0.15.7' 18 | registry: '20.0.3' 19 | - purs: '0.15.8' 20 | registry: '27.2.0' 21 | - purs: '0.15.9' 22 | registry: '29.1.0' 23 | - purs: '0.15.10' 24 | registry: '43.3.0' 25 | - purs: '0.15.12' 26 | registry: '46.2.0' 27 | - purs: '0.15.13' 28 | registry: '47.10.0' 29 | - purs: '0.15.14' 30 | registry: '50.0.0' 31 | - purs: '0.15.15' 32 | steps: 33 | - uses: actions/checkout@v3 34 | 35 | # Already installed: 36 | # - name: Install Stack 37 | # run: curl -sSL https://get.haskellstack.org/ | sh 38 | 39 | - uses: actions/cache@v3 40 | with: 41 | path: ~/.stack 42 | key: ${{ matrix.purs }} 43 | 44 | - name: Build 45 | run: stack build --stack-yaml=stack-purs${{ matrix.purs }}.yaml purescript purescript-tsd-gen 46 | 47 | # - name: Doctest 48 | # run: stack test --stack-yaml=stack-purs${{ matrix.purs }}.yaml 49 | 50 | - name: Compile and run the example 51 | if: ${{ matrix.registry }} 52 | working-directory: ./example 53 | run: | 54 | mv package.json package.json.tmp 55 | jq '.devDependencies.purescript="${{ matrix.purs }}"' package.json.tmp > package.json 56 | sed -i.bak -E -e 's/registry: [0-9]+\.[0-9]+\.[0-9]+/registry: ${{ matrix.registry }}/' spago.yaml 57 | npm update && npm install 58 | npx spago build 59 | stack exec --stack-yaml=../stack-purs${{ matrix.purs }}.yaml -- purs-tsd-gen -d output 60 | npx tsc --strict --module es2015 user.mts 61 | node user.mjs 62 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .stack-work/ 2 | dist-newstyle/ 3 | purescript-tsd-gen.cabal 4 | *~ 5 | *.yaml.lock 6 | -------------------------------------------------------------------------------- /.stylish-haskell.yaml: -------------------------------------------------------------------------------- 1 | # stylish-haskell configuration file 2 | # ================================== 3 | 4 | # The stylish-haskell tool is mainly configured by specifying steps. These steps 5 | # are a list, so they have an order, and one specific step may appear more than 6 | # once (if needed). Each file is processed by these steps in the given order. 7 | steps: 8 | # Convert some ASCII sequences to their Unicode equivalents. This is disabled 9 | # by default. 10 | # - unicode_syntax: 11 | # # In order to make this work, we also need to insert the UnicodeSyntax 12 | # # language pragma. If this flag is set to true, we insert it when it's 13 | # # not already present. You may want to disable it if you configure 14 | # # language extensions using some other method than pragmas. Default: 15 | # # true. 16 | # add_language_pragma: true 17 | 18 | # Align the right hand side of some elements. This is quite conservative 19 | # and only applies to statements where each element occupies a single 20 | # line. All default to true. 21 | - simple_align: 22 | cases: true 23 | top_level_patterns: true 24 | records: true 25 | 26 | # Import cleanup 27 | - imports: 28 | # There are different ways we can align names and lists. 29 | # 30 | # - global: Align the import names and import list throughout the entire 31 | # file. 32 | # 33 | # - file: Like global, but don't add padding when there are no qualified 34 | # imports in the file. 35 | # 36 | # - group: Only align the imports per group (a group is formed by adjacent 37 | # import lines). 38 | # 39 | # - none: Do not perform any alignment. 40 | # 41 | # Default: global. 42 | align: global 43 | 44 | # The following options affect only import list alignment. 45 | # 46 | # List align has following options: 47 | # 48 | # - after_alias: Import list is aligned with end of import including 49 | # 'as' and 'hiding' keywords. 50 | # 51 | # > import qualified Data.List as List (concat, foldl, foldr, head, 52 | # > init, last, length) 53 | # 54 | # - with_alias: Import list is aligned with start of alias or hiding. 55 | # 56 | # > import qualified Data.List as List (concat, foldl, foldr, head, 57 | # > init, last, length) 58 | # 59 | # - new_line: Import list starts always on new line. 60 | # 61 | # > import qualified Data.List as List 62 | # > (concat, foldl, foldr, head, init, last, length) 63 | # 64 | # Default: after_alias 65 | list_align: after_alias 66 | 67 | # Right-pad the module names to align imports in a group: 68 | # 69 | # - true: a little more readable 70 | # 71 | # > import qualified Data.List as List (concat, foldl, foldr, 72 | # > init, last, length) 73 | # > import qualified Data.List.Extra as List (concat, foldl, foldr, 74 | # > init, last, length) 75 | # 76 | # - false: diff-safe 77 | # 78 | # > import qualified Data.List as List (concat, foldl, foldr, init, 79 | # > last, length) 80 | # > import qualified Data.List.Extra as List (concat, foldl, foldr, 81 | # > init, last, length) 82 | # 83 | # Default: true 84 | pad_module_names: false 85 | 86 | # Long list align style takes effect when import is too long. This is 87 | # determined by 'columns' setting. 88 | # 89 | # - inline: This option will put as much specs on same line as possible. 90 | # 91 | # - new_line: Import list will start on new line. 92 | # 93 | # - new_line_multiline: Import list will start on new line when it's 94 | # short enough to fit to single line. Otherwise it'll be multiline. 95 | # 96 | # - multiline: One line per import list entry. 97 | # Type with constructor list acts like single import. 98 | # 99 | # > import qualified Data.Map as M 100 | # > ( empty 101 | # > , singleton 102 | # > , ... 103 | # > , delete 104 | # > ) 105 | # 106 | # Default: inline 107 | long_list_align: inline 108 | 109 | # Align empty list (importing instances) 110 | # 111 | # Empty list align has following options 112 | # 113 | # - inherit: inherit list_align setting 114 | # 115 | # - right_after: () is right after the module name: 116 | # 117 | # > import Vector.Instances () 118 | # 119 | # Default: inherit 120 | empty_list_align: inherit 121 | 122 | # List padding determines indentation of import list on lines after import. 123 | # This option affects 'long_list_align'. 124 | # 125 | # - : constant value 126 | # 127 | # - module_name: align under start of module name. 128 | # Useful for 'file' and 'group' align settings. 129 | # 130 | # Default: 4 131 | list_padding: 4 132 | 133 | # Separate lists option affects formatting of import list for type 134 | # or class. The only difference is single space between type and list 135 | # of constructors, selectors and class functions. 136 | # 137 | # - true: There is single space between Foldable type and list of it's 138 | # functions. 139 | # 140 | # > import Data.Foldable (Foldable (fold, foldl, foldMap)) 141 | # 142 | # - false: There is no space between Foldable type and list of it's 143 | # functions. 144 | # 145 | # > import Data.Foldable (Foldable(fold, foldl, foldMap)) 146 | # 147 | # Default: true 148 | separate_lists: true 149 | 150 | # Space surround option affects formatting of import lists on a single 151 | # line. The only difference is single space after the initial 152 | # parenthesis and a single space before the terminal parenthesis. 153 | # 154 | # - true: There is single space associated with the enclosing 155 | # parenthesis. 156 | # 157 | # > import Data.Foo ( foo ) 158 | # 159 | # - false: There is no space associated with the enclosing parenthesis 160 | # 161 | # > import Data.Foo (foo) 162 | # 163 | # Default: false 164 | space_surround: false 165 | 166 | # Language pragmas 167 | - language_pragmas: 168 | # We can generate different styles of language pragma lists. 169 | # 170 | # - vertical: Vertical-spaced language pragmas, one per line. 171 | # 172 | # - compact: A more compact style. 173 | # 174 | # - compact_line: Similar to compact, but wrap each line with 175 | # `{-#LANGUAGE #-}'. 176 | # 177 | # Default: vertical. 178 | style: vertical 179 | 180 | # Align affects alignment of closing pragma brackets. 181 | # 182 | # - true: Brackets are aligned in same column. 183 | # 184 | # - false: Brackets are not aligned together. There is only one space 185 | # between actual import and closing bracket. 186 | # 187 | # Default: true 188 | align: false 189 | 190 | # stylish-haskell can detect redundancy of some language pragmas. If this 191 | # is set to true, it will remove those redundant pragmas. Default: true. 192 | remove_redundant: true 193 | 194 | # Replace tabs by spaces. This is disabled by default. 195 | # - tabs: 196 | # # Number of spaces to use for each tab. Default: 8, as specified by the 197 | # # Haskell report. 198 | # spaces: 8 199 | 200 | # Remove trailing whitespace 201 | - trailing_whitespace: {} 202 | 203 | # Squash multiple spaces between the left and right hand sides of some 204 | # elements into single spaces. Basically, this undoes the effect of 205 | # simple_align but is a bit less conservative. 206 | # - squash: {} 207 | 208 | # A common setting is the number of columns (parts of) code will be wrapped 209 | # to. Different steps take this into account. Default: 80. 210 | columns: 80 211 | 212 | # By default, line endings are converted according to the OS. You can override 213 | # preferred format here. 214 | # 215 | # - native: Native newline format. CRLF on Windows, LF on other OSes. 216 | # 217 | # - lf: Convert to LF ("\n"). 218 | # 219 | # - crlf: Convert to CRLF ("\r\n"). 220 | # 221 | # Default: native. 222 | newline: native 223 | 224 | # Sometimes, language extensions are specified in a cabal file or from the 225 | # command line instead of using language pragmas in the file. stylish-haskell 226 | # needs to be aware of these, so it can parse the file correctly. 227 | # 228 | # No language extensions are enabled by default. 229 | # language_extensions: 230 | # - TemplateHaskell 231 | # - QuasiQuotes 232 | -------------------------------------------------------------------------------- /ChangeLog.md: -------------------------------------------------------------------------------- 1 | # Changelog for purescript-tsd-gen 2 | 3 | ## 0.3.0.0 (2019-06-22) 4 | 5 | * Works with PureScript v0.13.0. 6 | * Support `Foreign.Object.Object` from [purescript-foreign-object](https://github.com/purescript/purescript-foreign-object). 7 | * Support `Effect.Uncurried` from purescript-effect. 8 | * Add `--version` option. 9 | 10 | ## 0.2.0.0 (2018-06-08) 11 | 12 | * Support for PureScript v0.12.0. 13 | * Support `Data.Variant.Variant` from [purescript-variant](https://github.com/natefaubion/purescript-variant). 14 | * Support `Data.Nullable.Nullable` from [purescript-nullable](https://github.com/purescript-contrib/purescript-nullable). 15 | 16 | ## 0.1.0.0 (2018-02-19) 17 | 18 | Initial release. 19 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright ARATA Mizuki (c) 2018 2 | 3 | All rights reserved. 4 | 5 | Redistribution and use in source and binary forms, with or without 6 | modification, are permitted provided that the following conditions are met: 7 | 8 | * Redistributions of source code must retain the above copyright 9 | notice, this list of conditions and the following disclaimer. 10 | 11 | * Redistributions in binary form must reproduce the above 12 | copyright notice, this list of conditions and the following 13 | disclaimer in the documentation and/or other materials provided 14 | with the distribution. 15 | 16 | * Neither the name of ARATA Mizuki nor the names of other 17 | contributors may be used to endorse or promote products derived 18 | from this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23 | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24 | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25 | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26 | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # purescript-tsd-gen 2 | 3 | This is a TypeScript Declaration File (.d.ts) generator for PureScript. 4 | 5 | This tool helps you use PureScript modules from TypeScript. 6 | 7 | # How to build 8 | 9 | ```sh 10 | $ git clone https://github.com/minoki/purescript-tsd-gen.git 11 | $ cd purescript-tsd-gen 12 | $ stack install --stack-yaml=stack-purs0.15.15.yaml 13 | ``` 14 | 15 | If you are using PureScript 0.14.x or older, try following: 16 | 17 | ```sh 18 | $ git clone -b purs0.14.x https://github.com/minoki/purescript-tsd-gen.git 19 | $ cd purescript-tsd-gen 20 | $ stack install --stack-yaml=stack-purs0.14.9.yaml 21 | ``` 22 | 23 | # How to use 24 | 25 | Assuming you have compiled PureScript modules into `./output`: 26 | 27 | ```sh 28 | $ tree output/ 29 | output/ 30 | ├── Control.Alt 31 | │   ├── externs.cbor 32 | │   └── index.js 33 | ├── Control.Alternative 34 | │   ├── externs.cbor 35 | │   └── index.js 36 | ... 37 | └── YourFancyModuleInPurs 38 | ├── externs.cbor 39 | └── index.js 40 | ``` 41 | 42 | Run the following to get the declaration files: 43 | 44 | ```sh 45 | $ purs-tsd-gen -d output/ YourFancyModuleInPurs 46 | ``` 47 | 48 | Now you get `index.d.ts` alongside each module's `index.js`: 49 | 50 | ```sh 51 | $ tree output/ 52 | output/ 53 | ├── Control.Alt 54 | │   ├── externs.cbor 55 | │   ├── index.d.ts 56 | │   └── index.js 57 | ├── Control.Alternative 58 | │   ├── externs.cbor 59 | │   ├── index.d.ts 60 | │   └── index.js 61 | ... 62 | └── YourFancyModuleInPurs 63 | ├── externs.cbor 64 |     ├── index.d.ts 65 | └── index.js 66 | ``` 67 | 68 | # Mapping of types 69 | 70 | ## Builtin 71 | 72 | Primitive types translate as one would imagine: 73 | 74 | - `Function s t` (`s -> t`) --> `(_: s) => t` 75 | - `Array t` --> `Array` 76 | - TODO: Add an option to emit `ReadonlyArray`. 77 | - `Record { key1 :: Type1, key2 :: Type2 }` --> `{ key1: Type1, key2: Type2 }` 78 | - TODO: Add an option to make fields `readonly`. 79 | - `Number`, `Int` --> `number` 80 | - `String`, `Char` --> `string` 81 | - `Boolean` --> `boolean` 82 | 83 | Some modules get special handling: 84 | 85 | - `Data.Function.Uncurried` 86 | - `Fn0 r` --> `() => r` 87 | - `Fn2 a0 a1 r` --> `(_0: a0, _1: a2) => r` 88 | - `Fn3 a0 a1 a2 r` --> `(_0: a0, _1: a1, _2: a2) => r` 89 | - ... 90 | - `Fn10 a0 a1 ... a9 r` --> `(_0: a0, _1: a1, ..., _9: a9) => r` 91 | - `Effect` (from [purescript-effect](https://github.com/purescript/purescript-effect)) 92 | - `Effect a` -> `() => a` 93 | - `Effect.Uncurried` (from purescript-effect) 94 | - `EffectFn1 a0 r ` -> `(_0: a0) => r` 95 | - `EffectFn2 a0 a1 r` -> `(_0: a0, _1: a1) => r` 96 | - `EffectFn3 a0 a1 a2 r` -> `(_0: a0, _1: a1, _2: a2) => r` 97 | - ... 98 | - `EffectFn10 a0 a1 ... a9 r` -> `(_0: a0, _1: a1, ..., _9: a9) => r` 99 | - `Data.Variant` (from [purescript-variant](https://github.com/natefaubion/purescript-variant)) 100 | - `Variant (tag1 :: Type1, tag2 :: Type2)` --> `{type: "tag1", value: Type1} | {type: "tag2", value: Type2}` 101 | - `Data.Nullable` (from [purescript-nullable](https://github.com/purescript-contrib/purescript-nullable)) 102 | - `Nullable a` --> `a | null` 103 | - `Foreign.Object` (from [purescript-foreign-object](https://github.com/purescript/purescript-foreign-object)) 104 | - `Object t` --> `{[_: string]: t}` 105 | - `Control.Monad.Eff` (deprecated) 106 | - `Eff e r` -> `() => r` 107 | - `Data.StrMap` (deprecated) 108 | - `StrMap t` --> `{[_: string]: t}` 109 | 110 | ## User-defined Data Types 111 | 112 | Data type `SomeFancyDataType :: Type -> ... -> Type -> Type` is translated to `SomeFancyDataType`. 113 | 114 | In contrast to usual TypeScript's structual subtyping, the translated types mimicks nominal typing with extra dummy fields. 115 | 116 | Sum types are translated to discriminated union types, with a dummy tag field. Type guards with `instanceof` should work. 117 | 118 | Data constructors are typed as an object type with `new` signature and `create` or `value` field. 119 | 120 | Types whose data constructors are not exposed, i.e. abstract types, are translated to an object type which contains `never` as a field, so that you cannot accidentally create a value of abstract types in TypeScript world. 121 | 122 | Let's see some examples: 123 | 124 | - Tuple 125 | 126 | ```purescript 127 | data Tuple a b = Tuple a b 128 | ``` 129 | 130 | compiles to: 131 | 132 | ```typescript 133 | export type /*data*/ Tuple = Tuple$$Tuple< a, b >; 134 | interface Tuple$$Tuple { 135 | "$$pursType"?: "Data.Tuple.Tuple"; 136 | "$$pursTag"?: "Tuple"; 137 | value0: a; 138 | value1: b; 139 | } 140 | export const /*data ctor*/ Tuple: { create: (_: a) => (_: b) => Tuple< a, b >; new (_0: a, _1: b): Tuple$$Tuple< a, b > }; 141 | ``` 142 | 143 | - Maybe 144 | 145 | ```purescript 146 | data Maybe a = Nothing | Just a 147 | ``` 148 | 149 | compiles to: 150 | 151 | ```typescript 152 | export type /*data*/ Maybe = Maybe$$Nothing | Maybe$$Just< a >; 153 | interface Maybe$$Nothing { 154 | "$$pursType": "Data.Maybe.Maybe"; 155 | "$$pursTag": "Nothing"; 156 | } 157 | export const /*data ctor*/ Nothing: { value: Maybe< any /* type variable a */ >; new (): Maybe$$Nothing }; 158 | interface Maybe$$Just { 159 | "$$pursType": "Data.Maybe.Maybe"; 160 | "$$pursTag": "Just"; 161 | value0: a; 162 | } 163 | export const /*data ctor*/ Just: { create: (_: a) => Maybe< a >; new (_: a): Maybe$$Just< a > }; 164 | ``` 165 | 166 | - Either 167 | 168 | ```purescript 169 | data Either a b = Left a | Right b 170 | ``` 171 | 172 | compiles to: 173 | 174 | ```typescript 175 | export type /*data*/ Either = Either$$Left< a > | Either$$Right< b >; 176 | interface Either$$Left { 177 | "$$pursType": "Data.Either.Either"; 178 | "$$pursTag": "Left"; 179 | value0: a; 180 | } 181 | export const /*data ctor*/ Left: { create: (_: a) => Either< a, b >; new (_: a): Either$$Left< a > }; 182 | interface Either$$Right { 183 | "$$pursType": "Data.Either.Either"; 184 | "$$pursTag": "Right"; 185 | value0: b; 186 | } 187 | export const /*data ctor*/ Right: { create: (_: b) => Either< a, b >; new (_: b): Either$$Right< b > }; 188 | ``` 189 | 190 | ## Newtypes 191 | 192 | Newtypes are translated to a type synonym. The nominal property in PureScript is lost. 193 | 194 | ## `foreign import data` 195 | 196 | `foreign import data` are translated to `any`. 197 | 198 | Maybe there should be a way for PS-library authors to provide corresponding `.d.ts` for foreign JavaScript modules. 199 | 200 | ## Universally Quantified Types 201 | 202 | Simple polymorphic functions translate to generic functions. 203 | 204 | If the type is too complex, there may situations where the emitted declarations contain undue `any` type. 205 | 206 | ## Higher-Kinded Types 207 | 208 | Not supported. 209 | 210 | ## Type Classes 211 | 212 | Not supported. 213 | -------------------------------------------------------------------------------- /Setup.hs: -------------------------------------------------------------------------------- 1 | import Distribution.Simple 2 | main = defaultMain 3 | -------------------------------------------------------------------------------- /app/Main.hs: -------------------------------------------------------------------------------- 1 | {-# LANGUAGE OverloadedStrings #-} 2 | {-# LANGUAGE RecordWildCards #-} 3 | module Main where 4 | import Control.Monad.Except 5 | import Control.Monad.State 6 | import qualified Data.List as List 7 | import qualified Data.Map as Map 8 | import Data.Maybe 9 | import qualified Data.Text as T 10 | import qualified Data.Text.Lazy.Builder as TB 11 | import qualified Data.Text.Lazy.IO as TL 12 | import Data.Version (showVersion) 13 | import qualified Language.PureScript (version) 14 | import Language.PureScript.Environment 15 | import Language.PureScript.Externs 16 | import Language.PureScript.Names 17 | import Language.PureScript.TsdGen.Module 18 | import Options.Applicative 19 | import Paths_purescript_tsd_gen (version) 20 | import Prelude hiding (elem, lookup, notElem) 21 | import System.Directory (createDirectoryIfMissing, doesDirectoryExist, 22 | listDirectory) 23 | import System.Exit (exitFailure) 24 | import System.FilePath (()) 25 | import System.IO (hPutStrLn, stderr) 26 | 27 | processModules :: FilePath -> Maybe FilePath -> [String] -> Bool -> ExceptT ModuleProcessingError IO () 28 | processModules inputDir mOutputDir modules importAll = do 29 | let loadOneModule = recursivelyLoadExterns inputDir . moduleNameFromString . T.pack 30 | -- TODO: Check efVersion 31 | (env,m) <- execStateT (mapM_ loadOneModule modules) (initEnvironment, Map.empty) 32 | forM_ (catMaybes $ Map.elems m) $ \ef -> do 33 | let moduleName = runModuleName (efModuleName ef) 34 | modTsd <- processLoadedModule env ef importAll 35 | liftIO $ case mOutputDir of 36 | Just outputDir -> do 37 | let moduleDir = outputDir T.unpack moduleName 38 | createDirectoryIfMissing True moduleDir 39 | TL.writeFile (moduleDir "index.d.ts") (TB.toLazyText modTsd) 40 | Nothing -> do -- write to stdout 41 | TL.putStr (TB.toLazyText modTsd) 42 | 43 | data TsdOutput = TsdOutputDirectory FilePath | StdOutput | SameAsInput 44 | 45 | data PursTsdGen = PursTsdGen { pursOutputDirectory :: FilePath 46 | , tsdOutput :: TsdOutput 47 | , importAll :: Bool 48 | , moduleNames :: [String] 49 | } 50 | | ShowVersion 51 | 52 | tsdOutputParser :: Parser TsdOutput 53 | tsdOutputParser = (TsdOutputDirectory <$> strOption (long "tsd-directory" <> metavar "" <> help "Where to write .d.ts files; same as --directory by default")) 54 | <|> flag' StdOutput (long "stdout" <> help "Write to stdout (for dry-run)") 55 | <|> pure SameAsInput 56 | 57 | pursTsdGen :: Parser PursTsdGen 58 | pursTsdGen = PursTsdGen 59 | <$> strOption (long "directory" <> short 'd' <> metavar "" <> help "PureScript's output directory (typically ./output)") 60 | <*> tsdOutputParser 61 | <*> switch (long "import-all" <> help "Import dependent modules even if not referenced") 62 | <*> (many (strArgument (metavar "" <> help "List of modules to export (all if omitted). Glob-like patterns '*' and '**' are parsed."))) 63 | <|> flag' ShowVersion (long "version" <> short 'v' <> help "Show version") 64 | 65 | -- | 66 | -- >>> filter (testModuleGlob "Foo.*") ["FooBar","Foo.Bar","Foo.Bar.Baz"] 67 | -- ["Foo.Bar"] 68 | -- >>> filter (testModuleGlob "Foo*") ["Foo.Bar","FooBar"] 69 | -- ["FooBar"] 70 | -- >>> filter (testModuleGlob "Foo*Bar") ["FooBar","FooBazBar","FooBaz.Bar"] 71 | -- ["FooBar","FooBazBar"] 72 | -- >>> filter (testModuleGlob "Foo**Bar") ["FooBar","FooBazBar","FooBaz.Bar"] 73 | -- ["FooBar","FooBazBar","FooBaz.Bar"] 74 | testModuleGlob :: String -> String -> Bool 75 | testModuleGlob [] [] = True 76 | -- '**': wildcard, including '.' 77 | testModuleGlob ('*':'*':xs) s = any (testModuleGlob xs) (List.tails s) 78 | -- '*': wildcard, not including '.' 79 | testModuleGlob ('*':xs) s = any (testModuleGlob xs) (tails' s) 80 | where 81 | tails' :: String -> [String] 82 | tails' [] = [[]] 83 | tails' t@(y:ys) | y == '.' = [t] 84 | | otherwise = t : tails' ys 85 | testModuleGlob (x:xs) (y:ys) | x == y = testModuleGlob xs ys 86 | testModuleGlob _ _ = False 87 | 88 | isGlobPattern :: String -> Bool 89 | isGlobPattern = List.elem '*' 90 | 91 | main :: IO () 92 | main = do 93 | p <- execParser opts 94 | case p of 95 | PursTsdGen{..} -> do 96 | dirEntries <- listDirectory pursOutputDirectory 97 | allModules <- filterM (\name -> doesDirectoryExist (pursOutputDirectory name)) dirEntries 98 | let selectedModules = case moduleNames of 99 | [] -> allModules 100 | _ -> let (patterns,literals) = List.partition isGlobPattern moduleNames 101 | in List.nub $ filter (\t -> any (flip testModuleGlob t) patterns) allModules ++ literals 102 | let tsdOutputDirectory = case tsdOutput of 103 | TsdOutputDirectory dir -> Just dir 104 | StdOutput -> Nothing 105 | SameAsInput -> Just pursOutputDirectory 106 | result <- runExceptT $ processModules pursOutputDirectory tsdOutputDirectory selectedModules importAll 107 | case result of 108 | Left err -> do hPutStrLn stderr (show err) -- TODO: Better error handling 109 | exitFailure 110 | Right _ -> return () 111 | ShowVersion -> do 112 | putStrLn $ "purs-tsd-gen " <> showVersion version 113 | <> " (works with purescript " <> showVersion Language.PureScript.version <> ")" 114 | where 115 | opts = info (pursTsdGen <**> helper) 116 | (fullDesc 117 | <> progDesc "Generate .d.ts files for PureScript modules" 118 | <> header ("purs-tsd-gen " <> showVersion version <> " - .d.ts generator for PureScript")) 119 | -------------------------------------------------------------------------------- /doctests.hs: -------------------------------------------------------------------------------- 1 | import Test.DocTest 2 | main :: IO () 3 | main = doctest ["-isrc", "src/", "-XOverloadedStrings"] 4 | -------------------------------------------------------------------------------- /example/.gitignore: -------------------------------------------------------------------------------- 1 | .spago/ 2 | node_modules/ 3 | output/ 4 | user.mjs 5 | spago.lock 6 | -------------------------------------------------------------------------------- /example/build.sh: -------------------------------------------------------------------------------- 1 | npx spago build 2 | stack exec --stack-yaml=../stack-purs0.15.14.yaml -- purs-tsd-gen -d output 3 | npx tsc --strict --module es2015 user.mts 4 | -------------------------------------------------------------------------------- /example/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "example", 3 | "lockfileVersion": 3, 4 | "requires": true, 5 | "packages": { 6 | "": { 7 | "devDependencies": { 8 | "purescript": "0.15.14", 9 | "spago": "^0.93.24", 10 | "typescript": "^4.7.4" 11 | } 12 | }, 13 | "node_modules/@gar/promisify": { 14 | "version": "1.1.3", 15 | "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", 16 | "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", 17 | "dev": true 18 | }, 19 | "node_modules/@nodelib/fs.scandir": { 20 | "version": "2.1.5", 21 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 22 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 23 | "dev": true, 24 | "dependencies": { 25 | "@nodelib/fs.stat": "2.0.5", 26 | "run-parallel": "^1.1.9" 27 | }, 28 | "engines": { 29 | "node": ">= 8" 30 | } 31 | }, 32 | "node_modules/@nodelib/fs.stat": { 33 | "version": "2.0.5", 34 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 35 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 36 | "dev": true, 37 | "engines": { 38 | "node": ">= 8" 39 | } 40 | }, 41 | "node_modules/@nodelib/fs.walk": { 42 | "version": "1.2.8", 43 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 44 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 45 | "dev": true, 46 | "dependencies": { 47 | "@nodelib/fs.scandir": "2.1.5", 48 | "fastq": "^1.6.0" 49 | }, 50 | "engines": { 51 | "node": ">= 8" 52 | } 53 | }, 54 | "node_modules/@npmcli/fs": { 55 | "version": "2.1.2", 56 | "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", 57 | "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", 58 | "dev": true, 59 | "dependencies": { 60 | "@gar/promisify": "^1.1.3", 61 | "semver": "^7.3.5" 62 | }, 63 | "engines": { 64 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 65 | } 66 | }, 67 | "node_modules/@npmcli/move-file": { 68 | "version": "2.0.1", 69 | "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", 70 | "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", 71 | "deprecated": "This functionality has been moved to @npmcli/fs", 72 | "dev": true, 73 | "dependencies": { 74 | "mkdirp": "^1.0.4", 75 | "rimraf": "^3.0.2" 76 | }, 77 | "engines": { 78 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 79 | } 80 | }, 81 | "node_modules/@npmcli/move-file/node_modules/mkdirp": { 82 | "version": "1.0.4", 83 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 84 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", 85 | "dev": true, 86 | "bin": { 87 | "mkdirp": "bin/cmd.js" 88 | }, 89 | "engines": { 90 | "node": ">=10" 91 | } 92 | }, 93 | "node_modules/@npmcli/move-file/node_modules/rimraf": { 94 | "version": "3.0.2", 95 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 96 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 97 | "dev": true, 98 | "dependencies": { 99 | "glob": "^7.1.3" 100 | }, 101 | "bin": { 102 | "rimraf": "bin.js" 103 | }, 104 | "funding": { 105 | "url": "https://github.com/sponsors/isaacs" 106 | } 107 | }, 108 | "node_modules/@tootallnate/once": { 109 | "version": "2.0.0", 110 | "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", 111 | "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", 112 | "dev": true, 113 | "engines": { 114 | "node": ">= 10" 115 | } 116 | }, 117 | "node_modules/agent-base": { 118 | "version": "6.0.2", 119 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 120 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 121 | "dev": true, 122 | "dependencies": { 123 | "debug": "4" 124 | }, 125 | "engines": { 126 | "node": ">= 6.0.0" 127 | } 128 | }, 129 | "node_modules/agentkeepalive": { 130 | "version": "4.5.0", 131 | "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", 132 | "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", 133 | "dev": true, 134 | "dependencies": { 135 | "humanize-ms": "^1.2.1" 136 | }, 137 | "engines": { 138 | "node": ">= 8.0.0" 139 | } 140 | }, 141 | "node_modules/aggregate-error": { 142 | "version": "3.1.0", 143 | "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", 144 | "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", 145 | "dev": true, 146 | "dependencies": { 147 | "clean-stack": "^2.0.0", 148 | "indent-string": "^4.0.0" 149 | }, 150 | "engines": { 151 | "node": ">=8" 152 | } 153 | }, 154 | "node_modules/ansi-escapes": { 155 | "version": "4.3.2", 156 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", 157 | "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", 158 | "dev": true, 159 | "dependencies": { 160 | "type-fest": "^0.21.3" 161 | }, 162 | "engines": { 163 | "node": ">=8" 164 | }, 165 | "funding": { 166 | "url": "https://github.com/sponsors/sindresorhus" 167 | } 168 | }, 169 | "node_modules/ansi-regex": { 170 | "version": "5.0.1", 171 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 172 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 173 | "dev": true, 174 | "engines": { 175 | "node": ">=8" 176 | } 177 | }, 178 | "node_modules/ansi-styles": { 179 | "version": "3.2.1", 180 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 181 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 182 | "dev": true, 183 | "dependencies": { 184 | "color-convert": "^1.9.0" 185 | }, 186 | "engines": { 187 | "node": ">=4" 188 | } 189 | }, 190 | "node_modules/aproba": { 191 | "version": "1.2.0", 192 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", 193 | "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", 194 | "dev": true 195 | }, 196 | "node_modules/argparse": { 197 | "version": "2.0.1", 198 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 199 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 200 | "dev": true 201 | }, 202 | "node_modules/asn1": { 203 | "version": "0.2.6", 204 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", 205 | "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", 206 | "dev": true, 207 | "dependencies": { 208 | "safer-buffer": "~2.1.0" 209 | } 210 | }, 211 | "node_modules/astral-regex": { 212 | "version": "2.0.0", 213 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", 214 | "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", 215 | "dev": true, 216 | "engines": { 217 | "node": ">=8" 218 | } 219 | }, 220 | "node_modules/balanced-match": { 221 | "version": "1.0.2", 222 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 223 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 224 | "dev": true 225 | }, 226 | "node_modules/base64-js": { 227 | "version": "1.5.1", 228 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 229 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 230 | "dev": true, 231 | "funding": [ 232 | { 233 | "type": "github", 234 | "url": "https://github.com/sponsors/feross" 235 | }, 236 | { 237 | "type": "patreon", 238 | "url": "https://www.patreon.com/feross" 239 | }, 240 | { 241 | "type": "consulting", 242 | "url": "https://feross.org/support" 243 | } 244 | ] 245 | }, 246 | "node_modules/bcrypt-pbkdf": { 247 | "version": "1.0.2", 248 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 249 | "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", 250 | "dev": true, 251 | "dependencies": { 252 | "tweetnacl": "^0.14.3" 253 | } 254 | }, 255 | "node_modules/better-sqlite3": { 256 | "version": "8.7.0", 257 | "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-8.7.0.tgz", 258 | "integrity": "sha512-99jZU4le+f3G6aIl6PmmV0cxUIWqKieHxsiF7G34CVFiE+/UabpYqkU0NJIkY/96mQKikHeBjtR27vFfs5JpEw==", 259 | "dev": true, 260 | "hasInstallScript": true, 261 | "dependencies": { 262 | "bindings": "^1.5.0", 263 | "prebuild-install": "^7.1.1" 264 | } 265 | }, 266 | "node_modules/big-integer": { 267 | "version": "1.6.52", 268 | "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", 269 | "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", 270 | "dev": true, 271 | "engines": { 272 | "node": ">=0.6" 273 | } 274 | }, 275 | "node_modules/bindings": { 276 | "version": "1.5.0", 277 | "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", 278 | "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", 279 | "dev": true, 280 | "dependencies": { 281 | "file-uri-to-path": "1.0.0" 282 | } 283 | }, 284 | "node_modules/bl": { 285 | "version": "4.1.0", 286 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 287 | "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 288 | "dev": true, 289 | "dependencies": { 290 | "buffer": "^5.5.0", 291 | "inherits": "^2.0.4", 292 | "readable-stream": "^3.4.0" 293 | } 294 | }, 295 | "node_modules/bl/node_modules/readable-stream": { 296 | "version": "3.6.2", 297 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", 298 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", 299 | "dev": true, 300 | "dependencies": { 301 | "inherits": "^2.0.3", 302 | "string_decoder": "^1.1.1", 303 | "util-deprecate": "^1.0.1" 304 | }, 305 | "engines": { 306 | "node": ">= 6" 307 | } 308 | }, 309 | "node_modules/bluebird": { 310 | "version": "3.7.2", 311 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", 312 | "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", 313 | "dev": true 314 | }, 315 | "node_modules/bplist-parser": { 316 | "version": "0.2.0", 317 | "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", 318 | "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", 319 | "dev": true, 320 | "dependencies": { 321 | "big-integer": "^1.6.44" 322 | }, 323 | "engines": { 324 | "node": ">= 5.10.0" 325 | } 326 | }, 327 | "node_modules/brace-expansion": { 328 | "version": "1.1.11", 329 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 330 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 331 | "dev": true, 332 | "dependencies": { 333 | "balanced-match": "^1.0.0", 334 | "concat-map": "0.0.1" 335 | } 336 | }, 337 | "node_modules/braces": { 338 | "version": "3.0.2", 339 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 340 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 341 | "dev": true, 342 | "dependencies": { 343 | "fill-range": "^7.0.1" 344 | }, 345 | "engines": { 346 | "node": ">=8" 347 | } 348 | }, 349 | "node_modules/buffer": { 350 | "version": "5.7.1", 351 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 352 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 353 | "dev": true, 354 | "funding": [ 355 | { 356 | "type": "github", 357 | "url": "https://github.com/sponsors/feross" 358 | }, 359 | { 360 | "type": "patreon", 361 | "url": "https://www.patreon.com/feross" 362 | }, 363 | { 364 | "type": "consulting", 365 | "url": "https://feross.org/support" 366 | } 367 | ], 368 | "dependencies": { 369 | "base64-js": "^1.3.1", 370 | "ieee754": "^1.1.13" 371 | } 372 | }, 373 | "node_modules/buffer-from": { 374 | "version": "1.1.2", 375 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 376 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", 377 | "dev": true 378 | }, 379 | "node_modules/buildcheck": { 380 | "version": "0.0.6", 381 | "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.6.tgz", 382 | "integrity": "sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==", 383 | "dev": true, 384 | "optional": true, 385 | "engines": { 386 | "node": ">=10.0.0" 387 | } 388 | }, 389 | "node_modules/bundle-name": { 390 | "version": "3.0.0", 391 | "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", 392 | "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", 393 | "dev": true, 394 | "dependencies": { 395 | "run-applescript": "^5.0.0" 396 | }, 397 | "engines": { 398 | "node": ">=12" 399 | }, 400 | "funding": { 401 | "url": "https://github.com/sponsors/sindresorhus" 402 | } 403 | }, 404 | "node_modules/byline": { 405 | "version": "5.0.0", 406 | "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", 407 | "integrity": "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==", 408 | "dev": true, 409 | "engines": { 410 | "node": ">=0.10.0" 411 | } 412 | }, 413 | "node_modules/cacache": { 414 | "version": "11.3.3", 415 | "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz", 416 | "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==", 417 | "dev": true, 418 | "dependencies": { 419 | "bluebird": "^3.5.5", 420 | "chownr": "^1.1.1", 421 | "figgy-pudding": "^3.5.1", 422 | "glob": "^7.1.4", 423 | "graceful-fs": "^4.1.15", 424 | "lru-cache": "^5.1.1", 425 | "mississippi": "^3.0.0", 426 | "mkdirp": "^0.5.1", 427 | "move-concurrently": "^1.0.1", 428 | "promise-inflight": "^1.0.1", 429 | "rimraf": "^2.6.3", 430 | "ssri": "^6.0.1", 431 | "unique-filename": "^1.1.1", 432 | "y18n": "^4.0.0" 433 | } 434 | }, 435 | "node_modules/chalk": { 436 | "version": "2.4.2", 437 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 438 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 439 | "dev": true, 440 | "dependencies": { 441 | "ansi-styles": "^3.2.1", 442 | "escape-string-regexp": "^1.0.5", 443 | "supports-color": "^5.3.0" 444 | }, 445 | "engines": { 446 | "node": ">=4" 447 | } 448 | }, 449 | "node_modules/chownr": { 450 | "version": "1.1.4", 451 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", 452 | "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", 453 | "dev": true 454 | }, 455 | "node_modules/clean-stack": { 456 | "version": "2.2.0", 457 | "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", 458 | "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", 459 | "dev": true, 460 | "engines": { 461 | "node": ">=6" 462 | } 463 | }, 464 | "node_modules/cli-cursor": { 465 | "version": "3.1.0", 466 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", 467 | "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", 468 | "dev": true, 469 | "dependencies": { 470 | "restore-cursor": "^3.1.0" 471 | }, 472 | "engines": { 473 | "node": ">=8" 474 | } 475 | }, 476 | "node_modules/color-convert": { 477 | "version": "1.9.3", 478 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 479 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 480 | "dev": true, 481 | "dependencies": { 482 | "color-name": "1.1.3" 483 | } 484 | }, 485 | "node_modules/color-name": { 486 | "version": "1.1.3", 487 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 488 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", 489 | "dev": true 490 | }, 491 | "node_modules/concat-map": { 492 | "version": "0.0.1", 493 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 494 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 495 | "dev": true 496 | }, 497 | "node_modules/concat-stream": { 498 | "version": "1.6.2", 499 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 500 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 501 | "dev": true, 502 | "engines": [ 503 | "node >= 0.8" 504 | ], 505 | "dependencies": { 506 | "buffer-from": "^1.0.0", 507 | "inherits": "^2.0.3", 508 | "readable-stream": "^2.2.2", 509 | "typedarray": "^0.0.6" 510 | } 511 | }, 512 | "node_modules/copy-concurrently": { 513 | "version": "1.0.5", 514 | "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", 515 | "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", 516 | "dev": true, 517 | "dependencies": { 518 | "aproba": "^1.1.1", 519 | "fs-write-stream-atomic": "^1.0.8", 520 | "iferr": "^0.1.5", 521 | "mkdirp": "^0.5.1", 522 | "rimraf": "^2.5.4", 523 | "run-queue": "^1.0.0" 524 | } 525 | }, 526 | "node_modules/core-util-is": { 527 | "version": "1.0.3", 528 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", 529 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", 530 | "dev": true 531 | }, 532 | "node_modules/cpu-features": { 533 | "version": "0.0.9", 534 | "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.9.tgz", 535 | "integrity": "sha512-AKjgn2rP2yJyfbepsmLfiYcmtNn/2eUvocUyM/09yB0YDiz39HteK/5/T4Onf0pmdYDMgkBoGvRLvEguzyL7wQ==", 536 | "dev": true, 537 | "hasInstallScript": true, 538 | "optional": true, 539 | "dependencies": { 540 | "buildcheck": "~0.0.6", 541 | "nan": "^2.17.0" 542 | }, 543 | "engines": { 544 | "node": ">=10.0.0" 545 | } 546 | }, 547 | "node_modules/cross-spawn": { 548 | "version": "7.0.3", 549 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 550 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 551 | "dev": true, 552 | "dependencies": { 553 | "path-key": "^3.1.0", 554 | "shebang-command": "^2.0.0", 555 | "which": "^2.0.1" 556 | }, 557 | "engines": { 558 | "node": ">= 8" 559 | } 560 | }, 561 | "node_modules/cross-spawn/node_modules/which": { 562 | "version": "2.0.2", 563 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 564 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 565 | "dev": true, 566 | "dependencies": { 567 | "isexe": "^2.0.0" 568 | }, 569 | "bin": { 570 | "node-which": "bin/node-which" 571 | }, 572 | "engines": { 573 | "node": ">= 8" 574 | } 575 | }, 576 | "node_modules/cyclist": { 577 | "version": "1.0.2", 578 | "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.2.tgz", 579 | "integrity": "sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==", 580 | "dev": true 581 | }, 582 | "node_modules/debug": { 583 | "version": "4.3.4", 584 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 585 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 586 | "dev": true, 587 | "dependencies": { 588 | "ms": "2.1.2" 589 | }, 590 | "engines": { 591 | "node": ">=6.0" 592 | }, 593 | "peerDependenciesMeta": { 594 | "supports-color": { 595 | "optional": true 596 | } 597 | } 598 | }, 599 | "node_modules/debug/node_modules/ms": { 600 | "version": "2.1.2", 601 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 602 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 603 | "dev": true 604 | }, 605 | "node_modules/decompress-response": { 606 | "version": "6.0.0", 607 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", 608 | "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", 609 | "dev": true, 610 | "dependencies": { 611 | "mimic-response": "^3.1.0" 612 | }, 613 | "engines": { 614 | "node": ">=10" 615 | }, 616 | "funding": { 617 | "url": "https://github.com/sponsors/sindresorhus" 618 | } 619 | }, 620 | "node_modules/deep-extend": { 621 | "version": "0.6.0", 622 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 623 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", 624 | "dev": true, 625 | "engines": { 626 | "node": ">=4.0.0" 627 | } 628 | }, 629 | "node_modules/default-browser": { 630 | "version": "4.0.0", 631 | "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", 632 | "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", 633 | "dev": true, 634 | "dependencies": { 635 | "bundle-name": "^3.0.0", 636 | "default-browser-id": "^3.0.0", 637 | "execa": "^7.1.1", 638 | "titleize": "^3.0.0" 639 | }, 640 | "engines": { 641 | "node": ">=14.16" 642 | }, 643 | "funding": { 644 | "url": "https://github.com/sponsors/sindresorhus" 645 | } 646 | }, 647 | "node_modules/default-browser-id": { 648 | "version": "3.0.0", 649 | "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", 650 | "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", 651 | "dev": true, 652 | "dependencies": { 653 | "bplist-parser": "^0.2.0", 654 | "untildify": "^4.0.0" 655 | }, 656 | "engines": { 657 | "node": ">=12" 658 | }, 659 | "funding": { 660 | "url": "https://github.com/sponsors/sindresorhus" 661 | } 662 | }, 663 | "node_modules/default-browser/node_modules/execa": { 664 | "version": "7.2.0", 665 | "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", 666 | "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", 667 | "dev": true, 668 | "dependencies": { 669 | "cross-spawn": "^7.0.3", 670 | "get-stream": "^6.0.1", 671 | "human-signals": "^4.3.0", 672 | "is-stream": "^3.0.0", 673 | "merge-stream": "^2.0.0", 674 | "npm-run-path": "^5.1.0", 675 | "onetime": "^6.0.0", 676 | "signal-exit": "^3.0.7", 677 | "strip-final-newline": "^3.0.0" 678 | }, 679 | "engines": { 680 | "node": "^14.18.0 || ^16.14.0 || >=18.0.0" 681 | }, 682 | "funding": { 683 | "url": "https://github.com/sindresorhus/execa?sponsor=1" 684 | } 685 | }, 686 | "node_modules/default-browser/node_modules/get-stream": { 687 | "version": "6.0.1", 688 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", 689 | "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", 690 | "dev": true, 691 | "engines": { 692 | "node": ">=10" 693 | }, 694 | "funding": { 695 | "url": "https://github.com/sponsors/sindresorhus" 696 | } 697 | }, 698 | "node_modules/default-browser/node_modules/is-stream": { 699 | "version": "3.0.0", 700 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", 701 | "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", 702 | "dev": true, 703 | "engines": { 704 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 705 | }, 706 | "funding": { 707 | "url": "https://github.com/sponsors/sindresorhus" 708 | } 709 | }, 710 | "node_modules/default-browser/node_modules/mimic-fn": { 711 | "version": "4.0.0", 712 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", 713 | "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", 714 | "dev": true, 715 | "engines": { 716 | "node": ">=12" 717 | }, 718 | "funding": { 719 | "url": "https://github.com/sponsors/sindresorhus" 720 | } 721 | }, 722 | "node_modules/default-browser/node_modules/npm-run-path": { 723 | "version": "5.2.0", 724 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", 725 | "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", 726 | "dev": true, 727 | "dependencies": { 728 | "path-key": "^4.0.0" 729 | }, 730 | "engines": { 731 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 732 | }, 733 | "funding": { 734 | "url": "https://github.com/sponsors/sindresorhus" 735 | } 736 | }, 737 | "node_modules/default-browser/node_modules/onetime": { 738 | "version": "6.0.0", 739 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", 740 | "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", 741 | "dev": true, 742 | "dependencies": { 743 | "mimic-fn": "^4.0.0" 744 | }, 745 | "engines": { 746 | "node": ">=12" 747 | }, 748 | "funding": { 749 | "url": "https://github.com/sponsors/sindresorhus" 750 | } 751 | }, 752 | "node_modules/default-browser/node_modules/path-key": { 753 | "version": "4.0.0", 754 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", 755 | "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", 756 | "dev": true, 757 | "engines": { 758 | "node": ">=12" 759 | }, 760 | "funding": { 761 | "url": "https://github.com/sponsors/sindresorhus" 762 | } 763 | }, 764 | "node_modules/default-browser/node_modules/strip-final-newline": { 765 | "version": "3.0.0", 766 | "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", 767 | "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", 768 | "dev": true, 769 | "engines": { 770 | "node": ">=12" 771 | }, 772 | "funding": { 773 | "url": "https://github.com/sponsors/sindresorhus" 774 | } 775 | }, 776 | "node_modules/define-lazy-prop": { 777 | "version": "3.0.0", 778 | "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", 779 | "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", 780 | "dev": true, 781 | "engines": { 782 | "node": ">=12" 783 | }, 784 | "funding": { 785 | "url": "https://github.com/sponsors/sindresorhus" 786 | } 787 | }, 788 | "node_modules/detect-libc": { 789 | "version": "2.0.2", 790 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", 791 | "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", 792 | "dev": true, 793 | "engines": { 794 | "node": ">=8" 795 | } 796 | }, 797 | "node_modules/duplexify": { 798 | "version": "3.7.1", 799 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", 800 | "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", 801 | "dev": true, 802 | "dependencies": { 803 | "end-of-stream": "^1.0.0", 804 | "inherits": "^2.0.1", 805 | "readable-stream": "^2.0.0", 806 | "stream-shift": "^1.0.0" 807 | } 808 | }, 809 | "node_modules/emoji-regex": { 810 | "version": "8.0.0", 811 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 812 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 813 | "dev": true 814 | }, 815 | "node_modules/encoding": { 816 | "version": "0.1.13", 817 | "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", 818 | "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", 819 | "dev": true, 820 | "optional": true, 821 | "dependencies": { 822 | "iconv-lite": "^0.6.2" 823 | } 824 | }, 825 | "node_modules/end-of-stream": { 826 | "version": "1.4.4", 827 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 828 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 829 | "dev": true, 830 | "dependencies": { 831 | "once": "^1.4.0" 832 | } 833 | }, 834 | "node_modules/entities": { 835 | "version": "2.1.0", 836 | "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", 837 | "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", 838 | "dev": true, 839 | "funding": { 840 | "url": "https://github.com/fb55/entities?sponsor=1" 841 | } 842 | }, 843 | "node_modules/env-paths": { 844 | "version": "2.2.1", 845 | "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", 846 | "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", 847 | "dev": true, 848 | "engines": { 849 | "node": ">=6" 850 | } 851 | }, 852 | "node_modules/err-code": { 853 | "version": "2.0.3", 854 | "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", 855 | "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", 856 | "dev": true 857 | }, 858 | "node_modules/escape-string-regexp": { 859 | "version": "1.0.5", 860 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 861 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 862 | "dev": true, 863 | "engines": { 864 | "node": ">=0.8.0" 865 | } 866 | }, 867 | "node_modules/execa": { 868 | "version": "2.1.0", 869 | "resolved": "https://registry.npmjs.org/execa/-/execa-2.1.0.tgz", 870 | "integrity": "sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==", 871 | "dev": true, 872 | "dependencies": { 873 | "cross-spawn": "^7.0.0", 874 | "get-stream": "^5.0.0", 875 | "is-stream": "^2.0.0", 876 | "merge-stream": "^2.0.0", 877 | "npm-run-path": "^3.0.0", 878 | "onetime": "^5.1.0", 879 | "p-finally": "^2.0.0", 880 | "signal-exit": "^3.0.2", 881 | "strip-final-newline": "^2.0.0" 882 | }, 883 | "engines": { 884 | "node": "^8.12.0 || >=9.7.0" 885 | } 886 | }, 887 | "node_modules/expand-template": { 888 | "version": "2.0.3", 889 | "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", 890 | "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", 891 | "dev": true, 892 | "engines": { 893 | "node": ">=6" 894 | } 895 | }, 896 | "node_modules/fast-glob": { 897 | "version": "3.3.2", 898 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", 899 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 900 | "dev": true, 901 | "dependencies": { 902 | "@nodelib/fs.stat": "^2.0.2", 903 | "@nodelib/fs.walk": "^1.2.3", 904 | "glob-parent": "^5.1.2", 905 | "merge2": "^1.3.0", 906 | "micromatch": "^4.0.4" 907 | }, 908 | "engines": { 909 | "node": ">=8.6.0" 910 | } 911 | }, 912 | "node_modules/fastq": { 913 | "version": "1.16.0", 914 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", 915 | "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", 916 | "dev": true, 917 | "dependencies": { 918 | "reusify": "^1.0.4" 919 | } 920 | }, 921 | "node_modules/figgy-pudding": { 922 | "version": "3.5.2", 923 | "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", 924 | "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", 925 | "deprecated": "This module is no longer supported.", 926 | "dev": true 927 | }, 928 | "node_modules/file-uri-to-path": { 929 | "version": "1.0.0", 930 | "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", 931 | "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", 932 | "dev": true 933 | }, 934 | "node_modules/filesize": { 935 | "version": "4.2.1", 936 | "resolved": "https://registry.npmjs.org/filesize/-/filesize-4.2.1.tgz", 937 | "integrity": "sha512-bP82Hi8VRZX/TUBKfE24iiUGsB/sfm2WUrwTQyAzQrhO3V9IhcBBNBXMyzLY5orACxRyYJ3d2HeRVX+eFv4lmA==", 938 | "dev": true, 939 | "engines": { 940 | "node": ">= 0.4.0" 941 | } 942 | }, 943 | "node_modules/fill-range": { 944 | "version": "7.0.1", 945 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 946 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 947 | "dev": true, 948 | "dependencies": { 949 | "to-regex-range": "^5.0.1" 950 | }, 951 | "engines": { 952 | "node": ">=8" 953 | } 954 | }, 955 | "node_modules/flush-write-stream": { 956 | "version": "1.1.1", 957 | "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", 958 | "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", 959 | "dev": true, 960 | "dependencies": { 961 | "inherits": "^2.0.3", 962 | "readable-stream": "^2.3.6" 963 | } 964 | }, 965 | "node_modules/from2": { 966 | "version": "2.3.0", 967 | "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", 968 | "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", 969 | "dev": true, 970 | "dependencies": { 971 | "inherits": "^2.0.1", 972 | "readable-stream": "^2.0.0" 973 | } 974 | }, 975 | "node_modules/fs-constants": { 976 | "version": "1.0.0", 977 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 978 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", 979 | "dev": true 980 | }, 981 | "node_modules/fs-extra": { 982 | "version": "10.1.0", 983 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", 984 | "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", 985 | "dev": true, 986 | "dependencies": { 987 | "graceful-fs": "^4.2.0", 988 | "jsonfile": "^6.0.1", 989 | "universalify": "^2.0.0" 990 | }, 991 | "engines": { 992 | "node": ">=12" 993 | } 994 | }, 995 | "node_modules/fs-minipass": { 996 | "version": "2.1.0", 997 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", 998 | "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", 999 | "dev": true, 1000 | "dependencies": { 1001 | "minipass": "^3.0.0" 1002 | }, 1003 | "engines": { 1004 | "node": ">= 8" 1005 | } 1006 | }, 1007 | "node_modules/fs-write-stream-atomic": { 1008 | "version": "1.0.10", 1009 | "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", 1010 | "integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==", 1011 | "dev": true, 1012 | "dependencies": { 1013 | "graceful-fs": "^4.1.2", 1014 | "iferr": "^0.1.5", 1015 | "imurmurhash": "^0.1.4", 1016 | "readable-stream": "1 || 2" 1017 | } 1018 | }, 1019 | "node_modules/fs.realpath": { 1020 | "version": "1.0.0", 1021 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1022 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 1023 | "dev": true 1024 | }, 1025 | "node_modules/fuse.js": { 1026 | "version": "6.6.2", 1027 | "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-6.6.2.tgz", 1028 | "integrity": "sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==", 1029 | "dev": true, 1030 | "engines": { 1031 | "node": ">=10" 1032 | } 1033 | }, 1034 | "node_modules/get-stream": { 1035 | "version": "5.2.0", 1036 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", 1037 | "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", 1038 | "dev": true, 1039 | "dependencies": { 1040 | "pump": "^3.0.0" 1041 | }, 1042 | "engines": { 1043 | "node": ">=8" 1044 | }, 1045 | "funding": { 1046 | "url": "https://github.com/sponsors/sindresorhus" 1047 | } 1048 | }, 1049 | "node_modules/github-from-package": { 1050 | "version": "0.0.0", 1051 | "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", 1052 | "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", 1053 | "dev": true 1054 | }, 1055 | "node_modules/glob": { 1056 | "version": "7.2.3", 1057 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 1058 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 1059 | "dev": true, 1060 | "dependencies": { 1061 | "fs.realpath": "^1.0.0", 1062 | "inflight": "^1.0.4", 1063 | "inherits": "2", 1064 | "minimatch": "^3.1.1", 1065 | "once": "^1.3.0", 1066 | "path-is-absolute": "^1.0.0" 1067 | }, 1068 | "engines": { 1069 | "node": "*" 1070 | }, 1071 | "funding": { 1072 | "url": "https://github.com/sponsors/isaacs" 1073 | } 1074 | }, 1075 | "node_modules/glob-parent": { 1076 | "version": "5.1.2", 1077 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1078 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1079 | "dev": true, 1080 | "dependencies": { 1081 | "is-glob": "^4.0.1" 1082 | }, 1083 | "engines": { 1084 | "node": ">= 6" 1085 | } 1086 | }, 1087 | "node_modules/graceful-fs": { 1088 | "version": "4.2.11", 1089 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 1090 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 1091 | "dev": true 1092 | }, 1093 | "node_modules/has-flag": { 1094 | "version": "3.0.0", 1095 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1096 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 1097 | "dev": true, 1098 | "engines": { 1099 | "node": ">=4" 1100 | } 1101 | }, 1102 | "node_modules/http-cache-semantics": { 1103 | "version": "4.1.1", 1104 | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", 1105 | "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", 1106 | "dev": true 1107 | }, 1108 | "node_modules/http-proxy-agent": { 1109 | "version": "5.0.0", 1110 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", 1111 | "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", 1112 | "dev": true, 1113 | "dependencies": { 1114 | "@tootallnate/once": "2", 1115 | "agent-base": "6", 1116 | "debug": "4" 1117 | }, 1118 | "engines": { 1119 | "node": ">= 6" 1120 | } 1121 | }, 1122 | "node_modules/https-proxy-agent": { 1123 | "version": "5.0.1", 1124 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", 1125 | "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", 1126 | "dev": true, 1127 | "dependencies": { 1128 | "agent-base": "6", 1129 | "debug": "4" 1130 | }, 1131 | "engines": { 1132 | "node": ">= 6" 1133 | } 1134 | }, 1135 | "node_modules/human-signals": { 1136 | "version": "4.3.1", 1137 | "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", 1138 | "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", 1139 | "dev": true, 1140 | "engines": { 1141 | "node": ">=14.18.0" 1142 | } 1143 | }, 1144 | "node_modules/humanize-ms": { 1145 | "version": "1.2.1", 1146 | "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", 1147 | "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", 1148 | "dev": true, 1149 | "dependencies": { 1150 | "ms": "^2.0.0" 1151 | } 1152 | }, 1153 | "node_modules/iconv-lite": { 1154 | "version": "0.6.3", 1155 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 1156 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 1157 | "dev": true, 1158 | "optional": true, 1159 | "dependencies": { 1160 | "safer-buffer": ">= 2.1.2 < 3.0.0" 1161 | }, 1162 | "engines": { 1163 | "node": ">=0.10.0" 1164 | } 1165 | }, 1166 | "node_modules/ieee754": { 1167 | "version": "1.2.1", 1168 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 1169 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 1170 | "dev": true, 1171 | "funding": [ 1172 | { 1173 | "type": "github", 1174 | "url": "https://github.com/sponsors/feross" 1175 | }, 1176 | { 1177 | "type": "patreon", 1178 | "url": "https://www.patreon.com/feross" 1179 | }, 1180 | { 1181 | "type": "consulting", 1182 | "url": "https://feross.org/support" 1183 | } 1184 | ] 1185 | }, 1186 | "node_modules/iferr": { 1187 | "version": "0.1.5", 1188 | "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", 1189 | "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==", 1190 | "dev": true 1191 | }, 1192 | "node_modules/imurmurhash": { 1193 | "version": "0.1.4", 1194 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1195 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 1196 | "dev": true, 1197 | "engines": { 1198 | "node": ">=0.8.19" 1199 | } 1200 | }, 1201 | "node_modules/indent-string": { 1202 | "version": "4.0.0", 1203 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", 1204 | "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", 1205 | "dev": true, 1206 | "engines": { 1207 | "node": ">=8" 1208 | } 1209 | }, 1210 | "node_modules/infer-owner": { 1211 | "version": "1.0.4", 1212 | "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", 1213 | "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", 1214 | "dev": true 1215 | }, 1216 | "node_modules/inflight": { 1217 | "version": "1.0.6", 1218 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1219 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1220 | "dev": true, 1221 | "dependencies": { 1222 | "once": "^1.3.0", 1223 | "wrappy": "1" 1224 | } 1225 | }, 1226 | "node_modules/inherits": { 1227 | "version": "2.0.4", 1228 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1229 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1230 | "dev": true 1231 | }, 1232 | "node_modules/ini": { 1233 | "version": "1.3.8", 1234 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 1235 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", 1236 | "dev": true 1237 | }, 1238 | "node_modules/ip": { 1239 | "version": "2.0.0", 1240 | "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", 1241 | "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", 1242 | "dev": true 1243 | }, 1244 | "node_modules/is-docker": { 1245 | "version": "3.0.0", 1246 | "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", 1247 | "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", 1248 | "dev": true, 1249 | "bin": { 1250 | "is-docker": "cli.js" 1251 | }, 1252 | "engines": { 1253 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 1254 | }, 1255 | "funding": { 1256 | "url": "https://github.com/sponsors/sindresorhus" 1257 | } 1258 | }, 1259 | "node_modules/is-extglob": { 1260 | "version": "2.1.1", 1261 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1262 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1263 | "dev": true, 1264 | "engines": { 1265 | "node": ">=0.10.0" 1266 | } 1267 | }, 1268 | "node_modules/is-fullwidth-code-point": { 1269 | "version": "3.0.0", 1270 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1271 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1272 | "dev": true, 1273 | "engines": { 1274 | "node": ">=8" 1275 | } 1276 | }, 1277 | "node_modules/is-glob": { 1278 | "version": "4.0.3", 1279 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1280 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1281 | "dev": true, 1282 | "dependencies": { 1283 | "is-extglob": "^2.1.1" 1284 | }, 1285 | "engines": { 1286 | "node": ">=0.10.0" 1287 | } 1288 | }, 1289 | "node_modules/is-inside-container": { 1290 | "version": "1.0.0", 1291 | "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", 1292 | "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", 1293 | "dev": true, 1294 | "dependencies": { 1295 | "is-docker": "^3.0.0" 1296 | }, 1297 | "bin": { 1298 | "is-inside-container": "cli.js" 1299 | }, 1300 | "engines": { 1301 | "node": ">=14.16" 1302 | }, 1303 | "funding": { 1304 | "url": "https://github.com/sponsors/sindresorhus" 1305 | } 1306 | }, 1307 | "node_modules/is-lambda": { 1308 | "version": "1.0.1", 1309 | "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", 1310 | "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", 1311 | "dev": true 1312 | }, 1313 | "node_modules/is-number": { 1314 | "version": "7.0.0", 1315 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1316 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1317 | "dev": true, 1318 | "engines": { 1319 | "node": ">=0.12.0" 1320 | } 1321 | }, 1322 | "node_modules/is-plain-obj": { 1323 | "version": "2.1.0", 1324 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 1325 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 1326 | "dev": true, 1327 | "engines": { 1328 | "node": ">=8" 1329 | } 1330 | }, 1331 | "node_modules/is-stream": { 1332 | "version": "2.0.1", 1333 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", 1334 | "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", 1335 | "dev": true, 1336 | "engines": { 1337 | "node": ">=8" 1338 | }, 1339 | "funding": { 1340 | "url": "https://github.com/sponsors/sindresorhus" 1341 | } 1342 | }, 1343 | "node_modules/is-wsl": { 1344 | "version": "2.2.0", 1345 | "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", 1346 | "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", 1347 | "dev": true, 1348 | "dependencies": { 1349 | "is-docker": "^2.0.0" 1350 | }, 1351 | "engines": { 1352 | "node": ">=8" 1353 | } 1354 | }, 1355 | "node_modules/is-wsl/node_modules/is-docker": { 1356 | "version": "2.2.1", 1357 | "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", 1358 | "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", 1359 | "dev": true, 1360 | "bin": { 1361 | "is-docker": "cli.js" 1362 | }, 1363 | "engines": { 1364 | "node": ">=8" 1365 | }, 1366 | "funding": { 1367 | "url": "https://github.com/sponsors/sindresorhus" 1368 | } 1369 | }, 1370 | "node_modules/isarray": { 1371 | "version": "1.0.0", 1372 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1373 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", 1374 | "dev": true 1375 | }, 1376 | "node_modules/isexe": { 1377 | "version": "2.0.0", 1378 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1379 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1380 | "dev": true 1381 | }, 1382 | "node_modules/jsonfile": { 1383 | "version": "6.1.0", 1384 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", 1385 | "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", 1386 | "dev": true, 1387 | "dependencies": { 1388 | "universalify": "^2.0.0" 1389 | }, 1390 | "optionalDependencies": { 1391 | "graceful-fs": "^4.1.6" 1392 | } 1393 | }, 1394 | "node_modules/linkify-it": { 1395 | "version": "3.0.3", 1396 | "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", 1397 | "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", 1398 | "dev": true, 1399 | "dependencies": { 1400 | "uc.micro": "^1.0.1" 1401 | } 1402 | }, 1403 | "node_modules/log-symbols": { 1404 | "version": "3.0.0", 1405 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", 1406 | "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", 1407 | "dev": true, 1408 | "dependencies": { 1409 | "chalk": "^2.4.2" 1410 | }, 1411 | "engines": { 1412 | "node": ">=8" 1413 | } 1414 | }, 1415 | "node_modules/log-update": { 1416 | "version": "4.0.0", 1417 | "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", 1418 | "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", 1419 | "dev": true, 1420 | "dependencies": { 1421 | "ansi-escapes": "^4.3.0", 1422 | "cli-cursor": "^3.1.0", 1423 | "slice-ansi": "^4.0.0", 1424 | "wrap-ansi": "^6.2.0" 1425 | }, 1426 | "engines": { 1427 | "node": ">=10" 1428 | }, 1429 | "funding": { 1430 | "url": "https://github.com/sponsors/sindresorhus" 1431 | } 1432 | }, 1433 | "node_modules/lru-cache": { 1434 | "version": "5.1.1", 1435 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 1436 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 1437 | "dev": true, 1438 | "dependencies": { 1439 | "yallist": "^3.0.2" 1440 | } 1441 | }, 1442 | "node_modules/make-fetch-happen": { 1443 | "version": "10.2.1", 1444 | "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", 1445 | "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", 1446 | "dev": true, 1447 | "dependencies": { 1448 | "agentkeepalive": "^4.2.1", 1449 | "cacache": "^16.1.0", 1450 | "http-cache-semantics": "^4.1.0", 1451 | "http-proxy-agent": "^5.0.0", 1452 | "https-proxy-agent": "^5.0.0", 1453 | "is-lambda": "^1.0.1", 1454 | "lru-cache": "^7.7.1", 1455 | "minipass": "^3.1.6", 1456 | "minipass-collect": "^1.0.2", 1457 | "minipass-fetch": "^2.0.3", 1458 | "minipass-flush": "^1.0.5", 1459 | "minipass-pipeline": "^1.2.4", 1460 | "negotiator": "^0.6.3", 1461 | "promise-retry": "^2.0.1", 1462 | "socks-proxy-agent": "^7.0.0", 1463 | "ssri": "^9.0.0" 1464 | }, 1465 | "engines": { 1466 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 1467 | } 1468 | }, 1469 | "node_modules/make-fetch-happen/node_modules/brace-expansion": { 1470 | "version": "2.0.1", 1471 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 1472 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1473 | "dev": true, 1474 | "dependencies": { 1475 | "balanced-match": "^1.0.0" 1476 | } 1477 | }, 1478 | "node_modules/make-fetch-happen/node_modules/cacache": { 1479 | "version": "16.1.3", 1480 | "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", 1481 | "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", 1482 | "dev": true, 1483 | "dependencies": { 1484 | "@npmcli/fs": "^2.1.0", 1485 | "@npmcli/move-file": "^2.0.0", 1486 | "chownr": "^2.0.0", 1487 | "fs-minipass": "^2.1.0", 1488 | "glob": "^8.0.1", 1489 | "infer-owner": "^1.0.4", 1490 | "lru-cache": "^7.7.1", 1491 | "minipass": "^3.1.6", 1492 | "minipass-collect": "^1.0.2", 1493 | "minipass-flush": "^1.0.5", 1494 | "minipass-pipeline": "^1.2.4", 1495 | "mkdirp": "^1.0.4", 1496 | "p-map": "^4.0.0", 1497 | "promise-inflight": "^1.0.1", 1498 | "rimraf": "^3.0.2", 1499 | "ssri": "^9.0.0", 1500 | "tar": "^6.1.11", 1501 | "unique-filename": "^2.0.0" 1502 | }, 1503 | "engines": { 1504 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 1505 | } 1506 | }, 1507 | "node_modules/make-fetch-happen/node_modules/chownr": { 1508 | "version": "2.0.0", 1509 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", 1510 | "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", 1511 | "dev": true, 1512 | "engines": { 1513 | "node": ">=10" 1514 | } 1515 | }, 1516 | "node_modules/make-fetch-happen/node_modules/glob": { 1517 | "version": "8.1.0", 1518 | "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", 1519 | "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", 1520 | "dev": true, 1521 | "dependencies": { 1522 | "fs.realpath": "^1.0.0", 1523 | "inflight": "^1.0.4", 1524 | "inherits": "2", 1525 | "minimatch": "^5.0.1", 1526 | "once": "^1.3.0" 1527 | }, 1528 | "engines": { 1529 | "node": ">=12" 1530 | }, 1531 | "funding": { 1532 | "url": "https://github.com/sponsors/isaacs" 1533 | } 1534 | }, 1535 | "node_modules/make-fetch-happen/node_modules/lru-cache": { 1536 | "version": "7.18.3", 1537 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", 1538 | "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", 1539 | "dev": true, 1540 | "engines": { 1541 | "node": ">=12" 1542 | } 1543 | }, 1544 | "node_modules/make-fetch-happen/node_modules/minimatch": { 1545 | "version": "5.1.6", 1546 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", 1547 | "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", 1548 | "dev": true, 1549 | "dependencies": { 1550 | "brace-expansion": "^2.0.1" 1551 | }, 1552 | "engines": { 1553 | "node": ">=10" 1554 | } 1555 | }, 1556 | "node_modules/make-fetch-happen/node_modules/mkdirp": { 1557 | "version": "1.0.4", 1558 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 1559 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", 1560 | "dev": true, 1561 | "bin": { 1562 | "mkdirp": "bin/cmd.js" 1563 | }, 1564 | "engines": { 1565 | "node": ">=10" 1566 | } 1567 | }, 1568 | "node_modules/make-fetch-happen/node_modules/rimraf": { 1569 | "version": "3.0.2", 1570 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1571 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1572 | "dev": true, 1573 | "dependencies": { 1574 | "glob": "^7.1.3" 1575 | }, 1576 | "bin": { 1577 | "rimraf": "bin.js" 1578 | }, 1579 | "funding": { 1580 | "url": "https://github.com/sponsors/isaacs" 1581 | } 1582 | }, 1583 | "node_modules/make-fetch-happen/node_modules/rimraf/node_modules/brace-expansion": { 1584 | "version": "1.1.11", 1585 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1586 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1587 | "dev": true, 1588 | "dependencies": { 1589 | "balanced-match": "^1.0.0", 1590 | "concat-map": "0.0.1" 1591 | } 1592 | }, 1593 | "node_modules/make-fetch-happen/node_modules/rimraf/node_modules/glob": { 1594 | "version": "7.2.3", 1595 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 1596 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 1597 | "dev": true, 1598 | "dependencies": { 1599 | "fs.realpath": "^1.0.0", 1600 | "inflight": "^1.0.4", 1601 | "inherits": "2", 1602 | "minimatch": "^3.1.1", 1603 | "once": "^1.3.0", 1604 | "path-is-absolute": "^1.0.0" 1605 | }, 1606 | "engines": { 1607 | "node": "*" 1608 | }, 1609 | "funding": { 1610 | "url": "https://github.com/sponsors/isaacs" 1611 | } 1612 | }, 1613 | "node_modules/make-fetch-happen/node_modules/rimraf/node_modules/minimatch": { 1614 | "version": "3.1.2", 1615 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1616 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1617 | "dev": true, 1618 | "dependencies": { 1619 | "brace-expansion": "^1.1.7" 1620 | }, 1621 | "engines": { 1622 | "node": "*" 1623 | } 1624 | }, 1625 | "node_modules/make-fetch-happen/node_modules/ssri": { 1626 | "version": "9.0.1", 1627 | "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", 1628 | "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", 1629 | "dev": true, 1630 | "dependencies": { 1631 | "minipass": "^3.1.1" 1632 | }, 1633 | "engines": { 1634 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 1635 | } 1636 | }, 1637 | "node_modules/make-fetch-happen/node_modules/unique-filename": { 1638 | "version": "2.0.1", 1639 | "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", 1640 | "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", 1641 | "dev": true, 1642 | "dependencies": { 1643 | "unique-slug": "^3.0.0" 1644 | }, 1645 | "engines": { 1646 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 1647 | } 1648 | }, 1649 | "node_modules/make-fetch-happen/node_modules/unique-slug": { 1650 | "version": "3.0.0", 1651 | "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", 1652 | "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", 1653 | "dev": true, 1654 | "dependencies": { 1655 | "imurmurhash": "^0.1.4" 1656 | }, 1657 | "engines": { 1658 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 1659 | } 1660 | }, 1661 | "node_modules/markdown-it": { 1662 | "version": "12.3.2", 1663 | "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", 1664 | "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", 1665 | "dev": true, 1666 | "dependencies": { 1667 | "argparse": "^2.0.1", 1668 | "entities": "~2.1.0", 1669 | "linkify-it": "^3.0.1", 1670 | "mdurl": "^1.0.1", 1671 | "uc.micro": "^1.0.5" 1672 | }, 1673 | "bin": { 1674 | "markdown-it": "bin/markdown-it.js" 1675 | } 1676 | }, 1677 | "node_modules/mdurl": { 1678 | "version": "1.0.1", 1679 | "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", 1680 | "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", 1681 | "dev": true 1682 | }, 1683 | "node_modules/merge-stream": { 1684 | "version": "2.0.0", 1685 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 1686 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", 1687 | "dev": true 1688 | }, 1689 | "node_modules/merge2": { 1690 | "version": "1.4.1", 1691 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 1692 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 1693 | "dev": true, 1694 | "engines": { 1695 | "node": ">= 8" 1696 | } 1697 | }, 1698 | "node_modules/micromatch": { 1699 | "version": "4.0.5", 1700 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 1701 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 1702 | "dev": true, 1703 | "dependencies": { 1704 | "braces": "^3.0.2", 1705 | "picomatch": "^2.3.1" 1706 | }, 1707 | "engines": { 1708 | "node": ">=8.6" 1709 | } 1710 | }, 1711 | "node_modules/mimic-fn": { 1712 | "version": "2.1.0", 1713 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 1714 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 1715 | "dev": true, 1716 | "engines": { 1717 | "node": ">=6" 1718 | } 1719 | }, 1720 | "node_modules/mimic-response": { 1721 | "version": "3.1.0", 1722 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", 1723 | "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", 1724 | "dev": true, 1725 | "engines": { 1726 | "node": ">=10" 1727 | }, 1728 | "funding": { 1729 | "url": "https://github.com/sponsors/sindresorhus" 1730 | } 1731 | }, 1732 | "node_modules/minimatch": { 1733 | "version": "3.1.2", 1734 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1735 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1736 | "dev": true, 1737 | "dependencies": { 1738 | "brace-expansion": "^1.1.7" 1739 | }, 1740 | "engines": { 1741 | "node": "*" 1742 | } 1743 | }, 1744 | "node_modules/minimist": { 1745 | "version": "1.2.8", 1746 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 1747 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 1748 | "dev": true, 1749 | "funding": { 1750 | "url": "https://github.com/sponsors/ljharb" 1751 | } 1752 | }, 1753 | "node_modules/minipass": { 1754 | "version": "3.3.6", 1755 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", 1756 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", 1757 | "dev": true, 1758 | "dependencies": { 1759 | "yallist": "^4.0.0" 1760 | }, 1761 | "engines": { 1762 | "node": ">=8" 1763 | } 1764 | }, 1765 | "node_modules/minipass-collect": { 1766 | "version": "1.0.2", 1767 | "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", 1768 | "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", 1769 | "dev": true, 1770 | "dependencies": { 1771 | "minipass": "^3.0.0" 1772 | }, 1773 | "engines": { 1774 | "node": ">= 8" 1775 | } 1776 | }, 1777 | "node_modules/minipass-fetch": { 1778 | "version": "2.1.2", 1779 | "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", 1780 | "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", 1781 | "dev": true, 1782 | "dependencies": { 1783 | "minipass": "^3.1.6", 1784 | "minipass-sized": "^1.0.3", 1785 | "minizlib": "^2.1.2" 1786 | }, 1787 | "engines": { 1788 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 1789 | }, 1790 | "optionalDependencies": { 1791 | "encoding": "^0.1.13" 1792 | } 1793 | }, 1794 | "node_modules/minipass-flush": { 1795 | "version": "1.0.5", 1796 | "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", 1797 | "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", 1798 | "dev": true, 1799 | "dependencies": { 1800 | "minipass": "^3.0.0" 1801 | }, 1802 | "engines": { 1803 | "node": ">= 8" 1804 | } 1805 | }, 1806 | "node_modules/minipass-pipeline": { 1807 | "version": "1.2.4", 1808 | "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", 1809 | "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", 1810 | "dev": true, 1811 | "dependencies": { 1812 | "minipass": "^3.0.0" 1813 | }, 1814 | "engines": { 1815 | "node": ">=8" 1816 | } 1817 | }, 1818 | "node_modules/minipass-sized": { 1819 | "version": "1.0.3", 1820 | "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", 1821 | "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", 1822 | "dev": true, 1823 | "dependencies": { 1824 | "minipass": "^3.0.0" 1825 | }, 1826 | "engines": { 1827 | "node": ">=8" 1828 | } 1829 | }, 1830 | "node_modules/minipass/node_modules/yallist": { 1831 | "version": "4.0.0", 1832 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1833 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 1834 | "dev": true 1835 | }, 1836 | "node_modules/minizlib": { 1837 | "version": "2.1.2", 1838 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", 1839 | "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", 1840 | "dev": true, 1841 | "dependencies": { 1842 | "minipass": "^3.0.0", 1843 | "yallist": "^4.0.0" 1844 | }, 1845 | "engines": { 1846 | "node": ">= 8" 1847 | } 1848 | }, 1849 | "node_modules/minizlib/node_modules/yallist": { 1850 | "version": "4.0.0", 1851 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1852 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 1853 | "dev": true 1854 | }, 1855 | "node_modules/mississippi": { 1856 | "version": "3.0.0", 1857 | "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", 1858 | "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", 1859 | "dev": true, 1860 | "dependencies": { 1861 | "concat-stream": "^1.5.0", 1862 | "duplexify": "^3.4.2", 1863 | "end-of-stream": "^1.1.0", 1864 | "flush-write-stream": "^1.0.0", 1865 | "from2": "^2.1.0", 1866 | "parallel-transform": "^1.1.0", 1867 | "pump": "^3.0.0", 1868 | "pumpify": "^1.3.3", 1869 | "stream-each": "^1.1.0", 1870 | "through2": "^2.0.0" 1871 | }, 1872 | "engines": { 1873 | "node": ">=4.0.0" 1874 | } 1875 | }, 1876 | "node_modules/mkdirp": { 1877 | "version": "0.5.6", 1878 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", 1879 | "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", 1880 | "dev": true, 1881 | "dependencies": { 1882 | "minimist": "^1.2.6" 1883 | }, 1884 | "bin": { 1885 | "mkdirp": "bin/cmd.js" 1886 | } 1887 | }, 1888 | "node_modules/mkdirp-classic": { 1889 | "version": "0.5.3", 1890 | "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", 1891 | "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", 1892 | "dev": true 1893 | }, 1894 | "node_modules/move-concurrently": { 1895 | "version": "1.0.1", 1896 | "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", 1897 | "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==", 1898 | "dev": true, 1899 | "dependencies": { 1900 | "aproba": "^1.1.1", 1901 | "copy-concurrently": "^1.0.0", 1902 | "fs-write-stream-atomic": "^1.0.8", 1903 | "mkdirp": "^0.5.1", 1904 | "rimraf": "^2.5.4", 1905 | "run-queue": "^1.0.3" 1906 | } 1907 | }, 1908 | "node_modules/ms": { 1909 | "version": "2.1.3", 1910 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1911 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1912 | "dev": true 1913 | }, 1914 | "node_modules/nan": { 1915 | "version": "2.18.0", 1916 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", 1917 | "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==", 1918 | "dev": true, 1919 | "optional": true 1920 | }, 1921 | "node_modules/napi-build-utils": { 1922 | "version": "1.0.2", 1923 | "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", 1924 | "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", 1925 | "dev": true 1926 | }, 1927 | "node_modules/negotiator": { 1928 | "version": "0.6.3", 1929 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 1930 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 1931 | "dev": true, 1932 | "engines": { 1933 | "node": ">= 0.6" 1934 | } 1935 | }, 1936 | "node_modules/node-abi": { 1937 | "version": "3.54.0", 1938 | "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.54.0.tgz", 1939 | "integrity": "sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA==", 1940 | "dev": true, 1941 | "dependencies": { 1942 | "semver": "^7.3.5" 1943 | }, 1944 | "engines": { 1945 | "node": ">=10" 1946 | } 1947 | }, 1948 | "node_modules/npm-run-path": { 1949 | "version": "3.1.0", 1950 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz", 1951 | "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==", 1952 | "dev": true, 1953 | "dependencies": { 1954 | "path-key": "^3.0.0" 1955 | }, 1956 | "engines": { 1957 | "node": ">=8" 1958 | } 1959 | }, 1960 | "node_modules/once": { 1961 | "version": "1.4.0", 1962 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1963 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1964 | "dev": true, 1965 | "dependencies": { 1966 | "wrappy": "1" 1967 | } 1968 | }, 1969 | "node_modules/onetime": { 1970 | "version": "5.1.2", 1971 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 1972 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 1973 | "dev": true, 1974 | "dependencies": { 1975 | "mimic-fn": "^2.1.0" 1976 | }, 1977 | "engines": { 1978 | "node": ">=6" 1979 | }, 1980 | "funding": { 1981 | "url": "https://github.com/sponsors/sindresorhus" 1982 | } 1983 | }, 1984 | "node_modules/open": { 1985 | "version": "9.1.0", 1986 | "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", 1987 | "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", 1988 | "dev": true, 1989 | "dependencies": { 1990 | "default-browser": "^4.0.0", 1991 | "define-lazy-prop": "^3.0.0", 1992 | "is-inside-container": "^1.0.0", 1993 | "is-wsl": "^2.2.0" 1994 | }, 1995 | "engines": { 1996 | "node": ">=14.16" 1997 | }, 1998 | "funding": { 1999 | "url": "https://github.com/sponsors/sindresorhus" 2000 | } 2001 | }, 2002 | "node_modules/p-finally": { 2003 | "version": "2.0.1", 2004 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", 2005 | "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", 2006 | "dev": true, 2007 | "engines": { 2008 | "node": ">=8" 2009 | } 2010 | }, 2011 | "node_modules/p-map": { 2012 | "version": "4.0.0", 2013 | "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", 2014 | "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", 2015 | "dev": true, 2016 | "dependencies": { 2017 | "aggregate-error": "^3.0.0" 2018 | }, 2019 | "engines": { 2020 | "node": ">=10" 2021 | }, 2022 | "funding": { 2023 | "url": "https://github.com/sponsors/sindresorhus" 2024 | } 2025 | }, 2026 | "node_modules/parallel-transform": { 2027 | "version": "1.2.0", 2028 | "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", 2029 | "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", 2030 | "dev": true, 2031 | "dependencies": { 2032 | "cyclist": "^1.0.1", 2033 | "inherits": "^2.0.3", 2034 | "readable-stream": "^2.1.5" 2035 | } 2036 | }, 2037 | "node_modules/path-is-absolute": { 2038 | "version": "1.0.1", 2039 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2040 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 2041 | "dev": true, 2042 | "engines": { 2043 | "node": ">=0.10.0" 2044 | } 2045 | }, 2046 | "node_modules/path-key": { 2047 | "version": "3.1.1", 2048 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2049 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2050 | "dev": true, 2051 | "engines": { 2052 | "node": ">=8" 2053 | } 2054 | }, 2055 | "node_modules/picomatch": { 2056 | "version": "2.3.1", 2057 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2058 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2059 | "dev": true, 2060 | "engines": { 2061 | "node": ">=8.6" 2062 | }, 2063 | "funding": { 2064 | "url": "https://github.com/sponsors/jonschlinkert" 2065 | } 2066 | }, 2067 | "node_modules/prebuild-install": { 2068 | "version": "7.1.1", 2069 | "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", 2070 | "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", 2071 | "dev": true, 2072 | "dependencies": { 2073 | "detect-libc": "^2.0.0", 2074 | "expand-template": "^2.0.3", 2075 | "github-from-package": "0.0.0", 2076 | "minimist": "^1.2.3", 2077 | "mkdirp-classic": "^0.5.3", 2078 | "napi-build-utils": "^1.0.1", 2079 | "node-abi": "^3.3.0", 2080 | "pump": "^3.0.0", 2081 | "rc": "^1.2.7", 2082 | "simple-get": "^4.0.0", 2083 | "tar-fs": "^2.0.0", 2084 | "tunnel-agent": "^0.6.0" 2085 | }, 2086 | "bin": { 2087 | "prebuild-install": "bin.js" 2088 | }, 2089 | "engines": { 2090 | "node": ">=10" 2091 | } 2092 | }, 2093 | "node_modules/process-nextick-args": { 2094 | "version": "2.0.1", 2095 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 2096 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", 2097 | "dev": true 2098 | }, 2099 | "node_modules/promise-inflight": { 2100 | "version": "1.0.1", 2101 | "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", 2102 | "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", 2103 | "dev": true 2104 | }, 2105 | "node_modules/promise-retry": { 2106 | "version": "2.0.1", 2107 | "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", 2108 | "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", 2109 | "dev": true, 2110 | "dependencies": { 2111 | "err-code": "^2.0.2", 2112 | "retry": "^0.12.0" 2113 | }, 2114 | "engines": { 2115 | "node": ">=10" 2116 | } 2117 | }, 2118 | "node_modules/pump": { 2119 | "version": "3.0.0", 2120 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 2121 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 2122 | "dev": true, 2123 | "dependencies": { 2124 | "end-of-stream": "^1.1.0", 2125 | "once": "^1.3.1" 2126 | } 2127 | }, 2128 | "node_modules/pumpify": { 2129 | "version": "1.5.1", 2130 | "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", 2131 | "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", 2132 | "dev": true, 2133 | "dependencies": { 2134 | "duplexify": "^3.6.0", 2135 | "inherits": "^2.0.3", 2136 | "pump": "^2.0.0" 2137 | } 2138 | }, 2139 | "node_modules/pumpify/node_modules/pump": { 2140 | "version": "2.0.1", 2141 | "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", 2142 | "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", 2143 | "dev": true, 2144 | "dependencies": { 2145 | "end-of-stream": "^1.1.0", 2146 | "once": "^1.3.1" 2147 | } 2148 | }, 2149 | "node_modules/punycode": { 2150 | "version": "2.3.1", 2151 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 2152 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 2153 | "dev": true, 2154 | "engines": { 2155 | "node": ">=6" 2156 | } 2157 | }, 2158 | "node_modules/purescript": { 2159 | "version": "0.15.14", 2160 | "resolved": "https://registry.npmjs.org/purescript/-/purescript-0.15.14.tgz", 2161 | "integrity": "sha512-OSxUKmTsvBuxcrEaPkLjUfMgPbqFepIGfgru/Ppr42JEpVY9OLftFPQiqnlnIMljnIfkFCeYlBMWjIsu4k62/g==", 2162 | "dev": true, 2163 | "hasInstallScript": true, 2164 | "dependencies": { 2165 | "purescript-installer": "^0.3.5" 2166 | }, 2167 | "bin": { 2168 | "purs": "purs.bin" 2169 | } 2170 | }, 2171 | "node_modules/purescript-installer": { 2172 | "version": "0.3.5", 2173 | "resolved": "https://registry.npmjs.org/purescript-installer/-/purescript-installer-0.3.5.tgz", 2174 | "integrity": "sha512-w04BBvW4BSQlspLsZ9Bs5vtUBZqvC4bC+FizC5GUp2/rpmYvXJ0CTf79Q3MKo2A8p1ZjqbhCI+SqdTQ30UZUIQ==", 2175 | "dev": true, 2176 | "dependencies": { 2177 | "byline": "^5.0.0", 2178 | "cacache": "^11.3.2", 2179 | "chalk": "^2.4.2", 2180 | "env-paths": "^2.2.0", 2181 | "execa": "^2.0.3", 2182 | "filesize": "^4.1.2", 2183 | "is-plain-obj": "^2.0.0", 2184 | "log-symbols": "^3.0.0", 2185 | "log-update": "^4.0.0", 2186 | "make-fetch-happen": "^10.0.0", 2187 | "minimist": "^1.2.0", 2188 | "ms": "^2.1.2", 2189 | "once": "^1.4.0", 2190 | "rimraf": "^2.6.3", 2191 | "semver": "^7.3.7", 2192 | "tar": "^6.1.11", 2193 | "which": "^1.3.1", 2194 | "zen-observable": "^0.8.14" 2195 | }, 2196 | "bin": { 2197 | "install-purescript": "index.js" 2198 | }, 2199 | "engines": { 2200 | "node": ">=12" 2201 | } 2202 | }, 2203 | "node_modules/queue-microtask": { 2204 | "version": "1.2.3", 2205 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 2206 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 2207 | "dev": true, 2208 | "funding": [ 2209 | { 2210 | "type": "github", 2211 | "url": "https://github.com/sponsors/feross" 2212 | }, 2213 | { 2214 | "type": "patreon", 2215 | "url": "https://www.patreon.com/feross" 2216 | }, 2217 | { 2218 | "type": "consulting", 2219 | "url": "https://feross.org/support" 2220 | } 2221 | ] 2222 | }, 2223 | "node_modules/rc": { 2224 | "version": "1.2.8", 2225 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 2226 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 2227 | "dev": true, 2228 | "dependencies": { 2229 | "deep-extend": "^0.6.0", 2230 | "ini": "~1.3.0", 2231 | "minimist": "^1.2.0", 2232 | "strip-json-comments": "~2.0.1" 2233 | }, 2234 | "bin": { 2235 | "rc": "cli.js" 2236 | } 2237 | }, 2238 | "node_modules/readable-stream": { 2239 | "version": "2.3.8", 2240 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", 2241 | "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", 2242 | "dev": true, 2243 | "dependencies": { 2244 | "core-util-is": "~1.0.0", 2245 | "inherits": "~2.0.3", 2246 | "isarray": "~1.0.0", 2247 | "process-nextick-args": "~2.0.0", 2248 | "safe-buffer": "~5.1.1", 2249 | "string_decoder": "~1.1.1", 2250 | "util-deprecate": "~1.0.1" 2251 | } 2252 | }, 2253 | "node_modules/restore-cursor": { 2254 | "version": "3.1.0", 2255 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", 2256 | "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", 2257 | "dev": true, 2258 | "dependencies": { 2259 | "onetime": "^5.1.0", 2260 | "signal-exit": "^3.0.2" 2261 | }, 2262 | "engines": { 2263 | "node": ">=8" 2264 | } 2265 | }, 2266 | "node_modules/retry": { 2267 | "version": "0.12.0", 2268 | "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", 2269 | "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", 2270 | "dev": true, 2271 | "engines": { 2272 | "node": ">= 4" 2273 | } 2274 | }, 2275 | "node_modules/reusify": { 2276 | "version": "1.0.4", 2277 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 2278 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 2279 | "dev": true, 2280 | "engines": { 2281 | "iojs": ">=1.0.0", 2282 | "node": ">=0.10.0" 2283 | } 2284 | }, 2285 | "node_modules/rimraf": { 2286 | "version": "2.7.1", 2287 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", 2288 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 2289 | "dev": true, 2290 | "dependencies": { 2291 | "glob": "^7.1.3" 2292 | }, 2293 | "bin": { 2294 | "rimraf": "bin.js" 2295 | } 2296 | }, 2297 | "node_modules/run-applescript": { 2298 | "version": "5.0.0", 2299 | "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", 2300 | "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", 2301 | "dev": true, 2302 | "dependencies": { 2303 | "execa": "^5.0.0" 2304 | }, 2305 | "engines": { 2306 | "node": ">=12" 2307 | }, 2308 | "funding": { 2309 | "url": "https://github.com/sponsors/sindresorhus" 2310 | } 2311 | }, 2312 | "node_modules/run-applescript/node_modules/execa": { 2313 | "version": "5.1.1", 2314 | "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", 2315 | "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", 2316 | "dev": true, 2317 | "dependencies": { 2318 | "cross-spawn": "^7.0.3", 2319 | "get-stream": "^6.0.0", 2320 | "human-signals": "^2.1.0", 2321 | "is-stream": "^2.0.0", 2322 | "merge-stream": "^2.0.0", 2323 | "npm-run-path": "^4.0.1", 2324 | "onetime": "^5.1.2", 2325 | "signal-exit": "^3.0.3", 2326 | "strip-final-newline": "^2.0.0" 2327 | }, 2328 | "engines": { 2329 | "node": ">=10" 2330 | }, 2331 | "funding": { 2332 | "url": "https://github.com/sindresorhus/execa?sponsor=1" 2333 | } 2334 | }, 2335 | "node_modules/run-applescript/node_modules/get-stream": { 2336 | "version": "6.0.1", 2337 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", 2338 | "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", 2339 | "dev": true, 2340 | "engines": { 2341 | "node": ">=10" 2342 | }, 2343 | "funding": { 2344 | "url": "https://github.com/sponsors/sindresorhus" 2345 | } 2346 | }, 2347 | "node_modules/run-applescript/node_modules/human-signals": { 2348 | "version": "2.1.0", 2349 | "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", 2350 | "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", 2351 | "dev": true, 2352 | "engines": { 2353 | "node": ">=10.17.0" 2354 | } 2355 | }, 2356 | "node_modules/run-applescript/node_modules/npm-run-path": { 2357 | "version": "4.0.1", 2358 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", 2359 | "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", 2360 | "dev": true, 2361 | "dependencies": { 2362 | "path-key": "^3.0.0" 2363 | }, 2364 | "engines": { 2365 | "node": ">=8" 2366 | } 2367 | }, 2368 | "node_modules/run-parallel": { 2369 | "version": "1.2.0", 2370 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 2371 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 2372 | "dev": true, 2373 | "funding": [ 2374 | { 2375 | "type": "github", 2376 | "url": "https://github.com/sponsors/feross" 2377 | }, 2378 | { 2379 | "type": "patreon", 2380 | "url": "https://www.patreon.com/feross" 2381 | }, 2382 | { 2383 | "type": "consulting", 2384 | "url": "https://feross.org/support" 2385 | } 2386 | ], 2387 | "dependencies": { 2388 | "queue-microtask": "^1.2.2" 2389 | } 2390 | }, 2391 | "node_modules/run-queue": { 2392 | "version": "1.0.3", 2393 | "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", 2394 | "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==", 2395 | "dev": true, 2396 | "dependencies": { 2397 | "aproba": "^1.1.1" 2398 | } 2399 | }, 2400 | "node_modules/safe-buffer": { 2401 | "version": "5.1.2", 2402 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2403 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 2404 | "dev": true 2405 | }, 2406 | "node_modules/safer-buffer": { 2407 | "version": "2.1.2", 2408 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2409 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 2410 | "dev": true 2411 | }, 2412 | "node_modules/semver": { 2413 | "version": "7.5.4", 2414 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", 2415 | "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", 2416 | "dev": true, 2417 | "dependencies": { 2418 | "lru-cache": "^6.0.0" 2419 | }, 2420 | "bin": { 2421 | "semver": "bin/semver.js" 2422 | }, 2423 | "engines": { 2424 | "node": ">=10" 2425 | } 2426 | }, 2427 | "node_modules/semver/node_modules/lru-cache": { 2428 | "version": "6.0.0", 2429 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 2430 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 2431 | "dev": true, 2432 | "dependencies": { 2433 | "yallist": "^4.0.0" 2434 | }, 2435 | "engines": { 2436 | "node": ">=10" 2437 | } 2438 | }, 2439 | "node_modules/semver/node_modules/yallist": { 2440 | "version": "4.0.0", 2441 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 2442 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 2443 | "dev": true 2444 | }, 2445 | "node_modules/shebang-command": { 2446 | "version": "2.0.0", 2447 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2448 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2449 | "dev": true, 2450 | "dependencies": { 2451 | "shebang-regex": "^3.0.0" 2452 | }, 2453 | "engines": { 2454 | "node": ">=8" 2455 | } 2456 | }, 2457 | "node_modules/shebang-regex": { 2458 | "version": "3.0.0", 2459 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2460 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2461 | "dev": true, 2462 | "engines": { 2463 | "node": ">=8" 2464 | } 2465 | }, 2466 | "node_modules/signal-exit": { 2467 | "version": "3.0.7", 2468 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 2469 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 2470 | "dev": true 2471 | }, 2472 | "node_modules/simple-concat": { 2473 | "version": "1.0.1", 2474 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", 2475 | "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", 2476 | "dev": true, 2477 | "funding": [ 2478 | { 2479 | "type": "github", 2480 | "url": "https://github.com/sponsors/feross" 2481 | }, 2482 | { 2483 | "type": "patreon", 2484 | "url": "https://www.patreon.com/feross" 2485 | }, 2486 | { 2487 | "type": "consulting", 2488 | "url": "https://feross.org/support" 2489 | } 2490 | ] 2491 | }, 2492 | "node_modules/simple-get": { 2493 | "version": "4.0.1", 2494 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", 2495 | "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", 2496 | "dev": true, 2497 | "funding": [ 2498 | { 2499 | "type": "github", 2500 | "url": "https://github.com/sponsors/feross" 2501 | }, 2502 | { 2503 | "type": "patreon", 2504 | "url": "https://www.patreon.com/feross" 2505 | }, 2506 | { 2507 | "type": "consulting", 2508 | "url": "https://feross.org/support" 2509 | } 2510 | ], 2511 | "dependencies": { 2512 | "decompress-response": "^6.0.0", 2513 | "once": "^1.3.1", 2514 | "simple-concat": "^1.0.0" 2515 | } 2516 | }, 2517 | "node_modules/slice-ansi": { 2518 | "version": "4.0.0", 2519 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", 2520 | "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", 2521 | "dev": true, 2522 | "dependencies": { 2523 | "ansi-styles": "^4.0.0", 2524 | "astral-regex": "^2.0.0", 2525 | "is-fullwidth-code-point": "^3.0.0" 2526 | }, 2527 | "engines": { 2528 | "node": ">=10" 2529 | }, 2530 | "funding": { 2531 | "url": "https://github.com/chalk/slice-ansi?sponsor=1" 2532 | } 2533 | }, 2534 | "node_modules/slice-ansi/node_modules/ansi-styles": { 2535 | "version": "4.3.0", 2536 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 2537 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 2538 | "dev": true, 2539 | "dependencies": { 2540 | "color-convert": "^2.0.1" 2541 | }, 2542 | "engines": { 2543 | "node": ">=8" 2544 | }, 2545 | "funding": { 2546 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 2547 | } 2548 | }, 2549 | "node_modules/slice-ansi/node_modules/color-convert": { 2550 | "version": "2.0.1", 2551 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 2552 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 2553 | "dev": true, 2554 | "dependencies": { 2555 | "color-name": "~1.1.4" 2556 | }, 2557 | "engines": { 2558 | "node": ">=7.0.0" 2559 | } 2560 | }, 2561 | "node_modules/slice-ansi/node_modules/color-name": { 2562 | "version": "1.1.4", 2563 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 2564 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 2565 | "dev": true 2566 | }, 2567 | "node_modules/smart-buffer": { 2568 | "version": "4.2.0", 2569 | "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", 2570 | "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", 2571 | "dev": true, 2572 | "engines": { 2573 | "node": ">= 6.0.0", 2574 | "npm": ">= 3.0.0" 2575 | } 2576 | }, 2577 | "node_modules/socks": { 2578 | "version": "2.7.1", 2579 | "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", 2580 | "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", 2581 | "dev": true, 2582 | "dependencies": { 2583 | "ip": "^2.0.0", 2584 | "smart-buffer": "^4.2.0" 2585 | }, 2586 | "engines": { 2587 | "node": ">= 10.13.0", 2588 | "npm": ">= 3.0.0" 2589 | } 2590 | }, 2591 | "node_modules/socks-proxy-agent": { 2592 | "version": "7.0.0", 2593 | "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", 2594 | "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", 2595 | "dev": true, 2596 | "dependencies": { 2597 | "agent-base": "^6.0.2", 2598 | "debug": "^4.3.3", 2599 | "socks": "^2.6.2" 2600 | }, 2601 | "engines": { 2602 | "node": ">= 10" 2603 | } 2604 | }, 2605 | "node_modules/spago": { 2606 | "version": "0.93.24", 2607 | "resolved": "https://registry.npmjs.org/spago/-/spago-0.93.24.tgz", 2608 | "integrity": "sha512-wedo3N9Lc+4r1lMasmJwp0pJ5XsdYg3bvZiGYBujCplMMU2Fae4VQJcEm6apJU/FlJ96ZnxBYFDzduBqc0x9rQ==", 2609 | "dev": true, 2610 | "dependencies": { 2611 | "better-sqlite3": "^8.6.0", 2612 | "env-paths": "^3.0.0", 2613 | "fast-glob": "^3.2.11", 2614 | "fs-extra": "^10.0.0", 2615 | "fuse.js": "^6.5.3", 2616 | "glob": "^7.1.6", 2617 | "markdown-it": "^12.0.4", 2618 | "open": "^9.1.0", 2619 | "punycode": "^2.3.0", 2620 | "semver": "^7.3.5", 2621 | "spdx-expression-parse": "^3.0.1", 2622 | "ssh2": "^1.14.0", 2623 | "supports-color": "^9.2.3", 2624 | "tar": "^6.1.11", 2625 | "tmp": "^0.2.1", 2626 | "xhr2": "^0.2.1", 2627 | "yaml": "^2.1.1" 2628 | }, 2629 | "bin": { 2630 | "spago": "bin/bundle.js" 2631 | } 2632 | }, 2633 | "node_modules/spago/node_modules/env-paths": { 2634 | "version": "3.0.0", 2635 | "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", 2636 | "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", 2637 | "dev": true, 2638 | "engines": { 2639 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 2640 | }, 2641 | "funding": { 2642 | "url": "https://github.com/sponsors/sindresorhus" 2643 | } 2644 | }, 2645 | "node_modules/spago/node_modules/supports-color": { 2646 | "version": "9.4.0", 2647 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", 2648 | "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", 2649 | "dev": true, 2650 | "engines": { 2651 | "node": ">=12" 2652 | }, 2653 | "funding": { 2654 | "url": "https://github.com/chalk/supports-color?sponsor=1" 2655 | } 2656 | }, 2657 | "node_modules/spdx-exceptions": { 2658 | "version": "2.3.0", 2659 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", 2660 | "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", 2661 | "dev": true 2662 | }, 2663 | "node_modules/spdx-expression-parse": { 2664 | "version": "3.0.1", 2665 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", 2666 | "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", 2667 | "dev": true, 2668 | "dependencies": { 2669 | "spdx-exceptions": "^2.1.0", 2670 | "spdx-license-ids": "^3.0.0" 2671 | } 2672 | }, 2673 | "node_modules/spdx-license-ids": { 2674 | "version": "3.0.16", 2675 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", 2676 | "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", 2677 | "dev": true 2678 | }, 2679 | "node_modules/ssh2": { 2680 | "version": "1.15.0", 2681 | "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.15.0.tgz", 2682 | "integrity": "sha512-C0PHgX4h6lBxYx7hcXwu3QWdh4tg6tZZsTfXcdvc5caW/EMxaB4H9dWsl7qk+F7LAW762hp8VbXOX7x4xUYvEw==", 2683 | "dev": true, 2684 | "hasInstallScript": true, 2685 | "dependencies": { 2686 | "asn1": "^0.2.6", 2687 | "bcrypt-pbkdf": "^1.0.2" 2688 | }, 2689 | "engines": { 2690 | "node": ">=10.16.0" 2691 | }, 2692 | "optionalDependencies": { 2693 | "cpu-features": "~0.0.9", 2694 | "nan": "^2.18.0" 2695 | } 2696 | }, 2697 | "node_modules/ssri": { 2698 | "version": "6.0.2", 2699 | "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", 2700 | "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", 2701 | "dev": true, 2702 | "dependencies": { 2703 | "figgy-pudding": "^3.5.1" 2704 | } 2705 | }, 2706 | "node_modules/stream-each": { 2707 | "version": "1.2.3", 2708 | "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", 2709 | "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", 2710 | "dev": true, 2711 | "dependencies": { 2712 | "end-of-stream": "^1.1.0", 2713 | "stream-shift": "^1.0.0" 2714 | } 2715 | }, 2716 | "node_modules/stream-shift": { 2717 | "version": "1.0.3", 2718 | "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", 2719 | "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", 2720 | "dev": true 2721 | }, 2722 | "node_modules/string_decoder": { 2723 | "version": "1.1.1", 2724 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 2725 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 2726 | "dev": true, 2727 | "dependencies": { 2728 | "safe-buffer": "~5.1.0" 2729 | } 2730 | }, 2731 | "node_modules/string-width": { 2732 | "version": "4.2.3", 2733 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2734 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2735 | "dev": true, 2736 | "dependencies": { 2737 | "emoji-regex": "^8.0.0", 2738 | "is-fullwidth-code-point": "^3.0.0", 2739 | "strip-ansi": "^6.0.1" 2740 | }, 2741 | "engines": { 2742 | "node": ">=8" 2743 | } 2744 | }, 2745 | "node_modules/strip-ansi": { 2746 | "version": "6.0.1", 2747 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2748 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2749 | "dev": true, 2750 | "dependencies": { 2751 | "ansi-regex": "^5.0.1" 2752 | }, 2753 | "engines": { 2754 | "node": ">=8" 2755 | } 2756 | }, 2757 | "node_modules/strip-final-newline": { 2758 | "version": "2.0.0", 2759 | "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", 2760 | "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", 2761 | "dev": true, 2762 | "engines": { 2763 | "node": ">=6" 2764 | } 2765 | }, 2766 | "node_modules/strip-json-comments": { 2767 | "version": "2.0.1", 2768 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 2769 | "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", 2770 | "dev": true, 2771 | "engines": { 2772 | "node": ">=0.10.0" 2773 | } 2774 | }, 2775 | "node_modules/supports-color": { 2776 | "version": "5.5.0", 2777 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 2778 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 2779 | "dev": true, 2780 | "dependencies": { 2781 | "has-flag": "^3.0.0" 2782 | }, 2783 | "engines": { 2784 | "node": ">=4" 2785 | } 2786 | }, 2787 | "node_modules/tar": { 2788 | "version": "6.2.0", 2789 | "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", 2790 | "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", 2791 | "dev": true, 2792 | "dependencies": { 2793 | "chownr": "^2.0.0", 2794 | "fs-minipass": "^2.0.0", 2795 | "minipass": "^5.0.0", 2796 | "minizlib": "^2.1.1", 2797 | "mkdirp": "^1.0.3", 2798 | "yallist": "^4.0.0" 2799 | }, 2800 | "engines": { 2801 | "node": ">=10" 2802 | } 2803 | }, 2804 | "node_modules/tar-fs": { 2805 | "version": "2.1.1", 2806 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", 2807 | "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", 2808 | "dev": true, 2809 | "dependencies": { 2810 | "chownr": "^1.1.1", 2811 | "mkdirp-classic": "^0.5.2", 2812 | "pump": "^3.0.0", 2813 | "tar-stream": "^2.1.4" 2814 | } 2815 | }, 2816 | "node_modules/tar-stream": { 2817 | "version": "2.2.0", 2818 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", 2819 | "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", 2820 | "dev": true, 2821 | "dependencies": { 2822 | "bl": "^4.0.3", 2823 | "end-of-stream": "^1.4.1", 2824 | "fs-constants": "^1.0.0", 2825 | "inherits": "^2.0.3", 2826 | "readable-stream": "^3.1.1" 2827 | }, 2828 | "engines": { 2829 | "node": ">=6" 2830 | } 2831 | }, 2832 | "node_modules/tar-stream/node_modules/readable-stream": { 2833 | "version": "3.6.2", 2834 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", 2835 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", 2836 | "dev": true, 2837 | "dependencies": { 2838 | "inherits": "^2.0.3", 2839 | "string_decoder": "^1.1.1", 2840 | "util-deprecate": "^1.0.1" 2841 | }, 2842 | "engines": { 2843 | "node": ">= 6" 2844 | } 2845 | }, 2846 | "node_modules/tar/node_modules/chownr": { 2847 | "version": "2.0.0", 2848 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", 2849 | "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", 2850 | "dev": true, 2851 | "engines": { 2852 | "node": ">=10" 2853 | } 2854 | }, 2855 | "node_modules/tar/node_modules/minipass": { 2856 | "version": "5.0.0", 2857 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", 2858 | "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", 2859 | "dev": true, 2860 | "engines": { 2861 | "node": ">=8" 2862 | } 2863 | }, 2864 | "node_modules/tar/node_modules/mkdirp": { 2865 | "version": "1.0.4", 2866 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 2867 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", 2868 | "dev": true, 2869 | "bin": { 2870 | "mkdirp": "bin/cmd.js" 2871 | }, 2872 | "engines": { 2873 | "node": ">=10" 2874 | } 2875 | }, 2876 | "node_modules/tar/node_modules/yallist": { 2877 | "version": "4.0.0", 2878 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 2879 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 2880 | "dev": true 2881 | }, 2882 | "node_modules/through2": { 2883 | "version": "2.0.5", 2884 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", 2885 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", 2886 | "dev": true, 2887 | "dependencies": { 2888 | "readable-stream": "~2.3.6", 2889 | "xtend": "~4.0.1" 2890 | } 2891 | }, 2892 | "node_modules/titleize": { 2893 | "version": "3.0.0", 2894 | "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", 2895 | "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", 2896 | "dev": true, 2897 | "engines": { 2898 | "node": ">=12" 2899 | }, 2900 | "funding": { 2901 | "url": "https://github.com/sponsors/sindresorhus" 2902 | } 2903 | }, 2904 | "node_modules/tmp": { 2905 | "version": "0.2.1", 2906 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", 2907 | "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", 2908 | "dev": true, 2909 | "dependencies": { 2910 | "rimraf": "^3.0.0" 2911 | }, 2912 | "engines": { 2913 | "node": ">=8.17.0" 2914 | } 2915 | }, 2916 | "node_modules/tmp/node_modules/rimraf": { 2917 | "version": "3.0.2", 2918 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 2919 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 2920 | "dev": true, 2921 | "dependencies": { 2922 | "glob": "^7.1.3" 2923 | }, 2924 | "bin": { 2925 | "rimraf": "bin.js" 2926 | }, 2927 | "funding": { 2928 | "url": "https://github.com/sponsors/isaacs" 2929 | } 2930 | }, 2931 | "node_modules/to-regex-range": { 2932 | "version": "5.0.1", 2933 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2934 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2935 | "dev": true, 2936 | "dependencies": { 2937 | "is-number": "^7.0.0" 2938 | }, 2939 | "engines": { 2940 | "node": ">=8.0" 2941 | } 2942 | }, 2943 | "node_modules/tunnel-agent": { 2944 | "version": "0.6.0", 2945 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 2946 | "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", 2947 | "dev": true, 2948 | "dependencies": { 2949 | "safe-buffer": "^5.0.1" 2950 | }, 2951 | "engines": { 2952 | "node": "*" 2953 | } 2954 | }, 2955 | "node_modules/tweetnacl": { 2956 | "version": "0.14.5", 2957 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 2958 | "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", 2959 | "dev": true 2960 | }, 2961 | "node_modules/type-fest": { 2962 | "version": "0.21.3", 2963 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", 2964 | "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", 2965 | "dev": true, 2966 | "engines": { 2967 | "node": ">=10" 2968 | }, 2969 | "funding": { 2970 | "url": "https://github.com/sponsors/sindresorhus" 2971 | } 2972 | }, 2973 | "node_modules/typedarray": { 2974 | "version": "0.0.6", 2975 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 2976 | "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", 2977 | "dev": true 2978 | }, 2979 | "node_modules/typescript": { 2980 | "version": "4.9.5", 2981 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", 2982 | "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", 2983 | "dev": true, 2984 | "bin": { 2985 | "tsc": "bin/tsc", 2986 | "tsserver": "bin/tsserver" 2987 | }, 2988 | "engines": { 2989 | "node": ">=4.2.0" 2990 | } 2991 | }, 2992 | "node_modules/uc.micro": { 2993 | "version": "1.0.6", 2994 | "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", 2995 | "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", 2996 | "dev": true 2997 | }, 2998 | "node_modules/unique-filename": { 2999 | "version": "1.1.1", 3000 | "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", 3001 | "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", 3002 | "dev": true, 3003 | "dependencies": { 3004 | "unique-slug": "^2.0.0" 3005 | } 3006 | }, 3007 | "node_modules/unique-slug": { 3008 | "version": "2.0.2", 3009 | "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", 3010 | "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", 3011 | "dev": true, 3012 | "dependencies": { 3013 | "imurmurhash": "^0.1.4" 3014 | } 3015 | }, 3016 | "node_modules/universalify": { 3017 | "version": "2.0.1", 3018 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", 3019 | "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", 3020 | "dev": true, 3021 | "engines": { 3022 | "node": ">= 10.0.0" 3023 | } 3024 | }, 3025 | "node_modules/untildify": { 3026 | "version": "4.0.0", 3027 | "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", 3028 | "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", 3029 | "dev": true, 3030 | "engines": { 3031 | "node": ">=8" 3032 | } 3033 | }, 3034 | "node_modules/util-deprecate": { 3035 | "version": "1.0.2", 3036 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 3037 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 3038 | "dev": true 3039 | }, 3040 | "node_modules/which": { 3041 | "version": "1.3.1", 3042 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 3043 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 3044 | "dev": true, 3045 | "dependencies": { 3046 | "isexe": "^2.0.0" 3047 | }, 3048 | "bin": { 3049 | "which": "bin/which" 3050 | } 3051 | }, 3052 | "node_modules/wrap-ansi": { 3053 | "version": "6.2.0", 3054 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", 3055 | "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", 3056 | "dev": true, 3057 | "dependencies": { 3058 | "ansi-styles": "^4.0.0", 3059 | "string-width": "^4.1.0", 3060 | "strip-ansi": "^6.0.0" 3061 | }, 3062 | "engines": { 3063 | "node": ">=8" 3064 | } 3065 | }, 3066 | "node_modules/wrap-ansi/node_modules/ansi-styles": { 3067 | "version": "4.3.0", 3068 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 3069 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 3070 | "dev": true, 3071 | "dependencies": { 3072 | "color-convert": "^2.0.1" 3073 | }, 3074 | "engines": { 3075 | "node": ">=8" 3076 | }, 3077 | "funding": { 3078 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 3079 | } 3080 | }, 3081 | "node_modules/wrap-ansi/node_modules/color-convert": { 3082 | "version": "2.0.1", 3083 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 3084 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 3085 | "dev": true, 3086 | "dependencies": { 3087 | "color-name": "~1.1.4" 3088 | }, 3089 | "engines": { 3090 | "node": ">=7.0.0" 3091 | } 3092 | }, 3093 | "node_modules/wrap-ansi/node_modules/color-name": { 3094 | "version": "1.1.4", 3095 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 3096 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 3097 | "dev": true 3098 | }, 3099 | "node_modules/wrappy": { 3100 | "version": "1.0.2", 3101 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3102 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 3103 | "dev": true 3104 | }, 3105 | "node_modules/xhr2": { 3106 | "version": "0.2.1", 3107 | "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.2.1.tgz", 3108 | "integrity": "sha512-sID0rrVCqkVNUn8t6xuv9+6FViXjUVXq8H5rWOH2rz9fDNQEd4g0EA2XlcEdJXRz5BMEn4O1pJFdT+z4YHhoWw==", 3109 | "dev": true, 3110 | "engines": { 3111 | "node": ">= 6" 3112 | } 3113 | }, 3114 | "node_modules/xtend": { 3115 | "version": "4.0.2", 3116 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 3117 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 3118 | "dev": true, 3119 | "engines": { 3120 | "node": ">=0.4" 3121 | } 3122 | }, 3123 | "node_modules/y18n": { 3124 | "version": "4.0.3", 3125 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", 3126 | "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", 3127 | "dev": true 3128 | }, 3129 | "node_modules/yallist": { 3130 | "version": "3.1.1", 3131 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 3132 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", 3133 | "dev": true 3134 | }, 3135 | "node_modules/yaml": { 3136 | "version": "2.3.4", 3137 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", 3138 | "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", 3139 | "dev": true, 3140 | "engines": { 3141 | "node": ">= 14" 3142 | } 3143 | }, 3144 | "node_modules/zen-observable": { 3145 | "version": "0.8.15", 3146 | "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", 3147 | "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==", 3148 | "dev": true 3149 | } 3150 | } 3151 | } 3152 | -------------------------------------------------------------------------------- /example/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "devDependencies": { 3 | "purescript": "0.15.14", 4 | "spago": "^0.93.24", 5 | "typescript": "^4.7.4" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /example/spago.yaml: -------------------------------------------------------------------------------- 1 | package: 2 | dependencies: 3 | - console 4 | - effect 5 | - foreign-object 6 | - maybe 7 | - nullable 8 | - prelude 9 | - psci-support 10 | - tuples 11 | - variant 12 | name: example 13 | workspace: 14 | extra_packages: {} 15 | package_set: 16 | registry: 48.4.0 17 | -------------------------------------------------------------------------------- /example/src/Main.purs: -------------------------------------------------------------------------------- 1 | module Main where 2 | 3 | import Prelude (Unit, show, (#), ($), (+)) 4 | import Effect (Effect) 5 | import Effect.Console (log) 6 | import Type.Proxy (Proxy(..)) 7 | import Data.Variant (Variant, case_, on) 8 | import Data.Nullable (Nullable, toMaybe) 9 | import Data.Maybe (Maybe(..)) 10 | import Data.Tuple (Tuple(..)) 11 | import Foreign.Object (Object, fromFoldable) 12 | import Effect.Uncurried (EffectFn2, mkEffectFn2) 13 | 14 | main :: Effect Unit 15 | main = do 16 | log "Hello sailor!" 17 | 18 | variantToString :: Variant (num :: Number, str :: String) -> String 19 | variantToString = case_ # on (Proxy :: Proxy "num") show 20 | # on (Proxy :: Proxy "str") (\x -> x) 21 | 22 | nullableToString :: Nullable String -> String 23 | nullableToString x = case toMaybe x of 24 | Just y -> y 25 | Nothing -> "null" 26 | 27 | numToSomeObj :: Number -> Object Number 28 | numToSomeObj x = fromFoldable [Tuple "foo" x, Tuple "bar" (x + 1.0)] 29 | 30 | someEffectFn :: EffectFn2 Number Number Unit 31 | someEffectFn = mkEffectFn2 $ \a b -> do 32 | log (show (a + b)) 33 | 34 | -- Function s t 35 | -- Array t 36 | -- Record { key1 :: Type1, key2 :: Type2 } 37 | -- Number, Int 38 | -- String, Char 39 | -- Boolean 40 | -- Tuple a b 41 | -- Maybe a 42 | -- Either a b 43 | -- Data.Function.Uncurried 44 | -- Effect 45 | -- Control.Monad.Eff 46 | -- Data.StrMap.StrMap 47 | -- Data.Variant 48 | -- Data.Nullable 49 | -------------------------------------------------------------------------------- /example/user.mts: -------------------------------------------------------------------------------- 1 | import * as PursExample from "./output/Main/index.js"; 2 | 3 | console.log(PursExample.variantToString({type: "num", value: 123})); // => "123" 4 | console.log(PursExample.nullableToString(null)); // => "null" 5 | console.log(PursExample.numToSomeObj(42).bar); // => 43 6 | PursExample.someEffectFn(23, 42); // => 65.0 7 | -------------------------------------------------------------------------------- /package.yaml: -------------------------------------------------------------------------------- 1 | name: purescript-tsd-gen 2 | version: 0.3.0.0 3 | github: "minoki/purescript-tsd-gen" 4 | license: BSD3 5 | author: "ARATA Mizuki " 6 | maintainer: "ARATA Mizuki " 7 | copyright: "2018-2022 ARATA Mizuki" 8 | 9 | extra-source-files: 10 | - README.md 11 | - ChangeLog.md 12 | 13 | synopsis: "TypeScript Declaration File (.d.ts) generator for PureScript" 14 | category: Language 15 | 16 | # To avoid duplicated efforts in documentation and dealing with the 17 | # complications of embedding Haddock markup inside cabal files, it is 18 | # common to point users to the README.md file. 19 | description: Please see the README on Github at 20 | 21 | dependencies: 22 | - base >= 4.7 && < 5 23 | - aeson 24 | - bytestring 25 | - text 26 | - mtl 27 | - containers 28 | - filepath 29 | - directory 30 | - purescript >= 0.15.0 31 | 32 | ghc-options: 33 | - -Wall 34 | - -Wcompat 35 | 36 | executables: 37 | purs-tsd-gen: 38 | main: Main.hs 39 | source-dirs: 40 | - app 41 | - src 42 | ghc-options: 43 | - -threaded 44 | - -rtsopts 45 | - -with-rtsopts=-N 46 | dependencies: 47 | - optparse-applicative 48 | 49 | tests: 50 | doctests: 51 | main: doctests.hs 52 | dependencies: 53 | - doctest >= 0.8 54 | - QuickCheck 55 | -------------------------------------------------------------------------------- /src/Language/PureScript/CodeGen/Tsd/Identifier.hs: -------------------------------------------------------------------------------- 1 | {-# LANGUAGE DataKinds #-} 2 | {-# LANGUAGE KindSignatures #-} 3 | {-# LANGUAGE OverloadedStrings #-} 4 | module Language.PureScript.CodeGen.Tsd.Identifier 5 | ( isIdentifierName 6 | , IncludeKeywords(..) 7 | , Ident 8 | , identToText 9 | , identToBuilder 10 | , IdentifierName 11 | , Identifier 12 | , identToJs 13 | , properToJs 14 | , anyNameToJs 15 | , ensureNonKeyword 16 | , appendWithDoubleDollars 17 | , toIdentifierName 18 | ) where 19 | import Data.Char (isAlphaNum, isLetter) 20 | import qualified Data.Text as T 21 | import qualified Data.Text.Lazy.Builder as TB 22 | import qualified Language.PureScript.CodeGen.JS.Common as JSC 23 | import qualified Language.PureScript.Names as PS 24 | 25 | -- $ 26 | -- Behaviors of JSC.identToJs, JSC.properToJs, and JSC.anyNameToJs: 27 | -- >>> JSC.identToJs (PS.Ident "foo") 28 | -- "foo" 29 | -- >>> JSC.identToJs (PS.Ident "foo'") 30 | -- "foo$prime" 31 | -- >>> JSC.identToJs (PS.Ident "for") 32 | -- "$$for" 33 | -- >>> JSC.properToJs (PS.ProperName "Foo") 34 | -- "Foo" 35 | -- >>> JSC.properToJs (PS.ProperName "Foo'") 36 | -- "Foo$prime" 37 | -- >>> JSC.anyNameToJs "foo" 38 | -- "foo" 39 | -- >>> JSC.anyNameToJs "foo'" 40 | -- "foo$prime" 41 | -- >>> JSC.anyNameToJs "for" 42 | -- "$$for" 43 | 44 | isIdentifierStart, isIdentifierPart :: Char -> Bool 45 | isIdentifierStart c = isLetter c || c == '$' || c == '_' -- TODO: Match with "ID_Start" 46 | isIdentifierPart c = isAlphaNum c || c == '$' || c == '\'' || c == '_' -- TODO: Match with "ID_Continue" 47 | 48 | -- | 49 | -- prop> all isIdentifierName ["foo", "x86", "PureScript", "$foobar", "__proto__"] 50 | -- prop> not (any isIdentifierName ["", "foo'", "42"]) 51 | isIdentifierName :: T.Text -> Bool 52 | isIdentifierName name = case T.uncons name of 53 | Just (x0, xs) -> isIdentifierStart x0 && T.all isIdentifierPart xs 54 | _ -> False 55 | 56 | data IncludeKeywords = IncludeKeywords 57 | | ExcludeKeywords 58 | 59 | newtype Ident (k :: IncludeKeywords) = Ident T.Text 60 | deriving (Eq,Ord,Show) 61 | 62 | identToText :: Ident k -> T.Text 63 | identToText (Ident name) = JSC.anyNameToJs name 64 | 65 | identToBuilder :: Ident k -> TB.Builder 66 | identToBuilder (Ident name) = TB.fromText name 67 | 68 | type IdentifierName = Ident 'IncludeKeywords 69 | type Identifier = Ident 'ExcludeKeywords 70 | 71 | identToJs :: PS.Ident -> Ident 'ExcludeKeywords 72 | identToJs = Ident . JSC.identToJs 73 | 74 | properToJs :: PS.ProperName a -> Ident 'ExcludeKeywords 75 | properToJs = Ident . JSC.properToJs 76 | 77 | anyNameToJs :: T.Text -> Ident 'ExcludeKeywords 78 | anyNameToJs = Ident . JSC.anyNameToJs 79 | 80 | -- | 81 | -- >>> ensureNonKeyword (Ident "foo") 82 | -- Just (Ident "foo") 83 | -- >>> ensureNonKeyword (Ident "for") 84 | -- Nothing 85 | ensureNonKeyword :: Ident 'IncludeKeywords -> Maybe (Ident 'ExcludeKeywords) 86 | ensureNonKeyword (Ident name) | JSC.nameIsJsReserved name = Nothing 87 | | otherwise = Just (Ident name) 88 | 89 | 90 | appendWithDoubleDollars :: Identifier -> Identifier -> Identifier 91 | appendWithDoubleDollars (Ident name1) (Ident name2) = Ident (name1 <> "$$" <> name2) 92 | 93 | toIdentifierName :: Ident k -> Ident 'IncludeKeywords 94 | toIdentifierName (Ident name) = Ident name 95 | -------------------------------------------------------------------------------- /src/Language/PureScript/CodeGen/Tsd/Types.hs: -------------------------------------------------------------------------------- 1 | {-# LANGUAGE OverloadedStrings #-} 2 | module Language.PureScript.CodeGen.Tsd.Types 3 | ( showTSType 4 | , showParenIf 5 | , showField 6 | , showFunctionParameters 7 | , objectPropertyToString 8 | , showTSTypePrec 9 | ) where 10 | import Data.List (intersperse) 11 | import qualified Data.Text.Lazy.Builder as TB 12 | import qualified Data.Text.Lazy.Builder.Int as TB 13 | import Language.PureScript.CodeGen.JS.Common 14 | import qualified Language.PureScript.CodeGen.Tsd.Identifier as JS (identToBuilder) 15 | import Language.PureScript.Label 16 | import Language.PureScript.PSString 17 | import Language.PureScript.TsdGen.Types 18 | 19 | intercalateTB :: TB.Builder -> [TB.Builder] -> TB.Builder 20 | intercalateTB sep xs = mconcat (intersperse sep xs) 21 | 22 | showTSType :: TSType -> TB.Builder 23 | showTSType = showTSTypePrec 0 24 | 25 | showParenIf :: Bool -> TB.Builder -> TB.Builder 26 | showParenIf True s = "(" <> s <> ")" 27 | showParenIf False s = s 28 | 29 | showField :: Field -> TB.Builder 30 | showField field@Field{} = objectPropertyToString (runLabel (fieldLabel field)) <> optionalMarker <> ": " <> showTSType (fieldType field) 31 | where optionalMarker | fieldIsOptional field = "?" 32 | | otherwise = mempty 33 | showField (NewSignature [] params result) = "new (" <> showFunctionParameters params <> "): " <> showTSType result 34 | showField (NewSignature tp params result) = "new <" <> intercalateTB ", " (map (TB.fromText . anyNameToJs) tp) <> ">(" <> showFunctionParameters params <> "): " <> showTSType result 35 | 36 | showFunctionParameters :: [TSType] -> TB.Builder 37 | showFunctionParameters [] = "" 38 | showFunctionParameters [ty] = "_: " <> showTSType ty 39 | showFunctionParameters types = intercalateTB ", " $ zipWith (\n ty -> "_" <> TB.decimal (n :: Int) <> ": " <> showTSType ty) [0..] types 40 | 41 | -- | 42 | -- >>> objectPropertyToString "hello" 43 | -- "hello" 44 | -- >>> objectPropertyToString "foo'" 45 | -- "\"foo'\"" 46 | -- >>> objectPropertyToString "0" 47 | -- "\"0\"" 48 | -- >>> objectPropertyToString "for" 49 | -- "\"for\"" 50 | objectPropertyToString :: PSString -> TB.Builder 51 | objectPropertyToString ps = case decodeString ps of 52 | Just t | isValidJsIdentifier t -> TB.fromText t 53 | _ -> TB.fromText (prettyPrintStringJS ps) 54 | 55 | showTypeName :: TSTypeName -> TB.Builder 56 | showTypeName (QualifiedTypeName moduleId name) = JS.identToBuilder moduleId <> "." <> JS.identToBuilder name 57 | showTypeName (UnqualifiedTypeName name) = JS.identToBuilder name 58 | 59 | showTSTypePrec :: Int -> TSType -> TB.Builder 60 | showTSTypePrec prec ty = case ty of 61 | TSAny -> "any" 62 | TSUndefined -> "undefined" 63 | TSNull -> "null" 64 | TSNever -> "never" 65 | TSNumber -> "number" 66 | TSBoolean -> "boolean" 67 | TSString -> "string" 68 | TSFunction [] params ret -> showParenIf (prec > 0) $ "(" <> showFunctionParameters params <> ") => " <> showTSType ret 69 | TSFunction tp params ret -> showParenIf (prec > 0) $ "<" <> intercalateTB ", " (map (TB.fromText . anyNameToJs) tp) <> ">(" <> showFunctionParameters params <> ") => " <> showTSType ret 70 | TSArray elemTy -> "Array< " <> showTSType elemTy <> " >" -- TODO: Use ReadonlyArray? 71 | TSStrMap elemTy -> "{[_: string]: " <> showTSType elemTy <> "}" 72 | TSRecord [] -> "{}" 73 | TSRecord fields -> "{ " <> intercalateTB "; " (map showField fields) <> " }" 74 | TSUnknown desc -> "any /* " <> TB.fromText desc <> " */" 75 | TSStringLit s -> TB.fromText (prettyPrintStringJS s) 76 | TSUnion [] -> "never" -- uninhabitated type 77 | TSUnion members -> showParenIf (prec > 1) $ intercalateTB " | " (map (showTSTypePrec 1) members) 78 | TSIntersection [] -> "{}" -- universal type. TODO: use 'unknown' type? 79 | TSIntersection members -> intercalateTB " & " (map (showTSTypePrec 2) members) 80 | TSTyVar name -> TB.fromText (anyNameToJs name) 81 | TSNamed name tyArgs -> showTypeName name <> ta 82 | where ta = case tyArgs of 83 | [] -> mempty 84 | -- the space after '<' is needed to avoid parse error with types like Array<(_: a) => a> 85 | _ -> "< " <> intercalateTB ", " (map showTSType tyArgs) <> " >" 86 | TSCommented inner desc -> showTSTypePrec prec inner <> " /* " <> TB.fromText desc <> " */" 87 | -------------------------------------------------------------------------------- /src/Language/PureScript/Constants/Compat.hs: -------------------------------------------------------------------------------- 1 | {-# LANGUAGE CPP #-} 2 | {-# LANGUAGE PatternSynonyms #-} 3 | module Language.PureScript.Constants.Compat 4 | ( module C 5 | #if MIN_VERSION_purescript(0, 15, 7) 6 | , module Language.PureScript.Constants.Compat 7 | #endif 8 | ) where 9 | import Language.PureScript.Constants.Prim as C 10 | 11 | #if MIN_VERSION_purescript(0, 15, 7) 12 | import Language.PureScript.Names (ModuleName) 13 | 14 | pattern Prim :: ModuleName 15 | pattern Prim = C.M_Prim 16 | #endif 17 | -------------------------------------------------------------------------------- /src/Language/PureScript/Environment/Compat.hs: -------------------------------------------------------------------------------- 1 | module Language.PureScript.Environment.Compat 2 | ( stripRole 3 | ) where 4 | 5 | stripRole :: [(a,b,r)] -> [(a,b)] 6 | stripRole = map (\(a,b,_) -> (a,b)) 7 | -------------------------------------------------------------------------------- /src/Language/PureScript/Externs/Compat.hs: -------------------------------------------------------------------------------- 1 | {-# LANGUAGE PatternSynonyms #-} 2 | {-# LANGUAGE DataKinds #-} 3 | {-# LANGUAGE ViewPatterns #-} 4 | 5 | module Language.PureScript.Externs.Compat 6 | ( module Language.PureScript.Externs 7 | , pattern EDKind 8 | , edKindName 9 | ) where 10 | 11 | import Language.PureScript.Externs 12 | import Language.PureScript.Names 13 | 14 | pattern EDKind :: ProperName 'TypeName -> ExternsDeclaration 15 | pattern EDKind { edKindName } <- (const Nothing -> Just edKindName) 16 | -------------------------------------------------------------------------------- /src/Language/PureScript/Kinds/Compat.hs: -------------------------------------------------------------------------------- 1 | {-# LANGUAGE PatternSynonyms #-} 2 | module Language.PureScript.Kinds.Compat 3 | ( SourceKind 4 | , pattern FunKind 5 | ) where 6 | import Language.PureScript.Types 7 | import qualified Language.PureScript.Constants.Prim as C 8 | 9 | type SourceKind = SourceType 10 | 11 | pattern FunKind :: a -> Type a -> Type a -> Type a 12 | pattern FunKind s a b <- TypeApp s (TypeApp _ (TypeConstructor _ C.Function) a) b where 13 | FunKind s a b = TypeApp s (TypeApp s (TypeConstructor s C.Function) a) b where 14 | -------------------------------------------------------------------------------- /src/Language/PureScript/Pretty/Compat.hs: -------------------------------------------------------------------------------- 1 | module Language.PureScript.Pretty.Compat (prettyPrintKind) where 2 | import Language.PureScript.Types 3 | import Language.PureScript.Pretty.Types (prettyPrintType) 4 | import qualified Data.Text as T 5 | 6 | prettyPrintKind :: Type a -> T.Text 7 | prettyPrintKind = T.pack . prettyPrintType {- maxDepth -} 3 8 | -------------------------------------------------------------------------------- /src/Language/PureScript/TsdGen/Hardwired.hs: -------------------------------------------------------------------------------- 1 | {-# LANGUAGE CPP #-} 2 | {-# LANGUAGE OverloadedStrings #-} 3 | {-# LANGUAGE DataKinds #-} 4 | module Language.PureScript.TsdGen.Hardwired where 5 | import Language.PureScript.Types (SourceType, Type(TypeConstructor)) 6 | import Language.PureScript.Names 7 | import Language.PureScript.Errors (nullSourceAnn) 8 | 9 | #if MIN_VERSION_purescript(0, 15, 3) 10 | byModuleName :: ModuleName -> QualifiedBy 11 | byModuleName = ByModuleName 12 | #else 13 | type QualifiedBy = Maybe ModuleName 14 | byModuleName :: ModuleName -> Maybe ModuleName 15 | byModuleName = Just 16 | #endif 17 | 18 | -- Data.Unit 19 | qnUnit :: Qualified (ProperName 'TypeName) 20 | qnUnit = mkQualified (ProperName "Unit") (moduleNameFromString "Data.Unit") 21 | 22 | -- Data.Function.Uncurried 23 | qnFn0, qnFn2, qnFn3, qnFn4, qnFn5, qnFn6, qnFn7, qnFn8, qnFn9, qnFn10 :: Qualified (ProperName 'TypeName) 24 | tyFn0, tyFn2, tyFn3, tyFn4, tyFn5, tyFn6, tyFn7, tyFn8, tyFn9, tyFn10 :: SourceType 25 | modDataFunctionUncurried :: QualifiedBy 26 | modDataFunctionUncurried = byModuleName (moduleNameFromString "Data.Function.Uncurried") 27 | qnFn0 = Qualified modDataFunctionUncurried (ProperName "Fn0") 28 | qnFn2 = Qualified modDataFunctionUncurried (ProperName "Fn2") 29 | qnFn3 = Qualified modDataFunctionUncurried (ProperName "Fn3") 30 | qnFn4 = Qualified modDataFunctionUncurried (ProperName "Fn4") 31 | qnFn5 = Qualified modDataFunctionUncurried (ProperName "Fn5") 32 | qnFn6 = Qualified modDataFunctionUncurried (ProperName "Fn6") 33 | qnFn7 = Qualified modDataFunctionUncurried (ProperName "Fn7") 34 | qnFn8 = Qualified modDataFunctionUncurried (ProperName "Fn8") 35 | qnFn9 = Qualified modDataFunctionUncurried (ProperName "Fn9") 36 | qnFn10 = Qualified modDataFunctionUncurried (ProperName "Fn10") 37 | tyFn0 = TypeConstructor nullSourceAnn qnFn0 38 | tyFn2 = TypeConstructor nullSourceAnn qnFn2 39 | tyFn3 = TypeConstructor nullSourceAnn qnFn3 40 | tyFn4 = TypeConstructor nullSourceAnn qnFn4 41 | tyFn5 = TypeConstructor nullSourceAnn qnFn5 42 | tyFn6 = TypeConstructor nullSourceAnn qnFn6 43 | tyFn7 = TypeConstructor nullSourceAnn qnFn7 44 | tyFn8 = TypeConstructor nullSourceAnn qnFn8 45 | tyFn9 = TypeConstructor nullSourceAnn qnFn9 46 | tyFn10 = TypeConstructor nullSourceAnn qnFn10 47 | 48 | -- Effect.Uncurried 49 | qnEffectFn1, qnEffectFn2, qnEffectFn3, qnEffectFn4, qnEffectFn5, qnEffectFn6, qnEffectFn7, qnEffectFn8, qnEffectFn9, qnEffectFn10 :: Qualified (ProperName 'TypeName) 50 | tyEffectFn1, tyEffectFn2, tyEffectFn3, tyEffectFn4, tyEffectFn5, tyEffectFn6, tyEffectFn7, tyEffectFn8, tyEffectFn9, tyEffectFn10 :: SourceType 51 | modEffectUncurried :: QualifiedBy 52 | modEffectUncurried = byModuleName (moduleNameFromString "Effect.Uncurried") 53 | qnEffectFn1 = Qualified modEffectUncurried (ProperName "EffectFn1") 54 | qnEffectFn2 = Qualified modEffectUncurried (ProperName "EffectFn2") 55 | qnEffectFn3 = Qualified modEffectUncurried (ProperName "EffectFn3") 56 | qnEffectFn4 = Qualified modEffectUncurried (ProperName "EffectFn4") 57 | qnEffectFn5 = Qualified modEffectUncurried (ProperName "EffectFn5") 58 | qnEffectFn6 = Qualified modEffectUncurried (ProperName "EffectFn6") 59 | qnEffectFn7 = Qualified modEffectUncurried (ProperName "EffectFn7") 60 | qnEffectFn8 = Qualified modEffectUncurried (ProperName "EffectFn8") 61 | qnEffectFn9 = Qualified modEffectUncurried (ProperName "EffectFn9") 62 | qnEffectFn10 = Qualified modEffectUncurried (ProperName "EffectFn10") 63 | tyEffectFn1 = TypeConstructor nullSourceAnn qnEffectFn1 64 | tyEffectFn2 = TypeConstructor nullSourceAnn qnEffectFn2 65 | tyEffectFn3 = TypeConstructor nullSourceAnn qnEffectFn3 66 | tyEffectFn4 = TypeConstructor nullSourceAnn qnEffectFn4 67 | tyEffectFn5 = TypeConstructor nullSourceAnn qnEffectFn5 68 | tyEffectFn6 = TypeConstructor nullSourceAnn qnEffectFn6 69 | tyEffectFn7 = TypeConstructor nullSourceAnn qnEffectFn7 70 | tyEffectFn8 = TypeConstructor nullSourceAnn qnEffectFn8 71 | tyEffectFn9 = TypeConstructor nullSourceAnn qnEffectFn9 72 | tyEffectFn10 = TypeConstructor nullSourceAnn qnEffectFn10 73 | 74 | -- Data.StrMap (from purescript-maps) 75 | -- foreign import data StrMap :: Type -> Type 76 | qnStrMap :: Qualified (ProperName 'TypeName) 77 | qnStrMap = mkQualified (ProperName "StrMap") (moduleNameFromString "Data.StrMap") 78 | tyStrMap :: SourceType 79 | tyStrMap = TypeConstructor nullSourceAnn qnStrMap 80 | 81 | -- Control.Monad.Eff 82 | -- foreign import data Eff :: # Effect -> Type -> Type 83 | tyEff :: SourceType 84 | tyEff = TypeConstructor nullSourceAnn (mkQualified (ProperName "Eff") (moduleNameFromString "Control.Monad.Eff")) 85 | 86 | -- Effect (from purescript-effect) 87 | -- foreign import data Effect :: Type -> Type 88 | qnEffect :: Qualified (ProperName 'TypeName) 89 | qnEffect = mkQualified (ProperName "Effect") (moduleNameFromString "Effect") 90 | tyEffect :: SourceType 91 | tyEffect = TypeConstructor nullSourceAnn qnEffect 92 | 93 | -- Data.Variant (from purescript-variant) 94 | -- foreign import data Variant :: # Type -> Type 95 | tyVariant :: SourceType 96 | tyVariant = TypeConstructor nullSourceAnn (mkQualified (ProperName "Variant") (moduleNameFromString "Data.Variant")) 97 | 98 | -- Data.Nullable (from purescript-nullable) 99 | -- foreign import data Nullable :: Type -> Type 100 | qnNullable :: Qualified (ProperName 'TypeName) 101 | qnNullable = mkQualified (ProperName "Nullable") (moduleNameFromString "Data.Nullable") 102 | tyNullable :: SourceType 103 | tyNullable = TypeConstructor nullSourceAnn qnNullable 104 | 105 | -- Foreign.Object (from purescript-foreign-object) 106 | -- foreign import data Object :: Type -> Type 107 | qnForeignObject :: Qualified (ProperName 'TypeName) 108 | qnForeignObject = mkQualified (ProperName "Object") (moduleNameFromString "Foreign.Object") 109 | tyForeignObject :: SourceType 110 | tyForeignObject = TypeConstructor nullSourceAnn qnForeignObject 111 | -------------------------------------------------------------------------------- /src/Language/PureScript/TsdGen/Module.hs: -------------------------------------------------------------------------------- 1 | {-# LANGUAGE CPP #-} 2 | {-# LANGUAGE DataKinds #-} 3 | {-# LANGUAGE NamedFieldPuns #-} 4 | {-# LANGUAGE OverloadedStrings #-} 5 | {-# LANGUAGE RecordWildCards #-} 6 | {-# LANGUAGE ViewPatterns #-} 7 | module Language.PureScript.TsdGen.Module 8 | ( module Language.PureScript.TsdGen.Module 9 | , ModuleProcessingError (..) 10 | , readExternsForModule 11 | ) where 12 | import Control.Monad.Except 13 | import Control.Monad.Reader 14 | import Control.Monad.RWS.Strict 15 | import Control.Monad.State 16 | import Control.Monad.Writer 17 | import Data.Bifunctor 18 | import qualified Data.List as List 19 | import qualified Data.Map as Map 20 | import Data.Maybe 21 | import Data.Text (Text) 22 | import qualified Data.Text as T 23 | import qualified Data.Text.Lazy.Builder as TB 24 | import Data.Version (showVersion) 25 | import qualified Language.PureScript.CodeGen.Tsd.Identifier as JS 26 | import Language.PureScript.CodeGen.Tsd.Types 27 | import qualified Language.PureScript.Constants.Compat as C 28 | import Language.PureScript.Environment 29 | import Language.PureScript.Environment.Compat 30 | import Language.PureScript.Errors 31 | import Language.PureScript.Externs.Compat 32 | import Language.PureScript.Label 33 | import Language.PureScript.Names 34 | import Language.PureScript.Pretty.Compat (prettyPrintKind) 35 | import Language.PureScript.PSString 36 | import Language.PureScript.TsdGen.Hardwired 37 | import Language.PureScript.TsdGen.Module.ReadExterns (ModuleProcessingError (..), 38 | readExternsForModule) 39 | import Language.PureScript.TsdGen.Types 40 | import Language.PureScript.Types 41 | import Paths_purescript_tsd_gen (version) 42 | import Prelude hiding (elem, lookup, notElem) 43 | 44 | newtype ModuleImport = ModuleImport { moduleImportIdent :: Maybe JS.Identifier 45 | } 46 | 47 | type ModuleImportMap = Map.Map ModuleName ModuleImport 48 | 49 | type RenamedExportMap = Map.Map {- external name -} JS.IdentifierName 50 | ({- internal name: manged by anyNameToJs -} JS.Identifier, {- comments -} [T.Text]) 51 | 52 | type ModuleWriter = RWST () TB.Builder (ModuleImportMap, RenamedExportMap) (ExceptT ModuleProcessingError IO) 53 | 54 | recursivelyLoadExterns :: FilePath -> ModuleName -> StateT (Environment, Map.Map ModuleName (Maybe ExternsFile)) (ExceptT ModuleProcessingError IO) () 55 | recursivelyLoadExterns dir moduleName 56 | | moduleName == C.Prim = return () -- ~v0.11.7 57 | | moduleName `List.elem` C.primModules = return () -- v0.12.0~ 58 | | otherwise = do 59 | ef <- lift (readExternsForModule dir moduleName) 60 | modify (second (Map.insert moduleName (Just ef))) 61 | let imports = efImports ef 62 | forM_ (map eiModule imports) $ \importModuleName -> do 63 | alreadyLoading <- gets (Map.member importModuleName . snd) 64 | unless alreadyLoading $ do 65 | modify (second (Map.insert importModuleName Nothing)) 66 | recursivelyLoadExterns dir importModuleName 67 | modify (first (applyExternsFileToEnvironment ef)) 68 | 69 | emitComment :: Text -> ModuleWriter () 70 | emitComment t = tell ("// " <> TB.fromText t <> "\n") 71 | 72 | emitInterface :: JS.Identifier -> [Text] -> [Field] -> ModuleWriter () 73 | emitInterface name tyParams fields = do 74 | let tyParamsText | null tyParams = mempty 75 | | otherwise = "<" <> TB.fromText (T.intercalate ", " tyParams) <> ">" 76 | tell $ "interface " <> JS.identToBuilder name <> tyParamsText <> " {\n" <> mconcat (map (\f -> " " <> showField f <> ";\n") fields) <> "}\n" 77 | 78 | data ExportName = NeedsRenaming { exportedName :: JS.IdentifierName, internalName :: JS.Identifier } 79 | | NoRenaming JS.Identifier 80 | psNameToJSExportName :: Text -> ExportName 81 | psNameToJSExportName psName 82 | = let internalName = JS.anyNameToJs psName 83 | identifierName = JS.toIdentifierName internalName 84 | in if JS.identToText internalName == JS.identToText identifierName 85 | then NoRenaming internalName 86 | else NeedsRenaming { exportedName = identifierName 87 | , internalName 88 | } 89 | 90 | emitRenamedExport :: Maybe Text -> JS.IdentifierName -> JS.Identifier -> ModuleWriter () 91 | emitRenamedExport comment externalName internalName = do 92 | minfo <- gets (Map.lookup externalName . snd) 93 | case minfo of 94 | Just (internalName', comments) 95 | | internalName' == internalName -> modify $ second $ Map.insert externalName (internalName', maybeToList comment ++ comments) 96 | | otherwise -> fail "renamed export: internalName mismatch" 97 | Nothing -> modify $ second $ Map.insert externalName (internalName, maybeToList comment) 98 | 99 | emitTypeDeclaration :: Maybe Text -> ExportName -> [Text] -> TSType -> ModuleWriter () 100 | emitTypeDeclaration comment ename tyParams ty = do 101 | let commentPart = case comment of 102 | Just commentText -> "/*" <> TB.fromText commentText <> "*/ " 103 | Nothing -> mempty 104 | let tyParamsText | null tyParams = mempty 105 | | otherwise = "<" <> TB.fromText (T.intercalate ", " tyParams) <> ">" 106 | case ename of 107 | NoRenaming name -> do 108 | tell $ "export type " <> commentPart <> JS.identToBuilder name <> tyParamsText <> " = " <> showTSType ty <> ";\n" 109 | NeedsRenaming { exportedName, internalName } -> do 110 | tell $ "type " <> commentPart <> JS.identToBuilder internalName <> tyParamsText <> " = " <> showTSType ty <> ";\n" 111 | emitRenamedExport (Just "type") exportedName internalName 112 | 113 | emitValueDeclaration :: Maybe Text -> ExportName -> TSType -> ModuleWriter () 114 | emitValueDeclaration comment vname ty = case vname of 115 | NeedsRenaming { exportedName, internalName } -> do 116 | tell $ "declare const " <> commentPart <> JS.identToBuilder internalName <> ": " <> showTSType ty <> ";\n" 117 | emitRenamedExport (Just "value") exportedName internalName 118 | NoRenaming name -> do 119 | tell $ "export const " <> commentPart <> JS.identToBuilder name <> ": " <> showTSType ty <> ";\n" 120 | where commentPart = case comment of 121 | Just commentText -> "/*" <> TB.fromText commentText <> "*/ " 122 | Nothing -> mempty 123 | 124 | emitNamespaceImport :: Monad m => JS.Identifier -> ModuleName -> WriterT TB.Builder m () 125 | emitNamespaceImport ident moduleName = tell $ "import * as " <> JS.identToBuilder ident <> " from \"../" <> TB.fromText (runModuleName moduleName) <> "/index.js\";\n" 126 | 127 | emitImport :: Monad m => ModuleName -> WriterT TB.Builder m () 128 | emitImport moduleName = tell $ "import \"../" <> TB.fromText (runModuleName moduleName) <> "/index.js\";\n" 129 | 130 | processLoadedModule :: Environment -> ExternsFile -> Bool -> ExceptT ModuleProcessingError IO TB.Builder 131 | processLoadedModule env ef importAll = execWriterT $ do 132 | tell $ "// module " <> TB.fromText (runModuleName currentModuleName) <> ", generated by purescript-tsd-gen " <> TB.fromString (showVersion version) <> "\n" 133 | ((moduleImportMap, renamedExportMap), moduleBody) <- 134 | lift $ execRWST (mapM_ processDecl (efDeclarations ef)) -- action 135 | () -- reader context 136 | (Map.singleton currentModuleName (ModuleImport { moduleImportIdent = Nothing }), Map.empty) -- initial state 137 | if importAll 138 | then do 139 | -- Emit 'import' statements for all modules referenced, whether or not they are actually used in the type declarations. 140 | let explicitlyImported = List.nub (map eiModule (efImports ef)) 141 | allImports = Map.keys moduleImportMap 142 | forM_ (explicitlyImported `List.union` allImports) $ 143 | \moduleName -> 144 | case Map.lookup moduleName moduleImportMap of 145 | Just (ModuleImport { moduleImportIdent = Just ident }) -> emitNamespaceImport ident moduleName 146 | Nothing | moduleName /= C.Prim -> 147 | emitImport moduleName 148 | _ -> return () 149 | else 150 | -- Only emit 'import' statements for modules that are actually used in the type declarations. 151 | forM_ (Map.toList moduleImportMap) $ 152 | \m -> case m of 153 | (moduleName, ModuleImport { moduleImportIdent = Just ident }) -> emitNamespaceImport ident moduleName 154 | _ -> return () 155 | 156 | tell moduleBody 157 | 158 | -- Renamed exports 159 | forM_ (Map.toList renamedExportMap) $ \(externalName, (internalName, comments)) -> do 160 | let commentPart = case comments of 161 | [] -> mempty 162 | _:_ -> "/*" <> mconcat (List.intersperse "+" $ map TB.fromText $ reverse comments) <> "*/ " 163 | tell $ "export " <> commentPart <> "{ " <> JS.identToBuilder internalName <> " as " <> JS.identToBuilder externalName <> " };\n" 164 | 165 | -- `export {};` is necessary to suppress implicit exports... 166 | when (Map.null renamedExportMap) $ do 167 | tell "export {};\n" 168 | 169 | -- TODO: module re-exports: dig efExports / ReExportRef 170 | 171 | where 172 | currentModuleName :: ModuleName 173 | currentModuleName = efModuleName ef 174 | 175 | qualCurrentModule :: a -> Qualified a 176 | #if MIN_VERSION_purescript(0, 15, 3) 177 | qualCurrentModule = Qualified (ByModuleName currentModuleName) 178 | #else 179 | qualCurrentModule = Qualified (Just currentModuleName) 180 | #endif 181 | 182 | -- Get the JS identifier for given module 183 | getModuleId :: ModuleName -> ModuleWriter (Maybe JS.Identifier) 184 | getModuleId C.Prim = return Nothing -- should not occur 185 | getModuleId moduleName = do 186 | mid <- gets (Map.lookup moduleName . fst) 187 | case mid of 188 | Nothing -> do -- not found 189 | let moduleId = Just $ JS.anyNameToJs $ T.replace "." "_" (runModuleName moduleName) 190 | -- TODO: Make sure moduleId is unique 191 | modify (first $ Map.insert moduleName (ModuleImport { moduleImportIdent = moduleId })) 192 | return moduleId 193 | Just ModuleImport{..} -> return moduleImportIdent 194 | 195 | makeContext :: [Text] -> TypeTranslationContext ModuleWriter 196 | makeContext typeVariables = TypeTranslationContext typeVariables [] Nothing getModuleId env currentModuleName 197 | 198 | pursTypeToTSTypeX :: [Text] -> SourceType -> ModuleWriter TSType 199 | pursTypeToTSTypeX ctx ty = do 200 | e <- runExceptT $ runReaderT (pursTypeToTSType ty) (makeContext ctx) 201 | case e of 202 | Left err -> throwError (PursTypeError currentModuleName err) 203 | Right tsty -> return tsty 204 | 205 | processDecl :: ExternsDeclaration -> ModuleWriter () 206 | processDecl EDType{..} = do 207 | let name = edTypeName 208 | qTypeName = qualCurrentModule edTypeName 209 | if isSimpleKind edTypeKind 210 | then case edTypeDeclarationKind of 211 | -- newtype declaration: 212 | DataType _dataDeclType (stripRole -> params) [(ctorPName,[member])] 213 | | Just (Newtype,_,_,_) <- Map.lookup (qualCurrentModule ctorPName) (dataConstructors env) -> do 214 | case extractTypes edTypeKind params of 215 | Just typeParameters -> do 216 | member' <- pursTypeToTSTypeX typeParameters member 217 | emitTypeDeclaration (Just "newtype") (psNameToJSExportName (runProperName name)) typeParameters member' 218 | Nothing -> do 219 | emitComment $ "newtype " <> runProperName name <> ": kind annotation was not available" 220 | 221 | -- data declaration: 222 | DataType _dataDeclType (stripRole -> params) ctors -> do 223 | case extractTypes edTypeKind params of 224 | Just typeParameters -> do 225 | let buildCtorType (ctorPName,members) 226 | -- the data constructor is exported: 227 | -- the data constructor should be defined somewhere in this module (see EDDataConstructor case), 228 | -- so just reference it. 229 | | qualCurrentModule ctorPName `Map.member` dataConstructors env 230 | = let fv = typeParameters `List.intersect` concatMap freeTypeVariables members 231 | in TSNamed (UnqualifiedTypeName $ JS.appendWithDoubleDollars (JS.properToJs name) (JS.properToJs ctorPName)) (map TSTyVar fv) 232 | 233 | -- the data constructor is not exportd (i.e. abstract): 234 | -- the marker fields are non-optional, so that they cannot be implicitly casted from other types. 235 | | otherwise 236 | = TSRecord [ mkField "$$pursType" (TSStringLit $ mkString $ runModuleName currentModuleName <> "." <> runProperName edTypeName) 237 | , mkField "$$pursTag" (TSStringLit $ mkString $ runProperName ctorPName) 238 | , mkField "$$abstractMarker" TSNever 239 | ] 240 | emitTypeDeclaration (Just "data") (psNameToJSExportName (runProperName name)) typeParameters (TSUnion $ map buildCtorType ctors) 241 | Nothing -> do 242 | emitComment $ "data " <> runProperName name <> ": kind annotation was not available" 243 | 244 | -- type synonym: 245 | TypeSynonym 246 | | Just (synonymArguments, synonymType) <- Map.lookup qTypeName (typeSynonyms env) -> do 247 | case extractTypes edTypeKind synonymArguments of 248 | Just typeParameters -> do 249 | tsty <- pursTypeToTSTypeX typeParameters synonymType 250 | emitTypeDeclaration (Just "synonym") (psNameToJSExportName (runProperName name)) typeParameters tsty 251 | Nothing -> do 252 | emitComment $ "type synonym " <> runProperName name <> ": kind annotation was not available" 253 | | otherwise -> emitComment ("type (synonym) " <> runProperName name <> ": " <> prettyPrintKind edTypeKind) 254 | 255 | -- foreign import data: 256 | ExternData {} 257 | | qTypeName == qnUnit -> do 258 | -- Data.Unit 259 | emitTypeDeclaration (Just "builtin") (psNameToJSExportName "Unit") [] (TSRecord [(mkOptionalField "$$pursType" (TSStringLit "Data.Unit.Unit"))]) 260 | | qTypeName `List.elem` builtins -> do 261 | pst <- pursTypeToTSTypeX typeParameters (foldl (TypeApp nullSourceAnn) (TypeConstructor nullSourceAnn qTypeName) (map (TypeVar nullSourceAnn) typeParameters)) 262 | emitTypeDeclaration (Just "builtin") (psNameToJSExportName (runProperName name)) typeParameters pst 263 | | otherwise -> do 264 | -- Foreign type: just use 'any' type. 265 | -- External '.d.ts' file needs to be supplied for better typing. 266 | emitTypeDeclaration (Just "foreign") (psNameToJSExportName (runProperName name)) typeParameters (TSUnknown "foreign") 267 | where builtins = [qnFn0,qnFn2,qnFn3,qnFn4,qnFn5,qnFn6,qnFn7,qnFn8,qnFn9,qnFn10 268 | ,qnEffect,qnEffectFn1,qnEffectFn2,qnEffectFn3,qnEffectFn4,qnEffectFn5,qnEffectFn6,qnEffectFn7,qnEffectFn8,qnEffectFn9,qnEffectFn10 269 | ,qnStrMap,qnForeignObject,qnNullable] 270 | n = numberOfTypeParams edTypeKind 271 | typeParameters = map (\i -> "a" <> T.pack (show i)) [0..n-1] 272 | 273 | -- others: 274 | LocalTypeVariable -> emitComment ("unexpected local type variable: " <> runProperName name <> " :: " <> prettyPrintKind edTypeKind) 275 | ScopedTypeVar -> emitComment ("unexpected scoped type variable: " <> runProperName name <> " :: " <> prettyPrintKind edTypeKind) 276 | 277 | else emitComment ("type " <> runProperName name <> " :: " <> (T.strip $ prettyPrintKind edTypeKind) <> " : unsupported kind") 278 | 279 | processDecl EDDataConstructor{..} = do 280 | let name = edDataCtorName 281 | case Map.lookup (qualCurrentModule edDataCtorTypeCtor) (types env) of 282 | Just (k, DataType _dataDeclType (stripRole -> typeParameters) constructors) 283 | | isSimpleKind k 284 | , Just fieldTypes <- List.lookup edDataCtorName constructors -> do 285 | tsty <- pursTypeToTSTypeX [] edDataCtorType 286 | case edDataCtorOrigin of 287 | Data -> do 288 | -- Data constructor for a 'data' declaration: 289 | -- Emit an interface so that type refinement via 'instanceof' works. 290 | let fieldTypeVars = map fst typeParameters `List.intersect` concatMap freeTypeVariables fieldTypes 291 | dataCtorSubtypeName = JS.appendWithDoubleDollars (JS.properToJs edDataCtorTypeCtor) (JS.properToJs name) 292 | dataCtorSubtype = TSNamed (UnqualifiedTypeName dataCtorSubtypeName) (map TSTyVar fieldTypeVars) 293 | fieldTypesTS <- mapM (pursTypeToTSTypeX fieldTypeVars) fieldTypes 294 | let mkMarkerField | length constructors == 1 = mkOptionalField -- allow structural subtyping if there are only one constructor 295 | | otherwise = mkField -- nominal typing 296 | makerFields = [ mkMarkerField "$$pursType" (TSStringLit (mkString $ runModuleName currentModuleName <> "." <> runProperName edDataCtorTypeCtor)) 297 | , mkMarkerField "$$pursTag" (TSStringLit (mkString $ runProperName edDataCtorName)) 298 | ] 299 | dataFields = zipWith (\f ty -> mkField (Label $ mkString $ runIdent f) ty) edDataCtorFields fieldTypesTS 300 | emitInterface dataCtorSubtypeName fieldTypeVars (makerFields <> dataFields) 301 | 302 | -- The constructor function has a 'new' signature returning that interface. 303 | let ctorFieldName | null edDataCtorFields = "value" 304 | | otherwise = "create" 305 | ctorType = TSRecord [ mkField ctorFieldName tsty 306 | , NewSignature fieldTypeVars fieldTypesTS dataCtorSubtype 307 | ] 308 | emitValueDeclaration (Just "data ctor") (psNameToJSExportName (runProperName name)) ctorType 309 | 310 | Newtype -> 311 | -- Data constructor for a 'newtype' declaration: 312 | -- No 'new' signature: just define a function. 313 | emitValueDeclaration (Just "newtype data ctor") (psNameToJSExportName (runProperName name)) tsty 314 | 315 | Nothing -> emitComment $ "the type of an exported data constructor must be exported: " <> runProperName name 316 | Just (k, DataType {}) -> emitComment $ "unrecognized data constructor: " <> runProperName name <> " kind: " <> prettyPrintKind k 317 | _ -> emitComment $ "unrecognized data constructor: " <> runProperName name 318 | 319 | processDecl EDValue{..} = do 320 | let name = edValueName 321 | tsty <- pursTypeToTSTypeX [] edValueType 322 | emitValueDeclaration Nothing (psNameToJSExportName (runIdent name)) tsty 323 | 324 | processDecl EDInstance{..} 325 | | Just constraints <- edInstanceConstraints 326 | #if MIN_VERSION_purescript(0, 15, 3) 327 | , Just typeClassDict <- Map.lookup (ByModuleName currentModuleName) (typeClassDictionaries env) 328 | #else 329 | , Just typeClassDict <- Map.lookup (Just currentModuleName) (typeClassDictionaries env) 330 | #endif 331 | , Just _ <- Map.lookup edInstanceClassName typeClassDict = do 332 | -- TODO: This code depends on the undocumented implementation-details... 333 | let {-synonymInstance = replaceAllTypeVars (zip (freeTypeVariables synonymType) edInstanceTypes) synonymType-} 334 | dictTy = foldl srcTypeApp (srcTypeConstructor qDictTypeName) edInstanceTypes 335 | desugaredInstanceType = quantify (foldr srcConstrainedType dictTy constraints) 336 | instanceTy <- pursTypeToTSTypeX [] desugaredInstanceType 337 | emitValueDeclaration (Just "instance") (psNameToJSExportName (runIdent edInstanceName)) instanceTy 338 | | otherwise = emitComment ("invalid instance declaration '" <> runIdent edInstanceName <> "'") 339 | where -- name = identToJs edInstanceName :: JS.Identifier 340 | qDictTypeName = fmap (coerceProperName . dictTypeName) edInstanceClassName :: Qualified (ProperName 'TypeName) 341 | 342 | processDecl EDKind { edKindName = kindName } = do 343 | -- Do nothing for kind declarations: just put a comment. 344 | let name = runProperName kindName 345 | emitComment ("kind " <> name) 346 | 347 | processDecl EDTypeSynonym{} = do 348 | -- Ignored: should be handled in EDType case. 349 | return () 350 | 351 | processDecl EDClass{} = do 352 | -- Ignored: should be handled in EDType case. 353 | return () 354 | -------------------------------------------------------------------------------- /src/Language/PureScript/TsdGen/Module/ReadExterns.hs: -------------------------------------------------------------------------------- 1 | module Language.PureScript.TsdGen.Module.ReadExterns where 2 | import Control.Monad.Except 3 | import qualified Data.Text as T 4 | import Language.PureScript.Errors 5 | import Language.PureScript.Externs 6 | import Language.PureScript.Names 7 | import System.FilePath (()) 8 | import qualified Language.PureScript.Make.Monad as Make 9 | 10 | data ModuleProcessingError = FileReadError 11 | | CBORDecodeError FilePath 12 | | PursTypeError ModuleName MultipleErrors 13 | deriving (Show) 14 | 15 | readExternsForModule :: FilePath -> ModuleName -> ExceptT ModuleProcessingError IO ExternsFile 16 | readExternsForModule dir moduleName = do 17 | let moduleNameText = T.unpack (runModuleName moduleName) 18 | externsPath = dir moduleNameText "externs.cbor" 19 | s <- liftIO $ Make.readCborFileIO externsPath 20 | case s of 21 | Nothing -> throwError (CBORDecodeError externsPath) 22 | Just externs -> return externs 23 | -------------------------------------------------------------------------------- /src/Language/PureScript/TsdGen/Types.hs: -------------------------------------------------------------------------------- 1 | {-# LANGUAGE CPP #-} 2 | {-# LANGUAGE OverloadedStrings #-} 3 | {-# LANGUAGE RecordWildCards #-} 4 | {-# LANGUAGE ScopedTypeVariables #-} 5 | module Language.PureScript.TsdGen.Types where 6 | import Control.Monad.Except 7 | import Control.Monad.Reader 8 | import Control.Monad.State 9 | import qualified Data.List as List 10 | import qualified Data.Map as Map 11 | import Data.Text (Text) 12 | import qualified Data.Text as T 13 | import qualified Language.PureScript.CodeGen.Tsd.Identifier as JS 14 | import qualified Language.PureScript.Constants.Compat as C 15 | import Language.PureScript.Environment 16 | import Language.PureScript.Errors 17 | import Language.PureScript.Kinds.Compat 18 | import Language.PureScript.Label 19 | import Language.PureScript.Names 20 | import Language.PureScript.PSString 21 | import Language.PureScript.TsdGen.Hardwired 22 | import Language.PureScript.TypeChecker.Kinds 23 | import Language.PureScript.TypeChecker.Monad 24 | import Language.PureScript.Types 25 | import Prelude hiding (elem, lookup, notElem) 26 | 27 | data Field = Field { fieldLabel :: !Label 28 | , fieldType :: !TSType 29 | , fieldIsOptional :: !Bool 30 | -- Other options: readonly 31 | } 32 | | NewSignature {- type parameters -} [Text] [TSType] TSType 33 | deriving (Eq,Show) 34 | 35 | mkField :: Label -> TSType -> Field 36 | mkField label ty = Field label ty False 37 | 38 | mkOptionalField :: Label -> TSType -> Field 39 | mkOptionalField label ty = Field label ty True 40 | 41 | data TSTypeName = QualifiedTypeName {- module id -} JS.Identifier {- name -} JS.IdentifierName 42 | | UnqualifiedTypeName {- name -} JS.Identifier 43 | deriving (Eq,Show) 44 | 45 | -- TypeScript types 46 | data TSType = TSAny 47 | | TSUndefined 48 | | TSNull 49 | | TSNever 50 | | TSNumber 51 | | TSBoolean 52 | | TSString 53 | | TSFunction {- type parameters -} [Text] {- parameter types -} [TSType] TSType 54 | | TSArray TSType 55 | | TSRecord [Field] 56 | | TSStrMap TSType -- Data.StrMap.StrMap <=> {[_: string]: T} 57 | | TSTyVar Text 58 | | TSNamed {- type name -} TSTypeName {- arguments -} [TSType] 59 | | TSStringLit PSString 60 | | TSUnion [TSType] -- empty = never 61 | | TSIntersection [TSType] -- empty = {} (all) 62 | | TSUnknown Text 63 | | TSCommented TSType Text 64 | deriving (Eq,Show) 65 | 66 | constraintToType :: SourceConstraint -> SourceType 67 | constraintToType ct = foldl (TypeApp nullSourceAnn) (TypeConstructor nullSourceAnn qDictTypeName) (constraintArgs ct) 68 | where qDictTypeName = fmap coerceProperName (constraintClass ct) 69 | 70 | data TypeTranslationContext f = TypeTranslationContext { ttcBoundTyVars :: [Text] 71 | , ttcUnboundTyVars :: [Text] 72 | , ttcScopedVarKinds :: Maybe [(Text,SourceKind)] 73 | , ttcGetModuleId :: ModuleName -> f (Maybe JS.Identifier) 74 | , ttcEnvironment :: Environment 75 | , ttcCurrentModuleName :: ModuleName 76 | } 77 | 78 | type TypeTranslationT f = ReaderT (TypeTranslationContext f) (ExceptT MultipleErrors f) 79 | 80 | tsFunction :: forall f. Monad f => (SourceType -> TypeTranslationT f TSType) -> [SourceType] -> SourceType -> TypeTranslationT f TSType 81 | tsFunction go args ret = do 82 | unbound <- asks ttcUnboundTyVars 83 | withReaderT (\r -> r { ttcBoundTyVars = ttcBoundTyVars r ++ unbound, ttcUnboundTyVars = [] }) 84 | $ TSFunction unbound <$> traverse go args <*> go ret 85 | 86 | pursTypeToTSType :: forall f. Monad f => SourceType -> TypeTranslationT f TSType 87 | pursTypeToTSType = go 88 | where 89 | go :: SourceType -> TypeTranslationT f TSType 90 | go (TypeApp _ (TypeApp _ tcon a0) r) 91 | | tcon == tyFunction || tcon == tyEffectFn1 = tsFunction go [a0] r 92 | | tcon == tyEff = tsFunction go [] r 93 | go (TypeApp _ (TypeApp _ (TypeApp _ tcon a0) a1) r) 94 | | tcon == tyFn2 || tcon == tyEffectFn2 = tsFunction go [a0,a1] r 95 | go (TypeApp _ (TypeApp _ (TypeApp _ (TypeApp _ tcon a0) a1) a2) r) 96 | | tcon == tyFn3 || tcon == tyEffectFn3 = tsFunction go [a0,a1,a2] r 97 | go (TypeApp _ (TypeApp _ (TypeApp _ (TypeApp _ (TypeApp _ tcon a0) a1) a2) a3) r) 98 | | tcon == tyFn4 || tcon == tyEffectFn4 = tsFunction go [a0,a1,a2,a3] r 99 | go (TypeApp _ (TypeApp _ (TypeApp _ (TypeApp _ (TypeApp _ (TypeApp _ tcon a0) a1) a2) a3) a4) r) 100 | | tcon == tyFn5 || tcon == tyEffectFn5 = tsFunction go [a0,a1,a2,a3,a4] r 101 | go (TypeApp _ (TypeApp _ (TypeApp _ (TypeApp _ (TypeApp _ (TypeApp _ (TypeApp _ tcon a0) a1) a2) a3) a4) a5) r) 102 | | tcon == tyFn6 || tcon == tyEffectFn6 = tsFunction go [a0,a1,a2,a3,a4,a5] r 103 | go (TypeApp _ (TypeApp _ (TypeApp _ (TypeApp _ (TypeApp _ (TypeApp _ (TypeApp _ (TypeApp _ tcon a0) a1) a2) a3) a4) a5) a6) r) 104 | | tcon == tyFn7 || tcon == tyEffectFn7 = tsFunction go [a0,a1,a2,a3,a4,a5,a6] r 105 | go (TypeApp _ (TypeApp _ (TypeApp _ (TypeApp _ (TypeApp _ (TypeApp _ (TypeApp _ (TypeApp _ (TypeApp _ tcon a0) a1) a2) a3) a4) a5) a6) a7) r) 106 | | tcon == tyFn8 || tcon == tyEffectFn8 = tsFunction go [a0,a1,a2,a3,a4,a5,a6,a7] r 107 | go (TypeApp _ (TypeApp _ (TypeApp _ (TypeApp _ (TypeApp _ (TypeApp _ (TypeApp _ (TypeApp _ (TypeApp _ (TypeApp _ tcon a0) a1) a2) a3) a4) a5) a6) a7) a8) r) 108 | | tcon == tyFn9 || tcon == tyEffectFn9 = tsFunction go [a0,a1,a2,a3,a4,a5,a6,a7,a8] r 109 | go (TypeApp _ (TypeApp _ (TypeApp _ (TypeApp _ (TypeApp _ (TypeApp _ (TypeApp _ (TypeApp _ (TypeApp _ (TypeApp _ (TypeApp _ tcon a0) a1) a2) a3) a4) a5) a6) a7) a8) a9) r) 110 | | tcon == tyFn10 || tcon == tyEffectFn10 = tsFunction go [a0,a1,a2,a3,a4,a5,a6,a7,a8,a9] r 111 | go (TypeApp _ tcon a0) 112 | | tcon == tyArray = TSArray <$> go a0 113 | | tcon == tyStrMap || tcon == tyForeignObject = TSStrMap <$> go a0 114 | | tcon == tyRecord = case rowToList a0 of 115 | (pairs, _) -> TSRecord <$> traverse (\(RowListItem { rowListLabel = label, rowListType = ty }) -> mkField label <$> go ty) pairs 116 | | tcon == tyFn0 = tsFunction go [] a0 117 | | tcon == tyEffect = tsFunction go [] a0 118 | | tcon == tyVariant = case rowToList a0 of 119 | (pairs, _) -> TSUnion <$> traverse (\(RowListItem { rowListLabel = label, rowListType = ty }) -> (\ty' -> TSRecord [mkField "type" (TSStringLit $ runLabel label), mkField "value" ty']) <$> go ty) pairs 120 | | tcon == tyNullable = (\ty -> TSUnion [ty, TSNull]) <$> go a0 121 | #if MIN_VERSION_purescript(0, 15, 10) 122 | go ty@(ForAll _ _ name _kind inner _) = getKindsIn ty $ \kinds -> 123 | #else 124 | go ty@(ForAll _ name _kind inner _) = getKindsIn ty $ \kinds -> 125 | #endif 126 | if List.lookup name kinds == Just kindType 127 | then withReaderT (\r -> r { ttcUnboundTyVars = name : ttcUnboundTyVars r }) (go inner) 128 | else go inner 129 | go (TypeVar _ name) = do 130 | isBound <- asks (\r -> List.elem name (ttcBoundTyVars r)) 131 | if isBound 132 | then pure (TSTyVar name) 133 | else pure (TSUnknown $ "type variable " <> name) 134 | go ty@(TypeConstructor _ _qName) 135 | | ty == tyString = pure TSString 136 | | ty == tyChar = pure TSString 137 | | ty == tyNumber = pure TSNumber 138 | | ty == tyInt = pure TSNumber 139 | | ty == tyBoolean = pure TSBoolean 140 | go ty@(TypeApp _ s t) = do 141 | s' <- go s 142 | t' <- go t 143 | case s' of 144 | TSNamed n a -> pure (TSNamed n (a ++ [t'])) 145 | _ -> pure (TSUnknown $ T.pack $ show ty) 146 | #if MIN_VERSION_purescript(0, 15, 3) 147 | go ty@(TypeConstructor _ (Qualified (ByModuleName C.Prim) typeName)) = do 148 | #else 149 | go ty@(TypeConstructor _ (Qualified (Just C.Prim) typeName)) = do 150 | #endif 151 | case typeName of 152 | ProperName "Partial" -> pure (TSUnknown "Prim.Partial") 153 | _ -> pure (TSUnknown $ T.pack $ show ty) 154 | #if MIN_VERSION_purescript(0, 15, 3) 155 | go ty@(TypeConstructor _ qName@(Qualified (ByModuleName moduleName) typeName)) = do 156 | #else 157 | go ty@(TypeConstructor _ qName@(Qualified (Just moduleName) typeName)) = do 158 | #endif 159 | ti <- asks (Map.lookup qName . types . ttcEnvironment) 160 | case ti of 161 | Just (k, _) | isSimpleKind k -> do 162 | getModuleId <- asks ttcGetModuleId 163 | moduleId <- lift (lift (getModuleId moduleName)) 164 | let tsTypeName = case moduleId of 165 | Nothing -> UnqualifiedTypeName $ JS.properToJs typeName 166 | Just moduleId' -> QualifiedTypeName moduleId' $ JS.toIdentifierName $ JS.properToJs typeName 167 | pure $ TSNamed tsTypeName [] 168 | _ -> pure (TSUnknown $ T.pack $ show ty) 169 | go (ConstrainedType _ ct inner) = tsFunction go [constraintToType ct] inner 170 | go ty = pure (TSUnknown $ T.pack $ show ty) 171 | 172 | getKindsIn :: SourceType -> ([(Text,SourceKind)] -> TypeTranslationT f r) -> TypeTranslationT f r 173 | getKindsIn ty m = do 174 | mkinds <- asks ttcScopedVarKinds 175 | case mkinds of 176 | Just kinds -> m kinds 177 | Nothing -> do 178 | checkState <- asks (\TypeTranslationContext{..} -> 179 | #if MIN_VERSION_purescript(0, 15, 3) 180 | let insertLocalTyVar env v = Map.insert (Qualified (ByModuleName ttcCurrentModuleName) (ProperName v)) (kindType, LocalTypeVariable) env 181 | #else 182 | let insertLocalTyVar env v = Map.insert (Qualified (Just ttcCurrentModuleName) (ProperName v)) (kindType, LocalTypeVariable) env 183 | #endif 184 | env' = ttcEnvironment { types = foldl insertLocalTyVar (types ttcEnvironment) ttcBoundTyVars } 185 | in (emptyCheckState env') { checkCurrentModule = Just ttcCurrentModuleName }) 186 | case runExcept (evalStateT (kindOfWithScopedVars ty) checkState) of 187 | Left err -> throwError err 188 | Right ((kinds,_ty'),kind) 189 | | kind == kindType -> withReaderT (\r -> r { ttcScopedVarKinds = Just kinds }) (m kinds) 190 | | otherwise -> throwError (errorMessage (ExpectedType ty kind)) 191 | 192 | -- SimpleKind :: (Type -> )* Type 193 | isSimpleKind :: SourceKind -> Bool 194 | isSimpleKind k | k == kindType = True 195 | isSimpleKind (FunKind _ s t) = s == kindType && isSimpleKind t 196 | isSimpleKind _ = False 197 | 198 | numberOfTypeParams :: SourceKind -> Int 199 | numberOfTypeParams k | k == kindType = 0 200 | numberOfTypeParams (FunKind _ s t) | s == kindType = numberOfTypeParams t + 1 201 | numberOfTypeParams _ = 0 -- invalid 202 | 203 | -- LessSimpleKind :: (SimpleKind -> )* Type 204 | isLessSimpleKind :: SourceKind -> Bool 205 | isLessSimpleKind k | k == kindType = True 206 | isLessSimpleKind (FunKind _ s t) = isSimpleKind s && isLessSimpleKind t 207 | isLessSimpleKind _ = False 208 | 209 | extractTypes :: SourceKind -> [(a, Maybe SourceKind)] -> Maybe [a] 210 | extractTypes k [] | k == kindType = return [] 211 | extractTypes (FunKind _ kind1 r) ((name,kind2):xs) 212 | | kind1 == kindType && (kind2 == Just kindType || kind2 == Nothing) = (name :) <$> extractTypes r xs 213 | | otherwise = extractTypes r xs -- ?? 214 | extractTypes _ _ = Nothing 215 | -------------------------------------------------------------------------------- /stack-purs0.15.0.yaml: -------------------------------------------------------------------------------- 1 | resolver: lts-18.15 2 | 3 | packages: 4 | - . 5 | 6 | extra-deps: 7 | - purescript-0.15.0 8 | - language-javascript-0.7.0.0 9 | - hspec-2.8.3 10 | - hspec-core-2.8.3 11 | - hspec-discover-2.8.3 12 | - process-1.6.13.1 13 | - Cabal-3.2.1.0 14 | - monoidal-containers-0.6.2.0 15 | 16 | flags: 17 | aeson-pretty: 18 | lib-only: true 19 | these: 20 | assoc: false 21 | haskeline: 22 | terminfo: false 23 | -------------------------------------------------------------------------------- /stack-purs0.15.10.yaml: -------------------------------------------------------------------------------- 1 | resolver: lts-20.9 2 | 3 | packages: 4 | - . 5 | 6 | extra-deps: 7 | - purescript-0.15.10 8 | - language-javascript-0.7.0.0 9 | - hspec-2.10.9 10 | - hspec-core-2.10.9 11 | - hspec-discover-2.10.9 12 | - process-1.6.13.1 13 | - Cabal-3.6.3.0 14 | 15 | flags: 16 | aeson-pretty: 17 | lib-only: true 18 | these: 19 | assoc: false 20 | haskeline: 21 | terminfo: false 22 | -------------------------------------------------------------------------------- /stack-purs0.15.12.yaml: -------------------------------------------------------------------------------- 1 | resolver: lts-20.9 2 | 3 | packages: 4 | - . 5 | 6 | extra-deps: 7 | - purescript-0.15.12 8 | - language-javascript-0.7.0.0 9 | - hspec-2.10.9 10 | - hspec-core-2.10.9 11 | - hspec-discover-2.10.9 12 | - process-1.6.13.1 13 | - Cabal-3.6.3.0 14 | 15 | flags: 16 | aeson-pretty: 17 | lib-only: true 18 | these: 19 | assoc: false 20 | haskeline: 21 | terminfo: false 22 | -------------------------------------------------------------------------------- /stack-purs0.15.13.yaml: -------------------------------------------------------------------------------- 1 | resolver: lts-20.9 2 | 3 | packages: 4 | - . 5 | 6 | extra-deps: 7 | - purescript-0.15.13 8 | - language-javascript-0.7.0.0 9 | - hspec-2.10.9 10 | - hspec-core-2.10.9 11 | - hspec-discover-2.10.9 12 | - process-1.6.13.1 13 | - Cabal-3.6.3.0 14 | 15 | flags: 16 | aeson-pretty: 17 | lib-only: true 18 | these: 19 | assoc: false 20 | haskeline: 21 | terminfo: false 22 | -------------------------------------------------------------------------------- /stack-purs0.15.14.yaml: -------------------------------------------------------------------------------- 1 | resolver: lts-20.9 2 | 3 | packages: 4 | - . 5 | 6 | extra-deps: 7 | - purescript-0.15.14 8 | - language-javascript-0.7.0.0 9 | - hspec-2.10.9 10 | - hspec-core-2.10.9 11 | - hspec-discover-2.10.9 12 | - process-1.6.13.1 13 | - Cabal-3.6.3.0 14 | 15 | flags: 16 | aeson-pretty: 17 | lib-only: true 18 | these: 19 | assoc: false 20 | haskeline: 21 | terminfo: false 22 | -------------------------------------------------------------------------------- /stack-purs0.15.15.yaml: -------------------------------------------------------------------------------- 1 | resolver: lts-20.9 2 | 3 | packages: 4 | - . 5 | 6 | extra-deps: 7 | - purescript-0.15.15 8 | - language-javascript-0.7.0.0 9 | - hspec-2.10.9 10 | - hspec-core-2.10.9 11 | - hspec-discover-2.10.9 12 | - process-1.6.13.1 13 | - Cabal-3.6.3.0 14 | 15 | flags: 16 | aeson-pretty: 17 | lib-only: true 18 | these: 19 | assoc: false 20 | haskeline: 21 | terminfo: false 22 | -------------------------------------------------------------------------------- /stack-purs0.15.2.yaml: -------------------------------------------------------------------------------- 1 | resolver: lts-18.15 2 | 3 | packages: 4 | - . 5 | 6 | extra-deps: 7 | - purescript-0.15.2 8 | - language-javascript-0.7.0.0 9 | - hspec-2.8.3 10 | - hspec-core-2.8.3 11 | - hspec-discover-2.8.3 12 | - process-1.6.13.1 13 | - Cabal-3.2.1.0 14 | - monoidal-containers-0.6.2.0 15 | 16 | flags: 17 | aeson-pretty: 18 | lib-only: true 19 | these: 20 | assoc: false 21 | haskeline: 22 | terminfo: false 23 | -------------------------------------------------------------------------------- /stack-purs0.15.3.yaml: -------------------------------------------------------------------------------- 1 | resolver: nightly-2022-06-09 2 | 3 | packages: 4 | - . 5 | 6 | extra-deps: 7 | - purescript-0.15.3 8 | - protolude-0.3.1 9 | - language-javascript-0.7.0.0 10 | - hspec-2.9.2 11 | - hspec-core-2.9.2 12 | - hspec-discover-2.9.2 13 | - process-1.6.13.1 14 | - Cabal-3.6.3.0 15 | 16 | flags: 17 | aeson-pretty: 18 | lib-only: true 19 | these: 20 | assoc: false 21 | haskeline: 22 | terminfo: false 23 | -------------------------------------------------------------------------------- /stack-purs0.15.4.yaml: -------------------------------------------------------------------------------- 1 | resolver: nightly-2022-06-09 2 | 3 | packages: 4 | - . 5 | 6 | extra-deps: 7 | - purescript-0.15.4 8 | - protolude-0.3.2 9 | - language-javascript-0.7.0.0 10 | - hspec-2.9.2 11 | - hspec-core-2.9.2 12 | - hspec-discover-2.9.2 13 | - process-1.6.13.1 14 | - Cabal-3.6.3.0 15 | 16 | flags: 17 | aeson-pretty: 18 | lib-only: true 19 | these: 20 | assoc: false 21 | haskeline: 22 | terminfo: false 23 | -------------------------------------------------------------------------------- /stack-purs0.15.5.yaml: -------------------------------------------------------------------------------- 1 | resolver: nightly-2022-06-09 2 | 3 | packages: 4 | - . 5 | 6 | extra-deps: 7 | - purescript-0.15.5 8 | - protolude-0.3.1 9 | - language-javascript-0.7.0.0 10 | - hspec-2.9.2 11 | - hspec-core-2.9.2 12 | - hspec-discover-2.9.2 13 | - process-1.6.13.1 14 | - Cabal-3.6.3.0 15 | 16 | flags: 17 | aeson-pretty: 18 | lib-only: true 19 | these: 20 | assoc: false 21 | haskeline: 22 | terminfo: false 23 | -------------------------------------------------------------------------------- /stack-purs0.15.6.yaml: -------------------------------------------------------------------------------- 1 | resolver: nightly-2022-06-09 2 | 3 | packages: 4 | - . 5 | 6 | extra-deps: 7 | - purescript-0.15.6 8 | - protolude-0.3.1 9 | - language-javascript-0.7.0.0 10 | - hspec-2.9.2 11 | - hspec-core-2.9.2 12 | - hspec-discover-2.9.2 13 | - process-1.6.13.1 14 | - Cabal-3.6.3.0 15 | 16 | flags: 17 | aeson-pretty: 18 | lib-only: true 19 | these: 20 | assoc: false 21 | haskeline: 22 | terminfo: false 23 | -------------------------------------------------------------------------------- /stack-purs0.15.7.yaml: -------------------------------------------------------------------------------- 1 | resolver: nightly-2022-11-12 2 | 3 | packages: 4 | - . 5 | 6 | extra-deps: 7 | - purescript-0.15.7 8 | - protolude-0.3.1 9 | - language-javascript-0.7.0.0 10 | - hspec-2.9.2 11 | - hspec-core-2.9.2 12 | - hspec-discover-2.9.2 13 | - process-1.6.13.1 14 | - Cabal-3.6.3.0 15 | 16 | flags: 17 | aeson-pretty: 18 | lib-only: true 19 | these: 20 | assoc: false 21 | haskeline: 22 | terminfo: false 23 | -------------------------------------------------------------------------------- /stack-purs0.15.8.yaml: -------------------------------------------------------------------------------- 1 | resolver: lts-20.9 2 | 3 | packages: 4 | - . 5 | 6 | extra-deps: 7 | - purescript-0.15.8 8 | - language-javascript-0.7.0.0 9 | - hspec-2.10.9 10 | - hspec-core-2.10.9 11 | - hspec-discover-2.10.9 12 | - process-1.6.13.1 13 | - Cabal-3.6.3.0 14 | 15 | flags: 16 | aeson-pretty: 17 | lib-only: true 18 | these: 19 | assoc: false 20 | haskeline: 21 | terminfo: false 22 | -------------------------------------------------------------------------------- /stack-purs0.15.9.yaml: -------------------------------------------------------------------------------- 1 | resolver: lts-20.9 2 | 3 | packages: 4 | - . 5 | 6 | extra-deps: 7 | - purescript-0.15.9 8 | - language-javascript-0.7.0.0 9 | - hspec-2.10.9 10 | - hspec-core-2.10.9 11 | - hspec-discover-2.10.9 12 | - process-1.6.13.1 13 | - Cabal-3.6.3.0 14 | 15 | flags: 16 | aeson-pretty: 17 | lib-only: true 18 | these: 19 | assoc: false 20 | haskeline: 21 | terminfo: false 22 | --------------------------------------------------------------------------------