@svelte-vitals/core 0.49.0 → 0.50.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -3,23 +3,23 @@
3
3
  [![npm](https://img.shields.io/npm/v/@svelte-vitals/core)](https://www.npmjs.com/package/@svelte-vitals/core)
4
4
  [![MIT](https://img.shields.io/npm/l/@svelte-vitals/core)](https://opensource.org/licenses/MIT)
5
5
 
6
- Runtime-agnostic core for [svelte-vitals](https://github.com/oekazuma/svelte-vitals): shared types, the rule engine, scorer, and reporters, plus the full rule set across six categories SEO, Performance, Correctness, Security, Architecture, Accessibility.
6
+ Runtime-agnostic core for [svelte-vitals](https://github.com/oekazuma/svelte-vitals): shared types, the rule engine, scorer, and reporters, plus the full rule set across six categories: SEO, Performance, Correctness, Security, Architecture, Accessibility.
7
7
 
8
- This package is **mode-independent** and contains no I/O it operates on a normalized `ResolvedHead[]` intermediate representation, so the same rules run unchanged whether heads come from static source analysis (the `svelte-vitals` CLI) or from prerendered HTML (the `@svelte-vitals/vite` plugin). It has zero runtime dependencies and no `node:` imports.
8
+ This package is **mode-independent** and contains no I/O. It operates on a normalized `ResolvedHead[]` intermediate representation, so the same rules run unchanged whether heads come from static source analysis (the `svelte-vitals` CLI) or from prerendered HTML (the `@svelte-vitals/vite` plugin). It has zero runtime dependencies and no `node:` imports.
9
9
 
10
- > Most users don't depend on this directly install [`svelte-vitals`](https://www.npmjs.com/package/svelte-vitals) instead. This package is for building tools on top of the shared engine.
10
+ > Most users don't depend on this directly; install [`svelte-vitals`](https://www.npmjs.com/package/svelte-vitals) instead. This package is for building tools on top of the shared engine.
11
11
 
12
12
  > **ESM-only** (Node 24.16+). Ships ES modules only; `require()` is unsupported by design.
13
13
 
14
14
  ## Entry points
15
15
 
16
- | Entry | Contents | Stability |
17
- | ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
18
- | `@svelte-vitals/core` | `defineConfig` and the config types; the `JsonReport` types for reading a report; `summarize`, `hasFailureAtOrAbove`, `formatGithubReport`, `formatMarkdownReport` for rendering one and gating on it | Follows semver. For the renderers, that covers the function not the text it returns, which stays human-readable and may change. |
19
- | `@svelte-vitals/core/internal` | The engine, rules, fact collection, reporters, and scoring what the CLI and the Vite plugin share | **No guarantee. Anything here may change in any release, including a patch.** |
16
+ | Entry | Contents | Stability |
17
+ | ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
18
+ | `@svelte-vitals/core` | `defineConfig` and the config types; the `JsonReport` types for reading a report; `summarize`, `hasFailureAtOrAbove`, `formatGithubReport`, `formatMarkdownReport` for rendering one and gating on it | Follows semver. For the renderers, that covers the function, not the text it returns, which stays human-readable and may change. |
19
+ | `@svelte-vitals/core/internal` | The engine, rules, fact collection, reporters, and scoring, which is what the CLI and the Vite plugin share | **No guarantee. Anything here may change in any release, including a patch.** |
20
20
 
21
21
  Reach for `/internal` only if you accept pinning an exact version. If something there is what you
22
- actually need, open an issue the point of the split is that promoting a name into the stable
22
+ actually need, open an issue. The point of the split is that promoting a name into the stable
23
23
  entry is an additive change.
24
24
 
25
25
  ## License
package/dist/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- import { Ct as RuleSetting, Dt as TreatDynamicAs, Et as Severity, Ot as Value, St as RuleOverride, at as formatGithubReport, bt as Result, dt as summarize, ft as CATEGORIES, gt as Fix, ht as Detection, it as formatMarkdownReport, jt as defineConfig, mt as Config, n as RuleEvidence, o as ScoreModel, pt as Category, st as Summary, t as JsonReport, ut as hasFailureAtOrAbove, vt as Presence, wt as RuleSettingObject, xt as RuleOptions } from "./json-pC2tDNuR.js";
1
+ import { Ct as RuleSetting, Dt as TreatDynamicAs, Et as Severity, Ot as Value, St as RuleOverride, at as formatGithubReport, bt as Result, dt as summarize, ft as CATEGORIES, gt as Fix, ht as Detection, it as formatMarkdownReport, jt as defineConfig, mt as Config, n as RuleEvidence, o as ScoreModel, pt as Category, st as Summary, t as JsonReport, ut as hasFailureAtOrAbove, vt as Presence, wt as RuleSettingObject, xt as RuleOptions } from "./json-CcKHN-tx.js";
2
2
  export { CATEGORIES, type Category, type Config, type Detection, type Fix, type JsonReport, type Presence, type Result, type RuleEvidence, type RuleOptions, type RuleOverride, type RuleSetting, type RuleSettingObject, type ScoreModel, type Severity, type Summary, type TreatDynamicAs, type Value, defineConfig, formatGithubReport, formatMarkdownReport, hasFailureAtOrAbove, summarize };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import { cr as summarize, dr as CATEGORIES, l as formatGithubReport, mr as defineConfig, sr as hasFailureAtOrAbove, t as formatMarkdownReport } from "./markdown-CP5TPy-s.js";
1
+ import { gr as defineConfig, l as formatGithubReport, lr as hasFailureAtOrAbove, pr as CATEGORIES, t as formatMarkdownReport, ur as summarize } from "./markdown-BBqqynv7.js";
2
2
  export { CATEGORIES, defineConfig, formatGithubReport, formatMarkdownReport, hasFailureAtOrAbove, summarize };
@@ -1,5 +1,12 @@
1
- import { $ as HeadTag, A as formatFailedRuleWarning, At as defaultProject, B as IDREF_ATTRS, C as shouldSkipRangeCheck, D as applyOverrides, E as CompiledOverride, Et as Severity, F as withFailedRulesOff, Ft as OrphanEffectFact, G as isTopFragment, H as ResolvedA11y, I as KitModuleFacts, It as SourceSpan, J as HeadingInfo, K as splitTokens, L as A11yOccurrenceInfo, Lt as SuppressionDirective, M as selectRules, Mt as ComponentFacts, N as settingOptions, Nt as EachBlockFact, O as applyRuleSeverities, Ot as Value, P as settingSeverity, Pt as EffectFact, Q as HeadProvider, R as A11ySkipCause, Rt as skippedFileWarnings, S as resolveRuleOptions, T as validateRuleSetting, Tt as Scope, U as decodeFragmentId, V as LANDMARK_ROLES, W as foldOccurrences, X as ImageInfo, Y as ResolvedHeadings, Z as ResolvedImages, _ as RuleOptionsSpec, _t as KitAlias, a as HealthResult, at as formatGithubReport, b as listOption, bt as Result, c as ScoreResult, ct as classify, d as scoresByCategory, dt as summarize, et as ResolvedHead, f as Rule, g as RuleOptionSpec, gt as Fix, h as isPenalized, i as formatJsonReport, it as formatMarkdownReport, j as overrideMatches, k as compileOverrides, kt as defaultConfig, l as computeHealth, lt as effectiveSeverity, m as docsUrlFor, mt as Config, nt as Runtime, ot as Classification, p as RuleContext, pt as Category, q as stripTextDirective, r as buildJsonReport, rt as withReadLimit, s as ScoreOptions, t as JsonReport, tt as READ_CONCURRENCY, u as computeScore, ut as hasFailureAtOrAbove, v as intOption, w as validateRuleOptions, x as mapOption, y as isMentionedAnywhere, yt as Project, z as BranchStep } from "./json-pC2tDNuR.js";
1
+ import { $ as HeadTag, A as formatFailedRuleWarning, At as defaultProject, B as IDREF_ATTRS, C as shouldSkipRangeCheck, D as applyOverrides, E as CompiledOverride, Et as Severity, F as withFailedRulesOff, Ft as OrphanEffectFact, G as isTopFragment, H as ResolvedA11y, I as KitModuleFacts, It as SourceSpan, J as HeadingInfo, K as splitTokens, L as A11yOccurrenceInfo, Lt as SuppressionDirective, M as selectRules, Mt as ComponentFacts, N as settingOptions, Nt as EachBlockFact, O as applyRuleSeverities, Ot as Value, P as settingSeverity, Pt as EffectFact, Q as HeadProvider, R as A11ySkipCause, Rt as skippedFileWarnings, S as resolveRuleOptions, T as validateRuleSetting, Tt as Scope, U as decodeFragmentId, V as LANDMARK_ROLES, W as foldOccurrences, X as ImageInfo, Y as ResolvedHeadings, Z as ResolvedImages, _ as RuleOptionsSpec, _t as KitAlias, a as HealthResult, at as formatGithubReport, b as listOption, bt as Result, c as ScoreResult, ct as classify, d as scoresByCategory, dt as summarize, et as ResolvedHead, f as Rule, g as RuleOptionSpec, gt as Fix, h as isPenalized, i as formatJsonReport, it as formatMarkdownReport, j as overrideMatches, k as compileOverrides, kt as defaultConfig, l as computeHealth, lt as effectiveSeverity, m as docsUrlFor, mt as Config, nt as Runtime, ot as Classification, p as RuleContext, pt as Category, q as stripTextDirective, r as buildJsonReport, rt as withReadLimit, s as ScoreOptions, t as JsonReport, tt as READ_CONCURRENCY, u as computeScore, ut as hasFailureAtOrAbove, v as intOption, w as validateRuleOptions, x as mapOption, y as isMentionedAnywhere, yt as Project, z as BranchStep } from "./json-CcKHN-tx.js";
2
2
  import { AST } from "svelte/compiler";
3
+ //#region src/rules/a11y/aria-data.d.ts
4
+ /**
5
+ * The role a user agent applies: the first token naming a concrete role, or undefined when none
6
+ * does. Shared so the role rules cannot disagree about what a fallback list means.
7
+ */
8
+ declare function resolveRole(tokens: readonly string[]): string | undefined;
9
+ //#endregion
3
10
  //#region src/component-parse.d.ts
4
11
  /**
5
12
  * Inline `svelte-vitals-disable-next-line` directives (issue #92). A plain text scan, not an
@@ -753,6 +760,9 @@ declare const a11yInvalidAriaValue: Rule;
753
760
  //#region src/rules/a11y/interactive-nesting.d.ts
754
761
  declare const a11yInteractiveNesting: Rule;
755
762
  //#endregion
763
+ //#region src/rules/a11y/aria-hidden-focus.d.ts
764
+ declare const a11yAriaHiddenFocus: Rule;
765
+ //#endregion
756
766
  //#region src/rules/a11y/accessible-name.d.ts
757
767
  declare const a11yAccessibleName: Rule;
758
768
  //#endregion
@@ -1022,17 +1032,20 @@ declare function formatConsoleReport(results: Result[], config: Config, options?
1022
1032
  //#endregion
1023
1033
  //#region src/reporter/sanitize.d.ts
1024
1034
  /**
1025
- * Strip ANSI/OSC escape sequences and C0 control characters (except `\n`/`\t`) from a
1035
+ * Strip ANSI/OSC escape sequences and C0/C1 control characters (except `\n`/`\t`) from a
1026
1036
  * string before it reaches a terminal. POSIX file/route names can contain almost any
1027
1037
  * byte, so a hostile repo can smuggle a terminal-title rewrite, cursor move, or other
1028
1038
  * escape-sequence trick into what looks like plain report text.
1029
1039
  *
1030
- * Only OSC and CSI sequences are pattern-matched and removed whole (payload included) —
1031
- * those cover title-bar writes and cursor/screen control, the two classes with a real
1032
- * blast radius. Any other `ESC` byte (rarer single/two-byte forms like reset or
1033
- * save-cursor) falls through to the final C0 sweep below, which drops the lone `ESC`
1034
- * but — deliberately, not swallowing an adjacent legitimate character leaves whatever
1035
- * printable byte follows it as stray text.
1040
+ * OSC and CSI sequences are pattern-matched and removed whole (payload included) — those
1041
+ * cover title-bar writes and cursor/screen control, the two classes with a real blast
1042
+ * radius. Each is matched in both its two-byte `ESC` form and its single-codepoint C1
1043
+ * form (U+009D OSC, U+009B CSI C1 also interprets as `ESC ]`/`ESC [` on legacy/some
1044
+ * configured terminals), and OSC's terminator likewise accepts either `ESC \` or the
1045
+ * single-codepoint C1 ST (U+009C). Any other `ESC`/C1 byte (rarer single/two-byte forms
1046
+ * like reset or save-cursor) falls through to the final control sweep below, which drops
1047
+ * the lone control byte but — deliberately, not swallowing an adjacent legitimate
1048
+ * character — leaves whatever printable byte follows it as stray text.
1036
1049
  * ponytail: doesn't special-case every Fe escape form; broaden the CSI/OSC patterns if a
1037
1050
  * concrete non-CSI/OSC sequence turns out to matter.
1038
1051
  */
@@ -1050,7 +1063,11 @@ declare function formatSarifReport(results: Result[], config: Config, meta: {
1050
1063
  //#endregion
1051
1064
  //#region src/reporter/app-shell.d.ts
1052
1065
  type Band = 'good' | 'warn' | 'poor';
1053
- declare const BAND_COLOR: Record<Band, string>;
1066
+ declare const BAND_COLOR: {
1067
+ good: string;
1068
+ warn: string;
1069
+ poor: string;
1070
+ };
1054
1071
  declare function scoreBand(score: number): Band;
1055
1072
  declare function escapeHtml(s: string): string;
1056
1073
  /**
@@ -1112,4 +1129,4 @@ declare function formatHtmlReport(results: Result[], config: Config, meta: {
1112
1129
  coreVersion?: string;
1113
1130
  }): string;
1114
1131
  //#endregion
1115
- export { type A11yOccurrenceInfo, type A11ySkipCause, APP_SCRIPT, APP_STYLE, type AppSnapshot, BAND_COLOR, type BranchStep, CHILD_NODE_KEYS, type Classification, type CompiledOverride, type ComponentFacts, type ConsoleReportOptions, type DirectiveIndex, type EachBlockFact, type EffectFact, type FailedRule, type HeadProvider, type HeadTag, type HeadingInfo, type HealthResult, IDREF_ATTRS, type ImageInfo, type KitAlias, type KitModuleFacts, LANDMARK_ROLES, type OrphanEffectFact, type Palette, type Project, READ_CONCURRENCY, ROBOTS_SOURCE_PATHS, type RawKitAliases, type ResolvedA11y, type ResolvedHead, type ResolvedHeadings, type ResolvedImages, type RouteBadge, type Rule, type RuleContext, RuleInfo, RuleOptionInfo, type RuleOptionSpec, type RuleOptionsSpec, type Runtime, SITEMAP_SOURCE_PATHS, SVELTE_CONFIG_FILES, type Scope, type ScoreOptions, type ScoreResult, type SourceSpan, type SuppressionDirective, VITE_CONFIG_FILES, type ViteKitConfigResult, a11yAbbrTitle, a11yAccessibleName, a11yDeprecatedAria, a11yDeprecatedAttr, a11yDeprecatedElement, a11yDisallowedAriaProps, a11yDisallowedElement, a11yDoctype, a11yDuplicateLandmark, a11yIdDuplication, a11yInteractiveNesting, a11yInvalidAriaValue, a11yInvalidRole, a11yLabelHasControl, a11yNoAccesskey, a11yNoAutofocus, a11yNoDuplicateDt, a11yNoMissingIdRef, a11yPatternTitle, a11yPermittedContents, a11yPlaceholderLabelOption, a11yPositiveTabindex, a11yRequireDatetime, a11yRequiredAriaProps, a11yRequiredElement, a11yTopLevelLandmark, a11yUnknownAriaAttribute, a11yUnverifiedIdRef, a11yUseList, allRules, applyInlineDirectives, applyOverrides, applyRuleSeverities, architectureComponentSize, architectureDirectoryNaming, architectureDocLinkTarget, architecturePrivateScopeImport, architecturePropCount, architectureReservedDirectoryNames, architectureReservedNamePlacement, architectureRouteComponentImport, architectureUnitEntryFile, attrText, attrTextOf, attrValue, attrValueOf, buildHtmlDocument, buildJsonReport, classify, collectComponentFacts, collectKitModuleFacts, collectSourceFiles, collectSuppressions, compileOverrides, computeHealth, computeScore, correctnessAutoplayMuted, correctnessBasePathNavigation, correctnessCheckableBindValue, correctnessEachIndexKey, correctnessEachKey, correctnessEffectAsDerived, correctnessEffectAsOnMount, correctnessInstanceBrowserGlobal, correctnessNonreactiveBuiltinState, correctnessOrphanEffect, correctnessOrphanLifecycle, correctnessPropMutation, correctnessServerBrowserGlobal, correctnessStalePropDerivation, correctnessUnmutatedState, decodeFragmentId, defaultConfig, defaultProject, docsUrlFor, effectiveSeverity, emptyComponentFacts, emptyKitModuleFacts, escapeHtml, explainRule, findAttr, findKitAliasesInSvelteConfig, findKitPathsBaseInSvelteConfig, findKitPathsBaseInViteConfig, findMinifyDisabled, foldOccurrences, formatAgentReport, formatConsoleReport, formatFailedRuleWarning, formatGithubReport, formatHtmlReport, formatJsonReport, formatMarkdownReport, formatSarifReport, hasFailureAtOrAbove, headTagRule, imageRule, intOption, isMentionedAnywhere, isPenalized, isTopFragment, lineOf, linkRule, listOption, mapOption, noColorPalette, overrideMatches, parseComponentFacts, parseKitModuleFacts, parseSvelte, performanceFontPreloadCrossorigin, performanceHeavyImport, performanceIframeLoading, performanceImageDimensions, performanceImageLoadingHint, performanceLcpImage, performanceLoadWaterfall, performanceMinifyDisabled, performanceNamespaceImport, performancePreconnect, performancePreloadMissingAs, performanceRenderBlockingScript, performanceResponsiveImage, performanceSequentialAwaits, performanceStateRaw, renderAppShell, resolveKitAliases, resolveKitPathsBase, resolveRepoLocalPath, resolveRuleOptions, resolveRunesModuleSpecifier, runRules, safeHref, scoreBand, scoreColor, scoresByCategory, securityHandlerStateWrite, securityJavascriptUrl, securityRawHtml, securityServerModuleState, securitySharedStateImport, selectRules, seoCanonicalUrl, seoCharset, seoDescriptionLength, seoDescriptionPresence, seoDuplicateDescription, seoDuplicateTitle, seoHeadingLevelSkip, seoHreflang, seoHtmlLang, seoImageAlt, seoIndexability, seoJsonLd, seoJsonLdDateFormat, seoJsonLdDeprecatedType, seoJsonLdPlaceholder, seoJsonLdRelativeUrl, seoJsonLdRequiredProps, seoJsonLdValidity, seoOgDescription, seoOgImage, seoOgTitle, seoOgUrl, seoRobotsTxt, seoSingleH1, seoSitemapInRobots, seoSitemapXml, seoSsrDisabled, seoTitleLength, seoTitlePresence, seoTwitterCard, seoViewport, settingOptions, settingSeverity, shouldSkipRangeCheck, skippedFileWarnings, splitTokens, stripTextDirective, summarize, terminalSafe, textFromNodes, unknownDirectiveIds, validateRuleOptions, validateRuleSetting, valueFromNodes, withFailedRulesOff, withReadLimit };
1132
+ export { type A11yOccurrenceInfo, type A11ySkipCause, APP_SCRIPT, APP_STYLE, type AppSnapshot, BAND_COLOR, type BranchStep, CHILD_NODE_KEYS, type Classification, type CompiledOverride, type ComponentFacts, type ConsoleReportOptions, type DirectiveIndex, type EachBlockFact, type EffectFact, type FailedRule, type HeadProvider, type HeadTag, type HeadingInfo, type HealthResult, IDREF_ATTRS, type ImageInfo, type KitAlias, type KitModuleFacts, LANDMARK_ROLES, type OrphanEffectFact, type Palette, type Project, READ_CONCURRENCY, ROBOTS_SOURCE_PATHS, type RawKitAliases, type ResolvedA11y, type ResolvedHead, type ResolvedHeadings, type ResolvedImages, type RouteBadge, type Rule, type RuleContext, RuleInfo, RuleOptionInfo, type RuleOptionSpec, type RuleOptionsSpec, type Runtime, SITEMAP_SOURCE_PATHS, SVELTE_CONFIG_FILES, type Scope, type ScoreOptions, type ScoreResult, type SourceSpan, type SuppressionDirective, VITE_CONFIG_FILES, type ViteKitConfigResult, a11yAbbrTitle, a11yAccessibleName, a11yAriaHiddenFocus, a11yDeprecatedAria, a11yDeprecatedAttr, a11yDeprecatedElement, a11yDisallowedAriaProps, a11yDisallowedElement, a11yDoctype, a11yDuplicateLandmark, a11yIdDuplication, a11yInteractiveNesting, a11yInvalidAriaValue, a11yInvalidRole, a11yLabelHasControl, a11yNoAccesskey, a11yNoAutofocus, a11yNoDuplicateDt, a11yNoMissingIdRef, a11yPatternTitle, a11yPermittedContents, a11yPlaceholderLabelOption, a11yPositiveTabindex, a11yRequireDatetime, a11yRequiredAriaProps, a11yRequiredElement, a11yTopLevelLandmark, a11yUnknownAriaAttribute, a11yUnverifiedIdRef, a11yUseList, allRules, applyInlineDirectives, applyOverrides, applyRuleSeverities, architectureComponentSize, architectureDirectoryNaming, architectureDocLinkTarget, architecturePrivateScopeImport, architecturePropCount, architectureReservedDirectoryNames, architectureReservedNamePlacement, architectureRouteComponentImport, architectureUnitEntryFile, attrText, attrTextOf, attrValue, attrValueOf, buildHtmlDocument, buildJsonReport, classify, collectComponentFacts, collectKitModuleFacts, collectSourceFiles, collectSuppressions, compileOverrides, computeHealth, computeScore, correctnessAutoplayMuted, correctnessBasePathNavigation, correctnessCheckableBindValue, correctnessEachIndexKey, correctnessEachKey, correctnessEffectAsDerived, correctnessEffectAsOnMount, correctnessInstanceBrowserGlobal, correctnessNonreactiveBuiltinState, correctnessOrphanEffect, correctnessOrphanLifecycle, correctnessPropMutation, correctnessServerBrowserGlobal, correctnessStalePropDerivation, correctnessUnmutatedState, decodeFragmentId, defaultConfig, defaultProject, docsUrlFor, effectiveSeverity, emptyComponentFacts, emptyKitModuleFacts, escapeHtml, explainRule, findAttr, findKitAliasesInSvelteConfig, findKitPathsBaseInSvelteConfig, findKitPathsBaseInViteConfig, findMinifyDisabled, foldOccurrences, formatAgentReport, formatConsoleReport, formatFailedRuleWarning, formatGithubReport, formatHtmlReport, formatJsonReport, formatMarkdownReport, formatSarifReport, hasFailureAtOrAbove, headTagRule, imageRule, intOption, isMentionedAnywhere, isPenalized, isTopFragment, lineOf, linkRule, listOption, mapOption, noColorPalette, overrideMatches, parseComponentFacts, parseKitModuleFacts, parseSvelte, performanceFontPreloadCrossorigin, performanceHeavyImport, performanceIframeLoading, performanceImageDimensions, performanceImageLoadingHint, performanceLcpImage, performanceLoadWaterfall, performanceMinifyDisabled, performanceNamespaceImport, performancePreconnect, performancePreloadMissingAs, performanceRenderBlockingScript, performanceResponsiveImage, performanceSequentialAwaits, performanceStateRaw, renderAppShell, resolveKitAliases, resolveKitPathsBase, resolveRepoLocalPath, resolveRole, resolveRuleOptions, resolveRunesModuleSpecifier, runRules, safeHref, scoreBand, scoreColor, scoresByCategory, securityHandlerStateWrite, securityJavascriptUrl, securityRawHtml, securityServerModuleState, securitySharedStateImport, selectRules, seoCanonicalUrl, seoCharset, seoDescriptionLength, seoDescriptionPresence, seoDuplicateDescription, seoDuplicateTitle, seoHeadingLevelSkip, seoHreflang, seoHtmlLang, seoImageAlt, seoIndexability, seoJsonLd, seoJsonLdDateFormat, seoJsonLdDeprecatedType, seoJsonLdPlaceholder, seoJsonLdRelativeUrl, seoJsonLdRequiredProps, seoJsonLdValidity, seoOgDescription, seoOgImage, seoOgTitle, seoOgUrl, seoRobotsTxt, seoSingleH1, seoSitemapInRobots, seoSitemapXml, seoSsrDisabled, seoTitleLength, seoTitlePresence, seoTwitterCard, seoViewport, settingOptions, settingSeverity, shouldSkipRangeCheck, skippedFileWarnings, splitTokens, stripTextDirective, summarize, terminalSafe, textFromNodes, unknownDirectiveIds, validateRuleOptions, validateRuleSetting, valueFromNodes, withFailedRulesOff, withReadLimit };
package/dist/internal.js CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as architectureRouteComponentImport, $n as seoOgTitle, $t as correctnessEachKey, A as a11yAbbrTitle, An as validateRuleSetting, At as textFromNodes, B as a11yInteractiveNesting, Bn as performanceRenderBlockingScript, Bt as correctnessServerBrowserGlobal, C as a11yPermittedContents, Cn as intOption, Ct as attrText, D as a11yDeprecatedAttr, Dn as resolveRuleOptions, Dt as findAttr, E as a11yDisallowedAriaProps, En as mapOption, Et as attrValueOf, F as a11yRequireDatetime, Fn as overrideMatches, Ft as securityServerModuleState, G as performanceIframeLoading, Gn as performanceResponsiveImage, Gt as correctnessCheckableBindValue, H as a11yRequiredAriaProps, Hn as performanceFontPreloadCrossorigin, Ht as correctnessOrphanLifecycle, I as a11yPlaceholderLabelOption, In as selectRules, It as securityHandlerStateWrite, J as performanceLoadWaterfall, Jn as imageRule, Jt as correctnessPropMutation, K as performanceStateRaw, Kn as performanceImageLoadingHint, Kt as correctnessNonreactiveBuiltinState, L as a11yUseList, Ln as settingOptions, Lt as securityJavascriptUrl, M as a11yNoAutofocus, Mn as applyRuleSeverities, Mt as architecturePropCount, N as a11yNoAccesskey, Nn as compileOverrides, Nt as architectureComponentSize, O as a11yDeprecatedElement, On as shouldSkipRangeCheck, Ot as lineOf, P as a11yPositiveTabindex, Pn as formatFailedRuleWarning, Pt as securitySharedStateImport, Q as architectureDocLinkTarget, Qn as seoJsonLd, Qt as correctnessEachIndexKey, R as a11yLabelHasControl, Rn as settingSeverity, Rt as securityRawHtml, S as a11yRequiredElement, Sn as performancePreconnect, St as CHILD_NODE_KEYS, T as a11yDeprecatedAria, Tn as listOption, Tt as attrValue, U as a11yUnknownAriaAttribute, Un as performancePreloadMissingAs, Ut as correctnessOrphanEffect, V as a11yInvalidAriaValue, Vn as performanceLcpImage, Vt as correctnessBasePathNavigation, W as a11yInvalidRole, Wn as linkRule, Wt as correctnessAutoplayMuted, X as performanceNamespaceImport, Xn as seoSitemapXml, Xt as correctnessEffectAsOnMount, Y as performanceMinifyDisabled, Yn as seoHtmlLang, Yt as correctnessUnmutatedState, Z as performanceHeavyImport, Zn as seoRobotsTxt, Zt as correctnessEffectAsDerived, _ as a11yNoMissingIdRef, _n as seoViewport, _t as decodeFragmentId, a as formatJsonReport, an as seoHreflang, ar as classify, at as collectTopLevelBindings, b as a11yDuplicateLandmark, bn as seoTwitterCard, bt as splitTokens, c as scoresByCategory, cn as seoDescriptionLength, cr as summarize, ct as resolveRepoLocalPath, d as messageText, dn as seoJsonLdPlaceholder, dt as collectSuppressions, en as seoSsrDisabled, er as seoOgImage, et as architectureReservedNamePlacement, f as ruleMetaById, fn as seoJsonLdDateFormat, fr as defaultConfig, ft as parseComponentFacts, g as a11yUnverifiedIdRef, gn as seoSitemapInRobots, gt as LANDMARK_ROLES, h as explainRule, hn as seoJsonLdValidity, ht as IDREF_ATTRS, i as buildJsonReport, in as seoSingleH1, ir as seoTitlePresence, it as architecturePrivateScopeImport, j as a11yNoDuplicateDt, jn as applyOverrides, jt as valueFromNodes, k as a11yPatternTitle, kn as validateRuleOptions, kt as parseSvelte, l as formatGithubReport, ln as seoTitleLength, lr as docsUrlFor, lt as resolveRunesModuleSpecifier, m as allRules, mn as seoJsonLdDeprecatedType, mt as unwrapTs, n as mdEscape, nn as seoDuplicateDescription, nr as seoDescriptionPresence, nt as architectureDirectoryNaming, o as computeHealth, on as seoImageAlt, or as effectiveSeverity, ot as parseInMemoryExports, p as severityToSarifLevel, pn as seoJsonLdRelativeUrl, pr as defaultProject, pt as parseModuleProgram, q as performanceSequentialAwaits, qn as performanceImageDimensions, qt as correctnessStalePropDerivation, r as terminalSafe, rn as seoDuplicateTitle, rr as headTagRule, rt as architectureUnitEntryFile, s as computeScore, sn as seoCharset, sr as hasFailureAtOrAbove, st as parseKitModuleFacts, t as formatMarkdownReport, tn as seoHeadingLevelSkip, tr as seoCanonicalUrl, tt as architectureReservedDirectoryNames, u as SEVERITY_RANK, un as seoJsonLdRequiredProps, ur as isPenalized, ut as collectNamedImportAliases, v as a11yIdDuplication, vn as seoOgUrl, vt as foldOccurrences, w as a11yDisallowedElement, wn as isMentionedAnywhere, wt as attrTextOf, x as a11yDoctype, xn as seoIndexability, xt as stripTextDirective, y as a11yTopLevelLandmark, yn as seoOgDescription, yt as isTopFragment, z as a11yAccessibleName, zn as withFailedRulesOff, zt as correctnessInstanceBrowserGlobal } from "./markdown-CP5TPy-s.js";
1
+ import { $ as architectureDocLinkTarget, $n as seoRobotsTxt, $t as correctnessEffectAsDerived, A as a11yAbbrTitle, An as shouldSkipRangeCheck, At as lineOf, B as a11yAriaHiddenFocus, Bn as settingSeverity, Bt as securityRawHtml, C as a11yPermittedContents, Cn as seoIndexability, Ct as stripTextDirective, D as a11yDeprecatedAttr, Dn as listOption, Dt as attrValue, E as a11yDisallowedAriaProps, En as isMentionedAnywhere, Et as attrTextOf, F as a11yRequireDatetime, Fn as compileOverrides, Ft as architectureComponentSize, G as a11yInvalidRole, Gn as performancePreloadMissingAs, Gt as correctnessOrphanEffect, H as a11yInvalidAriaValue, Hn as performanceRenderBlockingScript, Ht as correctnessServerBrowserGlobal, I as a11yPlaceholderLabelOption, In as formatFailedRuleWarning, It as securitySharedStateImport, J as performanceSequentialAwaits, Jn as performanceImageLoadingHint, Jt as correctnessNonreactiveBuiltinState, K as performanceIframeLoading, Kn as linkRule, Kt as correctnessAutoplayMuted, L as a11yUseList, Ln as overrideMatches, Lt as securityServerModuleState, M as a11yNoAutofocus, Mn as validateRuleSetting, Mt as textFromNodes, N as a11yNoAccesskey, Nn as applyOverrides, Nt as valueFromNodes, O as a11yDeprecatedElement, On as mapOption, Ot as attrValueOf, P as a11yPositiveTabindex, Pn as applyRuleSeverities, Pt as architecturePropCount, Q as performanceHeavyImport, Qn as seoSitemapXml, Qt as correctnessEffectAsOnMount, R as a11yLabelHasControl, Rn as selectRules, Rt as securityHandlerStateWrite, S as a11yRequiredElement, Sn as seoTwitterCard, St as splitTokens, T as a11yDeprecatedAria, Tn as intOption, Tt as attrText, U as a11yRequiredAriaProps, Un as performanceLcpImage, Ut as correctnessBasePathNavigation, V as a11yInteractiveNesting, Vn as withFailedRulesOff, Vt as correctnessInstanceBrowserGlobal, W as a11yUnknownAriaAttribute, Wn as performanceFontPreloadCrossorigin, Wt as correctnessOrphanLifecycle, X as performanceMinifyDisabled, Xn as imageRule, Xt as correctnessPropMutation, Y as performanceLoadWaterfall, Yn as performanceImageDimensions, Yt as correctnessStalePropDerivation, Z as performanceNamespaceImport, Zn as seoHtmlLang, Zt as correctnessUnmutatedState, _ as a11yNoMissingIdRef, _n as seoJsonLdValidity, _t as IDREF_ATTRS, a as formatJsonReport, an as seoDuplicateTitle, ar as headTagRule, at as architecturePrivateScopeImport, b as a11yDuplicateLandmark, bn as seoOgUrl, bt as foldOccurrences, c as scoresByCategory, cn as seoImageAlt, cr as effectiveSeverity, ct as parseKitModuleFacts, d as messageText, dn as seoTitleLength, dr as docsUrlFor, dt as collectNamedImportAliases, en as correctnessEachIndexKey, er as seoJsonLd, et as architectureRouteComponentImport, f as ruleMetaById, fn as seoJsonLdRequiredProps, fr as isPenalized, ft as collectSuppressions, g as a11yUnverifiedIdRef, gn as seoJsonLdDeprecatedType, gt as resolveRole, h as explainRule, hn as seoJsonLdRelativeUrl, hr as defaultProject, ht as unwrapTs, i as buildJsonReport, in as seoDuplicateDescription, ir as seoDescriptionPresence, it as architectureUnitEntryFile, j as a11yNoDuplicateDt, jn as validateRuleOptions, jt as parseSvelte, k as a11yPatternTitle, kn as resolveRuleOptions, kt as findAttr, l as formatGithubReport, ln as seoCharset, lr as hasFailureAtOrAbove, lt as resolveRepoLocalPath, m as allRules, mn as seoJsonLdDateFormat, mr as defaultConfig, mt as parseModuleProgram, n as mdEscape, nn as seoSsrDisabled, nr as seoOgImage, nt as architectureReservedDirectoryNames, o as computeHealth, on as seoSingleH1, or as seoTitlePresence, ot as collectTopLevelBindings, p as severityToSarifLevel, pn as seoJsonLdPlaceholder, pt as parseComponentFacts, q as performanceStateRaw, qn as performanceResponsiveImage, qt as correctnessCheckableBindValue, r as terminalSafe, rn as seoHeadingLevelSkip, rr as seoCanonicalUrl, rt as architectureDirectoryNaming, s as computeScore, sn as seoHreflang, sr as classify, st as parseInMemoryExports, t as formatMarkdownReport, tn as correctnessEachKey, tr as seoOgTitle, tt as architectureReservedNamePlacement, u as SEVERITY_RANK, un as seoDescriptionLength, ur as summarize, ut as resolveRunesModuleSpecifier, v as a11yIdDuplication, vn as seoSitemapInRobots, vt as LANDMARK_ROLES, w as a11yDisallowedElement, wn as performancePreconnect, wt as CHILD_NODE_KEYS, x as a11yDoctype, xn as seoOgDescription, xt as isTopFragment, y as a11yTopLevelLandmark, yn as seoViewport, yt as decodeFragmentId, z as a11yAccessibleName, zn as settingOptions, zt as securityJavascriptUrl } from "./markdown-BBqqynv7.js";
2
2
  //#region src/inline-directives.ts
3
3
  /** The directive silencing `r`, if one sits on its line and names its rule (or names nothing). */
4
4
  function directiveFor(index, r) {
@@ -1247,30 +1247,56 @@ const APP_SCRIPT = `
1247
1247
  return pre;
1248
1248
  }
1249
1249
 
1250
+ // Analyzed-repo strings (title, location, recommendation, fix description, docs URL) flow
1251
+ // into a prompt the user pastes into a coding agent — same threat model as
1252
+ // reporter/sanitize.ts's mdEscape, re-implemented here in ES5 because APP_SCRIPT runs in
1253
+ // the browser and cannot import build-time modules. Keep the two in sync.
1254
+ function mdSafe(text) {
1255
+ return String(text)
1256
+ .replace(/\\r\\n|\\r|\\n/g, ' ')
1257
+ .replace(/<[^>]+>/g, function (tag) {
1258
+ var longest = 0;
1259
+ var runs = tag.match(/\`+/g);
1260
+ if (runs) for (var i = 0; i < runs.length; i++) if (runs[i].length > longest) longest = runs[i].length;
1261
+ var fence = Array(longest + 2).join('\`');
1262
+ var pad = tag.charAt(0) === '\`' || tag.charAt(tag.length - 1) === '\`' ? ' ' : '';
1263
+ return fence + pad + tag + pad + fence;
1264
+ })
1265
+ .replace(/\\[([^\\]]*)\\]\\(([^)]*)\\)/g, '[$1]\\\\($2\\\\)');
1266
+ }
1267
+
1268
+ function fenceFor(snippet) {
1269
+ var longest = 0;
1270
+ var runs = String(snippet).match(/\`+/g);
1271
+ if (runs) for (var i = 0; i < runs.length; i++) if (runs[i].length > longest) longest = runs[i].length;
1272
+ return Array(Math.max(3, longest + 1) + 1).join('\`');
1273
+ }
1274
+
1250
1275
  // Plain-text, copy-pasteable prompt for a single finding — same ingredients as the
1251
1276
  // agent reporter's per-finding block (rule id, location, recommendation, fix, docs),
1252
1277
  // reshaped for a standalone request rather than a whole-project remediation doc.
1253
1278
  function buildAiPrompt(issue, route) {
1254
1279
  var lines = ['Fix this svelte-vitals finding:', ''];
1255
- lines.push('- Rule: ' + issue.id + ' — ' + issue.title + ' (' + issue.severity + ')');
1256
- if (route) lines.push('- Route: ' + route);
1280
+ lines.push('- Rule: ' + issue.id + ' — ' + mdSafe(issue.title) + ' (' + issue.severity + ')');
1281
+ if (route) lines.push('- Route: ' + mdSafe(route));
1257
1282
  if (issue.location) {
1258
- lines.push('- Location: ' + issue.location + (issue.line !== undefined ? ':' + issue.line : ''));
1283
+ lines.push('- Location: ' + mdSafe(issue.location) + (issue.line !== undefined ? ':' + issue.line : ''));
1259
1284
  }
1260
- if (issue.recommendation) lines.push('- Recommendation: ' + issue.recommendation);
1285
+ if (issue.recommendation) lines.push('- Recommendation: ' + mdSafe(issue.recommendation));
1261
1286
  if (issue.fix) {
1262
- lines.push('- Fix: ' + issue.fix.description);
1287
+ lines.push('- Fix: ' + mdSafe(issue.fix.description));
1263
1288
  if (issue.fix.snippet) {
1264
- lines.push('', '\`\`\`' + (issue.fix.lang || 'svelte'), issue.fix.snippet, '\`\`\`');
1289
+ var fence = fenceFor(issue.fix.snippet);
1290
+ lines.push('', fence + (issue.fix.lang || 'svelte'), issue.fix.snippet, fence);
1265
1291
  }
1266
1292
  }
1267
- if (issue.docsUrl) lines.push('- Docs: ' + issue.docsUrl);
1293
+ if (issue.docsUrl) lines.push('- Docs: ' + mdSafe(issue.docsUrl));
1268
1294
  lines.push(
1269
1295
  '',
1270
1296
  'After fixing, re-run \`svelte-vitals --diff\` (or revisit this route) to confirm ' +
1271
1297
  issue.id +
1272
1298
  ' passes' +
1273
- (route ? ' for ' + route : '') +
1299
+ (route ? ' for ' + mdSafe(route) : '') +
1274
1300
  '.'
1275
1301
  );
1276
1302
  return lines.join('\\n');
@@ -1707,4 +1733,4 @@ function formatHtmlReport(results, config, meta) {
1707
1733
  return buildHtmlDocument(buildJsonReport(results, config, meta), meta);
1708
1734
  }
1709
1735
  //#endregion
1710
- export { APP_SCRIPT, APP_STYLE, BAND_COLOR, CHILD_NODE_KEYS, IDREF_ATTRS, LANDMARK_ROLES, READ_CONCURRENCY, ROBOTS_SOURCE_PATHS, SITEMAP_SOURCE_PATHS, SVELTE_CONFIG_FILES, VITE_CONFIG_FILES, a11yAbbrTitle, a11yAccessibleName, a11yDeprecatedAria, a11yDeprecatedAttr, a11yDeprecatedElement, a11yDisallowedAriaProps, a11yDisallowedElement, a11yDoctype, a11yDuplicateLandmark, a11yIdDuplication, a11yInteractiveNesting, a11yInvalidAriaValue, a11yInvalidRole, a11yLabelHasControl, a11yNoAccesskey, a11yNoAutofocus, a11yNoDuplicateDt, a11yNoMissingIdRef, a11yPatternTitle, a11yPermittedContents, a11yPlaceholderLabelOption, a11yPositiveTabindex, a11yRequireDatetime, a11yRequiredAriaProps, a11yRequiredElement, a11yTopLevelLandmark, a11yUnknownAriaAttribute, a11yUnverifiedIdRef, a11yUseList, allRules, applyInlineDirectives, applyOverrides, applyRuleSeverities, architectureComponentSize, architectureDirectoryNaming, architectureDocLinkTarget, architecturePrivateScopeImport, architecturePropCount, architectureReservedDirectoryNames, architectureReservedNamePlacement, architectureRouteComponentImport, architectureUnitEntryFile, attrText, attrTextOf, attrValue, attrValueOf, buildHtmlDocument, buildJsonReport, classify, collectComponentFacts, collectKitModuleFacts, collectSourceFiles, collectSuppressions, compileOverrides, computeHealth, computeScore, correctnessAutoplayMuted, correctnessBasePathNavigation, correctnessCheckableBindValue, correctnessEachIndexKey, correctnessEachKey, correctnessEffectAsDerived, correctnessEffectAsOnMount, correctnessInstanceBrowserGlobal, correctnessNonreactiveBuiltinState, correctnessOrphanEffect, correctnessOrphanLifecycle, correctnessPropMutation, correctnessServerBrowserGlobal, correctnessStalePropDerivation, correctnessUnmutatedState, decodeFragmentId, defaultConfig, defaultProject, docsUrlFor, effectiveSeverity, emptyComponentFacts, emptyKitModuleFacts, escapeHtml, explainRule, findAttr, findKitAliasesInSvelteConfig, findKitPathsBaseInSvelteConfig, findKitPathsBaseInViteConfig, findMinifyDisabled, foldOccurrences, formatAgentReport, formatConsoleReport, formatFailedRuleWarning, formatGithubReport, formatHtmlReport, formatJsonReport, formatMarkdownReport, formatSarifReport, hasFailureAtOrAbove, headTagRule, imageRule, intOption, isMentionedAnywhere, isPenalized, isTopFragment, lineOf, linkRule, listOption, mapOption, noColorPalette, overrideMatches, parseComponentFacts, parseKitModuleFacts, parseSvelte, performanceFontPreloadCrossorigin, performanceHeavyImport, performanceIframeLoading, performanceImageDimensions, performanceImageLoadingHint, performanceLcpImage, performanceLoadWaterfall, performanceMinifyDisabled, performanceNamespaceImport, performancePreconnect, performancePreloadMissingAs, performanceRenderBlockingScript, performanceResponsiveImage, performanceSequentialAwaits, performanceStateRaw, renderAppShell, resolveKitAliases, resolveKitPathsBase, resolveRepoLocalPath, resolveRuleOptions, resolveRunesModuleSpecifier, runRules, safeHref, scoreBand, scoreColor, scoresByCategory, securityHandlerStateWrite, securityJavascriptUrl, securityRawHtml, securityServerModuleState, securitySharedStateImport, selectRules, seoCanonicalUrl, seoCharset, seoDescriptionLength, seoDescriptionPresence, seoDuplicateDescription, seoDuplicateTitle, seoHeadingLevelSkip, seoHreflang, seoHtmlLang, seoImageAlt, seoIndexability, seoJsonLd, seoJsonLdDateFormat, seoJsonLdDeprecatedType, seoJsonLdPlaceholder, seoJsonLdRelativeUrl, seoJsonLdRequiredProps, seoJsonLdValidity, seoOgDescription, seoOgImage, seoOgTitle, seoOgUrl, seoRobotsTxt, seoSingleH1, seoSitemapInRobots, seoSitemapXml, seoSsrDisabled, seoTitleLength, seoTitlePresence, seoTwitterCard, seoViewport, settingOptions, settingSeverity, shouldSkipRangeCheck, skippedFileWarnings, splitTokens, stripTextDirective, summarize, terminalSafe, textFromNodes, unknownDirectiveIds, validateRuleOptions, validateRuleSetting, valueFromNodes, withFailedRulesOff, withReadLimit };
1736
+ export { APP_SCRIPT, APP_STYLE, BAND_COLOR, CHILD_NODE_KEYS, IDREF_ATTRS, LANDMARK_ROLES, READ_CONCURRENCY, ROBOTS_SOURCE_PATHS, SITEMAP_SOURCE_PATHS, SVELTE_CONFIG_FILES, VITE_CONFIG_FILES, a11yAbbrTitle, a11yAccessibleName, a11yAriaHiddenFocus, a11yDeprecatedAria, a11yDeprecatedAttr, a11yDeprecatedElement, a11yDisallowedAriaProps, a11yDisallowedElement, a11yDoctype, a11yDuplicateLandmark, a11yIdDuplication, a11yInteractiveNesting, a11yInvalidAriaValue, a11yInvalidRole, a11yLabelHasControl, a11yNoAccesskey, a11yNoAutofocus, a11yNoDuplicateDt, a11yNoMissingIdRef, a11yPatternTitle, a11yPermittedContents, a11yPlaceholderLabelOption, a11yPositiveTabindex, a11yRequireDatetime, a11yRequiredAriaProps, a11yRequiredElement, a11yTopLevelLandmark, a11yUnknownAriaAttribute, a11yUnverifiedIdRef, a11yUseList, allRules, applyInlineDirectives, applyOverrides, applyRuleSeverities, architectureComponentSize, architectureDirectoryNaming, architectureDocLinkTarget, architecturePrivateScopeImport, architecturePropCount, architectureReservedDirectoryNames, architectureReservedNamePlacement, architectureRouteComponentImport, architectureUnitEntryFile, attrText, attrTextOf, attrValue, attrValueOf, buildHtmlDocument, buildJsonReport, classify, collectComponentFacts, collectKitModuleFacts, collectSourceFiles, collectSuppressions, compileOverrides, computeHealth, computeScore, correctnessAutoplayMuted, correctnessBasePathNavigation, correctnessCheckableBindValue, correctnessEachIndexKey, correctnessEachKey, correctnessEffectAsDerived, correctnessEffectAsOnMount, correctnessInstanceBrowserGlobal, correctnessNonreactiveBuiltinState, correctnessOrphanEffect, correctnessOrphanLifecycle, correctnessPropMutation, correctnessServerBrowserGlobal, correctnessStalePropDerivation, correctnessUnmutatedState, decodeFragmentId, defaultConfig, defaultProject, docsUrlFor, effectiveSeverity, emptyComponentFacts, emptyKitModuleFacts, escapeHtml, explainRule, findAttr, findKitAliasesInSvelteConfig, findKitPathsBaseInSvelteConfig, findKitPathsBaseInViteConfig, findMinifyDisabled, foldOccurrences, formatAgentReport, formatConsoleReport, formatFailedRuleWarning, formatGithubReport, formatHtmlReport, formatJsonReport, formatMarkdownReport, formatSarifReport, hasFailureAtOrAbove, headTagRule, imageRule, intOption, isMentionedAnywhere, isPenalized, isTopFragment, lineOf, linkRule, listOption, mapOption, noColorPalette, overrideMatches, parseComponentFacts, parseKitModuleFacts, parseSvelte, performanceFontPreloadCrossorigin, performanceHeavyImport, performanceIframeLoading, performanceImageDimensions, performanceImageLoadingHint, performanceLcpImage, performanceLoadWaterfall, performanceMinifyDisabled, performanceNamespaceImport, performancePreconnect, performancePreloadMissingAs, performanceRenderBlockingScript, performanceResponsiveImage, performanceSequentialAwaits, performanceStateRaw, renderAppShell, resolveKitAliases, resolveKitPathsBase, resolveRepoLocalPath, resolveRole, resolveRuleOptions, resolveRunesModuleSpecifier, runRules, safeHref, scoreBand, scoreColor, scoresByCategory, securityHandlerStateWrite, securityJavascriptUrl, securityRawHtml, securityServerModuleState, securitySharedStateImport, selectRules, seoCanonicalUrl, seoCharset, seoDescriptionLength, seoDescriptionPresence, seoDuplicateDescription, seoDuplicateTitle, seoHeadingLevelSkip, seoHreflang, seoHtmlLang, seoImageAlt, seoIndexability, seoJsonLd, seoJsonLdDateFormat, seoJsonLdDeprecatedType, seoJsonLdPlaceholder, seoJsonLdRelativeUrl, seoJsonLdRequiredProps, seoJsonLdValidity, seoOgDescription, seoOgImage, seoOgTitle, seoOgUrl, seoRobotsTxt, seoSingleH1, seoSitemapInRobots, seoSitemapXml, seoSsrDisabled, seoTitleLength, seoTitlePresence, seoTwitterCard, seoViewport, settingOptions, settingSeverity, shouldSkipRangeCheck, skippedFileWarnings, splitTokens, stripTextDirective, summarize, terminalSafe, textFromNodes, unknownDirectiveIds, validateRuleOptions, validateRuleSetting, valueFromNodes, withFailedRulesOff, withReadLimit };
@@ -93,6 +93,16 @@ interface InteractiveNestingFact {
93
93
  /** 1-based source line of the descendant, or 0 if unknown. */
94
94
  line: number;
95
95
  }
96
+ /** A keyboard-focusable element that a literal `aria-hidden="true"` hides from assistive
97
+ * technology — carried on the element itself or on an ancestor (a11y/aria-hidden-focus). */
98
+ interface AriaHiddenFocusFact {
99
+ /** The focusable element's tag. */
100
+ tag: string;
101
+ /** The nearest `aria-hidden="true"` ancestor's tag; absent when the element itself carries it. */
102
+ containerTag?: string;
103
+ /** 1-based source line of the focusable element, or 0 if unknown. */
104
+ line: number;
105
+ }
96
106
  /** A `button`/`a href`/`input type="image"` with no computable accessible name (a11y/accessible-name). */
97
107
  interface UnnamedInteractiveFact {
98
108
  tag: string;
@@ -263,6 +273,8 @@ interface ComponentFacts {
263
273
  elements?: ElementFact[];
264
274
  /** Interactive elements nested inside another interactive container (a11y/interactive-nesting). */
265
275
  interactiveNestings?: InteractiveNestingFact[];
276
+ /** Keyboard-focusable elements hidden by a literal `aria-hidden="true"` (a11y/aria-hidden-focus). */
277
+ ariaHiddenFocusables?: AriaHiddenFocusFact[];
266
278
  /** `button`/`a href`/`input type="image"` elements with no computable accessible name (a11y/accessible-name). */
267
279
  unnamedInteractive?: UnnamedInteractiveFact[];
268
280
  /** `<label>` elements with neither a `for` attribute nor a wrapped labelable descendant (a11y/label-has-control). */
@@ -4388,12 +4388,13 @@ function collectAriaElements(node, source, acc) {
4388
4388
  const roleAttr = findAttr(node.attributes, "role");
4389
4389
  const ariaAttrs = node.attributes.filter((a) => a?.type === "Attribute" && typeof a.name === "string" && a.name.toLowerCase().startsWith("aria-"));
4390
4390
  if (roleAttr || ariaAttrs.length > 0) {
4391
- const inputType = node.name === "input" ? attrText(node.attributes, "type") : void 0;
4392
- const hasList = node.name === "input" && findAttr(node.attributes, "list") !== void 0;
4393
- const selectKind = node.name === "select" ? selectNativeRole(node.attributes) : void 0;
4391
+ const tag = node.name.toLowerCase();
4392
+ const inputType = tag === "input" ? attrText(node.attributes, "type") : void 0;
4393
+ const hasList = tag === "input" && findAttr(node.attributes, "list") !== void 0;
4394
+ const selectKind = tag === "select" ? selectNativeRole(node.attributes) : void 0;
4394
4395
  const hasSpread = node.attributes.some((a) => a?.type === "SpreadAttribute");
4395
4396
  acc.push({
4396
- tag: node.name,
4397
+ tag,
4397
4398
  line: lineOf(source, node.start),
4398
4399
  ...roleAttr ? { role: classifyAttrValue(roleAttr.value) } : {},
4399
4400
  ...inputType !== void 0 ? { inputType: inputType.toLowerCase() } : {},
@@ -4464,6 +4465,54 @@ function collectInteractiveNestings(node, source, acc, stack) {
4464
4465
  for (const key of CHILD_NODE_KEYS) if (key in node) collectInteractiveNestings(node[key], source, acc, stack);
4465
4466
  if (opened) stack.pop();
4466
4467
  }
4468
+ /** Tags on which a `disabled` attribute actually removes focusability (it does nothing on `<a>`). */
4469
+ const DISABLEABLE_TAGS = /* @__PURE__ */ new Set([
4470
+ "button",
4471
+ "input",
4472
+ "select",
4473
+ "textarea"
4474
+ ]);
4475
+ /**
4476
+ * Keyboard-focusable elements hidden by a literal `aria-hidden="true"` (a11y/aria-hidden-focus).
4477
+ * Same conventions as `collectInteractiveNestings`: only `RegularElement`, snippet bodies walk
4478
+ * with a fresh stack (they render at their `{@render}` site), and an expression `aria-hidden`
4479
+ * is unknowable — a toggled `aria-hidden={...}` never opens a container. Exempt as not
4480
+ * focusable: a `tabindex` that is negative (the documented remediation) or an expression (it
4481
+ * may resolve to -1), a `disabled` form control, and anything at or under an `inert` or
4482
+ * `hidden` element — an inert subtree leaves the tab order and a hidden one does not render,
4483
+ * so both carry down the walk as `unfocusable`.
4484
+ */
4485
+ function collectAriaHiddenFocusables(node, source, acc, stack, unfocusable = false) {
4486
+ if (Array.isArray(node)) {
4487
+ for (const child of node) collectAriaHiddenFocusables(child, source, acc, stack, unfocusable);
4488
+ return;
4489
+ }
4490
+ if (!node || typeof node !== "object") return;
4491
+ if (node.type === "SnippetBlock") {
4492
+ for (const key of CHILD_NODE_KEYS) if (key in node) collectAriaHiddenFocusables(node[key], source, acc, []);
4493
+ return;
4494
+ }
4495
+ let opened = false;
4496
+ if (node.type === "RegularElement" && Array.isArray(node.attributes)) {
4497
+ const attrs = elementAttrs(node.attributes);
4498
+ if (attrs.some((a) => a.name === "inert" || a.name === "hidden")) unfocusable = true;
4499
+ const hiddenSelf = attrs.find((a) => a.name === "aria-hidden")?.literal?.trim().toLowerCase() === "true";
4500
+ const tabindexAttr = attrs.find((a) => a.name === "tabindex");
4501
+ const tabindex = literalTabindexValue(tabindexAttr?.literal);
4502
+ const tabindexExempts = tabindexAttr !== void 0 && tabindexAttr.literal === void 0;
4503
+ if (!unfocusable && !tabindexExempts && !(tabindex !== void 0 && tabindex < 0) && !(DISABLEABLE_TAGS.has(node.name) && attrs.some((a) => a.name === "disabled")) && isInteractiveElement(node.name, attrs) && (hiddenSelf || stack.length > 0)) acc.push({
4504
+ tag: node.name,
4505
+ ...hiddenSelf ? {} : { containerTag: stack[stack.length - 1] },
4506
+ line: lineOf(source, node.start)
4507
+ });
4508
+ if (hiddenSelf) {
4509
+ stack.push(node.name);
4510
+ opened = true;
4511
+ }
4512
+ }
4513
+ for (const key of CHILD_NODE_KEYS) if (key in node) collectAriaHiddenFocusables(node[key], source, acc, stack, unfocusable);
4514
+ if (opened) stack.pop();
4515
+ }
4467
4516
  /** `aria-label`/`aria-labelledby`/`title` present on this element: a literal non-empty value,
4468
4517
  * or any expression (its rendered value is unknowable, but its *presence* is enough to name
4469
4518
  * the element — a11y/accessible-name treats an expression name source as present). */
@@ -4487,11 +4536,6 @@ function hasNamingAttr(attributes) {
4487
4536
  function isCustomElement(node) {
4488
4537
  return node.type === "RegularElement" && typeof node.name === "string" && node.name.includes("-");
4489
4538
  }
4490
- /** Named/unknowable verdict for a candidate interactive element's descendant subtree
4491
- * (a11y/accessible-name). `named`: a non-whitespace text descendant, or a descendant `img`
4492
- * with a non-empty literal `alt`. `unknowable`: an expression-tag, `Component`, `{@render}`,
4493
- * or `{@html}` anywhere below — content the rule cannot statically resolve, so the element is
4494
- * skipped rather than risk a false positive. */
4495
4539
  function scanAccessibleNameSubtree(node, skip) {
4496
4540
  if (Array.isArray(node)) {
4497
4541
  const acc = {
@@ -4643,10 +4687,6 @@ function isLabelableDescendant(node) {
4643
4687
  if (node.name !== "input") return true;
4644
4688
  return attrText(node.attributes ?? [], "type")?.toLowerCase() !== "hidden";
4645
4689
  }
4646
- /** Wrapped-control/unknowable verdict for a `<label>`'s subtree (a11y/label-has-control).
4647
- * `hasControl`: a descendant labelable element. `unknowable`: an expression-tag, `Component`,
4648
- * `{@render}`, or `{@html}` anywhere below — content the rule cannot statically resolve, so
4649
- * the label is skipped rather than risk a false positive. */
4650
4690
  function scanLabelSubtree(node) {
4651
4691
  if (Array.isArray(node)) {
4652
4692
  const acc = {
@@ -5676,15 +5716,6 @@ function collectBrowserGlobalRefs(program, source, extra) {
5676
5716
  }
5677
5717
  /** A Svelte runes module file — the whole file is one module-scope program (correctness/orphan-effect). */
5678
5718
  const MODULE_FILE_RE = /\.svelte\.(ts|js)$/;
5679
- /**
5680
- * Parse a plain TS/JS module source by wrapping it in a `<script lang="ts">` tag —
5681
- * the Svelte script parser handles TS natively, so no extra parser dependency is
5682
- * needed. Literal "<\/script" occurrences are neutralised with a same-length
5683
- * placeholder first (string contents don't affect fact extraction; offsets are
5684
- * preserved). Returns the ESTree Program and the wrapped source — wrapped line
5685
- * numbers are +1 relative to the input, so callers subtract 1. Shared by the
5686
- * runes-module facts (correctness/orphan-effect) and the Kit-module facts (the security kit-module rules).
5687
- */
5688
5719
  function parseModuleProgram(source, filename) {
5689
5720
  const wrapped = `<script lang="ts">\n${source.replace(/<\/script/gi, "<_script")}\n<\/script>`;
5690
5721
  return {
@@ -5830,6 +5861,8 @@ function parseComponentFacts(source, filename) {
5830
5861
  collectElements(ast.fragment ?? ast, source, elements, ast.options?.namespace === "svg");
5831
5862
  const interactiveNestings = [];
5832
5863
  collectInteractiveNestings(ast.fragment ?? ast, source, interactiveNestings, []);
5864
+ const ariaHiddenFocusables = [];
5865
+ collectAriaHiddenFocusables(ast.fragment ?? ast, source, ariaHiddenFocusables, []);
5833
5866
  const unnamedInteractive = [];
5834
5867
  const labelTargets = {
5835
5868
  ids: /* @__PURE__ */ new Set(),
@@ -6056,6 +6089,7 @@ function parseComponentFacts(source, filename) {
6056
6089
  ariaElements,
6057
6090
  elements,
6058
6091
  interactiveNestings,
6092
+ ariaHiddenFocusables,
6059
6093
  unnamedInteractive,
6060
6094
  unassociatedLabels,
6061
6095
  bulletTexts,
@@ -8511,6 +8545,21 @@ const a11yInteractiveNesting = componentRule({
8511
8545
  }))
8512
8546
  });
8513
8547
  //#endregion
8548
+ //#region src/rules/a11y/aria-hidden-focus.ts
8549
+ const a11yAriaHiddenFocus = componentRule({
8550
+ id: "a11y/aria-hidden-focus",
8551
+ title: "Focusable element hidden by aria-hidden",
8552
+ category: "a11y",
8553
+ label: "aria-hidden keeps focusables out",
8554
+ rationale: "An element inside `aria-hidden=\"true\"` stays keyboard-reachable while assistive technology announces nothing for it — a screen reader user lands on a control that does not exist for them. The author cannot see this defect: `aria-hidden` changes nothing visually, so only assistive-technology users ever encounter it.",
8555
+ recommendation: "Remove `aria-hidden`, or take the element out of the tab order too (`tabindex=\"-1\"`, `disabled`). To hide an inactive region such as a modal backdrop, prefer the `inert` attribute — it removes the subtree from both the accessibility tree and the tab order at once.",
8556
+ applies: (c) => (c.ariaHiddenFocusables ?? []).length > 0,
8557
+ bad: (c) => (c.ariaHiddenFocusables ?? []).map((f) => ({
8558
+ line: f.line,
8559
+ message: f.containerTag ? `<${f.tag}> inside <${f.containerTag} aria-hidden="true"> is still keyboard-focusable` : `<${f.tag} aria-hidden="true"> is still keyboard-focusable`
8560
+ }))
8561
+ });
8562
+ //#endregion
8514
8563
  //#region src/rules/a11y/accessible-name.ts
8515
8564
  const NAMING_ATTRS = /* @__PURE__ */ new Set([
8516
8565
  "title",
@@ -8838,7 +8887,8 @@ const a11yPatternTitle = componentRule({
8838
8887
  //#region src/html-spec/index.ts
8839
8888
  /** The HTML element's spec row; `undefined` for SVG (`svg:*`) and unknown names. */
8840
8889
  function htmlElement(tag) {
8841
- return HTML_SPEC.elements[tag.toLowerCase()];
8890
+ const key = tag.toLowerCase();
8891
+ return Object.hasOwn(HTML_SPEC.elements, key) ? HTML_SPEC.elements[key] : void 0;
8842
8892
  }
8843
8893
  /**
8844
8894
  * Whether the element is in WHATWG's obsolete-features list — the dataset's `obsolete` flag, which
@@ -8857,7 +8907,10 @@ function isObsoleteElement(tag) {
8857
8907
  * and the per-element table is where the dataset's per-attribute status lives.
8858
8908
  */
8859
8909
  function elementAttr(tag, name) {
8860
- return htmlElement(tag)?.attributes[name.toLowerCase()];
8910
+ const attrs = htmlElement(tag)?.attributes;
8911
+ if (!attrs) return void 0;
8912
+ const key = name.toLowerCase();
8913
+ return Object.hasOwn(attrs, key) ? attrs[key] : void 0;
8861
8914
  }
8862
8915
  /**
8863
8916
  * The dataset's `deprecated` (MDN-tracking) or `obsolete` (WHATWG) flag on this attribute for
@@ -8906,13 +8959,6 @@ const a11yDeprecatedAttr = componentRule({
8906
8959
  });
8907
8960
  //#endregion
8908
8961
  //#region src/rules/a11y/role-candidates.ts
8909
- /**
8910
- * Element-level ARIA facts that override the dataset's, with the reason each is data judgment
8911
- * rather than data (design 2026-08-19-aria-role-table-rules, "the spec wins over the dataset").
8912
- * `<hgroup>` is `generic` + naming-prohibited in the dataset; html-aria (TR and editor's draft) and
8913
- * axe give it `role=group` with no prohibition. Replacing the whole fact closes every arm at once.
8914
- * `<address>` is already `group` in the dataset and only its naming flag is wrong.
8915
- */
8916
8962
  const ELEMENT_FACT_OVERRIDES = {
8917
8963
  hgroup: { implicitRole: "group" },
8918
8964
  address: { implicitRole: "group" }
@@ -8935,9 +8981,9 @@ function roleCandidates(e) {
8935
8981
  } : void 0;
8936
8982
  }
8937
8983
  if (e.hasSpread) return void 0;
8938
- const el = HTML_SPEC.elements[e.tag];
8984
+ const el = Object.hasOwn(HTML_SPEC.elements, e.tag) ? HTML_SPEC.elements[e.tag] : void 0;
8939
8985
  if (!el) return void 0;
8940
- const aria = ELEMENT_FACT_OVERRIDES[e.tag] ?? el.aria;
8986
+ const aria = (Object.hasOwn(ELEMENT_FACT_OVERRIDES, e.tag) ? ELEMENT_FACT_OVERRIDES[e.tag] : void 0) ?? el.aria;
8941
8987
  const roles = [aria.implicitRole ?? false];
8942
8988
  for (const c of Object.values(aria.conditions ?? {})) if ("implicitRole" in c) roles.push(c.implicitRole ?? false);
8943
8989
  return {
@@ -9325,7 +9371,7 @@ function judgeContent(els, children, ancestors, childIdx) {
9325
9371
  const child = els[childIdx];
9326
9372
  for (let i = ancestors.length - 1; i >= 0; i--) {
9327
9373
  const holder = els[ancestors[i]];
9328
- const spec = HTML_SPEC.elements[holder.tag];
9374
+ const spec = Object.hasOwn(HTML_SPEC.elements, holder.tag) ? HTML_SPEC.elements[holder.tag] : void 0;
9329
9375
  if (!spec?.contentModel) return void 0;
9330
9376
  const cm = spec.contentModel;
9331
9377
  if (cm.contents === true) return void 0;
@@ -9857,6 +9903,7 @@ const allRules = [
9857
9903
  a11yRequiredAriaProps,
9858
9904
  a11yInvalidAriaValue,
9859
9905
  a11yInteractiveNesting,
9906
+ a11yAriaHiddenFocus,
9860
9907
  a11yAccessibleName,
9861
9908
  a11yLabelHasControl,
9862
9909
  a11yUseList,
@@ -10217,22 +10264,25 @@ function mdEscape(text) {
10217
10264
  return text.replace(/\r\n|\r|\n/g, " ").replace(/<[^>]+>/g, (tag) => inlineCode(tag)).replace(/\[([^\]]*)\]\(([^)]*)\)/g, "[$1]\\($2\\)");
10218
10265
  }
10219
10266
  /**
10220
- * Strip ANSI/OSC escape sequences and C0 control characters (except `\n`/`\t`) from a
10267
+ * Strip ANSI/OSC escape sequences and C0/C1 control characters (except `\n`/`\t`) from a
10221
10268
  * string before it reaches a terminal. POSIX file/route names can contain almost any
10222
10269
  * byte, so a hostile repo can smuggle a terminal-title rewrite, cursor move, or other
10223
10270
  * escape-sequence trick into what looks like plain report text.
10224
10271
  *
10225
- * Only OSC and CSI sequences are pattern-matched and removed whole (payload included) —
10226
- * those cover title-bar writes and cursor/screen control, the two classes with a real
10227
- * blast radius. Any other `ESC` byte (rarer single/two-byte forms like reset or
10228
- * save-cursor) falls through to the final C0 sweep below, which drops the lone `ESC`
10229
- * but — deliberately, not swallowing an adjacent legitimate character leaves whatever
10230
- * printable byte follows it as stray text.
10272
+ * OSC and CSI sequences are pattern-matched and removed whole (payload included) — those
10273
+ * cover title-bar writes and cursor/screen control, the two classes with a real blast
10274
+ * radius. Each is matched in both its two-byte `ESC` form and its single-codepoint C1
10275
+ * form (U+009D OSC, U+009B CSI C1 also interprets as `ESC ]`/`ESC [` on legacy/some
10276
+ * configured terminals), and OSC's terminator likewise accepts either `ESC \` or the
10277
+ * single-codepoint C1 ST (U+009C). Any other `ESC`/C1 byte (rarer single/two-byte forms
10278
+ * like reset or save-cursor) falls through to the final control sweep below, which drops
10279
+ * the lone control byte but — deliberately, not swallowing an adjacent legitimate
10280
+ * character — leaves whatever printable byte follows it as stray text.
10231
10281
  * ponytail: doesn't special-case every Fe escape form; broaden the CSI/OSC patterns if a
10232
10282
  * concrete non-CSI/OSC sequence turns out to matter.
10233
10283
  */
10234
10284
  function terminalSafe(text) {
10235
- return text.replace(/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)?/g, "").replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "").replace(/[\x00-\x08\x0b-\x1f\x7f]/g, "");
10285
+ return text.replace(/(?:\x1b\]|\x9d)[^\x07\x9c\x1b]*(?:\x07|\x9c|\x1b\\)?/g, "").replace(/(?:\x1b\[|\x9b)[0-?]*[ -/]*[@-~]/g, "").replace(/[\x00-\x08\x0b-\x1f\x7f-\x9f]/g, "");
10236
10286
  }
10237
10287
  //#endregion
10238
10288
  //#region src/reporter/markdown.ts
@@ -10329,4 +10379,4 @@ function formatMarkdownReport(results, config, meta) {
10329
10379
  return lines.join("\n");
10330
10380
  }
10331
10381
  //#endregion
10332
- export { architectureRouteComponentImport as $, seoOgTitle as $n, correctnessEachKey as $t, a11yAbbrTitle as A, validateRuleSetting as An, textFromNodes as At, a11yInteractiveNesting as B, performanceRenderBlockingScript as Bn, correctnessServerBrowserGlobal as Bt, a11yPermittedContents as C, intOption as Cn, attrText as Ct, a11yDeprecatedAttr as D, resolveRuleOptions as Dn, findAttr as Dt, a11yDisallowedAriaProps as E, mapOption as En, attrValueOf as Et, a11yRequireDatetime as F, overrideMatches as Fn, securityServerModuleState as Ft, performanceIframeLoading as G, performanceResponsiveImage as Gn, correctnessCheckableBindValue as Gt, a11yRequiredAriaProps as H, performanceFontPreloadCrossorigin as Hn, correctnessOrphanLifecycle as Ht, a11yPlaceholderLabelOption as I, selectRules as In, securityHandlerStateWrite as It, performanceLoadWaterfall as J, imageRule as Jn, correctnessPropMutation as Jt, performanceStateRaw as K, performanceImageLoadingHint as Kn, correctnessNonreactiveBuiltinState as Kt, a11yUseList as L, settingOptions as Ln, securityJavascriptUrl as Lt, a11yNoAutofocus as M, applyRuleSeverities as Mn, architecturePropCount as Mt, a11yNoAccesskey as N, compileOverrides as Nn, architectureComponentSize as Nt, a11yDeprecatedElement as O, shouldSkipRangeCheck as On, lineOf as Ot, a11yPositiveTabindex as P, formatFailedRuleWarning as Pn, securitySharedStateImport as Pt, architectureDocLinkTarget as Q, seoJsonLd as Qn, correctnessEachIndexKey as Qt, a11yLabelHasControl as R, settingSeverity as Rn, securityRawHtml as Rt, a11yRequiredElement as S, performancePreconnect as Sn, CHILD_NODE_KEYS as St, a11yDeprecatedAria as T, listOption as Tn, attrValue as Tt, a11yUnknownAriaAttribute as U, performancePreloadMissingAs as Un, correctnessOrphanEffect as Ut, a11yInvalidAriaValue as V, performanceLcpImage as Vn, correctnessBasePathNavigation as Vt, a11yInvalidRole as W, linkRule as Wn, correctnessAutoplayMuted as Wt, performanceNamespaceImport as X, seoSitemapXml as Xn, correctnessEffectAsOnMount as Xt, performanceMinifyDisabled as Y, seoHtmlLang as Yn, correctnessUnmutatedState as Yt, performanceHeavyImport as Z, seoRobotsTxt as Zn, correctnessEffectAsDerived as Zt, a11yNoMissingIdRef as _, seoViewport as _n, decodeFragmentId as _t, formatJsonReport as a, seoHreflang as an, classify as ar, collectTopLevelBindings as at, a11yDuplicateLandmark as b, seoTwitterCard as bn, splitTokens as bt, scoresByCategory as c, seoDescriptionLength as cn, summarize as cr, resolveRepoLocalPath as ct, messageText as d, seoJsonLdPlaceholder as dn, CATEGORIES as dr, collectSuppressions as dt, seoSsrDisabled as en, seoOgImage as er, architectureReservedNamePlacement as et, ruleMetaById as f, seoJsonLdDateFormat as fn, defaultConfig as fr, parseComponentFacts as ft, a11yUnverifiedIdRef as g, seoSitemapInRobots as gn, LANDMARK_ROLES as gt, explainRule as h, seoJsonLdValidity as hn, IDREF_ATTRS as ht, buildJsonReport as i, seoSingleH1 as in, seoTitlePresence as ir, architecturePrivateScopeImport as it, a11yNoDuplicateDt as j, applyOverrides as jn, valueFromNodes as jt, a11yPatternTitle as k, validateRuleOptions as kn, parseSvelte as kt, formatGithubReport as l, seoTitleLength as ln, docsUrlFor as lr, resolveRunesModuleSpecifier as lt, allRules as m, seoJsonLdDeprecatedType as mn, defineConfig as mr, unwrapTs as mt, mdEscape as n, seoDuplicateDescription as nn, seoDescriptionPresence as nr, architectureDirectoryNaming as nt, computeHealth as o, seoImageAlt as on, effectiveSeverity as or, parseInMemoryExports as ot, severityToSarifLevel as p, seoJsonLdRelativeUrl as pn, defaultProject as pr, parseModuleProgram as pt, performanceSequentialAwaits as q, performanceImageDimensions as qn, correctnessStalePropDerivation as qt, terminalSafe as r, seoDuplicateTitle as rn, headTagRule as rr, architectureUnitEntryFile as rt, computeScore as s, seoCharset as sn, hasFailureAtOrAbove as sr, parseKitModuleFacts as st, formatMarkdownReport as t, seoHeadingLevelSkip as tn, seoCanonicalUrl as tr, architectureReservedDirectoryNames as tt, SEVERITY_RANK as u, seoJsonLdRequiredProps as un, isPenalized as ur, collectNamedImportAliases as ut, a11yIdDuplication as v, seoOgUrl as vn, foldOccurrences as vt, a11yDisallowedElement as w, isMentionedAnywhere as wn, attrTextOf as wt, a11yDoctype as x, seoIndexability as xn, stripTextDirective as xt, a11yTopLevelLandmark as y, seoOgDescription as yn, isTopFragment as yt, a11yAccessibleName as z, withFailedRulesOff as zn, correctnessInstanceBrowserGlobal as zt };
10382
+ export { architectureDocLinkTarget as $, seoRobotsTxt as $n, correctnessEffectAsDerived as $t, a11yAbbrTitle as A, shouldSkipRangeCheck as An, lineOf as At, a11yAriaHiddenFocus as B, settingSeverity as Bn, securityRawHtml as Bt, a11yPermittedContents as C, seoIndexability as Cn, stripTextDirective as Ct, a11yDeprecatedAttr as D, listOption as Dn, attrValue as Dt, a11yDisallowedAriaProps as E, isMentionedAnywhere as En, attrTextOf as Et, a11yRequireDatetime as F, compileOverrides as Fn, architectureComponentSize as Ft, a11yInvalidRole as G, performancePreloadMissingAs as Gn, correctnessOrphanEffect as Gt, a11yInvalidAriaValue as H, performanceRenderBlockingScript as Hn, correctnessServerBrowserGlobal as Ht, a11yPlaceholderLabelOption as I, formatFailedRuleWarning as In, securitySharedStateImport as It, performanceSequentialAwaits as J, performanceImageLoadingHint as Jn, correctnessNonreactiveBuiltinState as Jt, performanceIframeLoading as K, linkRule as Kn, correctnessAutoplayMuted as Kt, a11yUseList as L, overrideMatches as Ln, securityServerModuleState as Lt, a11yNoAutofocus as M, validateRuleSetting as Mn, textFromNodes as Mt, a11yNoAccesskey as N, applyOverrides as Nn, valueFromNodes as Nt, a11yDeprecatedElement as O, mapOption as On, attrValueOf as Ot, a11yPositiveTabindex as P, applyRuleSeverities as Pn, architecturePropCount as Pt, performanceHeavyImport as Q, seoSitemapXml as Qn, correctnessEffectAsOnMount as Qt, a11yLabelHasControl as R, selectRules as Rn, securityHandlerStateWrite as Rt, a11yRequiredElement as S, seoTwitterCard as Sn, splitTokens as St, a11yDeprecatedAria as T, intOption as Tn, attrText as Tt, a11yRequiredAriaProps as U, performanceLcpImage as Un, correctnessBasePathNavigation as Ut, a11yInteractiveNesting as V, withFailedRulesOff as Vn, correctnessInstanceBrowserGlobal as Vt, a11yUnknownAriaAttribute as W, performanceFontPreloadCrossorigin as Wn, correctnessOrphanLifecycle as Wt, performanceMinifyDisabled as X, imageRule as Xn, correctnessPropMutation as Xt, performanceLoadWaterfall as Y, performanceImageDimensions as Yn, correctnessStalePropDerivation as Yt, performanceNamespaceImport as Z, seoHtmlLang as Zn, correctnessUnmutatedState as Zt, a11yNoMissingIdRef as _, seoJsonLdValidity as _n, IDREF_ATTRS as _t, formatJsonReport as a, seoDuplicateTitle as an, headTagRule as ar, architecturePrivateScopeImport as at, a11yDuplicateLandmark as b, seoOgUrl as bn, foldOccurrences as bt, scoresByCategory as c, seoImageAlt as cn, effectiveSeverity as cr, parseKitModuleFacts as ct, messageText as d, seoTitleLength as dn, docsUrlFor as dr, collectNamedImportAliases as dt, correctnessEachIndexKey as en, seoJsonLd as er, architectureRouteComponentImport as et, ruleMetaById as f, seoJsonLdRequiredProps as fn, isPenalized as fr, collectSuppressions as ft, a11yUnverifiedIdRef as g, seoJsonLdDeprecatedType as gn, defineConfig as gr, resolveRole as gt, explainRule as h, seoJsonLdRelativeUrl as hn, defaultProject as hr, unwrapTs as ht, buildJsonReport as i, seoDuplicateDescription as in, seoDescriptionPresence as ir, architectureUnitEntryFile as it, a11yNoDuplicateDt as j, validateRuleOptions as jn, parseSvelte as jt, a11yPatternTitle as k, resolveRuleOptions as kn, findAttr as kt, formatGithubReport as l, seoCharset as ln, hasFailureAtOrAbove as lr, resolveRepoLocalPath as lt, allRules as m, seoJsonLdDateFormat as mn, defaultConfig as mr, parseModuleProgram as mt, mdEscape as n, seoSsrDisabled as nn, seoOgImage as nr, architectureReservedDirectoryNames as nt, computeHealth as o, seoSingleH1 as on, seoTitlePresence as or, collectTopLevelBindings as ot, severityToSarifLevel as p, seoJsonLdPlaceholder as pn, CATEGORIES as pr, parseComponentFacts as pt, performanceStateRaw as q, performanceResponsiveImage as qn, correctnessCheckableBindValue as qt, terminalSafe as r, seoHeadingLevelSkip as rn, seoCanonicalUrl as rr, architectureDirectoryNaming as rt, computeScore as s, seoHreflang as sn, classify as sr, parseInMemoryExports as st, formatMarkdownReport as t, correctnessEachKey as tn, seoOgTitle as tr, architectureReservedNamePlacement as tt, SEVERITY_RANK as u, seoDescriptionLength as un, summarize as ur, resolveRunesModuleSpecifier as ut, a11yIdDuplication as v, seoSitemapInRobots as vn, LANDMARK_ROLES as vt, a11yDisallowedElement as w, performancePreconnect as wn, CHILD_NODE_KEYS as wt, a11yDoctype as x, seoOgDescription as xn, isTopFragment as xt, a11yTopLevelLandmark as y, seoViewport as yn, decodeFragmentId as yt, a11yAccessibleName as z, settingOptions as zn, securityJavascriptUrl as zt };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@svelte-vitals/core",
3
- "version": "0.49.0",
3
+ "version": "0.50.1",
4
4
  "description": "Shared, runtime-agnostic core for svelte-vitals (types, rule engine, scorer, reporter).",
5
5
  "type": "module",
6
6
  "license": "MIT",