├── .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 | license 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 | --------------------------------------------------------------------------------