├── .editorconfig
├── .eslintignore
├── .eslintrc.cjs
├── .github
└── workflows
│ └── release.yml
├── .gitignore
├── .prettierignore
├── .prettierrc.yaml
├── .vscode
├── extensions.json
└── settings.json
├── LICENSE
├── README.md
├── package.json
├── pnpm-lock.yaml
├── rollup.config.ts
├── screenshots
├── after.png
└── before.jpg
├── src
├── cli.ts
├── index.ts
└── types.ts
└── tsconfig.json
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | charset = utf-8
5 | indent_style = space
6 | indent_size = 2
7 | end_of_line = lf
8 | insert_final_newline = true
9 | trim_trailing_whitespace = true
--------------------------------------------------------------------------------
/.eslintignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | dist
3 |
--------------------------------------------------------------------------------
/.eslintrc.cjs:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | root: true,
3 | env: {
4 | commonjs: true,
5 | es6: true,
6 | node: true
7 | },
8 | parser: '@typescript-eslint/parser',
9 | parserOptions: {
10 | sourceType: 'module',
11 | ecmaVersion: 2022
12 | },
13 | plugins: ['@typescript-eslint'],
14 | extends: [
15 | 'eslint:recommended',
16 | 'plugin:@typescript-eslint/recommended',
17 | 'plugin:@typescript-eslint/eslint-recommended',
18 | 'plugin:prettier/recommended'
19 | ],
20 | rules: {
21 | 'prettier/prettier': 'warn',
22 | '@typescript-eslint/ban-ts-comment': [
23 | 'error',
24 | { 'ts-ignore': 'allow-with-description' }
25 | ],
26 | '@typescript-eslint/explicit-function-return-type': 'error',
27 | '@typescript-eslint/explicit-module-boundary-types': 'off',
28 | '@typescript-eslint/no-empty-function': [
29 | 'error',
30 | { allow: ['arrowFunctions'] }
31 | ],
32 | '@typescript-eslint/no-explicit-any': 'error',
33 | '@typescript-eslint/no-non-null-assertion': 'off',
34 | '@typescript-eslint/no-var-requires': 'off'
35 | },
36 | overrides: [
37 | {
38 | files: ['*.js', '*.mjs'],
39 | rules: {
40 | '@typescript-eslint/explicit-function-return-type': 'off'
41 | }
42 | }
43 | ]
44 | }
45 |
--------------------------------------------------------------------------------
/.github/workflows/release.yml:
--------------------------------------------------------------------------------
1 | name: Release
2 |
3 | permissions:
4 | contents: write
5 |
6 | on:
7 | push:
8 | tags:
9 | - 'v*'
10 |
11 | jobs:
12 | release:
13 | runs-on: ubuntu-latest
14 | steps:
15 | - name: Checkout code
16 | uses: actions/checkout@v3
17 | with:
18 | fetch-depth: 0
19 |
20 | - name: Set node
21 | uses: actions/setup-node@v3
22 | with:
23 | node-version: 18.x
24 |
25 | - run: npx changelogithub
26 | env:
27 | GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
28 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | dist
3 | .DS_Store
4 | .env*
5 | *.log*
6 |
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | dist
2 | pnpm-lock.yaml
3 |
--------------------------------------------------------------------------------
/.prettierrc.yaml:
--------------------------------------------------------------------------------
1 | singleQuote: true
2 | semi: false
3 | printWidth: 80
4 | trailingComma: none
5 |
--------------------------------------------------------------------------------
/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | "recommendations": ["dbaeumer.vscode-eslint"]
3 | }
4 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "[typescript]": {
3 | "editor.defaultFormatter": "esbenp.prettier-vscode"
4 | },
5 | "[javascript]": {
6 | "editor.defaultFormatter": "esbenp.prettier-vscode"
7 | },
8 | "[json]": {
9 | "editor.defaultFormatter": "esbenp.prettier-vscode"
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2024-present, Alex.Wei
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
shadowizer
2 |
3 | A cli tool for adding box shadow to images
4 |
5 |
6 |
7 |
8 |
9 |
10 | npm i -g shadowizer
11 |
12 | Before
13 |
14 |
15 |
16 |
17 |
18 | After
19 |
20 |
21 |
22 |
23 |
24 | ## Usage
25 |
26 | See `shadowizer --help` for more details.
27 |
28 | ### shadowizer [root]
29 |
30 | Find images and add box shadow to them. You can specify the root directory, which can be an absolute path, or a path relative to the current working directory. Default to `process.cwd()`.
31 |
32 | It should be noted that all images with added shadows will be output in `png` format to the `shadowizer-{timestamp}` directory in the root directory.
33 |
34 | > Why not other output formats such as `jpeg`, because png supports transparency.
35 |
36 | | Options | Description |
37 | | ---------------------- | :--------------------------------------------------------------------------- |
38 | | `-f, --files` | specify images, support glob patterns, default: `\*.{png,jpg,jpeg,webp}` |
39 | | `-c, --shadowColor` | set shadow color, default: `#00000073` |
40 | | `-b, --shadowBlur` | set shadow blur, default: `25` |
41 | | `-x, --shadowOffsetX` | set shadow offset x, default: `0` |
42 | | `-y, --shadowOffsetY ` | set shadow offset y, default: `0` |
43 |
44 | Example:
45 |
46 | ```sh
47 | # specify directory to find images
48 | shadowizer path/to
49 |
50 | # specify multiple images
51 | shadowizer -f text.png -f fun.png
52 |
53 | # specify images with glob patterns
54 | shadowizer -f *.png
55 |
56 | # set shadow color
57 | shadowizer -c #00000073
58 | ```
59 |
60 | ## API
61 |
62 | ### addShadow
63 |
64 | - type: `(imagePath: string, shadow?: ShadowOptions) => Promise`
65 |
66 | Adds a box shadow to the specified image.
67 |
68 | ```js
69 | import { addShadow } from 'shadowizer'
70 | ```
71 |
72 | ### saveShadowImage
73 |
74 | - type: `(imagePath: string, outDir?: string, shadow?: ShadowOptions) => Promise`
75 |
76 | Adds a box shadow to the specified image and saves it to disk.
77 |
78 | ```js
79 | import { saveShadowImage } from 'shadowizer'
80 | ```
81 |
82 | ## License
83 |
84 | [MIT](./LICENSE) © alex.wei
85 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "shadowizer",
3 | "version": "1.1.0",
4 | "description": "A cli tool for adding box shadow to images",
5 | "main": "./dist/index.cjs",
6 | "module": "./dist/index.mjs",
7 | "types": "./dist/index.d.ts",
8 | "exports": {
9 | ".": {
10 | "types": "./dist/index.d.ts",
11 | "import": "./dist/index.mjs",
12 | "require": "./dist/index.cjs"
13 | }
14 | },
15 | "bin": {
16 | "shadowizer": "dist/cli.js"
17 | },
18 | "files": [
19 | "dist"
20 | ],
21 | "keywords": [
22 | "image",
23 | "shadow"
24 | ],
25 | "author": "Alex Wei",
26 | "repository": "alex8088/shadowizer",
27 | "license": "MIT",
28 | "scripts": {
29 | "format": "prettier --write .",
30 | "lint": "eslint --ext .js,.cjs,.mjs,.ts,.cts,.mts src/**",
31 | "typecheck": "tsc --noEmit",
32 | "build": "npm run lint && rollup -c rollup.config.ts --configPlugin typescript"
33 | },
34 | "devDependencies": {
35 | "@rollup/plugin-commonjs": "^26.0.1",
36 | "@rollup/plugin-json": "^6.1.0",
37 | "@rollup/plugin-node-resolve": "^15.2.3",
38 | "@rollup/plugin-typescript": "^11.1.6",
39 | "@types/node": "^18.19.36",
40 | "@typescript-eslint/eslint-plugin": "^7.13.1",
41 | "@typescript-eslint/parser": "^7.13.1",
42 | "eslint": "^8.57.0",
43 | "eslint-config-prettier": "^9.1.0",
44 | "eslint-plugin-prettier": "^5.1.3",
45 | "prettier": "^3.3.2",
46 | "rollup": "^4.18.0",
47 | "rollup-plugin-dts": "^6.1.1",
48 | "rollup-plugin-rm": "^1.0.2",
49 | "typescript": "^5.4.5"
50 | },
51 | "dependencies": {
52 | "@napi-rs/canvas": "^0.1.53",
53 | "cac": "^6.7.14",
54 | "fast-glob": "^3.3.2",
55 | "picocolors": "^1.0.1"
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | lockfileVersion: '6.0'
2 |
3 | settings:
4 | autoInstallPeers: true
5 | excludeLinksFromLockfile: false
6 |
7 | dependencies:
8 | '@napi-rs/canvas':
9 | specifier: ^0.1.53
10 | version: 0.1.53
11 | cac:
12 | specifier: ^6.7.14
13 | version: 6.7.14
14 | fast-glob:
15 | specifier: ^3.3.2
16 | version: 3.3.2
17 | picocolors:
18 | specifier: ^1.0.1
19 | version: 1.0.1
20 |
21 | devDependencies:
22 | '@rollup/plugin-commonjs':
23 | specifier: ^26.0.1
24 | version: 26.0.1(rollup@4.18.0)
25 | '@rollup/plugin-json':
26 | specifier: ^6.1.0
27 | version: 6.1.0(rollup@4.18.0)
28 | '@rollup/plugin-node-resolve':
29 | specifier: ^15.2.3
30 | version: 15.2.3(rollup@4.18.0)
31 | '@rollup/plugin-typescript':
32 | specifier: ^11.1.6
33 | version: 11.1.6(rollup@4.18.0)(typescript@5.4.5)
34 | '@types/node':
35 | specifier: ^18.19.36
36 | version: 18.19.36
37 | '@typescript-eslint/eslint-plugin':
38 | specifier: ^7.13.1
39 | version: 7.13.1(@typescript-eslint/parser@7.13.1)(eslint@8.57.0)(typescript@5.4.5)
40 | '@typescript-eslint/parser':
41 | specifier: ^7.13.1
42 | version: 7.13.1(eslint@8.57.0)(typescript@5.4.5)
43 | eslint:
44 | specifier: ^8.57.0
45 | version: 8.57.0
46 | eslint-config-prettier:
47 | specifier: ^9.1.0
48 | version: 9.1.0(eslint@8.57.0)
49 | eslint-plugin-prettier:
50 | specifier: ^5.1.3
51 | version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.3.2)
52 | prettier:
53 | specifier: ^3.3.2
54 | version: 3.3.2
55 | rollup:
56 | specifier: ^4.18.0
57 | version: 4.18.0
58 | rollup-plugin-dts:
59 | specifier: ^6.1.1
60 | version: 6.1.1(rollup@4.18.0)(typescript@5.4.5)
61 | rollup-plugin-rm:
62 | specifier: ^1.0.2
63 | version: 1.0.2(rollup@4.18.0)
64 | typescript:
65 | specifier: ^5.4.5
66 | version: 5.4.5
67 |
68 | packages:
69 |
70 | /@babel/code-frame@7.24.7:
71 | resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==}
72 | engines: {node: '>=6.9.0'}
73 | requiresBuild: true
74 | dependencies:
75 | '@babel/highlight': 7.24.7
76 | picocolors: 1.0.1
77 | dev: true
78 | optional: true
79 |
80 | /@babel/helper-validator-identifier@7.24.7:
81 | resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==}
82 | engines: {node: '>=6.9.0'}
83 | requiresBuild: true
84 | dev: true
85 | optional: true
86 |
87 | /@babel/highlight@7.24.7:
88 | resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==}
89 | engines: {node: '>=6.9.0'}
90 | requiresBuild: true
91 | dependencies:
92 | '@babel/helper-validator-identifier': 7.24.7
93 | chalk: 2.4.2
94 | js-tokens: 4.0.0
95 | picocolors: 1.0.1
96 | dev: true
97 | optional: true
98 |
99 | /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0):
100 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
101 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
102 | peerDependencies:
103 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
104 | dependencies:
105 | eslint: 8.57.0
106 | eslint-visitor-keys: 3.4.3
107 | dev: true
108 |
109 | /@eslint-community/regexpp@4.10.1:
110 | resolution: {integrity: sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==}
111 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
112 | dev: true
113 |
114 | /@eslint/eslintrc@2.1.4:
115 | resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==}
116 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
117 | dependencies:
118 | ajv: 6.12.6
119 | debug: 4.3.5
120 | espree: 9.6.1
121 | globals: 13.24.0
122 | ignore: 5.3.1
123 | import-fresh: 3.3.0
124 | js-yaml: 4.1.0
125 | minimatch: 3.1.2
126 | strip-json-comments: 3.1.1
127 | transitivePeerDependencies:
128 | - supports-color
129 | dev: true
130 |
131 | /@eslint/js@8.57.0:
132 | resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==}
133 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
134 | dev: true
135 |
136 | /@humanwhocodes/config-array@0.11.14:
137 | resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==}
138 | engines: {node: '>=10.10.0'}
139 | deprecated: Use @eslint/config-array instead
140 | dependencies:
141 | '@humanwhocodes/object-schema': 2.0.3
142 | debug: 4.3.5
143 | minimatch: 3.1.2
144 | transitivePeerDependencies:
145 | - supports-color
146 | dev: true
147 |
148 | /@humanwhocodes/module-importer@1.0.1:
149 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
150 | engines: {node: '>=12.22'}
151 | dev: true
152 |
153 | /@humanwhocodes/object-schema@2.0.3:
154 | resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==}
155 | deprecated: Use @eslint/object-schema instead
156 | dev: true
157 |
158 | /@isaacs/cliui@8.0.2:
159 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
160 | engines: {node: '>=12'}
161 | dependencies:
162 | string-width: 5.1.2
163 | string-width-cjs: /string-width@4.2.3
164 | strip-ansi: 7.1.0
165 | strip-ansi-cjs: /strip-ansi@6.0.1
166 | wrap-ansi: 8.1.0
167 | wrap-ansi-cjs: /wrap-ansi@7.0.0
168 | dev: true
169 |
170 | /@jridgewell/sourcemap-codec@1.4.15:
171 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
172 | dev: true
173 |
174 | /@napi-rs/canvas-android-arm64@0.1.53:
175 | resolution: {integrity: sha512-2YhxfVsZguATlRWE0fZdTx35SE9+r5D7HV5GPNDataZOKmHf+zZ5//dspuuBSbOriQdoicaFrgXKCUqI0pK3WQ==}
176 | engines: {node: '>= 10'}
177 | cpu: [arm64]
178 | os: [android]
179 | requiresBuild: true
180 | dev: false
181 | optional: true
182 |
183 | /@napi-rs/canvas-darwin-arm64@0.1.53:
184 | resolution: {integrity: sha512-ls+CWLMusf4RAGo5BvIIzA6dNcc0elwVp6LKjHfQECHA8KKmvdB58YuE5BQcTlb2rzk0SEKtBC/Th3NI2oNdfg==}
185 | engines: {node: '>= 10'}
186 | cpu: [arm64]
187 | os: [darwin]
188 | requiresBuild: true
189 | dev: false
190 | optional: true
191 |
192 | /@napi-rs/canvas-darwin-x64@0.1.53:
193 | resolution: {integrity: sha512-ZAgcoCH5+5OKS2P8Lxx+jbkAPKkyLD2x6OvSrHg1U6ppdxmLA+CkJlRl8w45HCXwuyIiP7OeymECRtiNYTwznQ==}
194 | engines: {node: '>= 10'}
195 | cpu: [x64]
196 | os: [darwin]
197 | requiresBuild: true
198 | dev: false
199 | optional: true
200 |
201 | /@napi-rs/canvas-linux-arm-gnueabihf@0.1.53:
202 | resolution: {integrity: sha512-p9km/3C/loDxu3AvA8/vtpIS1BGMd/Ehkl2Iu/v/Gw8N/KUIt3HUvTS7AKApyVE28bxTfq96wJQjtcT8jzDncw==}
203 | engines: {node: '>= 10'}
204 | cpu: [arm]
205 | os: [linux]
206 | requiresBuild: true
207 | dev: false
208 | optional: true
209 |
210 | /@napi-rs/canvas-linux-arm64-gnu@0.1.53:
211 | resolution: {integrity: sha512-QKK+sykEiYwjwd+ogyLcpcnH38DNZ8KViBlnfEpoGA2Wa+21/cWQKfMxnbgb/rbvm5tazJinZcihFvH577WQ5g==}
212 | engines: {node: '>= 10'}
213 | cpu: [arm64]
214 | os: [linux]
215 | requiresBuild: true
216 | dev: false
217 | optional: true
218 |
219 | /@napi-rs/canvas-linux-arm64-musl@0.1.53:
220 | resolution: {integrity: sha512-2N41U0X8RnrTKzpTtPv1ozlYkJtPsUdbfF3uP/KEd/BsULGd8Y8ghkGMS6CM+821au4ex0dPrWOOdT9wC1rSqQ==}
221 | engines: {node: '>= 10'}
222 | cpu: [arm64]
223 | os: [linux]
224 | requiresBuild: true
225 | dev: false
226 | optional: true
227 |
228 | /@napi-rs/canvas-linux-x64-gnu@0.1.53:
229 | resolution: {integrity: sha512-7XjuTvDKCODtf/vMwF43VGDrjfgwYKgS91ggdcX3UrJaBYWyWu/+eqNvNj+zdXSe/0x+YOjf5jG4m8xIXdBMQA==}
230 | engines: {node: '>= 10'}
231 | cpu: [x64]
232 | os: [linux]
233 | requiresBuild: true
234 | dev: false
235 | optional: true
236 |
237 | /@napi-rs/canvas-linux-x64-musl@0.1.53:
238 | resolution: {integrity: sha512-970WEvB8vmj+uxvgdBZ+AGFV7uq9GJhXrqG5PGQ5lWciHX0P0d/OhS2F7TITgFR0LsKDQZ7XQgzMxsYOfwZ0FQ==}
239 | engines: {node: '>= 10'}
240 | cpu: [x64]
241 | os: [linux]
242 | requiresBuild: true
243 | dev: false
244 | optional: true
245 |
246 | /@napi-rs/canvas-win32-x64-msvc@0.1.53:
247 | resolution: {integrity: sha512-rLFQCSJaWg/sv54Aap9nAhaodi4Vyb4un50EgW+PNkk8icMziU6KLRKirGBdQr9ZdxnshAPeQXD1g2ArStujKA==}
248 | engines: {node: '>= 10'}
249 | cpu: [x64]
250 | os: [win32]
251 | requiresBuild: true
252 | dev: false
253 | optional: true
254 |
255 | /@napi-rs/canvas@0.1.53:
256 | resolution: {integrity: sha512-XsEZi97+kKykmAiPpY+IpZoHxJY1srqFZp8jDt1/RySzC0kB0iZYt/VMIFqQKpLCARZjD7SOAz2AULtwYlesCA==}
257 | engines: {node: '>= 10'}
258 | optionalDependencies:
259 | '@napi-rs/canvas-android-arm64': 0.1.53
260 | '@napi-rs/canvas-darwin-arm64': 0.1.53
261 | '@napi-rs/canvas-darwin-x64': 0.1.53
262 | '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.53
263 | '@napi-rs/canvas-linux-arm64-gnu': 0.1.53
264 | '@napi-rs/canvas-linux-arm64-musl': 0.1.53
265 | '@napi-rs/canvas-linux-x64-gnu': 0.1.53
266 | '@napi-rs/canvas-linux-x64-musl': 0.1.53
267 | '@napi-rs/canvas-win32-x64-msvc': 0.1.53
268 | dev: false
269 |
270 | /@nodelib/fs.scandir@2.1.5:
271 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
272 | engines: {node: '>= 8'}
273 | dependencies:
274 | '@nodelib/fs.stat': 2.0.5
275 | run-parallel: 1.2.0
276 |
277 | /@nodelib/fs.stat@2.0.5:
278 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
279 | engines: {node: '>= 8'}
280 |
281 | /@nodelib/fs.walk@1.2.8:
282 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
283 | engines: {node: '>= 8'}
284 | dependencies:
285 | '@nodelib/fs.scandir': 2.1.5
286 | fastq: 1.17.1
287 |
288 | /@pkgjs/parseargs@0.11.0:
289 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
290 | engines: {node: '>=14'}
291 | requiresBuild: true
292 | dev: true
293 | optional: true
294 |
295 | /@pkgr/core@0.1.1:
296 | resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==}
297 | engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
298 | dev: true
299 |
300 | /@rollup/plugin-commonjs@26.0.1(rollup@4.18.0):
301 | resolution: {integrity: sha512-UnsKoZK6/aGIH6AdkptXhNvhaqftcjq3zZdT+LY5Ftms6JR06nADcDsYp5hTU9E2lbJUEOhdlY5J4DNTneM+jQ==}
302 | engines: {node: '>=16.0.0 || 14 >= 14.17'}
303 | peerDependencies:
304 | rollup: ^2.68.0||^3.0.0||^4.0.0
305 | peerDependenciesMeta:
306 | rollup:
307 | optional: true
308 | dependencies:
309 | '@rollup/pluginutils': 5.1.0(rollup@4.18.0)
310 | commondir: 1.0.1
311 | estree-walker: 2.0.2
312 | glob: 10.4.2
313 | is-reference: 1.2.1
314 | magic-string: 0.30.10
315 | rollup: 4.18.0
316 | dev: true
317 |
318 | /@rollup/plugin-json@6.1.0(rollup@4.18.0):
319 | resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==}
320 | engines: {node: '>=14.0.0'}
321 | peerDependencies:
322 | rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
323 | peerDependenciesMeta:
324 | rollup:
325 | optional: true
326 | dependencies:
327 | '@rollup/pluginutils': 5.1.0(rollup@4.18.0)
328 | rollup: 4.18.0
329 | dev: true
330 |
331 | /@rollup/plugin-node-resolve@15.2.3(rollup@4.18.0):
332 | resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==}
333 | engines: {node: '>=14.0.0'}
334 | peerDependencies:
335 | rollup: ^2.78.0||^3.0.0||^4.0.0
336 | peerDependenciesMeta:
337 | rollup:
338 | optional: true
339 | dependencies:
340 | '@rollup/pluginutils': 5.1.0(rollup@4.18.0)
341 | '@types/resolve': 1.20.2
342 | deepmerge: 4.3.1
343 | is-builtin-module: 3.2.1
344 | is-module: 1.0.0
345 | resolve: 1.22.8
346 | rollup: 4.18.0
347 | dev: true
348 |
349 | /@rollup/plugin-typescript@11.1.6(rollup@4.18.0)(typescript@5.4.5):
350 | resolution: {integrity: sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==}
351 | engines: {node: '>=14.0.0'}
352 | peerDependencies:
353 | rollup: ^2.14.0||^3.0.0||^4.0.0
354 | tslib: '*'
355 | typescript: '>=3.7.0'
356 | peerDependenciesMeta:
357 | rollup:
358 | optional: true
359 | tslib:
360 | optional: true
361 | dependencies:
362 | '@rollup/pluginutils': 5.1.0(rollup@4.18.0)
363 | resolve: 1.22.8
364 | rollup: 4.18.0
365 | typescript: 5.4.5
366 | dev: true
367 |
368 | /@rollup/pluginutils@5.1.0(rollup@4.18.0):
369 | resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==}
370 | engines: {node: '>=14.0.0'}
371 | peerDependencies:
372 | rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
373 | peerDependenciesMeta:
374 | rollup:
375 | optional: true
376 | dependencies:
377 | '@types/estree': 1.0.5
378 | estree-walker: 2.0.2
379 | picomatch: 2.3.1
380 | rollup: 4.18.0
381 | dev: true
382 |
383 | /@rollup/rollup-android-arm-eabi@4.18.0:
384 | resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==}
385 | cpu: [arm]
386 | os: [android]
387 | requiresBuild: true
388 | dev: true
389 | optional: true
390 |
391 | /@rollup/rollup-android-arm64@4.18.0:
392 | resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==}
393 | cpu: [arm64]
394 | os: [android]
395 | requiresBuild: true
396 | dev: true
397 | optional: true
398 |
399 | /@rollup/rollup-darwin-arm64@4.18.0:
400 | resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==}
401 | cpu: [arm64]
402 | os: [darwin]
403 | requiresBuild: true
404 | dev: true
405 | optional: true
406 |
407 | /@rollup/rollup-darwin-x64@4.18.0:
408 | resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==}
409 | cpu: [x64]
410 | os: [darwin]
411 | requiresBuild: true
412 | dev: true
413 | optional: true
414 |
415 | /@rollup/rollup-linux-arm-gnueabihf@4.18.0:
416 | resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==}
417 | cpu: [arm]
418 | os: [linux]
419 | requiresBuild: true
420 | dev: true
421 | optional: true
422 |
423 | /@rollup/rollup-linux-arm-musleabihf@4.18.0:
424 | resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==}
425 | cpu: [arm]
426 | os: [linux]
427 | requiresBuild: true
428 | dev: true
429 | optional: true
430 |
431 | /@rollup/rollup-linux-arm64-gnu@4.18.0:
432 | resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==}
433 | cpu: [arm64]
434 | os: [linux]
435 | requiresBuild: true
436 | dev: true
437 | optional: true
438 |
439 | /@rollup/rollup-linux-arm64-musl@4.18.0:
440 | resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==}
441 | cpu: [arm64]
442 | os: [linux]
443 | requiresBuild: true
444 | dev: true
445 | optional: true
446 |
447 | /@rollup/rollup-linux-powerpc64le-gnu@4.18.0:
448 | resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==}
449 | cpu: [ppc64]
450 | os: [linux]
451 | requiresBuild: true
452 | dev: true
453 | optional: true
454 |
455 | /@rollup/rollup-linux-riscv64-gnu@4.18.0:
456 | resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==}
457 | cpu: [riscv64]
458 | os: [linux]
459 | requiresBuild: true
460 | dev: true
461 | optional: true
462 |
463 | /@rollup/rollup-linux-s390x-gnu@4.18.0:
464 | resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==}
465 | cpu: [s390x]
466 | os: [linux]
467 | requiresBuild: true
468 | dev: true
469 | optional: true
470 |
471 | /@rollup/rollup-linux-x64-gnu@4.18.0:
472 | resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==}
473 | cpu: [x64]
474 | os: [linux]
475 | requiresBuild: true
476 | dev: true
477 | optional: true
478 |
479 | /@rollup/rollup-linux-x64-musl@4.18.0:
480 | resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==}
481 | cpu: [x64]
482 | os: [linux]
483 | requiresBuild: true
484 | dev: true
485 | optional: true
486 |
487 | /@rollup/rollup-win32-arm64-msvc@4.18.0:
488 | resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==}
489 | cpu: [arm64]
490 | os: [win32]
491 | requiresBuild: true
492 | dev: true
493 | optional: true
494 |
495 | /@rollup/rollup-win32-ia32-msvc@4.18.0:
496 | resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==}
497 | cpu: [ia32]
498 | os: [win32]
499 | requiresBuild: true
500 | dev: true
501 | optional: true
502 |
503 | /@rollup/rollup-win32-x64-msvc@4.18.0:
504 | resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==}
505 | cpu: [x64]
506 | os: [win32]
507 | requiresBuild: true
508 | dev: true
509 | optional: true
510 |
511 | /@types/estree@1.0.5:
512 | resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
513 | dev: true
514 |
515 | /@types/node@18.19.36:
516 | resolution: {integrity: sha512-tX1BNmYSWEvViftB26VLNxT6mEr37M7+ldUtq7rlKnv4/2fKYsJIOmqJAjT6h1DNuwQjIKgw3VJ/Dtw3yiTIQw==}
517 | dependencies:
518 | undici-types: 5.26.5
519 | dev: true
520 |
521 | /@types/resolve@1.20.2:
522 | resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==}
523 | dev: true
524 |
525 | /@typescript-eslint/eslint-plugin@7.13.1(@typescript-eslint/parser@7.13.1)(eslint@8.57.0)(typescript@5.4.5):
526 | resolution: {integrity: sha512-kZqi+WZQaZfPKnsflLJQCz6Ze9FFSMfXrrIOcyargekQxG37ES7DJNpJUE9Q/X5n3yTIP/WPutVNzgknQ7biLg==}
527 | engines: {node: ^18.18.0 || >=20.0.0}
528 | peerDependencies:
529 | '@typescript-eslint/parser': ^7.0.0
530 | eslint: ^8.56.0
531 | typescript: '*'
532 | peerDependenciesMeta:
533 | typescript:
534 | optional: true
535 | dependencies:
536 | '@eslint-community/regexpp': 4.10.1
537 | '@typescript-eslint/parser': 7.13.1(eslint@8.57.0)(typescript@5.4.5)
538 | '@typescript-eslint/scope-manager': 7.13.1
539 | '@typescript-eslint/type-utils': 7.13.1(eslint@8.57.0)(typescript@5.4.5)
540 | '@typescript-eslint/utils': 7.13.1(eslint@8.57.0)(typescript@5.4.5)
541 | '@typescript-eslint/visitor-keys': 7.13.1
542 | eslint: 8.57.0
543 | graphemer: 1.4.0
544 | ignore: 5.3.1
545 | natural-compare: 1.4.0
546 | ts-api-utils: 1.3.0(typescript@5.4.5)
547 | typescript: 5.4.5
548 | transitivePeerDependencies:
549 | - supports-color
550 | dev: true
551 |
552 | /@typescript-eslint/parser@7.13.1(eslint@8.57.0)(typescript@5.4.5):
553 | resolution: {integrity: sha512-1ELDPlnLvDQ5ybTSrMhRTFDfOQEOXNM+eP+3HT/Yq7ruWpciQw+Avi73pdEbA4SooCawEWo3dtYbF68gN7Ed1A==}
554 | engines: {node: ^18.18.0 || >=20.0.0}
555 | peerDependencies:
556 | eslint: ^8.56.0
557 | typescript: '*'
558 | peerDependenciesMeta:
559 | typescript:
560 | optional: true
561 | dependencies:
562 | '@typescript-eslint/scope-manager': 7.13.1
563 | '@typescript-eslint/types': 7.13.1
564 | '@typescript-eslint/typescript-estree': 7.13.1(typescript@5.4.5)
565 | '@typescript-eslint/visitor-keys': 7.13.1
566 | debug: 4.3.5
567 | eslint: 8.57.0
568 | typescript: 5.4.5
569 | transitivePeerDependencies:
570 | - supports-color
571 | dev: true
572 |
573 | /@typescript-eslint/scope-manager@7.13.1:
574 | resolution: {integrity: sha512-adbXNVEs6GmbzaCpymHQ0MB6E4TqoiVbC0iqG3uijR8ZYfpAXMGttouQzF4Oat3P2GxDVIrg7bMI/P65LiQZdg==}
575 | engines: {node: ^18.18.0 || >=20.0.0}
576 | dependencies:
577 | '@typescript-eslint/types': 7.13.1
578 | '@typescript-eslint/visitor-keys': 7.13.1
579 | dev: true
580 |
581 | /@typescript-eslint/type-utils@7.13.1(eslint@8.57.0)(typescript@5.4.5):
582 | resolution: {integrity: sha512-aWDbLu1s9bmgPGXSzNCxELu+0+HQOapV/y+60gPXafR8e2g1Bifxzevaa+4L2ytCWm+CHqpELq4CSoN9ELiwCg==}
583 | engines: {node: ^18.18.0 || >=20.0.0}
584 | peerDependencies:
585 | eslint: ^8.56.0
586 | typescript: '*'
587 | peerDependenciesMeta:
588 | typescript:
589 | optional: true
590 | dependencies:
591 | '@typescript-eslint/typescript-estree': 7.13.1(typescript@5.4.5)
592 | '@typescript-eslint/utils': 7.13.1(eslint@8.57.0)(typescript@5.4.5)
593 | debug: 4.3.5
594 | eslint: 8.57.0
595 | ts-api-utils: 1.3.0(typescript@5.4.5)
596 | typescript: 5.4.5
597 | transitivePeerDependencies:
598 | - supports-color
599 | dev: true
600 |
601 | /@typescript-eslint/types@7.13.1:
602 | resolution: {integrity: sha512-7K7HMcSQIAND6RBL4kDl24sG/xKM13cA85dc7JnmQXw2cBDngg7c19B++JzvJHRG3zG36n9j1i451GBzRuHchw==}
603 | engines: {node: ^18.18.0 || >=20.0.0}
604 | dev: true
605 |
606 | /@typescript-eslint/typescript-estree@7.13.1(typescript@5.4.5):
607 | resolution: {integrity: sha512-uxNr51CMV7npU1BxZzYjoVz9iyjckBduFBP0S5sLlh1tXYzHzgZ3BR9SVsNed+LmwKrmnqN3Kdl5t7eZ5TS1Yw==}
608 | engines: {node: ^18.18.0 || >=20.0.0}
609 | peerDependencies:
610 | typescript: '*'
611 | peerDependenciesMeta:
612 | typescript:
613 | optional: true
614 | dependencies:
615 | '@typescript-eslint/types': 7.13.1
616 | '@typescript-eslint/visitor-keys': 7.13.1
617 | debug: 4.3.5
618 | globby: 11.1.0
619 | is-glob: 4.0.3
620 | minimatch: 9.0.4
621 | semver: 7.6.2
622 | ts-api-utils: 1.3.0(typescript@5.4.5)
623 | typescript: 5.4.5
624 | transitivePeerDependencies:
625 | - supports-color
626 | dev: true
627 |
628 | /@typescript-eslint/utils@7.13.1(eslint@8.57.0)(typescript@5.4.5):
629 | resolution: {integrity: sha512-h5MzFBD5a/Gh/fvNdp9pTfqJAbuQC4sCN2WzuXme71lqFJsZtLbjxfSk4r3p02WIArOF9N94pdsLiGutpDbrXQ==}
630 | engines: {node: ^18.18.0 || >=20.0.0}
631 | peerDependencies:
632 | eslint: ^8.56.0
633 | dependencies:
634 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
635 | '@typescript-eslint/scope-manager': 7.13.1
636 | '@typescript-eslint/types': 7.13.1
637 | '@typescript-eslint/typescript-estree': 7.13.1(typescript@5.4.5)
638 | eslint: 8.57.0
639 | transitivePeerDependencies:
640 | - supports-color
641 | - typescript
642 | dev: true
643 |
644 | /@typescript-eslint/visitor-keys@7.13.1:
645 | resolution: {integrity: sha512-k/Bfne7lrP7hcb7m9zSsgcBmo+8eicqqfNAJ7uUY+jkTFpKeH2FSkWpFRtimBxgkyvqfu9jTPRbYOvud6isdXA==}
646 | engines: {node: ^18.18.0 || >=20.0.0}
647 | dependencies:
648 | '@typescript-eslint/types': 7.13.1
649 | eslint-visitor-keys: 3.4.3
650 | dev: true
651 |
652 | /@ungap/structured-clone@1.2.0:
653 | resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
654 | dev: true
655 |
656 | /acorn-jsx@5.3.2(acorn@8.12.0):
657 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
658 | peerDependencies:
659 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
660 | dependencies:
661 | acorn: 8.12.0
662 | dev: true
663 |
664 | /acorn@8.12.0:
665 | resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==}
666 | engines: {node: '>=0.4.0'}
667 | hasBin: true
668 | dev: true
669 |
670 | /ajv@6.12.6:
671 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
672 | dependencies:
673 | fast-deep-equal: 3.1.3
674 | fast-json-stable-stringify: 2.1.0
675 | json-schema-traverse: 0.4.1
676 | uri-js: 4.4.1
677 | dev: true
678 |
679 | /ansi-regex@5.0.1:
680 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
681 | engines: {node: '>=8'}
682 | dev: true
683 |
684 | /ansi-regex@6.0.1:
685 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==}
686 | engines: {node: '>=12'}
687 | dev: true
688 |
689 | /ansi-styles@3.2.1:
690 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
691 | engines: {node: '>=4'}
692 | requiresBuild: true
693 | dependencies:
694 | color-convert: 1.9.3
695 | dev: true
696 | optional: true
697 |
698 | /ansi-styles@4.3.0:
699 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
700 | engines: {node: '>=8'}
701 | dependencies:
702 | color-convert: 2.0.1
703 | dev: true
704 |
705 | /ansi-styles@6.2.1:
706 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
707 | engines: {node: '>=12'}
708 | dev: true
709 |
710 | /argparse@2.0.1:
711 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
712 | dev: true
713 |
714 | /array-union@2.1.0:
715 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
716 | engines: {node: '>=8'}
717 | dev: true
718 |
719 | /balanced-match@1.0.2:
720 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
721 | dev: true
722 |
723 | /brace-expansion@1.1.11:
724 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
725 | dependencies:
726 | balanced-match: 1.0.2
727 | concat-map: 0.0.1
728 | dev: true
729 |
730 | /brace-expansion@2.0.1:
731 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
732 | dependencies:
733 | balanced-match: 1.0.2
734 | dev: true
735 |
736 | /braces@3.0.3:
737 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
738 | engines: {node: '>=8'}
739 | dependencies:
740 | fill-range: 7.1.1
741 |
742 | /builtin-modules@3.3.0:
743 | resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==}
744 | engines: {node: '>=6'}
745 | dev: true
746 |
747 | /cac@6.7.14:
748 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
749 | engines: {node: '>=8'}
750 | dev: false
751 |
752 | /callsites@3.1.0:
753 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
754 | engines: {node: '>=6'}
755 | dev: true
756 |
757 | /chalk@2.4.2:
758 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
759 | engines: {node: '>=4'}
760 | requiresBuild: true
761 | dependencies:
762 | ansi-styles: 3.2.1
763 | escape-string-regexp: 1.0.5
764 | supports-color: 5.5.0
765 | dev: true
766 | optional: true
767 |
768 | /chalk@4.1.2:
769 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
770 | engines: {node: '>=10'}
771 | dependencies:
772 | ansi-styles: 4.3.0
773 | supports-color: 7.2.0
774 | dev: true
775 |
776 | /color-convert@1.9.3:
777 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
778 | requiresBuild: true
779 | dependencies:
780 | color-name: 1.1.3
781 | dev: true
782 | optional: true
783 |
784 | /color-convert@2.0.1:
785 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
786 | engines: {node: '>=7.0.0'}
787 | dependencies:
788 | color-name: 1.1.4
789 | dev: true
790 |
791 | /color-name@1.1.3:
792 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
793 | requiresBuild: true
794 | dev: true
795 | optional: true
796 |
797 | /color-name@1.1.4:
798 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
799 | dev: true
800 |
801 | /commondir@1.0.1:
802 | resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==}
803 | dev: true
804 |
805 | /concat-map@0.0.1:
806 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
807 | dev: true
808 |
809 | /cross-spawn@7.0.3:
810 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
811 | engines: {node: '>= 8'}
812 | dependencies:
813 | path-key: 3.1.1
814 | shebang-command: 2.0.0
815 | which: 2.0.2
816 | dev: true
817 |
818 | /debug@4.3.5:
819 | resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==}
820 | engines: {node: '>=6.0'}
821 | peerDependencies:
822 | supports-color: '*'
823 | peerDependenciesMeta:
824 | supports-color:
825 | optional: true
826 | dependencies:
827 | ms: 2.1.2
828 | dev: true
829 |
830 | /deep-is@0.1.4:
831 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
832 | dev: true
833 |
834 | /deepmerge@4.3.1:
835 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
836 | engines: {node: '>=0.10.0'}
837 | dev: true
838 |
839 | /dir-glob@3.0.1:
840 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
841 | engines: {node: '>=8'}
842 | dependencies:
843 | path-type: 4.0.0
844 | dev: true
845 |
846 | /doctrine@3.0.0:
847 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
848 | engines: {node: '>=6.0.0'}
849 | dependencies:
850 | esutils: 2.0.3
851 | dev: true
852 |
853 | /eastasianwidth@0.2.0:
854 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
855 | dev: true
856 |
857 | /emoji-regex@8.0.0:
858 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
859 | dev: true
860 |
861 | /emoji-regex@9.2.2:
862 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
863 | dev: true
864 |
865 | /escape-string-regexp@1.0.5:
866 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
867 | engines: {node: '>=0.8.0'}
868 | requiresBuild: true
869 | dev: true
870 | optional: true
871 |
872 | /escape-string-regexp@4.0.0:
873 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
874 | engines: {node: '>=10'}
875 | dev: true
876 |
877 | /eslint-config-prettier@9.1.0(eslint@8.57.0):
878 | resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==}
879 | hasBin: true
880 | peerDependencies:
881 | eslint: '>=7.0.0'
882 | dependencies:
883 | eslint: 8.57.0
884 | dev: true
885 |
886 | /eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.3.2):
887 | resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==}
888 | engines: {node: ^14.18.0 || >=16.0.0}
889 | peerDependencies:
890 | '@types/eslint': '>=8.0.0'
891 | eslint: '>=8.0.0'
892 | eslint-config-prettier: '*'
893 | prettier: '>=3.0.0'
894 | peerDependenciesMeta:
895 | '@types/eslint':
896 | optional: true
897 | eslint-config-prettier:
898 | optional: true
899 | dependencies:
900 | eslint: 8.57.0
901 | eslint-config-prettier: 9.1.0(eslint@8.57.0)
902 | prettier: 3.3.2
903 | prettier-linter-helpers: 1.0.0
904 | synckit: 0.8.8
905 | dev: true
906 |
907 | /eslint-scope@7.2.2:
908 | resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
909 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
910 | dependencies:
911 | esrecurse: 4.3.0
912 | estraverse: 5.3.0
913 | dev: true
914 |
915 | /eslint-visitor-keys@3.4.3:
916 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
917 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
918 | dev: true
919 |
920 | /eslint@8.57.0:
921 | resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==}
922 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
923 | hasBin: true
924 | dependencies:
925 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
926 | '@eslint-community/regexpp': 4.10.1
927 | '@eslint/eslintrc': 2.1.4
928 | '@eslint/js': 8.57.0
929 | '@humanwhocodes/config-array': 0.11.14
930 | '@humanwhocodes/module-importer': 1.0.1
931 | '@nodelib/fs.walk': 1.2.8
932 | '@ungap/structured-clone': 1.2.0
933 | ajv: 6.12.6
934 | chalk: 4.1.2
935 | cross-spawn: 7.0.3
936 | debug: 4.3.5
937 | doctrine: 3.0.0
938 | escape-string-regexp: 4.0.0
939 | eslint-scope: 7.2.2
940 | eslint-visitor-keys: 3.4.3
941 | espree: 9.6.1
942 | esquery: 1.5.0
943 | esutils: 2.0.3
944 | fast-deep-equal: 3.1.3
945 | file-entry-cache: 6.0.1
946 | find-up: 5.0.0
947 | glob-parent: 6.0.2
948 | globals: 13.24.0
949 | graphemer: 1.4.0
950 | ignore: 5.3.1
951 | imurmurhash: 0.1.4
952 | is-glob: 4.0.3
953 | is-path-inside: 3.0.3
954 | js-yaml: 4.1.0
955 | json-stable-stringify-without-jsonify: 1.0.1
956 | levn: 0.4.1
957 | lodash.merge: 4.6.2
958 | minimatch: 3.1.2
959 | natural-compare: 1.4.0
960 | optionator: 0.9.4
961 | strip-ansi: 6.0.1
962 | text-table: 0.2.0
963 | transitivePeerDependencies:
964 | - supports-color
965 | dev: true
966 |
967 | /espree@9.6.1:
968 | resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
969 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
970 | dependencies:
971 | acorn: 8.12.0
972 | acorn-jsx: 5.3.2(acorn@8.12.0)
973 | eslint-visitor-keys: 3.4.3
974 | dev: true
975 |
976 | /esquery@1.5.0:
977 | resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==}
978 | engines: {node: '>=0.10'}
979 | dependencies:
980 | estraverse: 5.3.0
981 | dev: true
982 |
983 | /esrecurse@4.3.0:
984 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
985 | engines: {node: '>=4.0'}
986 | dependencies:
987 | estraverse: 5.3.0
988 | dev: true
989 |
990 | /estraverse@5.3.0:
991 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
992 | engines: {node: '>=4.0'}
993 | dev: true
994 |
995 | /estree-walker@2.0.2:
996 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
997 | dev: true
998 |
999 | /esutils@2.0.3:
1000 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
1001 | engines: {node: '>=0.10.0'}
1002 | dev: true
1003 |
1004 | /fast-deep-equal@3.1.3:
1005 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
1006 | dev: true
1007 |
1008 | /fast-diff@1.3.0:
1009 | resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==}
1010 | dev: true
1011 |
1012 | /fast-glob@3.3.2:
1013 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
1014 | engines: {node: '>=8.6.0'}
1015 | dependencies:
1016 | '@nodelib/fs.stat': 2.0.5
1017 | '@nodelib/fs.walk': 1.2.8
1018 | glob-parent: 5.1.2
1019 | merge2: 1.4.1
1020 | micromatch: 4.0.7
1021 |
1022 | /fast-json-stable-stringify@2.1.0:
1023 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
1024 | dev: true
1025 |
1026 | /fast-levenshtein@2.0.6:
1027 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
1028 | dev: true
1029 |
1030 | /fastq@1.17.1:
1031 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
1032 | dependencies:
1033 | reusify: 1.0.4
1034 |
1035 | /file-entry-cache@6.0.1:
1036 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
1037 | engines: {node: ^10.12.0 || >=12.0.0}
1038 | dependencies:
1039 | flat-cache: 3.2.0
1040 | dev: true
1041 |
1042 | /fill-range@7.1.1:
1043 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
1044 | engines: {node: '>=8'}
1045 | dependencies:
1046 | to-regex-range: 5.0.1
1047 |
1048 | /find-up@5.0.0:
1049 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
1050 | engines: {node: '>=10'}
1051 | dependencies:
1052 | locate-path: 6.0.0
1053 | path-exists: 4.0.0
1054 | dev: true
1055 |
1056 | /flat-cache@3.2.0:
1057 | resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==}
1058 | engines: {node: ^10.12.0 || >=12.0.0}
1059 | dependencies:
1060 | flatted: 3.3.1
1061 | keyv: 4.5.4
1062 | rimraf: 3.0.2
1063 | dev: true
1064 |
1065 | /flatted@3.3.1:
1066 | resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==}
1067 | dev: true
1068 |
1069 | /foreground-child@3.2.1:
1070 | resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==}
1071 | engines: {node: '>=14'}
1072 | dependencies:
1073 | cross-spawn: 7.0.3
1074 | signal-exit: 4.1.0
1075 | dev: true
1076 |
1077 | /fs.realpath@1.0.0:
1078 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
1079 | dev: true
1080 |
1081 | /fsevents@2.3.3:
1082 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
1083 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
1084 | os: [darwin]
1085 | requiresBuild: true
1086 | dev: true
1087 | optional: true
1088 |
1089 | /function-bind@1.1.2:
1090 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
1091 | dev: true
1092 |
1093 | /glob-parent@5.1.2:
1094 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
1095 | engines: {node: '>= 6'}
1096 | dependencies:
1097 | is-glob: 4.0.3
1098 |
1099 | /glob-parent@6.0.2:
1100 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
1101 | engines: {node: '>=10.13.0'}
1102 | dependencies:
1103 | is-glob: 4.0.3
1104 | dev: true
1105 |
1106 | /glob@10.4.2:
1107 | resolution: {integrity: sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==}
1108 | engines: {node: '>=16 || 14 >=14.18'}
1109 | hasBin: true
1110 | dependencies:
1111 | foreground-child: 3.2.1
1112 | jackspeak: 3.4.0
1113 | minimatch: 9.0.4
1114 | minipass: 7.1.2
1115 | package-json-from-dist: 1.0.0
1116 | path-scurry: 1.11.1
1117 | dev: true
1118 |
1119 | /glob@7.2.3:
1120 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
1121 | deprecated: Glob versions prior to v9 are no longer supported
1122 | dependencies:
1123 | fs.realpath: 1.0.0
1124 | inflight: 1.0.6
1125 | inherits: 2.0.4
1126 | minimatch: 3.1.2
1127 | once: 1.4.0
1128 | path-is-absolute: 1.0.1
1129 | dev: true
1130 |
1131 | /globals@13.24.0:
1132 | resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==}
1133 | engines: {node: '>=8'}
1134 | dependencies:
1135 | type-fest: 0.20.2
1136 | dev: true
1137 |
1138 | /globby@11.1.0:
1139 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
1140 | engines: {node: '>=10'}
1141 | dependencies:
1142 | array-union: 2.1.0
1143 | dir-glob: 3.0.1
1144 | fast-glob: 3.3.2
1145 | ignore: 5.3.1
1146 | merge2: 1.4.1
1147 | slash: 3.0.0
1148 | dev: true
1149 |
1150 | /graphemer@1.4.0:
1151 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
1152 | dev: true
1153 |
1154 | /has-flag@3.0.0:
1155 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
1156 | engines: {node: '>=4'}
1157 | requiresBuild: true
1158 | dev: true
1159 | optional: true
1160 |
1161 | /has-flag@4.0.0:
1162 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
1163 | engines: {node: '>=8'}
1164 | dev: true
1165 |
1166 | /hasown@2.0.2:
1167 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
1168 | engines: {node: '>= 0.4'}
1169 | dependencies:
1170 | function-bind: 1.1.2
1171 | dev: true
1172 |
1173 | /ignore@5.3.1:
1174 | resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==}
1175 | engines: {node: '>= 4'}
1176 | dev: true
1177 |
1178 | /import-fresh@3.3.0:
1179 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
1180 | engines: {node: '>=6'}
1181 | dependencies:
1182 | parent-module: 1.0.1
1183 | resolve-from: 4.0.0
1184 | dev: true
1185 |
1186 | /imurmurhash@0.1.4:
1187 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
1188 | engines: {node: '>=0.8.19'}
1189 | dev: true
1190 |
1191 | /inflight@1.0.6:
1192 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
1193 | deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
1194 | dependencies:
1195 | once: 1.4.0
1196 | wrappy: 1.0.2
1197 | dev: true
1198 |
1199 | /inherits@2.0.4:
1200 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
1201 | dev: true
1202 |
1203 | /is-builtin-module@3.2.1:
1204 | resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==}
1205 | engines: {node: '>=6'}
1206 | dependencies:
1207 | builtin-modules: 3.3.0
1208 | dev: true
1209 |
1210 | /is-core-module@2.13.1:
1211 | resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==}
1212 | dependencies:
1213 | hasown: 2.0.2
1214 | dev: true
1215 |
1216 | /is-extglob@2.1.1:
1217 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
1218 | engines: {node: '>=0.10.0'}
1219 |
1220 | /is-fullwidth-code-point@3.0.0:
1221 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
1222 | engines: {node: '>=8'}
1223 | dev: true
1224 |
1225 | /is-glob@4.0.3:
1226 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
1227 | engines: {node: '>=0.10.0'}
1228 | dependencies:
1229 | is-extglob: 2.1.1
1230 |
1231 | /is-module@1.0.0:
1232 | resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==}
1233 | dev: true
1234 |
1235 | /is-number@7.0.0:
1236 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
1237 | engines: {node: '>=0.12.0'}
1238 |
1239 | /is-path-inside@3.0.3:
1240 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
1241 | engines: {node: '>=8'}
1242 | dev: true
1243 |
1244 | /is-reference@1.2.1:
1245 | resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==}
1246 | dependencies:
1247 | '@types/estree': 1.0.5
1248 | dev: true
1249 |
1250 | /isexe@2.0.0:
1251 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
1252 | dev: true
1253 |
1254 | /jackspeak@3.4.0:
1255 | resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==}
1256 | engines: {node: '>=14'}
1257 | dependencies:
1258 | '@isaacs/cliui': 8.0.2
1259 | optionalDependencies:
1260 | '@pkgjs/parseargs': 0.11.0
1261 | dev: true
1262 |
1263 | /js-tokens@4.0.0:
1264 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
1265 | requiresBuild: true
1266 | dev: true
1267 | optional: true
1268 |
1269 | /js-yaml@4.1.0:
1270 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
1271 | hasBin: true
1272 | dependencies:
1273 | argparse: 2.0.1
1274 | dev: true
1275 |
1276 | /json-buffer@3.0.1:
1277 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
1278 | dev: true
1279 |
1280 | /json-schema-traverse@0.4.1:
1281 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
1282 | dev: true
1283 |
1284 | /json-stable-stringify-without-jsonify@1.0.1:
1285 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
1286 | dev: true
1287 |
1288 | /keyv@4.5.4:
1289 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
1290 | dependencies:
1291 | json-buffer: 3.0.1
1292 | dev: true
1293 |
1294 | /levn@0.4.1:
1295 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
1296 | engines: {node: '>= 0.8.0'}
1297 | dependencies:
1298 | prelude-ls: 1.2.1
1299 | type-check: 0.4.0
1300 | dev: true
1301 |
1302 | /locate-path@6.0.0:
1303 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
1304 | engines: {node: '>=10'}
1305 | dependencies:
1306 | p-locate: 5.0.0
1307 | dev: true
1308 |
1309 | /lodash.merge@4.6.2:
1310 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
1311 | dev: true
1312 |
1313 | /lru-cache@10.2.2:
1314 | resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==}
1315 | engines: {node: 14 || >=16.14}
1316 | dev: true
1317 |
1318 | /magic-string@0.30.10:
1319 | resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==}
1320 | dependencies:
1321 | '@jridgewell/sourcemap-codec': 1.4.15
1322 | dev: true
1323 |
1324 | /merge2@1.4.1:
1325 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
1326 | engines: {node: '>= 8'}
1327 |
1328 | /micromatch@4.0.7:
1329 | resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==}
1330 | engines: {node: '>=8.6'}
1331 | dependencies:
1332 | braces: 3.0.3
1333 | picomatch: 2.3.1
1334 |
1335 | /minimatch@3.1.2:
1336 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
1337 | dependencies:
1338 | brace-expansion: 1.1.11
1339 | dev: true
1340 |
1341 | /minimatch@9.0.4:
1342 | resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==}
1343 | engines: {node: '>=16 || 14 >=14.17'}
1344 | dependencies:
1345 | brace-expansion: 2.0.1
1346 | dev: true
1347 |
1348 | /minipass@7.1.2:
1349 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
1350 | engines: {node: '>=16 || 14 >=14.17'}
1351 | dev: true
1352 |
1353 | /ms@2.1.2:
1354 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
1355 | dev: true
1356 |
1357 | /natural-compare@1.4.0:
1358 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
1359 | dev: true
1360 |
1361 | /once@1.4.0:
1362 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
1363 | dependencies:
1364 | wrappy: 1.0.2
1365 | dev: true
1366 |
1367 | /optionator@0.9.4:
1368 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
1369 | engines: {node: '>= 0.8.0'}
1370 | dependencies:
1371 | deep-is: 0.1.4
1372 | fast-levenshtein: 2.0.6
1373 | levn: 0.4.1
1374 | prelude-ls: 1.2.1
1375 | type-check: 0.4.0
1376 | word-wrap: 1.2.5
1377 | dev: true
1378 |
1379 | /p-limit@3.1.0:
1380 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
1381 | engines: {node: '>=10'}
1382 | dependencies:
1383 | yocto-queue: 0.1.0
1384 | dev: true
1385 |
1386 | /p-locate@5.0.0:
1387 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
1388 | engines: {node: '>=10'}
1389 | dependencies:
1390 | p-limit: 3.1.0
1391 | dev: true
1392 |
1393 | /package-json-from-dist@1.0.0:
1394 | resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==}
1395 | dev: true
1396 |
1397 | /parent-module@1.0.1:
1398 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
1399 | engines: {node: '>=6'}
1400 | dependencies:
1401 | callsites: 3.1.0
1402 | dev: true
1403 |
1404 | /path-exists@4.0.0:
1405 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
1406 | engines: {node: '>=8'}
1407 | dev: true
1408 |
1409 | /path-is-absolute@1.0.1:
1410 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
1411 | engines: {node: '>=0.10.0'}
1412 | dev: true
1413 |
1414 | /path-key@3.1.1:
1415 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
1416 | engines: {node: '>=8'}
1417 | dev: true
1418 |
1419 | /path-parse@1.0.7:
1420 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
1421 | dev: true
1422 |
1423 | /path-scurry@1.11.1:
1424 | resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
1425 | engines: {node: '>=16 || 14 >=14.18'}
1426 | dependencies:
1427 | lru-cache: 10.2.2
1428 | minipass: 7.1.2
1429 | dev: true
1430 |
1431 | /path-type@4.0.0:
1432 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
1433 | engines: {node: '>=8'}
1434 | dev: true
1435 |
1436 | /picocolors@1.0.1:
1437 | resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==}
1438 |
1439 | /picomatch@2.3.1:
1440 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
1441 | engines: {node: '>=8.6'}
1442 |
1443 | /prelude-ls@1.2.1:
1444 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
1445 | engines: {node: '>= 0.8.0'}
1446 | dev: true
1447 |
1448 | /prettier-linter-helpers@1.0.0:
1449 | resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==}
1450 | engines: {node: '>=6.0.0'}
1451 | dependencies:
1452 | fast-diff: 1.3.0
1453 | dev: true
1454 |
1455 | /prettier@3.3.2:
1456 | resolution: {integrity: sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==}
1457 | engines: {node: '>=14'}
1458 | hasBin: true
1459 | dev: true
1460 |
1461 | /punycode@2.3.1:
1462 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
1463 | engines: {node: '>=6'}
1464 | dev: true
1465 |
1466 | /queue-microtask@1.2.3:
1467 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
1468 |
1469 | /resolve-from@4.0.0:
1470 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
1471 | engines: {node: '>=4'}
1472 | dev: true
1473 |
1474 | /resolve@1.22.8:
1475 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
1476 | hasBin: true
1477 | dependencies:
1478 | is-core-module: 2.13.1
1479 | path-parse: 1.0.7
1480 | supports-preserve-symlinks-flag: 1.0.0
1481 | dev: true
1482 |
1483 | /reusify@1.0.4:
1484 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
1485 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
1486 |
1487 | /rimraf@3.0.2:
1488 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
1489 | deprecated: Rimraf versions prior to v4 are no longer supported
1490 | hasBin: true
1491 | dependencies:
1492 | glob: 7.2.3
1493 | dev: true
1494 |
1495 | /rollup-plugin-dts@6.1.1(rollup@4.18.0)(typescript@5.4.5):
1496 | resolution: {integrity: sha512-aSHRcJ6KG2IHIioYlvAOcEq6U99sVtqDDKVhnwt70rW6tsz3tv5OSjEiWcgzfsHdLyGXZ/3b/7b/+Za3Y6r1XA==}
1497 | engines: {node: '>=16'}
1498 | peerDependencies:
1499 | rollup: ^3.29.4 || ^4
1500 | typescript: ^4.5 || ^5.0
1501 | dependencies:
1502 | magic-string: 0.30.10
1503 | rollup: 4.18.0
1504 | typescript: 5.4.5
1505 | optionalDependencies:
1506 | '@babel/code-frame': 7.24.7
1507 | dev: true
1508 |
1509 | /rollup-plugin-rm@1.0.2(rollup@4.18.0):
1510 | resolution: {integrity: sha512-RSUFFibfkCvIeQrTg7TLs59m6S//qcmDfTNqgQ2Pd9BlABd/q74ymmg5936h0vfnjrFHhale/+f+efgp7deLEg==}
1511 | peerDependencies:
1512 | rollup: ^3.0.0||^4.0.0
1513 | dependencies:
1514 | rollup: 4.18.0
1515 | dev: true
1516 |
1517 | /rollup@4.18.0:
1518 | resolution: {integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==}
1519 | engines: {node: '>=18.0.0', npm: '>=8.0.0'}
1520 | hasBin: true
1521 | dependencies:
1522 | '@types/estree': 1.0.5
1523 | optionalDependencies:
1524 | '@rollup/rollup-android-arm-eabi': 4.18.0
1525 | '@rollup/rollup-android-arm64': 4.18.0
1526 | '@rollup/rollup-darwin-arm64': 4.18.0
1527 | '@rollup/rollup-darwin-x64': 4.18.0
1528 | '@rollup/rollup-linux-arm-gnueabihf': 4.18.0
1529 | '@rollup/rollup-linux-arm-musleabihf': 4.18.0
1530 | '@rollup/rollup-linux-arm64-gnu': 4.18.0
1531 | '@rollup/rollup-linux-arm64-musl': 4.18.0
1532 | '@rollup/rollup-linux-powerpc64le-gnu': 4.18.0
1533 | '@rollup/rollup-linux-riscv64-gnu': 4.18.0
1534 | '@rollup/rollup-linux-s390x-gnu': 4.18.0
1535 | '@rollup/rollup-linux-x64-gnu': 4.18.0
1536 | '@rollup/rollup-linux-x64-musl': 4.18.0
1537 | '@rollup/rollup-win32-arm64-msvc': 4.18.0
1538 | '@rollup/rollup-win32-ia32-msvc': 4.18.0
1539 | '@rollup/rollup-win32-x64-msvc': 4.18.0
1540 | fsevents: 2.3.3
1541 | dev: true
1542 |
1543 | /run-parallel@1.2.0:
1544 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
1545 | dependencies:
1546 | queue-microtask: 1.2.3
1547 |
1548 | /semver@7.6.2:
1549 | resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==}
1550 | engines: {node: '>=10'}
1551 | hasBin: true
1552 | dev: true
1553 |
1554 | /shebang-command@2.0.0:
1555 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
1556 | engines: {node: '>=8'}
1557 | dependencies:
1558 | shebang-regex: 3.0.0
1559 | dev: true
1560 |
1561 | /shebang-regex@3.0.0:
1562 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
1563 | engines: {node: '>=8'}
1564 | dev: true
1565 |
1566 | /signal-exit@4.1.0:
1567 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
1568 | engines: {node: '>=14'}
1569 | dev: true
1570 |
1571 | /slash@3.0.0:
1572 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
1573 | engines: {node: '>=8'}
1574 | dev: true
1575 |
1576 | /string-width@4.2.3:
1577 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
1578 | engines: {node: '>=8'}
1579 | dependencies:
1580 | emoji-regex: 8.0.0
1581 | is-fullwidth-code-point: 3.0.0
1582 | strip-ansi: 6.0.1
1583 | dev: true
1584 |
1585 | /string-width@5.1.2:
1586 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
1587 | engines: {node: '>=12'}
1588 | dependencies:
1589 | eastasianwidth: 0.2.0
1590 | emoji-regex: 9.2.2
1591 | strip-ansi: 7.1.0
1592 | dev: true
1593 |
1594 | /strip-ansi@6.0.1:
1595 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
1596 | engines: {node: '>=8'}
1597 | dependencies:
1598 | ansi-regex: 5.0.1
1599 | dev: true
1600 |
1601 | /strip-ansi@7.1.0:
1602 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
1603 | engines: {node: '>=12'}
1604 | dependencies:
1605 | ansi-regex: 6.0.1
1606 | dev: true
1607 |
1608 | /strip-json-comments@3.1.1:
1609 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
1610 | engines: {node: '>=8'}
1611 | dev: true
1612 |
1613 | /supports-color@5.5.0:
1614 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
1615 | engines: {node: '>=4'}
1616 | requiresBuild: true
1617 | dependencies:
1618 | has-flag: 3.0.0
1619 | dev: true
1620 | optional: true
1621 |
1622 | /supports-color@7.2.0:
1623 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
1624 | engines: {node: '>=8'}
1625 | dependencies:
1626 | has-flag: 4.0.0
1627 | dev: true
1628 |
1629 | /supports-preserve-symlinks-flag@1.0.0:
1630 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
1631 | engines: {node: '>= 0.4'}
1632 | dev: true
1633 |
1634 | /synckit@0.8.8:
1635 | resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==}
1636 | engines: {node: ^14.18.0 || >=16.0.0}
1637 | dependencies:
1638 | '@pkgr/core': 0.1.1
1639 | tslib: 2.6.3
1640 | dev: true
1641 |
1642 | /text-table@0.2.0:
1643 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
1644 | dev: true
1645 |
1646 | /to-regex-range@5.0.1:
1647 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
1648 | engines: {node: '>=8.0'}
1649 | dependencies:
1650 | is-number: 7.0.0
1651 |
1652 | /ts-api-utils@1.3.0(typescript@5.4.5):
1653 | resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==}
1654 | engines: {node: '>=16'}
1655 | peerDependencies:
1656 | typescript: '>=4.2.0'
1657 | dependencies:
1658 | typescript: 5.4.5
1659 | dev: true
1660 |
1661 | /tslib@2.6.3:
1662 | resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==}
1663 | dev: true
1664 |
1665 | /type-check@0.4.0:
1666 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
1667 | engines: {node: '>= 0.8.0'}
1668 | dependencies:
1669 | prelude-ls: 1.2.1
1670 | dev: true
1671 |
1672 | /type-fest@0.20.2:
1673 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
1674 | engines: {node: '>=10'}
1675 | dev: true
1676 |
1677 | /typescript@5.4.5:
1678 | resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==}
1679 | engines: {node: '>=14.17'}
1680 | hasBin: true
1681 | dev: true
1682 |
1683 | /undici-types@5.26.5:
1684 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
1685 | dev: true
1686 |
1687 | /uri-js@4.4.1:
1688 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
1689 | dependencies:
1690 | punycode: 2.3.1
1691 | dev: true
1692 |
1693 | /which@2.0.2:
1694 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
1695 | engines: {node: '>= 8'}
1696 | hasBin: true
1697 | dependencies:
1698 | isexe: 2.0.0
1699 | dev: true
1700 |
1701 | /word-wrap@1.2.5:
1702 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
1703 | engines: {node: '>=0.10.0'}
1704 | dev: true
1705 |
1706 | /wrap-ansi@7.0.0:
1707 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
1708 | engines: {node: '>=10'}
1709 | dependencies:
1710 | ansi-styles: 4.3.0
1711 | string-width: 4.2.3
1712 | strip-ansi: 6.0.1
1713 | dev: true
1714 |
1715 | /wrap-ansi@8.1.0:
1716 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
1717 | engines: {node: '>=12'}
1718 | dependencies:
1719 | ansi-styles: 6.2.1
1720 | string-width: 5.1.2
1721 | strip-ansi: 7.1.0
1722 | dev: true
1723 |
1724 | /wrappy@1.0.2:
1725 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
1726 | dev: true
1727 |
1728 | /yocto-queue@0.1.0:
1729 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
1730 | engines: {node: '>=10'}
1731 | dev: true
1732 |
--------------------------------------------------------------------------------
/rollup.config.ts:
--------------------------------------------------------------------------------
1 | import { createRequire } from 'node:module'
2 | import { defineConfig } from 'rollup'
3 | import resolve from '@rollup/plugin-node-resolve'
4 | import commonjs from '@rollup/plugin-commonjs'
5 | import ts from '@rollup/plugin-typescript'
6 | import json from '@rollup/plugin-json'
7 | import dts from 'rollup-plugin-dts'
8 | import rm from 'rollup-plugin-rm'
9 |
10 | const require = createRequire(import.meta.url)
11 | const pkg = require('./package.json')
12 |
13 | export default defineConfig([
14 | {
15 | input: 'src/index.ts',
16 | output: [
17 | { file: pkg.main, format: 'cjs' },
18 | { file: pkg.module, format: 'es' }
19 | ],
20 | external: [...Object.keys(pkg.dependencies || {})],
21 | plugins: [
22 | rm('dist', 'buildStart'),
23 | resolve(),
24 | commonjs(),
25 | ts({
26 | compilerOptions: {
27 | rootDir: 'src',
28 | declaration: true,
29 | outDir: 'dist/types'
30 | }
31 | })
32 | ]
33 | },
34 | {
35 | input: 'src/cli.ts',
36 | output: [{ file: 'dist/cli.js', format: 'cjs' }],
37 | external: [...Object.keys(pkg.dependencies || {})],
38 | plugins: [json(), resolve(), commonjs(), ts()]
39 | },
40 | {
41 | input: 'dist/types/index.d.ts',
42 | output: [{ file: pkg.types, format: 'es' }],
43 | plugins: [dts(), rm('dist/types', 'buildEnd')]
44 | }
45 | ])
46 |
--------------------------------------------------------------------------------
/screenshots/after.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/alex8088/shadowizer/d85dafa5cc77989aa576b0897aa9fba093a65ecd/screenshots/after.png
--------------------------------------------------------------------------------
/screenshots/before.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/alex8088/shadowizer/d85dafa5cc77989aa576b0897aa9fba093a65ecd/screenshots/before.jpg
--------------------------------------------------------------------------------
/src/cli.ts:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 |
3 | import fs from 'node:fs/promises'
4 | import { join, resolve } from 'node:path'
5 | import { glob } from 'fast-glob'
6 | import { cac } from 'cac'
7 | import colors from 'picocolors'
8 |
9 | import { version } from '../package.json'
10 | import { saveShadowImage } from './index'
11 |
12 | import type { ShadowOptions } from './types'
13 |
14 | const cli = cac('shadowizer')
15 |
16 | type CLIOptions = {
17 | f?: string[]
18 | files?: string[]
19 | c?: string
20 | shadowColor?: string
21 | b?: number
22 | shadowBlur?: number
23 | x?: number
24 | shadowOffsetX?: number
25 | y?: number
26 | shadowOffsetY?: number
27 | }
28 |
29 | cli.option(
30 | '-f, --files [...files]',
31 | `[string[]] specify images, support glob patterns, default: *.{png,jpg,jpeg,webp}`
32 | )
33 | cli.option(
34 | '-c, --shadowColor ',
35 | `[string] set shadow color, default: #00000073`
36 | )
37 | cli.option(
38 | '-b, --shadowBlur ',
39 | `[number] set shadow blur, default: 25`
40 | )
41 | cli.option(
42 | '-x, --shadowOffsetX ',
43 | `[number] set shadow offset x, default: 0`
44 | )
45 | cli.option(
46 | '-y, --shadowOffsetY ',
47 | `[number] set shadow offset y, default: 0`
48 | )
49 |
50 | cli
51 | .command('[root]', 'find images and add a box shadow to them')
52 | .action(async (root: string, options: CLIOptions) => {
53 | const dir = root ? resolve(root) : process.cwd()
54 |
55 | const { files, shadowColor, shadowBlur, shadowOffsetX, shadowOffsetY } =
56 | options
57 |
58 | const images = await glob(files || ['*.{png,webp,jpg,jpeg}'], {
59 | deep: 0,
60 | onlyFiles: true,
61 | cwd: dir
62 | })
63 |
64 | if (images.length === 0) {
65 | console.log()
66 | console.log(
67 | colors.bold(`${colors.green('✓')} Found ${colors.cyan(0)} images`)
68 | )
69 | console.log()
70 | return
71 | }
72 |
73 | const shadowOptions: ShadowOptions = {
74 | color: shadowColor,
75 | blur: shadowBlur,
76 | offsetX: shadowOffsetX,
77 | offsetY: shadowOffsetY
78 | }
79 |
80 | const outDir = join(dir, `shadowizer-${+new Date()}`)
81 | await fs.mkdir(outDir)
82 |
83 | console.log()
84 |
85 | let count = 0
86 | let added = 0
87 | for (let i = 0; i < images.length; i++) {
88 | const image = images[i]
89 | try {
90 | const su = await saveShadowImage(
91 | join(dir, image),
92 | outDir,
93 | shadowOptions
94 | )
95 | if (su) {
96 | count += 1
97 | added += 1
98 | } else {
99 | console.log(
100 | `${colors.cyan('●')} ${image} > ${colors.yellow('Not an image')}\n`
101 | )
102 | }
103 | } catch (err) {
104 | count += 1
105 | console.log(
106 | `${colors.cyan('●')} ${image} > ${colors.red((err as Error).message)}\n`
107 | )
108 | }
109 | }
110 |
111 | console.log(
112 | colors.bold(
113 | `${colors.green('✓')} Found ${colors.cyan(count)} images, ${colors.cyan(added)} added`
114 | )
115 | )
116 | console.log()
117 | })
118 |
119 | cli.help()
120 | cli.version(version)
121 |
122 | cli.parse()
123 |
--------------------------------------------------------------------------------
/src/index.ts:
--------------------------------------------------------------------------------
1 | import fs from 'node:fs/promises'
2 | import { join, basename, extname } from 'node:path'
3 | import { createCanvas, loadImage } from '@napi-rs/canvas'
4 |
5 | import type { ShadowOptions } from './types'
6 |
7 | export * from './types'
8 |
9 | export async function addShadow(
10 | imagePath: string,
11 | shadow?: ShadowOptions
12 | ): Promise {
13 | const {
14 | color = '#00000073',
15 | blur = 25,
16 | offsetX = 0,
17 | offsetY = 0
18 | } = shadow || {}
19 |
20 | const maxSize = Math.max(blur, offsetX, offsetY)
21 |
22 | const margin = Math.floor(maxSize / 5)
23 |
24 | const shadowAreaSize = maxSize + margin
25 |
26 | const ext = extname(imagePath).replace('.', '')
27 |
28 | if (ext === 'png' || ext === 'jpg' || ext === 'jpeg' || ext === 'webp') {
29 | const image = await loadImage(imagePath)
30 |
31 | const { height, width } = image
32 |
33 | const canvas = createCanvas(
34 | width + shadowAreaSize * 2,
35 | height + shadowAreaSize * 2
36 | )
37 |
38 | const ctx = canvas.getContext('2d')
39 |
40 | ctx.shadowColor = color
41 | ctx.shadowBlur = blur
42 | ctx.shadowOffsetX = offsetX
43 | ctx.shadowOffsetY = offsetY
44 |
45 | const dx = shadowAreaSize
46 | const dy = shadowAreaSize
47 |
48 | ctx.drawImage(image, dx, dy, width, height)
49 |
50 | return canvas.encode('png')
51 | }
52 | }
53 |
54 | export async function saveShadowImage(
55 | imagePath: string,
56 | outDir: string = process.cwd(),
57 | shadow?: ShadowOptions
58 | ): Promise {
59 | const buffer = await addShadow(imagePath, shadow)
60 |
61 | if (buffer) {
62 | await fs.writeFile(
63 | join(outDir, basename(imagePath, extname(imagePath)) + '.png'),
64 | buffer
65 | )
66 | return true
67 | }
68 |
69 | return false
70 | }
71 |
--------------------------------------------------------------------------------
/src/types.ts:
--------------------------------------------------------------------------------
1 | export type ShadowOptions = {
2 | color?: string
3 | blur?: number
4 | offsetX?: number
5 | offsetY?: number
6 | }
7 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "esnext",
4 | "module": "esnext",
5 | "lib": ["esnext"],
6 | "sourceMap": false,
7 | "strict": true,
8 | "allowJs": true,
9 | "esModuleInterop": true,
10 | "moduleResolution": "Bundler",
11 | "resolveJsonModule": true,
12 | "forceConsistentCasingInFileNames": true,
13 | "skipLibCheck": true,
14 | "noUnusedLocals": true,
15 | "noUnusedParameters": true,
16 | "noImplicitAny": false,
17 | "noImplicitReturns": true
18 | },
19 | "include": ["src", "rollup.config.ts"]
20 | }
21 |
--------------------------------------------------------------------------------