├── .github └── workflows │ └── release.yml ├── .gitignore ├── .goreleaser.yaml ├── .npmrc ├── .vscode └── settings.json ├── LICENSE ├── README.md ├── README_ZH.md ├── bench.mjs ├── bin └── cli.js ├── go.mod ├── main.go ├── package.json ├── pnpm-lock.yaml ├── scripts ├── post.mjs └── sync.js ├── snapshot.gif ├── src ├── bin.ts ├── cli.ts ├── core.go ├── index.ts ├── node.ts └── wasm.ts ├── tea.yaml ├── tsconfig.json ├── vite.config.ts └── wasm ├── main.go ├── main.wasm ├── polyfill.js └── wasm_exec.js /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | permissions: 4 | contents: write 5 | 6 | on: 7 | push: 8 | tags: 9 | - "v*" 10 | 11 | jobs: 12 | release: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: actions/checkout@v3 16 | with: 17 | fetch-depth: 0 18 | 19 | - name: Set node 20 | uses: actions/setup-node@v3 21 | with: 22 | node-version: 16.x 23 | 24 | - run: npx changelogithub 25 | env: 26 | GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} 27 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | npm 2 | *.exe 3 | node_modules 4 | tsconfig.tsbuildinfo 5 | dist/ 6 | -------------------------------------------------------------------------------- /.goreleaser.yaml: -------------------------------------------------------------------------------- 1 | before: 2 | hooks: 3 | - go mod tidy 4 | builds: 5 | - env: 6 | - CGO_ENABLED=0 7 | goos: 8 | - linux 9 | - windows 10 | - darwin 11 | ldflags: 12 | - -s -w 13 | flags: 14 | - -trimpath 15 | archives: 16 | - format: binary 17 | name_template: >- 18 | {{ .ProjectName }}_ 19 | {{- title .Os }}_ 20 | {{- if eq .Arch "amd64" }}x86_64 21 | {{- else if eq .Arch "386" }}i386 22 | {{- else }}{{ .Arch }}{{ end }} 23 | {{- if .Arm }}v{{ .Arm }}{{ end }} 24 | checksum: 25 | name_template: "checksums.txt" 26 | changelog: 27 | sort: asc 28 | filters: 29 | exclude: 30 | - "^docs:" 31 | - "^test:" 32 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | registry=https://registry.npmjs.org/ -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "go.toolsEnvVars": { 3 | "GOARCH": "wasm", 4 | "GOOS": "js" 5 | }, 6 | "go.testEnvVars": { 7 | "GOARCH": "wasm", 8 | "GOOS": "js" 9 | }, 10 | "go.installDependenciesWhenBuilding": false, 11 | "explorer.fileNesting.enabled": true, 12 | "explorer.fileNesting.expand": false, 13 | "explorer.fileNesting.patterns": { 14 | "*.go": "*_test.go", 15 | "package.json": "*.json,*.yaml,*.sum,*.mod,LICENSE,.gitignore,*.config.ts" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT LICENSE 2 | 3 | Copyright (c) 2023 markthree 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated 6 | documentation files (the "Software"), to deal in the Software without restriction, including without limitation 7 | the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and 8 | to permit persons to whom the Software is furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 11 | 12 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO 13 | THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 14 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF 15 | CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 16 | IN THE SOFTWARE. 17 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 |

go-get-folder-size

4 |

go concurrently get folder size quickly, can run in nodejs

5 |
6 | 7 |
8 | 9 | ## README 🦉 10 | 11 | [简体中文](./README_ZH.md) | English 12 | 13 |
14 | 15 | ## features 16 | 17 | - 🐉 [ipc go](./src/bin.ts) 18 | - 🦕 [binary go](./src/bin.ts) 19 | - 🦖 [native node](./src/node.ts) 20 | - 🐊 [wasm go](./src/wasm.ts) 21 | 22 |
23 | 24 | ## motivation 25 | 26 | I want to know the folder size quickly, but the nodejs implementation of 27 | [get-folder-size](https://github.com/alessioalex/get-folder-size) is slow, so 28 | using go implements a recursive get folder size that runs in nodejs and is 29 | `7 ~ 20` times faster than the node native solution under normal circumstances。 30 | 31 |
32 | 33 | ## Usage 34 | 35 | ### npm 36 | 37 | #### install 38 | 39 | ```shell 40 | npm install go-get-folder-size 41 | ``` 42 | 43 | #### cli 44 | 45 | ```shell 46 | # Binary go, fastest 47 | npx go-get-folder-size 48 | ``` 49 | 50 | #### program 51 | 52 | ```ts 53 | import { 54 | getFolderSize, 55 | getFolderSizeBin, 56 | getFolderSizeWasm, 57 | } from "go-get-folder-size"; 58 | 59 | const base = "./"; // The directory path you want to get 60 | 61 | await getFolderSizeBin(base); // Binary go, fastest 62 | 63 | await getFolderSize(base); // native node 64 | 65 | await getFolderSizeWasm(base); // Wasm go,slowest 66 | ``` 67 | 68 | ##### IPC 69 | 70 | Suitable for multi-path 71 | 72 | ```ts 73 | import { createGetFolderSizeBinIpc } from "go-get-folder-size"; 74 | 75 | const { getFolderSizeWithIpc, close } = createGetFolderSizeBinIpc(); 76 | 77 | Promise.all([ 78 | getFolderSizeWithIpc("./"), 79 | getFolderSizeWithIpc("../"), 80 | ]) 81 | .then((vs) => console.log(vs)) 82 | .finally(close); // Manual close is required 83 | ``` 84 | 85 |
86 | 87 | ### go 88 | 89 | #### cli 90 | 91 | ```shell 92 | go install github.com/markthree/go-get-folder-size 93 | ``` 94 | 95 | ```shell 96 | go-get-folder-size 97 | ``` 98 | 99 | #### program 100 | 101 | ```shell 102 | # Super invincible fast 103 | go get github.com/markthree/go-get-folder-size 104 | ``` 105 | 106 | ```go 107 | package main 108 | 109 | import ( 110 | getFolderSize "github.com/markthree/go-get-folder-size/src" 111 | ) 112 | 113 | func main() { 114 | size, err := getFolderSize.Invoke("./") // Concurrent running, invincible fast 115 | 116 | size2 := getFolderSize.LooseInvoke("./") // Sometimes we may encounter inaccessible files, and we can set 'loose' to ignore them 117 | } 118 | ``` 119 | 120 | ## loose 121 | 122 | Sometimes we may encounter inaccessible files, and we can set `loose` to ignore 123 | them 124 | 125 | ### cli 126 | 127 | ```shell 128 | go-get-folder-size --loose 129 | ``` 130 | 131 | ### program 132 | 133 | ```ts 134 | import { 135 | getFolderSize, 136 | getFolderSizeBin, 137 | getFolderSizeWasm, 138 | } from "go-get-folder-size"; 139 | 140 | const base = "./"; // The directory path you want to get 141 | const pretty = false; // Human readable way 142 | const loose = true; 143 | 144 | await getFolderSizeBin(base, pretty, { loose }); // Binary go, fastest 145 | 146 | await getFolderSize(base, pretty, { loose }); // native node 147 | 148 | await getFolderSizeWasm(base, pretty, { loose }); // Wasm go,slowest 149 | ``` 150 | 151 |
152 | 153 | ## stack 154 | 155 | - [vite](https://github.com/vitejs/vite) 156 | - [goreleaser](https://github.com/goreleaser/goreleaser) 157 | 158 |
159 | 160 | ## License 161 | 162 | Made with [markthree](https://github.com/markthree) 163 | 164 | Published under [MIT License](./LICENSE). 165 | -------------------------------------------------------------------------------- /README_ZH.md: -------------------------------------------------------------------------------- 1 |
2 | 3 |

go-get-folder-size

4 |

go 并发快速获取文件夹大小,可以跑在 nodejs 中

