@drskillissue/ganko 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/rules-manifest.ts","../src/generated/rules-manifest.ts"],"sourcesContent":["/**\n * Standalone re-export of the generated rules manifest.\n *\n * Consumers that only need rule metadata (VS Code extension, docs, config\n * generators) can import from \"@drskillissue/ganko/rules-manifest\" to avoid pulling\n * in the full analysis engine and its heavy dependencies.\n */\nexport {\n RULES,\n RULES_BY_CATEGORY,\n RULE_CATEGORIES,\n getRule,\n} from \"./generated/rules-manifest\"\n\nexport type { RuleEntry } from \"./generated/rules-manifest\"\n","/**\n * AUTO-GENERATED — DO NOT EDIT\n *\n * Rule metadata manifest for all ganko rules.\n * Regenerate: bun run scripts/generate-rules-manifest.ts\n */\n\nimport type { RuleSeverityOverride } from \"@drskillissue/ganko-shared\"\n\n/** Rule category for grouping in configuration UIs and documentation. */\nexport type RuleCategory =\n | \"correctness\"\n | \"css-a11y\"\n | \"css-animation\"\n | \"css-cascade\"\n | \"css-jsx\"\n | \"css-layout\"\n | \"css-property\"\n | \"css-selector\"\n | \"css-structure\"\n | \"jsx\"\n | \"performance\"\n | \"reactivity\"\n | \"solid\"\n\n/** Plugin that owns the rule. */\nexport type RulePlugin =\n | \"cross-file\"\n | \"css\"\n | \"solid\"\n\n/** Static metadata for a single lint rule. */\nexport interface RuleEntry {\n readonly id: string\n readonly severity: RuleSeverityOverride\n readonly description: string\n readonly fixable: boolean\n readonly category: RuleCategory\n readonly plugin: RulePlugin\n readonly messages: Record<string, string>\n}\n\n/** Union of all rule IDs. */\nexport type RuleId =\n | \"avoid-conditional-spreads\"\n | \"avoid-non-null-assertions\"\n | \"avoid-object-assign\"\n | \"avoid-object-spread\"\n | \"avoid-type-casting\"\n | \"avoid-unsafe-type-annotations\"\n | \"event-handlers\"\n | \"missing-jsdoc-comments\"\n | \"no-ai-slop-comments\"\n | \"no-array-handlers\"\n | \"no-banner-comments\"\n | \"no-destructure\"\n | \"no-inline-imports\"\n | \"string-concat-in-loop\"\n | \"css-no-outline-none-without-focus-visible\"\n | \"css-policy-contrast\"\n | \"css-policy-spacing\"\n | \"css-policy-touch-target\"\n | \"css-policy-typography\"\n | \"css-require-reduced-motion-override\"\n | \"css-no-discrete-transition\"\n | \"css-no-empty-keyframes\"\n | \"no-layout-property-animation\"\n | \"no-transition-all\"\n | \"no-unknown-animation-name\"\n | \"no-unused-keyframes\"\n | \"declaration-no-overridden-within-rule\"\n | \"media-query-overlap-conflict\"\n | \"no-descending-specificity-conflict\"\n | \"no-layer-order-inversion\"\n | \"no-redundant-override-pairs\"\n | \"css-no-unreferenced-component-class\"\n | \"jsx-classlist-boolean-values\"\n | \"jsx-classlist-no-accessor-reference\"\n | \"jsx-classlist-no-constant-literals\"\n | \"jsx-classlist-static-keys\"\n | \"jsx-layout-classlist-geometry-toggle\"\n | \"jsx-layout-fill-image-parent-must-be-sized\"\n | \"jsx-layout-picture-source-ratio-consistency\"\n | \"jsx-layout-unstable-style-toggle\"\n | \"jsx-no-duplicate-class-token-class-classlist\"\n | \"jsx-no-undefined-css-class\"\n | \"jsx-style-kebab-case-keys\"\n | \"jsx-style-no-function-values\"\n | \"jsx-style-no-unused-custom-prop\"\n | \"jsx-style-policy\"\n | \"css-layout-animation-layout-property\"\n | \"css-layout-box-sizing-toggle-with-chrome\"\n | \"css-layout-conditional-display-collapse\"\n | \"css-layout-conditional-offset-shift\"\n | \"css-layout-conditional-white-space-wrap-shift\"\n | \"css-layout-content-visibility-no-intrinsic-size\"\n | \"css-layout-dynamic-slot-no-reserved-space\"\n | \"css-layout-font-swap-instability\"\n | \"css-layout-overflow-anchor-instability\"\n | \"css-layout-overflow-mode-toggle-instability\"\n | \"css-layout-scrollbar-gutter-instability\"\n | \"css-layout-sibling-alignment-outlier\"\n | \"css-layout-stateful-box-model-shift\"\n | \"css-layout-transition-layout-property\"\n | \"css-layout-unsized-replaced-element\"\n | \"css-no-custom-property-cycle\"\n | \"css-no-hardcoded-z-index\"\n | \"css-no-legacy-vh-100\"\n | \"css-z-index-requires-positioned-context\"\n | \"no-important\"\n | \"no-unresolved-custom-properties\"\n | \"no-unused-custom-properties\"\n | \"no-complex-selectors\"\n | \"no-duplicate-selectors\"\n | \"no-id-selectors\"\n | \"selector-max-attribute-and-universal\"\n | \"selector-max-specificity\"\n | \"css-no-empty-rule\"\n | \"css-no-unknown-container-name\"\n | \"css-no-unused-container-name\"\n | \"layer-requirement-for-component-rules\"\n | \"components-return-once\"\n | \"jsx-no-duplicate-props\"\n | \"jsx-no-script-url\"\n | \"jsx-no-undef\"\n | \"jsx-uses-vars\"\n | \"no-innerhtml\"\n | \"no-unknown-namespaces\"\n | \"show-truthy-conversion\"\n | \"suspense-boundary-missing\"\n | \"validate-jsx-nesting\"\n | \"avoid-arguments-object\"\n | \"avoid-chained-array-methods\"\n | \"avoid-defensive-copy-for-scalar-stat\"\n | \"avoid-delete-operator\"\n | \"avoid-function-allocation-in-hot-loop\"\n | \"avoid-hidden-class-transition\"\n | \"avoid-intermediate-map-copy\"\n | \"avoid-megamorphic-property-access\"\n | \"avoid-quadratic-pair-comparison\"\n | \"avoid-quadratic-spread\"\n | \"avoid-repeated-indexof-check\"\n | \"avoid-slice-sort-pattern\"\n | \"avoid-sparse-arrays\"\n | \"avoid-spread-sort-map-join-pipeline\"\n | \"bounded-worklist-traversal\"\n | \"closure-captured-scope\"\n | \"closure-dom-circular\"\n | \"create-root-dispose\"\n | \"detached-dom-reference\"\n | \"effect-outside-root\"\n | \"finalization-registry-leak\"\n | \"no-char-array-materialization\"\n | \"no-double-pass-delimiter-count\"\n | \"no-full-split-in-hot-parse\"\n | \"no-heavy-parser-constructor-in-loop\"\n | \"no-leaked-abort-controller\"\n | \"no-leaked-animation-frame\"\n | \"no-leaked-event-listener\"\n | \"no-leaked-observer\"\n | \"no-leaked-subscription\"\n | \"no-leaked-timer\"\n | \"no-loop-string-plus-equals\"\n | \"no-multipass-split-pipeline\"\n | \"no-per-char-substring-scan\"\n | \"no-repeated-token-normalization\"\n | \"no-rescan-indexof-loop\"\n | \"no-rest-slice-loop\"\n | \"no-shift-splice-head-consume\"\n | \"no-write-only-index\"\n | \"prefer-charcode-over-regex-test\"\n | \"prefer-index-scan-over-string-iterator\"\n | \"prefer-lazy-property-access\"\n | \"prefer-map-lookup-over-linear-scan\"\n | \"prefer-map-over-object-dictionary\"\n | \"prefer-precompiled-regex\"\n | \"prefer-set-has-over-equality-chain\"\n | \"prefer-set-lookup-in-loop\"\n | \"recursive-timer\"\n | \"self-referencing-store\"\n | \"unbounded-collection\"\n | \"unbounded-signal-accumulation\"\n | \"async-tracked\"\n | \"children-helper-misuse\"\n | \"cleanup-scope\"\n | \"derived-signal\"\n | \"effect-as-memo\"\n | \"effect-as-mount\"\n | \"inline-component\"\n | \"no-top-level-signal-call\"\n | \"ref-early-access\"\n | \"resource-access-unchecked\"\n | \"resource-refetch-loop\"\n | \"signal-call\"\n | \"signal-in-loop\"\n | \"store-reactive-break\"\n | \"transition-pending-unchecked\"\n | \"batch-optimization\"\n | \"imports\"\n | \"index-vs-for\"\n | \"no-react-deps\"\n | \"no-react-specific-props\"\n | \"prefer-for\"\n | \"prefer-memo-complex-styles\"\n | \"prefer-show\"\n | \"self-closing-comp\"\n | \"style-prop\"\n\n/** All rule metadata entries, sorted by category then id. */\nexport const RULES: readonly RuleEntry[] = [\n {\n \"id\": \"avoid-conditional-spreads\",\n \"severity\": \"error\",\n \"description\": \"Disallow conditional spread operators that create empty objects. Patterns like `...(condition ? {...} : {})` are fragile and create unnecessary object creations.\",\n \"fixable\": false,\n \"category\": \"correctness\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"avoidConditionalSpread\": \"Avoid conditional spread with empty object fallback. Instead of `...(cond ? {...} : {})`, build the object first with conditional property assignment, then spread once.\",\n \"avoidLogicalAndSpread\": \"Avoid logical AND spread pattern. Instead of `...(cond && {...})`, use explicit conditional property assignment for clarity.\"\n }\n },\n {\n \"id\": \"avoid-non-null-assertions\",\n \"severity\": \"error\",\n \"description\": \"Disallow non-null assertion operator (`!`). Use optional chaining, nullish coalescing, or proper type narrowing instead.\",\n \"fixable\": true,\n \"category\": \"correctness\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"avoidNonNull\": \"Avoid non-null assertion on \\\"{{name}}\\\". Non-null assertions bypass type safety. Use optional chaining (`?.`), nullish coalescing (`??`), or proper type narrowing instead.\"\n }\n },\n {\n \"id\": \"avoid-object-assign\",\n \"severity\": \"error\",\n \"description\": \"Disallow Object.assign(). Prefer object spread syntax or structuredClone() for copying objects.\",\n \"fixable\": true,\n \"category\": \"correctness\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"avoidMerge\": \"Avoid Object.assign() for merging. Use object spread syntax { ...obj } instead.\",\n \"avoidMutation\": \"Avoid Object.assign() for mutation. Consider immutable patterns like { ...existing, ...props }.\"\n }\n },\n {\n \"id\": \"avoid-object-spread\",\n \"severity\": \"error\",\n \"description\": \"Disallow object spread operators that break Solid's fine-grained reactivity.\",\n \"fixable\": true,\n \"category\": \"correctness\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"avoidObjectCopy\": \"Avoid object spread for copying. Use direct property access.\",\n \"avoidObjectMerge\": \"Avoid object spread for merging. Use mergeProps() from 'solid-js'.\",\n \"avoidObjectUpdate\": \"Avoid object spread for updates. Use produce() or direct assignment.\",\n \"avoidJsxSpread\": \"Avoid JSX prop spreading. Use splitProps() to separate props.\",\n \"avoidRestDestructure\": \"Avoid rest destructuring. Use splitProps() from 'solid-js'.\",\n \"avoidPropsSpread\": \"Spreading props breaks reactivity. Use splitProps() to separate known props.\",\n \"avoidStoreSpread\": \"Spreading store creates a static snapshot. Access properties directly.\",\n \"avoidSignalSpread\": \"Spreading signal result captures current value. Wrap in createMemo().\",\n \"avoidClassListSpread\": \"Spreading in classList breaks reactivity. Wrap in createMemo().\",\n \"avoidStyleSpread\": \"Spreading in style breaks reactivity. Wrap in createMemo().\",\n \"unnecessarySplitProps\": \"Unnecessary splitProps with empty array. Remove it and use {{source}} directly.\"\n }\n },\n {\n \"id\": \"avoid-type-casting\",\n \"severity\": \"error\",\n \"description\": \"Disallow type casting methods that bypass TypeScript's type safety. Includes unnecessary casts, double assertions, casting to any, type predicates, and unsafe generic assertions.\",\n \"fixable\": true,\n \"category\": \"correctness\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"unnecessaryCast\": \"Unnecessary type assertion: \\\"{{name}}\\\" is already of type \\\"{{exprType}}\\\", which is assignable to \\\"{{type}}\\\". Remove the cast - it adds noise and suggests you don't understand the types.\",\n \"doubleAssertion\": \"Double assertion detected: \\\"{{name}}\\\" is cast through unknown/any to \\\"{{type}}\\\". This bypasses type safety. You are creating sloppy architecture.\",\n \"castToAny\": \"Casting \\\"{{name}}\\\" to `any` disables all type checking. Use `unknown` with proper type guards, or fix the underlying type issue.\",\n \"castToUnknown\": \"Casting to `unknown` requires runtime type checks before use. You are creating sloppy architecture.\",\n \"simpleAssertion\": \"Type assertion on \\\"{{name}}\\\" to \\\"{{type}}\\\" bypasses type checking. Why are you doing this? Do you EVEN need this? This is sloppy architecture.\",\n \"assertionInLoop\": \"Type assertion on \\\"{{name}}\\\" inside a loop. Repeated casts to \\\"{{type}}\\\" without validation can mask type errors. Consider validating the type once before the loop.\",\n \"importAssertion\": \"Type assertion on dynamic import to \\\"{{type}}\\\". Import types should be validated at runtime or use proper module type declarations.\",\n \"typePredicate\": \"Type predicate function asserts \\\"{{param}}\\\" is \\\"{{type}}\\\". Why are you doing this? Do you EVEN need this? This is sloppy architecture.\",\n \"unsafeGeneric\": \"Casting to generic type parameter \\\"{{typeParam}}\\\" without runtime validation. The function returns an unverified type. This is sloppy architecture.\"\n }\n },\n {\n \"id\": \"avoid-unsafe-type-annotations\",\n \"severity\": \"error\",\n \"description\": \"Disallow `any` and `unknown` in value-level type annotation positions (parameters, returns, variables, properties)\",\n \"fixable\": false,\n \"category\": \"correctness\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"anyParameter\": \"Parameter '{{name}}' is typed `any`{{inFunction}}. This disables type checking for all callers. Use a specific type, a generic, or `unknown` with proper type narrowing.\",\n \"anyReturn\": \"Function '{{name}}' returns `any`. This disables type checking for all callers. Use a specific return type.\",\n \"anyVariable\": \"Variable '{{name}}' is typed `any`. This disables all type checking on this variable. Use a specific type or `unknown` with type narrowing.\",\n \"anyProperty\": \"Property '{{name}}' is typed `any`. This disables type checking for all accesses. Use a specific type.\",\n \"unknownParameter\": \"Parameter '{{name}}' is typed `unknown`{{inFunction}}. Callers can pass anything and the function body requires type narrowing on every use. Use a specific type or a generic constraint.\",\n \"unknownReturn\": \"Function '{{name}}' returns `unknown`. Callers must narrow the return value before use. Use a specific return type or a generic.\",\n \"unknownVariable\": \"Variable '{{name}}' is typed `unknown`. Every use requires type narrowing. Use a specific type or parse the value at the boundary.\",\n \"unknownProperty\": \"Property '{{name}}' is typed `unknown`. Every access requires type narrowing. Use a specific type.\"\n }\n },\n {\n \"id\": \"event-handlers\",\n \"severity\": \"error\",\n \"description\": \"Enforce naming DOM element event handlers consistently and prevent Solid's analysis from misunderstanding whether a prop should be an event handler.\",\n \"fixable\": true,\n \"category\": \"correctness\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"detectedAttr\": \"The \\\"{{name}}\\\" prop looks like an event handler but has a static value ({{staticValue}}), so Solid will treat it as an attribute instead of attaching an event listener. Use attr:{{name}} to make this explicit, or provide a function value.\",\n \"naming\": \"The \\\"{{name}}\\\" prop is ambiguous. Solid cannot determine if this is an event handler or an attribute. Use {{handlerName}} for an event handler, or {{attrName}} for an attribute.\",\n \"capitalization\": \"The \\\"{{name}}\\\" prop should be {{fixedName}} for Solid to recognize it as an event handler. Event handlers use camelCase with an uppercase letter after \\\"on\\\".\",\n \"nonstandard\": \"The \\\"{{name}}\\\" prop uses a nonstandard event name. Use {{fixedName}} instead, which is the standard DOM event name that Solid recognizes.\",\n \"makeHandler\": \"Change {{name}} to {{handlerName}} (event handler).\",\n \"makeAttr\": \"Change {{name}} to {{attrName}} (attribute).\",\n \"spreadHandler\": \"The \\\"{{name}}\\\" prop is being spread into JSX, which prevents Solid from attaching it as an event listener. Add it directly as a JSX attribute instead: {{name}}={...}.\"\n }\n },\n {\n \"id\": \"missing-jsdoc-comments\",\n \"severity\": \"error\",\n \"description\": \"Require JSDoc comments on functions with appropriate tags for parameters, return values, and throws.\",\n \"fixable\": false,\n \"category\": \"correctness\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"missingJsdoc\": \"Function '{{name}}' is missing a JSDoc comment.\",\n \"missingParam\": \"JSDoc for '{{name}}' is missing @param tag for '{{param}}'.\",\n \"missingReturn\": \"JSDoc for '{{name}}' is missing @returns tag.\",\n \"missingThrows\": \"JSDoc for '{{name}}' is missing @throws tag.\",\n \"missingExample\": \"JSDoc for '{{name}}' is missing @example tag.\",\n \"missingClassJsdoc\": \"Class '{{name}}' is missing a JSDoc comment.\",\n \"missingPropertyJsdoc\": \"Property '{{name}}' is missing a JSDoc comment.\"\n }\n },\n {\n \"id\": \"no-ai-slop-comments\",\n \"severity\": \"error\",\n \"description\": \"Disallow comments containing specified forbidden words or phrases. Useful for enforcing comment style guidelines and detecting AI-generated boilerplate.\",\n \"fixable\": true,\n \"category\": \"correctness\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"forbiddenWord\": \"Comment contains forbidden word '{{word}}'.\"\n }\n },\n {\n \"id\": \"no-array-handlers\",\n \"severity\": \"error\",\n \"description\": \"Disallow array handlers in JSX event properties.\",\n \"fixable\": false,\n \"category\": \"correctness\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"noArrayHandlers\": \"Passing an array to \\\"{{handlerName}}\\\" is type-unsafe. The array syntax `[handler, data]` passes data as the first argument, making the event object the second argument. Use a closure instead: `{{handlerName}}={() => handler(data)}`.\"\n }\n },\n {\n \"id\": \"no-banner-comments\",\n \"severity\": \"error\",\n \"description\": \"Disallow banner-style comments with repeated separator characters.\",\n \"fixable\": true,\n \"category\": \"correctness\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"banner\": \"Avoid banner-style comments with repeated separator characters. Use simple comments instead.\"\n }\n },\n {\n \"id\": \"no-destructure\",\n \"severity\": \"error\",\n \"description\": \"Disallow destructuring props in Solid components. Props must be accessed via property access (props.x) to preserve reactivity.\",\n \"fixable\": false,\n \"category\": \"correctness\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"noDestructure\": \"Destructuring component props breaks Solid's reactivity. Props are reactive getters, so `{ a }` captures the value at component creation time and won't update. Use `props.a` to access props reactively.\",\n \"noDestructureWithDefaults\": \"Destructuring component props breaks Solid's reactivity. For default values, use `mergeProps({ a: defaultValue }, props)` instead of `{ a = defaultValue }`.\",\n \"noDestructureWithRest\": \"Destructuring component props breaks Solid's reactivity. For rest patterns, use `splitProps(props, ['a', 'b'])` instead of `{ a, b, ...rest }`.\",\n \"noDestructureWithBoth\": \"Destructuring component props breaks Solid's reactivity. For default values with rest, use `splitProps(mergeProps({ a: defaultValue }, props), ['a'])` to combine both patterns.\"\n }\n },\n {\n \"id\": \"no-inline-imports\",\n \"severity\": \"error\",\n \"description\": \"Disallow inline type imports. Import types at the top of the file for clarity and maintainability.\",\n \"fixable\": false,\n \"category\": \"correctness\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"inlineImport\": \"Avoid inline imports. Import `{{specifier}}` at the top of the file instead.\"\n }\n },\n {\n \"id\": \"string-concat-in-loop\",\n \"severity\": \"error\",\n \"description\": \"Disallow string concatenation with += inside loops. Use array.push() and .join() instead.\",\n \"fixable\": false,\n \"category\": \"correctness\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"stringConcatInLoop\": \"Avoid string concatenation with += inside loops. Use an array with .push() and .join() instead.\"\n }\n },\n {\n \"id\": \"css-no-outline-none-without-focus-visible\",\n \"severity\": \"error\",\n \"description\": \"Disallow removing outline without explicit focus-visible replacement.\",\n \"fixable\": false,\n \"category\": \"css-a11y\",\n \"plugin\": \"css\",\n \"messages\": {\n \"missingFocusVisible\": \"Focus outline removed without matching `:focus-visible` replacement.\"\n }\n },\n {\n \"id\": \"css-policy-contrast\",\n \"severity\": \"warn\",\n \"description\": \"Enforce minimum contrast ratio between foreground and background colors per accessibility policy.\",\n \"fixable\": false,\n \"category\": \"css-a11y\",\n \"plugin\": \"css\",\n \"messages\": {\n \"insufficientContrast\": \"Contrast ratio `{{ratio}}:1` between `{{fg}}` and `{{bg}}` is below the minimum `{{min}}:1` for `{{textSize}}` text in policy `{{policy}}`.\"\n }\n },\n {\n \"id\": \"css-policy-spacing\",\n \"severity\": \"warn\",\n \"description\": \"Enforce minimum letter-spacing, word-spacing, and paragraph spacing per accessibility policy.\",\n \"fixable\": false,\n \"category\": \"css-a11y\",\n \"plugin\": \"css\",\n \"messages\": {\n \"letterSpacingTooSmall\": \"Letter spacing `{{value}}` ({{resolved}}em) is below the minimum `{{min}}em` for policy `{{policy}}`.\",\n \"wordSpacingTooSmall\": \"Word spacing `{{value}}` ({{resolved}}em) is below the minimum `{{min}}em` for policy `{{policy}}`.\",\n \"paragraphSpacingTooSmall\": \"Paragraph spacing `{{value}}` ({{resolved}}em) is below the minimum `{{min}}em` ({{minMultiplier}}× font-size) for policy `{{policy}}`.\"\n }\n },\n {\n \"id\": \"css-policy-touch-target\",\n \"severity\": \"warn\",\n \"description\": \"Enforce minimum interactive element sizes per accessibility policy.\",\n \"fixable\": false,\n \"category\": \"css-a11y\",\n \"plugin\": \"css\",\n \"messages\": {\n \"heightTooSmall\": \"`{{property}}` of `{{value}}` ({{resolved}}px) is below the minimum `{{min}}px` for `{{element}}` elements in policy `{{policy}}`.\",\n \"widthTooSmall\": \"`{{property}}` of `{{value}}` ({{resolved}}px) is below the minimum `{{min}}px` for `{{element}}` elements in policy `{{policy}}`.\",\n \"paddingTooSmall\": \"Horizontal padding `{{value}}` ({{resolved}}px) is below the minimum `{{min}}px` for `{{element}}` elements in policy `{{policy}}`.\"\n }\n },\n {\n \"id\": \"css-policy-typography\",\n \"severity\": \"warn\",\n \"description\": \"Enforce minimum font sizes and line heights per accessibility policy.\",\n \"fixable\": false,\n \"category\": \"css-a11y\",\n \"plugin\": \"css\",\n \"messages\": {\n \"fontTooSmall\": \"Font size `{{value}}` ({{resolved}}px) is below the `{{context}}` minimum of `{{min}}px` for policy `{{policy}}`.\",\n \"lineHeightTooSmall\": \"Line height `{{value}}` is below the `{{context}}` minimum of `{{min}}` for policy `{{policy}}`.\"\n }\n },\n {\n \"id\": \"css-require-reduced-motion-override\",\n \"severity\": \"warn\",\n \"description\": \"Require reduced-motion override for animated selectors.\",\n \"fixable\": false,\n \"category\": \"css-a11y\",\n \"plugin\": \"css\",\n \"messages\": {\n \"missingReducedMotion\": \"Animated selector `{{selector}}` lacks prefers-reduced-motion override.\"\n }\n },\n {\n \"id\": \"css-no-discrete-transition\",\n \"severity\": \"error\",\n \"description\": \"Disallow transitions on discrete CSS properties.\",\n \"fixable\": false,\n \"category\": \"css-animation\",\n \"plugin\": \"css\",\n \"messages\": {\n \"discreteTransition\": \"Property `{{property}}` is discrete and should not be transitioned.\"\n }\n },\n {\n \"id\": \"css-no-empty-keyframes\",\n \"severity\": \"error\",\n \"description\": \"Disallow empty @keyframes rules.\",\n \"fixable\": false,\n \"category\": \"css-animation\",\n \"plugin\": \"css\",\n \"messages\": {\n \"emptyKeyframes\": \"@keyframes `{{name}}` has no effective keyframes.\"\n }\n },\n {\n \"id\": \"no-layout-property-animation\",\n \"severity\": \"warn\",\n \"description\": \"Disallow animating layout-affecting properties.\",\n \"fixable\": false,\n \"category\": \"css-animation\",\n \"plugin\": \"css\",\n \"messages\": {\n \"avoidLayoutAnimation\": \"Avoid animating layout property `{{property}}`. Prefer transform or opacity to reduce layout thrashing.\"\n }\n },\n {\n \"id\": \"no-transition-all\",\n \"severity\": \"warn\",\n \"description\": \"Disallow transition: all and transition-property: all.\",\n \"fixable\": false,\n \"category\": \"css-animation\",\n \"plugin\": \"css\",\n \"messages\": {\n \"avoidTransitionAll\": \"Avoid `transition: all`. Transition specific properties to reduce unnecessary style and paint work.\"\n }\n },\n {\n \"id\": \"no-unknown-animation-name\",\n \"severity\": \"error\",\n \"description\": \"Disallow animation names that do not match declared keyframes.\",\n \"fixable\": false,\n \"category\": \"css-animation\",\n \"plugin\": \"css\",\n \"messages\": {\n \"unknownAnimationName\": \"Animation name `{{name}}` in `{{property}}` does not match any declared @keyframes.\"\n }\n },\n {\n \"id\": \"no-unused-keyframes\",\n \"severity\": \"warn\",\n \"description\": \"Disallow unused @keyframes declarations.\",\n \"fixable\": false,\n \"category\": \"css-animation\",\n \"plugin\": \"css\",\n \"messages\": {\n \"unusedKeyframes\": \"@keyframes `{{name}}` is never referenced by animation declarations.\"\n }\n },\n {\n \"id\": \"declaration-no-overridden-within-rule\",\n \"severity\": \"warn\",\n \"description\": \"Disallow duplicate declarations of the same property within a single rule block.\",\n \"fixable\": false,\n \"category\": \"css-cascade\",\n \"plugin\": \"css\",\n \"messages\": {\n \"overriddenWithinRule\": \"Declaration `{{property}}` is overridden later in the same rule. Keep one final declaration per property.\"\n }\n },\n {\n \"id\": \"media-query-overlap-conflict\",\n \"severity\": \"warn\",\n \"description\": \"Disallow conflicting declarations in partially overlapping media queries.\",\n \"fixable\": false,\n \"category\": \"css-cascade\",\n \"plugin\": \"css\",\n \"messages\": {\n \"mediaOverlapConflict\": \"Overlapping media queries set different `{{property}}` values for `{{selector}}` in the same overlap range.\"\n }\n },\n {\n \"id\": \"no-descending-specificity-conflict\",\n \"severity\": \"warn\",\n \"description\": \"Disallow lower-specificity selectors after higher-specificity selectors for the same property.\",\n \"fixable\": false,\n \"category\": \"css-cascade\",\n \"plugin\": \"css\",\n \"messages\": {\n \"descendingSpecificity\": \"Lower-specificity selector `{{laterSelector}}` appears after `{{earlierSelector}}` for `{{property}}`, creating brittle cascade behavior.\"\n }\n },\n {\n \"id\": \"no-layer-order-inversion\",\n \"severity\": \"warn\",\n \"description\": \"Disallow source-order assumptions that are inverted by layer precedence.\",\n \"fixable\": false,\n \"category\": \"css-cascade\",\n \"plugin\": \"css\",\n \"messages\": {\n \"layerOrderInversion\": \"Declaration for `{{property}}` in selector `{{selector}}` appears later but is overridden by an earlier declaration due to @layer precedence.\"\n }\n },\n {\n \"id\": \"no-redundant-override-pairs\",\n \"severity\": \"warn\",\n \"description\": \"Disallow declarations that are deterministically overridden in the same selector context.\",\n \"fixable\": false,\n \"category\": \"css-cascade\",\n \"plugin\": \"css\",\n \"messages\": {\n \"redundantOverride\": \"Declaration `{{property}}` is always overridden later by the same selector in the same cascade context.\"\n }\n },\n {\n \"id\": \"css-no-unreferenced-component-class\",\n \"severity\": \"warn\",\n \"description\": \"Detect CSS classes that are never referenced by static JSX class attributes.\",\n \"fixable\": false,\n \"category\": \"css-jsx\",\n \"plugin\": \"cross-file\",\n \"messages\": {\n \"unreferencedClass\": \"CSS class '{{className}}' is defined but not referenced by static JSX class attributes\"\n }\n },\n {\n \"id\": \"jsx-classlist-boolean-values\",\n \"severity\": \"error\",\n \"description\": \"Require classList values to be boolean-like expressions.\",\n \"fixable\": false,\n \"category\": \"css-jsx\",\n \"plugin\": \"cross-file\",\n \"messages\": {\n \"nonBooleanValue\": \"classList value for `{{name}}` must be boolean.\"\n }\n },\n {\n \"id\": \"jsx-classlist-no-accessor-reference\",\n \"severity\": \"error\",\n \"description\": \"Disallow passing accessor references directly as classList values.\",\n \"fixable\": false,\n \"category\": \"css-jsx\",\n \"plugin\": \"cross-file\",\n \"messages\": {\n \"accessorReference\": \"Signal accessor `{{name}}` must be called in classList value (use {{name}}()).\"\n }\n },\n {\n \"id\": \"jsx-classlist-no-constant-literals\",\n \"severity\": \"warn\",\n \"description\": \"Disallow classList entries with constant true/false values.\",\n \"fixable\": false,\n \"category\": \"css-jsx\",\n \"plugin\": \"cross-file\",\n \"messages\": {\n \"constantEntry\": \"classList entry `{{name}}: {{value}}` is constant; move it to static class.\"\n }\n },\n {\n \"id\": \"jsx-classlist-static-keys\",\n \"severity\": \"error\",\n \"description\": \"Require classList keys to be static and non-computed.\",\n \"fixable\": false,\n \"category\": \"css-jsx\",\n \"plugin\": \"cross-file\",\n \"messages\": {\n \"nonStaticKey\": \"classList key must be statically known for reliable class mapping.\"\n }\n },\n {\n \"id\": \"jsx-layout-classlist-geometry-toggle\",\n \"severity\": \"warn\",\n \"description\": \"Flag classList-driven class toggles that map to layout-affecting CSS geometry changes.\",\n \"fixable\": false,\n \"category\": \"css-jsx\",\n \"plugin\": \"cross-file\",\n \"messages\": {\n \"classListGeometryToggle\": \"classList toggles '{{className}}', and matching CSS changes layout-affecting '{{property}}', which can cause CLS.\"\n }\n },\n {\n \"id\": \"jsx-layout-fill-image-parent-must-be-sized\",\n \"severity\": \"warn\",\n \"description\": \"Require stable parent size and positioning for fill-image component usage.\",\n \"fixable\": false,\n \"category\": \"css-jsx\",\n \"plugin\": \"cross-file\",\n \"messages\": {\n \"unsizedFillParent\": \"Fill-image component '{{component}}' is inside a parent without stable size/position; add parent sizing (height/min-height/aspect-ratio) and non-static position to avoid CLS.\"\n }\n },\n {\n \"id\": \"jsx-layout-picture-source-ratio-consistency\",\n \"severity\": \"warn\",\n \"description\": \"Require consistent intrinsic aspect ratios across <picture> sources and fallback image.\",\n \"fixable\": false,\n \"category\": \"css-jsx\",\n \"plugin\": \"cross-file\",\n \"messages\": {\n \"inconsistentPictureRatio\": \"`<picture>` source ratio {{sourceRatio}} differs from fallback img ratio {{imgRatio}}, which can cause reserved-space mismatch and CLS.\"\n }\n },\n {\n \"id\": \"jsx-layout-unstable-style-toggle\",\n \"severity\": \"warn\",\n \"description\": \"Flag dynamic inline style values on layout-sensitive properties that can trigger CLS.\",\n \"fixable\": false,\n \"category\": \"css-jsx\",\n \"plugin\": \"cross-file\",\n \"messages\": {\n \"unstableLayoutStyleToggle\": \"Dynamic style value for '{{property}}' can toggle layout geometry at runtime and cause CLS.\"\n }\n },\n {\n \"id\": \"jsx-no-duplicate-class-token-class-classlist\",\n \"severity\": \"warn\",\n \"description\": \"Disallow duplicate class tokens between class and classList on the same JSX element.\",\n \"fixable\": false,\n \"category\": \"css-jsx\",\n \"plugin\": \"cross-file\",\n \"messages\": {\n \"duplicateClassToken\": \"Class token `{{name}}` appears in both class and classList.\"\n }\n },\n {\n \"id\": \"jsx-no-undefined-css-class\",\n \"severity\": \"error\",\n \"description\": \"Detect undefined CSS class names in JSX\",\n \"fixable\": false,\n \"category\": \"css-jsx\",\n \"plugin\": \"cross-file\",\n \"messages\": {\n \"undefinedClass\": \"CSS class '{{className}}' is not defined in project CSS files\"\n }\n },\n {\n \"id\": \"jsx-style-kebab-case-keys\",\n \"severity\": \"error\",\n \"description\": \"Require kebab-case keys in JSX style object literals.\",\n \"fixable\": false,\n \"category\": \"css-jsx\",\n \"plugin\": \"cross-file\",\n \"messages\": {\n \"kebabStyleKey\": \"Style key `{{name}}` should be `{{kebab}}` in Solid style objects.\"\n }\n },\n {\n \"id\": \"jsx-style-no-function-values\",\n \"severity\": \"error\",\n \"description\": \"Disallow function values in JSX style objects.\",\n \"fixable\": false,\n \"category\": \"css-jsx\",\n \"plugin\": \"cross-file\",\n \"messages\": {\n \"functionStyleValue\": \"Style value for `{{name}}` is a function; pass computed value instead.\"\n }\n },\n {\n \"id\": \"jsx-style-no-unused-custom-prop\",\n \"severity\": \"warn\",\n \"description\": \"Detect inline style custom properties that are never consumed by CSS var() references.\",\n \"fixable\": false,\n \"category\": \"css-jsx\",\n \"plugin\": \"cross-file\",\n \"messages\": {\n \"unusedInlineVar\": \"Inline custom property `{{name}}` is never read via var({{name}}).\"\n }\n },\n {\n \"id\": \"jsx-style-policy\",\n \"severity\": \"warn\",\n \"description\": \"Enforce accessibility policy thresholds on inline JSX style objects.\",\n \"fixable\": false,\n \"category\": \"css-jsx\",\n \"plugin\": \"cross-file\",\n \"messages\": {\n \"fontTooSmall\": \"Inline style `{{prop}}: {{value}}` ({{resolved}}px) is below the minimum `{{min}}px` for policy `{{policy}}`.\",\n \"lineHeightTooSmall\": \"Inline style `line-height: {{value}}` is below the minimum `{{min}}` for policy `{{policy}}`.\",\n \"heightTooSmall\": \"Inline style `{{prop}}: {{value}}` ({{resolved}}px) is below the minimum `{{min}}px` for interactive elements in policy `{{policy}}`.\",\n \"letterSpacingTooSmall\": \"Inline style `letter-spacing: {{value}}` ({{resolved}}em) is below the minimum `{{min}}em` for policy `{{policy}}`.\",\n \"wordSpacingTooSmall\": \"Inline style `word-spacing: {{value}}` ({{resolved}}em) is below the minimum `{{min}}em` for policy `{{policy}}`.\"\n }\n },\n {\n \"id\": \"css-layout-animation-layout-property\",\n \"severity\": \"warn\",\n \"description\": \"Disallow keyframe animations that mutate layout-affecting properties and can trigger CLS.\",\n \"fixable\": false,\n \"category\": \"css-layout\",\n \"plugin\": \"cross-file\",\n \"messages\": {\n \"animationLayoutProperty\": \"Animation '{{animation}}' mutates layout-affecting '{{property}}', which can trigger CLS. Prefer transform/opacity or reserve geometry.\"\n }\n },\n {\n \"id\": \"css-layout-box-sizing-toggle-with-chrome\",\n \"severity\": \"warn\",\n \"description\": \"Disallow conditional box-sizing mode toggles when box chrome contributes to geometry shifts.\",\n \"fixable\": false,\n \"category\": \"css-layout\",\n \"plugin\": \"cross-file\",\n \"messages\": {\n \"boxSizingToggleWithChrome\": \"Conditional `box-sizing` toggle on '{{tag}}' combines with non-zero padding/border, which can shift layout and trigger CLS.\"\n }\n },\n {\n \"id\": \"css-layout-conditional-display-collapse\",\n \"severity\": \"warn\",\n \"description\": \"Disallow conditional display collapse in flow without reserved geometry.\",\n \"fixable\": false,\n \"category\": \"css-layout\",\n \"plugin\": \"cross-file\",\n \"messages\": {\n \"conditionalDisplayCollapse\": \"Conditional display sets '{{display}}' on '{{tag}}' without stable reserved space, which can collapse/expand layout and cause CLS.\"\n }\n },\n {\n \"id\": \"css-layout-conditional-offset-shift\",\n \"severity\": \"warn\",\n \"description\": \"Disallow conditional non-zero block-axis offsets that can trigger layout shifts.\",\n \"fixable\": false,\n \"category\": \"css-layout\",\n \"plugin\": \"cross-file\",\n \"messages\": {\n \"conditionalOffsetShift\": \"Conditional style applies non-zero '{{property}}' offset ({{value}}), which can cause layout shifts when conditions toggle.\"\n }\n },\n {\n \"id\": \"css-layout-conditional-white-space-wrap-shift\",\n \"severity\": \"warn\",\n \"description\": \"Disallow conditional white-space wrapping mode toggles that can trigger CLS.\",\n \"fixable\": false,\n \"category\": \"css-layout\",\n \"plugin\": \"cross-file\",\n \"messages\": {\n \"conditionalWhiteSpaceShift\": \"Conditional white-space '{{whiteSpace}}' on '{{tag}}' can reflow text and shift siblings; keep wrapping behavior stable or reserve geometry.\"\n }\n },\n {\n \"id\": \"css-layout-content-visibility-no-intrinsic-size\",\n \"severity\": \"warn\",\n \"description\": \"Require intrinsic size reservation when using content-visibility auto to avoid late layout shifts.\",\n \"fixable\": false,\n \"category\": \"css-layout\",\n \"plugin\": \"cross-file\",\n \"messages\": {\n \"missingIntrinsicSize\": \"`content-visibility: auto` on '{{tag}}' lacks intrinsic size reservation (`contain-intrinsic-size`/min-height/height/aspect-ratio), which can cause CLS.\"\n }\n },\n {\n \"id\": \"css-layout-dynamic-slot-no-reserved-space\",\n \"severity\": \"warn\",\n \"description\": \"Require reserved block space for dynamic content containers to avoid layout shifts.\",\n \"fixable\": false,\n \"category\": \"css-layout\",\n \"plugin\": \"cross-file\",\n \"messages\": {\n \"dynamicSlotNoReservedSpace\": \"Dynamic content container '{{tag}}' does not reserve block space (min-height/height/aspect-ratio/contain-intrinsic-size), which can cause CLS.\"\n }\n },\n {\n \"id\": \"css-layout-font-swap-instability\",\n \"severity\": \"warn\",\n \"description\": \"Require metric overrides for swapping webfonts to reduce layout shifts during font load.\",\n \"fixable\": false,\n \"category\": \"css-layout\",\n \"plugin\": \"cross-file\",\n \"messages\": {\n \"unstableFontSwap\": \"`@font-face` for '{{family}}' uses `font-display: {{display}}` without metric overrides (for example `size-adjust`), which can cause CLS when the webfont swaps in.\"\n }\n },\n {\n \"id\": \"css-layout-overflow-anchor-instability\",\n \"severity\": \"warn\",\n \"description\": \"Disallow overflow-anchor none on dynamic or scrollable containers prone to visible layout shifts.\",\n \"fixable\": false,\n \"category\": \"css-layout\",\n \"plugin\": \"cross-file\",\n \"messages\": {\n \"unstableOverflowAnchor\": \"Element '{{tag}}' sets `overflow-anchor: none` on a {{context}} container; disabling scroll anchoring can amplify visible layout shifts.\"\n }\n },\n {\n \"id\": \"css-layout-overflow-mode-toggle-instability\",\n \"severity\": \"warn\",\n \"description\": \"Disallow conditional overflow mode switches that can introduce scrollbar-induced layout shifts.\",\n \"fixable\": false,\n \"category\": \"css-layout\",\n \"plugin\": \"cross-file\",\n \"messages\": {\n \"overflowModeToggle\": \"Conditional overflow mode changes scrolling ('{{overflow}}') on '{{tag}}' without `scrollbar-gutter: stable`, which can trigger CLS.\"\n }\n },\n {\n \"id\": \"css-layout-scrollbar-gutter-instability\",\n \"severity\": \"warn\",\n \"description\": \"Require stable scrollbar gutters for scrollable containers to reduce layout shifts.\",\n \"fixable\": false,\n \"category\": \"css-layout\",\n \"plugin\": \"cross-file\",\n \"messages\": {\n \"missingScrollbarGutter\": \"Scrollable container '{{tag}}' uses overflow auto/scroll without `scrollbar-gutter: stable`, which can trigger CLS when scrollbars appear.\"\n }\n },\n {\n \"id\": \"css-layout-sibling-alignment-outlier\",\n \"severity\": \"warn\",\n \"description\": \"Detect vertical alignment outliers between sibling elements in shared layout containers.\",\n \"fixable\": false,\n \"category\": \"css-layout\",\n \"plugin\": \"cross-file\",\n \"messages\": {\n \"misalignedSibling\": \"Element '{{subject}}' appears vertically misaligned relative to sibling cohort in '{{parent}}' (context {{context}}, severity {{severity}}, confidence {{confidence}}{{offsetClause}}; causes: {{causes}}).\"\n }\n },\n {\n \"id\": \"css-layout-stateful-box-model-shift\",\n \"severity\": \"warn\",\n \"description\": \"Disallow stateful selector changes that alter element geometry and trigger layout shifts.\",\n \"fixable\": false,\n \"category\": \"css-layout\",\n \"plugin\": \"cross-file\",\n \"messages\": {\n \"statefulBoxModelShift\": \"State selector '{{selector}}' changes layout-affecting '{{property}}'. Keep geometry stable across states to avoid CLS.\"\n }\n },\n {\n \"id\": \"css-layout-transition-layout-property\",\n \"severity\": \"warn\",\n \"description\": \"Disallow transitions that animate layout-affecting geometry properties.\",\n \"fixable\": false,\n \"category\": \"css-layout\",\n \"plugin\": \"cross-file\",\n \"messages\": {\n \"transitionLayoutProperty\": \"Transition '{{property}}' in '{{declaration}}' animates layout-affecting geometry. Prefer transform/opacity to avoid CLS.\"\n }\n },\n {\n \"id\": \"css-layout-unsized-replaced-element\",\n \"severity\": \"warn\",\n \"description\": \"Require stable reserved geometry for replaced media elements to prevent layout shifts.\",\n \"fixable\": false,\n \"category\": \"css-layout\",\n \"plugin\": \"cross-file\",\n \"messages\": {\n \"unsizedReplacedElement\": \"Replaced element '{{tag}}' has no stable reserved size (width/height or aspect-ratio with a dimension), which can cause CLS.\"\n }\n },\n {\n \"id\": \"css-no-custom-property-cycle\",\n \"severity\": \"error\",\n \"description\": \"Disallow cycles in custom property references.\",\n \"fixable\": false,\n \"category\": \"css-property\",\n \"plugin\": \"css\",\n \"messages\": {\n \"variableCycle\": \"Custom property cycle detected involving `{{name}}`.\"\n }\n },\n {\n \"id\": \"css-no-hardcoded-z-index\",\n \"severity\": \"warn\",\n \"description\": \"Disallow hardcoded positive z-index literals.\",\n \"fixable\": false,\n \"category\": \"css-property\",\n \"plugin\": \"css\",\n \"messages\": {\n \"hardcodedZ\": \"Use a z-index token variable instead of literal `{{value}}`.\"\n }\n },\n {\n \"id\": \"css-no-legacy-vh-100\",\n \"severity\": \"warn\",\n \"description\": \"Disallow 100vh in viewport sizing declarations.\",\n \"fixable\": false,\n \"category\": \"css-property\",\n \"plugin\": \"css\",\n \"messages\": {\n \"avoidLegacyVh\": \"Use 100dvh/100svh instead of `100vh` for mobile-safe viewport sizing.\"\n }\n },\n {\n \"id\": \"css-z-index-requires-positioned-context\",\n \"severity\": \"warn\",\n \"description\": \"Require positioned context when using z-index.\",\n \"fixable\": false,\n \"category\": \"css-property\",\n \"plugin\": \"css\",\n \"messages\": {\n \"zIndexNoContext\": \"`z-index` has no guaranteed effect without a positioned context.\"\n }\n },\n {\n \"id\": \"no-important\",\n \"severity\": \"warn\",\n \"description\": \"Disallow !important declarations.\",\n \"fixable\": false,\n \"category\": \"css-property\",\n \"plugin\": \"css\",\n \"messages\": {\n \"avoidImportant\": \"Avoid `!important` on `{{property}}`. It increases override cost and usually signals specificity debt.\"\n }\n },\n {\n \"id\": \"no-unresolved-custom-properties\",\n \"severity\": \"error\",\n \"description\": \"Disallow unresolved custom property references.\",\n \"fixable\": false,\n \"category\": \"css-property\",\n \"plugin\": \"css\",\n \"messages\": {\n \"unresolvedCustomProperty\": \"Custom property reference `{{name}}` is unresolved in `{{property}}`. Define it or provide a fallback value.\"\n }\n },\n {\n \"id\": \"no-unused-custom-properties\",\n \"severity\": \"warn\",\n \"description\": \"Disallow unused CSS custom properties.\",\n \"fixable\": false,\n \"category\": \"css-property\",\n \"plugin\": \"css\",\n \"messages\": {\n \"unusedCustomProperty\": \"Custom property `{{name}}` is never referenced within the project CSS.\"\n }\n },\n {\n \"id\": \"no-complex-selectors\",\n \"severity\": \"warn\",\n \"description\": \"Disallow deep selectors that are expensive to match.\",\n \"fixable\": false,\n \"category\": \"css-selector\",\n \"plugin\": \"css\",\n \"messages\": {\n \"selectorTooDeep\": \"Selector `{{selector}}` has depth {{depth}}. Deep selectors increase style recalculation cost and are fragile across component rerenders.\"\n }\n },\n {\n \"id\": \"no-duplicate-selectors\",\n \"severity\": \"warn\",\n \"description\": \"Disallow duplicate selector blocks.\",\n \"fixable\": false,\n \"category\": \"css-selector\",\n \"plugin\": \"css\",\n \"messages\": {\n \"duplicateSelector\": \"Selector `{{selector}}` is duplicated {{count}} times. Merge declarations to avoid cascade ambiguity.\"\n }\n },\n {\n \"id\": \"no-id-selectors\",\n \"severity\": \"warn\",\n \"description\": \"Disallow ID selectors.\",\n \"fixable\": false,\n \"category\": \"css-selector\",\n \"plugin\": \"css\",\n \"messages\": {\n \"avoidId\": \"Avoid ID selector in `{{selector}}`. IDs raise specificity and make component-level styling harder to maintain.\"\n }\n },\n {\n \"id\": \"selector-max-attribute-and-universal\",\n \"severity\": \"off\",\n \"description\": \"Disallow selectors with attribute or universal selectors beyond configured limits.\",\n \"fixable\": false,\n \"category\": \"css-selector\",\n \"plugin\": \"css\",\n \"messages\": {\n \"tooManyAttributes\": \"Selector `{{selector}}` uses {{count}} attribute selector(s). Maximum allowed is {{max}}.\",\n \"tooManyUniversals\": \"Selector `{{selector}}` uses {{count}} universal selector(s). Maximum allowed is {{max}}.\"\n }\n },\n {\n \"id\": \"selector-max-specificity\",\n \"severity\": \"warn\",\n \"description\": \"Disallow selectors that exceed a specificity threshold.\",\n \"fixable\": false,\n \"category\": \"css-selector\",\n \"plugin\": \"css\",\n \"messages\": {\n \"maxSpecificity\": \"Selector `{{selector}}` specificity {{specificity}} exceeds max {{max}}. Reduce selector weight to keep the cascade predictable.\"\n }\n },\n {\n \"id\": \"css-no-empty-rule\",\n \"severity\": \"warn\",\n \"description\": \"Disallow empty CSS rules.\",\n \"fixable\": false,\n \"category\": \"css-structure\",\n \"plugin\": \"css\",\n \"messages\": {\n \"emptyRule\": \"Empty rule `{{selector}}` should be removed.\"\n }\n },\n {\n \"id\": \"css-no-unknown-container-name\",\n \"severity\": \"error\",\n \"description\": \"Disallow unknown named containers in @container queries.\",\n \"fixable\": false,\n \"category\": \"css-structure\",\n \"plugin\": \"css\",\n \"messages\": {\n \"unknownContainer\": \"Unknown container name `{{name}}` in @container query.\"\n }\n },\n {\n \"id\": \"css-no-unused-container-name\",\n \"severity\": \"warn\",\n \"description\": \"Disallow unused named containers.\",\n \"fixable\": false,\n \"category\": \"css-structure\",\n \"plugin\": \"css\",\n \"messages\": {\n \"unusedContainer\": \"Container name `{{name}}` is declared but never queried.\"\n }\n },\n {\n \"id\": \"layer-requirement-for-component-rules\",\n \"severity\": \"warn\",\n \"description\": \"Require style rules to be inside @layer when the file defines layers.\",\n \"fixable\": false,\n \"category\": \"css-structure\",\n \"plugin\": \"css\",\n \"messages\": {\n \"missingLayer\": \"Rule `{{selector}}` is not inside any @layer block while this file uses @layer. Place component rules inside an explicit layer.\"\n }\n },\n {\n \"id\": \"components-return-once\",\n \"severity\": \"error\",\n \"description\": \"Disallow early returns in components. Solid components only run once, and so conditionals should be inside JSX.\",\n \"fixable\": true,\n \"category\": \"jsx\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"noEarlyReturn\": \"Early returns in Solid components break reactivity because the component function only runs once. Use <Show> or <Switch>/<Match> inside the JSX to conditionally render content instead of returning early from the function.\",\n \"noConditionalReturn\": \"Conditional expressions in return statements break reactivity because Solid components only run once. Wrap the condition in <Show when={...}> for a single condition, or <Switch>/<Match> for multiple conditions.\"\n }\n },\n {\n \"id\": \"jsx-no-duplicate-props\",\n \"severity\": \"error\",\n \"description\": \"Disallow passing the same prop twice in JSX.\",\n \"fixable\": true,\n \"category\": \"jsx\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"noDuplicateProps\": \"Duplicate prop detected. Each prop should only be specified once; the second value will override the first.\",\n \"noDuplicateClass\": \"Duplicate `class` prop detected. While this might appear to work, it can break unexpectedly because only one class binding is applied. Use `classList` to conditionally apply multiple classes.\",\n \"noDuplicateChildren\": \"Conflicting children: {{used}}. Only one method of setting children is allowed at a time.\"\n }\n },\n {\n \"id\": \"jsx-no-script-url\",\n \"severity\": \"error\",\n \"description\": \"Disallow javascript: URLs.\",\n \"fixable\": true,\n \"category\": \"jsx\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"noJSURL\": \"Using javascript: URLs is a security risk because it can enable cross-site scripting (XSS) attacks. Use an event handler like onClick instead, or navigate programmatically with useNavigate().\"\n }\n },\n {\n \"id\": \"jsx-no-undef\",\n \"severity\": \"error\",\n \"description\": \"Disallow references to undefined variables in JSX. Handles custom directives.\",\n \"fixable\": false,\n \"category\": \"jsx\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"customDirectiveUndefined\": \"Custom directive '{{identifier}}' is not defined. Directives must be imported or declared in scope before use (e.g., `const {{identifier}} = (el, accessor) => { ... }`).\"\n }\n },\n {\n \"id\": \"jsx-uses-vars\",\n \"severity\": \"warn\",\n \"description\": \"Detect imported components and directives that are never used in JSX.\",\n \"fixable\": false,\n \"category\": \"jsx\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"unusedComponent\": \"Component '{{name}}' is imported but never used in JSX.\",\n \"unusedDirective\": \"Directive '{{name}}' is imported but never used in JSX.\"\n }\n },\n {\n \"id\": \"no-innerhtml\",\n \"severity\": \"error\",\n \"description\": \"Disallow usage of the innerHTML attribute, which can lead to security vulnerabilities.\",\n \"fixable\": true,\n \"category\": \"jsx\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"dangerous\": \"Using innerHTML with dynamic content is a security risk. Unsanitized user input can lead to cross-site scripting (XSS) attacks. Use a sanitization library or render content safely.\",\n \"conflict\": \"The innerHTML prop will overwrite all child elements. Remove the children or use innerHTML on an empty element.\",\n \"notHtml\": \"The innerHTML value doesn't appear to be HTML. If you're setting text content, use innerText instead for clarity and safety.\",\n \"dangerouslySetInnerHTML\": \"The dangerouslySetInnerHTML is a React prop that Solid doesn't support. Use innerHTML instead.\"\n }\n },\n {\n \"id\": \"no-unknown-namespaces\",\n \"severity\": \"error\",\n \"description\": \"Enforce using only Solid-specific namespaced attribute names (i.e. `'on:'` in `<div on:click={...} />`).\",\n \"fixable\": false,\n \"category\": \"jsx\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"unknownNamespace\": \"'{{namespace}}:' is not a recognized Solid namespace. Valid namespaces are: {{validNamespaces}}.\",\n \"styleNamespace\": \"The 'style:' namespace works but is discouraged. Use the style prop with an object instead: style={{ {{property}}: value }}.\",\n \"classNamespace\": \"The 'class:' namespace works but is discouraged. Use the classList prop instead: classList={{ \\\"{{className}}\\\": condition }}.\",\n \"componentNamespace\": \"Namespaced attributes like '{{namespace}}:' only work on DOM elements, not components. The '{{fullName}}' attribute will be passed as a regular prop named '{{fullName}}'.\"\n }\n },\n {\n \"id\": \"show-truthy-conversion\",\n \"severity\": \"error\",\n \"description\": \"Detect <Show when={expr}> where expr is not explicitly boolean, which may have unexpected truthy/falsy behavior.\",\n \"fixable\": true,\n \"category\": \"jsx\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"showNonBoolean\": \"<Show when={{{{expr}}}}> uses truthy/falsy conversion. Value '0' or empty string '' will hide content. Use explicit boolean: when={Boolean({{expr}})} or when={{{expr}}} != null}\"\n }\n },\n {\n \"id\": \"suspense-boundary-missing\",\n \"severity\": \"error\",\n \"description\": \"Detect missing fallback props on Suspense/ErrorBoundary, and lazy components without Suspense wrapper.\",\n \"fixable\": false,\n \"category\": \"jsx\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"suspenseNoFallback\": \"<Suspense> should have a fallback prop to show while children are loading. Add: fallback={<Loading />}\",\n \"errorBoundaryNoFallback\": \"<ErrorBoundary> should have a fallback prop to show when an error occurs. Add: fallback={(err) => <Error error={err} />}\",\n \"lazyNoSuspense\": \"Lazy component '{{name}}' must be wrapped in a <Suspense> boundary. Add a <Suspense fallback={...}> ancestor.\"\n }\n },\n {\n \"id\": \"validate-jsx-nesting\",\n \"severity\": \"error\",\n \"description\": \"Validates that HTML elements are nested according to the HTML5 specification.\",\n \"fixable\": false,\n \"category\": \"jsx\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"invalidNesting\": \"Invalid HTML nesting: <{{child}}> cannot be a child of <{{parent}}>. {{reason}}.\",\n \"voidElementWithChildren\": \"<{{parent}}> is a void element and cannot have children. Found <{{child}}> as a child.\",\n \"invalidListChild\": \"<{{child}}> is not a valid direct child of <{{parent}}>. Only <li> elements can be direct children of <ul> and <ol>.\",\n \"invalidSelectChild\": \"<{{child}}> is not a valid direct child of <select>. Only <option> and <optgroup> elements are allowed.\",\n \"invalidTableChild\": \"<{{child}}> is not a valid direct child of <{{parent}}>. Expected: {{expected}}.\",\n \"invalidDlChild\": \"<{{child}}> is not a valid direct child of <dl>. Only <dt>, <dd>, and <div> elements are allowed.\"\n }\n },\n {\n \"id\": \"avoid-arguments-object\",\n \"severity\": \"warn\",\n \"description\": \"Disallow arguments object (use rest parameters instead).\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"avoidArguments\": \"arguments object can prevent V8 optimization. Use rest parameters (...args) instead.\"\n }\n },\n {\n \"id\": \"avoid-chained-array-methods\",\n \"severity\": \"warn\",\n \"description\": \"Flags chained array methods creating 3+ intermediate arrays, or filter().map() pattern.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"avoidChainedArrayMethods\": \"Chain creates {{count}} intermediate array(s). Consider reduce() or a loop. Chain: {{chain}}\",\n \"mapJoinHotPath\": \"map().join() inside loops allocates intermediate arrays on a hot path. Prefer single-pass string construction.\"\n }\n },\n {\n \"id\": \"avoid-defensive-copy-for-scalar-stat\",\n \"severity\": \"warn\",\n \"description\": \"Disallow defensive array copies passed into scalar statistic calls.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"defensiveCopy\": \"Defensive copy before scalar statistic '{{stat}}' allocates unnecessarily. Prefer readonly/non-mutating scalar computation.\"\n }\n },\n {\n \"id\": \"avoid-delete-operator\",\n \"severity\": \"warn\",\n \"description\": \"Disallow delete operator on objects (causes V8 deoptimization).\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"avoidDelete\": \"delete operator transitions object to slow mode. Use `obj.prop = undefined` or destructuring instead.\"\n }\n },\n {\n \"id\": \"avoid-function-allocation-in-hot-loop\",\n \"severity\": \"warn\",\n \"description\": \"Disallow creating closures inside loops.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"closureInLoop\": \"Function created inside loop allocates new closure per iteration. Consider hoisting or using event delegation.\"\n }\n },\n {\n \"id\": \"avoid-hidden-class-transition\",\n \"severity\": \"warn\",\n \"description\": \"Suggest consistent object shapes to avoid V8 hidden class transitions.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"hiddenClassTransition\": \"Property '{{property}}' added conditionally to '{{object}}' creates inconsistent object shapes. Initialize '{{property}}' in the object literal.\"\n }\n },\n {\n \"id\": \"avoid-intermediate-map-copy\",\n \"severity\": \"warn\",\n \"description\": \"Disallow temporary Map allocations that are copied key-for-key into another Map.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"intermediateMapCopy\": \"Intermediate Map '{{tempName}}' is copied into '{{outName}}' key-for-key. Build output directly to avoid extra allocation.\"\n }\n },\n {\n \"id\": \"avoid-megamorphic-property-access\",\n \"severity\": \"warn\",\n \"description\": \"Avoid property access on `any` or wide union types to prevent V8 deoptimization.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"megamorphicAccess\": \"Property access on `any` or wide union type causes V8 deoptimization. Consider narrowing the type.\"\n }\n },\n {\n \"id\": \"avoid-quadratic-pair-comparison\",\n \"severity\": \"warn\",\n \"description\": \"Disallow nested for-loops over the same collection creating O(n²) pair comparison.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"quadraticPair\": \"Nested loops over `{{collection}}` create O(n²) pair comparison. Group by a key property first.\"\n }\n },\n {\n \"id\": \"avoid-quadratic-spread\",\n \"severity\": \"error\",\n \"description\": \"Disallow spreading accumulator in reduce callbacks (O(n²) complexity).\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"quadraticSpread\": \"Spreading accumulator in reduce creates O(n²) complexity. Use push() instead.\"\n }\n },\n {\n \"id\": \"avoid-repeated-indexof-check\",\n \"severity\": \"warn\",\n \"description\": \"Disallow 3+ .indexOf() calls on the same array variable in one function.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"repeatedIndexOf\": \"{{count}} .indexOf() calls on `{{name}}` in the same function. Use a Set, regex, or single-pass scan instead.\"\n }\n },\n {\n \"id\": \"avoid-slice-sort-pattern\",\n \"severity\": \"warn\",\n \"description\": \"Disallow .slice().sort() and .slice().reverse() chains. Use .toSorted()/.toReversed().\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"sliceSort\": \".slice().sort() creates an intermediate array. Use .toSorted() instead.\",\n \"sliceReverse\": \".slice().reverse() creates an intermediate array. Use .toReversed() instead.\",\n \"spreadSort\": \"[...array].sort() creates an intermediate array. Use .toSorted() instead.\",\n \"spreadReverse\": \"[...array].reverse() creates an intermediate array. Use .toReversed() instead.\"\n }\n },\n {\n \"id\": \"avoid-sparse-arrays\",\n \"severity\": \"warn\",\n \"description\": \"Disallow new Array(n) without fill (creates holey array).\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"sparseArray\": \"new Array(n) creates a holey array. Use Array.from() or .fill() instead.\"\n }\n },\n {\n \"id\": \"avoid-spread-sort-map-join-pipeline\",\n \"severity\": \"warn\",\n \"description\": \"Disallow [...iterable].sort().map().join() pipelines on hot paths.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"spreadSortMapJoin\": \"Spread+sort+map+join pipeline allocates multiple intermediates. Prefer single-pass string construction on hot paths.\"\n }\n },\n {\n \"id\": \"bounded-worklist-traversal\",\n \"severity\": \"warn\",\n \"description\": \"Detect queue/worklist traversals with unbounded growth and no guard.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"boundedWorklist\": \"Worklist '{{name}}' grows via push() without visited set or explicit size bound. Add traversal guard to prevent pathological growth.\"\n }\n },\n {\n \"id\": \"closure-captured-scope\",\n \"severity\": \"warn\",\n \"description\": \"Detect closures returned from scopes containing large allocations that may be retained.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"capturedScope\": \"Returned closure shares scope with large allocation '{{name}}'. V8 may retain the allocation via scope capture even though the closure doesn't reference it. Move the allocation to an inner scope.\"\n }\n },\n {\n \"id\": \"closure-dom-circular\",\n \"severity\": \"warn\",\n \"description\": \"Detect event handler property assignments that create closure-DOM circular references.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"circularRef\": \"Event handler on '{{param}}' creates a closure that captures '{{param}}', forming a closure-DOM circular reference. Use addEventListener with a named handler for easier cleanup.\"\n }\n },\n {\n \"id\": \"create-root-dispose\",\n \"severity\": \"warn\",\n \"description\": \"Detect createRoot with unused dispose parameter.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"unusedDispose\": \"createRoot() dispose parameter is never used. The reactive tree will never be cleaned up. Call dispose(), return it, or pass it to onCleanup().\"\n }\n },\n {\n \"id\": \"detached-dom-reference\",\n \"severity\": \"warn\",\n \"description\": \"Detect DOM query results stored in module-scoped variables that may hold detached nodes.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"detachedRef\": \"DOM query result from '{{method}}' stored in module-scoped variable '{{name}}'. If the DOM node is removed, this reference prevents garbage collection. Use a local variable or WeakRef instead.\"\n }\n },\n {\n \"id\": \"effect-outside-root\",\n \"severity\": \"error\",\n \"description\": \"Detect reactive computations created outside a reactive root (no Owner).\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"orphanedEffect\": \"{{primitive}}() called outside a reactive root. Without an Owner, this computation is never disposed and leaks memory. Wrap in a component, createRoot, or runWithOwner.\"\n }\n },\n {\n \"id\": \"finalization-registry-leak\",\n \"severity\": \"error\",\n \"description\": \"Detect FinalizationRegistry.register() where heldValue references the target.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"selfReference\": \"FinalizationRegistry.register() heldValue references the target '{{name}}'. This strong reference prevents the target from being garbage collected, defeating the purpose of the registry.\"\n }\n },\n {\n \"id\": \"no-char-array-materialization\",\n \"severity\": \"warn\",\n \"description\": \"Disallow split(\\\"\\\"), Array.from(str), or [...str] in parsing loops.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"charArrayMaterialization\": \"Character array materialization via {{pattern}} in parsing loops allocates O(n) extra memory. Prefer index-based scanning.\"\n }\n },\n {\n \"id\": \"no-double-pass-delimiter-count\",\n \"severity\": \"warn\",\n \"description\": \"Disallow split-based delimiter counting followed by additional split passes.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"doublePassDelimiterCount\": \"Delimiter counting via `split(...).length` plus another `split(...)` repeats full-string passes. Prefer one indexed scan.\"\n }\n },\n {\n \"id\": \"no-full-split-in-hot-parse\",\n \"severity\": \"warn\",\n \"description\": \"Disallow full split() materialization inside hot string parsing loops.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"fullSplitInHotParse\": \"`split()` inside parsing loops materializes full token arrays each iteration. Prefer cursor/index scanning.\"\n }\n },\n {\n \"id\": \"no-heavy-parser-constructor-in-loop\",\n \"severity\": \"warn\",\n \"description\": \"Disallow constructing heavy parsing helpers inside loops.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"heavyParserConstructor\": \"`new {{ctor}}(...)` inside parsing loops repeatedly allocates heavy parser helpers. Hoist and reuse instances.\"\n }\n },\n {\n \"id\": \"no-leaked-abort-controller\",\n \"severity\": \"warn\",\n \"description\": \"Detect AbortController in effects without abort() in onCleanup.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"leakedAbort\": \"new AbortController() inside a reactive effect without onCleanup. Add onCleanup(() => controller.abort()).\"\n }\n },\n {\n \"id\": \"no-leaked-animation-frame\",\n \"severity\": \"warn\",\n \"description\": \"Detect requestAnimationFrame in effects without cancelAnimationFrame in onCleanup.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"leakedRaf\": \"requestAnimationFrame() inside a reactive effect without onCleanup. Add onCleanup(() => cancelAnimationFrame(id)).\"\n }\n },\n {\n \"id\": \"no-leaked-event-listener\",\n \"severity\": \"warn\",\n \"description\": \"Detect addEventListener in effects without removeEventListener in onCleanup.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"leakedListener\": \"addEventListener() inside a reactive effect without onCleanup. Each re-run leaks a listener. Add onCleanup(() => removeEventListener(...)).\"\n }\n },\n {\n \"id\": \"no-leaked-observer\",\n \"severity\": \"warn\",\n \"description\": \"Detect Observer APIs in effects without disconnect() in onCleanup.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"leakedObserver\": \"new {{type}}() inside a reactive effect without onCleanup. Add onCleanup(() => observer.disconnect()).\"\n }\n },\n {\n \"id\": \"no-leaked-subscription\",\n \"severity\": \"warn\",\n \"description\": \"Detect WebSocket/EventSource/BroadcastChannel in effects without close() in onCleanup.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"leakedSubscription\": \"new {{type}}() inside a reactive effect without onCleanup. Add onCleanup(() => instance.close()).\"\n }\n },\n {\n \"id\": \"no-leaked-timer\",\n \"severity\": \"warn\",\n \"description\": \"Detect setInterval/setTimeout in effects without onCleanup to clear them.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"leakedTimer\": \"{{setter}}() inside a reactive effect without onCleanup. Each re-run leaks a timer. Add onCleanup(() => {{clearer}}(id)).\"\n }\n },\n {\n \"id\": \"no-loop-string-plus-equals\",\n \"severity\": \"warn\",\n \"description\": \"Disallow repeated string += accumulation in parsing loops.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"loopStringPlusEquals\": \"Repeated string `+=` in parsing loops creates avoidable allocations. Buffer chunks and join once.\"\n }\n },\n {\n \"id\": \"no-multipass-split-pipeline\",\n \"severity\": \"warn\",\n \"description\": \"Disallow multipass split/map/filter pipelines in parsing code.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"multipassSplit\": \"`split()` followed by multiple array passes allocates heavily on parsing paths. Prefer single-pass parsing.\"\n }\n },\n {\n \"id\": \"no-per-char-substring-scan\",\n \"severity\": \"warn\",\n \"description\": \"Disallow per-character substring/charAt scanning patterns in loops.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"perCharSubstring\": \"Per-character `{{method}}()` scanning in loops allocates extra strings. Prefer index + charCodeAt scanning.\"\n }\n },\n {\n \"id\": \"no-repeated-token-normalization\",\n \"severity\": \"warn\",\n \"description\": \"Disallow repeated trim/lower/upper normalization chains on the same token in one function.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"repeatedTokenNormalization\": \"Repeated token normalization `{{chain}}` on `{{name}}` in one function. Compute once and reuse.\"\n }\n },\n {\n \"id\": \"no-rescan-indexof-loop\",\n \"severity\": \"warn\",\n \"description\": \"Disallow repeated indexOf/includes scans from start in parsing loops.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"rescanIndexOf\": \"Repeated `{{method}}()` from string start inside loops rescans prior text. Pass a cursor start index.\"\n }\n },\n {\n \"id\": \"no-rest-slice-loop\",\n \"severity\": \"warn\",\n \"description\": \"Disallow repeated self-slice reassignment loops in string parsing code.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"restSliceLoop\": \"Repeated `{{name}} = {{name}}.{{method}}(...)` in loops creates string churn. Track cursor indexes instead.\"\n }\n },\n {\n \"id\": \"no-shift-splice-head-consume\",\n \"severity\": \"warn\",\n \"description\": \"Disallow shift/splice(0,1) head-consume patterns in loops.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"headConsume\": \"Head-consuming `{{method}}()` inside loops causes array reindexing costs. Use index cursor iteration instead.\"\n }\n },\n {\n \"id\": \"no-write-only-index\",\n \"severity\": \"warn\",\n \"description\": \"Detect index structures that are written but never queried by key.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"writeOnlyIndex\": \"Index '{{name}}' is built via writes but never queried by key. Remove it or use direct collection flow.\"\n }\n },\n {\n \"id\": \"prefer-charcode-over-regex-test\",\n \"severity\": \"warn\",\n \"description\": \"Prefer charCodeAt() range checks over regex .test() for single-character classification.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"regexTest\": \"Regex `{{pattern}}`.test() on a single character. Use charCodeAt() range checks instead.\"\n }\n },\n {\n \"id\": \"prefer-index-scan-over-string-iterator\",\n \"severity\": \"warn\",\n \"description\": \"Prefer index-based string scanning over for-of iteration in ASCII parser code.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"preferIndexScan\": \"ASCII parsing loops should avoid `for...of` string iteration. Prefer indexed scanning with charCodeAt for lower overhead.\"\n }\n },\n {\n \"id\": \"prefer-lazy-property-access\",\n \"severity\": \"warn\",\n \"description\": \"Suggests moving property access after early returns when not used immediately.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"preferLazyPropertyAccess\": \"Property '{{propertyName}}' assigned to '{{variableName}}' before early return but not used there. Move assignment after early returns.\"\n }\n },\n {\n \"id\": \"prefer-map-lookup-over-linear-scan\",\n \"severity\": \"warn\",\n \"description\": \"Disallow repeated linear scans over fixed literal collections in hot paths.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"preferMapLookup\": \"Linear scan over fixed collection '{{name}}' in '{{fnName}}'. Precompute Map/Set lookup for O(1) access.\"\n }\n },\n {\n \"id\": \"prefer-map-over-object-dictionary\",\n \"severity\": \"warn\",\n \"description\": \"Suggest Map for dictionary-like objects with dynamic keys.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"preferMap\": \"Dynamic key assignment on dictionary object causes hidden class transitions. Consider using Map.\"\n }\n },\n {\n \"id\": \"prefer-precompiled-regex\",\n \"severity\": \"warn\",\n \"description\": \"Prefer hoisting regex literals to module-level constants to avoid repeated compilation.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"inlineRegex\": \"Regex `{{pattern}}` is compiled on every call. Hoist to a module-level constant.\"\n }\n },\n {\n \"id\": \"prefer-set-has-over-equality-chain\",\n \"severity\": \"warn\",\n \"description\": \"Disallow 4+ guard-style equality checks against string literals on the same variable. Use a Set.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"equalityChain\": \"{{count}} equality checks against `{{name}}`. Extract literals to a Set and use .has() instead.\"\n }\n },\n {\n \"id\": \"prefer-set-lookup-in-loop\",\n \"severity\": \"warn\",\n \"description\": \"Disallow linear search methods (.includes/.indexOf) on arrays inside loops.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"preferSet\": \"`.{{method}}()` on `{{name}}` called inside a loop. Convert to a Set for O(1) lookups.\"\n }\n },\n {\n \"id\": \"recursive-timer\",\n \"severity\": \"warn\",\n \"description\": \"Detect setTimeout that recursively calls its enclosing function.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"recursiveTimer\": \"setTimeout() recursively calls '{{name}}', creating an unbreakable polling loop. Add a termination condition or use setInterval with cleanup.\"\n }\n },\n {\n \"id\": \"self-referencing-store\",\n \"severity\": \"error\",\n \"description\": \"Detect setStore() where the value argument references the store itself.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"selfReference\": \"setStore() value references the store variable '{{name}}', creating a circular proxy reference. This prevents garbage collection and can cause infinite loops.\"\n }\n },\n {\n \"id\": \"unbounded-collection\",\n \"severity\": \"warn\",\n \"description\": \"Detect module-scoped Map/Set/Array that only grow without removal.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"unboundedCollection\": \"Module-scoped {{type}} '{{name}}' only uses additive methods ({{methods}}). Without removal or clearing, this grows unbounded. Consider WeakMap, LRU eviction, or periodic clear().\"\n }\n },\n {\n \"id\": \"unbounded-signal-accumulation\",\n \"severity\": \"warn\",\n \"description\": \"Detect signal setters that accumulate data without truncation via spread+append pattern.\",\n \"fixable\": false,\n \"category\": \"performance\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"unbounded\": \"Signal setter '{{name}}' accumulates data without bounds. The array grows monotonically via spread+append. Add truncation (e.g. prev.slice(-limit)) to prevent unbounded growth.\"\n }\n },\n {\n \"id\": \"async-tracked\",\n \"severity\": \"error\",\n \"description\": \"Disallow async functions in tracked scopes (createEffect, createMemo, etc.)\",\n \"fixable\": false,\n \"category\": \"reactivity\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"asyncCreateEffect\": \"Async function{{fnName}} in createEffect loses tracking after await. Read all signals before the first await, or use createResource for async data fetching.\",\n \"asyncCreateMemo\": \"Async function{{fnName}} in createMemo won't work correctly. createMemo must be synchronous. For async derived data, use createResource instead.\",\n \"asyncCreateComputed\": \"Async function{{fnName}} in createComputed won't track properly. createComputed must be synchronous—signal reads after await won't trigger re-computation.\",\n \"asyncCreateRenderEffect\": \"Async function{{fnName}} in createRenderEffect breaks DOM update timing. createRenderEffect must be synchronous. Move async work to onMount or createResource.\",\n \"asyncTrackedGeneric\": \"Async function{{fnName}} in {{source}} won't track reactivity after await. Solid's tracking only works synchronously—signal reads after await are ignored.\"\n }\n },\n {\n \"id\": \"children-helper-misuse\",\n \"severity\": \"error\",\n \"description\": \"Detect misuse of the children() helper that causes unnecessary re-computation or breaks reactivity\",\n \"fixable\": false,\n \"category\": \"reactivity\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"multipleChildrenCalls\": \"The children() helper should only be called once per component. Each call re-resolves children, causing unnecessary computation. Store the result and reuse the accessor.\",\n \"directChildrenAccess\": \"Access props.children through the children() helper in reactive contexts. Direct access won't properly resolve or track children. Use: const resolved = children(() => props.children);\"\n }\n },\n {\n \"id\": \"cleanup-scope\",\n \"severity\": \"error\",\n \"description\": \"Detect onCleanup called outside of a valid reactive scope\",\n \"fixable\": false,\n \"category\": \"reactivity\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"cleanupOutsideScope\": \"onCleanup() called outside a reactive scope ({{location}}). The cleanup function will never execute unless this code runs within a component, effect, createRoot, or runWithOwner.\"\n }\n },\n {\n \"id\": \"derived-signal\",\n \"severity\": \"error\",\n \"description\": \"Detect functions that capture reactive values but are called in untracked contexts\",\n \"fixable\": false,\n \"category\": \"reactivity\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"moduleScopeInit\": \"Assigning '{{fnName}}()' to '{{varName}}' at module scope runs once at startup. It captures {{vars}} which won't trigger updates.\",\n \"moduleScopeCall\": \"'{{fnName}}()' at module scope executes once when the module loads. It captures {{vars}}—changes won't cause this to re-run.\",\n \"componentTopLevelInit\": \"'{{fnName}}()' assigned to '{{varName}}' in '{{componentName}}' captures a one-time snapshot of {{vars}}. Changes won't update '{{varName}}'. Call in JSX or use createMemo().\",\n \"componentTopLevelCall\": \"'{{fnName}}()' at top-level of '{{componentName}}' runs once and captures a snapshot of {{vars}}. Changes won't re-run this. Move inside JSX: {{{fnName}}()} or wrap with createMemo().\",\n \"utilityFnCall\": \"'{{fnName}}()' inside '{{utilityName}}' won't be reactive. Call '{{utilityName}}' from a tracked scope (createEffect, JSX), or pass {{vars}} as parameters.\",\n \"syncCallbackCall\": \"'{{fnName}}()' inside {{methodName}}() callback runs outside a tracking scope. The result captures a snapshot of {{vars}} that won't update.\",\n \"untrackedCall\": \"'{{fnName}}()' called in an untracked context. It captures {{vars}} which won't trigger updates here. Move to JSX or a tracked scope.\"\n }\n },\n {\n \"id\": \"effect-as-memo\",\n \"severity\": \"error\",\n \"description\": \"Detect createEffect that only sets a derived signal value, which should be createMemo instead\",\n \"fixable\": true,\n \"category\": \"reactivity\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"effectAsMemo\": \"This createEffect only computes a derived value. Use createMemo() instead: const {{signalName}} = createMemo(() => {{expression}});\"\n }\n },\n {\n \"id\": \"effect-as-mount\",\n \"severity\": \"error\",\n \"description\": \"Detect createEffect/createRenderEffect with no reactive dependencies that should be onMount instead\",\n \"fixable\": true,\n \"category\": \"reactivity\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"effectAsMount\": \"This {{primitive}} has no reactive dependencies and runs only once. Use onMount() for initialization logic that doesn't need to re-run.\"\n }\n },\n {\n \"id\": \"inline-component\",\n \"severity\": \"error\",\n \"description\": \"Detect component functions defined inside other components, which causes remount on every parent update\",\n \"fixable\": false,\n \"category\": \"reactivity\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"inlineComponent\": \"Component '{{name}}' is defined inside another component. This creates a new component type on every render, causing unmount/remount. Move the component definition outside.\"\n }\n },\n {\n \"id\": \"no-top-level-signal-call\",\n \"severity\": \"error\",\n \"description\": \"Disallow calling signals at component top-level (captures stale snapshots)\",\n \"fixable\": false,\n \"category\": \"reactivity\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"assignedToVar\": \"'{{name}}()' assigned to '{{varName}}' in {{componentName}} captures a one-time snapshot. '{{varName}}' won't update when {{name}} changes. Use createMemo(): `const {{varName}} = createMemo(() => {{name}}());`\",\n \"computedValue\": \"'{{name}}()' in computation at top-level of {{componentName}} captures a stale snapshot. Wrap with createMemo(): `const {{varName}} = createMemo(() => /* computation using {{name}}() */);`\",\n \"templateLiteral\": \"'{{name}}()' in template literal at top-level of {{componentName}} captures a stale snapshot. Use createMemo() or compute directly in JSX: `{`Hello, ${{{name}}()}!`}`\",\n \"destructuring\": \"Destructuring '{{name}}()' at top-level of {{componentName}} captures a stale snapshot. Access properties in JSX or createMemo(): `{{{name}}().propertyName}`\",\n \"objectLiteral\": \"'{{name}}()' in object literal at top-level of {{componentName}} captures a stale snapshot. Use createMemo() for the object, or spread in JSX.\",\n \"arrayCreation\": \"'{{name}}()' in array creation at top-level of {{componentName}} captures a stale snapshot. Wrap with createMemo(): `const items = createMemo(() => Array.from(...));`\",\n \"earlyReturn\": \"'{{name}}()' in early return at top-level of {{componentName}} captures a stale snapshot. Use <Show when={{{name}}()}> for conditional rendering instead.\",\n \"conditionalAssign\": \"'{{name}}()' in ternary at top-level of {{componentName}} captures a stale snapshot. Use createMemo() or compute in JSX: `{{{name}}() ? 'Yes' : 'No'}`\",\n \"functionArgument\": \"'{{name}}()' passed as argument at top-level of {{componentName}} captures a stale snapshot. Move to createEffect() or compute in JSX.\",\n \"syncCallback\": \"'{{name}}()' inside {{methodName}}() at top-level of {{componentName}} captures a stale snapshot. Wrap the entire computation in createMemo(): `const result = createMemo(() => items.{{methodName}}(...));`\",\n \"topLevelCall\": \"'{{name}}()' at top-level of {{componentName}} captures a one-time snapshot. Changes to {{name}} won't update the result. Call directly in JSX or wrap in createMemo().\"\n }\n },\n {\n \"id\": \"ref-early-access\",\n \"severity\": \"error\",\n \"description\": \"Detect accessing refs before they are assigned (before mount)\",\n \"fixable\": false,\n \"category\": \"reactivity\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"refBeforeMount\": \"Ref '{{name}}' is accessed before component mounts. Refs are undefined until after mount. Access in onMount(), createEffect(), or event handlers.\"\n }\n },\n {\n \"id\": \"resource-access-unchecked\",\n \"severity\": \"error\",\n \"description\": \"Detect accessing resource data without checking loading/error state.\",\n \"fixable\": false,\n \"category\": \"reactivity\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"resourceUnchecked\": \"Accessing resource '{{name}}' without checking loading/error state may return undefined. Wrap in <Show when={!{{name}}.loading}> or <Suspense>.\"\n }\n },\n {\n \"id\": \"resource-refetch-loop\",\n \"severity\": \"error\",\n \"description\": \"Detect refetch() calls inside createEffect which can cause infinite loops\",\n \"fixable\": false,\n \"category\": \"reactivity\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"refetchInEffect\": \"Calling {{name}}.refetch() inside createEffect may cause infinite loops. The resource tracks its own dependencies. Move refetch to an event handler or use on() to control dependencies.\"\n }\n },\n {\n \"id\": \"signal-call\",\n \"severity\": \"error\",\n \"description\": \"Require signals to be called as functions when used in tracked contexts\",\n \"fixable\": true,\n \"category\": \"reactivity\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"signalInJsxText\": \"Signal '{{name}}' in JSX text should be called: {{{name}}()}. Without (), you're rendering the function, not its value.\",\n \"signalInJsxAttribute\": \"Signal '{{name}}' in JSX attribute should be called: {{attr}}={{{name}}()}. Without (), the attribute won't update reactively.\",\n \"signalInTernary\": \"Signal '{{name}}' in ternary should be called: {{name}}() ? ... : .... The condition won't react to changes without ().\",\n \"signalInLogical\": \"Signal '{{name}}' in logical expression should be called: {{name}}() && .... Without (), this always evaluates to truthy (functions are truthy).\",\n \"signalInComparison\": \"Signal '{{name}}' in comparison should be called: {{name}}() === .... Comparing functions always returns false.\",\n \"signalInArithmetic\": \"Signal '{{name}}' in arithmetic should be called: {{name}}() + .... Math on functions produces NaN.\",\n \"signalInTemplate\": \"Signal '{{name}}' in template literal should be called: `...${{{name}}()}...`. Without (), you're embedding '[Function]'.\",\n \"signalInTrackedScope\": \"Signal '{{name}}' in {{where}} should be called: {{name}}(). Without (), reactivity is lost.\",\n \"badSignal\": \"The reactive variable '{{name}}' should be called as a function when used in {{where}}.\"\n }\n },\n {\n \"id\": \"signal-in-loop\",\n \"severity\": \"error\",\n \"description\": \"Detect problematic signal usage inside For/Index loop callbacks\",\n \"fixable\": false,\n \"category\": \"reactivity\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"signalInLoop\": \"Creating signals inside <{{component}}> callback creates new signals on each render. Use a store at the parent level, or derive state from the index.\",\n \"signalCallInvariant\": \"Signal '{{name}}' called inside <{{component}}> produces the same value for every item. Extract to a variable or memoize with createMemo() before the loop.\",\n \"derivedCallInvariant\": \"'{{name}}()' inside <{{component}}> captures {{captures}} but doesn't use the loop item. Extract the call before the loop or pass the item as a parameter.\"\n }\n },\n {\n \"id\": \"store-reactive-break\",\n \"severity\": \"error\",\n \"description\": \"Detect patterns that break store reactivity: spreading stores, top-level property extraction, or destructuring\",\n \"fixable\": false,\n \"category\": \"reactivity\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"storeSpread\": \"Spreading a store ({...store}) creates a static snapshot that won't update. Access store properties directly in JSX or tracked contexts.\",\n \"storeTopLevelAccess\": \"Accessing store property '{{property}}' at component top-level captures the value once. Access store.{{property}} directly in JSX or wrap in createMemo().\",\n \"storeDestructure\": \"Destructuring a store breaks reactivity. Access properties via store.{{property}} instead of destructuring.\"\n }\n },\n {\n \"id\": \"transition-pending-unchecked\",\n \"severity\": \"error\",\n \"description\": \"Detect useTransition usage without handling the isPending state\",\n \"fixable\": false,\n \"category\": \"reactivity\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"pendingUnchecked\": \"useTransition returns [isPending, startTransition]. The isPending state should be used to show loading UI during transitions.\"\n }\n },\n {\n \"id\": \"batch-optimization\",\n \"severity\": \"warn\",\n \"description\": \"Suggest using batch() when multiple signal setters are called in the same synchronous scope\",\n \"fixable\": true,\n \"category\": \"solid\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"multipleSetters\": \"Multiple signal updates in the same scope cause multiple re-renders. Wrap in batch() for a single update: batch(() => { {{setters}} });\"\n }\n },\n {\n \"id\": \"imports\",\n \"severity\": \"error\",\n \"description\": \"Enforce consistent imports from \\\"solid-js\\\", \\\"solid-js/web\\\", and \\\"solid-js/store\\\".\",\n \"fixable\": false,\n \"category\": \"solid\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"preferSource\": \"Prefer importing {{name}} from \\\"{{source}}\\\".\"\n }\n },\n {\n \"id\": \"index-vs-for\",\n \"severity\": \"warn\",\n \"description\": \"Suggest <For> for object arrays and <Index> for primitive arrays.\",\n \"fixable\": true,\n \"category\": \"solid\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"indexWithObjects\": \"<Index> with object arrays causes the item accessor to change on any array mutation. Use <For> for objects to maintain reference stability.\",\n \"forWithPrimitives\": \"<For> with primitive arrays (strings, numbers) keys by value, which may cause unexpected re-renders. Consider <Index> if index stability is preferred.\"\n }\n },\n {\n \"id\": \"no-react-deps\",\n \"severity\": \"error\",\n \"description\": \"Disallow usage of dependency arrays in `createEffect`, `createMemo`, and `createRenderEffect`.\",\n \"fixable\": true,\n \"category\": \"solid\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"noUselessDep\": \"In Solid, `{{name}}` doesn't accept a dependency array because it automatically tracks its dependencies. If you really need to override the list of dependencies, use `on`.\"\n }\n },\n {\n \"id\": \"no-react-specific-props\",\n \"severity\": \"error\",\n \"description\": \"Disallow usage of React-specific `className`/`htmlFor` props, which were deprecated in v1.4.0.\",\n \"fixable\": true,\n \"category\": \"solid\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"prefer\": \"Prefer the `{{to}}` prop over the deprecated `{{from}}` prop.\",\n \"noUselessKey\": \"Elements in a <For> or <Index> list do not need a key prop.\"\n }\n },\n {\n \"id\": \"prefer-for\",\n \"severity\": \"warn\",\n \"description\": \"Enforce using Solid's `<For />` component for mapping an array to JSX elements.\",\n \"fixable\": true,\n \"category\": \"solid\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"preferFor\": \"Prefer Solid's `<For each={...}>` component for rendering lists of objects. Array#map recreates all DOM elements on every update, while <For> updates only changed items by keying on reference.\",\n \"preferIndex\": \"Prefer Solid's `<Index each={...}>` component for rendering lists of primitives. Array#map recreates all DOM elements on every update, while <Index> updates only changed items by keying on index position.\",\n \"preferForOrIndex\": \"Prefer Solid's `<For />` or `<Index />` component for rendering lists. Use <For> when items are objects (keys by reference), or <Index> when items are primitives like strings/numbers (keys by index). Array#map recreates all DOM elements on every update.\"\n }\n },\n {\n \"id\": \"prefer-memo-complex-styles\",\n \"severity\": \"warn\",\n \"description\": \"Enforce extracting complex style computations to createMemo for better approach. Complex inline style objects are rebuilt on every render, which can impact approach.\",\n \"fixable\": false,\n \"category\": \"solid\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"preferMemoComplexStyle\": \"Complex style computation should be extracted to createMemo() for better approach. This style object contains {{complexity}} conditional expressions that are recalculated on every render.\",\n \"preferMemoConditionalSpread\": \"Conditional spread operators in style objects should be extracted to createMemo(). Pattern like `...(condition ? {...} : {})` creates new objects on every render.\"\n }\n },\n {\n \"id\": \"prefer-show\",\n \"severity\": \"warn\",\n \"description\": \"Enforce using Solid's `<Show />` component for conditionally showing content. Solid's compiler covers this case, so it's a stylistic rule only.\",\n \"fixable\": true,\n \"category\": \"solid\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"preferShowAnd\": \"Prefer Solid's `<Show when={...}>` component for conditional rendering. While Solid's compiler handles `&&` expressions, <Show> is more explicit and provides better readability for conditional content.\",\n \"preferShowTernary\": \"Prefer Solid's `<Show when={...} fallback={...}>` component for conditional rendering with a fallback. This provides clearer intent and better readability than ternary expressions.\"\n }\n },\n {\n \"id\": \"self-closing-comp\",\n \"severity\": \"warn\",\n \"description\": \"Disallow extra closing tags for components without children.\",\n \"fixable\": true,\n \"category\": \"solid\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"selfClose\": \"Empty elements should be self-closing. Use `<{{name}} />` instead of `<{{name}}></{{name}}>` for cleaner, more concise JSX.\",\n \"dontSelfClose\": \"This element should not be self-closing based on your configuration. Use `<{{name}}></{{name}}>` instead of `<{{name}} />` for explicit opening and closing tags.\"\n }\n },\n {\n \"id\": \"style-prop\",\n \"severity\": \"warn\",\n \"description\": \"Require CSS properties in the `style` prop to be valid and kebab-cased (ex. 'font-size'), not camel-cased (ex. 'fontSize') like in React, and that property values with dimensions are strings, not numbers with implicit 'px' units.\",\n \"fixable\": true,\n \"category\": \"solid\",\n \"plugin\": \"solid\",\n \"messages\": {\n \"kebabStyleProp\": \"Solid uses kebab-case for CSS property names, not camelCase like React. Use '{{kebabName}}' instead of '{{name}}'.\",\n \"invalidStyleProp\": \"'{{name}}' is not a valid CSS property. Check for typos, or if this is a custom property, prefix it with '--' (e.g., '--{{name}}').\",\n \"numericStyleValue\": \"Numeric values for dimensional properties need explicit units in Solid. Unlike React, Solid does not auto-append 'px'. Use '{{value}}px' or another appropriate unit.\",\n \"stringStyle\": \"Use an object for the style prop instead of a string for better approach and type safety. Example: style={{ '{{prop}}': '{{value}}' }}.\"\n }\n }\n] as const\n\n/** Rules grouped by category. */\nexport const RULES_BY_CATEGORY: Readonly<Record<RuleCategory, readonly RuleEntry[]>> = {\n \"correctness\": [{\"id\":\"avoid-conditional-spreads\",\"severity\":\"error\",\"description\":\"Disallow conditional spread operators that create empty objects. Patterns like `...(condition ? {...} : {})` are fragile and create unnecessary object creations.\",\"fixable\":false,\"category\":\"correctness\",\"plugin\":\"solid\",\"messages\":{\"avoidConditionalSpread\":\"Avoid conditional spread with empty object fallback. Instead of `...(cond ? {...} : {})`, build the object first with conditional property assignment, then spread once.\",\"avoidLogicalAndSpread\":\"Avoid logical AND spread pattern. Instead of `...(cond && {...})`, use explicit conditional property assignment for clarity.\"}},{\"id\":\"avoid-non-null-assertions\",\"severity\":\"error\",\"description\":\"Disallow non-null assertion operator (`!`). Use optional chaining, nullish coalescing, or proper type narrowing instead.\",\"fixable\":true,\"category\":\"correctness\",\"plugin\":\"solid\",\"messages\":{\"avoidNonNull\":\"Avoid non-null assertion on \\\"{{name}}\\\". Non-null assertions bypass type safety. Use optional chaining (`?.`), nullish coalescing (`??`), or proper type narrowing instead.\"}},{\"id\":\"avoid-object-assign\",\"severity\":\"error\",\"description\":\"Disallow Object.assign(). Prefer object spread syntax or structuredClone() for copying objects.\",\"fixable\":true,\"category\":\"correctness\",\"plugin\":\"solid\",\"messages\":{\"avoidMerge\":\"Avoid Object.assign() for merging. Use object spread syntax { ...obj } instead.\",\"avoidMutation\":\"Avoid Object.assign() for mutation. Consider immutable patterns like { ...existing, ...props }.\"}},{\"id\":\"avoid-object-spread\",\"severity\":\"error\",\"description\":\"Disallow object spread operators that break Solid's fine-grained reactivity.\",\"fixable\":true,\"category\":\"correctness\",\"plugin\":\"solid\",\"messages\":{\"avoidObjectCopy\":\"Avoid object spread for copying. Use direct property access.\",\"avoidObjectMerge\":\"Avoid object spread for merging. Use mergeProps() from 'solid-js'.\",\"avoidObjectUpdate\":\"Avoid object spread for updates. Use produce() or direct assignment.\",\"avoidJsxSpread\":\"Avoid JSX prop spreading. Use splitProps() to separate props.\",\"avoidRestDestructure\":\"Avoid rest destructuring. Use splitProps() from 'solid-js'.\",\"avoidPropsSpread\":\"Spreading props breaks reactivity. Use splitProps() to separate known props.\",\"avoidStoreSpread\":\"Spreading store creates a static snapshot. Access properties directly.\",\"avoidSignalSpread\":\"Spreading signal result captures current value. Wrap in createMemo().\",\"avoidClassListSpread\":\"Spreading in classList breaks reactivity. Wrap in createMemo().\",\"avoidStyleSpread\":\"Spreading in style breaks reactivity. Wrap in createMemo().\",\"unnecessarySplitProps\":\"Unnecessary splitProps with empty array. Remove it and use {{source}} directly.\"}},{\"id\":\"avoid-type-casting\",\"severity\":\"error\",\"description\":\"Disallow type casting methods that bypass TypeScript's type safety. Includes unnecessary casts, double assertions, casting to any, type predicates, and unsafe generic assertions.\",\"fixable\":true,\"category\":\"correctness\",\"plugin\":\"solid\",\"messages\":{\"unnecessaryCast\":\"Unnecessary type assertion: \\\"{{name}}\\\" is already of type \\\"{{exprType}}\\\", which is assignable to \\\"{{type}}\\\". Remove the cast - it adds noise and suggests you don't understand the types.\",\"doubleAssertion\":\"Double assertion detected: \\\"{{name}}\\\" is cast through unknown/any to \\\"{{type}}\\\". This bypasses type safety. You are creating sloppy architecture.\",\"castToAny\":\"Casting \\\"{{name}}\\\" to `any` disables all type checking. Use `unknown` with proper type guards, or fix the underlying type issue.\",\"castToUnknown\":\"Casting to `unknown` requires runtime type checks before use. You are creating sloppy architecture.\",\"simpleAssertion\":\"Type assertion on \\\"{{name}}\\\" to \\\"{{type}}\\\" bypasses type checking. Why are you doing this? Do you EVEN need this? This is sloppy architecture.\",\"assertionInLoop\":\"Type assertion on \\\"{{name}}\\\" inside a loop. Repeated casts to \\\"{{type}}\\\" without validation can mask type errors. Consider validating the type once before the loop.\",\"importAssertion\":\"Type assertion on dynamic import to \\\"{{type}}\\\". Import types should be validated at runtime or use proper module type declarations.\",\"typePredicate\":\"Type predicate function asserts \\\"{{param}}\\\" is \\\"{{type}}\\\". Why are you doing this? Do you EVEN need this? This is sloppy architecture.\",\"unsafeGeneric\":\"Casting to generic type parameter \\\"{{typeParam}}\\\" without runtime validation. The function returns an unverified type. This is sloppy architecture.\"}},{\"id\":\"avoid-unsafe-type-annotations\",\"severity\":\"error\",\"description\":\"Disallow `any` and `unknown` in value-level type annotation positions (parameters, returns, variables, properties)\",\"fixable\":false,\"category\":\"correctness\",\"plugin\":\"solid\",\"messages\":{\"anyParameter\":\"Parameter '{{name}}' is typed `any`{{inFunction}}. This disables type checking for all callers. Use a specific type, a generic, or `unknown` with proper type narrowing.\",\"anyReturn\":\"Function '{{name}}' returns `any`. This disables type checking for all callers. Use a specific return type.\",\"anyVariable\":\"Variable '{{name}}' is typed `any`. This disables all type checking on this variable. Use a specific type or `unknown` with type narrowing.\",\"anyProperty\":\"Property '{{name}}' is typed `any`. This disables type checking for all accesses. Use a specific type.\",\"unknownParameter\":\"Parameter '{{name}}' is typed `unknown`{{inFunction}}. Callers can pass anything and the function body requires type narrowing on every use. Use a specific type or a generic constraint.\",\"unknownReturn\":\"Function '{{name}}' returns `unknown`. Callers must narrow the return value before use. Use a specific return type or a generic.\",\"unknownVariable\":\"Variable '{{name}}' is typed `unknown`. Every use requires type narrowing. Use a specific type or parse the value at the boundary.\",\"unknownProperty\":\"Property '{{name}}' is typed `unknown`. Every access requires type narrowing. Use a specific type.\"}},{\"id\":\"event-handlers\",\"severity\":\"error\",\"description\":\"Enforce naming DOM element event handlers consistently and prevent Solid's analysis from misunderstanding whether a prop should be an event handler.\",\"fixable\":true,\"category\":\"correctness\",\"plugin\":\"solid\",\"messages\":{\"detectedAttr\":\"The \\\"{{name}}\\\" prop looks like an event handler but has a static value ({{staticValue}}), so Solid will treat it as an attribute instead of attaching an event listener. Use attr:{{name}} to make this explicit, or provide a function value.\",\"naming\":\"The \\\"{{name}}\\\" prop is ambiguous. Solid cannot determine if this is an event handler or an attribute. Use {{handlerName}} for an event handler, or {{attrName}} for an attribute.\",\"capitalization\":\"The \\\"{{name}}\\\" prop should be {{fixedName}} for Solid to recognize it as an event handler. Event handlers use camelCase with an uppercase letter after \\\"on\\\".\",\"nonstandard\":\"The \\\"{{name}}\\\" prop uses a nonstandard event name. Use {{fixedName}} instead, which is the standard DOM event name that Solid recognizes.\",\"makeHandler\":\"Change {{name}} to {{handlerName}} (event handler).\",\"makeAttr\":\"Change {{name}} to {{attrName}} (attribute).\",\"spreadHandler\":\"The \\\"{{name}}\\\" prop is being spread into JSX, which prevents Solid from attaching it as an event listener. Add it directly as a JSX attribute instead: {{name}}={...}.\"}},{\"id\":\"missing-jsdoc-comments\",\"severity\":\"error\",\"description\":\"Require JSDoc comments on functions with appropriate tags for parameters, return values, and throws.\",\"fixable\":false,\"category\":\"correctness\",\"plugin\":\"solid\",\"messages\":{\"missingJsdoc\":\"Function '{{name}}' is missing a JSDoc comment.\",\"missingParam\":\"JSDoc for '{{name}}' is missing @param tag for '{{param}}'.\",\"missingReturn\":\"JSDoc for '{{name}}' is missing @returns tag.\",\"missingThrows\":\"JSDoc for '{{name}}' is missing @throws tag.\",\"missingExample\":\"JSDoc for '{{name}}' is missing @example tag.\",\"missingClassJsdoc\":\"Class '{{name}}' is missing a JSDoc comment.\",\"missingPropertyJsdoc\":\"Property '{{name}}' is missing a JSDoc comment.\"}},{\"id\":\"no-ai-slop-comments\",\"severity\":\"error\",\"description\":\"Disallow comments containing specified forbidden words or phrases. Useful for enforcing comment style guidelines and detecting AI-generated boilerplate.\",\"fixable\":true,\"category\":\"correctness\",\"plugin\":\"solid\",\"messages\":{\"forbiddenWord\":\"Comment contains forbidden word '{{word}}'.\"}},{\"id\":\"no-array-handlers\",\"severity\":\"error\",\"description\":\"Disallow array handlers in JSX event properties.\",\"fixable\":false,\"category\":\"correctness\",\"plugin\":\"solid\",\"messages\":{\"noArrayHandlers\":\"Passing an array to \\\"{{handlerName}}\\\" is type-unsafe. The array syntax `[handler, data]` passes data as the first argument, making the event object the second argument. Use a closure instead: `{{handlerName}}={() => handler(data)}`.\"}},{\"id\":\"no-banner-comments\",\"severity\":\"error\",\"description\":\"Disallow banner-style comments with repeated separator characters.\",\"fixable\":true,\"category\":\"correctness\",\"plugin\":\"solid\",\"messages\":{\"banner\":\"Avoid banner-style comments with repeated separator characters. Use simple comments instead.\"}},{\"id\":\"no-destructure\",\"severity\":\"error\",\"description\":\"Disallow destructuring props in Solid components. Props must be accessed via property access (props.x) to preserve reactivity.\",\"fixable\":false,\"category\":\"correctness\",\"plugin\":\"solid\",\"messages\":{\"noDestructure\":\"Destructuring component props breaks Solid's reactivity. Props are reactive getters, so `{ a }` captures the value at component creation time and won't update. Use `props.a` to access props reactively.\",\"noDestructureWithDefaults\":\"Destructuring component props breaks Solid's reactivity. For default values, use `mergeProps({ a: defaultValue }, props)` instead of `{ a = defaultValue }`.\",\"noDestructureWithRest\":\"Destructuring component props breaks Solid's reactivity. For rest patterns, use `splitProps(props, ['a', 'b'])` instead of `{ a, b, ...rest }`.\",\"noDestructureWithBoth\":\"Destructuring component props breaks Solid's reactivity. For default values with rest, use `splitProps(mergeProps({ a: defaultValue }, props), ['a'])` to combine both patterns.\"}},{\"id\":\"no-inline-imports\",\"severity\":\"error\",\"description\":\"Disallow inline type imports. Import types at the top of the file for clarity and maintainability.\",\"fixable\":false,\"category\":\"correctness\",\"plugin\":\"solid\",\"messages\":{\"inlineImport\":\"Avoid inline imports. Import `{{specifier}}` at the top of the file instead.\"}},{\"id\":\"string-concat-in-loop\",\"severity\":\"error\",\"description\":\"Disallow string concatenation with += inside loops. Use array.push() and .join() instead.\",\"fixable\":false,\"category\":\"correctness\",\"plugin\":\"solid\",\"messages\":{\"stringConcatInLoop\":\"Avoid string concatenation with += inside loops. Use an array with .push() and .join() instead.\"}}],\n \"css-a11y\": [{\"id\":\"css-no-outline-none-without-focus-visible\",\"severity\":\"error\",\"description\":\"Disallow removing outline without explicit focus-visible replacement.\",\"fixable\":false,\"category\":\"css-a11y\",\"plugin\":\"css\",\"messages\":{\"missingFocusVisible\":\"Focus outline removed without matching `:focus-visible` replacement.\"}},{\"id\":\"css-policy-contrast\",\"severity\":\"warn\",\"description\":\"Enforce minimum contrast ratio between foreground and background colors per accessibility policy.\",\"fixable\":false,\"category\":\"css-a11y\",\"plugin\":\"css\",\"messages\":{\"insufficientContrast\":\"Contrast ratio `{{ratio}}:1` between `{{fg}}` and `{{bg}}` is below the minimum `{{min}}:1` for `{{textSize}}` text in policy `{{policy}}`.\"}},{\"id\":\"css-policy-spacing\",\"severity\":\"warn\",\"description\":\"Enforce minimum letter-spacing, word-spacing, and paragraph spacing per accessibility policy.\",\"fixable\":false,\"category\":\"css-a11y\",\"plugin\":\"css\",\"messages\":{\"letterSpacingTooSmall\":\"Letter spacing `{{value}}` ({{resolved}}em) is below the minimum `{{min}}em` for policy `{{policy}}`.\",\"wordSpacingTooSmall\":\"Word spacing `{{value}}` ({{resolved}}em) is below the minimum `{{min}}em` for policy `{{policy}}`.\",\"paragraphSpacingTooSmall\":\"Paragraph spacing `{{value}}` ({{resolved}}em) is below the minimum `{{min}}em` ({{minMultiplier}}× font-size) for policy `{{policy}}`.\"}},{\"id\":\"css-policy-touch-target\",\"severity\":\"warn\",\"description\":\"Enforce minimum interactive element sizes per accessibility policy.\",\"fixable\":false,\"category\":\"css-a11y\",\"plugin\":\"css\",\"messages\":{\"heightTooSmall\":\"`{{property}}` of `{{value}}` ({{resolved}}px) is below the minimum `{{min}}px` for `{{element}}` elements in policy `{{policy}}`.\",\"widthTooSmall\":\"`{{property}}` of `{{value}}` ({{resolved}}px) is below the minimum `{{min}}px` for `{{element}}` elements in policy `{{policy}}`.\",\"paddingTooSmall\":\"Horizontal padding `{{value}}` ({{resolved}}px) is below the minimum `{{min}}px` for `{{element}}` elements in policy `{{policy}}`.\"}},{\"id\":\"css-policy-typography\",\"severity\":\"warn\",\"description\":\"Enforce minimum font sizes and line heights per accessibility policy.\",\"fixable\":false,\"category\":\"css-a11y\",\"plugin\":\"css\",\"messages\":{\"fontTooSmall\":\"Font size `{{value}}` ({{resolved}}px) is below the `{{context}}` minimum of `{{min}}px` for policy `{{policy}}`.\",\"lineHeightTooSmall\":\"Line height `{{value}}` is below the `{{context}}` minimum of `{{min}}` for policy `{{policy}}`.\"}},{\"id\":\"css-require-reduced-motion-override\",\"severity\":\"warn\",\"description\":\"Require reduced-motion override for animated selectors.\",\"fixable\":false,\"category\":\"css-a11y\",\"plugin\":\"css\",\"messages\":{\"missingReducedMotion\":\"Animated selector `{{selector}}` lacks prefers-reduced-motion override.\"}}],\n \"css-animation\": [{\"id\":\"css-no-discrete-transition\",\"severity\":\"error\",\"description\":\"Disallow transitions on discrete CSS properties.\",\"fixable\":false,\"category\":\"css-animation\",\"plugin\":\"css\",\"messages\":{\"discreteTransition\":\"Property `{{property}}` is discrete and should not be transitioned.\"}},{\"id\":\"css-no-empty-keyframes\",\"severity\":\"error\",\"description\":\"Disallow empty @keyframes rules.\",\"fixable\":false,\"category\":\"css-animation\",\"plugin\":\"css\",\"messages\":{\"emptyKeyframes\":\"@keyframes `{{name}}` has no effective keyframes.\"}},{\"id\":\"no-layout-property-animation\",\"severity\":\"warn\",\"description\":\"Disallow animating layout-affecting properties.\",\"fixable\":false,\"category\":\"css-animation\",\"plugin\":\"css\",\"messages\":{\"avoidLayoutAnimation\":\"Avoid animating layout property `{{property}}`. Prefer transform or opacity to reduce layout thrashing.\"}},{\"id\":\"no-transition-all\",\"severity\":\"warn\",\"description\":\"Disallow transition: all and transition-property: all.\",\"fixable\":false,\"category\":\"css-animation\",\"plugin\":\"css\",\"messages\":{\"avoidTransitionAll\":\"Avoid `transition: all`. Transition specific properties to reduce unnecessary style and paint work.\"}},{\"id\":\"no-unknown-animation-name\",\"severity\":\"error\",\"description\":\"Disallow animation names that do not match declared keyframes.\",\"fixable\":false,\"category\":\"css-animation\",\"plugin\":\"css\",\"messages\":{\"unknownAnimationName\":\"Animation name `{{name}}` in `{{property}}` does not match any declared @keyframes.\"}},{\"id\":\"no-unused-keyframes\",\"severity\":\"warn\",\"description\":\"Disallow unused @keyframes declarations.\",\"fixable\":false,\"category\":\"css-animation\",\"plugin\":\"css\",\"messages\":{\"unusedKeyframes\":\"@keyframes `{{name}}` is never referenced by animation declarations.\"}}],\n \"css-cascade\": [{\"id\":\"declaration-no-overridden-within-rule\",\"severity\":\"warn\",\"description\":\"Disallow duplicate declarations of the same property within a single rule block.\",\"fixable\":false,\"category\":\"css-cascade\",\"plugin\":\"css\",\"messages\":{\"overriddenWithinRule\":\"Declaration `{{property}}` is overridden later in the same rule. Keep one final declaration per property.\"}},{\"id\":\"media-query-overlap-conflict\",\"severity\":\"warn\",\"description\":\"Disallow conflicting declarations in partially overlapping media queries.\",\"fixable\":false,\"category\":\"css-cascade\",\"plugin\":\"css\",\"messages\":{\"mediaOverlapConflict\":\"Overlapping media queries set different `{{property}}` values for `{{selector}}` in the same overlap range.\"}},{\"id\":\"no-descending-specificity-conflict\",\"severity\":\"warn\",\"description\":\"Disallow lower-specificity selectors after higher-specificity selectors for the same property.\",\"fixable\":false,\"category\":\"css-cascade\",\"plugin\":\"css\",\"messages\":{\"descendingSpecificity\":\"Lower-specificity selector `{{laterSelector}}` appears after `{{earlierSelector}}` for `{{property}}`, creating brittle cascade behavior.\"}},{\"id\":\"no-layer-order-inversion\",\"severity\":\"warn\",\"description\":\"Disallow source-order assumptions that are inverted by layer precedence.\",\"fixable\":false,\"category\":\"css-cascade\",\"plugin\":\"css\",\"messages\":{\"layerOrderInversion\":\"Declaration for `{{property}}` in selector `{{selector}}` appears later but is overridden by an earlier declaration due to @layer precedence.\"}},{\"id\":\"no-redundant-override-pairs\",\"severity\":\"warn\",\"description\":\"Disallow declarations that are deterministically overridden in the same selector context.\",\"fixable\":false,\"category\":\"css-cascade\",\"plugin\":\"css\",\"messages\":{\"redundantOverride\":\"Declaration `{{property}}` is always overridden later by the same selector in the same cascade context.\"}}],\n \"css-jsx\": [{\"id\":\"css-no-unreferenced-component-class\",\"severity\":\"warn\",\"description\":\"Detect CSS classes that are never referenced by static JSX class attributes.\",\"fixable\":false,\"category\":\"css-jsx\",\"plugin\":\"cross-file\",\"messages\":{\"unreferencedClass\":\"CSS class '{{className}}' is defined but not referenced by static JSX class attributes\"}},{\"id\":\"jsx-classlist-boolean-values\",\"severity\":\"error\",\"description\":\"Require classList values to be boolean-like expressions.\",\"fixable\":false,\"category\":\"css-jsx\",\"plugin\":\"cross-file\",\"messages\":{\"nonBooleanValue\":\"classList value for `{{name}}` must be boolean.\"}},{\"id\":\"jsx-classlist-no-accessor-reference\",\"severity\":\"error\",\"description\":\"Disallow passing accessor references directly as classList values.\",\"fixable\":false,\"category\":\"css-jsx\",\"plugin\":\"cross-file\",\"messages\":{\"accessorReference\":\"Signal accessor `{{name}}` must be called in classList value (use {{name}}()).\"}},{\"id\":\"jsx-classlist-no-constant-literals\",\"severity\":\"warn\",\"description\":\"Disallow classList entries with constant true/false values.\",\"fixable\":false,\"category\":\"css-jsx\",\"plugin\":\"cross-file\",\"messages\":{\"constantEntry\":\"classList entry `{{name}}: {{value}}` is constant; move it to static class.\"}},{\"id\":\"jsx-classlist-static-keys\",\"severity\":\"error\",\"description\":\"Require classList keys to be static and non-computed.\",\"fixable\":false,\"category\":\"css-jsx\",\"plugin\":\"cross-file\",\"messages\":{\"nonStaticKey\":\"classList key must be statically known for reliable class mapping.\"}},{\"id\":\"jsx-layout-classlist-geometry-toggle\",\"severity\":\"warn\",\"description\":\"Flag classList-driven class toggles that map to layout-affecting CSS geometry changes.\",\"fixable\":false,\"category\":\"css-jsx\",\"plugin\":\"cross-file\",\"messages\":{\"classListGeometryToggle\":\"classList toggles '{{className}}', and matching CSS changes layout-affecting '{{property}}', which can cause CLS.\"}},{\"id\":\"jsx-layout-fill-image-parent-must-be-sized\",\"severity\":\"warn\",\"description\":\"Require stable parent size and positioning for fill-image component usage.\",\"fixable\":false,\"category\":\"css-jsx\",\"plugin\":\"cross-file\",\"messages\":{\"unsizedFillParent\":\"Fill-image component '{{component}}' is inside a parent without stable size/position; add parent sizing (height/min-height/aspect-ratio) and non-static position to avoid CLS.\"}},{\"id\":\"jsx-layout-picture-source-ratio-consistency\",\"severity\":\"warn\",\"description\":\"Require consistent intrinsic aspect ratios across <picture> sources and fallback image.\",\"fixable\":false,\"category\":\"css-jsx\",\"plugin\":\"cross-file\",\"messages\":{\"inconsistentPictureRatio\":\"`<picture>` source ratio {{sourceRatio}} differs from fallback img ratio {{imgRatio}}, which can cause reserved-space mismatch and CLS.\"}},{\"id\":\"jsx-layout-unstable-style-toggle\",\"severity\":\"warn\",\"description\":\"Flag dynamic inline style values on layout-sensitive properties that can trigger CLS.\",\"fixable\":false,\"category\":\"css-jsx\",\"plugin\":\"cross-file\",\"messages\":{\"unstableLayoutStyleToggle\":\"Dynamic style value for '{{property}}' can toggle layout geometry at runtime and cause CLS.\"}},{\"id\":\"jsx-no-duplicate-class-token-class-classlist\",\"severity\":\"warn\",\"description\":\"Disallow duplicate class tokens between class and classList on the same JSX element.\",\"fixable\":false,\"category\":\"css-jsx\",\"plugin\":\"cross-file\",\"messages\":{\"duplicateClassToken\":\"Class token `{{name}}` appears in both class and classList.\"}},{\"id\":\"jsx-no-undefined-css-class\",\"severity\":\"error\",\"description\":\"Detect undefined CSS class names in JSX\",\"fixable\":false,\"category\":\"css-jsx\",\"plugin\":\"cross-file\",\"messages\":{\"undefinedClass\":\"CSS class '{{className}}' is not defined in project CSS files\"}},{\"id\":\"jsx-style-kebab-case-keys\",\"severity\":\"error\",\"description\":\"Require kebab-case keys in JSX style object literals.\",\"fixable\":false,\"category\":\"css-jsx\",\"plugin\":\"cross-file\",\"messages\":{\"kebabStyleKey\":\"Style key `{{name}}` should be `{{kebab}}` in Solid style objects.\"}},{\"id\":\"jsx-style-no-function-values\",\"severity\":\"error\",\"description\":\"Disallow function values in JSX style objects.\",\"fixable\":false,\"category\":\"css-jsx\",\"plugin\":\"cross-file\",\"messages\":{\"functionStyleValue\":\"Style value for `{{name}}` is a function; pass computed value instead.\"}},{\"id\":\"jsx-style-no-unused-custom-prop\",\"severity\":\"warn\",\"description\":\"Detect inline style custom properties that are never consumed by CSS var() references.\",\"fixable\":false,\"category\":\"css-jsx\",\"plugin\":\"cross-file\",\"messages\":{\"unusedInlineVar\":\"Inline custom property `{{name}}` is never read via var({{name}}).\"}},{\"id\":\"jsx-style-policy\",\"severity\":\"warn\",\"description\":\"Enforce accessibility policy thresholds on inline JSX style objects.\",\"fixable\":false,\"category\":\"css-jsx\",\"plugin\":\"cross-file\",\"messages\":{\"fontTooSmall\":\"Inline style `{{prop}}: {{value}}` ({{resolved}}px) is below the minimum `{{min}}px` for policy `{{policy}}`.\",\"lineHeightTooSmall\":\"Inline style `line-height: {{value}}` is below the minimum `{{min}}` for policy `{{policy}}`.\",\"heightTooSmall\":\"Inline style `{{prop}}: {{value}}` ({{resolved}}px) is below the minimum `{{min}}px` for interactive elements in policy `{{policy}}`.\",\"letterSpacingTooSmall\":\"Inline style `letter-spacing: {{value}}` ({{resolved}}em) is below the minimum `{{min}}em` for policy `{{policy}}`.\",\"wordSpacingTooSmall\":\"Inline style `word-spacing: {{value}}` ({{resolved}}em) is below the minimum `{{min}}em` for policy `{{policy}}`.\"}}],\n \"css-layout\": [{\"id\":\"css-layout-animation-layout-property\",\"severity\":\"warn\",\"description\":\"Disallow keyframe animations that mutate layout-affecting properties and can trigger CLS.\",\"fixable\":false,\"category\":\"css-layout\",\"plugin\":\"cross-file\",\"messages\":{\"animationLayoutProperty\":\"Animation '{{animation}}' mutates layout-affecting '{{property}}', which can trigger CLS. Prefer transform/opacity or reserve geometry.\"}},{\"id\":\"css-layout-box-sizing-toggle-with-chrome\",\"severity\":\"warn\",\"description\":\"Disallow conditional box-sizing mode toggles when box chrome contributes to geometry shifts.\",\"fixable\":false,\"category\":\"css-layout\",\"plugin\":\"cross-file\",\"messages\":{\"boxSizingToggleWithChrome\":\"Conditional `box-sizing` toggle on '{{tag}}' combines with non-zero padding/border, which can shift layout and trigger CLS.\"}},{\"id\":\"css-layout-conditional-display-collapse\",\"severity\":\"warn\",\"description\":\"Disallow conditional display collapse in flow without reserved geometry.\",\"fixable\":false,\"category\":\"css-layout\",\"plugin\":\"cross-file\",\"messages\":{\"conditionalDisplayCollapse\":\"Conditional display sets '{{display}}' on '{{tag}}' without stable reserved space, which can collapse/expand layout and cause CLS.\"}},{\"id\":\"css-layout-conditional-offset-shift\",\"severity\":\"warn\",\"description\":\"Disallow conditional non-zero block-axis offsets that can trigger layout shifts.\",\"fixable\":false,\"category\":\"css-layout\",\"plugin\":\"cross-file\",\"messages\":{\"conditionalOffsetShift\":\"Conditional style applies non-zero '{{property}}' offset ({{value}}), which can cause layout shifts when conditions toggle.\"}},{\"id\":\"css-layout-conditional-white-space-wrap-shift\",\"severity\":\"warn\",\"description\":\"Disallow conditional white-space wrapping mode toggles that can trigger CLS.\",\"fixable\":false,\"category\":\"css-layout\",\"plugin\":\"cross-file\",\"messages\":{\"conditionalWhiteSpaceShift\":\"Conditional white-space '{{whiteSpace}}' on '{{tag}}' can reflow text and shift siblings; keep wrapping behavior stable or reserve geometry.\"}},{\"id\":\"css-layout-content-visibility-no-intrinsic-size\",\"severity\":\"warn\",\"description\":\"Require intrinsic size reservation when using content-visibility auto to avoid late layout shifts.\",\"fixable\":false,\"category\":\"css-layout\",\"plugin\":\"cross-file\",\"messages\":{\"missingIntrinsicSize\":\"`content-visibility: auto` on '{{tag}}' lacks intrinsic size reservation (`contain-intrinsic-size`/min-height/height/aspect-ratio), which can cause CLS.\"}},{\"id\":\"css-layout-dynamic-slot-no-reserved-space\",\"severity\":\"warn\",\"description\":\"Require reserved block space for dynamic content containers to avoid layout shifts.\",\"fixable\":false,\"category\":\"css-layout\",\"plugin\":\"cross-file\",\"messages\":{\"dynamicSlotNoReservedSpace\":\"Dynamic content container '{{tag}}' does not reserve block space (min-height/height/aspect-ratio/contain-intrinsic-size), which can cause CLS.\"}},{\"id\":\"css-layout-font-swap-instability\",\"severity\":\"warn\",\"description\":\"Require metric overrides for swapping webfonts to reduce layout shifts during font load.\",\"fixable\":false,\"category\":\"css-layout\",\"plugin\":\"cross-file\",\"messages\":{\"unstableFontSwap\":\"`@font-face` for '{{family}}' uses `font-display: {{display}}` without metric overrides (for example `size-adjust`), which can cause CLS when the webfont swaps in.\"}},{\"id\":\"css-layout-overflow-anchor-instability\",\"severity\":\"warn\",\"description\":\"Disallow overflow-anchor none on dynamic or scrollable containers prone to visible layout shifts.\",\"fixable\":false,\"category\":\"css-layout\",\"plugin\":\"cross-file\",\"messages\":{\"unstableOverflowAnchor\":\"Element '{{tag}}' sets `overflow-anchor: none` on a {{context}} container; disabling scroll anchoring can amplify visible layout shifts.\"}},{\"id\":\"css-layout-overflow-mode-toggle-instability\",\"severity\":\"warn\",\"description\":\"Disallow conditional overflow mode switches that can introduce scrollbar-induced layout shifts.\",\"fixable\":false,\"category\":\"css-layout\",\"plugin\":\"cross-file\",\"messages\":{\"overflowModeToggle\":\"Conditional overflow mode changes scrolling ('{{overflow}}') on '{{tag}}' without `scrollbar-gutter: stable`, which can trigger CLS.\"}},{\"id\":\"css-layout-scrollbar-gutter-instability\",\"severity\":\"warn\",\"description\":\"Require stable scrollbar gutters for scrollable containers to reduce layout shifts.\",\"fixable\":false,\"category\":\"css-layout\",\"plugin\":\"cross-file\",\"messages\":{\"missingScrollbarGutter\":\"Scrollable container '{{tag}}' uses overflow auto/scroll without `scrollbar-gutter: stable`, which can trigger CLS when scrollbars appear.\"}},{\"id\":\"css-layout-sibling-alignment-outlier\",\"severity\":\"warn\",\"description\":\"Detect vertical alignment outliers between sibling elements in shared layout containers.\",\"fixable\":false,\"category\":\"css-layout\",\"plugin\":\"cross-file\",\"messages\":{\"misalignedSibling\":\"Element '{{subject}}' appears vertically misaligned relative to sibling cohort in '{{parent}}' (context {{context}}, severity {{severity}}, confidence {{confidence}}{{offsetClause}}; causes: {{causes}}).\"}},{\"id\":\"css-layout-stateful-box-model-shift\",\"severity\":\"warn\",\"description\":\"Disallow stateful selector changes that alter element geometry and trigger layout shifts.\",\"fixable\":false,\"category\":\"css-layout\",\"plugin\":\"cross-file\",\"messages\":{\"statefulBoxModelShift\":\"State selector '{{selector}}' changes layout-affecting '{{property}}'. Keep geometry stable across states to avoid CLS.\"}},{\"id\":\"css-layout-transition-layout-property\",\"severity\":\"warn\",\"description\":\"Disallow transitions that animate layout-affecting geometry properties.\",\"fixable\":false,\"category\":\"css-layout\",\"plugin\":\"cross-file\",\"messages\":{\"transitionLayoutProperty\":\"Transition '{{property}}' in '{{declaration}}' animates layout-affecting geometry. Prefer transform/opacity to avoid CLS.\"}},{\"id\":\"css-layout-unsized-replaced-element\",\"severity\":\"warn\",\"description\":\"Require stable reserved geometry for replaced media elements to prevent layout shifts.\",\"fixable\":false,\"category\":\"css-layout\",\"plugin\":\"cross-file\",\"messages\":{\"unsizedReplacedElement\":\"Replaced element '{{tag}}' has no stable reserved size (width/height or aspect-ratio with a dimension), which can cause CLS.\"}}],\n \"css-property\": [{\"id\":\"css-no-custom-property-cycle\",\"severity\":\"error\",\"description\":\"Disallow cycles in custom property references.\",\"fixable\":false,\"category\":\"css-property\",\"plugin\":\"css\",\"messages\":{\"variableCycle\":\"Custom property cycle detected involving `{{name}}`.\"}},{\"id\":\"css-no-hardcoded-z-index\",\"severity\":\"warn\",\"description\":\"Disallow hardcoded positive z-index literals.\",\"fixable\":false,\"category\":\"css-property\",\"plugin\":\"css\",\"messages\":{\"hardcodedZ\":\"Use a z-index token variable instead of literal `{{value}}`.\"}},{\"id\":\"css-no-legacy-vh-100\",\"severity\":\"warn\",\"description\":\"Disallow 100vh in viewport sizing declarations.\",\"fixable\":false,\"category\":\"css-property\",\"plugin\":\"css\",\"messages\":{\"avoidLegacyVh\":\"Use 100dvh/100svh instead of `100vh` for mobile-safe viewport sizing.\"}},{\"id\":\"css-z-index-requires-positioned-context\",\"severity\":\"warn\",\"description\":\"Require positioned context when using z-index.\",\"fixable\":false,\"category\":\"css-property\",\"plugin\":\"css\",\"messages\":{\"zIndexNoContext\":\"`z-index` has no guaranteed effect without a positioned context.\"}},{\"id\":\"no-important\",\"severity\":\"warn\",\"description\":\"Disallow !important declarations.\",\"fixable\":false,\"category\":\"css-property\",\"plugin\":\"css\",\"messages\":{\"avoidImportant\":\"Avoid `!important` on `{{property}}`. It increases override cost and usually signals specificity debt.\"}},{\"id\":\"no-unresolved-custom-properties\",\"severity\":\"error\",\"description\":\"Disallow unresolved custom property references.\",\"fixable\":false,\"category\":\"css-property\",\"plugin\":\"css\",\"messages\":{\"unresolvedCustomProperty\":\"Custom property reference `{{name}}` is unresolved in `{{property}}`. Define it or provide a fallback value.\"}},{\"id\":\"no-unused-custom-properties\",\"severity\":\"warn\",\"description\":\"Disallow unused CSS custom properties.\",\"fixable\":false,\"category\":\"css-property\",\"plugin\":\"css\",\"messages\":{\"unusedCustomProperty\":\"Custom property `{{name}}` is never referenced within the project CSS.\"}}],\n \"css-selector\": [{\"id\":\"no-complex-selectors\",\"severity\":\"warn\",\"description\":\"Disallow deep selectors that are expensive to match.\",\"fixable\":false,\"category\":\"css-selector\",\"plugin\":\"css\",\"messages\":{\"selectorTooDeep\":\"Selector `{{selector}}` has depth {{depth}}. Deep selectors increase style recalculation cost and are fragile across component rerenders.\"}},{\"id\":\"no-duplicate-selectors\",\"severity\":\"warn\",\"description\":\"Disallow duplicate selector blocks.\",\"fixable\":false,\"category\":\"css-selector\",\"plugin\":\"css\",\"messages\":{\"duplicateSelector\":\"Selector `{{selector}}` is duplicated {{count}} times. Merge declarations to avoid cascade ambiguity.\"}},{\"id\":\"no-id-selectors\",\"severity\":\"warn\",\"description\":\"Disallow ID selectors.\",\"fixable\":false,\"category\":\"css-selector\",\"plugin\":\"css\",\"messages\":{\"avoidId\":\"Avoid ID selector in `{{selector}}`. IDs raise specificity and make component-level styling harder to maintain.\"}},{\"id\":\"selector-max-attribute-and-universal\",\"severity\":\"off\",\"description\":\"Disallow selectors with attribute or universal selectors beyond configured limits.\",\"fixable\":false,\"category\":\"css-selector\",\"plugin\":\"css\",\"messages\":{\"tooManyAttributes\":\"Selector `{{selector}}` uses {{count}} attribute selector(s). Maximum allowed is {{max}}.\",\"tooManyUniversals\":\"Selector `{{selector}}` uses {{count}} universal selector(s). Maximum allowed is {{max}}.\"}},{\"id\":\"selector-max-specificity\",\"severity\":\"warn\",\"description\":\"Disallow selectors that exceed a specificity threshold.\",\"fixable\":false,\"category\":\"css-selector\",\"plugin\":\"css\",\"messages\":{\"maxSpecificity\":\"Selector `{{selector}}` specificity {{specificity}} exceeds max {{max}}. Reduce selector weight to keep the cascade predictable.\"}}],\n \"css-structure\": [{\"id\":\"css-no-empty-rule\",\"severity\":\"warn\",\"description\":\"Disallow empty CSS rules.\",\"fixable\":false,\"category\":\"css-structure\",\"plugin\":\"css\",\"messages\":{\"emptyRule\":\"Empty rule `{{selector}}` should be removed.\"}},{\"id\":\"css-no-unknown-container-name\",\"severity\":\"error\",\"description\":\"Disallow unknown named containers in @container queries.\",\"fixable\":false,\"category\":\"css-structure\",\"plugin\":\"css\",\"messages\":{\"unknownContainer\":\"Unknown container name `{{name}}` in @container query.\"}},{\"id\":\"css-no-unused-container-name\",\"severity\":\"warn\",\"description\":\"Disallow unused named containers.\",\"fixable\":false,\"category\":\"css-structure\",\"plugin\":\"css\",\"messages\":{\"unusedContainer\":\"Container name `{{name}}` is declared but never queried.\"}},{\"id\":\"layer-requirement-for-component-rules\",\"severity\":\"warn\",\"description\":\"Require style rules to be inside @layer when the file defines layers.\",\"fixable\":false,\"category\":\"css-structure\",\"plugin\":\"css\",\"messages\":{\"missingLayer\":\"Rule `{{selector}}` is not inside any @layer block while this file uses @layer. Place component rules inside an explicit layer.\"}}],\n \"jsx\": [{\"id\":\"components-return-once\",\"severity\":\"error\",\"description\":\"Disallow early returns in components. Solid components only run once, and so conditionals should be inside JSX.\",\"fixable\":true,\"category\":\"jsx\",\"plugin\":\"solid\",\"messages\":{\"noEarlyReturn\":\"Early returns in Solid components break reactivity because the component function only runs once. Use <Show> or <Switch>/<Match> inside the JSX to conditionally render content instead of returning early from the function.\",\"noConditionalReturn\":\"Conditional expressions in return statements break reactivity because Solid components only run once. Wrap the condition in <Show when={...}> for a single condition, or <Switch>/<Match> for multiple conditions.\"}},{\"id\":\"jsx-no-duplicate-props\",\"severity\":\"error\",\"description\":\"Disallow passing the same prop twice in JSX.\",\"fixable\":true,\"category\":\"jsx\",\"plugin\":\"solid\",\"messages\":{\"noDuplicateProps\":\"Duplicate prop detected. Each prop should only be specified once; the second value will override the first.\",\"noDuplicateClass\":\"Duplicate `class` prop detected. While this might appear to work, it can break unexpectedly because only one class binding is applied. Use `classList` to conditionally apply multiple classes.\",\"noDuplicateChildren\":\"Conflicting children: {{used}}. Only one method of setting children is allowed at a time.\"}},{\"id\":\"jsx-no-script-url\",\"severity\":\"error\",\"description\":\"Disallow javascript: URLs.\",\"fixable\":true,\"category\":\"jsx\",\"plugin\":\"solid\",\"messages\":{\"noJSURL\":\"Using javascript: URLs is a security risk because it can enable cross-site scripting (XSS) attacks. Use an event handler like onClick instead, or navigate programmatically with useNavigate().\"}},{\"id\":\"jsx-no-undef\",\"severity\":\"error\",\"description\":\"Disallow references to undefined variables in JSX. Handles custom directives.\",\"fixable\":false,\"category\":\"jsx\",\"plugin\":\"solid\",\"messages\":{\"customDirectiveUndefined\":\"Custom directive '{{identifier}}' is not defined. Directives must be imported or declared in scope before use (e.g., `const {{identifier}} = (el, accessor) => { ... }`).\"}},{\"id\":\"jsx-uses-vars\",\"severity\":\"warn\",\"description\":\"Detect imported components and directives that are never used in JSX.\",\"fixable\":false,\"category\":\"jsx\",\"plugin\":\"solid\",\"messages\":{\"unusedComponent\":\"Component '{{name}}' is imported but never used in JSX.\",\"unusedDirective\":\"Directive '{{name}}' is imported but never used in JSX.\"}},{\"id\":\"no-innerhtml\",\"severity\":\"error\",\"description\":\"Disallow usage of the innerHTML attribute, which can lead to security vulnerabilities.\",\"fixable\":true,\"category\":\"jsx\",\"plugin\":\"solid\",\"messages\":{\"dangerous\":\"Using innerHTML with dynamic content is a security risk. Unsanitized user input can lead to cross-site scripting (XSS) attacks. Use a sanitization library or render content safely.\",\"conflict\":\"The innerHTML prop will overwrite all child elements. Remove the children or use innerHTML on an empty element.\",\"notHtml\":\"The innerHTML value doesn't appear to be HTML. If you're setting text content, use innerText instead for clarity and safety.\",\"dangerouslySetInnerHTML\":\"The dangerouslySetInnerHTML is a React prop that Solid doesn't support. Use innerHTML instead.\"}},{\"id\":\"no-unknown-namespaces\",\"severity\":\"error\",\"description\":\"Enforce using only Solid-specific namespaced attribute names (i.e. `'on:'` in `<div on:click={...} />`).\",\"fixable\":false,\"category\":\"jsx\",\"plugin\":\"solid\",\"messages\":{\"unknownNamespace\":\"'{{namespace}}:' is not a recognized Solid namespace. Valid namespaces are: {{validNamespaces}}.\",\"styleNamespace\":\"The 'style:' namespace works but is discouraged. Use the style prop with an object instead: style={{ {{property}}: value }}.\",\"classNamespace\":\"The 'class:' namespace works but is discouraged. Use the classList prop instead: classList={{ \\\"{{className}}\\\": condition }}.\",\"componentNamespace\":\"Namespaced attributes like '{{namespace}}:' only work on DOM elements, not components. The '{{fullName}}' attribute will be passed as a regular prop named '{{fullName}}'.\"}},{\"id\":\"show-truthy-conversion\",\"severity\":\"error\",\"description\":\"Detect <Show when={expr}> where expr is not explicitly boolean, which may have unexpected truthy/falsy behavior.\",\"fixable\":true,\"category\":\"jsx\",\"plugin\":\"solid\",\"messages\":{\"showNonBoolean\":\"<Show when={{{{expr}}}}> uses truthy/falsy conversion. Value '0' or empty string '' will hide content. Use explicit boolean: when={Boolean({{expr}})} or when={{{expr}}} != null}\"}},{\"id\":\"suspense-boundary-missing\",\"severity\":\"error\",\"description\":\"Detect missing fallback props on Suspense/ErrorBoundary, and lazy components without Suspense wrapper.\",\"fixable\":false,\"category\":\"jsx\",\"plugin\":\"solid\",\"messages\":{\"suspenseNoFallback\":\"<Suspense> should have a fallback prop to show while children are loading. Add: fallback={<Loading />}\",\"errorBoundaryNoFallback\":\"<ErrorBoundary> should have a fallback prop to show when an error occurs. Add: fallback={(err) => <Error error={err} />}\",\"lazyNoSuspense\":\"Lazy component '{{name}}' must be wrapped in a <Suspense> boundary. Add a <Suspense fallback={...}> ancestor.\"}},{\"id\":\"validate-jsx-nesting\",\"severity\":\"error\",\"description\":\"Validates that HTML elements are nested according to the HTML5 specification.\",\"fixable\":false,\"category\":\"jsx\",\"plugin\":\"solid\",\"messages\":{\"invalidNesting\":\"Invalid HTML nesting: <{{child}}> cannot be a child of <{{parent}}>. {{reason}}.\",\"voidElementWithChildren\":\"<{{parent}}> is a void element and cannot have children. Found <{{child}}> as a child.\",\"invalidListChild\":\"<{{child}}> is not a valid direct child of <{{parent}}>. Only <li> elements can be direct children of <ul> and <ol>.\",\"invalidSelectChild\":\"<{{child}}> is not a valid direct child of <select>. Only <option> and <optgroup> elements are allowed.\",\"invalidTableChild\":\"<{{child}}> is not a valid direct child of <{{parent}}>. Expected: {{expected}}.\",\"invalidDlChild\":\"<{{child}}> is not a valid direct child of <dl>. Only <dt>, <dd>, and <div> elements are allowed.\"}}],\n \"performance\": [{\"id\":\"avoid-arguments-object\",\"severity\":\"warn\",\"description\":\"Disallow arguments object (use rest parameters instead).\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"avoidArguments\":\"arguments object can prevent V8 optimization. Use rest parameters (...args) instead.\"}},{\"id\":\"avoid-chained-array-methods\",\"severity\":\"warn\",\"description\":\"Flags chained array methods creating 3+ intermediate arrays, or filter().map() pattern.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"avoidChainedArrayMethods\":\"Chain creates {{count}} intermediate array(s). Consider reduce() or a loop. Chain: {{chain}}\",\"mapJoinHotPath\":\"map().join() inside loops allocates intermediate arrays on a hot path. Prefer single-pass string construction.\"}},{\"id\":\"avoid-defensive-copy-for-scalar-stat\",\"severity\":\"warn\",\"description\":\"Disallow defensive array copies passed into scalar statistic calls.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"defensiveCopy\":\"Defensive copy before scalar statistic '{{stat}}' allocates unnecessarily. Prefer readonly/non-mutating scalar computation.\"}},{\"id\":\"avoid-delete-operator\",\"severity\":\"warn\",\"description\":\"Disallow delete operator on objects (causes V8 deoptimization).\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"avoidDelete\":\"delete operator transitions object to slow mode. Use `obj.prop = undefined` or destructuring instead.\"}},{\"id\":\"avoid-function-allocation-in-hot-loop\",\"severity\":\"warn\",\"description\":\"Disallow creating closures inside loops.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"closureInLoop\":\"Function created inside loop allocates new closure per iteration. Consider hoisting or using event delegation.\"}},{\"id\":\"avoid-hidden-class-transition\",\"severity\":\"warn\",\"description\":\"Suggest consistent object shapes to avoid V8 hidden class transitions.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"hiddenClassTransition\":\"Property '{{property}}' added conditionally to '{{object}}' creates inconsistent object shapes. Initialize '{{property}}' in the object literal.\"}},{\"id\":\"avoid-intermediate-map-copy\",\"severity\":\"warn\",\"description\":\"Disallow temporary Map allocations that are copied key-for-key into another Map.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"intermediateMapCopy\":\"Intermediate Map '{{tempName}}' is copied into '{{outName}}' key-for-key. Build output directly to avoid extra allocation.\"}},{\"id\":\"avoid-megamorphic-property-access\",\"severity\":\"warn\",\"description\":\"Avoid property access on `any` or wide union types to prevent V8 deoptimization.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"megamorphicAccess\":\"Property access on `any` or wide union type causes V8 deoptimization. Consider narrowing the type.\"}},{\"id\":\"avoid-quadratic-pair-comparison\",\"severity\":\"warn\",\"description\":\"Disallow nested for-loops over the same collection creating O(n²) pair comparison.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"quadraticPair\":\"Nested loops over `{{collection}}` create O(n²) pair comparison. Group by a key property first.\"}},{\"id\":\"avoid-quadratic-spread\",\"severity\":\"error\",\"description\":\"Disallow spreading accumulator in reduce callbacks (O(n²) complexity).\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"quadraticSpread\":\"Spreading accumulator in reduce creates O(n²) complexity. Use push() instead.\"}},{\"id\":\"avoid-repeated-indexof-check\",\"severity\":\"warn\",\"description\":\"Disallow 3+ .indexOf() calls on the same array variable in one function.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"repeatedIndexOf\":\"{{count}} .indexOf() calls on `{{name}}` in the same function. Use a Set, regex, or single-pass scan instead.\"}},{\"id\":\"avoid-slice-sort-pattern\",\"severity\":\"warn\",\"description\":\"Disallow .slice().sort() and .slice().reverse() chains. Use .toSorted()/.toReversed().\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"sliceSort\":\".slice().sort() creates an intermediate array. Use .toSorted() instead.\",\"sliceReverse\":\".slice().reverse() creates an intermediate array. Use .toReversed() instead.\",\"spreadSort\":\"[...array].sort() creates an intermediate array. Use .toSorted() instead.\",\"spreadReverse\":\"[...array].reverse() creates an intermediate array. Use .toReversed() instead.\"}},{\"id\":\"avoid-sparse-arrays\",\"severity\":\"warn\",\"description\":\"Disallow new Array(n) without fill (creates holey array).\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"sparseArray\":\"new Array(n) creates a holey array. Use Array.from() or .fill() instead.\"}},{\"id\":\"avoid-spread-sort-map-join-pipeline\",\"severity\":\"warn\",\"description\":\"Disallow [...iterable].sort().map().join() pipelines on hot paths.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"spreadSortMapJoin\":\"Spread+sort+map+join pipeline allocates multiple intermediates. Prefer single-pass string construction on hot paths.\"}},{\"id\":\"bounded-worklist-traversal\",\"severity\":\"warn\",\"description\":\"Detect queue/worklist traversals with unbounded growth and no guard.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"boundedWorklist\":\"Worklist '{{name}}' grows via push() without visited set or explicit size bound. Add traversal guard to prevent pathological growth.\"}},{\"id\":\"closure-captured-scope\",\"severity\":\"warn\",\"description\":\"Detect closures returned from scopes containing large allocations that may be retained.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"capturedScope\":\"Returned closure shares scope with large allocation '{{name}}'. V8 may retain the allocation via scope capture even though the closure doesn't reference it. Move the allocation to an inner scope.\"}},{\"id\":\"closure-dom-circular\",\"severity\":\"warn\",\"description\":\"Detect event handler property assignments that create closure-DOM circular references.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"circularRef\":\"Event handler on '{{param}}' creates a closure that captures '{{param}}', forming a closure-DOM circular reference. Use addEventListener with a named handler for easier cleanup.\"}},{\"id\":\"create-root-dispose\",\"severity\":\"warn\",\"description\":\"Detect createRoot with unused dispose parameter.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"unusedDispose\":\"createRoot() dispose parameter is never used. The reactive tree will never be cleaned up. Call dispose(), return it, or pass it to onCleanup().\"}},{\"id\":\"detached-dom-reference\",\"severity\":\"warn\",\"description\":\"Detect DOM query results stored in module-scoped variables that may hold detached nodes.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"detachedRef\":\"DOM query result from '{{method}}' stored in module-scoped variable '{{name}}'. If the DOM node is removed, this reference prevents garbage collection. Use a local variable or WeakRef instead.\"}},{\"id\":\"effect-outside-root\",\"severity\":\"error\",\"description\":\"Detect reactive computations created outside a reactive root (no Owner).\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"orphanedEffect\":\"{{primitive}}() called outside a reactive root. Without an Owner, this computation is never disposed and leaks memory. Wrap in a component, createRoot, or runWithOwner.\"}},{\"id\":\"finalization-registry-leak\",\"severity\":\"error\",\"description\":\"Detect FinalizationRegistry.register() where heldValue references the target.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"selfReference\":\"FinalizationRegistry.register() heldValue references the target '{{name}}'. This strong reference prevents the target from being garbage collected, defeating the purpose of the registry.\"}},{\"id\":\"no-char-array-materialization\",\"severity\":\"warn\",\"description\":\"Disallow split(\\\"\\\"), Array.from(str), or [...str] in parsing loops.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"charArrayMaterialization\":\"Character array materialization via {{pattern}} in parsing loops allocates O(n) extra memory. Prefer index-based scanning.\"}},{\"id\":\"no-double-pass-delimiter-count\",\"severity\":\"warn\",\"description\":\"Disallow split-based delimiter counting followed by additional split passes.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"doublePassDelimiterCount\":\"Delimiter counting via `split(...).length` plus another `split(...)` repeats full-string passes. Prefer one indexed scan.\"}},{\"id\":\"no-full-split-in-hot-parse\",\"severity\":\"warn\",\"description\":\"Disallow full split() materialization inside hot string parsing loops.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"fullSplitInHotParse\":\"`split()` inside parsing loops materializes full token arrays each iteration. Prefer cursor/index scanning.\"}},{\"id\":\"no-heavy-parser-constructor-in-loop\",\"severity\":\"warn\",\"description\":\"Disallow constructing heavy parsing helpers inside loops.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"heavyParserConstructor\":\"`new {{ctor}}(...)` inside parsing loops repeatedly allocates heavy parser helpers. Hoist and reuse instances.\"}},{\"id\":\"no-leaked-abort-controller\",\"severity\":\"warn\",\"description\":\"Detect AbortController in effects without abort() in onCleanup.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"leakedAbort\":\"new AbortController() inside a reactive effect without onCleanup. Add onCleanup(() => controller.abort()).\"}},{\"id\":\"no-leaked-animation-frame\",\"severity\":\"warn\",\"description\":\"Detect requestAnimationFrame in effects without cancelAnimationFrame in onCleanup.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"leakedRaf\":\"requestAnimationFrame() inside a reactive effect without onCleanup. Add onCleanup(() => cancelAnimationFrame(id)).\"}},{\"id\":\"no-leaked-event-listener\",\"severity\":\"warn\",\"description\":\"Detect addEventListener in effects without removeEventListener in onCleanup.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"leakedListener\":\"addEventListener() inside a reactive effect without onCleanup. Each re-run leaks a listener. Add onCleanup(() => removeEventListener(...)).\"}},{\"id\":\"no-leaked-observer\",\"severity\":\"warn\",\"description\":\"Detect Observer APIs in effects without disconnect() in onCleanup.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"leakedObserver\":\"new {{type}}() inside a reactive effect without onCleanup. Add onCleanup(() => observer.disconnect()).\"}},{\"id\":\"no-leaked-subscription\",\"severity\":\"warn\",\"description\":\"Detect WebSocket/EventSource/BroadcastChannel in effects without close() in onCleanup.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"leakedSubscription\":\"new {{type}}() inside a reactive effect without onCleanup. Add onCleanup(() => instance.close()).\"}},{\"id\":\"no-leaked-timer\",\"severity\":\"warn\",\"description\":\"Detect setInterval/setTimeout in effects without onCleanup to clear them.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"leakedTimer\":\"{{setter}}() inside a reactive effect without onCleanup. Each re-run leaks a timer. Add onCleanup(() => {{clearer}}(id)).\"}},{\"id\":\"no-loop-string-plus-equals\",\"severity\":\"warn\",\"description\":\"Disallow repeated string += accumulation in parsing loops.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"loopStringPlusEquals\":\"Repeated string `+=` in parsing loops creates avoidable allocations. Buffer chunks and join once.\"}},{\"id\":\"no-multipass-split-pipeline\",\"severity\":\"warn\",\"description\":\"Disallow multipass split/map/filter pipelines in parsing code.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"multipassSplit\":\"`split()` followed by multiple array passes allocates heavily on parsing paths. Prefer single-pass parsing.\"}},{\"id\":\"no-per-char-substring-scan\",\"severity\":\"warn\",\"description\":\"Disallow per-character substring/charAt scanning patterns in loops.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"perCharSubstring\":\"Per-character `{{method}}()` scanning in loops allocates extra strings. Prefer index + charCodeAt scanning.\"}},{\"id\":\"no-repeated-token-normalization\",\"severity\":\"warn\",\"description\":\"Disallow repeated trim/lower/upper normalization chains on the same token in one function.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"repeatedTokenNormalization\":\"Repeated token normalization `{{chain}}` on `{{name}}` in one function. Compute once and reuse.\"}},{\"id\":\"no-rescan-indexof-loop\",\"severity\":\"warn\",\"description\":\"Disallow repeated indexOf/includes scans from start in parsing loops.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"rescanIndexOf\":\"Repeated `{{method}}()` from string start inside loops rescans prior text. Pass a cursor start index.\"}},{\"id\":\"no-rest-slice-loop\",\"severity\":\"warn\",\"description\":\"Disallow repeated self-slice reassignment loops in string parsing code.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"restSliceLoop\":\"Repeated `{{name}} = {{name}}.{{method}}(...)` in loops creates string churn. Track cursor indexes instead.\"}},{\"id\":\"no-shift-splice-head-consume\",\"severity\":\"warn\",\"description\":\"Disallow shift/splice(0,1) head-consume patterns in loops.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"headConsume\":\"Head-consuming `{{method}}()` inside loops causes array reindexing costs. Use index cursor iteration instead.\"}},{\"id\":\"no-write-only-index\",\"severity\":\"warn\",\"description\":\"Detect index structures that are written but never queried by key.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"writeOnlyIndex\":\"Index '{{name}}' is built via writes but never queried by key. Remove it or use direct collection flow.\"}},{\"id\":\"prefer-charcode-over-regex-test\",\"severity\":\"warn\",\"description\":\"Prefer charCodeAt() range checks over regex .test() for single-character classification.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"regexTest\":\"Regex `{{pattern}}`.test() on a single character. Use charCodeAt() range checks instead.\"}},{\"id\":\"prefer-index-scan-over-string-iterator\",\"severity\":\"warn\",\"description\":\"Prefer index-based string scanning over for-of iteration in ASCII parser code.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"preferIndexScan\":\"ASCII parsing loops should avoid `for...of` string iteration. Prefer indexed scanning with charCodeAt for lower overhead.\"}},{\"id\":\"prefer-lazy-property-access\",\"severity\":\"warn\",\"description\":\"Suggests moving property access after early returns when not used immediately.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"preferLazyPropertyAccess\":\"Property '{{propertyName}}' assigned to '{{variableName}}' before early return but not used there. Move assignment after early returns.\"}},{\"id\":\"prefer-map-lookup-over-linear-scan\",\"severity\":\"warn\",\"description\":\"Disallow repeated linear scans over fixed literal collections in hot paths.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"preferMapLookup\":\"Linear scan over fixed collection '{{name}}' in '{{fnName}}'. Precompute Map/Set lookup for O(1) access.\"}},{\"id\":\"prefer-map-over-object-dictionary\",\"severity\":\"warn\",\"description\":\"Suggest Map for dictionary-like objects with dynamic keys.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"preferMap\":\"Dynamic key assignment on dictionary object causes hidden class transitions. Consider using Map.\"}},{\"id\":\"prefer-precompiled-regex\",\"severity\":\"warn\",\"description\":\"Prefer hoisting regex literals to module-level constants to avoid repeated compilation.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"inlineRegex\":\"Regex `{{pattern}}` is compiled on every call. Hoist to a module-level constant.\"}},{\"id\":\"prefer-set-has-over-equality-chain\",\"severity\":\"warn\",\"description\":\"Disallow 4+ guard-style equality checks against string literals on the same variable. Use a Set.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"equalityChain\":\"{{count}} equality checks against `{{name}}`. Extract literals to a Set and use .has() instead.\"}},{\"id\":\"prefer-set-lookup-in-loop\",\"severity\":\"warn\",\"description\":\"Disallow linear search methods (.includes/.indexOf) on arrays inside loops.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"preferSet\":\"`.{{method}}()` on `{{name}}` called inside a loop. Convert to a Set for O(1) lookups.\"}},{\"id\":\"recursive-timer\",\"severity\":\"warn\",\"description\":\"Detect setTimeout that recursively calls its enclosing function.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"recursiveTimer\":\"setTimeout() recursively calls '{{name}}', creating an unbreakable polling loop. Add a termination condition or use setInterval with cleanup.\"}},{\"id\":\"self-referencing-store\",\"severity\":\"error\",\"description\":\"Detect setStore() where the value argument references the store itself.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"selfReference\":\"setStore() value references the store variable '{{name}}', creating a circular proxy reference. This prevents garbage collection and can cause infinite loops.\"}},{\"id\":\"unbounded-collection\",\"severity\":\"warn\",\"description\":\"Detect module-scoped Map/Set/Array that only grow without removal.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"unboundedCollection\":\"Module-scoped {{type}} '{{name}}' only uses additive methods ({{methods}}). Without removal or clearing, this grows unbounded. Consider WeakMap, LRU eviction, or periodic clear().\"}},{\"id\":\"unbounded-signal-accumulation\",\"severity\":\"warn\",\"description\":\"Detect signal setters that accumulate data without truncation via spread+append pattern.\",\"fixable\":false,\"category\":\"performance\",\"plugin\":\"solid\",\"messages\":{\"unbounded\":\"Signal setter '{{name}}' accumulates data without bounds. The array grows monotonically via spread+append. Add truncation (e.g. prev.slice(-limit)) to prevent unbounded growth.\"}}],\n \"reactivity\": [{\"id\":\"async-tracked\",\"severity\":\"error\",\"description\":\"Disallow async functions in tracked scopes (createEffect, createMemo, etc.)\",\"fixable\":false,\"category\":\"reactivity\",\"plugin\":\"solid\",\"messages\":{\"asyncCreateEffect\":\"Async function{{fnName}} in createEffect loses tracking after await. Read all signals before the first await, or use createResource for async data fetching.\",\"asyncCreateMemo\":\"Async function{{fnName}} in createMemo won't work correctly. createMemo must be synchronous. For async derived data, use createResource instead.\",\"asyncCreateComputed\":\"Async function{{fnName}} in createComputed won't track properly. createComputed must be synchronous—signal reads after await won't trigger re-computation.\",\"asyncCreateRenderEffect\":\"Async function{{fnName}} in createRenderEffect breaks DOM update timing. createRenderEffect must be synchronous. Move async work to onMount or createResource.\",\"asyncTrackedGeneric\":\"Async function{{fnName}} in {{source}} won't track reactivity after await. Solid's tracking only works synchronously—signal reads after await are ignored.\"}},{\"id\":\"children-helper-misuse\",\"severity\":\"error\",\"description\":\"Detect misuse of the children() helper that causes unnecessary re-computation or breaks reactivity\",\"fixable\":false,\"category\":\"reactivity\",\"plugin\":\"solid\",\"messages\":{\"multipleChildrenCalls\":\"The children() helper should only be called once per component. Each call re-resolves children, causing unnecessary computation. Store the result and reuse the accessor.\",\"directChildrenAccess\":\"Access props.children through the children() helper in reactive contexts. Direct access won't properly resolve or track children. Use: const resolved = children(() => props.children);\"}},{\"id\":\"cleanup-scope\",\"severity\":\"error\",\"description\":\"Detect onCleanup called outside of a valid reactive scope\",\"fixable\":false,\"category\":\"reactivity\",\"plugin\":\"solid\",\"messages\":{\"cleanupOutsideScope\":\"onCleanup() called outside a reactive scope ({{location}}). The cleanup function will never execute unless this code runs within a component, effect, createRoot, or runWithOwner.\"}},{\"id\":\"derived-signal\",\"severity\":\"error\",\"description\":\"Detect functions that capture reactive values but are called in untracked contexts\",\"fixable\":false,\"category\":\"reactivity\",\"plugin\":\"solid\",\"messages\":{\"moduleScopeInit\":\"Assigning '{{fnName}}()' to '{{varName}}' at module scope runs once at startup. It captures {{vars}} which won't trigger updates.\",\"moduleScopeCall\":\"'{{fnName}}()' at module scope executes once when the module loads. It captures {{vars}}—changes won't cause this to re-run.\",\"componentTopLevelInit\":\"'{{fnName}}()' assigned to '{{varName}}' in '{{componentName}}' captures a one-time snapshot of {{vars}}. Changes won't update '{{varName}}'. Call in JSX or use createMemo().\",\"componentTopLevelCall\":\"'{{fnName}}()' at top-level of '{{componentName}}' runs once and captures a snapshot of {{vars}}. Changes won't re-run this. Move inside JSX: {{{fnName}}()} or wrap with createMemo().\",\"utilityFnCall\":\"'{{fnName}}()' inside '{{utilityName}}' won't be reactive. Call '{{utilityName}}' from a tracked scope (createEffect, JSX), or pass {{vars}} as parameters.\",\"syncCallbackCall\":\"'{{fnName}}()' inside {{methodName}}() callback runs outside a tracking scope. The result captures a snapshot of {{vars}} that won't update.\",\"untrackedCall\":\"'{{fnName}}()' called in an untracked context. It captures {{vars}} which won't trigger updates here. Move to JSX or a tracked scope.\"}},{\"id\":\"effect-as-memo\",\"severity\":\"error\",\"description\":\"Detect createEffect that only sets a derived signal value, which should be createMemo instead\",\"fixable\":true,\"category\":\"reactivity\",\"plugin\":\"solid\",\"messages\":{\"effectAsMemo\":\"This createEffect only computes a derived value. Use createMemo() instead: const {{signalName}} = createMemo(() => {{expression}});\"}},{\"id\":\"effect-as-mount\",\"severity\":\"error\",\"description\":\"Detect createEffect/createRenderEffect with no reactive dependencies that should be onMount instead\",\"fixable\":true,\"category\":\"reactivity\",\"plugin\":\"solid\",\"messages\":{\"effectAsMount\":\"This {{primitive}} has no reactive dependencies and runs only once. Use onMount() for initialization logic that doesn't need to re-run.\"}},{\"id\":\"inline-component\",\"severity\":\"error\",\"description\":\"Detect component functions defined inside other components, which causes remount on every parent update\",\"fixable\":false,\"category\":\"reactivity\",\"plugin\":\"solid\",\"messages\":{\"inlineComponent\":\"Component '{{name}}' is defined inside another component. This creates a new component type on every render, causing unmount/remount. Move the component definition outside.\"}},{\"id\":\"no-top-level-signal-call\",\"severity\":\"error\",\"description\":\"Disallow calling signals at component top-level (captures stale snapshots)\",\"fixable\":false,\"category\":\"reactivity\",\"plugin\":\"solid\",\"messages\":{\"assignedToVar\":\"'{{name}}()' assigned to '{{varName}}' in {{componentName}} captures a one-time snapshot. '{{varName}}' won't update when {{name}} changes. Use createMemo(): `const {{varName}} = createMemo(() => {{name}}());`\",\"computedValue\":\"'{{name}}()' in computation at top-level of {{componentName}} captures a stale snapshot. Wrap with createMemo(): `const {{varName}} = createMemo(() => /* computation using {{name}}() */);`\",\"templateLiteral\":\"'{{name}}()' in template literal at top-level of {{componentName}} captures a stale snapshot. Use createMemo() or compute directly in JSX: `{`Hello, ${{{name}}()}!`}`\",\"destructuring\":\"Destructuring '{{name}}()' at top-level of {{componentName}} captures a stale snapshot. Access properties in JSX or createMemo(): `{{{name}}().propertyName}`\",\"objectLiteral\":\"'{{name}}()' in object literal at top-level of {{componentName}} captures a stale snapshot. Use createMemo() for the object, or spread in JSX.\",\"arrayCreation\":\"'{{name}}()' in array creation at top-level of {{componentName}} captures a stale snapshot. Wrap with createMemo(): `const items = createMemo(() => Array.from(...));`\",\"earlyReturn\":\"'{{name}}()' in early return at top-level of {{componentName}} captures a stale snapshot. Use <Show when={{{name}}()}> for conditional rendering instead.\",\"conditionalAssign\":\"'{{name}}()' in ternary at top-level of {{componentName}} captures a stale snapshot. Use createMemo() or compute in JSX: `{{{name}}() ? 'Yes' : 'No'}`\",\"functionArgument\":\"'{{name}}()' passed as argument at top-level of {{componentName}} captures a stale snapshot. Move to createEffect() or compute in JSX.\",\"syncCallback\":\"'{{name}}()' inside {{methodName}}() at top-level of {{componentName}} captures a stale snapshot. Wrap the entire computation in createMemo(): `const result = createMemo(() => items.{{methodName}}(...));`\",\"topLevelCall\":\"'{{name}}()' at top-level of {{componentName}} captures a one-time snapshot. Changes to {{name}} won't update the result. Call directly in JSX or wrap in createMemo().\"}},{\"id\":\"ref-early-access\",\"severity\":\"error\",\"description\":\"Detect accessing refs before they are assigned (before mount)\",\"fixable\":false,\"category\":\"reactivity\",\"plugin\":\"solid\",\"messages\":{\"refBeforeMount\":\"Ref '{{name}}' is accessed before component mounts. Refs are undefined until after mount. Access in onMount(), createEffect(), or event handlers.\"}},{\"id\":\"resource-access-unchecked\",\"severity\":\"error\",\"description\":\"Detect accessing resource data without checking loading/error state.\",\"fixable\":false,\"category\":\"reactivity\",\"plugin\":\"solid\",\"messages\":{\"resourceUnchecked\":\"Accessing resource '{{name}}' without checking loading/error state may return undefined. Wrap in <Show when={!{{name}}.loading}> or <Suspense>.\"}},{\"id\":\"resource-refetch-loop\",\"severity\":\"error\",\"description\":\"Detect refetch() calls inside createEffect which can cause infinite loops\",\"fixable\":false,\"category\":\"reactivity\",\"plugin\":\"solid\",\"messages\":{\"refetchInEffect\":\"Calling {{name}}.refetch() inside createEffect may cause infinite loops. The resource tracks its own dependencies. Move refetch to an event handler or use on() to control dependencies.\"}},{\"id\":\"signal-call\",\"severity\":\"error\",\"description\":\"Require signals to be called as functions when used in tracked contexts\",\"fixable\":true,\"category\":\"reactivity\",\"plugin\":\"solid\",\"messages\":{\"signalInJsxText\":\"Signal '{{name}}' in JSX text should be called: {{{name}}()}. Without (), you're rendering the function, not its value.\",\"signalInJsxAttribute\":\"Signal '{{name}}' in JSX attribute should be called: {{attr}}={{{name}}()}. Without (), the attribute won't update reactively.\",\"signalInTernary\":\"Signal '{{name}}' in ternary should be called: {{name}}() ? ... : .... The condition won't react to changes without ().\",\"signalInLogical\":\"Signal '{{name}}' in logical expression should be called: {{name}}() && .... Without (), this always evaluates to truthy (functions are truthy).\",\"signalInComparison\":\"Signal '{{name}}' in comparison should be called: {{name}}() === .... Comparing functions always returns false.\",\"signalInArithmetic\":\"Signal '{{name}}' in arithmetic should be called: {{name}}() + .... Math on functions produces NaN.\",\"signalInTemplate\":\"Signal '{{name}}' in template literal should be called: `...${{{name}}()}...`. Without (), you're embedding '[Function]'.\",\"signalInTrackedScope\":\"Signal '{{name}}' in {{where}} should be called: {{name}}(). Without (), reactivity is lost.\",\"badSignal\":\"The reactive variable '{{name}}' should be called as a function when used in {{where}}.\"}},{\"id\":\"signal-in-loop\",\"severity\":\"error\",\"description\":\"Detect problematic signal usage inside For/Index loop callbacks\",\"fixable\":false,\"category\":\"reactivity\",\"plugin\":\"solid\",\"messages\":{\"signalInLoop\":\"Creating signals inside <{{component}}> callback creates new signals on each render. Use a store at the parent level, or derive state from the index.\",\"signalCallInvariant\":\"Signal '{{name}}' called inside <{{component}}> produces the same value for every item. Extract to a variable or memoize with createMemo() before the loop.\",\"derivedCallInvariant\":\"'{{name}}()' inside <{{component}}> captures {{captures}} but doesn't use the loop item. Extract the call before the loop or pass the item as a parameter.\"}},{\"id\":\"store-reactive-break\",\"severity\":\"error\",\"description\":\"Detect patterns that break store reactivity: spreading stores, top-level property extraction, or destructuring\",\"fixable\":false,\"category\":\"reactivity\",\"plugin\":\"solid\",\"messages\":{\"storeSpread\":\"Spreading a store ({...store}) creates a static snapshot that won't update. Access store properties directly in JSX or tracked contexts.\",\"storeTopLevelAccess\":\"Accessing store property '{{property}}' at component top-level captures the value once. Access store.{{property}} directly in JSX or wrap in createMemo().\",\"storeDestructure\":\"Destructuring a store breaks reactivity. Access properties via store.{{property}} instead of destructuring.\"}},{\"id\":\"transition-pending-unchecked\",\"severity\":\"error\",\"description\":\"Detect useTransition usage without handling the isPending state\",\"fixable\":false,\"category\":\"reactivity\",\"plugin\":\"solid\",\"messages\":{\"pendingUnchecked\":\"useTransition returns [isPending, startTransition]. The isPending state should be used to show loading UI during transitions.\"}}],\n \"solid\": [{\"id\":\"batch-optimization\",\"severity\":\"warn\",\"description\":\"Suggest using batch() when multiple signal setters are called in the same synchronous scope\",\"fixable\":true,\"category\":\"solid\",\"plugin\":\"solid\",\"messages\":{\"multipleSetters\":\"Multiple signal updates in the same scope cause multiple re-renders. Wrap in batch() for a single update: batch(() => { {{setters}} });\"}},{\"id\":\"imports\",\"severity\":\"error\",\"description\":\"Enforce consistent imports from \\\"solid-js\\\", \\\"solid-js/web\\\", and \\\"solid-js/store\\\".\",\"fixable\":false,\"category\":\"solid\",\"plugin\":\"solid\",\"messages\":{\"preferSource\":\"Prefer importing {{name}} from \\\"{{source}}\\\".\"}},{\"id\":\"index-vs-for\",\"severity\":\"warn\",\"description\":\"Suggest <For> for object arrays and <Index> for primitive arrays.\",\"fixable\":true,\"category\":\"solid\",\"plugin\":\"solid\",\"messages\":{\"indexWithObjects\":\"<Index> with object arrays causes the item accessor to change on any array mutation. Use <For> for objects to maintain reference stability.\",\"forWithPrimitives\":\"<For> with primitive arrays (strings, numbers) keys by value, which may cause unexpected re-renders. Consider <Index> if index stability is preferred.\"}},{\"id\":\"no-react-deps\",\"severity\":\"error\",\"description\":\"Disallow usage of dependency arrays in `createEffect`, `createMemo`, and `createRenderEffect`.\",\"fixable\":true,\"category\":\"solid\",\"plugin\":\"solid\",\"messages\":{\"noUselessDep\":\"In Solid, `{{name}}` doesn't accept a dependency array because it automatically tracks its dependencies. If you really need to override the list of dependencies, use `on`.\"}},{\"id\":\"no-react-specific-props\",\"severity\":\"error\",\"description\":\"Disallow usage of React-specific `className`/`htmlFor` props, which were deprecated in v1.4.0.\",\"fixable\":true,\"category\":\"solid\",\"plugin\":\"solid\",\"messages\":{\"prefer\":\"Prefer the `{{to}}` prop over the deprecated `{{from}}` prop.\",\"noUselessKey\":\"Elements in a <For> or <Index> list do not need a key prop.\"}},{\"id\":\"prefer-for\",\"severity\":\"warn\",\"description\":\"Enforce using Solid's `<For />` component for mapping an array to JSX elements.\",\"fixable\":true,\"category\":\"solid\",\"plugin\":\"solid\",\"messages\":{\"preferFor\":\"Prefer Solid's `<For each={...}>` component for rendering lists of objects. Array#map recreates all DOM elements on every update, while <For> updates only changed items by keying on reference.\",\"preferIndex\":\"Prefer Solid's `<Index each={...}>` component for rendering lists of primitives. Array#map recreates all DOM elements on every update, while <Index> updates only changed items by keying on index position.\",\"preferForOrIndex\":\"Prefer Solid's `<For />` or `<Index />` component for rendering lists. Use <For> when items are objects (keys by reference), or <Index> when items are primitives like strings/numbers (keys by index). Array#map recreates all DOM elements on every update.\"}},{\"id\":\"prefer-memo-complex-styles\",\"severity\":\"warn\",\"description\":\"Enforce extracting complex style computations to createMemo for better approach. Complex inline style objects are rebuilt on every render, which can impact approach.\",\"fixable\":false,\"category\":\"solid\",\"plugin\":\"solid\",\"messages\":{\"preferMemoComplexStyle\":\"Complex style computation should be extracted to createMemo() for better approach. This style object contains {{complexity}} conditional expressions that are recalculated on every render.\",\"preferMemoConditionalSpread\":\"Conditional spread operators in style objects should be extracted to createMemo(). Pattern like `...(condition ? {...} : {})` creates new objects on every render.\"}},{\"id\":\"prefer-show\",\"severity\":\"warn\",\"description\":\"Enforce using Solid's `<Show />` component for conditionally showing content. Solid's compiler covers this case, so it's a stylistic rule only.\",\"fixable\":true,\"category\":\"solid\",\"plugin\":\"solid\",\"messages\":{\"preferShowAnd\":\"Prefer Solid's `<Show when={...}>` component for conditional rendering. While Solid's compiler handles `&&` expressions, <Show> is more explicit and provides better readability for conditional content.\",\"preferShowTernary\":\"Prefer Solid's `<Show when={...} fallback={...}>` component for conditional rendering with a fallback. This provides clearer intent and better readability than ternary expressions.\"}},{\"id\":\"self-closing-comp\",\"severity\":\"warn\",\"description\":\"Disallow extra closing tags for components without children.\",\"fixable\":true,\"category\":\"solid\",\"plugin\":\"solid\",\"messages\":{\"selfClose\":\"Empty elements should be self-closing. Use `<{{name}} />` instead of `<{{name}}></{{name}}>` for cleaner, more concise JSX.\",\"dontSelfClose\":\"This element should not be self-closing based on your configuration. Use `<{{name}}></{{name}}>` instead of `<{{name}} />` for explicit opening and closing tags.\"}},{\"id\":\"style-prop\",\"severity\":\"warn\",\"description\":\"Require CSS properties in the `style` prop to be valid and kebab-cased (ex. 'font-size'), not camel-cased (ex. 'fontSize') like in React, and that property values with dimensions are strings, not numbers with implicit 'px' units.\",\"fixable\":true,\"category\":\"solid\",\"plugin\":\"solid\",\"messages\":{\"kebabStyleProp\":\"Solid uses kebab-case for CSS property names, not camelCase like React. Use '{{kebabName}}' instead of '{{name}}'.\",\"invalidStyleProp\":\"'{{name}}' is not a valid CSS property. Check for typos, or if this is a custom property, prefix it with '--' (e.g., '--{{name}}').\",\"numericStyleValue\":\"Numeric values for dimensional properties need explicit units in Solid. Unlike React, Solid does not auto-append 'px'. Use '{{value}}px' or another appropriate unit.\",\"stringStyle\":\"Use an object for the style prop instead of a string for better approach and type safety. Example: style={{ '{{prop}}': '{{value}}' }}.\"}}],\n} as const\n\n/** All rule categories, sorted alphabetically. */\nexport const RULE_CATEGORIES: readonly RuleCategory[] = [\"correctness\",\"css-a11y\",\"css-animation\",\"css-cascade\",\"css-jsx\",\"css-layout\",\"css-property\",\"css-selector\",\"css-structure\",\"jsx\",\"performance\",\"reactivity\",\"solid\"] as const\n\n/** Lookup a rule by ID. Returns undefined if not found. */\nexport function getRule(id: string): RuleEntry | undefined {\n for (let i = 0; i < RULES.length; i++) {\n const rule = RULES[i]\n if (rule && rule.id === id) return rule\n }\n return undefined\n}\n"],"mappings":"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","names":[]}