├── .editorconfig ├── .github ├── dependabot.yaml └── workflows │ ├── ci.yaml │ ├── coverage.yaml │ ├── dependabot-automerge-yaml │ └── release.yaml ├── .gitignore ├── .vscode ├── extension.json └── settings.json ├── LICENSE ├── README.md ├── biome.json ├── package-lock.json ├── package.json ├── renovate.json ├── src ├── convert-dom-to-markdown.ts ├── html-to-markdown-parser.ts ├── index.ts ├── marks.ts ├── options.ts └── utils.ts ├── test ├── marks │ ├── code.test.ts │ ├── heading.test.ts │ ├── horizontalRule.test.ts │ ├── image.test.ts │ ├── list.test.ts │ ├── options.ts │ ├── table.test.ts │ └── text.test.ts └── rich-editor-to-markdown-perser.test.ts ├── tsconfig.json ├── tsup.config.ts └── vitest.config.ts /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig is awesome: http://EditorConfig.org 2 | 3 | # top-most EditorConfig file 4 | root = true 5 | 6 | # Unix-style newlines with a newline ending every file 7 | [*] 8 | end_of_line = lf 9 | insert_final_newline = true 10 | 11 | 12 | # Matches multiple files with brace expansion notation 13 | # Set default charset 14 | [*.{js,jsx,ts,tsx,html,sass,scss,css,json}] 15 | charset = utf-8 16 | indent_style = space 17 | indent_size = 2 18 | trim_trailing_whitespace = true -------------------------------------------------------------------------------- /.github/dependabot.yaml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: npm 4 | directory: "/" 5 | schedule: 6 | interval: weekly 7 | time: "10:00" 8 | timezone: Asia/Tokyo 9 | open-pull-requests-limit: 10 10 | target-branch: main 11 | ignore: 12 | - dependency-name: '*' 13 | update-types: ['version-update:semver-patch'] -------------------------------------------------------------------------------- /.github/workflows/ci.yaml: -------------------------------------------------------------------------------- 1 | name: Node.js CI 2 | 3 | on: 4 | push: 5 | branches: ['main'] 6 | pull_request: 7 | branches: ['main'] 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | 13 | strategy: 14 | matrix: 15 | node-version: [ '18.x', '20.x', '22.x' ] 16 | 17 | steps: 18 | - uses: actions/checkout@v3 19 | - name: Use Node.js ${{ matrix.node-version }} 20 | uses: actions/setup-node@v3 21 | with: 22 | node-version: ${{ matrix.node-version }} 23 | cache: 'npm' 24 | - run: npm ci 25 | - run: npm run build 26 | - run: npm run lint 27 | - run: npm run test -------------------------------------------------------------------------------- /.github/workflows/coverage.yaml: -------------------------------------------------------------------------------- 1 | name: 'Vitest coverage test' 2 | on: 3 | pull_request: 4 | 5 | jobs: 6 | test: 7 | runs-on: ubuntu-latest 8 | 9 | permissions: 10 | contents: read 11 | pull-requests: write 12 | 13 | steps: 14 | - uses: actions/checkout@v4 15 | - name: 'Install Node' 16 | uses: actions/setup-node@v4 17 | with: 18 | node-version: '20.x' 19 | - name: 'Install Deps' 20 | run: npm install 21 | - name: 'Vitest run coverage test' 22 | run: npx vitest --coverage.enabled true 23 | - name: 'Report Coverage' 24 | if: always() 25 | uses: davelosert/vitest-coverage-report-action@v2 -------------------------------------------------------------------------------- /.github/workflows/dependabot-automerge-yaml: -------------------------------------------------------------------------------- 1 | name: Dependabot automation 2 | on: pull_request_target 3 | 4 | permissions: 5 | contents: write 6 | pull-requests: write 7 | 8 | jobs: 9 | dependabot: 10 | runs-on: ubuntu-latest 11 | if: ${{ github.actor == 'dependabot[bot]' }} 12 | steps: 13 | - name: Dependabot metadata 14 | id: metadata 15 | uses: dependabot/fetch-metadata@v2.2.0 16 | with: 17 | github-token: '${{ secrets.GITHUB_TOKEN }}' 18 | - name: Enable auto-merge for Dependabot PRs 19 | if: steps.metadata.outputs.dependency-type == 'direct:development' && steps.metadata.outputs.update-type == 'version-update:semver-minor' 20 | run: | 21 | gh pr review --approve "$PR_URL" 22 | gh pr edit "$PR_URL" --add-label "auto merge" 23 | gh pr merge --auto --merge "$PR_URL" 24 | env: 25 | PR_URL: ${{github.event.pull_request.html_url}} 26 | GH_TOKEN: ${{secrets.GITHUB_TOKEN}} -------------------------------------------------------------------------------- /.github/workflows/release.yaml: -------------------------------------------------------------------------------- 1 | name: release 2 | 3 | on: 4 | push: 5 | tags: 6 | - 'v*' 7 | 8 | jobs: 9 | build: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v2 13 | - uses: actions/setup-node@v1 14 | with: 15 | node-version: '22.x' 16 | registry-url: 'https://registry.npmjs.org' 17 | - name: release on npm 18 | run: | 19 | npm ci 20 | npm run lint 21 | npm run test 22 | npm run build 23 | - run: npm publish 24 | env: 25 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} 26 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | coverage -------------------------------------------------------------------------------- /.vscode/extension.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "biomejs.biome" 4 | ] 5 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.defaultFormatter": "biomejs.biome", 3 | "editor.formatOnSave": true, 4 | "editor.codeActionsOnSave": { 5 | "source.organizeImports.biome": "explicit" 6 | } 7 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2023 hiro08 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # rich-editor-to-markdown-parser 2 | 3 | Convert microCMS Rich Editor response to Markdown. 4 | 5 | rich-editor-to-markdown-parser image 6 | 7 | ## Installation 8 | 9 | ``` 10 | npm install rich-editor-to-markdown-parser 11 | ``` 12 | 13 | ## Usage 14 | 15 | ```js 16 | import { parser } from "rich-editor-to-markdown-parser"; 17 | 18 | const html = 19 | '

Hello World!

This html string is convertinto markdown.

