diff --git a/.devcontainer.json b/.devcontainer.json new file mode 100644 index 000000000..55d59b674 --- /dev/null +++ b/.devcontainer.json @@ -0,0 +1,3 @@ +{ + "image": "ghcr.io/ai/devcontainer:latest" +} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 04fb6b3a8..b78a78dfa 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -3,42 +3,39 @@ on: push: tags: - '*' -permissions: - contents: write jobs: + publish: + runs-on: ubuntu-latest + permissions: + contents: read + id-token: write + steps: + - name: Checkout the repository + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + - name: Clean npm package + uses: ai/clean-npm-project@29219e611c2da08a07cb0a6a1b965c162e5940a9 # v0.3.0 + with: + clean-docs: true + - name: Install Node.js + uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 + with: + node-version: 26 + package-manager-cache: false + - name: Publish npm package + run: npm stage publish + working-directory: cleaned-project/ release: - name: Release On Tag - if: startsWith(github.ref, 'refs/tags/') runs-on: ubuntu-latest + permissions: + contents: write steps: - name: Checkout the repository - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - name: Extract the changelog - id: changelog - run: | - TAG_NAME=${GITHUB_REF/refs\/tags\//} - READ_SECTION=false - CHANGELOG="" - while IFS= read -r line; do - if [[ "$line" =~ ^#+\ +(.*) ]]; then - if [[ "${BASH_REMATCH[1]}" == "$TAG_NAME" ]]; then - READ_SECTION=true - elif [[ "$READ_SECTION" == true ]]; then - break - fi - elif [[ "$READ_SECTION" == true ]]; then - CHANGELOG+="$line"$'\n' - fi - done < "CHANGELOG.md" - CHANGELOG=$(echo "$CHANGELOG" | awk '/./ {$1=$1;print}') - echo "changelog_content<> $GITHUB_OUTPUT - echo "$CHANGELOG" >> $GITHUB_OUTPUT - echo "EOF" >> $GITHUB_OUTPUT - - name: Create the release - if: steps.changelog.outputs.changelog_content != '' - uses: softprops/action-gh-release@b4309332981a82ec1c5618f44dd2e27cc8bfbfda # v3.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: - name: ${{ github.ref_name }} - body: '${{ steps.changelog.outputs.changelog_content }}' - draft: false - prerelease: false + persist-credentials: false + - name: Copy CHANGELOG.md to Releases + uses: ai/copy-changelog-to-release@a6dc825c34575add2da2060796794f7b84894628 # v0.2.0 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 489acdd31..1cb5efa83 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,73 +12,73 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout the repository - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - name: Install pnpm - uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: - version: 10 - - name: Install Node.js - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + persist-credentials: false + - name: Install Node.js & pnpm + uses: pnpm/setup@5d160c5bc68a09337ad0d5654e237e03253b5879 # v1.0.0 with: - node-version: 25 - cache: pnpm + version: 11 + runtime: node@26 - name: Install dependencies - run: pnpm install --ignore-scripts + run: pnpm ci - name: Run tests run: pnpm test short: runs-on: ubuntu-latest strategy: matrix: - node-version: + node: - 24 - 22 - - 20 - - 18 - name: Node.js ${{ matrix.node-version }} Quick + name: Node.js ${{ matrix.node }} Quick steps: - name: Checkout the repository - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - name: Install pnpm - uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: - version: 10 - - name: Install Node.js ${{ matrix.node-version }} - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + persist-credentials: false + - name: Install Node.js & pnpm + uses: pnpm/setup@5d160c5bc68a09337ad0d5654e237e03253b5879 # v1.0.0 with: - node-version: ${{ matrix.node-version }} - cache: pnpm + version: 11 + runtime: node@${{ matrix.node }} - name: Install dependencies - run: pnpm install --ignore-scripts + run: pnpm ci + - name: Install dependencies + run: pnpm ci --ignore-scripts - name: Run unit tests run: pnpm run unit old: runs-on: ubuntu-latest strategy: matrix: - node-version: + node: + - 20 + - 18 - 16 - 14 - 12 - 10 - name: Node.js ${{ matrix.node-version }} Quick + name: Node.js ${{ matrix.node }} Quick steps: - name: Checkout the repository - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false - name: Install pnpm uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 with: version: 3 env: ACTIONS_ALLOW_UNSECURE_COMMANDS: true - - name: Install Node.js ${{ matrix.node-version }} - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + - name: Install Node.js ${{ matrix.node }} + uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: - node-version: ${{ matrix.node-version }} + node-version: ${{ matrix.node }} - name: Install dependencies run: pnpm install --ignore-scripts - name: Downgrade TypeScript - run: pnpm install typescript@4 + run: pnpm install typescript@4 --ignore-scripts - name: Run unit tests run: pnpm run old windows: @@ -86,15 +86,17 @@ jobs: name: Windows Quick steps: - name: Checkout the repository - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false - name: Install pnpm - uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 + uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6.0.9 with: - version: 10 + version: 11 - name: Install Node.js LTS - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: - node-version: 24 + node-version: 26 cache: pnpm - name: Install dependencies run: pnpm install --ignore-scripts diff --git a/.npmignore b/.npmignore index 96b41ad96..9439f8b9d 100644 --- a/.npmignore +++ b/.npmignore @@ -4,4 +4,4 @@ test/ docs/ tsconfig.json eslint.config.mjs -patches +pnpm-workspace.yaml diff --git a/CHANGELOG.md b/CHANGELOG.md index aee09ae08..5bb679560 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,67 @@ This project adheres to [Semantic Versioning](https://semver.org/). +## 8.5.23 + +- Do not load source map without `opts.from` for security reasons. + +## 8.5.22 + +- Fixed custom property losing semicolon before a comment (by @sarathfrancis90). + +## 8.5.21 + +- Fixed childless at-rule losing semicolon before comment (by @sarathfrancis90). +- Fixed docs (by @isker). + +## 8.5.20 + +- Fixed missing space if `AtRule#params` is set after (by @sarathfrancis90). +- Fixed mixing AST error on warnings (by @MahinAnowar). + +## 8.5.19 + +- Fixed cleaning `before` for new nodes inserted to `Root` (by @MahinAnowar). + +## 8.5.18 + +- Restricted loading previous source maps file to the `opts.from` folder for security reasons (use `unsafeMap: true` to disable the check). + +## 8.5.17 + +- Fixed `Maximum call stack size exceeded` error. +- Fixed Prototype hijacking for `postcss.fromJSON()`. +- Fixed `Input#origin()` for unmapped end position (by @chatman-media). + +## 8.5.16 + +- Fixed `Input#origin()` position (by @mizdra). +- Fixed `raws` after rehydrating a JSON AST (by @sarathfrancis90). +- Fixed putting parent-less node in `nodes` of new node (by @MahinAnowar). +- Fixed computing `offset` in `positionBy()` (by @greymoth-jp). +- Fixed `rangeBy()` on `index: 0` (by @sarathfrancis90). + +## 8.5.15 + +- Fixed declaration parsing performance (by @homanp). + +## 8.5.14 + +- Fixed custom syntax regression (by @43081j). + +## 8.5.13 + +- Fixed `postcss-scss` commend regression. + +## 8.5.12 + +- Fixed reading any file via user-generated CSS. +- Added `opts.unsafeMap` to disable checks. + +## 8.5.11 + +- Fixed nested brackets parsing performance (by @offset). + ## 8.5.10 - Fixed XSS via unescaped `` in non-bundler cases (by @TharVid). diff --git a/README.md b/README.md index 08a75c1bc..ed38a4ce0 100644 --- a/README.md +++ b/README.md @@ -13,8 +13,7 @@ and JetBrains. The [Autoprefixer] and [Stylelint] PostCSS plugins are some o --- -  Built by -Evil Martians, go-to agency for developer tools. +  PostCSS is built by - Sponsored by Tailwind CSS       - - Sponsored by ThemeIsle +
+
+ + + + Sponsored by Atlas Cloud + + +
+ +Atlas Cloud is a full-modal AI inference platform that gives developers a single AI API to access video generation, image generation, and LLM APIs. Instead of managing multiple vendor integrations, you connect once and get unified access to 300+ curated models across all modalities. + +Check out Atlas Cloud's new coding plan promotion for more budget-friendly API access. ## Plugins diff --git a/docs/architecture.md b/docs/architecture.md index 906dcd11b..2537a11b8 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -33,11 +33,7 @@ Before diving deeper into the development of PostCSS let's briefly describe what ### Workflow -This is a high-level overview of the whole PostCSS workflow - -workflow - -As you can see from the diagram above, PostCSS architecture is pretty straightforward but some parts of it could be misunderstood. +This is a [high-level overview](https://commons.wikimedia.org/wiki/File:PostCSS_scheme.svg) of the whole PostCSS workflow. You can see a part called _Parser_, this construct will be described in details later on, just for now think about it as a structure that can understand your CSS like syntax and create an object representation of it. diff --git a/docs/plugins.md b/docs/plugins.md index c66428282..32eeae1f2 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -219,6 +219,8 @@ See also [`oldie`] plugins pack. - [`postcss-nested`] unwraps nested rules. - [`postcss-nested-props`] unwraps nested properties. - [`postcss-nested-vars`] supports nested Sass-style variables. +- [`postcss-nth-nested`] adds a `:nth-nested()` pseudo-class for selecting + elements by nesting depth. - [`postcss-pseudo-class-any-button`] adds `:any-button` pseudo-class for targeting all button elements. - [`postcss-pseudo-class-enter`] transforms `:enter` into `:hover` and `:focus`. @@ -744,6 +746,7 @@ See also plugins in modular minifier [`cssnano`]. [`postcss-merge-rules`]: https://github.com/ben-eb/postcss-merge-rules [`postcss-mq-optimize`]: https://github.com/panec/postcss-mq-optimize [`postcss-nested-vars`]: https://github.com/jedmao/postcss-nested-vars +[`postcss-nth-nested`]: https://github.com/georgeadamson/postcss-nth-nested [`postcss-remove-root`]: https://github.com/cbracco/postcss-remove-root [`postcss-simple-grid`]: https://github.com/admdh/postcss-simple-grid [`postcss-simple-trig`]: https://github.com/Rplus/postcss-simple-trig diff --git a/docs/writing-a-plugin.md b/docs/writing-a-plugin.md index 589dddb95..f500f73f5 100644 --- a/docs/writing-a-plugin.md +++ b/docs/writing-a-plugin.md @@ -157,7 +157,7 @@ you can use quick search: Declaration: { color: decl => { // All `color` declarations - } + }, '*': decl => { // All declarations } @@ -316,7 +316,7 @@ Second argument also have `result` object to add warnings: ```js Declaration: { - bad: (decl, { result }) { + bad: (decl, { result }) => { decl.warn(result, 'Deprecated property bad') } } @@ -328,7 +328,7 @@ when this file changes: ```js AtRule: { - import: (atRule, { result }) { + import: (atRule, { result }) => { const importedFile = parseImport(atRule) result.messages.push({ type: 'dependency', diff --git a/eslint.config.mjs b/eslint.config.mjs index cd623151d..2c00ccce7 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -55,5 +55,13 @@ export default [ 'no-console': 'off', 'no-unused-expressions': 'off' } + }, + { + files: ['test/fuzzing/*'], + rules: { + 'n/no-missing-require': 'off', + 'no-unused-expressions': 'off', + 'no-void': 'off' + } } ] diff --git a/lib/container.js b/lib/container.js index edb07cc2f..cd3b65b6f 100644 --- a/lib/container.js +++ b/lib/container.js @@ -8,18 +8,25 @@ let { isClean, my } = require('./symbols') let AtRule, parse, Root, Rule function cleanSource(nodes) { - return nodes.map(i => { - if (i.nodes) i.nodes = cleanSource(i.nodes) - delete i.source - return i - }) + let stack = nodes.slice() + while (stack.length > 0) { + let node = stack.pop() + delete node.source + if (node.nodes) { + node.nodes = node.nodes.slice() + for (let i of node.nodes) stack.push(i) + } + } + return nodes.slice() } function markTreeDirty(node) { - node[isClean] = false - if (node.proxyOf.nodes) { - for (let i of node.proxyOf.nodes) { - markTreeDirty(i) + let stack = [node] + while (stack.length > 0) { + let next = stack.pop() + next[isClean] = false + if (next.proxyOf.nodes) { + for (let i of next.proxyOf.nodes) stack.push(i) } } } @@ -47,9 +54,18 @@ class Container extends Node { } cleanRaws(keepBetween) { - super.cleanRaws(keepBetween) - if (this.nodes) { - for (let node of this.nodes) node.cleanRaws(keepBetween) + let stack = [this] + while (stack.length > 0) { + let node = stack.pop() + if (node !== this && node.cleanRaws !== Container.prototype.cleanRaws) { + // Subclass with own logic; let it handle its subtree + node.cleanRaws(keepBetween) + continue + } + Node.prototype.cleanRaws.call(node, keepBetween) + if (node.nodes) { + for (let child of node.nodes) stack.push(child) + } } } @@ -309,19 +325,48 @@ class Container extends Node { } walk(callback) { - return this.each((child, i) => { + if (!this.proxyOf.nodes) return undefined + + // An explicit stack instead of recursive `each()` calls to survive + // deeply nested trees. Each frame keeps a live `indexes` slot, so + // insertion and removal during the walk behave like `each()`: the + // slot stays at the current child until its subtree is finished. + let stack = [{ iterator: this.getIterator(), node: this.proxyOf }] + + while (stack.length > 0) { + let { iterator, node } = stack[stack.length - 1] + let index = node.indexes[iterator] + + if (index >= node.proxyOf.nodes.length) { + delete node.indexes[iterator] + stack.pop() + let parent = stack[stack.length - 1] + // Finish the parent’s step for the child subtree we just left + if (parent) parent.node.indexes[parent.iterator] += 1 + continue + } + + let child = node.proxyOf.nodes[index] let result try { - result = callback(child, i) + result = callback(child, index) } catch (e) { throw child.addToError(e) } - if (result !== false && child.walk) { - result = child.walk(callback) + if (result === false) { + for (let opened of stack) { + delete opened.node.indexes[opened.iterator] + } + return false + } + if (child.walk && child.proxyOf.nodes) { + stack.push({ iterator: child.getIterator(), node: child }) + } else { + node.indexes[iterator] += 1 } + } - return result - }) + return undefined } walkAtRules(name, callback) { @@ -424,24 +469,26 @@ Container.default = Container /* c8 ignore start */ Container.rebuild = node => { - if (node.type === 'atrule') { - Object.setPrototypeOf(node, AtRule.prototype) - } else if (node.type === 'rule') { - Object.setPrototypeOf(node, Rule.prototype) - } else if (node.type === 'decl') { - Object.setPrototypeOf(node, Declaration.prototype) - } else if (node.type === 'comment') { - Object.setPrototypeOf(node, Comment.prototype) - } else if (node.type === 'root') { - Object.setPrototypeOf(node, Root.prototype) - } + let stack = [node] + while (stack.length > 0) { + let next = stack.pop() + if (next.type === 'atrule') { + Object.setPrototypeOf(next, AtRule.prototype) + } else if (next.type === 'rule') { + Object.setPrototypeOf(next, Rule.prototype) + } else if (next.type === 'decl') { + Object.setPrototypeOf(next, Declaration.prototype) + } else if (next.type === 'comment') { + Object.setPrototypeOf(next, Comment.prototype) + } else if (next.type === 'root') { + Object.setPrototypeOf(next, Root.prototype) + } - node[my] = true + next[my] = true - if (node.nodes) { - node.nodes.forEach(child => { - Container.rebuild(child) - }) + if (next.nodes) { + for (let child of next.nodes) stack.push(child) + } } } /* c8 ignore stop */ diff --git a/lib/fromJSON.js b/lib/fromJSON.js index c9ac1a86c..c1a9509b4 100644 --- a/lib/fromJSON.js +++ b/lib/fromJSON.js @@ -8,26 +8,24 @@ let PreviousMap = require('./previous-map') let Root = require('./root') let Rule = require('./rule') -function fromJSON(json, inputs) { - if (Array.isArray(json)) return json.map(n => fromJSON(n)) - - let { inputs: ownInputs, ...defaults } = json - if (ownInputs) { - inputs = [] - for (let input of ownInputs) { - let inputHydrated = { ...input, __proto__: Input.prototype } - if (inputHydrated.map) { - inputHydrated.map = { - ...inputHydrated.map, - __proto__: PreviousMap.prototype - } +function hydrateInputs(json, inputs) { + if (!json.inputs) return inputs + return json.inputs.map(input => { + let inputHydrated = { ...input, __proto__: Input.prototype } + if (inputHydrated.map) { + inputHydrated.map = { + ...inputHydrated.map, + __proto__: PreviousMap.prototype } - inputs.push(inputHydrated) } - } - if (defaults.nodes) { - defaults.nodes = json.nodes.map(n => fromJSON(n, inputs)) - } + return inputHydrated + }) +} + +function constructNode(json, inputs, children) { + let defaults = { ...json } + delete defaults.inputs + delete defaults.nodes if (defaults.source) { let { inputId, ...source } = defaults.source defaults.source = source @@ -35,19 +33,74 @@ function fromJSON(json, inputs) { defaults.source.input = inputs[inputId] } } + + let node if (defaults.type === 'root') { - return new Root(defaults) + node = new Root(defaults) } else if (defaults.type === 'decl') { - return new Declaration(defaults) + node = new Declaration(defaults) } else if (defaults.type === 'rule') { - return new Rule(defaults) + node = new Rule(defaults) } else if (defaults.type === 'comment') { - return new Comment(defaults) + node = new Comment(defaults) } else if (defaults.type === 'atrule') { - return new AtRule(defaults) + node = new AtRule(defaults) } else { throw new Error('Unknown node type: ' + json.type) } + + // Rehydrated children are attached after construction. Passing them + // through the container constructor would re-run insertion spacing + // normalization and overwrite each child's own `raws.before`. + if (children) { + node.nodes = children + for (let child of children) child.parent = node + } + + return node +} + +function fromJSON(json, inputs) { + if (Array.isArray(json)) return json.map(n => fromJSON(n)) + + // An explicit stack instead of recursive calls to survive deeply + // nested trees. Children are rehydrated before their parent node + // is constructed. + let result + let stack = [ + { childIndex: 0, children: [], inputs: hydrateInputs(json, inputs), json } + ] + + while (stack.length > 0) { + let frame = stack[stack.length - 1] + let jsonNodes = frame.json.nodes + + if (jsonNodes && frame.childIndex < jsonNodes.length) { + let childJson = jsonNodes[frame.childIndex] + frame.childIndex += 1 + stack.push({ + childIndex: 0, + children: [], + inputs: hydrateInputs(childJson, frame.inputs), + json: childJson + }) + continue + } + + stack.pop() + let node = constructNode( + frame.json, + frame.inputs, + jsonNodes ? frame.children : undefined + ) + if (stack.length > 0) { + stack[stack.length - 1].children.push(node) + } else { + result = node + } + } + + return result } module.exports = fromJSON diff --git a/lib/input.js b/lib/input.js index 1dab92836..defe395fc 100644 --- a/lib/input.js +++ b/lib/input.js @@ -206,12 +206,21 @@ class Input { if (!this.map) return false let consumer = this.map.consumer() - let from = consumer.originalPositionFor({ column, line }) + let from = consumer.originalPositionFor({ column: column - 1, line }) if (!from.source) return false let to if (typeof endLine === 'number') { - to = consumer.originalPositionFor({ column: endColumn, line: endLine }) + let toPosition = consumer.originalPositionFor({ + column: endColumn - 1, + line: endLine + }) + // The source map may not have a mapping that covers the end position + // (`originalPositionFor()` then returns `null` for `line`/`column` + // instead of omitting them). Treat that the same as not requesting + // an end position at all, so `endLine`/`endColumn` stay a consistent + // `undefined` pair instead of a mix of `null` and a bogus number. + if (toPosition.source) to = toPosition } let fromUrl @@ -226,8 +235,8 @@ class Input { } let result = { - column: from.column, - endColumn: to && to.column, + column: from.column + 1, + endColumn: to && to.column + 1, endLine: to && to.line, line: from.line, url: fromUrl.toString() diff --git a/lib/lazy-result.js b/lib/lazy-result.js index 1ea52b87a..01b40736a 100644 --- a/lib/lazy-result.js +++ b/lib/lazy-result.js @@ -97,8 +97,14 @@ function toStack(node) { } function cleanMarks(node) { - node[isClean] = false - if (node.nodes) node.nodes.forEach(i => cleanMarks(i)) + let stack = [node] + while (stack.length > 0) { + let next = stack.pop() + next[isClean] = false + if (next.nodes) { + for (let i of next.nodes) stack.push(i) + } + } return node } @@ -378,6 +384,19 @@ class LazyResult { if (opts.stringifier) str = opts.stringifier if (str.stringify) str = str.stringify + let rootSource = this.result.root.source + if ( + opts.map === undefined && + !(rootSource && rootSource.input && rootSource.input.map) + ) { + let result = '' + str(this.result.root, i => { + result += i + }) + this.result.css = result + return this.result + } + let map = new MapGenerator(str, this.result.root, this.result.opts) let data = map.generate() this.result.css = data[0] @@ -516,21 +535,57 @@ class LazyResult { } walkSync(node) { + // An explicit stack like in async `visitTick()` to survive deeply + // nested trees. Unlike `visitTick()`, nodes are marked clean only + // on entering, so a node dirtied by its own visitors is revisited + // on the next pass. node[isClean] = true - let events = getEvents(node) - for (let event of events) { - if (event === CHILDREN) { - if (node.nodes) { - node.each(child => { - if (!child[isClean]) this.walkSync(child) - }) + let stack = [{ eventIndex: 0, events: getEvents(node), iterator: 0, node }] + + while (stack.length > 0) { + let visit = stack[stack.length - 1] + let visitNode = visit.node + + if (visit.iterator !== 0) { + let iterator = visit.iterator + let child + let descended = false + while ((child = visitNode.nodes[visitNode.indexes[iterator]])) { + visitNode.indexes[iterator] += 1 + if (!child[isClean]) { + child[isClean] = true + stack.push({ + eventIndex: 0, + events: getEvents(child), + iterator: 0, + node: child + }) + descended = true + break + } } - } else { - let visitors = this.listeners[event] - if (visitors) { - if (this.visitSync(visitors, node.toProxy())) return + if (descended) continue + visit.iterator = 0 + delete visitNode.indexes[iterator] + } + + if (visit.eventIndex < visit.events.length) { + let event = visit.events[visit.eventIndex] + visit.eventIndex += 1 + if (event === CHILDREN) { + if (visitNode.nodes && visitNode.nodes.length) { + visit.iterator = visitNode.getIterator() + } + } else { + let visitors = this.listeners[event] + if (visitors) { + if (this.visitSync(visitors, visitNode.toProxy())) stack.pop() + } } + continue } + + stack.pop() } } diff --git a/lib/node.d.ts b/lib/node.d.ts index ecd86e231..e93ce5bae 100644 --- a/lib/node.d.ts +++ b/lib/node.d.ts @@ -31,12 +31,12 @@ declare namespace Node { export interface Position { /** - * Source line in file. In contrast to `offset` it starts from 1. + * Source column in file. It starts from 1. */ column: number /** - * Source column in file. + * Source line in file. It starts from 1. */ line: number diff --git a/lib/node.js b/lib/node.js index b403b7136..a298d3656 100644 --- a/lib/node.js +++ b/lib/node.js @@ -7,25 +7,41 @@ let { isClean, my } = require('./symbols') function cloneNode(obj, parent) { let cloned = new obj.constructor() - - for (let i in obj) { - if (!Object.prototype.hasOwnProperty.call(obj, i)) { - /* c8 ignore next 2 */ - continue - } - if (i === 'proxyCache') continue - let value = obj[i] - let type = typeof value - - if (i === 'parent' && type === 'object') { - if (parent) cloned[i] = parent - } else if (i === 'source') { - cloned[i] = value - } else if (Array.isArray(value)) { - cloned[i] = value.map(j => cloneNode(j, cloned)) - } else { - if (type === 'object' && value !== null) value = cloneNode(value) - cloned[i] = value + // An explicit stack instead of recursive calls to survive deeply + // nested trees. Each entry is [source, its clone, clone's parent]. + let stack = [[obj, cloned, parent]] + + while (stack.length > 0) { + let [source, target, targetParent] = stack.pop() + for (let i in source) { + if (!Object.prototype.hasOwnProperty.call(source, i)) { + /* c8 ignore next 2 */ + continue + } + if (i === 'proxyCache') continue + let value = source[i] + let type = typeof value + + if (i === 'parent' && type === 'object') { + if (targetParent) target[i] = targetParent + } else if (i === 'source') { + target[i] = value + } else if (Array.isArray(value)) { + let children = [] + target[i] = children + for (let j of value) { + let childClone = new j.constructor() + children.push(childClone) + stack.push([j, childClone, target]) + } + } else { + if (type === 'object' && value !== null) { + let valueClone = new value.constructor() + stack.push([value, valueClone, undefined]) + value = valueClone + } + target[i] = value + } } } @@ -69,11 +85,15 @@ class Node { this[isClean] = false this[my] = true - for (let name in defaults) { + for (let name of Object.keys(defaults)) { + if (name === '__proto__') continue if (name === 'nodes') { this.nodes = [] for (let node of defaults[name]) { - if (typeof node.clone === 'function') { + // Clone only nodes that already belong to another tree, so passing a + // freshly created (parent-less) node adopts that instance instead of + // a copy and keeps the caller's reference usable. See #1987. + if (typeof node.clone === 'function' && node.parent) { this.append(node.clone()) } else { this.append(node) @@ -206,14 +226,18 @@ class Node { } positionBy(opts = {}) { - let pos = this.source.start + let inputString = + 'document' in this.source.input + ? this.source.input.document + : this.source.input.css + let pos = { + column: this.source.start.column, + line: this.source.start.line, + offset: sourceOffset(inputString, this.source.start) + } if (opts.index) { pos = this.positionInside(opts.index) } else if (opts.word) { - let inputString = - 'document' in this.source.input - ? this.source.input.document - : this.source.input.css let stringRepresentation = inputString.slice( sourceOffset(inputString, this.source.start), sourceOffset(inputString, this.source.end) @@ -298,7 +322,7 @@ class Node { line: opts.start.line, offset: sourceOffset(inputString, opts.start) } - } else if (opts.index) { + } else if (typeof opts.index === 'number') { start = this.positionInside(opts.index) } @@ -310,7 +334,7 @@ class Node { } } else if (typeof opts.endIndex === 'number') { end = this.positionInside(opts.endIndex) - } else if (opts.index) { + } else if (typeof opts.index === 'number') { end = this.positionInside(opts.index + 1) } } @@ -374,47 +398,68 @@ class Node { } toJSON(_, inputs) { - let fixed = {} let emitInputs = inputs == null inputs = inputs || new Map() - let inputsNextIndex = 0 - - for (let name in this) { - if (!Object.prototype.hasOwnProperty.call(this, name)) { - /* c8 ignore next 2 */ - continue - } - if (name === 'parent' || name === 'proxyCache') continue - let value = this[name] - if (Array.isArray(value)) { - fixed[name] = value.map(i => { - if (typeof i === 'object' && i.toJSON) { - return i.toJSON(null, inputs) + // A worklist instead of recursive `toJSON()` calls to survive deeply + // nested trees. Each entry converts one node and writes the result + // into the already converted parent by [holder, key]. + let holderOfRoot = [] + let queue = [[this, holderOfRoot, 0]] + + for (let step = 0; step < queue.length; step++) { + let [node, holder, key] = queue[step] + let fixed = {} + holder[key] = fixed + + for (let name in node) { + if (!Object.prototype.hasOwnProperty.call(node, name)) { + /* c8 ignore next 2 */ + continue + } + if (name === 'parent' || name === 'proxyCache') continue + let value = node[name] + + if (Array.isArray(value)) { + let fixedArray = [] + fixed[name] = fixedArray + for (let i = 0; i < value.length; i++) { + let item = value[i] + if (typeof item === 'object' && item.toJSON) { + if (item.toJSON === Node.prototype.toJSON) { + queue.push([item, fixedArray, i]) + } else { + fixedArray[i] = item.toJSON(null, inputs) + } + } else { + fixedArray[i] = item + } + } + } else if (typeof value === 'object' && value.toJSON) { + if (value.toJSON === Node.prototype.toJSON) { + queue.push([value, fixed, name]) } else { - return i + fixed[name] = value.toJSON(null, inputs) } - }) - } else if (typeof value === 'object' && value.toJSON) { - fixed[name] = value.toJSON(null, inputs) - } else if (name === 'source') { - if (value == null) continue - let inputId = inputs.get(value.input) - if (inputId == null) { - inputId = inputsNextIndex - inputs.set(value.input, inputsNextIndex) - inputsNextIndex++ - } - fixed[name] = { - end: value.end, - inputId, - start: value.start + } else if (name === 'source') { + if (value == null) continue + let inputId = inputs.get(value.input) + if (inputId == null) { + inputId = inputs.size + inputs.set(value.input, inputId) + } + fixed[name] = { + end: value.end, + inputId, + start: value.start + } + } else { + fixed[name] = value } - } else { - fixed[name] = value } } + let fixed = holderOfRoot[0] if (emitInputs) { fixed.inputs = [...inputs.keys()].map(input => input.toJSON()) } diff --git a/lib/parser.js b/lib/parser.js index b29ff5b2d..2a16584c7 100644 --- a/lib/parser.js +++ b/lib/parser.js @@ -20,6 +20,12 @@ function findLastWithPosition(tokens) { } } +function tokensToString(tokens, from, to) { + let result = '' + for (let i = from; i < to; i++) result += tokens[i][1] + return result +} + class Parser { constructor(input) { this.input = input @@ -132,9 +138,10 @@ class Parser { if (founded === 2) break } } - // If the token is a word, e.g. `!important`, `red` or any other valid property's value. - // Then we need to return the colon after that word token. [3] is the "end" colon of that word. - // And because we need it after that one we do +1 to get the next one. + // If the token is a word, e.g. `!important`, `red` or any other valid + // property's value. Then we need to return the colon after that word + // token. [3] is the "end" colon of that word. And because we need it + // after that one we do +1 to get the next one. throw this.input.error( 'Missed semicolon', token[0] === 'word' ? token[3] + 1 : token[2] @@ -207,50 +214,50 @@ class Parser { ) node.source.end.offset++ - while (tokens[0][0] !== 'word') { - if (tokens.length === 1) this.unknownWord(tokens) - node.raws.before += tokens.shift()[1] + let start = 0 + while (tokens[start][0] !== 'word') { + if (start === tokens.length - 1) this.unknownWord([tokens[start]]) + start++ } - node.source.start = this.getPosition(tokens[0][2]) + node.raws.before += tokensToString(tokens, 0, start) + node.source.start = this.getPosition(tokens[start][2]) - node.prop = '' - while (tokens.length) { - let type = tokens[0][0] + let propStart = start + while (start < tokens.length) { + let type = tokens[start][0] if (type === ':' || type === 'space' || type === 'comment') { break } - node.prop += tokens.shift()[1] + start++ } + node.prop = tokensToString(tokens, propStart, start) - node.raws.between = '' - + let betweenStart = start let token - while (tokens.length) { - token = tokens.shift() - - if (token[0] === ':') { - node.raws.between += token[1] - break - } else { - if (token[0] === 'word' && /\w/.test(token[1])) { - this.unknownWord([token]) - } - node.raws.between += token[1] + while (start < tokens.length) { + token = tokens[start] + start++ + if (token[0] === ':') break + if (token[0] === 'word' && /\w/.test(token[1])) { + this.unknownWord([token]) } } + node.raws.between = tokensToString(tokens, betweenStart, start) if (node.prop[0] === '_' || node.prop[0] === '*') { node.raws.before += node.prop[0] node.prop = node.prop.slice(1) } - let firstSpaces = [] - let next - while (tokens.length) { - next = tokens[0][0] + let firstSpacesStart = start + while (start < tokens.length) { + let next = tokens[start][0] if (next !== 'space' && next !== 'comment') break - firstSpaces.push(tokens.shift()) + start++ } + let firstSpaces = tokens.slice(firstSpacesStart, start) + + tokens = tokens.slice(start) this.precheckMissedSemicolon(tokens) diff --git a/lib/postcss.d.ts b/lib/postcss.d.ts index 72e3b51b1..41bf40f9b 100644 --- a/lib/postcss.d.ts +++ b/lib/postcss.d.ts @@ -229,7 +229,7 @@ declare namespace postcss { export interface Parser { ( css: { toString(): string } | string, - opts?: Pick + opts?: Pick ): RootNode } @@ -351,6 +351,14 @@ declare namespace postcss { * to generate correct source maps. */ to?: string + + /** + * Disable source map file protections. + * + * By default source map is limited only for `.map` files + * in the `from` folder. + */ + unsafeMap?: boolean } export type Postcss = typeof postcss diff --git a/lib/previous-map.js b/lib/previous-map.js index c6827ffc4..e1af3fdaf 100644 --- a/lib/previous-map.js +++ b/lib/previous-map.js @@ -1,7 +1,7 @@ 'use strict' let { existsSync, readFileSync } = require('fs') -let { dirname, join } = require('path') +let { dirname, isAbsolute, join, relative, sep } = require('path') let { SourceMapConsumer, SourceMapGenerator } = require('source-map-js') function fromBase64(str) { @@ -16,6 +16,7 @@ function fromBase64(str) { class PreviousMap { constructor(css, opts) { if (opts.map === false) return + if (opts.unsafeMap) this.unsafeMap = true this.loadAnnotation(css) this.inline = this.startWith(this.annotation, 'data:') @@ -30,7 +31,7 @@ class PreviousMap { consumer() { if (!this.consumerCache) { - this.consumerCache = new SourceMapConsumer(this.text) + this.consumerCache = new SourceMapConsumer(this.json || this.text) } return this.consumerCache } @@ -83,7 +84,16 @@ class PreviousMap { } } - loadFile(path) { + loadFile(path, cssFile, trusted) { + if (!trusted && !this.unsafeMap) { + if (!/\.map$/i.test(path)) return undefined + if (!cssFile) return undefined + + let rel = relative(dirname(cssFile), path) + if (rel === '..' || rel.startsWith('..' + sep) || isAbsolute(rel)) { + return undefined + } + } this.root = dirname(path) if (existsSync(path)) { this.mapFile = path @@ -100,7 +110,7 @@ class PreviousMap { } else if (typeof prev === 'function') { let prevPath = prev(file) if (prevPath) { - let map = this.loadFile(prevPath) + let map = this.loadFile(prevPath, file, true) if (!map) { throw new Error( 'Unable to load previous source map: ' + prevPath.toString() @@ -124,7 +134,16 @@ class PreviousMap { } else if (this.annotation) { let map = this.annotation if (file) map = join(dirname(file), map) - return this.loadFile(map) + let unknown = this.loadFile(map, file, false) + if (unknown) { + try { + /* c8 ignore next 4 */ + this.json = JSON.parse(unknown.replace(/^\)]}'[^\n]*\n/, '')) + } catch { + return undefined + } + } + return unknown } } diff --git a/lib/processor.js b/lib/processor.js index 5eda6c410..f6ae71f9f 100644 --- a/lib/processor.js +++ b/lib/processor.js @@ -7,7 +7,7 @@ let Root = require('./root') class Processor { constructor(plugins = []) { - this.version = '8.5.10' + this.version = '8.5.23' this.plugins = this.normalize(plugins) } diff --git a/lib/root.js b/lib/root.js index ea574edca..bc8547f39 100644 --- a/lib/root.js +++ b/lib/root.js @@ -12,6 +12,19 @@ class Root extends Container { } normalize(child, sample, type) { + let keepBefore = new Set() + for (let node of Array.isArray(child) ? child : [child]) { + if ( + node && + typeof node === 'object' && + !node.parent && + node.raws && + typeof node.raws.before !== 'undefined' + ) { + keepBefore.add(node.raws) + } + } + let nodes = super.normalize(child) if (sample) { @@ -23,7 +36,9 @@ class Root extends Container { } } else if (this.first !== sample) { for (let node of nodes) { - node.raws.before = sample.raws.before + if (!keepBefore.has(node.raws)) { + node.raws.before = sample.raws.before + } } } } diff --git a/lib/stringifier.js b/lib/stringifier.js index 012fa622d..2c74ce763 100644 --- a/lib/stringifier.js +++ b/lib/stringifier.js @@ -6,6 +6,10 @@ const STYLE_TAG = /(<)(\/?style\b)/gi const COMMENT_OPEN = /(<)(!--)/g +// Characters that end an at-rule name, mirroring RE_AT_END in the tokenizer. +// Params starting with anything else need a space to stay separate tokens. +const AT_NAME_END = /[\t\n\f\r "#'()/;[\\\]{}]/ + function escapeHTMLInCSS(str) { if (typeof str !== 'string') return str if (!str.includes('<')) return str @@ -31,26 +35,89 @@ function capitalize(str) { return str[0].toUpperCase() + str.slice(1) } +function atruleStart(str, node) { + let name = '@' + node.name + let params = node.params ? str.rawValue(node, 'params') : '' + let afterName = node.raws.afterName + + if (typeof afterName === 'undefined') { + afterName = params ? ' ' : '' + } else if (afterName === '' && params && !AT_NAME_END.test(params[0])) { + afterName = ' ' + } + + return name + afterName + params +} + +function pushBody(str, stack, node) { + let nodes = node.nodes + let last = nodes.length - 1 + while (last > 0) { + if (nodes[last].type !== 'comment') break + last -= 1 + } + + let semicolon = str.raw(node, 'semicolon') + let isDocument = node.type === 'document' + for (let i = nodes.length - 1; i >= 0; i--) { + let child = nodes[i] + let childSemicolon = last !== i || semicolon + // A childless at-rule or a custom property declaration that still has + // following siblings must be terminated. Without the semicolon those + // trailing comments are folded into the at-rule's prelude or the custom + // property's value and disappear when the output is re-parsed. + if ( + !childSemicolon && + i < nodes.length - 1 && + ((child.type === 'atrule' && !child.nodes) || + (child.type === 'decl' && child.prop.startsWith('--'))) + ) { + childSemicolon = true + } + stack.push({ + document: isDocument, + node: child, + semicolon: childSemicolon + }) + } +} + +function pushBlock(str, stack, node, start) { + let between = str.raw(node, 'between', 'beforeOpen') + str.builder(escapeHTMLInCSS(start + between) + '{', node, 'start') + + let hasNodes = node.nodes && node.nodes.length + let close = () => { + let after = hasNodes + ? str.raw(node, 'after') + : str.raw(node, 'after', 'emptyBody') + if (after) str.builder(escapeHTMLInCSS(after)) + str.builder('}', node, 'end') + if (node.type === 'rule' && node.raws.ownSemicolon) { + str.builder(escapeHTMLInCSS(node.raws.ownSemicolon), node, 'end') + } + } + + if (hasNodes) { + stack.push(close) + pushBody(str, stack, node) + } else { + close() + } +} + class Stringifier { constructor(builder) { this.builder = builder } atrule(node, semicolon) { - let name = '@' + node.name - let params = node.params ? this.rawValue(node, 'params') : '' - - if (typeof node.raws.afterName !== 'undefined') { - name += node.raws.afterName - } else if (params) { - name += ' ' - } - + let start = atruleStart(this, node) if (node.nodes) { - this.block(node, name + params) + this.block(node, start) } else { let end = (node.raws.between || '') + (semicolon ? ';' : '') - this.builder(escapeHTMLInCSS(name + params + end), node) + this.builder(escapeHTMLInCSS(start + end), node) } } @@ -100,19 +167,38 @@ class Stringifier { } body(node) { - let last = node.nodes.length - 1 - while (last > 0) { - if (node.nodes[last].type !== 'comment') break - last -= 1 - } + // Rules and at-rules are expanded into an explicit stack instead of + // recursive `stringify()` calls to survive deeply nested trees. + // If a subclass changes the traversal methods, its children go + // through `stringify()` to keep the override in charge. + let proto = Stringifier.prototype + let expandable = ['atrule', 'block', 'body', 'rule', 'stringify'].every( + method => this[method] === proto[method] + ) + + let stack = [] + pushBody(this, stack, node) + + while (stack.length > 0) { + let entry = stack.pop() + if (typeof entry === 'function') { + entry() + continue + } - let semicolon = this.raw(node, 'semicolon') - let isDocument = node.type === 'document' - for (let i = 0; i < node.nodes.length; i++) { - let child = node.nodes[i] + let child = entry.node let before = this.raw(child, 'before') - if (before) this.builder(isDocument ? before : escapeHTMLInCSS(before)) - this.stringify(child, last !== i || semicolon) + if (before) { + this.builder(entry.document ? before : escapeHTMLInCSS(before)) + } + + if (expandable && child.type === 'rule') { + pushBlock(this, stack, child, this.rawValue(child, 'selector')) + } else if (expandable && child.type === 'atrule' && child.nodes) { + pushBlock(this, stack, child, atruleStart(this, child)) + } else { + this.stringify(child, entry.semicolon) + } } } @@ -123,11 +209,13 @@ class Stringifier { } decl(node, semicolon) { + let raws = node.raws let between = this.raw(node, 'between', 'colon') + let string = node.prop + between + this.rawValue(node, 'value') if (node.important) { - string += node.raws.important || ' !important' + string += raws.important || ' !important' } if (semicolon) string += ';' @@ -167,9 +255,9 @@ class Stringifier { // Detect style by other nodes let root = node.root() - if (!root.rawCache) root.rawCache = {} - if (typeof root.rawCache[detect] !== 'undefined') { - return root.rawCache[detect] + let cache = root.rawCache || (root.rawCache = {}) + if (typeof cache[detect] !== 'undefined') { + return cache[detect] } if (detect === 'before' || detect === 'after') { @@ -188,7 +276,7 @@ class Stringifier { if (typeof value === 'undefined') value = DEFAULT_RAW[detect] - root.rawCache[detect] = value + cache[detect] = value return value } diff --git a/lib/tokenize.js b/lib/tokenize.js index 1d412845c..229095dcb 100644 --- a/lib/tokenize.js +++ b/lib/tokenize.js @@ -36,6 +36,7 @@ module.exports = function tokenizer(input, options = {}) { let pos = 0 let buffer = [] let returned = [] + let lastBadParen = -1 function position() { return pos @@ -127,11 +128,14 @@ module.exports = function tokenizer(input, options = {}) { currentToken = ['brackets', css.slice(pos, next + 1), pos, next] pos = next + } else if (pos <= lastBadParen) { + currentToken = ['(', '(', pos] } else { next = css.indexOf(')', pos + 1) content = css.slice(pos, next + 1) if (next === -1 || RE_BAD_BRACKET.test(content)) { + lastBadParen = next === -1 ? length : next currentToken = ['(', '(', pos] } else { currentToken = ['brackets', content, pos, next] diff --git a/lib/warning.js b/lib/warning.js index 3a3d79c93..a4edbd31c 100644 --- a/lib/warning.js +++ b/lib/warning.js @@ -1,11 +1,21 @@ 'use strict' +let Container = require('./container') +let { my } = require('./symbols') + class Warning { constructor(text, opts = {}) { this.type = 'warning' this.text = text if (opts.node && opts.node.source) { + if (!opts.node[my]) { + // The node comes from another PostCSS copy in node_modules, so it does + // not have this copy’s methods. Container#normalize() rebuilds such + // nodes on insert, but a node passed straight to Result#warn() never + // goes through it. + Container.rebuild(opts.node) + } let range = opts.node.rangeBy(opts) this.line = range.start.line this.column = range.start.column diff --git a/package.json b/package.json index 4495fbd93..e1ecd14f2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "postcss", - "version": "8.5.10", + "version": "8.5.23", "description": "Tool for transforming styles with JS plugins", "keywords": [ "css", @@ -89,25 +89,23 @@ "old": "node --require ./test/old-node.js ./node_modules/uvu/bin.js -r module test \"\\.test\\.(ts|js)$\"" }, "dependencies": { - "nanoid": "^3.3.11", + "nanoid": "^3.3.16", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, "devDependencies": { "@logux/eslint-config": "^57.1.0", - "@logux/oxc-configs": "^0.3.3", + "@logux/oxc-configs": "^1.0.0", "@size-limit/preset-small-lib": "^12.1.0", - "@types/node": "^25.6.0", - "actions-up": "^1.13.0", - "c8": "^11.0.0", + "@types/node": "^26.1.1", + "actions-up": "^1.16.0", + "c8": "^12.0.0", "check-dts": "^0.9.0", - "clean-publish": "^6.0.5", "concat-with-sourcemaps": "^1.1.0", - "eslint": "^10.2.0", - "multiocular": "^0.8.2", + "eslint": "^10.7.0", + "multiocular": "^0.8.4", "nanodelay": "^1.0.8", - "nanospy": "^1.0.0", - "oxfmt": "^0.45.0", + "nanospy": "^2.0.2", "postcss-parser-tests": "^8.9.0", "simple-git-hooks": "^2.13.1", "size-limit": "^12.1.0", @@ -130,7 +128,7 @@ "size-limit": [ { "path": "lib/postcss.js", - "limit": "16 KB" + "limit": "16.5 KB" } ], "c8": { @@ -145,18 +143,6 @@ "engines": { "node": "^10 || ^12 || >=14" }, - "pnpm": { - "patchedDependencies": { - "yargs@17.7.2": "patches/yargs@17.7.2.patch" - }, - "ignoredBuiltDependencies": [ - "esbuild", - "unrs-resolver" - ], - "onlyBuiltDependencies": [ - "simple-git-hooks" - ] - }, "clean-publish": { "cleanDocs": true } diff --git a/patches/yargs@17.7.2.patch b/patches/yargs@17.7.2.patch deleted file mode 100644 index a26866587..000000000 --- a/patches/yargs@17.7.2.patch +++ /dev/null @@ -1,25 +0,0 @@ -diff --git a/browser.d.ts b/browser.d.ts -deleted file mode 100644 -index 21f3fc69190b574ab8456514d3da1972afa53973..0000000000000000000000000000000000000000 -diff --git a/package.json b/package.json -index 389cc6b064b5f888e7f9d718f5440feabdce57ad..c1ae265542ad386fa2214914b0186ade81dd6ee2 100644 ---- a/package.json -+++ b/package.json -@@ -20,13 +20,10 @@ - "import": "./browser.mjs", - "types": "./browser.d.ts" - }, -- "./yargs": [ -- { -- "import": "./yargs.mjs", -- "require": "./yargs" -- }, -- "./yargs" -- ] -+ "./yargs": { -+ "require": "./index.cjs", -+ "import": "./yargs.mjs" -+ } - }, - "type": "module", - "module": "./index.mjs", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4df501630..f9bbc8436 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,18 +4,13 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false -patchedDependencies: - yargs@17.7.2: - hash: 34652056801bf0e586b0f2ab1a4f464b352d4d3ce0f5b2d51040d171c31843c3 - path: patches/yargs@17.7.2.patch - importers: .: dependencies: nanoid: - specifier: ^3.3.11 - version: 3.3.11 + specifier: ^3.3.16 + version: 3.3.16 picocolors: specifier: ^1.1.1 version: 1.1.1 @@ -25,46 +20,40 @@ importers: devDependencies: '@logux/eslint-config': specifier: ^57.1.0 - version: 57.1.0(@typescript-eslint/utils@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3) + version: 57.1.0(@typescript-eslint/utils@8.64.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3))(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) '@logux/oxc-configs': - specifier: ^0.3.3 - version: 0.3.3(oxlint-tsgolint@0.18.1)(oxlint@1.58.0(oxlint-tsgolint@0.18.1))(typescript@5.9.3) + specifier: ^1.0.0 + version: 1.0.0(oxlint-tsgolint@0.18.1)(oxlint@1.58.0(oxlint-tsgolint@0.18.1))(typescript@5.9.3) '@size-limit/preset-small-lib': specifier: ^12.1.0 - version: 12.1.0(size-limit@12.1.0(jiti@2.6.1)) + version: 12.1.0(size-limit@12.1.0) '@types/node': - specifier: ^25.6.0 - version: 25.6.0 + specifier: ^26.1.1 + version: 26.1.1 actions-up: - specifier: ^1.13.0 - version: 1.13.0 + specifier: ^1.16.0 + version: 1.16.0 c8: - specifier: ^11.0.0 - version: 11.0.0 + specifier: ^12.0.0 + version: 12.0.0 check-dts: specifier: ^0.9.0 version: 0.9.0(typescript@5.9.3) - clean-publish: - specifier: ^6.0.5 - version: 6.0.5 concat-with-sourcemaps: specifier: ^1.1.0 version: 1.1.0 eslint: - specifier: ^10.2.0 - version: 10.2.0(jiti@2.6.1) + specifier: ^10.7.0 + version: 10.7.0(supports-color@7.2.0) multiocular: - specifier: ^0.8.2 - version: 0.8.2 + specifier: ^0.8.4 + version: 0.8.4(@logux/core@0.10.0) nanodelay: specifier: ^1.0.8 version: 1.0.8 nanospy: - specifier: ^1.0.0 - version: 1.0.0 - oxfmt: - specifier: ^0.45.0 - version: 0.45.0 + specifier: ^2.0.2 + version: 2.0.2 postcss-parser-tests: specifier: ^8.9.0 version: 8.9.0 @@ -73,13 +62,13 @@ importers: version: 2.13.1 size-limit: specifier: ^12.1.0 - version: 12.1.0(jiti@2.6.1) + version: 12.1.0 strip-ansi: specifier: ^6.0.1 version: 6.0.1 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@25.6.0)(typescript@5.9.3) + version: 10.9.2(@types/node@26.1.1)(typescript@5.9.3) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -97,167 +86,167 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@emnapi/core@1.9.2': - resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==} + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} - '@emnapi/runtime@1.9.2': - resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==} + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} - '@esbuild/aix-ppc64@0.28.0': - resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} + '@esbuild/aix-ppc64@0.28.1': + resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.28.0': - resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==} + '@esbuild/android-arm64@0.28.1': + resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.28.0': - resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==} + '@esbuild/android-arm@0.28.1': + resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.28.0': - resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==} + '@esbuild/android-x64@0.28.1': + resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.28.0': - resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==} + '@esbuild/darwin-arm64@0.28.1': + resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.28.0': - resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==} + '@esbuild/darwin-x64@0.28.1': + resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.28.0': - resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==} + '@esbuild/freebsd-arm64@0.28.1': + resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.28.0': - resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==} + '@esbuild/freebsd-x64@0.28.1': + resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.28.0': - resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==} + '@esbuild/linux-arm64@0.28.1': + resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.28.0': - resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==} + '@esbuild/linux-arm@0.28.1': + resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.28.0': - resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==} + '@esbuild/linux-ia32@0.28.1': + resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.28.0': - resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==} + '@esbuild/linux-loong64@0.28.1': + resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.28.0': - resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==} + '@esbuild/linux-mips64el@0.28.1': + resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.28.0': - resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==} + '@esbuild/linux-ppc64@0.28.1': + resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.28.0': - resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==} + '@esbuild/linux-riscv64@0.28.1': + resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.28.0': - resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==} + '@esbuild/linux-s390x@0.28.1': + resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.28.0': - resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==} + '@esbuild/linux-x64@0.28.1': + resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.28.0': - resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==} + '@esbuild/netbsd-arm64@0.28.1': + resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.28.0': - resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==} + '@esbuild/netbsd-x64@0.28.1': + resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.28.0': - resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==} + '@esbuild/openbsd-arm64@0.28.1': + resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.28.0': - resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==} + '@esbuild/openbsd-x64@0.28.1': + resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.28.0': - resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==} + '@esbuild/openharmony-arm64@0.28.1': + resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.28.0': - resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==} + '@esbuild/sunos-x64@0.28.1': + resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.28.0': - resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==} + '@esbuild/win32-arm64@0.28.1': + resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.28.0': - resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==} + '@esbuild/win32-ia32@0.28.1': + resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.28.0': - resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==} + '@esbuild/win32-x64@0.28.1': + resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -276,32 +265,36 @@ packages: resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/config-helpers@0.5.5': - resolution: {integrity: sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==} + '@eslint/config-helpers@0.6.0': + resolution: {integrity: sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/core@1.2.1': resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/eslintrc@3.3.5': - resolution: {integrity: sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==} + '@eslint/eslintrc@3.3.6': + resolution: {integrity: sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@3.0.5': resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/plugin-kit@0.7.1': - resolution: {integrity: sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==} + '@eslint/plugin-kit@0.7.2': + resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@humanfs/core@0.19.1': - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} engines: {node: '>=18.18.0'} - '@humanfs/node@0.16.7': - resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': @@ -355,20 +348,23 @@ packages: svelte-eslint-parser: optional: true - '@logux/oxc-configs@0.3.3': - resolution: {integrity: sha512-kgo1ZwY3yJpaoZwooOULwWgVn/4WJ1blYOnRXzLe5Oe9oOfcB70nj1ALSN2qUrYOdY0FQQVbCQRkDGoqeevwig==} + '@logux/oxc-configs@1.0.0': + resolution: {integrity: sha512-BHn8L2r2HT/Kp508jiTX+gTC3Rij2Sua7rjLOjweNzkWkQjzAbJdXwtRYI4DeBkrvdF7PmI8A6EvcCqHtDFNEQ==} engines: {node: '>=22.0.0'} peerDependencies: oxlint: ^1.57.0 oxlint-tsgolint: '>=0.18.1' - typescript: ^6.0.2 + typescript: ^6.0.2 || ^7.0.0 '@logux/server@0.14.0': resolution: {integrity: sha512-a7KRD30U252cfIekBGktEIRuwFRT7vOPZXkEsD05DwApsPi70iRnFaHEgMde8tZu+jJUuTDN/xMgabtjzHzXaQ==} engines: {node: ^20.0.0 || >=22.0.0} - '@napi-rs/wasm-runtime@0.2.12': - resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + '@napi-rs/wasm-runtime@1.1.6': + resolution: {integrity: sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -382,128 +378,6 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@oxfmt/binding-android-arm-eabi@0.45.0': - resolution: {integrity: sha512-A/UMxFob1fefCuMeGxQBulGfFE38g2Gm23ynr3u6b+b7fY7/ajGbNsa3ikMIkGMLJW/TRoQaMoP1kME7S+815w==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [android] - - '@oxfmt/binding-android-arm64@0.45.0': - resolution: {integrity: sha512-L63z4uZmHjgvvqvMJD7mwff8aSBkM0+X4uFr6l6U5t6+Qc9DCLVZWIunJ7Gm4fn4zHPdSq6FFQnhu9yqqobxIg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [android] - - '@oxfmt/binding-darwin-arm64@0.45.0': - resolution: {integrity: sha512-UV34dd623FzqT+outIGndsCA/RBB+qgB3XVQhgmmJ9PJwa37NzPC9qzgKeOhPKxVk2HW+JKldQrVL54zs4Noww==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [darwin] - - '@oxfmt/binding-darwin-x64@0.45.0': - resolution: {integrity: sha512-pMNJv0CMa1pDefVPeNbuQxibh8ITpWDFEhMC/IBB9Zlu76EbgzYwrzI4Cb11mqX2+rIYN70UTrh3z06TM59ptQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [darwin] - - '@oxfmt/binding-freebsd-x64@0.45.0': - resolution: {integrity: sha512-xTcRoxbbo61sW2+ZRPeH+vp/o9G8gkdhiVumFU+TpneiPm14c79l6GFlxPXlCE9bNWikigbsrvJw46zCVAQFfg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [freebsd] - - '@oxfmt/binding-linux-arm-gnueabihf@0.45.0': - resolution: {integrity: sha512-hWL8Hdni+3U1mPFx1UtWeGp3tNb6EhBAUHRMbKUxVkOp3WwoJbpVO2bfUVbS4PfpledviXXNHSTl1veTa6FhkQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [linux] - - '@oxfmt/binding-linux-arm-musleabihf@0.45.0': - resolution: {integrity: sha512-6Blt/0OBT7vvfQpqYuYbpbFLPqSiaYpEJzUUWhinPEuADypDbtV1+LdjM0vYBNGPvnj85ex7lTerEX6JGcPt9w==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [linux] - - '@oxfmt/binding-linux-arm64-gnu@0.45.0': - resolution: {integrity: sha512-jLjoLfe+hGfjhA8hNBSdw85yCA8ePKq7ME4T+g6P9caQXvmt6IhE2X7iVjnVdkmYUWEzZrxlh4p6RkDmAMJY/A==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@oxfmt/binding-linux-arm64-musl@0.45.0': - resolution: {integrity: sha512-XQKXZIKYJC3GQJ8FnD3iMntpw69Wd9kDDK/Xt79p6xnFYlGGxSNv2vIBvRTDg5CKByWFWWZLCRDOXoP/m6YN4g==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@oxfmt/binding-linux-ppc64-gnu@0.45.0': - resolution: {integrity: sha512-+g5RiG+xOkdrCWkKodv407nTvMq4vYM18Uox2MhZBm/YoqFxxJpWKsloskFFG5NU13HGPw1wzYjjOVcyd9moCA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [ppc64] - os: [linux] - libc: [glibc] - - '@oxfmt/binding-linux-riscv64-gnu@0.45.0': - resolution: {integrity: sha512-V7dXKoSyEbWAkkSF4JJNtF+NJZDmJoSarSoP30WCsB3X636Rehd3CvxBj49FIJxEBFWhvcUjGSHVeU8Erck1bQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [riscv64] - os: [linux] - libc: [glibc] - - '@oxfmt/binding-linux-riscv64-musl@0.45.0': - resolution: {integrity: sha512-Vdelft1sAEYojVGgcODEFXSWYQYlIvoyIGWebKCuUibd1tvS1TjTx413xG2ZLuHpYj45CkN/ztMLMX6jrgqpgg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [riscv64] - os: [linux] - libc: [musl] - - '@oxfmt/binding-linux-s390x-gnu@0.45.0': - resolution: {integrity: sha512-RR7xKgNpqwENnK0aYCGYg0JycY2n93J0reNjHyes+I9Gq52dH95x+CBlnlAQHCPfz6FGnKA9HirgUl14WO6o7w==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [s390x] - os: [linux] - libc: [glibc] - - '@oxfmt/binding-linux-x64-gnu@0.45.0': - resolution: {integrity: sha512-U/QQ0+BQNSHxjuXR/utvXnQ50Vu5kUuqEomZvQ1/3mhgbBiMc2WU9q5kZ5WwLp3gnFIx9ibkveoRSe2EZubkqg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@oxfmt/binding-linux-x64-musl@0.45.0': - resolution: {integrity: sha512-o5TLOUCF0RWQjsIS06yVC+kFgp092/yLe6qBGSUvtnmTVw9gxjpdQSXc3VN5Cnive4K11HNstEZF8ROKHfDFSw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - libc: [musl] - - '@oxfmt/binding-openharmony-arm64@0.45.0': - resolution: {integrity: sha512-RnGcV3HgPuOjsGx/k9oyRNKmOp+NBLGzZTdPDYbc19r7NGeYPplnUU/BfU35bX2Y/O4ejvHxcfkvW2WoYL/gsg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [openharmony] - - '@oxfmt/binding-win32-arm64-msvc@0.45.0': - resolution: {integrity: sha512-v3Vj7iKKsUFwt9w5hsqIIoErKVoENC6LoqfDlteOQ5QMDCXihlqLoxpmviUhXnNncg4zV6U9BPwlBbwa+qm4wg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [win32] - - '@oxfmt/binding-win32-ia32-msvc@0.45.0': - resolution: {integrity: sha512-N8yotPBX6ph0H3toF4AEpdCeVPrdcSetj+8eGiZGsrLsng3bs/Q5HPu4bbSxip5GBPx5hGbGHrZwH4+rcrjhHA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [ia32] - os: [win32] - - '@oxfmt/binding-win32-x64-msvc@0.45.0': - resolution: {integrity: sha512-w5MMTRCK1dpQeRA+HHqXQXyN33DlG/N2LOYxJmaT4fJjcmZrbNnqw7SmIk7I2/a2493PPLZ+2E/Ar6t2iKVMug==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [win32] - '@oxlint-tsgolint/darwin-arm64@0.18.1': resolution: {integrity: sha512-CxSd15ZwHn70UJFTXVvy76bZ9zwI097cVyjvUFmYRJwvkQF3VnrTf2oe1gomUacErksvtqLgn9OKvZhLMYwvog==} cpu: [arm64] @@ -656,9 +530,6 @@ packages: cpu: [x64] os: [win32] - '@package-json/types@0.0.12': - resolution: {integrity: sha512-uu43FGU34B5VM9mCNjXCwLaGHYjXdNincqKLaraaCW+7S2+SmiBg1Nv8bPnmschrIfZmfKNY9f3fC376MRrObw==} - '@profoundlogic/hogan@3.0.4': resolution: {integrity: sha512-pmNVGuooS30Mm7YbZd5T7E5zYVO6D5Ct91sn4T39mUvMUc3sCGridcnhAufL1/Bz2QzAtzEn0agNrdk3+5yWzw==} hasBin: true @@ -692,14 +563,14 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - '@tybys/wasm-util@0.10.1': - resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@tybys/wasm-util@0.10.3': + resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} '@types/esrecurse@4.3.1': resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} '@types/istanbul-lib-coverage@2.0.6': resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} @@ -707,8 +578,8 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@25.6.0': - resolution: {integrity: sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==} + '@types/node@26.1.1': + resolution: {integrity: sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw==} '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} @@ -716,165 +587,182 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@typescript-eslint/eslint-plugin@8.58.2': - resolution: {integrity: sha512-aC2qc5thQahutKjP+cl8cgN9DWe3ZUqVko30CMSZHnFEHyhOYoZSzkGtAI2mcwZ38xeImDucI4dnqsHiOYuuCw==} + '@typescript-eslint/eslint-plugin@8.64.0': + resolution: {integrity: sha512-CGvQPBxN3wZLu6Rz2kFUpZeoCm78xUic92ck39KPePkO1NPOwjCqdQnm5Q87tpWw9vcBvW8XLrDXjH9PWYtJ3Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.58.2 + '@typescript-eslint/parser': ^8.64.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.58.2': - resolution: {integrity: sha512-/Zb/xaIDfxeJnvishjGdcR4jmr7S+bda8PKNhRGdljDM+elXhlvN0FyPSsMnLmJUrVG9aPO6dof80wjMawsASg==} + '@typescript-eslint/parser@8.64.0': + resolution: {integrity: sha512-KA0OshtlcCCXmbfqyZkM5pV3/WNraJf7DkJRLpyrmwPtud57H5BDX7C3k0LPSPxpprfRL+cJDGabF10mvNCoCw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.58.2': - resolution: {integrity: sha512-Cq6UfpZZk15+r87BkIh5rDpi38W4b+Sjnb8wQCPPDDweS/LRCFjCyViEbzHk5Ck3f2QDfgmlxqSa7S7clDtlfg==} + '@typescript-eslint/project-service@8.64.0': + resolution: {integrity: sha512-tk4WpOJ6IEbGrVHaNmM0YRrwAD3exZlIK3iadQNAxh4YKk6jvUQ4ecq18n+v7+meh+cJ3j+D8nbk8sRKhlwLQg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.58.2': - resolution: {integrity: sha512-SgmyvDPexWETQek+qzZnrG6844IaO02UVyOLhI4wpo82dpZJY9+6YZCKAMFzXb7qhx37mFK1QcPQ18tud+vo6Q==} + '@typescript-eslint/scope-manager@8.64.0': + resolution: {integrity: sha512-CXEaFdYXjSTgKhisNkwCcJwTP8Pl+fmRrEQrri4nm3vU743bALrxzLmq7fHG/7e6a5xO0lDYeURpZmBuhHk54w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.58.2': - resolution: {integrity: sha512-3SR+RukipDvkkKp/d0jP0dyzuls3DbGmwDpVEc5wqk5f38KFThakqAAO0XMirWAE+kT00oTauTbzMFGPoAzB0A==} + '@typescript-eslint/tsconfig-utils@8.64.0': + resolution: {integrity: sha512-2yo8rRNKuzbVWQp5kslhANqZ2uDAeROQHBRZNPu8JDsHmeFNj/XJJhX/FhNUWmkHHvoNsKa6+tHJiig87EzsQw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.58.2': - resolution: {integrity: sha512-Z7EloNR/B389FvabdGeTo2XMs4W9TjtPiO9DAsmT0yom0bwlPyRjkJ1uCdW1DvrrrYP50AJZ9Xc3sByZA9+dcg==} + '@typescript-eslint/type-utils@8.64.0': + resolution: {integrity: sha512-XWG4Fmmv/6SvyS9nH8jWrKs6terwJvE8cyRt1CzYYqzp9OrPhCT4cMc/f7C6RZCwG+qMmiffJS1/qJP8G1URtg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.58.2': - resolution: {integrity: sha512-9TukXyATBQf/Jq9AMQXfvurk+G5R2MwfqQGDR2GzGz28HvY/lXNKGhkY+6IOubwcquikWk5cjlgPvD2uAA7htQ==} + '@typescript-eslint/types@8.64.0': + resolution: {integrity: sha512-qjhfuTfLXjA4IOzXvz0rTjT01BqEiIgPoUeMwiEjnaHKJMTNo8rH5pYW1a2L/0Dnux2fPC85AeyJoWaGa8WxTA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.58.2': - resolution: {integrity: sha512-ELGuoofuhhoCvNbQjFFiobFcGgcDCEm0ThWdmO4Z0UzLqPXS3KFvnEZ+SHewwOYHjM09tkzOWXNTv9u6Gqtyuw==} + '@typescript-eslint/typescript-estree@8.64.0': + resolution: {integrity: sha512-Pztpsn1aCE1oWDvDEfUk31nngvvF7vUB5SwHFEaZIFpvw7WJtqUHHL4plBZDA9HfWJJjL13BdG0YrJInTUvoVA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.58.2': - resolution: {integrity: sha512-QZfjHNEzPY8+l0+fIXMvuQ2sJlplB4zgDZvA+NmvZsZv3EQwOcc1DuIU1VJUTWZ/RKouBMhDyNaBMx4sWvrzRA==} + '@typescript-eslint/utils@8.64.0': + resolution: {integrity: sha512-aJUGVB3+U0htrrCjoA8qukw8cm8fNCGAxK/tVoS70k8aeb7DETKeFozRiVFIwEeN9WJLsjaP3ph8I60tY2XZoQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.58.2': - resolution: {integrity: sha512-f1WO2Lx8a9t8DARmcWAUPJbu0G20bJlj8L4z72K00TMeJAoyLr/tHhI/pzYBLrR4dXWkcxO1cWYZEOX8DKHTqA==} + '@typescript-eslint/visitor-keys@8.64.0': + resolution: {integrity: sha512-mrtuL8Nsn6gi2H4mo5KMTp823M+3Q19Ew/i+Zlikq20tIMm99C3Ez0dCmkWWnxut20esQvTg8aUSEhMcAOXhEw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@unrs/resolver-binding-android-arm-eabi@1.11.1': - resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} + '@unrs/resolver-binding-android-arm-eabi@1.12.2': + resolution: {integrity: sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==} cpu: [arm] os: [android] - '@unrs/resolver-binding-android-arm64@1.11.1': - resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} + '@unrs/resolver-binding-android-arm64@1.12.2': + resolution: {integrity: sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ==} cpu: [arm64] os: [android] - '@unrs/resolver-binding-darwin-arm64@1.11.1': - resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} + '@unrs/resolver-binding-darwin-arm64@1.12.2': + resolution: {integrity: sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w==} cpu: [arm64] os: [darwin] - '@unrs/resolver-binding-darwin-x64@1.11.1': - resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} + '@unrs/resolver-binding-darwin-x64@1.12.2': + resolution: {integrity: sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA==} cpu: [x64] os: [darwin] - '@unrs/resolver-binding-freebsd-x64@1.11.1': - resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} + '@unrs/resolver-binding-freebsd-x64@1.12.2': + resolution: {integrity: sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg==} cpu: [x64] os: [freebsd] - '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': - resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} + '@unrs/resolver-binding-linux-arm-gnueabihf@1.12.2': + resolution: {integrity: sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A==} cpu: [arm] os: [linux] - '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': - resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} + '@unrs/resolver-binding-linux-arm-musleabihf@1.12.2': + resolution: {integrity: sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g==} cpu: [arm] os: [linux] - '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': - resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} + '@unrs/resolver-binding-linux-arm64-gnu@1.12.2': + resolution: {integrity: sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==} cpu: [arm64] os: [linux] libc: [glibc] - '@unrs/resolver-binding-linux-arm64-musl@1.11.1': - resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} + '@unrs/resolver-binding-linux-arm64-musl@1.12.2': + resolution: {integrity: sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==} cpu: [arm64] os: [linux] libc: [musl] - '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': - resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} + '@unrs/resolver-binding-linux-loong64-gnu@1.12.2': + resolution: {integrity: sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-loong64-musl@1.12.2': + resolution: {integrity: sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@unrs/resolver-binding-linux-ppc64-gnu@1.12.2': + resolution: {integrity: sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==} cpu: [ppc64] os: [linux] libc: [glibc] - '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': - resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} + '@unrs/resolver-binding-linux-riscv64-gnu@1.12.2': + resolution: {integrity: sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==} cpu: [riscv64] os: [linux] libc: [glibc] - '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': - resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} + '@unrs/resolver-binding-linux-riscv64-musl@1.12.2': + resolution: {integrity: sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==} cpu: [riscv64] os: [linux] libc: [musl] - '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': - resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} + '@unrs/resolver-binding-linux-s390x-gnu@1.12.2': + resolution: {integrity: sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==} cpu: [s390x] os: [linux] libc: [glibc] - '@unrs/resolver-binding-linux-x64-gnu@1.11.1': - resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} + '@unrs/resolver-binding-linux-x64-gnu@1.12.2': + resolution: {integrity: sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==} cpu: [x64] os: [linux] libc: [glibc] - '@unrs/resolver-binding-linux-x64-musl@1.11.1': - resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} + '@unrs/resolver-binding-linux-x64-musl@1.12.2': + resolution: {integrity: sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==} cpu: [x64] os: [linux] libc: [musl] - '@unrs/resolver-binding-wasm32-wasi@1.11.1': - resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} + '@unrs/resolver-binding-openharmony-arm64@1.12.2': + resolution: {integrity: sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==} + cpu: [arm64] + os: [openharmony] + + '@unrs/resolver-binding-wasm32-wasi@1.12.2': + resolution: {integrity: sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': - resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} + '@unrs/resolver-binding-win32-arm64-msvc@1.12.2': + resolution: {integrity: sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g==} cpu: [arm64] os: [win32] - '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': - resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} + '@unrs/resolver-binding-win32-ia32-msvc@1.12.2': + resolution: {integrity: sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g==} cpu: [ia32] os: [win32] - '@unrs/resolver-binding-win32-x64-msvc@1.11.1': - resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} + '@unrs/resolver-binding-win32-x64-msvc@1.12.2': + resolution: {integrity: sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA==} cpu: [x64] os: [win32] @@ -890,18 +778,18 @@ packages: resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==} engines: {node: '>=0.4.0'} - acorn@8.16.0: - resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + acorn@8.17.0: + resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} engines: {node: '>=0.4.0'} hasBin: true - actions-up@1.13.0: - resolution: {integrity: sha512-tXrv8AWWtjtbLXslcdPsFRnvedyBAYHfIyqHyUm3yxNvcuRPMJHMoLR8t9keCrfaTyTFh0CzMBuK1ODrsa4Kzw==} - engines: {node: ^18.0.0 || >=20.0.0} + actions-up@1.16.0: + resolution: {integrity: sha512-i/2cDk8Z5YUatx1atmxmZx5jCe0z6nwpDvBiqf4FB7cTuKXnEvpwLbwDGlvKkwA7n+SOHxlosGgOhBJXtHW3IA==} + engines: {node: ^18.3.0 || >=20.0.0} hasBin: true - ajv@6.14.0: - resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} @@ -911,9 +799,13 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} @@ -928,11 +820,11 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} - brace-expansion@1.1.14: - resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==} + brace-expansion@1.1.16: + resolution: {integrity: sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==} - brace-expansion@5.0.5: - resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} + brace-expansion@5.0.7: + resolution: {integrity: sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==} engines: {node: 18 || 20 || >=22} braces@3.0.3: @@ -943,9 +835,9 @@ packages: resolution: {integrity: sha512-fey6+4jDK7TFtFg/klGSvNKJctyU7n2aQdnM+CO0ruLPbqqMOM8Tio0Pc+deqUeVKX1tL5DQep1zQ7+37aTAsA==} engines: {node: '>= 0.8'} - c8@11.0.0: - resolution: {integrity: sha512-e/uRViGHSVIJv7zsaDKM7VRn2390TgHXqUSvYwPHBQaU6L7E9L0n9JbdkwdYPvshDT0KymBmmlwSpms3yBaMNg==} - engines: {node: 20 || >=22} + c8@12.0.0: + resolution: {integrity: sha512-4zpJvrd1nKWutnnKC2pXkFmb6iM1l+ffN//o1CzlTNwW7GSOs9a1xrLqkC48nU8oEkjmPZLPiwMsIaOvoF4Pqg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} hasBin: true peerDependencies: monocart-coverage-reports: ^2 @@ -953,10 +845,6 @@ packages: monocart-coverage-reports: optional: true - cac@7.0.0: - resolution: {integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==} - engines: {node: '>=20.19.0'} - callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -968,24 +856,12 @@ packages: peerDependencies: typescript: '>=4.0.0' - clean-publish@6.0.5: - resolution: {integrity: sha512-Iqm/EDPQFLY0I8kktg61Nt8V/5fiXYNkNR5UsHcLKmj4vp7a0a7EGZmNEbN2Hg77frQlHNljT/MruK5Wr/Rtog==} - engines: {node: '>= 20.0.0'} - hasBin: true - - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + cliui@9.0.1: + resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} + engines: {node: '>=20'} - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - comment-parser@1.4.6: - resolution: {integrity: sha512-ObxuY6vnbWTN6Od72xfwN9DbzC7Y2vv8u1Soi9ahRKL37gb6y1qk6/dgjs+3JWuXJHWvsg3BXIwzd/rkmAwavg==} + comment-parser@1.4.7: + resolution: {integrity: sha512-0h+uSNtQGW3D98eQt3jJ8L06Fves8hncB4V/PKdw/Qb8Hnk19VaKuTr55UNRYiSoVa7WwrFls+rh3ux9agmkeQ==} engines: {node: '>= 12.0.0'} concat-map@0.0.1: @@ -1008,14 +884,6 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -1048,26 +916,22 @@ packages: resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} engines: {node: '>=0.3.1'} - dompurify@3.4.0: - resolution: {integrity: sha512-nolgK9JcaUXMSmW+j1yaSvaEaoXYHwWyGJlkoCTghc97KgGDDSnpoU/PlEnw63Ah+TGKFOyY+X5LnxaWbCSfXg==} + dompurify@3.4.12: + resolution: {integrity: sha512-zQvGet8Z2sWbQhCmfFz/T5QWH2oBmjnqK3qvOjaqaNLrLEF912WamU+ohnTp0TCep/MFVHpdJuCZEdFOdTnEFg==} - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} - enhanced-resolve@5.20.1: - resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==} + enhanced-resolve@5.24.3: + resolution: {integrity: sha512-PwKooW9JUzh5chmYfHM3IQl5OkK2u2Nm011MgeZrss3JmFraUx/fqrf78kk8GUMYoibx/14MdwTl/1WKkG7TpQ==} engines: {node: '>=10.13.0'} enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - esbuild@0.28.0: - resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} + esbuild@0.28.1: + resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} engines: {node: '>=18'} hasBin: true @@ -1094,17 +958,14 @@ packages: unrs-resolver: optional: true - eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-plugin-es-x@7.8.0: resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '>=8' - eslint-plugin-import-x@4.16.2: - resolution: {integrity: sha512-rM9K8UBHcWKpzQzStn1YRN2T5NvdeIfSVoKu/lKF41znQXHAUcBbYXe5wd6GNjZjTrP7viQ49n1D83x/2gYgIw==} + eslint-plugin-import-x@4.17.1: + resolution: {integrity: sha512-4cdstYkKCyjumM2Q9NSI03K8D2a9F4Ssz33K2lv2hQa4KmR9jPLwk3uWGtNvclfqBrPGfGuMBwsGMbe6dMRbfg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/utils': ^8.56.0 @@ -1122,8 +983,8 @@ packages: peerDependencies: eslint: '>=8.23.0' - eslint-plugin-perfectionist@5.8.0: - resolution: {integrity: sha512-k8uIptWIxkUclonCFGyDzgYs9NI+Qh0a7cUXS3L7IYZDEsjXuimFBVbxXPQQngWqMiaxJRwbtYB4smMGMqF+cw==} + eslint-plugin-perfectionist@5.10.0: + resolution: {integrity: sha512-HiqpDrUDbGrMC6iHQbemgDyHJ0366Vyz/qRWmxQcSAkmG25cXr8BdRgx8yAhOKhEfBXn8Rnf/mTCsV4EqUJSxg==} engines: {node: ^20.0.0 || >=22.0.0} peerDependencies: eslint: ^8.45.0 || ^9.0.0 || ^10.0.0 @@ -1148,8 +1009,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.2.0: - resolution: {integrity: sha512-+L0vBFYGIpSNIt/KWTpFonPrqYvgKw1eUI5Vn7mEogrQcWtWYtNQ7dNqC+px/J0idT3BAkiWrhfS7k+Tum8TUA==} + eslint@10.7.0: + resolution: {integrity: sha512-GVTD7s1vdIl6UYvAfriOPeY1Df8LIZjfofLvHwde+erDHGGuHyuM6xoxRxmHiebhYuD2p1vN4wWh0XzPARSGDQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -1230,15 +1091,16 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-tsconfig@4.13.7: - resolution: {integrity: sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==} + get-east-asian-width@1.6.0: + resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} + engines: {node: '>=18'} + + get-tsconfig@4.14.0: + resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} @@ -1260,8 +1122,8 @@ packages: resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} - globals@17.5.0: - resolution: {integrity: sha512-qoV+HK2yFl/366t2/Cb3+xxPUo5BuMynomoDmiaZBIdbs+0pYbjfZU+twLhGKp4uCZ/+NbtpVepH5bGCxRyy2g==} + globals@17.7.0: + resolution: {integrity: sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg==} engines: {node: '>=18'} globrex@0.1.2: @@ -1274,10 +1136,6 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - highlight.js@11.11.1: resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} engines: {node: '>=12.0.0'} @@ -1289,8 +1147,8 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - ignore@7.0.5: - resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + ignore@7.0.6: + resolution: {integrity: sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==} engines: {node: '>= 4'} import-fresh@3.3.1: @@ -1301,18 +1159,10 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} - engines: {node: '>= 0.4'} - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -1336,12 +1186,8 @@ packages: resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} - jiti@2.6.1: - resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} - hasBin: true - - js-yaml@4.1.1: - resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + js-yaml@4.3.0: + resolution: {integrity: sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==} hasBin: true json-buffer@3.0.1: @@ -1372,8 +1218,8 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - lru-cache@11.3.5: - resolution: {integrity: sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==} + lru-cache@11.5.2: + resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} engines: {node: 20 || >=22} make-dir@4.0.0: @@ -1383,8 +1229,8 @@ packages: make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - marked@17.0.6: - resolution: {integrity: sha512-gB0gkNafnonOw0obSTEGZTT86IuhILt2Wfx0mWH/1Au83kybTayroZ/V6nS25mN7u8ASy+5fMhgB3XPNrOZdmA==} + marked@18.0.6: + resolution: {integrity: sha512-MrV5puXBfuiy6wl6DLaq3BtIJQAJToAd5zt/ZKhRfGRAuFPALE7/4Y7jnxRQoEgK/pBgurGqLyAuRgZ2xOjr6w==} engines: {node: '>= 20'} hasBin: true @@ -1414,8 +1260,8 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - multiocular@0.8.2: - resolution: {integrity: sha512-OZICP9j79FGWZ8/ugQ57Do7ljnWUtcLv13/ic4tP0OKw7XauWjYsA9Cv5q7Qc9lG6kWy8A4hMHw8J0ln1v359g==} + multiocular@0.8.4: + resolution: {integrity: sha512-8uxpaHVnNghK+jE7KHa8+o4WHM4m/VLsmDkeYQ3kNDAy9g8SytOInvONlu/fk6WXo/m0PzEmaqiUvdWeERbD+w==} engines: {node: ^22.16.0 || >=24.0.0} hasBin: true @@ -1426,25 +1272,25 @@ packages: resolution: {integrity: sha512-Jd0fILWG44a9luj8v5kED4WI+zfkkgwKyRQKItTtlPfEsh7Lznfi1kr8/iZ+XAIss4Qq5GqRB0qtWbaz9ceO/A==} engines: {node: ^18.0.0 || >=20.0.0} - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + nanoid@3.3.16: + resolution: {integrity: sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nanoid@5.1.7: - resolution: {integrity: sha512-ua3NDgISf6jdwezAheMOk4mbE1LXjm1DfMUDMuJf4AqxLFK3ccGpgWizwa5YV7Yz9EpXwEaWoRXSb/BnV0t5dQ==} + nanoid@5.1.16: + resolution: {integrity: sha512-kVrnsrJqMR8+oLJnGEmSWw9BivK5mt7H3FZatVRjrc5wGqFYuBxX1yG7+A7Gi5AefkX6t/oCkizcQgpu0cY1dQ==} engines: {node: ^18 || >=20} hasBin: true nanospinner@1.2.2: resolution: {integrity: sha512-Zt/AmG6qRU3e+WnzGGLuMCEAO/dAu45stNbHY223tUxldaDAeE+FxSPsd9Q+j+paejmm0ZbrNVs5Sraqy3dRxA==} - nanospy@1.0.0: - resolution: {integrity: sha512-wvmmALNstRRhLhy7RV11NCRY2k1zxstImiju4VyyKNNRIKDVjyBtmEd/Q4G82/3dN4VSTe+0PRR3DUAASSbEEQ==} - engines: {node: ^8.0.0 || ^10.0.0 || ^12.0.0 || ^14.0.0 || ^16.0.0 || ^18.0.0 || >=20.0.0} + nanospy@2.0.2: + resolution: {integrity: sha512-AvkslkHQavd4abp7clE0xsv4afGpBpnWUqWY23V3o4ljdyi/YIOpLiiWtrlLh1oR7kWC4GT7iBN5M2SjL5I5yw==} + engines: {node: ^8.0.0 || ^10.0.0 || ^12.0.0 || ^14.0.0 || ^16.0.0 || ^18.0.0 || ^20.0.0 || ^22.0.0 || ^24.0.0 || >=26.0.0} - nanostores@1.2.0: - resolution: {integrity: sha512-F0wCzbsH80G7XXo0Jd9/AVQC7ouWY6idUCTnMwW5t/Rv9W8qmO6endavDwg7TNp5GbugwSukFMVZqzPSrSMndg==} + nanostores@1.4.0: + resolution: {integrity: sha512-i0tloweeudshAEuddpDxcg9Ik6pkPfVsHIgKyf143JrgG7/MOh0+q7BypdLXZPoOP7fOYt1eTcwGkyiVmhJFkA==} engines: {node: ^20.0.0 || >=22.0.0} napi-postinstall@0.3.4: @@ -1467,11 +1313,6 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - oxfmt@0.45.0: - resolution: {integrity: sha512-0o/COoN9fY50bjVeM7PQsNgbhndKurBIeTIcspW033OumksjJJmIVDKjAk5HMwU/GHTxSOdGDdhJ6BRzGPmsHg==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - oxlint-tsgolint@0.18.1: resolution: {integrity: sha512-Hgb0wMfuXBYL0ddY+1hAG8IIfC40ADwPnBuUaC6ENAuCtTF4dHwsy7mCYtQ2e7LoGvfoSJRY0+kqQRiembJ/jQ==} hasBin: true @@ -1506,9 +1347,6 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@2.0.2: resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} engines: {node: 18 || 20 || >=22} @@ -1520,8 +1358,8 @@ packages: resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} - picomatch@4.0.4: - resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} engines: {node: '>=12'} postcss-parser-tests@8.9.0: @@ -1538,10 +1376,6 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - requireindex@1.2.0: resolution: {integrity: sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==} engines: {node: '>=0.10.5'} @@ -1553,11 +1387,6 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve@1.22.12: - resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} - engines: {node: '>= 0.4'} - hasBin: true - reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -1569,8 +1398,8 @@ packages: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} - semver@7.7.4: - resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} engines: {node: '>=10'} hasBin: true @@ -1612,14 +1441,18 @@ packages: resolution: {integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==} engines: {node: '>=12.0.0'} - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -1628,30 +1461,18 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - tapable@2.3.2: - resolution: {integrity: sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==} + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} test-exclude@8.0.0: resolution: {integrity: sha512-ZOffsNrXYggvU1mDGHk54I96r26P8SyMjO5slMKSc7+IWmtB/MQKnEC2fP51imB3/pT6YK5cT5E8f+Dd9KdyOQ==} engines: {node: 20 || >=22} - tinyexec@1.1.1: - resolution: {integrity: sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==} - engines: {node: '>=18'} - - tinyglobby@0.2.16: - resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} - tinypool@2.1.0: - resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} - engines: {node: ^20.0.0 || >=22.0.0} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -1688,8 +1509,8 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - typescript-eslint@8.58.2: - resolution: {integrity: sha512-V8iSng9mRbdZjl54VJ9NKr6ZB+dW0J3TzRXRGcSbLIej9jV86ZRtlYeTKDR/QLxXykocJ5icNzbsl2+5TzIvcQ==} + typescript-eslint@8.64.0: + resolution: {integrity: sha512-0qg+pDNMnqYzqH9AnNK+39tejHvsShUOUUoRUgtnTGE7QuMZhiFDnozq8nHJVq+Wae6NMLKNWLg5WmkcC/ndyQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -1700,14 +1521,14 @@ packages: engines: {node: '>=14.17'} hasBin: true - undici-types@7.19.2: - resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==} + undici-types@8.3.0: + resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - unrs-resolver@1.11.1: - resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} + unrs-resolver@1.12.2: + resolution: {integrity: sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==} uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -1746,12 +1567,12 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} - ws@8.20.0: - resolution: {integrity: sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==} + ws@8.21.1: + resolution: {integrity: sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -1766,8 +1587,8 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - yaml@2.8.3: - resolution: {integrity: sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==} + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} engines: {node: '>= 14.6'} hasBin: true @@ -1775,9 +1596,13 @@ packages: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + + yargs@18.0.0: + resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} @@ -1795,13 +1620,13 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@emnapi/core@1.9.2': + '@emnapi/core@1.10.0': dependencies: '@emnapi/wasi-threads': 1.2.1 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.9.2': + '@emnapi/runtime@1.10.0': dependencies: tslib: 2.8.1 optional: true @@ -1811,100 +1636,100 @@ snapshots: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.28.0': + '@esbuild/aix-ppc64@0.28.1': optional: true - '@esbuild/android-arm64@0.28.0': + '@esbuild/android-arm64@0.28.1': optional: true - '@esbuild/android-arm@0.28.0': + '@esbuild/android-arm@0.28.1': optional: true - '@esbuild/android-x64@0.28.0': + '@esbuild/android-x64@0.28.1': optional: true - '@esbuild/darwin-arm64@0.28.0': + '@esbuild/darwin-arm64@0.28.1': optional: true - '@esbuild/darwin-x64@0.28.0': + '@esbuild/darwin-x64@0.28.1': optional: true - '@esbuild/freebsd-arm64@0.28.0': + '@esbuild/freebsd-arm64@0.28.1': optional: true - '@esbuild/freebsd-x64@0.28.0': + '@esbuild/freebsd-x64@0.28.1': optional: true - '@esbuild/linux-arm64@0.28.0': + '@esbuild/linux-arm64@0.28.1': optional: true - '@esbuild/linux-arm@0.28.0': + '@esbuild/linux-arm@0.28.1': optional: true - '@esbuild/linux-ia32@0.28.0': + '@esbuild/linux-ia32@0.28.1': optional: true - '@esbuild/linux-loong64@0.28.0': + '@esbuild/linux-loong64@0.28.1': optional: true - '@esbuild/linux-mips64el@0.28.0': + '@esbuild/linux-mips64el@0.28.1': optional: true - '@esbuild/linux-ppc64@0.28.0': + '@esbuild/linux-ppc64@0.28.1': optional: true - '@esbuild/linux-riscv64@0.28.0': + '@esbuild/linux-riscv64@0.28.1': optional: true - '@esbuild/linux-s390x@0.28.0': + '@esbuild/linux-s390x@0.28.1': optional: true - '@esbuild/linux-x64@0.28.0': + '@esbuild/linux-x64@0.28.1': optional: true - '@esbuild/netbsd-arm64@0.28.0': + '@esbuild/netbsd-arm64@0.28.1': optional: true - '@esbuild/netbsd-x64@0.28.0': + '@esbuild/netbsd-x64@0.28.1': optional: true - '@esbuild/openbsd-arm64@0.28.0': + '@esbuild/openbsd-arm64@0.28.1': optional: true - '@esbuild/openbsd-x64@0.28.0': + '@esbuild/openbsd-x64@0.28.1': optional: true - '@esbuild/openharmony-arm64@0.28.0': + '@esbuild/openharmony-arm64@0.28.1': optional: true - '@esbuild/sunos-x64@0.28.0': + '@esbuild/sunos-x64@0.28.1': optional: true - '@esbuild/win32-arm64@0.28.0': + '@esbuild/win32-arm64@0.28.1': optional: true - '@esbuild/win32-ia32@0.28.0': + '@esbuild/win32-ia32@0.28.1': optional: true - '@esbuild/win32-x64@0.28.0': + '@esbuild/win32-x64@0.28.1': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.2.0(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.9.1(eslint@10.7.0(supports-color@7.2.0))': dependencies: - eslint: 10.2.0(jiti@2.6.1) + eslint: 10.7.0(supports-color@7.2.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.23.5': + '@eslint/config-array@0.23.5(supports-color@7.2.0)': dependencies: '@eslint/object-schema': 3.0.5 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) minimatch: 10.2.5 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.5.5': + '@eslint/config-helpers@0.6.0': dependencies: '@eslint/core': 1.2.1 @@ -1912,15 +1737,15 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.5': + '@eslint/eslintrc@3.3.6(supports-color@7.2.0)': dependencies: - ajv: 6.14.0 - debug: 4.4.3 + ajv: 6.15.0 + debug: 4.4.3(supports-color@7.2.0) espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 - js-yaml: 4.1.1 + js-yaml: 4.3.0 minimatch: 3.1.5 strip-json-comments: 3.1.1 transitivePeerDependencies: @@ -1928,18 +1753,23 @@ snapshots: '@eslint/object-schema@3.0.5': {} - '@eslint/plugin-kit@0.7.1': + '@eslint/plugin-kit@0.7.2': dependencies: '@eslint/core': 1.2.1 levn: 0.4.1 - '@humanfs/core@0.19.1': {} + '@humanfs/core@0.19.2': + dependencies: + '@humanfs/types': 0.15.0 - '@humanfs/node@0.16.7': + '@humanfs/node@0.16.8': dependencies: - '@humanfs/core': 0.19.1 + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 '@humanwhocodes/retry': 0.4.3 + '@humanfs/types@0.15.0': {} + '@humanwhocodes/module-importer@1.0.1': {} '@humanwhocodes/retry@0.4.3': {} @@ -1968,23 +1798,23 @@ snapshots: dependencies: nanoevents: 9.1.0 - '@logux/eslint-config@57.1.0(@typescript-eslint/utils@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3)': + '@logux/eslint-config@57.1.0(@typescript-eslint/utils@8.64.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3))(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3)': dependencies: - '@eslint/eslintrc': 3.3.5 - eslint: 10.2.0(jiti@2.6.1) - eslint-plugin-import-x: 4.16.2(@typescript-eslint/utils@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@10.2.0(jiti@2.6.1)) - eslint-plugin-n: 17.24.0(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3) - eslint-plugin-perfectionist: 5.8.0(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3) + '@eslint/eslintrc': 3.3.6(supports-color@7.2.0) + eslint: 10.7.0(supports-color@7.2.0) + eslint-plugin-import-x: 4.17.1(@typescript-eslint/utils@8.64.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3))(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0) + eslint-plugin-n: 17.24.0(eslint@10.7.0(supports-color@7.2.0))(typescript@5.9.3) + eslint-plugin-perfectionist: 5.10.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) eslint-plugin-prefer-let: 4.2.2 - globals: 17.5.0 - typescript-eslint: 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3) + globals: 17.7.0 + typescript-eslint: 8.64.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) transitivePeerDependencies: - '@typescript-eslint/utils' - eslint-import-resolver-node - supports-color - typescript - '@logux/oxc-configs@0.3.3(oxlint-tsgolint@0.18.1)(oxlint@1.58.0(oxlint-tsgolint@0.18.1))(typescript@5.9.3)': + '@logux/oxc-configs@1.0.0(oxlint-tsgolint@0.18.1)(oxlint@1.58.0(oxlint-tsgolint@0.18.1))(typescript@5.9.3)': dependencies: eslint-plugin-prefer-let: 4.2.2 oxlint: 1.58.0(oxlint-tsgolint@0.18.1) @@ -1998,19 +1828,19 @@ snapshots: cookie: 1.1.1 fastq: 1.20.1 nanoevents: 9.1.0 - nanoid: 5.1.7 - tinyglobby: 0.2.16 + nanoid: 5.1.16 + tinyglobby: 0.2.17 url-pattern: 1.0.3 - ws: 8.20.0 + ws: 8.21.1 transitivePeerDependencies: - bufferutil - utf-8-validate - '@napi-rs/wasm-runtime@0.2.12': + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@emnapi/core': 1.9.2 - '@emnapi/runtime': 1.9.2 - '@tybys/wasm-util': 0.10.1 + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.3 optional: true '@nodelib/fs.scandir@2.1.5': @@ -2025,63 +1855,6 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 - '@oxfmt/binding-android-arm-eabi@0.45.0': - optional: true - - '@oxfmt/binding-android-arm64@0.45.0': - optional: true - - '@oxfmt/binding-darwin-arm64@0.45.0': - optional: true - - '@oxfmt/binding-darwin-x64@0.45.0': - optional: true - - '@oxfmt/binding-freebsd-x64@0.45.0': - optional: true - - '@oxfmt/binding-linux-arm-gnueabihf@0.45.0': - optional: true - - '@oxfmt/binding-linux-arm-musleabihf@0.45.0': - optional: true - - '@oxfmt/binding-linux-arm64-gnu@0.45.0': - optional: true - - '@oxfmt/binding-linux-arm64-musl@0.45.0': - optional: true - - '@oxfmt/binding-linux-ppc64-gnu@0.45.0': - optional: true - - '@oxfmt/binding-linux-riscv64-gnu@0.45.0': - optional: true - - '@oxfmt/binding-linux-riscv64-musl@0.45.0': - optional: true - - '@oxfmt/binding-linux-s390x-gnu@0.45.0': - optional: true - - '@oxfmt/binding-linux-x64-gnu@0.45.0': - optional: true - - '@oxfmt/binding-linux-x64-musl@0.45.0': - optional: true - - '@oxfmt/binding-openharmony-arm64@0.45.0': - optional: true - - '@oxfmt/binding-win32-arm64-msvc@0.45.0': - optional: true - - '@oxfmt/binding-win32-ia32-msvc@0.45.0': - optional: true - - '@oxfmt/binding-win32-x64-msvc@0.45.0': - optional: true - '@oxlint-tsgolint/darwin-arm64@0.18.1': optional: true @@ -2157,27 +1930,25 @@ snapshots: '@oxlint/binding-win32-x64-msvc@1.58.0': optional: true - '@package-json/types@0.0.12': {} - '@profoundlogic/hogan@3.0.4': dependencies: nopt: 1.0.10 - '@size-limit/esbuild@12.1.0(size-limit@12.1.0(jiti@2.6.1))': + '@size-limit/esbuild@12.1.0(size-limit@12.1.0)': dependencies: - esbuild: 0.28.0 - nanoid: 5.1.7 - size-limit: 12.1.0(jiti@2.6.1) + esbuild: 0.28.1 + nanoid: 5.1.16 + size-limit: 12.1.0 - '@size-limit/file@12.1.0(size-limit@12.1.0(jiti@2.6.1))': + '@size-limit/file@12.1.0(size-limit@12.1.0)': dependencies: - size-limit: 12.1.0(jiti@2.6.1) + size-limit: 12.1.0 - '@size-limit/preset-small-lib@12.1.0(size-limit@12.1.0(jiti@2.6.1))': + '@size-limit/preset-small-lib@12.1.0(size-limit@12.1.0)': dependencies: - '@size-limit/esbuild': 12.1.0(size-limit@12.1.0(jiti@2.6.1)) - '@size-limit/file': 12.1.0(size-limit@12.1.0(jiti@2.6.1)) - size-limit: 12.1.0(jiti@2.6.1) + '@size-limit/esbuild': 12.1.0(size-limit@12.1.0) + '@size-limit/file': 12.1.0(size-limit@12.1.0) + size-limit: 12.1.0 '@tsconfig/node10@1.0.12': {} @@ -2187,200 +1958,210 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@tybys/wasm-util@0.10.1': + '@tybys/wasm-util@0.10.3': dependencies: tslib: 2.8.1 optional: true '@types/esrecurse@4.3.1': {} - '@types/estree@1.0.8': {} + '@types/estree@1.0.9': {} '@types/istanbul-lib-coverage@2.0.6': {} '@types/json-schema@7.0.15': {} - '@types/node@25.6.0': + '@types/node@26.1.1': dependencies: - undici-types: 7.19.2 + undici-types: 8.3.0 '@types/trusted-types@2.0.7': optional: true '@types/unist@3.0.3': {} - '@typescript-eslint/eslint-plugin@8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.64.0(@typescript-eslint/parser@8.64.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3))(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.58.2 - '@typescript-eslint/type-utils': 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.58.2 - eslint: 10.2.0(jiti@2.6.1) - ignore: 7.0.5 + '@typescript-eslint/parser': 8.64.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.64.0 + '@typescript-eslint/type-utils': 8.64.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/utils': 8.64.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.64.0 + eslint: 10.7.0(supports-color@7.2.0) + ignore: 7.0.6 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.64.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.58.2 - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/typescript-estree': 8.58.2(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.58.2 - debug: 4.4.3 - eslint: 10.2.0(jiti@2.6.1) + '@typescript-eslint/scope-manager': 8.64.0 + '@typescript-eslint/types': 8.64.0 + '@typescript-eslint/typescript-estree': 8.64.0(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.64.0 + debug: 4.4.3(supports-color@7.2.0) + eslint: 10.7.0(supports-color@7.2.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.58.2(typescript@5.9.3)': + '@typescript-eslint/project-service@8.64.0(supports-color@7.2.0)(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@5.9.3) - '@typescript-eslint/types': 8.58.2 - debug: 4.4.3 + '@typescript-eslint/tsconfig-utils': 8.64.0(typescript@5.9.3) + '@typescript-eslint/types': 8.64.0 + debug: 4.4.3(supports-color@7.2.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.58.2': + '@typescript-eslint/scope-manager@8.64.0': dependencies: - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/visitor-keys': 8.58.2 + '@typescript-eslint/types': 8.64.0 + '@typescript-eslint/visitor-keys': 8.64.0 - '@typescript-eslint/tsconfig-utils@8.58.2(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.64.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.64.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/typescript-estree': 8.58.2(typescript@5.9.3) - '@typescript-eslint/utils': 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3) - debug: 4.4.3 - eslint: 10.2.0(jiti@2.6.1) + '@typescript-eslint/types': 8.64.0 + '@typescript-eslint/typescript-estree': 8.64.0(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/utils': 8.64.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + debug: 4.4.3(supports-color@7.2.0) + eslint: 10.7.0(supports-color@7.2.0) ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.58.2': {} + '@typescript-eslint/types@8.64.0': {} - '@typescript-eslint/typescript-estree@8.58.2(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.64.0(supports-color@7.2.0)(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.58.2(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@5.9.3) - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/visitor-keys': 8.58.2 - debug: 4.4.3 + '@typescript-eslint/project-service': 8.64.0(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.64.0(typescript@5.9.3) + '@typescript-eslint/types': 8.64.0 + '@typescript-eslint/visitor-keys': 8.64.0 + debug: 4.4.3(supports-color@7.2.0) minimatch: 10.2.5 - semver: 7.7.4 - tinyglobby: 0.2.16 + semver: 7.8.5 + tinyglobby: 0.2.17 ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.64.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.0(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.58.2 - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/typescript-estree': 8.58.2(typescript@5.9.3) - eslint: 10.2.0(jiti@2.6.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0(supports-color@7.2.0)) + '@typescript-eslint/scope-manager': 8.64.0 + '@typescript-eslint/types': 8.64.0 + '@typescript-eslint/typescript-estree': 8.64.0(supports-color@7.2.0)(typescript@5.9.3) + eslint: 10.7.0(supports-color@7.2.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.58.2': + '@typescript-eslint/visitor-keys@8.64.0': dependencies: - '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/types': 8.64.0 eslint-visitor-keys: 5.0.1 - '@unrs/resolver-binding-android-arm-eabi@1.11.1': + '@unrs/resolver-binding-android-arm-eabi@1.12.2': optional: true - '@unrs/resolver-binding-android-arm64@1.11.1': + '@unrs/resolver-binding-android-arm64@1.12.2': optional: true - '@unrs/resolver-binding-darwin-arm64@1.11.1': + '@unrs/resolver-binding-darwin-arm64@1.12.2': optional: true - '@unrs/resolver-binding-darwin-x64@1.11.1': + '@unrs/resolver-binding-darwin-x64@1.12.2': optional: true - '@unrs/resolver-binding-freebsd-x64@1.11.1': + '@unrs/resolver-binding-freebsd-x64@1.12.2': optional: true - '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + '@unrs/resolver-binding-linux-arm-gnueabihf@1.12.2': optional: true - '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + '@unrs/resolver-binding-linux-arm-musleabihf@1.12.2': optional: true - '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + '@unrs/resolver-binding-linux-arm64-gnu@1.12.2': optional: true - '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + '@unrs/resolver-binding-linux-arm64-musl@1.12.2': optional: true - '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + '@unrs/resolver-binding-linux-loong64-gnu@1.12.2': optional: true - '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + '@unrs/resolver-binding-linux-loong64-musl@1.12.2': optional: true - '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + '@unrs/resolver-binding-linux-ppc64-gnu@1.12.2': optional: true - '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + '@unrs/resolver-binding-linux-riscv64-gnu@1.12.2': optional: true - '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + '@unrs/resolver-binding-linux-riscv64-musl@1.12.2': optional: true - '@unrs/resolver-binding-linux-x64-musl@1.11.1': + '@unrs/resolver-binding-linux-s390x-gnu@1.12.2': optional: true - '@unrs/resolver-binding-wasm32-wasi@1.11.1': + '@unrs/resolver-binding-linux-x64-gnu@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-x64-musl@1.12.2': + optional: true + + '@unrs/resolver-binding-openharmony-arm64@1.12.2': + optional: true + + '@unrs/resolver-binding-wasm32-wasi@1.12.2': dependencies: - '@napi-rs/wasm-runtime': 0.2.12 + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true - '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + '@unrs/resolver-binding-win32-arm64-msvc@1.12.2': optional: true - '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + '@unrs/resolver-binding-win32-ia32-msvc@1.12.2': optional: true - '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + '@unrs/resolver-binding-win32-x64-msvc@1.12.2': optional: true abbrev@1.1.1: {} - acorn-jsx@5.3.2(acorn@8.16.0): + acorn-jsx@5.3.2(acorn@8.17.0): dependencies: - acorn: 8.16.0 + acorn: 8.17.0 acorn-walk@8.3.5: dependencies: - acorn: 8.16.0 + acorn: 8.17.0 - acorn@8.16.0: {} + acorn@8.17.0: {} - actions-up@1.13.0: + actions-up@1.16.0: dependencies: - cac: 7.0.0 enquirer: 2.4.1 nanospinner: 1.2.2 picocolors: 1.1.1 - semver: 7.7.4 - yaml: 2.8.3 + semver: 7.8.5 + yaml: 2.9.0 - ajv@6.14.0: + ajv@6.15.0: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 @@ -2391,9 +2172,9 @@ snapshots: ansi-regex@5.0.1: {} - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 + ansi-regex@6.2.2: {} + + ansi-styles@6.2.3: {} arg@4.1.3: {} @@ -2403,12 +2184,12 @@ snapshots: balanced-match@4.0.4: {} - brace-expansion@1.1.14: + brace-expansion@1.1.16: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@5.0.5: + brace-expansion@5.0.7: dependencies: balanced-match: 4.0.4 @@ -2418,7 +2199,7 @@ snapshots: bytes-iec@3.1.1: {} - c8@11.0.0: + c8@12.0.0: dependencies: '@bcoe/v8-coverage': 1.0.2 '@istanbuljs/schema': 0.1.6 @@ -2429,11 +2210,9 @@ snapshots: istanbul-reports: 3.2.0 test-exclude: 8.0.0 v8-to-istanbul: 9.3.0 - yargs: 17.7.2(patch_hash=34652056801bf0e586b0f2ab1a4f464b352d4d3ce0f5b2d51040d171c31843c3) + yargs: 18.0.0 yargs-parser: 21.1.1 - cac@7.0.0: {} - callsites@3.1.0: {} check-dts@0.9.0(typescript@5.9.3): @@ -2444,26 +2223,13 @@ snapshots: typescript: 5.9.3 vfile-location: 5.0.3 - clean-publish@6.0.5: + cliui@9.0.1: dependencies: - lilconfig: 3.1.3 - picomatch: 4.0.4 - tinyexec: 1.1.1 - tinyglobby: 0.2.16 - - cliui@8.0.1: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 + string-width: 7.2.0 + strip-ansi: 7.2.0 + wrap-ansi: 9.0.2 - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - comment-parser@1.4.6: {} + comment-parser@1.4.7: {} concat-map@0.0.1: {} @@ -2483,14 +2249,11 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - debug@3.2.7: - dependencies: - ms: 2.1.3 - optional: true - - debug@4.4.3: + debug@4.4.3(supports-color@7.2.0): dependencies: ms: 2.1.3 + optionalDependencies: + supports-color: 7.2.0 deep-is@0.1.4: {} @@ -2509,124 +2272,110 @@ snapshots: diff@8.0.4: {} - dompurify@3.4.0: + dompurify@3.4.12: optionalDependencies: '@types/trusted-types': 2.0.7 - emoji-regex@8.0.0: {} + emoji-regex@10.6.0: {} - enhanced-resolve@5.20.1: + enhanced-resolve@5.24.3: dependencies: graceful-fs: 4.2.11 - tapable: 2.3.2 + tapable: 2.3.3 enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 strip-ansi: 6.0.1 - es-errors@1.3.0: - optional: true - - esbuild@0.28.0: + esbuild@0.28.1: optionalDependencies: - '@esbuild/aix-ppc64': 0.28.0 - '@esbuild/android-arm': 0.28.0 - '@esbuild/android-arm64': 0.28.0 - '@esbuild/android-x64': 0.28.0 - '@esbuild/darwin-arm64': 0.28.0 - '@esbuild/darwin-x64': 0.28.0 - '@esbuild/freebsd-arm64': 0.28.0 - '@esbuild/freebsd-x64': 0.28.0 - '@esbuild/linux-arm': 0.28.0 - '@esbuild/linux-arm64': 0.28.0 - '@esbuild/linux-ia32': 0.28.0 - '@esbuild/linux-loong64': 0.28.0 - '@esbuild/linux-mips64el': 0.28.0 - '@esbuild/linux-ppc64': 0.28.0 - '@esbuild/linux-riscv64': 0.28.0 - '@esbuild/linux-s390x': 0.28.0 - '@esbuild/linux-x64': 0.28.0 - '@esbuild/netbsd-arm64': 0.28.0 - '@esbuild/netbsd-x64': 0.28.0 - '@esbuild/openbsd-arm64': 0.28.0 - '@esbuild/openbsd-x64': 0.28.0 - '@esbuild/openharmony-arm64': 0.28.0 - '@esbuild/sunos-x64': 0.28.0 - '@esbuild/win32-arm64': 0.28.0 - '@esbuild/win32-ia32': 0.28.0 - '@esbuild/win32-x64': 0.28.0 + '@esbuild/aix-ppc64': 0.28.1 + '@esbuild/android-arm': 0.28.1 + '@esbuild/android-arm64': 0.28.1 + '@esbuild/android-x64': 0.28.1 + '@esbuild/darwin-arm64': 0.28.1 + '@esbuild/darwin-x64': 0.28.1 + '@esbuild/freebsd-arm64': 0.28.1 + '@esbuild/freebsd-x64': 0.28.1 + '@esbuild/linux-arm': 0.28.1 + '@esbuild/linux-arm64': 0.28.1 + '@esbuild/linux-ia32': 0.28.1 + '@esbuild/linux-loong64': 0.28.1 + '@esbuild/linux-mips64el': 0.28.1 + '@esbuild/linux-ppc64': 0.28.1 + '@esbuild/linux-riscv64': 0.28.1 + '@esbuild/linux-s390x': 0.28.1 + '@esbuild/linux-x64': 0.28.1 + '@esbuild/netbsd-arm64': 0.28.1 + '@esbuild/netbsd-x64': 0.28.1 + '@esbuild/openbsd-arm64': 0.28.1 + '@esbuild/openbsd-x64': 0.28.1 + '@esbuild/openharmony-arm64': 0.28.1 + '@esbuild/sunos-x64': 0.28.1 + '@esbuild/win32-arm64': 0.28.1 + '@esbuild/win32-ia32': 0.28.1 + '@esbuild/win32-x64': 0.28.1 escalade@3.2.0: {} escape-string-regexp@4.0.0: {} - eslint-compat-utils@0.5.1(eslint@10.2.0(jiti@2.6.1)): + eslint-compat-utils@0.5.1(eslint@10.7.0(supports-color@7.2.0)): dependencies: - eslint: 10.2.0(jiti@2.6.1) - semver: 7.7.4 + eslint: 10.7.0(supports-color@7.2.0) + semver: 7.8.5 - eslint-import-context@0.1.9(unrs-resolver@1.11.1): + eslint-import-context@0.1.9(unrs-resolver@1.12.2): dependencies: - get-tsconfig: 4.13.7 + get-tsconfig: 4.14.0 stable-hash-x: 0.2.0 optionalDependencies: - unrs-resolver: 1.11.1 + unrs-resolver: 1.12.2 - eslint-import-resolver-node@0.3.9: + eslint-plugin-es-x@7.8.0(eslint@10.7.0(supports-color@7.2.0)): dependencies: - debug: 3.2.7 - is-core-module: 2.16.1 - resolve: 1.22.12 - transitivePeerDependencies: - - supports-color - optional: true - - eslint-plugin-es-x@7.8.0(eslint@10.2.0(jiti@2.6.1)): - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0(supports-color@7.2.0)) '@eslint-community/regexpp': 4.12.2 - eslint: 10.2.0(jiti@2.6.1) - eslint-compat-utils: 0.5.1(eslint@10.2.0(jiti@2.6.1)) + eslint: 10.7.0(supports-color@7.2.0) + eslint-compat-utils: 0.5.1(eslint@10.7.0(supports-color@7.2.0)) - eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@10.2.0(jiti@2.6.1)): + eslint-plugin-import-x@4.17.1(@typescript-eslint/utils@8.64.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3))(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0): dependencies: - '@package-json/types': 0.0.12 - '@typescript-eslint/types': 8.58.2 - comment-parser: 1.4.6 - debug: 4.4.3 - eslint: 10.2.0(jiti@2.6.1) - eslint-import-context: 0.1.9(unrs-resolver@1.11.1) + '@typescript-eslint/types': 8.64.0 + comment-parser: 1.4.7 + debug: 4.4.3(supports-color@7.2.0) + eslint: 10.7.0(supports-color@7.2.0) + eslint-import-context: 0.1.9(unrs-resolver@1.12.2) is-glob: 4.0.3 minimatch: 10.2.5 - semver: 7.7.4 + semver: 7.8.5 stable-hash-x: 0.2.0 - unrs-resolver: 1.11.1 + unrs-resolver: 1.12.2 optionalDependencies: - '@typescript-eslint/utils': 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3) - eslint-import-resolver-node: 0.3.9 + '@typescript-eslint/utils': 8.64.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) transitivePeerDependencies: - supports-color - eslint-plugin-n@17.24.0(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3): + eslint-plugin-n@17.24.0(eslint@10.7.0(supports-color@7.2.0))(typescript@5.9.3): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.0(jiti@2.6.1)) - enhanced-resolve: 5.20.1 - eslint: 10.2.0(jiti@2.6.1) - eslint-plugin-es-x: 7.8.0(eslint@10.2.0(jiti@2.6.1)) - get-tsconfig: 4.13.7 + '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0(supports-color@7.2.0)) + enhanced-resolve: 5.24.3 + eslint: 10.7.0(supports-color@7.2.0) + eslint-plugin-es-x: 7.8.0(eslint@10.7.0(supports-color@7.2.0)) + get-tsconfig: 4.14.0 globals: 15.15.0 globrex: 0.1.2 ignore: 5.3.2 - semver: 7.7.4 + semver: 7.8.5 ts-declaration-location: 1.0.7(typescript@5.9.3) transitivePeerDependencies: - typescript - eslint-plugin-perfectionist@5.8.0(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3): + eslint-plugin-perfectionist@5.10.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3): dependencies: - '@typescript-eslint/utils': 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3) - eslint: 10.2.0(jiti@2.6.1) + '@typescript-eslint/utils': 8.64.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + eslint: 10.7.0(supports-color@7.2.0) natural-orderby: 5.0.0 transitivePeerDependencies: - supports-color @@ -2639,7 +2388,7 @@ snapshots: eslint-scope@9.1.2: dependencies: '@types/esrecurse': 4.3.1 - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 esrecurse: 4.3.0 estraverse: 5.3.0 @@ -2649,21 +2398,21 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.2.0(jiti@2.6.1): + eslint@10.7.0(supports-color@7.2.0): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0(supports-color@7.2.0)) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.23.5 - '@eslint/config-helpers': 0.5.5 + '@eslint/config-array': 0.23.5(supports-color@7.2.0) + '@eslint/config-helpers': 0.6.0 '@eslint/core': 1.2.1 - '@eslint/plugin-kit': 0.7.1 - '@humanfs/node': 0.16.7 + '@eslint/plugin-kit': 0.7.2 + '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 - ajv: 6.14.0 + '@types/estree': 1.0.9 + ajv: 6.15.0 cross-spawn: 7.0.6 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) escape-string-regexp: 4.0.0 eslint-scope: 9.1.2 eslint-visitor-keys: 5.0.1 @@ -2681,21 +2430,19 @@ snapshots: minimatch: 10.2.5 natural-compare: 1.4.0 optionator: 0.9.4 - optionalDependencies: - jiti: 2.6.1 transitivePeerDependencies: - supports-color espree@10.4.0: dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) eslint-visitor-keys: 4.2.1 espree@11.2.0: dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) eslint-visitor-keys: 5.0.1 esquery@1.7.0: @@ -2728,9 +2475,9 @@ snapshots: dependencies: reusify: 1.1.0 - fdir@6.5.0(picomatch@4.0.4): + fdir@6.5.0(picomatch@4.0.5): optionalDependencies: - picomatch: 4.0.4 + picomatch: 4.0.5 file-entry-cache@8.0.0: dependencies: @@ -2757,12 +2504,11 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - function-bind@1.1.2: - optional: true - get-caller-file@2.0.5: {} - get-tsconfig@4.13.7: + get-east-asian-width@1.6.0: {} + + get-tsconfig@4.14.0: dependencies: resolve-pkg-maps: 1.0.0 @@ -2784,7 +2530,7 @@ snapshots: globals@15.15.0: {} - globals@17.5.0: {} + globals@17.7.0: {} globrex@0.1.2: {} @@ -2792,18 +2538,13 @@ snapshots: has-flag@4.0.0: {} - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - optional: true - highlight.js@11.11.1: {} html-escaper@2.0.2: {} ignore@5.3.2: {} - ignore@7.0.5: {} + ignore@7.0.6: {} import-fresh@3.3.1: dependencies: @@ -2812,15 +2553,8 @@ snapshots: imurmurhash@0.1.4: {} - is-core-module@2.16.1: - dependencies: - hasown: 2.0.2 - optional: true - is-extglob@2.1.1: {} - is-fullwidth-code-point@3.0.0: {} - is-glob@4.0.3: dependencies: is-extglob: 2.1.1 @@ -2842,10 +2576,7 @@ snapshots: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - jiti@2.6.1: - optional: true - - js-yaml@4.1.1: + js-yaml@4.3.0: dependencies: argparse: 2.0.1 @@ -2872,15 +2603,15 @@ snapshots: dependencies: p-locate: 5.0.0 - lru-cache@11.3.5: {} + lru-cache@11.5.2: {} make-dir@4.0.0: dependencies: - semver: 7.7.4 + semver: 7.8.5 make-error@1.3.6: {} - marked@17.0.6: {} + marked@18.0.6: {} merge2@1.4.1: {} @@ -2891,11 +2622,11 @@ snapshots: minimatch@10.2.5: dependencies: - brace-expansion: 5.0.5 + brace-expansion: 5.0.7 minimatch@3.1.5: dependencies: - brace-expansion: 1.1.14 + brace-expansion: 1.1.16 minipass@7.1.3: {} @@ -2903,16 +2634,18 @@ snapshots: ms@2.1.3: {} - multiocular@0.8.2: + multiocular@0.8.4(@logux/core@0.10.0): dependencies: + '@logux/actions': 0.5.0(@logux/core@0.10.0) '@logux/server': 0.14.0 diff2html: 3.4.56 - dompurify: 3.4.0 + dompurify: 3.4.12 highlight.js: 11.11.1 - marked: 17.0.6 - nanostores: 1.2.0 - yaml: 2.8.3 + marked: 18.0.6 + nanostores: 1.4.0 + yaml: 2.9.0 transitivePeerDependencies: + - '@logux/core' - bufferutil - utf-8-validate @@ -2920,17 +2653,17 @@ snapshots: nanoevents@9.1.0: {} - nanoid@3.3.11: {} + nanoid@3.3.16: {} - nanoid@5.1.7: {} + nanoid@5.1.16: {} nanospinner@1.2.2: dependencies: picocolors: 1.1.1 - nanospy@1.0.0: {} + nanospy@2.0.2: {} - nanostores@1.2.0: {} + nanostores@1.4.0: {} napi-postinstall@0.3.4: {} @@ -2951,30 +2684,6 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - oxfmt@0.45.0: - dependencies: - tinypool: 2.1.0 - optionalDependencies: - '@oxfmt/binding-android-arm-eabi': 0.45.0 - '@oxfmt/binding-android-arm64': 0.45.0 - '@oxfmt/binding-darwin-arm64': 0.45.0 - '@oxfmt/binding-darwin-x64': 0.45.0 - '@oxfmt/binding-freebsd-x64': 0.45.0 - '@oxfmt/binding-linux-arm-gnueabihf': 0.45.0 - '@oxfmt/binding-linux-arm-musleabihf': 0.45.0 - '@oxfmt/binding-linux-arm64-gnu': 0.45.0 - '@oxfmt/binding-linux-arm64-musl': 0.45.0 - '@oxfmt/binding-linux-ppc64-gnu': 0.45.0 - '@oxfmt/binding-linux-riscv64-gnu': 0.45.0 - '@oxfmt/binding-linux-riscv64-musl': 0.45.0 - '@oxfmt/binding-linux-s390x-gnu': 0.45.0 - '@oxfmt/binding-linux-x64-gnu': 0.45.0 - '@oxfmt/binding-linux-x64-musl': 0.45.0 - '@oxfmt/binding-openharmony-arm64': 0.45.0 - '@oxfmt/binding-win32-arm64-msvc': 0.45.0 - '@oxfmt/binding-win32-ia32-msvc': 0.45.0 - '@oxfmt/binding-win32-x64-msvc': 0.45.0 - oxlint-tsgolint@0.18.1: optionalDependencies: '@oxlint-tsgolint/darwin-arm64': 0.18.1 @@ -3023,19 +2732,16 @@ snapshots: path-key@3.1.1: {} - path-parse@1.0.7: - optional: true - path-scurry@2.0.2: dependencies: - lru-cache: 11.3.5 + lru-cache: 11.5.2 minipass: 7.1.3 picocolors@1.1.1: {} picomatch@2.3.2: {} - picomatch@4.0.4: {} + picomatch@4.0.5: {} postcss-parser-tests@8.9.0: dependencies: @@ -3047,22 +2753,12 @@ snapshots: queue-microtask@1.2.3: {} - require-directory@2.1.1: {} - requireindex@1.2.0: {} resolve-from@4.0.0: {} resolve-pkg-maps@1.0.0: {} - resolve@1.22.12: - dependencies: - es-errors: 1.3.0 - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - optional: true - reusify@1.1.0: {} run-parallel@1.2.0: @@ -3073,7 +2769,7 @@ snapshots: dependencies: mri: 1.2.0 - semver@7.7.4: {} + semver@7.8.5: {} shebang-command@2.0.0: dependencies: @@ -3085,15 +2781,13 @@ snapshots: simple-git-hooks@2.13.1: {} - size-limit@12.1.0(jiti@2.6.1): + size-limit@12.1.0: dependencies: bytes-iec: 3.1.1 lilconfig: 3.1.3 nanospinner: 1.2.2 picocolors: 1.1.1 - tinyglobby: 0.2.16 - optionalDependencies: - jiti: 2.6.1 + tinyglobby: 0.2.17 source-map-js@1.2.1: {} @@ -3101,26 +2795,27 @@ snapshots: stable-hash-x@0.2.0: {} - string-width@4.2.3: + string-width@7.2.0: dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 + emoji-regex: 10.6.0 + get-east-asian-width: 1.6.0 + strip-ansi: 7.2.0 strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.2.2 + strip-json-comments@3.1.1: {} supports-color@7.2.0: dependencies: has-flag: 4.0.0 - supports-preserve-symlinks-flag@1.0.0: - optional: true - - tapable@2.3.2: {} + tapable@2.3.3: {} test-exclude@8.0.0: dependencies: @@ -3128,14 +2823,10 @@ snapshots: glob: 13.0.6 minimatch: 10.2.5 - tinyexec@1.1.1: {} - - tinyglobby@0.2.16: + tinyglobby@0.2.17: dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 - - tinypool@2.1.0: {} + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 to-regex-range@5.0.1: dependencies: @@ -3147,18 +2838,18 @@ snapshots: ts-declaration-location@1.0.7(typescript@5.9.3): dependencies: - picomatch: 4.0.4 + picomatch: 4.0.5 typescript: 5.9.3 - ts-node@10.9.2(@types/node@25.6.0)(typescript@5.9.3): + ts-node@10.9.2(@types/node@26.1.1)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 25.6.0 - acorn: 8.16.0 + '@types/node': 26.1.1 + acorn: 8.17.0 acorn-walk: 8.3.5 arg: 4.1.3 create-require: 1.1.1 @@ -3175,48 +2866,51 @@ snapshots: dependencies: prelude-ls: 1.2.1 - typescript-eslint@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3): + typescript-eslint@8.64.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.58.2(typescript@5.9.3) - '@typescript-eslint/utils': 8.58.2(eslint@10.2.0(jiti@2.6.1))(typescript@5.9.3) - eslint: 10.2.0(jiti@2.6.1) + '@typescript-eslint/eslint-plugin': 8.64.0(@typescript-eslint/parser@8.64.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3))(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/parser': 8.64.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.64.0(supports-color@7.2.0)(typescript@5.9.3) + '@typescript-eslint/utils': 8.64.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) + eslint: 10.7.0(supports-color@7.2.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color typescript@5.9.3: {} - undici-types@7.19.2: {} + undici-types@8.3.0: {} unist-util-stringify-position@4.0.0: dependencies: '@types/unist': 3.0.3 - unrs-resolver@1.11.1: + unrs-resolver@1.12.2: dependencies: napi-postinstall: 0.3.4 optionalDependencies: - '@unrs/resolver-binding-android-arm-eabi': 1.11.1 - '@unrs/resolver-binding-android-arm64': 1.11.1 - '@unrs/resolver-binding-darwin-arm64': 1.11.1 - '@unrs/resolver-binding-darwin-x64': 1.11.1 - '@unrs/resolver-binding-freebsd-x64': 1.11.1 - '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1 - '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1 - '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1 - '@unrs/resolver-binding-linux-arm64-musl': 1.11.1 - '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1 - '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1 - '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1 - '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1 - '@unrs/resolver-binding-linux-x64-gnu': 1.11.1 - '@unrs/resolver-binding-linux-x64-musl': 1.11.1 - '@unrs/resolver-binding-wasm32-wasi': 1.11.1 - '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1 - '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 - '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 + '@unrs/resolver-binding-android-arm-eabi': 1.12.2 + '@unrs/resolver-binding-android-arm64': 1.12.2 + '@unrs/resolver-binding-darwin-arm64': 1.12.2 + '@unrs/resolver-binding-darwin-x64': 1.12.2 + '@unrs/resolver-binding-freebsd-x64': 1.12.2 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.12.2 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.12.2 + '@unrs/resolver-binding-linux-arm64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-arm64-musl': 1.12.2 + '@unrs/resolver-binding-linux-loong64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-loong64-musl': 1.12.2 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-riscv64-musl': 1.12.2 + '@unrs/resolver-binding-linux-s390x-gnu': 1.12.2 + '@unrs/resolver-binding-linux-x64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-x64-musl': 1.12.2 + '@unrs/resolver-binding-openharmony-arm64': 1.12.2 + '@unrs/resolver-binding-wasm32-wasi': 1.12.2 + '@unrs/resolver-binding-win32-arm64-msvc': 1.12.2 + '@unrs/resolver-binding-win32-ia32-msvc': 1.12.2 + '@unrs/resolver-binding-win32-x64-msvc': 1.12.2 uri-js@4.4.1: dependencies: @@ -3260,29 +2954,30 @@ snapshots: word-wrap@1.2.5: {} - wrap-ansi@7.0.0: + wrap-ansi@9.0.2: dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.2.0 - ws@8.20.0: {} + ws@8.21.1: {} y18n@5.0.8: {} - yaml@2.8.3: {} + yaml@2.9.0: {} yargs-parser@21.1.1: {} - yargs@17.7.2(patch_hash=34652056801bf0e586b0f2ab1a4f464b352d4d3ce0f5b2d51040d171c31843c3): + yargs-parser@22.0.0: {} + + yargs@18.0.0: dependencies: - cliui: 8.0.1 + cliui: 9.0.1 escalade: 3.2.0 get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 + string-width: 7.2.0 y18n: 5.0.8 - yargs-parser: 21.1.1 + yargs-parser: 22.0.0 yn@3.1.1: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 000000000..f306e6140 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,4 @@ +allowBuilds: + esbuild: false + simple-git-hooks: true + unrs-resolver: false diff --git a/test/container.test.ts b/test/container.test.ts index 9e8f22402..1a1e46f1c 100755 --- a/test/container.test.ts +++ b/test/container.test.ts @@ -551,7 +551,7 @@ test('append() move node on insert', () => { let a = parse('a{}') let b = parse('b{}') - b.append(a.first as Rule) + b.append(a.first) let bLast = b.last as Rule bLast.selector = 'b a' @@ -666,13 +666,13 @@ test('insertBefore() has defined way of adding newlines', () => { is(root.toString(), 'c {}b {}other {}a {}') root = parse('other {}\na {}') - root.insertBefore(root.nodes[1] as Rule, 'b {}') - root.insertBefore(root.nodes[1] as Rule, 'c {}') + root.insertBefore(root.nodes[1], 'b {}') + root.insertBefore(root.nodes[1], 'c {}') is(root.toString(), 'other {}\nc {}\nb {}\na {}') root = parse('other {}a {}') - root.insertBefore(root.nodes[1] as Rule, 'b {}') - root.insertBefore(root.nodes[1] as Rule, 'c {}') + root.insertBefore(root.nodes[1], 'b {}') + root.insertBefore(root.nodes[1], 'c {}') is(root.toString(), 'other {}c {}b {}a {}') }) @@ -872,6 +872,20 @@ test('allows to clone nodes', () => { is(root2.toString(), 'a { color: black; z-index: 1 } b {}') }) +test('adopts root-less nodes in constructor instead of cloning them', () => { + let decl = new Declaration({ prop: 'foo', value: 'bar' }) + let atRule = new AtRule({ name: 'foo', nodes: [decl] }) + + // The passed-in instance itself is adopted (its parent is updated), so the + // caller's reference stays usable rather than being silently cloned (#1987). + equal(decl.parent, atRule) + is(atRule.first, decl) + + decl.before(new Declaration({ prop: 'baz', value: 'qux' })) + equal(atRule.nodes!.length, 2) + is(atRule.last, decl) +}) + test('container.nodes can be sorted', () => { let root = parse('@b; @c; @a;') let b = root.nodes[0] diff --git a/test/css-syntax-error.test.ts b/test/css-syntax-error.test.ts index 47040beb2..b997ded93 100755 --- a/test/css-syntax-error.test.ts +++ b/test/css-syntax-error.test.ts @@ -294,7 +294,7 @@ test('uses source map', () => { is(error.file, join(__dirname, 'b.css')) is(error.line, 2) - is(error.column, 0) // Is this correct? + is(error.column, 1) is(error.endLine, undefined) is(error.endColumn, undefined) type(error.source, 'undefined') @@ -328,7 +328,7 @@ test('works with path in sources', () => { is(error.file, join(__dirname, 'b.css')) is(error.line, 2) - is(error.column, 0) // Is this correct? + is(error.column, 1) is(error.endLine, undefined) is(error.endColumn, undefined) type(error.source, 'undefined') diff --git a/test/fromJSON.test.ts b/test/fromJSON.test.ts index 132cc06a1..b4fad5c79 100755 --- a/test/fromJSON.test.ts +++ b/test/fromJSON.test.ts @@ -1,5 +1,5 @@ import { test } from 'uvu' -import { instance, is, throws } from 'uvu/assert' +import { equal, instance, is, throws } from 'uvu/assert' import * as v8 from 'v8' import postcss, { Declaration, Input, Root, Rule } from '../lib/postcss.js' @@ -40,6 +40,19 @@ test('rehydrates a JSON AST', () => { ) }) +test('preserves node raws when rehydrating a JSON AST', () => { + let css = 'a {}\nb {}\n\nc {}\n' + let root = postcss.parse(css) + + let rehydrated = postcss.fromJSON( + JSON.parse(JSON.stringify(root.toJSON())) + ) as Root + + is(rehydrated.toString(), css) + is(rehydrated.nodes[1].raws.before, '\n') + is(rehydrated.nodes[2].raws.before, '\n\n') +}) + test('rehydrates an array of Nodes via JSON.stringify', () => { let root = postcss.parse('.cls { color: orange; }') @@ -56,4 +69,14 @@ test('throws when rehydrating an invalid JSON AST', () => { }, 'Unknown node type: not-a-node-type') }) +test('does not allow to change prototype', () => { + let node = postcss.fromJSON( + JSON.parse( + '{"type":"decl","prop":"color","value":"red","__proto__":{"hijacked":true}}' + ) + ) + // @ts-expect-error + equal(typeof node.hijacked, 'undefined') +}) + test.run() diff --git a/test/fuzzing/fuzz_parse.dict b/test/fuzzing/fuzz_parse.dict new file mode 100644 index 000000000..0f6f9ea32 --- /dev/null +++ b/test/fuzzing/fuzz_parse.dict @@ -0,0 +1,109 @@ +# Dictionary of common CSS tokens for libFuzzer. +# Reference: https://www.w3.org/TR/css-syntax-3/ + +# At-rules +"@charset " +"@import " +"@media " +"@supports " +"@font-face " +"@keyframes " +"@page " +"@namespace " +"@document " +"@layer " +"@container " +"@property " +"@scope " +"@counter-style " +"@font-feature-values " + +# Structural punctuation +"{" +"}" +";" +":" +"," +"(" +")" +"[" +"]" +"/*" +"*/" +"!important" +"--" + +# Selectors +"*" +">" +"+" +"~" +"::" +"&" + +# Common pseudo-classes / pseudo-elements +":hover" +":focus" +":active" +":root" +":not(" +":is(" +":where(" +":has(" +"::before" +"::after" + +# Common properties +"color:" +"background:" +"background-color:" +"width:" +"height:" +"margin:" +"padding:" +"border:" +"display:" +"position:" +"font-size:" +"font-family:" +"transform:" +"transition:" +"animation:" +"grid-template-columns:" +"flex:" + +# Values / units +"px" +"em" +"rem" +"%" +"vh" +"vw" +"deg" +"rgb(" +"rgba(" +"hsl(" +"hsla(" +"calc(" +"var(" +"url(" +"linear-gradient(" +"none" +"auto" +"inherit" +"initial" +"unset" +"revert" + +# Strings / escapes +"\"" +"'" +"\\" + +# Source map annotations +# Reaching the source-map parsing branch quickly has historically uncovered +# bugs; postcss matches /\*\s*# sourceMappingURL=/ and decodes inline base64 +# payloads via the `data:application/json;base64,` prefix. +"/*# sourceMappingURL=" +"# sourceMappingURL=" +"data:application/json;base64," diff --git a/test/fuzzing/fuzz_parse.js b/test/fuzzing/fuzz_parse.js new file mode 100644 index 000000000..8343f363c --- /dev/null +++ b/test/fuzzing/fuzz_parse.js @@ -0,0 +1,121 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//////////////////////////////////////////////////////////////////////////////// + +let { FuzzedDataProvider } = require('@jazzer.js/core') + +let postcss = require('../../lib/postcss') + +module.exports.fuzz = function (data) { + let provider = new FuzzedDataProvider(data) + + // The CSS input itself is randomized: every byte the fuzzer produces (or + // mutates from the seed corpus) flows directly into `cssString` via + // consumeRemainingAsString(). The option flags below are read from the + // *back* of the buffer (jazzer.js consumes integrals/booleans from the + // tail), so seed CSS files from postcss-parser-tests are fed into the + // parser nearly verbatim, with only their last few bytes nibbled off as + // option control. + let useMap = provider.consumeBoolean() + let useFrom = provider.consumeBoolean() + let useProcessor = provider.consumeBoolean() + let splitMode = provider.consumeIntegralInRange(0, 2) + let cssString = provider.consumeRemainingAsString() + + let parseOptions = {} + if (useFrom) parseOptions.from = 'fuzz.css' + if (useMap) parseOptions.map = { annotation: false, inline: false } + + let root + try { + root = postcss.parse(cssString, parseOptions) + } catch (e) { + if (e instanceof postcss.CssSyntaxError) return + throw e + } + + // Walk the AST and exercise common node accessors. This also stresses + // raws/source bookkeeping for any node returned by the parser. + try { + root.walk(node => { + void node.type + void node.toString() + if (typeof node.error === 'function') { + // Generating an error message touches input/source-map machinery. + node.error('fuzz').message + } + }) + } catch (e) { + if (!isExpected(e, postcss)) throw e + } + + // Round-trip via stringify and re-parse. Output should itself be parseable. + let serialized + try { + serialized = root.toString() + } catch (e) { + if (!isExpected(e, postcss)) throw e + return + } + + try { + postcss.parse(serialized) + } catch (e) { + if (!(e instanceof postcss.CssSyntaxError)) throw e + } + + // Exercise the JSON serialization round-trip. + try { + let json = root.toJSON() + postcss.fromJSON(json) + } catch (e) { + if (!isExpected(e)) throw e + } + + // Exercise the main public entry point: postcss().process(). This drives + // the LazyResult / NoWorkResult pipeline that real plugin chains use. + if (useProcessor) { + try { + let result = postcss().process(cssString, parseOptions) + void result.css + void result.warnings() + } catch (e) { + if (!isExpected(e)) throw e + } + } + + // Exercise the list helpers, which have their own quoting/escape logic. + try { + if (splitMode === 0) { + postcss.list.comma(cssString) + } else if (splitMode === 1) { + postcss.list.space(cssString) + } else { + postcss.list.split(cssString, [',', ' '], false) + } + } catch (e) { + if (!isExpected(e)) throw e + } +} + +function isExpected(error) { + if (error instanceof postcss.CssSyntaxError) return true + if (!error || typeof error.message !== 'string') return false + // Some legitimate inputs reach known-shaped TypeErrors during stringify or + // walk because the CSS allows constructs whose textual form is ambiguous. + // Suppress only those well-defined cases so real bugs still surface. + let benign = ['Unknown node type', 'Unknown word'] + return benign.some(msg => error.message.indexOf(msg) !== -1) +} diff --git a/test/input.test.ts b/test/input.test.ts index 85a5ecb79..43d920f4e 100644 --- a/test/input.test.ts +++ b/test/input.test.ts @@ -1,8 +1,15 @@ +import { join } from 'node:path' +import { pathToFileURL } from 'node:url' +import { SourceNode } from 'source-map-js' import { test } from 'uvu' import { equal, is } from 'uvu/assert' import { Input } from '../lib/postcss.js' +function urlOf(file: string): string { + return pathToFileURL(join(__dirname, file)).toString() +} + test('fromLineAndColumn() returns offset', () => { let input = new Input('a {\n}') is(input.fromLineAndColumn(1, 1), 0) @@ -18,3 +25,112 @@ test('fromOffset() returns line and column', () => { equal(input.fromOffset(4), { col: 1, line: 2 }) equal(input.fromOffset(5), { col: 2, line: 2 }) }) + +test('origin() returns false without source map', () => { + let input = new Input('a {\n}') + is(input.origin(1, 1), false) +}) + +test('origin() returns source position with source map', () => { + // @ts-expect-error source-map-js accepts null, but it's not in the types + let node = new SourceNode(null, null, null, [ + new SourceNode(1, 0, 'a.css', 'a'), + new SourceNode(1, 1, 'a.css', ' '), + new SourceNode(1, 2, 'a.css', '{'), + new SourceNode(1, 3, 'a.css', '}'), + '\n', + new SourceNode(1, 0, 'b.css', 'b'), + new SourceNode(1, 1, 'b.css', ' '), + new SourceNode(1, 2, 'b.css', '{'), + new SourceNode(1, 3, 'b.css', '}'), + new SourceNode(1, 4, 'b.css', '\n'), + new SourceNode(2, 0, 'b.css', 'c'), + new SourceNode(2, 1, 'b.css', ' '), + new SourceNode(2, 2, 'b.css', '{'), + new SourceNode(2, 3, 'b.css', '}') + ]) + let from = join(__dirname, 'all.css') + let codeWithSourceMap = node.toStringWithSourceMap({ file: from }) + let input = new Input(codeWithSourceMap.code, { + from, + map: { prev: codeWithSourceMap.map } + }) + equal(input.origin(1, 1), { + column: 1, + endColumn: undefined, + endLine: undefined, + file: join(__dirname, 'a.css'), + line: 1, + url: urlOf('a.css') + }) + equal(input.origin(1, 4), { + column: 4, + endColumn: undefined, + endLine: undefined, + file: join(__dirname, 'a.css'), + line: 1, + url: urlOf('a.css') + }) + equal(input.origin(2, 1), { + column: 1, + endColumn: undefined, + endLine: undefined, + file: join(__dirname, 'b.css'), + line: 1, + url: urlOf('b.css') + }) + equal(input.origin(2, 4), { + column: 4, + endColumn: undefined, + endLine: undefined, + file: join(__dirname, 'b.css'), + line: 1, + url: urlOf('b.css') + }) + equal(input.origin(3, 1), { + column: 1, + endColumn: undefined, + endLine: undefined, + file: join(__dirname, 'b.css'), + line: 2, + url: urlOf('b.css') + }) + equal(input.origin(2, 1, 2, 4), { + column: 1, + endColumn: 4, + endLine: 1, + file: join(__dirname, 'b.css'), + line: 1, + url: urlOf('b.css') + }) +}) + +test('origin() does not mix undefined and null when end position is unmapped', () => { + // @ts-expect-error source-map-js accepts null, but it's not in the types + let node = new SourceNode(null, null, null, [ + new SourceNode(1, 0, 'a.css', 'a'), + new SourceNode(1, 1, 'a.css', ' '), + new SourceNode(1, 2, 'a.css', '{'), + new SourceNode(1, 3, 'a.css', '}') + ]) + let from = join(__dirname, 'all.css') + let codeWithSourceMap = node.toStringWithSourceMap({ file: from }) + let input = new Input(codeWithSourceMap.code, { + from, + map: { prev: codeWithSourceMap.map } + }) + + // The start position (1, 1) is mapped, but the requested end position + // (99, 1) is far beyond anything the source map covers, so + // `originalPositionFor()` cannot resolve it. + equal(input.origin(1, 1, 99, 1), { + column: 1, + endColumn: undefined, + endLine: undefined, + file: join(__dirname, 'a.css'), + line: 1, + url: urlOf('a.css') + }) +}) + +test.run() diff --git a/test/map.test.ts b/test/map.test.ts index b2125e071..ef55b5008 100644 --- a/test/map.test.ts +++ b/test/map.test.ts @@ -760,7 +760,7 @@ test('supports previous inline map with empty processor', () => { to: '/c.css' }) let root3 = postcss.parse(result2.css, { from: '/c.css' }) - match((root3.source?.input.origin(1, 0) as any).file, 'a.css') + match((root3.source?.input.origin(1, 1) as any).file, 'a.css') }) test('absolute sourcemaps have source contents', () => { diff --git a/test/node.test.ts b/test/node.test.ts index 41b0ac7b7..2155f0d5f 100755 --- a/test/node.test.ts +++ b/test/node.test.ts @@ -314,6 +314,26 @@ test('toJSON() converts custom properties', () => { }) }) +test('toJSON() converts nodes in custom properties', () => { + let root = new Root() as any + root._cache = [1, { toJSON: () => 'hack' }] + root._node = new Rule({ selector: 'a' }) + + equal(root.toJSON(), { + _cache: [1, 'hack'], + _node: { + nodes: [], + raws: {}, + selector: 'a', + type: 'rule' + }, + inputs: [], + nodes: [], + raws: {}, + type: 'root' + }) +}) + test('raw() has shortcut to stringifier', () => { let rule = new Rule({ selector: 'a' }) is(rule.raw('before'), '') @@ -523,6 +543,17 @@ test('positionBy() returns position for word after AST mutations', () => { equal(two.positionBy({ word: 'two' }), { column: 2, line: 3, offset: 14 }) }) +test('positionBy() returns position when offset is missing', () => { + let css = parse('a { one: X }') + let a = css.first as Rule + let one = a.first as Declaration + + // @ts-expect-error Testing non-standard AST + if (one.source?.start) delete one.source.start.offset + + equal(one.positionBy(), { column: 6, line: 1, offset: 5 }) +}) + test('positionBy() returns position for index', () => { let css = parse('a { one: X }') let a = css.first as Rule @@ -849,6 +880,16 @@ test('rangeBy() returns range for index and endIndex', () => { }) }) +test('rangeBy() returns range for index 0', () => { + let css = parse('a { one: X }') + let a = css.first as Rule + let one = a.first as Declaration + equal(one.rangeBy({ index: 0 }), { + end: { column: 7, line: 1, offset: 6 }, + start: { column: 6, line: 1, offset: 5 } + }) +}) + test('rangeBy() returns range for index and endIndex when offsets are missing', () => { let css = parse('a { one: X }') let a = css.first as Rule diff --git a/test/parse.test.ts b/test/parse.test.ts index 13de89851..06bde8385 100755 --- a/test/parse.test.ts +++ b/test/parse.test.ts @@ -4,7 +4,14 @@ import { eachTest, jsonify, testPath } from 'postcss-parser-tests' import { test } from 'uvu' import { equal, is, match, not, throws } from 'uvu/assert' -import { AtRule, Declaration, parse, Root, Rule } from '../lib/postcss.js' +import { + AtRule, + Declaration, + fromJSON, + parse, + Root, + Rule +} from '../lib/postcss.js' test('works with file reads', () => { let stream = readFileSync(testPath('atrule-empty.css')) @@ -251,4 +258,24 @@ test('should give the correct column of missed semicolon without !important', () match(error.message, /2:15: Missed semicolon/) }) +test('does not overflow the stack on deeply nested nodes', () => { + let depth = 6000 + let css = 'a{'.repeat(depth) + 'color:red' + '}'.repeat(depth) + + let root = parse(css) + is(root.toString(), css) + + let clone = root.clone() + is(clone.toString(), css) + + let json = root.toJSON() + is(fromJSON(json).toString(), css) + + let count = 0 + root.walk(() => { + count += 1 + }) + is(count, depth + 1) +}) + test.run() diff --git a/test/previous-map.test.ts b/test/previous-map.test.ts index efda7ff92..5fa8b76bd 100755 --- a/test/previous-map.test.ts +++ b/test/previous-map.test.ts @@ -284,9 +284,9 @@ test('uses source map path as a root', () => { '* div {\n color: red;\n }\n/*# sourceMappingURL=maps/a.map */', { from } ) - equal(root.source?.input.origin(1, 3, 1, 5), { - column: 4, - endColumn: 7, + equal(root.source?.input.origin(1, 4, 1, 6), { + column: 5, + endColumn: 8, endLine: 3, file: join(dir, '..', 'test.scss'), line: 3, @@ -294,6 +294,52 @@ test('uses source map path as a root', () => { }) }) +test('does not load map from non-.map file', () => { + let from = join(dir, 'a.css') + mkdirSync(dir) + writeFileSync(join(dir, 'a.txt'), map) + let input = parse('a{}\n/*# sourceMappingURL=a.txt */', { from }).source + ?.input + type(input?.map, 'undefined') +}) + +test('does not load map from outside the from folder', () => { + let from = join(dir, 'subdir', 'a.css') + mkdirSync(dir) + mkdirSync(join(dir, 'subdir')) + writeFileSync(join(dir, 'outside.map'), map) + let input = parse('a{}\n/*# sourceMappingURL=../outside.map */', { from }) + .source?.input + type(input?.map, 'undefined') +}) + +test('does not load relative map without from', () => { + let cwd = join(dir, 'subdir') + mkdirSync(dir) + mkdirSync(cwd) + writeFileSync(join(cwd, 'previous.map'), map) + let previousCwd = process.cwd() + try { + process.chdir(cwd) + let input = parse('a{}\n/*# sourceMappingURL=previous.map */').source?.input + type(input?.map, 'undefined') + } finally { + process.chdir(previousCwd) + } +}) + +test('loads map from outside the from folder with unsafeMap', () => { + let from = join(dir, 'subdir', 'a.css') + mkdirSync(dir) + mkdirSync(join(dir, 'subdir')) + writeFileSync(join(dir, 'outside.map'), map) + let input = parse('a{}\n/*# sourceMappingURL=../outside.map */', { + from, + unsafeMap: true + }).source?.input + is(input?.map.text, map) +}) + test('uses current file path for source map', () => { let root = parse('a{b:1}', { from: join(__dirname, 'dir', 'subdir', 'a.css'), @@ -359,7 +405,7 @@ test('works with index map', () => { } } }) - is((root as any).source.input.origin(1, 1).file, join(__dirname, 'b.css')) + is((root as any).source.input.origin(1, 2).file, join(__dirname, 'b.css')) }) test.run() diff --git a/test/root.test.ts b/test/root.test.ts index fdf312329..16eabcb7a 100755 --- a/test/root.test.ts +++ b/test/root.test.ts @@ -1,7 +1,7 @@ import { test } from 'uvu' import { is, match, type } from 'uvu/assert' -import { parse, Result } from '../lib/postcss.js' +import postcss, { parse, Result } from '../lib/postcss.js' test('prepend() fixes spaces on insert before first', () => { let css = parse('a {} b {}') @@ -44,6 +44,23 @@ test('fixes spaces on removing first rule', () => { is(css.toString(), 'b{}\n') }) +test('keeps explicitly set raws.before on inserted node', () => { + let css = parse('/*a*/\n\n/*b*/') + let node = postcss.comment({ raws: { before: '' }, text: 'new' }) + if (!css.nodes[1]) throw new Error('No nodes were parsed') + css.nodes[1].before(node) + is(node.raws.before, '') + is(css.toString(), '/*a*//*new*/\n\n/*b*/') +}) + +test('updates raws.before on node moved from another root', () => { + let css1 = parse('a{}\nb{}') + let css2 = parse('em{}\n\n\nstrong{}') + if (!css1.nodes[1] || !css2.nodes[1]) throw new Error('No nodes were parsed') + css2.nodes[1].before(css1.nodes[1]) + is(css2.toString(), 'em{}\n\n\nb{}\n\n\nstrong{}') +}) + test('keeps spaces on moving root', () => { let css1 = parse('a{}\nb{}\n') diff --git a/test/stringifier.test.js b/test/stringifier.test.js index c0afd658a..4c33cde7b 100755 --- a/test/stringifier.test.js +++ b/test/stringifier.test.js @@ -3,6 +3,7 @@ let { is } = require('uvu/assert') let { AtRule, + Comment, Declaration, Document, Node, @@ -157,6 +158,62 @@ test('clones semicolon only from rules with children', () => { is(str.raw(css.first, 'semicolon'), true) }) +test('terminates childless at-rule followed by a comment', () => { + let css = parse('a {}\n/* comment */') + css.insertBefore(css.last, new AtRule({ name: 'import', params: '"x.css"' })) + + is(css.toString(), 'a {}\n@import "x.css";\n/* comment */') + is( + parse(css.toString()) + .nodes.map(i => i.type) + .join(','), + 'rule,atrule,comment' + ) +}) + +test('terminates nested childless at-rule followed by a comment', () => { + let css = parse('@media screen {\n a {}\n}') + css.first.append(new AtRule({ name: 'import', params: '"y.css"' })) + css.first.append(new Comment({ text: 'note' })) + + is( + css.toString(), + '@media screen {\n a {}\n @import "y.css";\n /* note */\n}' + ) + is( + parse(css.toString()) + .first.nodes.map(i => i.type) + .join(','), + 'rule,atrule,comment' + ) +}) + +test('terminates custom property followed by a comment', () => { + let css = parse('a{--x:red}') + css.first.append(new Comment({ text: 'note' })) + + is(css.toString(), 'a{--x:red;/* note */}') + is( + parse(css.toString()) + .first.nodes.map(i => i.type) + .join(','), + 'decl,comment' + ) +}) + +test('terminates custom property with !important before a comment', () => { + let css = parse('a{--x:red !important}') + css.first.first.after(new Comment({ text: 'note' })) + + is(css.toString(), 'a{--x:red !important;/* note */}') + is( + parse(css.toString()) + .first.nodes.map(i => i.type) + .join(','), + 'decl,comment' + ) +}) + test('clones only spaces in before', () => { let css = parse('a{*one:1}') css.first.append({ prop: 'two', value: '2' }) @@ -301,7 +358,7 @@ test('escapes { '\\3c /style> {}\n' + '@media \\3c style>;\n' + '/* \\3c /style>\\3c !--\\3c style> */\n' + - 'a {\n' + + '\\3c /style>a {\n' + ' color: \\3c /style>' + '\\3c /style>}' ) @@ -320,4 +377,78 @@ test('does not escape Document raws', () => { is(document.toString(), 'a {}b {}') }) +test('always calls raw to retrieve raws', () => { + class CustomStringifier extends Stringifier { + raw(node, own, detect) { + return `\nRAW(${node.type}, ${own}, ${detect})\n` + } + } + let root = new Root() + let rootRule = new Rule({ selector: 'a' }) + let decl = new Declaration({ prop: 'color', value: 'black' }) + decl.raws.before = 'BEFORE' + decl.raws.between = 'BETWEEN' + decl.raws.after = 'AFTER' + root.append(rootRule) + rootRule.append(decl) + + let stringify = (node, builder) => { + let customStringifier = new CustomStringifier(builder) + customStringifier.stringify(node) + } + let result = root.toString(stringify) + is( + result, + [ + '', + 'RAW(rule, before, undefined)', + 'a', + 'RAW(rule, between, beforeOpen)', + '{', + 'RAW(decl, before, undefined)', + 'color', + 'RAW(decl, between, colon)', + 'black;', + 'RAW(rule, after, undefined)', + '}' + ].join('\n') + ) +}) + +test('adds space before params set on an at-rule parsed without them', () => { + let root = parse('@layer{a{color:black}}') + root.first.params = 'utilities' + is(root.toString(), '@layer utilities{a{color:black}}') + + let media = parse('@media;').first + media.params = 'print' + is(media.toString(), '@media print') +}) + +test('keeps params glued to at-rule name when CSS allows it', () => { + let root = parse('@media(min-width:0){}') + root.first.params = '(min-width:1px)' + is(root.toString(), '@media(min-width:1px){}') + + let imported = parse('@import"a.css"').first + imported.params = '"b.css"' + is(imported.toString(), '@import"b.css"') +}) + +test('supports subclasses with overridden traversal methods', () => { + class CustomStringifier extends Stringifier { + rule(node) { + super.rule(node) + } + } + + let css = 'a{color:black};@media screen{b{}}' + let result = '' + let custom = new CustomStringifier(i => { + result += i + }) + custom.stringify(parse(css)) + is(result, css) +}) + test.run() diff --git a/test/tokenize.test.js b/test/tokenize.test.js index e285c7ceb..82c45be75 100755 --- a/test/tokenize.test.js +++ b/test/tokenize.test.js @@ -87,7 +87,8 @@ test('tokenizes square brackets', () => { test('tokenizes complicated brackets', () => { run('(())("")(/**/)(\\\\)(\n)(', [ ['(', '(', 0], - ['brackets', '()', 1, 2], + ['(', '(', 1], + [')', ')', 2], [')', ')', 3], ['(', '(', 4], ['string', '""', 5, 6], diff --git a/test/visitor.test.ts b/test/visitor.test.ts index 6bfa82eff..0c381fb14 100755 --- a/test/visitor.test.ts +++ b/test/visitor.test.ts @@ -1602,4 +1602,27 @@ test('append works after reassigning nodes through .parent', async () => { ) }) +test('does not overflow the stack on deeply nested nodes', () => { + // The recursive sync walking crashed at ~3000 levels of nesting + let depth = 6000 + let css = 'a{'.repeat(depth) + 'color:black' + '}'.repeat(depth) + + let visited = 0 + let plugin: Plugin = { + Declaration(decl) { + decl.value = 'red' + visited += 1 + }, + postcssPlugin: 'deep-changer' + } + + let result = postcss([plugin]).process(postcss.parse(css), { + from: undefined + }).css + + // The changed declaration is revisited on the second pass + is(visited, 2) + is(result, 'a{'.repeat(depth) + 'color:red' + '}'.repeat(depth)) +}) + test.run() diff --git a/test/warning.test.ts b/test/warning.test.ts index 609b056aa..c96d14c44 100644 --- a/test/warning.test.ts +++ b/test/warning.test.ts @@ -2,7 +2,7 @@ import { resolve } from 'path' import { test } from 'uvu' import { is, type } from 'uvu/assert' -import { decl, parse, Warning } from '../lib/postcss.js' +import { decl, Declaration, parse, Rule, Warning } from '../lib/postcss.js' test('outputs simple warning', () => { let warning = new Warning('text') @@ -121,6 +121,15 @@ test('gets range from index', () => { is(warning.endColumn, 4) }) +test('gets range from index 0', () => { + let root = parse('a b{}') + let warning = new Warning('text', { index: 0, node: root.first }) + is(warning.line, 1) + is(warning.column, 1) + is(warning.endLine, 1) + is(warning.endColumn, 2) +}) + test('gets range from index and endIndex', () => { let root = parse('a b{}') let warning = new Warning('text', { endIndex: 3, index: 2, node: root.first }) @@ -185,4 +194,25 @@ test('always returns valid ranges', () => { is(warning.endColumn, 4) }) +test('takes position from node of another PostCSS copy', () => { + let root = parse('a { color: black }') + let rule = root.first as Rule + let parsed = rule.first as Declaration + // A node from another PostCSS version in node_modules has no methods + // of this copy, so it is a plain object here. + let foreign = { + prop: parsed.prop, + raws: { ...parsed.raws }, + source: parsed.source, + type: 'decl', + value: parsed.value + } as unknown as Declaration + + let warning = new Warning('text', { node: foreign }) + is(warning.line, 1) + is(warning.column, 5) + is(warning.endLine, 1) + is(warning.endColumn, 17) +}) + test.run()