5 |
6 | 7 |
8 | 9 | ## 特性 10 | 11 | - 🐉 [ipc go](./src/bin.ts) 12 | - 🦕 [二进制 go](./src/bin.ts) 13 | - 🦖 [原生 node](./src/node.ts) 14 | - 🐊 [wasm go](./src/wasm.ts) 15 | 16 |
17 | 18 | ## 动机 19 | 20 | 想要快速知道文件夹大小,但 nodejs 实现的 21 | [get-folder-size](https://github.com/alessioalex/get-folder-size) 是慢的,所以用 22 | go 实现了递归获取文件夹大小,能跑在 nodejs 中,正常情况下,比 node 原生方案快 23 | `7 ~ 20` 倍 24 | 25 | 具体可见 issue 👉 26 | [get-folder-size/issues/22](https://github.com/alessioalex/get-folder-size/issues/22) 27 | 28 |
29 | 30 | ## 使用 31 | 32 | ### npm 33 | 34 | #### install 35 | 36 | ```shell 37 | npm install go-get-folder-size 38 | ``` 39 | 40 | #### cli 41 | 42 | ```shell 43 | # Binary go, fastest 44 | npx go-get-folder-size 45 | ``` 46 | 47 | #### program 48 | 49 | ```ts 50 | import { 51 | getFolderSize, 52 | getFolderSizeBin, 53 | getFolderSizeWasm, 54 | } from "go-get-folder-size"; 55 | 56 | const base = "./"; // 你想要获取的目录 57 | 58 | await getFolderSizeBin(base); // 二进制 go,最快 59 | 60 | await getFolderSize(base); // 原生 node 61 | 62 | await getFolderSizeWasm(base); // Wasm go,最慢 🥵 63 | ``` 64 | 65 | ### go 66 | 67 | #### install 68 | 69 | ```shell 70 | go install github.com/markthree/go-get-folder-size 71 | ``` 72 | 73 | #### cli 74 | 75 | ```shell 76 | go-get-folder-size 77 | ``` 78 | 79 | #### program 80 | 81 | ```shell 82 | go get github.com/markthree/go-get-folder-size 83 | ``` 84 | 85 | ```go 86 | package main 87 | 88 | import ( 89 | getFolderSize "github.com/markthree/go-get-folder-size/src" 90 | ) 91 | 92 | func main() { 93 | size, err := getFolderSize.Invoke("./") // 并发计算,超级快 94 | 95 | size2 := getFolderSize.LooseInvoke("./") // 有时我们可能会遇到不可访问的文件,我们可以使用 loose 来忽略它们 96 | } 97 | ``` 98 | 99 |
100 | 101 | ##### IPC 102 | 103 | 适用于多路径 104 | 105 | ```ts 106 | import { createGetFolderSizeBinIpc } from "go-get-folder-size"; 107 | 108 | const { getFolderSizeWithIpc, close } = createGetFolderSizeBinIpc(); 109 | 110 | Promise.all([ 111 | getFolderSizeWithIpc("./"), 112 | getFolderSizeWithIpc("../"), 113 | ]) 114 | .then((vs) => console.log(vs)) 115 | .finally(close); // 手动退出是必需的 116 | ``` 117 | 118 | ## loose 119 | 120 | 有时我们可能会遇到不可访问的文件,我们可以使用 `loose` 来忽略它们 121 | 122 | ### cli 123 | 124 | ```shell 125 | go-get-folder-size --loose 126 | ``` 127 | 128 | ### program 129 | 130 | ```ts 131 | import { 132 | getFolderSize, 133 | getFolderSizeBin, 134 | getFolderSizeWasm, 135 | } from "go-get-folder-size"; 136 | 137 | const base = "./"; // 你想要获取的目录 138 | const pretty = false; // 人类可读的方式 139 | const loose = true; 140 | 141 | await getFolderSizeBin(base, pretty, { loose }); // Binary go, fastest 142 | 143 | await getFolderSize(base, pretty, { loose }); // native node 144 | 145 | await getFolderSizeWasm(base, pretty, { loose }); // Wasm go,slowest 146 | ``` 147 | 148 |
149 | 150 | ## 提示 151 | 152 | - 目前该包被使用在组织内的本地项目管理器中,首次获取项目大小优化到 `1s` 内 👉 153 | [x-pm](https://github.com/dishait/x-pm) 154 | 155 |
156 | 157 | ## 灵感来源 158 | 159 | [esbuild](https://github.com/evanw/esbuild) 160 | 161 |
162 | 163 | ## License 164 | 165 | Made with [markthree](https://github.com/markthree) 166 | 167 | Published under 168 | [MIT License](https://github.com/markthree/go-get-folder-size/blob/main/LICENSE). 169 | 170 |
171 | -------------------------------------------------------------------------------- /bench.mjs: -------------------------------------------------------------------------------- 1 | import { 2 | createGetFolderSizeBinIpc, 3 | getFolderSize, 4 | getFolderSizeBin, 5 | } from "./npm/index.mjs"; 6 | 7 | const { getFolderSizeWithIpc, close } = createGetFolderSizeBinIpc(); 8 | 9 | const base = "../"; 10 | 11 | const nodeStartTime = Date.now(); 12 | const nodeResult = await getFolderSize(base, true); 13 | const nodeDuration = Date.now() - nodeStartTime; 14 | 15 | const goBinStartTime = Date.now(); 16 | const goBinResult = await getFolderSizeBin(base, true); 17 | const goBinDuration = Date.now() - goBinStartTime; 18 | 19 | const goIpcStartTime = Date.now(); 20 | const goIpcResult = await getFolderSizeWithIpc(base, true); 21 | const goIpcDuration = Date.now() - goIpcStartTime; 22 | 23 | close(); 24 | 25 | console.log( 26 | `node - duration: ${nodeDuration / 1000}s result: ${nodeResult}`, 27 | ); 28 | console.log( 29 | `goBin - duration: ${goBinDuration / 1000}s result: ${goBinResult}`, 30 | ); 31 | console.log( 32 | `goIpc - duration: ${goIpcDuration / 1000}s result: ${goIpcResult}`, 33 | ); 34 | 35 | console.log("\n"); 36 | 37 | console.log( 38 | "goBin vs node -", 39 | (nodeDuration / goBinDuration).toFixed(2) + " ↑", 40 | ); 41 | 42 | console.log( 43 | "goIpc vs node -", 44 | (nodeDuration / goIpcDuration).toFixed(2) + " ↑", 45 | ); 46 | -------------------------------------------------------------------------------- /bin/cli.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | require("../npm/cli.cjs"); 3 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/markthree/go-get-folder-size 2 | 3 | go 1.21 4 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | // go-cli 2 | package main 3 | 4 | import ( 5 | "bufio" 6 | "fmt" 7 | "os" 8 | 9 | getFolderSize "github.com/markthree/go-get-folder-size/src" 10 | ) 11 | 12 | func success(base string, size int64) { 13 | fmt.Fprintf(os.Stdout, "%v,%v\n", base, size) 14 | } 15 | 16 | func fail(base string, err error) { 17 | fmt.Fprintf(os.Stderr, "%v,%v", base, err) 18 | } 19 | 20 | func handle(base string) { 21 | size, err := getFolderSize.Invoke(base) 22 | 23 | if err != nil { 24 | fail(base, err) 25 | return 26 | } 27 | 28 | success(base, size) 29 | } 30 | 31 | func looseHandle(base string) { 32 | size := getFolderSize.LooseInvoke(base) 33 | success(base, size) 34 | } 35 | 36 | func main() { 37 | isIpc := os.Getenv("ipc") == "true" 38 | isLoose := os.Getenv("loose") == "true" 39 | 40 | if isIpc { 41 | reader := bufio.NewReader(os.Stdin) 42 | for { 43 | base, err := reader.ReadString(',') 44 | base = base[:len(base)-1] 45 | if err != nil { 46 | fail(base, err) 47 | continue 48 | } 49 | 50 | if isLoose { 51 | go looseHandle(base) 52 | } else { 53 | go handle(base) 54 | } 55 | } 56 | } else { 57 | root, err := os.Getwd() 58 | if err != nil { 59 | fmt.Fprint(os.Stderr, err) 60 | return 61 | } 62 | if isLoose { 63 | size := getFolderSize.LooseInvoke(root) 64 | fmt.Fprint(os.Stdout, size) 65 | } else { 66 | size, err := getFolderSize.Invoke(root) 67 | if err != nil { 68 | fmt.Fprint(os.Stderr, err) 69 | return 70 | } 71 | fmt.Fprint(os.Stdout, size) 72 | } 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "go-get-folder-size", 3 | "version": "0.5.5", 4 | "description": "Get the size of a folder by recursively iterating through all its sub(files && folders). Use go, so high-speed", 5 | "main": "./npm/index.cjs", 6 | "module": "./npm/index.mjs", 7 | "types": "./npm/index.d.ts", 8 | "bin": { 9 | "go-get-folder-size": "bin/cli.js" 10 | }, 11 | "files": [ 12 | "bin", 13 | "npm", 14 | "dist", 15 | "scripts/post.mjs" 16 | ], 17 | "repository": { 18 | "type": "git", 19 | "url": "git+https://github.com/markthree/go-get-folder-size.git" 20 | }, 21 | "exports": { 22 | ".": { 23 | "require": "./npm/index.cjs", 24 | "import": "./npm/index.mjs", 25 | "types": "./npm/index.d.ts" 26 | }, 27 | "./*": "./*" 28 | }, 29 | "scripts": { 30 | "play-go": "go run", 31 | "build-types": "tsc", 32 | "build-go": "go build", 33 | "bench": "node bench.mjs", 34 | "build-ts": "vite build", 35 | "sync": "node scripts/sync.js", 36 | "prepublishOnly": "pnpm build", 37 | "release": "bumpp --push --tag --all && npm publish", 38 | "build-go-bin": "goreleaser release --snapshot --clean", 39 | "build": "rimraf -rf npm dist && run-p build-go-wasm build-go-bin && run-p build-ts build-types", 40 | "build-go-wasm": "cross-env GOOS=js GOARCH=wasm go build -o ./wasm/main.wasm ./wasm/main.go", 41 | "postinstall": "node scripts/post.mjs" 42 | }, 43 | "keywords": [ 44 | "go", 45 | "size", 46 | "folder", 47 | "fastest", 48 | "webAssembly" 49 | ], 50 | "author": { 51 | "name": "markthree", 52 | "email": "1801982702@qq.com", 53 | "url": "https://github.com/markthree" 54 | }, 55 | "license": "MIT", 56 | "devDependencies": { 57 | "@types/node": "^18.18.3", 58 | "bumpp": "^9.2.0", 59 | "cross-env": "^7.0.3", 60 | "execa": "^8.0.1", 61 | "mri": "^1.2.0", 62 | "npm-run-all": "^4.1.5", 63 | "pretty-bytes": "^6.1.1", 64 | "rimraf": "^5.0.5", 65 | "specifier-backward": "^0.0.4", 66 | "typescript": "^5.2.2", 67 | "vite": "^4.4.10" 68 | }, 69 | "dependencies": { 70 | "std-env": "^3.7.0" 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | std-env: 9 | specifier: ^3.7.0 10 | version: 3.7.0 11 | 12 | devDependencies: 13 | '@types/node': 14 | specifier: ^18.18.3 15 | version: 18.18.3 16 | bumpp: 17 | specifier: ^9.2.0 18 | version: 9.2.0 19 | cross-env: 20 | specifier: ^7.0.3 21 | version: 7.0.3 22 | execa: 23 | specifier: ^8.0.1 24 | version: 8.0.1 25 | mri: 26 | specifier: ^1.2.0 27 | version: 1.2.0 28 | npm-run-all: 29 | specifier: ^4.1.5 30 | version: 4.1.5 31 | pretty-bytes: 32 | specifier: ^6.1.1 33 | version: 6.1.1 34 | rimraf: 35 | specifier: ^5.0.5 36 | version: 5.0.5 37 | specifier-backward: 38 | specifier: ^0.0.4 39 | version: 0.0.4 40 | typescript: 41 | specifier: ^5.2.2 42 | version: 5.2.2 43 | vite: 44 | specifier: ^4.4.10 45 | version: 4.4.10(@types/node@18.18.3) 46 | 47 | packages: 48 | 49 | /@esbuild/android-arm64@0.18.20: 50 | resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} 51 | engines: {node: '>=12'} 52 | cpu: [arm64] 53 | os: [android] 54 | requiresBuild: true 55 | dev: true 56 | optional: true 57 | 58 | /@esbuild/android-arm@0.18.20: 59 | resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} 60 | engines: {node: '>=12'} 61 | cpu: [arm] 62 | os: [android] 63 | requiresBuild: true 64 | dev: true 65 | optional: true 66 | 67 | /@esbuild/android-x64@0.18.20: 68 | resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} 69 | engines: {node: '>=12'} 70 | cpu: [x64] 71 | os: [android] 72 | requiresBuild: true 73 | dev: true 74 | optional: true 75 | 76 | /@esbuild/darwin-arm64@0.18.20: 77 | resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} 78 | engines: {node: '>=12'} 79 | cpu: [arm64] 80 | os: [darwin] 81 | requiresBuild: true 82 | dev: true 83 | optional: true 84 | 85 | /@esbuild/darwin-x64@0.18.20: 86 | resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} 87 | engines: {node: '>=12'} 88 | cpu: [x64] 89 | os: [darwin] 90 | requiresBuild: true 91 | dev: true 92 | optional: true 93 | 94 | /@esbuild/freebsd-arm64@0.18.20: 95 | resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} 96 | engines: {node: '>=12'} 97 | cpu: [arm64] 98 | os: [freebsd] 99 | requiresBuild: true 100 | dev: true 101 | optional: true 102 | 103 | /@esbuild/freebsd-x64@0.18.20: 104 | resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} 105 | engines: {node: '>=12'} 106 | cpu: [x64] 107 | os: [freebsd] 108 | requiresBuild: true 109 | dev: true 110 | optional: true 111 | 112 | /@esbuild/linux-arm64@0.18.20: 113 | resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} 114 | engines: {node: '>=12'} 115 | cpu: [arm64] 116 | os: [linux] 117 | requiresBuild: true 118 | dev: true 119 | optional: true 120 | 121 | /@esbuild/linux-arm@0.18.20: 122 | resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} 123 | engines: {node: '>=12'} 124 | cpu: [arm] 125 | os: [linux] 126 | requiresBuild: true 127 | dev: true 128 | optional: true 129 | 130 | /@esbuild/linux-ia32@0.18.20: 131 | resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} 132 | engines: {node: '>=12'} 133 | cpu: [ia32] 134 | os: [linux] 135 | requiresBuild: true 136 | dev: true 137 | optional: true 138 | 139 | /@esbuild/linux-loong64@0.18.20: 140 | resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} 141 | engines: {node: '>=12'} 142 | cpu: [loong64] 143 | os: [linux] 144 | requiresBuild: true 145 | dev: true 146 | optional: true 147 | 148 | /@esbuild/linux-mips64el@0.18.20: 149 | resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} 150 | engines: {node: '>=12'} 151 | cpu: [mips64el] 152 | os: [linux] 153 | requiresBuild: true 154 | dev: true 155 | optional: true 156 | 157 | /@esbuild/linux-ppc64@0.18.20: 158 | resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} 159 | engines: {node: '>=12'} 160 | cpu: [ppc64] 161 | os: [linux] 162 | requiresBuild: true 163 | dev: true 164 | optional: true 165 | 166 | /@esbuild/linux-riscv64@0.18.20: 167 | resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} 168 | engines: {node: '>=12'} 169 | cpu: [riscv64] 170 | os: [linux] 171 | requiresBuild: true 172 | dev: true 173 | optional: true 174 | 175 | /@esbuild/linux-s390x@0.18.20: 176 | resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} 177 | engines: {node: '>=12'} 178 | cpu: [s390x] 179 | os: [linux] 180 | requiresBuild: true 181 | dev: true 182 | optional: true 183 | 184 | /@esbuild/linux-x64@0.18.20: 185 | resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} 186 | engines: {node: '>=12'} 187 | cpu: [x64] 188 | os: [linux] 189 | requiresBuild: true 190 | dev: true 191 | optional: true 192 | 193 | /@esbuild/netbsd-x64@0.18.20: 194 | resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} 195 | engines: {node: '>=12'} 196 | cpu: [x64] 197 | os: [netbsd] 198 | requiresBuild: true 199 | dev: true 200 | optional: true 201 | 202 | /@esbuild/openbsd-x64@0.18.20: 203 | resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} 204 | engines: {node: '>=12'} 205 | cpu: [x64] 206 | os: [openbsd] 207 | requiresBuild: true 208 | dev: true 209 | optional: true 210 | 211 | /@esbuild/sunos-x64@0.18.20: 212 | resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} 213 | engines: {node: '>=12'} 214 | cpu: [x64] 215 | os: [sunos] 216 | requiresBuild: true 217 | dev: true 218 | optional: true 219 | 220 | /@esbuild/win32-arm64@0.18.20: 221 | resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} 222 | engines: {node: '>=12'} 223 | cpu: [arm64] 224 | os: [win32] 225 | requiresBuild: true 226 | dev: true 227 | optional: true 228 | 229 | /@esbuild/win32-ia32@0.18.20: 230 | resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} 231 | engines: {node: '>=12'} 232 | cpu: [ia32] 233 | os: [win32] 234 | requiresBuild: true 235 | dev: true 236 | optional: true 237 | 238 | /@esbuild/win32-x64@0.18.20: 239 | resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} 240 | engines: {node: '>=12'} 241 | cpu: [x64] 242 | os: [win32] 243 | requiresBuild: true 244 | dev: true 245 | optional: true 246 | 247 | /@isaacs/cliui@8.0.2: 248 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 249 | engines: {node: '>=12'} 250 | dependencies: 251 | string-width: 5.1.2 252 | string-width-cjs: /string-width@4.2.3 253 | strip-ansi: 7.1.0 254 | strip-ansi-cjs: /strip-ansi@6.0.1 255 | wrap-ansi: 8.1.0 256 | wrap-ansi-cjs: /wrap-ansi@7.0.0 257 | dev: true 258 | 259 | /@jsdevtools/ez-spawn@3.0.4: 260 | resolution: {integrity: sha512-f5DRIOZf7wxogefH03RjMPMdBF7ADTWUMoOs9kaJo06EfwF+aFhMZMDZxHg/Xe12hptN9xoZjGso2fdjapBRIA==} 261 | engines: {node: '>=10'} 262 | dependencies: 263 | call-me-maybe: 1.0.2 264 | cross-spawn: 7.0.3 265 | string-argv: 0.3.2 266 | type-detect: 4.0.8 267 | dev: true 268 | 269 | /@nodelib/fs.scandir@2.1.5: 270 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 271 | engines: {node: '>= 8'} 272 | dependencies: 273 | '@nodelib/fs.stat': 2.0.5 274 | run-parallel: 1.2.0 275 | dev: true 276 | 277 | /@nodelib/fs.stat@2.0.5: 278 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 279 | engines: {node: '>= 8'} 280 | dev: true 281 | 282 | /@nodelib/fs.walk@1.2.8: 283 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 284 | engines: {node: '>= 8'} 285 | dependencies: 286 | '@nodelib/fs.scandir': 2.1.5 287 | fastq: 1.15.0 288 | dev: true 289 | 290 | /@pkgjs/parseargs@0.11.0: 291 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 292 | engines: {node: '>=14'} 293 | requiresBuild: true 294 | dev: true 295 | optional: true 296 | 297 | /@types/node@18.18.3: 298 | resolution: {integrity: sha512-0OVfGupTl3NBFr8+iXpfZ8NR7jfFO+P1Q+IO/q0wbo02wYkP5gy36phojeYWpLQ6WAMjl+VfmqUk2YbUfp0irA==} 299 | dev: true 300 | 301 | /acorn@8.10.0: 302 | resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} 303 | engines: {node: '>=0.4.0'} 304 | hasBin: true 305 | dev: true 306 | 307 | /agent-base@6.0.2: 308 | resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} 309 | engines: {node: '>= 6.0.0'} 310 | dependencies: 311 | debug: 4.3.4 312 | transitivePeerDependencies: 313 | - supports-color 314 | dev: true 315 | 316 | /ansi-regex@5.0.1: 317 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 318 | engines: {node: '>=8'} 319 | dev: true 320 | 321 | /ansi-regex@6.0.1: 322 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} 323 | engines: {node: '>=12'} 324 | dev: true 325 | 326 | /ansi-styles@3.2.1: 327 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 328 | engines: {node: '>=4'} 329 | dependencies: 330 | color-convert: 1.9.3 331 | dev: true 332 | 333 | /ansi-styles@4.3.0: 334 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 335 | engines: {node: '>=8'} 336 | dependencies: 337 | color-convert: 2.0.1 338 | dev: true 339 | 340 | /ansi-styles@6.2.1: 341 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 342 | engines: {node: '>=12'} 343 | dev: true 344 | 345 | /anymatch@3.1.3: 346 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 347 | engines: {node: '>= 8'} 348 | dependencies: 349 | normalize-path: 3.0.0 350 | picomatch: 2.3.1 351 | dev: true 352 | 353 | /array-buffer-byte-length@1.0.0: 354 | resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} 355 | dependencies: 356 | call-bind: 1.0.2 357 | is-array-buffer: 3.0.2 358 | dev: true 359 | 360 | /arraybuffer.prototype.slice@1.0.1: 361 | resolution: {integrity: sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==} 362 | engines: {node: '>= 0.4'} 363 | dependencies: 364 | array-buffer-byte-length: 1.0.0 365 | call-bind: 1.0.2 366 | define-properties: 1.2.0 367 | get-intrinsic: 1.2.1 368 | is-array-buffer: 3.0.2 369 | is-shared-array-buffer: 1.0.2 370 | dev: true 371 | 372 | /available-typed-arrays@1.0.5: 373 | resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} 374 | engines: {node: '>= 0.4'} 375 | dev: true 376 | 377 | /balanced-match@1.0.2: 378 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 379 | dev: true 380 | 381 | /binary-extensions@2.2.0: 382 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 383 | engines: {node: '>=8'} 384 | dev: true 385 | 386 | /brace-expansion@1.1.11: 387 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 388 | dependencies: 389 | balanced-match: 1.0.2 390 | concat-map: 0.0.1 391 | dev: true 392 | 393 | /brace-expansion@2.0.1: 394 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 395 | dependencies: 396 | balanced-match: 1.0.2 397 | dev: true 398 | 399 | /braces@3.0.2: 400 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 401 | engines: {node: '>=8'} 402 | dependencies: 403 | fill-range: 7.0.1 404 | dev: true 405 | 406 | /bumpp@9.2.0: 407 | resolution: {integrity: sha512-pgp7y3jp33QTaXFVDrE0IKuZF5Y8EsIz+ywZXFALW2nD+ZD+4crxJe/GypBQBoJuZrr5dc6TGrR3wl7fk3+C6w==} 408 | engines: {node: '>=10'} 409 | hasBin: true 410 | dependencies: 411 | '@jsdevtools/ez-spawn': 3.0.4 412 | c12: 1.4.2 413 | cac: 6.7.14 414 | fast-glob: 3.3.1 415 | prompts: 2.4.2 416 | semver: 7.5.4 417 | transitivePeerDependencies: 418 | - supports-color 419 | dev: true 420 | 421 | /c12@1.4.2: 422 | resolution: {integrity: sha512-3IP/MuamSVRVw8W8+CHWAz9gKN4gd+voF2zm/Ln6D25C2RhytEZ1ABbC8MjKr4BR9rhoV1JQ7jJA158LDiTkLg==} 423 | dependencies: 424 | chokidar: 3.5.3 425 | defu: 6.1.2 426 | dotenv: 16.3.1 427 | giget: 1.1.2 428 | jiti: 1.19.3 429 | mlly: 1.4.0 430 | ohash: 1.1.3 431 | pathe: 1.1.1 432 | perfect-debounce: 1.0.0 433 | pkg-types: 1.0.3 434 | rc9: 2.1.1 435 | transitivePeerDependencies: 436 | - supports-color 437 | dev: true 438 | 439 | /cac@6.7.14: 440 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 441 | engines: {node: '>=8'} 442 | dev: true 443 | 444 | /call-bind@1.0.2: 445 | resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} 446 | dependencies: 447 | function-bind: 1.1.1 448 | get-intrinsic: 1.2.1 449 | dev: true 450 | 451 | /call-me-maybe@1.0.2: 452 | resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} 453 | dev: true 454 | 455 | /chalk@2.4.2: 456 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 457 | engines: {node: '>=4'} 458 | dependencies: 459 | ansi-styles: 3.2.1 460 | escape-string-regexp: 1.0.5 461 | supports-color: 5.5.0 462 | dev: true 463 | 464 | /chokidar@3.5.3: 465 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 466 | engines: {node: '>= 8.10.0'} 467 | dependencies: 468 | anymatch: 3.1.3 469 | braces: 3.0.2 470 | glob-parent: 5.1.2 471 | is-binary-path: 2.1.0 472 | is-glob: 4.0.3 473 | normalize-path: 3.0.0 474 | readdirp: 3.6.0 475 | optionalDependencies: 476 | fsevents: 2.3.2 477 | dev: true 478 | 479 | /chownr@2.0.0: 480 | resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} 481 | engines: {node: '>=10'} 482 | dev: true 483 | 484 | /color-convert@1.9.3: 485 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 486 | dependencies: 487 | color-name: 1.1.3 488 | dev: true 489 | 490 | /color-convert@2.0.1: 491 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 492 | engines: {node: '>=7.0.0'} 493 | dependencies: 494 | color-name: 1.1.4 495 | dev: true 496 | 497 | /color-name@1.1.3: 498 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 499 | dev: true 500 | 501 | /color-name@1.1.4: 502 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 503 | dev: true 504 | 505 | /colorette@2.0.20: 506 | resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} 507 | dev: true 508 | 509 | /concat-map@0.0.1: 510 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 511 | dev: true 512 | 513 | /cross-env@7.0.3: 514 | resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} 515 | engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} 516 | hasBin: true 517 | dependencies: 518 | cross-spawn: 7.0.3 519 | dev: true 520 | 521 | /cross-spawn@6.0.5: 522 | resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} 523 | engines: {node: '>=4.8'} 524 | dependencies: 525 | nice-try: 1.0.5 526 | path-key: 2.0.1 527 | semver: 5.7.2 528 | shebang-command: 1.2.0 529 | which: 1.3.1 530 | dev: true 531 | 532 | /cross-spawn@7.0.3: 533 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 534 | engines: {node: '>= 8'} 535 | dependencies: 536 | path-key: 3.1.1 537 | shebang-command: 2.0.0 538 | which: 2.0.2 539 | dev: true 540 | 541 | /debug@4.3.4: 542 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 543 | engines: {node: '>=6.0'} 544 | peerDependencies: 545 | supports-color: '*' 546 | peerDependenciesMeta: 547 | supports-color: 548 | optional: true 549 | dependencies: 550 | ms: 2.1.2 551 | dev: true 552 | 553 | /define-properties@1.2.0: 554 | resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} 555 | engines: {node: '>= 0.4'} 556 | dependencies: 557 | has-property-descriptors: 1.0.0 558 | object-keys: 1.1.1 559 | dev: true 560 | 561 | /defu@6.1.2: 562 | resolution: {integrity: sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==} 563 | dev: true 564 | 565 | /destr@2.0.1: 566 | resolution: {integrity: sha512-M1Ob1zPSIvlARiJUkKqvAZ3VAqQY6Jcuth/pBKQ2b1dX/Qx0OnJ8Vux6J2H5PTMQeRzWrrbTu70VxBfv/OPDJA==} 567 | dev: true 568 | 569 | /dotenv@16.3.1: 570 | resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} 571 | engines: {node: '>=12'} 572 | dev: true 573 | 574 | /eastasianwidth@0.2.0: 575 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 576 | dev: true 577 | 578 | /emoji-regex@8.0.0: 579 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 580 | dev: true 581 | 582 | /emoji-regex@9.2.2: 583 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 584 | dev: true 585 | 586 | /error-ex@1.3.2: 587 | resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 588 | dependencies: 589 | is-arrayish: 0.2.1 590 | dev: true 591 | 592 | /es-abstract@1.22.1: 593 | resolution: {integrity: sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==} 594 | engines: {node: '>= 0.4'} 595 | dependencies: 596 | array-buffer-byte-length: 1.0.0 597 | arraybuffer.prototype.slice: 1.0.1 598 | available-typed-arrays: 1.0.5 599 | call-bind: 1.0.2 600 | es-set-tostringtag: 2.0.1 601 | es-to-primitive: 1.2.1 602 | function.prototype.name: 1.1.5 603 | get-intrinsic: 1.2.1 604 | get-symbol-description: 1.0.0 605 | globalthis: 1.0.3 606 | gopd: 1.0.1 607 | has: 1.0.3 608 | has-property-descriptors: 1.0.0 609 | has-proto: 1.0.1 610 | has-symbols: 1.0.3 611 | internal-slot: 1.0.5 612 | is-array-buffer: 3.0.2 613 | is-callable: 1.2.7 614 | is-negative-zero: 2.0.2 615 | is-regex: 1.1.4 616 | is-shared-array-buffer: 1.0.2 617 | is-string: 1.0.7 618 | is-typed-array: 1.1.12 619 | is-weakref: 1.0.2 620 | object-inspect: 1.12.3 621 | object-keys: 1.1.1 622 | object.assign: 4.1.4 623 | regexp.prototype.flags: 1.5.0 624 | safe-array-concat: 1.0.0 625 | safe-regex-test: 1.0.0 626 | string.prototype.trim: 1.2.7 627 | string.prototype.trimend: 1.0.6 628 | string.prototype.trimstart: 1.0.6 629 | typed-array-buffer: 1.0.0 630 | typed-array-byte-length: 1.0.0 631 | typed-array-byte-offset: 1.0.0 632 | typed-array-length: 1.0.4 633 | unbox-primitive: 1.0.2 634 | which-typed-array: 1.1.11 635 | dev: true 636 | 637 | /es-set-tostringtag@2.0.1: 638 | resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} 639 | engines: {node: '>= 0.4'} 640 | dependencies: 641 | get-intrinsic: 1.2.1 642 | has: 1.0.3 643 | has-tostringtag: 1.0.0 644 | dev: true 645 | 646 | /es-to-primitive@1.2.1: 647 | resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} 648 | engines: {node: '>= 0.4'} 649 | dependencies: 650 | is-callable: 1.2.7 651 | is-date-object: 1.0.5 652 | is-symbol: 1.0.4 653 | dev: true 654 | 655 | /esbuild@0.18.20: 656 | resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} 657 | engines: {node: '>=12'} 658 | hasBin: true 659 | requiresBuild: true 660 | optionalDependencies: 661 | '@esbuild/android-arm': 0.18.20 662 | '@esbuild/android-arm64': 0.18.20 663 | '@esbuild/android-x64': 0.18.20 664 | '@esbuild/darwin-arm64': 0.18.20 665 | '@esbuild/darwin-x64': 0.18.20 666 | '@esbuild/freebsd-arm64': 0.18.20 667 | '@esbuild/freebsd-x64': 0.18.20 668 | '@esbuild/linux-arm': 0.18.20 669 | '@esbuild/linux-arm64': 0.18.20 670 | '@esbuild/linux-ia32': 0.18.20 671 | '@esbuild/linux-loong64': 0.18.20 672 | '@esbuild/linux-mips64el': 0.18.20 673 | '@esbuild/linux-ppc64': 0.18.20 674 | '@esbuild/linux-riscv64': 0.18.20 675 | '@esbuild/linux-s390x': 0.18.20 676 | '@esbuild/linux-x64': 0.18.20 677 | '@esbuild/netbsd-x64': 0.18.20 678 | '@esbuild/openbsd-x64': 0.18.20 679 | '@esbuild/sunos-x64': 0.18.20 680 | '@esbuild/win32-arm64': 0.18.20 681 | '@esbuild/win32-ia32': 0.18.20 682 | '@esbuild/win32-x64': 0.18.20 683 | dev: true 684 | 685 | /escape-string-regexp@1.0.5: 686 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 687 | engines: {node: '>=0.8.0'} 688 | dev: true 689 | 690 | /execa@8.0.1: 691 | resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} 692 | engines: {node: '>=16.17'} 693 | dependencies: 694 | cross-spawn: 7.0.3 695 | get-stream: 8.0.1 696 | human-signals: 5.0.0 697 | is-stream: 3.0.0 698 | merge-stream: 2.0.0 699 | npm-run-path: 5.1.0 700 | onetime: 6.0.0 701 | signal-exit: 4.1.0 702 | strip-final-newline: 3.0.0 703 | dev: true 704 | 705 | /fast-glob@3.3.1: 706 | resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} 707 | engines: {node: '>=8.6.0'} 708 | dependencies: 709 | '@nodelib/fs.stat': 2.0.5 710 | '@nodelib/fs.walk': 1.2.8 711 | glob-parent: 5.1.2 712 | merge2: 1.4.1 713 | micromatch: 4.0.5 714 | dev: true 715 | 716 | /fastq@1.15.0: 717 | resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} 718 | dependencies: 719 | reusify: 1.0.4 720 | dev: true 721 | 722 | /fill-range@7.0.1: 723 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 724 | engines: {node: '>=8'} 725 | dependencies: 726 | to-regex-range: 5.0.1 727 | dev: true 728 | 729 | /flat@5.0.2: 730 | resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} 731 | hasBin: true 732 | dev: true 733 | 734 | /for-each@0.3.3: 735 | resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} 736 | dependencies: 737 | is-callable: 1.2.7 738 | dev: true 739 | 740 | /foreground-child@3.1.1: 741 | resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} 742 | engines: {node: '>=14'} 743 | dependencies: 744 | cross-spawn: 7.0.3 745 | signal-exit: 4.1.0 746 | dev: true 747 | 748 | /fs-minipass@2.1.0: 749 | resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} 750 | engines: {node: '>= 8'} 751 | dependencies: 752 | minipass: 3.3.6 753 | dev: true 754 | 755 | /fsevents@2.3.2: 756 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 757 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 758 | os: [darwin] 759 | requiresBuild: true 760 | dev: true 761 | optional: true 762 | 763 | /function-bind@1.1.1: 764 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 765 | dev: true 766 | 767 | /function.prototype.name@1.1.5: 768 | resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} 769 | engines: {node: '>= 0.4'} 770 | dependencies: 771 | call-bind: 1.0.2 772 | define-properties: 1.2.0 773 | es-abstract: 1.22.1 774 | functions-have-names: 1.2.3 775 | dev: true 776 | 777 | /functions-have-names@1.2.3: 778 | resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} 779 | dev: true 780 | 781 | /get-intrinsic@1.2.1: 782 | resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} 783 | dependencies: 784 | function-bind: 1.1.1 785 | has: 1.0.3 786 | has-proto: 1.0.1 787 | has-symbols: 1.0.3 788 | dev: true 789 | 790 | /get-stream@8.0.1: 791 | resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} 792 | engines: {node: '>=16'} 793 | dev: true 794 | 795 | /get-symbol-description@1.0.0: 796 | resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} 797 | engines: {node: '>= 0.4'} 798 | dependencies: 799 | call-bind: 1.0.2 800 | get-intrinsic: 1.2.1 801 | dev: true 802 | 803 | /giget@1.1.2: 804 | resolution: {integrity: sha512-HsLoS07HiQ5oqvObOI+Qb2tyZH4Gj5nYGfF9qQcZNrPw+uEFhdXtgJr01aO2pWadGHucajYDLxxbtQkm97ON2A==} 805 | hasBin: true 806 | dependencies: 807 | colorette: 2.0.20 808 | defu: 6.1.2 809 | https-proxy-agent: 5.0.1 810 | mri: 1.2.0 811 | node-fetch-native: 1.2.0 812 | pathe: 1.1.1 813 | tar: 6.1.15 814 | transitivePeerDependencies: 815 | - supports-color 816 | dev: true 817 | 818 | /glob-parent@5.1.2: 819 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 820 | engines: {node: '>= 6'} 821 | dependencies: 822 | is-glob: 4.0.3 823 | dev: true 824 | 825 | /glob@10.3.10: 826 | resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} 827 | engines: {node: '>=16 || 14 >=14.17'} 828 | hasBin: true 829 | dependencies: 830 | foreground-child: 3.1.1 831 | jackspeak: 2.3.6 832 | minimatch: 9.0.3 833 | minipass: 7.0.3 834 | path-scurry: 1.10.1 835 | dev: true 836 | 837 | /globalthis@1.0.3: 838 | resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} 839 | engines: {node: '>= 0.4'} 840 | dependencies: 841 | define-properties: 1.2.0 842 | dev: true 843 | 844 | /gopd@1.0.1: 845 | resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} 846 | dependencies: 847 | get-intrinsic: 1.2.1 848 | dev: true 849 | 850 | /graceful-fs@4.2.11: 851 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 852 | dev: true 853 | 854 | /has-bigints@1.0.2: 855 | resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} 856 | dev: true 857 | 858 | /has-flag@3.0.0: 859 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 860 | engines: {node: '>=4'} 861 | dev: true 862 | 863 | /has-property-descriptors@1.0.0: 864 | resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} 865 | dependencies: 866 | get-intrinsic: 1.2.1 867 | dev: true 868 | 869 | /has-proto@1.0.1: 870 | resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} 871 | engines: {node: '>= 0.4'} 872 | dev: true 873 | 874 | /has-symbols@1.0.3: 875 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 876 | engines: {node: '>= 0.4'} 877 | dev: true 878 | 879 | /has-tostringtag@1.0.0: 880 | resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} 881 | engines: {node: '>= 0.4'} 882 | dependencies: 883 | has-symbols: 1.0.3 884 | dev: true 885 | 886 | /has@1.0.3: 887 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 888 | engines: {node: '>= 0.4.0'} 889 | dependencies: 890 | function-bind: 1.1.1 891 | dev: true 892 | 893 | /hosted-git-info@2.8.9: 894 | resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} 895 | dev: true 896 | 897 | /https-proxy-agent@5.0.1: 898 | resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} 899 | engines: {node: '>= 6'} 900 | dependencies: 901 | agent-base: 6.0.2 902 | debug: 4.3.4 903 | transitivePeerDependencies: 904 | - supports-color 905 | dev: true 906 | 907 | /human-signals@5.0.0: 908 | resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} 909 | engines: {node: '>=16.17.0'} 910 | dev: true 911 | 912 | /internal-slot@1.0.5: 913 | resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} 914 | engines: {node: '>= 0.4'} 915 | dependencies: 916 | get-intrinsic: 1.2.1 917 | has: 1.0.3 918 | side-channel: 1.0.4 919 | dev: true 920 | 921 | /is-array-buffer@3.0.2: 922 | resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} 923 | dependencies: 924 | call-bind: 1.0.2 925 | get-intrinsic: 1.2.1 926 | is-typed-array: 1.1.12 927 | dev: true 928 | 929 | /is-arrayish@0.2.1: 930 | resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} 931 | dev: true 932 | 933 | /is-bigint@1.0.4: 934 | resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} 935 | dependencies: 936 | has-bigints: 1.0.2 937 | dev: true 938 | 939 | /is-binary-path@2.1.0: 940 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 941 | engines: {node: '>=8'} 942 | dependencies: 943 | binary-extensions: 2.2.0 944 | dev: true 945 | 946 | /is-boolean-object@1.1.2: 947 | resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} 948 | engines: {node: '>= 0.4'} 949 | dependencies: 950 | call-bind: 1.0.2 951 | has-tostringtag: 1.0.0 952 | dev: true 953 | 954 | /is-callable@1.2.7: 955 | resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} 956 | engines: {node: '>= 0.4'} 957 | dev: true 958 | 959 | /is-core-module@2.13.0: 960 | resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} 961 | dependencies: 962 | has: 1.0.3 963 | dev: true 964 | 965 | /is-date-object@1.0.5: 966 | resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} 967 | engines: {node: '>= 0.4'} 968 | dependencies: 969 | has-tostringtag: 1.0.0 970 | dev: true 971 | 972 | /is-extglob@2.1.1: 973 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 974 | engines: {node: '>=0.10.0'} 975 | dev: true 976 | 977 | /is-fullwidth-code-point@3.0.0: 978 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 979 | engines: {node: '>=8'} 980 | dev: true 981 | 982 | /is-glob@4.0.3: 983 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 984 | engines: {node: '>=0.10.0'} 985 | dependencies: 986 | is-extglob: 2.1.1 987 | dev: true 988 | 989 | /is-negative-zero@2.0.2: 990 | resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} 991 | engines: {node: '>= 0.4'} 992 | dev: true 993 | 994 | /is-number-object@1.0.7: 995 | resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} 996 | engines: {node: '>= 0.4'} 997 | dependencies: 998 | has-tostringtag: 1.0.0 999 | dev: true 1000 | 1001 | /is-number@7.0.0: 1002 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1003 | engines: {node: '>=0.12.0'} 1004 | dev: true 1005 | 1006 | /is-regex@1.1.4: 1007 | resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} 1008 | engines: {node: '>= 0.4'} 1009 | dependencies: 1010 | call-bind: 1.0.2 1011 | has-tostringtag: 1.0.0 1012 | dev: true 1013 | 1014 | /is-shared-array-buffer@1.0.2: 1015 | resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} 1016 | dependencies: 1017 | call-bind: 1.0.2 1018 | dev: true 1019 | 1020 | /is-stream@3.0.0: 1021 | resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} 1022 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1023 | dev: true 1024 | 1025 | /is-string@1.0.7: 1026 | resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} 1027 | engines: {node: '>= 0.4'} 1028 | dependencies: 1029 | has-tostringtag: 1.0.0 1030 | dev: true 1031 | 1032 | /is-symbol@1.0.4: 1033 | resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} 1034 | engines: {node: '>= 0.4'} 1035 | dependencies: 1036 | has-symbols: 1.0.3 1037 | dev: true 1038 | 1039 | /is-typed-array@1.1.12: 1040 | resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} 1041 | engines: {node: '>= 0.4'} 1042 | dependencies: 1043 | which-typed-array: 1.1.11 1044 | dev: true 1045 | 1046 | /is-weakref@1.0.2: 1047 | resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} 1048 | dependencies: 1049 | call-bind: 1.0.2 1050 | dev: true 1051 | 1052 | /isarray@2.0.5: 1053 | resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} 1054 | dev: true 1055 | 1056 | /isexe@2.0.0: 1057 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1058 | dev: true 1059 | 1060 | /jackspeak@2.3.6: 1061 | resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} 1062 | engines: {node: '>=14'} 1063 | dependencies: 1064 | '@isaacs/cliui': 8.0.2 1065 | optionalDependencies: 1066 | '@pkgjs/parseargs': 0.11.0 1067 | dev: true 1068 | 1069 | /jiti@1.19.3: 1070 | resolution: {integrity: sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w==} 1071 | hasBin: true 1072 | dev: true 1073 | 1074 | /json-parse-better-errors@1.0.2: 1075 | resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} 1076 | dev: true 1077 | 1078 | /jsonc-parser@3.2.0: 1079 | resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} 1080 | dev: true 1081 | 1082 | /kleur@3.0.3: 1083 | resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} 1084 | engines: {node: '>=6'} 1085 | dev: true 1086 | 1087 | /load-json-file@4.0.0: 1088 | resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} 1089 | engines: {node: '>=4'} 1090 | dependencies: 1091 | graceful-fs: 4.2.11 1092 | parse-json: 4.0.0 1093 | pify: 3.0.0 1094 | strip-bom: 3.0.0 1095 | dev: true 1096 | 1097 | /lru-cache@10.0.1: 1098 | resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==} 1099 | engines: {node: 14 || >=16.14} 1100 | dev: true 1101 | 1102 | /lru-cache@6.0.0: 1103 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 1104 | engines: {node: '>=10'} 1105 | dependencies: 1106 | yallist: 4.0.0 1107 | dev: true 1108 | 1109 | /memorystream@0.3.1: 1110 | resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} 1111 | engines: {node: '>= 0.10.0'} 1112 | dev: true 1113 | 1114 | /merge-stream@2.0.0: 1115 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 1116 | dev: true 1117 | 1118 | /merge2@1.4.1: 1119 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1120 | engines: {node: '>= 8'} 1121 | dev: true 1122 | 1123 | /micromatch@4.0.5: 1124 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1125 | engines: {node: '>=8.6'} 1126 | dependencies: 1127 | braces: 3.0.2 1128 | picomatch: 2.3.1 1129 | dev: true 1130 | 1131 | /mimic-fn@4.0.0: 1132 | resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} 1133 | engines: {node: '>=12'} 1134 | dev: true 1135 | 1136 | /minimatch@3.1.2: 1137 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1138 | dependencies: 1139 | brace-expansion: 1.1.11 1140 | dev: true 1141 | 1142 | /minimatch@9.0.3: 1143 | resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} 1144 | engines: {node: '>=16 || 14 >=14.17'} 1145 | dependencies: 1146 | brace-expansion: 2.0.1 1147 | dev: true 1148 | 1149 | /minipass@3.3.6: 1150 | resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} 1151 | engines: {node: '>=8'} 1152 | dependencies: 1153 | yallist: 4.0.0 1154 | dev: true 1155 | 1156 | /minipass@5.0.0: 1157 | resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} 1158 | engines: {node: '>=8'} 1159 | dev: true 1160 | 1161 | /minipass@7.0.3: 1162 | resolution: {integrity: sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==} 1163 | engines: {node: '>=16 || 14 >=14.17'} 1164 | dev: true 1165 | 1166 | /minizlib@2.1.2: 1167 | resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} 1168 | engines: {node: '>= 8'} 1169 | dependencies: 1170 | minipass: 3.3.6 1171 | yallist: 4.0.0 1172 | dev: true 1173 | 1174 | /mkdirp@1.0.4: 1175 | resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} 1176 | engines: {node: '>=10'} 1177 | hasBin: true 1178 | dev: true 1179 | 1180 | /mlly@1.4.0: 1181 | resolution: {integrity: sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==} 1182 | dependencies: 1183 | acorn: 8.10.0 1184 | pathe: 1.1.1 1185 | pkg-types: 1.0.3 1186 | ufo: 1.2.0 1187 | dev: true 1188 | 1189 | /mri@1.2.0: 1190 | resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} 1191 | engines: {node: '>=4'} 1192 | dev: true 1193 | 1194 | /ms@2.1.2: 1195 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1196 | dev: true 1197 | 1198 | /nanoid@3.3.6: 1199 | resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} 1200 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1201 | hasBin: true 1202 | dev: true 1203 | 1204 | /nice-try@1.0.5: 1205 | resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} 1206 | dev: true 1207 | 1208 | /node-fetch-native@1.2.0: 1209 | resolution: {integrity: sha512-5IAMBTl9p6PaAjYCnMv5FmqIF6GcZnawAVnzaCG0rX2aYZJ4CxEkZNtVPuTRug7fL7wyM5BQYTlAzcyMPi6oTQ==} 1210 | dev: true 1211 | 1212 | /normalize-package-data@2.5.0: 1213 | resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} 1214 | dependencies: 1215 | hosted-git-info: 2.8.9 1216 | resolve: 1.22.4 1217 | semver: 5.7.2 1218 | validate-npm-package-license: 3.0.4 1219 | dev: true 1220 | 1221 | /normalize-path@3.0.0: 1222 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1223 | engines: {node: '>=0.10.0'} 1224 | dev: true 1225 | 1226 | /npm-run-all@4.1.5: 1227 | resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} 1228 | engines: {node: '>= 4'} 1229 | hasBin: true 1230 | dependencies: 1231 | ansi-styles: 3.2.1 1232 | chalk: 2.4.2 1233 | cross-spawn: 6.0.5 1234 | memorystream: 0.3.1 1235 | minimatch: 3.1.2 1236 | pidtree: 0.3.1 1237 | read-pkg: 3.0.0 1238 | shell-quote: 1.8.1 1239 | string.prototype.padend: 3.1.4 1240 | dev: true 1241 | 1242 | /npm-run-path@5.1.0: 1243 | resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} 1244 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1245 | dependencies: 1246 | path-key: 4.0.0 1247 | dev: true 1248 | 1249 | /object-inspect@1.12.3: 1250 | resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} 1251 | dev: true 1252 | 1253 | /object-keys@1.1.1: 1254 | resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} 1255 | engines: {node: '>= 0.4'} 1256 | dev: true 1257 | 1258 | /object.assign@4.1.4: 1259 | resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} 1260 | engines: {node: '>= 0.4'} 1261 | dependencies: 1262 | call-bind: 1.0.2 1263 | define-properties: 1.2.0 1264 | has-symbols: 1.0.3 1265 | object-keys: 1.1.1 1266 | dev: true 1267 | 1268 | /ohash@1.1.3: 1269 | resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==} 1270 | dev: true 1271 | 1272 | /onetime@6.0.0: 1273 | resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} 1274 | engines: {node: '>=12'} 1275 | dependencies: 1276 | mimic-fn: 4.0.0 1277 | dev: true 1278 | 1279 | /parse-json@4.0.0: 1280 | resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} 1281 | engines: {node: '>=4'} 1282 | dependencies: 1283 | error-ex: 1.3.2 1284 | json-parse-better-errors: 1.0.2 1285 | dev: true 1286 | 1287 | /path-key@2.0.1: 1288 | resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} 1289 | engines: {node: '>=4'} 1290 | dev: true 1291 | 1292 | /path-key@3.1.1: 1293 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1294 | engines: {node: '>=8'} 1295 | dev: true 1296 | 1297 | /path-key@4.0.0: 1298 | resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} 1299 | engines: {node: '>=12'} 1300 | dev: true 1301 | 1302 | /path-parse@1.0.7: 1303 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1304 | dev: true 1305 | 1306 | /path-scurry@1.10.1: 1307 | resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} 1308 | engines: {node: '>=16 || 14 >=14.17'} 1309 | dependencies: 1310 | lru-cache: 10.0.1 1311 | minipass: 7.0.3 1312 | dev: true 1313 | 1314 | /path-type@3.0.0: 1315 | resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} 1316 | engines: {node: '>=4'} 1317 | dependencies: 1318 | pify: 3.0.0 1319 | dev: true 1320 | 1321 | /pathe@1.1.1: 1322 | resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} 1323 | dev: true 1324 | 1325 | /perfect-debounce@1.0.0: 1326 | resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} 1327 | dev: true 1328 | 1329 | /picocolors@1.0.0: 1330 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 1331 | dev: true 1332 | 1333 | /picomatch@2.3.1: 1334 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1335 | engines: {node: '>=8.6'} 1336 | dev: true 1337 | 1338 | /pidtree@0.3.1: 1339 | resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} 1340 | engines: {node: '>=0.10'} 1341 | hasBin: true 1342 | dev: true 1343 | 1344 | /pify@3.0.0: 1345 | resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} 1346 | engines: {node: '>=4'} 1347 | dev: true 1348 | 1349 | /pkg-types@1.0.3: 1350 | resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} 1351 | dependencies: 1352 | jsonc-parser: 3.2.0 1353 | mlly: 1.4.0 1354 | pathe: 1.1.1 1355 | dev: true 1356 | 1357 | /postcss@8.4.28: 1358 | resolution: {integrity: sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==} 1359 | engines: {node: ^10 || ^12 || >=14} 1360 | dependencies: 1361 | nanoid: 3.3.6 1362 | picocolors: 1.0.0 1363 | source-map-js: 1.0.2 1364 | dev: true 1365 | 1366 | /pretty-bytes@6.1.1: 1367 | resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} 1368 | engines: {node: ^14.13.1 || >=16.0.0} 1369 | dev: true 1370 | 1371 | /prompts@2.4.2: 1372 | resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} 1373 | engines: {node: '>= 6'} 1374 | dependencies: 1375 | kleur: 3.0.3 1376 | sisteransi: 1.0.5 1377 | dev: true 1378 | 1379 | /queue-microtask@1.2.3: 1380 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1381 | dev: true 1382 | 1383 | /rc9@2.1.1: 1384 | resolution: {integrity: sha512-lNeOl38Ws0eNxpO3+wD1I9rkHGQyj1NU1jlzv4go2CtEnEQEUfqnIvZG7W+bC/aXdJ27n5x/yUjb6RoT9tko+Q==} 1385 | dependencies: 1386 | defu: 6.1.2 1387 | destr: 2.0.1 1388 | flat: 5.0.2 1389 | dev: true 1390 | 1391 | /read-pkg@3.0.0: 1392 | resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} 1393 | engines: {node: '>=4'} 1394 | dependencies: 1395 | load-json-file: 4.0.0 1396 | normalize-package-data: 2.5.0 1397 | path-type: 3.0.0 1398 | dev: true 1399 | 1400 | /readdirp@3.6.0: 1401 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1402 | engines: {node: '>=8.10.0'} 1403 | dependencies: 1404 | picomatch: 2.3.1 1405 | dev: true 1406 | 1407 | /regexp.prototype.flags@1.5.0: 1408 | resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} 1409 | engines: {node: '>= 0.4'} 1410 | dependencies: 1411 | call-bind: 1.0.2 1412 | define-properties: 1.2.0 1413 | functions-have-names: 1.2.3 1414 | dev: true 1415 | 1416 | /resolve@1.22.4: 1417 | resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} 1418 | hasBin: true 1419 | dependencies: 1420 | is-core-module: 2.13.0 1421 | path-parse: 1.0.7 1422 | supports-preserve-symlinks-flag: 1.0.0 1423 | dev: true 1424 | 1425 | /reusify@1.0.4: 1426 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1427 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1428 | dev: true 1429 | 1430 | /rimraf@5.0.5: 1431 | resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==} 1432 | engines: {node: '>=14'} 1433 | hasBin: true 1434 | dependencies: 1435 | glob: 10.3.10 1436 | dev: true 1437 | 1438 | /rollup@3.28.0: 1439 | resolution: {integrity: sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==} 1440 | engines: {node: '>=14.18.0', npm: '>=8.0.0'} 1441 | hasBin: true 1442 | optionalDependencies: 1443 | fsevents: 2.3.2 1444 | dev: true 1445 | 1446 | /run-parallel@1.2.0: 1447 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1448 | dependencies: 1449 | queue-microtask: 1.2.3 1450 | dev: true 1451 | 1452 | /safe-array-concat@1.0.0: 1453 | resolution: {integrity: sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==} 1454 | engines: {node: '>=0.4'} 1455 | dependencies: 1456 | call-bind: 1.0.2 1457 | get-intrinsic: 1.2.1 1458 | has-symbols: 1.0.3 1459 | isarray: 2.0.5 1460 | dev: true 1461 | 1462 | /safe-regex-test@1.0.0: 1463 | resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} 1464 | dependencies: 1465 | call-bind: 1.0.2 1466 | get-intrinsic: 1.2.1 1467 | is-regex: 1.1.4 1468 | dev: true 1469 | 1470 | /semver@5.7.2: 1471 | resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} 1472 | hasBin: true 1473 | dev: true 1474 | 1475 | /semver@7.5.4: 1476 | resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} 1477 | engines: {node: '>=10'} 1478 | hasBin: true 1479 | dependencies: 1480 | lru-cache: 6.0.0 1481 | dev: true 1482 | 1483 | /shebang-command@1.2.0: 1484 | resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} 1485 | engines: {node: '>=0.10.0'} 1486 | dependencies: 1487 | shebang-regex: 1.0.0 1488 | dev: true 1489 | 1490 | /shebang-command@2.0.0: 1491 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1492 | engines: {node: '>=8'} 1493 | dependencies: 1494 | shebang-regex: 3.0.0 1495 | dev: true 1496 | 1497 | /shebang-regex@1.0.0: 1498 | resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} 1499 | engines: {node: '>=0.10.0'} 1500 | dev: true 1501 | 1502 | /shebang-regex@3.0.0: 1503 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1504 | engines: {node: '>=8'} 1505 | dev: true 1506 | 1507 | /shell-quote@1.8.1: 1508 | resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} 1509 | dev: true 1510 | 1511 | /side-channel@1.0.4: 1512 | resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} 1513 | dependencies: 1514 | call-bind: 1.0.2 1515 | get-intrinsic: 1.2.1 1516 | object-inspect: 1.12.3 1517 | dev: true 1518 | 1519 | /signal-exit@4.1.0: 1520 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1521 | engines: {node: '>=14'} 1522 | dev: true 1523 | 1524 | /sisteransi@1.0.5: 1525 | resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} 1526 | dev: true 1527 | 1528 | /source-map-js@1.0.2: 1529 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 1530 | engines: {node: '>=0.10.0'} 1531 | dev: true 1532 | 1533 | /spdx-correct@3.2.0: 1534 | resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} 1535 | dependencies: 1536 | spdx-expression-parse: 3.0.1 1537 | spdx-license-ids: 3.0.13 1538 | dev: true 1539 | 1540 | /spdx-exceptions@2.3.0: 1541 | resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} 1542 | dev: true 1543 | 1544 | /spdx-expression-parse@3.0.1: 1545 | resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} 1546 | dependencies: 1547 | spdx-exceptions: 2.3.0 1548 | spdx-license-ids: 3.0.13 1549 | dev: true 1550 | 1551 | /spdx-license-ids@3.0.13: 1552 | resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} 1553 | dev: true 1554 | 1555 | /specifier-backward@0.0.4: 1556 | resolution: {integrity: sha512-E1x/AIkLT7F2Z839drMZfX7riJDCkJ3QZuJmn9PIXqMUMKVeA7P+HbbAV3PKs5t7d9q3UfN4YWqrZdAFJWTXMA==} 1557 | dependencies: 1558 | unplugin: 1.4.0 1559 | dev: true 1560 | 1561 | /std-env@3.7.0: 1562 | resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} 1563 | dev: false 1564 | 1565 | /string-argv@0.3.2: 1566 | resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} 1567 | engines: {node: '>=0.6.19'} 1568 | dev: true 1569 | 1570 | /string-width@4.2.3: 1571 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1572 | engines: {node: '>=8'} 1573 | dependencies: 1574 | emoji-regex: 8.0.0 1575 | is-fullwidth-code-point: 3.0.0 1576 | strip-ansi: 6.0.1 1577 | dev: true 1578 | 1579 | /string-width@5.1.2: 1580 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1581 | engines: {node: '>=12'} 1582 | dependencies: 1583 | eastasianwidth: 0.2.0 1584 | emoji-regex: 9.2.2 1585 | strip-ansi: 7.1.0 1586 | dev: true 1587 | 1588 | /string.prototype.padend@3.1.4: 1589 | resolution: {integrity: sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==} 1590 | engines: {node: '>= 0.4'} 1591 | dependencies: 1592 | call-bind: 1.0.2 1593 | define-properties: 1.2.0 1594 | es-abstract: 1.22.1 1595 | dev: true 1596 | 1597 | /string.prototype.trim@1.2.7: 1598 | resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} 1599 | engines: {node: '>= 0.4'} 1600 | dependencies: 1601 | call-bind: 1.0.2 1602 | define-properties: 1.2.0 1603 | es-abstract: 1.22.1 1604 | dev: true 1605 | 1606 | /string.prototype.trimend@1.0.6: 1607 | resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} 1608 | dependencies: 1609 | call-bind: 1.0.2 1610 | define-properties: 1.2.0 1611 | es-abstract: 1.22.1 1612 | dev: true 1613 | 1614 | /string.prototype.trimstart@1.0.6: 1615 | resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} 1616 | dependencies: 1617 | call-bind: 1.0.2 1618 | define-properties: 1.2.0 1619 | es-abstract: 1.22.1 1620 | dev: true 1621 | 1622 | /strip-ansi@6.0.1: 1623 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1624 | engines: {node: '>=8'} 1625 | dependencies: 1626 | ansi-regex: 5.0.1 1627 | dev: true 1628 | 1629 | /strip-ansi@7.1.0: 1630 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 1631 | engines: {node: '>=12'} 1632 | dependencies: 1633 | ansi-regex: 6.0.1 1634 | dev: true 1635 | 1636 | /strip-bom@3.0.0: 1637 | resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} 1638 | engines: {node: '>=4'} 1639 | dev: true 1640 | 1641 | /strip-final-newline@3.0.0: 1642 | resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} 1643 | engines: {node: '>=12'} 1644 | dev: true 1645 | 1646 | /supports-color@5.5.0: 1647 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 1648 | engines: {node: '>=4'} 1649 | dependencies: 1650 | has-flag: 3.0.0 1651 | dev: true 1652 | 1653 | /supports-preserve-symlinks-flag@1.0.0: 1654 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1655 | engines: {node: '>= 0.4'} 1656 | dev: true 1657 | 1658 | /tar@6.1.15: 1659 | resolution: {integrity: sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==} 1660 | engines: {node: '>=10'} 1661 | dependencies: 1662 | chownr: 2.0.0 1663 | fs-minipass: 2.1.0 1664 | minipass: 5.0.0 1665 | minizlib: 2.1.2 1666 | mkdirp: 1.0.4 1667 | yallist: 4.0.0 1668 | dev: true 1669 | 1670 | /to-regex-range@5.0.1: 1671 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1672 | engines: {node: '>=8.0'} 1673 | dependencies: 1674 | is-number: 7.0.0 1675 | dev: true 1676 | 1677 | /type-detect@4.0.8: 1678 | resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} 1679 | engines: {node: '>=4'} 1680 | dev: true 1681 | 1682 | /typed-array-buffer@1.0.0: 1683 | resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} 1684 | engines: {node: '>= 0.4'} 1685 | dependencies: 1686 | call-bind: 1.0.2 1687 | get-intrinsic: 1.2.1 1688 | is-typed-array: 1.1.12 1689 | dev: true 1690 | 1691 | /typed-array-byte-length@1.0.0: 1692 | resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} 1693 | engines: {node: '>= 0.4'} 1694 | dependencies: 1695 | call-bind: 1.0.2 1696 | for-each: 0.3.3 1697 | has-proto: 1.0.1 1698 | is-typed-array: 1.1.12 1699 | dev: true 1700 | 1701 | /typed-array-byte-offset@1.0.0: 1702 | resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} 1703 | engines: {node: '>= 0.4'} 1704 | dependencies: 1705 | available-typed-arrays: 1.0.5 1706 | call-bind: 1.0.2 1707 | for-each: 0.3.3 1708 | has-proto: 1.0.1 1709 | is-typed-array: 1.1.12 1710 | dev: true 1711 | 1712 | /typed-array-length@1.0.4: 1713 | resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} 1714 | dependencies: 1715 | call-bind: 1.0.2 1716 | for-each: 0.3.3 1717 | is-typed-array: 1.1.12 1718 | dev: true 1719 | 1720 | /typescript@5.2.2: 1721 | resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} 1722 | engines: {node: '>=14.17'} 1723 | hasBin: true 1724 | dev: true 1725 | 1726 | /ufo@1.2.0: 1727 | resolution: {integrity: sha512-RsPyTbqORDNDxqAdQPQBpgqhWle1VcTSou/FraClYlHf6TZnQcGslpLcAphNR+sQW4q5lLWLbOsRlh9j24baQg==} 1728 | dev: true 1729 | 1730 | /unbox-primitive@1.0.2: 1731 | resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} 1732 | dependencies: 1733 | call-bind: 1.0.2 1734 | has-bigints: 1.0.2 1735 | has-symbols: 1.0.3 1736 | which-boxed-primitive: 1.0.2 1737 | dev: true 1738 | 1739 | /unplugin@1.4.0: 1740 | resolution: {integrity: sha512-5x4eIEL6WgbzqGtF9UV8VEC/ehKptPXDS6L2b0mv4FRMkJxRtjaJfOWDd6a8+kYbqsjklix7yWP0N3SUepjXcg==} 1741 | dependencies: 1742 | acorn: 8.10.0 1743 | chokidar: 3.5.3 1744 | webpack-sources: 3.2.3 1745 | webpack-virtual-modules: 0.5.0 1746 | dev: true 1747 | 1748 | /validate-npm-package-license@3.0.4: 1749 | resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} 1750 | dependencies: 1751 | spdx-correct: 3.2.0 1752 | spdx-expression-parse: 3.0.1 1753 | dev: true 1754 | 1755 | /vite@4.4.10(@types/node@18.18.3): 1756 | resolution: {integrity: sha512-TzIjiqx9BEXF8yzYdF2NTf1kFFbjMjUSV0LFZ3HyHoI3SGSPLnnFUKiIQtL3gl2AjHvMrprOvQ3amzaHgQlAxw==} 1757 | engines: {node: ^14.18.0 || >=16.0.0} 1758 | hasBin: true 1759 | peerDependencies: 1760 | '@types/node': '>= 14' 1761 | less: '*' 1762 | lightningcss: ^1.21.0 1763 | sass: '*' 1764 | stylus: '*' 1765 | sugarss: '*' 1766 | terser: ^5.4.0 1767 | peerDependenciesMeta: 1768 | '@types/node': 1769 | optional: true 1770 | less: 1771 | optional: true 1772 | lightningcss: 1773 | optional: true 1774 | sass: 1775 | optional: true 1776 | stylus: 1777 | optional: true 1778 | sugarss: 1779 | optional: true 1780 | terser: 1781 | optional: true 1782 | dependencies: 1783 | '@types/node': 18.18.3 1784 | esbuild: 0.18.20 1785 | postcss: 8.4.28 1786 | rollup: 3.28.0 1787 | optionalDependencies: 1788 | fsevents: 2.3.2 1789 | dev: true 1790 | 1791 | /webpack-sources@3.2.3: 1792 | resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} 1793 | engines: {node: '>=10.13.0'} 1794 | dev: true 1795 | 1796 | /webpack-virtual-modules@0.5.0: 1797 | resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} 1798 | dev: true 1799 | 1800 | /which-boxed-primitive@1.0.2: 1801 | resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} 1802 | dependencies: 1803 | is-bigint: 1.0.4 1804 | is-boolean-object: 1.1.2 1805 | is-number-object: 1.0.7 1806 | is-string: 1.0.7 1807 | is-symbol: 1.0.4 1808 | dev: true 1809 | 1810 | /which-typed-array@1.1.11: 1811 | resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} 1812 | engines: {node: '>= 0.4'} 1813 | dependencies: 1814 | available-typed-arrays: 1.0.5 1815 | call-bind: 1.0.2 1816 | for-each: 0.3.3 1817 | gopd: 1.0.1 1818 | has-tostringtag: 1.0.0 1819 | dev: true 1820 | 1821 | /which@1.3.1: 1822 | resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} 1823 | hasBin: true 1824 | dependencies: 1825 | isexe: 2.0.0 1826 | dev: true 1827 | 1828 | /which@2.0.2: 1829 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1830 | engines: {node: '>= 8'} 1831 | hasBin: true 1832 | dependencies: 1833 | isexe: 2.0.0 1834 | dev: true 1835 | 1836 | /wrap-ansi@7.0.0: 1837 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1838 | engines: {node: '>=10'} 1839 | dependencies: 1840 | ansi-styles: 4.3.0 1841 | string-width: 4.2.3 1842 | strip-ansi: 6.0.1 1843 | dev: true 1844 | 1845 | /wrap-ansi@8.1.0: 1846 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 1847 | engines: {node: '>=12'} 1848 | dependencies: 1849 | ansi-styles: 6.2.1 1850 | string-width: 5.1.2 1851 | strip-ansi: 7.1.0 1852 | dev: true 1853 | 1854 | /yallist@4.0.0: 1855 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 1856 | dev: true 1857 | -------------------------------------------------------------------------------- /scripts/post.mjs: -------------------------------------------------------------------------------- 1 | import { platform } from "os"; 2 | import { existsSync } from "fs"; 3 | import { chmod } from "fs/promises"; 4 | 5 | const isWindows = platform() === "win32"; 6 | 7 | // Obtain permissions silently 8 | async function setBinPermissions() { 9 | try { 10 | if (!isWindows) { 11 | const { detectDefaultBinPath } = await import( 12 | "../npm/bin.mjs" 13 | ); 14 | const binPath = detectDefaultBinPath(); 15 | const binPathExists = existsSync(binPath); 16 | if (binPathExists) { 17 | await chmod(binPath, "755"); 18 | } 19 | } 20 | } catch (error) {} 21 | } 22 | 23 | setBinPermissions(); 24 | -------------------------------------------------------------------------------- /scripts/sync.js: -------------------------------------------------------------------------------- 1 | const { execSync } = require("node:child_process"); 2 | const { copyFile } = require("node:fs/promises"); 3 | 4 | const wasmExec = execSync("go env GOROOT").toString().replace(/\n/g, "") + 5 | "/misc/wasm/wasm_exec.js"; 6 | 7 | copyFile(wasmExec, "./wasm/wasm_exec.js"); 8 | -------------------------------------------------------------------------------- /snapshot.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/markthree/go-get-folder-size/62b6be4a99d82f36b9b1ab57703a65d18c70ae60/snapshot.gif -------------------------------------------------------------------------------- /src/bin.ts: -------------------------------------------------------------------------------- 1 | import { execa } from "execa"; 2 | import prettyBytes from "pretty-bytes"; 3 | import { createInterface } from "node:readline"; 4 | import { arch as _arch, platform as _platform } from "node:os"; 5 | 6 | import { fileURLToPath } from "node:url"; 7 | import { dirname, resolve } from "node:path"; 8 | 9 | const _dirname = typeof __dirname !== "undefined" 10 | ? __dirname 11 | : dirname(fileURLToPath(import.meta.url)); 12 | 13 | let defaultBinPath = ""; 14 | 15 | // Cache the inferred version to avoid recomputing it 16 | let cachedInferredVersion = null; 17 | 18 | export function inferVersion() { 19 | if (cachedInferredVersion) { 20 | return cachedInferredVersion; 21 | } 22 | 23 | const platform = _platform(); 24 | if (!/win32|linux|darwin/.test(platform)) { 25 | throw new Error(`${platform} is not support`); 26 | } 27 | 28 | const arch = _arch(); 29 | 30 | if (!/amd64_v1|arm64|386|x64/.test(arch)) { 31 | throw new Error(`${arch} is not support`); 32 | } 33 | 34 | cachedInferredVersion = `${platform === "win32" ? "windows" : platform}_${ 35 | arch === "x64" ? "amd64_v1" : arch 36 | }`; 37 | return cachedInferredVersion; 38 | } 39 | 40 | export function detectBinName(version = inferVersion()) { 41 | return `go-get-folder-size${version.startsWith("windows") ? ".exe" : ""}`; 42 | } 43 | 44 | export function detectDefaultBinPath() { 45 | if (defaultBinPath) { 46 | return defaultBinPath; 47 | } 48 | 49 | const version = inferVersion(); 50 | const name = detectBinName(version); 51 | defaultBinPath = resolve( 52 | _dirname, 53 | `../dist/go-get-folder-size_${version}/${name}`, 54 | ); 55 | return defaultBinPath; 56 | } 57 | 58 | interface Options { 59 | binPath?: string; 60 | /** 61 | * @default false 62 | */ 63 | loose?: boolean; 64 | } 65 | 66 | export async function getFolderSizeBin( 67 | base: string, 68 | pretty?: false, 69 | options?: Options, 70 | ): Promise; 71 | export async function getFolderSizeBin( 72 | base: string, 73 | pretty?: true, 74 | options?: Options, 75 | ): Promise; 76 | export async function getFolderSizeBin( 77 | base: string, 78 | pretty = false, 79 | options: Options = {}, 80 | ) { 81 | const { binPath = detectDefaultBinPath(), loose = false } = options; 82 | const { stdout, stderr } = await execa(binPath, { 83 | cwd: base, 84 | env: { loose: String(loose) }, 85 | }); 86 | 87 | if (stderr) { 88 | throw new Error(stderr); 89 | } 90 | 91 | if (pretty) { 92 | return prettyBytes(Number(stdout)); 93 | } 94 | 95 | return Number(stdout); 96 | } 97 | 98 | export function createGetFolderSizeBinIpc(options: Options = {}) { 99 | const { binPath = detectDefaultBinPath(), loose = false } = options; 100 | 101 | let tasks = new Map< 102 | string, 103 | { pretty: boolean; resolve: Function; reject: Function } 104 | >(); 105 | 106 | const go = execa(binPath, { 107 | env: { 108 | ipc: String(true), 109 | loose: String(loose), 110 | }, 111 | }); 112 | 113 | const readline = createInterface({ 114 | input: go.stdout, 115 | }); 116 | 117 | function close() { 118 | if (!go.killed) { 119 | readline.close(); 120 | go.cancel(); 121 | tasks.clear(); 122 | tasks = null; 123 | } 124 | } 125 | 126 | let full = false; 127 | function send(base: string) { 128 | if (full) { 129 | return go.stdin.once("drain", () => { 130 | full = false; 131 | go.stdin.write(`${base},`); 132 | }); 133 | } 134 | full = !go.stdin.write(`${base},`); 135 | } 136 | 137 | readline.on("line", (item: string) => { 138 | const [base, size] = item.split(","); 139 | const { pretty, resolve } = tasks.get(base); 140 | resolve(pretty ? prettyBytes(Number(size)) : Number(size)); 141 | tasks.delete(base); 142 | }); 143 | 144 | go.stderr.on("data", (item: Buffer) => { 145 | const [base, ...error] = String(item).split(","); 146 | const { reject } = tasks.get(base); 147 | reject(new Error(error.toString())); 148 | tasks.delete(base); 149 | }); 150 | 151 | process.once("exit", () => { 152 | close(); 153 | }); 154 | 155 | async function getFolderSizeWithIpc( 156 | base: string, 157 | pretty?: false, 158 | ): Promise; 159 | async function getFolderSizeWithIpc( 160 | base: string, 161 | pretty?: true, 162 | ): Promise; 163 | async function getFolderSizeWithIpc( 164 | base: string, 165 | pretty = false, 166 | ): Promise { 167 | return new Promise((resolve, reject) => { 168 | tasks.set(base, { pretty, resolve, reject }); 169 | send(base); 170 | }); 171 | } 172 | 173 | return { 174 | close, 175 | getFolderSizeWithIpc, 176 | }; 177 | } 178 | -------------------------------------------------------------------------------- /src/cli.ts: -------------------------------------------------------------------------------- 1 | import mri from "mri"; 2 | import { getFolderSizeBin } from "./bin"; 3 | 4 | function printUsage() { 5 | console.log(`\ngo-get-folder-size 6 | 7 | Get the size of a folder by recursively iterating through all its sub(files && folders). Use go, so high-speed. 8 | 9 | usage: 10 | go-get-folder-size [options] 11 | 12 | options: 13 | -h, --help check help 14 | -l --loose ignore permission error 15 | -p, --pretty pretty bytes (default true) 16 | -b, --base target base path (default cwd)\n`); 17 | } 18 | 19 | async function main() { 20 | const _argv = process.argv.slice(2); 21 | const argv = mri(_argv, { 22 | default: { 23 | help: false, 24 | pretty: true, 25 | loose: false, 26 | base: process.cwd(), 27 | }, 28 | string: ["base"], 29 | boolean: ["pretty", "help", "loose"], 30 | alias: { 31 | h: ["help"], 32 | b: ["base"], 33 | p: ["pretty"], 34 | l: ["loose"], 35 | }, 36 | }); 37 | 38 | if (argv.help) { 39 | printUsage(); 40 | } else { 41 | try { 42 | const size = await getFolderSizeBin( 43 | argv.base, 44 | argv.pretty, 45 | { loose: argv.loose }, 46 | ); 47 | console.log(size); 48 | } catch (error) { 49 | console.error(error.message); 50 | } 51 | } 52 | } 53 | 54 | main(); 55 | -------------------------------------------------------------------------------- /src/core.go: -------------------------------------------------------------------------------- 1 | package core 2 | 3 | import ( 4 | "io/fs" 5 | "os" 6 | "path" 7 | ) 8 | 9 | type EntrySizeChan chan int64 10 | 11 | func Invoke(folder string) (size int64, e error) { 12 | gracefulExit := func(err error) { 13 | e = err 14 | size = 0 15 | } 16 | 17 | entrys, err := os.ReadDir(folder) 18 | if err != nil { 19 | gracefulExit(err) 20 | return 21 | } 22 | entrysLen := len(entrys) 23 | if entrysLen == 0 { 24 | gracefulExit(nil) 25 | return 26 | } 27 | errChan := make(chan error) 28 | sizeChan := make(EntrySizeChan, entrysLen) 29 | 30 | for i := 0; i < entrysLen; i++ { 31 | go func(entry fs.DirEntry) { 32 | if entry.IsDir() { 33 | subFolderSize, err := Invoke(path.Join(folder, entry.Name())) 34 | if err != nil { 35 | errChan <- err 36 | return 37 | } 38 | sizeChan <- subFolderSize 39 | return 40 | } 41 | 42 | info, err := entry.Info() 43 | if err != nil { 44 | errChan <- err 45 | return 46 | } 47 | sizeChan <- info.Size() 48 | }(entrys[i]) 49 | } 50 | 51 | for i := 0; i < entrysLen; i++ { 52 | select { 53 | case value := <-sizeChan: 54 | size += value 55 | case newErr := <-errChan: 56 | if newErr != nil { 57 | gracefulExit(newErr) 58 | return 59 | } 60 | } 61 | } 62 | return size, nil 63 | } 64 | 65 | func LooseInvoke(folder string) int64 { 66 | size := int64(0) 67 | 68 | entrys, err := os.ReadDir(folder) 69 | if err != nil { 70 | return 0 71 | } 72 | entrysLen := len(entrys) 73 | if entrysLen == 0 { 74 | return 0 75 | } 76 | sizeChan := make(EntrySizeChan, entrysLen) 77 | 78 | for i := 0; i < entrysLen; i++ { 79 | go func(entry fs.DirEntry) { 80 | if entry.IsDir() { 81 | subFolderSize := LooseInvoke(path.Join(folder, entry.Name())) 82 | sizeChan <- subFolderSize 83 | return 84 | } 85 | info, err := entry.Info() 86 | if err != nil { 87 | sizeChan <- 0 88 | return 89 | } 90 | sizeChan <- info.Size() 91 | }(entrys[i]) 92 | } 93 | for i := 0; i < entrysLen; i++ { 94 | size += <-sizeChan 95 | } 96 | return size 97 | } 98 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./bin"; 2 | export * from "./wasm"; 3 | export * from "./node"; 4 | -------------------------------------------------------------------------------- /src/node.ts: -------------------------------------------------------------------------------- 1 | import { resolve } from "node:path"; 2 | import { runtime } from "std-env"; 3 | import prettyBytes from "pretty-bytes"; 4 | import { lstat, readdir } from "node:fs/promises"; 5 | 6 | interface Options { 7 | /** 8 | * @default false 9 | */ 10 | loose?: boolean; 11 | } 12 | 13 | async function strictGetFileSize(path: string) { 14 | const { size } = await lstat(path); 15 | return size; 16 | } 17 | 18 | async function looseGetFileSize(path: string) { 19 | try { 20 | const size = await strictGetFileSize(path); 21 | return size; 22 | } catch (error) { 23 | return 0; 24 | } 25 | } 26 | 27 | export async function getFolderSize( 28 | base: string, 29 | pretty?: false, 30 | options?: Options, 31 | ): Promise; 32 | export async function getFolderSize( 33 | base: string, 34 | pretty?: true, 35 | options?: Options, 36 | ): Promise; 37 | export async function getFolderSize( 38 | base: string, 39 | pretty = false, 40 | options?: Options, 41 | ) { 42 | const { loose = false } = options || {}; 43 | let total = 0; 44 | const sumTotal = (size: number) => total += size; 45 | const getFileSize = loose ? looseGetFileSize : strictGetFileSize; 46 | 47 | // bun (use recursive) 48 | if (runtime === "bun") { 49 | const dirents = await readdir(base, { 50 | recursive: true, 51 | withFileTypes: true, 52 | }); 53 | 54 | if (dirents.length === 0) { 55 | return mayBeWithPrettyBytes(); 56 | } 57 | 58 | const promises = dirents.map(async (dirent) => { 59 | if (!dirent.isFile()) { 60 | return; 61 | } 62 | const size = await getFileSize(resolve(base, dirent.name)); 63 | sumTotal(size); 64 | }); 65 | 66 | await Promise.all(promises); 67 | 68 | return mayBeWithPrettyBytes(); 69 | } 70 | 71 | const dirents = await readdir(base, { 72 | withFileTypes: true, 73 | }); 74 | 75 | if (dirents.length === 0) { 76 | return mayBeWithPrettyBytes(); 77 | } 78 | 79 | const promises: Array> = []; 80 | 81 | for (const dirent of dirents) { 82 | if (dirent.isFile()) { 83 | const path = resolve(base, dirent.name); 84 | promises.push( 85 | getFileSize(path).then(sumTotal), 86 | ); 87 | continue; 88 | } 89 | if (dirent.isDirectory()) { 90 | const path = resolve(base, dirent.name); 91 | promises.push( 92 | getFolderSize(path, false, options).then(sumTotal), 93 | ); 94 | } 95 | } 96 | 97 | await Promise.all(promises); 98 | 99 | return mayBeWithPrettyBytes(); 100 | 101 | function mayBeWithPrettyBytes() { 102 | return pretty ? prettyBytes(total) : total; 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /src/wasm.ts: -------------------------------------------------------------------------------- 1 | import "../wasm/polyfill.js"; 2 | import "../wasm/wasm_exec.js"; 3 | // @ts-ignore 4 | import init from "../wasm/main.wasm?init"; 5 | import prettyBytes from "pretty-bytes"; 6 | 7 | interface Options { 8 | /** 9 | * @default false 10 | */ 11 | loose: boolean; 12 | } 13 | 14 | // Not recommended. It may be slower than the native node 15 | export async function getFolderSizeWasm( 16 | base: string, 17 | pretty?: false, 18 | options?: Options, 19 | ): Promise; 20 | export async function getFolderSizeWasm( 21 | base: string, 22 | pretty?: true, 23 | options?: Options, 24 | ): Promise; 25 | export async function getFolderSizeWasm( 26 | base: string, 27 | pretty = false, 28 | options?: Options, 29 | ) { 30 | const { loose = false } = options || {}; 31 | const go = new global.Go(); 32 | go.env = { base, loose }; 33 | const instance = await init(go.importObject); 34 | await go.run(instance); 35 | if (global.$folderSizeError) { 36 | throw new Error(global.$folderSizeError); 37 | } 38 | const size = global.$folderSize; 39 | global.$folderSize = null; 40 | if (pretty) { 41 | return prettyBytes(Number(size)); 42 | } 43 | return Number(size); 44 | } 45 | -------------------------------------------------------------------------------- /tea.yaml: -------------------------------------------------------------------------------- 1 | # https://tea.xyz/what-is-this-file 2 | # 3 | # DO NOT REMOVE OR EDIT THIS WARNING: 4 | # 5 | # This file is auto-generated by the TEA app. It is intended to validate ownership of your repository. 6 | # DO NOT commit this file or accept any PR if you don't know what this is. 7 | # We are aware that spammers will try to use this file to try to profit off others' work. 8 | # We take this very seriously and will take action against any malicious actors. 9 | # 10 | # If you are not the owner of this repository, and someone maliciously opens a commit with this file 11 | # please report it to us at support@tea.xyz. 12 | # 13 | # A constitution without this header is invalid. 14 | --- 15 | version: 2.0.0 16 | codeOwners: 17 | - '0x415a719FA069d7427356051bF7A6683800bAF98c' 18 | quorum: 1 19 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "npm", 4 | "jsx": "preserve", 5 | "target": "ES2017", 6 | "module": "ESNext", 7 | "declaration": true, 8 | "lib": ["DOM", "ESNext"], 9 | "skipLibCheck": true, 10 | "isolatedModules": true, 11 | "moduleResolution": "node", 12 | "emitDeclarationOnly": true, 13 | "resolveJsonModule": true, 14 | "types": ["vite/client", "@types/node"] 15 | }, 16 | "include": ["src/index.ts"], 17 | "exclude": ["node_modules", "npm"] 18 | } 19 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | import { name } from "./package.json"; 3 | import { builtinModules } from "module"; 4 | import { vitePlugin as specifierBackward } from "specifier-backward"; 5 | 6 | export default defineConfig({ 7 | build: { 8 | outDir: "npm", 9 | emptyOutDir: false, 10 | lib: { 11 | name, 12 | formats: ["cjs", "es"], 13 | entry: [ 14 | "./src/cli.ts", 15 | "./src/bin.ts", 16 | "./src/wasm.ts", 17 | "./src/node.ts", 18 | "./src/index.ts", 19 | ], 20 | fileName(f, n) { 21 | if (f === "cjs") { 22 | return `${n}.cjs`; 23 | } 24 | if (f === "es") { 25 | return `${n}.mjs`; 26 | } 27 | return `${n}.js`; 28 | }, 29 | }, 30 | rollupOptions: { 31 | external: [ 32 | ...builtinModules, 33 | ...builtinModules.map((v) => `node:${v}`), 34 | ], 35 | }, 36 | }, 37 | plugins: [specifierBackward()], 38 | }); 39 | -------------------------------------------------------------------------------- /wasm/main.go: -------------------------------------------------------------------------------- 1 | // js-wasm 2 | package main 3 | 4 | import ( 5 | "os" 6 | "syscall/js" 7 | 8 | getFolderSize "github.com/markthree/go-get-folder-size/src" 9 | ) 10 | 11 | func main() { 12 | base := os.Getenv("base") 13 | isLoose := os.Getenv("loose") == "true" 14 | 15 | if isLoose { 16 | value := getFolderSize.LooseInvoke(base) 17 | js.Global().Set("$folderSize", value) 18 | } else { 19 | value, err := getFolderSize.Invoke(base) 20 | 21 | if err != nil { 22 | js.Global().Set("$folderSizeError", err) 23 | return 24 | } 25 | 26 | js.Global().Set("$folderSize", value) 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /wasm/main.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/markthree/go-get-folder-size/62b6be4a99d82f36b9b1ab57703a65d18c70ae60/wasm/main.wasm -------------------------------------------------------------------------------- /wasm/polyfill.js: -------------------------------------------------------------------------------- 1 | // Copyright 2021 The Go Authors. All rights reserved. 2 | // Use of this source code is governed by a BSD-style 3 | // license that can be found in the LICENSE file. 4 | // The polyfill is changed from wasm_exec_node.js 5 | 6 | "use strict"; 7 | 8 | import { createRequire } from "node:module"; 9 | 10 | globalThis.require ??= createRequire(import.meta.url); 11 | globalThis.fs = require("fs"); 12 | globalThis.TextEncoder = require("util").TextEncoder; 13 | globalThis.TextDecoder = require("util").TextDecoder; 14 | 15 | globalThis.performance = { 16 | now() { 17 | const [sec, nsec] = process.hrtime(); 18 | return sec * 1000 + nsec / 1000000; 19 | }, 20 | }; 21 | 22 | if (!globalThis.crypto) { 23 | const crypto = require("crypto"); 24 | globalThis.crypto = { 25 | getRandomValues(b) { 26 | crypto.randomFillSync(b); 27 | }, 28 | }; 29 | } 30 | -------------------------------------------------------------------------------- /wasm/wasm_exec.js: -------------------------------------------------------------------------------- 1 | // Copyright 2018 The Go Authors. All rights reserved. 2 | // Use of this source code is governed by a BSD-style 3 | // license that can be found in the LICENSE file. 4 | 5 | "use strict"; 6 | 7 | (() => { 8 | const enosys = () => { 9 | const err = new Error("not implemented"); 10 | err.code = "ENOSYS"; 11 | return err; 12 | }; 13 | 14 | if (!globalThis.fs) { 15 | let outputBuf = ""; 16 | globalThis.fs = { 17 | constants: { 18 | O_WRONLY: -1, 19 | O_RDWR: -1, 20 | O_CREAT: -1, 21 | O_TRUNC: -1, 22 | O_APPEND: -1, 23 | O_EXCL: -1, 24 | }, // unused 25 | writeSync(fd, buf) { 26 | outputBuf += decoder.decode(buf); 27 | const nl = outputBuf.lastIndexOf("\n"); 28 | if (nl != -1) { 29 | console.log(outputBuf.substr(0, nl)); 30 | outputBuf = outputBuf.substr(nl + 1); 31 | } 32 | return buf.length; 33 | }, 34 | write(fd, buf, offset, length, position, callback) { 35 | if (offset !== 0 || length !== buf.length || position !== null) { 36 | callback(enosys()); 37 | return; 38 | } 39 | const n = this.writeSync(fd, buf); 40 | callback(null, n); 41 | }, 42 | chmod(path, mode, callback) { 43 | callback(enosys()); 44 | }, 45 | chown(path, uid, gid, callback) { 46 | callback(enosys()); 47 | }, 48 | close(fd, callback) { 49 | callback(enosys()); 50 | }, 51 | fchmod(fd, mode, callback) { 52 | callback(enosys()); 53 | }, 54 | fchown(fd, uid, gid, callback) { 55 | callback(enosys()); 56 | }, 57 | fstat(fd, callback) { 58 | callback(enosys()); 59 | }, 60 | fsync(fd, callback) { 61 | callback(null); 62 | }, 63 | ftruncate(fd, length, callback) { 64 | callback(enosys()); 65 | }, 66 | lchown(path, uid, gid, callback) { 67 | callback(enosys()); 68 | }, 69 | link(path, link, callback) { 70 | callback(enosys()); 71 | }, 72 | lstat(path, callback) { 73 | callback(enosys()); 74 | }, 75 | mkdir(path, perm, callback) { 76 | callback(enosys()); 77 | }, 78 | open(path, flags, mode, callback) { 79 | callback(enosys()); 80 | }, 81 | read(fd, buffer, offset, length, position, callback) { 82 | callback(enosys()); 83 | }, 84 | readdir(path, callback) { 85 | callback(enosys()); 86 | }, 87 | readlink(path, callback) { 88 | callback(enosys()); 89 | }, 90 | rename(from, to, callback) { 91 | callback(enosys()); 92 | }, 93 | rmdir(path, callback) { 94 | callback(enosys()); 95 | }, 96 | stat(path, callback) { 97 | callback(enosys()); 98 | }, 99 | symlink(path, link, callback) { 100 | callback(enosys()); 101 | }, 102 | truncate(path, length, callback) { 103 | callback(enosys()); 104 | }, 105 | unlink(path, callback) { 106 | callback(enosys()); 107 | }, 108 | utimes(path, atime, mtime, callback) { 109 | callback(enosys()); 110 | }, 111 | }; 112 | } 113 | 114 | if (!globalThis.process) { 115 | globalThis.process = { 116 | getuid() { 117 | return -1; 118 | }, 119 | getgid() { 120 | return -1; 121 | }, 122 | geteuid() { 123 | return -1; 124 | }, 125 | getegid() { 126 | return -1; 127 | }, 128 | getgroups() { 129 | throw enosys(); 130 | }, 131 | pid: -1, 132 | ppid: -1, 133 | umask() { 134 | throw enosys(); 135 | }, 136 | cwd() { 137 | throw enosys(); 138 | }, 139 | chdir() { 140 | throw enosys(); 141 | }, 142 | }; 143 | } 144 | 145 | if (!globalThis.crypto) { 146 | throw new Error( 147 | "globalThis.crypto is not available, polyfill required (crypto.getRandomValues only)", 148 | ); 149 | } 150 | 151 | if (!globalThis.performance) { 152 | throw new Error( 153 | "globalThis.performance is not available, polyfill required (performance.now only)", 154 | ); 155 | } 156 | 157 | if (!globalThis.TextEncoder) { 158 | throw new Error( 159 | "globalThis.TextEncoder is not available, polyfill required", 160 | ); 161 | } 162 | 163 | if (!globalThis.TextDecoder) { 164 | throw new Error( 165 | "globalThis.TextDecoder is not available, polyfill required", 166 | ); 167 | } 168 | 169 | const encoder = new TextEncoder("utf-8"); 170 | const decoder = new TextDecoder("utf-8"); 171 | 172 | globalThis.Go = class { 173 | constructor() { 174 | this.argv = ["js"]; 175 | this.env = {}; 176 | this.exit = (code) => { 177 | if (code !== 0) { 178 | console.warn("exit code:", code); 179 | } 180 | }; 181 | this._exitPromise = new Promise((resolve) => { 182 | this._resolveExitPromise = resolve; 183 | }); 184 | this._pendingEvent = null; 185 | this._scheduledTimeouts = new Map(); 186 | this._nextCallbackTimeoutID = 1; 187 | 188 | const setInt64 = (addr, v) => { 189 | this.mem.setUint32(addr + 0, v, true); 190 | this.mem.setUint32(addr + 4, Math.floor(v / 4294967296), true); 191 | }; 192 | 193 | const getInt64 = (addr) => { 194 | const low = this.mem.getUint32(addr + 0, true); 195 | const high = this.mem.getInt32(addr + 4, true); 196 | return low + high * 4294967296; 197 | }; 198 | 199 | const loadValue = (addr) => { 200 | const f = this.mem.getFloat64(addr, true); 201 | if (f === 0) { 202 | return undefined; 203 | } 204 | if (!isNaN(f)) { 205 | return f; 206 | } 207 | 208 | const id = this.mem.getUint32(addr, true); 209 | return this._values[id]; 210 | }; 211 | 212 | const storeValue = (addr, v) => { 213 | const nanHead = 0x7FF80000; 214 | 215 | if (typeof v === "number" && v !== 0) { 216 | if (isNaN(v)) { 217 | this.mem.setUint32(addr + 4, nanHead, true); 218 | this.mem.setUint32(addr, 0, true); 219 | return; 220 | } 221 | this.mem.setFloat64(addr, v, true); 222 | return; 223 | } 224 | 225 | if (v === undefined) { 226 | this.mem.setFloat64(addr, 0, true); 227 | return; 228 | } 229 | 230 | let id = this._ids.get(v); 231 | if (id === undefined) { 232 | id = this._idPool.pop(); 233 | if (id === undefined) { 234 | id = this._values.length; 235 | } 236 | this._values[id] = v; 237 | this._goRefCounts[id] = 0; 238 | this._ids.set(v, id); 239 | } 240 | this._goRefCounts[id]++; 241 | let typeFlag = 0; 242 | switch (typeof v) { 243 | case "object": 244 | if (v !== null) { 245 | typeFlag = 1; 246 | } 247 | break; 248 | case "string": 249 | typeFlag = 2; 250 | break; 251 | case "symbol": 252 | typeFlag = 3; 253 | break; 254 | case "function": 255 | typeFlag = 4; 256 | break; 257 | } 258 | this.mem.setUint32(addr + 4, nanHead | typeFlag, true); 259 | this.mem.setUint32(addr, id, true); 260 | }; 261 | 262 | const loadSlice = (addr) => { 263 | const array = getInt64(addr + 0); 264 | const len = getInt64(addr + 8); 265 | return new Uint8Array(this._inst.exports.mem.buffer, array, len); 266 | }; 267 | 268 | const loadSliceOfValues = (addr) => { 269 | const array = getInt64(addr + 0); 270 | const len = getInt64(addr + 8); 271 | const a = new Array(len); 272 | for (let i = 0; i < len; i++) { 273 | a[i] = loadValue(array + i * 8); 274 | } 275 | return a; 276 | }; 277 | 278 | const loadString = (addr) => { 279 | const saddr = getInt64(addr + 0); 280 | const len = getInt64(addr + 8); 281 | return decoder.decode( 282 | new DataView(this._inst.exports.mem.buffer, saddr, len), 283 | ); 284 | }; 285 | 286 | const timeOrigin = Date.now() - performance.now(); 287 | this.importObject = { 288 | go: { 289 | // Go's SP does not change as long as no Go code is running. Some operations (e.g. calls, getters and setters) 290 | // may synchronously trigger a Go event handler. This makes Go code get executed in the middle of the imported 291 | // function. A goroutine can switch to a new stack if the current stack is too small (see morestack function). 292 | // This changes the SP, thus we have to update the SP used by the imported function. 293 | 294 | // func wasmExit(code int32) 295 | "runtime.wasmExit": (sp) => { 296 | sp >>>= 0; 297 | const code = this.mem.getInt32(sp + 8, true); 298 | this.exited = true; 299 | delete this._inst; 300 | delete this._values; 301 | delete this._goRefCounts; 302 | delete this._ids; 303 | delete this._idPool; 304 | this.exit(code); 305 | }, 306 | 307 | // func wasmWrite(fd uintptr, p unsafe.Pointer, n int32) 308 | "runtime.wasmWrite": (sp) => { 309 | sp >>>= 0; 310 | const fd = getInt64(sp + 8); 311 | const p = getInt64(sp + 16); 312 | const n = this.mem.getInt32(sp + 24, true); 313 | fs.writeSync( 314 | fd, 315 | new Uint8Array(this._inst.exports.mem.buffer, p, n), 316 | ); 317 | }, 318 | 319 | // func resetMemoryDataView() 320 | "runtime.resetMemoryDataView": (sp) => { 321 | sp >>>= 0; 322 | this.mem = new DataView(this._inst.exports.mem.buffer); 323 | }, 324 | 325 | // func nanotime1() int64 326 | "runtime.nanotime1": (sp) => { 327 | sp >>>= 0; 328 | setInt64(sp + 8, (timeOrigin + performance.now()) * 1000000); 329 | }, 330 | 331 | // func walltime() (sec int64, nsec int32) 332 | "runtime.walltime": (sp) => { 333 | sp >>>= 0; 334 | const msec = (new Date()).getTime(); 335 | setInt64(sp + 8, msec / 1000); 336 | this.mem.setInt32(sp + 16, (msec % 1000) * 1000000, true); 337 | }, 338 | 339 | // func scheduleTimeoutEvent(delay int64) int32 340 | "runtime.scheduleTimeoutEvent": (sp) => { 341 | sp >>>= 0; 342 | const id = this._nextCallbackTimeoutID; 343 | this._nextCallbackTimeoutID++; 344 | this._scheduledTimeouts.set( 345 | id, 346 | setTimeout( 347 | () => { 348 | this._resume(); 349 | while (this._scheduledTimeouts.has(id)) { 350 | // for some reason Go failed to register the timeout event, log and try again 351 | // (temporary workaround for https://github.com/golang/go/issues/28975) 352 | console.warn("scheduleTimeoutEvent: missed timeout event"); 353 | this._resume(); 354 | } 355 | }, 356 | getInt64(sp + 8) + 1, // setTimeout has been seen to fire up to 1 millisecond early 357 | ), 358 | ); 359 | this.mem.setInt32(sp + 16, id, true); 360 | }, 361 | 362 | // func clearTimeoutEvent(id int32) 363 | "runtime.clearTimeoutEvent": (sp) => { 364 | sp >>>= 0; 365 | const id = this.mem.getInt32(sp + 8, true); 366 | clearTimeout(this._scheduledTimeouts.get(id)); 367 | this._scheduledTimeouts.delete(id); 368 | }, 369 | 370 | // func getRandomData(r []byte) 371 | "runtime.getRandomData": (sp) => { 372 | sp >>>= 0; 373 | crypto.getRandomValues(loadSlice(sp + 8)); 374 | }, 375 | 376 | // func finalizeRef(v ref) 377 | "syscall/js.finalizeRef": (sp) => { 378 | sp >>>= 0; 379 | const id = this.mem.getUint32(sp + 8, true); 380 | this._goRefCounts[id]--; 381 | if (this._goRefCounts[id] === 0) { 382 | const v = this._values[id]; 383 | this._values[id] = null; 384 | this._ids.delete(v); 385 | this._idPool.push(id); 386 | } 387 | }, 388 | 389 | // func stringVal(value string) ref 390 | "syscall/js.stringVal": (sp) => { 391 | sp >>>= 0; 392 | storeValue(sp + 24, loadString(sp + 8)); 393 | }, 394 | 395 | // func valueGet(v ref, p string) ref 396 | "syscall/js.valueGet": (sp) => { 397 | sp >>>= 0; 398 | const result = Reflect.get(loadValue(sp + 8), loadString(sp + 16)); 399 | sp = this._inst.exports.getsp() >>> 0; // see comment above 400 | storeValue(sp + 32, result); 401 | }, 402 | 403 | // func valueSet(v ref, p string, x ref) 404 | "syscall/js.valueSet": (sp) => { 405 | sp >>>= 0; 406 | Reflect.set( 407 | loadValue(sp + 8), 408 | loadString(sp + 16), 409 | loadValue(sp + 32), 410 | ); 411 | }, 412 | 413 | // func valueDelete(v ref, p string) 414 | "syscall/js.valueDelete": (sp) => { 415 | sp >>>= 0; 416 | Reflect.deleteProperty(loadValue(sp + 8), loadString(sp + 16)); 417 | }, 418 | 419 | // func valueIndex(v ref, i int) ref 420 | "syscall/js.valueIndex": (sp) => { 421 | sp >>>= 0; 422 | storeValue( 423 | sp + 24, 424 | Reflect.get(loadValue(sp + 8), getInt64(sp + 16)), 425 | ); 426 | }, 427 | 428 | // valueSetIndex(v ref, i int, x ref) 429 | "syscall/js.valueSetIndex": (sp) => { 430 | sp >>>= 0; 431 | Reflect.set( 432 | loadValue(sp + 8), 433 | getInt64(sp + 16), 434 | loadValue(sp + 24), 435 | ); 436 | }, 437 | 438 | // func valueCall(v ref, m string, args []ref) (ref, bool) 439 | "syscall/js.valueCall": (sp) => { 440 | sp >>>= 0; 441 | try { 442 | const v = loadValue(sp + 8); 443 | const m = Reflect.get(v, loadString(sp + 16)); 444 | const args = loadSliceOfValues(sp + 32); 445 | const result = Reflect.apply(m, v, args); 446 | sp = this._inst.exports.getsp() >>> 0; // see comment above 447 | storeValue(sp + 56, result); 448 | this.mem.setUint8(sp + 64, 1); 449 | } catch (err) { 450 | sp = this._inst.exports.getsp() >>> 0; // see comment above 451 | storeValue(sp + 56, err); 452 | this.mem.setUint8(sp + 64, 0); 453 | } 454 | }, 455 | 456 | // func valueInvoke(v ref, args []ref) (ref, bool) 457 | "syscall/js.valueInvoke": (sp) => { 458 | sp >>>= 0; 459 | try { 460 | const v = loadValue(sp + 8); 461 | const args = loadSliceOfValues(sp + 16); 462 | const result = Reflect.apply(v, undefined, args); 463 | sp = this._inst.exports.getsp() >>> 0; // see comment above 464 | storeValue(sp + 40, result); 465 | this.mem.setUint8(sp + 48, 1); 466 | } catch (err) { 467 | sp = this._inst.exports.getsp() >>> 0; // see comment above 468 | storeValue(sp + 40, err); 469 | this.mem.setUint8(sp + 48, 0); 470 | } 471 | }, 472 | 473 | // func valueNew(v ref, args []ref) (ref, bool) 474 | "syscall/js.valueNew": (sp) => { 475 | sp >>>= 0; 476 | try { 477 | const v = loadValue(sp + 8); 478 | const args = loadSliceOfValues(sp + 16); 479 | const result = Reflect.construct(v, args); 480 | sp = this._inst.exports.getsp() >>> 0; // see comment above 481 | storeValue(sp + 40, result); 482 | this.mem.setUint8(sp + 48, 1); 483 | } catch (err) { 484 | sp = this._inst.exports.getsp() >>> 0; // see comment above 485 | storeValue(sp + 40, err); 486 | this.mem.setUint8(sp + 48, 0); 487 | } 488 | }, 489 | 490 | // func valueLength(v ref) int 491 | "syscall/js.valueLength": (sp) => { 492 | sp >>>= 0; 493 | setInt64(sp + 16, parseInt(loadValue(sp + 8).length)); 494 | }, 495 | 496 | // valuePrepareString(v ref) (ref, int) 497 | "syscall/js.valuePrepareString": (sp) => { 498 | sp >>>= 0; 499 | const str = encoder.encode(String(loadValue(sp + 8))); 500 | storeValue(sp + 16, str); 501 | setInt64(sp + 24, str.length); 502 | }, 503 | 504 | // valueLoadString(v ref, b []byte) 505 | "syscall/js.valueLoadString": (sp) => { 506 | sp >>>= 0; 507 | const str = loadValue(sp + 8); 508 | loadSlice(sp + 16).set(str); 509 | }, 510 | 511 | // func valueInstanceOf(v ref, t ref) bool 512 | "syscall/js.valueInstanceOf": (sp) => { 513 | sp >>>= 0; 514 | this.mem.setUint8( 515 | sp + 24, 516 | (loadValue(sp + 8) instanceof loadValue(sp + 16)) ? 1 : 0, 517 | ); 518 | }, 519 | 520 | // func copyBytesToGo(dst []byte, src ref) (int, bool) 521 | "syscall/js.copyBytesToGo": (sp) => { 522 | sp >>>= 0; 523 | const dst = loadSlice(sp + 8); 524 | const src = loadValue(sp + 32); 525 | if ( 526 | !(src instanceof Uint8Array || src instanceof Uint8ClampedArray) 527 | ) { 528 | this.mem.setUint8(sp + 48, 0); 529 | return; 530 | } 531 | const toCopy = src.subarray(0, dst.length); 532 | dst.set(toCopy); 533 | setInt64(sp + 40, toCopy.length); 534 | this.mem.setUint8(sp + 48, 1); 535 | }, 536 | 537 | // func copyBytesToJS(dst ref, src []byte) (int, bool) 538 | "syscall/js.copyBytesToJS": (sp) => { 539 | sp >>>= 0; 540 | const dst = loadValue(sp + 8); 541 | const src = loadSlice(sp + 16); 542 | if ( 543 | !(dst instanceof Uint8Array || dst instanceof Uint8ClampedArray) 544 | ) { 545 | this.mem.setUint8(sp + 48, 0); 546 | return; 547 | } 548 | const toCopy = src.subarray(0, dst.length); 549 | dst.set(toCopy); 550 | setInt64(sp + 40, toCopy.length); 551 | this.mem.setUint8(sp + 48, 1); 552 | }, 553 | 554 | "debug": (value) => { 555 | console.log(value); 556 | }, 557 | }, 558 | }; 559 | } 560 | 561 | async run(instance) { 562 | if (!(instance instanceof WebAssembly.Instance)) { 563 | throw new Error("Go.run: WebAssembly.Instance expected"); 564 | } 565 | this._inst = instance; 566 | this.mem = new DataView(this._inst.exports.mem.buffer); 567 | this._values = [ // JS values that Go currently has references to, indexed by reference id 568 | NaN, 569 | 0, 570 | null, 571 | true, 572 | false, 573 | globalThis, 574 | this, 575 | ]; 576 | this._goRefCounts = new Array(this._values.length).fill(Infinity); // number of references that Go has to a JS value, indexed by reference id 577 | this._ids = new Map([ // mapping from JS values to reference ids 578 | [0, 1], 579 | [null, 2], 580 | [true, 3], 581 | [false, 4], 582 | [globalThis, 5], 583 | [this, 6], 584 | ]); 585 | this._idPool = []; // unused ids that have been garbage collected 586 | this.exited = false; // whether the Go program has exited 587 | 588 | // Pass command line arguments and environment variables to WebAssembly by writing them to the linear memory. 589 | let offset = 4096; 590 | 591 | const strPtr = (str) => { 592 | const ptr = offset; 593 | const bytes = encoder.encode(str + "\0"); 594 | new Uint8Array(this.mem.buffer, offset, bytes.length).set(bytes); 595 | offset += bytes.length; 596 | if (offset % 8 !== 0) { 597 | offset += 8 - (offset % 8); 598 | } 599 | return ptr; 600 | }; 601 | 602 | const argc = this.argv.length; 603 | 604 | const argvPtrs = []; 605 | this.argv.forEach((arg) => { 606 | argvPtrs.push(strPtr(arg)); 607 | }); 608 | argvPtrs.push(0); 609 | 610 | const keys = Object.keys(this.env).sort(); 611 | keys.forEach((key) => { 612 | argvPtrs.push(strPtr(`${key}=${this.env[key]}`)); 613 | }); 614 | argvPtrs.push(0); 615 | 616 | const argv = offset; 617 | argvPtrs.forEach((ptr) => { 618 | this.mem.setUint32(offset, ptr, true); 619 | this.mem.setUint32(offset + 4, 0, true); 620 | offset += 8; 621 | }); 622 | 623 | // The linker guarantees global data starts from at least wasmMinDataAddr. 624 | // Keep in sync with cmd/link/internal/ld/data.go:wasmMinDataAddr. 625 | const wasmMinDataAddr = 4096 + 8192; 626 | if (offset >= wasmMinDataAddr) { 627 | throw new Error( 628 | "total length of command line and environment variables exceeds limit", 629 | ); 630 | } 631 | 632 | this._inst.exports.run(argc, argv); 633 | if (this.exited) { 634 | this._resolveExitPromise(); 635 | } 636 | await this._exitPromise; 637 | } 638 | 639 | _resume() { 640 | if (this.exited) { 641 | throw new Error("Go program has already exited"); 642 | } 643 | this._inst.exports.resume(); 644 | if (this.exited) { 645 | this._resolveExitPromise(); 646 | } 647 | } 648 | 649 | _makeFuncWrapper(id) { 650 | const go = this; 651 | return function () { 652 | const event = { id: id, this: this, args: arguments }; 653 | go._pendingEvent = event; 654 | go._resume(); 655 | return event.result; 656 | }; 657 | } 658 | }; 659 | })(); 660 | --------------------------------------------------------------------------------