├── .prettierignore
├── test
├── node
│ ├── .gitignore
│ ├── esm
│ │ ├── package.json
│ │ └── index.js
│ └── cjs
│ │ ├── package.json
│ │ └── index.js
├── utils.ts
└── index.test.ts
├── .gitignore
├── public
├── takodachi.png
├── nested
│ └── takodachi.png
└── html
│ ├── a.html
│ └── index.html
├── public-aliased
└── tako.png
├── .prettierrc
├── example
├── static.ts
├── index.ts
└── a.ts
├── .npmignore
├── .eslintrc
├── .github
└── workflows
│ ├── ci.yml
│ └── publish.yml
├── README.md
├── LICENSE
├── package.json
├── src
├── types.ts
├── utils.ts
└── index.ts
├── CHANGELOG.md
├── tsconfig.dts.json
├── tsconfig.json
└── bun.lock
/.prettierignore:
--------------------------------------------------------------------------------
1 | **/*.md
2 | **/*.json
3 |
--------------------------------------------------------------------------------
/test/node/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | package-lock.json
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 |
3 | node_modules
4 | .pnpm-debug.log
5 | dist
6 |
7 | build
--------------------------------------------------------------------------------
/public/takodachi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elysiajs/elysia-static/HEAD/public/takodachi.png
--------------------------------------------------------------------------------
/public-aliased/tako.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elysiajs/elysia-static/HEAD/public-aliased/tako.png
--------------------------------------------------------------------------------
/public/nested/takodachi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elysiajs/elysia-static/HEAD/public/nested/takodachi.png
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "useTabs": false,
3 | "tabWidth": 4,
4 | "semi": false,
5 | "singleQuote": true,
6 | "trailingComma": "none"
7 | }
8 |
--------------------------------------------------------------------------------
/test/node/esm/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "type": "module",
3 | "dependencies": {
4 | "@elysiajs/static": "../../.."
5 | }
6 | }
--------------------------------------------------------------------------------
/test/node/cjs/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "type": "commonjs",
3 | "dependencies": {
4 | "@elysiajs/static": "../../.."
5 | }
6 | }
--------------------------------------------------------------------------------
/test/utils.ts:
--------------------------------------------------------------------------------
1 | export const req = (path: string) => new Request(`http://localhost${path}`)
2 |
3 | export const takodachi = await Bun.file('public/takodachi.png').text()
4 |
--------------------------------------------------------------------------------
/public/html/a.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Home!!
5 |
6 |
7 | A!
8 |
9 |
10 |
--------------------------------------------------------------------------------
/public/html/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Home!
5 |
6 |
7 | Home!
8 |
9 |
10 |
--------------------------------------------------------------------------------
/example/static.ts:
--------------------------------------------------------------------------------
1 | import { Elysia } from 'elysia'
2 | import staticPlugin from '../src'
3 |
4 | new Elysia()
5 | .use(
6 | staticPlugin({
7 | alwaysStatic: true,
8 | noExtension: true
9 | })
10 | )
11 | .listen(8080)
12 |
--------------------------------------------------------------------------------
/example/index.ts:
--------------------------------------------------------------------------------
1 | import { Elysia } from 'elysia'
2 | import { staticPlugin } from '../src/index'
3 |
4 | const app = new Elysia()
5 | .use(
6 | await staticPlugin({
7 | prefix: '/'
8 | })
9 | )
10 | .listen(3000)
11 |
12 | console.log(app.routes)
13 |
14 | await app.modules
15 |
--------------------------------------------------------------------------------
/test/node/esm/index.js:
--------------------------------------------------------------------------------
1 | if ('Bun' in globalThis) {
2 | throw new Error('❌ Use Node.js to run this test!')
3 | }
4 |
5 | import { staticPlugin } from '@elysiajs/static'
6 |
7 | if (typeof staticPlugin !== 'function') {
8 | throw new Error('❌ ESM Node.js failed')
9 | }
10 |
11 | console.log('✅ ESM Node.js works!')
12 |
--------------------------------------------------------------------------------
/test/node/cjs/index.js:
--------------------------------------------------------------------------------
1 | if ('Bun' in globalThis) {
2 | throw new Error('❌ Use Node.js to run this test!')
3 | }
4 |
5 | const { staticPlugin } = require('@elysiajs/static')
6 |
7 | if (typeof staticPlugin !== 'function') {
8 | throw new Error('❌ CommonJS Node.js failed')
9 | }
10 |
11 | console.log('✅ CommonJS Node.js works!')
12 |
--------------------------------------------------------------------------------
/.npmignore:
--------------------------------------------------------------------------------
1 | .git
2 | .github
3 | .gitignore
4 | .prettierrc
5 | .prettierrcignore
6 | .cjs.swcrc
7 | .es.swcrc
8 | bun.lockb
9 |
10 | node_modules
11 | tsconfig.json
12 | pnpm-lock.yaml
13 | jest.config.js
14 | nodemon.json
15 |
16 | example
17 | tests
18 | public
19 | public-aliased
20 | test
21 | CHANGELOG.md
22 | .eslintrc.js
23 | tsconfig.cjs.json
24 | tsconfig.esm.json
25 | tsconfig.dts.json
26 |
27 | src
28 | build.ts
29 |
--------------------------------------------------------------------------------
/example/a.ts:
--------------------------------------------------------------------------------
1 | import { Elysia } from 'elysia'
2 | import { staticPlugin } from '../src'
3 | import { req } from '../test/utils'
4 |
5 | const app = new Elysia().use(
6 | staticPlugin({
7 | alwaysStatic: true,
8 | extension: false,
9 | headers: {
10 | ['x-powered-by']: 'Takodachi'
11 | }
12 | })
13 | )
14 |
15 | await app.modules
16 |
17 | const res = await app.handle(req('/public/takodachi'))
18 | console.log(res.headers.get('x-powered-by'))
19 |
--------------------------------------------------------------------------------
/.eslintrc:
--------------------------------------------------------------------------------
1 | {
2 | "env": {
3 | "es2021": true,
4 | "node": true
5 | },
6 | "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended"],
7 | "parser": "@typescript-eslint/parser",
8 | "parserOptions": {
9 | "ecmaVersion": "latest",
10 | "sourceType": "module"
11 | },
12 | "plugins": ["@typescript-eslint"],
13 | "rules": {
14 | "@typescript-eslint/ban-types": "off",
15 | "@typescript-eslint/no-explicit-any": 1
16 | },
17 | "ignorePatterns": ["example/*", "test/*", "dist/*"]
18 | }
19 |
--------------------------------------------------------------------------------
/.github/workflows/ci.yml:
--------------------------------------------------------------------------------
1 | name: Build and Test
2 |
3 | on:
4 | push:
5 | pull_request:
6 |
7 | jobs:
8 | build:
9 | name: Build and test code
10 | runs-on: ubuntu-latest
11 |
12 | steps:
13 | - name: Checkout
14 | uses: actions/checkout@v4
15 |
16 | - name: Setup bun
17 | uses: oven-sh/setup-bun@v1
18 | with:
19 | bun-version: latest
20 |
21 | - name: Install packages
22 | run: bun install
23 |
24 | - name: Build code
25 | run: bun run build
26 |
27 | - name: Test
28 | run: bun run test
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # @elysiajs/static
2 | Plugin for [elysia](https://github.com/saltyaom/elysia) for serving static folder.
3 |
4 | ## Installation
5 | ```bash
6 | bun add @elysiajs/static
7 | ```
8 |
9 | ## Example
10 | ```typescript
11 | import { Elysia } from 'elysia'
12 | import { staticPlugin } from '@elysiajs/static'
13 |
14 | const app = new Elysia()
15 | .use(staticPlugin())
16 | .listen(8080)
17 | ```
18 |
19 | ## Config
20 | Below is an available config for a static plugin.
21 |
22 | ### assets
23 | @default "public"
24 |
25 | Asset path to expose as a public path
26 |
27 | ### prefix
28 | @default '/public'
29 |
30 | Path prefix to create a virtual mount path for the static directory
31 |
32 | ### staticLimit
33 | @defualt 1024
34 |
35 | If total files exceed this number, the file will be handled via wildcard instead of the static route to reduce memory usage
36 |
37 | ### alwaysStatic
38 | @default boolean
39 |
40 | If set to true, the file will always use a static path instead
41 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright 2022 saltyAom
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4 |
5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6 |
7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
8 |
--------------------------------------------------------------------------------
/.github/workflows/publish.yml:
--------------------------------------------------------------------------------
1 | name: Publish
2 |
3 | on:
4 | release:
5 | types: [published]
6 |
7 | defaults:
8 | run:
9 | shell: bash
10 |
11 | permissions:
12 | id-token: write
13 |
14 | env:
15 | # Enable debug logging for actions
16 | ACTIONS_RUNNER_DEBUG: true
17 |
18 | jobs:
19 | publish-npm:
20 | name: 'Publish: npm Registry'
21 | runs-on: ubuntu-latest
22 | steps:
23 | - name: 'Checkout'
24 | uses: actions/checkout@v4
25 |
26 | - name: 'Setup Bun'
27 | uses: oven-sh/setup-bun@v1
28 | with:
29 | bun-version: latest
30 | registry-url: "https://registry.npmjs.org"
31 |
32 | - uses: actions/setup-node@v4
33 | with:
34 | node-version: '20.x'
35 | registry-url: 'https://registry.npmjs.org'
36 |
37 | - name: Install packages
38 | run: bun install
39 |
40 | - name: Build code
41 | run: bun run build
42 |
43 | - name: Test
44 | run: bun run test
45 |
46 | - name: 'Publish'
47 | env:
48 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
49 | run: |
50 | npm publish --provenance --access=public
51 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@elysiajs/static",
3 | "version": "1.4.7",
4 | "license": "MIT",
5 | "scripts": {
6 | "dev": "bun run --watch example/index.ts",
7 | "test": "bun test && npm run test:node",
8 | "test:node": "npm install --prefix ./test/node/cjs/ && npm install --prefix ./test/node/esm/ && node ./test/node/cjs/index.js && node ./test/node/esm/index.js",
9 | "build": "bun build.ts",
10 | "release": "npm run build && npm run test && npm publish --access public"
11 | },
12 | "main": "./dist/index.js",
13 | "types": "./dist/index.d.ts",
14 | "module": "./dist/index.js",
15 | "exports": {
16 | "./package.json": "./package.json",
17 | ".": {
18 | "types": "./dist/index.d.ts",
19 | "import": "./dist/index.mjs",
20 | "require": "./dist/index.js"
21 | },
22 | "./utils": {
23 | "types": "./dist/utils.d.ts",
24 | "import": "./dist/utils.mjs",
25 | "require": "./dist/utils.js"
26 | },
27 | "./types": {
28 | "types": "./dist/types.d.ts",
29 | "import": "./dist/types.mjs",
30 | "require": "./dist/types.js"
31 | }
32 | },
33 | "devDependencies": {
34 | "@types/bun": "^1.3.0",
35 | "@types/fast-decode-uri-component": "^1.0.0",
36 | "@types/node": "^24",
37 | "@typescript-eslint/eslint-plugin": "^6.7.4",
38 | "elysia": "^1.4.11",
39 | "esbuild-fix-imports-plugin": "^1.0.22",
40 | "eslint": "9.6.0",
41 | "fast-decode-uri-component": "^1.0.1",
42 | "tsup": "^8.1.0",
43 | "typescript": "^5.5.3"
44 | },
45 | "peerDependencies": {
46 | "elysia": ">= 1.4.0"
47 | },
48 | "keywords": [
49 | "elysia",
50 | "static",
51 | "public"
52 | ],
53 | "author": {
54 | "name": "saltyAom",
55 | "url": "https://github.com/SaltyAom",
56 | "email": "saltyaom@gmail.com"
57 | },
58 | "repository": {
59 | "type": "git",
60 | "url": "https://github.com/elysiajs/elysia-static"
61 | },
62 | "bugs": "https://github.com/elysiajs/elysia-static/issues",
63 | "description": "Plugin for Elysia for serving static folder",
64 | "homepage": "https://github.com/elysiajs/elysia-static"
65 | }
66 |
--------------------------------------------------------------------------------
/src/types.ts:
--------------------------------------------------------------------------------
1 | export interface StaticOptions {
2 | /**
3 | * @default "public"
4 | *
5 | * Asset path to expose as public path
6 | */
7 | assets?: string
8 | /**
9 | * @default '/public'
10 | *
11 | * Path prefix to create virtual mount path for the static directory
12 | */
13 | prefix?: Prefix
14 | /**
15 | * @default 1024
16 | *
17 | * If total files exceed this number,
18 | * file will be handled via wildcard instead of static route
19 | * to reduce memory usage
20 | */
21 | staticLimit?: number
22 | /**
23 | * @default false unless `NODE_ENV` is 'production'
24 | *
25 | * Should file always be served statically
26 | */
27 | alwaysStatic?: boolean
28 | /**
29 | * @default [] `Array`
30 | *
31 | * Array of file to ignore publication.
32 | * If one of the patters is matched,
33 | * file will not be exposed.
34 | */
35 | ignorePatterns?: Array
36 |
37 | /**
38 | * Indicate if file extension is required
39 | *
40 | * Only works if `alwaysStatic` is set to true
41 | *
42 | * @default true
43 | */
44 | extension?: boolean
45 |
46 | /**
47 | *
48 | * When url needs to be decoded
49 | *
50 | * Only works if `alwaysStatic` is set to false
51 | */
52 | /**
53 | * Set headers
54 | */
55 | headers?: Record | undefined
56 |
57 | /**
58 | * @default true
59 | *
60 | * If set to false, browser caching will be disabled
61 | *
62 | * On Bun, if set to false, performance will be significantly improved
63 | * as it can be inline as a static resource
64 | */
65 | etag?: boolean
66 |
67 | /**
68 | * @default public
69 | *
70 | * directive for Cache-Control header
71 | *
72 | * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#directives
73 | */
74 | directive?:
75 | | 'public'
76 | | 'private'
77 | | 'must-revalidate'
78 | | 'no-cache'
79 | | 'no-store'
80 | | 'no-transform'
81 | | 'proxy-revalidate'
82 | | 'immutable'
83 |
84 | /**
85 | * @default 86400
86 | *
87 | * Specifies the maximum amount of time in seconds, a resource will be considered fresh.
88 | * This freshness lifetime is calculated relative to the time of the request.
89 | * This setting helps control browser caching behavior.
90 | * A `maxAge` of 0 will prevent caching, requiring requests to validate with the server before use.
91 | */
92 | maxAge?: number | null
93 |
94 | /**
95 | *
96 | */
97 | /**
98 | * @default true
99 | *
100 | * Enable serving of index.html as default / route
101 | */
102 | indexHTML?: boolean
103 |
104 | /**
105 | * decodeURI
106 | *
107 | * @default false
108 | */
109 | decodeURI?: boolean
110 |
111 | /**
112 | * silent
113 | *
114 | * @default false
115 | *
116 | * If set to true, suppresses all logs and warnings from the static plugin
117 | */
118 | silent?: boolean
119 | }
120 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # 1.4.7 - 17 Nov 2025
2 | Bug fix:
3 | - remove trailing slash on Windows
4 |
5 | # 1.4.6 - 3 Nov 2025
6 | Bug fix:
7 | - normalize path only when unsafe
8 | - cache `crypto` package import
9 |
10 | # 1.4.5 - 1 Nov 2025
11 | Bug fix:
12 | - [#52](https://github.com/elysiajs/elysia-static/pull/52) resolve static paths correctly on Windows
13 |
14 | # 1.4.4 - 14 Oct 2025
15 | Bug fix:
16 | - fix cjs main import
17 |
18 | # 1.4.3 - 13 Oct 2025
19 | Improvement:
20 | - adjust build script
21 | - remove stat cache
22 |
23 | # 1.4.2 - 13 Oct 2025
24 | Improvement:
25 | - better caching mechanism
26 | - scope cache to each instance
27 |
28 | # 1.4.1 - 13 Oct 2025
29 | Improvement:
30 | - enable Bun full stack support
31 | - general performance improvement
32 | - [#34](https://github.com/elysiajs/elysia-static/pull/34) log errors, make it easier to debug errors inside @elysiajs/static
33 | - [#44](https://github.com/elysiajs/elysia-static/pull/44) fixed edge case when working dir is root
34 | - use process.getBuiltinModules instead of import
35 | - refactor codebase to be more readable
36 | - rename `noCache` to `cache`
37 | - use `Bun.Glob` if Bun is detected
38 | - conditional run `listFiles` only when necessary
39 | - reduce seed to `prefix` parameter
40 | - cache etag generation
41 |
42 | Change:
43 | - remove node-cache dependency
44 | - remove handle safe sep for windows as Node already handle it
45 |
46 | Breaking Change:
47 | - rename `enableDecodeURI` to `decodeURI`
48 | - remove `resolve` options, use default path.resolve instead
49 |
50 | # 1.3.0-exp.0 - 23 Apr 2025
51 | Change:
52 | - Add support for Elysia 1.3
53 |
54 | # 1.2.0-rc.0 - 23 Dec 2024
55 | Change:
56 | - Add support for Elysia 1.2
57 |
58 | # 1.1.2 - 18 Dec 2024
59 | Bug fix:
60 | - [#40](https://github.com/elysiajs/elysia-static/pull/40) serve indexHTML
61 |
62 | # 1.1.0 - 16 Jul 2024
63 | Change:
64 | - Add support for Elysia 1.1
65 |
66 |
67 | # 1.1.0-rc.0 - 12 Jul 2024
68 | Change:
69 | - Add support for Elysia 1.1
70 |
71 | # 1.0.3 - 24 Apr 2024
72 | Improvement:
73 | - [#26](https://github.com/elysiajs/elysia-static/pull/26) support system paths (windows)
74 | - [#25](https://github.com/elysiajs/elysia-static/pull/24) add maxAge param
75 | - add cache-control directive
76 |
77 | # 1.0.0 - 16 Mar 2024
78 | Change:
79 | - Add support for Elysia 1.0
80 |
81 |
82 | # 1.0.0-rc.0 - 1 Mar 2024
83 | Change:
84 | - Add support for Elysia 1.0
85 |
86 |
87 | # 1.0.0-beta.1 - 17 Feb 2024
88 | Change:
89 | - Add support for Elysia 1.0
90 |
91 |
92 | # 1.0.0-beta.0 - 6 Feb 2024
93 | Change:
94 | - Add support for Elysia 1.0
95 |
96 | # 0.8.1 - 25 Dec 2023
97 | Feature:
98 | - `indexHTML` support
99 | - [#16](https://github.com/elysiajs/elysia-static/pull/16) implement enableDecodeURI
100 | - [#13](https://github.com/elysiajs/elysia-static/pull/13) prettier and eslint
101 |
102 | Bug fix:
103 | - [#18](https://github.com/elysiajs/elysia-static/pull/18) 404 navigate to folder
104 | - [#14](https://github.com/elysiajs/elysia-static/pull/14) browser cache
105 | - [#12](https://github.com/elysiajs/elysia-static/pull/12) always static with assets on an absolute path
106 |
107 | # 0.8.0 - 23 Dec 2023
108 | Change:
109 | - Add support for Elysia 0.8
110 |
111 | # 0.8.0-rc.0 - 15 Dec 2023
112 | Change:
113 | - Add support for Elysia 0.8
114 |
115 | # 0.7.1 - 23 Sep 2023
116 | Improvement:
117 | - [#10](https://github.com/elysiajs/elysia-static/issues/10) onError is not triggered when page is not found and file resolution is dynamic
118 | - [#7](https://github.com/elysiajs/elysia-static/issues/8) add `headers` config
119 | - using new plugin model instead of functional callback
120 |
121 | Change:
122 | - Minimum support for Elysia is now set to 0.7.9
123 |
124 | Bug fix:
125 | - [#8](https://github.com/elysiajs/elysia-static/issues/8) set `noUncheckedIndexedAccess` to `true`
126 |
127 | # 0.7.0 - 20 Sep 2023
128 | - Add support for Elysia 0.7
129 |
130 | # 0.7.0-beta.0 - 18 Sep 2023
131 | - Add support for Elysia 0.7
132 |
133 | # 0.6.0 - 6 Aug 2023
134 | - Add support for Elysia 0.6
135 |
136 | # 0.6.0-rc.0 - 6 Aug 2023
137 | - Add support for Elysia 0.6
138 | # 0.5.0 - 15 May 2023
139 | - Add support for Elysia 0.5
140 | - Add CommonJS support
141 |
142 | # 0.3.1 - 24 Mar 2023
143 | fix:
144 | - resolve fn on wrong location
145 |
146 | # 0.3.1 - 24 Mar 2023
147 | Improvement:
148 | - Add custom resolve function
149 | - Ignore `.env`, `.DS_Store` by default
150 |
151 | # 0.3.0 - 17 Mar 2023
152 | Improvement:
153 | - Add support for Elysia 0.3.0
154 |
155 | # 0.3.0-rc.0 - 7 Mar 2023
156 | Improvement:
157 | - Add support for Elysia 0.3.0-rc.0
158 | - Add support for Raikiri router
159 |
160 | # 0.2.0-beta.1 - 22 Jan 2023
161 | Breaking Change:
162 | - `path` is now `assets`
163 |
164 | Improvement:
165 | - Handle index (/)
166 |
167 | # 0.2.0-beta.0 - 19 Jan 2023
168 | Improvement:
169 | - Using `fs/promise` instead of sync
170 | - Support non blocking plugin registraiton
171 |
172 | Change:
173 | - Minimum requirement is now `elysia >= 0.2.0-beta.0`
174 |
175 | # 0.1.3 - 1 Jan 2023
176 | Fix:
177 | - Fix crash if total files exceed 76554
178 |
179 | # 0.1.2 - 1 Jan 2023
180 | Improvement:
181 | - Add `noExtension`
182 |
183 | # 0.1.1 - 1 Jan 2023
184 | Improvement:
185 | - A little faster response to inline image
186 | - Match 404 convention
187 |
188 | # 0.1.0-rc.3 - 13 Dec 2022
189 | Improvement:
190 | - Add support for Elysia 0.1.0-rc.5
191 |
192 | # 0.1.0-rc.2 - 9 Dec 2022
193 | Fix:
194 | - Add main fields Bundlephobia
195 |
196 | # 0.1.0-rc.1 - 6 Dec 2022
197 | Improvement:
198 | - Support for Elysia 0.1.0-rc.1 onward
199 |
200 | # 0.0.0-experimental.3 - 4 Dev 2022
201 | Feature:
202 | - Rebrand to Elysia
203 |
204 | # 0.0.0-experimental.2 - 22 Nov 2022
205 | Change:
206 | - Support for KingWorld 0.0.0-experimental.51
207 |
208 | # 0.0.0-experimental.1 - 30 Oct 2022
209 | Change:
210 | - Support for KingWorld 0.0.0-experimental.28 onward
211 | - chore: update dependencies
212 |
--------------------------------------------------------------------------------
/src/utils.ts:
--------------------------------------------------------------------------------
1 | import type { BunFile } from 'bun'
2 | import type { Stats } from 'fs'
3 |
4 | let fs: typeof import('fs/promises')
5 | let path: typeof import('path')
6 |
7 | export const isBun = typeof Bun !== 'undefined' && !!Bun.file
8 |
9 | export function getBuiltinModule() {
10 | if (!fs) fs = process.getBuiltinModule('fs/promises')
11 | if (!typeof fs) {
12 | console.warn('@elysiajs/static require fs/promises to be available.')
13 | return
14 | }
15 |
16 | if (!path) path = process.getBuiltinModule('path')
17 | if (!path) {
18 | console.warn('@elysiajs/static require path to be available.')
19 | return
20 | }
21 |
22 | return [fs, path] as const
23 | }
24 |
25 | export async function listHTMLFiles(dir: string) {
26 | if (!fs) getBuiltinModule()
27 |
28 | if (isBun) {
29 | const glob = new Bun.Glob('**/*.html')
30 | const files = []
31 |
32 | for await (const file of glob.scan(dir))
33 | files.push(path.join(dir, file))
34 |
35 | return files
36 | }
37 |
38 | return []
39 | }
40 |
41 | export async function listFiles(dir: string): Promise {
42 | if (!fs) getBuiltinModule()
43 |
44 | if (isBun) {
45 | const glob = new Bun.Glob('**/*')
46 | const files = []
47 |
48 | for await (const file of glob.scan(dir))
49 | files.push(path.join(dir, file))
50 |
51 | return files
52 | }
53 |
54 | const files = await fs.readdir(dir).catch(() => [])
55 |
56 | const all = await Promise.all(
57 | files.map(async (name) => {
58 | const file = dir + path.sep + name
59 | const stats = await fs.stat(file).catch(() => null)
60 | if (!stats) return []
61 |
62 | return stats.isDirectory()
63 | ? await listFiles(file)
64 | : [path.resolve(dir, file)]
65 | })
66 | )
67 |
68 | return all.flat()
69 | }
70 |
71 | export function fileExists(path: string) {
72 | if (!fs) getBuiltinModule()
73 |
74 | return fs.stat(path).then(
75 | () => true,
76 | () => false
77 | )
78 | }
79 |
80 | export class LRUCache {
81 | private map = new Map()
82 | private interval: number | undefined
83 |
84 | constructor(
85 | private readonly max = 250,
86 | private readonly ttl = 3 * 60 * 60
87 | ) {}
88 |
89 | get(key: K): V | undefined {
90 | const entry = this.map.get(key)
91 | if (!entry) return
92 |
93 | if (entry[1] <= Date.now()) return void this.delete(key)
94 |
95 | // refresh LRU order
96 | this.map.delete(key)
97 | this.map.set(key, entry)
98 | return entry[0]
99 | }
100 |
101 | set(key: K, value: V): void {
102 | if (!this.interval)
103 | this.interval = setInterval(() => {
104 | const now = Date.now()
105 | for (const [key, entry] of this.map)
106 | if (entry[1] <= now) this.map.delete(key)
107 | }, this.ttl) as unknown as number
108 |
109 | if (this.map.has(key)) this.map.delete(key)
110 | else if (this.map.size >= this.max) {
111 | const oldestKey = this.map.keys().next().value
112 |
113 | if (oldestKey !== undefined) this.delete(oldestKey)
114 | }
115 |
116 | this.map.set(key, [value, Date.now() + this.ttl * 1000])
117 | }
118 |
119 | delete(key: K): void {
120 | if (!this.map.get(key)) return
121 |
122 | this.map.delete(key)
123 | }
124 |
125 | clear(): void {
126 | this.map.clear()
127 | }
128 |
129 | size(): number {
130 | return this.map.size
131 | }
132 |
133 | [Symbol.dispose]() {
134 | if (this.interval) clearInterval(this.interval)
135 | }
136 | }
137 |
138 | export function isCached(
139 | headers: Record,
140 | etag: string,
141 | filePath: string
142 | ) {
143 | // Always return stale when Cache-Control: no-cache
144 | // to support end-to-end reload requests
145 | // https://tools.ietf.org/html/rfc2616#section-14.9.4
146 | if (
147 | headers['cache-control'] &&
148 | /no-cache|no-store/.test(headers['cache-control'])
149 | )
150 | return false
151 |
152 | if ('if-none-match' in headers) {
153 | const ifNoneMatch = headers['if-none-match']
154 |
155 | if (ifNoneMatch === '*') return true
156 | if (ifNoneMatch === null) return false
157 | if (typeof etag !== 'string') return false
158 |
159 | const isMatching = ifNoneMatch === etag
160 |
161 | if (isMatching) return true
162 |
163 | /**
164 | * A recipient MUST ignore If-Modified-Since if the request contains an
165 | * If-None-Match header field; the condition in If-None-Match is considered
166 | * to be a more accurate replacement for the condition in If-Modified-Since,
167 | * and the two are only combined for the sake of interoperating with older
168 | * intermediaries that might not implement If-None-Match.
169 | *
170 | * @see RFC 9110 section 13.1.3
171 | */
172 | return false
173 | }
174 |
175 | if (headers['if-modified-since']) {
176 | const ifModifiedSince = headers['if-modified-since']
177 |
178 | try {
179 | return fs.stat(filePath).then((stat) => {
180 | if (
181 | stat.mtime !== undefined &&
182 | stat.mtime.getTime() <= Date.parse(ifModifiedSince)
183 | )
184 | return true
185 | })
186 | } catch {}
187 | }
188 |
189 | return false
190 | }
191 |
192 | let Crypto: typeof import('crypto')
193 |
194 | export function getFile(path: string) {
195 | if (isBun) return Bun.file(path)
196 |
197 | if (!fs) getBuiltinModule()
198 | return fs.readFile(path)
199 | }
200 |
201 | export async function generateETag(file: BunFile | Buffer) {
202 | if (isBun)
203 | return new Bun.CryptoHasher('md5')
204 | .update(await (file as BunFile).arrayBuffer())
205 | .digest('base64')
206 |
207 | if (!Crypto) Crypto = process.getBuiltinModule('crypto')
208 | if (!Crypto)
209 | return void console.warn(
210 | '[@elysiajs/static] crypto is required to generate etag.'
211 | )
212 |
213 | return Crypto.createHash('md5')
214 | .update(file as Buffer)
215 | .digest('base64')
216 | }
217 |
218 | export const isNotEmpty = (obj?: Object) => {
219 | if (!obj) return false
220 |
221 | for (const _ in obj) return true
222 |
223 | return false
224 | }
225 |
--------------------------------------------------------------------------------
/tsconfig.dts.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "preserveSymlinks": true,
4 | /* Visit https://aka.ms/tsconfig to read more about this file */
5 |
6 | /* Projects */
7 | // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */
8 | // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */
9 | // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */
10 | // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */
11 | // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */
12 | // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */
13 |
14 | /* Language and Environment */
15 | "target": "ES2021", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
16 | "lib": ["ESNext"], /* Specify a set of bundled library declaration files that describe the target runtime environment. */
17 | // "jsx": "preserve", /* Specify what JSX code is generated. */
18 | // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */
19 | // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */
20 | // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */
21 | // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
22 | // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */
23 | // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */
24 | // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */
25 | // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */
26 | // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */
27 |
28 | /* Modules */
29 | "module": "ES2022", /* Specify what module code is generated. */
30 | "rootDir": "./src", /* Specify the root folder within your source files. */
31 | "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */
32 | // "baseUrl": "./src", /* Specify the base directory to resolve non-relative module names. */
33 | // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */
34 | // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */
35 | // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */
36 | // "types": ["bun-types"], /* Specify type package names to be included without being referenced in a source file. */
37 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
38 | // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */
39 | "resolveJsonModule": true, /* Enable importing .json files. */
40 | // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */
41 |
42 | /* JavaScript Support */
43 | // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */
44 | // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */
45 | // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */
46 |
47 | /* Emit */
48 | "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
49 | // "declarationMap": true, /* Create sourcemaps for d.ts files. */
50 | "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */
51 | // "sourceMap": true, /* Create source map files for emitted JavaScript files. */
52 | // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */
53 | "outDir": "./dist", /* Specify an output folder for all emitted files. */
54 | // "removeComments": true, /* Disable emitting comments. */
55 | // "noEmit": true, /* Disable emitting files from a compilation. */
56 | // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
57 | // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */
58 | // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
59 | // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */
60 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
61 | // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */
62 | // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */
63 | // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
64 | // "newLine": "crlf", /* Set the newline character for emitting files. */
65 | // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */
66 | // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */
67 | // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */
68 | // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */
69 | // "declarationDir": "./", /* Specify the output directory for generated declaration files. */
70 | // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */
71 |
72 | /* Interop Constraints */
73 | // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */
74 | "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */
75 | "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */
76 | // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
77 | "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */
78 |
79 | /* Type Checking */
80 | "strict": true, /* Enable all strict type-checking options. */
81 | // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */
82 | // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */
83 | // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
84 | // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */
85 | // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */
86 | // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */
87 | // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */
88 | // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */
89 | // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */
90 | // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */
91 | // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */
92 | // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */
93 | // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */
94 | // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */
95 | // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */
96 | // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */
97 | // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */
98 | // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */
99 |
100 | /* Completeness */
101 | // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
102 | "skipLibCheck": true, /* Skip type checking all .d.ts files. */
103 | },
104 | "exclude": ["node_modules", "test", "example", "dist", "build.ts"]
105 | // "include": ["src/**/*"]
106 | }
107 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "resolveJsonModule": true,
4 | "preserveSymlinks": true,
5 | /* Visit https://aka.ms/tsconfig to read more about this file */
6 |
7 | /* Projects */
8 | // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */
9 | // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */
10 | // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */
11 | // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */
12 | // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */
13 | // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */
14 |
15 | /* Language and Environment */
16 | "target": "ES2021", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
17 | "lib": ["ESNext"], /* Specify a set of bundled library declaration files that describe the target runtime environment. */
18 | // "jsx": "preserve", /* Specify what JSX code is generated. */
19 | // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */
20 | // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */
21 | // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */
22 | // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
23 | // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */
24 | // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */
25 | // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */
26 | // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */
27 | // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */
28 |
29 | /* Modules */
30 | "module": "ESNext", /* Specify what module code is generated. */
31 | // "rootDir": "./src", /* Specify the root folder within your source files. */
32 | "moduleResolution": "bundler", /* Specify how TypeScript looks up a file from a given module specifier. */
33 | // "baseUrl": "./src", /* Specify the base directory to resolve non-relative module names. */
34 | // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */
35 | // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */
36 | // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */
37 | // "types": ["bun-types"], /* Specify type package names to be included without being referenced in a source file. */
38 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
39 | // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */
40 | // "resolveJsonModule": true, /* Enable importing .json files. */
41 | // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */
42 |
43 | /* JavaScript Support */
44 | // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */
45 | // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */
46 | // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */
47 |
48 | /* Emit */
49 | "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
50 | // "declarationMap": true, /* Create sourcemaps for d.ts files. */
51 | // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */
52 | // "sourceMap": true, /* Create source map files for emitted JavaScript files. */
53 | // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */
54 | // "outDir": "./dist", /* Specify an output folder for all emitted files. */
55 | // "removeComments": true, /* Disable emitting comments. */
56 | "noEmit": true, /* Disable emitting files from a compilation. */
57 | // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
58 | // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */
59 | // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
60 | // r"sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */
61 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
62 | // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */
63 | // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */
64 | // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
65 | // "newLine": "crlf", /* Set the newline character for emitting files. */
66 | // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */
67 | // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */
68 | // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */
69 | // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */
70 | // "declarationDir": "./", /* Specify the output directory for generated declaration files. */
71 | // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */
72 |
73 | /* Interop Constraints */
74 | // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */
75 | "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */
76 | "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */
77 | // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
78 | "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */
79 |
80 | /* Type Checking */
81 | "strict": true, /* Enable all strict type-checking options. */
82 | // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */
83 | // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */
84 | // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
85 | // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */
86 | // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */
87 | // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */
88 | // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */
89 | // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */
90 | // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */
91 | // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */
92 | // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */
93 | // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */
94 | // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */
95 | // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */
96 | // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */
97 | // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */
98 | // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */
99 | // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */
100 |
101 | /* Completeness */
102 | // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
103 | "skipLibCheck": true, /* Skip type checking all .d.ts files. */
104 | },
105 | "exclude": ["node_modules"]
106 | // "include": ["src/**/*"]
107 | }
108 |
--------------------------------------------------------------------------------
/src/index.ts:
--------------------------------------------------------------------------------
1 | import { Elysia, NotFoundError } from 'elysia'
2 |
3 | import type { Stats } from 'fs'
4 |
5 | import fastDecodeURI from 'fast-decode-uri-component'
6 |
7 | import {
8 | LRUCache,
9 | fileExists,
10 | getBuiltinModule,
11 | listFiles,
12 | generateETag,
13 | isCached,
14 | getFile,
15 | isBun,
16 | listHTMLFiles,
17 | isNotEmpty
18 | } from './utils'
19 | import type { StaticOptions } from './types'
20 |
21 | export async function staticPlugin({
22 | assets = 'public',
23 | prefix = '/public' as Prefix,
24 | staticLimit = 1024,
25 | alwaysStatic = process.env.NODE_ENV === 'production',
26 | ignorePatterns = ['.DS_Store', '.git', '.env'],
27 | headers: initialHeaders,
28 | maxAge = 86400,
29 | directive = 'public',
30 | etag: useETag = true,
31 | extension = true,
32 | indexHTML = true,
33 | decodeURI,
34 | silent
35 | }: StaticOptions = {}): Promise {
36 | if (
37 | typeof process === 'undefined' ||
38 | typeof process.getBuiltinModule === 'undefined'
39 | ) {
40 | if (!silent)
41 | console.warn(
42 | '[@elysiajs/static] require process.getBuiltinModule. Static plugin is disabled'
43 | )
44 |
45 | return new Elysia()
46 | }
47 |
48 | const builtinModule = getBuiltinModule()
49 | if (!builtinModule) return new Elysia()
50 |
51 | const [fs, path] = builtinModule
52 | const isUnsafeSep = path.sep !== '/'
53 |
54 | const normalizePath = isUnsafeSep
55 | ? (p: string) => p.replace(/\\/g, '/')
56 | : (p: string) => p
57 |
58 | const fileCache = new LRUCache()
59 |
60 | if (prefix === path.sep) prefix = '' as Prefix
61 | const assetsDir = path.resolve(assets)
62 | const shouldIgnore = !ignorePatterns.length
63 | ? () => false
64 | : (file: string) =>
65 | ignorePatterns.find((pattern) =>
66 | typeof pattern === 'string'
67 | ? pattern.includes(file)
68 | : pattern.test(file)
69 | )
70 |
71 | const app = new Elysia({
72 | name: 'static',
73 | seed: prefix
74 | })
75 |
76 | if (alwaysStatic) {
77 | const files = await listFiles(path.resolve(assets))
78 |
79 | if (files.length <= staticLimit)
80 | for (const absolutePath of files) {
81 | if (!absolutePath || shouldIgnore(absolutePath)) continue
82 |
83 | let relativePath = absolutePath.replace(assetsDir, '')
84 | if (decodeURI)
85 | relativePath = fastDecodeURI(relativePath) ?? relativePath
86 |
87 | let pathName = normalizePath(path.join(prefix, relativePath))
88 |
89 | if (isBun && absolutePath.endsWith('.html')) {
90 | const htmlBundle = await import(absolutePath)
91 |
92 | app.get(pathName, htmlBundle.default)
93 | if (indexHTML && pathName.endsWith('/index.html'))
94 | app.get(
95 | pathName.replace('/index.html', ''),
96 | htmlBundle.default
97 | )
98 |
99 | continue
100 | }
101 |
102 | if (!extension)
103 | pathName = normalizePath(
104 | pathName.slice(0, pathName.lastIndexOf('.'))
105 | )
106 |
107 | const file: Awaited> = isBun
108 | ? getFile(absolutePath)
109 | : ((await getFile(absolutePath)) as any)
110 |
111 | if (!file) {
112 | if (!silent)
113 | console.warn(
114 | `[@elysiajs/static] Failed to load file: ${absolutePath}`
115 | )
116 |
117 | return new Elysia()
118 | }
119 |
120 | const etag = await generateETag(file)
121 |
122 | function handleCache({
123 | headers: requestHeaders
124 | }: {
125 | headers: Record
126 | }) {
127 | if (etag) {
128 | let cached = isCached(
129 | requestHeaders as any,
130 | etag,
131 | absolutePath
132 | )
133 |
134 | if (cached === true)
135 | return new Response(null, {
136 | status: 304,
137 | headers: isNotEmpty(initialHeaders)
138 | ? initialHeaders
139 | : undefined
140 | })
141 | else if (cached !== false) {
142 | const cache = fileCache.get(pathName)
143 | if (cache) return cache.clone()
144 |
145 | return cached.then((cached) => {
146 | if (cached)
147 | return new Response(null, {
148 | status: 304,
149 | headers: initialHeaders
150 | ? initialHeaders
151 | : undefined
152 | })
153 |
154 | const response = new Response(file, {
155 | headers: Object.assign(
156 | {
157 | 'Cache-Control': maxAge
158 | ? `${directive}, max-age=${maxAge}`
159 | : directive
160 | },
161 | initialHeaders,
162 | etag ? { Etag: etag } : {}
163 | )
164 | })
165 | fileCache.set(prefix, response)
166 |
167 | return response.clone()
168 | })
169 | }
170 | }
171 |
172 | const cache = fileCache.get(pathName)
173 | if (cache) return cache.clone()
174 |
175 | const response = new Response(file, {
176 | headers: Object.assign(
177 | {
178 | 'Cache-Control': maxAge
179 | ? `${directive}, max-age=${maxAge}`
180 | : directive
181 | },
182 | initialHeaders,
183 | etag ? { Etag: etag } : {}
184 | )
185 | })
186 |
187 | fileCache.set(pathName, response)
188 |
189 | return response.clone()
190 | }
191 | app.get(
192 | pathName,
193 | useETag
194 | ? (handleCache as any)
195 | : new Response(
196 | file,
197 | isNotEmpty(initialHeaders)
198 | ? {
199 | headers: initialHeaders
200 | }
201 | : undefined
202 | )
203 | )
204 |
205 | if (indexHTML && pathName.endsWith('/index.html'))
206 | app.get(
207 | pathName.replace('/index.html', ''),
208 | useETag
209 | ? (handleCache as any)
210 | : new Response(
211 | file,
212 | isNotEmpty(initialHeaders)
213 | ? {
214 | headers: initialHeaders
215 | }
216 | : undefined
217 | )
218 | )
219 | }
220 |
221 | return app
222 | }
223 |
224 | if (
225 | // @ts-ignore private property
226 | !(`GET_${prefix}/*` in app.routeTree)
227 | ) {
228 | if (isBun) {
229 | const htmls = await listHTMLFiles(path.resolve(assets))
230 |
231 | for (const absolutePath of htmls) {
232 | if (!absolutePath || shouldIgnore(absolutePath)) continue
233 |
234 | let relativePath = absolutePath.replace(assetsDir, '')
235 | const pathName = normalizePath(path.join(prefix, relativePath))
236 | const htmlBundle = await import(absolutePath)
237 |
238 | app.get(pathName, htmlBundle.default)
239 | if (indexHTML && pathName.endsWith('/index.html'))
240 | app.get(
241 | pathName.replace('/index.html', ''),
242 | htmlBundle.default
243 | )
244 | }
245 | }
246 |
247 | app.onError(() => {}).get(
248 | `${prefix.endsWith('/') ? prefix.slice(0, -1) : prefix}/*`,
249 | async ({ params, headers: requestHeaders }) => {
250 | const pathName = normalizePath(
251 | path.join(
252 | assets,
253 | decodeURI
254 | ? (fastDecodeURI(params['*']) ?? params['*'])
255 | : params['*']
256 | )
257 | )
258 |
259 | if (shouldIgnore(pathName)) throw new NotFoundError()
260 |
261 | const cache = fileCache.get(pathName)
262 | if (cache) return cache.clone()
263 |
264 | try {
265 | const fileStat = await fs.stat(pathName).catch(() => null)
266 | if (!fileStat) throw new NotFoundError()
267 |
268 | if (!indexHTML && fileStat.isDirectory())
269 | throw new NotFoundError()
270 |
271 | // @ts-ignore
272 | let file:
273 | | NonNullable>>
274 | | undefined
275 |
276 | if (!isBun && indexHTML) {
277 | const htmlPath = path.join(pathName, 'index.html')
278 | const cache = fileCache.get(htmlPath)
279 | if (cache) return cache.clone()
280 |
281 | if (await fileExists(htmlPath))
282 | file = await getFile(htmlPath)
283 | }
284 |
285 | if (
286 | !file &&
287 | !fileStat.isDirectory() &&
288 | (await fileExists(pathName))
289 | )
290 | file = await getFile(pathName)
291 | else throw new NotFoundError()
292 |
293 | if (!useETag)
294 | return new Response(
295 | file,
296 | isNotEmpty(initialHeaders)
297 | ? { headers: initialHeaders }
298 | : undefined
299 | )
300 |
301 | const etag = await generateETag(file)
302 | if (
303 | etag &&
304 | (await isCached(requestHeaders, etag, pathName))
305 | )
306 | return new Response(null, {
307 | status: 304
308 | })
309 |
310 | const response = new Response(file, {
311 | headers: Object.assign(
312 | {
313 | 'Cache-Control': maxAge
314 | ? `${directive}, max-age=${maxAge}`
315 | : directive
316 | },
317 | initialHeaders,
318 | etag ? { Etag: etag } : {}
319 | )
320 | })
321 |
322 | fileCache.set(pathName, response)
323 |
324 | return response.clone()
325 | } catch (error) {
326 | if (error instanceof NotFoundError) throw error
327 | if (!silent) console.error(`[@elysiajs/static]`, error)
328 |
329 | throw new NotFoundError()
330 | }
331 | }
332 | )
333 | }
334 |
335 | return app
336 | }
337 |
338 | export default staticPlugin
339 |
--------------------------------------------------------------------------------
/test/index.test.ts:
--------------------------------------------------------------------------------
1 | import { Elysia } from 'elysia'
2 | import { staticPlugin } from '../src'
3 |
4 | import { describe, expect, it } from 'bun:test'
5 | import { join, sep } from 'path'
6 |
7 | import { req, takodachi } from './utils'
8 |
9 | describe('Static Plugin', () => {
10 | it('should get root path', async () => {
11 | const app = new Elysia().use(staticPlugin())
12 |
13 | await app.modules
14 |
15 | const res = await app
16 | .handle(req('/public/takodachi.png'))
17 | .then((r) => r.blob())
18 | .then((r) => r.text())
19 |
20 | expect(res).toBe(takodachi)
21 | })
22 |
23 | it('should get nested path', async () => {
24 | const app = new Elysia().use(staticPlugin())
25 |
26 | await app.modules
27 |
28 | const res = await app.handle(req('/public/nested/takodachi.png'))
29 | const blob = await res.blob()
30 | expect(await blob.text()).toBe(takodachi)
31 | })
32 |
33 | it('should get different path', async () => {
34 | const app = new Elysia().use(
35 | staticPlugin({
36 | assets: 'public-aliased'
37 | })
38 | )
39 |
40 | await app.modules
41 |
42 | const res = await app.handle(req('/public/tako.png'))
43 | const blob = await res.blob()
44 | expect(await blob.text()).toBe(takodachi)
45 | })
46 |
47 | it('should handle prefix', async () => {
48 | const app = new Elysia().use(
49 | staticPlugin({
50 | prefix: '/static'
51 | })
52 | )
53 |
54 | await app.modules
55 |
56 | const res = await app.handle(req('/static/takodachi.png'))
57 | const blob = await res.blob()
58 | expect(await blob.text()).toBe(takodachi)
59 | })
60 |
61 | it('should handle empty prefix', async () => {
62 | const app = new Elysia().use(
63 | staticPlugin({
64 | prefix: ''
65 | })
66 | )
67 |
68 | await app.modules
69 |
70 | const res = await app.handle(req('/takodachi.png'))
71 | const blob = await res.blob()
72 | expect(await blob.text()).toBe(takodachi)
73 | })
74 |
75 | it('should supports multiple public', async () => {
76 | const app = new Elysia()
77 | .use(
78 | staticPlugin({
79 | prefix: '/public-aliased',
80 | assets: 'public-aliased'
81 | })
82 | )
83 | .use(
84 | staticPlugin({
85 | prefix: '/public'
86 | })
87 | )
88 |
89 | await app.modules
90 |
91 | const res = await app.handle(req('/public/takodachi.png'))
92 |
93 | expect(res.status).toBe(200)
94 | })
95 |
96 | it('ignore string pattern', async () => {
97 | const app = new Elysia().use(
98 | staticPlugin({
99 | ignorePatterns: [`public${sep}takodachi.png`]
100 | })
101 | )
102 |
103 | await app.modules
104 |
105 | const res = await app.handle(req('/public/takodachi.png'))
106 | expect(res.status).toBe(404)
107 | })
108 |
109 | it('ignore regex pattern', async () => {
110 | const app = new Elysia().use(
111 | staticPlugin({
112 | ignorePatterns: [/takodachi.png$/]
113 | })
114 | )
115 |
116 | const file = await app.handle(req('/public/takodachi.png'))
117 |
118 | expect(file.status).toBe(404)
119 | })
120 |
121 | it('always static', async () => {
122 | const app = new Elysia().use(
123 | staticPlugin({
124 | alwaysStatic: true
125 | })
126 | )
127 |
128 | await app.modules
129 |
130 | const res = await app
131 | .handle(req('/public/takodachi.png'))
132 | .then((r) => r.blob())
133 | .then((r) => r.text())
134 |
135 | expect(res).toBe(takodachi)
136 | })
137 |
138 | it('always static with assets on an absolute path', async () => {
139 | const app = new Elysia().use(
140 | staticPlugin({
141 | alwaysStatic: true,
142 | assets: join(import.meta.dir, '../public')
143 | })
144 | )
145 |
146 | await app.modules
147 |
148 | const res = await app.handle(req('/public/takodachi.png'))
149 | const blob = await res.blob()
150 | expect(await blob.text()).toBe(takodachi)
151 | })
152 |
153 | it('exclude extension', async () => {
154 | const app = new Elysia().use(
155 | staticPlugin({
156 | alwaysStatic: true,
157 | extension: false
158 | })
159 | )
160 |
161 | await app.modules
162 |
163 | const res = await app
164 | .handle(req('/public/takodachi'))
165 | .then((r) => r.blob())
166 | .then((r) => r.text())
167 |
168 | expect(res).toBe(takodachi)
169 | })
170 |
171 | it('return custom headers', async () => {
172 | const app = new Elysia().use(
173 | staticPlugin({
174 | alwaysStatic: true,
175 | extension: false,
176 | headers: {
177 | 'x-powered-by': 'Takodachi'
178 | }
179 | })
180 | )
181 |
182 | await app.modules
183 |
184 | const res = await app.handle(req('/public/takodachi'))
185 |
186 | expect(res.headers.get('x-powered-by')).toBe('Takodachi')
187 | expect(res.status).toBe(200)
188 | })
189 |
190 | it('call onError when using dynamic mode', async () => {
191 | let called = false
192 |
193 | const app = new Elysia()
194 | .onError(({ code }) => {
195 | if (code === 'NOT_FOUND') called = true
196 | })
197 | .use(
198 | staticPlugin({
199 | alwaysStatic: false
200 | })
201 | )
202 |
203 | await app.modules
204 |
205 | await app.handle(req('/public/not-found'))
206 |
207 | expect(called).toBe(true)
208 | })
209 |
210 | it('return etag header', async () => {
211 | const app = new Elysia().use(
212 | staticPlugin({
213 | alwaysStatic: true,
214 | extension: false
215 | })
216 | )
217 |
218 | await app.modules
219 |
220 | const res = await app.handle(req('/public/takodachi'))
221 |
222 | expect(res.headers.get('Etag')).toBe('ZGe9eXgawZBlMox8sZg82Q==')
223 | expect(res.status).toBe(200)
224 | })
225 |
226 | it('return no etag header when etag is false', async () => {
227 | const app = new Elysia().use(
228 | staticPlugin({
229 | alwaysStatic: true,
230 | extension: false,
231 | etag: false
232 | })
233 | )
234 |
235 | await app.modules
236 |
237 | const res = await app.handle(req('/public/takodachi'))
238 |
239 | expect(res.headers.get('Etag')).toBe(null)
240 | expect(res.status).toBe(200)
241 | })
242 |
243 | it('return Cache-Control header when maxAge is set', async () => {
244 | const app = new Elysia().use(
245 | staticPlugin({
246 | alwaysStatic: true,
247 | extension: false,
248 | maxAge: 3600
249 | })
250 | )
251 |
252 | await app.modules
253 |
254 | const res = await app.handle(req('/public/takodachi'))
255 |
256 | expect(res.headers.get('Cache-Control')).toBe('public, max-age=3600')
257 | expect(res.status).toBe(200)
258 | })
259 |
260 | it('return Cache-Control header when maxAge is not set', async () => {
261 | const app = new Elysia().use(
262 | staticPlugin({
263 | alwaysStatic: true,
264 | extension: false
265 | })
266 | )
267 |
268 | await app.modules
269 |
270 | const res = await app.handle(req('/public/takodachi'))
271 |
272 | expect(res.headers.get('Cache-Control')).toBe('public, max-age=86400')
273 | expect(res.status).toBe(200)
274 | })
275 |
276 | it('skip Cache-Control header when maxAge is null', async () => {
277 | const app = new Elysia().use(
278 | staticPlugin({
279 | maxAge: null
280 | })
281 | )
282 |
283 | await app.modules
284 |
285 | const res = await app.handle(req('/public/takodachi.png'))
286 |
287 | expect(res.headers.get('Cache-Control')).toBe('public')
288 | expect(res.status).toBe(200)
289 | })
290 |
291 | it('set cache directive', async () => {
292 | const app = new Elysia().use(
293 | staticPlugin({
294 | directive: 'private'
295 | })
296 | )
297 |
298 | await app.modules
299 |
300 | const res = await app.handle(req('/public/takodachi.png'))
301 |
302 | expect(res.headers.get('Cache-Control')).toBe('private, max-age=86400')
303 | expect(res.status).toBe(200)
304 | })
305 |
306 | it('return not modified response (etag)', async () => {
307 | const app = new Elysia().use(
308 | staticPlugin({
309 | alwaysStatic: true,
310 | extension: false
311 | })
312 | )
313 |
314 | await app.modules
315 |
316 | const request = req('/public/takodachi')
317 | request.headers.append('If-None-Match', 'ZGe9eXgawZBlMox8sZg82Q==')
318 |
319 | const res = await app.handle(request)
320 |
321 | expect(res.body).toBe(null)
322 | expect(res.status).toBe(304)
323 | })
324 |
325 | it('return not modified response (time)', async () => {
326 | const app = new Elysia().use(
327 | staticPlugin({
328 | alwaysStatic: true,
329 | extension: false
330 | })
331 | )
332 |
333 | await app.modules
334 |
335 | const tomorrow = new Date()
336 | tomorrow.setDate(tomorrow.getDate() + 1)
337 |
338 | const request = req('/public/takodachi')
339 | request.headers.append('If-Modified-Since', tomorrow.toString())
340 |
341 | const res = await app.handle(request)
342 |
343 | expect(res.body).toBe(null)
344 | expect(res.status).toBe(304)
345 | })
346 |
347 | it('return ok response when etag is false', async () => {
348 | const app = new Elysia().use(
349 | staticPlugin({
350 | alwaysStatic: true,
351 | extension: false,
352 | etag: false
353 | })
354 | )
355 |
356 | await app.modules
357 |
358 | const tomorrow = new Date()
359 | tomorrow.setDate(tomorrow.getDate() + 1)
360 |
361 | const request = req('/public/takodachi')
362 | request.headers.append('If-None-Match', 'ZGe9eXgawZBlMox8sZg82Q==')
363 | request.headers.append('If-Modified-Since', tomorrow.toString())
364 |
365 | const res = await app.handle(request)
366 |
367 | expect(res.status).toBe(200)
368 | })
369 |
370 | it('should 404 when navigate to folder', async () => {
371 | const app = new Elysia().use(staticPlugin())
372 |
373 | await app.modules
374 |
375 | const notFoundPaths = [
376 | '/public',
377 | '/public/',
378 | '/public/nested',
379 | '/public/nested/'
380 | ]
381 |
382 | for (const path of notFoundPaths) {
383 | const res = await app.handle(req(path))
384 |
385 | expect(res.status).toBe(404)
386 | }
387 | })
388 |
389 | it('serve index.html to default /', async () => {
390 | const app = new Elysia().use(staticPlugin())
391 | await app.modules
392 |
393 | let res = await app.handle(req('/public'))
394 | expect(res.status).toBe(404)
395 |
396 | res = await app.handle(req('/public/html'))
397 | expect(res.status).toBe(200)
398 | })
399 |
400 | it('does not serve index.html to default / when not indexHTML', async () => {
401 | const app = new Elysia().use(
402 | staticPlugin({
403 | indexHTML: false
404 | })
405 | )
406 | await app.modules
407 |
408 | let res = await app.handle(req('/public'))
409 | expect(res.status).toBe(404)
410 |
411 | res = await app.handle(req('/public/html'))
412 | expect(res.status).toBe(404)
413 | })
414 |
415 | it('serves index.html to default / when alwaysStatic', async () => {
416 | const app = new Elysia().use(
417 | staticPlugin({
418 | alwaysStatic: true
419 | })
420 | )
421 | await app.modules
422 |
423 | let res = await app.handle(req('/public'))
424 | expect(res.status).toBe(404)
425 |
426 | res = await app.handle(req('/public/html'))
427 | expect(res.status).toBe(200)
428 | })
429 |
430 | it('does not serve index.html to default / when alwaysStatic and not indexHTML', async () => {
431 | const app = new Elysia().use(
432 | staticPlugin({
433 | alwaysStatic: true,
434 | indexHTML: false
435 | })
436 | )
437 | await app.modules
438 |
439 | let res = await app.handle(req('/public'))
440 | expect(res.status).toBe(404)
441 |
442 | res = await app.handle(req('/public/html'))
443 | expect(res.status).toBe(404)
444 | })
445 | })
446 |
--------------------------------------------------------------------------------
/bun.lock:
--------------------------------------------------------------------------------
1 | {
2 | "lockfileVersion": 1,
3 | "workspaces": {
4 | "": {
5 | "name": "@elysiajs/static",
6 | "devDependencies": {
7 | "@types/bun": "^1.3.0",
8 | "@types/fast-decode-uri-component": "^1.0.0",
9 | "@types/node": "^24",
10 | "@typescript-eslint/eslint-plugin": "^6.7.4",
11 | "elysia": "^1.4.11",
12 | "esbuild-fix-imports-plugin": "^1.0.22",
13 | "esbuild-plugin-file-path-extensions": "^2.1.4",
14 | "eslint": "9.6.0",
15 | "fast-decode-uri-component": "^1.0.1",
16 | "tsup": "^8.1.0",
17 | "typescript": "^5.5.3",
18 | },
19 | "peerDependencies": {
20 | "elysia": ">= 1.4.0",
21 | },
22 | },
23 | },
24 | "packages": {
25 | "@borewit/text-codec": ["@borewit/text-codec@0.1.1", "", {}, "sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA=="],
26 |
27 | "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.9", "", { "os": "aix", "cpu": "ppc64" }, "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA=="],
28 |
29 | "@esbuild/android-arm": ["@esbuild/android-arm@0.25.9", "", { "os": "android", "cpu": "arm" }, "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ=="],
30 |
31 | "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.9", "", { "os": "android", "cpu": "arm64" }, "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg=="],
32 |
33 | "@esbuild/android-x64": ["@esbuild/android-x64@0.25.9", "", { "os": "android", "cpu": "x64" }, "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw=="],
34 |
35 | "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.9", "", { "os": "darwin", "cpu": "arm64" }, "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg=="],
36 |
37 | "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.9", "", { "os": "darwin", "cpu": "x64" }, "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ=="],
38 |
39 | "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.9", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q=="],
40 |
41 | "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.9", "", { "os": "freebsd", "cpu": "x64" }, "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg=="],
42 |
43 | "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.9", "", { "os": "linux", "cpu": "arm" }, "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw=="],
44 |
45 | "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw=="],
46 |
47 | "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.9", "", { "os": "linux", "cpu": "ia32" }, "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A=="],
48 |
49 | "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.9", "", { "os": "linux", "cpu": "none" }, "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ=="],
50 |
51 | "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.9", "", { "os": "linux", "cpu": "none" }, "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA=="],
52 |
53 | "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.9", "", { "os": "linux", "cpu": "ppc64" }, "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w=="],
54 |
55 | "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.9", "", { "os": "linux", "cpu": "none" }, "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg=="],
56 |
57 | "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.9", "", { "os": "linux", "cpu": "s390x" }, "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA=="],
58 |
59 | "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.9", "", { "os": "linux", "cpu": "x64" }, "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg=="],
60 |
61 | "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.9", "", { "os": "none", "cpu": "arm64" }, "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q=="],
62 |
63 | "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.9", "", { "os": "none", "cpu": "x64" }, "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g=="],
64 |
65 | "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.9", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ=="],
66 |
67 | "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.9", "", { "os": "openbsd", "cpu": "x64" }, "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA=="],
68 |
69 | "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.9", "", { "os": "none", "cpu": "arm64" }, "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg=="],
70 |
71 | "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.9", "", { "os": "sunos", "cpu": "x64" }, "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw=="],
72 |
73 | "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.9", "", { "os": "win32", "cpu": "arm64" }, "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ=="],
74 |
75 | "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.9", "", { "os": "win32", "cpu": "ia32" }, "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww=="],
76 |
77 | "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.9", "", { "os": "win32", "cpu": "x64" }, "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ=="],
78 |
79 | "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g=="],
80 |
81 | "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="],
82 |
83 | "@eslint/config-array": ["@eslint/config-array@0.17.1", "", { "dependencies": { "@eslint/object-schema": "^2.1.4", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA=="],
84 |
85 | "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="],
86 |
87 | "@eslint/js": ["@eslint/js@9.6.0", "", {}, "sha512-D9B0/3vNg44ZeWbYMpBoXqNP4j6eQD5vNwIlGAuFRRzK/WtT/jvDQW3Bi9kkf3PMDMlM7Yi+73VLUsn5bJcl8A=="],
88 |
89 | "@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="],
90 |
91 | "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="],
92 |
93 | "@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="],
94 |
95 | "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="],
96 |
97 | "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="],
98 |
99 | "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
100 |
101 | "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="],
102 |
103 | "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],
104 |
105 | "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="],
106 |
107 | "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="],
108 |
109 | "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="],
110 |
111 | "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="],
112 |
113 | "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.50.1", "", { "os": "android", "cpu": "arm" }, "sha512-HJXwzoZN4eYTdD8bVV22DN8gsPCAj3V20NHKOs8ezfXanGpmVPR7kalUHd+Y31IJp9stdB87VKPFbsGY3H/2ag=="],
114 |
115 | "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.50.1", "", { "os": "android", "cpu": "arm64" }, "sha512-PZlsJVcjHfcH53mOImyt3bc97Ep3FJDXRpk9sMdGX0qgLmY0EIWxCag6EigerGhLVuL8lDVYNnSo8qnTElO4xw=="],
116 |
117 | "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.50.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-xc6i2AuWh++oGi4ylOFPmzJOEeAa2lJeGUGb4MudOtgfyyjr4UPNK+eEWTPLvmPJIY/pgw6ssFIox23SyrkkJw=="],
118 |
119 | "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.50.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-2ofU89lEpDYhdLAbRdeyz/kX3Y2lpYc6ShRnDjY35bZhd2ipuDMDi6ZTQ9NIag94K28nFMofdnKeHR7BT0CATw=="],
120 |
121 | "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.50.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-wOsE6H2u6PxsHY/BeFHA4VGQN3KUJFZp7QJBmDYI983fgxq5Th8FDkVuERb2l9vDMs1D5XhOrhBrnqcEY6l8ZA=="],
122 |
123 | "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.50.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-A/xeqaHTlKbQggxCqispFAcNjycpUEHP52mwMQZUNqDUJFFYtPHCXS1VAG29uMlDzIVr+i00tSFWFLivMcoIBQ=="],
124 |
125 | "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.50.1", "", { "os": "linux", "cpu": "arm" }, "sha512-54v4okehwl5TaSIkpp97rAHGp7t3ghinRd/vyC1iXqXMfjYUTm7TfYmCzXDoHUPTTf36L8pr0E7YsD3CfB3ZDg=="],
126 |
127 | "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.50.1", "", { "os": "linux", "cpu": "arm" }, "sha512-p/LaFyajPN/0PUHjv8TNyxLiA7RwmDoVY3flXHPSzqrGcIp/c2FjwPPP5++u87DGHtw+5kSH5bCJz0mvXngYxw=="],
128 |
129 | "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.50.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-2AbMhFFkTo6Ptna1zO7kAXXDLi7H9fGTbVaIq2AAYO7yzcAsuTNWPHhb2aTA6GPiP+JXh85Y8CiS54iZoj4opw=="],
130 |
131 | "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.50.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-Cgef+5aZwuvesQNw9eX7g19FfKX5/pQRIyhoXLCiBOrWopjo7ycfB292TX9MDcDijiuIJlx1IzJz3IoCPfqs9w=="],
132 |
133 | "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.50.1", "", { "os": "linux", "cpu": "none" }, "sha512-RPhTwWMzpYYrHrJAS7CmpdtHNKtt2Ueo+BlLBjfZEhYBhK00OsEqM08/7f+eohiF6poe0YRDDd8nAvwtE/Y62Q=="],
134 |
135 | "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.50.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q=="],
136 |
137 | "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.50.1", "", { "os": "linux", "cpu": "none" }, "sha512-S208ojx8a4ciIPrLgazF6AgdcNJzQE4+S9rsmOmDJkusvctii+ZvEuIC4v/xFqzbuP8yDjn73oBlNDgF6YGSXQ=="],
138 |
139 | "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.50.1", "", { "os": "linux", "cpu": "none" }, "sha512-3Ag8Ls1ggqkGUvSZWYcdgFwriy2lWo+0QlYgEFra/5JGtAd6C5Hw59oojx1DeqcA2Wds2ayRgvJ4qxVTzCHgzg=="],
140 |
141 | "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.50.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-t9YrKfaxCYe7l7ldFERE1BRg/4TATxIg+YieHQ966jwvo7ddHJxPj9cNFWLAzhkVsbBvNA4qTbPVNsZKBO4NSg=="],
142 |
143 | "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.50.1", "", { "os": "linux", "cpu": "x64" }, "sha512-MCgtFB2+SVNuQmmjHf+wfI4CMxy3Tk8XjA5Z//A0AKD7QXUYFMQcns91K6dEHBvZPCnhJSyDWLApk40Iq/H3tA=="],
144 |
145 | "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.50.1", "", { "os": "linux", "cpu": "x64" }, "sha512-nEvqG+0jeRmqaUMuwzlfMKwcIVffy/9KGbAGyoa26iu6eSngAYQ512bMXuqqPrlTyfqdlB9FVINs93j534UJrg=="],
146 |
147 | "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.50.1", "", { "os": "none", "cpu": "arm64" }, "sha512-RDsLm+phmT3MJd9SNxA9MNuEAO/J2fhW8GXk62G/B4G7sLVumNFbRwDL6v5NrESb48k+QMqdGbHgEtfU0LCpbA=="],
148 |
149 | "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.50.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-hpZB/TImk2FlAFAIsoElM3tLzq57uxnGYwplg6WDyAxbYczSi8O2eQ+H2Lx74504rwKtZ3N2g4bCUkiamzS6TQ=="],
150 |
151 | "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.50.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-SXjv8JlbzKM0fTJidX4eVsH+Wmnp0/WcD8gJxIZyR6Gay5Qcsmdbi9zVtnbkGPG8v2vMR1AD06lGWy5FLMcG7A=="],
152 |
153 | "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.50.1", "", { "os": "win32", "cpu": "x64" }, "sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA=="],
154 |
155 | "@sinclair/typebox": ["@sinclair/typebox@0.34.41", "", {}, "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g=="],
156 |
157 | "@tokenizer/inflate": ["@tokenizer/inflate@0.2.7", "", { "dependencies": { "debug": "^4.4.0", "fflate": "^0.8.2", "token-types": "^6.0.0" } }, "sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg=="],
158 |
159 | "@tokenizer/token": ["@tokenizer/token@0.3.0", "", {}, "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="],
160 |
161 | "@types/bun": ["@types/bun@1.3.0", "", { "dependencies": { "bun-types": "1.3.0" } }, "sha512-+lAGCYjXjip2qY375xX/scJeVRmZ5cY0wyHYyCYxNcdEXrQ4AOe3gACgd4iQ8ksOslJtW4VNxBJ8llUwc3a6AA=="],
162 |
163 | "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="],
164 |
165 | "@types/fast-decode-uri-component": ["@types/fast-decode-uri-component@1.0.0", "", {}, "sha512-xhTFpMookjiVEDxI8RBUOxZL8BQiI2+YZZoqzW/G6s3r1h60gDzGnmKP83LNuTmCqk8ZmbY5cYkByKu4t+rKhA=="],
166 |
167 | "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="],
168 |
169 | "@types/node": ["@types/node@24.7.2", "", { "dependencies": { "undici-types": "~7.14.0" } }, "sha512-/NbVmcGTP+lj5oa4yiYxxeBjRivKQ5Ns1eSZeB99ExsEQ6rX5XYU1Zy/gGxY/ilqtD4Etx9mKyrPxZRetiahhA=="],
170 |
171 | "@types/react": ["@types/react@19.2.2", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA=="],
172 |
173 | "@types/semver": ["@types/semver@7.7.1", "", {}, "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA=="],
174 |
175 | "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@6.21.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.5.1", "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/type-utils": "6.21.0", "@typescript-eslint/utils": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", "natural-compare": "^1.4.0", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA=="],
176 |
177 | "@typescript-eslint/parser": ["@typescript-eslint/parser@6.21.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", "@typescript-eslint/typescript-estree": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ=="],
178 |
179 | "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" } }, "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg=="],
180 |
181 | "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@6.21.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "6.21.0", "@typescript-eslint/utils": "6.21.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag=="],
182 |
183 | "@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="],
184 |
185 | "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="],
186 |
187 | "@typescript-eslint/utils": ["@typescript-eslint/utils@6.21.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", "@typescript-eslint/typescript-estree": "6.21.0", "semver": "^7.5.4" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ=="],
188 |
189 | "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A=="],
190 |
191 | "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="],
192 |
193 | "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="],
194 |
195 | "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="],
196 |
197 | "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
198 |
199 | "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
200 |
201 | "any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="],
202 |
203 | "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
204 |
205 | "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="],
206 |
207 | "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
208 |
209 | "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="],
210 |
211 | "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
212 |
213 | "bun-types": ["bun-types@1.3.0", "", { "dependencies": { "@types/node": "*" }, "peerDependencies": { "@types/react": "^19" } }, "sha512-u8X0thhx+yJ0KmkxuEo9HAtdfgCBaM/aI9K90VQcQioAmkVp3SG3FkwWGibUFz3WdXAdcsqOcbU40lK7tbHdkQ=="],
214 |
215 | "bundle-require": ["bundle-require@5.1.0", "", { "dependencies": { "load-tsconfig": "^0.2.3" }, "peerDependencies": { "esbuild": ">=0.18" } }, "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA=="],
216 |
217 | "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="],
218 |
219 | "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="],
220 |
221 | "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
222 |
223 | "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="],
224 |
225 | "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
226 |
227 | "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
228 |
229 | "commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="],
230 |
231 | "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="],
232 |
233 | "confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="],
234 |
235 | "consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="],
236 |
237 | "cookie": ["cookie@1.0.2", "", {}, "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA=="],
238 |
239 | "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
240 |
241 | "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="],
242 |
243 | "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="],
244 |
245 | "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="],
246 |
247 | "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="],
248 |
249 | "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="],
250 |
251 | "elysia": ["elysia@1.4.11", "", { "dependencies": { "cookie": "^1.0.2", "exact-mirror": "0.2.2", "fast-decode-uri-component": "^1.0.1" }, "peerDependencies": { "@sinclair/typebox": ">= 0.34.0 < 1", "file-type": ">= 20.0.0", "openapi-types": ">= 12.0.0", "typescript": ">= 5.0.0" }, "optionalPeers": ["typescript"] }, "sha512-cphuzQj0fRw1ICRvwHy2H3xQio9bycaZUVHnDHJQnKqBfMNlZ+Hzj6TMmt9lc0Az0mvbCnPXWVF7y1MCRhUuOA=="],
252 |
253 | "emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="],
254 |
255 | "esbuild": ["esbuild@0.25.9", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.9", "@esbuild/android-arm": "0.25.9", "@esbuild/android-arm64": "0.25.9", "@esbuild/android-x64": "0.25.9", "@esbuild/darwin-arm64": "0.25.9", "@esbuild/darwin-x64": "0.25.9", "@esbuild/freebsd-arm64": "0.25.9", "@esbuild/freebsd-x64": "0.25.9", "@esbuild/linux-arm": "0.25.9", "@esbuild/linux-arm64": "0.25.9", "@esbuild/linux-ia32": "0.25.9", "@esbuild/linux-loong64": "0.25.9", "@esbuild/linux-mips64el": "0.25.9", "@esbuild/linux-ppc64": "0.25.9", "@esbuild/linux-riscv64": "0.25.9", "@esbuild/linux-s390x": "0.25.9", "@esbuild/linux-x64": "0.25.9", "@esbuild/netbsd-arm64": "0.25.9", "@esbuild/netbsd-x64": "0.25.9", "@esbuild/openbsd-arm64": "0.25.9", "@esbuild/openbsd-x64": "0.25.9", "@esbuild/openharmony-arm64": "0.25.9", "@esbuild/sunos-x64": "0.25.9", "@esbuild/win32-arm64": "0.25.9", "@esbuild/win32-ia32": "0.25.9", "@esbuild/win32-x64": "0.25.9" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g=="],
256 |
257 | "esbuild-fix-imports-plugin": ["esbuild-fix-imports-plugin@1.0.22", "", {}, "sha512-8Q8FDsnZgDwa+dHu0/bpU6gOmNrxmqgsIG1s7p1xtv6CQccRKc3Ja8o09pLNwjFgkOWtmwjS0bZmSWN7ATgdJQ=="],
258 |
259 | "esbuild-plugin-file-path-extensions": ["esbuild-plugin-file-path-extensions@2.1.4", "", {}, "sha512-lNjylaAsJMprYg28zjUyBivP3y0ms9b7RJZ5tdhDUFLa3sCbqZw4wDnbFUSmnyZYWhCYDPxxp7KkXM2TXGw3PQ=="],
260 |
261 | "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="],
262 |
263 | "eslint": ["eslint@9.6.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/config-array": "^0.17.0", "@eslint/eslintrc": "^3.1.0", "@eslint/js": "9.6.0", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.0.1", "eslint-visitor-keys": "^4.0.0", "espree": "^10.1.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" } }, "sha512-ElQkdLMEEqQNM9Njff+2Y4q2afHk7JpkPvrd7Xh7xefwgQynqPxwf55J7di9+MEibWUGdNjFF9ITG9Pck5M84w=="],
264 |
265 | "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="],
266 |
267 | "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="],
268 |
269 | "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="],
270 |
271 | "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="],
272 |
273 | "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="],
274 |
275 | "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="],
276 |
277 | "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="],
278 |
279 | "exact-mirror": ["exact-mirror@0.2.2", "", { "peerDependencies": { "@sinclair/typebox": "^0.34.15" }, "optionalPeers": ["@sinclair/typebox"] }, "sha512-CrGe+4QzHZlnrXZVlo/WbUZ4qQZq8C0uATQVGVgXIrNXgHDBBNFD1VRfssRA2C9t3RYvh3MadZSdg2Wy7HBoQA=="],
280 |
281 | "fast-decode-uri-component": ["fast-decode-uri-component@1.0.1", "", {}, "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg=="],
282 |
283 | "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
284 |
285 | "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="],
286 |
287 | "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="],
288 |
289 | "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="],
290 |
291 | "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="],
292 |
293 | "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
294 |
295 | "fflate": ["fflate@0.8.2", "", {}, "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A=="],
296 |
297 | "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="],
298 |
299 | "file-type": ["file-type@21.0.0", "", { "dependencies": { "@tokenizer/inflate": "^0.2.7", "strtok3": "^10.2.2", "token-types": "^6.0.0", "uint8array-extras": "^1.4.0" } }, "sha512-ek5xNX2YBYlXhiUXui3D/BXa3LdqPmoLJ7rqEx2bKJ7EAUEfmXgW0Das7Dc6Nr9MvqaOnIqiPV0mZk/r/UpNAg=="],
300 |
301 | "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
302 |
303 | "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="],
304 |
305 | "fix-dts-default-cjs-exports": ["fix-dts-default-cjs-exports@1.0.1", "", { "dependencies": { "magic-string": "^0.30.17", "mlly": "^1.7.4", "rollup": "^4.34.8" } }, "sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg=="],
306 |
307 | "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="],
308 |
309 | "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="],
310 |
311 | "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="],
312 |
313 | "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
314 |
315 | "glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="],
316 |
317 | "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="],
318 |
319 | "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="],
320 |
321 | "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="],
322 |
323 | "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="],
324 |
325 | "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
326 |
327 | "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="],
328 |
329 | "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
330 |
331 | "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="],
332 |
333 | "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="],
334 |
335 | "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
336 |
337 | "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],
338 |
339 | "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="],
340 |
341 | "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
342 |
343 | "is-path-inside": ["is-path-inside@3.0.3", "", {}, "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ=="],
344 |
345 | "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
346 |
347 | "jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="],
348 |
349 | "joycon": ["joycon@3.1.1", "", {}, "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw=="],
350 |
351 | "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="],
352 |
353 | "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="],
354 |
355 | "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="],
356 |
357 | "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="],
358 |
359 | "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="],
360 |
361 | "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="],
362 |
363 | "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="],
364 |
365 | "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="],
366 |
367 | "load-tsconfig": ["load-tsconfig@0.2.5", "", {}, "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg=="],
368 |
369 | "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="],
370 |
371 | "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="],
372 |
373 | "lodash.sortby": ["lodash.sortby@4.7.0", "", {}, "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA=="],
374 |
375 | "lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
376 |
377 | "magic-string": ["magic-string@0.30.19", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw=="],
378 |
379 | "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="],
380 |
381 | "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="],
382 |
383 | "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="],
384 |
385 | "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="],
386 |
387 | "mlly": ["mlly@1.8.0", "", { "dependencies": { "acorn": "^8.15.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "ufo": "^1.6.1" } }, "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g=="],
388 |
389 | "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
390 |
391 | "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="],
392 |
393 | "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="],
394 |
395 | "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="],
396 |
397 | "openapi-types": ["openapi-types@12.1.3", "", {}, "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="],
398 |
399 | "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="],
400 |
401 | "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],
402 |
403 | "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="],
404 |
405 | "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="],
406 |
407 | "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="],
408 |
409 | "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="],
410 |
411 | "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
412 |
413 | "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="],
414 |
415 | "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="],
416 |
417 | "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="],
418 |
419 | "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
420 |
421 | "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="],
422 |
423 | "pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="],
424 |
425 | "pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="],
426 |
427 | "postcss-load-config": ["postcss-load-config@6.0.1", "", { "dependencies": { "lilconfig": "^3.1.1" }, "peerDependencies": { "jiti": ">=1.21.0", "postcss": ">=8.0.9", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["jiti", "postcss", "tsx", "yaml"] }, "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g=="],
428 |
429 | "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="],
430 |
431 | "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
432 |
433 | "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="],
434 |
435 | "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="],
436 |
437 | "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="],
438 |
439 | "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="],
440 |
441 | "rollup": ["rollup@4.50.1", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.50.1", "@rollup/rollup-android-arm64": "4.50.1", "@rollup/rollup-darwin-arm64": "4.50.1", "@rollup/rollup-darwin-x64": "4.50.1", "@rollup/rollup-freebsd-arm64": "4.50.1", "@rollup/rollup-freebsd-x64": "4.50.1", "@rollup/rollup-linux-arm-gnueabihf": "4.50.1", "@rollup/rollup-linux-arm-musleabihf": "4.50.1", "@rollup/rollup-linux-arm64-gnu": "4.50.1", "@rollup/rollup-linux-arm64-musl": "4.50.1", "@rollup/rollup-linux-loongarch64-gnu": "4.50.1", "@rollup/rollup-linux-ppc64-gnu": "4.50.1", "@rollup/rollup-linux-riscv64-gnu": "4.50.1", "@rollup/rollup-linux-riscv64-musl": "4.50.1", "@rollup/rollup-linux-s390x-gnu": "4.50.1", "@rollup/rollup-linux-x64-gnu": "4.50.1", "@rollup/rollup-linux-x64-musl": "4.50.1", "@rollup/rollup-openharmony-arm64": "4.50.1", "@rollup/rollup-win32-arm64-msvc": "4.50.1", "@rollup/rollup-win32-ia32-msvc": "4.50.1", "@rollup/rollup-win32-x64-msvc": "4.50.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-78E9voJHwnXQMiQdiqswVLZwJIzdBKJ1GdI5Zx6XwoFKUIk09/sSrr+05QFzvYb8q6Y9pPV45zzDuYa3907TZA=="],
442 |
443 | "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="],
444 |
445 | "semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="],
446 |
447 | "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
448 |
449 | "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
450 |
451 | "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
452 |
453 | "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="],
454 |
455 | "source-map": ["source-map@0.8.0-beta.0", "", { "dependencies": { "whatwg-url": "^7.0.0" } }, "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA=="],
456 |
457 | "string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="],
458 |
459 | "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
460 |
461 | "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
462 |
463 | "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
464 |
465 | "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="],
466 |
467 | "strtok3": ["strtok3@10.3.4", "", { "dependencies": { "@tokenizer/token": "^0.3.0" } }, "sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg=="],
468 |
469 | "sucrase": ["sucrase@3.35.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "glob": "^10.3.10", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA=="],
470 |
471 | "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
472 |
473 | "text-table": ["text-table@0.2.0", "", {}, "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="],
474 |
475 | "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="],
476 |
477 | "thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="],
478 |
479 | "tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="],
480 |
481 | "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="],
482 |
483 | "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
484 |
485 | "token-types": ["token-types@6.1.1", "", { "dependencies": { "@borewit/text-codec": "^0.1.0", "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" } }, "sha512-kh9LVIWH5CnL63Ipf0jhlBIy0UsrMj/NJDfpsy1SqOXlLKEVyXXYrnFxFT1yOOYVGBSApeVnjPw/sBz5BfEjAQ=="],
486 |
487 | "tr46": ["tr46@1.0.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA=="],
488 |
489 | "tree-kill": ["tree-kill@1.2.2", "", { "bin": { "tree-kill": "cli.js" } }, "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="],
490 |
491 | "ts-api-utils": ["ts-api-utils@1.4.3", "", { "peerDependencies": { "typescript": ">=4.2.0" } }, "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw=="],
492 |
493 | "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="],
494 |
495 | "tsup": ["tsup@8.5.0", "", { "dependencies": { "bundle-require": "^5.1.0", "cac": "^6.7.14", "chokidar": "^4.0.3", "consola": "^3.4.0", "debug": "^4.4.0", "esbuild": "^0.25.0", "fix-dts-default-cjs-exports": "^1.0.0", "joycon": "^3.1.1", "picocolors": "^1.1.1", "postcss-load-config": "^6.0.1", "resolve-from": "^5.0.0", "rollup": "^4.34.8", "source-map": "0.8.0-beta.0", "sucrase": "^3.35.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.11", "tree-kill": "^1.2.2" }, "peerDependencies": { "@microsoft/api-extractor": "^7.36.0", "@swc/core": "^1", "postcss": "^8.4.12", "typescript": ">=4.5.0" }, "optionalPeers": ["@microsoft/api-extractor", "@swc/core", "postcss", "typescript"], "bin": { "tsup": "dist/cli-default.js", "tsup-node": "dist/cli-node.js" } }, "sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ=="],
496 |
497 | "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="],
498 |
499 | "typescript": ["typescript@5.9.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A=="],
500 |
501 | "ufo": ["ufo@1.6.1", "", {}, "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA=="],
502 |
503 | "uint8array-extras": ["uint8array-extras@1.5.0", "", {}, "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A=="],
504 |
505 | "undici-types": ["undici-types@7.14.0", "", {}, "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA=="],
506 |
507 | "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="],
508 |
509 | "webidl-conversions": ["webidl-conversions@4.0.2", "", {}, "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="],
510 |
511 | "whatwg-url": ["whatwg-url@7.1.0", "", { "dependencies": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", "webidl-conversions": "^4.0.2" } }, "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg=="],
512 |
513 | "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
514 |
515 | "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="],
516 |
517 | "wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="],
518 |
519 | "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
520 |
521 | "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="],
522 |
523 | "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
524 |
525 | "@isaacs/cliui/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="],
526 |
527 | "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="],
528 |
529 | "@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
530 |
531 | "bun-types/@types/node": ["@types/node@20.12.14", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-scnD59RpYD91xngrQQLGkE+6UrHUPzeKZWhhjBSa3HSkwjbQc38+q3RoIVEwxQGRw3M+j5hpNAM+lgV3cVormg=="],
532 |
533 | "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
534 |
535 | "glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
536 |
537 | "import-fresh/resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="],
538 |
539 | "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
540 |
541 | "string-width/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="],
542 |
543 | "string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
544 |
545 | "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
546 |
547 | "wrap-ansi/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="],
548 |
549 | "wrap-ansi-cjs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
550 |
551 | "@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
552 |
553 | "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
554 |
555 | "bun-types/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="],
556 |
557 | "glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
558 |
559 | "string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
560 |
561 | "wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
562 |
563 | "wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
564 | }
565 | }
566 |
--------------------------------------------------------------------------------