diff --git a/.github/workflows/publish-single.yml b/.github/workflows/publish-single.yml deleted file mode 100644 index a6570f7..0000000 --- a/.github/workflows/publish-single.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: Publish Single Package to npmjs -on: - workflow_dispatch: - inputs: - package: - description: "Name of the package to publish (e.g. uiexport)" - required: true - type: string - -jobs: - publish-single: - runs-on: ubuntu-latest - permissions: - contents: write - id-token: write - steps: - - uses: actions/checkout@v5 - - - uses: pnpm/action-setup@v4 - - - uses: actions/setup-node@v4 - with: - node-version: "24.x" - registry-url: "https://registry.npmjs.org" - cache: "pnpm" - - - run: pnpm install --frozen-lockfile - - - name: Publish single package - run: pnpm publish --filter ${{ github.event.inputs.package }} --no-git-checks diff --git a/.github/workflows/publish-all.yml b/.github/workflows/publish.yml similarity index 51% rename from .github/workflows/publish-all.yml rename to .github/workflows/publish.yml index 9ff54a3..528b474 100644 --- a/.github/workflows/publish-all.yml +++ b/.github/workflows/publish.yml @@ -1,13 +1,22 @@ -name: Publish Package to npmjs +name: Publish Package(s) to npmjs on: release: types: [published] + workflow_dispatch: + inputs: + package: + description: "Name of the package to publish (e.g. uiexport)" + required: true + type: string + jobs: - build: + publish: runs-on: ubuntu-latest permissions: contents: write id-token: write + env: + NODE_ENV: production steps: - uses: actions/checkout@v5 @@ -21,12 +30,21 @@ jobs: - run: pnpm install --frozen-lockfile - - run: pnpm -r publish --no-git-checks + - name: Publish all packages (on release) + if: github.event_name == 'release' + run: pnpm -r publish --no-git-checks - name: Zip dist/uiexport + if: github.event_name == 'release' run: | cd packages/uiexport/dist && zip -r uiexport.zip . && mv uiexport.zip ../../.. + - name: Upload extension to GitHub Release + if: github.event_name == 'release' uses: softprops/action-gh-release@v2 with: files: uiexport.zip + + - name: Publish single package (on manual dispatch) + if: github.event_name == 'workflow_dispatch' + run: pnpm publish --filter ${{ github.event.inputs.package }} --no-git-checks diff --git a/packages/@devtoolcss-inliner/README.md b/packages/@devtoolcss-inliner/README.md index 9669d5a..fa8f266 100644 --- a/packages/@devtoolcss-inliner/README.md +++ b/packages/@devtoolcss-inliner/README.md @@ -1,5 +1,3 @@ -Shared code about CSS/DOM/Node processign, and basic types & constants. No CDP call, only CDP data. +Provide function `getInlinedComponent` that returns an element tree with inlined styles. The core inlining logic for [cleanclone](../cleanclone/) and [uiexport](../uiexport/). -## TODO - -split to parser and inliner +TODO: explanation on implementation and optimizer. diff --git a/packages/@devtoolcss-inliner/package.json b/packages/@devtoolcss-inliner/package.json index 184d780..bd5914b 100644 --- a/packages/@devtoolcss-inliner/package.json +++ b/packages/@devtoolcss-inliner/package.json @@ -1,6 +1,6 @@ { "name": "@devtoolcss/inliner", - "version": "0.0.0", + "version": "1.0.2", "description": "A CSS inliner library powered by Chrome DevTools Protocol.", "license": "MIT", "files": [ @@ -36,7 +36,7 @@ }, "dependencies": { "@devtoolcss/parser": "workspace:*", - "@devtoolcss/inspector": "workspace:*", + "chrome-inspector": "^1.0.3", "css-what": "^7.0.0", "postcss": "^8.5.6", "postcss-var-replace": "^1.0.0" diff --git a/packages/@devtoolcss-inliner/src/inliner.ts b/packages/@devtoolcss-inliner/src/inliner.ts index ebbbf21..21af04c 100644 --- a/packages/@devtoolcss-inliner/src/inliner.ts +++ b/packages/@devtoolcss-inliner/src/inliner.ts @@ -6,17 +6,26 @@ import type { ParsedCSSPropertyObject, ParsedCSSPropertyValue, } from "@devtoolcss/parser"; -import { Inspector, CDPNodeType } from "@devtoolcss/inspector"; -import { iterateParsedCSS, traverse } from "@devtoolcss/parser"; +import { + Inspector, + CDPNodeType, + CDPNode, + InspectorElement, + GetMatchedStylesForNodeResponse, +} from "chrome-inspector"; +import { + iterateParsedCSS, + parseGetMatchedStylesForNodeResponse, + traverse, +} from "@devtoolcss/parser"; import { forciblePseudoClasses } from "./constants.js"; import { AriaExpandedOptimizer, PrunePsuedoElementOptimizer, - invokeOptimizers, } from "./optimizers/index.js"; import type { - NodeWithId, + CDPNodeWithId, ParsedCSSRulesObjValue, ParsedStyleSheetObjValue, ParsedCSSRules, @@ -51,6 +60,44 @@ function getRewrittenSelectors( return [...rewrittenSelectors]; } +/* + * Fix selectors with multiple pseudo-elements by keeping only the first one + * Example: + * #ab::before { + * --v: ''; + * } + * + * #ab::after{ + * content: var(--v); + * } + * + * becomes + * #ab::after{ + * content: undefined; + * } + * + * #ab::after::before{ + * content: ''; + * } + */ +function fixSelector(selector: string): string { + const parsedSelector = CSSwhat.parse(selector)[0]; + let pseudoElements: number[] = []; + for (let i = 0; i < parsedSelector.length; i++) { + if (parsedSelector[i].type === "pseudo-element") { + pseudoElements.push(i); + } + } + if (pseudoElements.length > 1) { + for (let j = pseudoElements.length - 1; j > 0; j--) { + parsedSelector.splice(pseudoElements[j], 1); + } + return CSSwhat.stringify([parsedSelector]); + } else { + return selector; + } +} + function replaceVariables( rules: ParsedCSSRulesObjValue, ): ParsedCSSRulesObjValue { @@ -59,7 +106,7 @@ function replaceVariables( const { root } = postcss([postcssVarReplace()]).process(styleSheet); const replaced: ParsedCSSRulesObjValue = {}; root.walkRules((rule) => { - const selector = rule.selector; + const selector = fixSelector(rule.selector); if (!replaced[selector]) { replaced[selector] = {}; } @@ -135,8 +182,16 @@ function rewriteSelectors(parsed: ParsedCSS, id: string): ParsedCSSRules { return rules; } +function removeOrigins(parsed: ParsedCSS, originsToRemove: string[]): void { + for (let i = parsed.matched.length - 1; i >= 0; --i) { + if (originsToRemove.includes(parsed.matched[i].origin)) { + parsed.matched.splice(i, 1); + } + } +} + function getInlineText( - node: NodeWithId, + node: CDPNodeWithId, parsedCSSs: ParsedCSS[], mediaConditions: string[], optimizers: Optimizer[], @@ -144,8 +199,11 @@ function getInlineText( const mediaRules: ParsedStyleSheetObjValue = {}; for (let i = 0; i < parsedCSSs.length; i++) { const parsed = parsedCSSs[i]; + removeOrigins(parsed, ["user-agent"]); const rules = rewriteSelectors(parsed, node.id!); - invokeOptimizers(optimizers, "afterRewriteSelectors", node, rules); + for (const optimizer of optimizers) { + optimizer.afterRewriteSelectors(node, rules); + } const inlineRules = cascade(rules); mediaRules[mediaConditions[i]] = replaceVariables(inlineRules); @@ -209,37 +267,33 @@ function getInlineText( return style; } -function setIdAttrs(node): NodeWithId { +function initIdCSS(node: CDPNode): CDPNodeWithId { let id = `node-${node.nodeId}`; let hasId = false; - /* - if (!node.attributes) { - const { attributes } = await DOM.getAttributes({ - nodeId: node.nodeId, - }); - node.attributes = attributes; - } - */ - for (let i = 0; i < node.attributes.length; i += 2) { - if (node.attributes[i] === "id") { - id = node.attributes[i + 1]; - if (id.includes(":")) { - // can break selector - id = id.replace(/:/g, "-"); - node.attributes[i + 1] = id; + + if (node.attributes) { + for (let i = 0; i < node.attributes.length; i += 2) { + if (node.attributes[i] === "id") { + id = node.attributes[i + 1]; + if (id.includes(":")) { + // can break selector + id = id.replace(/:/g, "-"); + node.attributes[i + 1] = id; + } + hasId = true; + break; } - hasId = true; - break; } - } - if (!hasId) { - node.attributes.push("id", id); + if (!hasId) { + node.attributes.push("id", id); + } } node.id = id; - return node; + node.css = []; + return node as CDPNodeWithId; } -function mergeTrees(roots: NodeWithId[], nScreens: number): NodeWithId { +function mergeTrees(roots: CDPNodeWithId[], nScreens: number): CDPNodeWithId { const mergedRoot = roots[0]; // merge css, filling missing with display: none if (mergedRoot.nodeType === CDPNodeType.ELEMENT_NODE) { @@ -275,7 +329,7 @@ function mergeTrees(roots: NodeWithId[], nScreens: number): NodeWithId { return mergedRoot; } - const nodeMap = new Map(); + const nodeMap = new Map(); for (const root of roots) { if (root.children) { @@ -297,14 +351,17 @@ function mergeTrees(roots: NodeWithId[], nScreens: number): NodeWithId { } function inlineStyle( - document: Document, // JSDOM or browser DOM + element: Element, // JSDOM or browser DOM cssAttr = "data-css", removeAttr = true, -) { +): { element: Element; rootStyle?: Element } { // clean scripts/styles/links - document.querySelectorAll("script, link, style").forEach((el) => el.remove()); + element.querySelectorAll("script, link, style").forEach((el) => el.remove()); + + let rootStyle: Element | undefined; - const elements = document.querySelectorAll(`[${cssAttr}]`); + const elements = Array.from(element.querySelectorAll(`[${cssAttr}]`)); + elements.push(element); // include root element for (const el of elements) { const cssText = el.getAttribute(cssAttr); if (cssText) { @@ -313,7 +370,7 @@ function inlineStyle( // inline style can contain variables and override resolved stylesheet (el as HTMLElement).removeAttribute("style"); - const styleEl = document.createElement("style"); + const styleEl = element.ownerDocument.createElement("style"); styleEl.textContent = cssText; // keep here for stringify and eval const noChildTags = [ @@ -343,7 +400,8 @@ function inlineStyle( if (noChildTags.includes(el.tagName) || el.children.length === 0) { // prevent break :empty for those with no children // still may break :nth-child() - el.parentNode.insertBefore(styleEl, el); + if (el === element) rootStyle = styleEl; + else el.parentNode.insertBefore(styleEl, el); } else { el.insertBefore(styleEl, el.children[0]); } @@ -363,14 +421,72 @@ function inlineStyle( } } } + return { element, rootStyle }; +} + +function buildNodeTree( + cdpNode: CDPNodeWithId, + document: Document, +): Node | null { + let docNode: Node; + + switch (cdpNode.nodeType) { + case CDPNodeType.ELEMENT_NODE: + // iframe is safe because no children (not setting pierce) + docNode = document.createElement(cdpNode.localName); + + if (Array.isArray(cdpNode.attributes)) { + for (let i = 0; i < cdpNode.attributes.length; i += 2) { + (docNode as HTMLElement).setAttribute( + cdpNode.attributes[i], + cdpNode.attributes[i + 1], + ); + } + } + break; + + case CDPNodeType.TEXT_NODE: + docNode = document.createTextNode(cdpNode.nodeValue || ""); + break; + + case CDPNodeType.COMMENT_NODE: + docNode = document.createComment(cdpNode.nodeValue || ""); + break; + + default: + return null; + } + + // Recursively add children + if (cdpNode.children) { + for (const child of cdpNode.children) { + const childNode = buildNodeTree(child, document); + if (childNode) docNode.appendChild(childNode); + } + } + return docNode; +} + +function getFreezedCdpTree(cdpNode: CDPNode): CDPNodeWithId { + const nodeWithId = initIdCSS({ ...cdpNode }); + nodeWithId.children = []; + for (const child of cdpNode.children || []) { + nodeWithId.children.push(getFreezedCdpTree(child)); + } + return nodeWithId; } async function getInlinedComponent( selector: string, inspector: Inspector, + onProgress: ( + completed: number, + total: number, + deviceIndex: number, + ) => void = () => {}, onError: (e: any) => void = () => {}, options: InlineOptions = {}, -): Promise { +): Promise<{ element: Element; rootStyle?: Element }> { const { highlightNode = false } = options; let { customScreens, mediaConditions } = options; if (!customScreens) { @@ -386,86 +502,90 @@ async function getInlinedComponent( new AriaExpandedOptimizer(), new PrunePsuedoElementOptimizer(), ]; - const roots = []; + + const warnChildNodeRemoved = (params) => { + onError( + `Warning: DOM.childNodeRemoved triggered during tree freezed: ${JSON.stringify( + params, + )}`, + ); + }; + + const freezedRoots = []; for (let i = 0; i < customScreens.length; ++i) { - const node = await inspector.inspect(selector, { - depth: -1, - computed: false, - parseOptions: { excludeOrigin: ["user-agent"], removeUnusedVar: true }, - customScreen: customScreens[i], - beforeTraverse: async (rootNode, inspector, rootElement) => { - await invokeOptimizers( - optimizers, - "beforeTraverse", - rootNode, - inspector, - rootElement, - ); + if (customScreens[i]) { + await inspector.setDevice(customScreens[i]); + } + const root = inspector.querySelector(selector); + for (const optimizer of optimizers) { + await optimizer.beforeTraverse(root); + } + + // need to await to transfer execution to inspector to update the node info + // and wait DOM change after changing device metrics + await new Promise((resolve) => setTimeout(resolve, 500)); + + inspector.on("DOM.childNodeRemoved", warnChildNodeRemoved); + const freezedCdpRoot = getFreezedCdpTree(root._cdpNode); + + let total = 0; + await traverse( + freezedCdpRoot, + async (freezedNode: CDPNodeWithId) => { + total += 1; }, - beforeGetMatchedStyle: async (node, inspector, rootElement) => { + onError, + -1, + false, + ); + + let completed = 0; + await traverse( + freezedCdpRoot, + async (freezedNode: CDPNodeWithId) => { + const inspectorElement = inspector.getNodeByNodeId( + freezedNode.nodeId, + ) as InspectorElement; if (highlightNode) { - const objectId = await inspector.getNodeObjectId(node); - await inspector.scrollToNode(objectId); - await inspector.highlightNode(objectId); + await inspectorElement.scrollIntoView(); + await inspectorElement.highlight(); } - await invokeOptimizers( - optimizers, - "beforeForcePseudo", - node, - inspector, - rootElement, - ); + for (const optimizer of optimizers) { + await optimizer.beforeForcePseudo(inspectorElement); + } - // Force all pseudo classes - await inspector.sendCommand("CSS.forcePseudoState", { - nodeId: node.nodeId, - forcedPseudoClasses: forciblePseudoClasses, - }); - }, - afterGetMatchedStyle: async (node, inspector, rootElement) => { - await invokeOptimizers( - optimizers, - "afterForcePseudo", - node, - inspector, - rootElement, + await inspector.forcePseudoState( + inspectorElement, + forciblePseudoClasses, ); - // Cleanup forced pseudo classes - await inspector.sendCommand("CSS.forcePseudoState", { - nodeId: node.nodeId, - forcedPseudoClasses: [], - }); - - if (highlightNode) { - await inspector.hideHighlight(); + for (const optimizer of optimizers) { + await optimizer.afterForcePseudo(inspectorElement); } - }, - }); - // label css by screen idx - await traverse( - node, - (n) => { - n.css = []; - n.css[i] = n.styles; + + const resp = (await inspectorElement.getMatchedStyles({ + raw: true, + })) as GetMatchedStylesForNodeResponse; + // use parser in workspace for easier debugging + freezedNode.css[i] = parseGetMatchedStylesForNodeResponse(resp, { + removeUnusedVar: true, + }); + await inspector.forcePseudoState(inspectorElement, []); // reset forced pseudo states + onProgress(++completed, total, i); }, onError, -1, - true, + false, ); - roots.push(node); + inspector.off("DOM.childNodeRemoved", warnChildNodeRemoved); + if (highlightNode) { + await inspector.hideHighlight(); + } + freezedRoots.push(freezedCdpRoot); } - const root = mergeTrees(roots, customScreens.length); - await traverse( - root, - (node) => { - setIdAttrs(node); - }, - onError, - -1, - true, - ); + + const root = mergeTrees(freezedRoots, customScreens.length); // after all node.id are set await traverse( root, @@ -482,9 +602,11 @@ async function getInlinedComponent( -1, true, ); - const doc = Inspector.nodeToDOM(root); - inlineStyle(doc); - return doc; + const elementRoot = buildNodeTree( + root, + inspector.documentImpl.createHTMLDocument(), + ) as Element; + return inlineStyle(elementRoot); } export { getInlinedComponent }; diff --git a/packages/@devtoolcss-inliner/src/optimizers/AriaExpanded.ts b/packages/@devtoolcss-inliner/src/optimizers/AriaExpanded.ts index 741c9cf..c561152 100644 --- a/packages/@devtoolcss-inliner/src/optimizers/AriaExpanded.ts +++ b/packages/@devtoolcss-inliner/src/optimizers/AriaExpanded.ts @@ -1,15 +1,15 @@ -import type { Inspector, Node } from "@devtoolcss/inspector"; import type { Optimizer } from "./optimizer.js"; -import { parseCSSProperties } from "@devtoolcss/parser"; -import type { ParsedCSSRules, NodeWithId } from "../types.js"; +import { ParsedCSS } from "@devtoolcss/parser"; +import type { ParsedCSSRules, CDPNodeWithId } from "../types.js"; +import type { InspectorElement } from "chrome-inspector"; /** handling li:has([aria-expanded]) nodes. */ export class AriaExpandedOptimizer implements Optimizer { checkChildrenNodeIds: Set; - childrenStyleBefore: Map; - childrenStyleAfter: Map; + childrenStyleBefore: Map; + childrenStyleAfter: Map; constructor() { this.checkChildrenNodeIds = new Set(); @@ -21,16 +21,10 @@ export class AriaExpandedOptimizer implements Optimizer { * To be run in beforeTraverse. * Collects li:has([aria-expanded]) nodeIds from the rootElement. */ - async beforeTraverse( - rootNode: Node, - inspector: Inspector, - rootElement: Element, - ): Promise { + async beforeTraverse(root: InspectorElement): Promise { try { - rootElement.querySelectorAll("li:has([aria-expanded])").forEach((el) => { - this.checkChildrenNodeIds.add( - Number(el.attributes["data-nodeId"].value), - ); + root.querySelectorAll("li:has([aria-expanded])").forEach((el) => { + this.checkChildrenNodeIds.add(Number(el._cdpNode.nodeId)); }); } catch {} } @@ -38,72 +32,61 @@ export class AriaExpandedOptimizer implements Optimizer { /** * To be run before forcePseudoState. */ - async beforeForcePseudo( - node: Node, - inspector: Inspector, - rootElement: Element, - ): Promise { + async beforeForcePseudo(element: InspectorElement): Promise { // Collect children styles before forcing pseudo state - if (this.checkChildrenNodeIds.has(node.nodeId) && node.children) { + if ( + this.checkChildrenNodeIds.has(element._cdpNode.nodeId) && + element.children + ) { const childrenStyleBefore = []; - for (let i = 0; i < node.children.length; ++i) { - const child = node.children[i]; - const childrenStyle = await inspector.sendCommand( - "CSS.getMatchedStylesForNode", - { - nodeId: child.nodeId, - }, - ); + for (const child of element.children) { + const childrenStyle = await child.getMatchedStyles(); childrenStyleBefore.push(childrenStyle); } - this.childrenStyleBefore.set(node.nodeId, childrenStyleBefore); + this.childrenStyleBefore.set( + element._cdpNode.nodeId, + childrenStyleBefore, + ); } } /** * To be run before cleanup forcePseudo. */ - async afterForcePseudo( - node: Node, - inspector: Inspector, - rootElement: Element, - ): Promise { + async afterForcePseudo(element: InspectorElement): Promise { // Collect children styles after forcing pseudo state - if (this.checkChildrenNodeIds.has(node.nodeId) && node.children) { + if ( + this.checkChildrenNodeIds.has(element._cdpNode.nodeId) && + element.children + ) { const childrenStyleAfter = []; - for (let i = 0; i < node.children.length; ++i) { - const child = node.children[i]; - const childrenStyle = await inspector.sendCommand( - "CSS.getMatchedStylesForNode", - { - nodeId: child.nodeId, - }, - ); + for (const child of element.children) { + const childrenStyle = await child.getMatchedStyles(); childrenStyleAfter.push(childrenStyle); } - this.childrenStyleAfter.set(node.nodeId, childrenStyleAfter); + this.childrenStyleAfter.set(element._cdpNode.nodeId, childrenStyleAfter); } } /* * To be run after after rewriteSelectors before cascade. */ - afterRewriteSelectors(node: NodeWithId, rules: ParsedCSSRules): void { + afterRewriteSelectors(node: CDPNodeWithId, rules: ParsedCSSRules): void { const childrenStyleBefore = this.childrenStyleBefore.get(node.nodeId) || []; const childrenStyleAfter = this.childrenStyleAfter.get(node.nodeId) || []; if (childrenStyleBefore.length > 0 && childrenStyleAfter.length > 0) { for (let i = 0; i < node.children.length; ++i) { const serializedRuleSet = new Set(); - for (const ruleMatch of childrenStyleBefore[i].matchedCSSRules) { + for (const ruleMatch of childrenStyleBefore[i].matched) { serializedRuleSet.add(JSON.stringify(ruleMatch)); } - for (const ruleMatch of childrenStyleAfter[i].matchedCSSRules) { + for (const ruleMatch of childrenStyleAfter[i].matched) { if (!serializedRuleSet.has(JSON.stringify(ruleMatch))) { // TODO: parse selector to determine pseudo class const selector = `#${node.id}:hover > #${node.children[i].id}`; if (!rules[selector]) rules[selector] = []; - rules[selector].push(...parseCSSProperties(ruleMatch.rule.style)); + rules[selector].push(...ruleMatch.properties); } } } diff --git a/packages/@devtoolcss-inliner/src/optimizers/PrunePseudoElement.ts b/packages/@devtoolcss-inliner/src/optimizers/PrunePseudoElement.ts index bf76439..981b74c 100644 --- a/packages/@devtoolcss-inliner/src/optimizers/PrunePseudoElement.ts +++ b/packages/@devtoolcss-inliner/src/optimizers/PrunePseudoElement.ts @@ -1,6 +1,6 @@ -import type { Inspector, Node } from "@devtoolcss/inspector"; +import type { InspectorElement } from "chrome-inspector"; import type { Optimizer } from "./optimizer.js"; -import type { ParsedCSSRules, NodeWithId } from "../types.js"; +import type { ParsedCSSRules, CDPNodeWithId } from "../types.js"; import { getNormalizedSuffix } from "../utils.js"; import * as CSSwhat from "css-what"; @@ -10,37 +10,22 @@ import * as CSSwhat from "css-what"; export class PrunePsuedoElementOptimizer implements Optimizer { constructor() {} - async beforeTraverse( - rootNode: Node, - inspector: Inspector, - rootElement: Element, - ): Promise {} + async beforeTraverse(element: InspectorElement): Promise {} - async beforeForcePseudo( - node: Node, - inspector: Inspector, - rootElement: Element, - ): Promise {} + async beforeForcePseudo(element: InspectorElement): Promise {} - async afterForcePseudo( - node: Node, - inspector: Inspector, - rootElement: Element, - ): Promise {} + async afterForcePseudo(element: InspectorElement): Promise {} /** * clean up after rewriteSelectors. */ - afterRewriteSelectors(node: NodeWithId, rules: ParsedCSSRules): void { + afterRewriteSelectors(node: CDPNodeWithId, rules: ParsedCSSRules): void { for (const [selector, properties] of Object.entries(rules)) { const suffix = getNormalizedSuffix(CSSwhat.parse(selector)[0]); if (suffix.endsWith("before") || suffix.endsWith("after")) { let hasIneffectiveContent = true; for (const prop of properties) { - if ( - prop.name === "content" && - !["normal", '""', "''"].includes(prop.value) - ) { + if (prop.name === "content" && prop.value !== "normal") { hasIneffectiveContent = false; } } diff --git a/packages/@devtoolcss-inliner/src/optimizers/index.ts b/packages/@devtoolcss-inliner/src/optimizers/index.ts index b214ee5..51138d9 100644 --- a/packages/@devtoolcss-inliner/src/optimizers/index.ts +++ b/packages/@devtoolcss-inliner/src/optimizers/index.ts @@ -1,36 +1,2 @@ -import { Optimizer, OptimizerMethodArgs } from "./optimizer.js"; export { AriaExpandedOptimizer } from "./AriaExpanded.js"; export { PrunePsuedoElementOptimizer } from "./PrunePseudoElement.js"; - -type SyncMethodNames = "afterRewriteSelectors"; -type AsyncMethodNames = - | "beforeTraverse" - | "beforeForcePseudo" - | "afterForcePseudo"; - -// Overload for async methods -export function invokeOptimizers( - optimizers: Optimizer[], - methodName: K, - ...args: OptimizerMethodArgs[K] -): Promise; - -// Overload for sync methods -export function invokeOptimizers( - optimizers: Optimizer[], - methodName: K, - ...args: OptimizerMethodArgs[K] -): void; - -// Implementation -export function invokeOptimizers( - optimizers: Optimizer[], - methodName: K, - ...args: OptimizerMethodArgs[K] -): void | Promise { - const results = optimizers.map((opt) => opt[methodName].apply(opt, args)); - // Check if any result is a Promise (async) - if (results.some((r) => r instanceof Promise)) { - return Promise.all(results).then(() => {}); // .then ensure Promise - } -} diff --git a/packages/@devtoolcss-inliner/src/optimizers/optimizer.ts b/packages/@devtoolcss-inliner/src/optimizers/optimizer.ts index fedfd59..2ca961d 100644 --- a/packages/@devtoolcss-inliner/src/optimizers/optimizer.ts +++ b/packages/@devtoolcss-inliner/src/optimizers/optimizer.ts @@ -1,5 +1,9 @@ -import type { Inspector, Node } from "@devtoolcss/inspector"; -import type { ParsedCSSRules, NodeWithId } from "../types.js"; +import type { ParsedCSSRules, CDPNodeWithId } from "../types.js"; +import type { + Inspector, + InspectorNode, + InspectorElement, +} from "chrome-inspector"; /** * Optimizer interface for CSS optimizations. @@ -12,42 +16,23 @@ export interface Optimizer { * To be run in beforeTraverse. * Collects nodeIds or performs setup before traversal. */ - beforeTraverse( - rootNode: Node, - inspector: Inspector, - rootElement: Element, - ): Promise; + beforeTraverse(root: InspectorElement): Promise; /** * To be run before forcePseudoState. * Collects styles or performs setup before forcing pseudo state. */ - beforeForcePseudo( - node: Node, - inspector: Inspector, - rootElement: Element, - ): Promise; + beforeForcePseudo(element: InspectorElement): Promise; /** * To be run after forcePseudoState cleanup. * Collects styles or performs cleanup after forcing pseudo state. */ - afterForcePseudo( - node: Node, - inspector: Inspector, - rootElement: Element, - ): Promise; + afterForcePseudo(element: InspectorElement): Promise; /** * To be run after rewriteSelectors before cascade. * Performs actions after selectors are rewritten. */ - afterRewriteSelectors(node: NodeWithId, rules: ParsedCSSRules): void; + afterRewriteSelectors(node: CDPNodeWithId, rules: ParsedCSSRules): void; } - -export type OptimizerMethodArgs = { - beforeTraverse: [rootNode: Node, inspector: Inspector, rootElement: Element]; - beforeForcePseudo: [node: Node, inspector: Inspector, rootElement: Element]; - afterForcePseudo: [node: Node, inspector: Inspector, rootElement: Element]; - afterRewriteSelectors: [node: NodeWithId, rules: ParsedCSSRules]; -}; diff --git a/packages/@devtoolcss-inliner/src/types.ts b/packages/@devtoolcss-inliner/src/types.ts index f8452ef..c5840a4 100644 --- a/packages/@devtoolcss-inliner/src/types.ts +++ b/packages/@devtoolcss-inliner/src/types.ts @@ -1,10 +1,14 @@ -import type { Node, Screen } from "@devtoolcss/inspector"; +import type { Device, CDPNode } from "chrome-inspector"; import type { ParsedCSSPropertyObject, ParsedCSSPropertyValue, } from "@devtoolcss/parser"; -export type NodeWithId = Node & { id: string; children?: NodeWithId[] }; +export type CDPNodeWithId = CDPNode & { + id: string; + children: CDPNodeWithId[]; + css: any[]; +}; export type ParsedCSSRules = { [selector: string]: ParsedCSSPropertyValue[]; @@ -20,6 +24,6 @@ export type ParsedStyleSheetObjValue = { export type InlineOptions = { highlightNode?: boolean; - customScreens?: Screen[]; + customScreens?: Device[]; mediaConditions?: string[]; }; diff --git a/packages/@devtoolcss-parser/package.json b/packages/@devtoolcss-parser/package.json index 2281f71..3989c57 100644 --- a/packages/@devtoolcss-parser/package.json +++ b/packages/@devtoolcss-parser/package.json @@ -1,6 +1,6 @@ { "name": "@devtoolcss/parser", - "version": "0.0.8", + "version": "1.0.1", "description": "", "license": "MIT", "files": [ diff --git a/packages/@devtoolcss-parser/src/css_parser.ts b/packages/@devtoolcss-parser/src/css_parser.ts index 33517b3..9fe8bfb 100644 --- a/packages/@devtoolcss-parser/src/css_parser.ts +++ b/packages/@devtoolcss-parser/src/css_parser.ts @@ -282,7 +282,7 @@ export function parseGetMatchedStylesForNodeResponse( appliedProperties, false, ); - parsed.pseudoElements[match.pseudoType] = parsedRules; + parsed.pseudoElements.push(...parsedRules); } } diff --git a/packages/cleanclone/package.json b/packages/cleanclone/package.json index ec2d3e9..364286b 100644 --- a/packages/cleanclone/package.json +++ b/packages/cleanclone/package.json @@ -1,6 +1,6 @@ { "name": "cleanclone", - "version": "0.0.8", + "version": "1.0.2", "description": "Inline DevTool-parsed CSS for any website and crawl it on the fly.", "license": "MIT", "files": [ @@ -26,8 +26,8 @@ "type": "module", "dependencies": { "@devtoolcss/inliner": "workspace:*", - "@devtoolcss/inspector": "workspace:*", "chalk": "^5.6.2", + "chrome-inspector": "^1.0.3", "chrome-launcher": "^1.2.1", "chrome-remote-interface": "^0.33.3", "escape-html": "^1.0.3", diff --git a/packages/cleanclone/src/crawler.ts b/packages/cleanclone/src/crawler.ts index ac82ce9..edcfa4c 100644 --- a/packages/cleanclone/src/crawler.ts +++ b/packages/cleanclone/src/crawler.ts @@ -3,7 +3,7 @@ import path from "path"; import { EventEmitter } from "events"; import CDP from "chrome-remote-interface"; import * as ChromeLauncher from "chrome-launcher"; -import { Inspector, type Screen } from "@devtoolcss/inspector"; +import { Inspector, type Device } from "chrome-inspector"; import { getInlinedComponent } from "@devtoolcss/inliner"; import { getAvailableFilename, @@ -88,7 +88,7 @@ export class Crawler extends EventEmitter { private downloadedURLs = new Set(); private assetDir = ""; private fontCSSPath = ""; - private screens: Screen[] = []; + private screens: Device[] = []; private mediaConditions: string[]; private toHighlight = false; @@ -484,21 +484,27 @@ export class Crawler extends EventEmitter { }); // @ts-ignore - const inspector = Inspector.fromCDPClient(client); - inspector.on("progress", ({ completed, total }) => { - this.emitProgress({ - crawlProgress: { - processedElements: completed, - totalElements: total, - }, - }); - }); + const inspector = await Inspector.fromCDPClient(client); inspector.on("error", this.onError); - const doc = await getInlinedComponent("body", inspector, this.onError, { - customScreens: this.screens, - mediaConditions: this.mediaConditions, - highlightNode: this.toHighlight, - }); + const { element: body } = await getInlinedComponent( + "body", + inspector, + (completed, total, deviceIndex) => { + this.emitProgress({ + crawlProgress: { + processedElements: completed, + totalElements: total, + deviceIndex, + }, + }); + }, + this.onError, + { + customScreens: this.screens, + mediaConditions: this.mediaConditions, + highlightNode: this.toHighlight, + }, + ); // stop recording requests // @ts-ignore TODO: fix typing upstream @@ -544,17 +550,19 @@ export class Crawler extends EventEmitter { pageBase = path.dirname(path.join(pagePath, "dummy")); } const origin = getOrigin(pageURL); - normalizeSameSiteHref(doc, origin); - // Insert the font link tag as the first child of - const fontLink = doc.createElement("link"); - fontLink.rel = "stylesheet"; - fontLink.href = "/fonts.css"; - const head = doc.querySelector("head"); - head.insertBefore(fontLink, head.firstChild); - const rawHtml = doc.documentElement.outerHTML; - let outerHTML = - "\n" + - rewriteResourceLinks(origin, pageBase, resources, rawHtml); + normalizeSameSiteHref(body, origin); + const bodyHTML = rewriteResourceLinks( + origin, + pageBase, + resources, + body.outerHTML, + ); + let outerHTML = ` + + +${bodyHTML} + +`; outerHTML = beautify.html(outerHTML, { indent_size: 2, wrap_line_length: 0, // disable line wrapping @@ -567,7 +575,7 @@ export class Crawler extends EventEmitter { await client.close(); } - private buildScreens(): Screen[] { + private buildScreens(): Device[] { return this.cfg.deviceWidths.map((width) => ({ width, height: this.cfg.screenHeight, diff --git a/packages/cleanclone/src/rewrite.ts b/packages/cleanclone/src/rewrite.ts index 3c9bd86..3e07d15 100644 --- a/packages/cleanclone/src/rewrite.ts +++ b/packages/cleanclone/src/rewrite.ts @@ -54,8 +54,8 @@ export function rewriteResourceLinks( return outerHTML; } -export function normalizeSameSiteHref(doc: Document, origin: string) { - doc.querySelectorAll("a").forEach((el) => { +export function normalizeSameSiteHref(body: Element, origin: string) { + body.querySelectorAll("a").forEach((el) => { if (el.href) { try { const url = new URL(el.href, origin); diff --git a/packages/uiexport/manifest.json b/packages/uiexport/manifest.json index caf609b..b597fa3 100644 --- a/packages/uiexport/manifest.json +++ b/packages/uiexport/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 3, "name": "UI Export", - "version": "0.0.8", + "version": "1.0.1", "description": "Export any components with CSS inlined.", "permissions": ["debugger"], "devtools_page": "devtools.html", diff --git a/packages/uiexport/package.json b/packages/uiexport/package.json index 02bbe26..636188e 100644 --- a/packages/uiexport/package.json +++ b/packages/uiexport/package.json @@ -1,6 +1,6 @@ { "name": "uiexport", - "version": "0.0.8", + "version": "1.0.1", "private": true, "description": "", "author": "", @@ -12,7 +12,7 @@ }, "dependencies": { "@devtoolcss/inliner": "workspace:*", - "@devtoolcss/inspector": "workspace:*", + "chrome-inspector": "^1.0.3", "highlight.js": "^11.11.1", "js-beautify": "^1.15.4" }, diff --git a/packages/uiexport/scripts/watch.js b/packages/uiexport/scripts/watch.js index 129ab15..1011ce9 100644 --- a/packages/uiexport/scripts/watch.js +++ b/packages/uiexport/scripts/watch.js @@ -25,7 +25,7 @@ chokidar.watch(".").on("change", (path) => { // any js change could affect the bundle console.log(`Rebuilding due to change in ${path}`); exec( - "NODE_ENV=development node esbuild.config.js", + "NODE_ENV=development node scripts/esbuild.config.js", (error, stdout, stderr) => { if (error) { console.error(`Error during build: ${stderr}`); diff --git a/packages/uiexport/sidebar.js b/packages/uiexport/sidebar.js index cc58ba2..41bbe26 100644 --- a/packages/uiexport/sidebar.js +++ b/packages/uiexport/sidebar.js @@ -1,6 +1,6 @@ /// -import { Inspector } from "@devtoolcss/inspector"; +import { Inspector } from "chrome-inspector"; import { getInlinedComponent } from "@devtoolcss/inliner"; import { getUniqueSelector } from "./selector.js"; @@ -52,16 +52,19 @@ const exportBtn = document.getElementById("exportBtn"); try { await chrome.debugger.attach(target, "1.3"); const selector = await inspectedWindowEval(getUniqueSelector, "$0"); - const inspector = Inspector.fromChromeDebugger( + const inspector = await Inspector.fromChromeDebugger( chrome.debugger, target.tabId, ); - inspector.on("progress", (progress) => { - updateProgress(progress.completed, progress.total); - }); - const doc = await getInlinedComponent(selector, inspector); + const { element, rootStyle } = await getInlinedComponent( + selector, + inspector, + updateProgress, + ); - iframe.contentDocument.body.innerHTML = doc.body.innerHTML; + iframe.contentDocument.body.innerHTML = rootStyle + ? rootStyle.outerHTML + "\n" + element.outerHTML + : element.outerHTML; await chrome.debugger.detach(target); } catch (e) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 819b644..e95c0cd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,24 +12,2165 @@ importers: specifier: ^5.9.2 version: 5.9.3 + packages/@devtoolcss-inliner: + dependencies: + '@devtoolcss/parser': + specifier: workspace:* + version: link:../@devtoolcss-parser + chrome-inspector: + specifier: ^1.0.3 + version: 1.0.3 + css-what: + specifier: ^7.0.0 + version: 7.0.0 + postcss: + specifier: ^8.5.6 + version: 8.5.6 + postcss-var-replace: + specifier: ^1.0.0 + version: 1.0.0(postcss@8.5.6) + devDependencies: + devtools-protocol: + specifier: ^0.0.1528500 + version: 0.0.1528500 + + packages/@devtoolcss-mcp: + dependencies: + chrome-inspector: + specifier: ^1.0.6 + version: 1.0.6 + js-beautify: + specifier: ^1.15.4 + version: 1.15.4 + ws: + specifier: ^8.18.3 + version: 8.18.3 + devDependencies: + '@types/chrome': + specifier: ^0.1.27 + version: 0.1.27 + chokidar: + specifier: ^4.0.3 + version: 4.0.3 + esbuild: + specifier: ^0.27.0 + version: 0.27.0 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + packages/@devtoolcss-parser: devDependencies: devtools-protocol: specifier: ^0.0.1528500 version: 0.0.1528500 + packages/cleanclone: + dependencies: + '@devtoolcss/inliner': + specifier: workspace:* + version: link:../@devtoolcss-inliner + chalk: + specifier: ^5.6.2 + version: 5.6.2 + chrome-inspector: + specifier: ^1.0.3 + version: 1.0.3 + chrome-launcher: + specifier: ^1.2.1 + version: 1.2.1 + chrome-remote-interface: + specifier: ^0.33.3 + version: 0.33.3 + escape-html: + specifier: ^1.0.3 + version: 1.0.3 + escape-string-regexp: + specifier: ^5.0.0 + version: 5.0.0 + ink: + specifier: ^6.3.0 + version: 6.4.0(@types/react@19.2.2)(react@19.2.0) + js-beautify: + specifier: ^1.15.4 + version: 1.15.4 + jsdom: + specifier: ^26.1.0 + version: 26.1.0 + react: + specifier: ^19.1.1 + version: 19.2.0 + yargs: + specifier: ^18.0.0 + version: 18.0.0 + devDependencies: + '@types/chrome-remote-interface': + specifier: ^0.31.14 + version: 0.31.14 + '@types/js-beautify': + specifier: ^1.14.3 + version: 1.14.3 + '@types/jsdom': + specifier: ^21.1.7 + version: 21.1.7 + '@types/node': + specifier: ^24.3.1 + version: 24.10.0 + '@types/react': + specifier: ^19.1.13 + version: 19.2.2 + '@types/yargs': + specifier: ^17.0.33 + version: 17.0.34 + devtools-protocol: + specifier: 0.0.927104 + version: 0.0.927104 + + packages/uiexport: + dependencies: + '@devtoolcss/inliner': + specifier: workspace:* + version: link:../@devtoolcss-inliner + chrome-inspector: + specifier: ^1.0.3 + version: 1.0.3 + highlight.js: + specifier: ^11.11.1 + version: 11.11.1 + js-beautify: + specifier: ^1.15.4 + version: 1.15.4 + devDependencies: + '@types/chrome': + specifier: ^0.1.12 + version: 0.1.27 + chokidar: + specifier: ^4.0.3 + version: 4.0.3 + esbuild: + specifier: 0.25.10 + version: 0.25.10 + packages: + '@acemir/cssom@0.9.22': + resolution: {integrity: sha512-QviHW7uL3M3oQ5b5z+6AqDe+ZzJ3XeLLKNaD+XbuRIMkeAZ/FsL7zIle0V+YR5bllZDL4s1i+NYx8wNGNpnQTg==} + + '@alcalzone/ansi-tokenize@0.2.2': + resolution: {integrity: sha512-mkOh+Wwawzuf5wa30bvc4nA+Qb6DIrGWgBhRR/Pw4T9nsgYait8izvXkNyU78D6Wcu3Z+KUdwCmLCxlWjEotYA==} + engines: {node: '>=18'} + + '@asamuzakjp/css-color@3.2.0': + resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} + + '@asamuzakjp/css-color@4.0.5': + resolution: {integrity: sha512-lMrXidNhPGsDjytDy11Vwlb6OIGrT3CmLg3VWNFyWkLWtijKl7xjvForlh8vuj0SHGjgl4qZEQzUmYTeQA2JFQ==} + + '@asamuzakjp/dom-selector@6.7.4': + resolution: {integrity: sha512-buQDjkm+wDPXd6c13534URWZqbz0RP5PAhXZ+LIoa5LgwInT9HVJvGIJivg75vi8I13CxDGdTnz+aY5YUJlIAA==} + + '@asamuzakjp/nwsapi@2.3.9': + resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} + + '@csstools/color-helpers@5.1.0': + resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} + engines: {node: '>=18'} + + '@csstools/css-calc@2.1.4': + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-color-parser@3.1.0': + resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-syntax-patches-for-csstree@1.0.15': + resolution: {integrity: sha512-q0p6zkVq2lJnmzZVPR33doA51G7YOja+FBvRdp5ISIthL0MtFCgYHHhR563z9WFGxcOn0WfjSkPDJ5Qig3H3Sw==} + engines: {node: '>=18'} + + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} + engines: {node: '>=18'} + + '@devtoolcss/parser@1.0.1': + resolution: {integrity: sha512-XtSIgT9OVJLL4jpJ2bk+d2TXk87P8oDo7IdV4BuyQIBa+xvj73BUzOn6sl9VPCk1d146indN3pcjYjg9SSBIbQ==} + + '@esbuild/aix-ppc64@0.25.10': + resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.27.0': + resolution: {integrity: sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.10': + resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.27.0': + resolution: {integrity: sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.10': + resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.27.0': + resolution: {integrity: sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.10': + resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.27.0': + resolution: {integrity: sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.10': + resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.27.0': + resolution: {integrity: sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.10': + resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.0': + resolution: {integrity: sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.10': + resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.27.0': + resolution: {integrity: sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.10': + resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.0': + resolution: {integrity: sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.10': + resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.27.0': + resolution: {integrity: sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.10': + resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.27.0': + resolution: {integrity: sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.10': + resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.27.0': + resolution: {integrity: sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.10': + resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.27.0': + resolution: {integrity: sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.10': + resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.27.0': + resolution: {integrity: sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.10': + resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.27.0': + resolution: {integrity: sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.10': + resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.0': + resolution: {integrity: sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.10': + resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.27.0': + resolution: {integrity: sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.10': + resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.27.0': + resolution: {integrity: sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.10': + resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-arm64@0.27.0': + resolution: {integrity: sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.10': + resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.0': + resolution: {integrity: sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.10': + resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-arm64@0.27.0': + resolution: {integrity: sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.10': + resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.0': + resolution: {integrity: sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.10': + resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/openharmony-arm64@0.27.0': + resolution: {integrity: sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.10': + resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.27.0': + resolution: {integrity: sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.10': + resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.27.0': + resolution: {integrity: sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.10': + resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.27.0': + resolution: {integrity: sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.10': + resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.27.0': + resolution: {integrity: sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@one-ini/wasm@0.1.1': + resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@types/chrome-remote-interface@0.31.14': + resolution: {integrity: sha512-H9hTcLu1y+Ms6GDPXXeGhgxaOSD69yEo674vjJw5EeW1tTwYo8fEkf7A9nWlnO6ArJsS7c41iZeX6mRDQ1LhEw==} + + '@types/chrome@0.1.27': + resolution: {integrity: sha512-pkkCb0Ft8X+Igi751POzT+YqchSxUCtB6s4Gs6ttgSj8qzJga/qlJMgSW1mKxuQTW4i0sTqQbqVtzXDS5AU+4A==} + + '@types/filesystem@0.0.36': + resolution: {integrity: sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA==} + + '@types/filewriter@0.0.33': + resolution: {integrity: sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g==} + + '@types/har-format@1.2.16': + resolution: {integrity: sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A==} + + '@types/js-beautify@1.14.3': + resolution: {integrity: sha512-FMbQHz+qd9DoGvgLHxeqqVPaNRffpIu5ZjozwV8hf9JAGpIOzuAf4wGbRSo8LNITHqGjmmVjaMggTT5P4v4IHg==} + + '@types/jsdom@21.1.7': + resolution: {integrity: sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==} + + '@types/node@24.10.0': + resolution: {integrity: sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==} + + '@types/react@19.2.2': + resolution: {integrity: sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==} + + '@types/tough-cookie@4.0.5': + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.34': + resolution: {integrity: sha512-KExbHVa92aJpw9WDQvzBaGVE2/Pz+pLZQloT2hjL8IqsZnV62rlPOYvNnLmf/L2dyllfVUOVBj64M0z/46eR2A==} + + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + ansi-escapes@7.2.0: + resolution: {integrity: sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==} + engines: {node: '>=18'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + auto-bind@5.0.1: + resolution: {integrity: sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + balanced-match@2.0.0: + resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} + + bidi-js@1.0.3: + resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + chrome-inspector@1.0.3: + resolution: {integrity: sha512-rF2YrgaCzZNOimM91ESna+4+dTHBMJlDViDUvkwVHsEOxZzrPoeZ4mldP5zOZYFhWpgDrDnIMUlycEKsbq56Ag==} + + chrome-inspector@1.0.6: + resolution: {integrity: sha512-5OhOccte20uGlI2WHqhtfOq6/NX3wTCmogfjUKqqfpLu6Ikp+0cjdfSmjibPmqYOW10BsUAQiQv8ACna+jfJOw==} + + chrome-launcher@1.2.1: + resolution: {integrity: sha512-qmFR5PLMzHyuNJHwOloHPAHhbaNglkfeV/xDtt5b7xiFFyU1I+AZZX0PYseMuhenJSSirgxELYIbswcoc+5H4A==} + engines: {node: '>=12.13.0'} + hasBin: true + + chrome-remote-interface@0.33.3: + resolution: {integrity: sha512-zNnn0prUL86Teru6UCAZ1yU1XeXljHl3gj7OrfPcarEfU62OUU4IujDPdTDW3dAWwRqN3ZMG/Chhkh2gPL/wiw==} + hasBin: true + + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + + cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + + cliui@9.0.1: + resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} + engines: {node: '>=20'} + + code-excerpt@4.0.0: + resolution: {integrity: sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@2.11.0: + resolution: {integrity: sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==} + + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + + convert-to-spaces@2.0.1: + resolution: {integrity: sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + css-tree@3.1.0: + resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-what@7.0.0: + resolution: {integrity: sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==} + engines: {node: '>= 6'} + + cssstyle@4.6.0: + resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} + engines: {node: '>=18'} + + cssstyle@5.3.2: + resolution: {integrity: sha512-zDMqXh8Vs1CdRYZQ2M633m/SFgcjlu8RB8b/1h82i+6vpArF507NSYIWJHGlJaTWoS+imcnctmEz43txhbVkOw==} + engines: {node: '>=20'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} + + data-urls@6.0.0: + resolution: {integrity: sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==} + engines: {node: '>=20'} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + devtools-protocol@0.0.1528500: resolution: {integrity: sha512-zWbI0sZQngmekg5M5t585E03Ih/OaRyH58QR5lVgYZ5bkFyZP9EjcF+41lvl/OAwvo5JYzKOCqf4bwvIyKDOoQ==} + devtools-protocol@0.0.927104: + resolution: {integrity: sha512-5jfffjSuTOv0Lz53wTNNTcCUV8rv7d82AhYcapj28bC2B5tDxEZzVb7k51cNxZP2KHw24QE+sW7ZuSeD9NfMpA==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + editorconfig@1.0.4: + resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} + engines: {node: '>=14'} + hasBin: true + + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + + es-toolkit@1.41.0: + resolution: {integrity: sha512-bDd3oRmbVgqZCJS6WmeQieOrzpl3URcWBUVDXxOELlUW2FuW+0glPOz1n0KnRie+PdyvUZcXz2sOn00c6pPRIA==} + + esbuild@0.25.10: + resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.27.0: + resolution: {integrity: sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.4.0: + resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} + engines: {node: '>=18'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + highlight.js@11.11.1: + resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} + engines: {node: '>=12.0.0'} + + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + indent-string@5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + ink@6.4.0: + resolution: {integrity: sha512-v43isNGrHeFfipbQbwz7/Eg0+aWz3ASEdT/s1Ty2JtyBzR3maE0P77FwkMET+Nzh5KbRL3efLgkT/ZzPFzW3BA==} + engines: {node: '>=20'} + peerDependencies: + '@types/react': '>=19.0.0' + react: '>=19.0.0' + react-devtools-core: ^6.1.2 + peerDependenciesMeta: + '@types/react': + optional: true + react-devtools-core: + optional: true + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + + is-fullwidth-code-point@5.1.0: + resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} + engines: {node: '>=18'} + + is-in-ci@2.0.0: + resolution: {integrity: sha512-cFeerHriAnhrQSbpAxL37W1wcJKUUX07HyLWZCW1URJT/ra3GyUTzBgUnh24TMVfNTV2Hij2HLxkPHFZfOZy5w==} + engines: {node: '>=20'} + hasBin: true + + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + js-beautify@1.15.4: + resolution: {integrity: sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==} + engines: {node: '>=14'} + hasBin: true + + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + + jsdom@26.1.0: + resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + + jsdom@27.1.0: + resolution: {integrity: sha512-Pcfm3eZ+eO4JdZCXthW9tCDT3nF4K+9dmeZ+5X39n+Kqz0DDIABRP5CAEOHRFZk8RGuC2efksTJxrjp8EXCunQ==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + + lighthouse-logger@2.0.2: + resolution: {integrity: sha512-vWl2+u5jgOQuZR55Z1WM0XDdrJT6mzMP8zHUct7xTlWhuQs+eV0g+QL0RQdFjT54zVmbhLCP8vIVpy1wGn/gCg==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@11.2.2: + resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} + engines: {node: 20 || >=22} + + marky@1.3.0: + resolution: {integrity: sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==} + + mdn-data@2.12.2: + resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + minimatch@9.0.1: + resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + nwsapi@2.2.22: + resolution: {integrity: sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + + parse5@8.0.0: + resolution: {integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==} + + patch-console@2.0.0: + resolution: {integrity: sha512-0YNdUceMdaQwoKce1gatDScmMo5pu/tfABfnzEqeG0gtTmd7mh/WcwgUjtAeOU7N8nFFlbQBnFK2gXW5fGvmMA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + postcss-var-replace@1.0.0: + resolution: {integrity: sha512-Aw8t/L0wmuJMNUbYHl7AfJmQ7pUgLrS0zXz+AR+380QxJ85HA8Gxkg3+HvkWK0RoRKpoErpVhakd0k/aHOlNzw==} + engines: {node: '>=18.0.0'} + peerDependencies: + postcss: ^8.4.31 + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + react-reconciler@0.32.0: + resolution: {integrity: sha512-2NPMOzgTlG0ZWdIf3qG+dcbLSoAc/uLfOwckc3ofy5sSK0pLJqnQLpUFxvGcN2rlXSjnVtGeeFLNimCQEj5gOQ==} + engines: {node: '>=0.10.0'} + peerDependencies: + react: ^19.1.0 + + react@19.2.0: + resolution: {integrity: sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==} + engines: {node: '>=0.10.0'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + rrweb-cssom@0.8.0: + resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + + scheduler@0.26.0: + resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + + slice-ansi@7.1.2: + resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} + engines: {node: '>=18'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + 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.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + tldts-core@6.1.86: + resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} + + tldts-core@7.0.17: + resolution: {integrity: sha512-DieYoGrP78PWKsrXr8MZwtQ7GLCUeLxihtjC1jZsW1DnvSMdKPitJSe8OSYDM2u5H6g3kWJZpePqkp43TfLh0g==} + + tldts@6.1.86: + resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==} + hasBin: true + + tldts@7.0.17: + resolution: {integrity: sha512-Y1KQBgDd/NUc+LfOtKS6mNsC9CCaH+m2P1RoIZy7RAPo3C3/t8X45+zgut31cRZtZ3xKPjfn3TkGTrctC2TQIQ==} + hasBin: true + + tough-cookie@5.1.2: + resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} + engines: {node: '>=16'} + + tough-cookie@6.0.0: + resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} + engines: {node: '>=16'} + + tr46@5.1.1: + resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} + engines: {node: '>=18'} + + tr46@6.0.0: + resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} + engines: {node: '>=20'} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true -snapshots: + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} - devtools-protocol@0.0.1528500: {} + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} - typescript@5.9.3: {} + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + webidl-conversions@8.0.0: + resolution: {integrity: sha512-n4W4YFyz5JzOfQeA8oN7dUYpR+MBP3PIUsn2jLjWXwK5ASUzt0Jc/A5sAUZoCYFJRGF0FBKJ+1JjN43rNdsQzA==} + engines: {node: '>=20'} + + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-url@14.2.0: + resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} + engines: {node: '>=18'} + + whatwg-url@15.1.0: + resolution: {integrity: sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==} + engines: {node: '>=20'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + widest-line@5.0.0: + resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} + engines: {node: '>=18'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} + + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + 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} + + yoga-layout@3.2.1: + resolution: {integrity: sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==} + +snapshots: + + '@acemir/cssom@0.9.22': {} + + '@alcalzone/ansi-tokenize@0.2.2': + dependencies: + ansi-styles: 6.2.3 + is-fullwidth-code-point: 5.1.0 + + '@asamuzakjp/css-color@3.2.0': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + lru-cache: 10.4.3 + + '@asamuzakjp/css-color@4.0.5': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + lru-cache: 11.2.2 + + '@asamuzakjp/dom-selector@6.7.4': + dependencies: + '@asamuzakjp/nwsapi': 2.3.9 + bidi-js: 1.0.3 + css-tree: 3.1.0 + is-potential-custom-element-name: 1.0.1 + lru-cache: 11.2.2 + + '@asamuzakjp/nwsapi@2.3.9': {} + + '@csstools/color-helpers@5.1.0': {} + + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/color-helpers': 5.1.0 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-syntax-patches-for-csstree@1.0.15': {} + + '@csstools/css-tokenizer@3.0.4': {} + + '@devtoolcss/parser@1.0.1': {} + + '@esbuild/aix-ppc64@0.25.10': + optional: true + + '@esbuild/aix-ppc64@0.27.0': + optional: true + + '@esbuild/android-arm64@0.25.10': + optional: true + + '@esbuild/android-arm64@0.27.0': + optional: true + + '@esbuild/android-arm@0.25.10': + optional: true + + '@esbuild/android-arm@0.27.0': + optional: true + + '@esbuild/android-x64@0.25.10': + optional: true + + '@esbuild/android-x64@0.27.0': + optional: true + + '@esbuild/darwin-arm64@0.25.10': + optional: true + + '@esbuild/darwin-arm64@0.27.0': + optional: true + + '@esbuild/darwin-x64@0.25.10': + optional: true + + '@esbuild/darwin-x64@0.27.0': + optional: true + + '@esbuild/freebsd-arm64@0.25.10': + optional: true + + '@esbuild/freebsd-arm64@0.27.0': + optional: true + + '@esbuild/freebsd-x64@0.25.10': + optional: true + + '@esbuild/freebsd-x64@0.27.0': + optional: true + + '@esbuild/linux-arm64@0.25.10': + optional: true + + '@esbuild/linux-arm64@0.27.0': + optional: true + + '@esbuild/linux-arm@0.25.10': + optional: true + + '@esbuild/linux-arm@0.27.0': + optional: true + + '@esbuild/linux-ia32@0.25.10': + optional: true + + '@esbuild/linux-ia32@0.27.0': + optional: true + + '@esbuild/linux-loong64@0.25.10': + optional: true + + '@esbuild/linux-loong64@0.27.0': + optional: true + + '@esbuild/linux-mips64el@0.25.10': + optional: true + + '@esbuild/linux-mips64el@0.27.0': + optional: true + + '@esbuild/linux-ppc64@0.25.10': + optional: true + + '@esbuild/linux-ppc64@0.27.0': + optional: true + + '@esbuild/linux-riscv64@0.25.10': + optional: true + + '@esbuild/linux-riscv64@0.27.0': + optional: true + + '@esbuild/linux-s390x@0.25.10': + optional: true + + '@esbuild/linux-s390x@0.27.0': + optional: true + + '@esbuild/linux-x64@0.25.10': + optional: true + + '@esbuild/linux-x64@0.27.0': + optional: true + + '@esbuild/netbsd-arm64@0.25.10': + optional: true + + '@esbuild/netbsd-arm64@0.27.0': + optional: true + + '@esbuild/netbsd-x64@0.25.10': + optional: true + + '@esbuild/netbsd-x64@0.27.0': + optional: true + + '@esbuild/openbsd-arm64@0.25.10': + optional: true + + '@esbuild/openbsd-arm64@0.27.0': + optional: true + + '@esbuild/openbsd-x64@0.25.10': + optional: true + + '@esbuild/openbsd-x64@0.27.0': + optional: true + + '@esbuild/openharmony-arm64@0.25.10': + optional: true + + '@esbuild/openharmony-arm64@0.27.0': + optional: true + + '@esbuild/sunos-x64@0.25.10': + optional: true + + '@esbuild/sunos-x64@0.27.0': + optional: true + + '@esbuild/win32-arm64@0.25.10': + optional: true + + '@esbuild/win32-arm64@0.27.0': + optional: true + + '@esbuild/win32-ia32@0.25.10': + optional: true + + '@esbuild/win32-ia32@0.27.0': + optional: true + + '@esbuild/win32-x64@0.25.10': + optional: true + + '@esbuild/win32-x64@0.27.0': + optional: true + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.2 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@one-ini/wasm@0.1.1': {} + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@types/chrome-remote-interface@0.31.14': + dependencies: + devtools-protocol: 0.0.927104 + + '@types/chrome@0.1.27': + dependencies: + '@types/filesystem': 0.0.36 + '@types/har-format': 1.2.16 + + '@types/filesystem@0.0.36': + dependencies: + '@types/filewriter': 0.0.33 + + '@types/filewriter@0.0.33': {} + + '@types/har-format@1.2.16': {} + + '@types/js-beautify@1.14.3': {} + + '@types/jsdom@21.1.7': + dependencies: + '@types/node': 24.10.0 + '@types/tough-cookie': 4.0.5 + parse5: 7.3.0 + + '@types/node@24.10.0': + dependencies: + undici-types: 7.16.0 + + '@types/react@19.2.2': + dependencies: + csstype: 3.1.3 + + '@types/tough-cookie@4.0.5': {} + + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.34': + dependencies: + '@types/yargs-parser': 21.0.3 + + abbrev@2.0.0: {} + + agent-base@7.1.4: {} + + ansi-escapes@7.2.0: + dependencies: + environment: 1.1.0 + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.3: {} + + auto-bind@5.0.1: {} + + balanced-match@1.0.2: {} + + balanced-match@2.0.0: {} + + bidi-js@1.0.3: + dependencies: + require-from-string: 2.0.2 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + chalk@5.6.2: {} + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + chrome-inspector@1.0.3: + dependencies: + '@devtoolcss/parser': 1.0.1 + jsdom: 27.1.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + + chrome-inspector@1.0.6: + dependencies: + '@devtoolcss/parser': 1.0.1 + jsdom: 27.1.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + + chrome-launcher@1.2.1: + dependencies: + '@types/node': 24.10.0 + escape-string-regexp: 4.0.0 + is-wsl: 2.2.0 + lighthouse-logger: 2.0.2 + transitivePeerDependencies: + - supports-color + + chrome-remote-interface@0.33.3: + dependencies: + commander: 2.11.0 + ws: 7.5.10 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + cli-boxes@3.0.0: {} + + cli-cursor@4.0.0: + dependencies: + restore-cursor: 4.0.0 + + cli-truncate@4.0.0: + dependencies: + slice-ansi: 5.0.0 + string-width: 7.2.0 + + cliui@9.0.1: + dependencies: + string-width: 7.2.0 + strip-ansi: 7.1.2 + wrap-ansi: 9.0.2 + + code-excerpt@4.0.0: + dependencies: + convert-to-spaces: 2.0.1 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + commander@10.0.1: {} + + commander@2.11.0: {} + + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + + convert-to-spaces@2.0.1: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-tree@3.1.0: + dependencies: + mdn-data: 2.12.2 + source-map-js: 1.2.1 + + css-what@7.0.0: {} + + cssstyle@4.6.0: + dependencies: + '@asamuzakjp/css-color': 3.2.0 + rrweb-cssom: 0.8.0 + + cssstyle@5.3.2: + dependencies: + '@asamuzakjp/css-color': 4.0.5 + '@csstools/css-syntax-patches-for-csstree': 1.0.15 + css-tree: 3.1.0 + + csstype@3.1.3: {} + + data-urls@5.0.0: + dependencies: + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + + data-urls@6.0.0: + dependencies: + whatwg-mimetype: 4.0.0 + whatwg-url: 15.1.0 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decimal.js@10.6.0: {} + + devtools-protocol@0.0.1528500: {} + + devtools-protocol@0.0.927104: {} + + eastasianwidth@0.2.0: {} + + editorconfig@1.0.4: + dependencies: + '@one-ini/wasm': 0.1.1 + commander: 10.0.1 + minimatch: 9.0.1 + semver: 7.7.3 + + emoji-regex@10.6.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + entities@6.0.1: {} + + environment@1.1.0: {} + + es-toolkit@1.41.0: {} + + esbuild@0.25.10: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.10 + '@esbuild/android-arm': 0.25.10 + '@esbuild/android-arm64': 0.25.10 + '@esbuild/android-x64': 0.25.10 + '@esbuild/darwin-arm64': 0.25.10 + '@esbuild/darwin-x64': 0.25.10 + '@esbuild/freebsd-arm64': 0.25.10 + '@esbuild/freebsd-x64': 0.25.10 + '@esbuild/linux-arm': 0.25.10 + '@esbuild/linux-arm64': 0.25.10 + '@esbuild/linux-ia32': 0.25.10 + '@esbuild/linux-loong64': 0.25.10 + '@esbuild/linux-mips64el': 0.25.10 + '@esbuild/linux-ppc64': 0.25.10 + '@esbuild/linux-riscv64': 0.25.10 + '@esbuild/linux-s390x': 0.25.10 + '@esbuild/linux-x64': 0.25.10 + '@esbuild/netbsd-arm64': 0.25.10 + '@esbuild/netbsd-x64': 0.25.10 + '@esbuild/openbsd-arm64': 0.25.10 + '@esbuild/openbsd-x64': 0.25.10 + '@esbuild/openharmony-arm64': 0.25.10 + '@esbuild/sunos-x64': 0.25.10 + '@esbuild/win32-arm64': 0.25.10 + '@esbuild/win32-ia32': 0.25.10 + '@esbuild/win32-x64': 0.25.10 + + esbuild@0.27.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.0 + '@esbuild/android-arm': 0.27.0 + '@esbuild/android-arm64': 0.27.0 + '@esbuild/android-x64': 0.27.0 + '@esbuild/darwin-arm64': 0.27.0 + '@esbuild/darwin-x64': 0.27.0 + '@esbuild/freebsd-arm64': 0.27.0 + '@esbuild/freebsd-x64': 0.27.0 + '@esbuild/linux-arm': 0.27.0 + '@esbuild/linux-arm64': 0.27.0 + '@esbuild/linux-ia32': 0.27.0 + '@esbuild/linux-loong64': 0.27.0 + '@esbuild/linux-mips64el': 0.27.0 + '@esbuild/linux-ppc64': 0.27.0 + '@esbuild/linux-riscv64': 0.27.0 + '@esbuild/linux-s390x': 0.27.0 + '@esbuild/linux-x64': 0.27.0 + '@esbuild/netbsd-arm64': 0.27.0 + '@esbuild/netbsd-x64': 0.27.0 + '@esbuild/openbsd-arm64': 0.27.0 + '@esbuild/openbsd-x64': 0.27.0 + '@esbuild/openharmony-arm64': 0.27.0 + '@esbuild/sunos-x64': 0.27.0 + '@esbuild/win32-arm64': 0.27.0 + '@esbuild/win32-ia32': 0.27.0 + '@esbuild/win32-x64': 0.27.0 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@2.0.0: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.4.0: {} + + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + highlight.js@11.11.1: {} + + html-encoding-sniffer@4.0.0: + dependencies: + whatwg-encoding: 3.1.1 + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + indent-string@5.0.0: {} + + ini@1.3.8: {} + + ink@6.4.0(@types/react@19.2.2)(react@19.2.0): + dependencies: + '@alcalzone/ansi-tokenize': 0.2.2 + ansi-escapes: 7.2.0 + ansi-styles: 6.2.3 + auto-bind: 5.0.1 + chalk: 5.6.2 + cli-boxes: 3.0.0 + cli-cursor: 4.0.0 + cli-truncate: 4.0.0 + code-excerpt: 4.0.0 + es-toolkit: 1.41.0 + indent-string: 5.0.0 + is-in-ci: 2.0.0 + patch-console: 2.0.0 + react: 19.2.0 + react-reconciler: 0.32.0(react@19.2.0) + signal-exit: 3.0.7 + slice-ansi: 7.1.2 + stack-utils: 2.0.6 + string-width: 7.2.0 + type-fest: 4.41.0 + widest-line: 5.0.0 + wrap-ansi: 9.0.2 + ws: 8.18.3 + yoga-layout: 3.2.1 + optionalDependencies: + '@types/react': 19.2.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + is-docker@2.2.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-fullwidth-code-point@4.0.0: {} + + is-fullwidth-code-point@5.1.0: + dependencies: + get-east-asian-width: 1.4.0 + + is-in-ci@2.0.0: {} + + is-potential-custom-element-name@1.0.1: {} + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + isexe@2.0.0: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + js-beautify@1.15.4: + dependencies: + config-chain: 1.1.13 + editorconfig: 1.0.4 + glob: 10.4.5 + js-cookie: 3.0.5 + nopt: 7.2.1 + + js-cookie@3.0.5: {} + + jsdom@26.1.0: + dependencies: + cssstyle: 4.6.0 + data-urls: 5.0.0 + decimal.js: 10.6.0 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.22 + parse5: 7.3.0 + rrweb-cssom: 0.8.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 5.1.2 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + ws: 8.18.3 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + jsdom@27.1.0: + dependencies: + '@acemir/cssom': 0.9.22 + '@asamuzakjp/dom-selector': 6.7.4 + cssstyle: 5.3.2 + data-urls: 6.0.0 + decimal.js: 10.6.0 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + is-potential-custom-element-name: 1.0.1 + parse5: 8.0.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 6.0.0 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 8.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 15.1.0 + ws: 8.18.3 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + lighthouse-logger@2.0.2: + dependencies: + debug: 4.4.3 + marky: 1.3.0 + transitivePeerDependencies: + - supports-color + + lru-cache@10.4.3: {} + + lru-cache@11.2.2: {} + + marky@1.3.0: {} + + mdn-data@2.12.2: {} + + mimic-fn@2.1.0: {} + + minimatch@9.0.1: + dependencies: + brace-expansion: 2.0.2 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minipass@7.1.2: {} + + ms@2.1.3: {} + + nanoid@3.3.11: {} + + nopt@7.2.1: + dependencies: + abbrev: 2.0.0 + + nwsapi@2.2.22: {} + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + package-json-from-dist@1.0.1: {} + + parse5@7.3.0: + dependencies: + entities: 6.0.1 + + parse5@8.0.0: + dependencies: + entities: 6.0.1 + + patch-console@2.0.0: {} + + path-key@3.1.1: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + picocolors@1.1.1: {} + + postcss-var-replace@1.0.0(postcss@8.5.6): + dependencies: + balanced-match: 2.0.0 + escape-string-regexp: 4.0.0 + postcss: 8.5.6 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + proto-list@1.2.4: {} + + punycode@2.3.1: {} + + react-reconciler@0.32.0(react@19.2.0): + dependencies: + react: 19.2.0 + scheduler: 0.26.0 + + react@19.2.0: {} + + readdirp@4.1.2: {} + + require-from-string@2.0.2: {} + + restore-cursor@4.0.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + rrweb-cssom@0.8.0: {} + + safer-buffer@2.1.2: {} + + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + + scheduler@0.26.0: {} + + semver@7.7.3: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + slice-ansi@5.0.0: + dependencies: + ansi-styles: 6.2.3 + is-fullwidth-code-point: 4.0.0 + + slice-ansi@7.1.2: + dependencies: + ansi-styles: 6.2.3 + is-fullwidth-code-point: 5.1.0 + + source-map-js@1.2.1: {} + + stack-utils@2.0.6: + dependencies: + escape-string-regexp: 2.0.0 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.2 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.6.0 + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + + symbol-tree@3.2.4: {} + + tldts-core@6.1.86: {} + + tldts-core@7.0.17: {} + + tldts@6.1.86: + dependencies: + tldts-core: 6.1.86 + + tldts@7.0.17: + dependencies: + tldts-core: 7.0.17 + + tough-cookie@5.1.2: + dependencies: + tldts: 6.1.86 + + tough-cookie@6.0.0: + dependencies: + tldts: 7.0.17 + + tr46@5.1.1: + dependencies: + punycode: 2.3.1 + + tr46@6.0.0: + dependencies: + punycode: 2.3.1 + + type-fest@4.41.0: {} + + typescript@5.9.3: {} + + undici-types@7.16.0: {} + + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 + + webidl-conversions@7.0.0: {} + + webidl-conversions@8.0.0: {} + + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@4.0.0: {} + + whatwg-url@14.2.0: + dependencies: + tr46: 5.1.1 + webidl-conversions: 7.0.0 + + whatwg-url@15.1.0: + dependencies: + tr46: 6.0.0 + webidl-conversions: 8.0.0 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + widest-line@5.0.0: + dependencies: + string-width: 7.2.0 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.1.2 + + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.1.2 + + ws@7.5.10: {} + + ws@8.18.3: {} + + xml-name-validator@5.0.0: {} + + xmlchars@2.2.0: {} + + y18n@5.0.8: {} + + yargs-parser@22.0.0: {} + + yargs@18.0.0: + dependencies: + cliui: 9.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + string-width: 7.2.0 + y18n: 5.0.8 + yargs-parser: 22.0.0 + + yoga-layout@3.2.1: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index d440abb..abc3af1 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,5 +1,5 @@ packages: - - packages/@devtoolcss-parser + - packages/* onlyBuiltDependencies: - esbuild