'; 20 | 21 | parser(html); // # Hello World!\n\nThis **html** string is ~~convert~~ into [markdown.](https://exampe.com) 22 | ``` 23 | 24 | ※ Unsupported HTML tags are parsed as strings. When converting markdown to HTML, consider sanitizing it using [DOMPurify](https://github.com/cure53/DOMPurify) or [sanitize-html](https://github.com/apostrophecms/sanitize-html). 25 | 26 | ## HTML list 27 | 28 | | HTML | Description | 29 | | --------------- | --------------------- | 30 | | Heading | | 31 | | Bold | | 32 | | Italic | | 33 | | Underline | Parsed with HTML tags | 34 | | Strike | | 35 | | Code | | 36 | | TextAlign | Not supported | 37 | | Horizontal Rule | | 38 | | Blockquote | | 39 | | CodeBlock | | 40 | | Table | | 41 | | ListBullet | | 42 | | ListOrdered | | 43 | | Link | | 44 | | Image | | 45 | | Embed | Not supported | 46 | | Custom class | Parsed with HTML tags | 47 | 48 | ## Options 49 | 50 | | Option | Description | Defualt | 51 | | ---------------- | ------------------------------------------------------ | ------- | 52 | | image.size | Contain width and height image size. ex) ?w=1200&h=630 | true | 53 | | image.query | Add image query in markdown. ex) ?format=webp | '' | 54 | | markStyle.strong | \*\* or \_\_ | \*\* | 55 | | markStyle.em | \* or \_ | \* | 56 | | markStyle.li | - or \* or + | - | 57 | | markStyle.hr | --- or \*\*\* or \_\_\_ | --- | 58 | | markStyle.pre | ``` or ~~~ | ``` | 59 | 60 | ## Development 61 | 62 | First, install npm dependencies. 63 | 64 | ```bash 65 | npm install 66 | ``` 67 | 68 | Running unit test. This library uses vitest. 69 | 70 | ```bash 71 | npm run test 72 | ``` 73 | 74 | Build modules. 75 | 76 | ```bash 77 | npm run build 78 | ``` 79 | 80 | ## License 81 | 82 | MIT License.© [hiro08gh](https://github.com/hiro08gh) 83 | -------------------------------------------------------------------------------- /biome.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", 3 | "organizeImports": { 4 | "enabled": true 5 | }, 6 | "linter": { 7 | "enabled": true, 8 | "rules": { 9 | "recommended": true 10 | }, 11 | "ignore": [ 12 | "dist" 13 | ] 14 | } 15 | } -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "rich-editor-to-markdown-parser", 3 | "version": "1.2.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "rich-editor-to-markdown-parser", 9 | "version": "1.2.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "html-dom-parser": "^5.0.13" 13 | }, 14 | "devDependencies": { 15 | "@biomejs/biome": "1.9.4", 16 | "@vitest/coverage-v8": "^3.0.7", 17 | "prettier": "^3.5.2", 18 | "tsup": "^8.4.0", 19 | "typescript": "^5.7.3", 20 | "vitest": "^3.0.7" 21 | } 22 | }, 23 | "node_modules/@ampproject/remapping": { 24 | "version": "2.3.0", 25 | "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", 26 | "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", 27 | "dev": true, 28 | "license": "Apache-2.0", 29 | "dependencies": { 30 | "@jridgewell/gen-mapping": "^0.3.5", 31 | "@jridgewell/trace-mapping": "^0.3.24" 32 | }, 33 | "engines": { 34 | "node": ">=6.0.0" 35 | } 36 | }, 37 | "node_modules/@babel/helper-string-parser": { 38 | "version": "7.24.8", 39 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", 40 | "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", 41 | "dev": true, 42 | "license": "MIT", 43 | "engines": { 44 | "node": ">=6.9.0" 45 | } 46 | }, 47 | "node_modules/@babel/helper-validator-identifier": { 48 | "version": "7.25.9", 49 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", 50 | "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", 51 | "dev": true, 52 | "license": "MIT", 53 | "engines": { 54 | "node": ">=6.9.0" 55 | } 56 | }, 57 | "node_modules/@babel/parser": { 58 | "version": "7.25.6", 59 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", 60 | "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", 61 | "dev": true, 62 | "license": "MIT", 63 | "dependencies": { 64 | "@babel/types": "^7.25.6" 65 | }, 66 | "bin": { 67 | "parser": "bin/babel-parser.js" 68 | }, 69 | "engines": { 70 | "node": ">=6.0.0" 71 | } 72 | }, 73 | "node_modules/@babel/types": { 74 | "version": "7.25.6", 75 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", 76 | "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", 77 | "dev": true, 78 | "license": "MIT", 79 | "dependencies": { 80 | "@babel/helper-string-parser": "^7.24.8", 81 | "@babel/helper-validator-identifier": "^7.24.7", 82 | "to-fast-properties": "^2.0.0" 83 | }, 84 | "engines": { 85 | "node": ">=6.9.0" 86 | } 87 | }, 88 | "node_modules/@bcoe/v8-coverage": { 89 | "version": "1.0.2", 90 | "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", 91 | "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", 92 | "dev": true, 93 | "license": "MIT", 94 | "engines": { 95 | "node": ">=18" 96 | } 97 | }, 98 | "node_modules/@biomejs/biome": { 99 | "version": "1.9.4", 100 | "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.9.4.tgz", 101 | "integrity": "sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==", 102 | "dev": true, 103 | "hasInstallScript": true, 104 | "license": "MIT OR Apache-2.0", 105 | "bin": { 106 | "biome": "bin/biome" 107 | }, 108 | "engines": { 109 | "node": ">=14.21.3" 110 | }, 111 | "funding": { 112 | "type": "opencollective", 113 | "url": "https://opencollective.com/biome" 114 | }, 115 | "optionalDependencies": { 116 | "@biomejs/cli-darwin-arm64": "1.9.4", 117 | "@biomejs/cli-darwin-x64": "1.9.4", 118 | "@biomejs/cli-linux-arm64": "1.9.4", 119 | "@biomejs/cli-linux-arm64-musl": "1.9.4", 120 | "@biomejs/cli-linux-x64": "1.9.4", 121 | "@biomejs/cli-linux-x64-musl": "1.9.4", 122 | "@biomejs/cli-win32-arm64": "1.9.4", 123 | "@biomejs/cli-win32-x64": "1.9.4" 124 | } 125 | }, 126 | "node_modules/@biomejs/cli-darwin-arm64": { 127 | "version": "1.9.4", 128 | "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.9.4.tgz", 129 | "integrity": "sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==", 130 | "cpu": [ 131 | "arm64" 132 | ], 133 | "dev": true, 134 | "license": "MIT OR Apache-2.0", 135 | "optional": true, 136 | "os": [ 137 | "darwin" 138 | ], 139 | "engines": { 140 | "node": ">=14.21.3" 141 | } 142 | }, 143 | "node_modules/@biomejs/cli-darwin-x64": { 144 | "version": "1.9.4", 145 | "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.9.4.tgz", 146 | "integrity": "sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==", 147 | "cpu": [ 148 | "x64" 149 | ], 150 | "dev": true, 151 | "license": "MIT OR Apache-2.0", 152 | "optional": true, 153 | "os": [ 154 | "darwin" 155 | ], 156 | "engines": { 157 | "node": ">=14.21.3" 158 | } 159 | }, 160 | "node_modules/@biomejs/cli-linux-arm64": { 161 | "version": "1.9.4", 162 | "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.9.4.tgz", 163 | "integrity": "sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==", 164 | "cpu": [ 165 | "arm64" 166 | ], 167 | "dev": true, 168 | "license": "MIT OR Apache-2.0", 169 | "optional": true, 170 | "os": [ 171 | "linux" 172 | ], 173 | "engines": { 174 | "node": ">=14.21.3" 175 | } 176 | }, 177 | "node_modules/@biomejs/cli-linux-arm64-musl": { 178 | "version": "1.9.4", 179 | "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.9.4.tgz", 180 | "integrity": "sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==", 181 | "cpu": [ 182 | "arm64" 183 | ], 184 | "dev": true, 185 | "license": "MIT OR Apache-2.0", 186 | "optional": true, 187 | "os": [ 188 | "linux" 189 | ], 190 | "engines": { 191 | "node": ">=14.21.3" 192 | } 193 | }, 194 | "node_modules/@biomejs/cli-linux-x64": { 195 | "version": "1.9.4", 196 | "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.9.4.tgz", 197 | "integrity": "sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==", 198 | "cpu": [ 199 | "x64" 200 | ], 201 | "dev": true, 202 | "license": "MIT OR Apache-2.0", 203 | "optional": true, 204 | "os": [ 205 | "linux" 206 | ], 207 | "engines": { 208 | "node": ">=14.21.3" 209 | } 210 | }, 211 | "node_modules/@biomejs/cli-linux-x64-musl": { 212 | "version": "1.9.4", 213 | "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.9.4.tgz", 214 | "integrity": "sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==", 215 | "cpu": [ 216 | "x64" 217 | ], 218 | "dev": true, 219 | "license": "MIT OR Apache-2.0", 220 | "optional": true, 221 | "os": [ 222 | "linux" 223 | ], 224 | "engines": { 225 | "node": ">=14.21.3" 226 | } 227 | }, 228 | "node_modules/@biomejs/cli-win32-arm64": { 229 | "version": "1.9.4", 230 | "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.9.4.tgz", 231 | "integrity": "sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==", 232 | "cpu": [ 233 | "arm64" 234 | ], 235 | "dev": true, 236 | "license": "MIT OR Apache-2.0", 237 | "optional": true, 238 | "os": [ 239 | "win32" 240 | ], 241 | "engines": { 242 | "node": ">=14.21.3" 243 | } 244 | }, 245 | "node_modules/@biomejs/cli-win32-x64": { 246 | "version": "1.9.4", 247 | "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.9.4.tgz", 248 | "integrity": "sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==", 249 | "cpu": [ 250 | "x64" 251 | ], 252 | "dev": true, 253 | "license": "MIT OR Apache-2.0", 254 | "optional": true, 255 | "os": [ 256 | "win32" 257 | ], 258 | "engines": { 259 | "node": ">=14.21.3" 260 | } 261 | }, 262 | "node_modules/@esbuild/aix-ppc64": { 263 | "version": "0.25.0", 264 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz", 265 | "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==", 266 | "cpu": [ 267 | "ppc64" 268 | ], 269 | "dev": true, 270 | "license": "MIT", 271 | "optional": true, 272 | "os": [ 273 | "aix" 274 | ], 275 | "engines": { 276 | "node": ">=18" 277 | } 278 | }, 279 | "node_modules/@esbuild/android-arm": { 280 | "version": "0.25.0", 281 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz", 282 | "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==", 283 | "cpu": [ 284 | "arm" 285 | ], 286 | "dev": true, 287 | "license": "MIT", 288 | "optional": true, 289 | "os": [ 290 | "android" 291 | ], 292 | "engines": { 293 | "node": ">=18" 294 | } 295 | }, 296 | "node_modules/@esbuild/android-arm64": { 297 | "version": "0.25.0", 298 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz", 299 | "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==", 300 | "cpu": [ 301 | "arm64" 302 | ], 303 | "dev": true, 304 | "license": "MIT", 305 | "optional": true, 306 | "os": [ 307 | "android" 308 | ], 309 | "engines": { 310 | "node": ">=18" 311 | } 312 | }, 313 | "node_modules/@esbuild/android-x64": { 314 | "version": "0.25.0", 315 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz", 316 | "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==", 317 | "cpu": [ 318 | "x64" 319 | ], 320 | "dev": true, 321 | "license": "MIT", 322 | "optional": true, 323 | "os": [ 324 | "android" 325 | ], 326 | "engines": { 327 | "node": ">=18" 328 | } 329 | }, 330 | "node_modules/@esbuild/darwin-arm64": { 331 | "version": "0.25.0", 332 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz", 333 | "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==", 334 | "cpu": [ 335 | "arm64" 336 | ], 337 | "dev": true, 338 | "license": "MIT", 339 | "optional": true, 340 | "os": [ 341 | "darwin" 342 | ], 343 | "engines": { 344 | "node": ">=18" 345 | } 346 | }, 347 | "node_modules/@esbuild/darwin-x64": { 348 | "version": "0.25.0", 349 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz", 350 | "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==", 351 | "cpu": [ 352 | "x64" 353 | ], 354 | "dev": true, 355 | "license": "MIT", 356 | "optional": true, 357 | "os": [ 358 | "darwin" 359 | ], 360 | "engines": { 361 | "node": ">=18" 362 | } 363 | }, 364 | "node_modules/@esbuild/freebsd-arm64": { 365 | "version": "0.25.0", 366 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz", 367 | "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==", 368 | "cpu": [ 369 | "arm64" 370 | ], 371 | "dev": true, 372 | "license": "MIT", 373 | "optional": true, 374 | "os": [ 375 | "freebsd" 376 | ], 377 | "engines": { 378 | "node": ">=18" 379 | } 380 | }, 381 | "node_modules/@esbuild/freebsd-x64": { 382 | "version": "0.25.0", 383 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz", 384 | "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==", 385 | "cpu": [ 386 | "x64" 387 | ], 388 | "dev": true, 389 | "license": "MIT", 390 | "optional": true, 391 | "os": [ 392 | "freebsd" 393 | ], 394 | "engines": { 395 | "node": ">=18" 396 | } 397 | }, 398 | "node_modules/@esbuild/linux-arm": { 399 | "version": "0.25.0", 400 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz", 401 | "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==", 402 | "cpu": [ 403 | "arm" 404 | ], 405 | "dev": true, 406 | "license": "MIT", 407 | "optional": true, 408 | "os": [ 409 | "linux" 410 | ], 411 | "engines": { 412 | "node": ">=18" 413 | } 414 | }, 415 | "node_modules/@esbuild/linux-arm64": { 416 | "version": "0.25.0", 417 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz", 418 | "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==", 419 | "cpu": [ 420 | "arm64" 421 | ], 422 | "dev": true, 423 | "license": "MIT", 424 | "optional": true, 425 | "os": [ 426 | "linux" 427 | ], 428 | "engines": { 429 | "node": ">=18" 430 | } 431 | }, 432 | "node_modules/@esbuild/linux-ia32": { 433 | "version": "0.25.0", 434 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz", 435 | "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==", 436 | "cpu": [ 437 | "ia32" 438 | ], 439 | "dev": true, 440 | "license": "MIT", 441 | "optional": true, 442 | "os": [ 443 | "linux" 444 | ], 445 | "engines": { 446 | "node": ">=18" 447 | } 448 | }, 449 | "node_modules/@esbuild/linux-loong64": { 450 | "version": "0.25.0", 451 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz", 452 | "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==", 453 | "cpu": [ 454 | "loong64" 455 | ], 456 | "dev": true, 457 | "license": "MIT", 458 | "optional": true, 459 | "os": [ 460 | "linux" 461 | ], 462 | "engines": { 463 | "node": ">=18" 464 | } 465 | }, 466 | "node_modules/@esbuild/linux-mips64el": { 467 | "version": "0.25.0", 468 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz", 469 | "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==", 470 | "cpu": [ 471 | "mips64el" 472 | ], 473 | "dev": true, 474 | "license": "MIT", 475 | "optional": true, 476 | "os": [ 477 | "linux" 478 | ], 479 | "engines": { 480 | "node": ">=18" 481 | } 482 | }, 483 | "node_modules/@esbuild/linux-ppc64": { 484 | "version": "0.25.0", 485 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz", 486 | "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==", 487 | "cpu": [ 488 | "ppc64" 489 | ], 490 | "dev": true, 491 | "license": "MIT", 492 | "optional": true, 493 | "os": [ 494 | "linux" 495 | ], 496 | "engines": { 497 | "node": ">=18" 498 | } 499 | }, 500 | "node_modules/@esbuild/linux-riscv64": { 501 | "version": "0.25.0", 502 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz", 503 | "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==", 504 | "cpu": [ 505 | "riscv64" 506 | ], 507 | "dev": true, 508 | "license": "MIT", 509 | "optional": true, 510 | "os": [ 511 | "linux" 512 | ], 513 | "engines": { 514 | "node": ">=18" 515 | } 516 | }, 517 | "node_modules/@esbuild/linux-s390x": { 518 | "version": "0.25.0", 519 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz", 520 | "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==", 521 | "cpu": [ 522 | "s390x" 523 | ], 524 | "dev": true, 525 | "license": "MIT", 526 | "optional": true, 527 | "os": [ 528 | "linux" 529 | ], 530 | "engines": { 531 | "node": ">=18" 532 | } 533 | }, 534 | "node_modules/@esbuild/linux-x64": { 535 | "version": "0.25.0", 536 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz", 537 | "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==", 538 | "cpu": [ 539 | "x64" 540 | ], 541 | "dev": true, 542 | "license": "MIT", 543 | "optional": true, 544 | "os": [ 545 | "linux" 546 | ], 547 | "engines": { 548 | "node": ">=18" 549 | } 550 | }, 551 | "node_modules/@esbuild/netbsd-arm64": { 552 | "version": "0.25.0", 553 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz", 554 | "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==", 555 | "cpu": [ 556 | "arm64" 557 | ], 558 | "dev": true, 559 | "license": "MIT", 560 | "optional": true, 561 | "os": [ 562 | "netbsd" 563 | ], 564 | "engines": { 565 | "node": ">=18" 566 | } 567 | }, 568 | "node_modules/@esbuild/netbsd-x64": { 569 | "version": "0.25.0", 570 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz", 571 | "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==", 572 | "cpu": [ 573 | "x64" 574 | ], 575 | "dev": true, 576 | "license": "MIT", 577 | "optional": true, 578 | "os": [ 579 | "netbsd" 580 | ], 581 | "engines": { 582 | "node": ">=18" 583 | } 584 | }, 585 | "node_modules/@esbuild/openbsd-arm64": { 586 | "version": "0.25.0", 587 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz", 588 | "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==", 589 | "cpu": [ 590 | "arm64" 591 | ], 592 | "dev": true, 593 | "license": "MIT", 594 | "optional": true, 595 | "os": [ 596 | "openbsd" 597 | ], 598 | "engines": { 599 | "node": ">=18" 600 | } 601 | }, 602 | "node_modules/@esbuild/openbsd-x64": { 603 | "version": "0.25.0", 604 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz", 605 | "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==", 606 | "cpu": [ 607 | "x64" 608 | ], 609 | "dev": true, 610 | "license": "MIT", 611 | "optional": true, 612 | "os": [ 613 | "openbsd" 614 | ], 615 | "engines": { 616 | "node": ">=18" 617 | } 618 | }, 619 | "node_modules/@esbuild/sunos-x64": { 620 | "version": "0.25.0", 621 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz", 622 | "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==", 623 | "cpu": [ 624 | "x64" 625 | ], 626 | "dev": true, 627 | "license": "MIT", 628 | "optional": true, 629 | "os": [ 630 | "sunos" 631 | ], 632 | "engines": { 633 | "node": ">=18" 634 | } 635 | }, 636 | "node_modules/@esbuild/win32-arm64": { 637 | "version": "0.25.0", 638 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz", 639 | "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==", 640 | "cpu": [ 641 | "arm64" 642 | ], 643 | "dev": true, 644 | "license": "MIT", 645 | "optional": true, 646 | "os": [ 647 | "win32" 648 | ], 649 | "engines": { 650 | "node": ">=18" 651 | } 652 | }, 653 | "node_modules/@esbuild/win32-ia32": { 654 | "version": "0.25.0", 655 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz", 656 | "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==", 657 | "cpu": [ 658 | "ia32" 659 | ], 660 | "dev": true, 661 | "license": "MIT", 662 | "optional": true, 663 | "os": [ 664 | "win32" 665 | ], 666 | "engines": { 667 | "node": ">=18" 668 | } 669 | }, 670 | "node_modules/@esbuild/win32-x64": { 671 | "version": "0.25.0", 672 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz", 673 | "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==", 674 | "cpu": [ 675 | "x64" 676 | ], 677 | "dev": true, 678 | "license": "MIT", 679 | "optional": true, 680 | "os": [ 681 | "win32" 682 | ], 683 | "engines": { 684 | "node": ">=18" 685 | } 686 | }, 687 | "node_modules/@isaacs/cliui": { 688 | "version": "8.0.2", 689 | "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", 690 | "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", 691 | "dev": true, 692 | "license": "ISC", 693 | "dependencies": { 694 | "string-width": "^5.1.2", 695 | "string-width-cjs": "npm:string-width@^4.2.0", 696 | "strip-ansi": "^7.0.1", 697 | "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", 698 | "wrap-ansi": "^8.1.0", 699 | "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" 700 | }, 701 | "engines": { 702 | "node": ">=12" 703 | } 704 | }, 705 | "node_modules/@istanbuljs/schema": { 706 | "version": "0.1.3", 707 | "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", 708 | "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", 709 | "dev": true, 710 | "license": "MIT", 711 | "engines": { 712 | "node": ">=8" 713 | } 714 | }, 715 | "node_modules/@jridgewell/gen-mapping": { 716 | "version": "0.3.5", 717 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", 718 | "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", 719 | "dev": true, 720 | "license": "MIT", 721 | "dependencies": { 722 | "@jridgewell/set-array": "^1.2.1", 723 | "@jridgewell/sourcemap-codec": "^1.4.10", 724 | "@jridgewell/trace-mapping": "^0.3.24" 725 | }, 726 | "engines": { 727 | "node": ">=6.0.0" 728 | } 729 | }, 730 | "node_modules/@jridgewell/resolve-uri": { 731 | "version": "3.1.1", 732 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", 733 | "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", 734 | "dev": true, 735 | "engines": { 736 | "node": ">=6.0.0" 737 | } 738 | }, 739 | "node_modules/@jridgewell/set-array": { 740 | "version": "1.2.1", 741 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", 742 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", 743 | "dev": true, 744 | "license": "MIT", 745 | "engines": { 746 | "node": ">=6.0.0" 747 | } 748 | }, 749 | "node_modules/@jridgewell/sourcemap-codec": { 750 | "version": "1.5.0", 751 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 752 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 753 | "dev": true, 754 | "license": "MIT" 755 | }, 756 | "node_modules/@jridgewell/trace-mapping": { 757 | "version": "0.3.25", 758 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", 759 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 760 | "dev": true, 761 | "license": "MIT", 762 | "dependencies": { 763 | "@jridgewell/resolve-uri": "^3.1.0", 764 | "@jridgewell/sourcemap-codec": "^1.4.14" 765 | } 766 | }, 767 | "node_modules/@pkgjs/parseargs": { 768 | "version": "0.11.0", 769 | "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", 770 | "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", 771 | "dev": true, 772 | "license": "MIT", 773 | "optional": true, 774 | "engines": { 775 | "node": ">=14" 776 | } 777 | }, 778 | "node_modules/@rollup/rollup-android-arm-eabi": { 779 | "version": "4.40.2", 780 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.2.tgz", 781 | "integrity": "sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==", 782 | "cpu": [ 783 | "arm" 784 | ], 785 | "dev": true, 786 | "license": "MIT", 787 | "optional": true, 788 | "os": [ 789 | "android" 790 | ] 791 | }, 792 | "node_modules/@rollup/rollup-android-arm64": { 793 | "version": "4.40.2", 794 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.2.tgz", 795 | "integrity": "sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==", 796 | "cpu": [ 797 | "arm64" 798 | ], 799 | "dev": true, 800 | "license": "MIT", 801 | "optional": true, 802 | "os": [ 803 | "android" 804 | ] 805 | }, 806 | "node_modules/@rollup/rollup-darwin-arm64": { 807 | "version": "4.40.2", 808 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.2.tgz", 809 | "integrity": "sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==", 810 | "cpu": [ 811 | "arm64" 812 | ], 813 | "dev": true, 814 | "license": "MIT", 815 | "optional": true, 816 | "os": [ 817 | "darwin" 818 | ] 819 | }, 820 | "node_modules/@rollup/rollup-darwin-x64": { 821 | "version": "4.40.2", 822 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.2.tgz", 823 | "integrity": "sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==", 824 | "cpu": [ 825 | "x64" 826 | ], 827 | "dev": true, 828 | "license": "MIT", 829 | "optional": true, 830 | "os": [ 831 | "darwin" 832 | ] 833 | }, 834 | "node_modules/@rollup/rollup-freebsd-arm64": { 835 | "version": "4.40.2", 836 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.2.tgz", 837 | "integrity": "sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==", 838 | "cpu": [ 839 | "arm64" 840 | ], 841 | "dev": true, 842 | "license": "MIT", 843 | "optional": true, 844 | "os": [ 845 | "freebsd" 846 | ] 847 | }, 848 | "node_modules/@rollup/rollup-freebsd-x64": { 849 | "version": "4.40.2", 850 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.2.tgz", 851 | "integrity": "sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==", 852 | "cpu": [ 853 | "x64" 854 | ], 855 | "dev": true, 856 | "license": "MIT", 857 | "optional": true, 858 | "os": [ 859 | "freebsd" 860 | ] 861 | }, 862 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 863 | "version": "4.40.2", 864 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.2.tgz", 865 | "integrity": "sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==", 866 | "cpu": [ 867 | "arm" 868 | ], 869 | "dev": true, 870 | "license": "MIT", 871 | "optional": true, 872 | "os": [ 873 | "linux" 874 | ] 875 | }, 876 | "node_modules/@rollup/rollup-linux-arm-musleabihf": { 877 | "version": "4.40.2", 878 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.2.tgz", 879 | "integrity": "sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==", 880 | "cpu": [ 881 | "arm" 882 | ], 883 | "dev": true, 884 | "license": "MIT", 885 | "optional": true, 886 | "os": [ 887 | "linux" 888 | ] 889 | }, 890 | "node_modules/@rollup/rollup-linux-arm64-gnu": { 891 | "version": "4.40.2", 892 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.2.tgz", 893 | "integrity": "sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==", 894 | "cpu": [ 895 | "arm64" 896 | ], 897 | "dev": true, 898 | "license": "MIT", 899 | "optional": true, 900 | "os": [ 901 | "linux" 902 | ] 903 | }, 904 | "node_modules/@rollup/rollup-linux-arm64-musl": { 905 | "version": "4.40.2", 906 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.2.tgz", 907 | "integrity": "sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==", 908 | "cpu": [ 909 | "arm64" 910 | ], 911 | "dev": true, 912 | "license": "MIT", 913 | "optional": true, 914 | "os": [ 915 | "linux" 916 | ] 917 | }, 918 | "node_modules/@rollup/rollup-linux-loongarch64-gnu": { 919 | "version": "4.40.2", 920 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.2.tgz", 921 | "integrity": "sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==", 922 | "cpu": [ 923 | "loong64" 924 | ], 925 | "dev": true, 926 | "license": "MIT", 927 | "optional": true, 928 | "os": [ 929 | "linux" 930 | ] 931 | }, 932 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 933 | "version": "4.40.2", 934 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.2.tgz", 935 | "integrity": "sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==", 936 | "cpu": [ 937 | "ppc64" 938 | ], 939 | "dev": true, 940 | "license": "MIT", 941 | "optional": true, 942 | "os": [ 943 | "linux" 944 | ] 945 | }, 946 | "node_modules/@rollup/rollup-linux-riscv64-gnu": { 947 | "version": "4.40.2", 948 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.2.tgz", 949 | "integrity": "sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==", 950 | "cpu": [ 951 | "riscv64" 952 | ], 953 | "dev": true, 954 | "license": "MIT", 955 | "optional": true, 956 | "os": [ 957 | "linux" 958 | ] 959 | }, 960 | "node_modules/@rollup/rollup-linux-riscv64-musl": { 961 | "version": "4.40.2", 962 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.2.tgz", 963 | "integrity": "sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==", 964 | "cpu": [ 965 | "riscv64" 966 | ], 967 | "dev": true, 968 | "license": "MIT", 969 | "optional": true, 970 | "os": [ 971 | "linux" 972 | ] 973 | }, 974 | "node_modules/@rollup/rollup-linux-s390x-gnu": { 975 | "version": "4.40.2", 976 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.2.tgz", 977 | "integrity": "sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==", 978 | "cpu": [ 979 | "s390x" 980 | ], 981 | "dev": true, 982 | "license": "MIT", 983 | "optional": true, 984 | "os": [ 985 | "linux" 986 | ] 987 | }, 988 | "node_modules/@rollup/rollup-linux-x64-gnu": { 989 | "version": "4.40.2", 990 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.2.tgz", 991 | "integrity": "sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==", 992 | "cpu": [ 993 | "x64" 994 | ], 995 | "dev": true, 996 | "license": "MIT", 997 | "optional": true, 998 | "os": [ 999 | "linux" 1000 | ] 1001 | }, 1002 | "node_modules/@rollup/rollup-linux-x64-musl": { 1003 | "version": "4.40.2", 1004 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.2.tgz", 1005 | "integrity": "sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==", 1006 | "cpu": [ 1007 | "x64" 1008 | ], 1009 | "dev": true, 1010 | "license": "MIT", 1011 | "optional": true, 1012 | "os": [ 1013 | "linux" 1014 | ] 1015 | }, 1016 | "node_modules/@rollup/rollup-win32-arm64-msvc": { 1017 | "version": "4.40.2", 1018 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.2.tgz", 1019 | "integrity": "sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==", 1020 | "cpu": [ 1021 | "arm64" 1022 | ], 1023 | "dev": true, 1024 | "license": "MIT", 1025 | "optional": true, 1026 | "os": [ 1027 | "win32" 1028 | ] 1029 | }, 1030 | "node_modules/@rollup/rollup-win32-ia32-msvc": { 1031 | "version": "4.40.2", 1032 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.2.tgz", 1033 | "integrity": "sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==", 1034 | "cpu": [ 1035 | "ia32" 1036 | ], 1037 | "dev": true, 1038 | "license": "MIT", 1039 | "optional": true, 1040 | "os": [ 1041 | "win32" 1042 | ] 1043 | }, 1044 | "node_modules/@rollup/rollup-win32-x64-msvc": { 1045 | "version": "4.40.2", 1046 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.2.tgz", 1047 | "integrity": "sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==", 1048 | "cpu": [ 1049 | "x64" 1050 | ], 1051 | "dev": true, 1052 | "license": "MIT", 1053 | "optional": true, 1054 | "os": [ 1055 | "win32" 1056 | ] 1057 | }, 1058 | "node_modules/@types/estree": { 1059 | "version": "1.0.7", 1060 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", 1061 | "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", 1062 | "dev": true, 1063 | "license": "MIT" 1064 | }, 1065 | "node_modules/@vitest/coverage-v8": { 1066 | "version": "3.1.3", 1067 | "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.1.3.tgz", 1068 | "integrity": "sha512-cj76U5gXCl3g88KSnf80kof6+6w+K4BjOflCl7t6yRJPDuCrHtVu0SgNYOUARJOL5TI8RScDbm5x4s1/P9bvpw==", 1069 | "dev": true, 1070 | "license": "MIT", 1071 | "dependencies": { 1072 | "@ampproject/remapping": "^2.3.0", 1073 | "@bcoe/v8-coverage": "^1.0.2", 1074 | "debug": "^4.4.0", 1075 | "istanbul-lib-coverage": "^3.2.2", 1076 | "istanbul-lib-report": "^3.0.1", 1077 | "istanbul-lib-source-maps": "^5.0.6", 1078 | "istanbul-reports": "^3.1.7", 1079 | "magic-string": "^0.30.17", 1080 | "magicast": "^0.3.5", 1081 | "std-env": "^3.9.0", 1082 | "test-exclude": "^7.0.1", 1083 | "tinyrainbow": "^2.0.0" 1084 | }, 1085 | "funding": { 1086 | "url": "https://opencollective.com/vitest" 1087 | }, 1088 | "peerDependencies": { 1089 | "@vitest/browser": "3.1.3", 1090 | "vitest": "3.1.3" 1091 | }, 1092 | "peerDependenciesMeta": { 1093 | "@vitest/browser": { 1094 | "optional": true 1095 | } 1096 | } 1097 | }, 1098 | "node_modules/@vitest/expect": { 1099 | "version": "3.1.3", 1100 | "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.1.3.tgz", 1101 | "integrity": "sha512-7FTQQuuLKmN1Ig/h+h/GO+44Q1IlglPlR2es4ab7Yvfx+Uk5xsv+Ykk+MEt/M2Yn/xGmzaLKxGw2lgy2bwuYqg==", 1102 | "dev": true, 1103 | "license": "MIT", 1104 | "dependencies": { 1105 | "@vitest/spy": "3.1.3", 1106 | "@vitest/utils": "3.1.3", 1107 | "chai": "^5.2.0", 1108 | "tinyrainbow": "^2.0.0" 1109 | }, 1110 | "funding": { 1111 | "url": "https://opencollective.com/vitest" 1112 | } 1113 | }, 1114 | "node_modules/@vitest/mocker": { 1115 | "version": "3.1.3", 1116 | "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.1.3.tgz", 1117 | "integrity": "sha512-PJbLjonJK82uCWHjzgBJZuR7zmAOrSvKk1QBxrennDIgtH4uK0TB1PvYmc0XBCigxxtiAVPfWtAdy4lpz8SQGQ==", 1118 | "dev": true, 1119 | "license": "MIT", 1120 | "dependencies": { 1121 | "@vitest/spy": "3.1.3", 1122 | "estree-walker": "^3.0.3", 1123 | "magic-string": "^0.30.17" 1124 | }, 1125 | "funding": { 1126 | "url": "https://opencollective.com/vitest" 1127 | }, 1128 | "peerDependencies": { 1129 | "msw": "^2.4.9", 1130 | "vite": "^5.0.0 || ^6.0.0" 1131 | }, 1132 | "peerDependenciesMeta": { 1133 | "msw": { 1134 | "optional": true 1135 | }, 1136 | "vite": { 1137 | "optional": true 1138 | } 1139 | } 1140 | }, 1141 | "node_modules/@vitest/pretty-format": { 1142 | "version": "3.1.3", 1143 | "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.1.3.tgz", 1144 | "integrity": "sha512-i6FDiBeJUGLDKADw2Gb01UtUNb12yyXAqC/mmRWuYl+m/U9GS7s8us5ONmGkGpUUo7/iAYzI2ePVfOZTYvUifA==", 1145 | "dev": true, 1146 | "license": "MIT", 1147 | "dependencies": { 1148 | "tinyrainbow": "^2.0.0" 1149 | }, 1150 | "funding": { 1151 | "url": "https://opencollective.com/vitest" 1152 | } 1153 | }, 1154 | "node_modules/@vitest/runner": { 1155 | "version": "3.1.3", 1156 | "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.1.3.tgz", 1157 | "integrity": "sha512-Tae+ogtlNfFei5DggOsSUvkIaSuVywujMj6HzR97AHK6XK8i3BuVyIifWAm/sE3a15lF5RH9yQIrbXYuo0IFyA==", 1158 | "dev": true, 1159 | "license": "MIT", 1160 | "dependencies": { 1161 | "@vitest/utils": "3.1.3", 1162 | "pathe": "^2.0.3" 1163 | }, 1164 | "funding": { 1165 | "url": "https://opencollective.com/vitest" 1166 | } 1167 | }, 1168 | "node_modules/@vitest/snapshot": { 1169 | "version": "3.1.3", 1170 | "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.1.3.tgz", 1171 | "integrity": "sha512-XVa5OPNTYUsyqG9skuUkFzAeFnEzDp8hQu7kZ0N25B1+6KjGm4hWLtURyBbsIAOekfWQ7Wuz/N/XXzgYO3deWQ==", 1172 | "dev": true, 1173 | "license": "MIT", 1174 | "dependencies": { 1175 | "@vitest/pretty-format": "3.1.3", 1176 | "magic-string": "^0.30.17", 1177 | "pathe": "^2.0.3" 1178 | }, 1179 | "funding": { 1180 | "url": "https://opencollective.com/vitest" 1181 | } 1182 | }, 1183 | "node_modules/@vitest/spy": { 1184 | "version": "3.1.3", 1185 | "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.1.3.tgz", 1186 | "integrity": "sha512-x6w+ctOEmEXdWaa6TO4ilb7l9DxPR5bwEb6hILKuxfU1NqWT2mpJD9NJN7t3OTfxmVlOMrvtoFJGdgyzZ605lQ==", 1187 | "dev": true, 1188 | "license": "MIT", 1189 | "dependencies": { 1190 | "tinyspy": "^3.0.2" 1191 | }, 1192 | "funding": { 1193 | "url": "https://opencollective.com/vitest" 1194 | } 1195 | }, 1196 | "node_modules/@vitest/utils": { 1197 | "version": "3.1.3", 1198 | "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.1.3.tgz", 1199 | "integrity": "sha512-2Ltrpht4OmHO9+c/nmHtF09HWiyWdworqnHIwjfvDyWjuwKbdkcS9AnhsDn+8E2RM4x++foD1/tNuLPVvWG1Rg==", 1200 | "dev": true, 1201 | "license": "MIT", 1202 | "dependencies": { 1203 | "@vitest/pretty-format": "3.1.3", 1204 | "loupe": "^3.1.3", 1205 | "tinyrainbow": "^2.0.0" 1206 | }, 1207 | "funding": { 1208 | "url": "https://opencollective.com/vitest" 1209 | } 1210 | }, 1211 | "node_modules/acorn": { 1212 | "version": "8.14.1", 1213 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", 1214 | "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", 1215 | "dev": true, 1216 | "license": "MIT", 1217 | "bin": { 1218 | "acorn": "bin/acorn" 1219 | }, 1220 | "engines": { 1221 | "node": ">=0.4.0" 1222 | } 1223 | }, 1224 | "node_modules/ansi-regex": { 1225 | "version": "6.1.0", 1226 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", 1227 | "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", 1228 | "dev": true, 1229 | "license": "MIT", 1230 | "engines": { 1231 | "node": ">=12" 1232 | }, 1233 | "funding": { 1234 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 1235 | } 1236 | }, 1237 | "node_modules/ansi-styles": { 1238 | "version": "6.2.1", 1239 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 1240 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 1241 | "dev": true, 1242 | "license": "MIT", 1243 | "engines": { 1244 | "node": ">=12" 1245 | }, 1246 | "funding": { 1247 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1248 | } 1249 | }, 1250 | "node_modules/any-promise": { 1251 | "version": "1.3.0", 1252 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", 1253 | "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", 1254 | "dev": true, 1255 | "license": "MIT" 1256 | }, 1257 | "node_modules/assertion-error": { 1258 | "version": "2.0.1", 1259 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", 1260 | "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", 1261 | "dev": true, 1262 | "license": "MIT", 1263 | "engines": { 1264 | "node": ">=12" 1265 | } 1266 | }, 1267 | "node_modules/balanced-match": { 1268 | "version": "1.0.2", 1269 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1270 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1271 | "dev": true 1272 | }, 1273 | "node_modules/brace-expansion": { 1274 | "version": "2.0.1", 1275 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 1276 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1277 | "dev": true, 1278 | "dependencies": { 1279 | "balanced-match": "^1.0.0" 1280 | } 1281 | }, 1282 | "node_modules/bundle-require": { 1283 | "version": "5.1.0", 1284 | "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", 1285 | "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==", 1286 | "dev": true, 1287 | "license": "MIT", 1288 | "dependencies": { 1289 | "load-tsconfig": "^0.2.3" 1290 | }, 1291 | "engines": { 1292 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 1293 | }, 1294 | "peerDependencies": { 1295 | "esbuild": ">=0.18" 1296 | } 1297 | }, 1298 | "node_modules/cac": { 1299 | "version": "6.7.14", 1300 | "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", 1301 | "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", 1302 | "dev": true, 1303 | "engines": { 1304 | "node": ">=8" 1305 | } 1306 | }, 1307 | "node_modules/chai": { 1308 | "version": "5.2.0", 1309 | "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", 1310 | "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", 1311 | "dev": true, 1312 | "license": "MIT", 1313 | "dependencies": { 1314 | "assertion-error": "^2.0.1", 1315 | "check-error": "^2.1.1", 1316 | "deep-eql": "^5.0.1", 1317 | "loupe": "^3.1.0", 1318 | "pathval": "^2.0.0" 1319 | }, 1320 | "engines": { 1321 | "node": ">=12" 1322 | } 1323 | }, 1324 | "node_modules/check-error": { 1325 | "version": "2.1.1", 1326 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", 1327 | "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", 1328 | "dev": true, 1329 | "license": "MIT", 1330 | "engines": { 1331 | "node": ">= 16" 1332 | } 1333 | }, 1334 | "node_modules/chokidar": { 1335 | "version": "4.0.3", 1336 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", 1337 | "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", 1338 | "dev": true, 1339 | "license": "MIT", 1340 | "dependencies": { 1341 | "readdirp": "^4.0.1" 1342 | }, 1343 | "engines": { 1344 | "node": ">= 14.16.0" 1345 | }, 1346 | "funding": { 1347 | "url": "https://paulmillr.com/funding/" 1348 | } 1349 | }, 1350 | "node_modules/color-convert": { 1351 | "version": "2.0.1", 1352 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1353 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1354 | "dev": true, 1355 | "license": "MIT", 1356 | "dependencies": { 1357 | "color-name": "~1.1.4" 1358 | }, 1359 | "engines": { 1360 | "node": ">=7.0.0" 1361 | } 1362 | }, 1363 | "node_modules/color-name": { 1364 | "version": "1.1.4", 1365 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1366 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1367 | "dev": true, 1368 | "license": "MIT" 1369 | }, 1370 | "node_modules/commander": { 1371 | "version": "4.1.1", 1372 | "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", 1373 | "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", 1374 | "dev": true, 1375 | "license": "MIT", 1376 | "engines": { 1377 | "node": ">= 6" 1378 | } 1379 | }, 1380 | "node_modules/confbox": { 1381 | "version": "0.1.8", 1382 | "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", 1383 | "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", 1384 | "dev": true, 1385 | "license": "MIT" 1386 | }, 1387 | "node_modules/consola": { 1388 | "version": "3.4.0", 1389 | "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.0.tgz", 1390 | "integrity": "sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==", 1391 | "dev": true, 1392 | "license": "MIT", 1393 | "engines": { 1394 | "node": "^14.18.0 || >=16.10.0" 1395 | } 1396 | }, 1397 | "node_modules/cross-spawn": { 1398 | "version": "7.0.6", 1399 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 1400 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 1401 | "dev": true, 1402 | "license": "MIT", 1403 | "dependencies": { 1404 | "path-key": "^3.1.0", 1405 | "shebang-command": "^2.0.0", 1406 | "which": "^2.0.1" 1407 | }, 1408 | "engines": { 1409 | "node": ">= 8" 1410 | } 1411 | }, 1412 | "node_modules/debug": { 1413 | "version": "4.4.0", 1414 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 1415 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 1416 | "dev": true, 1417 | "license": "MIT", 1418 | "dependencies": { 1419 | "ms": "^2.1.3" 1420 | }, 1421 | "engines": { 1422 | "node": ">=6.0" 1423 | }, 1424 | "peerDependenciesMeta": { 1425 | "supports-color": { 1426 | "optional": true 1427 | } 1428 | } 1429 | }, 1430 | "node_modules/deep-eql": { 1431 | "version": "5.0.2", 1432 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", 1433 | "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", 1434 | "dev": true, 1435 | "license": "MIT", 1436 | "engines": { 1437 | "node": ">=6" 1438 | } 1439 | }, 1440 | "node_modules/dom-serializer": { 1441 | "version": "2.0.0", 1442 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", 1443 | "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", 1444 | "license": "MIT", 1445 | "dependencies": { 1446 | "domelementtype": "^2.3.0", 1447 | "domhandler": "^5.0.2", 1448 | "entities": "^4.2.0" 1449 | }, 1450 | "funding": { 1451 | "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" 1452 | } 1453 | }, 1454 | "node_modules/dom-serializer/node_modules/entities": { 1455 | "version": "4.5.0", 1456 | "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", 1457 | "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", 1458 | "license": "BSD-2-Clause", 1459 | "engines": { 1460 | "node": ">=0.12" 1461 | }, 1462 | "funding": { 1463 | "url": "https://github.com/fb55/entities?sponsor=1" 1464 | } 1465 | }, 1466 | "node_modules/domelementtype": { 1467 | "version": "2.3.0", 1468 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", 1469 | "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", 1470 | "funding": [ 1471 | { 1472 | "type": "github", 1473 | "url": "https://github.com/sponsors/fb55" 1474 | } 1475 | ], 1476 | "license": "BSD-2-Clause" 1477 | }, 1478 | "node_modules/domhandler": { 1479 | "version": "5.0.3", 1480 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", 1481 | "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", 1482 | "license": "BSD-2-Clause", 1483 | "dependencies": { 1484 | "domelementtype": "^2.3.0" 1485 | }, 1486 | "engines": { 1487 | "node": ">= 4" 1488 | }, 1489 | "funding": { 1490 | "url": "https://github.com/fb55/domhandler?sponsor=1" 1491 | } 1492 | }, 1493 | "node_modules/domutils": { 1494 | "version": "3.2.2", 1495 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", 1496 | "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", 1497 | "license": "BSD-2-Clause", 1498 | "dependencies": { 1499 | "dom-serializer": "^2.0.0", 1500 | "domelementtype": "^2.3.0", 1501 | "domhandler": "^5.0.3" 1502 | }, 1503 | "funding": { 1504 | "url": "https://github.com/fb55/domutils?sponsor=1" 1505 | } 1506 | }, 1507 | "node_modules/eastasianwidth": { 1508 | "version": "0.2.0", 1509 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 1510 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", 1511 | "dev": true, 1512 | "license": "MIT" 1513 | }, 1514 | "node_modules/emoji-regex": { 1515 | "version": "9.2.2", 1516 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 1517 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", 1518 | "dev": true, 1519 | "license": "MIT" 1520 | }, 1521 | "node_modules/entities": { 1522 | "version": "6.0.0", 1523 | "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.0.tgz", 1524 | "integrity": "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==", 1525 | "license": "BSD-2-Clause", 1526 | "engines": { 1527 | "node": ">=0.12" 1528 | }, 1529 | "funding": { 1530 | "url": "https://github.com/fb55/entities?sponsor=1" 1531 | } 1532 | }, 1533 | "node_modules/es-module-lexer": { 1534 | "version": "1.7.0", 1535 | "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", 1536 | "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", 1537 | "dev": true, 1538 | "license": "MIT" 1539 | }, 1540 | "node_modules/esbuild": { 1541 | "version": "0.25.0", 1542 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", 1543 | "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", 1544 | "dev": true, 1545 | "hasInstallScript": true, 1546 | "license": "MIT", 1547 | "bin": { 1548 | "esbuild": "bin/esbuild" 1549 | }, 1550 | "engines": { 1551 | "node": ">=18" 1552 | }, 1553 | "optionalDependencies": { 1554 | "@esbuild/aix-ppc64": "0.25.0", 1555 | "@esbuild/android-arm": "0.25.0", 1556 | "@esbuild/android-arm64": "0.25.0", 1557 | "@esbuild/android-x64": "0.25.0", 1558 | "@esbuild/darwin-arm64": "0.25.0", 1559 | "@esbuild/darwin-x64": "0.25.0", 1560 | "@esbuild/freebsd-arm64": "0.25.0", 1561 | "@esbuild/freebsd-x64": "0.25.0", 1562 | "@esbuild/linux-arm": "0.25.0", 1563 | "@esbuild/linux-arm64": "0.25.0", 1564 | "@esbuild/linux-ia32": "0.25.0", 1565 | "@esbuild/linux-loong64": "0.25.0", 1566 | "@esbuild/linux-mips64el": "0.25.0", 1567 | "@esbuild/linux-ppc64": "0.25.0", 1568 | "@esbuild/linux-riscv64": "0.25.0", 1569 | "@esbuild/linux-s390x": "0.25.0", 1570 | "@esbuild/linux-x64": "0.25.0", 1571 | "@esbuild/netbsd-arm64": "0.25.0", 1572 | "@esbuild/netbsd-x64": "0.25.0", 1573 | "@esbuild/openbsd-arm64": "0.25.0", 1574 | "@esbuild/openbsd-x64": "0.25.0", 1575 | "@esbuild/sunos-x64": "0.25.0", 1576 | "@esbuild/win32-arm64": "0.25.0", 1577 | "@esbuild/win32-ia32": "0.25.0", 1578 | "@esbuild/win32-x64": "0.25.0" 1579 | } 1580 | }, 1581 | "node_modules/estree-walker": { 1582 | "version": "3.0.3", 1583 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", 1584 | "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", 1585 | "dev": true, 1586 | "license": "MIT", 1587 | "dependencies": { 1588 | "@types/estree": "^1.0.0" 1589 | } 1590 | }, 1591 | "node_modules/expect-type": { 1592 | "version": "1.2.1", 1593 | "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.1.tgz", 1594 | "integrity": "sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==", 1595 | "dev": true, 1596 | "license": "Apache-2.0", 1597 | "engines": { 1598 | "node": ">=12.0.0" 1599 | } 1600 | }, 1601 | "node_modules/fdir": { 1602 | "version": "6.4.4", 1603 | "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", 1604 | "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", 1605 | "dev": true, 1606 | "license": "MIT", 1607 | "peerDependencies": { 1608 | "picomatch": "^3 || ^4" 1609 | }, 1610 | "peerDependenciesMeta": { 1611 | "picomatch": { 1612 | "optional": true 1613 | } 1614 | } 1615 | }, 1616 | "node_modules/fix-dts-default-cjs-exports": { 1617 | "version": "1.0.1", 1618 | "resolved": "https://registry.npmjs.org/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz", 1619 | "integrity": "sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==", 1620 | "dev": true, 1621 | "license": "MIT", 1622 | "dependencies": { 1623 | "magic-string": "^0.30.17", 1624 | "mlly": "^1.7.4", 1625 | "rollup": "^4.34.8" 1626 | } 1627 | }, 1628 | "node_modules/foreground-child": { 1629 | "version": "3.3.0", 1630 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", 1631 | "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", 1632 | "dev": true, 1633 | "license": "ISC", 1634 | "dependencies": { 1635 | "cross-spawn": "^7.0.0", 1636 | "signal-exit": "^4.0.1" 1637 | }, 1638 | "engines": { 1639 | "node": ">=14" 1640 | }, 1641 | "funding": { 1642 | "url": "https://github.com/sponsors/isaacs" 1643 | } 1644 | }, 1645 | "node_modules/foreground-child/node_modules/signal-exit": { 1646 | "version": "4.1.0", 1647 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 1648 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 1649 | "dev": true, 1650 | "license": "ISC", 1651 | "engines": { 1652 | "node": ">=14" 1653 | }, 1654 | "funding": { 1655 | "url": "https://github.com/sponsors/isaacs" 1656 | } 1657 | }, 1658 | "node_modules/fsevents": { 1659 | "version": "2.3.3", 1660 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1661 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1662 | "dev": true, 1663 | "hasInstallScript": true, 1664 | "license": "MIT", 1665 | "optional": true, 1666 | "os": [ 1667 | "darwin" 1668 | ], 1669 | "engines": { 1670 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1671 | } 1672 | }, 1673 | "node_modules/glob": { 1674 | "version": "10.4.5", 1675 | "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", 1676 | "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", 1677 | "dev": true, 1678 | "dependencies": { 1679 | "foreground-child": "^3.1.0", 1680 | "jackspeak": "^3.1.2", 1681 | "minimatch": "^9.0.4", 1682 | "minipass": "^7.1.2", 1683 | "package-json-from-dist": "^1.0.0", 1684 | "path-scurry": "^1.11.1" 1685 | }, 1686 | "bin": { 1687 | "glob": "dist/esm/bin.mjs" 1688 | }, 1689 | "funding": { 1690 | "url": "https://github.com/sponsors/isaacs" 1691 | } 1692 | }, 1693 | "node_modules/has-flag": { 1694 | "version": "4.0.0", 1695 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1696 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1697 | "dev": true, 1698 | "license": "MIT", 1699 | "engines": { 1700 | "node": ">=8" 1701 | } 1702 | }, 1703 | "node_modules/html-dom-parser": { 1704 | "version": "5.1.1", 1705 | "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-5.1.1.tgz", 1706 | "integrity": "sha512-+o4Y4Z0CLuyemeccvGN4bAO20aauB2N9tFEAep5x4OW34kV4PTarBHm6RL02afYt2BMKcr0D2Agep8S3nJPIBg==", 1707 | "license": "MIT", 1708 | "dependencies": { 1709 | "domhandler": "5.0.3", 1710 | "htmlparser2": "10.0.0" 1711 | } 1712 | }, 1713 | "node_modules/html-escaper": { 1714 | "version": "2.0.2", 1715 | "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", 1716 | "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", 1717 | "dev": true, 1718 | "license": "MIT" 1719 | }, 1720 | "node_modules/htmlparser2": { 1721 | "version": "10.0.0", 1722 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", 1723 | "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", 1724 | "funding": [ 1725 | "https://github.com/fb55/htmlparser2?sponsor=1", 1726 | { 1727 | "type": "github", 1728 | "url": "https://github.com/sponsors/fb55" 1729 | } 1730 | ], 1731 | "license": "MIT", 1732 | "dependencies": { 1733 | "domelementtype": "^2.3.0", 1734 | "domhandler": "^5.0.3", 1735 | "domutils": "^3.2.1", 1736 | "entities": "^6.0.0" 1737 | } 1738 | }, 1739 | "node_modules/is-fullwidth-code-point": { 1740 | "version": "3.0.0", 1741 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1742 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1743 | "dev": true, 1744 | "license": "MIT", 1745 | "engines": { 1746 | "node": ">=8" 1747 | } 1748 | }, 1749 | "node_modules/isexe": { 1750 | "version": "2.0.0", 1751 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1752 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1753 | "dev": true 1754 | }, 1755 | "node_modules/istanbul-lib-coverage": { 1756 | "version": "3.2.2", 1757 | "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", 1758 | "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", 1759 | "dev": true, 1760 | "license": "BSD-3-Clause", 1761 | "engines": { 1762 | "node": ">=8" 1763 | } 1764 | }, 1765 | "node_modules/istanbul-lib-report": { 1766 | "version": "3.0.1", 1767 | "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", 1768 | "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", 1769 | "dev": true, 1770 | "license": "BSD-3-Clause", 1771 | "dependencies": { 1772 | "istanbul-lib-coverage": "^3.0.0", 1773 | "make-dir": "^4.0.0", 1774 | "supports-color": "^7.1.0" 1775 | }, 1776 | "engines": { 1777 | "node": ">=10" 1778 | } 1779 | }, 1780 | "node_modules/istanbul-lib-source-maps": { 1781 | "version": "5.0.6", 1782 | "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", 1783 | "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", 1784 | "dev": true, 1785 | "license": "BSD-3-Clause", 1786 | "dependencies": { 1787 | "@jridgewell/trace-mapping": "^0.3.23", 1788 | "debug": "^4.1.1", 1789 | "istanbul-lib-coverage": "^3.0.0" 1790 | }, 1791 | "engines": { 1792 | "node": ">=10" 1793 | } 1794 | }, 1795 | "node_modules/istanbul-reports": { 1796 | "version": "3.1.7", 1797 | "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", 1798 | "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", 1799 | "dev": true, 1800 | "license": "BSD-3-Clause", 1801 | "dependencies": { 1802 | "html-escaper": "^2.0.0", 1803 | "istanbul-lib-report": "^3.0.0" 1804 | }, 1805 | "engines": { 1806 | "node": ">=8" 1807 | } 1808 | }, 1809 | "node_modules/jackspeak": { 1810 | "version": "3.4.3", 1811 | "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", 1812 | "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", 1813 | "dev": true, 1814 | "license": "BlueOak-1.0.0", 1815 | "dependencies": { 1816 | "@isaacs/cliui": "^8.0.2" 1817 | }, 1818 | "funding": { 1819 | "url": "https://github.com/sponsors/isaacs" 1820 | }, 1821 | "optionalDependencies": { 1822 | "@pkgjs/parseargs": "^0.11.0" 1823 | } 1824 | }, 1825 | "node_modules/joycon": { 1826 | "version": "3.1.1", 1827 | "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", 1828 | "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", 1829 | "dev": true, 1830 | "license": "MIT", 1831 | "engines": { 1832 | "node": ">=10" 1833 | } 1834 | }, 1835 | "node_modules/lilconfig": { 1836 | "version": "3.1.3", 1837 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", 1838 | "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", 1839 | "dev": true, 1840 | "license": "MIT", 1841 | "engines": { 1842 | "node": ">=14" 1843 | }, 1844 | "funding": { 1845 | "url": "https://github.com/sponsors/antonk52" 1846 | } 1847 | }, 1848 | "node_modules/lines-and-columns": { 1849 | "version": "1.2.4", 1850 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 1851 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", 1852 | "dev": true, 1853 | "license": "MIT" 1854 | }, 1855 | "node_modules/load-tsconfig": { 1856 | "version": "0.2.5", 1857 | "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", 1858 | "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", 1859 | "dev": true, 1860 | "license": "MIT", 1861 | "engines": { 1862 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 1863 | } 1864 | }, 1865 | "node_modules/lodash.sortby": { 1866 | "version": "4.7.0", 1867 | "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", 1868 | "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", 1869 | "dev": true, 1870 | "license": "MIT" 1871 | }, 1872 | "node_modules/loupe": { 1873 | "version": "3.1.3", 1874 | "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", 1875 | "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", 1876 | "dev": true, 1877 | "license": "MIT" 1878 | }, 1879 | "node_modules/lru-cache": { 1880 | "version": "10.4.3", 1881 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", 1882 | "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", 1883 | "dev": true, 1884 | "license": "ISC" 1885 | }, 1886 | "node_modules/magic-string": { 1887 | "version": "0.30.17", 1888 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", 1889 | "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", 1890 | "dev": true, 1891 | "license": "MIT", 1892 | "dependencies": { 1893 | "@jridgewell/sourcemap-codec": "^1.5.0" 1894 | } 1895 | }, 1896 | "node_modules/magicast": { 1897 | "version": "0.3.5", 1898 | "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", 1899 | "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", 1900 | "dev": true, 1901 | "license": "MIT", 1902 | "dependencies": { 1903 | "@babel/parser": "^7.25.4", 1904 | "@babel/types": "^7.25.4", 1905 | "source-map-js": "^1.2.0" 1906 | } 1907 | }, 1908 | "node_modules/make-dir": { 1909 | "version": "4.0.0", 1910 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", 1911 | "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", 1912 | "dev": true, 1913 | "license": "MIT", 1914 | "dependencies": { 1915 | "semver": "^7.5.3" 1916 | }, 1917 | "engines": { 1918 | "node": ">=10" 1919 | }, 1920 | "funding": { 1921 | "url": "https://github.com/sponsors/sindresorhus" 1922 | } 1923 | }, 1924 | "node_modules/minimatch": { 1925 | "version": "9.0.5", 1926 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 1927 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 1928 | "dev": true, 1929 | "dependencies": { 1930 | "brace-expansion": "^2.0.1" 1931 | }, 1932 | "engines": { 1933 | "node": ">=16 || 14 >=14.17" 1934 | }, 1935 | "funding": { 1936 | "url": "https://github.com/sponsors/isaacs" 1937 | } 1938 | }, 1939 | "node_modules/minipass": { 1940 | "version": "7.1.2", 1941 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", 1942 | "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", 1943 | "dev": true, 1944 | "license": "ISC", 1945 | "engines": { 1946 | "node": ">=16 || 14 >=14.17" 1947 | } 1948 | }, 1949 | "node_modules/mlly": { 1950 | "version": "1.7.4", 1951 | "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz", 1952 | "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==", 1953 | "dev": true, 1954 | "license": "MIT", 1955 | "dependencies": { 1956 | "acorn": "^8.14.0", 1957 | "pathe": "^2.0.1", 1958 | "pkg-types": "^1.3.0", 1959 | "ufo": "^1.5.4" 1960 | } 1961 | }, 1962 | "node_modules/ms": { 1963 | "version": "2.1.3", 1964 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1965 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1966 | "dev": true 1967 | }, 1968 | "node_modules/mz": { 1969 | "version": "2.7.0", 1970 | "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", 1971 | "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", 1972 | "dev": true, 1973 | "license": "MIT", 1974 | "dependencies": { 1975 | "any-promise": "^1.0.0", 1976 | "object-assign": "^4.0.1", 1977 | "thenify-all": "^1.0.0" 1978 | } 1979 | }, 1980 | "node_modules/nanoid": { 1981 | "version": "3.3.8", 1982 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", 1983 | "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", 1984 | "dev": true, 1985 | "funding": [ 1986 | { 1987 | "type": "github", 1988 | "url": "https://github.com/sponsors/ai" 1989 | } 1990 | ], 1991 | "license": "MIT", 1992 | "bin": { 1993 | "nanoid": "bin/nanoid.cjs" 1994 | }, 1995 | "engines": { 1996 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1997 | } 1998 | }, 1999 | "node_modules/object-assign": { 2000 | "version": "4.1.1", 2001 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2002 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 2003 | "dev": true, 2004 | "license": "MIT", 2005 | "engines": { 2006 | "node": ">=0.10.0" 2007 | } 2008 | }, 2009 | "node_modules/package-json-from-dist": { 2010 | "version": "1.0.0", 2011 | "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", 2012 | "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", 2013 | "dev": true, 2014 | "license": "BlueOak-1.0.0" 2015 | }, 2016 | "node_modules/path-key": { 2017 | "version": "3.1.1", 2018 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2019 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2020 | "dev": true, 2021 | "engines": { 2022 | "node": ">=8" 2023 | } 2024 | }, 2025 | "node_modules/path-scurry": { 2026 | "version": "1.11.1", 2027 | "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", 2028 | "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", 2029 | "dev": true, 2030 | "license": "BlueOak-1.0.0", 2031 | "dependencies": { 2032 | "lru-cache": "^10.2.0", 2033 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" 2034 | }, 2035 | "engines": { 2036 | "node": ">=16 || 14 >=14.18" 2037 | }, 2038 | "funding": { 2039 | "url": "https://github.com/sponsors/isaacs" 2040 | } 2041 | }, 2042 | "node_modules/pathe": { 2043 | "version": "2.0.3", 2044 | "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", 2045 | "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", 2046 | "dev": true, 2047 | "license": "MIT" 2048 | }, 2049 | "node_modules/pathval": { 2050 | "version": "2.0.0", 2051 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", 2052 | "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", 2053 | "dev": true, 2054 | "license": "MIT", 2055 | "engines": { 2056 | "node": ">= 14.16" 2057 | } 2058 | }, 2059 | "node_modules/picocolors": { 2060 | "version": "1.1.1", 2061 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 2062 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 2063 | "dev": true, 2064 | "license": "ISC" 2065 | }, 2066 | "node_modules/picomatch": { 2067 | "version": "4.0.2", 2068 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", 2069 | "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", 2070 | "dev": true, 2071 | "license": "MIT", 2072 | "engines": { 2073 | "node": ">=12" 2074 | }, 2075 | "funding": { 2076 | "url": "https://github.com/sponsors/jonschlinkert" 2077 | } 2078 | }, 2079 | "node_modules/pirates": { 2080 | "version": "4.0.6", 2081 | "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", 2082 | "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", 2083 | "dev": true, 2084 | "license": "MIT", 2085 | "engines": { 2086 | "node": ">= 6" 2087 | } 2088 | }, 2089 | "node_modules/pkg-types": { 2090 | "version": "1.3.1", 2091 | "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", 2092 | "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", 2093 | "dev": true, 2094 | "license": "MIT", 2095 | "dependencies": { 2096 | "confbox": "^0.1.8", 2097 | "mlly": "^1.7.4", 2098 | "pathe": "^2.0.1" 2099 | } 2100 | }, 2101 | "node_modules/postcss": { 2102 | "version": "8.5.3", 2103 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", 2104 | "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", 2105 | "dev": true, 2106 | "funding": [ 2107 | { 2108 | "type": "opencollective", 2109 | "url": "https://opencollective.com/postcss/" 2110 | }, 2111 | { 2112 | "type": "tidelift", 2113 | "url": "https://tidelift.com/funding/github/npm/postcss" 2114 | }, 2115 | { 2116 | "type": "github", 2117 | "url": "https://github.com/sponsors/ai" 2118 | } 2119 | ], 2120 | "license": "MIT", 2121 | "dependencies": { 2122 | "nanoid": "^3.3.8", 2123 | "picocolors": "^1.1.1", 2124 | "source-map-js": "^1.2.1" 2125 | }, 2126 | "engines": { 2127 | "node": "^10 || ^12 || >=14" 2128 | } 2129 | }, 2130 | "node_modules/postcss-load-config": { 2131 | "version": "6.0.1", 2132 | "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", 2133 | "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", 2134 | "dev": true, 2135 | "funding": [ 2136 | { 2137 | "type": "opencollective", 2138 | "url": "https://opencollective.com/postcss/" 2139 | }, 2140 | { 2141 | "type": "github", 2142 | "url": "https://github.com/sponsors/ai" 2143 | } 2144 | ], 2145 | "license": "MIT", 2146 | "dependencies": { 2147 | "lilconfig": "^3.1.1" 2148 | }, 2149 | "engines": { 2150 | "node": ">= 18" 2151 | }, 2152 | "peerDependencies": { 2153 | "jiti": ">=1.21.0", 2154 | "postcss": ">=8.0.9", 2155 | "tsx": "^4.8.1", 2156 | "yaml": "^2.4.2" 2157 | }, 2158 | "peerDependenciesMeta": { 2159 | "jiti": { 2160 | "optional": true 2161 | }, 2162 | "postcss": { 2163 | "optional": true 2164 | }, 2165 | "tsx": { 2166 | "optional": true 2167 | }, 2168 | "yaml": { 2169 | "optional": true 2170 | } 2171 | } 2172 | }, 2173 | "node_modules/prettier": { 2174 | "version": "3.5.2", 2175 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.2.tgz", 2176 | "integrity": "sha512-lc6npv5PH7hVqozBR7lkBNOGXV9vMwROAPlumdBkX0wTbbzPu/U1hk5yL8p2pt4Xoc+2mkT8t/sow2YrV/M5qg==", 2177 | "dev": true, 2178 | "license": "MIT", 2179 | "bin": { 2180 | "prettier": "bin/prettier.cjs" 2181 | }, 2182 | "engines": { 2183 | "node": ">=14" 2184 | }, 2185 | "funding": { 2186 | "url": "https://github.com/prettier/prettier?sponsor=1" 2187 | } 2188 | }, 2189 | "node_modules/punycode": { 2190 | "version": "2.3.1", 2191 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 2192 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 2193 | "dev": true, 2194 | "license": "MIT", 2195 | "engines": { 2196 | "node": ">=6" 2197 | } 2198 | }, 2199 | "node_modules/readdirp": { 2200 | "version": "4.1.2", 2201 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", 2202 | "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", 2203 | "dev": true, 2204 | "license": "MIT", 2205 | "engines": { 2206 | "node": ">= 14.18.0" 2207 | }, 2208 | "funding": { 2209 | "type": "individual", 2210 | "url": "https://paulmillr.com/funding/" 2211 | } 2212 | }, 2213 | "node_modules/resolve-from": { 2214 | "version": "5.0.0", 2215 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", 2216 | "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", 2217 | "dev": true, 2218 | "license": "MIT", 2219 | "engines": { 2220 | "node": ">=8" 2221 | } 2222 | }, 2223 | "node_modules/rollup": { 2224 | "version": "4.40.2", 2225 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.2.tgz", 2226 | "integrity": "sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==", 2227 | "dev": true, 2228 | "license": "MIT", 2229 | "dependencies": { 2230 | "@types/estree": "1.0.7" 2231 | }, 2232 | "bin": { 2233 | "rollup": "dist/bin/rollup" 2234 | }, 2235 | "engines": { 2236 | "node": ">=18.0.0", 2237 | "npm": ">=8.0.0" 2238 | }, 2239 | "optionalDependencies": { 2240 | "@rollup/rollup-android-arm-eabi": "4.40.2", 2241 | "@rollup/rollup-android-arm64": "4.40.2", 2242 | "@rollup/rollup-darwin-arm64": "4.40.2", 2243 | "@rollup/rollup-darwin-x64": "4.40.2", 2244 | "@rollup/rollup-freebsd-arm64": "4.40.2", 2245 | "@rollup/rollup-freebsd-x64": "4.40.2", 2246 | "@rollup/rollup-linux-arm-gnueabihf": "4.40.2", 2247 | "@rollup/rollup-linux-arm-musleabihf": "4.40.2", 2248 | "@rollup/rollup-linux-arm64-gnu": "4.40.2", 2249 | "@rollup/rollup-linux-arm64-musl": "4.40.2", 2250 | "@rollup/rollup-linux-loongarch64-gnu": "4.40.2", 2251 | "@rollup/rollup-linux-powerpc64le-gnu": "4.40.2", 2252 | "@rollup/rollup-linux-riscv64-gnu": "4.40.2", 2253 | "@rollup/rollup-linux-riscv64-musl": "4.40.2", 2254 | "@rollup/rollup-linux-s390x-gnu": "4.40.2", 2255 | "@rollup/rollup-linux-x64-gnu": "4.40.2", 2256 | "@rollup/rollup-linux-x64-musl": "4.40.2", 2257 | "@rollup/rollup-win32-arm64-msvc": "4.40.2", 2258 | "@rollup/rollup-win32-ia32-msvc": "4.40.2", 2259 | "@rollup/rollup-win32-x64-msvc": "4.40.2", 2260 | "fsevents": "~2.3.2" 2261 | } 2262 | }, 2263 | "node_modules/semver": { 2264 | "version": "7.6.3", 2265 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", 2266 | "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", 2267 | "dev": true, 2268 | "license": "ISC", 2269 | "bin": { 2270 | "semver": "bin/semver.js" 2271 | }, 2272 | "engines": { 2273 | "node": ">=10" 2274 | } 2275 | }, 2276 | "node_modules/shebang-command": { 2277 | "version": "2.0.0", 2278 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2279 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2280 | "dev": true, 2281 | "dependencies": { 2282 | "shebang-regex": "^3.0.0" 2283 | }, 2284 | "engines": { 2285 | "node": ">=8" 2286 | } 2287 | }, 2288 | "node_modules/shebang-regex": { 2289 | "version": "3.0.0", 2290 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2291 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2292 | "dev": true, 2293 | "engines": { 2294 | "node": ">=8" 2295 | } 2296 | }, 2297 | "node_modules/siginfo": { 2298 | "version": "2.0.0", 2299 | "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", 2300 | "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", 2301 | "dev": true, 2302 | "license": "ISC" 2303 | }, 2304 | "node_modules/source-map": { 2305 | "version": "0.8.0-beta.0", 2306 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", 2307 | "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", 2308 | "dev": true, 2309 | "license": "BSD-3-Clause", 2310 | "dependencies": { 2311 | "whatwg-url": "^7.0.0" 2312 | }, 2313 | "engines": { 2314 | "node": ">= 8" 2315 | } 2316 | }, 2317 | "node_modules/source-map-js": { 2318 | "version": "1.2.1", 2319 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 2320 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 2321 | "dev": true, 2322 | "engines": { 2323 | "node": ">=0.10.0" 2324 | } 2325 | }, 2326 | "node_modules/stackback": { 2327 | "version": "0.0.2", 2328 | "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", 2329 | "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", 2330 | "dev": true, 2331 | "license": "MIT" 2332 | }, 2333 | "node_modules/std-env": { 2334 | "version": "3.9.0", 2335 | "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", 2336 | "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", 2337 | "dev": true, 2338 | "license": "MIT" 2339 | }, 2340 | "node_modules/string-width": { 2341 | "version": "5.1.2", 2342 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 2343 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 2344 | "dev": true, 2345 | "license": "MIT", 2346 | "dependencies": { 2347 | "eastasianwidth": "^0.2.0", 2348 | "emoji-regex": "^9.2.2", 2349 | "strip-ansi": "^7.0.1" 2350 | }, 2351 | "engines": { 2352 | "node": ">=12" 2353 | }, 2354 | "funding": { 2355 | "url": "https://github.com/sponsors/sindresorhus" 2356 | } 2357 | }, 2358 | "node_modules/string-width-cjs": { 2359 | "name": "string-width", 2360 | "version": "4.2.3", 2361 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2362 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2363 | "dev": true, 2364 | "license": "MIT", 2365 | "dependencies": { 2366 | "emoji-regex": "^8.0.0", 2367 | "is-fullwidth-code-point": "^3.0.0", 2368 | "strip-ansi": "^6.0.1" 2369 | }, 2370 | "engines": { 2371 | "node": ">=8" 2372 | } 2373 | }, 2374 | "node_modules/string-width-cjs/node_modules/ansi-regex": { 2375 | "version": "5.0.1", 2376 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2377 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2378 | "dev": true, 2379 | "license": "MIT", 2380 | "engines": { 2381 | "node": ">=8" 2382 | } 2383 | }, 2384 | "node_modules/string-width-cjs/node_modules/emoji-regex": { 2385 | "version": "8.0.0", 2386 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 2387 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 2388 | "dev": true, 2389 | "license": "MIT" 2390 | }, 2391 | "node_modules/string-width-cjs/node_modules/strip-ansi": { 2392 | "version": "6.0.1", 2393 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2394 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2395 | "dev": true, 2396 | "license": "MIT", 2397 | "dependencies": { 2398 | "ansi-regex": "^5.0.1" 2399 | }, 2400 | "engines": { 2401 | "node": ">=8" 2402 | } 2403 | }, 2404 | "node_modules/strip-ansi": { 2405 | "version": "7.1.0", 2406 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 2407 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 2408 | "dev": true, 2409 | "license": "MIT", 2410 | "dependencies": { 2411 | "ansi-regex": "^6.0.1" 2412 | }, 2413 | "engines": { 2414 | "node": ">=12" 2415 | }, 2416 | "funding": { 2417 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 2418 | } 2419 | }, 2420 | "node_modules/strip-ansi-cjs": { 2421 | "name": "strip-ansi", 2422 | "version": "6.0.1", 2423 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2424 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2425 | "dev": true, 2426 | "license": "MIT", 2427 | "dependencies": { 2428 | "ansi-regex": "^5.0.1" 2429 | }, 2430 | "engines": { 2431 | "node": ">=8" 2432 | } 2433 | }, 2434 | "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { 2435 | "version": "5.0.1", 2436 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2437 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2438 | "dev": true, 2439 | "license": "MIT", 2440 | "engines": { 2441 | "node": ">=8" 2442 | } 2443 | }, 2444 | "node_modules/sucrase": { 2445 | "version": "3.35.0", 2446 | "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", 2447 | "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", 2448 | "dev": true, 2449 | "license": "MIT", 2450 | "dependencies": { 2451 | "@jridgewell/gen-mapping": "^0.3.2", 2452 | "commander": "^4.0.0", 2453 | "glob": "^10.3.10", 2454 | "lines-and-columns": "^1.1.6", 2455 | "mz": "^2.7.0", 2456 | "pirates": "^4.0.1", 2457 | "ts-interface-checker": "^0.1.9" 2458 | }, 2459 | "bin": { 2460 | "sucrase": "bin/sucrase", 2461 | "sucrase-node": "bin/sucrase-node" 2462 | }, 2463 | "engines": { 2464 | "node": ">=16 || 14 >=14.17" 2465 | } 2466 | }, 2467 | "node_modules/supports-color": { 2468 | "version": "7.2.0", 2469 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 2470 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 2471 | "dev": true, 2472 | "license": "MIT", 2473 | "dependencies": { 2474 | "has-flag": "^4.0.0" 2475 | }, 2476 | "engines": { 2477 | "node": ">=8" 2478 | } 2479 | }, 2480 | "node_modules/test-exclude": { 2481 | "version": "7.0.1", 2482 | "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", 2483 | "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", 2484 | "dev": true, 2485 | "license": "ISC", 2486 | "dependencies": { 2487 | "@istanbuljs/schema": "^0.1.2", 2488 | "glob": "^10.4.1", 2489 | "minimatch": "^9.0.4" 2490 | }, 2491 | "engines": { 2492 | "node": ">=18" 2493 | } 2494 | }, 2495 | "node_modules/thenify": { 2496 | "version": "3.3.1", 2497 | "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", 2498 | "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", 2499 | "dev": true, 2500 | "license": "MIT", 2501 | "dependencies": { 2502 | "any-promise": "^1.0.0" 2503 | } 2504 | }, 2505 | "node_modules/thenify-all": { 2506 | "version": "1.6.0", 2507 | "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", 2508 | "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", 2509 | "dev": true, 2510 | "license": "MIT", 2511 | "dependencies": { 2512 | "thenify": ">= 3.1.0 < 4" 2513 | }, 2514 | "engines": { 2515 | "node": ">=0.8" 2516 | } 2517 | }, 2518 | "node_modules/tinybench": { 2519 | "version": "2.9.0", 2520 | "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", 2521 | "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", 2522 | "dev": true, 2523 | "license": "MIT" 2524 | }, 2525 | "node_modules/tinyexec": { 2526 | "version": "0.3.2", 2527 | "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", 2528 | "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", 2529 | "dev": true, 2530 | "license": "MIT" 2531 | }, 2532 | "node_modules/tinyglobby": { 2533 | "version": "0.2.13", 2534 | "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", 2535 | "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", 2536 | "dev": true, 2537 | "license": "MIT", 2538 | "dependencies": { 2539 | "fdir": "^6.4.4", 2540 | "picomatch": "^4.0.2" 2541 | }, 2542 | "engines": { 2543 | "node": ">=12.0.0" 2544 | }, 2545 | "funding": { 2546 | "url": "https://github.com/sponsors/SuperchupuDev" 2547 | } 2548 | }, 2549 | "node_modules/tinypool": { 2550 | "version": "1.0.2", 2551 | "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", 2552 | "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", 2553 | "dev": true, 2554 | "license": "MIT", 2555 | "engines": { 2556 | "node": "^18.0.0 || >=20.0.0" 2557 | } 2558 | }, 2559 | "node_modules/tinyrainbow": { 2560 | "version": "2.0.0", 2561 | "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", 2562 | "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", 2563 | "dev": true, 2564 | "license": "MIT", 2565 | "engines": { 2566 | "node": ">=14.0.0" 2567 | } 2568 | }, 2569 | "node_modules/tinyspy": { 2570 | "version": "3.0.2", 2571 | "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", 2572 | "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", 2573 | "dev": true, 2574 | "license": "MIT", 2575 | "engines": { 2576 | "node": ">=14.0.0" 2577 | } 2578 | }, 2579 | "node_modules/to-fast-properties": { 2580 | "version": "2.0.0", 2581 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 2582 | "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", 2583 | "dev": true, 2584 | "license": "MIT", 2585 | "engines": { 2586 | "node": ">=4" 2587 | } 2588 | }, 2589 | "node_modules/tr46": { 2590 | "version": "1.0.1", 2591 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", 2592 | "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", 2593 | "dev": true, 2594 | "license": "MIT", 2595 | "dependencies": { 2596 | "punycode": "^2.1.0" 2597 | } 2598 | }, 2599 | "node_modules/tree-kill": { 2600 | "version": "1.2.2", 2601 | "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", 2602 | "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", 2603 | "dev": true, 2604 | "license": "MIT", 2605 | "bin": { 2606 | "tree-kill": "cli.js" 2607 | } 2608 | }, 2609 | "node_modules/ts-interface-checker": { 2610 | "version": "0.1.13", 2611 | "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", 2612 | "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", 2613 | "dev": true, 2614 | "license": "Apache-2.0" 2615 | }, 2616 | "node_modules/tsup": { 2617 | "version": "8.5.0", 2618 | "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.5.0.tgz", 2619 | "integrity": "sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ==", 2620 | "dev": true, 2621 | "license": "MIT", 2622 | "dependencies": { 2623 | "bundle-require": "^5.1.0", 2624 | "cac": "^6.7.14", 2625 | "chokidar": "^4.0.3", 2626 | "consola": "^3.4.0", 2627 | "debug": "^4.4.0", 2628 | "esbuild": "^0.25.0", 2629 | "fix-dts-default-cjs-exports": "^1.0.0", 2630 | "joycon": "^3.1.1", 2631 | "picocolors": "^1.1.1", 2632 | "postcss-load-config": "^6.0.1", 2633 | "resolve-from": "^5.0.0", 2634 | "rollup": "^4.34.8", 2635 | "source-map": "0.8.0-beta.0", 2636 | "sucrase": "^3.35.0", 2637 | "tinyexec": "^0.3.2", 2638 | "tinyglobby": "^0.2.11", 2639 | "tree-kill": "^1.2.2" 2640 | }, 2641 | "bin": { 2642 | "tsup": "dist/cli-default.js", 2643 | "tsup-node": "dist/cli-node.js" 2644 | }, 2645 | "engines": { 2646 | "node": ">=18" 2647 | }, 2648 | "peerDependencies": { 2649 | "@microsoft/api-extractor": "^7.36.0", 2650 | "@swc/core": "^1", 2651 | "postcss": "^8.4.12", 2652 | "typescript": ">=4.5.0" 2653 | }, 2654 | "peerDependenciesMeta": { 2655 | "@microsoft/api-extractor": { 2656 | "optional": true 2657 | }, 2658 | "@swc/core": { 2659 | "optional": true 2660 | }, 2661 | "postcss": { 2662 | "optional": true 2663 | }, 2664 | "typescript": { 2665 | "optional": true 2666 | } 2667 | } 2668 | }, 2669 | "node_modules/typescript": { 2670 | "version": "5.8.2", 2671 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", 2672 | "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", 2673 | "dev": true, 2674 | "license": "Apache-2.0", 2675 | "bin": { 2676 | "tsc": "bin/tsc", 2677 | "tsserver": "bin/tsserver" 2678 | }, 2679 | "engines": { 2680 | "node": ">=14.17" 2681 | } 2682 | }, 2683 | "node_modules/ufo": { 2684 | "version": "1.6.1", 2685 | "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", 2686 | "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", 2687 | "dev": true, 2688 | "license": "MIT" 2689 | }, 2690 | "node_modules/vite": { 2691 | "version": "6.3.5", 2692 | "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", 2693 | "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", 2694 | "dev": true, 2695 | "license": "MIT", 2696 | "dependencies": { 2697 | "esbuild": "^0.25.0", 2698 | "fdir": "^6.4.4", 2699 | "picomatch": "^4.0.2", 2700 | "postcss": "^8.5.3", 2701 | "rollup": "^4.34.9", 2702 | "tinyglobby": "^0.2.13" 2703 | }, 2704 | "bin": { 2705 | "vite": "bin/vite.js" 2706 | }, 2707 | "engines": { 2708 | "node": "^18.0.0 || ^20.0.0 || >=22.0.0" 2709 | }, 2710 | "funding": { 2711 | "url": "https://github.com/vitejs/vite?sponsor=1" 2712 | }, 2713 | "optionalDependencies": { 2714 | "fsevents": "~2.3.3" 2715 | }, 2716 | "peerDependencies": { 2717 | "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", 2718 | "jiti": ">=1.21.0", 2719 | "less": "*", 2720 | "lightningcss": "^1.21.0", 2721 | "sass": "*", 2722 | "sass-embedded": "*", 2723 | "stylus": "*", 2724 | "sugarss": "*", 2725 | "terser": "^5.16.0", 2726 | "tsx": "^4.8.1", 2727 | "yaml": "^2.4.2" 2728 | }, 2729 | "peerDependenciesMeta": { 2730 | "@types/node": { 2731 | "optional": true 2732 | }, 2733 | "jiti": { 2734 | "optional": true 2735 | }, 2736 | "less": { 2737 | "optional": true 2738 | }, 2739 | "lightningcss": { 2740 | "optional": true 2741 | }, 2742 | "sass": { 2743 | "optional": true 2744 | }, 2745 | "sass-embedded": { 2746 | "optional": true 2747 | }, 2748 | "stylus": { 2749 | "optional": true 2750 | }, 2751 | "sugarss": { 2752 | "optional": true 2753 | }, 2754 | "terser": { 2755 | "optional": true 2756 | }, 2757 | "tsx": { 2758 | "optional": true 2759 | }, 2760 | "yaml": { 2761 | "optional": true 2762 | } 2763 | } 2764 | }, 2765 | "node_modules/vite-node": { 2766 | "version": "3.1.3", 2767 | "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.1.3.tgz", 2768 | "integrity": "sha512-uHV4plJ2IxCl4u1up1FQRrqclylKAogbtBfOTwcuJ28xFi+89PZ57BRh+naIRvH70HPwxy5QHYzg1OrEaC7AbA==", 2769 | "dev": true, 2770 | "license": "MIT", 2771 | "dependencies": { 2772 | "cac": "^6.7.14", 2773 | "debug": "^4.4.0", 2774 | "es-module-lexer": "^1.7.0", 2775 | "pathe": "^2.0.3", 2776 | "vite": "^5.0.0 || ^6.0.0" 2777 | }, 2778 | "bin": { 2779 | "vite-node": "vite-node.mjs" 2780 | }, 2781 | "engines": { 2782 | "node": "^18.0.0 || ^20.0.0 || >=22.0.0" 2783 | }, 2784 | "funding": { 2785 | "url": "https://opencollective.com/vitest" 2786 | } 2787 | }, 2788 | "node_modules/vitest": { 2789 | "version": "3.1.3", 2790 | "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.1.3.tgz", 2791 | "integrity": "sha512-188iM4hAHQ0km23TN/adso1q5hhwKqUpv+Sd6p5sOuh6FhQnRNW3IsiIpvxqahtBabsJ2SLZgmGSpcYK4wQYJw==", 2792 | "dev": true, 2793 | "license": "MIT", 2794 | "dependencies": { 2795 | "@vitest/expect": "3.1.3", 2796 | "@vitest/mocker": "3.1.3", 2797 | "@vitest/pretty-format": "^3.1.3", 2798 | "@vitest/runner": "3.1.3", 2799 | "@vitest/snapshot": "3.1.3", 2800 | "@vitest/spy": "3.1.3", 2801 | "@vitest/utils": "3.1.3", 2802 | "chai": "^5.2.0", 2803 | "debug": "^4.4.0", 2804 | "expect-type": "^1.2.1", 2805 | "magic-string": "^0.30.17", 2806 | "pathe": "^2.0.3", 2807 | "std-env": "^3.9.0", 2808 | "tinybench": "^2.9.0", 2809 | "tinyexec": "^0.3.2", 2810 | "tinyglobby": "^0.2.13", 2811 | "tinypool": "^1.0.2", 2812 | "tinyrainbow": "^2.0.0", 2813 | "vite": "^5.0.0 || ^6.0.0", 2814 | "vite-node": "3.1.3", 2815 | "why-is-node-running": "^2.3.0" 2816 | }, 2817 | "bin": { 2818 | "vitest": "vitest.mjs" 2819 | }, 2820 | "engines": { 2821 | "node": "^18.0.0 || ^20.0.0 || >=22.0.0" 2822 | }, 2823 | "funding": { 2824 | "url": "https://opencollective.com/vitest" 2825 | }, 2826 | "peerDependencies": { 2827 | "@edge-runtime/vm": "*", 2828 | "@types/debug": "^4.1.12", 2829 | "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", 2830 | "@vitest/browser": "3.1.3", 2831 | "@vitest/ui": "3.1.3", 2832 | "happy-dom": "*", 2833 | "jsdom": "*" 2834 | }, 2835 | "peerDependenciesMeta": { 2836 | "@edge-runtime/vm": { 2837 | "optional": true 2838 | }, 2839 | "@types/debug": { 2840 | "optional": true 2841 | }, 2842 | "@types/node": { 2843 | "optional": true 2844 | }, 2845 | "@vitest/browser": { 2846 | "optional": true 2847 | }, 2848 | "@vitest/ui": { 2849 | "optional": true 2850 | }, 2851 | "happy-dom": { 2852 | "optional": true 2853 | }, 2854 | "jsdom": { 2855 | "optional": true 2856 | } 2857 | } 2858 | }, 2859 | "node_modules/webidl-conversions": { 2860 | "version": "4.0.2", 2861 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", 2862 | "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", 2863 | "dev": true, 2864 | "license": "BSD-2-Clause" 2865 | }, 2866 | "node_modules/whatwg-url": { 2867 | "version": "7.1.0", 2868 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", 2869 | "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", 2870 | "dev": true, 2871 | "license": "MIT", 2872 | "dependencies": { 2873 | "lodash.sortby": "^4.7.0", 2874 | "tr46": "^1.0.1", 2875 | "webidl-conversions": "^4.0.2" 2876 | } 2877 | }, 2878 | "node_modules/which": { 2879 | "version": "2.0.2", 2880 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2881 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2882 | "dev": true, 2883 | "dependencies": { 2884 | "isexe": "^2.0.0" 2885 | }, 2886 | "bin": { 2887 | "node-which": "bin/node-which" 2888 | }, 2889 | "engines": { 2890 | "node": ">= 8" 2891 | } 2892 | }, 2893 | "node_modules/why-is-node-running": { 2894 | "version": "2.3.0", 2895 | "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", 2896 | "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", 2897 | "dev": true, 2898 | "license": "MIT", 2899 | "dependencies": { 2900 | "siginfo": "^2.0.0", 2901 | "stackback": "0.0.2" 2902 | }, 2903 | "bin": { 2904 | "why-is-node-running": "cli.js" 2905 | }, 2906 | "engines": { 2907 | "node": ">=8" 2908 | } 2909 | }, 2910 | "node_modules/wrap-ansi": { 2911 | "version": "8.1.0", 2912 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", 2913 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 2914 | "dev": true, 2915 | "license": "MIT", 2916 | "dependencies": { 2917 | "ansi-styles": "^6.1.0", 2918 | "string-width": "^5.0.1", 2919 | "strip-ansi": "^7.0.1" 2920 | }, 2921 | "engines": { 2922 | "node": ">=12" 2923 | }, 2924 | "funding": { 2925 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 2926 | } 2927 | }, 2928 | "node_modules/wrap-ansi-cjs": { 2929 | "name": "wrap-ansi", 2930 | "version": "7.0.0", 2931 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 2932 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 2933 | "dev": true, 2934 | "license": "MIT", 2935 | "dependencies": { 2936 | "ansi-styles": "^4.0.0", 2937 | "string-width": "^4.1.0", 2938 | "strip-ansi": "^6.0.0" 2939 | }, 2940 | "engines": { 2941 | "node": ">=10" 2942 | }, 2943 | "funding": { 2944 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 2945 | } 2946 | }, 2947 | "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { 2948 | "version": "5.0.1", 2949 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2950 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2951 | "dev": true, 2952 | "license": "MIT", 2953 | "engines": { 2954 | "node": ">=8" 2955 | } 2956 | }, 2957 | "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { 2958 | "version": "4.3.0", 2959 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 2960 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 2961 | "dev": true, 2962 | "license": "MIT", 2963 | "dependencies": { 2964 | "color-convert": "^2.0.1" 2965 | }, 2966 | "engines": { 2967 | "node": ">=8" 2968 | }, 2969 | "funding": { 2970 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 2971 | } 2972 | }, 2973 | "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { 2974 | "version": "8.0.0", 2975 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 2976 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 2977 | "dev": true, 2978 | "license": "MIT" 2979 | }, 2980 | "node_modules/wrap-ansi-cjs/node_modules/string-width": { 2981 | "version": "4.2.3", 2982 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2983 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2984 | "dev": true, 2985 | "license": "MIT", 2986 | "dependencies": { 2987 | "emoji-regex": "^8.0.0", 2988 | "is-fullwidth-code-point": "^3.0.0", 2989 | "strip-ansi": "^6.0.1" 2990 | }, 2991 | "engines": { 2992 | "node": ">=8" 2993 | } 2994 | }, 2995 | "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { 2996 | "version": "6.0.1", 2997 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2998 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2999 | "dev": true, 3000 | "license": "MIT", 3001 | "dependencies": { 3002 | "ansi-regex": "^5.0.1" 3003 | }, 3004 | "engines": { 3005 | "node": ">=8" 3006 | } 3007 | } 3008 | } 3009 | } 3010 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "rich-editor-to-markdown-parser", 3 | "version": "1.2.0", 4 | "description": "Rich Editor response convert to markdown.", 5 | "main": "./dist/rich-editor-to-markdown-parser.js", 6 | "module": "./dist/esm/rich-editor-to-markdown-parser.js", 7 | "types": "./dist/rich-editor-to-markdown-parser.d.ts", 8 | "scripts": { 9 | "build": "tsup src/index.ts", 10 | "watch": "tsup src/index.ts --watch", 11 | "test": "vitest", 12 | "coverage": "vitest run --coverage", 13 | "lint": "biome lint ./*" 14 | }, 15 | "keywords": [ 16 | "markdown", 17 | "microCMS" 18 | ], 19 | "author": "hiro08", 20 | "license": "MIT", 21 | "files": [ 22 | "dist" 23 | ], 24 | "devDependencies": { 25 | "@biomejs/biome": "1.9.4", 26 | "@vitest/coverage-v8": "^3.0.7", 27 | "prettier": "^3.5.2", 28 | "tsup": "^8.4.0", 29 | "typescript": "^5.7.3", 30 | "vitest": "^3.0.7" 31 | }, 32 | "dependencies": { 33 | "html-dom-parser": "^5.0.13" 34 | }, 35 | "volta": { 36 | "node": "22.14.0" 37 | } 38 | } -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "config:base" 4 | ] 5 | } -------------------------------------------------------------------------------- /src/convert-dom-to-markdown.ts: -------------------------------------------------------------------------------- 1 | import type { DOMNode, Element, Text } from "html-dom-parser"; 2 | import { 3 | createCodeBlockMark, 4 | createCustomClass, 5 | createHorizontalRuleMark, 6 | createImageMark, 7 | createInlineCodeMark, 8 | createLinkMark, 9 | createTextMark, 10 | } from "./marks"; 11 | import type { Image, MarkStyle } from "./options"; 12 | import { 13 | isCodeElement, 14 | isCustomClassElement, 15 | isHorizontalRuleElement, 16 | isImageElement, 17 | isLinkElement, 18 | isListElement, 19 | isTableElement, 20 | isTextElement, 21 | } from "./utils"; 22 | 23 | /** 24 | * Converts an array of DOM nodes into a Markdown string. 25 | * @param nodes - Array of DOM nodes to convert. 26 | * @param image - Image conversion options. 27 | * @param markStyle - Style options for Markdown formatting. 28 | * @returns The generated Markdown string. 29 | */ 30 | const convertDOMToMarkdown = ({ 31 | nodes, 32 | image, 33 | markStyle, 34 | }: { 35 | nodes: DOMNode[]; 36 | image: Image; 37 | markStyle: MarkStyle; 38 | }): string => { 39 | const result = []; 40 | 41 | for (const node of nodes) { 42 | if (node.type === "text") { 43 | result.push(convertTextNode(node)); 44 | } 45 | 46 | if (node.type === "tag") { 47 | result.push(convertTagNode(node, image, markStyle)); 48 | 49 | if (node.children.length !== 0) { 50 | convertDOMToMarkdown({ 51 | nodes: node.children as DOMNode[], 52 | image, 53 | markStyle, 54 | }); 55 | } 56 | } 57 | } 58 | 59 | return result.join("\n\n"); 60 | }; 61 | 62 | /** 63 | * Converts a text node into a Markdown string. 64 | * @param node - The text node to convert. 65 | * @returns The text content as a string. 66 | */ 67 | const convertTextNode = (node: Text): string => { 68 | return node.data; 69 | }; 70 | 71 | /** 72 | * Converts an HTML element node into Markdown based on its type. 73 | * @param node - The HTML element node to convert. 74 | * @param image - Image conversion options. 75 | * @param markStyle - Style options for Markdown formatting. 76 | * @returns The generated Markdown string for the element. 77 | */ 78 | const convertTagNode = ( 79 | node: Element, 80 | image: Image, 81 | markStyle: MarkStyle, 82 | ): string => { 83 | if (isTextElement(node)) { 84 | const marks = getRecursionMarks(node, image, markStyle); 85 | return createTextMark({ tagName: node.name, marks, markStyle }); 86 | } 87 | 88 | if (isHorizontalRuleElement(node)) { 89 | const marks = getRecursionMarks(node, image, markStyle); 90 | return createHorizontalRuleMark(marks, markStyle); 91 | } 92 | 93 | if (isLinkElement(node)) { 94 | const { href } = node.attribs; 95 | const marks = getRecursionMarks(node, image, markStyle); 96 | 97 | return createLinkMark(marks, href); 98 | } 99 | 100 | if (isImageElement(node)) { 101 | if (node.name === "figure") { 102 | const marks = getRecursionMarks(node, image, markStyle); 103 | 104 | return marks; 105 | } 106 | 107 | const { alt } = node.attribs; 108 | const imgUrl = buildImageUrl(node, image); 109 | 110 | return createImageMark({ 111 | src: imgUrl, 112 | alt, 113 | }); 114 | } 115 | if (isCodeElement(node)) { 116 | if (node.name === "div") { 117 | const marks = getRecursionMarks(node, image, markStyle); 118 | 119 | return marks; 120 | } 121 | 122 | if (node.name === "pre") { 123 | const marks = getRecursionMarks(node, image, markStyle); 124 | 125 | const language = getChildNodeClass(node) 126 | .join("") 127 | .replace("language-", ""); 128 | const fileName = 129 | node.parentNode?.type === "tag" 130 | ? node.parentNode.attribs["data-filename"] 131 | : undefined; 132 | 133 | return createCodeBlockMark({ marks, markStyle, language, fileName }); 134 | } 135 | 136 | if (node.name === "code") { 137 | const marks = getRecursionMarks(node, image, markStyle); 138 | const isCodeBlock = 139 | node.parentNode?.type === "tag" && node.parentNode?.name === "pre"; 140 | 141 | return isCodeBlock ? marks : createInlineCodeMark(marks); 142 | } 143 | } 144 | 145 | if (isListElement(node)) { 146 | if (node.name === "ul" || node.name === "ol") { 147 | const marks = getRecursionMarks(node, image, markStyle); 148 | if (node.parentNode?.type === "tag" && node.parentNode?.name === "li") { 149 | return marks; 150 | } 151 | 152 | return marks; 153 | } 154 | const marks = getRecursionMarks(node, image, markStyle); 155 | const space = 156 | node.parent?.type === "tag" && 157 | node.parent.prev && 158 | (node.parent.name === "ul" || node.parent.name === "ol") 159 | ? " ".repeat(findDepth(node) - 1) 160 | : ""; 161 | const addLine = 162 | node.parent?.type === "tag" && !node.prev && node.parent.prev ? "\n" : ""; 163 | const endLine = node.next ? "\n" : ""; 164 | 165 | if (node.parentNode?.type === "tag" && node.parentNode?.name === "ol") { 166 | const olNum = Array.from(node.parentNode.children).indexOf(node) + 1; 167 | 168 | return `${addLine}${space}${olNum} ${marks}${endLine}`; 169 | } 170 | 171 | return `${addLine}${space}- ${marks}${endLine}`; 172 | } 173 | 174 | if (isTableElement(node)) { 175 | if (node.name === "table" || node.name === "tbody") { 176 | const marks = getRecursionMarks(node, image, markStyle); 177 | 178 | return marks; 179 | } 180 | 181 | if (node.name === "tr") { 182 | const marks = getRecursionMarks(node, image, markStyle); 183 | const head = node.prev 184 | ? "" 185 | : `${"| --- ".repeat(node.children.length)}|\n`; 186 | 187 | return marks + head; 188 | } 189 | 190 | if (node.name === "th" || node.name === "td") { 191 | const marks = getRecursionMarks(node, image, markStyle); 192 | const nextStr = node.next ? " " : " " + "|"; 193 | const endLine = node.next ? "" : "\n"; 194 | 195 | return `| ${marks}${nextStr}${endLine}`; 196 | } 197 | } 198 | 199 | if (isCustomClassElement(node)) { 200 | const marks = getRecursionMarks(node, image, markStyle); 201 | const { class: _class } = node.attribs; 202 | 203 | return createCustomClass(marks, _class); 204 | } 205 | 206 | if (node.children.length !== 0) { 207 | convertDOMToMarkdown({ 208 | nodes: node.children as DOMNode[], 209 | image, 210 | markStyle, 211 | }); 212 | } 213 | 214 | return ""; 215 | }; 216 | 217 | /** 218 | * Recursively processes DOM nodes to generate a Markdown string. 219 | * @param node - The parent DOM element. 220 | * @param image - Image conversion options. 221 | * @param markStyle - Style options for Markdown formatting. 222 | * @returns The concatenated Markdown string for the children. 223 | */ 224 | const getRecursionMarks = ( 225 | node: Element, 226 | image: Image, 227 | markStyle: MarkStyle, 228 | ) => { 229 | return node.childNodes 230 | .map((child) => { 231 | const childNode = 232 | child.type === "tag" || child.type === "text" ? child : null; 233 | 234 | if (childNode === null) { 235 | return ""; 236 | } 237 | 238 | return convertDOMToMarkdown({ 239 | nodes: [childNode], 240 | image, 241 | markStyle, 242 | }); 243 | }) 244 | .join(""); 245 | }; 246 | 247 | /** 248 | * Extracts the class names of a node's children. 249 | * @param node - The DOM element. 250 | * @returns An array of class names. 251 | */ 252 | const getChildNodeClass = (node: Element) => { 253 | return node.children 254 | .map((child) => (child.type === "tag" ? child.attribs.class : undefined)) 255 | .filter(Boolean); 256 | }; 257 | 258 | /** 259 | * Builds an image URL with optional size and query parameters. 260 | * @param node - The image DOM element. 261 | * @param image - Image conversion options (size and query parameters). 262 | * @returns The constructed image URL. 263 | */ 264 | const buildImageUrl = ( 265 | node: Element, 266 | image: { size?: boolean; query?: string }, 267 | ) => { 268 | const { src, width, height } = node.attribs; 269 | const url = new URL(src); 270 | 271 | if (image.size) { 272 | url.searchParams.set("w", width?.toString() ?? ""); 273 | url.searchParams.set("h", height?.toString() ?? ""); 274 | } 275 | 276 | if (image.query) { 277 | const params = new URLSearchParams(image.query); 278 | 279 | params.forEach((value, key) => { 280 | url.searchParams.set(key, value); 281 | }); 282 | } 283 | 284 | return url.href; 285 | }; 286 | 287 | /** 288 | * Calculates the nesting depth of a list element. 289 | * @param node - The list element. 290 | * @param currentDepth - The current depth (default is 0). 291 | * @returns The calculated depth. 292 | */ 293 | const findDepth = (node: Element, currentDepth = 0): number => { 294 | const depth = currentDepth; 295 | 296 | if (node.parent?.type === "tag" && isListElement(node.parent)) { 297 | return findDepth(node.parent, depth + 1); 298 | } 299 | 300 | return depth; 301 | }; 302 | 303 | export { convertDOMToMarkdown }; 304 | -------------------------------------------------------------------------------- /src/html-to-markdown-parser.ts: -------------------------------------------------------------------------------- 1 | import parse from "html-dom-parser"; 2 | import { convertDOMToMarkdown } from "./convert-dom-to-markdown"; 3 | import { makeOptions } from "./options"; 4 | import type { OptionTypes } from "./options"; 5 | 6 | /** 7 | * @param html - HTML string. 8 | * @param options - Options. 9 | * @returns - String 10 | */ 11 | const HTMLToMarkdownParser = (html: string, options?: OptionTypes) => { 12 | const { image, markStyle } = makeOptions(options); 13 | const nodes = parse(html); 14 | if (nodes) { 15 | return convertDOMToMarkdown({ nodes, image, markStyle }); 16 | } 17 | 18 | console.error("Failed to parse HTML string."); 19 | return ""; 20 | }; 21 | 22 | export { HTMLToMarkdownParser }; 23 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { HTMLToMarkdownParser } from "./html-to-markdown-parser"; 2 | import type { OptionTypes } from "./options"; 3 | 4 | /** 5 | * @param html - HTML string. 6 | * @param options - Options. 7 | * @returns - String 8 | */ 9 | const parser = (html: string, options?: OptionTypes) => { 10 | if (typeof html !== "string") { 11 | throw new TypeError("First argument must be a string"); 12 | } 13 | 14 | if (!html) { 15 | return ""; 16 | } 17 | 18 | return HTMLToMarkdownParser(html, options); 19 | }; 20 | 21 | export { parser }; 22 | -------------------------------------------------------------------------------- /src/marks.ts: -------------------------------------------------------------------------------- 1 | import type { MarkStyle } from "./options"; 2 | 3 | const createTextMark = ({ 4 | tagName, 5 | marks, 6 | markStyle, 7 | }: { 8 | tagName: string; 9 | marks: string; 10 | markStyle: MarkStyle; 11 | }) => { 12 | switch (tagName) { 13 | case "p": 14 | return marks; 15 | case "h1": 16 | return `# ${marks}`; 17 | case "h2": 18 | return `## ${marks}`; 19 | case "h3": 20 | return `### ${marks}`; 21 | case "h4": 22 | return `#### ${marks}`; 23 | case "h5": 24 | return `##### ${marks}`; 25 | case "strong": 26 | return markStyle.strong + marks + markStyle.strong; 27 | case "em": 28 | return markStyle.em + marks + markStyle.em; 29 | case "s": 30 | return `~~${marks}~~`; 31 | case "u": 32 | return `${marks}`; 33 | case "blockquote": 34 | return `> ${marks}`; 35 | case "br": 36 | return "\n"; 37 | default: 38 | return ""; 39 | } 40 | }; 41 | 42 | const createHorizontalRuleMark = (marks: string, markStyle: MarkStyle) => { 43 | return marks + markStyle.hr; 44 | }; 45 | 46 | const createImageMark = ({ src, alt }: { src: string; alt: string }) => { 47 | return `![${alt}](${src})`; 48 | }; 49 | 50 | const createLinkMark = (marks: string, href: string) => { 51 | return `[${marks}](${href})`; 52 | }; 53 | 54 | const createCodeBlockMark = ({ 55 | marks, 56 | markStyle, 57 | language, 58 | fileName, 59 | }: { 60 | marks: string; 61 | markStyle: MarkStyle; 62 | language?: string; 63 | fileName?: string; 64 | }) => { 65 | const fileNameMark = fileName ? `:${fileName}` : ""; 66 | return `${markStyle.pre}${language}${fileNameMark}\n${marks}\n${markStyle.pre}`; 67 | }; 68 | 69 | const createInlineCodeMark = (marks: string) => { 70 | return `\`${marks}\``; 71 | }; 72 | 73 | const createCustomClass = (marks: string, _class: string) => { 74 | return `${marks}`; 75 | }; 76 | 77 | export { 78 | createTextMark, 79 | createHorizontalRuleMark, 80 | createLinkMark, 81 | createImageMark, 82 | createCodeBlockMark, 83 | createInlineCodeMark, 84 | createCustomClass, 85 | }; 86 | -------------------------------------------------------------------------------- /src/options.ts: -------------------------------------------------------------------------------- 1 | export type OptionTypes = { 2 | image?: Partial; 3 | /** 4 | * Change markdown style. 5 | */ 6 | markStyle?: Partial; 7 | }; 8 | 9 | export type Image = { 10 | /** 11 | * Contain width and height image size 12 | * ex) ?w=1200&h=630 13 | */ 14 | size: boolean; 15 | /** 16 | * Add image query in markdown. 17 | * ex) ?format=webp 18 | */ 19 | query: string; 20 | }; 21 | 22 | export type MarkStyle = { 23 | strong: "**" | "__"; 24 | em: "*" | "_"; 25 | li: "*" | "-" | "+"; 26 | hr: "---" | "***" | "___"; 27 | pre: "```" | "~~~"; 28 | }; 29 | 30 | const makeOptions = (options?: OptionTypes) => { 31 | return { 32 | image: { 33 | size: options?.image?.size ?? true, 34 | query: options?.image?.query ?? "", 35 | }, 36 | markStyle: { 37 | strong: options?.markStyle?.strong ?? "**", 38 | em: options?.markStyle?.em ?? "*", 39 | li: options?.markStyle?.li ?? "-", 40 | hr: options?.markStyle?.hr ?? "---", 41 | pre: options?.markStyle?.pre ?? "```", 42 | }, 43 | }; 44 | }; 45 | 46 | export { makeOptions }; 47 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | import type { Element } from "html-dom-parser"; 2 | 3 | /** 4 | * DOM Element group. 5 | */ 6 | const TEXT_ELEMENT = [ 7 | "p", 8 | "h1", 9 | "h2", 10 | "h3", 11 | "h4", 12 | "h5", 13 | "strong", 14 | "em", 15 | "s", 16 | "br", 17 | "u", 18 | "blockquote", 19 | ]; 20 | const HORIZONTAL_RULE_ELEMENT = ["hr"]; 21 | const LINK_ELEMENT = ["a"]; 22 | const IMAGE_ELEMENT = ["img", "figure", "figcaption"]; 23 | const CODE_ELEMENT = ["div", "pre", "code"]; 24 | const TABLE_ELEMENT = ["table", "tbody", "tr", "th", "td"]; 25 | const LIST_ELEMENT = ["ul", "ol", "li"]; 26 | const CUSTOM_CLASS_ELEMENT = ["span"]; 27 | 28 | /** 29 | * Find target DOM element. 30 | */ 31 | const isTextElement = (node: Element) => { 32 | return find(TEXT_ELEMENT, node.name); 33 | }; 34 | 35 | const isHorizontalRuleElement = (node: Element) => { 36 | return find(HORIZONTAL_RULE_ELEMENT, node.name); 37 | }; 38 | 39 | const isLinkElement = (node: Element) => { 40 | return find(LINK_ELEMENT, node.name); 41 | }; 42 | 43 | const isImageElement = (node: Element) => { 44 | return find(IMAGE_ELEMENT, node.name); 45 | }; 46 | 47 | const isCodeElement = (node: Element) => { 48 | return find(CODE_ELEMENT, node.name); 49 | }; 50 | 51 | const isTableElement = (node: Element) => { 52 | return find(TABLE_ELEMENT, node.name); 53 | }; 54 | 55 | const isListElement = (node: Element) => { 56 | return find(LIST_ELEMENT, node.name); 57 | }; 58 | 59 | const isCustomClassElement = (node: Element) => { 60 | return node.attribs.class && find(CUSTOM_CLASS_ELEMENT, node.name); 61 | }; 62 | 63 | const find = (elements: string[], name: string) => { 64 | return elements.some((v) => v === name); 65 | }; 66 | 67 | export { 68 | isTextElement, 69 | isHorizontalRuleElement, 70 | isLinkElement, 71 | isListElement, 72 | isImageElement, 73 | isCodeElement, 74 | isTableElement, 75 | isCustomClassElement, 76 | }; 77 | -------------------------------------------------------------------------------- /test/marks/code.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, test } from "vitest"; 2 | import { HTMLToMarkdownParser } from "../../src/html-to-markdown-parser"; 3 | import { options } from "./options"; 4 | 5 | describe("Code Block", () => { 6 | test("should return convert code block", () => { 7 | const parsed = HTMLToMarkdownParser("text"); 8 | expect(parsed).toBe("`text`"); 9 | }); 10 | 11 | test("should return convert code block", () => { 12 | const parsed = HTMLToMarkdownParser( 13 | "
console.log('test')
", 14 | ); 15 | expect(parsed).toBe("```\nconsole.log('test')\n```"); 16 | }); 17 | 18 | test("should return convert code block to option", () => { 19 | const parsed = HTMLToMarkdownParser( 20 | "
console.log('test')
", 21 | options, 22 | ); 23 | expect(parsed).toBe("~~~\nconsole.log('test')\n~~~"); 24 | }); 25 | 26 | test("should return convert code block with language", () => { 27 | const parsed = HTMLToMarkdownParser( 28 | '
console.log('test')
', 29 | ); 30 | expect(parsed).toBe("```javascript\nconsole.log('test')\n```"); 31 | }); 32 | 33 | test("should return convert code block with filename", () => { 34 | const parsed = HTMLToMarkdownParser( 35 | '
console.log('test')
', 36 | ); 37 | expect(parsed).toBe("```javascript:filename\nconsole.log('test')\n```"); 38 | }); 39 | }); 40 | -------------------------------------------------------------------------------- /test/marks/heading.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, test } from "vitest"; 2 | import { HTMLToMarkdownParser } from "../../src/html-to-markdown-parser"; 3 | 4 | describe("Heading", () => { 5 | test("should return convert h1 to #", () => { 6 | const parsed = HTMLToMarkdownParser("

Hello

"); 7 | expect(parsed).toBe("# Hello"); 8 | }); 9 | 10 | test("should return convert h2 to ##", () => { 11 | const parsed = HTMLToMarkdownParser("

Hello

"); 12 | expect(parsed).toBe("## Hello"); 13 | }); 14 | 15 | test("should return convert h3 to ###", () => { 16 | const parsed = HTMLToMarkdownParser("

Hello

"); 17 | expect(parsed).toBe("### Hello"); 18 | }); 19 | 20 | test("should return convert h4 to ####", () => { 21 | const parsed = HTMLToMarkdownParser("

Hello

"); 22 | expect(parsed).toBe("#### Hello"); 23 | }); 24 | 25 | test("should return convert h5 to #####", () => { 26 | const parsed = HTMLToMarkdownParser("
Hello
"); 27 | expect(parsed).toBe("##### Hello"); 28 | }); 29 | 30 | test("should return convert h1 with strong", () => { 31 | const parsed = HTMLToMarkdownParser("

Hello

"); 32 | expect(parsed).toBe("# **Hello**"); 33 | }); 34 | 35 | test("should return convert h6 to empty", () => { 36 | const parsed = HTMLToMarkdownParser("
Hello
"); 37 | expect(parsed).toBe(""); 38 | }); 39 | }); 40 | -------------------------------------------------------------------------------- /test/marks/horizontalRule.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, test } from "vitest"; 2 | import { HTMLToMarkdownParser } from "../../src/html-to-markdown-parser"; 3 | import { options } from "./options"; 4 | 5 | describe("Horizontal Rule", () => { 6 | test("should return convert hr to ---", () => { 7 | const parsed = HTMLToMarkdownParser("

text


text

"); 8 | expect(parsed).toBe("text\n\n---\n\ntext"); 9 | }); 10 | 11 | test("should return convert hr to option", () => { 12 | const parsed = HTMLToMarkdownParser( 13 | "

text


text

", 14 | options, 15 | ); 16 | expect(parsed).toBe("text\n\n***\n\ntext"); 17 | }); 18 | }); 19 | -------------------------------------------------------------------------------- /test/marks/image.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, test } from "vitest"; 2 | import { HTMLToMarkdownParser } from "../../src/html-to-markdown-parser"; 3 | import { options } from "./options"; 4 | 5 | describe("Image", () => { 6 | test("should return convert img to image marks", () => { 7 | const parsed = HTMLToMarkdownParser( 8 | '
text
', 9 | ); 10 | expect(parsed).toBe( 11 | "![text](https://images.microcms-assets.io/assets/service/test/file.png?w=1200&h=630)", 12 | ); 13 | }); 14 | 15 | test("should return convert img to without alt", () => { 16 | const parsed = HTMLToMarkdownParser( 17 | '
', 18 | ); 19 | expect(parsed).toBe( 20 | "![](https://images.microcms-assets.io/assets/service/test/file.png?w=1200&h=630)", 21 | ); 22 | }); 23 | 24 | test("should return convert img to option", () => { 25 | const parsed = HTMLToMarkdownParser( 26 | '
', 27 | options, 28 | ); 29 | expect(parsed).toBe( 30 | "![](https://images.microcms-assets.io/assets/service/test/file.png?format=webp)", 31 | ); 32 | }); 33 | 34 | test("should return convert img with link", () => { 35 | const parsed = HTMLToMarkdownParser( 36 | '
', 37 | ); 38 | expect(parsed).toBe( 39 | "[![](https://images.microcms-assets.io/assets/service/test/file.png?w=1200&h=630)](https://example.com)", 40 | ); 41 | }); 42 | }); 43 | -------------------------------------------------------------------------------- /test/marks/list.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, test } from "vitest"; 2 | import { HTMLToMarkdownParser } from "../../src/html-to-markdown-parser"; 3 | 4 | describe("List", () => { 5 | test("should return convert ul to -", () => { 6 | const parsed = HTMLToMarkdownParser(""); 7 | expect(parsed).toBe("- text\n- text2"); 8 | }); 9 | 10 | test("should return convert ol to number", () => { 11 | const parsed = HTMLToMarkdownParser( 12 | '
  1. text
  2. text
  3. text
', 13 | ); 14 | expect(parsed).toBe("1 text\n2 text\n3 text"); 15 | }); 16 | 17 | test("should return convert nested list", () => { 18 | const parsed = HTMLToMarkdownParser( 19 | "", 20 | ); 21 | expect(parsed).toBe( 22 | "- text1\n- text2\n - text3\n - text4\n 1 text5\n 2 text6\n 3 text7", 23 | ); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /test/marks/options.ts: -------------------------------------------------------------------------------- 1 | import type { OptionTypes } from "../../src/options"; 2 | 3 | export const options: OptionTypes = { 4 | image: { 5 | size: false, 6 | query: "format=webp", 7 | }, 8 | markStyle: { 9 | strong: "__", 10 | em: "_", 11 | li: "*", 12 | hr: "***", 13 | pre: "~~~", 14 | }, 15 | }; 16 | -------------------------------------------------------------------------------- /test/marks/table.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, test } from "vitest"; 2 | import { HTMLToMarkdownParser } from "../../src/html-to-markdown-parser"; 3 | 4 | describe("Table", () => { 5 | test("should return convert table", () => { 6 | const parsed = HTMLToMarkdownParser( 7 | '

TH

TH

TD

', 8 | ); 9 | expect(parsed).toBe("| TH | TH |\n| --- | --- |\n| TD |\n"); 10 | }); 11 | }); 12 | -------------------------------------------------------------------------------- /test/marks/text.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, test } from "vitest"; 2 | import { HTMLToMarkdownParser } from "../../src/html-to-markdown-parser"; 3 | import { options } from "./options"; 4 | 5 | describe("Text", () => { 6 | test("should return convert p to text", () => { 7 | const parsed = HTMLToMarkdownParser("

Hello

"); 8 | expect(parsed).toBe("Hello"); 9 | }); 10 | 11 | test("should return convert p to text", () => { 12 | const parsed = HTMLToMarkdownParser("

Hello

World

"); 13 | expect(parsed).toBe("Hello\n\nWorld"); 14 | }); 15 | 16 | test("should return convert br to \n", () => { 17 | const parsed = HTMLToMarkdownParser("

Hello
World

"); 18 | expect(parsed).toBe("Hello\nWorld"); 19 | }); 20 | 21 | test("should return convert strong to **text**", () => { 22 | const parsed = HTMLToMarkdownParser("

Hello

"); 23 | expect(parsed).toBe("**Hello**"); 24 | }); 25 | 26 | test("should return convert strong to option", () => { 27 | const parsed = HTMLToMarkdownParser( 28 | "

Hello

", 29 | options, 30 | ); 31 | expect(parsed).toBe("__Hello__"); 32 | }); 33 | 34 | test("should return convert italic to *text*", () => { 35 | const parsed = HTMLToMarkdownParser("

Hello

"); 36 | expect(parsed).toBe("*Hello*"); 37 | }); 38 | 39 | test("should return convert italic to option", () => { 40 | const parsed = HTMLToMarkdownParser("

Hello

", options); 41 | expect(parsed).toBe("_Hello_"); 42 | }); 43 | 44 | test("should return convert s to ~~text~~", () => { 45 | const parsed = HTMLToMarkdownParser("

Hello

"); 46 | expect(parsed).toBe("~~Hello~~"); 47 | }); 48 | 49 | test("should return convert u to text", () => { 50 | const parsed = HTMLToMarkdownParser("

Hello

"); 51 | expect(parsed).toBe("Hello"); 52 | }); 53 | 54 | test("should return convert a to link marks", () => { 55 | const parsed = HTMLToMarkdownParser( 56 | '

ここにリンク

', 57 | ); 58 | expect(parsed).toBe("[ここにリンク](https://example.com)"); 59 | }); 60 | 61 | test("should return convert blockquote to >", () => { 62 | const parsed = HTMLToMarkdownParser( 63 | "

Hello World!

", 64 | ); 65 | expect(parsed).toBe("> Hello World!"); 66 | }); 67 | 68 | test("should return convert custom class", () => { 69 | const parsed = HTMLToMarkdownParser( 70 | '

Hello World!

', 71 | ); 72 | expect(parsed).toBe('Hello World!'); 73 | }); 74 | }); 75 | -------------------------------------------------------------------------------- /test/rich-editor-to-markdown-perser.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, test } from "vitest"; 2 | import { parser } from "../src"; 3 | 4 | describe("HTMLToMarkdownParser", () => { 5 | test("should return convert markdown to HTML", () => { 6 | const parsed = parser("

Hello World!

Hello World!

"); 7 | expect(parsed).toBe("# Hello World!\n\nHello World!"); 8 | }); 9 | }); 10 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig to read more about this file */ 4 | 5 | /* Projects */ 6 | // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ 7 | // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ 8 | // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ 9 | // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ 10 | // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ 11 | // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ 12 | 13 | /* Language and Environment */ 14 | "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ 15 | // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ 16 | // "jsx": "preserve", /* Specify what JSX code is generated. */ 17 | // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ 18 | // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ 19 | // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ 20 | // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ 21 | // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ 22 | // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ 23 | // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ 24 | // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ 25 | // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ 26 | 27 | /* Modules */ 28 | "module": "commonjs", /* Specify what module code is generated. */ 29 | // "rootDir": "./", /* Specify the root folder within your source files. */ 30 | // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ 31 | // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ 32 | // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ 33 | // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ 34 | // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ 35 | // "types": [], /* Specify type package names to be included without being referenced in a source file. */ 36 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 37 | // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ 38 | // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ 39 | // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ 40 | // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ 41 | // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ 42 | // "resolveJsonModule": true, /* Enable importing .json files. */ 43 | // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ 44 | // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ 45 | 46 | /* JavaScript Support */ 47 | // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ 48 | // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ 49 | // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ 50 | 51 | /* Emit */ 52 | // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ 53 | // "declarationMap": true, /* Create sourcemaps for d.ts files. */ 54 | // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ 55 | // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ 56 | // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ 57 | // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ 58 | // "outDir": "./", /* Specify an output folder for all emitted files. */ 59 | // "removeComments": true, /* Disable emitting comments. */ 60 | // "noEmit": true, /* Disable emitting files from a compilation. */ 61 | // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ 62 | // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ 63 | // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ 64 | // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ 65 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 66 | // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ 67 | // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ 68 | // "newLine": "crlf", /* Set the newline character for emitting files. */ 69 | // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ 70 | // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ 71 | // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ 72 | // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ 73 | // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ 74 | // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ 75 | 76 | /* Interop Constraints */ 77 | // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ 78 | // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ 79 | // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ 80 | "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ 81 | // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ 82 | "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ 83 | 84 | /* Type Checking */ 85 | "strict": true, /* Enable all strict type-checking options. */ 86 | // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ 87 | // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ 88 | // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ 89 | // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ 90 | // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ 91 | // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ 92 | // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ 93 | // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ 94 | // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ 95 | // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ 96 | // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ 97 | // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ 98 | // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ 99 | // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ 100 | // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ 101 | // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ 102 | // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ 103 | // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ 104 | 105 | /* Completeness */ 106 | // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ 107 | "skipLibCheck": true /* Skip type checking all .d.ts files. */ 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /tsup.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'tsup'; 2 | 3 | export default defineConfig([ 4 | { 5 | name: 'main', 6 | entry: { 'rich-editor-to-markdown-parser': './src/index.ts' }, 7 | format: ['cjs', 'esm'], 8 | legacyOutput: true, 9 | sourcemap: true, 10 | clean: true, 11 | bundle: true, 12 | splitting: false, 13 | dts: true, 14 | minify: true, 15 | }, 16 | ]); 17 | -------------------------------------------------------------------------------- /vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | 3 | export default defineConfig({ 4 | test: { 5 | coverage: { 6 | reporter: ["text", "json-summary", "json"], 7 | reportOnFailure: true, 8 | thresholds: { 9 | statements: 90, 10 | functions: 90, 11 | branches: 90, 12 | lines: 90, 13 | }, 14 | }, 15 | }, 16 | }); 17 | --------------------------------------------------------------------------------