From 79df196843eee396325f789f079cf0507d3f33be Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 9 Aug 2026 12:27:18 +0000 Subject: [PATCH 1/4] feat: run stylelint in the browser on the lint-css page Drives stylelint's linting core directly (lintPostcssResult, normalizeAllRuleSettings, createPartialStylelintResult, prepareReturnValue) instead of routing through standalone()/lint(), which statically pulls in globby, cosmiconfig and other Node-only deps. The four internals aren't part of stylelint's public exports map, so they're aliased to the real files on disk in vite.config.js and pinned to stylelint ~17.13.0 via stylelint-internals.d.ts. Replaces the /api/lint-css POST round-trip: the Linter component now fetches CSS (for URL input) via the existing client-side get_css() helper and lints it in-browser with src/lib/stylelint-browser/lint.ts, cutting out a full server round-trip per lint. CSS-scraping stays server-side in /api/get-css (Node-only deps, CORS). Includes browser-safe shims for node:os, node:process and stylelint's own bare-specifier entry point (needed because @projectwallace/stylelint-plugin's rule files import `stylelint` just to reach createPlugin/utils), plus a stub for stylelint's CLI timing/table output which isn't reachable from the browser and doesn't bundle cleanly. --- package.json | 9 +- pnpm-lock.yaml | 24 +++- src/lib/components/Linter.svelte | 50 ++++++-- src/lib/stylelint-browser/lint.test.ts | 40 ++++++ src/lib/stylelint-browser/lint.ts | 118 ++++++++++++++++++ src/lib/stylelint-browser/presets.ts | 17 +++ src/lib/stylelint-browser/shims/node-os.ts | 4 + .../stylelint-browser/shims/node-process.ts | 15 +++ .../shims/stylelint-timing.ts | 15 +++ .../stylelint-internals.d.ts | 80 ++++++++++++ src/lib/stylelint-browser/stylelint-shim.ts | 23 ++++ src/routes/(public)/lint-css/spec.ts | 42 +++---- src/routes/api/lint-css/+server.ts | 100 --------------- vite.config.js | 58 +++++++++ 14 files changed, 452 insertions(+), 143 deletions(-) create mode 100644 src/lib/stylelint-browser/lint.test.ts create mode 100644 src/lib/stylelint-browser/lint.ts create mode 100644 src/lib/stylelint-browser/presets.ts create mode 100644 src/lib/stylelint-browser/shims/node-os.ts create mode 100644 src/lib/stylelint-browser/shims/node-process.ts create mode 100644 src/lib/stylelint-browser/shims/stylelint-timing.ts create mode 100644 src/lib/stylelint-browser/stylelint-internals.d.ts create mode 100644 src/lib/stylelint-browser/stylelint-shim.ts delete mode 100644 src/routes/api/lint-css/+server.ts diff --git a/package.json b/package.json index 3a696cf8..5a628efb 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,8 @@ "css-coverage": "css-coverage ./css-coverage --min-coverage=.95 --min-file-coverage=.85 --show-uncovered=all" }, "dependencies": { + "@csstools/css-syntax-patches-for-csstree": "^1.1.4", + "@csstools/css-tokenizer": "^4.0.0", "@melt-ui/pp": "^0.3.2", "@melt-ui/svelte": "^0.86.6", "@oddbird/popover-polyfill": "^0.6.1", @@ -36,29 +38,32 @@ "@sveltejs/kit": "^2.70.1", "@sveltejs/vite-plugin-svelte": "^7.2.0", "color-sorter": "^8.0.2", + "css-tree": "^3.2.1", "diff": "^9.0.0", + "fastest-levenshtein": "^1.0.16", "github-slugger": "^2.0.0", "lightningcss": "1.32.0", "linkedom": "^0.18.13", "mdsvex": "^0.12.8", "paneforge": "^1.0.2", + "postcss": "^8.5.15", "rehype-autolink-headings": "^7.1.0", "rehype-slug": "^6.0.0", "runed": "^0.37.1", + "stylelint": "~17.13.0", "svelte": "^5.56.8", + "table": "^6.9.0", "typescript": "^6.0.3", "vite": "8.0.16" }, "devDependencies": { "@playwright/test": "^1.62.0", - "@projectwallace/stylelint-plugin": "^0.6.0", "@sveltejs/adapter-netlify": "^6.0.4", "@types/node": "^25.9.5", "oxfmt": "0.55.0", "oxlint": "^1.75.0", "oxlint-tsgolint": "^0.23.0", "postcss-html": "^1.8.1", - "stylelint": "~17.13.0", "stylelint-config-standard": "~40.0.0", "svelte-check": "^4.7.3", "vitest": "^4.1.10" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cc27a0bc..ef91c192 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,6 +20,12 @@ importers: .: dependencies: + '@csstools/css-syntax-patches-for-csstree': + specifier: ^1.1.4 + version: 1.1.7(css-tree@3.2.1) + '@csstools/css-tokenizer': + specifier: ^4.0.0 + version: 4.0.0 '@melt-ui/pp': specifier: ^0.3.2 version: 0.3.2(@melt-ui/svelte@0.86.6(svelte@5.56.8))(svelte@5.56.8) @@ -68,9 +74,15 @@ importers: color-sorter: specifier: ^8.0.2 version: 8.0.2 + css-tree: + specifier: ^3.2.1 + version: 3.2.1 diff: specifier: ^9.0.0 version: 9.0.0 + fastest-levenshtein: + specifier: ^1.0.16 + version: 1.0.16 github-slugger: specifier: ^2.0.0 version: 2.0.0 @@ -86,6 +98,9 @@ importers: paneforge: specifier: ^1.0.2 version: 1.0.2(@sveltejs/kit@2.70.1(@sveltejs/vite-plugin-svelte@7.2.0(svelte@5.56.8)(vite@8.0.16(@types/node@25.9.5)(esbuild@0.28.1)))(svelte@5.56.8)(typescript@6.0.3)(vite@8.0.16(@types/node@25.9.5)(esbuild@0.28.1)))(svelte@5.56.8) + postcss: + specifier: ^8.5.15 + version: 8.5.23 rehype-autolink-headings: specifier: ^7.1.0 version: 7.1.0 @@ -95,9 +110,15 @@ importers: runed: specifier: ^0.37.1 version: 0.37.1(@sveltejs/kit@2.70.1(@sveltejs/vite-plugin-svelte@7.2.0(svelte@5.56.8)(vite@8.0.16(@types/node@25.9.5)(esbuild@0.28.1)))(svelte@5.56.8)(typescript@6.0.3)(vite@8.0.16(@types/node@25.9.5)(esbuild@0.28.1)))(svelte@5.56.8) + stylelint: + specifier: ~17.13.0 + version: 17.13.0(supports-color@10.2.2)(typescript@6.0.3) svelte: specifier: ^5.56.8 version: 5.56.8 + table: + specifier: ^6.9.0 + version: 6.9.0 typescript: specifier: ^6.0.3 version: 6.0.3 @@ -126,9 +147,6 @@ importers: postcss-html: specifier: ^1.8.1 version: 1.8.1 - stylelint: - specifier: ~17.13.0 - version: 17.13.0(supports-color@10.2.2)(typescript@6.0.3) stylelint-config-standard: specifier: ~40.0.0 version: 40.0.0(stylelint@17.13.0(supports-color@10.2.2)(typescript@6.0.3)) diff --git a/src/lib/components/Linter.svelte b/src/lib/components/Linter.svelte index 023564df..30ef4f57 100644 --- a/src/lib/components/Linter.svelte +++ b/src/lib/components/Linter.svelte @@ -13,6 +13,11 @@ import { presets, type Preset, DEFAULT_PRESET } from '$lib/lint-preset' import PanedLayout from './PanedLayout.svelte' import Pane from './Pane.svelte' + import { get_css } from '$lib/get-css' + import { format } from '@projectwallace/format-css' + import stylelintPlugin from '@projectwallace/stylelint-plugin' + import { lint } from '$lib/stylelint-browser/lint' + import { PRESET_MAP } from '$lib/stylelint-browser/presets' let { elements: { root, item } @@ -28,7 +33,6 @@ } duration: number css?: string - rules?: Record } type Props = { @@ -68,21 +72,41 @@ status = 'loading' onloading?.(true) try { - const body = url ? { url, preset, prettify } : { css, preset } - const response = await fetch('/api/lint-css', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(body) - }) - if (response.ok) { - lint_result = await response.json() - if (lint_result?.css) { - api_css = lint_result.css + let text: string + if (url) { + const origins = await get_css(url) + text = origins.map((o) => o.css).join('\n') + if (prettify) { + text = format(text) } - status = lint_result?.result.parse_error ? 'lint_error' : 'success' + api_css = text } else { - status = 'error' + text = css + } + + const start = performance.now() + const linter_result = await lint([{ id: url ?? 'input.css', code: text }], { + plugins: stylelintPlugin, + rules: PRESET_MAP[preset] + }) + const duration = performance.now() - start + + const file = linter_result.results.at(0) + if (!file) throw new Error('No lint result') + + const lint_warnings = file.warnings.filter((w) => w.rule !== 'CssSyntaxError') + const parse_error = file.warnings.find((w) => w.rule === 'CssSyntaxError') + + lint_result = { + result: { + errored: file.invalidOptionWarnings.length > 0 || lint_warnings.some((w) => w.severity === 'error'), + parse_error, + warnings: lint_warnings.toSorted((a, b) => (a.line === b.line ? a.column - b.column : a.line - b.line)) + }, + duration: parseFloat(duration.toFixed(1)), + css: url ? text : undefined } + status = lint_result.result.parse_error ? 'lint_error' : 'success' } catch { status = 'error' } finally { diff --git a/src/lib/stylelint-browser/lint.test.ts b/src/lib/stylelint-browser/lint.test.ts new file mode 100644 index 00000000..8d168b7f --- /dev/null +++ b/src/lib/stylelint-browser/lint.test.ts @@ -0,0 +1,40 @@ +import { test, expect } from 'vitest' +import stylelintPlugin from '@projectwallace/stylelint-plugin' +import { lint } from './lint' +import { PRESET_MAP } from './presets' + +// Smoke test for the deep-imported stylelint internals (lintPostcssResult, +// normalizeAllRuleSettings, createPartialStylelintResult, prepareReturnValue). +// If a stylelint upgrade changes their signatures or the shape of the +// `.stylelint` scaffold object they expect, this should fail loudly instead +// of silently linting nothing. +test('flags a known rule violation', async () => { + const result = await lint([{ id: 'input.css', code: 'a { colour: red !important; }' }], { + rules: PRESET_MAP.recommended, + plugins: stylelintPlugin + }) + + const file = result.results.at(0) + expect(file).toBeDefined() + expect(file?.warnings.map((w) => w.rule)).toContain('projectwallace/max-important-ratio') +}) + +test('reports no warnings for clean CSS', async () => { + const result = await lint([{ id: 'input.css', code: 'a { color: red; }' }], { + rules: PRESET_MAP.recommended, + plugins: stylelintPlugin + }) + + const file = result.results.at(0) + expect(file?.warnings).toEqual([]) +}) + +test('reports a CssSyntaxError for invalid CSS', async () => { + const result = await lint([{ id: 'input.css', code: `a { background: url('")}` }], { + rules: PRESET_MAP.recommended, + plugins: stylelintPlugin + }) + + const file = result.results.at(0) + expect(file?.warnings.some((w) => w.rule === 'CssSyntaxError')).toBe(true) +}) diff --git a/src/lib/stylelint-browser/lint.ts b/src/lib/stylelint-browser/lint.ts new file mode 100644 index 00000000..13cf9bd9 --- /dev/null +++ b/src/lib/stylelint-browser/lint.ts @@ -0,0 +1,118 @@ +// Runs stylelint's linting core directly in the browser, skipping stylelint's +// `standalone()`/`lint()` entry point (and the file-resolution machinery +// behind it: globby, cosmiconfig, write-file-atomic, ...) since we only ever +// lint in-memory CSS against a single, already-resolved config. +// +// This deep-imports a handful of stylelint internals that aren't part of its +// public `exports` map. They're aliased to real files on disk in +// vite.config.js, and their shapes are pinned via stylelint-internals.d.ts. +// Re-verify both against node_modules/stylelint/lib/*.mjs when bumping the +// stylelint version (pinned in package.json). +import postcss from 'postcss' +import lintPostcssResult from 'stylelint/lib/lintPostcssResult.mjs' +import normalizeAllRuleSettings from 'stylelint/lib/normalizeAllRuleSettings.mjs' +import createPartialStylelintResult from 'stylelint/lib/createPartialStylelintResult.mjs' +import prepareReturnValue from 'stylelint/lib/prepareReturnValue.mjs' +import jsonFormatter from 'stylelint/lib/formatters/jsonFormatter.mjs' +// `lib/utils/*` is publicly exported by stylelint, so this one needs no alias. +import getLexer from 'stylelint/lib/utils/getLexer.mjs' +import type { Config, LinterResult, PostcssResult, Rule } from 'stylelint' + +export type LintSource = { + /** Cosmetic label only (becomes `result.source`); a file path or URL both work. */ + id: string + code: string +} + +type PluginRuleDefinition = { ruleName: string; rule: Rule } + +/** + * Re-implementation of stylelint's `addPluginFunctions` (lib/augmentConfig.mjs), + * minus the module-resolution branch: plugins must already be imported objects, + * never string specifiers. + */ +function build_plugin_functions(plugins: Config['plugins']): Record { + const plugin_functions: Record = {} + if (!plugins) return plugin_functions + + const normalized_plugins = ([] as unknown[]).concat(plugins) + + for (const plugin_lookup of normalized_plugins) { + if (typeof plugin_lookup === 'string') { + throw new TypeError( + `Browser stylelint driver only accepts already-imported plugin objects, got a string: "${plugin_lookup}"` + ) + } + + const plugin_import = (plugin_lookup as { default?: unknown }).default ?? plugin_lookup + const rule_definitions = ([] as PluginRuleDefinition[]).concat(plugin_import as PluginRuleDefinition) + + for (const rule_definition of rule_definitions) { + if (!rule_definition.ruleName) { + throw new Error('stylelint requires plugins to expose a ruleName.') + } + if (!rule_definition.ruleName.includes('/')) { + throw new Error( + `stylelint requires plugin rules to be namespaced, i.e. only "plugin-namespace/plugin-rule-name" plugin rule names are supported. The plugin rule "${rule_definition.ruleName}" does not do this.` + ) + } + plugin_functions[rule_definition.ruleName] = rule_definition.rule + } + } + + return plugin_functions +} + +function prepare_config(config: Config): Promise { + const prepared: Config = { + rules: config.rules, + defaultSeverity: config.defaultSeverity, + _pluginFunctions: build_plugin_functions(config.plugins) + } + return normalizeAllRuleSettings(prepared) +} + +async function lint_one(source: LintSource, config: Config) { + try { + const postcss_result = (await postcss().process(source.code, { from: source.id }).async()) as PostcssResult + + const wrapped: PostcssResult = Object.assign(postcss_result, { + stylelint: { + ruleSeverities: {}, + customMessages: {}, + customUrls: {}, + ruleMetadata: {}, + fixersData: {}, + rangesOfComputedEditInfos: [], + disabledRanges: {}, + lexer: getLexer(config), + referenceRoots: [] + } + }) + + await lintPostcssResult({ quietDeprecationWarnings: true }, wrapped, config) + + return createPartialStylelintResult(wrapped) + } catch (error) { + if (error instanceof Error && error.name === 'CssSyntaxError') { + return createPartialStylelintResult(undefined, error as Error & { name: 'CssSyntaxError' }) + } + throw error + } +} + +/** + * Lint one or more in-memory CSS sources against a single config. No + * `extends` resolution, no custom syntaxes, no caching, no ignore files, no + * autofix - see the plan this implements for the full list of trade-offs. + */ +export async function lint(sources: LintSource[], config: Config): Promise { + const prepared_config = await prepare_config(config) + const results = [] + + for (const source of sources) { + results.push(await lint_one(source, prepared_config)) + } + + return prepareReturnValue({ results, maxWarnings: undefined, formatter: jsonFormatter, cwd: '/' }) +} diff --git a/src/lib/stylelint-browser/presets.ts b/src/lib/stylelint-browser/presets.ts new file mode 100644 index 00000000..2fbb45e6 --- /dev/null +++ b/src/lib/stylelint-browser/presets.ts @@ -0,0 +1,17 @@ +import recommendedConfig from '@projectwallace/stylelint-plugin/configs/recommended' +import performanceConfig from '@projectwallace/stylelint-plugin/configs/performance' +import maintainabilityConfig from '@projectwallace/stylelint-plugin/configs/maintainability' +import correctnessConfig from '@projectwallace/stylelint-plugin/configs/correctness' +import designTokensConfig from '@projectwallace/stylelint-plugin/configs/design-tokens' +import holisticConfig from '@projectwallace/stylelint-plugin/configs/holistic' +import type { Config } from 'stylelint' +import { type Preset } from '$lib/lint-preset' + +export const PRESET_MAP: Record | undefined> = { + recommended: recommendedConfig.rules, + performance: performanceConfig.rules, + maintainability: maintainabilityConfig.rules, + correctness: correctnessConfig.rules, + designtokens: designTokensConfig.rules, + holistic: holisticConfig.rules +} diff --git a/src/lib/stylelint-browser/shims/node-os.ts b/src/lib/stylelint-browser/shims/node-os.ts new file mode 100644 index 00000000..68cbaba5 --- /dev/null +++ b/src/lib/stylelint-browser/shims/node-os.ts @@ -0,0 +1,4 @@ +// Browser-only stand-in for Node's `node:os` module. Vite aliases the bare +// `node:os` specifier to this file for client bundles (see vite.config.js). +// Stylelint's internals only ever read `EOL`. +export const EOL = '\n' diff --git a/src/lib/stylelint-browser/shims/node-process.ts b/src/lib/stylelint-browser/shims/node-process.ts new file mode 100644 index 00000000..a5dcd9ea --- /dev/null +++ b/src/lib/stylelint-browser/shims/node-process.ts @@ -0,0 +1,15 @@ +// Browser-only stand-in for Node's `node:process` module. Vite aliases the +// bare `node:process` specifier to this file for client bundles (see +// vite.config.js). Only the bits stylelint's internals touch are stubbed: +// - `env.TIMING` gates a CLI table printout we never trigger +// - `noDeprecation` toggles inclusion of deprecation messages +// - `emitWarning`/`on` are called defensively but never in normal operation +const process_shim = { + env: {} as Record, + noDeprecation: false, + emitWarning: (..._args: unknown[]) => {}, + on: (..._args: unknown[]) => {}, + hrtime: Object.assign((..._args: unknown[]) => [0, 0], { bigint: () => BigInt(0) }) +} + +export default process_shim diff --git a/src/lib/stylelint-browser/shims/stylelint-timing.ts b/src/lib/stylelint-browser/shims/stylelint-timing.ts new file mode 100644 index 00000000..d93654b1 --- /dev/null +++ b/src/lib/stylelint-browser/shims/stylelint-timing.ts @@ -0,0 +1,15 @@ +// Browser-only stand-in for stylelint's lib/timing.mjs. Vite redirects that +// relative import to this file for client bundles (see vite.config.js). +// +// The real module is only useful for `TIMING= stylelint ...` CLI runs - +// our `node:process` shim never sets that env var, so `timing.enabled` would +// always be `false` anyway. Pulling in the real module drags in the `table` +// package, which (via `supports-hyperlinks` -> `supports-color`) doesn't +// bundle for the browser. +export default { + display: () => {}, + enabled: false, + getListSize: () => 0, + tableConfig: {}, + time: (_key: string, fn: (...args: unknown[]) => unknown) => fn +} diff --git a/src/lib/stylelint-browser/stylelint-internals.d.ts b/src/lib/stylelint-browser/stylelint-internals.d.ts new file mode 100644 index 00000000..67d7aa96 --- /dev/null +++ b/src/lib/stylelint-browser/stylelint-internals.d.ts @@ -0,0 +1,80 @@ +// stylelint's package.json `exports` map only publishes `.`, `./package.json` +// and `./lib/utils/*`. The files below are unpublished internals we deep- +// import on purpose (see src/lib/stylelint-browser/lint.ts) and alias in +// vite.config.js so the bundler can still find them on disk. TypeScript's +// "bundler" module resolution honours the exports map though, so without +// these ambient declarations it can't see the deep paths exist. +// +// Pinned to stylelint ~17.13.0 (see package.json) - re-check these shapes +// against node_modules/stylelint/lib/*.mjs whenever that version changes. + +declare module 'stylelint/lib/lintPostcssResult.mjs' { + import type { LinterOptions, PostcssResult, Config } from 'stylelint' + export default function lintPostcssResult( + stylelintOptions: Partial, + postcssResult: PostcssResult, + config: Config + ): Promise +} + +declare module 'stylelint/lib/normalizeAllRuleSettings.mjs' { + import type { Config } from 'stylelint' + export default function normalizeAllRuleSettings(config: Config): Promise +} + +declare module 'stylelint/lib/createPartialStylelintResult.mjs' { + import type { LintResult, PostcssResult } from 'stylelint' + export default function createPartialStylelintResult( + postcssResult?: PostcssResult, + cssSyntaxError?: Error & { name: 'CssSyntaxError' } + ): LintResult +} + +declare module 'stylelint/lib/prepareReturnValue.mjs' { + import type { LinterResult, LintResult, Formatter } from 'stylelint' + export default function prepareReturnValue(args: { + results: LintResult[] + maxWarnings?: number + formatter: Formatter + cwd: string + }): LinterResult +} + +declare module 'stylelint/lib/formatters/jsonFormatter.mjs' { + import type { Formatter } from 'stylelint' + const jsonFormatter: Formatter + export default jsonFormatter +} + +// stylelint's `./lib/utils/*` export is public, but since stylelint ships a +// "types" condition for its main entry, TypeScript treats the whole package +// as self-typed and stops falling back to `allowJs` inference for subpaths +// that lack their own declaration file - these four need the same manual +// pinning as the internals above. + +declare module 'stylelint/lib/utils/getLexer.mjs' { + import type { Config } from 'stylelint' + export default function getLexer(config: Config, additionalSyntax?: unknown): unknown +} + +declare module 'stylelint/lib/utils/report.mjs' { + import type { Problem } from 'stylelint' + export default function report(problem: Problem): void +} + +declare module 'stylelint/lib/utils/ruleMessages.mjs' { + export default function ruleMessages>(ruleName: string, messages: T): T +} + +declare module 'stylelint/lib/utils/validateOptions.mjs' { + import type { PostcssResult } from 'stylelint' + export default function validateOptions( + result: PostcssResult, + ruleName: string, + ...optionDescriptions: unknown[] + ): boolean +} + +declare module 'stylelint/lib/utils/checkAgainstRule.mjs' { + export default function checkAgainstRule(options: unknown, callback: (...args: unknown[]) => void): Promise +} diff --git a/src/lib/stylelint-browser/stylelint-shim.ts b/src/lib/stylelint-browser/stylelint-shim.ts new file mode 100644 index 00000000..901588ce --- /dev/null +++ b/src/lib/stylelint-browser/stylelint-shim.ts @@ -0,0 +1,23 @@ +// Browser-only stand-in for the `stylelint` package itself. Vite aliases the +// bare `stylelint` specifier to this file for client bundles (see +// vite.config.js), so that plugin packages doing `import stylelint from +// 'stylelint'` (only to reach `stylelint.createPlugin`/`stylelint.utils`) +// don't drag in `standalone.mjs` and its Node-only deps (globby, cosmiconfig, +// write-file-atomic, ...). +// +// The four utils below live under stylelint's public `./lib/utils/*` export, +// so they resolve without any extra aliasing. +import report from 'stylelint/lib/utils/report.mjs' +import ruleMessages from 'stylelint/lib/utils/ruleMessages.mjs' +import validateOptions from 'stylelint/lib/utils/validateOptions.mjs' +import checkAgainstRule from 'stylelint/lib/utils/checkAgainstRule.mjs' +import type { Rule } from 'stylelint' + +function createPlugin(ruleName: string, rule: Rule) { + return { ruleName, rule } +} + +export default { + createPlugin, + utils: { report, ruleMessages, validateOptions, checkAgainstRule } +} diff --git a/src/routes/(public)/lint-css/spec.ts b/src/routes/(public)/lint-css/spec.ts index f820c6a8..99147811 100644 --- a/src/routes/(public)/lint-css/spec.ts +++ b/src/routes/(public)/lint-css/spec.ts @@ -1,25 +1,17 @@ import { test, expect } from '../../../../tests/fixtures' -const LINT_CSS_API = '**/api/lint-css' - -const mock_lint_response = { - result: { - errored: false, - parse_error: undefined, - warnings: [ - { - line: 1, - column: 5, - endLine: 1, - endColumn: 11, - text: 'Unexpected unknown property "colour" (property-no-unknown)', - rule: 'property-no-unknown' - } - ] - }, - duration: 10, - css: 'a {\n\tcolour: red;\n}\n' -} +// Linting itself now runs client-side (see src/lib/stylelint-browser/lint.ts), +// so only the CSS-fetching API is mocked here; warnings below reflect real +// stylelint output for the given CSS. +const GET_CSS_API = '**/api/get-css*' + +const mock_origins = [ + { + type: 'file', + href: 'https://example.com/style.css', + css: 'a { colour: red !important; }' + } +] test('does SEO well', async ({ page }) => { await page.goto('/lint-css', { waitUntil: 'domcontentloaded' }) @@ -32,9 +24,9 @@ test('does SEO well', async ({ page }) => { test.describe('URL input mode', () => { test.beforeEach(async ({ page }) => { - await page.route(LINT_CSS_API, async (route) => { - if (route.request().method() === 'POST') { - await route.fulfill({ status: 200, json: mock_lint_response }) + await page.route(GET_CSS_API, async (route) => { + if (route.request().method() === 'GET') { + await route.fulfill({ status: 200, json: mock_origins }) } else { await route.continue() } @@ -49,14 +41,14 @@ test.describe('URL input mode', () => { await expect.soft(page.getByRole('table')).toBeVisible() expect.soft(await page.getByRole('table').getByRole('row').count()).toBeGreaterThanOrEqual(2) - await expect.soft(page.getByRole('cell', { name: /Unexpected unknown property/ })).toBeVisible() + await expect.soft(page.getByRole('cell', { name: /important ratio/i })).toBeVisible() }) test('shows the fetched CSS in the CSS input pane', async ({ page }) => { await page.getByLabel('Website URL').fill('example.com') await page.getByRole('button', { name: 'Analyze URL' }).click() - await expect.soft(page.getByTestId('pre-css')).toContainText(mock_lint_response.css) + await expect.soft(page.getByTestId('pre-css')).toContainText('colour: red !important;') }) }) diff --git a/src/routes/api/lint-css/+server.ts b/src/routes/api/lint-css/+server.ts deleted file mode 100644 index 92dd9db9..00000000 --- a/src/routes/api/lint-css/+server.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { error, json } from '@sveltejs/kit' -import stylelint, { type Config } from 'stylelint' -import recommendedConfig from '@projectwallace/stylelint-plugin/configs/recommended' -import performanceConfig from '@projectwallace/stylelint-plugin/configs/performance' -import maintainabilityConfig from '@projectwallace/stylelint-plugin/configs/maintainability' -import correctnessConfig from '@projectwallace/stylelint-plugin/configs/correctness' -import designTokensConfig from '@projectwallace/stylelint-plugin/configs/design-tokens' -import holisticConfig from '@projectwallace/stylelint-plugin/configs/holistic' -import stylelintPlugin from '@projectwallace/stylelint-plugin' -import { get_css } from '../get-css/get-css' -import { format } from '@projectwallace/format-css' -import type { RequestHandler } from './$types' -import { presets, type Preset, DEFAULT_PRESET } from '$lib/lint-preset' - -export type { Preset } - -const PRESET_MAP: Record | undefined> = { - recommended: recommendedConfig.rules, - performance: performanceConfig.rules, - maintainability: maintainabilityConfig.rules, - correctness: correctnessConfig.rules, - designtokens: designTokensConfig.rules, - holistic: holisticConfig.rules -} - -type RequestBody = { url?: string; css?: string; preset?: string; prettify?: boolean } - -export const POST: RequestHandler = async ({ request, setHeaders }) => { - const body = (await request.json()) as RequestBody - const raw_preset = body.preset?.toString() - - let css: string - let url_css: string | undefined - - if (body.url) { - const origins = await get_css(body.url.toString()) - if ('error' in origins) { - error(400, origins.error.message) - } - css = origins.map((o) => o.css).join('\n') - if (body.prettify) { - css = format(css) - } - url_css = css - } else { - css = body.css?.toString() ?? '' - } - const preset: Preset = - raw_preset && (presets as readonly string[]).includes(raw_preset) ? (raw_preset as Preset) : DEFAULT_PRESET - - let rules: NonNullable = PRESET_MAP[preset] ?? (Object.create(null) as NonNullable) - - const start = performance.now() - const lint_result = await stylelint.lint({ - config: { - plugins: stylelintPlugin, - rules - }, - code: css?.toString(), - configBasedir: process.cwd() - }) - - const file = lint_result.results.at(0) - - if (!file) { - error(500) - } - - const lint_warnings = file.warnings.filter((w) => w.rule !== 'CssSyntaxError') - const parse_error = file.warnings.find((w) => w.rule === 'CssSyntaxError') - - const return_data = { - errored: file.invalidOptionWarnings.length > 0 || lint_warnings.some((w) => w.severity === 'error'), - parse_error, - warnings: lint_warnings - .toSorted((a, b) => { - if (a.line === b.line) { - return a.column - b.column - } - return a.line - b.line - }) - .map(({ line, column, endLine, endColumn, text, rule }) => ({ - line, - column, - endLine, - endColumn, - text, - rule - })) - } - - const duration = performance.now() - start - setHeaders({ 'Server-Timing': `lint;dur=${duration.toFixed(1)}` }) - - return json({ - result: return_data, - duration: parseFloat(duration.toFixed(1)), - css: url_css - }) -} diff --git a/vite.config.js b/vite.config.js index e427ae57..1eb7165c 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,10 +1,68 @@ import { sveltekit } from '@sveltejs/kit/vite' import { enhancedImages } from '@sveltejs/enhanced-img' import { Features } from 'lightningcss' +import { fileURLToPath } from 'node:url' + +const stylelint_lib_dir = fileURLToPath(new URL('./node_modules/stylelint/lib/', import.meta.url)) +const stylelint_browser_dir = fileURLToPath(new URL('./src/lib/stylelint-browser/', import.meta.url)) + +// stylelint's package.json `exports` map only publishes `.`, `./package.json` +// and `./lib/utils/*`. src/lib/stylelint-browser/lint.ts deep-imports a few +// unpublished internals on purpose (see that file's header comment) - point +// those specifiers straight at the real files on disk so bundling and +// type-checking (via stylelint-internals.d.ts) both work. +// +// These use `resolve.alias` (not a custom plugin `resolveId` hook) because +// Vite's dependency optimizer pre-bundles reachable node_modules packages +// with esbuild directly, ahead of the normal plugin pipeline, and only +// honours declarative aliases - a custom resolver here would be silently +// skipped during that pre-bundling pass. +// +// Nothing server-side imports real `stylelint`/`node:os`/`node:process` +// anymore (linting is client-only), so these aliases apply everywhere rather +// than being scoped to the client build - simpler, and harmless for SSR +// since this code only ever executes in the browser (see the `browser` guard +// in Linter.svelte) and just needs to *resolve* for the SSR bundle. +const config_alias = [ + // Unpublished internals, aliased to the real files on disk. + { find: 'stylelint/lib/lintPostcssResult.mjs', replacement: stylelint_lib_dir + 'lintPostcssResult.mjs' }, + { + find: 'stylelint/lib/normalizeAllRuleSettings.mjs', + replacement: stylelint_lib_dir + 'normalizeAllRuleSettings.mjs' + }, + { + find: 'stylelint/lib/createPartialStylelintResult.mjs', + replacement: stylelint_lib_dir + 'createPartialStylelintResult.mjs' + }, + { find: 'stylelint/lib/prepareReturnValue.mjs', replacement: stylelint_lib_dir + 'prepareReturnValue.mjs' }, + { + find: 'stylelint/lib/formatters/jsonFormatter.mjs', + replacement: stylelint_lib_dir + 'formatters/jsonFormatter.mjs' + }, + + // lintPostcssResult.mjs's own `./timing.mjs` import drags in the `table` + // package (for `TIMING= stylelint ...` CLI output we never trigger), + // which doesn't bundle for the browser. See shims/stylelint-timing.ts. + { find: './timing.mjs', replacement: stylelint_browser_dir + 'shims/stylelint-timing.ts' }, + + // Node-free stand-ins for bare specifiers stylelint's internals (and our + // plugin package) import. + { find: 'node:os', replacement: stylelint_browser_dir + 'shims/node-os.ts' }, + { find: 'node:process', replacement: stylelint_browser_dir + 'shims/node-process.ts' }, + // `find` must be an exact-match regex here, not the plain string + // shorthand: Vite's aliasing treats a bare string `find` as a *prefix* + // (so it'd also rewrite real subpaths like `stylelint/lib/utils/report.mjs` + // to `.../stylelint-shim.ts/lib/utils/report.mjs`), which those subpaths + // need to keep resolving to the real, publicly-exported package files. + { find: /^stylelint$/, replacement: stylelint_browser_dir + 'stylelint-shim.ts' } +] /** @type {import('vite').UserConfig} */ const config = { plugins: [enhancedImages(), sveltekit()], + resolve: { + alias: config_alias + }, css: { transformer: 'lightningcss', lightningcss: { From da3d8e646426fffc7091488e2e754f5baf152d1e Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 9 Aug 2026 20:14:01 +0000 Subject: [PATCH 2/4] docs: pin and document stylelint's own transitive deps, drop unused table Added a dedicated pinned-transitive-deps.ts, imported for its side effect from lint.ts, that imports css-tree, @csstools/css-syntax-patches-for-csstree, @csstools/css-tokenizer and fastest-levenshtein - packages stylelint's own internals (getLexer.mjs, assignDisabledRanges.mjs, reportUnknownRuleNames.mjs) import by name but our own code never did directly. Without a real usage site, dependency-usage tooling has no way to tell they're needed rather than stray entries, and pnpm's strict node_modules requires them declared in our own package.json regardless (they're normally hoisted transitively, but only for packages we actually import from). Also drops `table` from dependencies: it was added while investigating why stylelint/lib/timing.mjs doesn't bundle for the browser, but the fix ended up aliasing that whole relative import away (see vite.config.js), so the real `table` package was never reachable to begin with. --- package.json | 1 - pnpm-lock.yaml | 3 -- src/lib/stylelint-browser/lint.ts | 3 ++ .../pinned-transitive-deps.ts | 35 +++++++++++++++++++ .../stylelint-internals.d.ts | 7 ++++ 5 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 src/lib/stylelint-browser/pinned-transitive-deps.ts diff --git a/package.json b/package.json index 5a628efb..36363a64 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,6 @@ "runed": "^0.37.1", "stylelint": "~17.13.0", "svelte": "^5.56.8", - "table": "^6.9.0", "typescript": "^6.0.3", "vite": "8.0.16" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ef91c192..152810f1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -116,9 +116,6 @@ importers: svelte: specifier: ^5.56.8 version: 5.56.8 - table: - specifier: ^6.9.0 - version: 6.9.0 typescript: specifier: ^6.0.3 version: 6.0.3 diff --git a/src/lib/stylelint-browser/lint.ts b/src/lib/stylelint-browser/lint.ts index 13cf9bd9..b49ec3c0 100644 --- a/src/lib/stylelint-browser/lint.ts +++ b/src/lib/stylelint-browser/lint.ts @@ -17,6 +17,9 @@ import jsonFormatter from 'stylelint/lib/formatters/jsonFormatter.mjs' // `lib/utils/*` is publicly exported by stylelint, so this one needs no alias. import getLexer from 'stylelint/lib/utils/getLexer.mjs' import type { Config, LinterResult, PostcssResult, Rule } from 'stylelint' +// Pins package.json deps that only stylelint's own internals above import by +// name - see that file's header comment for why this needs to exist at all. +import './pinned-transitive-deps.js' export type LintSource = { /** Cosmetic label only (becomes `result.source`); a file path or URL both work. */ diff --git a/src/lib/stylelint-browser/pinned-transitive-deps.ts b/src/lib/stylelint-browser/pinned-transitive-deps.ts new file mode 100644 index 00000000..a3c7f60b --- /dev/null +++ b/src/lib/stylelint-browser/pinned-transitive-deps.ts @@ -0,0 +1,35 @@ +// pnpm's strict node_modules layout only installs packages declared +// directly in this repo's package.json - it doesn't hoist a dependency's +// own dependencies just because we deep-import files from inside that +// dependency. +// +// ./lint.ts deep-imports internals from `stylelint` itself (aliased to the +// real files on disk in vite.config.js, since they aren't part of +// stylelint's public `exports` map - see lint.ts's header comment). Those +// internals statically import a few packages that stylelint installs for +// its own use, but that our own code never references by name: +// +// - `css-tree` and `@csstools/css-syntax-patches-for-csstree`, used by +// stylelint/lib/utils/getLexer.mjs, which lint.ts calls directly to +// build the `.stylelint.lexer` scaffold field. +// - `@csstools/css-tokenizer`, used by stylelint/lib/assignDisabledRanges.mjs, +// which lintPostcssResult.mjs calls unconditionally on every lint. +// - `fastest-levenshtein`, used by stylelint/lib/reportUnknownRuleNames.mjs, +// statically imported by lintPostcssResult.mjs (only executes on an +// unknown-rule-name error, but still needs to resolve at bundle time). +// +// Without them declared in package.json, pnpm won't install them at the top +// level and the browser bundle fails to resolve (see the "MISSING dep" notes +// in git history for the exact errors). This file's only job is to give +// dependency-usage tools (knip, depcheck, ...) - and future readers - a real, +// traceable usage site instead of a mysteriously "unused" dependency. Follow +// the imports above into node_modules/stylelint/lib to see the actual call +// sites; keep the versions here in sync with stylelint's own `dependencies` +// (node_modules/stylelint/package.json) when bumping the pinned stylelint +// version in package.json. +import { fork } from 'css-tree' +import syntaxPatches from '@csstools/css-syntax-patches-for-csstree' with { type: 'json' } +import { tokenize } from '@csstools/css-tokenizer' +import { distance } from 'fastest-levenshtein' + +export const stylelint_transitive_deps = { fork, syntaxPatches, tokenize, distance } diff --git a/src/lib/stylelint-browser/stylelint-internals.d.ts b/src/lib/stylelint-browser/stylelint-internals.d.ts index 67d7aa96..f5402965 100644 --- a/src/lib/stylelint-browser/stylelint-internals.d.ts +++ b/src/lib/stylelint-browser/stylelint-internals.d.ts @@ -78,3 +78,10 @@ declare module 'stylelint/lib/utils/validateOptions.mjs' { declare module 'stylelint/lib/utils/checkAgainstRule.mjs' { export default function checkAgainstRule(options: unknown, callback: (...args: unknown[]) => void): Promise } + +// `css-tree` (a stylelint dependency, pinned in pinned-transitive-deps.ts) +// ships no types and has no `@types/css-tree` we've pulled in - only `fork` +// is referenced, so that's all that's declared here. +declare module 'css-tree' { + export function fork(config: unknown): unknown +} From 22a3698a41c480d5f0877251d5e888eb40733f31 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 24 Oct 2026 10:43:12 +0000 Subject: [PATCH 3/4] chore: bump to stylelint 18.0.0-next.0, drop two now-dead workarounds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit stylelint published an actual 18.0.0-next.0 prerelease (under the `next` dist-tag) with the same Node-dependency cleanup we verified on the v18 branch. Bumping to the real published version lets two of our browser workarounds go: - `timing.mjs` no longer pulls in `table` (→ supports-hyperlinks → supports-color, which never bundled for the browser) - it's gone from stylelint's dependencies entirely, and the import became a runtime-gated dynamic import() besides. Dropped our alias and shims/stylelint-timing.ts; confirmed zero trace of it in the built bundle. - `reportUnknownRuleNames.mjs` now uses an in-house levenshteinDistance.mjs instead of the `fastest-levenshtein` package - dropped that pin too. Everything else from the original browser driver is still required as-is: stylelint's `exports` map, the node:os/node:process imports in the core lint path, and createPlugin's dependence on the bare `stylelint` import are all unchanged in this prerelease. Needed a temporary minimumReleaseAgeExclude entry in pnpm-workspace.yaml - the supply-chain policy blocks packages published less than 7 days ago, and this prerelease is 2 days old. Worth revisiting once 18.0.0 is tagged stable or this entry has aged out on its own. Verified: full check/lint/format/vitest/build pass, and a real-browser smoke test (raw CSS, clean CSS, parse errors, URL mode) against the actual published package shows identical behavior and zero console errors. --- package.json | 5 +- pnpm-lock.yaml | 896 +++--------------- pnpm-workspace.yaml | 3 + .../pinned-transitive-deps.ts | 11 +- .../shims/stylelint-timing.ts | 15 - .../stylelint-internals.d.ts | 5 +- vite.config.js | 5 - 7 files changed, 146 insertions(+), 794 deletions(-) delete mode 100644 src/lib/stylelint-browser/shims/stylelint-timing.ts diff --git a/package.json b/package.json index 36363a64..d44808f5 100644 --- a/package.json +++ b/package.json @@ -40,17 +40,16 @@ "color-sorter": "^8.0.2", "css-tree": "^3.2.1", "diff": "^9.0.0", - "fastest-levenshtein": "^1.0.16", "github-slugger": "^2.0.0", "lightningcss": "1.32.0", "linkedom": "^0.18.13", "mdsvex": "^0.12.8", "paneforge": "^1.0.2", - "postcss": "^8.5.15", + "postcss": "^8.5.30", "rehype-autolink-headings": "^7.1.0", "rehype-slug": "^6.0.0", "runed": "^0.37.1", - "stylelint": "~17.13.0", + "stylelint": "18.0.0-next.0", "svelte": "^5.56.8", "typescript": "^6.0.3", "vite": "8.0.16" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 152810f1..344873f1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -61,7 +61,7 @@ importers: version: 3.1.6 '@projectwallace/stylelint-plugin': specifier: ^0.6.15 - version: 0.6.15(stylelint@17.13.0(supports-color@10.2.2)(typescript@6.0.3)) + version: 0.6.15(stylelint@18.0.0-next.0) '@sveltejs/enhanced-img': specifier: ^0.11.0 version: 0.11.0(@sveltejs/vite-plugin-svelte@7.2.0(svelte@5.56.8)(vite@8.0.16(@types/node@25.9.5)(esbuild@0.28.1)))(svelte@5.56.8)(vite@8.0.16(@types/node@25.9.5)(esbuild@0.28.1)) @@ -80,9 +80,6 @@ importers: diff: specifier: ^9.0.0 version: 9.0.0 - fastest-levenshtein: - specifier: ^1.0.16 - version: 1.0.16 github-slugger: specifier: ^2.0.0 version: 2.0.0 @@ -99,8 +96,8 @@ importers: specifier: ^1.0.2 version: 1.0.2(@sveltejs/kit@2.70.1(@sveltejs/vite-plugin-svelte@7.2.0(svelte@5.56.8)(vite@8.0.16(@types/node@25.9.5)(esbuild@0.28.1)))(svelte@5.56.8)(typescript@6.0.3)(vite@8.0.16(@types/node@25.9.5)(esbuild@0.28.1)))(svelte@5.56.8) postcss: - specifier: ^8.5.15 - version: 8.5.23 + specifier: ^8.5.30 + version: 8.5.30 rehype-autolink-headings: specifier: ^7.1.0 version: 7.1.0 @@ -111,8 +108,8 @@ importers: specifier: ^0.37.1 version: 0.37.1(@sveltejs/kit@2.70.1(@sveltejs/vite-plugin-svelte@7.2.0(svelte@5.56.8)(vite@8.0.16(@types/node@25.9.5)(esbuild@0.28.1)))(svelte@5.56.8)(typescript@6.0.3)(vite@8.0.16(@types/node@25.9.5)(esbuild@0.28.1)))(svelte@5.56.8) stylelint: - specifier: ~17.13.0 - version: 17.13.0(supports-color@10.2.2)(typescript@6.0.3) + specifier: 18.0.0-next.0 + version: 18.0.0-next.0 svelte: specifier: ^5.56.8 version: 5.56.8 @@ -146,7 +143,7 @@ importers: version: 1.8.1 stylelint-config-standard: specifier: ~40.0.0 - version: 40.0.0(stylelint@17.13.0(supports-color@10.2.2)(typescript@6.0.3)) + version: 40.0.0(stylelint@18.0.0-next.0) svelte-check: specifier: ^4.7.3 version: 4.7.3(picomatch@4.0.5)(svelte@5.56.8)(typescript@6.0.3) @@ -156,35 +153,29 @@ importers: packages: - '@babel/code-frame@7.29.7': - resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.29.7': - resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} - engines: {node: '>=6.9.0'} - - '@cacheable/memory@2.2.0': - resolution: {integrity: sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==} - - '@cacheable/utils@2.5.0': - resolution: {integrity: sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==} - '@colordx/core@5.5.0': resolution: {integrity: sha512-3PxTH8itZzltK0U9jTwVVnjLXvnDYuq3m+QXsHkENxWiPRh4WaoLcs1SQjqgZ55kS+QyirpH5BVwzP2gMVG6EQ==} - '@csstools/css-calc@3.3.0': - resolution: {integrity: sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ==} + '@csstools/css-calc@3.4.3': + resolution: {integrity: sha512-iex20d8CHVkyvg6B7UKV7uHnI2Bqo9g+EFfT9E0y+GvTvhZ/DwONJ+9aKb1dlqm0ZiGsL5RXjp0fCoJYnkeDjA==} engines: {node: '>=20.19.0'} peerDependencies: - '@csstools/css-parser-algorithms': ^4.0.0 - '@csstools/css-tokenizer': ^4.0.0 + '@csstools/css-parser-algorithms': ^4.0.2 + '@csstools/css-tokenizer': ^4.0.2 - '@csstools/css-parser-algorithms@4.0.0': - resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==} + '@csstools/css-parser-algorithms@4.0.2': + resolution: {integrity: sha512-40cSKyMvK+tq4qz6Awrlye2WGuOKt3FwPgtGg6KTfbHOWNw+Rk1rzbAtZnZ6IBhsY491HLRnDXwoyBAijmmILA==} engines: {node: '>=20.19.0'} peerDependencies: - '@csstools/css-tokenizer': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.2 + + '@csstools/css-syntax-patches-for-csstree@1.1.15': + resolution: {integrity: sha512-J0u7HkVl2nzSlhsiTOp4AmwcUQ3D+mGEEKfBy/7To5/y7F2OHwyLrXfrhR0SMgr4p5Lo+eaMVSeai24zUcBIxA==} + peerDependencies: + css-tree: ^3.2.1 + peerDependenciesMeta: + css-tree: + optional: true '@csstools/css-syntax-patches-for-csstree@1.1.7': resolution: {integrity: sha512-fQ+05118eQS1cofO3aJpB5efgpBZMvIzwr/sbC8kDLVA5XLG8q1kJV5yzrUAI1f7lvhPnm8fgIjzFB8/O/5Dig==} @@ -198,21 +189,25 @@ packages: resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} engines: {node: '>=20.19.0'} - '@csstools/media-query-list-parser@5.0.0': - resolution: {integrity: sha512-T9lXmZOfnam3eMERPsszjY5NK0jX8RmThmmm99FZ8b7z8yMaFZWKwLWGZuTwdO3ddRY5fy13GmmEYZXB4I98Eg==} + '@csstools/css-tokenizer@4.0.2': + resolution: {integrity: sha512-OoKoR0f76dCY666JlcbhmVTs2drYj1GUXZTYTcbUgJjh9Nv41aFfZ21bPQTERm5+L5cBDo466NltB2lplS5GBw==} + engines: {node: '>=20.19.0'} + + '@csstools/media-query-list-parser@5.0.2': + resolution: {integrity: sha512-qx19O8AbbLLbDSAcI6YOby/Vq8rV51psgIvlF5OZT/L8fQJDCyQifL6k+kYU4a8ySpzJ4RBzZkIs530bAn8y4Q==} engines: {node: '>=20.19.0'} peerDependencies: - '@csstools/css-parser-algorithms': ^4.0.0 - '@csstools/css-tokenizer': ^4.0.0 + '@csstools/css-parser-algorithms': ^4.0.2 + '@csstools/css-tokenizer': ^4.0.2 - '@csstools/selector-resolve-nested@4.0.1': - resolution: {integrity: sha512-j3vdQu0XwLME5qOTWxm8cnmvsf423R2YL6DbKklCHZwkDm7UdKNu6RPlw4REIJhSlKBICY3B70/7QZdicLqZgg==} + '@csstools/selector-resolve-nested@4.0.2': + resolution: {integrity: sha512-JpjNBJFA+4OnAHKRK4AMp8xrYyLhI9XapOeBlP2PhRU/IylSw+1ep3BFNTksBJnrTS3KT6kqKNVfpzLLwZUW5Q==} engines: {node: '>=20.19.0'} peerDependencies: postcss-selector-parser: ^7.1.1 - '@csstools/selector-specificity@6.0.0': - resolution: {integrity: sha512-4sSgl78OtOXEX/2d++8A83zHNTgwCJMaR24FvsYL7Uf/VS8HZk9PTwR51elTbGqMuwH3szLvvOXEaVnqn0Z3zA==} + '@csstools/selector-specificity@6.0.1': + resolution: {integrity: sha512-MBuqFIIvqk4S593MGAskTkPpEUUzZNvGzh8mMxEwl3oHwjQlXmqHEDxNbN3Y0Tsh+xjmem4GZjeg7I0qkwBivg==} engines: {node: '>=20.19.0'} peerDependencies: postcss-selector-parser: ^7.1.1 @@ -578,15 +573,6 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@keyv/bigmap@1.3.1': - resolution: {integrity: sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==} - engines: {node: '>= 18'} - peerDependencies: - keyv: ^5.6.0 - - '@keyv/serialize@1.1.1': - resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} - '@melt-ui/pp@0.3.2': resolution: {integrity: sha512-xKkPvaIAFinklLXcQOpwZ8YSpqAFxykjWf8Y/fSJQwsixV/0rcFs07hJ49hJjPy5vItvw5Qa0uOjzFUbXzBypQ==} peerDependencies: @@ -604,18 +590,6 @@ packages: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - '@oddbird/popover-polyfill@0.6.1': resolution: {integrity: sha512-Papau51NPG+NajXvoEHCNT1CBJv4WIyvIGfH5gpJPLL8MZJt/4giC0jJ/mNZRtJmdzRuXWpUFB6QxkJa1RvMAQ==} @@ -1051,10 +1025,6 @@ packages: rollup: optional: true - '@sindresorhus/merge-streams@4.0.0': - resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} - engines: {node: '>=18'} - '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} @@ -1175,23 +1145,8 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - ajv@8.20.0: - resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} - - 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'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + argparse@3.0.3: + resolution: {integrity: sha512-Sn98ftV3KfsO8xfLPHG6oT8y+b0yvbrLgZjgPDXsharNY15tTAjqIsIju4S32nl6/iEUNNE4v+yL2Zhm8ooP3w==} aria-query@5.3.1: resolution: {integrity: sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==} @@ -1201,10 +1156,6 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - astral-regex@2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} - engines: {node: '>=8'} - axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} @@ -1216,17 +1167,6 @@ packages: resolution: {integrity: sha512-DkVaaQHymRhpYEYo9x1oo7Q7B0Y6KJUsjm3c9eTyFDby4MHLBTwZ6ZDWBel5zrYxj1WsZgC5oLpiz+93MluXeA==} engines: {node: '>=20.19.0'} - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - cacheable@2.5.0: - resolution: {integrity: sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g==} - - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - chai@6.2.2: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} @@ -1239,19 +1179,12 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} - 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==} - color-sorter@8.0.2: resolution: {integrity: sha512-6PVyJu6ufP/Buv4I5NhSjKzH0mWe0wJjPOQWIM98lC+XPtNK9NWWoP0DqQxVOTjLI2gK5lceYDhjnugo3byUZA==} engines: {node: '>=18.0.0'} - colord@2.9.3: - resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + colord@2.10.0: + resolution: {integrity: sha512-AidJptpBJmjTclAp9BkLwJi0T93fo5epJnbaZslpg6QVzpHjAiveF55mE9AcUJiGMqRHgMDY8soMsQtuNYMHfw==} convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -1260,18 +1193,9 @@ packages: resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} - cosmiconfig@9.0.2: - resolution: {integrity: sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true - - css-functions-list@3.3.3: - resolution: {integrity: sha512-8HFEBPKhOpJPEPu70wJJetjKta86Gw9+CCyCnB3sui2qQfOvRyqBy4IKLKKAwdMpWb2lHXWk9Wb4Z6AmaUT1Pg==} - engines: {node: '>=12'} + cosmiconfig@10.0.1: + resolution: {integrity: sha512-/zvGoYn0y27QTBmK+0B+oPdEPC4fKGUmJsMTQbDjqph00TrkqfVFW/M+C6ya54sYCgHC6QCwK/mI6djt8cEGHQ==} + engines: {node: ^22.18 || >= 24} css-select@7.0.0: resolution: {integrity: sha512-snmjEVXy+1LnwXdxhYvTMj1d9tOh4HxkA1YmoayVBeeyR2C14Pum7fcxJIm4SswYspVy866eYNwlH6xC3/VH5g==} @@ -1293,15 +1217,6 @@ packages: cssom@0.5.0: resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} - debug@4.4.3: - resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} @@ -1353,9 +1268,6 @@ packages: resolution: {integrity: sha512-qI4JLRKnSzqFqr7hAlS5xQDusBCjKSEG4t4+7aNrIQMHBcsC2TGEhuyABJdYkgSewL57PNLYEiibY2iPKhKpaA==} engines: {node: '>=20.19.0'} - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -1372,9 +1284,6 @@ packages: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} - error-ex@1.3.4: - resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} - es-module-lexer@2.3.1: resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==} @@ -1407,23 +1316,6 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} - - fast-uri@3.1.5: - resolution: {integrity: sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==} - - fastest-levenshtein@1.0.16: - resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} - engines: {node: '>= 4.9.1'} - - fastq@1.20.1: - resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} - fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -1433,19 +1325,6 @@ packages: picomatch: optional: true - file-entry-cache@11.1.5: - resolution: {integrity: sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - flat-cache@6.1.23: - resolution: {integrity: sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==} - - flatted@3.4.3: - resolution: {integrity: sha512-/zipXxyO6rGvuNGDiULY9MvEGSkb2gaG4GGH4ygMi0ZZzyMHdUZBmntJmx5x1G2VuPytCwGN4xsJP6cw+sK+vQ==} - focus-trap@7.8.0: resolution: {integrity: sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==} @@ -1459,40 +1338,9 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - get-east-asian-width@1.6.0: - resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} - engines: {node: '>=18'} - github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - global-modules@2.0.0: - resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} - engines: {node: '>=6'} - - global-prefix@3.0.0: - resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} - engines: {node: '>=6'} - - globby@16.2.2: - resolution: {integrity: sha512-NLvV9ubZ6NDsJaOpKPy3cQeJpKi9DcWiyCiFUpJPA0YihRqiE6RWaLUmgNNPr8MgPpLZjnBjSmou7uZBRJv9wA==} - engines: {node: '>=20'} - - globjoin@0.1.4: - resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==} - - has-flag@5.0.1: - resolution: {integrity: sha512-CsNUt5x9LUdx6hnk/E2SZLsDyvfqANZSUq4+D3D8RzDJ2M+HDTIkF60ibS1vHaK55vzgiZw1bEPFG9yH7l33wA==} - engines: {node: '>=12'} - - hashery@1.5.1: - resolution: {integrity: sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==} - engines: {node: '>=20'} - hast-util-heading-rank@3.0.0: resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==} @@ -1502,69 +1350,29 @@ packages: hast-util-to-string@3.0.1: resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} - hookified@1.15.1: - resolution: {integrity: sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==} - - hookified@2.2.0: - resolution: {integrity: sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==} - html-escaper@3.0.3: resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} - html-tags@5.1.0: - resolution: {integrity: sha512-n6l5uca7/y5joxZ3LUePhzmBFUJ+U2YWzhMa8XUTecSeSlQiZdF5XAd/Q3/WUl0VsXgUwWi8I7CNIwdI5WN1SQ==} - engines: {node: '>=20.10'} - htmlparser2@10.1.0: resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} htmlparser2@8.0.2: resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} - ignore@7.0.6: - resolution: {integrity: sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==} + ignore@7.0.12: + resolution: {integrity: sha512-/8UvqAPU9DGTI9k4mxtf49U37Isfwr8Uts96+SBHIkFxPJnHS0Ew4f00sM4Scd8V8EjM0jUNtVDdv1kPdt35lg==} engines: {node: '>= 4'} imagetools-core@9.1.0: resolution: {integrity: sha512-xQjs+2vrxLnAjCq+omuNkd5UQTld9/bP8+YT0LyYTlKfuSQtgUBvqhUwGugzSAh6sCdN+LnROMuLswn5hZ9Fhg==} engines: {node: '>=20.0.0'} - import-fresh@3.3.1: - resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} - engines: {node: '>=6'} - import-meta-resolve@4.2.0: resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} - ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - inline-style-parser@0.2.7: resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-path-inside@4.0.0: - resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} - engines: {node: '>=12'} - is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} @@ -1572,32 +1380,13 @@ packages: is-reference@3.0.3: resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-tokens@9.0.1: resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} - js-yaml@4.3.1: - resolution: {integrity: sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==} + js-yaml@5.5.0: + resolution: {integrity: sha512-paNr4LFIFPjeeSmwNYdrb8FafLLG/Cr2Af3GjbsHJ5CxIjH4r0c2emlmRdAtpPAieP1gRVzk6buBbVP5gBMGAg==} hasBin: true - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - - json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - - keyv@5.6.0: - resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==} - - kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - kleur@4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} @@ -1676,9 +1465,6 @@ packages: resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} engines: {node: '>= 12.0.0'} - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - linkedom@0.18.13: resolution: {integrity: sha512-ES/o9qotMpzpN2MHs+Iq/JcVoOj8Fa5wiQYrTdFpvAnwXL0g66XHHUc9WUMk6nAlBtGsFQ24ne+SYnvnaQ2FSw==} engines: {node: '>=16'} @@ -1691,9 +1477,6 @@ packages: locate-character@3.0.0: resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} - lodash.truncate@4.4.2: - resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} - lz-string@1.5.0: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true @@ -1701,9 +1484,6 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - mathml-tag-names@4.0.0: - resolution: {integrity: sha512-aa6AU2Pcx0VP/XWnh8IGL0SYSgQHDT6Ucror2j2mXeFAlN3ahaNs8EZtG1YiticMkSLj3Gt6VPFfZogt7G5iFQ==} - mdn-data@2.27.1: resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} @@ -1712,18 +1492,6 @@ packages: peerDependencies: svelte: ^3.56.0 || ^4.0.0 || ^5.0.0-next.120 - meow@14.1.0: - resolution: {integrity: sha512-EDYo6VlmtnumlcBCbh1gLJ//9jvM/ndXHfVXIFrZVr6fGcwTUyCTFNTLCKuY3ffbK8L/+3Mzqnd58RojiZqHVw==} - engines: {node: '>=20'} - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -1732,11 +1500,8 @@ packages: resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} engines: {node: '>=10'} - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.16: - resolution: {integrity: sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==} + nanoid@3.3.20: + resolution: {integrity: sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -1745,10 +1510,6 @@ packages: engines: {node: ^18 || >=20} hasBin: true - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - nth-check@3.0.1: resolution: {integrity: sha512-GX0gsdbGVCgnRgbeGaubfjpBXyYRWOOCVeYh08bSQvDZqxz5ndXs1OTfAt/h36G1xvI94YIspsI0sVFqAV9+RQ==} engines: {node: '>=20.19.0'} @@ -1792,28 +1553,20 @@ packages: peerDependencies: svelte: ^5.29.0 - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.2: - resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} - engines: {node: '>=8.6'} - picomatch@4.0.5: resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} engines: {node: '>=12'} + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} + engines: {node: '>=12'} + playwright-core@1.62.0: resolution: {integrity: sha512-nsNRyq0r2zsG8AcRHWknc9QRA5XCueC7gWMrs+Gx2tlZn9hcl8zudfh00lhJPY1DE7NmZ6bDsT9g2yey8mXljA==} engines: {node: '>=20'} @@ -1834,21 +1587,21 @@ packages: peerDependencies: postcss: ^8.3.3 - postcss-safe-parser@7.0.1: - resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} + postcss-safe-parser@7.1.0: + resolution: {integrity: sha512-1WzZxRLaAFwEh6Do+zyGpjWV3nGJNxxhuh7Ubu/q1ICImMgZJnLwhoaEpRbG4pJppp2Y1ncL9ffA2f+LhrefQg==} engines: {node: '>=18.0'} peerDependencies: postcss: ^8.4.31 - postcss-selector-parser@7.1.4: - resolution: {integrity: sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==} + postcss-selector-parser@7.1.6: + resolution: {integrity: sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==} engines: {node: '>=4'} postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.5.23: - resolution: {integrity: sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==} + postcss@8.5.30: + resolution: {integrity: sha512-zkd+e9S1AQHhmaBKye9zlFHWjOwVgqXl1q3ECYy8561K7qxR2cREf/STLskulBFd78k6AOFeA+ff1TtEzk9bAA==} engines: {node: ^10 || ^12 || >=14} prism-svelte@0.4.7: @@ -1858,13 +1611,6 @@ packages: resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} engines: {node: '>=6'} - qified@0.10.1: - resolution: {integrity: sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==} - engines: {node: '>=20'} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - readdirp@5.0.0: resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} engines: {node: '>= 20.19.0'} @@ -1875,26 +1621,11 @@ packages: rehype-slug@6.0.0: resolution: {integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==} - require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rolldown@1.0.3: resolution: {integrity: sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - runed@0.37.1: resolution: {integrity: sha512-MeFY73xBW8IueWBm012nNFIGy19WUGPLtknavyUPMpnyt350M47PhGSGrGoSLbidwn+Zlt/O0cp8/OZE3LASWA==} peerDependencies: @@ -1934,40 +1665,20 @@ packages: resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} engines: {node: '>=18'} - slash@5.1.0: - resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} - engines: {node: '>=14.16'} - - slice-ansi@4.0.0: - resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} - engines: {node: '>=10'} - source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map-js@1.2.2: + resolution: {integrity: sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==} + engines: {node: '>=0.10.0'} + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} std-env@4.2.0: resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==} - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string-width@8.2.2: - resolution: {integrity: sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==} - engines: {node: '>=20'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-ansi@7.2.0: - resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} - engines: {node: '>=12'} - style-to-object@1.0.14: resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} @@ -1983,19 +1694,11 @@ packages: peerDependencies: stylelint: ^17.0.0 - stylelint@17.13.0: - resolution: {integrity: sha512-G1WYzMerp7ihOaIe9VJCHLt12MoAD2QLf1AFerYP37+BCRBUK5UCpq8e/mN+zCIaJPKQcaxhE4WlPmqdiOx/gw==} - engines: {node: '>=20.19.0'} + stylelint@18.0.0-next.0: + resolution: {integrity: sha512-c6ifZUlUZKuCZq04rYWEJgo2BY3Ag1jgB2xU4VrRY2fst+M6HntdDm92RUB9XNlwkW/7NQ7TZpPhX41HR8QCqQ==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} hasBin: true - supports-color@10.2.2: - resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} - engines: {node: '>=18'} - - supports-hyperlinks@4.5.0: - resolution: {integrity: sha512-ZW2OvfeCXrNTbLakPUzjQG922EeGCOteFSVoek5DKStTh898wf7zgtuFlzQN8HfZCxC3Eh02yJVrRW51hADf+w==} - engines: {node: '>=20'} - svelte-check@4.7.3: resolution: {integrity: sha512-DHdTCGX62R0fCxBEaT+USdASAnoaRBaaNczkRJl0K7o3WyoCeVUbVxo6fKqpOll/B+WMWCsiFK0eFrJSNBKZIg==} engines: {node: '>= 18.0.0'} @@ -2019,16 +1722,9 @@ packages: resolution: {integrity: sha512-PY8LOw7xP6c8IOiVqdo0sbbZVYhXRSfklOQLAUyGBKqjTX0wx/z4l/9J+PmBpmlLnxzEb1NqltxQ5/wZme/Cmg==} engines: {node: '>=18'} - svg-tags@1.0.0: - resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} - tabbable@6.5.0: resolution: {integrity: sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==} - table@6.9.0: - resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} - engines: {node: '>=10.0.0'} - tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -2048,10 +1744,6 @@ packages: resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - totalist@3.0.1: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} @@ -2073,10 +1765,6 @@ packages: undici-types@7.24.6: resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} - unicorn-magic@0.4.0: - resolution: {integrity: sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==} - engines: {node: '>=20'} - unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} @@ -2212,54 +1900,34 @@ packages: jsdom: optional: true - which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - why-is-node-running@2.3.0: resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} hasBin: true - write-file-atomic@7.0.1: - resolution: {integrity: sha512-OTIk8iR8/aCRWBqvxrzxR0hgxWpnYBblY1S5hDWBQfk/VFmJwzmJgQFN3WsoUKHISv2eAwe+PpbUzyL1CKTLXg==} - engines: {node: ^20.17.0 || >=22.9.0} + write-file-atomic@8.0.0: + resolution: {integrity: sha512-dYwyZredl67GyLLIHJnRM3h2PcOmN5SkcgC7eM5DPDEOEl6dLFqVrMg3F1Ea32usj4VSVZtd2H4MtKTNOf6nPg==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} zimmerframe@1.1.4: resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==} snapshots: - '@babel/code-frame@7.29.7': - dependencies: - '@babel/helper-validator-identifier': 7.29.7 - js-tokens: 4.0.0 - picocolors: 1.1.1 - - '@babel/helper-validator-identifier@7.29.7': {} - - '@cacheable/memory@2.2.0': - dependencies: - '@cacheable/utils': 2.5.0 - '@keyv/bigmap': 1.3.1(keyv@5.6.0) - hookified: 1.15.1 - keyv: 5.6.0 - - '@cacheable/utils@2.5.0': - dependencies: - hashery: 1.5.1 - keyv: 5.6.0 - '@colordx/core@5.5.0': {} - '@csstools/css-calc@3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + '@csstools/css-calc@3.4.3(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2)': dependencies: - '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-tokenizer': 4.0.0 + '@csstools/css-parser-algorithms': 4.0.2(@csstools/css-tokenizer@4.0.2) + '@csstools/css-tokenizer': 4.0.2 - '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)': + '@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2)': dependencies: - '@csstools/css-tokenizer': 4.0.0 + '@csstools/css-tokenizer': 4.0.2 + + '@csstools/css-syntax-patches-for-csstree@1.1.15(css-tree@3.2.1)': + optionalDependencies: + css-tree: 3.2.1 '@csstools/css-syntax-patches-for-csstree@1.1.7(css-tree@3.2.1)': optionalDependencies: @@ -2267,18 +1935,20 @@ snapshots: '@csstools/css-tokenizer@4.0.0': {} - '@csstools/media-query-list-parser@5.0.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + '@csstools/css-tokenizer@4.0.2': {} + + '@csstools/media-query-list-parser@5.0.2(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2)': dependencies: - '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-tokenizer': 4.0.0 + '@csstools/css-parser-algorithms': 4.0.2(@csstools/css-tokenizer@4.0.2) + '@csstools/css-tokenizer': 4.0.2 - '@csstools/selector-resolve-nested@4.0.1(postcss-selector-parser@7.1.4)': + '@csstools/selector-resolve-nested@4.0.2(postcss-selector-parser@7.1.6)': dependencies: - postcss-selector-parser: 7.1.4 + postcss-selector-parser: 7.1.6 - '@csstools/selector-specificity@6.0.0(postcss-selector-parser@7.1.4)': + '@csstools/selector-specificity@6.0.1(postcss-selector-parser@7.1.6)': dependencies: - postcss-selector-parser: 7.1.4 + postcss-selector-parser: 7.1.6 '@emnapi/core@1.10.0': dependencies: @@ -2521,14 +2191,6 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@keyv/bigmap@1.3.1(keyv@5.6.0)': - dependencies: - hashery: 1.5.1 - hookified: 1.15.1 - keyv: 5.6.0 - - '@keyv/serialize@1.1.1': {} - '@melt-ui/pp@0.3.2(@melt-ui/svelte@0.86.6(svelte@5.56.8))(svelte@5.56.8)': dependencies: '@melt-ui/svelte': 0.86.6(svelte@5.56.8) @@ -2553,18 +2215,6 @@ snapshots: '@tybys/wasm-util': 0.10.3 optional: true - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.20.1 - '@oddbird/popover-polyfill@0.6.1': {} '@oxc-project/types@0.133.0': {} @@ -2740,11 +2390,11 @@ snapshots: dependencies: '@projectwallace/css-parser': 0.18.2 - '@projectwallace/stylelint-plugin@0.6.15(stylelint@17.13.0(supports-color@10.2.2)(typescript@6.0.3))': + '@projectwallace/stylelint-plugin@0.6.15(stylelint@18.0.0-next.0)': dependencies: '@projectwallace/css-analyzer': 9.9.3 '@projectwallace/css-parser': 0.18.2 - stylelint: 17.13.0(supports-color@10.2.2)(typescript@6.0.3) + stylelint: 18.0.0-next.0 '@rolldown/binding-android-arm64@1.0.3': optional: true @@ -2803,8 +2453,6 @@ snapshots: estree-walker: 2.0.2 picomatch: 4.0.5 - '@sindresorhus/merge-streams@4.0.0': {} - '@standard-schema/spec@1.1.0': {} '@sveltejs/acorn-typescript@1.0.11(acorn@8.17.0)': @@ -2944,49 +2592,18 @@ snapshots: acorn@8.17.0: {} - ajv@8.20.0: - dependencies: - fast-deep-equal: 3.1.3 - fast-uri: 3.1.5 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - - ansi-regex@5.0.1: {} - - ansi-regex@6.2.2: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - argparse@2.0.1: {} + argparse@3.0.3: {} aria-query@5.3.1: {} assertion-error@2.0.1: {} - astral-regex@2.0.0: {} - axobject-query@4.1.0: {} bail@2.0.2: {} boolbase@2.0.0: {} - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - cacheable@2.5.0: - dependencies: - '@cacheable/memory': 2.2.0 - '@cacheable/utils': 2.5.0 - hookified: 1.15.1 - keyv: 5.6.0 - qified: 0.10.1 - - callsites@3.1.0: {} - chai@6.2.2: {} chokidar@5.0.0: @@ -2995,32 +2612,20 @@ snapshots: clsx@2.1.1: {} - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - color-sorter@8.0.2: dependencies: '@colordx/core': 5.5.0 - colord@2.9.3: {} + colord@2.10.0: {} convert-source-map@2.0.0: {} cookie@0.6.0: {} - cosmiconfig@9.0.2(typescript@6.0.3): + cosmiconfig@10.0.1: dependencies: env-paths: 2.2.1 - import-fresh: 3.3.1 - js-yaml: 4.3.1 - parse-json: 5.2.0 - optionalDependencies: - typescript: 6.0.3 - - css-functions-list@3.3.3: {} + js-yaml: 5.5.0 css-select@7.0.0: dependencies: @@ -3041,12 +2646,6 @@ snapshots: cssom@0.5.0: {} - debug@4.4.3(supports-color@10.2.2): - dependencies: - ms: 2.1.3 - optionalDependencies: - supports-color: 10.2.2 - deepmerge@4.3.1: {} dequal@2.0.3: {} @@ -3097,8 +2696,6 @@ snapshots: domelementtype: 3.0.0 domhandler: 6.0.1 - emoji-regex@8.0.0: {} - entities@4.5.0: {} entities@7.0.1: {} @@ -3107,10 +2704,6 @@ snapshots: env-paths@2.2.1: {} - error-ex@1.3.4: - dependencies: - is-arrayish: 0.2.1 - es-module-lexer@2.3.1: {} esbuild@0.28.1: @@ -3158,44 +2751,10 @@ snapshots: extend@3.0.2: {} - fast-deep-equal@3.1.3: {} - - fast-glob@3.3.3: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - - fast-uri@3.1.5: {} - - fastest-levenshtein@1.0.16: {} - - fastq@1.20.1: - dependencies: - reusify: 1.1.0 - fdir@6.5.0(picomatch@4.0.5): optionalDependencies: picomatch: 4.0.5 - file-entry-cache@11.1.5: - dependencies: - flat-cache: 6.1.23 - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - flat-cache@6.1.23: - dependencies: - cacheable: 2.5.0 - flatted: 3.4.3 - hookified: 1.15.1 - - flatted@3.4.3: {} - focus-trap@7.8.0: dependencies: tabbable: 6.5.0 @@ -3206,41 +2765,8 @@ snapshots: fsevents@2.3.3: optional: true - get-east-asian-width@1.6.0: {} - github-slugger@2.0.0: {} - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - global-modules@2.0.0: - dependencies: - global-prefix: 3.0.0 - - global-prefix@3.0.0: - dependencies: - ini: 1.3.8 - kind-of: 6.0.3 - which: 1.3.1 - - globby@16.2.2: - dependencies: - '@sindresorhus/merge-streams': 4.0.0 - fast-glob: 3.3.3 - ignore: 7.0.6 - is-path-inside: 4.0.0 - slash: 5.1.0 - unicorn-magic: 0.4.0 - - globjoin@0.1.4: {} - - has-flag@5.0.1: {} - - hashery@1.5.1: - dependencies: - hookified: 1.15.1 - hast-util-heading-rank@3.0.0: dependencies: '@types/hast': 3.0.5 @@ -3253,14 +2779,8 @@ snapshots: dependencies: '@types/hast': 3.0.5 - hookified@1.15.1: {} - - hookified@2.2.0: {} - html-escaper@3.0.3: {} - html-tags@5.1.0: {} - htmlparser2@10.1.0: dependencies: domelementtype: 2.3.0 @@ -3275,60 +2795,25 @@ snapshots: domutils: 3.2.2 entities: 4.5.0 - ignore@7.0.6: {} + ignore@7.0.12: {} imagetools-core@9.1.0: {} - import-fresh@3.3.1: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - import-meta-resolve@4.2.0: {} - ini@1.3.8: {} - inline-style-parser@0.2.7: {} - is-arrayish@0.2.1: {} - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-path-inside@4.0.0: {} - is-plain-obj@4.1.0: {} is-reference@3.0.3: dependencies: '@types/estree': 1.0.9 - isexe@2.0.0: {} - - js-tokens@4.0.0: {} - js-tokens@9.0.1: {} - js-yaml@4.3.1: - dependencies: - argparse: 2.0.1 - - json-parse-even-better-errors@2.3.1: {} - - json-schema-traverse@1.0.0: {} - - keyv@5.6.0: + js-yaml@5.5.0: dependencies: - '@keyv/serialize': 1.1.1 - - kind-of@6.0.3: {} + argparse: 3.0.3 kleur@4.1.5: {} @@ -3381,8 +2866,6 @@ snapshots: lightningcss-win32-arm64-msvc: 1.32.0 lightningcss-win32-x64-msvc: 1.32.0 - lines-and-columns@1.2.4: {} - linkedom@0.18.13: dependencies: css-select: 7.0.0 @@ -3393,16 +2876,12 @@ snapshots: locate-character@3.0.0: {} - lodash.truncate@4.4.2: {} - lz-string@1.5.0: {} magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - mathml-tag-names@4.0.0: {} - mdn-data@2.27.1: {} mdsvex@0.12.8(svelte@5.56.8): @@ -3415,27 +2894,14 @@ snapshots: unist-util-visit: 2.0.3 vfile-message: 2.0.4 - meow@14.1.0: {} - - merge2@1.4.1: {} - - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.2 - mri@1.2.0: {} mrmime@2.0.1: {} - ms@2.1.3: {} - - nanoid@3.3.16: {} + nanoid@3.3.20: {} nanoid@5.1.16: {} - normalize-path@3.0.0: {} - nth-check@3.0.1: dependencies: boolbase: 2.0.0 @@ -3508,25 +2974,14 @@ snapshots: - '@sveltejs/kit' - zod - parent-module@1.0.1: - dependencies: - callsites: 3.1.0 - - parse-json@5.2.0: - dependencies: - '@babel/code-frame': 7.29.7 - error-ex: 1.3.4 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - pathe@2.0.3: {} picocolors@1.1.1: {} - picomatch@2.3.2: {} - picomatch@4.0.5: {} + picomatch@4.0.7: {} + playwright-core@1.62.0: {} playwright@1.62.0: @@ -3539,40 +2994,34 @@ snapshots: dependencies: htmlparser2: 8.0.2 js-tokens: 9.0.1 - postcss: 8.5.23 - postcss-safe-parser: 6.0.0(postcss@8.5.23) + postcss: 8.5.30 + postcss-safe-parser: 6.0.0(postcss@8.5.30) - postcss-safe-parser@6.0.0(postcss@8.5.23): + postcss-safe-parser@6.0.0(postcss@8.5.30): dependencies: - postcss: 8.5.23 + postcss: 8.5.30 - postcss-safe-parser@7.0.1(postcss@8.5.23): + postcss-safe-parser@7.1.0(postcss@8.5.30): dependencies: - postcss: 8.5.23 + postcss: 8.5.30 - postcss-selector-parser@7.1.4: + postcss-selector-parser@7.1.6: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 postcss-value-parser@4.2.0: {} - postcss@8.5.23: + postcss@8.5.30: dependencies: - nanoid: 3.3.16 + nanoid: 3.3.20 picocolors: 1.1.1 - source-map-js: 1.2.1 + source-map-js: 1.2.2 prism-svelte@0.4.7: {} prismjs@1.30.0: {} - qified@0.10.1: - dependencies: - hookified: 2.2.0 - - queue-microtask@1.2.3: {} - readdirp@5.0.0: {} rehype-autolink-headings@7.1.0: @@ -3592,12 +3041,6 @@ snapshots: hast-util-to-string: 3.0.1 unist-util-visit: 5.1.0 - require-from-string@2.0.2: {} - - resolve-from@4.0.0: {} - - reusify@1.1.0: {} - rolldown@1.0.3: dependencies: '@oxc-project/types': 0.133.0 @@ -3619,10 +3062,6 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.0.3 '@rolldown/binding-win32-x64-msvc': 1.0.3 - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - runed@0.37.1(@sveltejs/kit@2.70.1(@sveltejs/vite-plugin-svelte@7.2.0(svelte@5.56.8)(vite@8.0.16(@types/node@25.9.5)(esbuild@0.28.1)))(svelte@5.56.8)(typescript@6.0.3)(vite@8.0.16(@types/node@25.9.5)(esbuild@0.28.1)))(svelte@5.56.8): dependencies: dequal: 2.0.3 @@ -3682,99 +3121,48 @@ snapshots: mrmime: 2.0.1 totalist: 3.0.1 - slash@5.1.0: {} - - slice-ansi@4.0.0: - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - source-map-js@1.2.1: {} + source-map-js@1.2.2: {} + stackback@0.0.2: {} std-env@4.2.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@8.2.2: - dependencies: - get-east-asian-width: 1.6.0 - strip-ansi: 7.2.0 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-ansi@7.2.0: - dependencies: - ansi-regex: 6.2.2 - style-to-object@1.0.14: dependencies: inline-style-parser: 0.2.7 - stylelint-config-recommended@18.0.0(stylelint@17.13.0(supports-color@10.2.2)(typescript@6.0.3)): + stylelint-config-recommended@18.0.0(stylelint@18.0.0-next.0): dependencies: - stylelint: 17.13.0(supports-color@10.2.2)(typescript@6.0.3) + stylelint: 18.0.0-next.0 - stylelint-config-standard@40.0.0(stylelint@17.13.0(supports-color@10.2.2)(typescript@6.0.3)): + stylelint-config-standard@40.0.0(stylelint@18.0.0-next.0): dependencies: - stylelint: 17.13.0(supports-color@10.2.2)(typescript@6.0.3) - stylelint-config-recommended: 18.0.0(stylelint@17.13.0(supports-color@10.2.2)(typescript@6.0.3)) + stylelint: 18.0.0-next.0 + stylelint-config-recommended: 18.0.0(stylelint@18.0.0-next.0) - stylelint@17.13.0(supports-color@10.2.2)(typescript@6.0.3): + stylelint@18.0.0-next.0: dependencies: - '@csstools/css-calc': 3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-syntax-patches-for-csstree': 1.1.7(css-tree@3.2.1) - '@csstools/css-tokenizer': 4.0.0 - '@csstools/media-query-list-parser': 5.0.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/selector-resolve-nested': 4.0.1(postcss-selector-parser@7.1.4) - '@csstools/selector-specificity': 6.0.0(postcss-selector-parser@7.1.4) - colord: 2.9.3 - cosmiconfig: 9.0.2(typescript@6.0.3) - css-functions-list: 3.3.3 + '@csstools/css-calc': 3.4.3(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2) + '@csstools/css-parser-algorithms': 4.0.2(@csstools/css-tokenizer@4.0.2) + '@csstools/css-syntax-patches-for-csstree': 1.1.15(css-tree@3.2.1) + '@csstools/css-tokenizer': 4.0.2 + '@csstools/media-query-list-parser': 5.0.2(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2) + '@csstools/selector-resolve-nested': 4.0.2(postcss-selector-parser@7.1.6) + '@csstools/selector-specificity': 6.0.1(postcss-selector-parser@7.1.6) + colord: 2.10.0 + cosmiconfig: 10.0.1 css-tree: 3.2.1 - debug: 4.4.3(supports-color@10.2.2) - fast-glob: 3.3.3 - fastest-levenshtein: 1.0.16 - file-entry-cache: 11.1.5 - global-modules: 2.0.0 - globby: 16.2.2 - globjoin: 0.1.4 - html-tags: 5.1.0 - ignore: 7.0.6 + ignore: 7.0.12 import-meta-resolve: 4.2.0 - mathml-tag-names: 4.0.0 - meow: 14.1.0 - micromatch: 4.0.8 - normalize-path: 3.0.0 - picocolors: 1.1.1 - postcss: 8.5.23 - postcss-safe-parser: 7.0.1(postcss@8.5.23) - postcss-selector-parser: 7.1.4 + picomatch: 4.0.7 + postcss: 8.5.30 + postcss-safe-parser: 7.1.0(postcss@8.5.30) + postcss-selector-parser: 7.1.6 postcss-value-parser: 4.2.0 - string-width: 8.2.2 - supports-hyperlinks: 4.5.0 - svg-tags: 1.0.0 - table: 6.9.0 - write-file-atomic: 7.0.1 - transitivePeerDependencies: - - supports-color - - typescript - - supports-color@10.2.2: {} - - supports-hyperlinks@4.5.0: - dependencies: - has-flag: 5.0.1 - supports-color: 10.2.2 + tinyglobby: 0.2.17 + write-file-atomic: 8.0.0 svelte-check@4.7.3(picomatch@4.0.5)(svelte@5.56.8)(typescript@6.0.3): dependencies: @@ -3824,18 +3212,8 @@ snapshots: transitivePeerDependencies: - '@typescript-eslint/types' - svg-tags@1.0.0: {} - tabbable@6.5.0: {} - table@6.9.0: - dependencies: - ajv: 8.20.0 - lodash.truncate: 4.4.2 - slice-ansi: 4.0.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - tinybench@2.9.0: {} tinyexec@1.2.4: {} @@ -3849,10 +3227,6 @@ snapshots: tinyrainbow@3.1.0: {} - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - totalist@3.0.1: {} trough@2.2.0: {} @@ -3865,8 +3239,6 @@ snapshots: undici-types@7.24.6: {} - unicorn-magic@0.4.0: {} - unified@11.0.5: dependencies: '@types/unist': 3.0.3 @@ -3942,7 +3314,7 @@ snapshots: dependencies: lightningcss: 1.32.0 picomatch: 4.0.5 - postcss: 8.5.23 + postcss: 8.5.30 rolldown: 1.0.3 tinyglobby: 0.2.17 optionalDependencies: @@ -3981,16 +3353,12 @@ snapshots: transitivePeerDependencies: - msw - which@1.3.1: - dependencies: - isexe: 2.0.0 - why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 stackback: 0.0.2 - write-file-atomic@7.0.1: + write-file-atomic@8.0.0: dependencies: signal-exit: 4.1.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index bf3a3943..fac36abc 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -10,6 +10,9 @@ minimumReleaseAgeExclude: - cookie@0.7.0 - fast-uri@3.1.5 - js-yaml@4.3.1 + # EXPERIMENT: testing stylelint's v18 prerelease (published 2026-10-22) - + # trusted maintainer, deliberately testing the fresh prerelease itself. + - stylelint@18.0.0-next.0 trustPolicy: no-downgrade overrides: diff --git a/src/lib/stylelint-browser/pinned-transitive-deps.ts b/src/lib/stylelint-browser/pinned-transitive-deps.ts index a3c7f60b..9b76b8ef 100644 --- a/src/lib/stylelint-browser/pinned-transitive-deps.ts +++ b/src/lib/stylelint-browser/pinned-transitive-deps.ts @@ -14,9 +14,11 @@ // build the `.stylelint.lexer` scaffold field. // - `@csstools/css-tokenizer`, used by stylelint/lib/assignDisabledRanges.mjs, // which lintPostcssResult.mjs calls unconditionally on every lint. -// - `fastest-levenshtein`, used by stylelint/lib/reportUnknownRuleNames.mjs, -// statically imported by lintPostcssResult.mjs (only executes on an -// unknown-rule-name error, but still needs to resolve at bundle time). +// +// `fastest-levenshtein` used to be pinned here too (for +// stylelint/lib/reportUnknownRuleNames.mjs), but stylelint 18.0.0-next.0 +// replaced it with an in-house lib/utils/levenshteinDistance.mjs - dropped +// here to match. Re-check this list whenever bumping the pinned version. // // Without them declared in package.json, pnpm won't install them at the top // level and the browser bundle fails to resolve (see the "MISSING dep" notes @@ -30,6 +32,5 @@ import { fork } from 'css-tree' import syntaxPatches from '@csstools/css-syntax-patches-for-csstree' with { type: 'json' } import { tokenize } from '@csstools/css-tokenizer' -import { distance } from 'fastest-levenshtein' -export const stylelint_transitive_deps = { fork, syntaxPatches, tokenize, distance } +export const stylelint_transitive_deps = { fork, syntaxPatches, tokenize } diff --git a/src/lib/stylelint-browser/shims/stylelint-timing.ts b/src/lib/stylelint-browser/shims/stylelint-timing.ts deleted file mode 100644 index d93654b1..00000000 --- a/src/lib/stylelint-browser/shims/stylelint-timing.ts +++ /dev/null @@ -1,15 +0,0 @@ -// Browser-only stand-in for stylelint's lib/timing.mjs. Vite redirects that -// relative import to this file for client bundles (see vite.config.js). -// -// The real module is only useful for `TIMING= stylelint ...` CLI runs - -// our `node:process` shim never sets that env var, so `timing.enabled` would -// always be `false` anyway. Pulling in the real module drags in the `table` -// package, which (via `supports-hyperlinks` -> `supports-color`) doesn't -// bundle for the browser. -export default { - display: () => {}, - enabled: false, - getListSize: () => 0, - tableConfig: {}, - time: (_key: string, fn: (...args: unknown[]) => unknown) => fn -} diff --git a/src/lib/stylelint-browser/stylelint-internals.d.ts b/src/lib/stylelint-browser/stylelint-internals.d.ts index f5402965..5c06b1b3 100644 --- a/src/lib/stylelint-browser/stylelint-internals.d.ts +++ b/src/lib/stylelint-browser/stylelint-internals.d.ts @@ -5,8 +5,9 @@ // "bundler" module resolution honours the exports map though, so without // these ambient declarations it can't see the deep paths exist. // -// Pinned to stylelint ~17.13.0 (see package.json) - re-check these shapes -// against node_modules/stylelint/lib/*.mjs whenever that version changes. +// Pinned to stylelint 18.0.0-next.0 (see package.json) - re-check these +// shapes against node_modules/stylelint/lib/*.mjs whenever that version +// changes. This is a prerelease; re-verify again once 18.0.0 is final. declare module 'stylelint/lib/lintPostcssResult.mjs' { import type { LinterOptions, PostcssResult, Config } from 'stylelint' diff --git a/vite.config.js b/vite.config.js index 1eb7165c..633643d2 100644 --- a/vite.config.js +++ b/vite.config.js @@ -40,11 +40,6 @@ const config_alias = [ replacement: stylelint_lib_dir + 'formatters/jsonFormatter.mjs' }, - // lintPostcssResult.mjs's own `./timing.mjs` import drags in the `table` - // package (for `TIMING= stylelint ...` CLI output we never trigger), - // which doesn't bundle for the browser. See shims/stylelint-timing.ts. - { find: './timing.mjs', replacement: stylelint_browser_dir + 'shims/stylelint-timing.ts' }, - // Node-free stand-ins for bare specifiers stylelint's internals (and our // plugin package) import. { find: 'node:os', replacement: stylelint_browser_dir + 'shims/node-os.ts' }, From 8841a0ea259f788608f82510130eeb796066dffe Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 24 Oct 2026 12:15:32 +0000 Subject: [PATCH 4/4] revert stylelint to 17.16.0; fix production 404 on lazy rule loading stylelint-config-standard@40.0.0 (peerDependencies: ^17.0.0) references declaration-block-single-line-max-declarations, which 18.0.0-next.0 removed outright - breaking the repo's own Lint CSS/JS CI check on ~130 call sites, unrelated to anything this PR's own code touches. Reverting to the last stable 17.16.0 un-breaks that (re-added fastest-levenshtein and shims/stylelint-timing.ts, both dropped when bumping to 18 since that prerelease's own internals briefly didn't need them). Separately, and more seriously: production builds of /lint-css 404 on every lint that hits a not-yet-loaded built-in rule (confirmed via a real build+preview+browser run, not just `vite dev`). Root cause has nothing to do with the stylelint version - it reproduces identically on 17.13.0, 17.16.0 and 18.0.0-next.0 alike. stylelint resolves built-in rules lazily via `import(\`./${ruleName}/index.mjs\`)`, a dynamic import whose path is only known at runtime; Rollup can't statically enumerate that, and because the real file lives inside node_modules, Vite's dynamic-import-vars handling skips it rather than glob-expanding it. So no per-rule chunk ever gets emitted, and the browser 404s fetching one. Fixed by aliasing stylelint's lib/rules/index.mjs to a new shims/stylelint-rules.ts that uses `import.meta.glob` over the real rule files instead - a literal pattern Vite/Rollup *can* statically expand into one real, analyzable dynamic import per rule, restoring correct lazy per-rule chunking (confirmed: real per-rule chunks now show up in the build, and a real-browser run against vite preview resolves warnings, clean-CSS, and parse-error cases with zero console/network errors). Verified: full check/lint:ts/format:check/stylelint/vitest/build pass, and a direct chromium run against the production preview build confirms all three Linter.svelte code paths work with no console or network errors. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_015YSKEQXzpmfmag1HcDNUaQ --- package.json | 3 +- pnpm-lock.yaml | 719 +++++++++++++++++- pnpm-workspace.yaml | 3 - .../pinned-transitive-deps.ts | 11 +- .../shims/stylelint-rules.ts | 39 + .../shims/stylelint-timing.ts | 15 + .../stylelint-internals.d.ts | 5 +- vite.config.js | 12 + 8 files changed, 766 insertions(+), 41 deletions(-) create mode 100644 src/lib/stylelint-browser/shims/stylelint-rules.ts create mode 100644 src/lib/stylelint-browser/shims/stylelint-timing.ts diff --git a/package.json b/package.json index 42997b69..fc9f9288 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "color-sorter": "catalog:", "css-tree": "^3.2.1", "diff": "^9.0.0", + "fastest-levenshtein": "^1.0.16", "github-slugger": "^2.0.0", "lightningcss": "1.32.0", "linkedom": "^0.18.13", @@ -54,7 +55,7 @@ "rehype-autolink-headings": "^7.1.0", "rehype-slug": "^6.0.0", "runed": "^0.37.1", - "stylelint": "18.0.0-next.0", + "stylelint": "~17.16.0", "svelte": "^5.56.8", "typescript": "^6.0.3", "vite": "catalog:", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index edf7075e..4d1eeac6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -70,7 +70,7 @@ importers: version: 3.2.0 '@projectwallace/stylelint-plugin': specifier: 'catalog:' - version: 0.7.0(stylelint@18.0.0-next.0) + version: 0.7.0(stylelint@17.16.0(supports-color@10.2.2)(typescript@6.0.3)) color-sorter: specifier: ^8.0.2 version: 8.0.2 @@ -80,6 +80,9 @@ importers: diff: specifier: ^9.0.0 version: 9.0.0 + fastest-levenshtein: + specifier: ^1.0.16 + version: 1.0.16 github-slugger: specifier: ^2.0.0 version: 2.0.0 @@ -114,8 +117,8 @@ importers: specifier: ^0.37.1 version: 0.37.1(@sveltejs/kit@3.0.0-next.32(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.8)(vite@8.2.1(@types/node@25.9.5)(esbuild@0.28.1)))(svelte@5.56.8)(typescript@6.0.3)(vite@8.2.1(@types/node@25.9.5)(esbuild@0.28.1)))(svelte@5.56.8) stylelint: - specifier: 18.0.0-next.0 - version: 18.0.0-next.0 + specifier: ~17.16.0 + version: 17.16.0(supports-color@10.2.2)(typescript@6.0.3) svelte: specifier: ^5.56.8 version: 5.56.8 @@ -164,7 +167,7 @@ importers: version: 1.8.1 stylelint-config-standard: specifier: ~40.0.0 - version: 40.0.0(stylelint@18.0.0-next.0) + version: 40.0.0(stylelint@17.16.0(supports-color@10.2.2)(typescript@6.0.3)) svelte-check: specifier: ^4.7.5 version: 4.7.6(picomatch@4.0.5)(svelte@5.56.8)(typescript@6.0.3) @@ -174,6 +177,20 @@ importers: packages: + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@cacheable/memory@2.2.0': + resolution: {integrity: sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==} + + '@cacheable/utils@2.5.0': + resolution: {integrity: sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==} + '@colordx/core@5.5.0': resolution: {integrity: sha512-3PxTH8itZzltK0U9jTwVVnjLXvnDYuq3m+QXsHkENxWiPRh4WaoLcs1SQjqgZ55kS+QyirpH5BVwzP2gMVG6EQ==} @@ -585,6 +602,15 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@keyv/bigmap@1.3.1': + resolution: {integrity: sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==} + engines: {node: '>= 18'} + peerDependencies: + keyv: ^5.6.0 + + '@keyv/serialize@1.1.1': + resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} + '@melt-ui/pp@0.3.2': resolution: {integrity: sha512-xKkPvaIAFinklLXcQOpwZ8YSpqAFxykjWf8Y/fSJQwsixV/0rcFs07hJ49hJjPy5vItvw5Qa0uOjzFUbXzBypQ==} peerDependencies: @@ -600,6 +626,18 @@ packages: resolution: {integrity: sha512-8/g0Pt6y6wXj5Ia5eeYLiXhRfWeqZXGXpGFeCiiQdUOem+FPtXdA4+YdGxqzWc7D0AvptKSO01KGeeVWHSu8Kg==} engines: {node: ^18.14.0 || >=20} + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + '@oddbird/popover-polyfill@0.6.1': resolution: {integrity: sha512-Papau51NPG+NajXvoEHCNT1CBJv4WIyvIGfH5gpJPLL8MZJt/4giC0jJ/mNZRtJmdzRuXWpUFB6QxkJa1RvMAQ==} @@ -1035,6 +1073,10 @@ packages: rollup: optional: true + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} @@ -1149,6 +1191,21 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.4.0: + resolution: {integrity: sha512-KzTVk2tCWAHtYrvvvaP8bJKJq2pVinhLcGEQdtLIYPbmNGNyYe8QwNaTUYQp2J7/vIsUKt5QCqAfUkYyG9DkOw==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -1160,6 +1217,10 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} @@ -1171,6 +1232,17 @@ packages: resolution: {integrity: sha512-DkVaaQHymRhpYEYo9x1oo7Q7B0Y6KJUsjm3c9eTyFDby4MHLBTwZ6ZDWBel5zrYxj1WsZgC5oLpiz+93MluXeA==} engines: {node: '>=20.19.0'} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + cacheable@2.5.0: + resolution: {integrity: sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g==} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + chai@6.2.2: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} @@ -1183,6 +1255,13 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} + 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==} + color-sorter@8.0.2: resolution: {integrity: sha512-6PVyJu6ufP/Buv4I5NhSjKzH0mWe0wJjPOQWIM98lC+XPtNK9NWWoP0DqQxVOTjLI2gK5lceYDhjnugo3byUZA==} engines: {node: '>=18.0.0'} @@ -1197,9 +1276,18 @@ packages: resolution: {integrity: sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w==} engines: {node: '>=22'} - cosmiconfig@10.0.1: - resolution: {integrity: sha512-/zvGoYn0y27QTBmK+0B+oPdEPC4fKGUmJsMTQbDjqph00TrkqfVFW/M+C6ya54sYCgHC6QCwK/mI6djt8cEGHQ==} - engines: {node: ^22.18 || >= 24} + cosmiconfig@9.0.2: + resolution: {integrity: sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + css-functions-list@3.3.3: + resolution: {integrity: sha512-8HFEBPKhOpJPEPu70wJJetjKta86Gw9+CCyCnB3sui2qQfOvRyqBy4IKLKKAwdMpWb2lHXWk9Wb4Z6AmaUT1Pg==} + engines: {node: '>=12'} css-select@7.0.0: resolution: {integrity: sha512-snmjEVXy+1LnwXdxhYvTMj1d9tOh4HxkA1YmoayVBeeyR2C14Pum7fcxJIm4SswYspVy866eYNwlH6xC3/VH5g==} @@ -1221,6 +1309,15 @@ packages: cssom@0.5.0: resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} @@ -1275,6 +1372,9 @@ packages: resolution: {integrity: sha512-qI4JLRKnSzqFqr7hAlS5xQDusBCjKSEG4t4+7aNrIQMHBcsC2TGEhuyABJdYkgSewL57PNLYEiibY2iPKhKpaA==} engines: {node: '>=20.19.0'} + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -1291,6 +1391,9 @@ packages: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + es-module-lexer@2.3.1: resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==} @@ -1323,6 +1426,23 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-uri@4.2.2: + resolution: {integrity: sha512-EwVpUMzLVNOmcWW0zi5G3JJwkopB6XXjnVvNBGfqrMMsVew2hkQWl5e/pe/CfYUeS6jt4cIO2MnamEW7v/7wPw==} + + fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + + fastq@1.20.3: + resolution: {integrity: sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -1332,6 +1452,19 @@ packages: picomatch: optional: true + file-entry-cache@11.1.5: + resolution: {integrity: sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + flat-cache@6.1.23: + resolution: {integrity: sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==} + + flatted@3.4.4: + resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==} + focus-trap@7.8.0: resolution: {integrity: sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==} @@ -1345,9 +1478,40 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] + get-east-asian-width@1.7.0: + resolution: {integrity: sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q==} + engines: {node: '>=18'} + github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + + global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + + globby@16.2.4: + resolution: {integrity: sha512-c8B/VNLmxRcmqqenRA9t+9IyOjf9+V6lTxPaUJLqOCONdQkWZ0ETYgX0qbtJqPsgCNusT9MZ5Jeidw8Eb9tn2g==} + engines: {node: '>=20'} + + globjoin@0.1.4: + resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==} + + has-flag@5.0.1: + resolution: {integrity: sha512-CsNUt5x9LUdx6hnk/E2SZLsDyvfqANZSUq4+D3D8RzDJ2M+HDTIkF60ibS1vHaK55vzgiZw1bEPFG9yH7l33wA==} + engines: {node: '>=12'} + + hashery@1.5.1: + resolution: {integrity: sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==} + engines: {node: '>=20'} + hast-util-heading-rank@3.0.0: resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==} @@ -1357,9 +1521,19 @@ packages: hast-util-to-string@3.0.1: resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} + hookified@1.15.1: + resolution: {integrity: sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==} + + hookified@2.2.0: + resolution: {integrity: sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==} + html-escaper@3.0.3: resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} + html-tags@5.1.0: + resolution: {integrity: sha512-n6l5uca7/y5joxZ3LUePhzmBFUJ+U2YWzhMa8XUTecSeSlQiZdF5XAd/Q3/WUl0VsXgUwWi8I7CNIwdI5WN1SQ==} + engines: {node: '>=20.10'} + htmlparser2@10.1.0: resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} @@ -1374,12 +1548,42 @@ packages: resolution: {integrity: sha512-xQjs+2vrxLnAjCq+omuNkd5UQTld9/bP8+YT0LyYTlKfuSQtgUBvqhUwGugzSAh6sCdN+LnROMuLswn5hZ9Fhg==} engines: {node: '>=20.0.0'} + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + import-meta-resolve@4.2.0: resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + inline-style-parser@0.2.7: resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@4.0.0: + resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} + engines: {node: '>=12'} + is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} @@ -1387,6 +1591,12 @@ packages: is-reference@3.0.3: resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@9.0.1: resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} @@ -1394,6 +1604,19 @@ packages: resolution: {integrity: sha512-m+aqu+LwO1O6sIopafj8HUVl5aawITwZQe/yHpMCKjaWBaA/d07B/QdMb3529REftiU+RMMHL3Vlsw3hON7vWg==} hasBin: true + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + keyv@5.6.0: + resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + lightningcss-android-arm64@1.32.0: resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} engines: {node: '>= 12.0.0'} @@ -1468,6 +1691,9 @@ packages: resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} engines: {node: '>= 12.0.0'} + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + linkedom@0.18.13: resolution: {integrity: sha512-ES/o9qotMpzpN2MHs+Iq/JcVoOj8Fa5wiQYrTdFpvAnwXL0g66XHHUc9WUMk6nAlBtGsFQ24ne+SYnvnaQ2FSw==} engines: {node: '>=16'} @@ -1480,6 +1706,9 @@ packages: locate-character@3.0.0: resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + lz-string@1.5.0: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true @@ -1493,6 +1722,9 @@ packages: magic-string@1.4.3: resolution: {integrity: sha512-z12OxmaPGE0F4xlpGdjuAUckipLpQlTAuAmyGhNoD7ODpYUzvDfvtxUbjM/jwznyP178oju/KDdyi220wNJ0RQ==} + mathml-tag-names@4.0.0: + resolution: {integrity: sha512-aa6AU2Pcx0VP/XWnh8IGL0SYSgQHDT6Ucror2j2mXeFAlN3ahaNs8EZtG1YiticMkSLj3Gt6VPFfZogt7G5iFQ==} + mdn-data@2.27.1: resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} @@ -1501,6 +1733,18 @@ packages: peerDependencies: svelte: ^3.56.0 || ^4.0.0 || ^5.0.0-next.120 + meow@14.1.0: + resolution: {integrity: sha512-EDYo6VlmtnumlcBCbh1gLJ//9jvM/ndXHfVXIFrZVr6fGcwTUyCTFNTLCKuY3ffbK8L/+3Mzqnd58RojiZqHVw==} + engines: {node: '>=20'} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -1509,6 +1753,9 @@ packages: resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} engines: {node: '>=10'} + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + nanoid@3.3.20: resolution: {integrity: sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -1519,6 +1766,10 @@ packages: engines: {node: ^18 || >=20} hasBin: true + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + nth-check@3.0.1: resolution: {integrity: sha512-GX0gsdbGVCgnRgbeGaubfjpBXyYRWOOCVeYh08bSQvDZqxz5ndXs1OTfAt/h36G1xvI94YIspsI0sVFqAV9+RQ==} engines: {node: '>=20.19.0'} @@ -1562,12 +1813,24 @@ packages: peerDependencies: svelte: ^5.29.0 + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + picomatch@4.0.5: resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} engines: {node: '>=12'} @@ -1623,6 +1886,13 @@ packages: resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} engines: {node: '>=6'} + qified@0.10.1: + resolution: {integrity: sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==} + engines: {node: '>=20'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + readdirp@5.0.0: resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} engines: {node: '>= 20.19.0'} @@ -1633,11 +1903,26 @@ packages: rehype-slug@6.0.0: resolution: {integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==} + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rolldown@1.2.3: resolution: {integrity: sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + runed@0.37.1: resolution: {integrity: sha512-MeFY73xBW8IueWBm012nNFIGy19WUGPLtknavyUPMpnyt350M47PhGSGrGoSLbidwn+Zlt/O0cp8/OZE3LASWA==} peerDependencies: @@ -1679,6 +1964,14 @@ packages: resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} engines: {node: '>=18'} + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + + slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -1693,6 +1986,22 @@ packages: std-env@4.2.0: resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==} + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@8.3.0: + resolution: {integrity: sha512-ZbmZM0JCihQN91dWnxoipT2KOEyHqEyfRXUyjuRhW8b/xnqPDoq4gWEVApTVa9db2wN8mmoikgFBbjh71+cGeQ==} + engines: {node: '>=20'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} + style-to-object@1.0.14: resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} @@ -1708,11 +2017,19 @@ packages: peerDependencies: stylelint: ^17.0.0 - stylelint@18.0.0-next.0: - resolution: {integrity: sha512-c6ifZUlUZKuCZq04rYWEJgo2BY3Ag1jgB2xU4VrRY2fst+M6HntdDm92RUB9XNlwkW/7NQ7TZpPhX41HR8QCqQ==} - engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} + stylelint@17.16.0: + resolution: {integrity: sha512-ejlWnbJ13x1GU32+zZXa6sYQJsKKkwSdv2B4rAdO3OWdEmvhSJKcXi5pOphQYSzyaj1kXpuGJr7pcMBNfDIuPw==} + engines: {node: '>=20.19.0'} hasBin: true + supports-color@10.2.2: + resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} + engines: {node: '>=18'} + + supports-hyperlinks@4.6.0: + resolution: {integrity: sha512-FL/q/YePS4tFFTNiBOR+zPk2ZrKheqNtmTJ/9OUZ4e1wKHJofDbGQSmSsxS0XNnabSkqexryCaXGvEKz1vf9UQ==} + engines: {node: '>=20'} + svelte-check@4.7.6: resolution: {integrity: sha512-t2scM//ZuVbSY/T2w6FSBw1v9s2NEmh/g+sy1lqtosW5ylBV5AF4wFb1Ts9Kf3MbfPDUDJDZ9L436YT0SPTdvw==} engines: {node: '>= 18.0.0'} @@ -1736,9 +2053,16 @@ packages: resolution: {integrity: sha512-PY8LOw7xP6c8IOiVqdo0sbbZVYhXRSfklOQLAUyGBKqjTX0wx/z4l/9J+PmBpmlLnxzEb1NqltxQ5/wZme/Cmg==} engines: {node: '>=18'} + svg-tags@1.0.0: + resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} + tabbable@6.5.0: resolution: {integrity: sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==} + table@6.9.0: + resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} + engines: {node: '>=10.0.0'} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -1758,6 +2082,10 @@ packages: resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + totalist@3.0.1: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} @@ -1779,6 +2107,10 @@ packages: undici-types@7.24.6: resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + unicorn-magic@0.4.1: + resolution: {integrity: sha512-lzlXPoVB0Uy/FvTaUgX39RbixYiSKoc3JSoSf01+0c2B6FR3qdYIPN7Qjo/AV7n6sqLCk0509cT3LRj1oSZ1+A==} + engines: {node: '>=20'} + unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} @@ -1917,20 +2249,44 @@ packages: web-features@3.34.3: resolution: {integrity: sha512-eXdaGO8JSiLLC5/tLOeDiH0EVIbuD8NExMDAziU0frr9JRdiEKqyOsTeEZDtmCXbazEI3mB+plYO4oMYOj1/Dg==} + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + why-is-node-running@2.3.0: resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} hasBin: true - write-file-atomic@8.0.0: - resolution: {integrity: sha512-dYwyZredl67GyLLIHJnRM3h2PcOmN5SkcgC7eM5DPDEOEl6dLFqVrMg3F1Ea32usj4VSVZtd2H4MtKTNOf6nPg==} - engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} + write-file-atomic@7.0.1: + resolution: {integrity: sha512-OTIk8iR8/aCRWBqvxrzxR0hgxWpnYBblY1S5hDWBQfk/VFmJwzmJgQFN3WsoUKHISv2eAwe+PpbUzyL1CKTLXg==} + engines: {node: ^20.17.0 || >=22.9.0} zimmerframe@1.1.4: resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==} snapshots: + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/helper-validator-identifier@7.29.7': {} + + '@cacheable/memory@2.2.0': + dependencies: + '@cacheable/utils': 2.5.0 + '@keyv/bigmap': 1.3.1(keyv@5.6.0) + hookified: 1.15.1 + keyv: 5.6.0 + + '@cacheable/utils@2.5.0': + dependencies: + hashery: 1.5.1 + keyv: 5.6.0 + '@colordx/core@5.5.0': {} '@csstools/css-calc@3.4.3(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2)': @@ -2192,6 +2548,14 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@keyv/bigmap@1.3.1(keyv@5.6.0)': + dependencies: + hashery: 1.5.1 + hookified: 1.15.1 + keyv: 5.6.0 + + '@keyv/serialize@1.1.1': {} + '@melt-ui/pp@0.3.2(@melt-ui/svelte@0.86.6(svelte@5.56.8))(svelte@5.56.8)': dependencies: '@melt-ui/svelte': 0.86.6(svelte@5.56.8) @@ -2211,6 +2575,18 @@ snapshots: '@netlify/types@2.8.0': {} + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.3 + '@oddbird/popover-polyfill@0.6.1': {} '@oxc-project/types@0.143.0': {} @@ -2390,11 +2766,11 @@ snapshots: dependencies: oxlint: 1.75.0(oxlint-tsgolint@0.23.0) - '@projectwallace/stylelint-plugin@0.7.0(stylelint@18.0.0-next.0)': + '@projectwallace/stylelint-plugin@0.7.0(stylelint@17.16.0(supports-color@10.2.2)(typescript@6.0.3))': dependencies: '@projectwallace/css-analyzer': 9.9.3 '@projectwallace/css-parser': 0.18.6 - stylelint: 18.0.0-next.0 + stylelint: 17.16.0(supports-color@10.2.2)(typescript@6.0.3) '@rolldown/binding-android-arm64@1.2.3': optional: true @@ -2444,7 +2820,9 @@ snapshots: dependencies: '@types/estree': 1.0.9 estree-walker: 2.0.2 - picomatch: 4.0.5 + picomatch: 4.0.7 + + '@sindresorhus/merge-streams@4.0.0': {} '@standard-schema/spec@1.1.0': {} @@ -2575,18 +2953,49 @@ snapshots: acorn@8.17.0: {} + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 4.2.2 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-regex@5.0.1: {} + + ansi-regex@6.4.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + argparse@2.0.1: {} aria-query@5.3.1: {} assertion-error@2.0.1: {} + astral-regex@2.0.0: {} + axobject-query@4.1.0: {} bail@2.0.2: {} boolbase@2.0.0: {} + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + cacheable@2.5.0: + dependencies: + '@cacheable/memory': 2.2.0 + '@cacheable/utils': 2.5.0 + hookified: 1.15.1 + keyv: 5.6.0 + qified: 0.10.1 + + callsites@3.1.0: {} + chai@6.2.2: {} chokidar@5.0.0: @@ -2595,6 +3004,12 @@ snapshots: clsx@2.1.1: {} + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + color-sorter@8.0.2: dependencies: '@colordx/core': 5.5.0 @@ -2605,10 +3020,16 @@ snapshots: cookie@2.0.1: {} - cosmiconfig@10.0.1: + cosmiconfig@9.0.2(typescript@6.0.3): dependencies: env-paths: 2.2.1 + import-fresh: 3.3.1 js-yaml: 5.4.2 + parse-json: 5.2.0 + optionalDependencies: + typescript: 6.0.3 + + css-functions-list@3.3.3: {} css-select@7.0.0: dependencies: @@ -2629,6 +3050,12 @@ snapshots: cssom@0.5.0: {} + debug@4.4.3(supports-color@10.2.2): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 10.2.2 + deepmerge@4.3.1: {} dequal@2.0.3: {} @@ -2681,6 +3108,8 @@ snapshots: domelementtype: 3.0.0 domhandler: 6.0.1 + emoji-regex@8.0.0: {} + entities@4.5.0: {} entities@7.0.1: {} @@ -2689,6 +3118,10 @@ snapshots: env-paths@2.2.1: {} + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + es-module-lexer@2.3.1: {} esbuild@0.28.1: @@ -2737,10 +3170,44 @@ snapshots: extend@3.0.2: {} + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-uri@4.2.2: {} + + fastest-levenshtein@1.0.16: {} + + fastq@1.20.3: + dependencies: + reusify: 1.1.0 + fdir@6.5.0(picomatch@4.0.5): optionalDependencies: picomatch: 4.0.5 + file-entry-cache@11.1.5: + dependencies: + flat-cache: 6.1.23 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + flat-cache@6.1.23: + dependencies: + cacheable: 2.5.0 + flatted: 3.4.4 + hookified: 1.15.1 + + flatted@3.4.4: {} + focus-trap@7.8.0: dependencies: tabbable: 6.5.0 @@ -2751,8 +3218,42 @@ snapshots: fsevents@2.3.3: optional: true + get-east-asian-width@1.7.0: {} + github-slugger@2.0.0: {} + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + global-modules@2.0.0: + dependencies: + global-prefix: 3.0.0 + + global-prefix@3.0.0: + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 + + globby@16.2.4: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + fast-glob: 3.3.3 + ignore: 7.0.12 + is-path-inside: 4.0.0 + micromatch: 4.0.8 + slash: 5.1.0 + unicorn-magic: 0.4.1 + + globjoin@0.1.4: {} + + has-flag@5.0.1: {} + + hashery@1.5.1: + dependencies: + hookified: 1.15.1 + hast-util-heading-rank@3.0.0: dependencies: '@types/hast': 3.0.5 @@ -2765,8 +3266,14 @@ snapshots: dependencies: '@types/hast': 3.0.5 + hookified@1.15.1: {} + + hookified@2.2.0: {} + html-escaper@3.0.3: {} + html-tags@5.1.0: {} + htmlparser2@10.1.0: dependencies: domelementtype: 2.3.0 @@ -2785,22 +3292,57 @@ snapshots: imagetools-core@9.1.0: {} + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + import-meta-resolve@4.2.0: {} + ini@1.3.8: {} + inline-style-parser@0.2.7: {} + is-arrayish@0.2.1: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-path-inside@4.0.0: {} + is-plain-obj@4.1.0: {} is-reference@3.0.3: dependencies: '@types/estree': 1.0.9 + isexe@2.0.0: {} + + js-tokens@4.0.0: {} + js-tokens@9.0.1: {} js-yaml@5.4.2: dependencies: argparse: 2.0.1 + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@1.0.0: {} + + keyv@5.6.0: + dependencies: + '@keyv/serialize': 1.1.1 + + kind-of@6.0.3: {} + lightningcss-android-arm64@1.32.0: optional: true @@ -2850,6 +3392,8 @@ snapshots: lightningcss-win32-arm64-msvc: 1.32.0 lightningcss-win32-x64-msvc: 1.32.0 + lines-and-columns@1.2.4: {} + linkedom@0.18.13: dependencies: css-select: 7.0.0 @@ -2860,6 +3404,8 @@ snapshots: locate-character@3.0.0: {} + lodash.truncate@4.4.2: {} + lz-string@1.5.0: {} magic-string@0.30.21: @@ -2874,6 +3420,8 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.6.0 + mathml-tag-names@4.0.0: {} + mdn-data@2.27.1: {} mdsvex@0.12.8(svelte@5.56.8): @@ -2886,14 +3434,27 @@ snapshots: unist-util-visit: 2.0.3 vfile-message: 2.0.4 + meow@14.1.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.2 + mri@1.2.0: {} mrmime@2.0.1: {} + ms@2.1.3: {} + nanoid@3.3.20: {} nanoid@5.1.16: {} + normalize-path@3.0.0: {} + nth-check@3.0.1: dependencies: boolbase: 2.0.0 @@ -2966,10 +3527,23 @@ snapshots: - '@sveltejs/kit' - zod + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.29.7 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + pathe@2.0.3: {} picocolors@1.1.1: {} + picomatch@2.3.2: {} + picomatch@4.0.5: {} picomatch@4.0.7: {} @@ -3016,6 +3590,12 @@ snapshots: prismjs@1.30.0: {} + qified@0.10.1: + dependencies: + hookified: 2.2.0 + + queue-microtask@1.2.3: {} + readdirp@5.0.0: {} rehype-autolink-headings@7.1.0: @@ -3035,6 +3615,12 @@ snapshots: hast-util-to-string: 3.0.1 unist-util-visit: 5.1.0 + require-from-string@2.0.2: {} + + resolve-from@4.0.0: {} + + reusify@1.1.0: {} + rolldown@1.2.3: dependencies: '@oxc-project/types': 0.143.0 @@ -3055,6 +3641,10 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.2.3 '@rolldown/binding-win32-x64-msvc': 1.2.3 + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + runed@0.37.1(@sveltejs/kit@3.0.0-next.32(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.8)(vite@8.2.1(@types/node@25.9.5)(esbuild@0.28.1)))(svelte@5.56.8)(typescript@6.0.3)(vite@8.2.1(@types/node@25.9.5)(esbuild@0.28.1)))(svelte@5.56.8): dependencies: dequal: 2.0.3 @@ -3113,6 +3703,14 @@ snapshots: mrmime: 2.0.1 totalist: 3.0.1 + slash@5.1.0: {} + + slice-ansi@4.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + source-map-js@1.2.1: {} source-map-js@1.2.2: {} @@ -3121,20 +3719,39 @@ snapshots: std-env@4.2.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@8.3.0: + dependencies: + get-east-asian-width: 1.7.0 + strip-ansi: 7.2.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.4.0 + style-to-object@1.0.14: dependencies: inline-style-parser: 0.2.7 - stylelint-config-recommended@18.0.0(stylelint@18.0.0-next.0): + stylelint-config-recommended@18.0.0(stylelint@17.16.0(supports-color@10.2.2)(typescript@6.0.3)): dependencies: - stylelint: 18.0.0-next.0 + stylelint: 17.16.0(supports-color@10.2.2)(typescript@6.0.3) - stylelint-config-standard@40.0.0(stylelint@18.0.0-next.0): + stylelint-config-standard@40.0.0(stylelint@17.16.0(supports-color@10.2.2)(typescript@6.0.3)): dependencies: - stylelint: 18.0.0-next.0 - stylelint-config-recommended: 18.0.0(stylelint@18.0.0-next.0) + stylelint: 17.16.0(supports-color@10.2.2)(typescript@6.0.3) + stylelint-config-recommended: 18.0.0(stylelint@17.16.0(supports-color@10.2.2)(typescript@6.0.3)) - stylelint@18.0.0-next.0: + stylelint@17.16.0(supports-color@10.2.2)(typescript@6.0.3): dependencies: '@csstools/css-calc': 3.4.3(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2) '@csstools/css-parser-algorithms': 4.0.2(@csstools/css-tokenizer@4.0.2) @@ -3144,17 +3761,43 @@ snapshots: '@csstools/selector-resolve-nested': 4.0.2(postcss-selector-parser@7.1.6) '@csstools/selector-specificity': 6.0.1(postcss-selector-parser@7.1.6) colord: 2.10.0 - cosmiconfig: 10.0.1 + cosmiconfig: 9.0.2(typescript@6.0.3) + css-functions-list: 3.3.3 css-tree: 3.2.1 + debug: 4.4.3(supports-color@10.2.2) + fast-glob: 3.3.3 + fastest-levenshtein: 1.0.16 + file-entry-cache: 11.1.5 + global-modules: 2.0.0 + globby: 16.2.4 + globjoin: 0.1.4 + html-tags: 5.1.0 ignore: 7.0.12 import-meta-resolve: 4.2.0 - picomatch: 4.0.7 + mathml-tag-names: 4.0.0 + meow: 14.1.0 + micromatch: 4.0.8 + normalize-path: 3.0.0 + picocolors: 1.1.1 postcss: 8.5.30 postcss-safe-parser: 7.1.0(postcss@8.5.30) postcss-selector-parser: 7.1.6 postcss-value-parser: 4.2.0 - tinyglobby: 0.2.17 - write-file-atomic: 8.0.0 + string-width: 8.3.0 + supports-hyperlinks: 4.6.0 + svg-tags: 1.0.0 + table: 6.9.0 + write-file-atomic: 7.0.1 + transitivePeerDependencies: + - supports-color + - typescript + + supports-color@10.2.2: {} + + supports-hyperlinks@4.6.0: + dependencies: + has-flag: 5.0.1 + supports-color: 10.2.2 svelte-check@4.7.6(picomatch@4.0.5)(svelte@5.56.8)(typescript@6.0.3): dependencies: @@ -3204,8 +3847,18 @@ snapshots: transitivePeerDependencies: - '@typescript-eslint/types' + svg-tags@1.0.0: {} + tabbable@6.5.0: {} + table@6.9.0: + dependencies: + ajv: 8.20.0 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + tinybench@2.9.0: {} tinyexec@1.2.4: {} @@ -3219,6 +3872,10 @@ snapshots: tinyrainbow@3.1.0: {} + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + totalist@3.0.1: {} trough@2.2.0: {} @@ -3231,6 +3888,8 @@ snapshots: undici-types@7.24.6: {} + unicorn-magic@0.4.1: {} + unified@11.0.5: dependencies: '@types/unist': 3.0.3 @@ -3348,12 +4007,16 @@ snapshots: web-features@3.34.3: {} + which@1.3.1: + dependencies: + isexe: 2.0.0 + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 stackback: 0.0.2 - write-file-atomic@8.0.0: + write-file-atomic@7.0.1: dependencies: signal-exit: 4.1.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 1146e43a..b41eb64f 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -7,9 +7,6 @@ minimumReleaseAge: 10080 minimumReleaseAgeExclude: - '@projectwallace/*' - color-sorter - # EXPERIMENT: testing stylelint's v18 prerelease (published 2026-10-22) - - # trusted maintainer, deliberately testing the fresh prerelease itself. - - stylelint@18.0.0-next.0 trustPolicy: no-downgrade catalog: diff --git a/src/lib/stylelint-browser/pinned-transitive-deps.ts b/src/lib/stylelint-browser/pinned-transitive-deps.ts index 9b76b8ef..a3c7f60b 100644 --- a/src/lib/stylelint-browser/pinned-transitive-deps.ts +++ b/src/lib/stylelint-browser/pinned-transitive-deps.ts @@ -14,11 +14,9 @@ // build the `.stylelint.lexer` scaffold field. // - `@csstools/css-tokenizer`, used by stylelint/lib/assignDisabledRanges.mjs, // which lintPostcssResult.mjs calls unconditionally on every lint. -// -// `fastest-levenshtein` used to be pinned here too (for -// stylelint/lib/reportUnknownRuleNames.mjs), but stylelint 18.0.0-next.0 -// replaced it with an in-house lib/utils/levenshteinDistance.mjs - dropped -// here to match. Re-check this list whenever bumping the pinned version. +// - `fastest-levenshtein`, used by stylelint/lib/reportUnknownRuleNames.mjs, +// statically imported by lintPostcssResult.mjs (only executes on an +// unknown-rule-name error, but still needs to resolve at bundle time). // // Without them declared in package.json, pnpm won't install them at the top // level and the browser bundle fails to resolve (see the "MISSING dep" notes @@ -32,5 +30,6 @@ import { fork } from 'css-tree' import syntaxPatches from '@csstools/css-syntax-patches-for-csstree' with { type: 'json' } import { tokenize } from '@csstools/css-tokenizer' +import { distance } from 'fastest-levenshtein' -export const stylelint_transitive_deps = { fork, syntaxPatches, tokenize } +export const stylelint_transitive_deps = { fork, syntaxPatches, tokenize, distance } diff --git a/src/lib/stylelint-browser/shims/stylelint-rules.ts b/src/lib/stylelint-browser/shims/stylelint-rules.ts new file mode 100644 index 00000000..47da96fd --- /dev/null +++ b/src/lib/stylelint-browser/shims/stylelint-rules.ts @@ -0,0 +1,39 @@ +// Browser-only stand-in for stylelint's lib/rules/index.mjs (aliased in +// place of it in vite.config.js). +// +// The real module resolves each built-in rule via a *dynamic* import whose +// path is only known at runtime: `import(\`./${ruleName}/index.mjs\`)`. +// Rollup can't statically enumerate that - the variable makes every +// possible target unknowable at build time - and because the real file +// lives inside node_modules, Vite's "dynamic import with a non-literal +// path" handling (which can glob-expand some such imports) skips it. Net +// result in a production build: no per-rule chunk ever gets emitted, and +// every lint request 404s trying to fetch one at runtime. This reproduces +// identically on stylelint 17.13.0, 17.16.0 and 18.0.0-next.0 - it's not +// tied to any one stylelint version, so bumping/pinning a version alone +// can't fix it. +// +// `import.meta.glob` is Vite's own answer to exactly this: given a literal +// glob pattern (known at build time), it generates one real, statically +// analyzable dynamic import per matched file, so Rollup emits (and +// correctly rewrites every request to) a real chunk for every rule - while +// still loading each one lazily, same as the code this replaces. +import type { Rule } from 'stylelint' + +const rule_modules = import.meta.glob('../../../../node_modules/stylelint/lib/rules/*/index.mjs') as Record< + string, + () => Promise<{ default: Rule }> +> + +const rules: Record> = {} + +for (const [path, load] of Object.entries(rule_modules)) { + const match = /\/rules\/([^/]+)\/index\.mjs$/.exec(path) + if (!match) { + continue + } + // oxlint-disable-next-line prefer-top-level-await -- must stay deferred: awaiting here would load every rule eagerly, defeating the point of this file + rules[match[1]] = load().then((module) => module.default) +} + +export default rules diff --git a/src/lib/stylelint-browser/shims/stylelint-timing.ts b/src/lib/stylelint-browser/shims/stylelint-timing.ts new file mode 100644 index 00000000..d93654b1 --- /dev/null +++ b/src/lib/stylelint-browser/shims/stylelint-timing.ts @@ -0,0 +1,15 @@ +// Browser-only stand-in for stylelint's lib/timing.mjs. Vite redirects that +// relative import to this file for client bundles (see vite.config.js). +// +// The real module is only useful for `TIMING= stylelint ...` CLI runs - +// our `node:process` shim never sets that env var, so `timing.enabled` would +// always be `false` anyway. Pulling in the real module drags in the `table` +// package, which (via `supports-hyperlinks` -> `supports-color`) doesn't +// bundle for the browser. +export default { + display: () => {}, + enabled: false, + getListSize: () => 0, + tableConfig: {}, + time: (_key: string, fn: (...args: unknown[]) => unknown) => fn +} diff --git a/src/lib/stylelint-browser/stylelint-internals.d.ts b/src/lib/stylelint-browser/stylelint-internals.d.ts index 5c06b1b3..b784f559 100644 --- a/src/lib/stylelint-browser/stylelint-internals.d.ts +++ b/src/lib/stylelint-browser/stylelint-internals.d.ts @@ -5,9 +5,8 @@ // "bundler" module resolution honours the exports map though, so without // these ambient declarations it can't see the deep paths exist. // -// Pinned to stylelint 18.0.0-next.0 (see package.json) - re-check these -// shapes against node_modules/stylelint/lib/*.mjs whenever that version -// changes. This is a prerelease; re-verify again once 18.0.0 is final. +// Pinned to stylelint ~17.16.0 (see package.json) - re-check these shapes +// against node_modules/stylelint/lib/*.mjs whenever that version changes. declare module 'stylelint/lib/lintPostcssResult.mjs' { import type { LinterOptions, PostcssResult, Config } from 'stylelint' diff --git a/vite.config.js b/vite.config.js index b5bc0185..0c6000dc 100644 --- a/vite.config.js +++ b/vite.config.js @@ -45,6 +45,18 @@ const config_alias = [ replacement: stylelint_lib_dir + 'formatters/jsonFormatter.mjs' }, + // lintPostcssResult.mjs's own `./timing.mjs` import drags in the `table` + // package (for `TIMING= stylelint ...` CLI output we never trigger), + // which doesn't bundle for the browser. See shims/stylelint-timing.ts. + { find: './timing.mjs', replacement: stylelint_browser_dir + 'shims/stylelint-timing.ts' }, + + // lib/{lintPostcssResult,reportUnknownRuleNames}.mjs import this as + // `./rules/index.mjs`; lib/utils/getStylelintRule.mjs imports the same + // file as `../rules/index.mjs`. Both specifiers need aliasing - see + // shims/stylelint-rules.ts for why the real file can't be used as-is. + { find: './rules/index.mjs', replacement: stylelint_browser_dir + 'shims/stylelint-rules.ts' }, + { find: '../rules/index.mjs', replacement: stylelint_browser_dir + 'shims/stylelint-rules.ts' }, + // Node-free stand-ins for bare specifiers stylelint's internals (and our // plugin package) import. { find: 'node:os', replacement: stylelint_browser_dir + 'shims/node-os.ts' },