├── .github └── ci.yml ├── .gitignore ├── .npmignore ├── LICENSE ├── README.md ├── cli ├── index.js └── src │ └── Main.purs ├── package-lock.json ├── package.json ├── packages.dhall ├── spago.dhall ├── src └── Suggest.purs └── test └── Main.purs /.github/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: [master] 6 | pull_request: 7 | branches: [master] 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/checkout@v2 14 | 15 | - uses: actions/setup-node@v2 16 | with: 17 | node-version: "18.x" 18 | 19 | - name: Install dependencies 20 | run: npm install 21 | 22 | - name: Build source 23 | run: npm run build 24 | 25 | - name: Run tests 26 | run: npm run test 27 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules/ 2 | /output/ 3 | /.psci* 4 | /src/.webpack.js 5 | /.spago 6 | /.purs-repl 7 | .psc-ide-port 8 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | /.github/ 2 | /.spago/ 3 | /.psci* 4 | /output/*/externs.cbor 5 | /output/cache-db.json 6 | *.dhall 7 | /.psc-ide-port 8 | /.purs-repl 9 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 Nicholas Wolverson 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # purescript-suggest 2 | 3 | Command line tool (and library) to apply the suggested fixes from `psc` for warnings, such as 4 | removing redundant imports, or making imports explicit. 5 | 6 | # Installation 7 | 8 | To install `ps-suggest` globally: 9 | ``` 10 | npm install -g purescript-suggest 11 | ``` 12 | 13 | ## Usage 14 | Pipe the JSON compiler output to stdin of `ps-suggest`. You probably want to use 15 | `psa`, possibly with a warning stash and almost certainly filtering out library 16 | errors. This also gives you the chance to choose which codes to replace. 17 | 18 | To check changes that will be applied: 19 | ``` 20 | pulp build -- --stash --censor-lib --json-errors 2>&1 | ps-suggest --list 21 | ``` 22 | 23 | To apply the changes to all affected files: 24 | ``` 25 | pulp build -- --stash --censor-lib --json-errors 2>&1 | ps-suggest --apply 26 | ``` 27 | 28 | # Warning 29 | 30 | This is a tool that modifies your source code in place by design. Errors in 31 | this code, or any issues with the warnings passed in, could result in the deletion 32 | of your precious source code. As always it's a good idea to commit your code periodically. 33 | 34 | # Library usage 35 | 36 | Install `purescript-suggest` via bower and use something like `Publish.applySuggestions`, which takes 37 | already parsed errors ala `purescript-psa`. 38 | -------------------------------------------------------------------------------- /cli/index.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | import { main } from '../output/Main/index.js'; 3 | main(); 4 | -------------------------------------------------------------------------------- /cli/src/Main.purs: -------------------------------------------------------------------------------- 1 | module Main where 2 | 3 | import Prelude 4 | 5 | import Data.Argonaut.Decode (decodeJson, printJsonDecodeError) 6 | import Data.Argonaut.Parser (jsonParser) 7 | import Data.Array (length, drop) 8 | import Data.Bifunctor (lmap) 9 | import Data.Either (Either(Right)) 10 | import Data.Foldable (for_) 11 | import Data.String (split, Pattern(..)) 12 | import Effect (Effect) 13 | import Effect.Console (error, log) 14 | import Effect.Ref as Ref 15 | import Node.Encoding (Encoding(UTF8)) 16 | import Node.Process (stdin, argv) 17 | import Node.Stream (onEnd, onDataString) 18 | import Psa (parsePsaResult) 19 | import Suggest (listSuggestions, applySuggestions) 20 | 21 | data Action = Apply | List | Help Boolean 22 | 23 | parseArgs :: Effect Action 24 | parseArgs = do 25 | argv <- drop 2 <$> argv 26 | pure $ case argv of 27 | [ "--apply" ] -> Apply 28 | [ "--list" ] -> List 29 | [] -> List 30 | [ "--help" ] -> Help false 31 | _ -> Help true 32 | 33 | main :: Effect Unit 34 | main = do 35 | action <- parseArgs 36 | case action of 37 | Help isUnrecognised -> do 38 | when isUnrecognised $ error "Unrecognised arguments" 39 | log "Usage: ps-suggest [--list | --apply]\nJSON compiler errors must be supplied on stdin. You probably want to pipe these from psa." 40 | _ -> do 41 | inputRef <- Ref.new "" 42 | onDataString stdin UTF8 $ \s -> do 43 | Ref.modify_ (_ <> s) inputRef 44 | onEnd stdin do 45 | input <- Ref.read inputRef 46 | foundSuggestions <- Ref.new false 47 | for_ (split (Pattern "\n") input) \line -> do 48 | let parsedJson = jsonParser line >>= decodeJson >>> lmap printJsonDecodeError >>= parsePsaResult 49 | case parsedJson of 50 | Right { warnings } | length warnings > 0 -> do 51 | Ref.write true foundSuggestions 52 | case action of 53 | List -> listSuggestions warnings >>= log 54 | Apply -> applySuggestions warnings 55 | _ -> pure unit 56 | _ -> pure unit 57 | Ref.read foundSuggestions >>= \found -> 58 | unless found $ log "No suggestions found." 59 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "purescript-suggest", 3 | "version": "2.3.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "purescript-suggest", 9 | "version": "2.3.0", 10 | "license": "MIT", 11 | "bin": { 12 | "ps-suggest": "cli/index.js" 13 | }, 14 | "devDependencies": { 15 | "purescript": "^0.15.9", 16 | "spago": "^0.21.0" 17 | } 18 | }, 19 | "node_modules/@gar/promisify": { 20 | "version": "1.1.3", 21 | "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", 22 | "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", 23 | "dev": true 24 | }, 25 | "node_modules/@isaacs/cliui": { 26 | "version": "8.0.2", 27 | "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", 28 | "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", 29 | "dev": true, 30 | "dependencies": { 31 | "string-width": "^5.1.2", 32 | "string-width-cjs": "npm:string-width@^4.2.0", 33 | "strip-ansi": "^7.0.1", 34 | "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", 35 | "wrap-ansi": "^8.1.0", 36 | "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" 37 | }, 38 | "engines": { 39 | "node": ">=12" 40 | } 41 | }, 42 | "node_modules/@isaacs/cliui/node_modules/ansi-regex": { 43 | "version": "6.0.1", 44 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", 45 | "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", 46 | "dev": true, 47 | "engines": { 48 | "node": ">=12" 49 | }, 50 | "funding": { 51 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 52 | } 53 | }, 54 | "node_modules/@isaacs/cliui/node_modules/ansi-styles": { 55 | "version": "6.2.1", 56 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 57 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 58 | "dev": true, 59 | "engines": { 60 | "node": ">=12" 61 | }, 62 | "funding": { 63 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 64 | } 65 | }, 66 | "node_modules/@isaacs/cliui/node_modules/emoji-regex": { 67 | "version": "9.2.2", 68 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 69 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", 70 | "dev": true 71 | }, 72 | "node_modules/@isaacs/cliui/node_modules/string-width": { 73 | "version": "5.1.2", 74 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 75 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 76 | "dev": true, 77 | "dependencies": { 78 | "eastasianwidth": "^0.2.0", 79 | "emoji-regex": "^9.2.2", 80 | "strip-ansi": "^7.0.1" 81 | }, 82 | "engines": { 83 | "node": ">=12" 84 | }, 85 | "funding": { 86 | "url": "https://github.com/sponsors/sindresorhus" 87 | } 88 | }, 89 | "node_modules/@isaacs/cliui/node_modules/strip-ansi": { 90 | "version": "7.0.1", 91 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", 92 | "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", 93 | "dev": true, 94 | "dependencies": { 95 | "ansi-regex": "^6.0.1" 96 | }, 97 | "engines": { 98 | "node": ">=12" 99 | }, 100 | "funding": { 101 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 102 | } 103 | }, 104 | "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { 105 | "version": "8.1.0", 106 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", 107 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 108 | "dev": true, 109 | "dependencies": { 110 | "ansi-styles": "^6.1.0", 111 | "string-width": "^5.0.1", 112 | "strip-ansi": "^7.0.1" 113 | }, 114 | "engines": { 115 | "node": ">=12" 116 | }, 117 | "funding": { 118 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 119 | } 120 | }, 121 | "node_modules/@npmcli/fs": { 122 | "version": "2.1.2", 123 | "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", 124 | "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", 125 | "dev": true, 126 | "dependencies": { 127 | "@gar/promisify": "^1.1.3", 128 | "semver": "^7.3.5" 129 | }, 130 | "engines": { 131 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 132 | } 133 | }, 134 | "node_modules/@npmcli/move-file": { 135 | "version": "2.0.1", 136 | "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", 137 | "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", 138 | "deprecated": "This functionality has been moved to @npmcli/fs", 139 | "dev": true, 140 | "dependencies": { 141 | "mkdirp": "^1.0.4", 142 | "rimraf": "^3.0.2" 143 | }, 144 | "engines": { 145 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 146 | } 147 | }, 148 | "node_modules/@npmcli/move-file/node_modules/mkdirp": { 149 | "version": "1.0.4", 150 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 151 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", 152 | "dev": true, 153 | "bin": { 154 | "mkdirp": "bin/cmd.js" 155 | }, 156 | "engines": { 157 | "node": ">=10" 158 | } 159 | }, 160 | "node_modules/@npmcli/move-file/node_modules/rimraf": { 161 | "version": "3.0.2", 162 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 163 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 164 | "dev": true, 165 | "dependencies": { 166 | "glob": "^7.1.3" 167 | }, 168 | "bin": { 169 | "rimraf": "bin.js" 170 | }, 171 | "funding": { 172 | "url": "https://github.com/sponsors/isaacs" 173 | } 174 | }, 175 | "node_modules/@pkgjs/parseargs": { 176 | "version": "0.11.0", 177 | "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", 178 | "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", 179 | "dev": true, 180 | "optional": true, 181 | "engines": { 182 | "node": ">=14" 183 | } 184 | }, 185 | "node_modules/@tootallnate/once": { 186 | "version": "2.0.0", 187 | "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", 188 | "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", 189 | "dev": true, 190 | "engines": { 191 | "node": ">= 10" 192 | } 193 | }, 194 | "node_modules/agent-base": { 195 | "version": "6.0.2", 196 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 197 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 198 | "dev": true, 199 | "dependencies": { 200 | "debug": "4" 201 | }, 202 | "engines": { 203 | "node": ">= 6.0.0" 204 | } 205 | }, 206 | "node_modules/agentkeepalive": { 207 | "version": "4.3.0", 208 | "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz", 209 | "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==", 210 | "dev": true, 211 | "dependencies": { 212 | "debug": "^4.1.0", 213 | "depd": "^2.0.0", 214 | "humanize-ms": "^1.2.1" 215 | }, 216 | "engines": { 217 | "node": ">= 8.0.0" 218 | } 219 | }, 220 | "node_modules/aggregate-error": { 221 | "version": "3.1.0", 222 | "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", 223 | "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", 224 | "dev": true, 225 | "dependencies": { 226 | "clean-stack": "^2.0.0", 227 | "indent-string": "^4.0.0" 228 | }, 229 | "engines": { 230 | "node": ">=8" 231 | } 232 | }, 233 | "node_modules/ansi-escapes": { 234 | "version": "4.3.2", 235 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", 236 | "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", 237 | "dev": true, 238 | "dependencies": { 239 | "type-fest": "^0.21.3" 240 | }, 241 | "engines": { 242 | "node": ">=8" 243 | }, 244 | "funding": { 245 | "url": "https://github.com/sponsors/sindresorhus" 246 | } 247 | }, 248 | "node_modules/ansi-regex": { 249 | "version": "5.0.1", 250 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 251 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 252 | "dev": true, 253 | "engines": { 254 | "node": ">=8" 255 | } 256 | }, 257 | "node_modules/ansi-styles": { 258 | "version": "3.2.1", 259 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 260 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 261 | "dev": true, 262 | "dependencies": { 263 | "color-convert": "^1.9.0" 264 | }, 265 | "engines": { 266 | "node": ">=4" 267 | } 268 | }, 269 | "node_modules/aproba": { 270 | "version": "1.2.0", 271 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", 272 | "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", 273 | "dev": true 274 | }, 275 | "node_modules/astral-regex": { 276 | "version": "2.0.0", 277 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", 278 | "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", 279 | "dev": true, 280 | "engines": { 281 | "node": ">=8" 282 | } 283 | }, 284 | "node_modules/balanced-match": { 285 | "version": "1.0.2", 286 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 287 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 288 | "dev": true 289 | }, 290 | "node_modules/bluebird": { 291 | "version": "3.7.2", 292 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", 293 | "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", 294 | "dev": true 295 | }, 296 | "node_modules/brace-expansion": { 297 | "version": "1.1.11", 298 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 299 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 300 | "dev": true, 301 | "dependencies": { 302 | "balanced-match": "^1.0.0", 303 | "concat-map": "0.0.1" 304 | } 305 | }, 306 | "node_modules/buffer-from": { 307 | "version": "1.1.2", 308 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 309 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", 310 | "dev": true 311 | }, 312 | "node_modules/byline": { 313 | "version": "5.0.0", 314 | "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", 315 | "integrity": "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==", 316 | "dev": true, 317 | "engines": { 318 | "node": ">=0.10.0" 319 | } 320 | }, 321 | "node_modules/cacache": { 322 | "version": "11.3.3", 323 | "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz", 324 | "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==", 325 | "dev": true, 326 | "dependencies": { 327 | "bluebird": "^3.5.5", 328 | "chownr": "^1.1.1", 329 | "figgy-pudding": "^3.5.1", 330 | "glob": "^7.1.4", 331 | "graceful-fs": "^4.1.15", 332 | "lru-cache": "^5.1.1", 333 | "mississippi": "^3.0.0", 334 | "mkdirp": "^0.5.1", 335 | "move-concurrently": "^1.0.1", 336 | "promise-inflight": "^1.0.1", 337 | "rimraf": "^2.6.3", 338 | "ssri": "^6.0.1", 339 | "unique-filename": "^1.1.1", 340 | "y18n": "^4.0.0" 341 | } 342 | }, 343 | "node_modules/chalk": { 344 | "version": "2.4.2", 345 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 346 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 347 | "dev": true, 348 | "dependencies": { 349 | "ansi-styles": "^3.2.1", 350 | "escape-string-regexp": "^1.0.5", 351 | "supports-color": "^5.3.0" 352 | }, 353 | "engines": { 354 | "node": ">=4" 355 | } 356 | }, 357 | "node_modules/chownr": { 358 | "version": "1.1.4", 359 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", 360 | "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", 361 | "dev": true 362 | }, 363 | "node_modules/clean-stack": { 364 | "version": "2.2.0", 365 | "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", 366 | "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", 367 | "dev": true, 368 | "engines": { 369 | "node": ">=6" 370 | } 371 | }, 372 | "node_modules/cli-cursor": { 373 | "version": "3.1.0", 374 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", 375 | "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", 376 | "dev": true, 377 | "dependencies": { 378 | "restore-cursor": "^3.1.0" 379 | }, 380 | "engines": { 381 | "node": ">=8" 382 | } 383 | }, 384 | "node_modules/color-convert": { 385 | "version": "1.9.3", 386 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 387 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 388 | "dev": true, 389 | "dependencies": { 390 | "color-name": "1.1.3" 391 | } 392 | }, 393 | "node_modules/color-name": { 394 | "version": "1.1.3", 395 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 396 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", 397 | "dev": true 398 | }, 399 | "node_modules/concat-map": { 400 | "version": "0.0.1", 401 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 402 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 403 | "dev": true 404 | }, 405 | "node_modules/concat-stream": { 406 | "version": "1.6.2", 407 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 408 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 409 | "dev": true, 410 | "engines": [ 411 | "node >= 0.8" 412 | ], 413 | "dependencies": { 414 | "buffer-from": "^1.0.0", 415 | "inherits": "^2.0.3", 416 | "readable-stream": "^2.2.2", 417 | "typedarray": "^0.0.6" 418 | } 419 | }, 420 | "node_modules/copy-concurrently": { 421 | "version": "1.0.5", 422 | "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", 423 | "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", 424 | "dev": true, 425 | "dependencies": { 426 | "aproba": "^1.1.1", 427 | "fs-write-stream-atomic": "^1.0.8", 428 | "iferr": "^0.1.5", 429 | "mkdirp": "^0.5.1", 430 | "rimraf": "^2.5.4", 431 | "run-queue": "^1.0.0" 432 | } 433 | }, 434 | "node_modules/core-util-is": { 435 | "version": "1.0.3", 436 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", 437 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", 438 | "dev": true 439 | }, 440 | "node_modules/cross-spawn": { 441 | "version": "7.0.3", 442 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 443 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 444 | "dev": true, 445 | "dependencies": { 446 | "path-key": "^3.1.0", 447 | "shebang-command": "^2.0.0", 448 | "which": "^2.0.1" 449 | }, 450 | "engines": { 451 | "node": ">= 8" 452 | } 453 | }, 454 | "node_modules/cross-spawn/node_modules/which": { 455 | "version": "2.0.2", 456 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 457 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 458 | "dev": true, 459 | "dependencies": { 460 | "isexe": "^2.0.0" 461 | }, 462 | "bin": { 463 | "node-which": "bin/node-which" 464 | }, 465 | "engines": { 466 | "node": ">= 8" 467 | } 468 | }, 469 | "node_modules/cyclist": { 470 | "version": "1.0.1", 471 | "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", 472 | "integrity": "sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A==", 473 | "dev": true 474 | }, 475 | "node_modules/debug": { 476 | "version": "4.3.4", 477 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 478 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 479 | "dev": true, 480 | "dependencies": { 481 | "ms": "2.1.2" 482 | }, 483 | "engines": { 484 | "node": ">=6.0" 485 | }, 486 | "peerDependenciesMeta": { 487 | "supports-color": { 488 | "optional": true 489 | } 490 | } 491 | }, 492 | "node_modules/debug/node_modules/ms": { 493 | "version": "2.1.2", 494 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 495 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 496 | "dev": true 497 | }, 498 | "node_modules/depd": { 499 | "version": "2.0.0", 500 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 501 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 502 | "dev": true, 503 | "engines": { 504 | "node": ">= 0.8" 505 | } 506 | }, 507 | "node_modules/duplexify": { 508 | "version": "3.7.1", 509 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", 510 | "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", 511 | "dev": true, 512 | "dependencies": { 513 | "end-of-stream": "^1.0.0", 514 | "inherits": "^2.0.1", 515 | "readable-stream": "^2.0.0", 516 | "stream-shift": "^1.0.0" 517 | } 518 | }, 519 | "node_modules/eastasianwidth": { 520 | "version": "0.2.0", 521 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 522 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", 523 | "dev": true 524 | }, 525 | "node_modules/emoji-regex": { 526 | "version": "8.0.0", 527 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 528 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 529 | "dev": true 530 | }, 531 | "node_modules/encoding": { 532 | "version": "0.1.13", 533 | "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", 534 | "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", 535 | "dev": true, 536 | "optional": true, 537 | "dependencies": { 538 | "iconv-lite": "^0.6.2" 539 | } 540 | }, 541 | "node_modules/end-of-stream": { 542 | "version": "1.4.4", 543 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 544 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 545 | "dev": true, 546 | "dependencies": { 547 | "once": "^1.4.0" 548 | } 549 | }, 550 | "node_modules/env-paths": { 551 | "version": "2.2.1", 552 | "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", 553 | "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", 554 | "dev": true, 555 | "engines": { 556 | "node": ">=6" 557 | } 558 | }, 559 | "node_modules/err-code": { 560 | "version": "2.0.3", 561 | "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", 562 | "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", 563 | "dev": true 564 | }, 565 | "node_modules/escape-string-regexp": { 566 | "version": "1.0.5", 567 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 568 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 569 | "dev": true, 570 | "engines": { 571 | "node": ">=0.8.0" 572 | } 573 | }, 574 | "node_modules/execa": { 575 | "version": "2.1.0", 576 | "resolved": "https://registry.npmjs.org/execa/-/execa-2.1.0.tgz", 577 | "integrity": "sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==", 578 | "dev": true, 579 | "dependencies": { 580 | "cross-spawn": "^7.0.0", 581 | "get-stream": "^5.0.0", 582 | "is-stream": "^2.0.0", 583 | "merge-stream": "^2.0.0", 584 | "npm-run-path": "^3.0.0", 585 | "onetime": "^5.1.0", 586 | "p-finally": "^2.0.0", 587 | "signal-exit": "^3.0.2", 588 | "strip-final-newline": "^2.0.0" 589 | }, 590 | "engines": { 591 | "node": "^8.12.0 || >=9.7.0" 592 | } 593 | }, 594 | "node_modules/figgy-pudding": { 595 | "version": "3.5.2", 596 | "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", 597 | "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", 598 | "dev": true 599 | }, 600 | "node_modules/filesize": { 601 | "version": "4.2.1", 602 | "resolved": "https://registry.npmjs.org/filesize/-/filesize-4.2.1.tgz", 603 | "integrity": "sha512-bP82Hi8VRZX/TUBKfE24iiUGsB/sfm2WUrwTQyAzQrhO3V9IhcBBNBXMyzLY5orACxRyYJ3d2HeRVX+eFv4lmA==", 604 | "dev": true, 605 | "engines": { 606 | "node": ">= 0.4.0" 607 | } 608 | }, 609 | "node_modules/flush-write-stream": { 610 | "version": "1.1.1", 611 | "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", 612 | "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", 613 | "dev": true, 614 | "dependencies": { 615 | "inherits": "^2.0.3", 616 | "readable-stream": "^2.3.6" 617 | } 618 | }, 619 | "node_modules/foreground-child": { 620 | "version": "3.1.1", 621 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", 622 | "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", 623 | "dev": true, 624 | "dependencies": { 625 | "cross-spawn": "^7.0.0", 626 | "signal-exit": "^4.0.1" 627 | }, 628 | "engines": { 629 | "node": ">=14" 630 | }, 631 | "funding": { 632 | "url": "https://github.com/sponsors/isaacs" 633 | } 634 | }, 635 | "node_modules/foreground-child/node_modules/signal-exit": { 636 | "version": "4.0.2", 637 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", 638 | "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", 639 | "dev": true, 640 | "engines": { 641 | "node": ">=14" 642 | }, 643 | "funding": { 644 | "url": "https://github.com/sponsors/isaacs" 645 | } 646 | }, 647 | "node_modules/from2": { 648 | "version": "2.3.0", 649 | "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", 650 | "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", 651 | "dev": true, 652 | "dependencies": { 653 | "inherits": "^2.0.1", 654 | "readable-stream": "^2.0.0" 655 | } 656 | }, 657 | "node_modules/fs-minipass": { 658 | "version": "2.1.0", 659 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", 660 | "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", 661 | "dev": true, 662 | "dependencies": { 663 | "minipass": "^3.0.0" 664 | }, 665 | "engines": { 666 | "node": ">= 8" 667 | } 668 | }, 669 | "node_modules/fs-write-stream-atomic": { 670 | "version": "1.0.10", 671 | "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", 672 | "integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==", 673 | "dev": true, 674 | "dependencies": { 675 | "graceful-fs": "^4.1.2", 676 | "iferr": "^0.1.5", 677 | "imurmurhash": "^0.1.4", 678 | "readable-stream": "1 || 2" 679 | } 680 | }, 681 | "node_modules/fs.realpath": { 682 | "version": "1.0.0", 683 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 684 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 685 | "dev": true 686 | }, 687 | "node_modules/get-stream": { 688 | "version": "5.2.0", 689 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", 690 | "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", 691 | "dev": true, 692 | "dependencies": { 693 | "pump": "^3.0.0" 694 | }, 695 | "engines": { 696 | "node": ">=8" 697 | }, 698 | "funding": { 699 | "url": "https://github.com/sponsors/sindresorhus" 700 | } 701 | }, 702 | "node_modules/glob": { 703 | "version": "7.2.3", 704 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 705 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 706 | "dev": true, 707 | "dependencies": { 708 | "fs.realpath": "^1.0.0", 709 | "inflight": "^1.0.4", 710 | "inherits": "2", 711 | "minimatch": "^3.1.1", 712 | "once": "^1.3.0", 713 | "path-is-absolute": "^1.0.0" 714 | }, 715 | "engines": { 716 | "node": "*" 717 | }, 718 | "funding": { 719 | "url": "https://github.com/sponsors/isaacs" 720 | } 721 | }, 722 | "node_modules/graceful-fs": { 723 | "version": "4.2.11", 724 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 725 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 726 | "dev": true 727 | }, 728 | "node_modules/has-flag": { 729 | "version": "3.0.0", 730 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 731 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 732 | "dev": true, 733 | "engines": { 734 | "node": ">=4" 735 | } 736 | }, 737 | "node_modules/http-cache-semantics": { 738 | "version": "4.1.1", 739 | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", 740 | "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", 741 | "dev": true 742 | }, 743 | "node_modules/http-proxy-agent": { 744 | "version": "5.0.0", 745 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", 746 | "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", 747 | "dev": true, 748 | "dependencies": { 749 | "@tootallnate/once": "2", 750 | "agent-base": "6", 751 | "debug": "4" 752 | }, 753 | "engines": { 754 | "node": ">= 6" 755 | } 756 | }, 757 | "node_modules/https-proxy-agent": { 758 | "version": "5.0.1", 759 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", 760 | "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", 761 | "dev": true, 762 | "dependencies": { 763 | "agent-base": "6", 764 | "debug": "4" 765 | }, 766 | "engines": { 767 | "node": ">= 6" 768 | } 769 | }, 770 | "node_modules/humanize-ms": { 771 | "version": "1.2.1", 772 | "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", 773 | "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", 774 | "dev": true, 775 | "dependencies": { 776 | "ms": "^2.0.0" 777 | } 778 | }, 779 | "node_modules/iconv-lite": { 780 | "version": "0.6.3", 781 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 782 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 783 | "dev": true, 784 | "optional": true, 785 | "dependencies": { 786 | "safer-buffer": ">= 2.1.2 < 3.0.0" 787 | }, 788 | "engines": { 789 | "node": ">=0.10.0" 790 | } 791 | }, 792 | "node_modules/iferr": { 793 | "version": "0.1.5", 794 | "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", 795 | "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==", 796 | "dev": true 797 | }, 798 | "node_modules/imurmurhash": { 799 | "version": "0.1.4", 800 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 801 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 802 | "dev": true, 803 | "engines": { 804 | "node": ">=0.8.19" 805 | } 806 | }, 807 | "node_modules/indent-string": { 808 | "version": "4.0.0", 809 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", 810 | "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", 811 | "dev": true, 812 | "engines": { 813 | "node": ">=8" 814 | } 815 | }, 816 | "node_modules/infer-owner": { 817 | "version": "1.0.4", 818 | "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", 819 | "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", 820 | "dev": true 821 | }, 822 | "node_modules/inflight": { 823 | "version": "1.0.6", 824 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 825 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 826 | "dev": true, 827 | "dependencies": { 828 | "once": "^1.3.0", 829 | "wrappy": "1" 830 | } 831 | }, 832 | "node_modules/inherits": { 833 | "version": "2.0.4", 834 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 835 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 836 | "dev": true 837 | }, 838 | "node_modules/ip": { 839 | "version": "2.0.0", 840 | "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", 841 | "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", 842 | "dev": true 843 | }, 844 | "node_modules/is-fullwidth-code-point": { 845 | "version": "3.0.0", 846 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 847 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 848 | "dev": true, 849 | "engines": { 850 | "node": ">=8" 851 | } 852 | }, 853 | "node_modules/is-lambda": { 854 | "version": "1.0.1", 855 | "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", 856 | "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", 857 | "dev": true 858 | }, 859 | "node_modules/is-plain-obj": { 860 | "version": "2.1.0", 861 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 862 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 863 | "dev": true, 864 | "engines": { 865 | "node": ">=8" 866 | } 867 | }, 868 | "node_modules/is-stream": { 869 | "version": "2.0.1", 870 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", 871 | "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", 872 | "dev": true, 873 | "engines": { 874 | "node": ">=8" 875 | }, 876 | "funding": { 877 | "url": "https://github.com/sponsors/sindresorhus" 878 | } 879 | }, 880 | "node_modules/isarray": { 881 | "version": "1.0.0", 882 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 883 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", 884 | "dev": true 885 | }, 886 | "node_modules/isexe": { 887 | "version": "2.0.0", 888 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 889 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 890 | "dev": true 891 | }, 892 | "node_modules/jackspeak": { 893 | "version": "2.2.0", 894 | "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.0.tgz", 895 | "integrity": "sha512-r5XBrqIJfwRIjRt/Xr5fv9Wh09qyhHfKnYddDlpM+ibRR20qrYActpCAgU6U+d53EOEjzkvxPMVHSlgR7leXrQ==", 896 | "dev": true, 897 | "dependencies": { 898 | "@isaacs/cliui": "^8.0.2" 899 | }, 900 | "engines": { 901 | "node": ">=14" 902 | }, 903 | "funding": { 904 | "url": "https://github.com/sponsors/isaacs" 905 | }, 906 | "optionalDependencies": { 907 | "@pkgjs/parseargs": "^0.11.0" 908 | } 909 | }, 910 | "node_modules/log-symbols": { 911 | "version": "3.0.0", 912 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", 913 | "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", 914 | "dev": true, 915 | "dependencies": { 916 | "chalk": "^2.4.2" 917 | }, 918 | "engines": { 919 | "node": ">=8" 920 | } 921 | }, 922 | "node_modules/log-update": { 923 | "version": "4.0.0", 924 | "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", 925 | "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", 926 | "dev": true, 927 | "dependencies": { 928 | "ansi-escapes": "^4.3.0", 929 | "cli-cursor": "^3.1.0", 930 | "slice-ansi": "^4.0.0", 931 | "wrap-ansi": "^6.2.0" 932 | }, 933 | "engines": { 934 | "node": ">=10" 935 | }, 936 | "funding": { 937 | "url": "https://github.com/sponsors/sindresorhus" 938 | } 939 | }, 940 | "node_modules/lru-cache": { 941 | "version": "5.1.1", 942 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 943 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 944 | "dev": true, 945 | "dependencies": { 946 | "yallist": "^3.0.2" 947 | } 948 | }, 949 | "node_modules/make-fetch-happen": { 950 | "version": "10.2.1", 951 | "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", 952 | "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", 953 | "dev": true, 954 | "dependencies": { 955 | "agentkeepalive": "^4.2.1", 956 | "cacache": "^16.1.0", 957 | "http-cache-semantics": "^4.1.0", 958 | "http-proxy-agent": "^5.0.0", 959 | "https-proxy-agent": "^5.0.0", 960 | "is-lambda": "^1.0.1", 961 | "lru-cache": "^7.7.1", 962 | "minipass": "^3.1.6", 963 | "minipass-collect": "^1.0.2", 964 | "minipass-fetch": "^2.0.3", 965 | "minipass-flush": "^1.0.5", 966 | "minipass-pipeline": "^1.2.4", 967 | "negotiator": "^0.6.3", 968 | "promise-retry": "^2.0.1", 969 | "socks-proxy-agent": "^7.0.0", 970 | "ssri": "^9.0.0" 971 | }, 972 | "engines": { 973 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 974 | } 975 | }, 976 | "node_modules/make-fetch-happen/node_modules/brace-expansion": { 977 | "version": "2.0.1", 978 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 979 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 980 | "dev": true, 981 | "dependencies": { 982 | "balanced-match": "^1.0.0" 983 | } 984 | }, 985 | "node_modules/make-fetch-happen/node_modules/cacache": { 986 | "version": "16.1.3", 987 | "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", 988 | "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", 989 | "dev": true, 990 | "dependencies": { 991 | "@npmcli/fs": "^2.1.0", 992 | "@npmcli/move-file": "^2.0.0", 993 | "chownr": "^2.0.0", 994 | "fs-minipass": "^2.1.0", 995 | "glob": "^8.0.1", 996 | "infer-owner": "^1.0.4", 997 | "lru-cache": "^7.7.1", 998 | "minipass": "^3.1.6", 999 | "minipass-collect": "^1.0.2", 1000 | "minipass-flush": "^1.0.5", 1001 | "minipass-pipeline": "^1.2.4", 1002 | "mkdirp": "^1.0.4", 1003 | "p-map": "^4.0.0", 1004 | "promise-inflight": "^1.0.1", 1005 | "rimraf": "^3.0.2", 1006 | "ssri": "^9.0.0", 1007 | "tar": "^6.1.11", 1008 | "unique-filename": "^2.0.0" 1009 | }, 1010 | "engines": { 1011 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 1012 | } 1013 | }, 1014 | "node_modules/make-fetch-happen/node_modules/chownr": { 1015 | "version": "2.0.0", 1016 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", 1017 | "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", 1018 | "dev": true, 1019 | "engines": { 1020 | "node": ">=10" 1021 | } 1022 | }, 1023 | "node_modules/make-fetch-happen/node_modules/glob": { 1024 | "version": "8.1.0", 1025 | "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", 1026 | "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", 1027 | "dev": true, 1028 | "dependencies": { 1029 | "fs.realpath": "^1.0.0", 1030 | "inflight": "^1.0.4", 1031 | "inherits": "2", 1032 | "minimatch": "^5.0.1", 1033 | "once": "^1.3.0" 1034 | }, 1035 | "engines": { 1036 | "node": ">=12" 1037 | }, 1038 | "funding": { 1039 | "url": "https://github.com/sponsors/isaacs" 1040 | } 1041 | }, 1042 | "node_modules/make-fetch-happen/node_modules/lru-cache": { 1043 | "version": "7.18.3", 1044 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", 1045 | "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", 1046 | "dev": true, 1047 | "engines": { 1048 | "node": ">=12" 1049 | } 1050 | }, 1051 | "node_modules/make-fetch-happen/node_modules/minimatch": { 1052 | "version": "5.1.6", 1053 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", 1054 | "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", 1055 | "dev": true, 1056 | "dependencies": { 1057 | "brace-expansion": "^2.0.1" 1058 | }, 1059 | "engines": { 1060 | "node": ">=10" 1061 | } 1062 | }, 1063 | "node_modules/make-fetch-happen/node_modules/mkdirp": { 1064 | "version": "1.0.4", 1065 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 1066 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", 1067 | "dev": true, 1068 | "bin": { 1069 | "mkdirp": "bin/cmd.js" 1070 | }, 1071 | "engines": { 1072 | "node": ">=10" 1073 | } 1074 | }, 1075 | "node_modules/make-fetch-happen/node_modules/rimraf": { 1076 | "version": "3.0.2", 1077 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1078 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1079 | "dev": true, 1080 | "dependencies": { 1081 | "glob": "^7.1.3" 1082 | }, 1083 | "bin": { 1084 | "rimraf": "bin.js" 1085 | }, 1086 | "funding": { 1087 | "url": "https://github.com/sponsors/isaacs" 1088 | } 1089 | }, 1090 | "node_modules/make-fetch-happen/node_modules/rimraf/node_modules/brace-expansion": { 1091 | "version": "1.1.11", 1092 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1093 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1094 | "dev": true, 1095 | "dependencies": { 1096 | "balanced-match": "^1.0.0", 1097 | "concat-map": "0.0.1" 1098 | } 1099 | }, 1100 | "node_modules/make-fetch-happen/node_modules/rimraf/node_modules/glob": { 1101 | "version": "7.2.3", 1102 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 1103 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 1104 | "dev": true, 1105 | "dependencies": { 1106 | "fs.realpath": "^1.0.0", 1107 | "inflight": "^1.0.4", 1108 | "inherits": "2", 1109 | "minimatch": "^3.1.1", 1110 | "once": "^1.3.0", 1111 | "path-is-absolute": "^1.0.0" 1112 | }, 1113 | "engines": { 1114 | "node": "*" 1115 | }, 1116 | "funding": { 1117 | "url": "https://github.com/sponsors/isaacs" 1118 | } 1119 | }, 1120 | "node_modules/make-fetch-happen/node_modules/rimraf/node_modules/minimatch": { 1121 | "version": "3.1.2", 1122 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1123 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1124 | "dev": true, 1125 | "dependencies": { 1126 | "brace-expansion": "^1.1.7" 1127 | }, 1128 | "engines": { 1129 | "node": "*" 1130 | } 1131 | }, 1132 | "node_modules/make-fetch-happen/node_modules/ssri": { 1133 | "version": "9.0.1", 1134 | "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", 1135 | "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", 1136 | "dev": true, 1137 | "dependencies": { 1138 | "minipass": "^3.1.1" 1139 | }, 1140 | "engines": { 1141 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 1142 | } 1143 | }, 1144 | "node_modules/make-fetch-happen/node_modules/unique-filename": { 1145 | "version": "2.0.1", 1146 | "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", 1147 | "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", 1148 | "dev": true, 1149 | "dependencies": { 1150 | "unique-slug": "^3.0.0" 1151 | }, 1152 | "engines": { 1153 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 1154 | } 1155 | }, 1156 | "node_modules/make-fetch-happen/node_modules/unique-slug": { 1157 | "version": "3.0.0", 1158 | "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", 1159 | "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", 1160 | "dev": true, 1161 | "dependencies": { 1162 | "imurmurhash": "^0.1.4" 1163 | }, 1164 | "engines": { 1165 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 1166 | } 1167 | }, 1168 | "node_modules/merge-stream": { 1169 | "version": "2.0.0", 1170 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 1171 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", 1172 | "dev": true 1173 | }, 1174 | "node_modules/mimic-fn": { 1175 | "version": "2.1.0", 1176 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 1177 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 1178 | "dev": true, 1179 | "engines": { 1180 | "node": ">=6" 1181 | } 1182 | }, 1183 | "node_modules/minimatch": { 1184 | "version": "3.1.2", 1185 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1186 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1187 | "dev": true, 1188 | "dependencies": { 1189 | "brace-expansion": "^1.1.7" 1190 | }, 1191 | "engines": { 1192 | "node": "*" 1193 | } 1194 | }, 1195 | "node_modules/minimist": { 1196 | "version": "1.2.8", 1197 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 1198 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 1199 | "dev": true, 1200 | "funding": { 1201 | "url": "https://github.com/sponsors/ljharb" 1202 | } 1203 | }, 1204 | "node_modules/minipass": { 1205 | "version": "3.3.6", 1206 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", 1207 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", 1208 | "dev": true, 1209 | "dependencies": { 1210 | "yallist": "^4.0.0" 1211 | }, 1212 | "engines": { 1213 | "node": ">=8" 1214 | } 1215 | }, 1216 | "node_modules/minipass-collect": { 1217 | "version": "1.0.2", 1218 | "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", 1219 | "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", 1220 | "dev": true, 1221 | "dependencies": { 1222 | "minipass": "^3.0.0" 1223 | }, 1224 | "engines": { 1225 | "node": ">= 8" 1226 | } 1227 | }, 1228 | "node_modules/minipass-fetch": { 1229 | "version": "2.1.2", 1230 | "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", 1231 | "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", 1232 | "dev": true, 1233 | "dependencies": { 1234 | "minipass": "^3.1.6", 1235 | "minipass-sized": "^1.0.3", 1236 | "minizlib": "^2.1.2" 1237 | }, 1238 | "engines": { 1239 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 1240 | }, 1241 | "optionalDependencies": { 1242 | "encoding": "^0.1.13" 1243 | } 1244 | }, 1245 | "node_modules/minipass-flush": { 1246 | "version": "1.0.5", 1247 | "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", 1248 | "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", 1249 | "dev": true, 1250 | "dependencies": { 1251 | "minipass": "^3.0.0" 1252 | }, 1253 | "engines": { 1254 | "node": ">= 8" 1255 | } 1256 | }, 1257 | "node_modules/minipass-pipeline": { 1258 | "version": "1.2.4", 1259 | "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", 1260 | "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", 1261 | "dev": true, 1262 | "dependencies": { 1263 | "minipass": "^3.0.0" 1264 | }, 1265 | "engines": { 1266 | "node": ">=8" 1267 | } 1268 | }, 1269 | "node_modules/minipass-sized": { 1270 | "version": "1.0.3", 1271 | "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", 1272 | "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", 1273 | "dev": true, 1274 | "dependencies": { 1275 | "minipass": "^3.0.0" 1276 | }, 1277 | "engines": { 1278 | "node": ">=8" 1279 | } 1280 | }, 1281 | "node_modules/minipass/node_modules/yallist": { 1282 | "version": "4.0.0", 1283 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1284 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 1285 | "dev": true 1286 | }, 1287 | "node_modules/minizlib": { 1288 | "version": "2.1.2", 1289 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", 1290 | "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", 1291 | "dev": true, 1292 | "dependencies": { 1293 | "minipass": "^3.0.0", 1294 | "yallist": "^4.0.0" 1295 | }, 1296 | "engines": { 1297 | "node": ">= 8" 1298 | } 1299 | }, 1300 | "node_modules/minizlib/node_modules/yallist": { 1301 | "version": "4.0.0", 1302 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1303 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 1304 | "dev": true 1305 | }, 1306 | "node_modules/mississippi": { 1307 | "version": "3.0.0", 1308 | "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", 1309 | "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", 1310 | "dev": true, 1311 | "dependencies": { 1312 | "concat-stream": "^1.5.0", 1313 | "duplexify": "^3.4.2", 1314 | "end-of-stream": "^1.1.0", 1315 | "flush-write-stream": "^1.0.0", 1316 | "from2": "^2.1.0", 1317 | "parallel-transform": "^1.1.0", 1318 | "pump": "^3.0.0", 1319 | "pumpify": "^1.3.3", 1320 | "stream-each": "^1.1.0", 1321 | "through2": "^2.0.0" 1322 | }, 1323 | "engines": { 1324 | "node": ">=4.0.0" 1325 | } 1326 | }, 1327 | "node_modules/mkdirp": { 1328 | "version": "0.5.6", 1329 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", 1330 | "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", 1331 | "dev": true, 1332 | "dependencies": { 1333 | "minimist": "^1.2.6" 1334 | }, 1335 | "bin": { 1336 | "mkdirp": "bin/cmd.js" 1337 | } 1338 | }, 1339 | "node_modules/move-concurrently": { 1340 | "version": "1.0.1", 1341 | "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", 1342 | "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==", 1343 | "dev": true, 1344 | "dependencies": { 1345 | "aproba": "^1.1.1", 1346 | "copy-concurrently": "^1.0.0", 1347 | "fs-write-stream-atomic": "^1.0.8", 1348 | "mkdirp": "^0.5.1", 1349 | "rimraf": "^2.5.4", 1350 | "run-queue": "^1.0.3" 1351 | } 1352 | }, 1353 | "node_modules/ms": { 1354 | "version": "2.1.3", 1355 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1356 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1357 | "dev": true 1358 | }, 1359 | "node_modules/negotiator": { 1360 | "version": "0.6.3", 1361 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 1362 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 1363 | "dev": true, 1364 | "engines": { 1365 | "node": ">= 0.6" 1366 | } 1367 | }, 1368 | "node_modules/npm-run-path": { 1369 | "version": "3.1.0", 1370 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz", 1371 | "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==", 1372 | "dev": true, 1373 | "dependencies": { 1374 | "path-key": "^3.0.0" 1375 | }, 1376 | "engines": { 1377 | "node": ">=8" 1378 | } 1379 | }, 1380 | "node_modules/once": { 1381 | "version": "1.4.0", 1382 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1383 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1384 | "dev": true, 1385 | "dependencies": { 1386 | "wrappy": "1" 1387 | } 1388 | }, 1389 | "node_modules/onetime": { 1390 | "version": "5.1.2", 1391 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 1392 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 1393 | "dev": true, 1394 | "dependencies": { 1395 | "mimic-fn": "^2.1.0" 1396 | }, 1397 | "engines": { 1398 | "node": ">=6" 1399 | }, 1400 | "funding": { 1401 | "url": "https://github.com/sponsors/sindresorhus" 1402 | } 1403 | }, 1404 | "node_modules/p-finally": { 1405 | "version": "2.0.1", 1406 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", 1407 | "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", 1408 | "dev": true, 1409 | "engines": { 1410 | "node": ">=8" 1411 | } 1412 | }, 1413 | "node_modules/p-map": { 1414 | "version": "4.0.0", 1415 | "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", 1416 | "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", 1417 | "dev": true, 1418 | "dependencies": { 1419 | "aggregate-error": "^3.0.0" 1420 | }, 1421 | "engines": { 1422 | "node": ">=10" 1423 | }, 1424 | "funding": { 1425 | "url": "https://github.com/sponsors/sindresorhus" 1426 | } 1427 | }, 1428 | "node_modules/parallel-transform": { 1429 | "version": "1.2.0", 1430 | "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", 1431 | "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", 1432 | "dev": true, 1433 | "dependencies": { 1434 | "cyclist": "^1.0.1", 1435 | "inherits": "^2.0.3", 1436 | "readable-stream": "^2.1.5" 1437 | } 1438 | }, 1439 | "node_modules/path-is-absolute": { 1440 | "version": "1.0.1", 1441 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1442 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1443 | "dev": true, 1444 | "engines": { 1445 | "node": ">=0.10.0" 1446 | } 1447 | }, 1448 | "node_modules/path-key": { 1449 | "version": "3.1.1", 1450 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1451 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1452 | "dev": true, 1453 | "engines": { 1454 | "node": ">=8" 1455 | } 1456 | }, 1457 | "node_modules/path-scurry": { 1458 | "version": "1.8.0", 1459 | "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.8.0.tgz", 1460 | "integrity": "sha512-IjTrKseM404/UAWA8bBbL3Qp6O2wXkanuIE3seCxBH7ctRuvH1QRawy1N3nVDHGkdeZsjOsSe/8AQBL/VQCy2g==", 1461 | "dev": true, 1462 | "dependencies": { 1463 | "lru-cache": "^9.1.1", 1464 | "minipass": "^5.0.0" 1465 | }, 1466 | "engines": { 1467 | "node": ">=16 || 14 >=14.17" 1468 | }, 1469 | "funding": { 1470 | "url": "https://github.com/sponsors/isaacs" 1471 | } 1472 | }, 1473 | "node_modules/path-scurry/node_modules/lru-cache": { 1474 | "version": "9.1.1", 1475 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.1.tgz", 1476 | "integrity": "sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==", 1477 | "dev": true, 1478 | "engines": { 1479 | "node": "14 || >=16.14" 1480 | } 1481 | }, 1482 | "node_modules/path-scurry/node_modules/minipass": { 1483 | "version": "5.0.0", 1484 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", 1485 | "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", 1486 | "dev": true, 1487 | "engines": { 1488 | "node": ">=8" 1489 | } 1490 | }, 1491 | "node_modules/process-nextick-args": { 1492 | "version": "2.0.1", 1493 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1494 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", 1495 | "dev": true 1496 | }, 1497 | "node_modules/promise-inflight": { 1498 | "version": "1.0.1", 1499 | "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", 1500 | "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", 1501 | "dev": true 1502 | }, 1503 | "node_modules/promise-retry": { 1504 | "version": "2.0.1", 1505 | "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", 1506 | "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", 1507 | "dev": true, 1508 | "dependencies": { 1509 | "err-code": "^2.0.2", 1510 | "retry": "^0.12.0" 1511 | }, 1512 | "engines": { 1513 | "node": ">=10" 1514 | } 1515 | }, 1516 | "node_modules/pump": { 1517 | "version": "3.0.0", 1518 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 1519 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 1520 | "dev": true, 1521 | "dependencies": { 1522 | "end-of-stream": "^1.1.0", 1523 | "once": "^1.3.1" 1524 | } 1525 | }, 1526 | "node_modules/pumpify": { 1527 | "version": "1.5.1", 1528 | "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", 1529 | "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", 1530 | "dev": true, 1531 | "dependencies": { 1532 | "duplexify": "^3.6.0", 1533 | "inherits": "^2.0.3", 1534 | "pump": "^2.0.0" 1535 | } 1536 | }, 1537 | "node_modules/pumpify/node_modules/pump": { 1538 | "version": "2.0.1", 1539 | "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", 1540 | "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", 1541 | "dev": true, 1542 | "dependencies": { 1543 | "end-of-stream": "^1.1.0", 1544 | "once": "^1.3.1" 1545 | } 1546 | }, 1547 | "node_modules/purescript": { 1548 | "version": "0.15.9", 1549 | "resolved": "https://registry.npmjs.org/purescript/-/purescript-0.15.9.tgz", 1550 | "integrity": "sha512-J2bI4iOn1Sg3/BN0Td1yykIYEK56+tpf3hQRQ+EraPSVgT1MDD+tBH6lvz6UBHndtsKqpNIQCX/HNK7u72HOtw==", 1551 | "dev": true, 1552 | "hasInstallScript": true, 1553 | "dependencies": { 1554 | "purescript-installer": "^0.3.5" 1555 | }, 1556 | "bin": { 1557 | "purs": "purs.bin" 1558 | } 1559 | }, 1560 | "node_modules/purescript-installer": { 1561 | "version": "0.3.5", 1562 | "resolved": "https://registry.npmjs.org/purescript-installer/-/purescript-installer-0.3.5.tgz", 1563 | "integrity": "sha512-w04BBvW4BSQlspLsZ9Bs5vtUBZqvC4bC+FizC5GUp2/rpmYvXJ0CTf79Q3MKo2A8p1ZjqbhCI+SqdTQ30UZUIQ==", 1564 | "dev": true, 1565 | "dependencies": { 1566 | "byline": "^5.0.0", 1567 | "cacache": "^11.3.2", 1568 | "chalk": "^2.4.2", 1569 | "env-paths": "^2.2.0", 1570 | "execa": "^2.0.3", 1571 | "filesize": "^4.1.2", 1572 | "is-plain-obj": "^2.0.0", 1573 | "log-symbols": "^3.0.0", 1574 | "log-update": "^4.0.0", 1575 | "make-fetch-happen": "^10.0.0", 1576 | "minimist": "^1.2.0", 1577 | "ms": "^2.1.2", 1578 | "once": "^1.4.0", 1579 | "rimraf": "^2.6.3", 1580 | "semver": "^7.3.7", 1581 | "tar": "^6.1.11", 1582 | "which": "^1.3.1", 1583 | "zen-observable": "^0.8.14" 1584 | }, 1585 | "bin": { 1586 | "install-purescript": "index.js" 1587 | }, 1588 | "engines": { 1589 | "node": ">=12" 1590 | } 1591 | }, 1592 | "node_modules/readable-stream": { 1593 | "version": "2.3.8", 1594 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", 1595 | "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", 1596 | "dev": true, 1597 | "dependencies": { 1598 | "core-util-is": "~1.0.0", 1599 | "inherits": "~2.0.3", 1600 | "isarray": "~1.0.0", 1601 | "process-nextick-args": "~2.0.0", 1602 | "safe-buffer": "~5.1.1", 1603 | "string_decoder": "~1.1.1", 1604 | "util-deprecate": "~1.0.1" 1605 | } 1606 | }, 1607 | "node_modules/restore-cursor": { 1608 | "version": "3.1.0", 1609 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", 1610 | "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", 1611 | "dev": true, 1612 | "dependencies": { 1613 | "onetime": "^5.1.0", 1614 | "signal-exit": "^3.0.2" 1615 | }, 1616 | "engines": { 1617 | "node": ">=8" 1618 | } 1619 | }, 1620 | "node_modules/retry": { 1621 | "version": "0.12.0", 1622 | "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", 1623 | "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", 1624 | "dev": true, 1625 | "engines": { 1626 | "node": ">= 4" 1627 | } 1628 | }, 1629 | "node_modules/rimraf": { 1630 | "version": "2.7.1", 1631 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", 1632 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 1633 | "dev": true, 1634 | "dependencies": { 1635 | "glob": "^7.1.3" 1636 | }, 1637 | "bin": { 1638 | "rimraf": "bin.js" 1639 | } 1640 | }, 1641 | "node_modules/run-queue": { 1642 | "version": "1.0.3", 1643 | "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", 1644 | "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==", 1645 | "dev": true, 1646 | "dependencies": { 1647 | "aproba": "^1.1.1" 1648 | } 1649 | }, 1650 | "node_modules/safe-buffer": { 1651 | "version": "5.1.2", 1652 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1653 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1654 | "dev": true 1655 | }, 1656 | "node_modules/safer-buffer": { 1657 | "version": "2.1.2", 1658 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1659 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1660 | "dev": true, 1661 | "optional": true 1662 | }, 1663 | "node_modules/semver": { 1664 | "version": "7.5.0", 1665 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", 1666 | "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", 1667 | "dev": true, 1668 | "dependencies": { 1669 | "lru-cache": "^6.0.0" 1670 | }, 1671 | "bin": { 1672 | "semver": "bin/semver.js" 1673 | }, 1674 | "engines": { 1675 | "node": ">=10" 1676 | } 1677 | }, 1678 | "node_modules/semver/node_modules/lru-cache": { 1679 | "version": "6.0.0", 1680 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1681 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1682 | "dev": true, 1683 | "dependencies": { 1684 | "yallist": "^4.0.0" 1685 | }, 1686 | "engines": { 1687 | "node": ">=10" 1688 | } 1689 | }, 1690 | "node_modules/semver/node_modules/yallist": { 1691 | "version": "4.0.0", 1692 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1693 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 1694 | "dev": true 1695 | }, 1696 | "node_modules/shebang-command": { 1697 | "version": "2.0.0", 1698 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1699 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1700 | "dev": true, 1701 | "dependencies": { 1702 | "shebang-regex": "^3.0.0" 1703 | }, 1704 | "engines": { 1705 | "node": ">=8" 1706 | } 1707 | }, 1708 | "node_modules/shebang-regex": { 1709 | "version": "3.0.0", 1710 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1711 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1712 | "dev": true, 1713 | "engines": { 1714 | "node": ">=8" 1715 | } 1716 | }, 1717 | "node_modules/signal-exit": { 1718 | "version": "3.0.7", 1719 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 1720 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 1721 | "dev": true 1722 | }, 1723 | "node_modules/slice-ansi": { 1724 | "version": "4.0.0", 1725 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", 1726 | "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", 1727 | "dev": true, 1728 | "dependencies": { 1729 | "ansi-styles": "^4.0.0", 1730 | "astral-regex": "^2.0.0", 1731 | "is-fullwidth-code-point": "^3.0.0" 1732 | }, 1733 | "engines": { 1734 | "node": ">=10" 1735 | }, 1736 | "funding": { 1737 | "url": "https://github.com/chalk/slice-ansi?sponsor=1" 1738 | } 1739 | }, 1740 | "node_modules/slice-ansi/node_modules/ansi-styles": { 1741 | "version": "4.3.0", 1742 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1743 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1744 | "dev": true, 1745 | "dependencies": { 1746 | "color-convert": "^2.0.1" 1747 | }, 1748 | "engines": { 1749 | "node": ">=8" 1750 | }, 1751 | "funding": { 1752 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1753 | } 1754 | }, 1755 | "node_modules/slice-ansi/node_modules/color-convert": { 1756 | "version": "2.0.1", 1757 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1758 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1759 | "dev": true, 1760 | "dependencies": { 1761 | "color-name": "~1.1.4" 1762 | }, 1763 | "engines": { 1764 | "node": ">=7.0.0" 1765 | } 1766 | }, 1767 | "node_modules/slice-ansi/node_modules/color-name": { 1768 | "version": "1.1.4", 1769 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1770 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1771 | "dev": true 1772 | }, 1773 | "node_modules/smart-buffer": { 1774 | "version": "4.2.0", 1775 | "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", 1776 | "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", 1777 | "dev": true, 1778 | "engines": { 1779 | "node": ">= 6.0.0", 1780 | "npm": ">= 3.0.0" 1781 | } 1782 | }, 1783 | "node_modules/socks": { 1784 | "version": "2.7.1", 1785 | "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", 1786 | "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", 1787 | "dev": true, 1788 | "dependencies": { 1789 | "ip": "^2.0.0", 1790 | "smart-buffer": "^4.2.0" 1791 | }, 1792 | "engines": { 1793 | "node": ">= 10.13.0", 1794 | "npm": ">= 3.0.0" 1795 | } 1796 | }, 1797 | "node_modules/socks-proxy-agent": { 1798 | "version": "7.0.0", 1799 | "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", 1800 | "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", 1801 | "dev": true, 1802 | "dependencies": { 1803 | "agent-base": "^6.0.2", 1804 | "debug": "^4.3.3", 1805 | "socks": "^2.6.2" 1806 | }, 1807 | "engines": { 1808 | "node": ">= 10" 1809 | } 1810 | }, 1811 | "node_modules/spago": { 1812 | "version": "0.21.0", 1813 | "resolved": "https://registry.npmjs.org/spago/-/spago-0.21.0.tgz", 1814 | "integrity": "sha512-1qTPaIhrsLCvneSJt1fyq3CpNMu01Xhcn+b09IMbyrpLcptMoGH5uOtyNL9eohTRMzPWBKUs6ksFLGdjJp7yxQ==", 1815 | "dev": true, 1816 | "hasInstallScript": true, 1817 | "dependencies": { 1818 | "make-fetch-happen": "^11.0.1", 1819 | "tar": "^6.1.11" 1820 | }, 1821 | "bin": { 1822 | "spago": "spago" 1823 | } 1824 | }, 1825 | "node_modules/spago/node_modules/@npmcli/fs": { 1826 | "version": "3.1.0", 1827 | "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", 1828 | "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", 1829 | "dev": true, 1830 | "dependencies": { 1831 | "semver": "^7.3.5" 1832 | }, 1833 | "engines": { 1834 | "node": "^14.17.0 || ^16.13.0 || >=18.0.0" 1835 | } 1836 | }, 1837 | "node_modules/spago/node_modules/brace-expansion": { 1838 | "version": "2.0.1", 1839 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 1840 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1841 | "dev": true, 1842 | "dependencies": { 1843 | "balanced-match": "^1.0.0" 1844 | } 1845 | }, 1846 | "node_modules/spago/node_modules/cacache": { 1847 | "version": "17.1.0", 1848 | "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.0.tgz", 1849 | "integrity": "sha512-hXpFU+Z3AfVmNuiLve1qxWHMq0RSIt5gjCKAHi/M6DktwFwDdAXAtunl1i4WSKaaVcU9IsRvXFg42jTHigcC6Q==", 1850 | "dev": true, 1851 | "dependencies": { 1852 | "@npmcli/fs": "^3.1.0", 1853 | "fs-minipass": "^3.0.0", 1854 | "glob": "^10.2.2", 1855 | "lru-cache": "^7.7.1", 1856 | "minipass": "^5.0.0", 1857 | "minipass-collect": "^1.0.2", 1858 | "minipass-flush": "^1.0.5", 1859 | "minipass-pipeline": "^1.2.4", 1860 | "p-map": "^4.0.0", 1861 | "ssri": "^10.0.0", 1862 | "tar": "^6.1.11", 1863 | "unique-filename": "^3.0.0" 1864 | }, 1865 | "engines": { 1866 | "node": "^14.17.0 || ^16.13.0 || >=18.0.0" 1867 | } 1868 | }, 1869 | "node_modules/spago/node_modules/fs-minipass": { 1870 | "version": "3.0.2", 1871 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.2.tgz", 1872 | "integrity": "sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g==", 1873 | "dev": true, 1874 | "dependencies": { 1875 | "minipass": "^5.0.0" 1876 | }, 1877 | "engines": { 1878 | "node": "^14.17.0 || ^16.13.0 || >=18.0.0" 1879 | } 1880 | }, 1881 | "node_modules/spago/node_modules/glob": { 1882 | "version": "10.2.3", 1883 | "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.3.tgz", 1884 | "integrity": "sha512-Kb4rfmBVE3eQTAimgmeqc2LwSnN0wIOkkUL6HmxEFxNJ4fHghYHVbFba/HcGcRjE6s9KoMNK3rSOwkL4PioZjg==", 1885 | "dev": true, 1886 | "dependencies": { 1887 | "foreground-child": "^3.1.0", 1888 | "jackspeak": "^2.0.3", 1889 | "minimatch": "^9.0.0", 1890 | "minipass": "^5.0.0", 1891 | "path-scurry": "^1.7.0" 1892 | }, 1893 | "bin": { 1894 | "glob": "dist/cjs/src/bin.js" 1895 | }, 1896 | "engines": { 1897 | "node": ">=16 || 14 >=14.17" 1898 | }, 1899 | "funding": { 1900 | "url": "https://github.com/sponsors/isaacs" 1901 | } 1902 | }, 1903 | "node_modules/spago/node_modules/lru-cache": { 1904 | "version": "7.18.3", 1905 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", 1906 | "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", 1907 | "dev": true, 1908 | "engines": { 1909 | "node": ">=12" 1910 | } 1911 | }, 1912 | "node_modules/spago/node_modules/make-fetch-happen": { 1913 | "version": "11.1.1", 1914 | "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", 1915 | "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", 1916 | "dev": true, 1917 | "dependencies": { 1918 | "agentkeepalive": "^4.2.1", 1919 | "cacache": "^17.0.0", 1920 | "http-cache-semantics": "^4.1.1", 1921 | "http-proxy-agent": "^5.0.0", 1922 | "https-proxy-agent": "^5.0.0", 1923 | "is-lambda": "^1.0.1", 1924 | "lru-cache": "^7.7.1", 1925 | "minipass": "^5.0.0", 1926 | "minipass-fetch": "^3.0.0", 1927 | "minipass-flush": "^1.0.5", 1928 | "minipass-pipeline": "^1.2.4", 1929 | "negotiator": "^0.6.3", 1930 | "promise-retry": "^2.0.1", 1931 | "socks-proxy-agent": "^7.0.0", 1932 | "ssri": "^10.0.0" 1933 | }, 1934 | "engines": { 1935 | "node": "^14.17.0 || ^16.13.0 || >=18.0.0" 1936 | } 1937 | }, 1938 | "node_modules/spago/node_modules/minimatch": { 1939 | "version": "9.0.0", 1940 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", 1941 | "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", 1942 | "dev": true, 1943 | "dependencies": { 1944 | "brace-expansion": "^2.0.1" 1945 | }, 1946 | "engines": { 1947 | "node": ">=16 || 14 >=14.17" 1948 | }, 1949 | "funding": { 1950 | "url": "https://github.com/sponsors/isaacs" 1951 | } 1952 | }, 1953 | "node_modules/spago/node_modules/minipass": { 1954 | "version": "5.0.0", 1955 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", 1956 | "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", 1957 | "dev": true, 1958 | "engines": { 1959 | "node": ">=8" 1960 | } 1961 | }, 1962 | "node_modules/spago/node_modules/minipass-fetch": { 1963 | "version": "3.0.3", 1964 | "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", 1965 | "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", 1966 | "dev": true, 1967 | "dependencies": { 1968 | "minipass": "^5.0.0", 1969 | "minipass-sized": "^1.0.3", 1970 | "minizlib": "^2.1.2" 1971 | }, 1972 | "engines": { 1973 | "node": "^14.17.0 || ^16.13.0 || >=18.0.0" 1974 | }, 1975 | "optionalDependencies": { 1976 | "encoding": "^0.1.13" 1977 | } 1978 | }, 1979 | "node_modules/spago/node_modules/ssri": { 1980 | "version": "10.0.4", 1981 | "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.4.tgz", 1982 | "integrity": "sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==", 1983 | "dev": true, 1984 | "dependencies": { 1985 | "minipass": "^5.0.0" 1986 | }, 1987 | "engines": { 1988 | "node": "^14.17.0 || ^16.13.0 || >=18.0.0" 1989 | } 1990 | }, 1991 | "node_modules/spago/node_modules/unique-filename": { 1992 | "version": "3.0.0", 1993 | "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", 1994 | "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", 1995 | "dev": true, 1996 | "dependencies": { 1997 | "unique-slug": "^4.0.0" 1998 | }, 1999 | "engines": { 2000 | "node": "^14.17.0 || ^16.13.0 || >=18.0.0" 2001 | } 2002 | }, 2003 | "node_modules/spago/node_modules/unique-slug": { 2004 | "version": "4.0.0", 2005 | "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", 2006 | "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", 2007 | "dev": true, 2008 | "dependencies": { 2009 | "imurmurhash": "^0.1.4" 2010 | }, 2011 | "engines": { 2012 | "node": "^14.17.0 || ^16.13.0 || >=18.0.0" 2013 | } 2014 | }, 2015 | "node_modules/ssri": { 2016 | "version": "6.0.2", 2017 | "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", 2018 | "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", 2019 | "dev": true, 2020 | "dependencies": { 2021 | "figgy-pudding": "^3.5.1" 2022 | } 2023 | }, 2024 | "node_modules/stream-each": { 2025 | "version": "1.2.3", 2026 | "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", 2027 | "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", 2028 | "dev": true, 2029 | "dependencies": { 2030 | "end-of-stream": "^1.1.0", 2031 | "stream-shift": "^1.0.0" 2032 | } 2033 | }, 2034 | "node_modules/stream-shift": { 2035 | "version": "1.0.1", 2036 | "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", 2037 | "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", 2038 | "dev": true 2039 | }, 2040 | "node_modules/string_decoder": { 2041 | "version": "1.1.1", 2042 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 2043 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 2044 | "dev": true, 2045 | "dependencies": { 2046 | "safe-buffer": "~5.1.0" 2047 | } 2048 | }, 2049 | "node_modules/string-width": { 2050 | "version": "4.2.3", 2051 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2052 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2053 | "dev": true, 2054 | "dependencies": { 2055 | "emoji-regex": "^8.0.0", 2056 | "is-fullwidth-code-point": "^3.0.0", 2057 | "strip-ansi": "^6.0.1" 2058 | }, 2059 | "engines": { 2060 | "node": ">=8" 2061 | } 2062 | }, 2063 | "node_modules/string-width-cjs": { 2064 | "name": "string-width", 2065 | "version": "4.2.3", 2066 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2067 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2068 | "dev": true, 2069 | "dependencies": { 2070 | "emoji-regex": "^8.0.0", 2071 | "is-fullwidth-code-point": "^3.0.0", 2072 | "strip-ansi": "^6.0.1" 2073 | }, 2074 | "engines": { 2075 | "node": ">=8" 2076 | } 2077 | }, 2078 | "node_modules/strip-ansi": { 2079 | "version": "6.0.1", 2080 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2081 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2082 | "dev": true, 2083 | "dependencies": { 2084 | "ansi-regex": "^5.0.1" 2085 | }, 2086 | "engines": { 2087 | "node": ">=8" 2088 | } 2089 | }, 2090 | "node_modules/strip-ansi-cjs": { 2091 | "name": "strip-ansi", 2092 | "version": "6.0.1", 2093 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2094 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2095 | "dev": true, 2096 | "dependencies": { 2097 | "ansi-regex": "^5.0.1" 2098 | }, 2099 | "engines": { 2100 | "node": ">=8" 2101 | } 2102 | }, 2103 | "node_modules/strip-final-newline": { 2104 | "version": "2.0.0", 2105 | "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", 2106 | "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", 2107 | "dev": true, 2108 | "engines": { 2109 | "node": ">=6" 2110 | } 2111 | }, 2112 | "node_modules/supports-color": { 2113 | "version": "5.5.0", 2114 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 2115 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 2116 | "dev": true, 2117 | "dependencies": { 2118 | "has-flag": "^3.0.0" 2119 | }, 2120 | "engines": { 2121 | "node": ">=4" 2122 | } 2123 | }, 2124 | "node_modules/tar": { 2125 | "version": "6.1.14", 2126 | "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.14.tgz", 2127 | "integrity": "sha512-piERznXu0U7/pW7cdSn7hjqySIVTYT6F76icmFk7ptU7dDYlXTm5r9A6K04R2vU3olYgoKeo1Cg3eeu5nhftAw==", 2128 | "dev": true, 2129 | "dependencies": { 2130 | "chownr": "^2.0.0", 2131 | "fs-minipass": "^2.0.0", 2132 | "minipass": "^5.0.0", 2133 | "minizlib": "^2.1.1", 2134 | "mkdirp": "^1.0.3", 2135 | "yallist": "^4.0.0" 2136 | }, 2137 | "engines": { 2138 | "node": ">=10" 2139 | } 2140 | }, 2141 | "node_modules/tar/node_modules/chownr": { 2142 | "version": "2.0.0", 2143 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", 2144 | "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", 2145 | "dev": true, 2146 | "engines": { 2147 | "node": ">=10" 2148 | } 2149 | }, 2150 | "node_modules/tar/node_modules/minipass": { 2151 | "version": "5.0.0", 2152 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", 2153 | "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", 2154 | "dev": true, 2155 | "engines": { 2156 | "node": ">=8" 2157 | } 2158 | }, 2159 | "node_modules/tar/node_modules/mkdirp": { 2160 | "version": "1.0.4", 2161 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 2162 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", 2163 | "dev": true, 2164 | "bin": { 2165 | "mkdirp": "bin/cmd.js" 2166 | }, 2167 | "engines": { 2168 | "node": ">=10" 2169 | } 2170 | }, 2171 | "node_modules/tar/node_modules/yallist": { 2172 | "version": "4.0.0", 2173 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 2174 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 2175 | "dev": true 2176 | }, 2177 | "node_modules/through2": { 2178 | "version": "2.0.5", 2179 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", 2180 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", 2181 | "dev": true, 2182 | "dependencies": { 2183 | "readable-stream": "~2.3.6", 2184 | "xtend": "~4.0.1" 2185 | } 2186 | }, 2187 | "node_modules/type-fest": { 2188 | "version": "0.21.3", 2189 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", 2190 | "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", 2191 | "dev": true, 2192 | "engines": { 2193 | "node": ">=10" 2194 | }, 2195 | "funding": { 2196 | "url": "https://github.com/sponsors/sindresorhus" 2197 | } 2198 | }, 2199 | "node_modules/typedarray": { 2200 | "version": "0.0.6", 2201 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 2202 | "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", 2203 | "dev": true 2204 | }, 2205 | "node_modules/unique-filename": { 2206 | "version": "1.1.1", 2207 | "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", 2208 | "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", 2209 | "dev": true, 2210 | "dependencies": { 2211 | "unique-slug": "^2.0.0" 2212 | } 2213 | }, 2214 | "node_modules/unique-slug": { 2215 | "version": "2.0.2", 2216 | "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", 2217 | "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", 2218 | "dev": true, 2219 | "dependencies": { 2220 | "imurmurhash": "^0.1.4" 2221 | } 2222 | }, 2223 | "node_modules/util-deprecate": { 2224 | "version": "1.0.2", 2225 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2226 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 2227 | "dev": true 2228 | }, 2229 | "node_modules/which": { 2230 | "version": "1.3.1", 2231 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 2232 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 2233 | "dev": true, 2234 | "dependencies": { 2235 | "isexe": "^2.0.0" 2236 | }, 2237 | "bin": { 2238 | "which": "bin/which" 2239 | } 2240 | }, 2241 | "node_modules/wrap-ansi": { 2242 | "version": "6.2.0", 2243 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", 2244 | "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", 2245 | "dev": true, 2246 | "dependencies": { 2247 | "ansi-styles": "^4.0.0", 2248 | "string-width": "^4.1.0", 2249 | "strip-ansi": "^6.0.0" 2250 | }, 2251 | "engines": { 2252 | "node": ">=8" 2253 | } 2254 | }, 2255 | "node_modules/wrap-ansi-cjs": { 2256 | "name": "wrap-ansi", 2257 | "version": "7.0.0", 2258 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 2259 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 2260 | "dev": true, 2261 | "dependencies": { 2262 | "ansi-styles": "^4.0.0", 2263 | "string-width": "^4.1.0", 2264 | "strip-ansi": "^6.0.0" 2265 | }, 2266 | "engines": { 2267 | "node": ">=10" 2268 | }, 2269 | "funding": { 2270 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 2271 | } 2272 | }, 2273 | "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { 2274 | "version": "4.3.0", 2275 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 2276 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 2277 | "dev": true, 2278 | "dependencies": { 2279 | "color-convert": "^2.0.1" 2280 | }, 2281 | "engines": { 2282 | "node": ">=8" 2283 | }, 2284 | "funding": { 2285 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 2286 | } 2287 | }, 2288 | "node_modules/wrap-ansi-cjs/node_modules/color-convert": { 2289 | "version": "2.0.1", 2290 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 2291 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 2292 | "dev": true, 2293 | "dependencies": { 2294 | "color-name": "~1.1.4" 2295 | }, 2296 | "engines": { 2297 | "node": ">=7.0.0" 2298 | } 2299 | }, 2300 | "node_modules/wrap-ansi-cjs/node_modules/color-name": { 2301 | "version": "1.1.4", 2302 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 2303 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 2304 | "dev": true 2305 | }, 2306 | "node_modules/wrap-ansi/node_modules/ansi-styles": { 2307 | "version": "4.3.0", 2308 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 2309 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 2310 | "dev": true, 2311 | "dependencies": { 2312 | "color-convert": "^2.0.1" 2313 | }, 2314 | "engines": { 2315 | "node": ">=8" 2316 | }, 2317 | "funding": { 2318 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 2319 | } 2320 | }, 2321 | "node_modules/wrap-ansi/node_modules/color-convert": { 2322 | "version": "2.0.1", 2323 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 2324 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 2325 | "dev": true, 2326 | "dependencies": { 2327 | "color-name": "~1.1.4" 2328 | }, 2329 | "engines": { 2330 | "node": ">=7.0.0" 2331 | } 2332 | }, 2333 | "node_modules/wrap-ansi/node_modules/color-name": { 2334 | "version": "1.1.4", 2335 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 2336 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 2337 | "dev": true 2338 | }, 2339 | "node_modules/wrappy": { 2340 | "version": "1.0.2", 2341 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2342 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 2343 | "dev": true 2344 | }, 2345 | "node_modules/xtend": { 2346 | "version": "4.0.2", 2347 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 2348 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 2349 | "dev": true, 2350 | "engines": { 2351 | "node": ">=0.4" 2352 | } 2353 | }, 2354 | "node_modules/y18n": { 2355 | "version": "4.0.3", 2356 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", 2357 | "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", 2358 | "dev": true 2359 | }, 2360 | "node_modules/yallist": { 2361 | "version": "3.1.1", 2362 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 2363 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", 2364 | "dev": true 2365 | }, 2366 | "node_modules/zen-observable": { 2367 | "version": "0.8.15", 2368 | "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", 2369 | "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==", 2370 | "dev": true 2371 | } 2372 | } 2373 | } 2374 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "purescript-suggest", 3 | "version": "2.3.0", 4 | "description": "Apply PureScript compiler suggestions to fix warnings", 5 | "type": "module", 6 | "bin": { 7 | "ps-suggest": "cli/index.js" 8 | }, 9 | "scripts": { 10 | "build": "spago build", 11 | "preversion": "npm test", 12 | "prepublish": "npm run build", 13 | "test": "spago test" 14 | }, 15 | "keywords": [ 16 | "purescript" 17 | ], 18 | "author": "Nicholas Wolverson", 19 | "license": "MIT", 20 | "repository": { 21 | "url": "https://github.com/nwolverson/purescript-suggest" 22 | }, 23 | "bugs": { 24 | "url": "https://github.com/nwolverson/purescript-suggest/issues" 25 | }, 26 | "devDependencies": { 27 | "purescript": "^0.15.9", 28 | "spago": "^0.21.0" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /packages.dhall: -------------------------------------------------------------------------------- 1 | let upstream = 2 | https://github.com/purescript/package-sets/releases/download/psc-0.15.8-20230511/packages.dhall 3 | sha256:47cfb0e7e14ee01dee00cb64bd0ca4a47ac44a64f3edf1e774251fb44cd73beb 4 | 5 | in upstream 6 | -------------------------------------------------------------------------------- /spago.dhall: -------------------------------------------------------------------------------- 1 | { name = "suggest" 2 | , dependencies = 3 | [ "argonaut-codecs" 4 | , "argonaut-core" 5 | , "arrays" 6 | , "bifunctors" 7 | , "console" 8 | , "effect" 9 | , "either" 10 | , "foldable-traversable" 11 | , "lists" 12 | , "maybe" 13 | , "node-buffer" 14 | , "node-fs" 15 | , "node-process" 16 | , "node-streams" 17 | , "ordered-collections" 18 | , "prelude" 19 | , "psa-utils" 20 | , "refs" 21 | , "strings" 22 | , "test-unit" 23 | ] 24 | , packages = ./packages.dhall 25 | , sources = [ "src/**/*.purs", "cli/**/*.purs", "test/**/*.purs" ] 26 | } 27 | -------------------------------------------------------------------------------- /src/Suggest.purs: -------------------------------------------------------------------------------- 1 | module Suggest where 2 | 3 | import Prelude 4 | 5 | import Data.Array (replicate, mapMaybe, concat, head, groupBy, catMaybes, sortBy) 6 | import Data.Array as Array 7 | import Data.Array.NonEmpty as NEA 8 | import Data.Either (Either(Right, Left), either) 9 | import Data.Foldable (for_, intercalate) 10 | import Data.List (List(Nil, Cons), drop, (!!), length, fromFoldable) 11 | import Data.List as List 12 | import Data.Map (Map) 13 | import Data.Map as Map 14 | import Data.Maybe (Maybe(Nothing, Just), fromMaybe) 15 | import Data.String (trim, joinWith) 16 | import Data.String as Str 17 | import Data.String.Regex (regex, test, replace) as Regex 18 | import Data.String.Regex.Flags (noFlags, global) as Regex 19 | import Data.Traversable (fold, traverse) 20 | import Effect (Effect) 21 | import Effect.Console (error, log) 22 | import Effect.Ref (Ref) 23 | import Effect.Ref as Ref 24 | import Node.Encoding as Encoding 25 | import Node.FS.Sync as File 26 | import Psa (PsaError, Position, PsaPath(Src), compareByLocation, annotatedError) 27 | 28 | type Replacement = 29 | { filename :: String 30 | , position :: Position 31 | , original :: String 32 | , replacement :: String 33 | } 34 | 35 | type Suggestions = { replacements:: Array (Array Replacement), files:: Ref (Map String (Array String)) } 36 | 37 | getSuggestions :: Array PsaError -> Effect Suggestions 38 | getSuggestions warnings = do 39 | files <- Ref.new Map.empty 40 | let loadLinesImpl = loadLines files 41 | warnings' <- sortBy compareByLocation <$> catMaybes <$> traverse (annotateError loadLinesImpl) warnings 42 | let replacements = mapMaybe getReplacement warnings' 43 | pure { replacements: map NEA.toArray (groupBy (\a b -> a.filename == b.filename) replacements), files } 44 | where 45 | loadLines files filename pos = do 46 | contents <- Ref.read files >>= \cache -> 47 | case Map.lookup filename cache of 48 | Just lines -> pure lines 49 | Nothing -> do 50 | lines <- Str.split (Str.Pattern "\n") <$> File.readTextFile Encoding.UTF8 filename 51 | Ref.modify_ (Map.insert filename lines) files 52 | pure lines 53 | let source = Array.slice (pos.startLine - 1) (pos.endLine) contents 54 | pure $ Just source 55 | 56 | getReplacement { source: Just s, error: { suggestion: Just { replacement, replaceRange }, filename: Just filename }, position: Just position } 57 | = 58 | Just { 59 | filename, 60 | position: fromMaybe position replaceRange, 61 | original: joinWith "\n" s, 62 | replacement 63 | } 64 | getReplacement _ = Nothing 65 | 66 | annotateError loadLinesF error = do 67 | source <- fromMaybe (pure Nothing) (loadLinesF <$> error.filename <*> error.position) 68 | pure $ annotatedError <$> (Src <$> error.filename) <*> pure source <*> pure error 69 | 70 | applySuggestions :: Array PsaError -> Effect Unit 71 | applySuggestions warnings = do 72 | { replacements, files } <- getSuggestions warnings 73 | for_ replacements $ \group -> 74 | case head group of 75 | Just { filename } -> do 76 | log $ "Processing " <> filename 77 | Ref.read files >>= \res -> case Map.lookup filename res of 78 | Just lines -> replaceFile lines filename group 79 | _ -> pure unit 80 | Nothing -> pure unit 81 | 82 | listSuggestions :: Array PsaError -> Effect String 83 | listSuggestions warnings = do 84 | { replacements } <- getSuggestions warnings 85 | let totalCount = Array.length (concat replacements) 86 | msg = "Found " <> show totalCount <> " suggestions in " <> show (Array.length replacements) <> " files.\n" 87 | msg' = intercalate "\n" $ mapMaybe rep replacements 88 | pure $ msg <> msg' 89 | where 90 | rep reps = case head reps of 91 | Just { filename } -> Just $ filename <> ": " <> show (Array.length reps) <> " replacements" 92 | _ -> Nothing 93 | 94 | replaceFile :: Array String -> String -> Array Replacement -> Effect Unit 95 | replaceFile lines filename group = 96 | case replaceFile' 1 1 (fromFoldable lines) (fromFoldable group) of 97 | Left err -> error err 98 | Right outLines -> do 99 | File.writeTextFile Encoding.UTF8 filename $ intercalate "" outLines 100 | log $ filename <> ": Applied " <> show (Array.length group) <> " fixes" 101 | 102 | -- | This is where all the real work happens. 103 | -- | Steps through the source file, outputting replacement text when the position 104 | -- | matches otherwise the original text. Objects if replacements overlap or go past the file end. 105 | replaceFile' :: Int -> Int -> List String -> List Replacement -> Either String (List String) 106 | replaceFile' n _ lines reps@(Cons { position: { startLine } } _) | n < startLine && length lines >= startLine - n = 107 | (withNewlines (List.take count lines) <> _) <$> replaceFile' startLine 1 (drop count lines) reps 108 | where 109 | count = startLine - n 110 | replaceFile' n m lines (Cons { position: { startLine, startColumn, endLine, endColumn }, replacement } reps) | n == startLine = 111 | let initial = Str.take (startColumn - m) (fromMaybe "" $ List.head lines) 112 | final = Str.drop (endColumn - (if startLine == endLine then m else 1)) (fromMaybe "" $ lines !! (endLine - startLine)) 113 | trailingNewline = either (const true) (\regex -> Regex.test regex replacement) (Regex.regex "\n\\s+$" Regex.noFlags) 114 | addNewline = trailingNewline && (not $ Str.null final) 115 | replace regex s text = either (const text) (\regex' -> Regex.replace regex' s text) (Regex.regex regex Regex.global) 116 | tweak = replace "\\n(.)" ("\n" <> fold (replicate (startColumn-1) " ") <> "$1") >>> 117 | replace "\\s+\\n" "\n" >>> 118 | trim 119 | newText = initial <> tweak replacement <> (if addNewline then "\n" else "") 120 | replaceNewText = case newText of 121 | "" -> identity 122 | _ -> Cons newText 123 | remainingLines = (drop (endLine - startLine + 1) lines) 124 | in 125 | if final == "" && newText == "" then 126 | -- Avoid blank lines when replacing entire line(s) with blank 127 | replaceNewText <$> replaceFile' (endLine+1) 1 remainingLines reps 128 | else 129 | replaceNewText <$> replaceFile' endLine endColumn (Cons final remainingLines) reps 130 | 131 | replaceFile' n _ _ (Cons { position: { startLine } } _) | n > startLine = 132 | Left $ "Found replacement starting before current position: " <> show startLine <> ", " <> show n 133 | replaceFile' _ _ lines Nil = pure $ intercalate (Cons "\n" Nil) (List.singleton <$> lines) 134 | replaceFile' _ _ _ _ = Left "Found replacement after end of file" 135 | 136 | withNewlines :: List String -> List String 137 | withNewlines = List.concatMap (\x -> Cons x (Cons "\n" Nil)) 138 | -------------------------------------------------------------------------------- /test/Main.purs: -------------------------------------------------------------------------------- 1 | module Test.Main where 2 | 3 | import Prelude 4 | 5 | import Data.Either (isLeft, Either(Right)) 6 | import Data.Foldable (intercalate) 7 | import Data.List as List 8 | import Effect (Effect) 9 | import Suggest (replaceFile') 10 | import Test.Unit (test, suite) 11 | import Test.Unit.Assert as Assert 12 | import Test.Unit.Main (runTest) 13 | 14 | -- TODO: If suggestion starts at the start of a line, and ends at the end, consume the trailing \n 15 | 16 | main :: Effect Unit 17 | main = runTest do 18 | suite "suggestions" do 19 | test "replace multi-line" do 20 | let replacements = replace (List.singleton (testReplacement 2 3 "REPLACEMENT")) 21 | Assert.equal (result [ "Line 1", "REPLACEMENT", "Line 4", "Line 5" ]) replacements 22 | test "replace single-line" do 23 | let replacements = replace (List.singleton (testReplacement 2 2 "REPLACEMENT")) 24 | Assert.equal (result [ "Line 1", "REPLACEMENT", "Line 3", "Line 4", "Line 5" ]) replacements 25 | test "2 replacements with gap" do 26 | let replacements = replace (List.fromFoldable [testReplacement 2 2 "TEXT1", testReplacement 4 4 "TEXT2"]) 27 | Assert.equal (result [ "Line 1", "TEXT1", "Line 3", "TEXT2", "Line 5" ]) replacements 28 | test "2 replacements with no gap" do 29 | let replacements = replace (List.fromFoldable [testReplacement 2 3 "TEXT1", testReplacement 4 4 "TEXT2"]) 30 | Assert.equal (result [ "Line 1", "TEXT1", "TEXT2", "Line 5" ]) replacements 31 | test "replacement after end of file" do 32 | let replacements = replace (List.fromFoldable [testReplacement 10 20 "ERROR"]) 33 | Assert.assert "should be Left" $ isLeft replacements 34 | test "replacements overlap" do 35 | let replacements = replace (List.fromFoldable [testReplacement 2 4 "TEXT1", testReplacement 3 5 "TEXT2"]) 36 | Assert.assert "should be Left" $ isLeft replacements 37 | suite "removing lines" do 38 | test "remove single line" do 39 | let replacements = replace (List.singleton (testReplacement 2 2 "")) 40 | Assert.equal (result [ "Line 1", "Line 3", "Line 4", "Line 5" ]) replacements 41 | test "remove two lines" do 42 | let replacements = replace (List.singleton (testReplacement 2 3 "")) 43 | Assert.equal (result [ "Line 1", "Line 4", "Line 5" ]) replacements 44 | test "remove two separate lines" do 45 | let replacements = replace (List.fromFoldable [testReplacement 2 2 "", testReplacement 4 4 ""]) 46 | Assert.equal (result [ "Line 1", "Line 3", "Line 5" ]) replacements 47 | suite "suggestions within a line" do 48 | test "suggestion within single line" do 49 | let replacements = replace (List.singleton (testReplacement' 2 2 2 4 "_")) 50 | Assert.equal (result [ "Line 1", "L_e 2", "Line 3", "Line 4", "Line 5" ]) replacements 51 | test "suggestions across multiple lines" do 52 | let replacements = replace (List.singleton (testReplacement' 2 2 3 4 "_")) 53 | Assert.equal (result [ "Line 1", "L_e 3", "Line 4", "Line 5" ]) replacements 54 | test "multiple suggestions on one line" do 55 | let replacements = replace (List.fromFoldable [testReplacement' 2 1 2 2 "_", testReplacement' 2 4 2 6 "_"]) 56 | Assert.equal (result [ "Line 1", "_in_2", "Line 3", "Line 4", "Line 5" ]) replacements 57 | test "multi-line replacement" do 58 | let replacements = replace (List.fromFoldable [testReplacement' 2 4 2 6 "_\n_\n_"]) 59 | Assert.equal (result 60 | [ "Line 1" 61 | , "Lin_" 62 | , " _" 63 | , " _2" 64 | , "Line 3" 65 | , "Line 4" 66 | , "Line 5" 67 | ]) replacements 68 | test "multi-line replacement (start of line)" do 69 | let replacements = replace (List.fromFoldable [testReplacement' 2 1 2 2 "_\n_\n_"]) 70 | Assert.equal (result 71 | [ "Line 1" 72 | , "_" 73 | , "_" 74 | , "_ine 2" 75 | , "Line 3" 76 | , "Line 4" 77 | , "Line 5" 78 | ]) replacements 79 | test "multi-line replacement trims trailing whitespace before newlines" do 80 | let replacements = replace (List.fromFoldable [testReplacement' 2 4 2 6 "_ \n_ \n_ "]) 81 | Assert.equal (result 82 | [ "Line 1" 83 | , "Lin_" 84 | , " _" 85 | , " _2" 86 | , "Line 3" 87 | , "Line 4" 88 | , "Line 5" 89 | ]) replacements 90 | 91 | where 92 | -- psc line indexing is 1-based 93 | replace x = intercalate "" <$> replaceFile' 1 1 (List.fromFoldable testFile) x 94 | result = Right <<< intercalate "\n" 95 | testFile = [ 96 | "Line 1" 97 | , "Line 2" 98 | , "Line 3" 99 | , "Line 4" 100 | , "Line 5" 101 | ] 102 | testFileName = "/path/to/my/file.purs" 103 | 104 | testReplacement startLine endLine replacement = 105 | { filename: testFileName 106 | , position: { startLine, startColumn: 1, endLine, endColumn: 7 } 107 | , original: "I think this is unused" 108 | , replacement 109 | } 110 | 111 | testReplacement' startLine startColumn endLine endColumn replacement = 112 | { filename: testFileName 113 | , position: { startLine, startColumn, endLine, endColumn } 114 | , original: "I think this is unused" 115 | , replacement 116 | } 117 | --------------------------------------------------------------------------------