@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 +8 -8
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/internal.d.ts +27 -10
- package/dist/internal.js +36 -10
- package/dist/{json-pC2tDNuR.d.ts → json-CcKHN-tx.d.ts} +12 -0
- package/dist/{markdown-CP5TPy-s.js → markdown-BBqqynv7.js} +93 -43
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -3,23 +3,23 @@
|
|
|
3
3
|
[](https://www.npmjs.com/package/@svelte-vitals/core)
|
|
4
4
|
[](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
|
|
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
|
|
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
|
|
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
|
|
19
|
-
| `@svelte-vitals/core/internal` | The engine, rules, fact collection, reporters, and scoring
|
|
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
|
|
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-
|
|
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 {
|
|
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 };
|
package/dist/internal.d.ts
CHANGED
|
@@ -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-
|
|
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
|
-
*
|
|
1031
|
-
*
|
|
1032
|
-
*
|
|
1033
|
-
*
|
|
1034
|
-
*
|
|
1035
|
-
*
|
|
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:
|
|
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
|
|
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
|
-
|
|
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
|
|
4392
|
-
const
|
|
4393
|
-
const
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
*
|
|
10226
|
-
*
|
|
10227
|
-
*
|
|
10228
|
-
*
|
|
10229
|
-
*
|
|
10230
|
-
*
|
|
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(
|
|
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 {
|
|
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 };
|