diff options
43 files changed, 12739 insertions, 8453 deletions
diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index f61a6ff..0000000 --- a/.eslintrc.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "extends": [ - "eslint:recommended", - "prettier", - "plugin:n/recommended", - "plugin:unicorn/recommended" - ], - "env": { - "node": true, - "es6": true - }, - "rules": { - "eqeqeq": [2, "smart"], - "no-caller": 2, - "dot-notation": 2, - "no-var": 2, - "prefer-const": 2, - "prefer-arrow-callback": [2, { "allowNamedFunctions": true }], - "arrow-body-style": [2, "as-needed"], - "object-shorthand": 2, - "prefer-template": 2, - "one-var": [2, "never"], - "prefer-destructuring": [2, { "object": true }], - "capitalized-comments": 2, - "multiline-comment-style": [2, "starred-block"], - "spaced-comment": 2, - "yoda": [2, "never"], - "curly": [2, "multi-line"], - "no-else-return": 2, - - "unicorn/prefer-module": 0, - "unicorn/filename-case": 0, - "unicorn/no-null": 0, - "unicorn/prefer-code-point": 0, - "unicorn/prefer-string-slice": 0, - "unicorn/prefer-add-event-listener": 0 - }, - "overrides": [ - { - "files": "*.ts", - "extends": [ - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended", - "prettier" - ], - "parserOptions": { - "sourceType": "module", - "project": "./tsconfig.eslint.json" - }, - "rules": { - "@typescript-eslint/prefer-for-of": 0, - "@typescript-eslint/member-ordering": 0, - "@typescript-eslint/explicit-function-return-type": 0, - "@typescript-eslint/no-unused-vars": 0, - "@typescript-eslint/no-use-before-define": [ - 2, - { "functions": false } - ], - "@typescript-eslint/consistent-type-definitions": [ - 2, - "interface" - ], - "@typescript-eslint/prefer-function-type": 2, - "@typescript-eslint/no-unnecessary-type-arguments": 2, - "@typescript-eslint/prefer-string-starts-ends-with": 2, - "@typescript-eslint/prefer-readonly": 2, - "@typescript-eslint/prefer-includes": 2, - "@typescript-eslint/no-unnecessary-condition": 2, - "@typescript-eslint/switch-exhaustiveness-check": 2, - "@typescript-eslint/prefer-nullish-coalescing": 2, - - "n/no-unsupported-features/es-syntax": 0 - } - } - ] -} diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index b440c74..39dffea 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,2 +1 @@ github: [fb55] -tidelift: npm/htmlparser2 diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 8764eff..6e808a6 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -20,12 +20,12 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v6 - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v4 with: languages: "javascript" - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v4 diff --git a/.github/workflows/dependabot-automerge.yml b/.github/workflows/dependabot-automerge.yml index 2fc1003..64e287f 100644 --- a/.github/workflows/dependabot-automerge.yml +++ b/.github/workflows/dependabot-automerge.yml @@ -13,7 +13,7 @@ jobs: steps: - name: Dependabot metadata id: metadata - uses: dependabot/fetch-metadata@v1.4.0 + uses: dependabot/fetch-metadata@v2.5.0 with: github-token: "${{ secrets.GITHUB_TOKEN }}" - name: Enable auto-merge for Dependabot PRs diff --git a/.github/workflows/nodejs-test.yml b/.github/workflows/nodejs-test.yml index 066f456..0a38f01 100644 --- a/.github/workflows/nodejs-test.yml +++ b/.github/workflows/nodejs-test.yml @@ -9,17 +9,16 @@ on: env: CI: true FORCE_COLOR: 2 - NODE_COV: lts/* # The Node.js version to run coveralls on permissions: - contents: read # to fetch code (actions/checkout) + contents: read jobs: lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 + - uses: actions/checkout@v6 + - uses: actions/setup-node@v6 with: node-version: lts/* cache: npm @@ -27,10 +26,6 @@ jobs: - run: npm run lint test: - permissions: - contents: read # to fetch code (actions/checkout) - checks: write # to create new checks (coverallsapp/github-action) - name: Node ${{ matrix.node }} runs-on: ubuntu-latest @@ -38,32 +33,19 @@ jobs: fail-fast: false matrix: node: - - 14 - - 16 - - 18 - - lts/* + - 20 + - 22 + - 24 + - "lts/*" steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v6 - name: Use Node.js ${{ matrix.node }} - uses: actions/setup-node@v3 + uses: actions/setup-node@v6 with: node-version: ${{ matrix.node }} cache: npm - run: npm ci - run: npm run build --if-present - - - name: Run Jest - run: npm run test:jest - if: matrix.node != env.NODE_COV - - - name: Run Jest with coverage - run: npm run test:jest -- --coverage - if: matrix.node == env.NODE_COV - - - name: Run Coveralls - uses: coverallsapp/github-action@v2.1.2 - if: matrix.node == env.NODE_COV - continue-on-error: true - with: - github-token: "${{ secrets.GITHUB_TOKEN }}" + - name: Run tests + run: npm run test:vi diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..ff5f688 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,52 @@ +name: Publish +on: + push: + tags: + - "v*" + +jobs: + publish: + runs-on: ubuntu-latest + + permissions: + contents: read + id-token: write + + steps: + - uses: actions/checkout@v6 + + - uses: actions/setup-node@v6 + with: + node-version: lts/* + registry-url: https://registry.npmjs.org + + - name: Install dependencies + run: npm ci + + - name: Create jsr.json based on package.json + run: | + node --input-type=module -e ' + import { readFileSync, writeFileSync } from "fs"; + const p = JSON.parse(readFileSync("./package.json", "utf8")); + const jsrJson = { + name: `@cheerio/${p.name}`, + version: p.version, + exports: { + ".": "./src/index.ts", + "./WritableStream": "./src/WritableStream.ts", + }, + imports: { + "domelementtype": `jsr:@cheerio/domelementtype@${p.dependencies.domelementtype}`, + "domhandler": `jsr:@cheerio/domhandler@${p.dependencies.domhandler}`, + "domutils": `jsr:@cheerio/domutils@${p.dependencies.domutils}`, + "entities": `jsr:@cheerio/entities@${p.dependencies.entities}`, + }, + }; + writeFileSync("./jsr.json", JSON.stringify(jsrJson, null, 2)); + ' + + - name: Publish package to JSR + run: npx jsr publish + + - name: Publish package to npm + run: npm publish --provenance --access public @@ -1,3 +1,4 @@ node_modules/ coverage/ -lib/ +dist/ +jsr.json diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index f417452..0000000 --- a/.prettierignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules/ -coverage/ -lib/ @@ -69,7 +69,7 @@ const parser = new htmlparser2.Parser({ }, }); parser.write( - "Xyz <script type='text/javascript'>const foo = '<<bar>>';</script>" + "Xyz <script type='text/javascript'>const foo = '<<bar>>';</script>", ); parser.end(); ``` @@ -83,8 +83,37 @@ JS! Hooray! That's it?! ``` -This example only shows three of the possible events. -Read more about the parser, its events and options in the [wiki](https://github.com/fb55/htmlparser2/wiki/Parser-options). +### Parser events + +All callbacks are optional. The handler object you pass to `Parser` may implement any subset of these: + +| Event | Description | +| -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| `onopentag(name, attribs, isImplied)` | Opening tag. `attribs` is an object mapping attribute names to values. `isImplied` is `true` when the tag was opened implicitly (HTML mode only). | +| `onopentagname(name)` | Emitted for the tag name as soon as it is available (before attributes are parsed). | +| `onattribute(name, value, quote)` | Attribute. `quote` is `"` / `'` / `null` (unquoted) / `undefined` (no value, e.g. `disabled`). | +| `onclosetag(name, isImplied)` | Closing tag. `isImplied` is `true` when the tag was closed implicitly (HTML mode only). | +| `ontext(data)` | Text content. May fire multiple times for a single text node. | +| `oncomment(data)` | Comment (content between `<!--` and `-->`). | +| `oncdatastart()` | Opening of a CDATA section (`<![CDATA[`). | +| `oncdataend()` | End of a CDATA section (`]]>`). | +| `onprocessinginstruction(name, data)` | Processing instruction (e.g. `<?xml ...?>`). | +| `oncommentend()` | Fires after a comment has ended. | +| `onparserinit(parser)` | Fires when the parser is initialized or reset. | +| `onreset()` | Fires when `parser.reset()` is called. | +| `onend()` | Fires when parsing is complete. | +| `onerror(error)` | Fires on error. | + +### Parser options + +| Option | Type | Default | Description | +| ------------------------ | --------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `xmlMode` | `boolean` | `false` | Treat the document as XML. This affects entity decoding, self-closing tags, CDATA handling, and more. Set this to `true` for XML, RSS, Atom and RDF feeds. | +| `decodeEntities` | `boolean` | `true` | Decode HTML entities (e.g. `&` -> `&`). | +| `lowerCaseTags` | `boolean` | `!xmlMode` | Lowercase tag names. | +| `lowerCaseAttributeNames`| `boolean` | `!xmlMode` | Lowercase attribute names. | +| `recognizeSelfClosing` | `boolean` | `xmlMode` | Recognize self-closing tags (e.g. `<br/>`). Always enabled in `xmlMode`. | +| `recognizeCDATA` | `boolean` | `xmlMode` | Recognize CDATA sections as text. Always enabled in `xmlMode`. | ### Usage with streams @@ -92,7 +121,7 @@ While the `Parser` interface closely resembles Node.js streams, it's not a 100% Use the `WritableStream` interface to process a streaming input: ```js -import { WritableStream } from "htmlparser2/lib/WritableStream"; +import { WritableStream } from "htmlparser2/WritableStream"; const parserStream = new WritableStream({ ontext(text) { @@ -106,25 +135,100 @@ htmlStream.pipe(parserStream).on("finish", () => console.log("done")); ## Getting a DOM -The `DomHandler` produces a DOM (document object model) that can be manipulated using the [`DomUtils`](https://github.com/fb55/DomUtils) helper. +The `parseDocument` helper parses a string and returns a DOM tree (a [`Document`](https://github.com/fb55/domhandler) node). ```js import * as htmlparser2 from "htmlparser2"; -const dom = htmlparser2.parseDocument(htmlString); +const dom = htmlparser2.parseDocument( + `<ul id="fruits"> + <li class="apple">Apple</li> + <li class="orange">Orange</li> + </ul>`, +); +``` + +`parseDocument` accepts an optional second argument with both parser and [DOM handler options](https://github.com/fb55/domhandler): + +```js +const dom = htmlparser2.parseDocument(data, { + // Parser options + xmlMode: true, + + // domhandler options + withStartIndices: true, // Add `startIndex` to each node + withEndIndices: true, // Add `endIndex` to each node +}); +``` + +### Searching the DOM + +The [`DomUtils`](https://github.com/fb55/domutils) module (re-exported on the main `htmlparser2` export) provides helpers for finding nodes: + +```js +import * as htmlparser2 from "htmlparser2"; + +const dom = htmlparser2.parseDocument(`<div><p id="greeting">Hello</p></div>`); + +// Find elements by ID, tag name, or class +const greeting = htmlparser2.DomUtils.getElementById("greeting", dom); +const paragraphs = htmlparser2.DomUtils.getElementsByTagName("p", dom); + +// Find elements with custom test functions +const all = htmlparser2.DomUtils.findAll( + (el) => el.attribs?.class === "active", + dom, +); + +// Get text content +htmlparser2.DomUtils.textContent(greeting); // "Hello" +``` + +For CSS selector queries, use [`css-select`](https://github.com/fb55/css-select): + +```js +import { selectAll, selectOne } from "css-select"; + +const results = selectAll("ul#fruits > li", dom); +const first = selectOne("li.apple", dom); +``` + +Or, if you'd prefer a jQuery-like API, use [`cheerio`](https://github.com/cheeriojs/cheerio). + +### Modifying and serializing the DOM + +Use `DomUtils` to modify the tree, and [`dom-serializer`](https://github.com/cheeriojs/dom-serializer) (also available as `DomUtils.getOuterHTML`) to serialize it back to HTML: + +```js +import * as htmlparser2 from "htmlparser2"; + +const dom = htmlparser2.parseDocument( + `<ul><li>Apple</li><li>Orange</li></ul>`, +); + +// Remove the first <li> +const items = htmlparser2.DomUtils.getElementsByTagName("li", dom); +htmlparser2.DomUtils.removeElement(items[0]); + +// Serialize back to HTML +const html = htmlparser2.DomUtils.getOuterHTML(dom); +// "<ul><li>Orange</li></ul>" ``` -The `DomHandler`, while still bundled with this module, was moved to its [own module](https://github.com/fb55/domhandler). -Have a look at that for further information. +Other manipulation helpers include `appendChild`, `prependChild`, `append`, `prepend`, and `replaceElement` -- see the [`domutils` docs](https://github.com/fb55/domutils) for the full API. -## Parsing Feeds +## Parsing feeds `htmlparser2` makes it easy to parse RSS, RDF and Atom feeds, by providing a `parseFeed` method: ```javascript -const feed = htmlparser2.parseFeed(content, options); +const feed = htmlparser2.parseFeed(content); ``` +This returns an object with `type`, `title`, `link`, `description`, `updated`, `author`, and `items` (an array of feed entries), or `null` if the document isn't a recognized feed format. + +The `xmlMode` option is enabled by default for `parseFeed`. If you pass custom options, make sure to include `xmlMode: true`. + ## Performance After having some artificial benchmarks for some time, **@AndreasMadsen** published his [`htmlparser-benchmark`](https://github.com/AndreasMadsen/htmlparser-benchmark), which benchmarks HTML parses based on real-world websites. @@ -147,25 +251,7 @@ saxes : 45.7921 ms/file ± 128.691 html5 : 120.844 ms/file ± 153.944 ``` -## How does this module differ from [node-htmlparser](https://github.com/tautologistics/node-htmlparser)? - -In 2011, this module started as a fork of the `htmlparser` module. -`htmlparser2` was rewritten multiple times and, while it maintains an API that's mostly compatible with `htmlparser`, the projects don't share any code anymore. - -The parser now provides a callback interface inspired by [sax.js](https://github.com/isaacs/sax-js) (originally targeted at [readabilitySAX](https://github.com/fb55/readabilitysax)). -As a result, old handlers won't work anymore. - -The `DefaultHandler` was renamed to clarify its purpose (to `DomHandler`). The old name is still available when requiring `htmlparser2` and your code should work as expected. - -The `RssHandler` was replaced with a `getFeed` function that takes a `DomHandler` DOM and returns a feed object. There is a `parseFeed` helper function that can be used to parse a feed from a string. - ## Security contact information To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security). Tidelift will coordinate the fix and disclosure. - -## `htmlparser2` for enterprise - -Available as part of the Tidelift Subscription. - -The maintainers of `htmlparser2` and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-htmlparser2?utm_source=npm-htmlparser2&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..dfd824d --- /dev/null +++ b/biome.json @@ -0,0 +1,96 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.4.7/schema.json", + "vcs": { + "enabled": true, + "clientKind": "git", + "useIgnoreFile": true + }, + "files": { + "ignoreUnknown": true, + "includes": ["**/*.{ts,md,json,yml}", "!**/.*"] + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 4 + }, + "javascript": { + "formatter": {} + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "suspicious": { + "noConstEnum": "off", + "noConstantBinaryExpressions": "error", + "useAwait": "error" + }, + "complexity": { + "noUselessStringConcat": "error", + "noUselessUndefined": "error", + "useSimplifiedLogicExpression": "error", + "useWhile": "error" + }, + "performance": { + "useTopLevelRegex": "error" + }, + "style": { + "noInferrableTypes": "error", + "noNegationElse": "error", + "noUnusedTemplateLiteral": "error", + "noUselessElse": "error", + "noYodaExpression": "error", + "useAsConstAssertion": "error", + "useCollapsedElseIf": "error", + "useCollapsedIf": "error", + "useConsistentArrayType": "error", + "useConsistentArrowReturn": "error", + "useConsistentMemberAccessibility": "error", + "useConsistentObjectDefinitions": "error", + "useConsistentTypeDefinitions": "error", + "useDefaultParameterLast": "error", + "useExplicitLengthCheck": "error", + "useNumberNamespace": "error", + "useNumericSeparators": "error", + "useObjectSpread": "error", + "useShorthandAssign": "error", + "useUnifiedTypeSignatures": "error" + } + } + }, + "assist": { + "enabled": true, + "actions": { + "source": { + "organizeImports": "on" + } + } + }, + "overrides": [ + { + "includes": ["**/*.{test,spec}.ts", "test/**/*.ts"], + "javascript": { + "globals": [ + "jest", + "describe", + "it", + "beforeEach", + "afterEach", + "expect", + "vi" + ] + } + }, + { + "includes": ["**/*.ts", "**/*.cts", "**/*.mts", "**/*.tsx"], + "linter": { + "rules": { + "complexity": { + "useLiteralKeys": "off" + } + } + } + } + ] +} diff --git a/debian/changelog b/debian/changelog index 18b25d2..6b01a07 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,22 @@ +node-htmlparser2 (12.0.0-1) experimental; urgency=medium + + * Team upload + * New upstream version 12.0.0 + * Declare compliance with policy 4.7.4 + * Drop obsolete jest patches + * Patch: drop isolatedDeclarations compiler option (TS 5.5+, not in Debian) + * Bump dependencies to new majors: + - node-domelementtype >= 3 + - node-domhandler >= 6 + - node-domutils >= 4 + - node-entities >= 8 + * Add Breaks against pre-bump node-cheerio / node-sanitize-html / + node-eslint-plugin-html + * Replace jest test with a trivial Node smoke test + * Simplify debian/rules to a single tsc invocation + + -- Xavier Guimard <yadd@debian.org> Sun, 03 May 2026 20:59:43 +0200 + node-htmlparser2 (9.0.0-2) unstable; urgency=medium * Team upload. diff --git a/debian/control b/debian/control index eecf99e..b0c0586 100644 --- a/debian/control +++ b/debian/control @@ -5,16 +5,13 @@ Section: javascript Testsuite: autopkgtest-pkg-nodejs Build-Depends: debhelper-compat (= 13) , dh-sequence-nodejs - , jest (>= 29) <!nocheck> - , node-domelementtype (>= 2.3.0~) - , node-domhandler (>= 5.0.2~) - , node-domutils (>= 3.1.0~) - , node-entities (>= 4.5.0~) - , node-istanbul + , node-domelementtype (>= 3.0.0~) + , node-domhandler (>= 6.0.0~) + , node-domutils (>= 4.0.0~) + , node-entities (>= 8.0.0~) , node-typescript , node-types-node - , ts-jest (>= 27) <!nocheck> -Standards-Version: 4.7.3 +Standards-Version: 4.7.4 Vcs-Browser: https://salsa.debian.org/js-team/node-htmlparser2 Vcs-Git: https://salsa.debian.org/js-team/node-htmlparser2.git Homepage: https://github.com/fb55/htmlparser2#readme @@ -22,11 +19,13 @@ Homepage: https://github.com/fb55/htmlparser2#readme Package: node-htmlparser2 Architecture: all Depends: ${misc:Depends} - , node-domelementtype (>= 2.3.0~~) - , node-domhandler (>= 5.0.2~) - , node-domutils (>= 3.1.0~) - , node-entities (>= 4.5.0~) -Breaks: node-cheerio (<< 1.0.0~rc~5+~cs6.1.2~) + , node-domelementtype (>= 3.0.0~) + , node-domhandler (>= 6.0.0~) + , node-domutils (>= 4.0.0~) + , node-entities (>= 8.0.0~) +Breaks: node-cheerio (<< 1.1~) + , node-sanitize-html (<< 2.15~) + , node-eslint-plugin-html (<< 6.3~) Description: Fast & forgiving HTML/XML/RSS parser A forgiving HTML/XML/RSS parser written in JS for NodeJS. The parser can handle streams (chunked data) and supports custom diff --git a/debian/nodejs/extlinks b/debian/nodejs/extlinks index 0e5db6f..a539f5b 100644 --- a/debian/nodejs/extlinks +++ b/debian/nodejs/extlinks @@ -2,6 +2,4 @@ domelementtype domhandler domutils entities -@types/jest test @types/node -ts-jest test diff --git a/debian/patches/disable-isolated-declarations.patch b/debian/patches/disable-isolated-declarations.patch new file mode 100644 index 0000000..25a95eb --- /dev/null +++ b/debian/patches/disable-isolated-declarations.patch @@ -0,0 +1,35 @@ +Description: Drop isolatedDeclarations option (TS 5.5+) + Debian's typescript (5.2.2) does not support the isolatedDeclarations + compiler option. Removing it does not affect runtime behaviour. +Author: Xavier Guimard <yadd@debian.org> +Forwarded: not-needed +Last-Update: 2026-05-03 + +--- a/tsconfig.json ++++ b/tsconfig.json +@@ -8,6 +8,7 @@ + "declarationMap": true, + "sourceMap": true, + "outDir": "dist", ++ "rootDir": "src", + + /* Strict Type-Checking Options */ + "strict": true, +@@ -16,7 +17,6 @@ + "exactOptionalPropertyTypes": true, + "forceConsistentCasingInFileNames": true, + "isolatedModules": true, +- "isolatedDeclarations": true, + "noFallthroughCasesInSwitch": true, + "noImplicitOverride": true, + "noImplicitReturns": true, +@@ -25,7 +25,8 @@ + "noUnusedParameters": true, + + /* Module Resolution Options */ +- "resolveJsonModule": true ++ "resolveJsonModule": true, ++ "types": ["node"] + }, + "include": ["src"], + "exclude": [ diff --git a/debian/patches/fix-for-jest-29.patch b/debian/patches/fix-for-jest-29.patch deleted file mode 100644 index 877a974..0000000 --- a/debian/patches/fix-for-jest-29.patch +++ /dev/null @@ -1,18 +0,0 @@ -Description: fix for jest >= 29 -Author: Yadd <yadd@debian.org> -Forwarded: not-needed -Last-Update: 2022-10-18 - ---- a/package.json -+++ b/package.json -@@ -81,6 +81,10 @@ - "typescript": "^5.0.4" - }, - "jest": { -+ "snapshotFormat": { -+ "escapeString": true, -+ "printBasicPrototype": true -+ }, - "preset": "ts-jest", - "testEnvironment": "node", - "coverageProvider": "v8", diff --git a/debian/patches/series b/debian/patches/series index 226713e..f09307c 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1,2 +1 @@ -workaround-bad-jest-config.patch -fix-for-jest-29.patch +disable-isolated-declarations.patch diff --git a/debian/patches/workaround-bad-jest-config.patch b/debian/patches/workaround-bad-jest-config.patch deleted file mode 100644 index 65ca0fd..0000000 --- a/debian/patches/workaround-bad-jest-config.patch +++ /dev/null @@ -1,16 +0,0 @@ -Description: workaround bad jest config -Author: Yadd <yadd@debian.org> -Forwarded: not-needed -Last-Update: 2023-07-16 - ---- a/package.json -+++ b/package.json -@@ -85,7 +85,7 @@ - "testEnvironment": "node", - "coverageProvider": "v8", - "moduleNameMapper": { -- "^(.*)\\.js$": [ -+ "^([^e].*)\\.js$": [ - "$1", - "$1.js" - ] diff --git a/debian/rules b/debian/rules index 31767ec..f30dace 100755 --- a/debian/rules +++ b/debian/rules @@ -1,13 +1,8 @@ #!/usr/bin/make -f # -*- makefile -*- -# Uncomment this to turn on verbose mode. -#export DH_VERBOSE=1 - %: dh $@ override_dh_auto_build: tsc - tsc -module esnext --target es2019 --outDir lib/esm - echo '{"type":"module"}' > lib/esm/package.json diff --git a/debian/tests/pkg-js/test b/debian/tests/pkg-js/test index a999885..92a56e6 100644 --- a/debian/tests/pkg-js/test +++ b/debian/tests/pkg-js/test @@ -1 +1 @@ -jest --ci -u +node --input-type=module -e 'import { parseDocument } from "htmlparser2"; import assert from "node:assert"; const dom = parseDocument("<p class=\"x\">hi</p>"); assert.strictEqual(dom.children.length, 1); assert.strictEqual(dom.children[0].name, "p"); assert.strictEqual(dom.children[0].attribs.class, "x"); console.log("ok");' diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..36594c1 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,57 @@ +import { defineConfig } from "eslint/config"; +import { commonTypeScriptRules } from "@feedic/eslint-config/typescript"; +import tseslint from "typescript-eslint"; +import eslintConfigBiome from "eslint-config-biome"; +import feedicFlatConfig from "@feedic/eslint-config"; + +export default defineConfig([ + ...feedicFlatConfig, + { + linterOptions: { + reportUnusedDisableDirectives: "error", + }, + }, + eslintConfigBiome, + { + ignores: ["coverage/**", "dist/**", "eslint.config.{js,cjs,mjs}"], + }, + { + rules: { + "n/no-unpublished-import": 0, + + "unicorn/filename-case": [ + 2, + { + cases: { + camelCase: true, + pascalCase: true, + }, + }, + ], + }, + }, + { + files: ["**/*.ts"], + extends: [...tseslint.configs.recommended], + + languageOptions: { + sourceType: "module", + parser: tseslint.parser, + + parserOptions: { + project: "./tsconfig.eslint.json", + }, + }, + + rules: { + ...commonTypeScriptRules, + }, + }, + { + files: ["**/*.spec.ts"], + + rules: { + "n/no-unsupported-features/node-builtins": 0, + }, + }, +]); diff --git a/package-lock.json b/package-lock.json index ab4f5a5..3065e25 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "htmlparser2", - "version": "9.0.0", - "lockfileVersion": 2, + "version": "12.0.0", + "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "htmlparser2", - "version": "9.0.0", + "version": "12.0.0", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -16,705 +16,443 @@ ], "license": "MIT", "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.1.0", - "entities": "^4.5.0" + "domelementtype": "^3.0.0", + "domhandler": "^6.0.0", + "domutils": "^4.0.2", + "entities": "^8.0.0" }, "devDependencies": { - "@types/jest": "^29.5.1", - "@types/node": "^20.1.1", - "@typescript-eslint/eslint-plugin": "^5.59.5", - "@typescript-eslint/parser": "^5.59.5", - "eslint": "^8.40.0", - "eslint-config-prettier": "^8.8.0", - "eslint-plugin-n": "^15.7.0", - "eslint-plugin-unicorn": "^47.0.0", - "jest": "^29.5.0", - "prettier": "^2.8.8", - "ts-jest": "^29.1.0", - "typescript": "^5.0.4" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@biomejs/biome": "^2.4.8", + "@feedic/eslint-config": "^0.3.1", + "@types/node": "^25.5.0", + "eslint": "^10.0.3", + "eslint-config-biome": "^2.1.3", + "typescript": "^5.9.3", + "typescript-eslint": "^8.57.1", + "vitest": "^4.1.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=20.19.0" } }, - "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "node_modules/@altano/repository-tools": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@altano/repository-tools/-/repository-tools-2.0.1.tgz", + "integrity": "sha512-YE/52CkFtb+YtHPgbWPai7oo5N9AKnMuP5LM+i2AG7G1H2jdYBCO1iDnkDE3dZ3C1MIgckaF+d5PNRulgt0bdw==", "dev": true, - "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } + "license": "ISC" }, - "node_modules/@babel/compat-data": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.5.tgz", - "integrity": "sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.5.tgz", - "integrity": "sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ==", + "node_modules/@biomejs/biome": { + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.4.8.tgz", + "integrity": "sha512-ponn0oKOky1oRXBV+rlSaUlixUxf1aZvWC19Z41zBfUOUesthrQqL3OtiAlSB1EjFjyWpn98Q64DHelhA6jNlA==", "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-module-transforms": "^7.20.2", - "@babel/helpers": "^7.20.5", - "@babel/parser": "^7.20.5", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "license": "MIT OR Apache-2.0", + "bin": { + "biome": "bin/biome" }, "engines": { - "node": ">=6.9.0" + "node": ">=14.21.3" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.5.tgz", - "integrity": "sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.5", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" + "url": "https://opencollective.com/biome" }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", - "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.20.0", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", - "dev": true, - "dependencies": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "optionalDependencies": { + "@biomejs/cli-darwin-arm64": "2.4.8", + "@biomejs/cli-darwin-x64": "2.4.8", + "@biomejs/cli-linux-arm64": "2.4.8", + "@biomejs/cli-linux-arm64-musl": "2.4.8", + "@biomejs/cli-linux-x64": "2.4.8", + "@biomejs/cli-linux-x64-musl": "2.4.8", + "@biomejs/cli-win32-arm64": "2.4.8", + "@biomejs/cli-win32-x64": "2.4.8" + } + }, + "node_modules/@biomejs/cli-darwin-arm64": { + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.4.8.tgz", + "integrity": "sha512-ARx0tECE8I7S2C2yjnWYLNbBdDoPdq3oyNLhMglmuctThwUsuzFWRKrHmIGwIRWKz0Mat9DuzLEDp52hGnrxGQ==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.9.0" + "node": ">=14.21.3" } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "node_modules/@biomejs/cli-darwin-x64": { + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.4.8.tgz", + "integrity": "sha512-Jg9/PsB9vDCJlANE8uhG7qDhb5w0Ix69D7XIIc8IfZPUoiPrbLm33k2Ig3NOJ/7nb3UbesFz3D1aDKm9DvzjhQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.9.0" + "node": ">=14.21.3" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", - "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", + "node_modules/@biomejs/cli-linux-arm64": { + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.4.8.tgz", + "integrity": "sha512-5CdrsJct76XG2hpKFwXnEtlT1p+4g4yV+XvvwBpzKsTNLO9c6iLlAxwcae2BJ7ekPGWjNGw9j09T5KGPKKxQig==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.2" - }, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=14.21.3" } }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "node_modules/@biomejs/cli-linux-arm64-musl": { + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.4.8.tgz", + "integrity": "sha512-Zo9OhBQDJ3IBGPlqHiTISloo5H0+FBIpemqIJdW/0edJ+gEcLR+MZeZozcUyz3o1nXkVA7++DdRKQT0599j9jA==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=14.21.3" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "node_modules/@biomejs/cli-linux-x64": { + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.4.8.tgz", + "integrity": "sha512-PdKXspVEaMCQLjtZCn6vfSck/li4KX9KGwSDbZdgIqlrizJ2MnMcE3TvHa2tVfXNmbjMikzcfJpuPWH695yJrw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=14.21.3" } }, - "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "node_modules/@biomejs/cli-linux-x64-musl": { + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.4.8.tgz", + "integrity": "sha512-Gi8quv8MEuDdKaPFtS2XjEnMqODPsRg6POT6KhoP+VrkNb+T2ywunVB+TvOU0LX1jAZzfBr+3V1mIbBhzAMKvw==", + "cpu": [ + "x64" + ], "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=14.21.3" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "node_modules/@biomejs/cli-win32-arm64": { + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.4.8.tgz", + "integrity": "sha512-LoFatS0tnHv6KkCVpIy3qZCih+MxUMvdYiPWLHRri7mhi2vyOOs8OrbZBcLTUEWCS+ktO72nZMy4F96oMhkOHQ==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6.9.0" + "node": ">=14.21.3" } }, - "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "node_modules/@biomejs/cli-win32-x64": { + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.4.8.tgz", + "integrity": "sha512-vAn7iXDoUbqFXqVocuq1sMYAd33p8+mmurqJkWl6CtIhobd/O6moe4rY5AJvzbunn/qZCdiDVcveqtkFh1e7Hg==", + "cpu": [ + "x64" + ], "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6.9.0" + "node": ">=14.21.3" } }, - "node_modules/@babel/helpers": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.6.tgz", - "integrity": "sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==", + "node_modules/@emnapi/core": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.0.tgz", + "integrity": "sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w==", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" - }, - "engines": { - "node": ">=6.9.0" + "@emnapi/wasi-threads": "1.2.0", + "tslib": "^2.4.0" } }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "node_modules/@emnapi/runtime": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.0.tgz", + "integrity": "sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" + "tslib": "^2.4.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", + "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" + "tslib": "^2.4.0" } }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@es-joy/jsdoccomment": { + "version": "0.84.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.84.0.tgz", + "integrity": "sha512-0xew1CxOam0gV5OMjh2KjFQZsKL2bByX1+q4j3E73MpYIdyUxcZb/xQct9ccUb+ve5KGUYbCUxyPnYB7RbuP+w==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@types/estree": "^1.0.8", + "@typescript-eslint/types": "^8.54.0", + "comment-parser": "1.4.5", + "esquery": "^1.7.0", + "jsdoc-type-pratt-parser": "~7.1.1" }, "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/@es-joy/resolve.exports": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@es-joy/resolve.exports/-/resolve.exports-1.2.0.tgz", + "integrity": "sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz", - "integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "funding": { + "url": "https://opencollective.com/eslint" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "node_modules/@eslint/config-array": { + "version": "0.23.3", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.3.tgz", + "integrity": "sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@eslint/object-schema": "^3.0.3", + "debug": "^4.3.1", + "minimatch": "^10.2.4" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "node_modules/@eslint/config-helpers": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.3.tgz", + "integrity": "sha512-lzGN0onllOZCGroKJmRwY6QcEHxbjBw1gwB8SgRSqK8YbbtEXMvKynsXc3553ckIEBxsbMBU7oOZXKIPGZNeZw==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@eslint/core": "^1.1.1" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "node_modules/@eslint/core": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.1.1.tgz", + "integrity": "sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@types/json-schema": "^7.0.15" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", - "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "node_modules/@eslint/js": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", + "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "funding": { + "url": "https://eslint.org/donate" }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.5.tgz", - "integrity": "sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.5", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.5", - "@babel/types": "^7.20.5", - "debug": "^4.1.0", - "globals": "^11.1.0" + "peerDependencies": { + "eslint": "^10.0.0" }, - "engines": { - "node": ">=6.9.0" + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "node_modules/@eslint/object-schema": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.3.tgz", + "integrity": "sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=4" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "node_modules/@eslint/plugin-kit": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.6.1.tgz", + "integrity": "sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" + "@eslint/core": "^1.1.1", + "levn": "^0.4.1" }, "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "node_modules/@feedic/eslint-config": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@feedic/eslint-config/-/eslint-config-0.3.1.tgz", + "integrity": "sha512-CBDfjWp629dQs4IaZVsQdeMVN2lPyKSVaitxnr/Vb5wz7lXwGX0h9h4Rn9nQ4O5OdgK4KIxftlD+4AnDdZfNpw==", "dev": true, + "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "@eslint/js": "^10.0.1", + "eslint-plugin-jsdoc": "^62.8.0", + "eslint-plugin-n": "^17.24.0", + "eslint-plugin-package-json": "^0.90.1", + "eslint-plugin-unicorn": "^63.0.0", + "globals": "^17.4.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=20.19.0" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.0.tgz", - "integrity": "sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", - "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.5.2", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "eslint": "^10.0.0", + "typescript-eslint": "^8.56.0" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependenciesMeta": { + "typescript-eslint": { + "optional": true + } } }, - "node_modules/@eslint/js": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.40.0.tgz", - "integrity": "sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA==", + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=18.18.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" }, "engines": { - "node": ">=10.10.0" + "node": ">=18.18.0" } }, "node_modules/@humanwhocodes/module-importer": { @@ -722,6 +460,7 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -730,699 +469,560 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, + "license": "Apache-2.0", "engines": { - "node": ">=8" + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } + "license": "MIT" }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@tybys/wasm-util": "^0.10.1" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/@oxc-project/runtime": { + "version": "0.115.0", + "resolved": "https://registry.npmjs.org/@oxc-project/runtime/-/runtime-0.115.0.tgz", + "integrity": "sha512-Rg8Wlt5dCbXhQnsXPrkOjL1DTSvXLgb2R/KYfnf1/K+R0k6UMLEmbQXPM+kwrWqSmWA2t0B1EtHy2/3zikQpvQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "node_modules/@oxc-project/types": { + "version": "0.115.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.115.0.tgz", + "integrity": "sha512-4n91DKnebUS4yjUHl2g3/b2T+IUdCfmoZGhmwsovZCDaJSs+QkVAM+0AqqTxHSsHfeiMuueT75cZaZcT/m0pSw==", "dev": true, - "engines": { - "node": ">=8" + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" } }, - "node_modules/@jest/console": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz", - "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==", + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.9.tgz", + "integrity": "sha512-lcJL0bN5hpgJfSIz/8PIf02irmyL43P+j1pTCfbD1DbLkmGRuFIA4DD3B3ZOvGqG0XiVvRznbKtN0COQVaKUTg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@jest/types": "^29.5.0", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", - "slash": "^3.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz", - "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==", - "dev": true, - "dependencies": { - "@jest/console": "^29.5.0", - "@jest/reporters": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.5.0", - "jest-config": "^29.5.0", - "jest-haste-map": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-resolve-dependencies": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "jest-watcher": "^29.5.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@jest/environment": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz", - "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==", + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.9.tgz", + "integrity": "sha512-J7Zk3kLYFsLtuH6U+F4pS2sYVzac0qkjcO5QxHS7OS7yZu2LRs+IXo+uvJ/mvpyUljDJ3LROZPoQfgBIpCMhdQ==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "jest-mock": "^29.5.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@jest/expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==", + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.9.tgz", + "integrity": "sha512-iwtmmghy8nhfRGeNAIltcNXzD0QMNaaA5U/NyZc1Ia4bxrzFByNMDoppoC+hl7cDiUq5/1CnFthpT9n+UtfFyg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "expect": "^29.5.0", - "jest-snapshot": "^29.5.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@jest/expect-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz", - "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==", + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.9.tgz", + "integrity": "sha512-DLFYI78SCiZr5VvdEplsVC2Vx53lnA4/Ga5C65iyldMVaErr86aiqCoNBLl92PXPfDtUYjUh+xFFor40ueNs4Q==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "jest-get-type": "^29.4.3" - }, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@jest/fake-timers": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz", - "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==", + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.9.tgz", + "integrity": "sha512-CsjTmTwd0Hri6iTw/DRMK7kOZ7FwAkrO4h8YWKoX/kcj833e4coqo2wzIFywtch/8Eb5enQ/lwLM7w6JX1W5RQ==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "@jest/types": "^29.5.0", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.5.0", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@jest/globals": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz", - "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==", + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.9.tgz", + "integrity": "sha512-2x9O2JbSPxpxMDhP9Z74mahAStibTlrBMW0520+epJH5sac7/LwZW5Bmg/E6CXuEF53JJFW509uP+lSedaUNxg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", - "@jest/types": "^29.5.0", - "jest-mock": "^29.5.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@jest/reporters": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz", - "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@jridgewell/trace-mapping": "^0.3.15", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", - "jest-worker": "^29.5.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/schemas": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", - "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.9.tgz", + "integrity": "sha512-JA1QRW31ogheAIRhIg9tjMfsYbglXXYGNPLdPEYrwFxdbkQCAzvpSCSHCDWNl4hTtrol8WeboCSEpjdZK8qrCg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.25.16" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@jest/source-map": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz", - "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==", + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.9.tgz", + "integrity": "sha512-aOKU9dJheda8Kj8Y3w9gnt9QFOO+qKPAl8SWd7JPHP+Cu0EuDAE5wokQubLzIDQWg2myXq2XhTpOVS07qqvT+w==", + "cpu": [ + "ppc64" + ], "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.15", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@jest/test-result": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz", - "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==", + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.9.tgz", + "integrity": "sha512-OalO94fqj7IWRn3VdXWty75jC5dk4C197AWEuMhIpvVv2lw9fiPhud0+bW2ctCxb3YoBZor71QHbY+9/WToadA==", + "cpu": [ + "s390x" + ], "dev": true, - "dependencies": { - "@jest/console": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@jest/test-sequencer": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz", - "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==", + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.9.tgz", + "integrity": "sha512-cVEl1vZtBsBZna3YMjGXNvnYYrOJ7RzuWvZU0ffvJUexWkukMaDuGhUXn0rjnV0ptzGVkvc+vW9Yqy6h8YX4pg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@jest/test-result": "^29.5.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "slash": "^3.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@jest/transform": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz", - "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==", + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.9.tgz", + "integrity": "sha512-UzYnKCIIc4heAKgI4PZ3dfBGUZefGCJ1TPDuLHoCzgrMYPb5Rv6TLFuYtyM4rWyHM7hymNdsg5ik2C+UD9VDbA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.5.0", - "@jridgewell/trace-mapping": "^0.3.15", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.5.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@jest/types": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", - "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.9.tgz", + "integrity": "sha512-+6zoiF+RRyf5cdlFQP7nm58mq7+/2PFaY2DNQeD4B87N36JzfF/l9mdBkkmTvSYcYPE8tMh/o3cRlsx1ldLfog==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@jest/schemas": "^29.4.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.9.tgz", + "integrity": "sha512-rgFN6sA/dyebil3YTlL2evvi/M+ivhfnyxec7AccTpRPccno/rPoNlqybEZQBkcbZu8Hy+eqNJCqfBR8P7Pg8g==", + "cpu": [ + "wasm32" + ], "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@napi-rs/wasm-runtime": "^1.1.1" }, "engines": { - "node": ">=6.0.0" + "node": ">=14.0.0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.9.tgz", + "integrity": "sha512-lHVNUG/8nlF1IQk1C0Ci574qKYyty2goMiPlRqkC5R+3LkXDkL5Dhx8ytbxq35m+pkHVIvIxviD+TWLdfeuadA==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6.0.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.9.tgz", + "integrity": "sha512-G0oA4+w1iY5AGi5HcDTxWsoxF509hrFIPB2rduV5aDqS9FtDg1CAfa7V34qImbjfhIcA8C+RekocJZA96EarwQ==", + "cpu": [ + "x64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.9.tgz", + "integrity": "sha512-w6oiRWgEBl04QkFZgmW+jnU1EC9b57Oihi2ot3HNWIQRqgHp5PnYDia5iZ5FF7rpa4EQdiqMDXjlqKGXBhsoXw==", "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } + "license": "MIT" }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@sindresorhus/base62": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/base62/-/base62-1.0.0.tgz", + "integrity": "sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "node": ">=18" }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.25.22", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.22.tgz", - "integrity": "sha512-6U6r2L7rnM7EG8G1tWzIjdB3QlsHF4slgcqXNN/SF0xJOAr0nDmT2GedlkyO3mrv8mDTJ24UuOMWR3diBrCvQQ==", - "dev": true - }, - "node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", - "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", "dev": true, - "dependencies": { - "@sinonjs/commons": "^2.0.0" - } + "license": "MIT" }, - "node_modules/@types/babel__core": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", - "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "tslib": "^2.4.0" } }, - "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.0.0" + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" } }, - "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } + "license": "MIT" }, - "node_modules/@types/babel__traverse": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", - "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", "dev": true, - "dependencies": { - "@babel/types": "^7.3.0" - } + "license": "MIT" }, - "node_modules/@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true + "license": "MIT" }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } + "license": "MIT" }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "node_modules/@types/node": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz", + "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", "dev": true, + "license": "MIT", "dependencies": { - "@types/istanbul-lib-report": "*" + "undici-types": "~7.18.0" } }, - "node_modules/@types/jest": { - "version": "29.5.1", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.1.tgz", - "integrity": "sha512-tEuVcHrpaixS36w7hpsfLBLpjtMRJUE09/MHXn923LOVojDwyC14cWcfc0rDs0VEfUyYmt/+iX1kxxp+gZMcaQ==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.1.tgz", + "integrity": "sha512-Gn3aqnvNl4NGc6x3/Bqk1AOn0thyTU9bqDRhiRnUWezgvr2OnhYCWCgC8zXXRVqBsIL1pSDt7T9nJUe0oM0kDQ==", "dev": true, + "license": "MIT", "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.57.1", + "@typescript-eslint/type-utils": "8.57.1", + "@typescript-eslint/utils": "8.57.1", + "@typescript-eslint/visitor-keys": "8.57.1", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.57.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "20.1.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.1.tgz", - "integrity": "sha512-uKBEevTNb+l6/aCQaKVnUModfEMjAl98lw2Si9P5y4hLu9tm6AlX2ZIoXZX6Wh9lJueYPrGPKk5WMCNHg/u6/A==", - "dev": true - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "node_modules/@types/prettier": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", - "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", - "dev": true - }, - "node_modules/@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", - "dev": true - }, - "node_modules/@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "node_modules/@types/yargs": { - "version": "17.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.15.tgz", - "integrity": "sha512-ZHc4W2dnEQPfhn06TBEdWaiUHEZAocYaiVMfwOipY5jcJt/251wVrKCBWBetGZWO5CF8tdb7L3DmdxVlZ2BOIg==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, - "dependencies": { - "@types/yargs-parser": "*" + "license": "MIT", + "engines": { + "node": ">= 4" } }, - "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.5.tgz", - "integrity": "sha512-feA9xbVRWJZor+AnLNAr7A8JRWeZqHUf4T9tlP+TN04b05pFVhO5eN7/O93Y/1OUlLMHKbnJisgDURs/qvtqdg==", + "node_modules/@typescript-eslint/parser": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.57.1.tgz", + "integrity": "sha512-k4eNDan0EIMTT/dUKc/g+rsJ6wcHYhNPdY19VoX/EOtaAG8DLtKCykhrUnuHPYvinn5jhAPgD2Qw9hXBwrahsw==", "dev": true, + "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.5", - "@typescript-eslint/type-utils": "5.59.5", - "@typescript-eslint/utils": "5.59.5", - "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "@typescript-eslint/scope-manager": "8.57.1", + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/typescript-estree": "8.57.1", + "@typescript-eslint/visitor-keys": "8.57.1", + "debug": "^4.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.5.tgz", - "integrity": "sha512-NJXQC4MRnF9N9yWqQE2/KLRSOLvrrlZb48NGVfBa+RuPMN6B7ZcK5jZOvhuygv4D64fRKnZI4L4p8+M+rfeQuw==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.57.1.tgz", + "integrity": "sha512-vx1F37BRO1OftsYlmG9xay1TqnjNVlqALymwWVuYTdo18XuKxtBpCj1QlzNIEHlvlB27osvXFWptYiEWsVdYsg==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "5.59.5", - "@typescript-eslint/types": "5.59.5", - "@typescript-eslint/typescript-estree": "5.59.5", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.57.1", + "@typescript-eslint/types": "^8.57.1", + "debug": "^4.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.5.tgz", - "integrity": "sha512-jVecWwnkX6ZgutF+DovbBJirZcAxgxC0EOHYt/niMROf8p4PwxxG32Qdhj/iIQQIuOflLjNkxoXyArkcIP7C3A==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.57.1.tgz", + "integrity": "sha512-hs/QcpCwlwT2L5S+3fT6gp0PabyGk4Q0Rv2doJXA0435/OpnSR3VRgvrp8Xdoc3UAYSg9cyUjTeFXZEPg/3OKg==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.59.5", - "@typescript-eslint/visitor-keys": "5.59.5" + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/visitor-keys": "8.57.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.1.tgz", + "integrity": "sha512-0lgOZB8cl19fHO4eI46YUx2EceQqhgkPSuCGLlGi79L2jwYY1cxeYc1Nae8Aw1xjgW3PKVDLlr3YJ6Bxx8HkWg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.5.tgz", - "integrity": "sha512-4eyhS7oGym67/pSxA2mmNq7X164oqDYNnZCUayBwJZIRVvKpBCMBzFnFxjeoDeShjtO6RQBHBuwybuX3POnDqg==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.57.1.tgz", + "integrity": "sha512-+Bwwm0ScukFdyoJsh2u6pp4S9ktegF98pYUU0hkphOOqdMB+1sNQhIz8y5E9+4pOioZijrkfNO/HUJVAFFfPKA==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.5", - "@typescript-eslint/utils": "5.59.5", - "debug": "^4.3.4", - "tsutils": "^3.21.0" + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/typescript-estree": "8.57.1", + "@typescript-eslint/utils": "8.57.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/types": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.5.tgz", - "integrity": "sha512-xkfRPHbqSH4Ggx4eHRIO/eGL8XL4Ysb4woL8c87YuAo8Md7AUjyWKa9YMwTL519SyDPrfEgKdewjkxNCVeJW7w==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.1.tgz", + "integrity": "sha512-S29BOBPJSFUiblEl6RzPPjJt6w25A6XsBqRVDt53tA/tlL8q7ceQNZHTjPeONt/3S7KRI4quk+yP9jK2WjBiPQ==", "dev": true, + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -1430,314 +1030,288 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.5.tgz", - "integrity": "sha512-+XXdLN2CZLZcD/mO7mQtJMvCkzRfmODbeSKuMY/yXbGkzvA9rJyDY5qDYNoiz2kP/dmyAxXquL2BvLQLJFPQIg==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.1.tgz", + "integrity": "sha512-ybe2hS9G6pXpqGtPli9Gx9quNV0TWLOmh58ADlmZe9DguLq0tiAKVjirSbtM1szG6+QH6rVXyU6GTLQbWnMY+g==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.59.5", - "@typescript-eslint/visitor-keys": "5.59.5", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "@typescript-eslint/project-service": "8.57.1", + "@typescript-eslint/tsconfig-utils": "8.57.1", + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/visitor-keys": "8.57.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/utils": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.5.tgz", - "integrity": "sha512-sCEHOiw+RbyTii9c3/qN74hYDPNORb8yWCoPLmB7BIflhplJ65u2PBpdRla12e3SSTJ2erRkPjz7ngLHhUegxA==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.1.tgz", + "integrity": "sha512-XUNSJ/lEVFttPMMoDVA2r2bwrl8/oPx8cURtczkSEswY5T3AeLmCy+EKWQNdL4u0MmAHOjcWrqJp2cdvgjn8dQ==", "dev": true, + "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.5", - "@typescript-eslint/types": "5.59.5", - "@typescript-eslint/typescript-estree": "5.59.5", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.57.1", + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/typescript-estree": "8.57.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.5.tgz", - "integrity": "sha512-qL+Oz+dbeBRTeyJTIy0eniD3uvqU7x+y1QceBismZ41hd4aBSRh8UAw4pZP0+XzLuPZmx4raNMq/I+59W2lXKA==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.1.tgz", + "integrity": "sha512-YWnmJkXbofiz9KbnbbwuA2rpGkFPLbAIetcCNO6mJ8gdhdZ/v7WDXsoGFAJuM6ikUFKTlSQnjWnVO4ux+UzS6A==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.59.5", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "8.57.1", + "eslint-visitor-keys": "^5.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "node_modules/@vitest/expect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.0.tgz", + "integrity": "sha512-EIxG7k4wlWweuCLG9Y5InKFwpMEOyrMb6ZJ1ihYu02LVj/bzUwn2VMU+13PinsjRW75XnITeFrQBMH5+dLvCDA==", "dev": true, - "bin": { - "acorn": "bin/acorn" + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.0", + "@vitest/utils": "4.1.0", + "chai": "^6.2.2", + "tinyrainbow": "^3.0.3" }, - "engines": { - "node": ">=0.4.0" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "node_modules/@vitest/mocker": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.0.tgz", + "integrity": "sha512-evxREh+Hork43+Y4IOhTo+h5lGmVRyjqI739Rz4RlUPqwrkFFDF6EMvOOYjTx4E8Tl6gyCLRL8Mu7Ry12a13Tw==", "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.1.0", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/@vitest/pretty-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.0.tgz", + "integrity": "sha512-3RZLZlh88Ib0J7NQTRATfc/3ZPOnSUn2uDBUoGNn5T36+bALixmzphN26OUD3LRXWkJu4H0s5vvUeqBiw+kS0A==", "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "tinyrainbow": "^3.0.3" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://opencollective.com/vitest" } }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "node_modules/@vitest/runner": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.0.tgz", + "integrity": "sha512-Duvx2OzQ7d6OjchL+trw+aSrb9idh7pnNfxrklo14p3zmNL4qPCDeIJAK+eBKYjkIwG96Bc6vYuxhqDXQOWpoQ==", "dev": true, + "license": "MIT", "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" + "@vitest/utils": "4.1.0", + "pathe": "^2.0.3" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/vitest" } }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "node_modules/@vitest/snapshot": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.0.tgz", + "integrity": "sha512-0Vy9euT1kgsnj1CHttwi9i9o+4rRLEaPRSOJ5gyv579GJkNpgJK+B4HSv/rAWixx2wdAFci1X4CEPjiu2bXIMg==", "dev": true, - "engines": { - "node": ">=10" + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.0", + "@vitest/utils": "4.1.0", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/vitest" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/@vitest/spy": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.0.tgz", + "integrity": "sha512-pz77k+PgNpyMDv2FV6qmk5ZVau6c3R8HC8v342T2xlFxQKTrSeYw9waIJG8KgV9fFwAtTu4ceRzMivPTH6wSxw==", "dev": true, - "engines": { - "node": ">=8" + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@vitest/utils": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.0.tgz", + "integrity": "sha512-XfPXT6a8TZY3dcGY8EdwsBulFCIw+BeeX0RZn2x/BtiY/75YGh8FeWGG8QISN/WhaqSrE2OrlDgtF8q5uhOTmw==", "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" + "@vitest/pretty-format": "4.1.0", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.0.3" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://opencollective.com/vitest" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "license": "MIT", + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">= 8" + "node": ">=0.4.0" } }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, - "engines": { - "node": ">=8" + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/babel-jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz", - "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==", + "node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/transform": "^29.5.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.5.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "peerDependencies": { - "@babel/core": "^7.8.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "node_modules/are-docs-informative": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", + "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=14" } }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", - "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, + "license": "MIT", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" } }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" } }, - "node_modules/babel-preset-jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", - "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", + "node_modules/baseline-browser-mapping": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", + "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==", "dev": true, - "dependencies": { - "babel-plugin-jest-hoist": "^29.5.0", - "babel-preset-current-node-syntax": "^1.0.0" + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=6.0.0" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", "dev": true, + "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "balanced-match": "^4.0.2" }, "engines": { - "node": ">=8" + "node": "18 || 20 || >=22" } }, "node_modules/browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "dev": true, "funding": [ { @@ -1747,13 +1321,19 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" @@ -1762,76 +1342,23 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-5.0.0.tgz", + "integrity": "sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=18.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", - "dev": true, - "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/caniuse-lite": { - "version": "1.0.30001434", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz", - "integrity": "sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==", + "version": "1.0.30001777", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001777.tgz", + "integrity": "sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ==", "dev": true, "funding": [ { @@ -1841,38 +1368,35 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=18" } }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "node_modules/change-case": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", + "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", "dev": true, - "engines": { - "node": ">=10" - } + "license": "MIT" }, "node_modules/ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", "dev": true, "funding": [ { @@ -1880,21 +1404,17 @@ "url": "https://github.com/sponsors/sibiraj-s" } ], + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", - "dev": true - }, "node_modules/clean-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", "dev": true, + "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.5" }, @@ -1907,75 +1427,48 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.0" } }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "node_modules/comment-parser": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.5.tgz", + "integrity": "sha512-aRDkn3uyIlCFfk5NUA+VdwMmMsh8JGhc4hapfV4yxymHGQ3BVskMQfoXGpCo5IoBuQ9tS5iiVKhCpTcB4pW4qw==", "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">= 12.0.0" } }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true + "license": "MIT" }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/core-js-compat": { + "version": "3.48.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.48.0.tgz", + "integrity": "sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==", "dev": true, + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "browserslist": "^4.28.1" }, - "engines": { - "node": ">=7.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -1986,12 +1479,13 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -2002,169 +1496,162 @@ } } }, - "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, - "node_modules/deepmerge": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz", - "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==", + "node_modules/detect-indent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.2.tgz", + "integrity": "sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=8" } }, - "node_modules/diff-sequences": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", - "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "node_modules/detect-newline": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-4.0.1.tgz", + "integrity": "sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==", "dev": true, + "license": "MIT", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/doctrine": { + "node_modules/dom-serializer": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-3.0.0.tgz", + "integrity": "sha512-x+9D6nkC8tdXOQUS32egtZpZFLP90+HBZmWjuT920srbJvD/zPgFB9t4k3pEhlw5BQrXStQtRc1Y1zuriXk+Nw==", + "license": "MIT", "dependencies": { - "esutils": "^2.0.2" + "domelementtype": "^3.0.0", + "domhandler": "^6.0.0", + "entities": "^8.0.0" }, "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" + "node": ">=20.19.0" }, "funding": { + "type": "github", "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-3.0.0.tgz", + "integrity": "sha512-umCQid3jKbDmVjx8jGaW7uUykm4DEUeyV21hPxNMo2nV955DhUThwqyOIDtreepP31hl84X7G5U9ZfsWvIB3Pg==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/fb55" } - ] + ], + "license": "BSD-2-Clause", + "engines": { + "node": ">=20.19.0" + } }, "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-6.0.1.tgz", + "integrity": "sha512-gYzvtM72ZtxQO0T048kd6HWSbbGCNOUwcnfQ01cqIJ4X2IYKFFHZ5mKvrQETcFXxsRObZulDaKmy//R7TPtsBg==", + "license": "BSD-2-Clause", "dependencies": { - "domelementtype": "^2.3.0" + "domelementtype": "^3.0.0" }, "engines": { - "node": ">= 4" + "node": ">=20.19.0" }, "funding": { + "type": "github", "url": "https://github.com/fb55/domhandler?sponsor=1" } }, "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-4.0.2.tgz", + "integrity": "sha512-qI4JLRKnSzqFqr7hAlS5xQDusBCjKSEG4t4+7aNrIQMHBcsC2TGEhuyABJdYkgSewL57PNLYEiibY2iPKhKpaA==", + "license": "BSD-2-Clause", "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" + "dom-serializer": "^3.0.0", + "domelementtype": "^3.0.0", + "domhandler": "^6.0.0" + }, + "engines": { + "node": ">=20.19.0" }, "funding": { + "type": "github", "url": "https://github.com/fb55/domutils?sponsor=1" } }, "node_modules/electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", - "dev": true + "version": "1.5.307", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.307.tgz", + "integrity": "sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==", + "dev": true, + "license": "ISC" }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "node_modules/enhanced-resolve": { + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.0.tgz", + "integrity": "sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ==", "dev": true, - "engines": { - "node": ">=12" + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" + "engines": { + "node": ">=10.13.0" } }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", + "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", + "license": "BSD-2-Clause", "engines": { - "node": ">=0.12" + "node": ">=20.19.0" }, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "node_modules/es-module-lexer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } + "license": "MIT" }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -2174,6 +1661,7 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -2182,345 +1670,323 @@ } }, "node_modules/eslint": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.40.0.tgz", - "integrity": "sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.0.3.tgz", + "integrity": "sha512-COV33RzXZkqhG9P2rZCFl9ZmJ7WL+gQSCRzE7RhkbclbQPtLAWReL7ysA0Sh4c8Im2U9ynybdR56PV0XcKvqaQ==", "dev": true, + "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.40.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.3", + "@eslint/config-helpers": "^0.5.2", + "@eslint/core": "^1.1.1", + "@eslint/plugin-kit": "^0.6.1", + "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", - "esquery": "^1.4.2", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.1.1", + "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", + "minimatch": "^10.2.4", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-prettier": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", - "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" + "url": "https://eslint.org/donate" }, "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-es": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", - "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", - "dev": true, - "dependencies": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, - "engines": { - "node": ">=8.10.0" + "jiti": "*" }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=4.19.1" + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, - "node_modules/eslint-plugin-es/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "node_modules/eslint-compat-utils": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", + "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", "dev": true, + "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^1.1.0" + "semver": "^7.5.4" }, "engines": { - "node": ">=6" + "node": ">=12" }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" + "peerDependencies": { + "eslint": ">=6.0.0" } }, - "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "node_modules/eslint-config-biome": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/eslint-config-biome/-/eslint-config-biome-2.1.3.tgz", + "integrity": "sha512-IL720kAN79egw8KyaoZsC0UMLn+NlVdPeX2ZmL0CIEcQdLJCf6d1ELCQTKnJ9Lpe6dzfP5ZF8yZ0PTMOirtT+w==", "dev": true, - "engines": { - "node": ">=4" - } + "license": "MIT" }, - "node_modules/eslint-plugin-n": { - "version": "15.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz", - "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==", + "node_modules/eslint-fix-utils": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/eslint-fix-utils/-/eslint-fix-utils-0.4.2.tgz", + "integrity": "sha512-n7ZTcwwkP5scedlhvWMcqxED+O1NzXcj5Rxn/0kJQMP88k02vRcBfQ1qsk/JHb6Aw8bajFoetFCCBiNIcNCsvA==", "dev": true, - "dependencies": { - "builtins": "^5.0.1", - "eslint-plugin-es": "^4.1.0", - "eslint-utils": "^3.0.0", - "ignore": "^5.1.1", - "is-core-module": "^2.11.0", - "minimatch": "^3.1.2", - "resolve": "^1.22.1", - "semver": "^7.3.8" - }, + "license": "MIT", "engines": { - "node": ">=12.22.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "eslint": ">=7.0.0" + "@types/estree": ">=1", + "eslint": ">=8" + }, + "peerDependenciesMeta": { + "@types/estree": { + "optional": true + } } }, - "node_modules/eslint-plugin-unicorn": { - "version": "47.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-47.0.0.tgz", - "integrity": "sha512-ivB3bKk7fDIeWOUmmMm9o3Ax9zbMz1Bsza/R2qm46ufw4T6VBFBaJIR1uN3pCKSmSXm8/9Nri8V+iUut1NhQGA==", + "node_modules/eslint-plugin-es-x": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", + "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", "dev": true, + "funding": [ + "https://github.com/sponsors/ota-meshi", + "https://opencollective.com/eslint" + ], + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.19.1", - "@eslint-community/eslint-utils": "^4.4.0", - "ci-info": "^3.8.0", - "clean-regexp": "^1.0.0", - "esquery": "^1.5.0", - "indent-string": "^4.0.0", - "is-builtin-module": "^3.2.1", - "jsesc": "^3.0.2", - "lodash": "^4.17.21", - "pluralize": "^8.0.0", - "read-pkg-up": "^7.0.1", - "regexp-tree": "^0.1.24", - "regjsparser": "^0.10.0", - "safe-regex": "^2.1.1", - "semver": "^7.3.8", - "strip-indent": "^3.0.0" + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.11.0", + "eslint-compat-utils": "^0.5.1" }, "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" + "node": "^14.18.0 || >=16.0.0" }, "peerDependencies": { - "eslint": ">=8.38.0" - } - }, - "node_modules/eslint-plugin-unicorn/node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" + "eslint": ">=8" } }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "node_modules/eslint-plugin-jsdoc": { + "version": "62.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-62.8.0.tgz", + "integrity": "sha512-hu3r9/6JBmPG6wTcqtYzgZAnjEG2eqRUATfkFscokESg1VDxZM21ZaMire0KjeMwfj+SXvgB4Rvh5LBuesj92w==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "@es-joy/jsdoccomment": "~0.84.0", + "@es-joy/resolve.exports": "1.2.0", + "are-docs-informative": "^0.0.2", + "comment-parser": "1.4.5", + "debug": "^4.4.3", + "escape-string-regexp": "^4.0.0", + "espree": "^11.1.0", + "esquery": "^1.7.0", + "html-entities": "^2.6.0", + "object-deep-merge": "^2.0.0", + "parse-imports-exports": "^0.2.4", + "semver": "^7.7.4", + "spdx-expression-parse": "^4.0.0", + "to-valid-identifier": "^1.0.0" }, "engines": { - "node": ">=8.0.0" + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "node_modules/eslint-plugin-n": { + "version": "17.24.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.24.0.tgz", + "integrity": "sha512-/gC7/KAYmfNnPNOb3eu8vw+TdVnV0zhdQwexsw6FLXbhzroVj20vRn2qL8lDWDGnAQ2J8DhdfvXxX9EoxvERvw==", "dev": true, + "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^2.0.0" + "@eslint-community/eslint-utils": "^4.5.0", + "enhanced-resolve": "^5.17.1", + "eslint-plugin-es-x": "^7.8.0", + "get-tsconfig": "^4.8.1", + "globals": "^15.11.0", + "globrex": "^0.1.2", + "ignore": "^5.3.2", + "semver": "^7.6.3", + "ts-declaration-location": "^1.0.6" }, "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" + "url": "https://opencollective.com/eslint" }, "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" + "eslint": ">=8.23.0" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "node_modules/eslint-plugin-n/node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", "dev": true, + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=18" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "node_modules/eslint-plugin-package-json": { + "version": "0.90.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-package-json/-/eslint-plugin-package-json-0.90.1.tgz", + "integrity": "sha512-6GU2nyjGZ+iSLIo1Qxm6O2HcPKshpjIS3B5ZeBTt8spGad5IQ45+hQUDrULYP0vD6SFT8veJfQ/Ha49/g4Cr5w==", "dev": true, + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "@altano/repository-tools": "^2.0.1", + "change-case": "^5.4.4", + "detect-indent": "^7.0.2", + "detect-newline": "^4.0.1", + "eslint-fix-utils": "~0.4.1", + "package-json-validator": "^1.2.1", + "semver": "^7.7.3", + "sort-object-keys": "^2.0.0", + "sort-package-json": "^3.4.0", + "validate-npm-package-name": "^7.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^20.19.0 || >=22.12.0" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependencies": { + "eslint": ">=8.0.0", + "jsonc-eslint-parser": ">=2.0.0" } }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/eslint-plugin-unicorn": { + "version": "63.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-63.0.0.tgz", + "integrity": "sha512-Iqecl9118uQEXYh7adylgEmGfkn5es3/mlQTLLkd4pXkIk9CTGrAbeUux+YljSa2ohXCBmQQ0+Ej1kZaFgcfkA==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "@eslint-community/eslint-utils": "^4.9.0", + "change-case": "^5.4.4", + "ci-info": "^4.3.1", + "clean-regexp": "^1.0.0", + "core-js-compat": "^3.46.0", + "find-up-simple": "^1.0.1", + "globals": "^16.4.0", + "indent-string": "^5.0.0", + "is-builtin-module": "^5.0.0", + "jsesc": "^3.1.0", + "pluralize": "^8.0.0", + "regexp-tree": "^0.1.27", + "regjsparser": "^0.13.0", + "semver": "^7.7.3", + "strip-indent": "^4.1.1" + }, "engines": { - "node": ">=4.0" + "node": "^20.10.0 || >=21.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" + }, + "peerDependencies": { + "eslint": ">=9.38.0" } }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/eslint-plugin-unicorn/node_modules/globals": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "p-locate": "^5.0.0" + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">=10" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, + "license": "Apache-2.0", "engines": { - "node": ">=10" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, "node_modules/espree": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", - "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "eslint-visitor-keys": "^5.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -2528,20 +1994,12 @@ "node": ">=0.10" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -2549,22 +2007,24 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { + "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, - "engines": { - "node": ">=4.0" + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" } }, "node_modules/esutils": { @@ -2572,190 +2032,131 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", "dev": true, - "dependencies": { - "@jest/expect-utils": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0" - }, + "license": "Apache-2.0", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12.0.0" } }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } + "license": "MIT" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } + "license": "MIT" }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, - "dependencies": { - "bser": "2.1.1" + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, + "license": "MIT", "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { - "to-regex-range": "^5.0.1" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/find-up-simple": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", + "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, + "license": "MIT", "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" + "flatted": "^3.2.9", + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16" } }, "node_modules/flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.4.tgz", + "integrity": "sha512-3+mMldrTAPdta5kjX2G2J7iX4zxtnwpdA8Tr2ZSjkyPSanvbZAcy6flmtnXbEybHrDcU9641lxrMfFuUxVz9vA==", + "dev": true, + "license": "ISC" }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -2764,69 +2165,27 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "node_modules/get-tsconfig": { + "version": "4.13.6", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.6.tgz", + "integrity": "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==", "dev": true, - "engines": { - "node": ">=10" + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "node_modules/git-hooks-list": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/git-hooks-list/-/git-hooks-list-4.2.1.tgz", + "integrity": "sha512-WNvqJjOxxs/8ZP9+DWdwWJ7cDsd60NHf39XnD82pDVrKO5q7xfPqpkK6hwEAmBa/ZSEE4IOoR75EzbbIuwGlMw==", "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/fisker/git-hooks-list?sponsor=1" } }, "node_modules/glob-parent": { @@ -2834,6 +2193,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -2842,237 +2202,114 @@ } }, "node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.4.0.tgz", + "integrity": "sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==", "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT" }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true, - "engines": { - "node": ">=8" - } + "license": "ISC" }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "node_modules/html-entities": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", "dev": true, - "engines": { - "node": ">=10.17.0" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" }, "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } }, "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, "node_modules/is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-5.0.0.tgz", + "integrity": "sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==", "dev": true, + "license": "MIT", "dependencies": { - "builtin-modules": "^3.3.0" + "builtin-modules": "^5.0.0" }, "engines": { - "node": ">=6" + "node": ">=18.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -3080,31 +2317,14 @@ "node": ">=0.10.0" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3113,992 +2333,471 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, - "engines": { - "node": ">=8" - } + "license": "ISC" }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "node_modules/jsdoc-type-pratt-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-7.1.1.tgz", + "integrity": "sha512-/2uqY7x6bsrpi3i9LVU6J89352C0rpMk0as8trXxCtvd4kPk1ke/Eyif6wqfSLvoNJqcDG9Vk4UsXgygzCt2xA==", "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=20.0.0" } }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, + "license": "MIT", "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" + "jsesc": "bin/jsesc" }, "engines": { - "node": ">=10" + "node": ">=6" } }, - "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", - "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, - "dependencies": { - "@jest/core": "^29.5.0", - "@jest/types": "^29.5.0", - "import-local": "^3.0.2", - "jest-cli": "^29.5.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } + "license": "MIT" }, - "node_modules/jest-changed-files": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", - "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, - "dependencies": { - "execa": "^5.0.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } + "license": "MIT" }, - "node_modules/jest-circus": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz", - "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.5.0", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.5.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz", - "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==", + "node_modules/jsonc-eslint-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-3.1.0.tgz", + "integrity": "sha512-75EA7EWZExL/j+MDKQrRbdzcRI2HOkRlmUw8fZJc1ioqFEOvBsq7Rt+A6yCxOt9w/TYNpkt52gC6nm/g5tFIng==", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "@jest/core": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "prompts": "^2.0.1", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" + "acorn": "^8.5.0", + "eslint-visitor-keys": "^5.0.0", + "semver": "^7.3.5" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-config": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz", - "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.5.0", - "@jest/types": "^29.5.0", - "babel-jest": "^29.5.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.5.0", - "jest-environment-node": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.5.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-diff": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", - "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.4.3", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "url": "https://github.com/sponsors/ota-meshi" } }, - "node_modules/jest-docblock": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", - "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "json-buffer": "3.0.1" } }, - "node_modules/jest-each": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz", - "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==", + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/types": "^29.5.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.4.3", - "jest-util": "^29.5.0", - "pretty-format": "^29.5.0" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.8.0" } }, - "node_modules/jest-environment-node": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz", - "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==", + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", "dev": true, + "license": "MPL-2.0", "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" + "detect-libc": "^2.0.3" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", - "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz", - "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.5.0", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.5.0", - "jest-worker": "^29.5.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" + "node": ">= 12.0.0" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-leak-detector": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz", - "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==", + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", - "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.5.0", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "node": ">= 12.0.0" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/jest-message-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", - "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.5.0", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-mock": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz", - "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==", - "dev": true, - "dependencies": { - "@jest/types": "^29.5.0", - "@types/node": "*", - "jest-util": "^29.5.0" + "node": ">= 12.0.0" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6" + "node": ">= 12.0.0" }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/jest-regex-util": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", - "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz", - "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" + "node": ">= 12.0.0" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/jest-resolve-dependencies": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz", - "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==", + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "jest-regex-util": "^29.4.3", - "jest-snapshot": "^29.5.0" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz", - "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==", - "dev": true, - "dependencies": { - "@jest/console": "^29.5.0", - "@jest/environment": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.4.3", - "jest-environment-node": "^29.5.0", - "jest-haste-map": "^29.5.0", - "jest-leak-detector": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-resolve": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-util": "^29.5.0", - "jest-watcher": "^29.5.0", - "jest-worker": "^29.5.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz", - "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/globals": "^29.5.0", - "@jest/source-map": "^29.4.3", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-mock": "^29.5.0", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz", - "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.5.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.5.0", - "semver": "^7.3.5" + "node": ">= 12.0.0" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/jest-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", - "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@jest/types": "^29.5.0", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz", - "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.5.0", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.4.3", - "leven": "^3.1.0", - "pretty-format": "^29.5.0" + "node": ">= 12.0.0" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/jest-watcher": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz", - "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==", + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.5.0", - "string-length": "^4.0.1" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", - "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", - "dev": true, - "dependencies": { - "@types/node": "*", - "jest-util": "^29.5.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "node": ">= 12.0.0" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/js-sdsl": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz", - "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==", - "dev": true - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" + "node": ">= 12.0.0" }, - "engines": { - "node": ">=6" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "engines": { - "node": ">=6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "node": ">= 12.0.0" }, - "engines": { - "node": ">= 0.8.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lru-cache": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "p-locate": "^5.0.0" }, "engines": { "node": ">=10" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, + "license": "MIT", "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" + "brace-expansion": "^5.0.2" }, "engines": { - "node": ">=8.6" + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, - "engines": { - "node": ">=6" - } + "license": "MIT" }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": "*" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "node_modules/node-releases": { + "version": "2.0.36", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", + "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "node_modules/object-deep-merge": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-2.0.0.tgz", + "integrity": "sha512-3DC3UMpeffLTHiuXSy/UG4NOIYTLlY9u3V82+djSCLYClWobZiS4ivYzpIUWrRY/nfsJ8cWsKyG3QfyLePmhvg==", "dev": true, - "dependencies": { - "wrappy": "1" - } + "license": "MIT" }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, + "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -4109,6 +2808,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -4120,497 +2820,245 @@ } }, "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "node_modules/package-json-validator": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/package-json-validator/-/package-json-validator-1.3.1.tgz", + "integrity": "sha512-RfUMqyBoLa1qcPsKNAksnVDRuzDvLi//RqfMbf52RNMKsm+cWR/3Cfe6hvrTS/ATtEwvtm/57dPggXsau6++uA==", "dev": true, + "license": "MIT", "dependencies": { - "callsites": "^3.0.0" + "semver": "^7.7.2", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^7.0.0" }, "engines": { - "node": ">=6" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/parse-imports-exports": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/parse-imports-exports/-/parse-imports-exports-0.2.4.tgz", + "integrity": "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "parse-statements": "1.0.11" } }, + "node_modules/parse-statements": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/parse-statements/-/parse-statements-1.0.11.tgz", + "integrity": "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==", + "dev": true, + "license": "MIT" + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true, - "engines": { - "node": ">=8" - } + "license": "MIT" }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.4.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pure-rand": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.0.tgz", - "integrity": "sha512-rLSBxJjP+4DQOgcJAx6RZHT2he2pkhQdSnofG5VWyVl6GRq/K02ISOuOLcsMOrtKDIJb8JN2zm3FFzWNbezdPw==", + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", "dev": true, "funding": [ { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ] - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" + "url": "https://opencollective.com/postcss/" }, { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "github", + "url": "https://github.com/sponsors/ai" } - ] - }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, + ], + "license": "MIT", "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^10 || ^12 || >=14" } }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.8.0" } }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" } }, "node_modules/regexp-tree": { - "version": "0.1.24", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz", - "integrity": "sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==", + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", "dev": true, + "license": "MIT", "bin": { "regexp-tree": "bin/regexp-tree" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/regjsparser": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.10.0.tgz", - "integrity": "sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "jsesc": "~0.5.0" + "jsesc": "~3.1.0" }, "bin": { "regjsparser": "bin/parser" } }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "node_modules/reserved-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/reserved-identifiers/-/reserved-identifiers-1.2.0.tgz", + "integrity": "sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve.exports": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.1.tgz", - "integrity": "sha512-OEJWVeimw8mgQuj3HfkNl4KqRevH7lzeQNaWRPfx0PPse7Jk6ozcsG4FKVgtzDsC1KUF+YlTHh17NcgHOPykLw==", - "dev": true, - "engines": { - "node": ">=10" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/rolldown": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.9.tgz", + "integrity": "sha512-9EbgWge7ZH+yqb4d2EnELAntgPTWbfL8ajiTW+SyhJEC4qhBbkCKbqFV4Ge4zmu5ziQuVbWxb/XwLZ+RIO7E8Q==", "dev": true, + "license": "MIT", "dependencies": { - "glob": "^7.1.3" + "@oxc-project/types": "=0.115.0", + "@rolldown/pluginutils": "1.0.0-rc.9" }, "bin": { - "rimraf": "bin.js" + "rolldown": "bin/cli.mjs" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", - "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", - "dev": true, - "dependencies": { - "regexp-tree": "~0.1.1" + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-rc.9", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.9", + "@rolldown/binding-darwin-x64": "1.0.0-rc.9", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.9", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.9", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.9", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.9", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.9", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.9", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.9", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.9", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.9", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.9", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.9", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.9" } }, "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -4623,6 +3071,7 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -4635,330 +3084,256 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true + "node_modules/sort-object-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sort-object-keys/-/sort-object-keys-2.1.0.tgz", + "integrity": "sha512-SOiEnthkJKPv2L6ec6HMwhUcN0/lppkeYuN1x63PbyPRrgSPIuBJCiYxYyvWRTtjMlOi14vQUCGUJqS6PLVm8g==", + "dev": true, + "license": "MIT" }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/sort-package-json": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/sort-package-json/-/sort-package-json-3.6.1.tgz", + "integrity": "sha512-Chgejw1+10p2D0U2tB7au1lHtz6TkFnxmvZktyBCRyV0GgmF6nl1IxXxAsPtJVsUyg/fo+BfCMAVVFUVRkAHrQ==", "dev": true, + "license": "MIT", + "dependencies": { + "detect-indent": "^7.0.2", + "detect-newline": "^4.0.1", + "git-hooks-list": "^4.1.1", + "is-plain-obj": "^4.1.0", + "semver": "^7.7.3", + "sort-object-keys": "^2.0.1", + "tinyglobby": "^0.2.15" + }, + "bin": { + "sort-package-json": "cli.js" + }, "engines": { - "node": ">=8" + "node": ">=20" } }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { + "node_modules/spdx-correct/node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, + "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, - "node_modules/spdx-license-ids": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", - "dev": true - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", "dev": true, - "engines": { - "node": ">=8" - } + "license": "CC-BY-3.0" }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "node_modules/spdx-expression-parse": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", + "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", "dev": true, + "license": "MIT", "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/spdx-license-ids": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", + "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } + "license": "CC0-1.0" }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/strip-bom": { + "node_modules/std-env": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.0.0.tgz", + "integrity": "sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==", "dev": true, - "engines": { - "node": ">=6" - } + "license": "MIT" }, "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.1.1.tgz", + "integrity": "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==", "dev": true, - "dependencies": { - "min-indent": "^1.0.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, + "license": "MIT", "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { - "node": ">=8" + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "node_modules/tinyrainbow": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=14.0.0" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/to-valid-identifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-valid-identifier/-/to-valid-identifier-1.0.0.tgz", + "integrity": "sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw==", "dev": true, + "license": "MIT", "dependencies": { - "is-number": "^7.0.0" + "@sindresorhus/base62": "^1.0.0", + "reserved-identifiers": "^1.0.0" }, "engines": { - "node": ">=8.0" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ts-jest": { - "version": "29.1.0", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.0.tgz", - "integrity": "sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA==", + "node_modules/ts-api-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", "dev": true, - "dependencies": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.3", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "7.x", - "yargs-parser": "^21.0.1" - }, - "bin": { - "ts-jest": "cli.js" - }, + "license": "MIT", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18.12" }, "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/types": "^29.0.0", - "babel-jest": "^29.0.0", - "jest": "^29.0.0", - "typescript": ">=4.3 <6" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - } + "typescript": ">=4.8.4" } }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "node_modules/ts-declaration-location": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/ts-declaration-location/-/ts-declaration-location-1.0.7.tgz", + "integrity": "sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==", "dev": true, + "funding": [ + { + "type": "ko-fi", + "url": "https://ko-fi.com/rebeccastevens" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/ts-declaration-location" + } + ], + "license": "BSD-3-Clause", "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" + "picomatch": "^4.0.2" }, "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + "typescript": ">=4.0.0" } }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -4966,44 +3341,55 @@ "node": ">= 0.8.0" } }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, "engines": { - "node": ">=4" + "node": ">=14.17" } }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/typescript-eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.57.1.tgz", + "integrity": "sha512-fLvZWf+cAGw3tqMCYzGIU6yR8K+Y9NT2z23RwOjlNFF2HwSB3KhdEFI5lSBv8tNmFkkBShSjsCjzx1vahZfISA==", "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.57.1", + "@typescript-eslint/parser": "8.57.1", + "@typescript-eslint/typescript-estree": "8.57.1", + "@typescript-eslint/utils": "8.57.1" + }, "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/typescript": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", - "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=12.20" - } + "license": "MIT" }, "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, "funding": [ { @@ -5013,14 +3399,19 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -5031,3960 +3422,259 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, - "node_modules/v8-to-istanbul": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", - "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, + "license": "Apache-2.0", "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/validate-npm-package-name": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-7.0.2.tgz", + "integrity": "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==", "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, + "license": "ISC", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "node_modules/vite": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.0.tgz", + "integrity": "sha512-fPGaRNj9Zytaf8LEiBhY7Z6ijnFKdzU/+mL8EFBaKr7Vw1/FWcTBAMW0wLPJAGMPX38ZPVCVgLceWiEqeoqL2Q==", "dev": true, + "license": "MIT", "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" + "@oxc-project/runtime": "0.115.0", + "lightningcss": "^1.32.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.8", + "rolldown": "1.0.0-rc.9", + "tinyglobby": "^0.2.15" }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "bin": { + "vite": "bin/vite.js" }, "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" + "node": "^20.19.0 || >=22.12.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/compat-data": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.5.tgz", - "integrity": "sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==", - "dev": true - }, - "@babel/core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.5.tgz", - "integrity": "sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-module-transforms": "^7.20.2", - "@babel/helpers": "^7.20.5", - "@babel/parser": "^7.20.5", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "url": "https://github.com/vitejs/vite?sponsor=1" }, - "dependencies": { - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.5.tgz", - "integrity": "sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==", - "dev": true, - "requires": { - "@babel/types": "^7.20.5", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@babel/helper-compilation-targets": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", - "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.20.0", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "semver": "^6.3.0" + "optionalDependencies": { + "fsevents": "~2.3.3" }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", - "dev": true, - "requires": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", - "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.2" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", - "dev": true - }, - "@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "dev": true, - "requires": { - "@babel/types": "^7.20.2" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "dev": true - }, - "@babel/helpers": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.6.tgz", - "integrity": "sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==", - "dev": true, - "requires": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" - } - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.0.0-alpha.31", + "esbuild": "^0.27.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } + "peerDependenciesMeta": { + "@types/node": { + "optional": true }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } + "@vitejs/devtools": { + "optional": true }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "esbuild": { + "optional": true }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true + "jiti": { + "optional": true }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true + "less": { + "optional": true }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz", - "integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==", - "dev": true - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", - "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.19.0" - } - }, - "@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" - } - }, - "@babel/traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.5.tgz", - "integrity": "sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.5", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.5", - "@babel/types": "^7.20.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^3.3.0" - } - }, - "@eslint-community/regexpp": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.0.tgz", - "integrity": "sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", - "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.5.2", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - } - }, - "@eslint/js": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.40.0.tgz", - "integrity": "sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA==", - "dev": true - }, - "@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } + "sass": { + "optional": true }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } + "sass-embedded": { + "optional": true }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jest/console": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz", - "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==", - "dev": true, - "requires": { - "@jest/types": "^29.5.0", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", - "slash": "^3.0.0" - } - }, - "@jest/core": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz", - "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==", - "dev": true, - "requires": { - "@jest/console": "^29.5.0", - "@jest/reporters": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.5.0", - "jest-config": "^29.5.0", - "jest-haste-map": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-resolve-dependencies": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "jest-watcher": "^29.5.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "@jest/environment": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz", - "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==", - "dev": true, - "requires": { - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "jest-mock": "^29.5.0" - } - }, - "@jest/expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==", - "dev": true, - "requires": { - "expect": "^29.5.0", - "jest-snapshot": "^29.5.0" - } - }, - "@jest/expect-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz", - "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==", - "dev": true, - "requires": { - "jest-get-type": "^29.4.3" - } - }, - "@jest/fake-timers": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz", - "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==", - "dev": true, - "requires": { - "@jest/types": "^29.5.0", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.5.0", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" - } - }, - "@jest/globals": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz", - "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==", - "dev": true, - "requires": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", - "@jest/types": "^29.5.0", - "jest-mock": "^29.5.0" - } - }, - "@jest/reporters": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz", - "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@jridgewell/trace-mapping": "^0.3.15", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", - "jest-worker": "^29.5.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - } - }, - "@jest/schemas": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", - "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.25.16" - } - }, - "@jest/source-map": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz", - "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.15", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - } - }, - "@jest/test-result": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz", - "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==", - "dev": true, - "requires": { - "@jest/console": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz", - "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==", - "dev": true, - "requires": { - "@jest/test-result": "^29.5.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "slash": "^3.0.0" - } - }, - "@jest/transform": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz", - "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.5.0", - "@jridgewell/trace-mapping": "^0.3.15", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.5.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - } - }, - "@jest/types": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", - "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", - "dev": true, - "requires": { - "@jest/schemas": "^29.4.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@sinclair/typebox": { - "version": "0.25.22", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.22.tgz", - "integrity": "sha512-6U6r2L7rnM7EG8G1tWzIjdB3QlsHF4slgcqXNN/SF0xJOAr0nDmT2GedlkyO3mrv8mDTJ24UuOMWR3diBrCvQQ==", - "dev": true - }, - "@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", - "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", - "dev": true, - "requires": { - "@sinonjs/commons": "^2.0.0" - } - }, - "@types/babel__core": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", - "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", - "dev": true, - "requires": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", - "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", - "dev": true, - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "29.5.1", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.1.tgz", - "integrity": "sha512-tEuVcHrpaixS36w7hpsfLBLpjtMRJUE09/MHXn923LOVojDwyC14cWcfc0rDs0VEfUyYmt/+iX1kxxp+gZMcaQ==", - "dev": true, - "requires": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "@types/node": { - "version": "20.1.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.1.tgz", - "integrity": "sha512-uKBEevTNb+l6/aCQaKVnUModfEMjAl98lw2Si9P5y4hLu9tm6AlX2ZIoXZX6Wh9lJueYPrGPKk5WMCNHg/u6/A==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "@types/prettier": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", - "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", - "dev": true - }, - "@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", - "dev": true - }, - "@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "@types/yargs": { - "version": "17.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.15.tgz", - "integrity": "sha512-ZHc4W2dnEQPfhn06TBEdWaiUHEZAocYaiVMfwOipY5jcJt/251wVrKCBWBetGZWO5CF8tdb7L3DmdxVlZ2BOIg==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.5.tgz", - "integrity": "sha512-feA9xbVRWJZor+AnLNAr7A8JRWeZqHUf4T9tlP+TN04b05pFVhO5eN7/O93Y/1OUlLMHKbnJisgDURs/qvtqdg==", - "dev": true, - "requires": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.5", - "@typescript-eslint/type-utils": "5.59.5", - "@typescript-eslint/utils": "5.59.5", - "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/parser": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.5.tgz", - "integrity": "sha512-NJXQC4MRnF9N9yWqQE2/KLRSOLvrrlZb48NGVfBa+RuPMN6B7ZcK5jZOvhuygv4D64fRKnZI4L4p8+M+rfeQuw==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.59.5", - "@typescript-eslint/types": "5.59.5", - "@typescript-eslint/typescript-estree": "5.59.5", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.5.tgz", - "integrity": "sha512-jVecWwnkX6ZgutF+DovbBJirZcAxgxC0EOHYt/niMROf8p4PwxxG32Qdhj/iIQQIuOflLjNkxoXyArkcIP7C3A==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.5", - "@typescript-eslint/visitor-keys": "5.59.5" - } - }, - "@typescript-eslint/type-utils": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.5.tgz", - "integrity": "sha512-4eyhS7oGym67/pSxA2mmNq7X164oqDYNnZCUayBwJZIRVvKpBCMBzFnFxjeoDeShjtO6RQBHBuwybuX3POnDqg==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "5.59.5", - "@typescript-eslint/utils": "5.59.5", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/types": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.5.tgz", - "integrity": "sha512-xkfRPHbqSH4Ggx4eHRIO/eGL8XL4Ysb4woL8c87YuAo8Md7AUjyWKa9YMwTL519SyDPrfEgKdewjkxNCVeJW7w==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.5.tgz", - "integrity": "sha512-+XXdLN2CZLZcD/mO7mQtJMvCkzRfmODbeSKuMY/yXbGkzvA9rJyDY5qDYNoiz2kP/dmyAxXquL2BvLQLJFPQIg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.5", - "@typescript-eslint/visitor-keys": "5.59.5", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/utils": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.5.tgz", - "integrity": "sha512-sCEHOiw+RbyTii9c3/qN74hYDPNORb8yWCoPLmB7BIflhplJ65u2PBpdRla12e3SSTJ2erRkPjz7ngLHhUegxA==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.5", - "@typescript-eslint/types": "5.59.5", - "@typescript-eslint/typescript-estree": "5.59.5", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.5.tgz", - "integrity": "sha512-qL+Oz+dbeBRTeyJTIy0eniD3uvqU7x+y1QceBismZ41hd4aBSRh8UAw4pZP0+XzLuPZmx4raNMq/I+59W2lXKA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.5", - "eslint-visitor-keys": "^3.3.0" - } - }, - "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "babel-jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz", - "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==", - "dev": true, - "requires": { - "@jest/transform": "^29.5.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.5.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", - "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", - "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^29.5.0", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - } - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true - }, - "builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", - "dev": true, - "requires": { - "semver": "^7.0.0" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001434", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz", - "integrity": "sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", - "dev": true - }, - "cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", - "dev": true - }, - "clean-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", - "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - } - } - }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "deepmerge": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz", - "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==", - "dev": true - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "diff-sequences": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", - "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - } - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" - }, - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "requires": { - "domelementtype": "^2.3.0" - } - }, - "domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "requires": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - } - }, - "electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", - "dev": true - }, - "emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.40.0.tgz", - "integrity": "sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.40.0", - "@humanwhocodes/config-array": "^0.11.8", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "dependencies": { - "eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } + "stylus": { + "optional": true }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true + "sugarss": { + "optional": true }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } + "terser": { + "optional": true }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } + "tsx": { + "optional": true }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } + "yaml": { + "optional": true } } }, - "eslint-config-prettier": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", - "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", - "dev": true, - "requires": {} - }, - "eslint-plugin-es": { + "node_modules/vitest": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", - "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.0.tgz", + "integrity": "sha512-YbDrMF9jM2Lqc++2530UourxZHmkKLxrs4+mYhEwqWS97WJ7wOYEkcr+QfRgJ3PW9wz3odRijLZjHEaRLTNbqw==", "dev": true, - "requires": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, + "license": "MIT", "dependencies": { - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "eslint-plugin-n": { - "version": "15.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz", - "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==", - "dev": true, - "requires": { - "builtins": "^5.0.1", - "eslint-plugin-es": "^4.1.0", - "eslint-utils": "^3.0.0", - "ignore": "^5.1.1", - "is-core-module": "^2.11.0", - "minimatch": "^3.1.2", - "resolve": "^1.22.1", - "semver": "^7.3.8" - } - }, - "eslint-plugin-unicorn": { - "version": "47.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-47.0.0.tgz", - "integrity": "sha512-ivB3bKk7fDIeWOUmmMm9o3Ax9zbMz1Bsza/R2qm46ufw4T6VBFBaJIR1uN3pCKSmSXm8/9Nri8V+iUut1NhQGA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.19.1", - "@eslint-community/eslint-utils": "^4.4.0", - "ci-info": "^3.8.0", - "clean-regexp": "^1.0.0", - "esquery": "^1.5.0", - "indent-string": "^4.0.0", - "is-builtin-module": "^3.2.1", - "jsesc": "^3.0.2", - "lodash": "^4.17.21", - "pluralize": "^8.0.0", - "read-pkg-up": "^7.0.1", - "regexp-tree": "^0.1.24", - "regjsparser": "^0.10.0", - "safe-regex": "^2.1.1", - "semver": "^7.3.8", - "strip-indent": "^3.0.0" + "@vitest/expect": "4.1.0", + "@vitest/mocker": "4.1.0", + "@vitest/pretty-format": "4.1.0", + "@vitest/runner": "4.1.0", + "@vitest/snapshot": "4.1.0", + "@vitest/spy": "4.1.0", + "@vitest/utils": "4.1.0", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0", + "why-is-node-running": "^2.3.0" }, - "dependencies": { - "jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "dev": true - } - } - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" + "bin": { + "vitest": "vitest.mjs" }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", - "dev": true - }, - "espree": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", - "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" + "funding": { + "url": "https://opencollective.com/vitest" }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true - }, - "expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", - "dev": true, - "requires": { - "@jest/expect-utils": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.0", + "@vitest/browser-preview": "4.1.0", + "@vitest/browser-webdriverio": "4.1.0", + "@vitest/ui": "4.1.0", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0" }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false } } }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "html-escaper": { + "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", - "dev": true, - "requires": { - "builtin-modules": "^3.3.0" - } - }, - "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, - "istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", - "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", - "dev": true, - "requires": { - "@jest/core": "^29.5.0", - "@jest/types": "^29.5.0", - "import-local": "^3.0.2", - "jest-cli": "^29.5.0" - } - }, - "jest-changed-files": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", - "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", - "dev": true, - "requires": { - "execa": "^5.0.0", - "p-limit": "^3.1.0" - } - }, - "jest-circus": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz", - "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==", - "dev": true, - "requires": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.5.0", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.5.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-cli": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz", - "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==", - "dev": true, - "requires": { - "@jest/core": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "prompts": "^2.0.1", - "yargs": "^17.3.1" - } - }, - "jest-config": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz", - "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.5.0", - "@jest/types": "^29.5.0", - "babel-jest": "^29.5.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.5.0", - "jest-environment-node": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.5.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - } - }, - "jest-diff": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", - "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^29.4.3", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" - } - }, - "jest-docblock": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", - "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz", - "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==", - "dev": true, - "requires": { - "@jest/types": "^29.5.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.4.3", - "jest-util": "^29.5.0", - "pretty-format": "^29.5.0" - } - }, - "jest-environment-node": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz", - "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==", - "dev": true, - "requires": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" - } - }, - "jest-get-type": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", - "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", - "dev": true - }, - "jest-haste-map": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz", - "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==", - "dev": true, - "requires": { - "@jest/types": "^29.5.0", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.5.0", - "jest-worker": "^29.5.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - } - }, - "jest-leak-detector": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz", - "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==", - "dev": true, - "requires": { - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" - } - }, - "jest-matcher-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", - "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^29.5.0", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" - } - }, - "jest-message-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", - "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.5.0", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-mock": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz", - "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==", - "dev": true, - "requires": { - "@jest/types": "^29.5.0", - "@types/node": "*", - "jest-util": "^29.5.0" - } - }, - "jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "requires": {} - }, - "jest-regex-util": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", - "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", - "dev": true - }, - "jest-resolve": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz", - "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - } - }, - "jest-resolve-dependencies": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz", - "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==", - "dev": true, - "requires": { - "jest-regex-util": "^29.4.3", - "jest-snapshot": "^29.5.0" - } - }, - "jest-runner": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz", - "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==", - "dev": true, - "requires": { - "@jest/console": "^29.5.0", - "@jest/environment": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.4.3", - "jest-environment-node": "^29.5.0", - "jest-haste-map": "^29.5.0", - "jest-leak-detector": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-resolve": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-util": "^29.5.0", - "jest-watcher": "^29.5.0", - "jest-worker": "^29.5.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - } - }, - "jest-runtime": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz", - "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==", - "dev": true, - "requires": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/globals": "^29.5.0", - "@jest/source-map": "^29.4.3", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-mock": "^29.5.0", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - } - }, - "jest-snapshot": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz", - "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.5.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.5.0", - "semver": "^7.3.5" - } - }, - "jest-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", - "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", - "dev": true, - "requires": { - "@jest/types": "^29.5.0", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "jest-validate": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz", - "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==", - "dev": true, - "requires": { - "@jest/types": "^29.5.0", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.4.3", - "leven": "^3.1.0", - "pretty-format": "^29.5.0" - }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - } - } - }, - "jest-watcher": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz", - "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==", - "dev": true, - "requires": { - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.5.0", - "string-length": "^4.0.1" - } - }, - "jest-worker": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", - "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", - "dev": true, - "requires": { - "@types/node": "*", - "jest-util": "^29.5.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "js-sdsl": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz", - "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "requires": { - "tmpl": "1.0.5" - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, + "license": "ISC", "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" + "isexe": "^2.0.0" }, - "dependencies": { - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - } - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true - }, - "pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", - "dev": true, - "requires": { - "@jest/schemas": "^29.4.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "bin": { + "node-which": "bin/node-which" }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } - } - }, - "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" + "engines": { + "node": ">= 8" } }, - "punycode": { + "node_modules/why-is-node-running": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true - }, - "pure-rand": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.0.tgz", - "integrity": "sha512-rLSBxJjP+4DQOgcJAx6RZHT2he2pkhQdSnofG5VWyVl6GRq/K02ISOuOLcsMOrtKDIJb8JN2zm3FFzWNbezdPw==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "regexp-tree": { - "version": "0.1.24", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz", - "integrity": "sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==", - "dev": true - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "regjsparser": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.10.0.tgz", - "integrity": "sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, - "requires": { - "resolve-from": "^5.0.0" - }, + "license": "MIT", "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "resolve.exports": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.1.tgz", - "integrity": "sha512-OEJWVeimw8mgQuj3HfkNl4KqRevH7lzeQNaWRPfx0PPse7Jk6ozcsG4FKVgtzDsC1KUF+YlTHh17NcgHOPykLw==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", - "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", - "dev": true, - "requires": { - "regexp-tree": "~0.1.1" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", - "dev": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" + "siginfo": "^2.0.0", + "stackback": "0.0.2" }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } - } - }, - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "requires": { - "min-indent": "^1.0.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "ts-jest": { - "version": "29.1.0", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.0.tgz", - "integrity": "sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA==", - "dev": true, - "requires": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.3", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "7.x", - "yargs-parser": "^21.0.1" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "typescript": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", - "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "v8-to-istanbul": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", - "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" + "bin": { + "why-is-node-running": "cli.js" }, - "dependencies": { - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - } - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "requires": { - "makeerror": "1.0.12" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "engines": { + "node": ">=8" } }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", - "dev": true, - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - } - }, - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true - }, - "yocto-queue": { + "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/package.json b/package.json index 7c84e52..e8de2c9 100644 --- a/package.json +++ b/package.json @@ -1,17 +1,7 @@ { "name": "htmlparser2", + "version": "12.0.0", "description": "Fast & forgiving HTML/XML parser", - "version": "9.0.0", - "author": "Felix Boehm <me@feedic.com>", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "sideEffects": false, "keywords": [ "html", "parser", @@ -26,72 +16,71 @@ "type": "git", "url": "git://github.com/fb55/htmlparser2.git" }, - "directories": { - "lib": "lib/" - }, - "main": "lib/index.js", - "types": "lib/index.d.ts", - "module": "lib/esm/index.js", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "author": "Felix Boehm <me@feedic.com>", + "sideEffects": false, + "type": "module", "exports": { ".": { - "require": "./lib/index.js", - "import": "./lib/esm/index.js" + "types": "./dist/index.d.ts", + "default": "./dist/index.js" }, - "./lib/WritableStream": { - "require": "./lib/WritableStream.js", - "import": "./lib/esm/WritableStream.js" + "./WebWritableStream": { + "types": "./dist/WebWritableStream.d.ts", + "default": "./dist/WebWritableStream.js" + }, + "./WritableStream": { + "types": "./dist/WritableStream.d.ts", + "default": "./dist/WritableStream.js" } }, + "main": "./dist/index.js", + "types": "./dist/index.d.ts", "files": [ - "lib/**/*" + "dist", + "src", + "!**/*.spec.ts", + "!src/**/__tests__/**", + "!src/**/__fixtures__/**", + "!src/**/__snapshots__/**" ], "scripts": { - "test": "npm run test:jest && npm run lint", - "test:jest": "jest", - "lint": "npm run lint:es && npm run lint:prettier", - "lint:es": "eslint src", - "lint:prettier": "npm run format:prettier:raw -- --check", - "format": "npm run format:es && npm run format:prettier", + "build": "tsc", + "format": "npm run format:es && npm run format:biome", + "format:biome": "biome check --write .", "format:es": "npm run lint:es -- --fix", - "format:prettier": "npm run format:prettier:raw -- --write", - "format:prettier:raw": "prettier '**/*.{ts,md,json,yml}'", - "build": "npm run build:cjs && npm run build:esm", - "build:cjs": "tsc --sourceRoot https://raw.githubusercontent.com/fb55/htmlparser2/$(git rev-parse HEAD)/src/", - "build:esm": "npm run build:cjs -- --module esnext --target es2019 --outDir lib/esm && echo '{\"type\":\"module\"}' > lib/esm/package.json", - "prepare": "npm run build" + "lint": "npm run lint:es && npm run lint:ts && npm run lint:biome", + "lint:biome": "biome check .", + "lint:es": "eslint .", + "lint:ts": "tsc --noEmit", + "prepublishOnly": "npm run build", + "test": "npm run test:vi && npm run lint", + "test:vi": "vitest run" }, "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.1.0", - "entities": "^4.5.0" + "domelementtype": "^3.0.0", + "domhandler": "^6.0.0", + "domutils": "^4.0.2", + "entities": "^8.0.0" }, "devDependencies": { - "@types/jest": "^29.5.1", - "@types/node": "^20.1.1", - "@typescript-eslint/eslint-plugin": "^5.59.5", - "@typescript-eslint/parser": "^5.59.5", - "eslint": "^8.40.0", - "eslint-config-prettier": "^8.8.0", - "eslint-plugin-n": "^15.7.0", - "eslint-plugin-unicorn": "^47.0.0", - "jest": "^29.5.0", - "prettier": "^2.8.8", - "ts-jest": "^29.1.0", - "typescript": "^5.0.4" - }, - "jest": { - "preset": "ts-jest", - "testEnvironment": "node", - "coverageProvider": "v8", - "moduleNameMapper": { - "^(.*)\\.js$": [ - "$1", - "$1.js" - ] - } + "@biomejs/biome": "^2.4.8", + "@feedic/eslint-config": "^0.3.1", + "@types/node": "^25.5.0", + "eslint": "^10.0.3", + "eslint-config-biome": "^2.1.3", + "typescript": "^5.9.3", + "typescript-eslint": "^8.57.1", + "vitest": "^4.1.0" }, - "prettier": { - "tabWidth": 4 + "engines": { + "node": ">=20.19.0" } } diff --git a/src/FeedHandler.spec.ts b/src/FeedHandler.spec.ts index 86cede5..49978d2 100644 --- a/src/FeedHandler.spec.ts +++ b/src/FeedHandler.spec.ts @@ -1,39 +1,37 @@ -// Runs tests for feeds - -import { parseFeed } from "./index.js"; import fs from "node:fs/promises"; -import path from "node:path"; +import { describe, expect, it } from "vitest"; +import { parseFeed } from "./index.js"; -const documents = path.join(__dirname, "__fixtures__", "Documents"); +const documents = new URL("__fixtures__/Documents/", import.meta.url); describe("parseFeed", () => { it("(rssFeed)", async () => expect( parseFeed( await fs.readFile( - path.join(documents, "RSS_Example.xml"), - "utf8" - ) - ) + new URL("RSS_Example.xml", documents), + "utf8", + ), + ), ).toMatchSnapshot()); it("(atomFeed)", async () => expect( parseFeed( await fs.readFile( - path.join(documents, "Atom_Example.xml"), - "utf8" - ) - ) + new URL("Atom_Example.xml", documents), + "utf8", + ), + ), ).toMatchSnapshot()); it("(rdfFeed)", async () => expect( parseFeed( await fs.readFile( - path.join(documents, "RDF_Example.xml"), - "utf8" - ) - ) + new URL("RDF_Example.xml", documents), + "utf8", + ), + ), ).toMatchSnapshot()); }); diff --git a/src/__tests__/events.ts b/src/Parser.events.spec.ts index 3a3bdf1..40c4c85 100644 --- a/src/__tests__/events.ts +++ b/src/Parser.events.spec.ts @@ -1,10 +1,10 @@ -import { Parser, type ParserOptions } from "../index.js"; -import * as helper from "../__fixtures__/test-helper.js"; +import { describe, expect, it, vi } from "vitest"; +import * as helper from "./__fixtures__/testHelper.js"; +import { Parser, type ParserOptions } from "./Parser.js"; /** * Write to the parser twice, once a bytes, once as a single blob. Then check * that we received the expected events. - * * @internal * @param input Data to write. * @param options Parser options. @@ -44,7 +44,7 @@ describe("Events", () => { it("Template script tags", () => runTest( - '<p><script type="text/template"><h1>Heading1</h1></script></p>' + '<p><script type="text/template"><h1>Heading1</h1></script></p>', )); it("Lowercase tags", () => @@ -57,7 +57,7 @@ describe("Events", () => { it("CDATA (inside special)", () => runTest( - "<script>/*<![CDATA[*/ asdf ><asdf></adsf><> fo/*]]>*/</script>" + "<script>/*<![CDATA[*/ asdf ><asdf></adsf><> fo/*]]>*/</script>", )); it("leading lt", () => runTest(">a>")); @@ -80,6 +80,12 @@ describe("Events", () => { it("end slash: non-void element ending with />, recognizeSelfClosing=true", () => runTest("<xx / ><p>Hold the line.", { recognizeSelfClosing: true })); + it("end slash: special tag ending with />, recognizeSelfClosing=true", () => + runTest("<script/><b>x</b>", { recognizeSelfClosing: true })); + + it("end slash: plaintext tag ending with />, recognizeSelfClosing=true", () => + runTest("<plaintext/><b>x</b>", { recognizeSelfClosing: true })); + it("end slash: as part of attrib value of void element", () => runTest("<img src=gif.com/123/><p>Hold the line.")); @@ -88,12 +94,12 @@ describe("Events", () => { it("Implicit close tags", () => runTest( - "<ol><li class=test><div><table style=width:100%><tr><th>TH<td colspan=2><h3>Heading</h3><tr><td><div>Div</div><td><div>Div2</div></table></div><li><div><h3>Heading 2</h3></div></li></ol><p>Para<h4>Heading 4</h4><p><ul><li>Hi<li>bye</ul>" + "<ol><li class=test><div><table style=width:100%><tr><th>TH<td colspan=2><h3>Heading</h3><tr><td><div>Div</div><td><div>Div2</div></table></div><li><div><h3>Heading 2</h3></div></li></ol><p>Para<h4>Heading 4</h4><p><ul><li>Hi<li>bye</ul>", )); it("attributes (no white space, no value, no quotes)", () => runTest( - '<button class="test0"title="test1" disabled value=test2>adsf</button>' + '<button class="test0"title="test1" disabled value=test2>adsf</button>', )); it("crazy attribute", () => runTest("<p < = '' FAIL>stuff</p><a")); @@ -131,7 +137,7 @@ describe("Events", () => { it("entity in attribute", () => runTest( - "<a href='http://example.com/pa#x61ge?param=value¶m2¶m3=<val&; & &'>" + "<a href='http://example.com/pa#x61ge?param=value¶m2¶m3=<val&; & &'>", )); it("double brackets", () => @@ -141,7 +147,7 @@ describe("Events", () => { it("Special special tags", () => runTest( - "<tItLe><b>foo</b><title></TiTlE><sitle><b></b></sitle><ttyle><b></b></ttyle><sCriPT></scripter</soo</sCript><STyLE></styler</STylE><sCiPt><stylee><scriptee><soo>" + "<tItLe><b>foo</b><title></TiTlE><sitle><b></b></sitle><ttyle><b></b></ttyle><sCriPT></scripter</soo</sCript><STyLE></styler</STylE><sCiPt><stylee><scriptee><soo>", )); it("Empty tag name", () => runTest("< ></ >")); @@ -162,8 +168,91 @@ describe("Events", () => { it("Comment false ending", () => runTest("<!-- a-b-> -->")); + it("Short bang comment", () => runTest("<!--!>")); + + it("Abruptly closed comment", () => runTest("<!--->text")); + + it("Empty EOF comment", () => runTest("<!--")); + + it("HTML bogus comments", () => runTest("<?foo><!foo>")); + + it("Short HTML bogus comments", () => runTest("<!><!->")); + + it("Bogus comment after </ and whitespace", () => runTest("<div></ div>")); + + it("Empty closing tag", () => runTest("</>")); + + it("Empty closing tag, xmlMode=true", () => + runTest("</>", { xmlMode: true })); + + it("Doctype without whitespace", () => runTest("<!DOCTYPEhtml>")); + + it("Foreign CDATA in SVG", () => runTest("<svg><![CDATA[a<b]]></svg>")); + + it("Foreign CDATA in MathML", () => + runTest("<math><![CDATA[a<b]]></math>")); + + it("SVG title is not HTML special", () => + runTest("<svg><title>&<b>x</b></title></svg>")); + + it("SVG tag case adjustment", () => + runTest("<svg><foreignObject><b>x</b></foreignObject></svg>")); + + it("SVG integration point closing with unclosed child", () => + runTest("<svg><foreignObject><div>x</foreignObject></svg>after")); + + it("Content after SVG integration point", () => + runTest("<svg><foreignObject><b>x</b></foreignObject><rect/></svg>")); + + it("Stray </svg> does not break foreign context", () => + runTest("</svg><script><b>not a tag</b></script>")); + + it("Implicit close of nested foreign elements", () => + runTest("<svg><math><mi>text</svg><script><b>x</b></script>")); + + it("Self-closing foreign element with recognizeSelfClosing", () => + runTest("<svg/><script><b>x</b></script>", { + recognizeSelfClosing: true, + })); + + it("HTML image alias", () => runTest("<image></image>")); + + it("SVG image is not aliased", () => runTest("<svg><image></image></svg>")); + + it("EOF bogus comments", () => runTest("<!-")); + + it("EOF empty bogus comment", () => runTest("<!")); + + it("EOF partial doctype", () => runTest("<!DOC")); + + it("EOF complete doctype", () => runTest("<!DOCTYPE")); + + it("EOF incomplete doctype", () => runTest("<!DOCTYPE h")); + + it("EOF processing instruction", () => runTest("<?")); + + it("Partial CDATA match with >", () => runTest("<![CD>")); + + it("Unclosed CDATA at EOF", () => runTest("<![CDATA[foo")); + + it("Empty unclosed CDATA at EOF", () => runTest("<![CDATA[")); + + it("Partial CDATA at EOF", () => runTest("<![C")); + it("Scripts ending with <", () => runTest("<script><</script>")); + it("Special end tags ending with /> in script", () => + runTest("<script>safe</script/><img>")); + + it("Special end tags ending with /> in style", () => + runTest("<style>safe</style/><img>")); + + it("Special end tags ending with /> in title", () => + runTest("<title>safe</title/><img>")); + + it("Special end tags ending with /> in textarea", () => + runTest("<textarea>safe</textarea/><img>")); + it("CDATA more edge-cases", () => runTest("<![CDATA[foo]bar]>baz]]>", { recognizeCDATA: true })); @@ -174,14 +263,18 @@ describe("Events", () => { it("entity in attribute (#276)", () => runTest( - '<img src="?&image_uri=1&ℑ=2&image=3"/>?&image_uri=1&ℑ=2&image=3' + '<img src="?&image_uri=1&ℑ=2&image=3"/>?&image_uri=1&ℑ=2&image=3', )); it("entity in title (#592)", () => runTest("<title>the "title"")); + it("entity in textarea", () => runTest("<textarea>&</textarea>")); + it("entity in title - decodeEntities=false (#592)", () => runTest("<title>the "title"", { decodeEntities: false })); + it("plaintext", () => runTest("<plaintext><b>hi</b>")); + it("</title> in <script> (#745)", () => runTest("<script>'</title>'</script>")); @@ -195,7 +288,7 @@ describe("Events", () => { it("Start & end indices from domhandler", () => runTest( - "<!DOCTYPE html> <html> <title>The Title</title> <body class='foo'>Hello world <p></p></body> <!-- the comment --> </html> " + "<!DOCTYPE html> <html> <title>The Title</title> <body class='foo'>Hello world <p></p></body> <!-- the comment --> </html> ", )); it("Self-closing indices (#941)", () => @@ -206,13 +299,13 @@ describe("Events", () => { it("Attribute in XML (see #1350)", () => runTest( '<Page\n title="Hello world"\n actionBarVisible="false"/>', - { xmlMode: true } + { xmlMode: true }, )); }); describe("Helper", () => { it("should handle errors", () => { - const eventCallback = jest.fn(); + const eventCallback = vi.fn(); const parser = new Parser(helper.getEventCollector(eventCallback)); parser.end(); @@ -221,7 +314,7 @@ describe("Helper", () => { expect(eventCallback).toHaveBeenCalledTimes(2); expect(eventCallback).toHaveBeenNthCalledWith(1, null, []); expect(eventCallback).toHaveBeenLastCalledWith( - new Error(".write() after done!") + new Error(".write() after done!"), ); }); }); diff --git a/src/Parser.spec.ts b/src/Parser.spec.ts index da8a2b8..fe3fb89 100644 --- a/src/Parser.spec.ts +++ b/src/Parser.spec.ts @@ -1,9 +1,10 @@ +import { describe, expect, it, vi } from "vitest"; import { Parser, Tokenizer } from "./index.js"; import type { Handler } from "./Parser.js"; describe("API", () => { - test("should work without callbacks", () => { - const cbs: Partial<Handler> = { onerror: jest.fn() }; + it("should work without callbacks", () => { + const cbs: Partial<Handler> = { onerror: vi.fn() }; const p = new Parser(cbs, { xmlMode: true, lowerCaseAttributeNames: true, @@ -16,11 +17,11 @@ describe("API", () => { p.end(); p.write("foo"); expect(cbs.onerror).toHaveBeenLastCalledWith( - new Error(".write() after done!") + new Error(".write() after done!"), ); p.end(); expect(cbs.onerror).toHaveBeenLastCalledWith( - new Error(".end() after done!") + new Error(".end() after done!"), ); // Should ignore the error if there is no callback @@ -30,13 +31,13 @@ describe("API", () => { p.reset(); // Remove method - cbs.onopentag = jest.fn(); + cbs.onopentag = vi.fn(); p.write("<a foo"); delete cbs.onopentag; p.write(">"); // Pause/resume - const onText = jest.fn(); + const onText = vi.fn(); cbs.ontext = onText; p.pause(); p.write("foo"); @@ -55,8 +56,8 @@ describe("API", () => { expect(onText).toHaveBeenLastCalledWith("bar"); }); - test("should back out of numeric entities (#125)", () => { - const onend = jest.fn(); + it("should back out of numeric entities (#125)", () => { + const onend = vi.fn(); let text = ""; const p = new Parser({ ontext(data) { @@ -79,9 +80,9 @@ describe("API", () => { expect(text).toBe("0&#xn"); }); - test("should not have the start index be greater than the end index", () => { - const onopentag = jest.fn(); - const onclosetag = jest.fn(); + it("should not have the start index be greater than the end index", () => { + const onopentag = vi.fn(); + const onclosetag = vi.fn(); const p = new Parser({ onopentag(tag) { @@ -109,7 +110,39 @@ describe("API", () => { expect(onclosetag).toHaveBeenNthCalledWith(2, "hr", 9); }); - test("should update the position when a single tag is spread across multiple chunks", () => { + it("should preserve declaration names outside of HTML mode", () => { + const onprocessinginstruction = vi.fn(); + + new Parser( + { + onprocessinginstruction, + }, + { xmlMode: true }, + ).end("<!DOCTYPEhtml>"); + + expect(onprocessinginstruction).toHaveBeenCalledWith( + "!DOCTYPEhtml", + "!DOCTYPEhtml", + ); + }); + + it("should preserve declaration casing when lowerCaseTags is disabled", () => { + const onprocessinginstruction = vi.fn(); + + new Parser( + { + onprocessinginstruction, + }, + { lowerCaseTags: false }, + ).end("<!DOCTYPEhtml>"); + + expect(onprocessinginstruction).toHaveBeenCalledWith( + "!DOCTYPE", + "!DOCTYPEhtml", + ); + }); + + it("should update the position when a single tag is spread across multiple chunks", () => { let called = false; const p = new Parser({ onopentag() { @@ -125,7 +158,7 @@ describe("API", () => { expect(called).toBe(true); }); - test("should have the correct position for implied opening tags", () => { + it("should have the correct position for implied opening tags", () => { let called = false; const p = new Parser({ onopentag() { @@ -139,14 +172,14 @@ describe("API", () => { expect(called).toBe(true); }); - test("should parse <__proto__> (#387)", () => { + it("should parse <__proto__> (#387)", () => { const p = new Parser(null); // Should not throw - p.parseChunk("<__proto__>"); + p.write("<__proto__>"); }); - test("should support custom tokenizer", () => { + it("should support custom tokenizer", () => { class CustomTokenizer extends Tokenizer {} const p = new Parser( @@ -156,8 +189,8 @@ describe("API", () => { expect(parser.tokenizer).toBeInstanceOf(CustomTokenizer); }, }, - { Tokenizer: CustomTokenizer } + { Tokenizer: CustomTokenizer }, ); - p.done(); + p.end(); }); }); diff --git a/src/Parser.ts b/src/Parser.ts index a3cfbbe..800ca0e 100644 --- a/src/Parser.ts +++ b/src/Parser.ts @@ -1,5 +1,6 @@ -import Tokenizer, { Callbacks, QuoteType } from "./Tokenizer.js"; -import { fromCodePoint } from "entities/lib/decode.js"; +const { fromCodePoint } = String; + +import Tokenizer, { type Callbacks, QuoteType } from "./Tokenizer.js"; const formTags = new Set([ "input", @@ -11,6 +12,7 @@ const formTags = new Set([ "textarea", ]); const pTag = new Set(["p"]); +const headingTags = new Set(["h1", "h2", "h3", "h4", "h5", "h6", "p"]); const tableSectionTags = new Set(["thead", "tbody"]); const ddtTags = new Set(["dd", "dt"]); const rtpTags = new Set(["rt", "rp"]); @@ -20,14 +22,15 @@ const openImpliesClose = new Map<string, Set<string>>([ ["th", new Set(["th"])], ["td", new Set(["thead", "th", "td"])], ["body", new Set(["head", "link", "script"])], + ["a", new Set(["a"])], ["li", new Set(["li"])], ["p", pTag], - ["h1", pTag], - ["h2", pTag], - ["h3", pTag], - ["h4", pTag], - ["h5", pTag], - ["h6", pTag], + ["h1", headingTags], + ["h2", headingTags], + ["h3", headingTags], + ["h4", headingTags], + ["h5", headingTags], + ["h6", headingTags], ["select", formTags], ["input", formTags], ["output", formTags], @@ -65,6 +68,8 @@ const openImpliesClose = new Map<string, Set<string>>([ ["tfoot", tableSectionTags], ]); +const DOCUMENT_TYPE = "doctype"; + const voidElements = new Set([ "area", "base", @@ -89,6 +94,12 @@ const voidElements = new Set([ const foreignContextElements = new Set(["math", "svg"]); +/** + * Elements that can be used to integrate HTML content within foreign namespaces (e.g., SVG or MathML). + * + * Entries must use the SVG-adjusted casing (e.g. "foreignObject" not + * "foreignobject") since they are compared against adjusted tag names. + */ const htmlIntegrationElements = new Set([ "mi", "mo", @@ -96,39 +107,84 @@ const htmlIntegrationElements = new Set([ "ms", "mtext", "annotation-xml", - "foreignobject", + "foreignObject", "desc", "title", ]); +const svgTagNameAdjustments = new Map<string, string>([ + ["altglyph", "altGlyph"], + ["altglyphdef", "altGlyphDef"], + ["altglyphitem", "altGlyphItem"], + ["animatecolor", "animateColor"], + ["animatemotion", "animateMotion"], + ["animatetransform", "animateTransform"], + ["clippath", "clipPath"], + ["feblend", "feBlend"], + ["fecolormatrix", "feColorMatrix"], + ["fecomponenttransfer", "feComponentTransfer"], + ["fecomposite", "feComposite"], + ["feconvolvematrix", "feConvolveMatrix"], + ["fediffuselighting", "feDiffuseLighting"], + ["fedisplacementmap", "feDisplacementMap"], + ["fedistantlight", "feDistantLight"], + ["fedropshadow", "feDropShadow"], + ["feflood", "feFlood"], + ["fefunca", "feFuncA"], + ["fefuncb", "feFuncB"], + ["fefuncg", "feFuncG"], + ["fefuncr", "feFuncR"], + ["fegaussianblur", "feGaussianBlur"], + ["feimage", "feImage"], + ["femerge", "feMerge"], + ["femergenode", "feMergeNode"], + ["femorphology", "feMorphology"], + ["feoffset", "feOffset"], + ["fepointlight", "fePointLight"], + ["fespecularlighting", "feSpecularLighting"], + ["fespotlight", "feSpotLight"], + ["fetile", "feTile"], + ["feturbulence", "feTurbulence"], + ["foreignobject", "foreignObject"], + ["glyphref", "glyphRef"], + ["lineargradient", "linearGradient"], + ["radialgradient", "radialGradient"], + ["textpath", "textPath"], +]); + +const enum ForeignContext { + None, + Svg, + MathML, +} + +/** + * Options for the streaming HTML/XML parser. + */ export interface ParserOptions { /** * Indicates whether special tags (`<script>`, `<style>`, and `<title>`) should get special treatment * and if "empty" tags (eg. `<br>`) can have children. If `false`, the content of special tags * will be text only. For feeds and other XML content (documents that don't consist of HTML), * set this to `true`. - * * @default false */ xmlMode?: boolean; /** * Decode entities within the document. - * * @default true */ decodeEntities?: boolean; /** * If set to true, all tags will be lowercased. - * * @default !xmlMode */ lowerCaseTags?: boolean; /** * If set to `true`, all attribute names will be lowercased. This has noticeable impact on speed. - * * @default !xmlMode */ lowerCaseAttributeNames?: boolean; @@ -136,7 +192,6 @@ export interface ParserOptions { /** * If set to true, CDATA sections will be recognized as text even if the xmlMode option is not enabled. * NOTE: If xmlMode is set to `true` then CDATA sections will always be recognized as text. - * * @default xmlMode */ recognizeCDATA?: boolean; @@ -144,7 +199,6 @@ export interface ParserOptions { /** * If set to `true`, self-closing tags will trigger the onclosetag event even if xmlMode is not set to `true`. * NOTE: If xmlMode is set to `true` then self-closing tags will always be recognized. - * * @default xmlMode */ recognizeSelfClosing?: boolean; @@ -155,6 +209,9 @@ export interface ParserOptions { Tokenizer?: typeof Tokenizer; } +/** + * Parser callback interface used by the tokenizer. + */ export interface Handler { onparserinit(parser: Parser): void; @@ -179,12 +236,12 @@ export interface Handler { onattribute( name: string, value: string, - quote?: string | undefined | null + quote?: string | undefined | null, ): void; onopentag( name: string, attribs: { [s: string]: string }, - isImplied: boolean + isImplied: boolean, ): void; ontext(data: string): void; oncomment(data: string): void; @@ -196,11 +253,14 @@ export interface Handler { const reNameEnd = /\s|\//; +/** + * Incremental parser implementation. + */ export class Parser implements Callbacks { /** The start index of the last event. */ - public startIndex = 0; + startIndex = 0; /** The end index of the last event. */ - public endIndex = 0; + endIndex = 0; /** * Store the start index of the current open tag, * so we can update the start index for attributes. @@ -212,11 +272,11 @@ export class Parser implements Callbacks { private attribvalue = ""; private attribs: null | { [key: string]: string } = null; private readonly stack: string[] = []; - /** Determines whether self-closing tags are recognized. */ - private readonly foreignContext: boolean[]; + private readonly foreignContext: ForeignContext[]; private readonly cbs: Partial<Handler>; private readonly lowerCaseTagNames: boolean; private readonly lowerCaseAttributeNames: boolean; + private readonly recognizeSelfClosing: boolean; /** We are parsing HTML. Inverse of the `xmlMode` option. */ private readonly htmlMode: boolean; private readonly tokenizer: Tokenizer; @@ -230,24 +290,30 @@ export class Parser implements Callbacks { constructor( cbs?: Partial<Handler> | null, - private readonly options: ParserOptions = {} + private readonly options: ParserOptions = {}, ) { this.cbs = cbs ?? {}; this.htmlMode = !this.options.xmlMode; this.lowerCaseTagNames = options.lowerCaseTags ?? this.htmlMode; this.lowerCaseAttributeNames = options.lowerCaseAttributeNames ?? this.htmlMode; + this.recognizeSelfClosing = + options.recognizeSelfClosing ?? !this.htmlMode; this.tokenizer = new (options.Tokenizer ?? Tokenizer)( this.options, - this + this, ); - this.foreignContext = [!this.htmlMode]; + this.foreignContext = [ForeignContext.None]; this.cbs.onparserinit?.(this); } // Tokenizer event handlers - /** @internal */ + /** + * @param start Start index for the current parser event. + * @param endIndex End index for the current parser event. + * @internal + */ ontext(start: number, endIndex: number): void { const data = this.getSlice(start, endIndex); this.endIndex = endIndex - 1; @@ -255,54 +321,116 @@ export class Parser implements Callbacks { this.startIndex = endIndex; } - /** @internal */ + /** + * @param cp Current Unicode code point. + * @param endIndex End index for the current parser event. + * @internal + */ ontextentity(cp: number, endIndex: number): void { this.endIndex = endIndex - 1; this.cbs.ontext?.(fromCodePoint(cp)); this.startIndex = endIndex; } + /** @internal */ + isInForeignContext(): boolean { + return this.foreignContext[0] !== ForeignContext.None; + } + /** * Checks if the current tag is a void element. Override this if you want * to specify your own additional void elements. + * @param name Name of the pseudo selector. */ protected isVoidElement(name: string): boolean { return this.htmlMode && voidElements.has(name); } - /** @internal */ - onopentagname(start: number, endIndex: number): void { - this.endIndex = endIndex; + /** + * Read a tag name from the buffer. + * + * When `lowerCaseTagNames` is enabled (the default in HTML mode), the name + * is lowercased and may be adjusted for SVG casing or the `image` → `img` + * alias. + * @param start Start index of the tag name in the buffer. + * @param endIndex End index of the tag name in the buffer. + */ + private readTagName(start: number, endIndex: number): string { + const name = this.lowerCaseTagNames + ? this.getSlice(start, endIndex).toLowerCase() + : this.getSlice(start, endIndex); - let name = this.getSlice(start, endIndex); + if (!(this.lowerCaseTagNames && this.htmlMode)) { + return name; + } - if (this.lowerCaseTagNames) { - name = name.toLowerCase(); + if (this.foreignContext[0] === ForeignContext.Svg) { + return svgTagNameAdjustments.get(name) ?? name; } - this.emitOpenTag(name); + /* + * Closing tags for SVG elements inside HTML integration points + * (e.g. </foreignObject> while inside its own content) need case + * adjustment so the name matches what was pushed to the stack. + * `foreignContext.length > 1` means a foreign ancestor exists — + * the base [None] entry plus at least one pushed context. + */ + if (this.foreignContext.length > 1) { + const adjusted = svgTagNameAdjustments.get(name); + if (adjusted !== undefined && this.stack.includes(adjusted)) { + return adjusted; + } + } + + if (!this.isInForeignContext()) { + return name === "image" ? "img" : name; + } + + return name; + } + + /** + * @param start Start index for the current parser event. + * @param endIndex End index for the current parser event. + * @internal + */ + onopentagname(start: number, endIndex: number): void { + this.endIndex = endIndex; + this.emitOpenTag(this.readTagName(start, endIndex)); } private emitOpenTag(name: string) { this.openTagStart = this.startIndex; this.tagname = name; + /* + * The spec ignores a second <form> when one is already open. + * Setting tagname to "" suppresses all downstream effects: attribs + * stays null so endOpenTag is a no-op, and closeCurrentTag can't + * match "" on the stack. + */ + if (this.htmlMode && name === "form" && this.stack.includes("form")) { + this.tagname = ""; + return; + } + const impliesClose = this.htmlMode && openImpliesClose.get(name); if (impliesClose) { while (this.stack.length > 0 && impliesClose.has(this.stack[0])) { - const element = this.stack.shift()!; - this.cbs.onclosetag?.(element, true); + this.popElement(true); } } if (!this.isVoidElement(name)) { this.stack.unshift(name); if (this.htmlMode) { - if (foreignContextElements.has(name)) { - this.foreignContext.unshift(true); + if (name === "svg") { + this.foreignContext.unshift(ForeignContext.Svg); + } else if (name === "math") { + this.foreignContext.unshift(ForeignContext.MathML); } else if (htmlIntegrationElements.has(name)) { - this.foreignContext.unshift(false); + this.foreignContext.unshift(ForeignContext.None); } } } @@ -324,7 +452,10 @@ export class Parser implements Callbacks { this.tagname = ""; } - /** @internal */ + /** + * @param endIndex End index for the current parser event. + * @internal + */ onopentagend(endIndex: number): void { this.endIndex = endIndex; this.endOpenTag(false); @@ -333,32 +464,22 @@ export class Parser implements Callbacks { this.startIndex = endIndex + 1; } - /** @internal */ + /** + * @param start Start index for the current parser event. + * @param endIndex End index for the current parser event. + * @internal + */ onclosetag(start: number, endIndex: number): void { this.endIndex = endIndex; - - let name = this.getSlice(start, endIndex); - - if (this.lowerCaseTagNames) { - name = name.toLowerCase(); - } - - if ( - this.htmlMode && - (foreignContextElements.has(name) || - htmlIntegrationElements.has(name)) - ) { - this.foreignContext.shift(); - } + const name = this.readTagName(start, endIndex); if (!this.isVoidElement(name)) { const pos = this.stack.indexOf(name); if (pos !== -1) { - for (let index = 0; index <= pos; index++) { - const element = this.stack.shift()!; - // We know the stack has sufficient elements. - this.cbs.onclosetag?.(element, index !== pos); + for (let index = 0; index < pos; index++) { + this.popElement(true); } + this.popElement(false); } else if (this.htmlMode && name === "p") { // Implicit open before close this.emitOpenTag("p"); @@ -375,10 +496,13 @@ export class Parser implements Callbacks { this.startIndex = endIndex + 1; } - /** @internal */ + /** + * @param endIndex End index for the current parser event. + * @internal + */ onselfclosingtag(endIndex: number): void { this.endIndex = endIndex; - if (this.options.recognizeSelfClosing || this.foreignContext[0]) { + if (this.recognizeSelfClosing || this.isInForeignContext()) { this.closeCurrentTag(false); // Set `startIndex` for next node @@ -389,19 +513,39 @@ export class Parser implements Callbacks { } } + /** + * Pop the top element off the stack, emit a close event, and maintain + * the foreign context stack. + * @param implied Whether this close is implied (not from an explicit end tag). + */ + private popElement(implied: boolean): void { + // biome-ignore lint/style/noNonNullAssertion: The element is guaranteed to exist. + const element = this.stack.shift()!; + if ( + this.htmlMode && + (foreignContextElements.has(element) || + htmlIntegrationElements.has(element)) + ) { + this.foreignContext.shift(); + } + this.cbs.onclosetag?.(element, implied); + } + private closeCurrentTag(isOpenImplied: boolean) { const name = this.tagname; this.endOpenTag(isOpenImplied); // Self-closing tags will be on the top of the stack if (this.stack[0] === name) { - // If the opening tag isn't implied, the closing tag has to be implied. - this.cbs.onclosetag?.(name, !isOpenImplied); - this.stack.shift(); + this.popElement(!isOpenImplied); } } - /** @internal */ + /** + * @param start Start index for the current parser event. + * @param endIndex End index for the current parser event. + * @internal + */ onattribname(start: number, endIndex: number): void { this.startIndex = start; const name = this.getSlice(start, endIndex); @@ -411,17 +555,28 @@ export class Parser implements Callbacks { : name; } - /** @internal */ + /** + * @param start Start index for the current parser event. + * @param endIndex End index for the current parser event. + * @internal + */ onattribdata(start: number, endIndex: number): void { this.attribvalue += this.getSlice(start, endIndex); } - /** @internal */ + /** + * @param cp Current Unicode code point. + * @internal + */ onattribentity(cp: number): void { this.attribvalue += fromCodePoint(cp); } - /** @internal */ + /** + * @param quote Quote type used for the current attribute. + * @param endIndex End index for the current parser event. + * @internal + */ onattribend(quote: QuoteType, endIndex: number): void { this.endIndex = endIndex; @@ -431,16 +586,13 @@ export class Parser implements Callbacks { quote === QuoteType.Double ? '"' : quote === QuoteType.Single - ? "'" - : quote === QuoteType.NoValue - ? undefined - : null + ? "'" + : quote === QuoteType.NoValue + ? undefined + : null, ); - if ( - this.attribs && - !Object.prototype.hasOwnProperty.call(this.attribs, this.attribname) - ) { + if (this.attribs && !Object.hasOwn(this.attribs, this.attribname)) { this.attribs[this.attribname] = this.attribvalue; } this.attribvalue = ""; @@ -457,13 +609,25 @@ export class Parser implements Callbacks { return name; } - /** @internal */ + /** + * @param start Start index for the current parser event. + * @param endIndex End index for the current parser event. + * @internal + */ ondeclaration(start: number, endIndex: number): void { this.endIndex = endIndex; const value = this.getSlice(start, endIndex); if (this.cbs.onprocessinginstruction) { - const name = this.getInstructionName(value); + /* + * In HTML mode, ondeclaration is only reached for DOCTYPE + * (the tokenizer routes everything else to bogus comments). + */ + const name = this.htmlMode + ? this.lowerCaseTagNames + ? DOCUMENT_TYPE + : value.slice(0, DOCUMENT_TYPE.length) + : this.getInstructionName(value); this.cbs.onprocessinginstruction(`!${name}`, `!${value}`); } @@ -471,7 +635,11 @@ export class Parser implements Callbacks { this.startIndex = endIndex + 1; } - /** @internal */ + /** + * @param start Start index for the current parser event. + * @param endIndex End index for the current parser event. + * @internal + */ onprocessinginstruction(start: number, endIndex: number): void { this.endIndex = endIndex; const value = this.getSlice(start, endIndex); @@ -485,7 +653,12 @@ export class Parser implements Callbacks { this.startIndex = endIndex + 1; } - /** @internal */ + /** + * @param start Start index for the current parser event. + * @param endIndex End index for the current parser event. + * @param offset Offset applied when computing parser indices. + * @internal + */ oncomment(start: number, endIndex: number, offset: number): void { this.endIndex = endIndex; @@ -496,7 +669,12 @@ export class Parser implements Callbacks { this.startIndex = endIndex + 1; } - /** @internal */ + /** + * @param start Start index for the current parser event. + * @param endIndex End index for the current parser event. + * @param offset Offset applied when computing parser indices. + * @internal + */ oncdata(start: number, endIndex: number, offset: number): void { this.endIndex = endIndex; const value = this.getSlice(start, endIndex - offset); @@ -505,6 +683,8 @@ export class Parser implements Callbacks { this.cbs.oncdatastart?.(); this.cbs.ontext?.(value); this.cbs.oncdataend?.(); + } else if (this.isInForeignContext()) { + this.cbs.ontext?.(value); } else { this.cbs.oncomment?.(`[CDATA[${value}]]`); this.cbs.oncommentend?.(); @@ -529,11 +709,12 @@ export class Parser implements Callbacks { /** * Resets the parser to a blank state, ready to parse a new HTML document */ - public reset(): void { + reset(): void { this.cbs.onreset?.(); this.tokenizer.reset(); this.tagname = ""; this.attribname = ""; + this.attribvalue = ""; this.attribs = null; this.stack.length = 0; this.startIndex = 0; @@ -541,7 +722,7 @@ export class Parser implements Callbacks { this.cbs.onparserinit?.(this); this.buffers.length = 0; this.foreignContext.length = 0; - this.foreignContext.unshift(!this.htmlMode); + this.foreignContext.unshift(ForeignContext.None); this.bufferOffset = 0; this.writeIndex = 0; this.ended = false; @@ -550,22 +731,25 @@ export class Parser implements Callbacks { /** * Resets the parser, then parses a complete document and * pushes it to the handler. - * * @param data Document to parse. */ - public parseComplete(data: string): void { + parseComplete(data: string): void { this.reset(); this.end(data); } private getSlice(start: number, end: number) { + if (start === end) { + return ""; + } + while (start - this.bufferOffset >= this.buffers[0].length) { this.shiftBuffer(); } let slice = this.buffers[0].slice( start - this.bufferOffset, - end - this.bufferOffset + end - this.bufferOffset, ); while (end - this.bufferOffset > this.buffers[0].length) { @@ -584,10 +768,9 @@ export class Parser implements Callbacks { /** * Parses a chunk of data and calls the corresponding callbacks. - * * @param chunk Chunk to parse. */ - public write(chunk: string): void { + write(chunk: string): void { if (this.ended) { this.cbs.onerror?.(new Error(".write() after done!")); return; @@ -602,10 +785,9 @@ export class Parser implements Callbacks { /** * Parses the end of the buffer and clears the stack, calls onend. - * * @param chunk Optional final chunk to parse. */ - public end(chunk?: string): void { + end(chunk?: string): void { if (this.ended) { this.cbs.onerror?.(new Error(".end() after done!")); return; @@ -619,14 +801,14 @@ export class Parser implements Callbacks { /** * Pauses parsing. The parser won't emit events until `resume` is called. */ - public pause(): void { + pause(): void { this.tokenizer.pause(); } /** * Resumes parsing after `pause` was called. */ - public resume(): void { + resume(): void { this.tokenizer.resume(); while ( @@ -638,23 +820,4 @@ export class Parser implements Callbacks { if (this.ended) this.tokenizer.end(); } - - /** - * Alias of `write`, for backwards compatibility. - * - * @param chunk Chunk to parse. - * @deprecated - */ - public parseChunk(chunk: string): void { - this.write(chunk); - } - /** - * Alias of `end`, for backwards compatibility. - * - * @param chunk Optional final chunk to parse. - * @deprecated - */ - public done(chunk?: string): void { - this.end(chunk); - } } diff --git a/src/Tokenizer.spec.ts b/src/Tokenizer.spec.ts index 4c63527..c60b8c5 100644 --- a/src/Tokenizer.spec.ts +++ b/src/Tokenizer.spec.ts @@ -1,29 +1,40 @@ +import { describe, expect, it } from "vitest"; import { Tokenizer } from "./index.js"; import type { Callbacks } from "./Tokenizer.js"; -function tokenize(data: string, options = {}) { +function tokenize( + data: string | ((tokenizer: Tokenizer, log: unknown[][]) => void), + options = {}, +) { const log: unknown[][] = []; const tokenizer = new Tokenizer( options, new Proxy( - {}, + { isInForeignContext: () => false }, { - get(_, property) { + get(target, property) { + if (property === "isInForeignContext") { + return target.isInForeignContext; + } return (...values: unknown[]) => log.push([property, ...values]); }, - } - ) as Callbacks + }, + ) as Callbacks, ); - tokenizer.write(data); - tokenizer.end(); + if (typeof data === "function") { + data(tokenizer, log); + } else { + tokenizer.write(data); + tokenizer.end(); + } return log; } describe("Tokenizer", () => { - describe("should support self-closing special tags", () => { + describe("should ignore self-closing slash in text-only HTML tags", () => { it("for self-closing script tag", () => { expect(tokenize("<script /><div></div>")).toMatchSnapshot(); }); @@ -33,6 +44,24 @@ describe("Tokenizer", () => { it("for self-closing title tag", () => { expect(tokenize("<title /><div></div>")).toMatchSnapshot(); }); + it("for self-closing textarea tag", () => { + expect(tokenize("<textarea /><div></div>")).toMatchSnapshot(); + }); + it("for self-closing xmp tag", () => { + expect(tokenize("<xmp /><div></div>")).toMatchSnapshot(); + }); + it("for self-closing plaintext tag", () => { + expect(tokenize("<plaintext /><div></div>")).toMatchSnapshot(); + }); + it("for self-closing iframe tag", () => { + expect(tokenize("<iframe /><div></div>")).toMatchSnapshot(); + }); + it("for self-closing noembed tag", () => { + expect(tokenize("<noembed /><div></div>")).toMatchSnapshot(); + }); + it("for self-closing noframes tag", () => { + expect(tokenize("<noframes /><div></div>")).toMatchSnapshot(); + }); }); describe("should support standard special tags", () => { @@ -45,6 +74,84 @@ describe("Tokenizer", () => { it("for normal sitle tag", () => { expect(tokenize("<title></title><div></div>")).toMatchSnapshot(); }); + it("for normal textarea tag", () => { + expect( + tokenize("<textarea></textarea><div></div>"), + ).toMatchSnapshot(); + }); + it("for normal xmp tag", () => { + expect(tokenize("<xmp></xmp><div></div>")).toMatchSnapshot(); + }); + }); + + describe("should treat html inside special tags as text", () => { + it("for div inside script tag", () => { + expect(tokenize("<script><div></div></script>")).toMatchSnapshot(); + }); + it("for div inside style tag", () => { + expect(tokenize("<style><div></div></style>")).toMatchSnapshot(); + }); + it("for div inside title tag", () => { + expect(tokenize("<title><div></div></title>")).toMatchSnapshot(); + }); + it("for div inside textarea tag", () => { + expect( + tokenize("<textarea><div></div></textarea>"), + ).toMatchSnapshot(); + }); + it("for div inside xmp tag", () => { + expect(tokenize("<xmp><div></div></xmp>")).toMatchSnapshot(); + }); + }); + + describe("should treat html inside raw-text tags as text", () => { + it("for div inside iframe tag", () => { + expect( + tokenize("<iframe>&<div></div></iframe>"), + ).toMatchSnapshot(); + }); + it("for div inside noembed tag", () => { + expect( + tokenize("<noembed>&<div></div></noembed>"), + ).toMatchSnapshot(); + }); + it("for div inside noframes tag", () => { + expect( + tokenize("<noframes>&<div></div></noframes>"), + ).toMatchSnapshot(); + }); + }); + + describe("should close special tags on end tags ending with />", () => { + it("for script tag", () => { + expect(tokenize("<script>safe</script/><img>")).toMatchSnapshot(); + }); + it("for style tag", () => { + expect(tokenize("<style>safe</style/><img>")).toMatchSnapshot(); + }); + it("for title tag", () => { + expect(tokenize("<title>safe</title/><img>")).toMatchSnapshot(); + }); + it("for textarea tag", () => { + expect( + tokenize("<textarea>safe</textarea/><img>"), + ).toMatchSnapshot(); + }); + }); + + describe("should correctly mark attributes", () => { + it("for no value attribute", () => { + expect(tokenize("<div aaaaaaa >")).toMatchSnapshot(); + }); + it("for no quotes attribute", () => { + expect(tokenize("<div aaa=aaa >")).toMatchSnapshot(); + }); + it("for single quotes attribute", () => { + expect(tokenize("<div aaa='a' >")).toMatchSnapshot(); + }); + it("for double quotes attribute", () => { + expect(tokenize('<div aaa="a" >')).toMatchSnapshot(); + }); }); describe("should not break after special tag followed by an entity", () => { @@ -54,6 +161,13 @@ describe("Tokenizer", () => { it("for self-closing special tag", () => { expect(tokenize("<style />'<br/>")).toMatchSnapshot(); }); + it("for recognized self-closing special tag", () => { + expect( + tokenize("<style />'<br/>", { + recognizeSelfClosing: true, + }), + ).toMatchSnapshot(); + }); }); describe("should handle entities", () => { @@ -61,14 +175,14 @@ describe("Tokenizer", () => { expect( tokenize("&>&<üabcde", { xmlMode: true, - }) + }), ).toMatchSnapshot()); it("for entities in attributes (#276)", () => expect( tokenize( - '<img src="?&image_uri=1&ℑ=2&image=3"/>?&image_uri=1&ℑ=2&image=3' - ) + '<img src="?&image_uri=1&ℑ=2&image=3"/>?&image_uri=1&ℑ=2&image=3', + ), ).toMatchSnapshot()); it("for trailing legacy entity", () => @@ -78,14 +192,93 @@ describe("Tokenizer", () => { expect(tokenize("≧̸")).toMatchSnapshot()); }); + it("should close comments on --!>", () => { + expect( + tokenize("<!-- --!><img src=x onerror=alert(1)>-->"), + ).toMatchSnapshot(); + }); + + it("should handle abruptly closed comments", () => { + expect(tokenize("<!--->text")).toMatchSnapshot(); + }); + + it.each(["<!>", "<!->"])("should treat %s as a bogus comment", (input) => { + expect(tokenize(input)).toMatchSnapshot(); + }); + + it.each([ + "<!--", + "<!---", + "<!----", + "<!--a-", + "<!--a--", + "<!--a--!", + ])("should trim unfinished HTML comment closes at EOF for %s", (input) => { + expect(tokenize(input)).toMatchSnapshot(); + }); + + it("should treat <? and <! as bogus comments in HTML", () => { + expect(tokenize("<?foo><!foo>")).toMatchSnapshot(); + }); + + it("should ignore empty closing tags", () => { + expect(tokenize("</>")).toMatchSnapshot(); + }); + + it("should treat <!DOCTYPEhtml> as a declaration", () => { + expect(tokenize("<!DOCTYPEhtml>")).toMatchSnapshot(); + }); + + it("should not treat <!--> as a complete comment in xmlMode", () => { + expect( + tokenize( + "<root><node>start</node><!--><node>should ignore</node><--><node>end</node></root>", + { xmlMode: true }, + ), + ).toMatchSnapshot(); + }); + + it.each([ + "script", + "style", + "title", + "textarea", + ])("should reset after an unclosed %s tag", (tag) => { + expect( + tokenize((tokenizer, events) => { + tokenizer.write(`<${tag}>body{color:red}`); + tokenizer.end(); + events.length = 0; + tokenizer.reset(); + tokenizer.write("<div>hello</div>"); + tokenizer.end(); + }).map(([event]) => event), + ).toEqual([ + "onopentagname", + "onopentagend", + "ontext", + "onclosetag", + "onend", + ]); + }); + + it("should terminate XML processing instructions on ?>", () => { + expect( + tokenize("<?target data > injected ?>", { xmlMode: true }), + ).toMatchSnapshot(); + }); + it("should not lose data when pausing", () => { const log: unknown[][] = []; const tokenizer = new Tokenizer( {}, new Proxy( - {}, + { isInForeignContext: () => false }, { - get(_, property) { + get(target, property) { + if (property === "isInForeignContext") { + return target.isInForeignContext; + } return (...values: unknown[]) => { if (property === "ontext") { tokenizer.pause(); @@ -93,8 +286,8 @@ describe("Tokenizer", () => { log.push([property, ...values]); }; }, - } - ) as Callbacks + }, + ) as Callbacks, ); tokenizer.write("&am"); diff --git a/src/Tokenizer.ts b/src/Tokenizer.ts index 40332be..be64a32 100644 --- a/src/Tokenizer.ts +++ b/src/Tokenizer.ts @@ -1,9 +1,9 @@ import { - EntityDecoder, DecodingMode, + EntityDecoder, htmlDecodeTree, xmlDecodeTree, -} from "entities/lib/decode.js"; +} from "entities/decode"; const enum CharCodes { Tab = 0x9, // "\t" @@ -64,13 +64,14 @@ const enum State { // Comments & CDATA BeforeComment, CDATASequence, + DeclarationSequence, InSpecialComment, InCommentLike, // Special tags - BeforeSpecialS, // Decide if we deal with `<script` or `<style` SpecialStartSequence, InSpecialTag, + InPlainText, InEntity, } @@ -96,6 +97,9 @@ function isASCIIAlpha(c: number): boolean { ); } +/** + * Quote style used for parsed attributes. + */ export enum QuoteType { NoValue = 0, Unquoted = 1, @@ -103,6 +107,9 @@ export enum QuoteType { Double = 3, } +/** + * Low-level tokenizer callback interface. + */ export interface Callbacks { onattribdata(start: number, endIndex: number): void; onattribentity(codepoint: number): void; @@ -119,6 +126,7 @@ export interface Callbacks { onselfclosingtag(endIndex: number): void; ontext(start: number, endIndex: number): void; ontextentity(codepoint: number, endIndex: number): void; + isInForeignContext?(): boolean; } /** @@ -128,14 +136,48 @@ export interface Callbacks { * sequences with an increased offset. */ const Sequences = { + Empty: new Uint8Array(0), Cdata: new Uint8Array([0x43, 0x44, 0x41, 0x54, 0x41, 0x5b]), // CDATA[ CdataEnd: new Uint8Array([0x5d, 0x5d, 0x3e]), // ]]> - CommentEnd: new Uint8Array([0x2d, 0x2d, 0x3e]), // `-->` + CommentEnd: new Uint8Array([0x2d, 0x2d, 0x21, 0x3e]), // `--!>` + Doctype: new Uint8Array([0x64, 0x6f, 0x63, 0x74, 0x79, 0x70, 0x65]), // `doctype` + IframeEnd: new Uint8Array([0x3c, 0x2f, 0x69, 0x66, 0x72, 0x61, 0x6d, 0x65]), // `</iframe` + NoembedEnd: new Uint8Array([ + 0x3c, 0x2f, 0x6e, 0x6f, 0x65, 0x6d, 0x62, 0x65, 0x64, + ]), // `</noembed` + NoframesEnd: new Uint8Array([ + 0x3c, 0x2f, 0x6e, 0x6f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, + ]), // `</noframes` + Plaintext: new Uint8Array([ + 0x3c, 0x2f, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, + ]), // `</plaintext` ScriptEnd: new Uint8Array([0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74]), // `</script` StyleEnd: new Uint8Array([0x3c, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65]), // `</style` TitleEnd: new Uint8Array([0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65]), // `</title` + TextareaEnd: new Uint8Array([ + 0x3c, 0x2f, 0x74, 0x65, 0x78, 0x74, 0x61, 0x72, 0x65, 0x61, + ]), // `</textarea` + XmpEnd: new Uint8Array([0x3c, 0x2f, 0x78, 0x6d, 0x70]), // `</xmp` }; +/** + * Maps the first lowercase character of an HTML tag name to the sequence + * used for special-tag detection. All sequences share a common layout + * where index 2 is the first tag-name character, so matching always + * continues from offset 3. + */ +const specialStartSequences = new Map<number, Uint8Array>([ + [Sequences.IframeEnd[2], Sequences.IframeEnd], + [Sequences.NoembedEnd[2], Sequences.NoembedEnd], + [Sequences.Plaintext[2], Sequences.Plaintext], + [Sequences.ScriptEnd[2], Sequences.ScriptEnd], + [Sequences.TitleEnd[2], Sequences.TitleEnd], + [Sequences.XmpEnd[2], Sequences.XmpEnd], +]); + +/** + * Tokenizer implementation used by `Parser`. + */ export default class Tokenizer { /** The current state the tokenizer is in. */ private state = State.Text; @@ -152,55 +194,64 @@ export default class Tokenizer { /** For special parsing behavior inside of script and style tags. */ private isSpecial = false; /** Indicates whether the tokenizer has been paused. */ - public running = true; + running = true; /** The offset of the current buffer. */ private offset = 0; private readonly xmlMode: boolean; private readonly decodeEntities: boolean; + private readonly recognizeSelfClosing: boolean; private readonly entityDecoder: EntityDecoder; constructor( { xmlMode = false, decodeEntities = true, - }: { xmlMode?: boolean; decodeEntities?: boolean }, - private readonly cbs: Callbacks + recognizeSelfClosing = xmlMode, + }: { + xmlMode?: boolean; + decodeEntities?: boolean; + recognizeSelfClosing?: boolean; + }, + private readonly cbs: Callbacks, ) { this.xmlMode = xmlMode; this.decodeEntities = decodeEntities; + this.recognizeSelfClosing = recognizeSelfClosing; this.entityDecoder = new EntityDecoder( xmlMode ? xmlDecodeTree : htmlDecodeTree, - (cp, consumed) => this.emitCodePoint(cp, consumed) + (cp, consumed) => this.emitCodePoint(cp, consumed), ); } - public reset(): void { + reset(): void { this.state = State.Text; this.buffer = ""; this.sectionStart = 0; this.index = 0; this.baseState = State.Text; - this.currentSequence = undefined!; + this.isSpecial = false; + this.currentSequence = Sequences.Empty; + this.sequenceIndex = 0; this.running = true; this.offset = 0; } - public write(chunk: string): void { + write(chunk: string): void { this.offset += this.buffer.length; this.buffer = chunk; this.parse(); } - public end(): void { + end(): void { if (this.running) this.finish(); } - public pause(): void { + pause(): void { this.running = false; } - public resume(): void { + resume(): void { this.running = true; if (this.index < this.buffer.length + this.offset) { this.parse(); @@ -222,67 +273,82 @@ export default class Tokenizer { } } - private currentSequence: Uint8Array = undefined!; + private currentSequence: Uint8Array = Sequences.Empty; private sequenceIndex = 0; - private stateSpecialStartSequence(c: number): void { - const isEnd = this.sequenceIndex === this.currentSequence.length; - const isMatch = isEnd - ? // If we are at the end of the sequence, make sure the tag name has ended - isEndOfTagSection(c) - : // Otherwise, do a case-insensitive comparison - (c | 0x20) === this.currentSequence[this.sequenceIndex]; - - if (!isMatch) { - this.isSpecial = false; - } else if (!isEnd) { - this.sequenceIndex++; - return; - } - this.sequenceIndex = 0; - this.state = State.InTagName; - this.stateInTagName(c); + private enterTagBody(): void { + if (this.currentSequence === Sequences.Plaintext) { + this.currentSequence = Sequences.Empty; + this.state = State.InPlainText; + } else if (this.isSpecial) { + this.state = State.InSpecialTag; + this.sequenceIndex = 0; + } else { + this.state = State.Text; + } } - /** Look for an end tag. For <title> tags, also decode entities. */ - private stateInSpecialTag(c: number): void { - if (this.sequenceIndex === this.currentSequence.length) { - if (c === CharCodes.Gt || isWhitespace(c)) { - const endOfText = this.index - this.currentSequence.length; - - if (this.sectionStart < endOfText) { - // Spoof the index so that reported locations match up. - const actualIndex = this.index; - this.index = endOfText; - this.cbs.ontext(this.sectionStart, endOfText); - this.index = actualIndex; - } + /** + * Match the opening tag name against an HTML text-only tag sequence. + * + * Some tags share an initial prefix (`script`/`style`, `title`/`textarea`, + * `noembed`/`noframes`), so we may switch to an alternate sequence at the + * first distinguishing byte. On a successful full match we fall back to + * the normal tag-name state; a later `>` will enter raw-text, RCDATA, or + * plaintext mode based on `currentSequence` / `isSpecial`. + * @param c Current character code point. + */ + private stateSpecialStartSequence(c: number): void { + const lower = c | 0x20; - this.isSpecial = false; - this.sectionStart = endOfText + 2; // Skip over the `</` - this.stateInClosingTagName(c); - return; // We are done; skip the rest of the function. + // Still matching — check for an alternate sequence at branch points. + if (this.sequenceIndex < this.currentSequence.length) { + if (lower === this.currentSequence[this.sequenceIndex]) { + this.sequenceIndex++; + return; } - this.sequenceIndex = 0; - } + if (this.sequenceIndex === 3) { + if ( + this.currentSequence === Sequences.ScriptEnd && + lower === Sequences.StyleEnd[3] + ) { + this.currentSequence = Sequences.StyleEnd; + this.sequenceIndex = 4; + return; + } - if ((c | 0x20) === this.currentSequence[this.sequenceIndex]) { - this.sequenceIndex += 1; - } else if (this.sequenceIndex === 0) { - if (this.currentSequence === Sequences.TitleEnd) { - // We have to parse entities in <title> tags. - if (this.decodeEntities && c === CharCodes.Amp) { - this.startEntity(); + if ( + this.currentSequence === Sequences.TitleEnd && + lower === Sequences.TextareaEnd[3] + ) { + this.currentSequence = Sequences.TextareaEnd; + this.sequenceIndex = 4; + return; } - } else if (this.fastForwardTo(CharCodes.Lt)) { - // Outside of <title> tags, we can fast-forward. - this.sequenceIndex = 1; + } else if ( + this.sequenceIndex === 4 && + this.currentSequence === Sequences.NoembedEnd && + lower === Sequences.NoframesEnd[4] + ) { + this.currentSequence = Sequences.NoframesEnd; + this.sequenceIndex = 5; + return; } - } else { - // If we see a `<`, set the sequence index to 1; useful for eg. `<</script>`. - this.sequenceIndex = Number(c === CharCodes.Lt); + } else if (isEndOfTagSection(c)) { + // Full match on a valid tag boundary — keep the sequence. + this.sequenceIndex = 0; + this.state = State.InTagName; + this.stateInTagName(c); + return; } + + // No match — abandon special-tag detection. + this.isSpecial = false; + this.currentSequence = Sequences.Empty; + this.sequenceIndex = 0; + this.state = State.InTagName; + this.stateInTagName(c); } private stateCDATASequence(c: number): void { @@ -295,15 +361,20 @@ export default class Tokenizer { } } else { this.sequenceIndex = 0; - this.state = State.InDeclaration; - this.stateInDeclaration(c); // Reconsume the character + if (this.xmlMode) { + this.state = State.InDeclaration; + this.stateInDeclaration(c); // Reconsume the character + } else { + this.state = State.InSpecialComment; + this.stateInSpecialComment(c); // Reconsume the character + } } } /** * When we wait for one specific character, we can speed things up * by skipping through the buffer until we find it. - * + * @param c Current character code point. * @returns Whether the character was found. */ private fastForwardTo(c: number): boolean { @@ -325,20 +396,59 @@ export default class Tokenizer { } /** + * Emit a comment token and return to the text state. + * @param offset Number of characters in the end sequence that have already been matched. + */ + private emitComment(offset: number): void { + this.cbs.oncomment(this.sectionStart, this.index, offset); + this.sequenceIndex = 0; + this.sectionStart = this.index + 1; + this.state = State.Text; + } + + /** * Comments and CDATA end with `-->` and `]]>`. * * Their common qualities are: * - Their end sequences have a distinct character they start with. * - That character is then repeated, so we have to check multiple repeats. * - All characters but the start character of the sequence can be skipped. + * @param c Current character code point. */ private stateInCommentLike(c: number): void { - if (c === this.currentSequence[this.sequenceIndex]) { + if ( + !this.xmlMode && + this.currentSequence === Sequences.CommentEnd && + this.sequenceIndex <= 1 && + /* + * We're still at the very start of the comment: the only + * characters consumed since `<!--` are the dashes that + * advanced sequenceIndex (0 for `<!-->`, 1 for `<!--->`). + */ + this.index === this.sectionStart + this.sequenceIndex && + c === CharCodes.Gt + ) { + // Abruptly closed empty HTML comment. + this.emitComment(this.sequenceIndex); + } else if ( + this.currentSequence === Sequences.CommentEnd && + this.sequenceIndex === 2 && + c === CharCodes.Gt + ) { + // `!` is optional here, so the same sequence also accepts `-->`. + this.emitComment(2); + } else if ( + this.currentSequence === Sequences.CommentEnd && + this.sequenceIndex === this.currentSequence.length - 1 && + c !== CharCodes.Gt + ) { + this.sequenceIndex = Number(c === CharCodes.Dash); + } else if (c === this.currentSequence[this.sequenceIndex]) { if (++this.sequenceIndex === this.currentSequence.length) { if (this.currentSequence === Sequences.CdataEnd) { this.cbs.oncdata(this.sectionStart, this.index, 2); } else { - this.cbs.oncomment(this.sectionStart, this.index, 2); + this.cbs.oncomment(this.sectionStart, this.index, 3); } this.sequenceIndex = 0; @@ -361,16 +471,60 @@ export default class Tokenizer { * * XML allows a lot more characters here (@see https://www.w3.org/TR/REC-xml/#NT-NameStartChar). * We allow anything that wouldn't end the tag. + * @param c Current character code point. */ private isTagStartChar(c: number) { return this.xmlMode ? !isEndOfTagSection(c) : isASCIIAlpha(c); } - private startSpecial(sequence: Uint8Array, offset: number) { - this.isSpecial = true; - this.currentSequence = sequence; - this.sequenceIndex = offset; - this.state = State.SpecialStartSequence; + /** + * Scan raw-text / RCDATA content for the matching end tag. + * + * For RCDATA tags (`<title>`, `<textarea>`) entities are decoded inline. + * For raw-text tags (`<script>`, `<style>`, etc.) we fast-forward to `<`. + * @param c Current character code point. + */ + private stateInSpecialTag(c: number): void { + if (this.sequenceIndex === this.currentSequence.length) { + if (isEndOfTagSection(c)) { + const endOfText = this.index - this.currentSequence.length; + + if (this.sectionStart < endOfText) { + // Spoof the index so that reported locations match up. + const actualIndex = this.index; + this.index = endOfText; + this.cbs.ontext(this.sectionStart, endOfText); + this.index = actualIndex; + } + + this.isSpecial = false; + this.sectionStart = endOfText + 2; // Skip over the `</` + this.stateInClosingTagName(c); + return; // We are done; skip the rest of the function. + } + + this.sequenceIndex = 0; + } + + if ((c | 0x20) === this.currentSequence[this.sequenceIndex]) { + this.sequenceIndex += 1; + } else if (this.sequenceIndex === 0) { + if ( + this.currentSequence === Sequences.TitleEnd || + this.currentSequence === Sequences.TextareaEnd + ) { + // RCDATA tags have to parse entities while still looking for their end tag. + if (this.decodeEntities && c === CharCodes.Amp) { + this.startEntity(); + } + } else if (this.fastForwardTo(CharCodes.Lt)) { + // Outside of RCDATA tags, we can fast-forward. + this.sequenceIndex = 1; + } + } else { + // If we see a `<`, set the sequence index to 1; useful for eg. `<</script>`. + this.sequenceIndex = Number(c === CharCodes.Lt); + } } private stateBeforeTagName(c: number): void { @@ -378,18 +532,29 @@ export default class Tokenizer { this.state = State.BeforeDeclaration; this.sectionStart = this.index + 1; } else if (c === CharCodes.Questionmark) { - this.state = State.InProcessingInstruction; - this.sectionStart = this.index + 1; + if (this.xmlMode) { + this.state = State.InProcessingInstruction; + this.sequenceIndex = 0; + this.sectionStart = this.index + 1; + } else { + this.state = State.InSpecialComment; + this.sectionStart = this.index; + } } else if (this.isTagStartChar(c)) { - const lower = c | 0x20; this.sectionStart = this.index; - if (!this.xmlMode && lower === Sequences.TitleEnd[2]) { - this.startSpecial(Sequences.TitleEnd, 3); + + const special = + this.xmlMode || this.cbs.isInForeignContext?.() + ? undefined + : specialStartSequences.get(c | 0x20); + + if (special === undefined) { + this.state = State.InTagName; } else { - this.state = - !this.xmlMode && lower === Sequences.ScriptEnd[2] - ? State.BeforeSpecialS - : State.InTagName; + this.isSpecial = true; + this.currentSequence = special; + this.sequenceIndex = 3; + this.state = State.SpecialStartSequence; } } else if (c === CharCodes.Slash) { this.state = State.BeforeClosingTagName; @@ -408,9 +573,17 @@ export default class Tokenizer { } private stateBeforeClosingTagName(c: number): void { if (isWhitespace(c)) { - // Ignore + if (this.xmlMode) { + // Ignore + } else { + this.state = State.InSpecialComment; + this.sectionStart = this.index; + } } else if (c === CharCodes.Gt) { this.state = State.Text; + if (!this.xmlMode) { + this.sectionStart = this.index + 1; + } } else { this.state = this.isTagStartChar(c) ? State.InClosingTagName @@ -419,7 +592,7 @@ export default class Tokenizer { } } private stateInClosingTagName(c: number): void { - if (c === CharCodes.Gt || isWhitespace(c)) { + if (isEndOfTagSection(c)) { this.cbs.onclosetag(this.sectionStart, this.index); this.sectionStart = -1; this.state = State.AfterClosingTagName; @@ -436,12 +609,7 @@ export default class Tokenizer { private stateBeforeAttributeName(c: number): void { if (c === CharCodes.Gt) { this.cbs.onopentagend(this.index); - if (this.isSpecial) { - this.state = State.InSpecialTag; - this.sequenceIndex = 0; - } else { - this.state = State.Text; - } + this.enterTagBody(); this.sectionStart = this.index + 1; } else if (c === CharCodes.Slash) { this.state = State.InSelfClosingTag; @@ -450,12 +618,28 @@ export default class Tokenizer { this.sectionStart = this.index; } } + /** + * Handle `/` before `>` in an opening tag. + * + * In HTML mode, text-only tags ignore the self-closing flag and still enter + * their raw-text/RCDATA/plaintext state unless self-closing tags are being + * recognized. In XML mode, or for ordinary tags, the tokenizer returns to + * regular text parsing after emitting the self-closing callback. + * @param c Current character code point. + */ private stateInSelfClosingTag(c: number): void { if (c === CharCodes.Gt) { this.cbs.onselfclosingtag(this.index); - this.state = State.Text; this.sectionStart = this.index + 1; + + if (!this.recognizeSelfClosing) { + this.enterTagBody(); + return; + } + + this.state = State.Text; this.isSpecial = false; // Reset special state, in case of self-closing special tags + this.currentSequence = Sequences.Empty; } else if (!isWhitespace(c)) { this.state = State.BeforeAttributeName; this.stateBeforeAttributeName(c); @@ -464,7 +648,7 @@ export default class Tokenizer { private stateInAttributeName(c: number): void { if (c === CharCodes.Eq || isEndOfTagSection(c)) { this.cbs.onattribname(this.sectionStart, this.index); - this.sectionStart = -1; + this.sectionStart = this.index; this.state = State.AfterAttributeName; this.stateAfterAttributeName(c); } @@ -473,11 +657,12 @@ export default class Tokenizer { if (c === CharCodes.Eq) { this.state = State.BeforeAttributeValue; } else if (c === CharCodes.Slash || c === CharCodes.Gt) { - this.cbs.onattribend(QuoteType.NoValue, this.index); + this.cbs.onattribend(QuoteType.NoValue, this.sectionStart); + this.sectionStart = -1; this.state = State.BeforeAttributeName; this.stateBeforeAttributeName(c); } else if (!isWhitespace(c)) { - this.cbs.onattribend(QuoteType.NoValue, this.index); + this.cbs.onattribend(QuoteType.NoValue, this.sectionStart); this.state = State.InAttributeName; this.sectionStart = this.index; } @@ -506,7 +691,7 @@ export default class Tokenizer { quote === CharCodes.DoubleQuote ? QuoteType.Double : QuoteType.Single, - this.index + this.index + 1, ); this.state = State.BeforeAttributeName; } else if (this.decodeEntities && c === CharCodes.Amp) { @@ -530,15 +715,57 @@ export default class Tokenizer { this.startEntity(); } } + /** + * Distinguish between CDATA, declarations, HTML comments, and HTML bogus + * comments after `<!`. + * + * In HTML mode, only real comments and doctypes stay on declaration paths; + * everything else becomes a bogus comment terminated by the next `>`. + * @param c Current character code point. + */ private stateBeforeDeclaration(c: number): void { if (c === CharCodes.OpeningSquareBracket) { this.state = State.CDATASequence; this.sequenceIndex = 0; - } else { + } else if (this.xmlMode) { this.state = c === CharCodes.Dash ? State.BeforeComment : State.InDeclaration; + } else if ((c | 0x20) === Sequences.Doctype[0]) { + this.state = State.DeclarationSequence; + this.currentSequence = Sequences.Doctype; + this.sequenceIndex = 1; + } else if (c === CharCodes.Gt) { + this.cbs.oncomment(this.sectionStart, this.index, 0); + this.state = State.Text; + this.sectionStart = this.index + 1; + } else if (c === CharCodes.Dash) { + this.state = State.BeforeComment; + } else { + this.state = State.InSpecialComment; + } + } + /** + * Continue matching `doctype` after `<!d`. + * + * A full `doctype` match stays on the declaration path; any other name falls + * back to an HTML bogus comment, which matches browser behavior for + * non-doctype `<!...>` constructs. + * @param c Current character code point. + */ + private stateDeclarationSequence(c: number): void { + if (this.sequenceIndex === this.currentSequence.length) { + this.state = State.InDeclaration; + this.stateInDeclaration(c); + } else if ((c | 0x20) === this.currentSequence[this.sequenceIndex]) { + this.sequenceIndex += 1; + } else if (c === CharCodes.Gt) { + this.cbs.oncomment(this.sectionStart, this.index, 0); + this.state = State.Text; + this.sectionStart = this.index + 1; + } else { + this.state = State.InSpecialComment; } } private stateInDeclaration(c: number): void { @@ -548,22 +775,43 @@ export default class Tokenizer { this.sectionStart = this.index + 1; } } + /** + * XML processing instructions (`<?...?>`). + * + * In HTML mode `<?` is routed to `InSpecialComment` instead, so this + * state is only reachable in XML mode. + * @param c Current character code point. + */ private stateInProcessingInstruction(c: number): void { - if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) { - this.cbs.onprocessinginstruction(this.sectionStart, this.index); + if (c === CharCodes.Questionmark) { + // Remember that we just consumed `?`, so the next `>` closes the PI. + this.sequenceIndex = 1; + } else if (c === CharCodes.Gt && this.sequenceIndex === 1) { + this.cbs.onprocessinginstruction(this.sectionStart, this.index - 1); + this.sequenceIndex = 0; this.state = State.Text; this.sectionStart = this.index + 1; + } else { + // Keep scanning for the next `?`, which can start a closing `?>`. + this.sequenceIndex = Number( + this.fastForwardTo(CharCodes.Questionmark), + ); } } private stateBeforeComment(c: number): void { if (c === CharCodes.Dash) { this.state = State.InCommentLike; this.currentSequence = Sequences.CommentEnd; - // Allow short comments (eg. <!-->) - this.sequenceIndex = 2; + this.sequenceIndex = 0; this.sectionStart = this.index + 1; - } else { + } else if (this.xmlMode) { this.state = State.InDeclaration; + } else if (c === CharCodes.Gt) { + this.cbs.oncomment(this.sectionStart, this.index, 0); + this.state = State.Text; + this.sectionStart = this.index + 1; + } else { + this.state = State.InSpecialComment; } } private stateInSpecialComment(c: number): void { @@ -573,17 +821,6 @@ export default class Tokenizer { this.sectionStart = this.index + 1; } } - private stateBeforeSpecialS(c: number): void { - const lower = c | 0x20; - if (lower === Sequences.ScriptEnd[3]) { - this.startSpecial(Sequences.ScriptEnd, 4); - } else if (lower === Sequences.StyleEnd[3]) { - this.startSpecial(Sequences.StyleEnd, 4); - } else { - this.state = State.InTagName; - this.stateInTagName(c); // Consume the token again - } - } private startEntity() { this.baseState = this.state; @@ -593,26 +830,33 @@ export default class Tokenizer { this.xmlMode ? DecodingMode.Strict : this.baseState === State.Text || - this.baseState === State.InSpecialTag - ? DecodingMode.Legacy - : DecodingMode.Attribute + this.baseState === State.InSpecialTag + ? DecodingMode.Legacy + : DecodingMode.Attribute, ); } private stateInEntity(): void { - const length = this.entityDecoder.write( - this.buffer, - this.index - this.offset - ); + const indexInBuffer = this.index - this.offset; + const length = this.entityDecoder.write(this.buffer, indexInBuffer); // If `length` is positive, we are done with the entity. if (length >= 0) { this.state = this.baseState; if (length === 0) { - this.index = this.entityStart; + this.index -= 1; } } else { + if ( + indexInBuffer < this.buffer.length && + this.buffer.charCodeAt(indexInBuffer) === CharCodes.Amp + ) { + this.state = this.baseState; + this.index -= 1; + return; + } + // Mark buffer as consumed. this.index = this.offset + this.buffer.length - 1; } @@ -626,6 +870,7 @@ export default class Tokenizer { if (this.running && this.sectionStart !== this.index) { if ( this.state === State.Text || + this.state === State.InPlainText || (this.state === State.InSpecialTag && this.sequenceIndex === 0) ) { this.cbs.ontext(this.sectionStart, this.index); @@ -658,6 +903,11 @@ export default class Tokenizer { this.stateText(c); break; } + case State.InPlainText: { + // Skip to end of buffer; cleanup() emits the text. + this.index = this.buffer.length + this.offset - 1; + break; + } case State.SpecialStartSequence: { this.stateSpecialStartSequence(c); break; @@ -670,6 +920,10 @@ export default class Tokenizer { this.stateCDATASequence(c); break; } + case State.DeclarationSequence: { + this.stateDeclarationSequence(c); + break; + } case State.InAttributeValueDq: { this.stateInAttributeValueDoubleQuotes(c); break; @@ -722,10 +976,6 @@ export default class Tokenizer { this.stateAfterClosingTagName(c); break; } - case State.BeforeSpecialS: { - this.stateBeforeSpecialS(c); - break; - } case State.InAttributeValueNq: { this.stateInAttributeValueNoQuotes(c); break; @@ -771,38 +1021,107 @@ export default class Tokenizer { this.cbs.onend(); } + private handleTrailingCommentLikeData(endIndex: number): boolean { + if (this.state !== State.InCommentLike) { + return false; + } + + if (this.currentSequence === Sequences.CdataEnd) { + if (this.xmlMode) { + if (this.sectionStart < endIndex) { + this.cbs.oncdata(this.sectionStart, endIndex, 0); + } + } else { + /* In HTML mode, unclosed CDATA is a bogus comment. */ + const cdataStart = + this.sectionStart - Sequences.Cdata.length - 1; + this.cbs.oncomment(cdataStart, endIndex, 0); + } + } else { + const offset = this.xmlMode + ? 0 + : Math.min(this.sequenceIndex, Sequences.CommentEnd.length - 1); + this.cbs.oncomment(this.sectionStart, endIndex, offset); + } + + return true; + } + + private handleTrailingMarkupDeclaration(endIndex: number): boolean { + if (this.xmlMode) { + switch (this.state) { + case State.InSpecialComment: + case State.BeforeComment: + case State.CDATASequence: + case State.DeclarationSequence: + case State.InDeclaration: { + this.cbs.ontext(this.sectionStart, endIndex); + return true; + } + default: { + return false; + } + } + } + + switch (this.state) { + case State.BeforeDeclaration: + case State.InSpecialComment: + case State.BeforeComment: + case State.CDATASequence: { + this.cbs.oncomment(this.sectionStart, endIndex, 0); + return true; + } + case State.DeclarationSequence: { + if (this.sequenceIndex !== Sequences.Doctype.length) { + this.cbs.oncomment(this.sectionStart, endIndex, 0); + } + return true; + } + case State.InDeclaration: { + return true; + } + default: { + return false; + } + } + } + /** Handle any trailing data. */ private handleTrailingData() { const endIndex = this.buffer.length + this.offset; + if ( + this.handleTrailingCommentLikeData(endIndex) || + this.handleTrailingMarkupDeclaration(endIndex) + ) { + return; + } + // If there is no remaining data, we are done. if (this.sectionStart >= endIndex) { return; } - if (this.state === State.InCommentLike) { - if (this.currentSequence === Sequences.CdataEnd) { - this.cbs.oncdata(this.sectionStart, endIndex, 0); - } else { - this.cbs.oncomment(this.sectionStart, endIndex, 0); + switch (this.state) { + case State.InTagName: + case State.BeforeAttributeName: + case State.BeforeAttributeValue: + case State.AfterAttributeName: + case State.InAttributeName: + case State.InAttributeValueSq: + case State.InAttributeValueDq: + case State.InAttributeValueNq: + case State.InClosingTagName: { + /* + * If we are currently in an opening or closing tag, us not calling the + * respective callback signals that the tag should be ignored. + */ + break; + } + default: { + this.cbs.ontext(this.sectionStart, endIndex); } - } else if ( - this.state === State.InTagName || - this.state === State.BeforeAttributeName || - this.state === State.BeforeAttributeValue || - this.state === State.AfterAttributeName || - this.state === State.InAttributeName || - this.state === State.InAttributeValueSq || - this.state === State.InAttributeValueDq || - this.state === State.InAttributeValueNq || - this.state === State.InClosingTagName - ) { - /* - * If we are currently in an opening or closing tag, us not calling the - * respective callback signals that the tag should be ignored. - */ - } else { - this.cbs.ontext(this.sectionStart, endIndex); } } diff --git a/src/WebWritableStream.spec.ts b/src/WebWritableStream.spec.ts new file mode 100644 index 0000000..9aa5e6d --- /dev/null +++ b/src/WebWritableStream.spec.ts @@ -0,0 +1,143 @@ +import * as fs from "node:fs/promises"; +import { describe, expect, it, vi } from "vitest"; +import * as helper from "./__fixtures__/testHelper.js"; +import type { Handler, ParserOptions } from "./Parser.js"; +import { WebWritableStream } from "./WebWritableStream.js"; + +describe("WebWritableStream", () => { + it("should decode fragmented unicode characters", async () => { + const ontext = vi.fn(); + const stream = new WebWritableStream({ ontext }); + + const writer = stream.getWriter(); + // € is U+20AC, encoded as 0xE2 0x82 0xAC in UTF-8 + await writer.write(new Uint8Array([0xe2, 0x82])); + await writer.write(new Uint8Array([0xac])); + await writer.write(""); + await writer.close(); + + expect(ontext).toHaveBeenCalledWith("€"); + }); + + it("should handle string chunks", async () => { + const ontext = vi.fn(); + const stream = new WebWritableStream({ ontext }); + + const writer = stream.getWriter(); + await writer.write("hello"); + await writer.close(); + + expect(ontext).toHaveBeenCalledWith("hello"); + }); + + it("should handle empty stream", async () => { + const onend = vi.fn(); + const stream = new WebWritableStream({ onend }); + + const writer = stream.getWriter(); + await writer.close(); + + expect(onend).toHaveBeenCalledTimes(1); + }); + + it("should handle abort signal", async () => { + const ontext = vi.fn(); + const onend = vi.fn(); + const stream = new WebWritableStream({ ontext, onend }); + + const writer = stream.getWriter(); + await writer.abort(new Error("aborted")); + + expect(ontext).not.toHaveBeenCalled(); + expect(onend).not.toHaveBeenCalled(); + }); + + it("should work with ReadableStream.pipeTo", async () => { + const onopentag = vi.fn(); + const ontext = vi.fn(); + const stream = new WebWritableStream({ onopentag, ontext }); + + const html = "<div>hello</div>"; + const readable = new ReadableStream<string>({ + start(controller) { + controller.enqueue(html); + controller.close(); + }, + }); + + await readable.pipeTo(stream); + + expect(onopentag).toHaveBeenCalledWith("div", {}, false); + expect(ontext).toHaveBeenCalledWith("hello"); + }); + + it("Basic html", () => testStream("Basic.html")); + it("Attributes", () => testStream("Attributes.html")); + it("SVG", () => testStream("Svg.html")); + it("RSS feed", () => testStream("RSS_Example.xml", { xmlMode: true })); + it("Atom feed", () => testStream("Atom_Example.xml", { xmlMode: true })); + it("RDF feed", () => testStream("RDF_Example.xml", { xmlMode: true })); +}); + +function getPromiseEventCollector(): [ + handler: Partial<Handler>, + promise: Promise<unknown>, +] { + let handler: Partial<Handler> | undefined; + const promise = new Promise<unknown>((resolve, reject) => { + handler = helper.getEventCollector((error, events) => { + if (error) { + reject(error); + } else { + resolve(events); + } + }); + }); + + if (!handler) { + throw new Error("Failed to initialize event handler"); + } + + return [handler, promise]; +} + +async function testStream( + file: string, + options?: ParserOptions, +): Promise<void> { + const filePath = new URL(`__fixtures__/Documents/${file}`, import.meta.url); + + const [streamHandler, eventsPromise] = getPromiseEventCollector(); + + const fileContents = await fs.readFile(filePath); + + // Pipe file contents through a ReadableStream into the WebWritableStream + const readable = new ReadableStream<Uint8Array>({ + start(controller) { + controller.enqueue(new Uint8Array(fileContents)); + controller.close(); + }, + }); + + await readable.pipeTo(new WebWritableStream(streamHandler, options)); + + const events = await eventsPromise; + + expect(events).toMatchSnapshot(); + + // Verify single-pass produces identical results + const [singlePassHandler, singlePassPromise] = getPromiseEventCollector(); + + const singlePassReadable = new ReadableStream<string>({ + start(controller) { + controller.enqueue(fileContents.toString()); + controller.close(); + }, + }); + + await singlePassReadable.pipeTo( + new WebWritableStream(singlePassHandler, options), + ); + + expect(await singlePassPromise).toStrictEqual(events); +} diff --git a/src/WebWritableStream.ts b/src/WebWritableStream.ts new file mode 100644 index 0000000..a2313c1 --- /dev/null +++ b/src/WebWritableStream.ts @@ -0,0 +1,47 @@ +import { type Handler, Parser, type ParserOptions } from "./Parser.js"; + +/** + * WebWritableStream makes the `Parser` interface available as a Web Streams API WritableStream. + * + * This is useful for piping `fetch()` response bodies directly into the parser. + * @see Parser + * @example + * ```typescript + * import { WebWritableStream } from "htmlparser2/WebWritableStream"; + * + * const stream = new WebWritableStream({ + * onopentag(name, attribs) { + * console.log("Opened:", name); + * }, + * }); + * + * const response = await fetch("https://example.com"); + * await response.body.pipeTo(stream); + * ``` + */ +// eslint-disable-next-line n/no-unsupported-features/node-builtins -- Web Streams API; requires a runtime with WritableStream (browsers, Deno, Node ≥18.0) +export class WebWritableStream extends WritableStream<string | Uint8Array> { + constructor(cbs: Partial<Handler>, options?: ParserOptions) { + const parser = new Parser(cbs, options); + const decoder = new TextDecoder(); + const streamOption: TextDecodeOptions = { stream: true }; + + super({ + write(chunk) { + parser.write( + typeof chunk === "string" + ? chunk + : decoder.decode(chunk, streamOption), + ); + }, + close() { + // Flush any remaining bytes in the decoder + const remaining = decoder.decode(); + if (remaining) { + parser.write(remaining); + } + parser.end(); + }, + }); + } +} diff --git a/src/WritableStream.spec.ts b/src/WritableStream.spec.ts index 5175f10..2334816 100644 --- a/src/WritableStream.spec.ts +++ b/src/WritableStream.spec.ts @@ -1,14 +1,14 @@ import { createReadStream } from "node:fs"; import * as fs from "node:fs/promises"; -import path from "node:path"; -import * as stream from "node:stream"; +import { finished } from "node:stream/promises"; +import { describe, expect, it, vi } from "vitest"; +import * as helper from "./__fixtures__/testHelper.js"; import type { Handler, ParserOptions } from "./Parser.js"; import { WritableStream } from "./WritableStream.js"; -import * as helper from "./__fixtures__/test-helper.js"; describe("WritableStream", () => { - test("should decode fragmented unicode characters", () => { - const ontext = jest.fn(); + it("should decode fragmented unicode characters", () => { + const ontext = vi.fn(); const stream = new WritableStream({ ontext }); stream.write(Buffer.from([0xe2, 0x82])); @@ -29,7 +29,7 @@ describe("WritableStream", () => { function getPromiseEventCollector(): [ handler: Partial<Handler>, - promise: Promise<unknown> + promise: Promise<unknown>, ] { let handler: Partial<Handler> | undefined; const promise = new Promise<unknown>((resolve, reject) => { @@ -42,26 +42,23 @@ function getPromiseEventCollector(): [ }); }); - return [handler!, promise]; -} + if (!handler) { + throw new Error("Failed to initialize event handler"); + } -// TODO[engine:node@>=16]: Use promise version of `stream.finished` instead. -function finished(input: Parameters<typeof stream.finished>[0]): Promise<void> { - return new Promise((resolve, reject) => { - stream.finished(input, (error) => (error ? reject(error) : resolve())); - }); + return [handler, promise]; } async function testStream( file: string, - options?: ParserOptions + options?: ParserOptions, ): Promise<void> { - const filePath = path.join(__dirname, "__fixtures__", "Documents", file); + const filePath = new URL(`__fixtures__/Documents/${file}`, import.meta.url); const [streamHandler, eventsPromise] = getPromiseEventCollector(); const fsStream = createReadStream(filePath).pipe( - new WritableStream(streamHandler, options) + new WritableStream(streamHandler, options), ); await finished(fsStream); @@ -73,7 +70,7 @@ async function testStream( const [singlePassHandler, singlePassPromise] = getPromiseEventCollector(); const singlePassStream = new WritableStream(singlePassHandler, options).end( - await fs.readFile(filePath) + await fs.readFile(filePath), ); await finished(singlePassStream); diff --git a/src/WritableStream.ts b/src/WritableStream.ts index 0a6eda2..1fa5dcf 100644 --- a/src/WritableStream.ts +++ b/src/WritableStream.ts @@ -1,10 +1,10 @@ -import { Parser, Handler, ParserOptions } from "./Parser.js"; /* * NOTE: If either of these two imports produces a type error, * please update your @types/node dependency! */ import { Writable } from "node:stream"; import { StringDecoder } from "node:string_decoder"; +import { type Handler, Parser, type ParserOptions } from "./Parser.js"; // Following the example in https://nodejs.org/api/stream.html#stream_decoding_buffers_in_a_writable_stream function isBuffer(_chunk: string | Buffer, encoding: string): _chunk is Buffer { @@ -13,7 +13,6 @@ function isBuffer(_chunk: string | Buffer, encoding: string): _chunk is Buffer { /** * WritableStream makes the `Parser` interface available as a NodeJS stream. - * * @see Parser */ export class WritableStream extends Writable { @@ -28,10 +27,10 @@ export class WritableStream extends Writable { override _write( chunk: string | Buffer, encoding: string, - callback: () => void + callback: () => void, ): void { this._parser.write( - isBuffer(chunk, encoding) ? this._decoder.write(chunk) : chunk + isBuffer(chunk, encoding) ? this._decoder.write(chunk) : chunk, ); callback(); } diff --git a/src/__fixtures__/test-helper.ts b/src/__fixtures__/testHelper.ts index 3a622dd..e973300 100644 --- a/src/__fixtures__/test-helper.ts +++ b/src/__fixtures__/testHelper.ts @@ -1,4 +1,4 @@ -import type { Parser, Handler } from "../Parser.js"; +import type { Handler, Parser } from "../Parser.js"; interface Event { $event: string; @@ -10,12 +10,11 @@ interface Event { /** * Creates a handler that calls the supplied callback with simplified events on * completion. - * * @internal * @param callback Function to call with all events. */ export function getEventCollector( - callback: (error: Error | null, events?: Event[]) => void + callback: (error: Error | null, events?: Event[]) => void, ): Partial<Handler> { const events: Event[] = []; let parser: Parser; @@ -44,7 +43,6 @@ export function getEventCollector( break; } default: { - // eslint-disable-next-line unicorn/prefer-at const last = events[events.length - 1]; // Combine text nodes @@ -63,7 +61,7 @@ export function getEventCollector( if (!(parser.startIndex <= parser.endIndex)) { throw new Error( - `Invalid start/end index ${parser.startIndex} > ${parser.endIndex}` + `Invalid start/end index ${parser.startIndex} > ${parser.endIndex}`, ); } @@ -73,8 +71,6 @@ export function getEventCollector( endIndex: parser.endIndex, data, }); - - parser.endIndex; } } } @@ -86,6 +82,6 @@ export function getEventCollector( (_, event: string) => (...data: unknown[]) => handle(event, data), - } + }, ); } diff --git a/src/__snapshots__/FeedHandler.spec.ts.snap b/src/__snapshots__/FeedHandler.spec.ts.snap index 308a434..6cb0eeb 100644 --- a/src/__snapshots__/FeedHandler.spec.ts.snap +++ b/src/__snapshots__/FeedHandler.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`parseFeed (atomFeed) 1`] = ` +exports[`parseFeed > (atomFeed) 1`] = ` { "author": "johndoe@example.com", "description": "A subtitle.", @@ -25,7 +25,7 @@ exports[`parseFeed (atomFeed) 1`] = ` } `; -exports[`parseFeed (rdfFeed) 1`] = ` +exports[`parseFeed > (rdfFeed) 1`] = ` { "id": "", "items": [ @@ -50,7 +50,7 @@ exports[`parseFeed (rdfFeed) 1`] = ` } `; -exports[`parseFeed (rssFeed) 1`] = ` +exports[`parseFeed > (rssFeed) 1`] = ` { "author": "editor@example.com", "description": "Liftoff to Space Exploration.", diff --git a/src/__tests__/__snapshots__/events.ts.snap b/src/__snapshots__/Parser.events.spec.ts.snap index 24790cd..686fcaf 100644 --- a/src/__tests__/__snapshots__/events.ts.snap +++ b/src/__snapshots__/Parser.events.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Events </title> in <script> (#745) 1`] = ` +exports[`Events > </title> in <script> (#745) 1`] = ` [ { "$event": "opentagname", @@ -40,7 +40,34 @@ exports[`Events </title> in <script> (#745) 1`] = ` ] `; -exports[`Events Attribute in XML (see #1350) 1`] = ` +exports[`Events > Abruptly closed comment 1`] = ` +[ + { + "$event": "comment", + "data": [ + "", + ], + "endIndex": 5, + "startIndex": 0, + }, + { + "$event": "commentend", + "data": [], + "endIndex": 5, + "startIndex": 0, + }, + { + "$event": "text", + "data": [ + "text", + ], + "endIndex": 9, + "startIndex": 6, + }, +] +`; + +exports[`Events > Attribute in XML (see #1350) 1`] = ` [ { "$event": "opentagname", @@ -57,7 +84,7 @@ exports[`Events Attribute in XML (see #1350) 1`] = ` "Hello world", """, ], - "endIndex": 28, + "endIndex": 29, "startIndex": 10, }, { @@ -67,7 +94,7 @@ exports[`Events Attribute in XML (see #1350) 1`] = ` "false", """, ], - "endIndex": 57, + "endIndex": 58, "startIndex": 34, }, { @@ -95,7 +122,53 @@ exports[`Events Attribute in XML (see #1350) 1`] = ` ] `; -exports[`Events CDATA (inside special) 1`] = ` +exports[`Events > Bogus comment after </ and whitespace 1`] = ` +[ + { + "$event": "opentagname", + "data": [ + "div", + ], + "endIndex": 4, + "startIndex": 0, + }, + { + "$event": "opentag", + "data": [ + "div", + {}, + false, + ], + "endIndex": 4, + "startIndex": 0, + }, + { + "$event": "comment", + "data": [ + " div", + ], + "endIndex": 11, + "startIndex": 5, + }, + { + "$event": "commentend", + "data": [], + "endIndex": 11, + "startIndex": 5, + }, + { + "$event": "closetag", + "data": [ + "div", + true, + ], + "endIndex": 12, + "startIndex": 12, + }, +] +`; + +exports[`Events > CDATA (inside special) 1`] = ` [ { "$event": "opentagname", @@ -135,7 +208,7 @@ exports[`Events CDATA (inside special) 1`] = ` ] `; -exports[`Events CDATA 1`] = ` +exports[`Events > CDATA 1`] = ` [ { "$event": "opentagname", @@ -196,18 +269,23 @@ exports[`Events CDATA 1`] = ` ] `; -exports[`Events CDATA edge-cases 1`] = ` +exports[`Events > CDATA edge-cases 1`] = ` [ { - "$event": "processinginstruction", + "$event": "comment", "data": [ - "![cdata", - "![CDATA", + "[CDATA", ], "endIndex": 8, "startIndex": 0, }, { + "$event": "commentend", + "data": [], + "endIndex": 8, + "startIndex": 0, + }, + { "$event": "cdatastart", "data": [], "endIndex": 27, @@ -228,21 +306,15 @@ exports[`Events CDATA edge-cases 1`] = ` "startIndex": 9, }, { - "$event": "cdatastart", - "data": [], - "endIndex": 40, - "startIndex": 28, - }, - { - "$event": "text", + "$event": "comment", "data": [ - "foo", + "[CDATA[foo", ], "endIndex": 40, "startIndex": 28, }, { - "$event": "cdataend", + "$event": "commentend", "data": [], "endIndex": 40, "startIndex": 28, @@ -250,7 +322,7 @@ exports[`Events CDATA edge-cases 1`] = ` ] `; -exports[`Events CDATA in HTML 1`] = ` +exports[`Events > CDATA in HTML 1`] = ` [ { "$event": "comment", @@ -269,7 +341,7 @@ exports[`Events CDATA in HTML 1`] = ` ] `; -exports[`Events CDATA more edge-cases 1`] = ` +exports[`Events > CDATA more edge-cases 1`] = ` [ { "$event": "cdatastart", @@ -294,18 +366,23 @@ exports[`Events CDATA more edge-cases 1`] = ` ] `; -exports[`Events Comment edge-cases 1`] = ` +exports[`Events > Comment edge-cases 1`] = ` [ { - "$event": "processinginstruction", + "$event": "comment", "data": [ - "!-foo", - "!-foo", + "-foo", ], "endIndex": 6, "startIndex": 0, }, { + "$event": "commentend", + "data": [], + "endIndex": 6, + "startIndex": 0, + }, + { "$event": "comment", "data": [ " --- ", @@ -336,7 +413,7 @@ exports[`Events Comment edge-cases 1`] = ` ] `; -exports[`Events Comment false ending 1`] = ` +exports[`Events > Comment false ending 1`] = ` [ { "$event": "comment", @@ -355,20 +432,302 @@ exports[`Events Comment false ending 1`] = ` ] `; -exports[`Events Empty tag name 1`] = ` +exports[`Events > Content after SVG integration point 1`] = ` [ { + "$event": "opentagname", + "data": [ + "svg", + ], + "endIndex": 4, + "startIndex": 0, + }, + { + "$event": "opentag", + "data": [ + "svg", + {}, + false, + ], + "endIndex": 4, + "startIndex": 0, + }, + { + "$event": "opentagname", + "data": [ + "foreignObject", + ], + "endIndex": 19, + "startIndex": 5, + }, + { + "$event": "opentag", + "data": [ + "foreignObject", + {}, + false, + ], + "endIndex": 19, + "startIndex": 5, + }, + { + "$event": "opentagname", + "data": [ + "b", + ], + "endIndex": 22, + "startIndex": 20, + }, + { + "$event": "opentag", + "data": [ + "b", + {}, + false, + ], + "endIndex": 22, + "startIndex": 20, + }, + { "$event": "text", "data": [ - "< ></ >", + "x", + ], + "endIndex": 23, + "startIndex": 23, + }, + { + "$event": "closetag", + "data": [ + "b", + false, + ], + "endIndex": 27, + "startIndex": 24, + }, + { + "$event": "closetag", + "data": [ + "foreignObject", + false, + ], + "endIndex": 43, + "startIndex": 28, + }, + { + "$event": "opentagname", + "data": [ + "rect", + ], + "endIndex": 49, + "startIndex": 44, + }, + { + "$event": "opentag", + "data": [ + "rect", + {}, + false, + ], + "endIndex": 50, + "startIndex": 44, + }, + { + "$event": "closetag", + "data": [ + "rect", + true, + ], + "endIndex": 50, + "startIndex": 44, + }, + { + "$event": "closetag", + "data": [ + "svg", + false, + ], + "endIndex": 56, + "startIndex": 51, + }, +] +`; + +exports[`Events > Doctype without whitespace 1`] = ` +[ + { + "$event": "processinginstruction", + "data": [ + "!doctype", + "!DOCTYPEhtml", + ], + "endIndex": 13, + "startIndex": 0, + }, +] +`; + +exports[`Events > EOF bogus comments 1`] = ` +[ + { + "$event": "comment", + "data": [ + "-", + ], + "endIndex": 3, + "startIndex": 0, + }, + { + "$event": "commentend", + "data": [], + "endIndex": 3, + "startIndex": 0, + }, +] +`; + +exports[`Events > EOF complete doctype 1`] = `[]`; + +exports[`Events > EOF empty bogus comment 1`] = ` +[ + { + "$event": "comment", + "data": [ + "", + ], + "endIndex": 2, + "startIndex": 0, + }, + { + "$event": "commentend", + "data": [], + "endIndex": 2, + "startIndex": 0, + }, +] +`; + +exports[`Events > EOF incomplete doctype 1`] = `[]`; + +exports[`Events > EOF partial doctype 1`] = ` +[ + { + "$event": "comment", + "data": [ + "DOC", + ], + "endIndex": 5, + "startIndex": 0, + }, + { + "$event": "commentend", + "data": [], + "endIndex": 5, + "startIndex": 0, + }, +] +`; + +exports[`Events > EOF processing instruction 1`] = ` +[ + { + "$event": "comment", + "data": [ + "?", + ], + "endIndex": 2, + "startIndex": 0, + }, + { + "$event": "commentend", + "data": [], + "endIndex": 2, + "startIndex": 0, + }, +] +`; + +exports[`Events > Empty EOF comment 1`] = ` +[ + { + "$event": "comment", + "data": [ + "", + ], + "endIndex": 4, + "startIndex": 0, + }, + { + "$event": "commentend", + "data": [], + "endIndex": 4, + "startIndex": 0, + }, +] +`; + +exports[`Events > Empty closing tag 1`] = `[]`; + +exports[`Events > Empty closing tag, xmlMode=true 1`] = ` +[ + { + "$event": "text", + "data": [ + "</>", + ], + "endIndex": 2, + "startIndex": 0, + }, +] +`; + +exports[`Events > Empty tag name 1`] = ` +[ + { + "$event": "text", + "data": [ + "< >", + ], + "endIndex": 2, + "startIndex": 0, + }, + { + "$event": "comment", + "data": [ + " ", ], "endIndex": 6, + "startIndex": 3, + }, + { + "$event": "commentend", + "data": [], + "endIndex": 6, + "startIndex": 3, + }, +] +`; + +exports[`Events > Empty unclosed CDATA at EOF 1`] = ` +[ + { + "$event": "comment", + "data": [ + "[CDATA[", + ], + "endIndex": 9, + "startIndex": 0, + }, + { + "$event": "commentend", + "data": [], + "endIndex": 9, "startIndex": 0, }, ] `; -exports[`Events Entities in attributes 1`] = ` +exports[`Events > Entities in attributes 1`] = ` [ { "$event": "opentagname", @@ -395,7 +754,7 @@ exports[`Events Entities in attributes 1`] = ` "&", """, ], - "endIndex": 25, + "endIndex": 26, "startIndex": 15, }, { @@ -405,7 +764,7 @@ exports[`Events Entities in attributes 1`] = ` "&", "'", ], - "endIndex": 37, + "endIndex": 38, "startIndex": 27, }, { @@ -445,7 +804,7 @@ exports[`Events Entities in attributes 1`] = ` ] `; -exports[`Events Entity after < 1`] = ` +exports[`Events > Entity after < 1`] = ` [ { "$event": "text", @@ -458,7 +817,281 @@ exports[`Events Entity after < 1`] = ` ] `; -exports[`Events Implicit close tags 1`] = ` +exports[`Events > Foreign CDATA in MathML 1`] = ` +[ + { + "$event": "opentagname", + "data": [ + "math", + ], + "endIndex": 5, + "startIndex": 0, + }, + { + "$event": "opentag", + "data": [ + "math", + {}, + false, + ], + "endIndex": 5, + "startIndex": 0, + }, + { + "$event": "text", + "data": [ + "a<b", + ], + "endIndex": 20, + "startIndex": 6, + }, + { + "$event": "closetag", + "data": [ + "math", + false, + ], + "endIndex": 27, + "startIndex": 21, + }, +] +`; + +exports[`Events > Foreign CDATA in SVG 1`] = ` +[ + { + "$event": "opentagname", + "data": [ + "svg", + ], + "endIndex": 4, + "startIndex": 0, + }, + { + "$event": "opentag", + "data": [ + "svg", + {}, + false, + ], + "endIndex": 4, + "startIndex": 0, + }, + { + "$event": "text", + "data": [ + "a<b", + ], + "endIndex": 19, + "startIndex": 5, + }, + { + "$event": "closetag", + "data": [ + "svg", + false, + ], + "endIndex": 25, + "startIndex": 20, + }, +] +`; + +exports[`Events > HTML bogus comments 1`] = ` +[ + { + "$event": "comment", + "data": [ + "?foo", + ], + "endIndex": 5, + "startIndex": 0, + }, + { + "$event": "commentend", + "data": [], + "endIndex": 5, + "startIndex": 0, + }, + { + "$event": "comment", + "data": [ + "foo", + ], + "endIndex": 11, + "startIndex": 6, + }, + { + "$event": "commentend", + "data": [], + "endIndex": 11, + "startIndex": 6, + }, +] +`; + +exports[`Events > HTML image alias 1`] = ` +[ + { + "$event": "opentagname", + "data": [ + "img", + ], + "endIndex": 6, + "startIndex": 0, + }, + { + "$event": "opentag", + "data": [ + "img", + {}, + false, + ], + "endIndex": 6, + "startIndex": 0, + }, + { + "$event": "closetag", + "data": [ + "img", + true, + ], + "endIndex": 6, + "startIndex": 0, + }, +] +`; + +exports[`Events > Implicit close of nested foreign elements 1`] = ` +[ + { + "$event": "opentagname", + "data": [ + "svg", + ], + "endIndex": 4, + "startIndex": 0, + }, + { + "$event": "opentag", + "data": [ + "svg", + {}, + false, + ], + "endIndex": 4, + "startIndex": 0, + }, + { + "$event": "opentagname", + "data": [ + "math", + ], + "endIndex": 10, + "startIndex": 5, + }, + { + "$event": "opentag", + "data": [ + "math", + {}, + false, + ], + "endIndex": 10, + "startIndex": 5, + }, + { + "$event": "opentagname", + "data": [ + "mi", + ], + "endIndex": 14, + "startIndex": 11, + }, + { + "$event": "opentag", + "data": [ + "mi", + {}, + false, + ], + "endIndex": 14, + "startIndex": 11, + }, + { + "$event": "text", + "data": [ + "text", + ], + "endIndex": 18, + "startIndex": 15, + }, + { + "$event": "closetag", + "data": [ + "mi", + true, + ], + "endIndex": 24, + "startIndex": 19, + }, + { + "$event": "closetag", + "data": [ + "math", + true, + ], + "endIndex": 24, + "startIndex": 19, + }, + { + "$event": "closetag", + "data": [ + "svg", + false, + ], + "endIndex": 24, + "startIndex": 19, + }, + { + "$event": "opentagname", + "data": [ + "script", + ], + "endIndex": 32, + "startIndex": 25, + }, + { + "$event": "opentag", + "data": [ + "script", + {}, + false, + ], + "endIndex": 32, + "startIndex": 25, + }, + { + "$event": "text", + "data": [ + "<b>x</b>", + ], + "endIndex": 40, + "startIndex": 33, + }, + { + "$event": "closetag", + "data": [ + "script", + false, + ], + "endIndex": 49, + "startIndex": 41, + }, +] +`; + +exports[`Events > Implicit close tags 1`] = ` [ { "$event": "opentagname", @@ -1165,7 +1798,7 @@ exports[`Events Implicit close tags 1`] = ` ] `; -exports[`Events Implicit open p and br tags 1`] = ` +exports[`Events > Implicit open p and br tags 1`] = ` [ { "$event": "opentagname", @@ -1321,7 +1954,7 @@ exports[`Events Implicit open p and br tags 1`] = ` ] `; -exports[`Events Long CDATA ending 1`] = ` +exports[`Events > Long CDATA ending 1`] = ` [ { "$event": "opentagname", @@ -1427,7 +2060,7 @@ exports[`Events Long CDATA ending 1`] = ` ] `; -exports[`Events Long comment ending 1`] = ` +exports[`Events > Long comment ending 1`] = ` [ { "$event": "opentagname", @@ -1444,7 +2077,7 @@ exports[`Events Long comment ending 1`] = ` "before", "'", ], - "endIndex": 16, + "endIndex": 17, "startIndex": 6, }, { @@ -1497,7 +2130,7 @@ exports[`Events Long comment ending 1`] = ` "after", "'", ], - "endIndex": 47, + "endIndex": 48, "startIndex": 38, }, { @@ -1524,7 +2157,7 @@ exports[`Events Long comment ending 1`] = ` ] `; -exports[`Events Lowercase tags 1`] = ` +exports[`Events > Lowercase tags 1`] = ` [ { "$event": "opentagname", @@ -1576,7 +2209,7 @@ exports[`Events Lowercase tags 1`] = ` ] `; -exports[`Events Multi-byte entity 1`] = ` +exports[`Events > Multi-byte entity 1`] = ` [ { "$event": "text", @@ -1589,7 +2222,7 @@ exports[`Events Multi-byte entity 1`] = ` ] `; -exports[`Events Not quite closed 1`] = ` +exports[`Events > Not quite closed 1`] = ` [ { "$event": "opentagname", @@ -1632,7 +2265,402 @@ exports[`Events Not quite closed 1`] = ` ] `; -exports[`Events Scripts creating other scripts 1`] = ` +exports[`Events > Partial CDATA at EOF 1`] = ` +[ + { + "$event": "comment", + "data": [ + "[C", + ], + "endIndex": 4, + "startIndex": 0, + }, + { + "$event": "commentend", + "data": [], + "endIndex": 4, + "startIndex": 0, + }, +] +`; + +exports[`Events > Partial CDATA match with > 1`] = ` +[ + { + "$event": "comment", + "data": [ + "[CD", + ], + "endIndex": 5, + "startIndex": 0, + }, + { + "$event": "commentend", + "data": [], + "endIndex": 5, + "startIndex": 0, + }, +] +`; + +exports[`Events > SVG image is not aliased 1`] = ` +[ + { + "$event": "opentagname", + "data": [ + "svg", + ], + "endIndex": 4, + "startIndex": 0, + }, + { + "$event": "opentag", + "data": [ + "svg", + {}, + false, + ], + "endIndex": 4, + "startIndex": 0, + }, + { + "$event": "opentagname", + "data": [ + "image", + ], + "endIndex": 11, + "startIndex": 5, + }, + { + "$event": "opentag", + "data": [ + "image", + {}, + false, + ], + "endIndex": 11, + "startIndex": 5, + }, + { + "$event": "closetag", + "data": [ + "image", + false, + ], + "endIndex": 19, + "startIndex": 12, + }, + { + "$event": "closetag", + "data": [ + "svg", + false, + ], + "endIndex": 25, + "startIndex": 20, + }, +] +`; + +exports[`Events > SVG integration point closing with unclosed child 1`] = ` +[ + { + "$event": "opentagname", + "data": [ + "svg", + ], + "endIndex": 4, + "startIndex": 0, + }, + { + "$event": "opentag", + "data": [ + "svg", + {}, + false, + ], + "endIndex": 4, + "startIndex": 0, + }, + { + "$event": "opentagname", + "data": [ + "foreignObject", + ], + "endIndex": 19, + "startIndex": 5, + }, + { + "$event": "opentag", + "data": [ + "foreignObject", + {}, + false, + ], + "endIndex": 19, + "startIndex": 5, + }, + { + "$event": "opentagname", + "data": [ + "div", + ], + "endIndex": 24, + "startIndex": 20, + }, + { + "$event": "opentag", + "data": [ + "div", + {}, + false, + ], + "endIndex": 24, + "startIndex": 20, + }, + { + "$event": "text", + "data": [ + "x", + ], + "endIndex": 25, + "startIndex": 25, + }, + { + "$event": "closetag", + "data": [ + "div", + true, + ], + "endIndex": 41, + "startIndex": 26, + }, + { + "$event": "closetag", + "data": [ + "foreignObject", + false, + ], + "endIndex": 41, + "startIndex": 26, + }, + { + "$event": "closetag", + "data": [ + "svg", + false, + ], + "endIndex": 47, + "startIndex": 42, + }, + { + "$event": "text", + "data": [ + "after", + ], + "endIndex": 52, + "startIndex": 48, + }, +] +`; + +exports[`Events > SVG tag case adjustment 1`] = ` +[ + { + "$event": "opentagname", + "data": [ + "svg", + ], + "endIndex": 4, + "startIndex": 0, + }, + { + "$event": "opentag", + "data": [ + "svg", + {}, + false, + ], + "endIndex": 4, + "startIndex": 0, + }, + { + "$event": "opentagname", + "data": [ + "foreignObject", + ], + "endIndex": 19, + "startIndex": 5, + }, + { + "$event": "opentag", + "data": [ + "foreignObject", + {}, + false, + ], + "endIndex": 19, + "startIndex": 5, + }, + { + "$event": "opentagname", + "data": [ + "b", + ], + "endIndex": 22, + "startIndex": 20, + }, + { + "$event": "opentag", + "data": [ + "b", + {}, + false, + ], + "endIndex": 22, + "startIndex": 20, + }, + { + "$event": "text", + "data": [ + "x", + ], + "endIndex": 23, + "startIndex": 23, + }, + { + "$event": "closetag", + "data": [ + "b", + false, + ], + "endIndex": 27, + "startIndex": 24, + }, + { + "$event": "closetag", + "data": [ + "foreignObject", + false, + ], + "endIndex": 43, + "startIndex": 28, + }, + { + "$event": "closetag", + "data": [ + "svg", + false, + ], + "endIndex": 49, + "startIndex": 44, + }, +] +`; + +exports[`Events > SVG title is not HTML special 1`] = ` +[ + { + "$event": "opentagname", + "data": [ + "svg", + ], + "endIndex": 4, + "startIndex": 0, + }, + { + "$event": "opentag", + "data": [ + "svg", + {}, + false, + ], + "endIndex": 4, + "startIndex": 0, + }, + { + "$event": "opentagname", + "data": [ + "title", + ], + "endIndex": 11, + "startIndex": 5, + }, + { + "$event": "opentag", + "data": [ + "title", + {}, + false, + ], + "endIndex": 11, + "startIndex": 5, + }, + { + "$event": "text", + "data": [ + "&", + ], + "endIndex": 16, + "startIndex": 12, + }, + { + "$event": "opentagname", + "data": [ + "b", + ], + "endIndex": 19, + "startIndex": 17, + }, + { + "$event": "opentag", + "data": [ + "b", + {}, + false, + ], + "endIndex": 19, + "startIndex": 17, + }, + { + "$event": "text", + "data": [ + "x", + ], + "endIndex": 20, + "startIndex": 20, + }, + { + "$event": "closetag", + "data": [ + "b", + false, + ], + "endIndex": 24, + "startIndex": 21, + }, + { + "$event": "closetag", + "data": [ + "title", + false, + ], + "endIndex": 32, + "startIndex": 25, + }, + { + "$event": "closetag", + "data": [ + "svg", + false, + ], + "endIndex": 38, + "startIndex": 33, + }, +] +`; + +exports[`Events > Scripts creating other scripts 1`] = ` [ { "$event": "opentagname", @@ -1699,7 +2727,7 @@ exports[`Events Scripts creating other scripts 1`] = ` ] `; -exports[`Events Scripts ending with < 1`] = ` +exports[`Events > Scripts ending with < 1`] = ` [ { "$event": "opentagname", @@ -1739,7 +2767,74 @@ exports[`Events Scripts ending with < 1`] = ` ] `; -exports[`Events Self-closing indices (#941) 1`] = ` +exports[`Events > Self-closing foreign element with recognizeSelfClosing 1`] = ` +[ + { + "$event": "opentagname", + "data": [ + "svg", + ], + "endIndex": 4, + "startIndex": 0, + }, + { + "$event": "opentag", + "data": [ + "svg", + {}, + false, + ], + "endIndex": 5, + "startIndex": 0, + }, + { + "$event": "closetag", + "data": [ + "svg", + true, + ], + "endIndex": 5, + "startIndex": 0, + }, + { + "$event": "opentagname", + "data": [ + "script", + ], + "endIndex": 13, + "startIndex": 6, + }, + { + "$event": "opentag", + "data": [ + "script", + {}, + false, + ], + "endIndex": 13, + "startIndex": 6, + }, + { + "$event": "text", + "data": [ + "<b>x</b>", + ], + "endIndex": 21, + "startIndex": 14, + }, + { + "$event": "closetag", + "data": [ + "script", + false, + ], + "endIndex": 30, + "startIndex": 22, + }, +] +`; + +exports[`Events > Self-closing indices (#941) 1`] = ` [ { "$event": "opentagname", @@ -1825,7 +2920,327 @@ exports[`Events Self-closing indices (#941) 1`] = ` ] `; -exports[`Events Special special tags 1`] = ` +exports[`Events > Short HTML bogus comments 1`] = ` +[ + { + "$event": "comment", + "data": [ + "", + ], + "endIndex": 2, + "startIndex": 0, + }, + { + "$event": "commentend", + "data": [], + "endIndex": 2, + "startIndex": 0, + }, + { + "$event": "comment", + "data": [ + "-", + ], + "endIndex": 6, + "startIndex": 3, + }, + { + "$event": "commentend", + "data": [], + "endIndex": 6, + "startIndex": 3, + }, +] +`; + +exports[`Events > Short bang comment 1`] = ` +[ + { + "$event": "comment", + "data": [ + "!>", + ], + "endIndex": 6, + "startIndex": 0, + }, + { + "$event": "commentend", + "data": [], + "endIndex": 6, + "startIndex": 0, + }, +] +`; + +exports[`Events > Special end tags ending with /> in script 1`] = ` +[ + { + "$event": "opentagname", + "data": [ + "script", + ], + "endIndex": 7, + "startIndex": 0, + }, + { + "$event": "opentag", + "data": [ + "script", + {}, + false, + ], + "endIndex": 7, + "startIndex": 0, + }, + { + "$event": "text", + "data": [ + "safe", + ], + "endIndex": 11, + "startIndex": 8, + }, + { + "$event": "closetag", + "data": [ + "script", + false, + ], + "endIndex": 20, + "startIndex": 12, + }, + { + "$event": "opentagname", + "data": [ + "img", + ], + "endIndex": 26, + "startIndex": 21, + }, + { + "$event": "opentag", + "data": [ + "img", + {}, + false, + ], + "endIndex": 26, + "startIndex": 21, + }, + { + "$event": "closetag", + "data": [ + "img", + true, + ], + "endIndex": 26, + "startIndex": 21, + }, +] +`; + +exports[`Events > Special end tags ending with /> in style 1`] = ` +[ + { + "$event": "opentagname", + "data": [ + "style", + ], + "endIndex": 6, + "startIndex": 0, + }, + { + "$event": "opentag", + "data": [ + "style", + {}, + false, + ], + "endIndex": 6, + "startIndex": 0, + }, + { + "$event": "text", + "data": [ + "safe", + ], + "endIndex": 10, + "startIndex": 7, + }, + { + "$event": "closetag", + "data": [ + "style", + false, + ], + "endIndex": 18, + "startIndex": 11, + }, + { + "$event": "opentagname", + "data": [ + "img", + ], + "endIndex": 24, + "startIndex": 19, + }, + { + "$event": "opentag", + "data": [ + "img", + {}, + false, + ], + "endIndex": 24, + "startIndex": 19, + }, + { + "$event": "closetag", + "data": [ + "img", + true, + ], + "endIndex": 24, + "startIndex": 19, + }, +] +`; + +exports[`Events > Special end tags ending with /> in textarea 1`] = ` +[ + { + "$event": "opentagname", + "data": [ + "textarea", + ], + "endIndex": 9, + "startIndex": 0, + }, + { + "$event": "opentag", + "data": [ + "textarea", + {}, + false, + ], + "endIndex": 9, + "startIndex": 0, + }, + { + "$event": "text", + "data": [ + "safe", + ], + "endIndex": 13, + "startIndex": 10, + }, + { + "$event": "closetag", + "data": [ + "textarea", + false, + ], + "endIndex": 24, + "startIndex": 14, + }, + { + "$event": "opentagname", + "data": [ + "img", + ], + "endIndex": 30, + "startIndex": 25, + }, + { + "$event": "opentag", + "data": [ + "img", + {}, + false, + ], + "endIndex": 30, + "startIndex": 25, + }, + { + "$event": "closetag", + "data": [ + "img", + true, + ], + "endIndex": 30, + "startIndex": 25, + }, +] +`; + +exports[`Events > Special end tags ending with /> in title 1`] = ` +[ + { + "$event": "opentagname", + "data": [ + "title", + ], + "endIndex": 6, + "startIndex": 0, + }, + { + "$event": "opentag", + "data": [ + "title", + {}, + false, + ], + "endIndex": 6, + "startIndex": 0, + }, + { + "$event": "text", + "data": [ + "safe", + ], + "endIndex": 10, + "startIndex": 7, + }, + { + "$event": "closetag", + "data": [ + "title", + false, + ], + "endIndex": 18, + "startIndex": 11, + }, + { + "$event": "opentagname", + "data": [ + "img", + ], + "endIndex": 24, + "startIndex": 19, + }, + { + "$event": "opentag", + "data": [ + "img", + {}, + false, + ], + "endIndex": 24, + "startIndex": 19, + }, + { + "$event": "closetag", + "data": [ + "img", + true, + ], + "endIndex": 24, + "startIndex": 19, + }, +] +`; + +exports[`Events > Special special tags 1`] = ` [ { "$event": "opentagname", @@ -2151,7 +3566,7 @@ exports[`Events Special special tags 1`] = ` ] `; -exports[`Events Start & end indices from domhandler 1`] = ` +exports[`Events > Start & end indices from domhandler 1`] = ` [ { "$event": "processinginstruction", @@ -2254,7 +3669,7 @@ exports[`Events Start & end indices from domhandler 1`] = ` "foo", "'", ], - "endIndex": 64, + "endIndex": 65, "startIndex": 54, }, { @@ -2363,7 +3778,47 @@ exports[`Events Start & end indices from domhandler 1`] = ` ] `; -exports[`Events Template script tags 1`] = ` +exports[`Events > Stray </svg> does not break foreign context 1`] = ` +[ + { + "$event": "opentagname", + "data": [ + "script", + ], + "endIndex": 13, + "startIndex": 6, + }, + { + "$event": "opentag", + "data": [ + "script", + {}, + false, + ], + "endIndex": 13, + "startIndex": 6, + }, + { + "$event": "text", + "data": [ + "<b>not a tag</b>", + ], + "endIndex": 29, + "startIndex": 14, + }, + { + "$event": "closetag", + "data": [ + "script", + false, + ], + "endIndex": 38, + "startIndex": 30, + }, +] +`; + +exports[`Events > Template script tags 1`] = ` [ { "$event": "opentagname", @@ -2398,7 +3853,7 @@ exports[`Events Template script tags 1`] = ` "text/template", """, ], - "endIndex": 30, + "endIndex": 31, "startIndex": 11, }, { @@ -2442,7 +3897,7 @@ exports[`Events Template script tags 1`] = ` ] `; -exports[`Events Trailing legacy entity 1`] = ` +exports[`Events > Trailing legacy entity 1`] = ` [ { "$event": "text", @@ -2455,7 +3910,7 @@ exports[`Events Trailing legacy entity 1`] = ` ] `; -exports[`Events Trailing numeric entity 1`] = ` +exports[`Events > Trailing numeric entity 1`] = ` [ { "$event": "text", @@ -2468,7 +3923,26 @@ exports[`Events Trailing numeric entity 1`] = ` ] `; -exports[`Events XML tags 1`] = ` +exports[`Events > Unclosed CDATA at EOF 1`] = ` +[ + { + "$event": "comment", + "data": [ + "[CDATA[foo", + ], + "endIndex": 12, + "startIndex": 0, + }, + { + "$event": "commentend", + "data": [], + "endIndex": 12, + "startIndex": 0, + }, +] +`; + +exports[`Events > XML tags 1`] = ` [ { "$event": "opentagname", @@ -2527,7 +4001,7 @@ exports[`Events XML tags 1`] = ` ] `; -exports[`Events attributes (no white space, no value, no quotes) 1`] = ` +exports[`Events > attributes (no white space, no value, no quotes) 1`] = ` [ { "$event": "opentagname", @@ -2544,7 +4018,7 @@ exports[`Events attributes (no white space, no value, no quotes) 1`] = ` "test0", """, ], - "endIndex": 20, + "endIndex": 21, "startIndex": 8, }, { @@ -2554,7 +4028,7 @@ exports[`Events attributes (no white space, no value, no quotes) 1`] = ` "test1", """, ], - "endIndex": 33, + "endIndex": 34, "startIndex": 21, }, { @@ -2563,7 +4037,7 @@ exports[`Events attributes (no white space, no value, no quotes) 1`] = ` "disabled", "", ], - "endIndex": 44, + "endIndex": 43, "startIndex": 35, }, { @@ -2611,7 +4085,7 @@ exports[`Events attributes (no white space, no value, no quotes) 1`] = ` ] `; -exports[`Events crazy attribute 1`] = ` +exports[`Events > crazy attribute 1`] = ` [ { "$event": "opentagname", @@ -2628,7 +4102,7 @@ exports[`Events crazy attribute 1`] = ` "", "'", ], - "endIndex": 8, + "endIndex": 9, "startIndex": 3, }, { @@ -2673,7 +4147,7 @@ exports[`Events crazy attribute 1`] = ` ] `; -exports[`Events double attribute 1`] = ` +exports[`Events > double attribute 1`] = ` [ { "$event": "opentagname", @@ -2727,7 +4201,7 @@ exports[`Events double attribute 1`] = ` ] `; -exports[`Events double brackets 1`] = ` +exports[`Events > double brackets 1`] = ` [ { "$event": "text", @@ -2775,7 +4249,7 @@ exports[`Events double brackets 1`] = ` ] `; -exports[`Events end slash: as part of attrib value of non-void element 1`] = ` +exports[`Events > end slash: as part of attrib value of non-void element 1`] = ` [ { "$event": "opentagname", @@ -2862,7 +4336,7 @@ exports[`Events end slash: as part of attrib value of non-void element 1`] = ` ] `; -exports[`Events end slash: as part of attrib value of void element 1`] = ` +exports[`Events > end slash: as part of attrib value of void element 1`] = ` [ { "$event": "opentagname", @@ -2941,7 +4415,7 @@ exports[`Events end slash: as part of attrib value of void element 1`] = ` ] `; -exports[`Events end slash: non-void element ending with /> 1`] = ` +exports[`Events > end slash: non-void element ending with /> 1`] = ` [ { "$event": "opentagname", @@ -3008,7 +4482,7 @@ exports[`Events end slash: non-void element ending with /> 1`] = ` ] `; -exports[`Events end slash: non-void element ending with />, recognizeSelfClosing=true 1`] = ` +exports[`Events > end slash: non-void element ending with />, recognizeSelfClosing=true 1`] = ` [ { "$event": "opentagname", @@ -3075,7 +4549,7 @@ exports[`Events end slash: non-void element ending with />, recognizeSelfClosing ] `; -exports[`Events end slash: non-void element ending with />, xmlMode=true 1`] = ` +exports[`Events > end slash: non-void element ending with />, xmlMode=true 1`] = ` [ { "$event": "opentagname", @@ -3142,7 +4616,141 @@ exports[`Events end slash: non-void element ending with />, xmlMode=true 1`] = ` ] `; -exports[`Events end slash: void element ending with /> 1`] = ` +exports[`Events > end slash: plaintext tag ending with />, recognizeSelfClosing=true 1`] = ` +[ + { + "$event": "opentagname", + "data": [ + "plaintext", + ], + "endIndex": 10, + "startIndex": 0, + }, + { + "$event": "opentag", + "data": [ + "plaintext", + {}, + false, + ], + "endIndex": 11, + "startIndex": 0, + }, + { + "$event": "closetag", + "data": [ + "plaintext", + true, + ], + "endIndex": 11, + "startIndex": 0, + }, + { + "$event": "opentagname", + "data": [ + "b", + ], + "endIndex": 14, + "startIndex": 12, + }, + { + "$event": "opentag", + "data": [ + "b", + {}, + false, + ], + "endIndex": 14, + "startIndex": 12, + }, + { + "$event": "text", + "data": [ + "x", + ], + "endIndex": 15, + "startIndex": 15, + }, + { + "$event": "closetag", + "data": [ + "b", + false, + ], + "endIndex": 19, + "startIndex": 16, + }, +] +`; + +exports[`Events > end slash: special tag ending with />, recognizeSelfClosing=true 1`] = ` +[ + { + "$event": "opentagname", + "data": [ + "script", + ], + "endIndex": 7, + "startIndex": 0, + }, + { + "$event": "opentag", + "data": [ + "script", + {}, + false, + ], + "endIndex": 8, + "startIndex": 0, + }, + { + "$event": "closetag", + "data": [ + "script", + true, + ], + "endIndex": 8, + "startIndex": 0, + }, + { + "$event": "opentagname", + "data": [ + "b", + ], + "endIndex": 11, + "startIndex": 9, + }, + { + "$event": "opentag", + "data": [ + "b", + {}, + false, + ], + "endIndex": 11, + "startIndex": 9, + }, + { + "$event": "text", + "data": [ + "x", + ], + "endIndex": 12, + "startIndex": 12, + }, + { + "$event": "closetag", + "data": [ + "b", + false, + ], + "endIndex": 16, + "startIndex": 13, + }, +] +`; + +exports[`Events > end slash: void element ending with /> 1`] = ` [ { "$event": "opentagname", @@ -3209,7 +4817,7 @@ exports[`Events end slash: void element ending with /> 1`] = ` ] `; -exports[`Events end slash: void element ending with > 1`] = ` +exports[`Events > end slash: void element ending with > 1`] = ` [ { "$event": "opentagname", @@ -3276,7 +4884,7 @@ exports[`Events end slash: void element ending with > 1`] = ` ] `; -exports[`Events end slash: void element ending with >, xmlMode=true 1`] = ` +exports[`Events > end slash: void element ending with >, xmlMode=true 1`] = ` [ { "$event": "opentagname", @@ -3343,7 +4951,7 @@ exports[`Events end slash: void element ending with >, xmlMode=true 1`] = ` ] `; -exports[`Events entity in attribute (#276) 1`] = ` +exports[`Events > entity in attribute (#276) 1`] = ` [ { "$event": "opentagname", @@ -3360,7 +4968,7 @@ exports[`Events entity in attribute (#276) 1`] = ` "?&image_uri=1&ℑ=2&image=3", """, ], - "endIndex": 41, + "endIndex": 42, "startIndex": 5, }, { @@ -3395,7 +5003,7 @@ exports[`Events entity in attribute (#276) 1`] = ` ] `; -exports[`Events entity in attribute 1`] = ` +exports[`Events > entity in attribute 1`] = ` [ { "$event": "opentagname", @@ -3412,7 +5020,7 @@ exports[`Events entity in attribute 1`] = ` "http://example.com/pa#x61ge?param=value¶m2¶m3=<val&; & &", "'", ], - "endIndex": 81, + "endIndex": 82, "startIndex": 3, }, { @@ -3439,7 +5047,47 @@ exports[`Events entity in attribute 1`] = ` ] `; -exports[`Events entity in title (#592) 1`] = ` +exports[`Events > entity in textarea 1`] = ` +[ + { + "$event": "opentagname", + "data": [ + "textarea", + ], + "endIndex": 9, + "startIndex": 0, + }, + { + "$event": "opentag", + "data": [ + "textarea", + {}, + false, + ], + "endIndex": 9, + "startIndex": 0, + }, + { + "$event": "text", + "data": [ + "&", + ], + "endIndex": 14, + "startIndex": 10, + }, + { + "$event": "closetag", + "data": [ + "textarea", + false, + ], + "endIndex": 25, + "startIndex": 15, + }, +] +`; + +exports[`Events > entity in title (#592) 1`] = ` [ { "$event": "opentagname", @@ -3479,7 +5127,7 @@ exports[`Events entity in title (#592) 1`] = ` ] `; -exports[`Events entity in title - decodeEntities=false (#592) 1`] = ` +exports[`Events > entity in title - decodeEntities=false (#592) 1`] = ` [ { "$event": "opentagname", @@ -3519,7 +5167,7 @@ exports[`Events entity in title - decodeEntities=false (#592) 1`] = ` ] `; -exports[`Events leading lt 1`] = ` +exports[`Events > leading lt 1`] = ` [ { "$event": "text", @@ -3532,7 +5180,7 @@ exports[`Events leading lt 1`] = ` ] `; -exports[`Events legacy entities 1`] = ` +exports[`Events > legacy entities 1`] = ` [ { "$event": "text", @@ -3545,7 +5193,7 @@ exports[`Events legacy entities 1`] = ` ] `; -exports[`Events legacy entities fail 1`] = ` +exports[`Events > legacy entities fail 1`] = ` [ { "$event": "text", @@ -3558,7 +5206,7 @@ exports[`Events legacy entities fail 1`] = ` ] `; -exports[`Events lt followed by whitespace 1`] = ` +exports[`Events > lt followed by whitespace 1`] = ` [ { "$event": "text", @@ -3571,7 +5219,7 @@ exports[`Events lt followed by whitespace 1`] = ` ] `; -exports[`Events named entities 1`] = ` +exports[`Events > named entities 1`] = ` [ { "$event": "text", @@ -3584,7 +5232,7 @@ exports[`Events named entities 1`] = ` ] `; -exports[`Events numeric entities 1`] = ` +exports[`Events > numeric entities 1`] = ` [ { "$event": "text", @@ -3597,7 +5245,7 @@ exports[`Events numeric entities 1`] = ` ] `; -exports[`Events open-implies-close case of (non-br) void close tag in non-XML mode 1`] = ` +exports[`Events > open-implies-close case of (non-br) void close tag in non-XML mode 1`] = ` [ { "$event": "opentagname", @@ -3656,7 +5304,47 @@ exports[`Events open-implies-close case of (non-br) void close tag in non-XML mo ] `; -exports[`Events simple 1`] = ` +exports[`Events > plaintext 1`] = ` +[ + { + "$event": "opentagname", + "data": [ + "plaintext", + ], + "endIndex": 10, + "startIndex": 0, + }, + { + "$event": "opentag", + "data": [ + "plaintext", + {}, + false, + ], + "endIndex": 10, + "startIndex": 0, + }, + { + "$event": "text", + "data": [ + "<b>hi</b>", + ], + "endIndex": 19, + "startIndex": 11, + }, + { + "$event": "closetag", + "data": [ + "plaintext", + true, + ], + "endIndex": 20, + "startIndex": 20, + }, +] +`; + +exports[`Events > simple 1`] = ` [ { "$event": "opentagname", @@ -3708,7 +5396,7 @@ exports[`Events simple 1`] = ` ] `; -exports[`Events tag names are not ASCII alpha 1`] = ` +exports[`Events > tag names are not ASCII alpha 1`] = ` [ { "$event": "text", @@ -3735,7 +5423,7 @@ exports[`Events tag names are not ASCII alpha 1`] = ` ] `; -exports[`Events xml entities 1`] = ` +exports[`Events > xml entities 1`] = ` [ { "$event": "text", diff --git a/src/__snapshots__/Tokenizer.spec.ts.snap b/src/__snapshots__/Tokenizer.spec.ts.snap index 36722cd..70f7e69 100644 --- a/src/__snapshots__/Tokenizer.spec.ts.snap +++ b/src/__snapshots__/Tokenizer.spec.ts.snap @@ -1,6 +1,350 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Tokenizer should handle entities for XML entities 1`] = ` +exports[`Tokenizer > should close comments on --!> 1`] = ` +[ + [ + "oncomment", + 4, + 8, + 3, + ], + [ + "onopentagname", + 10, + 13, + ], + [ + "onattribname", + 14, + 17, + ], + [ + "onattribdata", + 18, + 19, + ], + [ + "onattribend", + 1, + 19, + ], + [ + "onattribname", + 20, + 27, + ], + [ + "onattribdata", + 28, + 36, + ], + [ + "onattribend", + 1, + 36, + ], + [ + "onopentagend", + 36, + ], + [ + "ontext", + 37, + 40, + ], + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should close special tags on end tags ending with /> > for script tag 1`] = ` +[ + [ + "onopentagname", + 1, + 7, + ], + [ + "onopentagend", + 7, + ], + [ + "ontext", + 8, + 12, + ], + [ + "onclosetag", + 14, + 20, + ], + [ + "onopentagname", + 23, + 26, + ], + [ + "onopentagend", + 26, + ], + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should close special tags on end tags ending with /> > for style tag 1`] = ` +[ + [ + "onopentagname", + 1, + 6, + ], + [ + "onopentagend", + 6, + ], + [ + "ontext", + 7, + 11, + ], + [ + "onclosetag", + 13, + 18, + ], + [ + "onopentagname", + 21, + 24, + ], + [ + "onopentagend", + 24, + ], + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should close special tags on end tags ending with /> > for textarea tag 1`] = ` +[ + [ + "onopentagname", + 1, + 9, + ], + [ + "onopentagend", + 9, + ], + [ + "ontext", + 10, + 14, + ], + [ + "onclosetag", + 16, + 24, + ], + [ + "onopentagname", + 27, + 30, + ], + [ + "onopentagend", + 30, + ], + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should close special tags on end tags ending with /> > for title tag 1`] = ` +[ + [ + "onopentagname", + 1, + 6, + ], + [ + "onopentagend", + 6, + ], + [ + "ontext", + 7, + 11, + ], + [ + "onclosetag", + 13, + 18, + ], + [ + "onopentagname", + 21, + 24, + ], + [ + "onopentagend", + 24, + ], + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should correctly mark attributes > for double quotes attribute 1`] = ` +[ + [ + "onopentagname", + 1, + 4, + ], + [ + "onattribname", + 5, + 8, + ], + [ + "onattribdata", + 10, + 11, + ], + [ + "onattribend", + 3, + 12, + ], + [ + "onopentagend", + 13, + ], + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should correctly mark attributes > for no quotes attribute 1`] = ` +[ + [ + "onopentagname", + 1, + 4, + ], + [ + "onattribname", + 5, + 8, + ], + [ + "onattribdata", + 9, + 12, + ], + [ + "onattribend", + 1, + 12, + ], + [ + "onopentagend", + 13, + ], + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should correctly mark attributes > for no value attribute 1`] = ` +[ + [ + "onopentagname", + 1, + 4, + ], + [ + "onattribname", + 5, + 12, + ], + [ + "onattribend", + 0, + 12, + ], + [ + "onopentagend", + 13, + ], + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should correctly mark attributes > for single quotes attribute 1`] = ` +[ + [ + "onopentagname", + 1, + 4, + ], + [ + "onattribname", + 5, + 8, + ], + [ + "onattribdata", + 10, + 11, + ], + [ + "onattribend", + 2, + 12, + ], + [ + "onopentagend", + 13, + ], + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should handle abruptly closed comments 1`] = ` +[ + [ + "oncomment", + 4, + 5, + 1, + ], + [ + "ontext", + 6, + 10, + ], + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should handle entities > for XML entities 1`] = ` [ [ "ontextentity", @@ -53,7 +397,7 @@ exports[`Tokenizer should handle entities for XML entities 1`] = ` ] `; -exports[`Tokenizer should handle entities for entities in attributes (#276) 1`] = ` +exports[`Tokenizer > should handle entities > for entities in attributes (#276) 1`] = ` [ [ "onopentagname", @@ -82,7 +426,7 @@ exports[`Tokenizer should handle entities for entities in attributes (#276) 1`] [ "onattribend", 3, - 41, + 42, ], [ "onselfclosingtag", @@ -109,7 +453,7 @@ exports[`Tokenizer should handle entities for entities in attributes (#276) 1`] ] `; -exports[`Tokenizer should handle entities for multi-byte entities 1`] = ` +exports[`Tokenizer > should handle entities > for multi-byte entities 1`] = ` [ [ "ontextentity", @@ -127,7 +471,7 @@ exports[`Tokenizer should handle entities for multi-byte entities 1`] = ` ] `; -exports[`Tokenizer should handle entities for trailing legacy entity 1`] = ` +exports[`Tokenizer > should handle entities > for trailing legacy entity 1`] = ` [ [ "ontextentity", @@ -150,7 +494,213 @@ exports[`Tokenizer should handle entities for trailing legacy entity 1`] = ` ] `; -exports[`Tokenizer should not break after special tag followed by an entity for normal special tag 1`] = ` +exports[`Tokenizer > should ignore empty closing tags 1`] = ` +[ + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should ignore self-closing slash in text-only HTML tags > for self-closing iframe tag 1`] = ` +[ + [ + "onopentagname", + 1, + 7, + ], + [ + "onselfclosingtag", + 9, + ], + [ + "ontext", + 10, + 21, + ], + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should ignore self-closing slash in text-only HTML tags > for self-closing noembed tag 1`] = ` +[ + [ + "onopentagname", + 1, + 8, + ], + [ + "onselfclosingtag", + 10, + ], + [ + "ontext", + 11, + 22, + ], + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should ignore self-closing slash in text-only HTML tags > for self-closing noframes tag 1`] = ` +[ + [ + "onopentagname", + 1, + 9, + ], + [ + "onselfclosingtag", + 11, + ], + [ + "ontext", + 12, + 23, + ], + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should ignore self-closing slash in text-only HTML tags > for self-closing plaintext tag 1`] = ` +[ + [ + "onopentagname", + 1, + 10, + ], + [ + "onselfclosingtag", + 12, + ], + [ + "ontext", + 13, + 24, + ], + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should ignore self-closing slash in text-only HTML tags > for self-closing script tag 1`] = ` +[ + [ + "onopentagname", + 1, + 7, + ], + [ + "onselfclosingtag", + 9, + ], + [ + "ontext", + 10, + 21, + ], + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should ignore self-closing slash in text-only HTML tags > for self-closing style tag 1`] = ` +[ + [ + "onopentagname", + 1, + 6, + ], + [ + "onselfclosingtag", + 8, + ], + [ + "ontext", + 9, + 20, + ], + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should ignore self-closing slash in text-only HTML tags > for self-closing textarea tag 1`] = ` +[ + [ + "onopentagname", + 1, + 9, + ], + [ + "onselfclosingtag", + 11, + ], + [ + "ontext", + 12, + 23, + ], + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should ignore self-closing slash in text-only HTML tags > for self-closing title tag 1`] = ` +[ + [ + "onopentagname", + 1, + 6, + ], + [ + "onselfclosingtag", + 8, + ], + [ + "ontext", + 9, + 20, + ], + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should ignore self-closing slash in text-only HTML tags > for self-closing xmp tag 1`] = ` +[ + [ + "onopentagname", + 1, + 4, + ], + [ + "onselfclosingtag", + 6, + ], + [ + "ontext", + 7, + 18, + ], + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should not break after special tag followed by an entity > for normal special tag 1`] = ` [ [ "onopentagname", @@ -191,7 +741,7 @@ exports[`Tokenizer should not break after special tag followed by an entity for ] `; -exports[`Tokenizer should not break after special tag followed by an entity for self-closing special tag 1`] = ` +exports[`Tokenizer > should not break after special tag followed by an entity > for recognized self-closing special tag 1`] = ` [ [ "onopentagname", @@ -222,7 +772,29 @@ exports[`Tokenizer should not break after special tag followed by an entity for ] `; -exports[`Tokenizer should not lose data when pausing 1`] = ` +exports[`Tokenizer > should not break after special tag followed by an entity > for self-closing special tag 1`] = ` +[ + [ + "onopentagname", + 1, + 6, + ], + [ + "onselfclosingtag", + 8, + ], + [ + "ontext", + 9, + 20, + ], + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should not lose data when pausing 1`] = ` [ [ "ontextentity", @@ -240,30 +812,65 @@ exports[`Tokenizer should not lose data when pausing 1`] = ` ] `; -exports[`Tokenizer should support self-closing special tags for self-closing script tag 1`] = ` +exports[`Tokenizer > should not treat <!--> as a complete comment in xmlMode 1`] = ` [ [ "onopentagname", 1, - 7, + 5, ], [ - "onselfclosingtag", - 9, + "onopentagend", + 5, ], [ "onopentagname", + 7, 11, - 14, ], [ "onopentagend", - 14, + 11, ], [ - "onclosetag", + "ontext", + 12, 17, - 20, + ], + [ + "onclosetag", + 19, + 23, + ], + [ + "oncomment", + 28, + 58, + 2, + ], + [ + "onopentagname", + 60, + 64, + ], + [ + "onopentagend", + 64, + ], + [ + "ontext", + 65, + 68, + ], + [ + "onclosetag", + 70, + 74, + ], + [ + "onclosetag", + 77, + 81, ], [ "onend", @@ -271,30 +878,35 @@ exports[`Tokenizer should support self-closing special tags for self-closing scr ] `; -exports[`Tokenizer should support self-closing special tags for self-closing style tag 1`] = ` +exports[`Tokenizer > should support standard special tags > for normal script tag 1`] = ` [ [ "onopentagname", 1, - 6, + 7, ], [ - "onselfclosingtag", - 8, + "onopentagend", + 7, ], [ - "onopentagname", + "onclosetag", 10, - 13, + 16, + ], + [ + "onopentagname", + 18, + 21, ], [ "onopentagend", - 13, + 21, ], [ "onclosetag", - 16, - 19, + 24, + 27, ], [ "onend", @@ -302,7 +914,7 @@ exports[`Tokenizer should support self-closing special tags for self-closing sty ] `; -exports[`Tokenizer should support self-closing special tags for self-closing title tag 1`] = ` +exports[`Tokenizer > should support standard special tags > for normal sitle tag 1`] = ` [ [ "onopentagname", @@ -310,58 +922,236 @@ exports[`Tokenizer should support self-closing special tags for self-closing tit 6, ], [ - "onselfclosingtag", - 8, + "onopentagend", + 6, + ], + [ + "onclosetag", + 9, + 14, ], [ "onopentagname", - 10, - 13, + 16, + 19, ], [ "onopentagend", - 13, + 19, ], [ "onclosetag", + 22, + 25, + ], + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should support standard special tags > for normal style tag 1`] = ` +[ + [ + "onopentagname", + 1, + 6, + ], + [ + "onopentagend", + 6, + ], + [ + "onclosetag", + 9, + 14, + ], + [ + "onopentagname", 16, 19, ], [ + "onopentagend", + 19, + ], + [ + "onclosetag", + 22, + 25, + ], + [ "onend", ], ] `; -exports[`Tokenizer should support standard special tags for normal script tag 1`] = ` +exports[`Tokenizer > should support standard special tags > for normal textarea tag 1`] = ` [ [ "onopentagname", 1, - 7, + 9, ], [ "onopentagend", - 7, + 9, + ], + [ + "onclosetag", + 12, + 20, + ], + [ + "onopentagname", + 22, + 25, + ], + [ + "onopentagend", + 25, + ], + [ + "onclosetag", + 28, + 31, + ], + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should support standard special tags > for normal xmp tag 1`] = ` +[ + [ + "onopentagname", + 1, + 4, + ], + [ + "onopentagend", + 4, ], [ "onclosetag", + 7, 10, - 16, ], [ "onopentagname", + 12, + 15, + ], + [ + "onopentagend", + 15, + ], + [ + "onclosetag", 18, 21, ], [ + "onend", + ], +] +`; + +exports[`Tokenizer > should terminate XML processing instructions on ?> 1`] = ` +[ + [ + "onprocessinginstruction", + 2, + 25, + ], + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should treat <!> as a bogus comment 1`] = ` +[ + [ + "oncomment", + 2, + 2, + 0, + ], + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should treat <!-> as a bogus comment 1`] = ` +[ + [ + "oncomment", + 2, + 3, + 0, + ], + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should treat <!DOCTYPEhtml> as a declaration 1`] = ` +[ + [ + "ondeclaration", + 2, + 13, + ], + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should treat <? and <! as bogus comments in HTML 1`] = ` +[ + [ + "oncomment", + 1, + 5, + 0, + ], + [ + "oncomment", + 8, + 11, + 0, + ], + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should treat html inside raw-text tags as text > for div inside iframe tag 1`] = ` +[ + [ + "onopentagname", + 1, + 7, + ], + [ "onopentagend", - 21, + 7, ], [ - "onclosetag", + "ontext", + 8, 24, - 27, + ], + [ + "onclosetag", + 26, + 32, ], [ "onend", @@ -369,35 +1159,80 @@ exports[`Tokenizer should support standard special tags for normal script tag 1` ] `; -exports[`Tokenizer should support standard special tags for normal sitle tag 1`] = ` +exports[`Tokenizer > should treat html inside raw-text tags as text > for div inside noembed tag 1`] = ` [ [ "onopentagname", 1, - 6, + 8, ], [ "onopentagend", - 6, + 8, + ], + [ + "ontext", + 9, + 25, ], [ "onclosetag", + 27, + 34, + ], + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should treat html inside raw-text tags as text > for div inside noframes tag 1`] = ` +[ + [ + "onopentagname", + 1, 9, - 14, ], [ + "onopentagend", + 9, + ], + [ + "ontext", + 10, + 26, + ], + [ + "onclosetag", + 28, + 36, + ], + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should treat html inside special tags as text > for div inside script tag 1`] = ` +[ + [ "onopentagname", - 16, - 19, + 1, + 7, ], [ "onopentagend", + 7, + ], + [ + "ontext", + 8, 19, ], [ "onclosetag", - 22, - 25, + 21, + 27, ], [ "onend", @@ -405,7 +1240,7 @@ exports[`Tokenizer should support standard special tags for normal sitle tag 1`] ] `; -exports[`Tokenizer should support standard special tags for normal style tag 1`] = ` +exports[`Tokenizer > should treat html inside special tags as text > for div inside style tag 1`] = ` [ [ "onopentagname", @@ -417,22 +1252,67 @@ exports[`Tokenizer should support standard special tags for normal style tag 1`] 6, ], [ + "ontext", + 7, + 18, + ], + [ "onclosetag", + 20, + 25, + ], + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should treat html inside special tags as text > for div inside textarea tag 1`] = ` +[ + [ + "onopentagname", + 1, 9, - 14, ], [ + "onopentagend", + 9, + ], + [ + "ontext", + 10, + 21, + ], + [ + "onclosetag", + 23, + 31, + ], + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should treat html inside special tags as text > for div inside title tag 1`] = ` +[ + [ "onopentagname", - 16, - 19, + 1, + 6, ], [ "onopentagend", - 19, + 6, + ], + [ + "ontext", + 7, + 18, ], [ "onclosetag", - 22, + 20, 25, ], [ @@ -440,3 +1320,114 @@ exports[`Tokenizer should support standard special tags for normal style tag 1`] ], ] `; + +exports[`Tokenizer > should treat html inside special tags as text > for div inside xmp tag 1`] = ` +[ + [ + "onopentagname", + 1, + 4, + ], + [ + "onopentagend", + 4, + ], + [ + "ontext", + 5, + 16, + ], + [ + "onclosetag", + 18, + 21, + ], + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should trim unfinished HTML comment closes at EOF for <!-- 1`] = ` +[ + [ + "oncomment", + 4, + 4, + 0, + ], + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should trim unfinished HTML comment closes at EOF for <!--- 1`] = ` +[ + [ + "oncomment", + 4, + 5, + 1, + ], + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should trim unfinished HTML comment closes at EOF for <!---- 1`] = ` +[ + [ + "oncomment", + 4, + 6, + 2, + ], + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should trim unfinished HTML comment closes at EOF for <!--a- 1`] = ` +[ + [ + "oncomment", + 4, + 6, + 1, + ], + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should trim unfinished HTML comment closes at EOF for <!--a-- 1`] = ` +[ + [ + "oncomment", + 4, + 7, + 2, + ], + [ + "onend", + ], +] +`; + +exports[`Tokenizer > should trim unfinished HTML comment closes at EOF for <!--a--! 1`] = ` +[ + [ + "oncomment", + 4, + 8, + 3, + ], + [ + "onend", + ], +] +`; diff --git a/src/__snapshots__/WebWritableStream.spec.ts.snap b/src/__snapshots__/WebWritableStream.spec.ts.snap new file mode 100644 index 0000000..3012e43 --- /dev/null +++ b/src/__snapshots__/WebWritableStream.spec.ts.snap @@ -0,0 +1,5809 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`WebWritableStream > Atom feed 1`] = ` +[ + { + "$event": "processinginstruction", + "data": [ + "?xml", + "?xml version="1.0" encoding="utf-8"", + ], + "endIndex": 36, + "startIndex": 0, + }, + { + "$event": "text", + "data": [ + " +", + ], + "endIndex": 38, + "startIndex": 37, + }, + { + "$event": "comment", + "data": [ + " http://en.wikipedia.org/wiki/Atom_%28standard%29 ", + ], + "endIndex": 95, + "startIndex": 39, + }, + { + "$event": "commentend", + "data": [], + "endIndex": 95, + "startIndex": 39, + }, + { + "$event": "text", + "data": [ + " +", + ], + "endIndex": 96, + "startIndex": 96, + }, + { + "$event": "opentagname", + "data": [ + "feed", + ], + "endIndex": 102, + "startIndex": 97, + }, + { + "$event": "attribute", + "data": [ + "xmlns", + "http://www.w3.org/2005/Atom", + """, + ], + "endIndex": 138, + "startIndex": 103, + }, + { + "$event": "opentag", + "data": [ + "feed", + { + "xmlns": "http://www.w3.org/2005/Atom", + }, + false, + ], + "endIndex": 138, + "startIndex": 97, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 140, + "startIndex": 139, + }, + { + "$event": "opentagname", + "data": [ + "title", + ], + "endIndex": 147, + "startIndex": 141, + }, + { + "$event": "opentag", + "data": [ + "title", + {}, + false, + ], + "endIndex": 147, + "startIndex": 141, + }, + { + "$event": "text", + "data": [ + "Example Feed", + ], + "endIndex": 159, + "startIndex": 148, + }, + { + "$event": "closetag", + "data": [ + "title", + false, + ], + "endIndex": 167, + "startIndex": 160, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 169, + "startIndex": 168, + }, + { + "$event": "opentagname", + "data": [ + "subtitle", + ], + "endIndex": 179, + "startIndex": 170, + }, + { + "$event": "opentag", + "data": [ + "subtitle", + {}, + false, + ], + "endIndex": 179, + "startIndex": 170, + }, + { + "$event": "text", + "data": [ + "A subtitle.", + ], + "endIndex": 190, + "startIndex": 180, + }, + { + "$event": "closetag", + "data": [ + "subtitle", + false, + ], + "endIndex": 201, + "startIndex": 191, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 203, + "startIndex": 202, + }, + { + "$event": "opentagname", + "data": [ + "link", + ], + "endIndex": 209, + "startIndex": 204, + }, + { + "$event": "attribute", + "data": [ + "href", + "http://example.org/feed/", + """, + ], + "endIndex": 241, + "startIndex": 210, + }, + { + "$event": "attribute", + "data": [ + "rel", + "self", + """, + ], + "endIndex": 252, + "startIndex": 242, + }, + { + "$event": "opentag", + "data": [ + "link", + { + "href": "http://example.org/feed/", + "rel": "self", + }, + false, + ], + "endIndex": 254, + "startIndex": 204, + }, + { + "$event": "closetag", + "data": [ + "link", + true, + ], + "endIndex": 254, + "startIndex": 204, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 256, + "startIndex": 255, + }, + { + "$event": "opentagname", + "data": [ + "link", + ], + "endIndex": 262, + "startIndex": 257, + }, + { + "$event": "attribute", + "data": [ + "href", + "http://example.org/", + """, + ], + "endIndex": 289, + "startIndex": 263, + }, + { + "$event": "opentag", + "data": [ + "link", + { + "href": "http://example.org/", + }, + false, + ], + "endIndex": 291, + "startIndex": 257, + }, + { + "$event": "closetag", + "data": [ + "link", + true, + ], + "endIndex": 291, + "startIndex": 257, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 293, + "startIndex": 292, + }, + { + "$event": "opentagname", + "data": [ + "id", + ], + "endIndex": 297, + "startIndex": 294, + }, + { + "$event": "opentag", + "data": [ + "id", + {}, + false, + ], + "endIndex": 297, + "startIndex": 294, + }, + { + "$event": "text", + "data": [ + "urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6", + ], + "endIndex": 342, + "startIndex": 298, + }, + { + "$event": "closetag", + "data": [ + "id", + false, + ], + "endIndex": 347, + "startIndex": 343, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 349, + "startIndex": 348, + }, + { + "$event": "opentagname", + "data": [ + "updated", + ], + "endIndex": 358, + "startIndex": 350, + }, + { + "$event": "opentag", + "data": [ + "updated", + {}, + false, + ], + "endIndex": 358, + "startIndex": 350, + }, + { + "$event": "text", + "data": [ + "2003-12-13T18:30:02Z", + ], + "endIndex": 378, + "startIndex": 359, + }, + { + "$event": "closetag", + "data": [ + "updated", + false, + ], + "endIndex": 388, + "startIndex": 379, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 390, + "startIndex": 389, + }, + { + "$event": "opentagname", + "data": [ + "author", + ], + "endIndex": 398, + "startIndex": 391, + }, + { + "$event": "opentag", + "data": [ + "author", + {}, + false, + ], + "endIndex": 398, + "startIndex": 391, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 401, + "startIndex": 399, + }, + { + "$event": "opentagname", + "data": [ + "name", + ], + "endIndex": 407, + "startIndex": 402, + }, + { + "$event": "opentag", + "data": [ + "name", + {}, + false, + ], + "endIndex": 407, + "startIndex": 402, + }, + { + "$event": "text", + "data": [ + "John Doe", + ], + "endIndex": 415, + "startIndex": 408, + }, + { + "$event": "closetag", + "data": [ + "name", + false, + ], + "endIndex": 422, + "startIndex": 416, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 425, + "startIndex": 423, + }, + { + "$event": "opentagname", + "data": [ + "email", + ], + "endIndex": 432, + "startIndex": 426, + }, + { + "$event": "opentag", + "data": [ + "email", + {}, + false, + ], + "endIndex": 432, + "startIndex": 426, + }, + { + "$event": "text", + "data": [ + "johndoe@example.com", + ], + "endIndex": 451, + "startIndex": 433, + }, + { + "$event": "closetag", + "data": [ + "email", + false, + ], + "endIndex": 459, + "startIndex": 452, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 461, + "startIndex": 460, + }, + { + "$event": "closetag", + "data": [ + "author", + false, + ], + "endIndex": 470, + "startIndex": 462, + }, + { + "$event": "text", + "data": [ + " + + ", + ], + "endIndex": 473, + "startIndex": 471, + }, + { + "$event": "opentagname", + "data": [ + "entry", + ], + "endIndex": 480, + "startIndex": 474, + }, + { + "$event": "opentag", + "data": [ + "entry", + {}, + false, + ], + "endIndex": 480, + "startIndex": 474, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 483, + "startIndex": 481, + }, + { + "$event": "opentagname", + "data": [ + "title", + ], + "endIndex": 490, + "startIndex": 484, + }, + { + "$event": "opentag", + "data": [ + "title", + {}, + false, + ], + "endIndex": 490, + "startIndex": 484, + }, + { + "$event": "text", + "data": [ + "Atom-Powered Robots Run Amok", + ], + "endIndex": 518, + "startIndex": 491, + }, + { + "$event": "closetag", + "data": [ + "title", + false, + ], + "endIndex": 526, + "startIndex": 519, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 529, + "startIndex": 527, + }, + { + "$event": "opentagname", + "data": [ + "link", + ], + "endIndex": 535, + "startIndex": 530, + }, + { + "$event": "attribute", + "data": [ + "href", + "http://example.org/2003/12/13/atom03", + """, + ], + "endIndex": 579, + "startIndex": 536, + }, + { + "$event": "opentag", + "data": [ + "link", + { + "href": "http://example.org/2003/12/13/atom03", + }, + false, + ], + "endIndex": 581, + "startIndex": 530, + }, + { + "$event": "closetag", + "data": [ + "link", + true, + ], + "endIndex": 581, + "startIndex": 530, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 584, + "startIndex": 582, + }, + { + "$event": "opentagname", + "data": [ + "link", + ], + "endIndex": 590, + "startIndex": 585, + }, + { + "$event": "attribute", + "data": [ + "rel", + "alternate", + """, + ], + "endIndex": 606, + "startIndex": 591, + }, + { + "$event": "attribute", + "data": [ + "type", + "text/html", + """, + ], + "endIndex": 623, + "startIndex": 607, + }, + { + "$event": "attribute", + "data": [ + "href", + "http://example.org/2003/12/13/atom03.html", + """, + ], + "endIndex": 672, + "startIndex": 624, + }, + { + "$event": "opentag", + "data": [ + "link", + { + "href": "http://example.org/2003/12/13/atom03.html", + "rel": "alternate", + "type": "text/html", + }, + false, + ], + "endIndex": 673, + "startIndex": 585, + }, + { + "$event": "closetag", + "data": [ + "link", + true, + ], + "endIndex": 673, + "startIndex": 585, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 676, + "startIndex": 674, + }, + { + "$event": "opentagname", + "data": [ + "link", + ], + "endIndex": 682, + "startIndex": 677, + }, + { + "$event": "attribute", + "data": [ + "rel", + "edit", + """, + ], + "endIndex": 693, + "startIndex": 683, + }, + { + "$event": "attribute", + "data": [ + "href", + "http://example.org/2003/12/13/atom03/edit", + """, + ], + "endIndex": 742, + "startIndex": 694, + }, + { + "$event": "opentag", + "data": [ + "link", + { + "href": "http://example.org/2003/12/13/atom03/edit", + "rel": "edit", + }, + false, + ], + "endIndex": 743, + "startIndex": 677, + }, + { + "$event": "closetag", + "data": [ + "link", + true, + ], + "endIndex": 743, + "startIndex": 677, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 746, + "startIndex": 744, + }, + { + "$event": "opentagname", + "data": [ + "id", + ], + "endIndex": 750, + "startIndex": 747, + }, + { + "$event": "opentag", + "data": [ + "id", + {}, + false, + ], + "endIndex": 750, + "startIndex": 747, + }, + { + "$event": "text", + "data": [ + "urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a", + ], + "endIndex": 795, + "startIndex": 751, + }, + { + "$event": "closetag", + "data": [ + "id", + false, + ], + "endIndex": 800, + "startIndex": 796, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 803, + "startIndex": 801, + }, + { + "$event": "opentagname", + "data": [ + "updated", + ], + "endIndex": 812, + "startIndex": 804, + }, + { + "$event": "opentag", + "data": [ + "updated", + {}, + false, + ], + "endIndex": 812, + "startIndex": 804, + }, + { + "$event": "text", + "data": [ + "2003-12-13T18:30:02Z", + ], + "endIndex": 832, + "startIndex": 813, + }, + { + "$event": "closetag", + "data": [ + "updated", + false, + ], + "endIndex": 842, + "startIndex": 833, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 845, + "startIndex": 843, + }, + { + "$event": "opentagname", + "data": [ + "content", + ], + "endIndex": 854, + "startIndex": 846, + }, + { + "$event": "attribute", + "data": [ + "type", + "html", + """, + ], + "endIndex": 866, + "startIndex": 855, + }, + { + "$event": "opentag", + "data": [ + "content", + { + "type": "html", + }, + false, + ], + "endIndex": 866, + "startIndex": 846, + }, + { + "$event": "opentagname", + "data": [ + "p", + ], + "endIndex": 869, + "startIndex": 867, + }, + { + "$event": "opentag", + "data": [ + "p", + {}, + false, + ], + "endIndex": 869, + "startIndex": 867, + }, + { + "$event": "text", + "data": [ + "Some content.", + ], + "endIndex": 882, + "startIndex": 870, + }, + { + "$event": "closetag", + "data": [ + "p", + false, + ], + "endIndex": 886, + "startIndex": 883, + }, + { + "$event": "closetag", + "data": [ + "content", + false, + ], + "endIndex": 896, + "startIndex": 887, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 898, + "startIndex": 897, + }, + { + "$event": "closetag", + "data": [ + "entry", + false, + ], + "endIndex": 906, + "startIndex": 899, + }, + { + "$event": "text", + "data": [ + " + + ", + ], + "endIndex": 909, + "startIndex": 907, + }, + { + "$event": "opentagname", + "data": [ + "entry", + ], + "endIndex": 916, + "startIndex": 910, + }, + { + "$event": "opentag", + "data": [ + "entry", + {}, + false, + ], + "endIndex": 917, + "startIndex": 910, + }, + { + "$event": "closetag", + "data": [ + "entry", + true, + ], + "endIndex": 917, + "startIndex": 910, + }, + { + "$event": "text", + "data": [ + " + +", + ], + "endIndex": 919, + "startIndex": 918, + }, + { + "$event": "closetag", + "data": [ + "feed", + false, + ], + "endIndex": 926, + "startIndex": 920, + }, + { + "$event": "text", + "data": [ + " +", + ], + "endIndex": 927, + "startIndex": 927, + }, +] +`; + +exports[`WebWritableStream > Attributes 1`] = ` +[ + { + "$event": "processinginstruction", + "data": [ + "!doctype", + "!doctype html", + ], + "endIndex": 14, + "startIndex": 0, + }, + { + "$event": "text", + "data": [ + " +", + ], + "endIndex": 15, + "startIndex": 15, + }, + { + "$event": "opentagname", + "data": [ + "html", + ], + "endIndex": 21, + "startIndex": 16, + }, + { + "$event": "opentag", + "data": [ + "html", + {}, + false, + ], + "endIndex": 21, + "startIndex": 16, + }, + { + "$event": "text", + "data": [ + " +", + ], + "endIndex": 22, + "startIndex": 22, + }, + { + "$event": "opentagname", + "data": [ + "head", + ], + "endIndex": 28, + "startIndex": 23, + }, + { + "$event": "opentag", + "data": [ + "head", + {}, + false, + ], + "endIndex": 28, + "startIndex": 23, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 30, + "startIndex": 29, + }, + { + "$event": "opentagname", + "data": [ + "title", + ], + "endIndex": 37, + "startIndex": 31, + }, + { + "$event": "opentag", + "data": [ + "title", + {}, + false, + ], + "endIndex": 37, + "startIndex": 31, + }, + { + "$event": "text", + "data": [ + "Attributes test", + ], + "endIndex": 52, + "startIndex": 38, + }, + { + "$event": "closetag", + "data": [ + "title", + false, + ], + "endIndex": 60, + "startIndex": 53, + }, + { + "$event": "text", + "data": [ + " +", + ], + "endIndex": 61, + "startIndex": 61, + }, + { + "$event": "closetag", + "data": [ + "head", + false, + ], + "endIndex": 68, + "startIndex": 62, + }, + { + "$event": "text", + "data": [ + " +", + ], + "endIndex": 69, + "startIndex": 69, + }, + { + "$event": "opentagname", + "data": [ + "body", + ], + "endIndex": 75, + "startIndex": 70, + }, + { + "$event": "opentag", + "data": [ + "body", + {}, + false, + ], + "endIndex": 75, + "startIndex": 70, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 77, + "startIndex": 76, + }, + { + "$event": "comment", + "data": [ + " Normal attributes ", + ], + "endIndex": 103, + "startIndex": 78, + }, + { + "$event": "commentend", + "data": [], + "endIndex": 103, + "startIndex": 78, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 105, + "startIndex": 104, + }, + { + "$event": "opentagname", + "data": [ + "button", + ], + "endIndex": 113, + "startIndex": 106, + }, + { + "$event": "attribute", + "data": [ + "id", + "test0", + """, + ], + "endIndex": 124, + "startIndex": 114, + }, + { + "$event": "attribute", + "data": [ + "class", + "value0", + """, + ], + "endIndex": 139, + "startIndex": 125, + }, + { + "$event": "attribute", + "data": [ + "title", + "value1", + """, + ], + "endIndex": 154, + "startIndex": 140, + }, + { + "$event": "opentag", + "data": [ + "button", + { + "class": "value0", + "id": "test0", + "title": "value1", + }, + false, + ], + "endIndex": 154, + "startIndex": 106, + }, + { + "$event": "text", + "data": [ + "class="value0" title="value1"", + ], + "endIndex": 183, + "startIndex": 155, + }, + { + "$event": "closetag", + "data": [ + "button", + false, + ], + "endIndex": 192, + "startIndex": 184, + }, + { + "$event": "text", + "data": [ + " + + ", + ], + "endIndex": 195, + "startIndex": 193, + }, + { + "$event": "comment", + "data": [ + " Attributes with no quotes or value ", + ], + "endIndex": 238, + "startIndex": 196, + }, + { + "$event": "commentend", + "data": [], + "endIndex": 238, + "startIndex": 196, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 240, + "startIndex": 239, + }, + { + "$event": "opentagname", + "data": [ + "button", + ], + "endIndex": 248, + "startIndex": 241, + }, + { + "$event": "attribute", + "data": [ + "id", + "test1", + """, + ], + "endIndex": 259, + "startIndex": 249, + }, + { + "$event": "attribute", + "data": [ + "class", + "value2", + null, + ], + "endIndex": 272, + "startIndex": 260, + }, + { + "$event": "attribute", + "data": [ + "disabled", + "", + ], + "endIndex": 281, + "startIndex": 273, + }, + { + "$event": "opentag", + "data": [ + "button", + { + "class": "value2", + "disabled": "", + "id": "test1", + }, + false, + ], + "endIndex": 281, + "startIndex": 241, + }, + { + "$event": "text", + "data": [ + "class=value2 disabled", + ], + "endIndex": 302, + "startIndex": 282, + }, + { + "$event": "closetag", + "data": [ + "button", + false, + ], + "endIndex": 311, + "startIndex": 303, + }, + { + "$event": "text", + "data": [ + " + + ", + ], + "endIndex": 314, + "startIndex": 312, + }, + { + "$event": "comment", + "data": [ + " Attributes with no space between them. No valid, but accepted by the browser ", + ], + "endIndex": 399, + "startIndex": 315, + }, + { + "$event": "commentend", + "data": [], + "endIndex": 399, + "startIndex": 315, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 401, + "startIndex": 400, + }, + { + "$event": "opentagname", + "data": [ + "button", + ], + "endIndex": 409, + "startIndex": 402, + }, + { + "$event": "attribute", + "data": [ + "id", + "test2", + """, + ], + "endIndex": 420, + "startIndex": 410, + }, + { + "$event": "attribute", + "data": [ + "class", + "value4", + """, + ], + "endIndex": 435, + "startIndex": 421, + }, + { + "$event": "attribute", + "data": [ + "title", + "value5", + """, + ], + "endIndex": 449, + "startIndex": 435, + }, + { + "$event": "opentag", + "data": [ + "button", + { + "class": "value4", + "id": "test2", + "title": "value5", + }, + false, + ], + "endIndex": 449, + "startIndex": 402, + }, + { + "$event": "text", + "data": [ + "class="value4"title="value5"", + ], + "endIndex": 477, + "startIndex": 450, + }, + { + "$event": "closetag", + "data": [ + "button", + false, + ], + "endIndex": 486, + "startIndex": 478, + }, + { + "$event": "text", + "data": [ + " +", + ], + "endIndex": 487, + "startIndex": 487, + }, + { + "$event": "closetag", + "data": [ + "body", + false, + ], + "endIndex": 494, + "startIndex": 488, + }, + { + "$event": "text", + "data": [ + " +", + ], + "endIndex": 495, + "startIndex": 495, + }, + { + "$event": "closetag", + "data": [ + "html", + false, + ], + "endIndex": 502, + "startIndex": 496, + }, +] +`; + +exports[`WebWritableStream > Basic html 1`] = ` +[ + { + "$event": "processinginstruction", + "data": [ + "!doctype", + "!DOCTYPE html", + ], + "endIndex": 14, + "startIndex": 0, + }, + { + "$event": "opentagname", + "data": [ + "html", + ], + "endIndex": 20, + "startIndex": 15, + }, + { + "$event": "opentag", + "data": [ + "html", + {}, + false, + ], + "endIndex": 20, + "startIndex": 15, + }, + { + "$event": "opentagname", + "data": [ + "title", + ], + "endIndex": 27, + "startIndex": 21, + }, + { + "$event": "opentag", + "data": [ + "title", + {}, + false, + ], + "endIndex": 27, + "startIndex": 21, + }, + { + "$event": "text", + "data": [ + "The Title", + ], + "endIndex": 36, + "startIndex": 28, + }, + { + "$event": "closetag", + "data": [ + "title", + false, + ], + "endIndex": 44, + "startIndex": 37, + }, + { + "$event": "opentagname", + "data": [ + "body", + ], + "endIndex": 50, + "startIndex": 45, + }, + { + "$event": "opentag", + "data": [ + "body", + {}, + false, + ], + "endIndex": 50, + "startIndex": 45, + }, + { + "$event": "text", + "data": [ + "Hello world", + ], + "endIndex": 61, + "startIndex": 51, + }, + { + "$event": "closetag", + "data": [ + "body", + false, + ], + "endIndex": 68, + "startIndex": 62, + }, + { + "$event": "closetag", + "data": [ + "html", + false, + ], + "endIndex": 75, + "startIndex": 69, + }, +] +`; + +exports[`WebWritableStream > RDF feed 1`] = ` +[ + { + "$event": "processinginstruction", + "data": [ + "?xml", + "?xml version="1.0" encoding="UTF-8"", + ], + "endIndex": 36, + "startIndex": 0, + }, + { + "$event": "text", + "data": [ + " +", + ], + "endIndex": 38, + "startIndex": 37, + }, + { + "$event": "opentagname", + "data": [ + "rdf:RDF", + ], + "endIndex": 47, + "startIndex": 39, + }, + { + "$event": "attribute", + "data": [ + "xmlns:rdf", + "http://www.w3.org/1999/02/22-rdf-syntax-ns#", + """, + ], + "endIndex": 103, + "startIndex": 48, + }, + { + "$event": "attribute", + "data": [ + "xmlns", + "http://purl.org/rss/1.0/", + """, + ], + "endIndex": 136, + "startIndex": 104, + }, + { + "$event": "attribute", + "data": [ + "xmlns:ev", + "http://purl.org/rss/1.0/modules/event/", + """, + ], + "endIndex": 186, + "startIndex": 137, + }, + { + "$event": "attribute", + "data": [ + "xmlns:content", + "http://purl.org/rss/1.0/modules/content/", + """, + ], + "endIndex": 243, + "startIndex": 187, + }, + { + "$event": "attribute", + "data": [ + "xmlns:taxo", + "http://purl.org/rss/1.0/modules/taxonomy/", + """, + ], + "endIndex": 298, + "startIndex": 244, + }, + { + "$event": "attribute", + "data": [ + "xmlns:dc", + "http://purl.org/dc/elements/1.1/", + """, + ], + "endIndex": 342, + "startIndex": 299, + }, + { + "$event": "attribute", + "data": [ + "xmlns:syn", + "http://purl.org/rss/1.0/modules/syndication/", + """, + ], + "endIndex": 399, + "startIndex": 343, + }, + { + "$event": "attribute", + "data": [ + "xmlns:dcterms", + "http://purl.org/dc/terms/", + """, + ], + "endIndex": 441, + "startIndex": 400, + }, + { + "$event": "attribute", + "data": [ + "xmlns:admin", + "http://webns.net/mvcb/", + """, + ], + "endIndex": 478, + "startIndex": 442, + }, + { + "$event": "opentag", + "data": [ + "rdf:RDF", + { + "xmlns": "http://purl.org/rss/1.0/", + "xmlns:admin": "http://webns.net/mvcb/", + "xmlns:content": "http://purl.org/rss/1.0/modules/content/", + "xmlns:dc": "http://purl.org/dc/elements/1.1/", + "xmlns:dcterms": "http://purl.org/dc/terms/", + "xmlns:ev": "http://purl.org/rss/1.0/modules/event/", + "xmlns:rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#", + "xmlns:syn": "http://purl.org/rss/1.0/modules/syndication/", + "xmlns:taxo": "http://purl.org/rss/1.0/modules/taxonomy/", + }, + false, + ], + "endIndex": 478, + "startIndex": 39, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 480, + "startIndex": 479, + }, + { + "$event": "opentagname", + "data": [ + "channel", + ], + "endIndex": 489, + "startIndex": 481, + }, + { + "$event": "attribute", + "data": [ + "rdf:about", + "https://github.com/fb55/htmlparser2/", + """, + ], + "endIndex": 538, + "startIndex": 490, + }, + { + "$event": "opentag", + "data": [ + "channel", + { + "rdf:about": "https://github.com/fb55/htmlparser2/", + }, + false, + ], + "endIndex": 538, + "startIndex": 481, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 541, + "startIndex": 539, + }, + { + "$event": "opentagname", + "data": [ + "title", + ], + "endIndex": 548, + "startIndex": 542, + }, + { + "$event": "opentag", + "data": [ + "title", + {}, + false, + ], + "endIndex": 548, + "startIndex": 542, + }, + { + "$event": "text", + "data": [ + "A title to parse and remember", + ], + "endIndex": 577, + "startIndex": 549, + }, + { + "$event": "closetag", + "data": [ + "title", + false, + ], + "endIndex": 585, + "startIndex": 578, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 588, + "startIndex": 586, + }, + { + "$event": "opentagname", + "data": [ + "link", + ], + "endIndex": 594, + "startIndex": 589, + }, + { + "$event": "opentag", + "data": [ + "link", + {}, + false, + ], + "endIndex": 594, + "startIndex": 589, + }, + { + "$event": "text", + "data": [ + "https://github.com/fb55/htmlparser2/", + ], + "endIndex": 630, + "startIndex": 595, + }, + { + "$event": "closetag", + "data": [ + "link", + false, + ], + "endIndex": 637, + "startIndex": 631, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 640, + "startIndex": 638, + }, + { + "$event": "opentagname", + "data": [ + "description", + ], + "endIndex": 653, + "startIndex": 641, + }, + { + "$event": "opentag", + "data": [ + "description", + {}, + false, + ], + "endIndex": 654, + "startIndex": 641, + }, + { + "$event": "closetag", + "data": [ + "description", + true, + ], + "endIndex": 654, + "startIndex": 641, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 657, + "startIndex": 655, + }, + { + "$event": "opentagname", + "data": [ + "dc:language", + ], + "endIndex": 670, + "startIndex": 658, + }, + { + "$event": "opentag", + "data": [ + "dc:language", + {}, + false, + ], + "endIndex": 670, + "startIndex": 658, + }, + { + "$event": "text", + "data": [ + "en-us", + ], + "endIndex": 675, + "startIndex": 671, + }, + { + "$event": "closetag", + "data": [ + "dc:language", + false, + ], + "endIndex": 689, + "startIndex": 676, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 692, + "startIndex": 690, + }, + { + "$event": "opentagname", + "data": [ + "dc:rights", + ], + "endIndex": 703, + "startIndex": 693, + }, + { + "$event": "opentag", + "data": [ + "dc:rights", + {}, + false, + ], + "endIndex": 703, + "startIndex": 693, + }, + { + "$event": "text", + "data": [ + "Copyright 2015 the authors", + ], + "endIndex": 729, + "startIndex": 704, + }, + { + "$event": "closetag", + "data": [ + "dc:rights", + false, + ], + "endIndex": 741, + "startIndex": 730, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 744, + "startIndex": 742, + }, + { + "$event": "opentagname", + "data": [ + "dc:publisher", + ], + "endIndex": 758, + "startIndex": 745, + }, + { + "$event": "opentag", + "data": [ + "dc:publisher", + {}, + false, + ], + "endIndex": 758, + "startIndex": 745, + }, + { + "$event": "text", + "data": [ + "webmaster@thisisafakedoma.in", + ], + "endIndex": 786, + "startIndex": 759, + }, + { + "$event": "closetag", + "data": [ + "dc:publisher", + false, + ], + "endIndex": 801, + "startIndex": 787, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 804, + "startIndex": 802, + }, + { + "$event": "opentagname", + "data": [ + "dc:creator", + ], + "endIndex": 816, + "startIndex": 805, + }, + { + "$event": "opentag", + "data": [ + "dc:creator", + {}, + false, + ], + "endIndex": 816, + "startIndex": 805, + }, + { + "$event": "text", + "data": [ + "webmaster@thisisafakedoma.in", + ], + "endIndex": 844, + "startIndex": 817, + }, + { + "$event": "closetag", + "data": [ + "dc:creator", + false, + ], + "endIndex": 857, + "startIndex": 845, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 860, + "startIndex": 858, + }, + { + "$event": "opentagname", + "data": [ + "dc:source", + ], + "endIndex": 871, + "startIndex": 861, + }, + { + "$event": "opentag", + "data": [ + "dc:source", + {}, + false, + ], + "endIndex": 871, + "startIndex": 861, + }, + { + "$event": "text", + "data": [ + "https://github.com/fb55/htmlparser2/", + ], + "endIndex": 907, + "startIndex": 872, + }, + { + "$event": "closetag", + "data": [ + "dc:source", + false, + ], + "endIndex": 919, + "startIndex": 908, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 922, + "startIndex": 920, + }, + { + "$event": "opentagname", + "data": [ + "dc:title", + ], + "endIndex": 932, + "startIndex": 923, + }, + { + "$event": "opentag", + "data": [ + "dc:title", + {}, + false, + ], + "endIndex": 932, + "startIndex": 923, + }, + { + "$event": "text", + "data": [ + "A title to parse and remember", + ], + "endIndex": 961, + "startIndex": 933, + }, + { + "$event": "closetag", + "data": [ + "dc:title", + false, + ], + "endIndex": 972, + "startIndex": 962, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 975, + "startIndex": 973, + }, + { + "$event": "opentagname", + "data": [ + "dc:type", + ], + "endIndex": 984, + "startIndex": 976, + }, + { + "$event": "opentag", + "data": [ + "dc:type", + {}, + false, + ], + "endIndex": 984, + "startIndex": 976, + }, + { + "$event": "text", + "data": [ + "Collection", + ], + "endIndex": 994, + "startIndex": 985, + }, + { + "$event": "closetag", + "data": [ + "dc:type", + false, + ], + "endIndex": 1004, + "startIndex": 995, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 1007, + "startIndex": 1005, + }, + { + "$event": "opentagname", + "data": [ + "syn:updateBase", + ], + "endIndex": 1023, + "startIndex": 1008, + }, + { + "$event": "opentag", + "data": [ + "syn:updateBase", + {}, + false, + ], + "endIndex": 1023, + "startIndex": 1008, + }, + { + "$event": "text", + "data": [ + "2011-11-04T09:39:10-07:00", + ], + "endIndex": 1048, + "startIndex": 1024, + }, + { + "$event": "closetag", + "data": [ + "syn:updateBase", + false, + ], + "endIndex": 1065, + "startIndex": 1049, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 1068, + "startIndex": 1066, + }, + { + "$event": "opentagname", + "data": [ + "syn:updateFrequency", + ], + "endIndex": 1089, + "startIndex": 1069, + }, + { + "$event": "opentag", + "data": [ + "syn:updateFrequency", + {}, + false, + ], + "endIndex": 1089, + "startIndex": 1069, + }, + { + "$event": "text", + "data": [ + "4", + ], + "endIndex": 1090, + "startIndex": 1090, + }, + { + "$event": "closetag", + "data": [ + "syn:updateFrequency", + false, + ], + "endIndex": 1112, + "startIndex": 1091, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 1115, + "startIndex": 1113, + }, + { + "$event": "opentagname", + "data": [ + "syn:updatePeriod", + ], + "endIndex": 1133, + "startIndex": 1116, + }, + { + "$event": "opentag", + "data": [ + "syn:updatePeriod", + {}, + false, + ], + "endIndex": 1133, + "startIndex": 1116, + }, + { + "$event": "text", + "data": [ + "hourly", + ], + "endIndex": 1139, + "startIndex": 1134, + }, + { + "$event": "closetag", + "data": [ + "syn:updatePeriod", + false, + ], + "endIndex": 1158, + "startIndex": 1140, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 1161, + "startIndex": 1159, + }, + { + "$event": "opentagname", + "data": [ + "items", + ], + "endIndex": 1168, + "startIndex": 1162, + }, + { + "$event": "opentag", + "data": [ + "items", + {}, + false, + ], + "endIndex": 1168, + "startIndex": 1162, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 1172, + "startIndex": 1169, + }, + { + "$event": "opentagname", + "data": [ + "rdf:Seq", + ], + "endIndex": 1181, + "startIndex": 1173, + }, + { + "$event": "opentag", + "data": [ + "rdf:Seq", + {}, + false, + ], + "endIndex": 1181, + "startIndex": 1173, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 1186, + "startIndex": 1182, + }, + { + "$event": "opentagname", + "data": [ + "rdf:li", + ], + "endIndex": 1194, + "startIndex": 1187, + }, + { + "$event": "attribute", + "data": [ + "rdf:resource", + "http://somefakesite/path/to/something.html", + """, + ], + "endIndex": 1252, + "startIndex": 1195, + }, + { + "$event": "opentag", + "data": [ + "rdf:li", + { + "rdf:resource": "http://somefakesite/path/to/something.html", + }, + false, + ], + "endIndex": 1253, + "startIndex": 1187, + }, + { + "$event": "closetag", + "data": [ + "rdf:li", + true, + ], + "endIndex": 1253, + "startIndex": 1187, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 1257, + "startIndex": 1254, + }, + { + "$event": "closetag", + "data": [ + "rdf:Seq", + false, + ], + "endIndex": 1267, + "startIndex": 1258, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 1270, + "startIndex": 1268, + }, + { + "$event": "closetag", + "data": [ + "items", + false, + ], + "endIndex": 1278, + "startIndex": 1271, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 1280, + "startIndex": 1279, + }, + { + "$event": "closetag", + "data": [ + "channel", + false, + ], + "endIndex": 1290, + "startIndex": 1281, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 1292, + "startIndex": 1291, + }, + { + "$event": "opentagname", + "data": [ + "item", + ], + "endIndex": 1298, + "startIndex": 1293, + }, + { + "$event": "attribute", + "data": [ + "rdf:about", + "http://somefakesite/path/to/something.html", + """, + ], + "endIndex": 1353, + "startIndex": 1299, + }, + { + "$event": "opentag", + "data": [ + "item", + { + "rdf:about": "http://somefakesite/path/to/something.html", + }, + false, + ], + "endIndex": 1353, + "startIndex": 1293, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 1356, + "startIndex": 1354, + }, + { + "$event": "opentagname", + "data": [ + "title", + ], + "endIndex": 1363, + "startIndex": 1357, + }, + { + "$event": "opentag", + "data": [ + "title", + {}, + false, + ], + "endIndex": 1363, + "startIndex": 1357, + }, + { + "$event": "cdatastart", + "data": [], + "endIndex": 1394, + "startIndex": 1364, + }, + { + "$event": "text", + "data": [ + " Fast HTML Parsing ", + ], + "endIndex": 1394, + "startIndex": 1364, + }, + { + "$event": "cdataend", + "data": [], + "endIndex": 1394, + "startIndex": 1364, + }, + { + "$event": "closetag", + "data": [ + "title", + false, + ], + "endIndex": 1402, + "startIndex": 1395, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 1405, + "startIndex": 1403, + }, + { + "$event": "opentagname", + "data": [ + "link", + ], + "endIndex": 1411, + "startIndex": 1406, + }, + { + "$event": "opentag", + "data": [ + "link", + {}, + false, + ], + "endIndex": 1411, + "startIndex": 1406, + }, + { + "$event": "text", + "data": [ + " +http://somefakesite/path/to/something.html +", + ], + "endIndex": 1455, + "startIndex": 1412, + }, + { + "$event": "closetag", + "data": [ + "link", + false, + ], + "endIndex": 1462, + "startIndex": 1456, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 1465, + "startIndex": 1463, + }, + { + "$event": "opentagname", + "data": [ + "description", + ], + "endIndex": 1478, + "startIndex": 1466, + }, + { + "$event": "opentag", + "data": [ + "description", + {}, + false, + ], + "endIndex": 1478, + "startIndex": 1466, + }, + { + "$event": "cdatastart", + "data": [], + "endIndex": 1560, + "startIndex": 1479, + }, + { + "$event": "text", + "data": [ + " +Great test content<br>A link: <a href="http://github.com">Github</a> +", + ], + "endIndex": 1560, + "startIndex": 1479, + }, + { + "$event": "cdataend", + "data": [], + "endIndex": 1560, + "startIndex": 1479, + }, + { + "$event": "closetag", + "data": [ + "description", + false, + ], + "endIndex": 1574, + "startIndex": 1561, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 1577, + "startIndex": 1575, + }, + { + "$event": "opentagname", + "data": [ + "dc:date", + ], + "endIndex": 1586, + "startIndex": 1578, + }, + { + "$event": "opentag", + "data": [ + "dc:date", + {}, + false, + ], + "endIndex": 1586, + "startIndex": 1578, + }, + { + "$event": "text", + "data": [ + "2011-11-04T09:35:17-07:00", + ], + "endIndex": 1611, + "startIndex": 1587, + }, + { + "$event": "closetag", + "data": [ + "dc:date", + false, + ], + "endIndex": 1621, + "startIndex": 1612, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 1624, + "startIndex": 1622, + }, + { + "$event": "opentagname", + "data": [ + "dc:language", + ], + "endIndex": 1637, + "startIndex": 1625, + }, + { + "$event": "opentag", + "data": [ + "dc:language", + {}, + false, + ], + "endIndex": 1637, + "startIndex": 1625, + }, + { + "$event": "text", + "data": [ + "en-us", + ], + "endIndex": 1642, + "startIndex": 1638, + }, + { + "$event": "closetag", + "data": [ + "dc:language", + false, + ], + "endIndex": 1656, + "startIndex": 1643, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 1659, + "startIndex": 1657, + }, + { + "$event": "opentagname", + "data": [ + "dc:rights", + ], + "endIndex": 1670, + "startIndex": 1660, + }, + { + "$event": "opentag", + "data": [ + "dc:rights", + {}, + false, + ], + "endIndex": 1670, + "startIndex": 1660, + }, + { + "$event": "text", + "data": [ + "Copyright 2015 the authors", + ], + "endIndex": 1696, + "startIndex": 1671, + }, + { + "$event": "closetag", + "data": [ + "dc:rights", + false, + ], + "endIndex": 1708, + "startIndex": 1697, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 1711, + "startIndex": 1709, + }, + { + "$event": "opentagname", + "data": [ + "dc:source", + ], + "endIndex": 1722, + "startIndex": 1712, + }, + { + "$event": "opentag", + "data": [ + "dc:source", + {}, + false, + ], + "endIndex": 1722, + "startIndex": 1712, + }, + { + "$event": "text", + "data": [ + " +http://somefakesite/path/to/something.html +", + ], + "endIndex": 1766, + "startIndex": 1723, + }, + { + "$event": "closetag", + "data": [ + "dc:source", + false, + ], + "endIndex": 1778, + "startIndex": 1767, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 1781, + "startIndex": 1779, + }, + { + "$event": "opentagname", + "data": [ + "dc:title", + ], + "endIndex": 1791, + "startIndex": 1782, + }, + { + "$event": "opentag", + "data": [ + "dc:title", + {}, + false, + ], + "endIndex": 1791, + "startIndex": 1782, + }, + { + "$event": "cdatastart", + "data": [], + "endIndex": 1822, + "startIndex": 1792, + }, + { + "$event": "text", + "data": [ + " Fast HTML Parsing ", + ], + "endIndex": 1822, + "startIndex": 1792, + }, + { + "$event": "cdataend", + "data": [], + "endIndex": 1822, + "startIndex": 1792, + }, + { + "$event": "closetag", + "data": [ + "dc:title", + false, + ], + "endIndex": 1833, + "startIndex": 1823, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 1836, + "startIndex": 1834, + }, + { + "$event": "opentagname", + "data": [ + "dc:type", + ], + "endIndex": 1845, + "startIndex": 1837, + }, + { + "$event": "opentag", + "data": [ + "dc:type", + {}, + false, + ], + "endIndex": 1845, + "startIndex": 1837, + }, + { + "$event": "text", + "data": [ + "text", + ], + "endIndex": 1849, + "startIndex": 1846, + }, + { + "$event": "closetag", + "data": [ + "dc:type", + false, + ], + "endIndex": 1859, + "startIndex": 1850, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 1862, + "startIndex": 1860, + }, + { + "$event": "opentagname", + "data": [ + "dcterms:issued", + ], + "endIndex": 1878, + "startIndex": 1863, + }, + { + "$event": "opentag", + "data": [ + "dcterms:issued", + {}, + false, + ], + "endIndex": 1878, + "startIndex": 1863, + }, + { + "$event": "text", + "data": [ + "2011-11-04T09:35:17-07:00", + ], + "endIndex": 1903, + "startIndex": 1879, + }, + { + "$event": "closetag", + "data": [ + "dcterms:issued", + false, + ], + "endIndex": 1920, + "startIndex": 1904, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 1922, + "startIndex": 1921, + }, + { + "$event": "closetag", + "data": [ + "item", + false, + ], + "endIndex": 1929, + "startIndex": 1923, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 1931, + "startIndex": 1930, + }, + { + "$event": "opentagname", + "data": [ + "item", + ], + "endIndex": 1937, + "startIndex": 1932, + }, + { + "$event": "attribute", + "data": [ + "rdf:about", + "http://somefakesite/path/to/something-else.html", + """, + ], + "endIndex": 1997, + "startIndex": 1938, + }, + { + "$event": "opentag", + "data": [ + "item", + { + "rdf:about": "http://somefakesite/path/to/something-else.html", + }, + false, + ], + "endIndex": 1997, + "startIndex": 1932, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 2000, + "startIndex": 1998, + }, + { + "$event": "opentagname", + "data": [ + "title", + ], + "endIndex": 2007, + "startIndex": 2001, + }, + { + "$event": "opentag", + "data": [ + "title", + {}, + false, + ], + "endIndex": 2007, + "startIndex": 2001, + }, + { + "$event": "cdatastart", + "data": [], + "endIndex": 2056, + "startIndex": 2008, + }, + { + "$event": "text", + "data": [ + " +This space intentionally left blank +", + ], + "endIndex": 2056, + "startIndex": 2008, + }, + { + "$event": "cdataend", + "data": [], + "endIndex": 2056, + "startIndex": 2008, + }, + { + "$event": "closetag", + "data": [ + "title", + false, + ], + "endIndex": 2064, + "startIndex": 2057, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 2067, + "startIndex": 2065, + }, + { + "$event": "opentagname", + "data": [ + "link", + ], + "endIndex": 2073, + "startIndex": 2068, + }, + { + "$event": "opentag", + "data": [ + "link", + {}, + false, + ], + "endIndex": 2073, + "startIndex": 2068, + }, + { + "$event": "text", + "data": [ + " +http://somefakesite/path/to/something-else.html +", + ], + "endIndex": 2122, + "startIndex": 2074, + }, + { + "$event": "closetag", + "data": [ + "link", + false, + ], + "endIndex": 2129, + "startIndex": 2123, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 2132, + "startIndex": 2130, + }, + { + "$event": "opentagname", + "data": [ + "description", + ], + "endIndex": 2145, + "startIndex": 2133, + }, + { + "$event": "opentag", + "data": [ + "description", + {}, + false, + ], + "endIndex": 2145, + "startIndex": 2133, + }, + { + "$event": "cdatastart", + "data": [], + "endIndex": 2187, + "startIndex": 2146, + }, + { + "$event": "text", + "data": [ + " +The early bird gets the worm +", + ], + "endIndex": 2187, + "startIndex": 2146, + }, + { + "$event": "cdataend", + "data": [], + "endIndex": 2187, + "startIndex": 2146, + }, + { + "$event": "closetag", + "data": [ + "description", + false, + ], + "endIndex": 2201, + "startIndex": 2188, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 2204, + "startIndex": 2202, + }, + { + "$event": "opentagname", + "data": [ + "dc:date", + ], + "endIndex": 2213, + "startIndex": 2205, + }, + { + "$event": "opentag", + "data": [ + "dc:date", + {}, + false, + ], + "endIndex": 2213, + "startIndex": 2205, + }, + { + "$event": "text", + "data": [ + "2011-11-04T09:34:54-07:00", + ], + "endIndex": 2238, + "startIndex": 2214, + }, + { + "$event": "closetag", + "data": [ + "dc:date", + false, + ], + "endIndex": 2248, + "startIndex": 2239, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 2251, + "startIndex": 2249, + }, + { + "$event": "opentagname", + "data": [ + "dc:language", + ], + "endIndex": 2264, + "startIndex": 2252, + }, + { + "$event": "opentag", + "data": [ + "dc:language", + {}, + false, + ], + "endIndex": 2264, + "startIndex": 2252, + }, + { + "$event": "text", + "data": [ + "en-us", + ], + "endIndex": 2269, + "startIndex": 2265, + }, + { + "$event": "closetag", + "data": [ + "dc:language", + false, + ], + "endIndex": 2283, + "startIndex": 2270, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 2286, + "startIndex": 2284, + }, + { + "$event": "opentagname", + "data": [ + "dc:rights", + ], + "endIndex": 2297, + "startIndex": 2287, + }, + { + "$event": "opentag", + "data": [ + "dc:rights", + {}, + false, + ], + "endIndex": 2297, + "startIndex": 2287, + }, + { + "$event": "text", + "data": [ + "Copyright 2015 the authors", + ], + "endIndex": 2323, + "startIndex": 2298, + }, + { + "$event": "closetag", + "data": [ + "dc:rights", + false, + ], + "endIndex": 2335, + "startIndex": 2324, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 2338, + "startIndex": 2336, + }, + { + "$event": "opentagname", + "data": [ + "dc:source", + ], + "endIndex": 2349, + "startIndex": 2339, + }, + { + "$event": "opentag", + "data": [ + "dc:source", + {}, + false, + ], + "endIndex": 2349, + "startIndex": 2339, + }, + { + "$event": "text", + "data": [ + " +http://somefakesite/path/to/something-else.html +", + ], + "endIndex": 2398, + "startIndex": 2350, + }, + { + "$event": "closetag", + "data": [ + "dc:source", + false, + ], + "endIndex": 2410, + "startIndex": 2399, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 2413, + "startIndex": 2411, + }, + { + "$event": "opentagname", + "data": [ + "dc:title", + ], + "endIndex": 2423, + "startIndex": 2414, + }, + { + "$event": "opentag", + "data": [ + "dc:title", + {}, + false, + ], + "endIndex": 2423, + "startIndex": 2414, + }, + { + "$event": "cdatastart", + "data": [], + "endIndex": 2472, + "startIndex": 2424, + }, + { + "$event": "text", + "data": [ + " +This space intentionally left blank +", + ], + "endIndex": 2472, + "startIndex": 2424, + }, + { + "$event": "cdataend", + "data": [], + "endIndex": 2472, + "startIndex": 2424, + }, + { + "$event": "closetag", + "data": [ + "dc:title", + false, + ], + "endIndex": 2483, + "startIndex": 2473, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 2486, + "startIndex": 2484, + }, + { + "$event": "opentagname", + "data": [ + "dc:type", + ], + "endIndex": 2495, + "startIndex": 2487, + }, + { + "$event": "opentag", + "data": [ + "dc:type", + {}, + false, + ], + "endIndex": 2495, + "startIndex": 2487, + }, + { + "$event": "text", + "data": [ + "text", + ], + "endIndex": 2499, + "startIndex": 2496, + }, + { + "$event": "closetag", + "data": [ + "dc:type", + false, + ], + "endIndex": 2509, + "startIndex": 2500, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 2512, + "startIndex": 2510, + }, + { + "$event": "opentagname", + "data": [ + "dcterms:issued", + ], + "endIndex": 2528, + "startIndex": 2513, + }, + { + "$event": "opentag", + "data": [ + "dcterms:issued", + {}, + false, + ], + "endIndex": 2528, + "startIndex": 2513, + }, + { + "$event": "text", + "data": [ + "2011-11-04T09:34:54-07:00", + ], + "endIndex": 2553, + "startIndex": 2529, + }, + { + "$event": "closetag", + "data": [ + "dcterms:issued", + false, + ], + "endIndex": 2570, + "startIndex": 2554, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 2572, + "startIndex": 2571, + }, + { + "$event": "closetag", + "data": [ + "item", + false, + ], + "endIndex": 2579, + "startIndex": 2573, + }, + { + "$event": "text", + "data": [ + " +", + ], + "endIndex": 2580, + "startIndex": 2580, + }, + { + "$event": "closetag", + "data": [ + "rdf:RDF", + false, + ], + "endIndex": 2590, + "startIndex": 2581, + }, +] +`; + +exports[`WebWritableStream > RSS feed 1`] = ` +[ + { + "$event": "processinginstruction", + "data": [ + "?xml", + "?xml version="1.0"", + ], + "endIndex": 19, + "startIndex": 0, + }, + { + "$event": "text", + "data": [ + " +", + ], + "endIndex": 21, + "startIndex": 20, + }, + { + "$event": "comment", + "data": [ + " http://cyber.law.harvard.edu/rss/examples/rss2sample.xml ", + ], + "endIndex": 86, + "startIndex": 22, + }, + { + "$event": "commentend", + "data": [], + "endIndex": 86, + "startIndex": 22, + }, + { + "$event": "text", + "data": [ + " +", + ], + "endIndex": 87, + "startIndex": 87, + }, + { + "$event": "opentagname", + "data": [ + "rss", + ], + "endIndex": 92, + "startIndex": 88, + }, + { + "$event": "attribute", + "data": [ + "version", + "2.0", + """, + ], + "endIndex": 106, + "startIndex": 93, + }, + { + "$event": "opentag", + "data": [ + "rss", + { + "version": "2.0", + }, + false, + ], + "endIndex": 106, + "startIndex": 88, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 110, + "startIndex": 107, + }, + { + "$event": "opentagname", + "data": [ + "channel", + ], + "endIndex": 119, + "startIndex": 111, + }, + { + "$event": "opentag", + "data": [ + "channel", + {}, + false, + ], + "endIndex": 119, + "startIndex": 111, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 126, + "startIndex": 120, + }, + { + "$event": "opentagname", + "data": [ + "title", + ], + "endIndex": 133, + "startIndex": 127, + }, + { + "$event": "opentag", + "data": [ + "title", + {}, + false, + ], + "endIndex": 133, + "startIndex": 127, + }, + { + "$event": "text", + "data": [ + "Liftoff News", + ], + "endIndex": 145, + "startIndex": 134, + }, + { + "$event": "closetag", + "data": [ + "title", + false, + ], + "endIndex": 153, + "startIndex": 146, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 160, + "startIndex": 154, + }, + { + "$event": "opentagname", + "data": [ + "link", + ], + "endIndex": 166, + "startIndex": 161, + }, + { + "$event": "opentag", + "data": [ + "link", + {}, + false, + ], + "endIndex": 166, + "startIndex": 161, + }, + { + "$event": "text", + "data": [ + "http://liftoff.msfc.nasa.gov/", + ], + "endIndex": 195, + "startIndex": 167, + }, + { + "$event": "closetag", + "data": [ + "link", + false, + ], + "endIndex": 202, + "startIndex": 196, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 209, + "startIndex": 203, + }, + { + "$event": "opentagname", + "data": [ + "description", + ], + "endIndex": 222, + "startIndex": 210, + }, + { + "$event": "opentag", + "data": [ + "description", + {}, + false, + ], + "endIndex": 222, + "startIndex": 210, + }, + { + "$event": "text", + "data": [ + "Liftoff to Space Exploration.", + ], + "endIndex": 251, + "startIndex": 223, + }, + { + "$event": "closetag", + "data": [ + "description", + false, + ], + "endIndex": 265, + "startIndex": 252, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 272, + "startIndex": 266, + }, + { + "$event": "opentagname", + "data": [ + "language", + ], + "endIndex": 282, + "startIndex": 273, + }, + { + "$event": "opentag", + "data": [ + "language", + {}, + false, + ], + "endIndex": 282, + "startIndex": 273, + }, + { + "$event": "text", + "data": [ + "en-us", + ], + "endIndex": 287, + "startIndex": 283, + }, + { + "$event": "closetag", + "data": [ + "language", + false, + ], + "endIndex": 298, + "startIndex": 288, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 305, + "startIndex": 299, + }, + { + "$event": "opentagname", + "data": [ + "pubDate", + ], + "endIndex": 314, + "startIndex": 306, + }, + { + "$event": "opentag", + "data": [ + "pubDate", + {}, + false, + ], + "endIndex": 314, + "startIndex": 306, + }, + { + "$event": "text", + "data": [ + "Tue, 10 Jun 2003 04:00:00 GMT", + ], + "endIndex": 343, + "startIndex": 315, + }, + { + "$event": "closetag", + "data": [ + "pubDate", + false, + ], + "endIndex": 353, + "startIndex": 344, + }, + { + "$event": "text", + "data": [ + " + + ", + ], + "endIndex": 361, + "startIndex": 354, + }, + { + "$event": "opentagname", + "data": [ + "lastBuildDate", + ], + "endIndex": 376, + "startIndex": 362, + }, + { + "$event": "opentag", + "data": [ + "lastBuildDate", + {}, + false, + ], + "endIndex": 376, + "startIndex": 362, + }, + { + "$event": "text", + "data": [ + "Tue, 10 Jun 2003 09:41:01 GMT", + ], + "endIndex": 405, + "startIndex": 377, + }, + { + "$event": "closetag", + "data": [ + "lastBuildDate", + false, + ], + "endIndex": 421, + "startIndex": 406, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 428, + "startIndex": 422, + }, + { + "$event": "opentagname", + "data": [ + "docs", + ], + "endIndex": 434, + "startIndex": 429, + }, + { + "$event": "opentag", + "data": [ + "docs", + {}, + false, + ], + "endIndex": 434, + "startIndex": 429, + }, + { + "$event": "text", + "data": [ + "http://blogs.law.harvard.edu/tech/rss", + ], + "endIndex": 471, + "startIndex": 435, + }, + { + "$event": "closetag", + "data": [ + "docs", + false, + ], + "endIndex": 478, + "startIndex": 472, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 485, + "startIndex": 479, + }, + { + "$event": "opentagname", + "data": [ + "generator", + ], + "endIndex": 496, + "startIndex": 486, + }, + { + "$event": "opentag", + "data": [ + "generator", + {}, + false, + ], + "endIndex": 496, + "startIndex": 486, + }, + { + "$event": "text", + "data": [ + "Weblog Editor 2.0", + ], + "endIndex": 513, + "startIndex": 497, + }, + { + "$event": "closetag", + "data": [ + "generator", + false, + ], + "endIndex": 525, + "startIndex": 514, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 532, + "startIndex": 526, + }, + { + "$event": "opentagname", + "data": [ + "managingEditor", + ], + "endIndex": 548, + "startIndex": 533, + }, + { + "$event": "opentag", + "data": [ + "managingEditor", + {}, + false, + ], + "endIndex": 548, + "startIndex": 533, + }, + { + "$event": "text", + "data": [ + "editor@example.com", + ], + "endIndex": 566, + "startIndex": 549, + }, + { + "$event": "closetag", + "data": [ + "managingEditor", + false, + ], + "endIndex": 583, + "startIndex": 567, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 590, + "startIndex": 584, + }, + { + "$event": "opentagname", + "data": [ + "webMaster", + ], + "endIndex": 601, + "startIndex": 591, + }, + { + "$event": "opentag", + "data": [ + "webMaster", + {}, + false, + ], + "endIndex": 601, + "startIndex": 591, + }, + { + "$event": "text", + "data": [ + "webmaster@example.com", + ], + "endIndex": 622, + "startIndex": 602, + }, + { + "$event": "closetag", + "data": [ + "webMaster", + false, + ], + "endIndex": 634, + "startIndex": 623, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 641, + "startIndex": 635, + }, + { + "$event": "opentagname", + "data": [ + "item", + ], + "endIndex": 647, + "startIndex": 642, + }, + { + "$event": "opentag", + "data": [ + "item", + {}, + false, + ], + "endIndex": 647, + "startIndex": 642, + }, + { + "$event": "text", + "data": [ + " + + ", + ], + "endIndex": 658, + "startIndex": 648, + }, + { + "$event": "opentagname", + "data": [ + "title", + ], + "endIndex": 665, + "startIndex": 659, + }, + { + "$event": "opentag", + "data": [ + "title", + {}, + false, + ], + "endIndex": 665, + "startIndex": 659, + }, + { + "$event": "text", + "data": [ + "Star City", + ], + "endIndex": 674, + "startIndex": 666, + }, + { + "$event": "closetag", + "data": [ + "title", + false, + ], + "endIndex": 682, + "startIndex": 675, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 692, + "startIndex": 683, + }, + { + "$event": "opentagname", + "data": [ + "link", + ], + "endIndex": 698, + "startIndex": 693, + }, + { + "$event": "opentag", + "data": [ + "link", + {}, + false, + ], + "endIndex": 698, + "startIndex": 693, + }, + { + "$event": "text", + "data": [ + "http://liftoff.msfc.nasa.gov/news/2003/news-starcity.asp", + ], + "endIndex": 754, + "startIndex": 699, + }, + { + "$event": "closetag", + "data": [ + "link", + false, + ], + "endIndex": 761, + "startIndex": 755, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 771, + "startIndex": 762, + }, + { + "$event": "opentagname", + "data": [ + "description", + ], + "endIndex": 784, + "startIndex": 772, + }, + { + "$event": "opentag", + "data": [ + "description", + {}, + false, + ], + "endIndex": 784, + "startIndex": 772, + }, + { + "$event": "text", + "data": [ + "How do Americans get ready to work with Russians aboard the International Space Station? They take a crash course in culture, language and protocol at Russia's <a href="http://howe.iki.rssi.ru/GCTC/gctc_e.htm">Star City</a>.", + ], + "endIndex": 1020, + "startIndex": 785, + }, + { + "$event": "closetag", + "data": [ + "description", + false, + ], + "endIndex": 1034, + "startIndex": 1021, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 1044, + "startIndex": 1035, + }, + { + "$event": "opentagname", + "data": [ + "pubDate", + ], + "endIndex": 1053, + "startIndex": 1045, + }, + { + "$event": "opentag", + "data": [ + "pubDate", + {}, + false, + ], + "endIndex": 1053, + "startIndex": 1045, + }, + { + "$event": "text", + "data": [ + "Tue, 03 Jun 2003 09:39:21 GMT", + ], + "endIndex": 1082, + "startIndex": 1054, + }, + { + "$event": "closetag", + "data": [ + "pubDate", + false, + ], + "endIndex": 1092, + "startIndex": 1083, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 1102, + "startIndex": 1093, + }, + { + "$event": "opentagname", + "data": [ + "guid", + ], + "endIndex": 1108, + "startIndex": 1103, + }, + { + "$event": "opentag", + "data": [ + "guid", + {}, + false, + ], + "endIndex": 1108, + "startIndex": 1103, + }, + { + "$event": "text", + "data": [ + "http://liftoff.msfc.nasa.gov/2003/06/03.html#item573", + ], + "endIndex": 1160, + "startIndex": 1109, + }, + { + "$event": "closetag", + "data": [ + "guid", + false, + ], + "endIndex": 1167, + "startIndex": 1161, + }, + { + "$event": "text", + "data": [ + " + + ", + ], + "endIndex": 1175, + "startIndex": 1168, + }, + { + "$event": "closetag", + "data": [ + "item", + false, + ], + "endIndex": 1182, + "startIndex": 1176, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 1189, + "startIndex": 1183, + }, + { + "$event": "opentagname", + "data": [ + "item", + ], + "endIndex": 1195, + "startIndex": 1190, + }, + { + "$event": "opentag", + "data": [ + "item", + {}, + false, + ], + "endIndex": 1195, + "startIndex": 1190, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 1205, + "startIndex": 1196, + }, + { + "$event": "opentagname", + "data": [ + "description", + ], + "endIndex": 1218, + "startIndex": 1206, + }, + { + "$event": "opentag", + "data": [ + "description", + {}, + false, + ], + "endIndex": 1218, + "startIndex": 1206, + }, + { + "$event": "text", + "data": [ + "Sky watchers in Europe, Asia, and parts of Alaska and Canada will experience a <a href="http://science.nasa.gov/headlines/y2003/30may_solareclipse.htm">partial eclipse of the Sun</a> on Saturday, May 31st.", + ], + "endIndex": 1435, + "startIndex": 1219, + }, + { + "$event": "closetag", + "data": [ + "description", + false, + ], + "endIndex": 1449, + "startIndex": 1436, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 1459, + "startIndex": 1450, + }, + { + "$event": "opentagname", + "data": [ + "pubDate", + ], + "endIndex": 1468, + "startIndex": 1460, + }, + { + "$event": "opentag", + "data": [ + "pubDate", + {}, + false, + ], + "endIndex": 1468, + "startIndex": 1460, + }, + { + "$event": "text", + "data": [ + "Fri, 30 May 2003 11:06:42 GMT", + ], + "endIndex": 1497, + "startIndex": 1469, + }, + { + "$event": "closetag", + "data": [ + "pubDate", + false, + ], + "endIndex": 1507, + "startIndex": 1498, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 1517, + "startIndex": 1508, + }, + { + "$event": "opentagname", + "data": [ + "guid", + ], + "endIndex": 1523, + "startIndex": 1518, + }, + { + "$event": "opentag", + "data": [ + "guid", + {}, + false, + ], + "endIndex": 1523, + "startIndex": 1518, + }, + { + "$event": "text", + "data": [ + "http://liftoff.msfc.nasa.gov/2003/05/30.html#item572", + ], + "endIndex": 1575, + "startIndex": 1524, + }, + { + "$event": "closetag", + "data": [ + "guid", + false, + ], + "endIndex": 1582, + "startIndex": 1576, + }, + { + "$event": "text", + "data": [ + " + + ", + ], + "endIndex": 1590, + "startIndex": 1583, + }, + { + "$event": "closetag", + "data": [ + "item", + false, + ], + "endIndex": 1597, + "startIndex": 1591, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 1604, + "startIndex": 1598, + }, + { + "$event": "opentagname", + "data": [ + "item", + ], + "endIndex": 1610, + "startIndex": 1605, + }, + { + "$event": "opentag", + "data": [ + "item", + {}, + false, + ], + "endIndex": 1610, + "startIndex": 1605, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 1620, + "startIndex": 1611, + }, + { + "$event": "opentagname", + "data": [ + "title", + ], + "endIndex": 1627, + "startIndex": 1621, + }, + { + "$event": "opentag", + "data": [ + "title", + {}, + false, + ], + "endIndex": 1627, + "startIndex": 1621, + }, + { + "$event": "text", + "data": [ + "The Engine That Does More", + ], + "endIndex": 1652, + "startIndex": 1628, + }, + { + "$event": "closetag", + "data": [ + "title", + false, + ], + "endIndex": 1660, + "startIndex": 1653, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 1670, + "startIndex": 1661, + }, + { + "$event": "opentagname", + "data": [ + "link", + ], + "endIndex": 1676, + "startIndex": 1671, + }, + { + "$event": "opentag", + "data": [ + "link", + {}, + false, + ], + "endIndex": 1676, + "startIndex": 1671, + }, + { + "$event": "text", + "data": [ + "http://liftoff.msfc.nasa.gov/news/2003/news-VASIMR.asp", + ], + "endIndex": 1730, + "startIndex": 1677, + }, + { + "$event": "closetag", + "data": [ + "link", + false, + ], + "endIndex": 1737, + "startIndex": 1731, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 1747, + "startIndex": 1738, + }, + { + "$event": "opentagname", + "data": [ + "description", + ], + "endIndex": 1760, + "startIndex": 1748, + }, + { + "$event": "opentag", + "data": [ + "description", + {}, + false, + ], + "endIndex": 1760, + "startIndex": 1748, + }, + { + "$event": "text", + "data": [ + "Before man travels to Mars, NASA hopes to design new engines that will let us fly through the Solar System more quickly. The proposed VASIMR engine would do that.", + ], + "endIndex": 1923, + "startIndex": 1761, + }, + { + "$event": "closetag", + "data": [ + "description", + false, + ], + "endIndex": 1937, + "startIndex": 1924, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 1947, + "startIndex": 1938, + }, + { + "$event": "opentagname", + "data": [ + "pubDate", + ], + "endIndex": 1956, + "startIndex": 1948, + }, + { + "$event": "opentag", + "data": [ + "pubDate", + {}, + false, + ], + "endIndex": 1956, + "startIndex": 1948, + }, + { + "$event": "text", + "data": [ + "Tue, 27 May 2003 08:37:32 GMT", + ], + "endIndex": 1985, + "startIndex": 1957, + }, + { + "$event": "closetag", + "data": [ + "pubDate", + false, + ], + "endIndex": 1995, + "startIndex": 1986, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 2005, + "startIndex": 1996, + }, + { + "$event": "opentagname", + "data": [ + "guid", + ], + "endIndex": 2011, + "startIndex": 2006, + }, + { + "$event": "opentag", + "data": [ + "guid", + {}, + false, + ], + "endIndex": 2011, + "startIndex": 2006, + }, + { + "$event": "text", + "data": [ + "http://liftoff.msfc.nasa.gov/2003/05/27.html#item571", + ], + "endIndex": 2063, + "startIndex": 2012, + }, + { + "$event": "closetag", + "data": [ + "guid", + false, + ], + "endIndex": 2070, + "startIndex": 2064, + }, + { + "$event": "text", + "data": [ + " + + ", + ], + "endIndex": 2078, + "startIndex": 2071, + }, + { + "$event": "closetag", + "data": [ + "item", + false, + ], + "endIndex": 2085, + "startIndex": 2079, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 2092, + "startIndex": 2086, + }, + { + "$event": "opentagname", + "data": [ + "item", + ], + "endIndex": 2098, + "startIndex": 2093, + }, + { + "$event": "opentag", + "data": [ + "item", + {}, + false, + ], + "endIndex": 2098, + "startIndex": 2093, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 2108, + "startIndex": 2099, + }, + { + "$event": "opentagname", + "data": [ + "title", + ], + "endIndex": 2115, + "startIndex": 2109, + }, + { + "$event": "opentag", + "data": [ + "title", + {}, + false, + ], + "endIndex": 2115, + "startIndex": 2109, + }, + { + "$event": "text", + "data": [ + "Astronauts' Dirty Laundry", + ], + "endIndex": 2140, + "startIndex": 2116, + }, + { + "$event": "closetag", + "data": [ + "title", + false, + ], + "endIndex": 2148, + "startIndex": 2141, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 2158, + "startIndex": 2149, + }, + { + "$event": "opentagname", + "data": [ + "link", + ], + "endIndex": 2164, + "startIndex": 2159, + }, + { + "$event": "opentag", + "data": [ + "link", + {}, + false, + ], + "endIndex": 2164, + "startIndex": 2159, + }, + { + "$event": "text", + "data": [ + "http://liftoff.msfc.nasa.gov/news/2003/news-laundry.asp", + ], + "endIndex": 2219, + "startIndex": 2165, + }, + { + "$event": "closetag", + "data": [ + "link", + false, + ], + "endIndex": 2226, + "startIndex": 2220, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 2236, + "startIndex": 2227, + }, + { + "$event": "opentagname", + "data": [ + "description", + ], + "endIndex": 2249, + "startIndex": 2237, + }, + { + "$event": "opentag", + "data": [ + "description", + {}, + false, + ], + "endIndex": 2249, + "startIndex": 2237, + }, + { + "$event": "text", + "data": [ + "Compared to earlier spacecraft, the International Space Station has many luxuries, but laundry facilities are not one of them. Instead, astronauts have other options.", + ], + "endIndex": 2416, + "startIndex": 2250, + }, + { + "$event": "closetag", + "data": [ + "description", + false, + ], + "endIndex": 2430, + "startIndex": 2417, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 2440, + "startIndex": 2431, + }, + { + "$event": "opentagname", + "data": [ + "pubDate", + ], + "endIndex": 2449, + "startIndex": 2441, + }, + { + "$event": "opentag", + "data": [ + "pubDate", + {}, + false, + ], + "endIndex": 2449, + "startIndex": 2441, + }, + { + "$event": "text", + "data": [ + "Tue, 20 May 2003 08:56:02 GMT", + ], + "endIndex": 2478, + "startIndex": 2450, + }, + { + "$event": "closetag", + "data": [ + "pubDate", + false, + ], + "endIndex": 2488, + "startIndex": 2479, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 2498, + "startIndex": 2489, + }, + { + "$event": "opentagname", + "data": [ + "guid", + ], + "endIndex": 2504, + "startIndex": 2499, + }, + { + "$event": "opentag", + "data": [ + "guid", + {}, + false, + ], + "endIndex": 2504, + "startIndex": 2499, + }, + { + "$event": "text", + "data": [ + "http://liftoff.msfc.nasa.gov/2003/05/20.html#item570", + ], + "endIndex": 2556, + "startIndex": 2505, + }, + { + "$event": "closetag", + "data": [ + "guid", + false, + ], + "endIndex": 2563, + "startIndex": 2557, + }, + { + "$event": "text", + "data": [ + " + + ", + ], + "endIndex": 2574, + "startIndex": 2564, + }, + { + "$event": "opentagname", + "data": [ + "media:content", + ], + "endIndex": 2589, + "startIndex": 2575, + }, + { + "$event": "attribute", + "data": [ + "height", + "200", + """, + ], + "endIndex": 2602, + "startIndex": 2590, + }, + { + "$event": "attribute", + "data": [ + "medium", + "image", + """, + ], + "endIndex": 2617, + "startIndex": 2603, + }, + { + "$event": "attribute", + "data": [ + "url", + "https://picsum.photos/200", + """, + ], + "endIndex": 2649, + "startIndex": 2618, + }, + { + "$event": "attribute", + "data": [ + "width", + "200", + """, + ], + "endIndex": 2661, + "startIndex": 2650, + }, + { + "$event": "opentag", + "data": [ + "media:content", + { + "height": "200", + "medium": "image", + "url": "https://picsum.photos/200", + "width": "200", + }, + false, + ], + "endIndex": 2662, + "startIndex": 2575, + }, + { + "$event": "closetag", + "data": [ + "media:content", + true, + ], + "endIndex": 2662, + "startIndex": 2575, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 2669, + "startIndex": 2663, + }, + { + "$event": "closetag", + "data": [ + "item", + false, + ], + "endIndex": 2676, + "startIndex": 2670, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 2680, + "startIndex": 2677, + }, + { + "$event": "closetag", + "data": [ + "channel", + false, + ], + "endIndex": 2690, + "startIndex": 2681, + }, + { + "$event": "text", + "data": [ + " +", + ], + "endIndex": 2691, + "startIndex": 2691, + }, + { + "$event": "closetag", + "data": [ + "rss", + false, + ], + "endIndex": 2697, + "startIndex": 2692, + }, +] +`; + +exports[`WebWritableStream > SVG 1`] = ` +[ + { + "$event": "processinginstruction", + "data": [ + "!doctype", + "!doctype html", + ], + "endIndex": 14, + "startIndex": 0, + }, + { + "$event": "text", + "data": [ + " +", + ], + "endIndex": 15, + "startIndex": 15, + }, + { + "$event": "opentagname", + "data": [ + "html", + ], + "endIndex": 21, + "startIndex": 16, + }, + { + "$event": "opentag", + "data": [ + "html", + {}, + false, + ], + "endIndex": 21, + "startIndex": 16, + }, + { + "$event": "text", + "data": [ + " +", + ], + "endIndex": 22, + "startIndex": 22, + }, + { + "$event": "opentagname", + "data": [ + "head", + ], + "endIndex": 28, + "startIndex": 23, + }, + { + "$event": "opentag", + "data": [ + "head", + {}, + false, + ], + "endIndex": 28, + "startIndex": 23, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 30, + "startIndex": 29, + }, + { + "$event": "opentagname", + "data": [ + "title", + ], + "endIndex": 37, + "startIndex": 31, + }, + { + "$event": "opentag", + "data": [ + "title", + {}, + false, + ], + "endIndex": 37, + "startIndex": 31, + }, + { + "$event": "text", + "data": [ + "SVG test", + ], + "endIndex": 45, + "startIndex": 38, + }, + { + "$event": "closetag", + "data": [ + "title", + false, + ], + "endIndex": 53, + "startIndex": 46, + }, + { + "$event": "text", + "data": [ + " +", + ], + "endIndex": 54, + "startIndex": 54, + }, + { + "$event": "closetag", + "data": [ + "head", + false, + ], + "endIndex": 61, + "startIndex": 55, + }, + { + "$event": "text", + "data": [ + " +", + ], + "endIndex": 62, + "startIndex": 62, + }, + { + "$event": "opentagname", + "data": [ + "body", + ], + "endIndex": 68, + "startIndex": 63, + }, + { + "$event": "opentag", + "data": [ + "body", + {}, + false, + ], + "endIndex": 68, + "startIndex": 63, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 70, + "startIndex": 69, + }, + { + "$event": "opentagname", + "data": [ + "svg", + ], + "endIndex": 75, + "startIndex": 71, + }, + { + "$event": "attribute", + "data": [ + "version", + "1.1", + """, + ], + "endIndex": 89, + "startIndex": 76, + }, + { + "$event": "attribute", + "data": [ + "xmlns", + "http://www.w3.org/2000/svg", + """, + ], + "endIndex": 124, + "startIndex": 90, + }, + { + "$event": "attribute", + "data": [ + "xmlns:xlink", + "http://www.w3.org/1999/xlink", + """, + ], + "endIndex": 167, + "startIndex": 125, + }, + { + "$event": "opentag", + "data": [ + "svg", + { + "version": "1.1", + "xmlns": "http://www.w3.org/2000/svg", + "xmlns:xlink": "http://www.w3.org/1999/xlink", + }, + false, + ], + "endIndex": 167, + "startIndex": 71, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 170, + "startIndex": 168, + }, + { + "$event": "opentagname", + "data": [ + "title", + ], + "endIndex": 177, + "startIndex": 171, + }, + { + "$event": "opentag", + "data": [ + "title", + {}, + false, + ], + "endIndex": 177, + "startIndex": 171, + }, + { + "$event": "text", + "data": [ + "Test", + ], + "endIndex": 181, + "startIndex": 178, + }, + { + "$event": "closetag", + "data": [ + "title", + false, + ], + "endIndex": 189, + "startIndex": 182, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 192, + "startIndex": 190, + }, + { + "$event": "opentagname", + "data": [ + "animate", + ], + "endIndex": 201, + "startIndex": 193, + }, + { + "$event": "opentag", + "data": [ + "animate", + {}, + false, + ], + "endIndex": 203, + "startIndex": 193, + }, + { + "$event": "closetag", + "data": [ + "animate", + true, + ], + "endIndex": 203, + "startIndex": 193, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 206, + "startIndex": 204, + }, + { + "$event": "opentagname", + "data": [ + "polygon", + ], + "endIndex": 215, + "startIndex": 207, + }, + { + "$event": "opentag", + "data": [ + "polygon", + {}, + false, + ], + "endIndex": 217, + "startIndex": 207, + }, + { + "$event": "closetag", + "data": [ + "polygon", + true, + ], + "endIndex": 217, + "startIndex": 207, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 220, + "startIndex": 218, + }, + { + "$event": "opentagname", + "data": [ + "g", + ], + "endIndex": 223, + "startIndex": 221, + }, + { + "$event": "opentag", + "data": [ + "g", + {}, + false, + ], + "endIndex": 223, + "startIndex": 221, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 227, + "startIndex": 224, + }, + { + "$event": "opentagname", + "data": [ + "path", + ], + "endIndex": 233, + "startIndex": 228, + }, + { + "$event": "opentag", + "data": [ + "path", + {}, + false, + ], + "endIndex": 233, + "startIndex": 228, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 238, + "startIndex": 234, + }, + { + "$event": "opentagname", + "data": [ + "title", + ], + "endIndex": 245, + "startIndex": 239, + }, + { + "$event": "opentag", + "data": [ + "title", + {}, + false, + ], + "endIndex": 245, + "startIndex": 239, + }, + { + "$event": "text", + "data": [ + "x", + ], + "endIndex": 246, + "startIndex": 246, + }, + { + "$event": "closetag", + "data": [ + "title", + false, + ], + "endIndex": 254, + "startIndex": 247, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 259, + "startIndex": 255, + }, + { + "$event": "opentagname", + "data": [ + "animate", + ], + "endIndex": 268, + "startIndex": 260, + }, + { + "$event": "opentag", + "data": [ + "animate", + {}, + false, + ], + "endIndex": 270, + "startIndex": 260, + }, + { + "$event": "closetag", + "data": [ + "animate", + true, + ], + "endIndex": 270, + "startIndex": 260, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 274, + "startIndex": 271, + }, + { + "$event": "closetag", + "data": [ + "path", + false, + ], + "endIndex": 281, + "startIndex": 275, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 284, + "startIndex": 282, + }, + { + "$event": "closetag", + "data": [ + "g", + false, + ], + "endIndex": 288, + "startIndex": 285, + }, + { + "$event": "text", + "data": [ + " + ", + ], + "endIndex": 290, + "startIndex": 289, + }, + { + "$event": "closetag", + "data": [ + "svg", + false, + ], + "endIndex": 296, + "startIndex": 291, + }, + { + "$event": "text", + "data": [ + " +", + ], + "endIndex": 297, + "startIndex": 297, + }, + { + "$event": "closetag", + "data": [ + "body", + false, + ], + "endIndex": 304, + "startIndex": 298, + }, + { + "$event": "text", + "data": [ + " +", + ], + "endIndex": 305, + "startIndex": 305, + }, + { + "$event": "closetag", + "data": [ + "html", + false, + ], + "endIndex": 312, + "startIndex": 306, + }, + { + "$event": "text", + "data": [ + " +", + ], + "endIndex": 313, + "startIndex": 313, + }, +] +`; diff --git a/src/__snapshots__/WritableStream.spec.ts.snap b/src/__snapshots__/WritableStream.spec.ts.snap index 8695e75..fe2473e 100644 --- a/src/__snapshots__/WritableStream.spec.ts.snap +++ b/src/__snapshots__/WritableStream.spec.ts.snap @@ -1,14 +1,14 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`WritableStream Atom feed 1`] = ` +exports[`WritableStream > Atom feed 1`] = ` [ { "$event": "processinginstruction", "data": [ "?xml", - "?xml version="1.0" encoding="utf-8"?", + "?xml version="1.0" encoding="utf-8"", ], - "endIndex": 37, + "endIndex": 36, "startIndex": 0, }, { @@ -18,7 +18,7 @@ exports[`WritableStream Atom feed 1`] = ` ", ], "endIndex": 38, - "startIndex": 38, + "startIndex": 37, }, { "$event": "comment", @@ -58,7 +58,7 @@ exports[`WritableStream Atom feed 1`] = ` "http://www.w3.org/2005/Atom", """, ], - "endIndex": 137, + "endIndex": 138, "startIndex": 103, }, { @@ -185,7 +185,7 @@ exports[`WritableStream Atom feed 1`] = ` "http://example.org/feed/", """, ], - "endIndex": 240, + "endIndex": 241, "startIndex": 210, }, { @@ -195,7 +195,7 @@ exports[`WritableStream Atom feed 1`] = ` "self", """, ], - "endIndex": 251, + "endIndex": 252, "startIndex": 242, }, { @@ -244,7 +244,7 @@ exports[`WritableStream Atom feed 1`] = ` "http://example.org/", """, ], - "endIndex": 288, + "endIndex": 289, "startIndex": 263, }, { @@ -585,7 +585,7 @@ exports[`WritableStream Atom feed 1`] = ` "http://example.org/2003/12/13/atom03", """, ], - "endIndex": 578, + "endIndex": 579, "startIndex": 536, }, { @@ -633,7 +633,7 @@ exports[`WritableStream Atom feed 1`] = ` "alternate", """, ], - "endIndex": 605, + "endIndex": 606, "startIndex": 591, }, { @@ -643,7 +643,7 @@ exports[`WritableStream Atom feed 1`] = ` "text/html", """, ], - "endIndex": 622, + "endIndex": 623, "startIndex": 607, }, { @@ -653,7 +653,7 @@ exports[`WritableStream Atom feed 1`] = ` "http://example.org/2003/12/13/atom03.html", """, ], - "endIndex": 671, + "endIndex": 672, "startIndex": 624, }, { @@ -703,7 +703,7 @@ exports[`WritableStream Atom feed 1`] = ` "edit", """, ], - "endIndex": 692, + "endIndex": 693, "startIndex": 683, }, { @@ -713,7 +713,7 @@ exports[`WritableStream Atom feed 1`] = ` "http://example.org/2003/12/13/atom03/edit", """, ], - "endIndex": 741, + "endIndex": 742, "startIndex": 694, }, { @@ -850,7 +850,7 @@ exports[`WritableStream Atom feed 1`] = ` "html", """, ], - "endIndex": 865, + "endIndex": 866, "startIndex": 855, }, { @@ -995,7 +995,7 @@ exports[`WritableStream Atom feed 1`] = ` ] `; -exports[`WritableStream Attributes 1`] = ` +exports[`WritableStream > Attributes 1`] = ` [ { "$event": "processinginstruction", @@ -1196,7 +1196,7 @@ exports[`WritableStream Attributes 1`] = ` "test0", """, ], - "endIndex": 123, + "endIndex": 124, "startIndex": 114, }, { @@ -1206,7 +1206,7 @@ exports[`WritableStream Attributes 1`] = ` "value0", """, ], - "endIndex": 138, + "endIndex": 139, "startIndex": 125, }, { @@ -1216,7 +1216,7 @@ exports[`WritableStream Attributes 1`] = ` "value1", """, ], - "endIndex": 153, + "endIndex": 154, "startIndex": 140, }, { @@ -1298,7 +1298,7 @@ exports[`WritableStream Attributes 1`] = ` "test1", """, ], - "endIndex": 258, + "endIndex": 259, "startIndex": 249, }, { @@ -1399,7 +1399,7 @@ exports[`WritableStream Attributes 1`] = ` "test2", """, ], - "endIndex": 419, + "endIndex": 420, "startIndex": 410, }, { @@ -1409,7 +1409,7 @@ exports[`WritableStream Attributes 1`] = ` "value4", """, ], - "endIndex": 434, + "endIndex": 435, "startIndex": 421, }, { @@ -1419,7 +1419,7 @@ exports[`WritableStream Attributes 1`] = ` "value5", """, ], - "endIndex": 448, + "endIndex": 449, "startIndex": 435, }, { @@ -1492,7 +1492,7 @@ exports[`WritableStream Attributes 1`] = ` ] `; -exports[`WritableStream Basic html 1`] = ` +exports[`WritableStream > Basic html 1`] = ` [ { "$event": "processinginstruction", @@ -1603,15 +1603,15 @@ exports[`WritableStream Basic html 1`] = ` ] `; -exports[`WritableStream RDF feed 1`] = ` +exports[`WritableStream > RDF feed 1`] = ` [ { "$event": "processinginstruction", "data": [ "?xml", - "?xml version="1.0" encoding="UTF-8"?", + "?xml version="1.0" encoding="UTF-8"", ], - "endIndex": 37, + "endIndex": 36, "startIndex": 0, }, { @@ -1621,7 +1621,7 @@ exports[`WritableStream RDF feed 1`] = ` ", ], "endIndex": 38, - "startIndex": 38, + "startIndex": 37, }, { "$event": "opentagname", @@ -1638,7 +1638,7 @@ exports[`WritableStream RDF feed 1`] = ` "http://www.w3.org/1999/02/22-rdf-syntax-ns#", """, ], - "endIndex": 102, + "endIndex": 103, "startIndex": 48, }, { @@ -1648,7 +1648,7 @@ exports[`WritableStream RDF feed 1`] = ` "http://purl.org/rss/1.0/", """, ], - "endIndex": 135, + "endIndex": 136, "startIndex": 104, }, { @@ -1658,7 +1658,7 @@ exports[`WritableStream RDF feed 1`] = ` "http://purl.org/rss/1.0/modules/event/", """, ], - "endIndex": 185, + "endIndex": 186, "startIndex": 137, }, { @@ -1668,7 +1668,7 @@ exports[`WritableStream RDF feed 1`] = ` "http://purl.org/rss/1.0/modules/content/", """, ], - "endIndex": 242, + "endIndex": 243, "startIndex": 187, }, { @@ -1678,7 +1678,7 @@ exports[`WritableStream RDF feed 1`] = ` "http://purl.org/rss/1.0/modules/taxonomy/", """, ], - "endIndex": 297, + "endIndex": 298, "startIndex": 244, }, { @@ -1688,7 +1688,7 @@ exports[`WritableStream RDF feed 1`] = ` "http://purl.org/dc/elements/1.1/", """, ], - "endIndex": 341, + "endIndex": 342, "startIndex": 299, }, { @@ -1698,7 +1698,7 @@ exports[`WritableStream RDF feed 1`] = ` "http://purl.org/rss/1.0/modules/syndication/", """, ], - "endIndex": 398, + "endIndex": 399, "startIndex": 343, }, { @@ -1708,7 +1708,7 @@ exports[`WritableStream RDF feed 1`] = ` "http://purl.org/dc/terms/", """, ], - "endIndex": 440, + "endIndex": 441, "startIndex": 400, }, { @@ -1718,7 +1718,7 @@ exports[`WritableStream RDF feed 1`] = ` "http://webns.net/mvcb/", """, ], - "endIndex": 477, + "endIndex": 478, "startIndex": 442, }, { @@ -1765,7 +1765,7 @@ exports[`WritableStream RDF feed 1`] = ` "https://github.com/fb55/htmlparser2/", """, ], - "endIndex": 537, + "endIndex": 538, "startIndex": 490, }, { @@ -2422,7 +2422,7 @@ exports[`WritableStream RDF feed 1`] = ` "http://somefakesite/path/to/something.html", """, ], - "endIndex": 1251, + "endIndex": 1252, "startIndex": 1195, }, { @@ -2524,7 +2524,7 @@ exports[`WritableStream RDF feed 1`] = ` "http://somefakesite/path/to/something.html", """, ], - "endIndex": 1352, + "endIndex": 1353, "startIndex": 1299, }, { @@ -3063,7 +3063,7 @@ http://somefakesite/path/to/something.html "http://somefakesite/path/to/something-else.html", """, ], - "endIndex": 1996, + "endIndex": 1997, "startIndex": 1938, }, { @@ -3603,15 +3603,15 @@ This space intentionally left blank ] `; -exports[`WritableStream RSS feed 1`] = ` +exports[`WritableStream > RSS feed 1`] = ` [ { "$event": "processinginstruction", "data": [ "?xml", - "?xml version="1.0"?", + "?xml version="1.0"", ], - "endIndex": 20, + "endIndex": 19, "startIndex": 0, }, { @@ -3621,7 +3621,7 @@ exports[`WritableStream RSS feed 1`] = ` ", ], "endIndex": 21, - "startIndex": 21, + "startIndex": 20, }, { "$event": "comment", @@ -3661,7 +3661,7 @@ exports[`WritableStream RSS feed 1`] = ` "2.0", """, ], - "endIndex": 105, + "endIndex": 106, "startIndex": 93, }, { @@ -5127,7 +5127,7 @@ exports[`WritableStream RSS feed 1`] = ` "200", """, ], - "endIndex": 2601, + "endIndex": 2602, "startIndex": 2590, }, { @@ -5137,7 +5137,7 @@ exports[`WritableStream RSS feed 1`] = ` "image", """, ], - "endIndex": 2616, + "endIndex": 2617, "startIndex": 2603, }, { @@ -5147,7 +5147,7 @@ exports[`WritableStream RSS feed 1`] = ` "https://picsum.photos/200", """, ], - "endIndex": 2648, + "endIndex": 2649, "startIndex": 2618, }, { @@ -5157,7 +5157,7 @@ exports[`WritableStream RSS feed 1`] = ` "200", """, ], - "endIndex": 2660, + "endIndex": 2661, "startIndex": 2650, }, { @@ -5241,7 +5241,7 @@ exports[`WritableStream RSS feed 1`] = ` ] `; -exports[`WritableStream SVG 1`] = ` +exports[`WritableStream > SVG 1`] = ` [ { "$event": "processinginstruction", @@ -5419,7 +5419,7 @@ exports[`WritableStream SVG 1`] = ` "1.1", """, ], - "endIndex": 88, + "endIndex": 89, "startIndex": 76, }, { @@ -5429,7 +5429,7 @@ exports[`WritableStream SVG 1`] = ` "http://www.w3.org/2000/svg", """, ], - "endIndex": 123, + "endIndex": 124, "startIndex": 90, }, { @@ -5439,7 +5439,7 @@ exports[`WritableStream SVG 1`] = ` "http://www.w3.org/1999/xlink", """, ], - "endIndex": 166, + "endIndex": 167, "startIndex": 125, }, { diff --git a/src/__snapshots__/index.spec.ts.snap b/src/__snapshots__/index.spec.ts.snap index f1c1e55..f79f028 100644 --- a/src/__snapshots__/index.spec.ts.snap +++ b/src/__snapshots__/index.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Index createDocumentStream 1`] = ` +exports[`Index > createDocumentStream 1`] = ` Document { "children": [ &This is text, @@ -16,42 +16,7 @@ Document { } `; -exports[`Index createDomStream 1`] = ` -[ - &This is text, - <!-- and comments -->, - <tags />, -] -`; - -exports[`Index parseDOM 1`] = ` -[ - <a - foo="" - > - <b> - <c> - ProcessingInstruction { - "data": "?foo", - "endIndex": null, - "name": "?foo", - "next": Yay!, - "parent": <c> - [Circular] - Yay! - </c>, - "prev": null, - "startIndex": null, - "type": "directive", - } - Yay! - </c> - </b> - </a>, -] -`; - -exports[`Index parseDocument 1`] = ` +exports[`Index > parseDocument 1`] = ` Document { "children": [ <a @@ -59,19 +24,7 @@ Document { > <b> <c> - ProcessingInstruction { - "data": "?foo", - "endIndex": null, - "name": "?foo", - "next": Yay!, - "parent": <c> - [Circular] - Yay! - </c>, - "prev": null, - "startIndex": null, - "type": "directive", - } + <!--?foo--> Yay! </c> </b> @@ -85,3 +38,19 @@ Document { "type": "root", } `; + +exports[`Index > parseDocument in foreign content 1`] = ` +Document { + "children": [ + <svg> + a<b + </svg>, + ], + "endIndex": null, + "next": null, + "parent": null, + "prev": null, + "startIndex": null, + "type": "root", +} +`; diff --git a/src/index.spec.ts b/src/index.spec.ts index f69e293..80e4ccc 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -1,12 +1,12 @@ +import { Element } from "domhandler"; +import { describe, expect, it } from "vitest"; import { - parseDocument, - parseDOM, createDocumentStream, - createDomStream, - DomHandler, DefaultHandler, + DomHandler, + type Parser, + parseDocument, } from "./index.js"; -import { Element } from "domhandler"; // Add an `attributes` prop to the Element for now, to make it possible for Jest to render DOM nodes. Object.defineProperty(Element.prototype, "attributes", { @@ -21,44 +21,32 @@ Object.defineProperty(Element.prototype, "attributes", { }); describe("Index", () => { - test("parseDocument", () => { + it("parseDocument", () => { const dom = parseDocument("<a foo><b><c><?foo>Yay!"); expect(dom).toMatchSnapshot(); }); - test("parseDOM", () => { - const dom = parseDOM("<a foo><b><c><?foo>Yay!"); + it("parseDocument in foreign content", () => { + const dom = parseDocument("<svg><![CDATA[a<b]]></svg>"); expect(dom).toMatchSnapshot(); }); - test("createDocumentStream", (done) => { - const domStream = createDocumentStream((error, dom) => { - expect(error).toBeNull(); - expect(dom).toMatchSnapshot(); + it("createDocumentStream", () => { + let documentStream!: Parser; - done(); + const documentPromise = new Promise((resolve, reject) => { + documentStream = createDocumentStream((error, dom) => + error ? reject(error) : resolve(dom), + ); }); for (const c of "&This is text<!-- and comments --><tags>") { - domStream.write(c); + documentStream.write(c); } - domStream.end(); - }); - - test("createDomStream", (done) => { - const domStream = createDomStream((error, dom) => { - expect(error).toBeNull(); - expect(dom).toMatchSnapshot(); - - done(); - }); - - for (const c of "&This is text<!-- and comments --><tags>") { - domStream.write(c); - } + documentStream.end(); - domStream.end(); + return expect(documentPromise).resolves.toMatchSnapshot(); }); describe("API", () => { diff --git a/src/index.ts b/src/index.ts index 758f234..bfefcb7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,12 +1,13 @@ -import { Parser, ParserOptions } from "./Parser.js"; -export { Parser, type ParserOptions } from "./Parser.js"; +import { Parser, type ParserOptions } from "./Parser.js"; + +export type { Handler, ParserOptions } from "./Parser.js"; +export { Parser } from "./Parser.js"; import { + type Document, DomHandler, - DomHandlerOptions, - ChildNode, - Element, - Document, + type DomHandlerOptions, + type Element, } from "domhandler"; export { @@ -16,13 +17,15 @@ export { type DomHandlerOptions, } from "domhandler"; +/** + * Combined parser and handler options. + */ export type Options = ParserOptions & DomHandlerOptions; // Helper methods /** * Parses the data, returns the resulting document. - * * @param data The data that should be parsed. * @param options Optional options for the parser and DOM handler. */ @@ -31,22 +34,9 @@ export function parseDocument(data: string, options?: Options): Document { new Parser(handler, options).end(data); return handler.root; } -/** - * Parses data, returns an array of the root nodes. - * - * Note that the root nodes still have a `Document` node as their parent. - * Use `parseDocument` to get the `Document` node instead. - * - * @param data The data that should be parsed. - * @param options Optional options for the parser and DOM handler. - * @deprecated Use `parseDocument` instead. - */ -export function parseDOM(data: string, options?: Options): ChildNode[] { - return parseDocument(data, options).children; -} + /** * Creates a parser instance, with an attached DOM handler. - * * @param callback A callback that will be called once parsing has been completed, with the resulting document. * @param options Optional options for the parser and DOM handler. * @param elementCallback An optional callback that will be called every time a tag has been completed inside of the DOM. @@ -54,60 +44,43 @@ export function parseDOM(data: string, options?: Options): ChildNode[] { export function createDocumentStream( callback: (error: Error | null, document: Document) => void, options?: Options, - elementCallback?: (element: Element) => void + elementCallback?: (element: Element) => void, ): Parser { const handler: DomHandler = new DomHandler( (error: Error | null) => callback(error, handler.root), options, - elementCallback + elementCallback, ); return new Parser(handler, options); } -/** - * Creates a parser instance, with an attached DOM handler. - * - * @param callback A callback that will be called once parsing has been completed, with an array of root nodes. - * @param options Optional options for the parser and DOM handler. - * @param elementCallback An optional callback that will be called every time a tag has been completed inside of the DOM. - * @deprecated Use `createDocumentStream` instead. - */ -export function createDomStream( - callback: (error: Error | null, dom: ChildNode[]) => void, - options?: Options, - elementCallback?: (element: Element) => void -): Parser { - const handler = new DomHandler(callback, options, elementCallback); - return new Parser(handler, options); -} - -export { - default as Tokenizer, - type Callbacks as TokenizerCallbacks, -} from "./Tokenizer.js"; /* * All of the following exports exist for backwards-compatibility. * They should probably be removed eventually. */ export * as ElementType from "domelementtype"; +export { + type Callbacks as TokenizerCallbacks, + default as Tokenizer, + QuoteType, +} from "./Tokenizer.js"; -import { getFeed, type Feed } from "domutils"; +import { type Feed, getFeed } from "domutils"; -export { getFeed, type Feed } from "domutils"; +export { type Feed, getFeed } from "domutils"; const parseFeedDefaultOptions = { xmlMode: true }; /** * Parse a feed. - * * @param feed The feed that should be parsed, as a string. * @param options Optionally, options for parsing. When using this, you should set `xmlMode` to `true`. */ export function parseFeed( feed: string, - options: Options = parseFeedDefaultOptions + options: Options = parseFeedDefaultOptions, ): Feed | null { - return getFeed(parseDOM(feed, options)); + return getFeed(parseDocument(feed, options).children); } export * as DomUtils from "domutils"; diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json index 84f1613..0037421 100644 --- a/tsconfig.eslint.json +++ b/tsconfig.eslint.json @@ -1,5 +1,9 @@ { "extends": "./tsconfig.json", + "compilerOptions": { + "rootDir": ".", + "noEmit": true + }, "include": ["src"], "exclude": [] } diff --git a/tsconfig.json b/tsconfig.json index 4893351..a4465b3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,13 +1,13 @@ { "compilerOptions": { /* Basic Options */ - "target": "es5", - "module": "commonjs", - "lib": ["ES2015.Core"], + "target": "es2022", + "module": "nodenext", + "moduleResolution": "nodenext", "declaration": true, "declarationMap": true, "sourceMap": true, - "outDir": "lib", + "outDir": "dist", /* Strict Type-Checking Options */ "strict": true, @@ -16,6 +16,7 @@ "exactOptionalPropertyTypes": true, "forceConsistentCasingInFileNames": true, "isolatedModules": true, + "isolatedDeclarations": true, "noFallthroughCasesInSwitch": true, "noImplicitOverride": true, "noImplicitReturns": true, @@ -24,8 +25,6 @@ "noUnusedParameters": true, /* Module Resolution Options */ - "esModuleInterop": true, - "moduleResolution": "node", "resolveJsonModule": true }, "include": ["src"], |
