@sarj/eslint-plugin 9.2.0 → 9.3.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.
- package/dist/index.cjs +68 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +68 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/rules/enforce-file-structure.ts","../src/rules/_docs.ts","../src/rules/_paths.ts","../src/rules/no-async-callback-in-wait-for.ts","../src/rules/no-client-side-data-fetching.ts","../src/rules/no-comment-cruft.ts","../src/rules/_comments.ts","../src/rules/no-conditional-in-test.ts","../src/rules/no-cors-wildcard-with-credentials.ts","../src/rules/no-dynamic-sql.ts","../src/rules/_sql.ts","../src/rules/no-enum.ts","../src/rules/no-fat-try-blocks.ts","../src/rules/no-hand-rolled-sleep.ts","../src/rules/no-insecure-random-id.ts","../src/rules/no-json-stringify-error.ts","../src/rules/no-log-only-catch.ts","../src/rules/_logging.ts","../src/rules/no-offset-pagination.ts","../src/rules/no-positional-tuple-return.ts","../src/rules/no-raw-env.ts","../src/rules/no-raw-fetch-outside-clients.ts","../src/rules/no-repeated-string-literal.ts","../src/rules/no-restated-comment.ts","../src/rules/no-restated-jsdoc.ts","../src/rules/no-secret-in-log.ts","../src/rules/_secret-names.ts","../src/rules/no-select-star.ts","../src/rules/no-sentinel-return-on-catch.ts","../src/rules/no-silent-promise-catch.ts","../src/rules/no-sleep-in-test-body.ts","../src/rules/no-storage-in-stateless-modules.ts","../src/rules/no-string-concat-in-loop.ts","../src/rules/no-tautological-expect.ts","../src/rules/no-trailing-value-narration.ts","../src/rules/no-declaration-comment-wall.ts","../src/rules/_comment-wall.ts","../src/rules/no-type-member-comment-wall.ts","../src/rules/no-unnecessary-use-client.ts","../src/rules/no-unsafe-mock-casting.ts","../src/rules/no-zod-native-enum.ts","../src/rules/prefer-constant-time-secret-compare.ts","../src/rules/prefer-discriminated-union.ts","../src/rules/prefer-module-level-constant.ts","../src/rules/prefer-module-level-schema.ts","../src/rules/_zod.ts","../src/rules/prefer-non-nullable-collection.ts","../src/rules/prefer-schema-for-api-payload.ts","../src/rules/prefer-semantic-colors.ts","../src/rules/_tailwind.ts","../src/rules/prefer-server-actions.ts","../src/rules/prefer-string-literal-union.ts","../src/rules/prefer-whole-object-assertion.ts","../src/rules/prefer-zod-enum.ts","../src/rules/prefer-zod-infer.ts","../src/rules/require-assert-never.ts","../src/rules/require-fetch-timeout.ts","../src/rules/require-interface-for-injected-service.ts","../src/rules/require-zod-form-validation.ts","../src/rules/store-insert-requires-on-conflict.ts","../src/rules/zod-naming-convention.ts","../src/rules/_renames.ts","../src/rules/_retired.ts","../src/index.ts"],"sourcesContent":["/**\n * @fileoverview enforce-file-structure — imports come first, then step-down order; a `use server` directive that is not the first statement is inert.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/enforce-file-structure.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/enforce-file-structure.md\n */\n\nimport { type TSESTree, AST_NODE_TYPES } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isGeneratedFile, isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"importsFirst\" | \"useServerDirective\";\ntype Options = readonly [];\n\ntype StatementKind = \"import\" | \"reexport\" | \"body\";\n\n/**\n * Classify a top-level statement by WHAT it introduces, not by the presence of\n * the `export` keyword.\n *\n * - `import ...` → \"import\"\n * - `export ... from`, `export * from`, → \"reexport\"\n * `export { a, b }` (local names)\n * - everything else, INCLUDING every → \"body\"\n * exported declaration/function\n *\n * Bucketing exported statements as \"body\" is the whole point: an exported\n * `interface`/`type`/`enum`/`class`/value-`const` is a declaration and an\n * exported `function` (or `export default <fn>`) is a function — both live in\n * the same body as their non-exported equivalents. That lets the dominant\n * step-down layout (public API first, private helpers below) pass instead of\n * forcing every `export`-prefixed statement into a terminal \"exports\" section.\n *\n * Re-exports are their own neutral group: a generated `_namespaces` barrel that\n * interleaves `import * as X` / `export { X }` must not be flagged, so\n * re-exports never trigger and are allowed anywhere in the file.\n */\nconst classifyStatement = (\n statement: TSESTree.ProgramStatement,\n): StatementKind => {\n switch (statement.type) {\n case AST_NODE_TYPES.ImportDeclaration:\n return \"import\";\n case AST_NODE_TYPES.ExportAllDeclaration:\n return \"reexport\";\n case AST_NODE_TYPES.ExportNamedDeclaration:\n // `export { a } from './x'` / `export { a, b }` re-export names without\n // declaring anything; only `export <decl>` introduces a body statement.\n return statement.declaration === null ? \"reexport\" : \"body\";\n default:\n return \"body\";\n }\n};\n\nconst isStringDirective = (statement: TSESTree.ProgramStatement): boolean =>\n statement.type === AST_NODE_TYPES.ExpressionStatement &&\n statement.expression.type === AST_NODE_TYPES.Literal &&\n typeof statement.expression.value === \"string\" &&\n statement.expression.value.startsWith(\"use \");\n\nconst isUseServerDirective = (\n statement: TSESTree.ProgramStatement,\n): boolean => {\n if (statement.type !== AST_NODE_TYPES.ExpressionStatement) return false;\n const expr = statement.expression;\n if (expr.type !== AST_NODE_TYPES.Literal) return false;\n return expr.value === \"use server\";\n};\n\nexport default createRule<Options, MessageIds>({\n name: \"enforce-file-structure\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Require `import` statements to come first, then allow step-down ordering (public API first, private helpers below) for the rest of the file. Exported statements are classified by WHAT they export — an exported interface is a declaration, an exported function is a function — so a public exported function followed by a private helper, or an exported interface among declarations, is allowed. Re-exports (`export { … } from`, `export *`, `export { … }`) are a neutral group, so generated namespace barrels pass. When a module contains a `use server` directive, it must be the first statement in the file.\",\n },\n schema: [],\n messages: {\n importsFirst:\n \"File structure violation: import statements must come before other declarations\",\n useServerDirective:\n \"A 'use server' directive must be the first statement in the file\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (isTestFile(context.filename) || isGeneratedFile(context.filename, context.sourceCode.text)) {\n return {};\n }\n\n return {\n Program(node: TSESTree.Program): void {\n const body = node.body;\n\n const misplacedUseServer = body.find(\n (statement, index) => index > 0 && isUseServerDirective(statement),\n );\n if (misplacedUseServer !== undefined) {\n context.report({\n node: misplacedUseServer,\n messageId: \"useServerDirective\",\n });\n }\n\n let seenBody = false;\n let inMisplacedRun = false;\n\n for (const statement of body) {\n if (isStringDirective(statement)) continue;\n\n switch (classifyStatement(statement)) {\n case \"reexport\":\n continue;\n case \"body\":\n seenBody = true;\n inMisplacedRun = false;\n continue;\n case \"import\":\n if (seenBody && !inMisplacedRun) {\n inMisplacedRun = true;\n context.report({\n node: statement,\n messageId: \"importsFirst\",\n });\n }\n continue;\n }\n }\n },\n };\n },\n});\n","/**\n * @fileoverview _docs — a rule's documentation links are DERIVED from its name, so a rename breaks a test instead of leaving a dead URL.\n *\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/_docs.md\n */\n\nimport { ESLintUtils } from \"@typescript-eslint/utils\";\n\nexport const REPO_BLOB = \"https://github.com/sarj-ai/standards/blob/main\";\nexport const TESTS_DIR = \"packages/typescript/tests/rules\";\nexport const EVIDENCE_DIR = \"docs/rules\";\n\nexport const examplesPath = (name: string): string =>\n `${TESTS_DIR}/${name}.test.ts`;\n\nexport const evidencePath = (name: string): string =>\n `${EVIDENCE_DIR}/${name}.md`;\n\nexport const examplesUrl = (name: string): string =>\n `${REPO_BLOB}/${examplesPath(name)}`;\n\nexport const evidenceUrl = (name: string): string =>\n `${REPO_BLOB}/${evidencePath(name)}`;\n\nexport const createRule = ESLintUtils.RuleCreator(evidenceUrl);\n","/**\n * @fileoverview _paths — shared file-kind predicates, so \"is this a test / script / generated file?\" is answered in exactly one place.\n *\n * A path joins a shared default only if its NAME makes a claim true for every rule; anything one rule needs alone is a named gate that rule opts into.\n *\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/_paths.md\n */\n\nconst SCRIPT_FILE_RE = /([\\\\/]scripts[\\\\/])|(\\.mjs$)/;\n\nconst STORY_FILE_RE = /\\.stories\\.[cm]?[jt]sx?$/i;\n// Gate `storyTree`. Storybook's own `stories_vue3-vite-default-ts/` spelling\n// included. Not a default: plenty of repos keep ordinary first-party components\n// under `stories/`, and to a rule about `process.env` those are production.\nconst STORY_TREE_RE = /(^|\\/)stories(?:[_-][^/]*)?\\//i;\n\n// `vendor` / `vendored` / `third[-_]?party` are shared, mirroring Python's\n// `_GENERATED_DIR_NAMES`: the directory name is itself the claim that an\n// upstream owns the text, and that claim holds for every rule.\nconst GENERATED_FILE_RE =\n /([\\\\/](?:generated|openapi-gen|graphql[\\\\/]types|vendor|vendored|third[-_]?party)[\\\\/])|(\\.gen\\.[cm]?[jt]sx?$)|(\\.generated\\.[cm]?[jt]sx?$)|(\\.d\\.[cm]?ts$)|(\\.types\\.[cm]?ts$)/;\n// Gate `externalTree`. Some `external/` trees really are a copy of someone\n// else's typings, but `src/services/external/` is first-party outbound\n// integration in most repos — the place a raw `process.env` read or an untimed\n// `fetch` matters most — so this cannot be a shared default.\nconst EXTERNAL_TREE_RE = /[\\\\/]external[\\\\/]/;\n\n// A BANNER match is safe and universal in a way a PATH match is not: no\n// hand-written file claims to be generator output. Subject-scoped on purpose —\n// the file itself has to be what the claim is ABOUT. See the evidence file.\nconst GENERATED_MARKER_RE =\n /(?:@generated\\b|this file (?:is|was|has been)[\\w\\s,'-]{0,40}?generated|auto-?generated file\\b|generated (?:with|by)|generated (?:graphql )?types|do not edit(?: directly| manually)?|do not (?:modify|change) this file)/i;\n\nconst TEST_BASENAME_RE = /[.\\-_](test|spec|e2e)\\.[cm]?[jt]sx?$/;\nconst TEST_INTEGRATION_BASENAME_RE = /\\.integration\\.[cm]?[jt]sx?$/;\n// `__fixtures__` / `__testfixtures__` are shared: the same category as the\n// `fixtures/` that has always been here, spelled the way jscodeshift and\n// Storybook spell it.\nconst TEST_DIR_RE = /(^|\\/)(tests?|__tests__|__mocks__|fixtures|__fixtures__|__testfixtures__|e2e|integration)\\//;\n// Gate `fixtureTree`: the SINGULAR `fixture/`. `src/fixture/seed.ts` is a\n// production database seeder in several repos, so exempting it from every\n// consumer of `isTestFile` is a scope change nobody asked for.\nconst FIXTURE_TREE_RE = /(^|\\/)fixture\\//;\n\n/**\n * Extra path gates `isGeneratedFile` honours on request. Not a default: see the\n * evidence document.\n */\nexport type GeneratedPathGate = \"externalTree\";\n\n/** Extra path gates `isTestFile` honours on request. */\nexport type TestPathGate = \"fixtureTree\";\n\n/** Extra path gates `isStoryFile` honours on request. */\nexport type StoryPathGate = \"storyTree\";\n\n/**\n * True for a test file: a `*.test.*` / `*.spec.*` basename, the `-test` /\n * `_test` suffix forms of the same, or anything under a `test/` / `tests/` /\n * `__tests__/` / `__mocks__/` / `fixtures/` / `__fixtures__/` /\n * `__testfixtures__/` / `e2e/` / `integration/` directory.\n *\n * Pass `[\"fixtureTree\"]` to also exempt the singular `fixture/`.\n */\nexport function isTestFile(filename: string, gates: readonly TestPathGate[] = []): boolean {\n const normalized = filename.replaceAll(\"\\\\\", \"/\");\n const base = normalized.slice(normalized.lastIndexOf(\"/\") + 1);\n if (TEST_BASENAME_RE.test(base) || TEST_INTEGRATION_BASENAME_RE.test(base)) {\n return true;\n }\n if (TEST_DIR_RE.test(normalized)) {\n return true;\n }\n return gates.includes(\"fixtureTree\") && FIXTURE_TREE_RE.test(normalized);\n}\n\n/**\n * True for a `*.stories.*` file. Pass `[\"storyTree\"]` to also match anything\n * inside a `stories/` tree.\n */\nexport function isStoryFile(filename: string, gates: readonly StoryPathGate[] = []): boolean {\n const normalized = filename.replaceAll(\"\\\\\", \"/\");\n if (STORY_FILE_RE.test(normalized)) {\n return true;\n }\n return gates.includes(\"storyTree\") && STORY_TREE_RE.test(normalized);\n}\n\n/**\n * True for a file whose text an upstream owns: generator output or a vendored\n * copy by path, or any file whose own header declares it generated.\n *\n * The banner arm is universal. The path arm defaults to generator output and\n * vendored trees; `[\"externalTree\"]` adds `external/`.\n */\nexport function isGeneratedFile(\n filename: string,\n sourceText = \"\",\n gates: readonly GeneratedPathGate[] = [],\n): boolean {\n const normalized = filename.replaceAll(\"\\\\\", \"/\");\n if (GENERATED_FILE_RE.test(normalized)) {\n return true;\n }\n if (gates.includes(\"externalTree\") && EXTERNAL_TREE_RE.test(normalized)) {\n return true;\n }\n return GENERATED_MARKER_RE.test(sourceText.slice(0, 2048));\n}\n\n/**\n * True for one-off tooling files: anything under a `scripts/` directory or a\n * `*.mjs` file. Dev scripts run interactively and die with the terminal, so\n * production-hardening rules (e.g. fetch timeouts) do not apply there.\n */\nexport function isScriptFile(filename: string): boolean {\n return SCRIPT_FILE_RE.test(filename);\n}\n","/**\n * @fileoverview no-async-callback-in-wait-for — an async `waitFor` callback swallows its own rejection, so the assertion inside it can never fail the test.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-async-callback-in-wait-for.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-async-callback-in-wait-for.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"noAsyncCallbackInWaitFor\";\ntype Options = readonly [];\n\n/**\n * `waitFor(…)` or `<x>.waitFor(…)`. Matching a bare Identifier only made the\n * `vi.waitFor` form structurally invisible.\n *\n * The receiver is deliberately unrestricted: the hazard belongs to the polling\n * contract, not to who owns the function. A computed member is not matched — the\n * name is not statically the callee there.\n */\nconst isWaitForCallee = (callee: TSESTree.CallExpression[\"callee\"]): boolean => {\n if (callee.type === AST_NODE_TYPES.Identifier) return callee.name === \"waitFor\";\n return (\n callee.type === AST_NODE_TYPES.MemberExpression &&\n !callee.computed &&\n callee.property.type === AST_NODE_TYPES.Identifier &&\n callee.property.name === \"waitFor\"\n );\n};\n\nexport default createRule<Options, MessageIds>({\n name: \"no-async-callback-in-wait-for\",\n meta: {\n type: \"problem\",\n docs: {\n description: \"Disallow async callbacks in `waitFor` to prevent swallowed promise rejections.\",\n },\n schema: [],\n messages: {\n noAsyncCallbackInWaitFor:\n \"The callback to `waitFor` should not be async. It expects synchronous assertions and runs the callback repeatedly.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (!isTestFile(context.filename)) {\n return {};\n }\n return {\n CallExpression(node: TSESTree.CallExpression) {\n if (!isWaitForCallee(node.callee)) return;\n const callback = node.arguments[0];\n if (\n callback &&\n (callback.type === AST_NODE_TYPES.ArrowFunctionExpression ||\n callback.type === AST_NODE_TYPES.FunctionExpression) &&\n callback.async\n ) {\n context.report({\n node: callback,\n messageId: \"noAsyncCallbackInWaitFor\",\n });\n }\n },\n };\n },\n});\n","/**\n * @fileoverview no-client-side-data-fetching — fetching in `useEffect` is a render -> effect -> fetch -> re-render waterfall with no server cache.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-client-side-data-fetching.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-client-side-data-fetching.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\n\ntype MessageIds = \"noClientFetch\";\ntype Options = readonly [];\n\nconst FETCH_LIBS: ReadonlySet<string> = new Set([\"axios\", \"ky\", \"superagent\"]);\n\n// Real HTTP verbs only. Explicitly excludes `create`, `defaults`,\n// `interceptors`, `isAxiosError`, etc.\nconst HTTP_METHOD_NAMES: ReadonlySet<string> = new Set([\n \"get\",\n \"post\",\n \"put\",\n \"delete\",\n \"patch\",\n \"request\",\n \"head\",\n \"options\",\n]);\n\n// Matched against whole path SEGMENTS (split on `/` and `.`), never as raw\n// substrings — otherwise `/api/login` (\"log\"), `/blog` (\"log\"), `/api/events`\n// (\"event\"), `/catalog` (\"log\"), and `/api/shipping` (\"ping\") would be wrongly\n// exempted.\nconst ANALYTICS_SEGMENTS: ReadonlySet<string> = new Set([\n \"analytics\",\n \"telemetry\",\n \"track\",\n \"log\",\n \"ping\",\n \"beacon\",\n \"metrics\",\n \"event\",\n]);\n\nfunction isEffectHookCall(node: TSESTree.CallExpression): boolean {\n const callee = node.callee;\n\n // useEffect(...) / useLayoutEffect(...)\n if (callee.type === AST_NODE_TYPES.Identifier) {\n return callee.name === \"useEffect\" || callee.name === \"useLayoutEffect\";\n }\n\n // React.useEffect(...) / React.useLayoutEffect(...)\n if (\n callee.type === AST_NODE_TYPES.MemberExpression &&\n !callee.computed &&\n callee.object.type === AST_NODE_TYPES.Identifier &&\n callee.object.name === \"React\" &&\n callee.property.type === AST_NODE_TYPES.Identifier\n ) {\n return (\n callee.property.name === \"useEffect\" ||\n callee.property.name === \"useLayoutEffect\"\n );\n }\n\n return false;\n}\n\n/**\n * Reads the `method` property of an options object passed to `fetch` / `axios`.\n * Returns the uppercased method name, or `null` if not statically determinable.\n */\nfunction readMethodProperty(\n optionsArg: TSESTree.Node | undefined,\n): string | null {\n if (!optionsArg || optionsArg.type !== AST_NODE_TYPES.ObjectExpression) {\n return null;\n }\n for (const prop of optionsArg.properties) {\n if (prop.type !== AST_NODE_TYPES.Property) continue;\n if (prop.computed) continue;\n const key = prop.key;\n const matchesMethodKey =\n (key.type === AST_NODE_TYPES.Identifier && key.name === \"method\") ||\n (key.type === AST_NODE_TYPES.Literal && key.value === \"method\");\n if (!matchesMethodKey) continue;\n if (\n prop.value.type === AST_NODE_TYPES.Literal &&\n typeof prop.value.value === \"string\"\n ) {\n return prop.value.value.toUpperCase();\n }\n return null;\n }\n return null;\n}\n\nfunction isFetchCall(node: TSESTree.CallExpression): boolean {\n const callee = node.callee;\n\n // fetch(url, options?)\n if (\n callee.type === AST_NODE_TYPES.Identifier &&\n callee.name === \"fetch\"\n ) {\n const method = readMethodProperty(node.arguments[1]);\n if (method !== null && method !== \"GET\") {\n return false;\n }\n return true;\n }\n\n // axios.get(...), ky.post(...), superagent.delete(...), ...\n if (\n callee.type === AST_NODE_TYPES.MemberExpression &&\n !callee.computed &&\n callee.object.type === AST_NODE_TYPES.Identifier &&\n FETCH_LIBS.has(callee.object.name) &&\n callee.property.type === AST_NODE_TYPES.Identifier\n ) {\n // Only flag actual HTTP method calls — NOT `axios.create`, `axios.defaults`,\n // `axios.interceptors`, `axios.isAxiosError`, etc.\n return HTTP_METHOD_NAMES.has(callee.property.name);\n }\n\n // axios(config) / ky(config) — treat as request unless method is explicitly non-GET.\n if (\n callee.type === AST_NODE_TYPES.Identifier &&\n (callee.name === \"axios\" || callee.name === \"ky\")\n ) {\n const firstArg = node.arguments[0];\n const secondArg = node.arguments[1];\n let configArg: TSESTree.Node | undefined;\n if (firstArg?.type === AST_NODE_TYPES.ObjectExpression) {\n configArg = firstArg;\n } else if (secondArg?.type === AST_NODE_TYPES.ObjectExpression) {\n configArg = secondArg;\n }\n const method = readMethodProperty(configArg);\n if (method !== null && method !== \"GET\") {\n return false;\n }\n return true;\n }\n\n return false;\n}\n\nfunction extractUrlString(node: TSESTree.CallExpression): string {\n const firstArg = node.arguments[0];\n if (!firstArg) return \"\";\n\n if (\n firstArg.type === AST_NODE_TYPES.Literal &&\n typeof firstArg.value === \"string\"\n ) {\n return firstArg.value;\n }\n if (firstArg.type === AST_NODE_TYPES.TemplateLiteral) {\n return firstArg.quasis.map((q) => q.value.cooked).join(\"\");\n }\n if (firstArg.type === AST_NODE_TYPES.Identifier) {\n return firstArg.name;\n }\n return \"\";\n}\n\nfunction isAnalyticsCall(node: TSESTree.CallExpression): boolean {\n const url = extractUrlString(node).toLowerCase();\n if (url === \"\") return false;\n // Split into path segments and file-extension parts; exempt only when a\n // WHOLE segment is a known analytics keyword.\n return url\n .split(/[/.]/)\n .some((segment) => ANALYTICS_SEGMENTS.has(segment));\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-client-side-data-fetching\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow data fetching inside `useEffect` / `useLayoutEffect`; prefer React Server Components, Server Actions, or a client-side cache (SWR / React Query).\",\n },\n schema: [],\n messages: {\n noClientFetch:\n \"Avoid direct data fetching inside useEffect / useLayoutEffect. This causes waterfalls and layout shifts. Prefer React Server Components, Server Actions, or client-side caching libraries like SWR or React Query.\",\n },\n },\n defaultOptions: [],\n create(context) {\n let effectDepth = 0;\n return {\n CallExpression(node: TSESTree.CallExpression): void {\n if (isEffectHookCall(node)) {\n effectDepth += 1;\n return;\n }\n if (effectDepth === 0) return;\n if (!isFetchCall(node)) return;\n if (isAnalyticsCall(node)) return;\n context.report({ node, messageId: \"noClientFetch\" });\n },\n \"CallExpression:exit\"(node: TSESTree.CallExpression): void {\n if (isEffectHookCall(node)) {\n effectDepth -= 1;\n }\n },\n };\n },\n});\n","/**\n * @fileoverview no-comment-cruft — commented-out code, section banners and file-header preambles are volume the reader pays for and nothing maintains.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-comment-cruft.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-comment-cruft.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { hasExternalReference, restatableStatementBelow, restatesStatementHead } from \"./_comments.js\";\nimport { isGeneratedFile } from \"./_paths.js\";\n\ntype MessageIds =\n | \"commentedOutCode\"\n | \"sectionBanner\"\n | \"fileHeaderPreamble\"\n | \"redundantNarration\"\n | \"untrackedTodo\";\ntype Options = readonly [];\n\nconst LEADING_PREAMBLE_MIN = 4;\n\n// Step-narration lead-ins (\"First, …\", \"Then, …\", \"Finally, …\", \"Step 2:\"). A\n// trailing comma/colon is required so English adverbs (\"finally the invariant\n// holds\") aren't mistaken for an enumeration marker.\nconst STEP_NARRATION_RE =\n /^(?:first(?:ly)?|second(?:ly)?|third(?:ly)?|then|next|after(?:wards| that)?|finally|lastly|now)\\s*[,:]\\s*\\S/i;\n\n// Self-admitted meta-commentary — the \"why later\", not the why. `TODO`/`FIXME`/\n// `HACK`/`XXX` are handled as directives (kept, with an owner, per convention).\nconst META_COMMENTARY_RE =\n /\\b(?:for now|keeping (?:it|this) simple|could be (?:refactored|improved|cleaned up|simplified)|refactor(?:ed|ing)? (?:later|this)|not sure (?:if|whether|why|how)|quick[- ](?:and[- ]dirty|fix)|(?:a |bit of a )?hacky|is a hack|temporary (?:solution|workaround|fix|hack)|revisit (?:this|later|below)|clean (?:this|it) up|not ideal|placeholder for now)\\b/i;\n\n// `sarj-noqa` is this repo's own suppression syntax (see `rule_base.py`). It was\n// missing here, so `// sarj-noqa: … — <reason>` on its own line was read as\n// prose and could itself be flagged.\nconst DIRECTIVE_RE =\n /^(eslint\\b|eslint-|sarj-noqa\\b|@ts-|prettier-ignore|prettier\\b|biome-|c8\\b|v8\\b|istanbul\\b|@type\\b|@vite|webpack|<reference|<amd|global\\b|noinspection|hack\\b|xxx\\b)/i;\n\nconst LICENSE_RE =\n /copyright|licen[cs]ed?|spdx|permission is hereby granted|all rights reserved/i;\n\n// An enumerated step in a numbered/bulleted plan: `1. get all tags`, `- read the\n// manifest`. A stack of these is an algorithm walkthrough — the \"why/how\" the\n// rule's own message asks for — even though no item ends in a full stop, which\n// is why `isProse` misses it.\nconst ENUMERATED_ITEM_RE = /^(?:\\d+[.):]|[-*•])\\s+\\S/;\nconst ENUMERATED_ITEM_MIN_WORDS = 3;\nconst ENUMERATED_PREAMBLE_MIN_ITEMS = 2;\n\nconst BANNER_FULL_RE = /^[\\s\\-=*#~_+.]{4,}$/;\nconst BANNER_RUN_RE = /={4,}|-{4,}|#{4,}|\\*{4,}|~{4,}|[\\u2500-\\u257f]{4,}/;\n\nconst REGION_MARKER_RE = /^#?(?:end)?region\\b(.*)$/i;\nconst REGION_TITLE_RE = /^[\\s:\\-\\u2013\\u2014]*\\w[\\w \\-/&+]*$/;\nconst REGION_TITLE_MAX_WORDS = 5;\n\nfunction isRegionMarker(text: string): boolean {\n const match = REGION_MARKER_RE.exec(text);\n if (match === null) return false;\n const title = (match[1] ?? \"\").trim();\n if (title.length === 0) return true;\n if (!REGION_TITLE_RE.test(title)) return false;\n return title.split(/\\s+/).length <= REGION_TITLE_MAX_WORDS;\n}\n\nconst SECTION_LABEL_WORDS: ReadonlySet<string> = new Set([\n \"actions\", \"components\", \"config\", \"configuration\", \"constant\", \"constants\",\n \"enums\", \"exports\", \"fixtures\", \"getters\", \"globals\", \"handler\", \"handlers\",\n \"helper\", \"helpers\", \"hook\", \"hooks\", \"imports\", \"interfaces\", \"main\",\n \"mocks\", \"models\", \"mutations\", \"props\", \"queries\", \"reducers\", \"routes\",\n \"schemas\", \"selectors\", \"setters\", \"setup\", \"state\", \"styles\", \"teardown\",\n \"type\", \"types\", \"util\", \"utilities\", \"utils\",\n]);\nconst SECTION_LABEL_RE = /^([A-Za-z]+)\\s*:?\\s*$/;\n\nfunction isSectionLabel(text: string): boolean {\n const match = SECTION_LABEL_RE.exec(text);\n return match !== null && SECTION_LABEL_WORDS.has((match[1] ?? \"\").toLowerCase());\n}\n\nconst HELPER_OPENER_RE = /^(?:a\\s+)?helper\\s+(?:function|method|component|hook|class|type|util(?:ity)?)\\b/i;\n\n// \"Let's not await the promise\" — the first-person-plural walkthrough voice.\n// Gated on the narration verb list because the third-person `lets` is a\n// different word doing real work: \"lets a same-day re-run find the message it\n// already posted\" explains a mechanism and must not be touched.\nconst LETS_RE =\n /^let'?s\\s+(?:not\\s+|just\\s+|now\\s+|first\\s+)?(?:add|append|assign|await|build|calculate|call|check|clear|close|compute|convert|copy|count|create|declare|decrement|define|delete|extract|fetch|filter|find|format|generate|get|handle|increment|init|initialise|initialize|insert|iterate|join|load|log|loop|map|merge|open|parse|print|process|push|read|remove|render|reset|return|save|send|set|setup|sort|split|start|stop|store|update|validate|wrap|write)(?:s|es|ed|ing)?\\b/i;\n\n// Enumeration markers that narrate a sequence: `// 1. Load the config`,\n// `// Phase 2: reconcile`. Flagged only when the file carries exactly one — a\n// *run* of them is a documented algorithm walkthrough, which is the kind of\n// comment this rule exists to protect. JSX-expression comments are exempt\n// wholesale (see `isStandalone`): `{/* Step 1: Select Patient */}` mirrors the\n// literal step labels of a UI wizard.\nconst ENUMERATION_RE = /^(?:\\d+[.)]\\s+\\S|(?:phase|step)\\s+\\d+\\b)/i;\n\n// Dummy translational comments: ultra-short comments that just restate the code.\n// Corroborated against the statement below by `restatesWholeStatement` — the\n// lexical match alone is NOT evidence. See that function.\nconst DUMMY_TRANSLATION_RE = /^(?:increment|return|returns|get|gets|set\\b(?! up\\b)|sets\\b(?! up\\b)|function to|method to)\\b/i;\n\nconst DIAGRAM_ARROW_RE = /[-=~]{2,}>|<[-=~]{2,}/;\n\nconst CODE_KEYWORD_RE =\n /^(import |export |const |let |var |function\\b|class |interface |type \\w|enum |return\\b|throw |await |async |if\\s*\\(|for\\s*\\(|while\\s*\\(|switch\\s*\\(|new |console\\.)/;\nconst CODE_TAIL_RE = /[;{}()]\\s*$|=>\\s*$|,\\s*$/;\n// LHS must be a real identifier (not a number literal — `0=Monday` in prose is\n// not an assignment) and `=` must not be `==`/`===`/`=>` (comparison/arrow).\n// The assignment branch additionally requires a code-tail — the line must end\n// with `;`, `)`, `}` or `]` — so plain prose like `count = number of items`\n// (which has no code-tail) is not mistaken for commented-out code.\nconst ASSIGN_RE = /^[A-Za-z_$][\\w.$[\\]]*\\s*(?:=(?![=>])|\\+=|-=|\\*=)\\s*\\S.*[;)}\\]]\\s*$/;\nconst CALL_RE = /^[A-Za-z_$][\\w.$]*\\([^)]*\\)\\s*;?\\s*$/;\n\n// Placeholders that only appear in grammar productions / desugaring examples,\n// never in real code: `%sent%`, `[opt]`, a standalone `<FunctionBody>`, `…` / `...`.\nconst PSEUDOCODE_RE = /%\\w+%|\\[opt\\]|(?:^|\\s)<[A-Za-z]\\w*>|…|\\.\\.\\./;\n\n// A triple-slash `///` directive keeps its third `/` after ESLint strips the\n// leading `//`, so strip 1–2 leading slashes (not exactly two) for `<reference`.\nfunction stripCommentMarker(line: string): string {\n return line.replace(/^\\s*\\/{1,2}/, \"\").replace(/^\\s*\\*+/, \"\").trim();\n}\n\nfunction isDirective(text: string): boolean {\n return DIRECTIVE_RE.test(text.trim());\n}\n\nfunction isBanner(text: string): boolean {\n const t = text.trim();\n if (!t) return false;\n if (BANNER_FULL_RE.test(t) || isRegionMarker(t)) return true;\n return BANNER_RUN_RE.test(t) && !DIAGRAM_ARROW_RE.test(t);\n}\n\n/**\n * `allowCall` is false where a bare statement cannot legally appear — inside an\n * interface body or a type literal. See `TYPE_MEMBER_CONTAINERS`.\n */\nfunction looksLikeCode(text: string, allowCall = true): boolean {\n const t = text.trim();\n if (!t) return false;\n if (CODE_KEYWORD_RE.test(t) && CODE_TAIL_RE.test(t)) return true;\n if (ASSIGN_RE.test(t)) return true;\n return allowCall && CALL_RE.test(t);\n}\n\nfunction hasPseudocode(text: string): boolean {\n return PSEUDOCODE_RE.test(text);\n}\n\n/** An explanatory item of a numbered/bulleted walkthrough. */\nfunction isEnumeratedProseItem(text: string): boolean {\n const t = text.trim();\n return ENUMERATED_ITEM_RE.test(t) && t.split(/\\s+/).length >= ENUMERATED_ITEM_MIN_WORDS;\n}\n\n// A prose lead-in preceding a code-shaped line marks that line as an\n// illustration (`// For example:`, a grammar production `FunctionExpression:`),\n// not commented-out code.\nfunction isProse(text: string): boolean {\n const t = text.trim();\n if (!t) return false;\n if (t.endsWith(\":\")) return true;\n if (\n /[.!?]$/.test(t) &&\n /\\s/.test(t) &&\n /[a-z]/.test(t) &&\n !looksLikeCode(t) &&\n t.split(/\\s+/).length >= 3\n ) {\n return true;\n }\n return false;\n}\n\nconst JUSTIFICATION_RE =\n /\\b(?:because|since|until|due to|so that|so we|so it|so the|otherwise|which is why|in order to|to avoid|to work around|to prevent|backwards? compat(?:ibility)?|for compatibility)\\b/i;\n\n/**\n * The same total-corroboration test as `restatesStatementHead`, widened from the\n * statement's HEAD to the whole statement.\n *\n * `restatesStatementHead` reads only the text before the first `(` — it wants\n * the comment to restate what the statement *computes*, not what it passes as an\n * argument. Flattening every `(` to whitespace hands that function the whole\n * statement as its own head; the tokeniser reads identifiers, so the\n * substitution changes nothing else. Reusing it rather than copying it keeps one\n * definition of \"restates\".\n */\nfunction restatesWholeStatement(body: string, statement: string | null): boolean {\n return statement !== null && restatesStatementHead(body, statement.replaceAll(\"(\", \" \"));\n}\n\n/**\n * Whether a single-line comment merely narrates the code rather than explaining\n * the *why*. Three deterministic shapes: step narration (\"First, …\"), self-\n * admitted meta-commentary (\"keeping it simple\"), and a restatement of the very\n * next line (`// increment the counter` above `counter += 1`).\n */\nfunction isRedundantNarration(\n body: string,\n statementBelow: string | null,\n standalone: boolean,\n isolatedEnumeration: boolean,\n nested: boolean,\n): boolean {\n const t = body.trim();\n if (!t || looksLikeCode(t) || hasPseudocode(t)) return false;\n if (standalone) {\n const justified = JUSTIFICATION_RE.test(t);\n if (STEP_NARRATION_RE.test(t) && !justified) return true;\n if (META_COMMENTARY_RE.test(t) && !justified) return true;\n if (HELPER_OPENER_RE.test(t) || LETS_RE.test(t)) return true;\n\n const words = t.split(/\\s+/);\n if (words.length > 1 && words.length <= 4 && DUMMY_TRANSLATION_RE.test(t) && !/[():=]/.test(t)) {\n const lowerT = t.toLowerCase();\n const rationaleWords = [\"when\", \"because\", \"if\", \"so that\", \"due to\", \"for\", \"instead of\", \"to prevent\", \"to avoid\", \"only\"];\n if (!rationaleWords.some((w) => lowerT.includes(w)) && restatesWholeStatement(t, statementBelow)) {\n return true;\n }\n }\n\n if (!nested && isSectionLabel(t)) return true;\n if (isolatedEnumeration && ENUMERATION_RE.test(t)) return true;\n }\n return restatesStatementHead(t, statementBelow);\n}\n\n// Statement-position containers. A comment whose innermost enclosing node is\n// anything else sits INSIDE an expression — an array, an object literal, a call\n// argument list — where a one-word label groups the elements beneath it rather\n// than signposting the file. `# config` inside pydantic's `__all__` is the\n// Python twin of this; both readings produce the same comment and only the\n// nesting tells them apart.\nconst STATEMENT_CONTAINERS: ReadonlySet<string> = new Set([\n AST_NODE_TYPES.Program,\n AST_NODE_TYPES.BlockStatement,\n AST_NODE_TYPES.ClassBody,\n AST_NODE_TYPES.StaticBlock,\n AST_NODE_TYPES.SwitchCase,\n AST_NODE_TYPES.TSModuleBlock,\n AST_NODE_TYPES.TSInterfaceBody,\n]);\n\n/**\n * Containers whose only legal children are TYPE MEMBERS. A call-shaped comment\n * here cannot be commented-out code, because the statement it looks like would\n * not have parsed in that position — it is a label naming the overload or\n * property beneath it.\n *\n * `TSModuleBlock` is deliberately absent even though a comment there is also\n * \"inside a type-ish container\": `namespace N { drop(); }` is legal, so a\n * call-shaped comment there CAN be commented-out code, and this rule already\n * treats a module block as a statement position (see `STATEMENT_CONTAINERS`).\n *\n * Recall cost ~zero: a commented-out interface MEMBER (`// name: string;`) never\n * matched the call branch anyway — the `: T;` tail defeats it — and the\n * assignment and keyword branches are untouched, so `// const a = 1;` inside a\n * type literal still fires.\n */\nconst TYPE_MEMBER_CONTAINERS: ReadonlySet<string> = new Set([\n AST_NODE_TYPES.TSInterfaceBody,\n AST_NODE_TYPES.TSTypeLiteral,\n]);\n\n/**\n * True when the comment at `index` belongs to a contiguous `//` run in which\n * some line cites a ticket, URL, RFC or issue number (protected-class signal\n * S1, applied at run granularity).\n *\n * Run granularity, not line: a scoping note puts its owner at the end, so\n * judging the last line alone reads \"for now\" as an unowned admission.\n */\nfunction runCitesAReference(comments: readonly TSESTree.Comment[], index: number): boolean {\n for (let i = index; i >= 0; i--) {\n if (i < index && !areAdjacentLineComments(comments[i], comments[i + 1])) break;\n if (hasExternalReference(stripCommentMarker(comments[i]?.value ?? \"\"))) return true;\n }\n for (let i = index + 1; i < comments.length; i++) {\n if (!areAdjacentLineComments(comments[i - 1], comments[i])) break;\n if (hasExternalReference(stripCommentMarker(comments[i]?.value ?? \"\"))) return true;\n }\n return false;\n}\n\n/** True when `a` and `b` are `//` comments on consecutive lines. */\nfunction areAdjacentLineComments(\n a: TSESTree.Comment | undefined,\n b: TSESTree.Comment | undefined,\n): boolean {\n return (\n a !== undefined &&\n b !== undefined &&\n a.type === \"Line\" &&\n b.type === \"Line\" &&\n b.loc.start.line === a.loc.end.line + 1\n );\n}\n\n/**\n * True when the comment at `index` is one line of a contiguous `//` block rather\n * than a lone annotation.\n */\nfunction isInsideCommentRun(comments: readonly TSESTree.Comment[], index: number): boolean {\n const comment = comments[index];\n return (\n areAdjacentLineComments(comments[index - 1], comment) ||\n areAdjacentLineComments(comment, comments[index + 1])\n );\n}\n\n/** How far back the illustration lead-in scan walks within one `//` block. */\nconst LEAD_IN_SCAN_LIMIT = 24;\n\nfunction hasIllustrationLeadInAbove(\n comments: readonly TSESTree.Comment[],\n index: number,\n): boolean {\n for (let i = index - 1; i >= 0 && index - i <= LEAD_IN_SCAN_LIMIT; i--) {\n if (!areAdjacentLineComments(comments[i], comments[i + 1])) return false;\n const body = stripCommentMarker(comments[i]?.value ?? \"\");\n if (body.length > 0 && body.endsWith(\":\")) return true;\n }\n return false;\n}\n\nfunction hasCommentedOutCode(\n texts: readonly string[],\n precedingProse: boolean,\n allowCall: boolean,\n): boolean {\n for (let i = 0; i < texts.length; i++) {\n const line = texts[i];\n if (line === undefined || !looksLikeCode(line, allowCall) || hasPseudocode(line)) {\n continue;\n }\n const prev = i > 0 ? texts[i - 1] : undefined;\n if (prev !== undefined ? isProse(prev) : precedingProse) continue;\n return true;\n }\n return false;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-comment-cruft\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Flag commented-out code, section-banner comments, and leading file-header comment preambles.\",\n },\n schema: [],\n messages: {\n commentedOutCode:\n \"Commented-out code — delete it; git history remembers.\",\n sectionBanner:\n \"Section-banner / region comment — structure code with functions, not ASCII rules.\",\n fileHeaderPreamble:\n \"File-header comment preamble — use a brief doc comment for the why, not a block of `//` lines.\",\n redundantNarration:\n \"Comment narrates the code — delete it or say *why*, not *what*. Code is self-documenting.\",\n untrackedTodo:\n \"Untracked TODO/FIXME marker — add an issue ticket or context link.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (isGeneratedFile(context.filename, context.sourceCode.text)) {\n return {};\n }\n\n const sourceCode = context.sourceCode;\n\n function isStandalone(comment: TSESTree.Comment): boolean {\n const before = sourceCode.getTokenBefore(comment, {\n includeComments: false,\n });\n return !before || before.loc.end.line < comment.loc.start.line;\n }\n\n function isJsDoc(comment: TSESTree.Comment): boolean {\n return comment.type === \"Block\" && /^\\*/.test(comment.value);\n }\n\n function reportLeadingPreamble(\n comments: readonly TSESTree.Comment[],\n firstCodeLine: number,\n ): void {\n const leading: TSESTree.Comment[] = [];\n let prevLine: number | null = null;\n for (const comment of comments) {\n if (comment.type !== \"Line\") break;\n if (comment.loc.start.line >= firstCodeLine) break;\n if (!isStandalone(comment)) break;\n const body = stripCommentMarker(comment.value);\n if (isDirective(body) || body.startsWith(\"!\")) continue;\n if (prevLine !== null && comment.loc.start.line !== prevLine + 1) break;\n leading.push(comment);\n prevLine = comment.loc.start.line;\n }\n const first = leading[0];\n if (first === undefined || leading.length < LEADING_PREAMBLE_MIN) return;\n const bodies = leading.map((c) => stripCommentMarker(c.value));\n if (bodies.some((body) => LICENSE_RE.test(body))) return;\n // A preamble carrying at least one prose sentence is documentation — the\n // \"why\" the rule wants — regardless of which comment syntax carries it.\n if (bodies.some((body) => isProse(body))) return;\n if (bodies.filter(isEnumeratedProseItem).length >= ENUMERATED_PREAMBLE_MIN_ITEMS) {\n return;\n }\n context.report({ node: first, messageId: \"fileHeaderPreamble\" });\n }\n\n return {\n Program(): void {\n const comments = sourceCode.getAllComments();\n const firstCodeLine =\n sourceCode.ast.tokens[0]?.loc.start.line ?? Number.MAX_SAFE_INTEGER;\n const enumerated = comments.filter(\n (c) => c.type === \"Line\" && ENUMERATION_RE.test(stripCommentMarker(c.value)),\n );\n\n for (let i = 0; i < comments.length; i++) {\n const comment = comments[i];\n if (comment === undefined) continue;\n if (isJsDoc(comment) || !isStandalone(comment)) continue;\n if (LICENSE_RE.test(comment.value)) continue;\n const texts = comment.value\n .split(\"\\n\")\n .map(stripCommentMarker)\n .filter((l) => l.length > 0 && !isDirective(l));\n\n const firstText = texts[0];\n if (firstText !== undefined && /^(?:todo|fixme)\\b/i.test(firstText)) {\n if (!runCitesAReference(comments, i)) {\n context.report({\n node: comment,\n messageId: \"untrackedTodo\",\n });\n }\n continue;\n }\n\n if (texts.some(isBanner)) {\n context.report({ node: comment, messageId: \"sectionBanner\" });\n continue;\n }\n const prev = comments[i - 1];\n const precedingProse =\n prev !== undefined &&\n prev.type === \"Line\" &&\n prev.loc.end.line === comment.loc.start.line - 1 &&\n isProse(stripCommentMarker(prev.value));\n const container = sourceCode.getNodeByRangeIndex(comment.range[0]);\n const inTypeMembers = container !== null && TYPE_MEMBER_CONTAINERS.has(container.type);\n if (\n hasCommentedOutCode(texts, precedingProse, !inTypeMembers) &&\n !hasIllustrationLeadInAbove(comments, i)\n ) {\n context.report({ node: comment, messageId: \"commentedOutCode\" });\n continue;\n }\n // Narration only for single-line comments (a multi-line block is\n // usually a real doc).\n if (comment.type === \"Line\" && texts.length === 1) {\n const body = texts[0];\n const statement = restatableStatementBelow(comment, sourceCode);\n const standalone = !isInsideCommentRun(comments, i);\n const nested = container !== null && !STATEMENT_CONTAINERS.has(container.type);\n if (\n body !== undefined &&\n !runCitesAReference(comments, i) &&\n isRedundantNarration(body, statement, standalone, enumerated.length === 1, nested)\n ) {\n context.report({ node: comment, messageId: \"redundantNarration\" });\n }\n }\n }\n\n reportLeadingPreamble(comments, firstCodeLine);\n },\n };\n },\n});\n","/**\n * @fileoverview _comments — shared comment analysis for the comment-hygiene rules, kept signal-for-signal identical to Python's `_comments.py`.\n *\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/_comments.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\n// S1 — external reference: URL, ticket key, RFC/PEP/CVE, bare issue number, or\n// an email/handle domain. Ticket keys allow letters after the first digit\n// (`PLATFORM-1YC`) and exclude the encoding acronyms sharing the shape.\nconst REF_RE =\n /https?:\\/\\/|\\bRFC[- ]?\\d+|\\bPEP[- ]?\\d+|\\bCVE-\\d{4}|\\b(?!UTF-|SHA-|ISO-|AES-|CRC-|MD-|PCM-|EOF-|API-|BASE-)[A-Z][A-Z0-9]{1,9}-\\d[A-Z0-9]{0,5}\\b|(?<![&\\w])#\\d{2,6}\\b|@[a-z][\\w.-]*\\.(?:us|com|ai|io|net|org|dev)\\b/;\n\n// S2 — version pin or comparison.\nconst VERSION_RE =\n /(?:>=|<=|==|<|>)\\s*v?\\d+\\.\\d+|\\bv\\d+\\.\\d+|\\b(?:since|until|as of)\\s+(?:v?\\d+\\.\\d+|Python\\s*\\d)/i;\n\n// S3 — a number carrying a unit, or an HTTP status code.\nconst UNITS_RE =\n /[~<>]?\\d+(?:\\.\\d+)?\\s?(?:ms|s\\b|sec\\b|seconds?\\b|min\\b|minutes?\\b|hours?\\b|days?\\b|KB|MB|MiB|GiB|kHz|Hz|bytes?\\b|bit\\b|-bit\\b|%|px\\b|rps\\b|qps\\b)|\\b[1-5]xx\\b|\\b(?:301|302|304|307|308|400|401|403|404|405|409|410|412|422|425|429|500|501|502|503|504)\\b/;\n\n// S4 — a causal connective tying behaviour to a consequence.\nconst CAUSAL_RE =\n /\\b(?:because|otherwise|so that|or else|would (?:break|fail|race|deadlock|leak|clobber|loop|crash|page|stall)|breaks?\\b|so we don'?t|to avoid\\b|caused\\b|causes\\b|gets? clobbered|keeps? (?:us|it|them) from|doesn'?t\\b.{0,24}\\b(?:page|fire|break|leak|loop)|eat into|would otherwise|trade-?offs?\\b)\\b/i;\n\n// S5 — negation of the obvious, or a flagged deliberate deviation.\nconst NEGATION_RE =\n /\\b(?:must not|must never|do(?:es)? not\\b|don'?t\\b.{0,30}\\b(?:leak|log|cache|retry|block|steal|wipe)|never\\b|deliberately|intentionally|counterintuitiv|NOT\\b)|(?<!based )\\bon purpose\\b|\\(not\\s|\\binstead of\\b|\\brather than\\b/;\n\n// S6 — upstream/vendor quirk, workaround provenance, or an external contract.\nconst UPSTREAM_RE =\n /\\b(?:upstream|workaround|quirk|backport|vendored|regression|fixed upstream|requires?\\b|convention\\b|rate.?limit|deprecat|opts? in(?:to)?\\b|raises?\\b.{0,60}\\b(?:when|if|unless)\\b)/i;\n\n// S7 — concurrency, ordering, or invariant vocabulary.\nconst INVARIANT_RE =\n /\\b(?:invariant|idempotent|race\\b|deadlock|re-?entran|atomic|thread-?safe|signal-?safe|lexicographic(?:al(?:ly)?)?|monotonic|must (?:run|be|happen|come|stay|hit|converge|configure)|before any\\b|lost the (?:claim )?race)\\b/i;\n\n// S8 — security reasoning.\nconst SECURITY_RE =\n /\\b(?:timing attack|constant-?time|replay|PII\\b|redact|secret|injection|spoof|fail-?closed|fail-?open|auth bypass|early-?exit timing)\\b/i;\n\nconst VENDOR_RE =\n /\\b(?:GitHub|Slack|Twilio|LiveKit|Kamailio|Groq|OpenAI|Anthropic|Cloudflare|FastAPI|Starlette|Sentry|Zoho|Salla|Ashby|Linear|BigQuery|Postgres|Neon|Drizzle|Vertex|Gemini|Firestore|Stripe|Next\\.js|React Compiler|pydantic|ruff|loguru|Lexical|Farasa|Orpheus|Whisper|schemathesis)(?:'s\\b|\\s+(?:requires?|returns?|expects?|allows?|rejects?|accepts?|sends?|caps?|limits?|wraps?|silently|outputs?|stores?|treats?|doesn'?t|does not|won'?t|can'?t|only|models)\\b)/;\n\nconst PROTECTED_SIGNALS: readonly RegExp[] = [\n REF_RE,\n VERSION_RE,\n UNITS_RE,\n CAUSAL_RE,\n NEGATION_RE,\n UPSTREAM_RE,\n INVARIANT_RE,\n SECURITY_RE,\n VENDOR_RE,\n];\n\n/**\n * True when a comment carries any of the nine protected-class signals.\n *\n * EXEMPTION FLOOR ONLY — a false result is not evidence the comment is worthless.\n */\nexport function isProtected(body: string): boolean {\n return PROTECTED_SIGNALS.some((signal) => signal.test(body));\n}\n\n/**\n * True when a comment cites a ticket, URL, RFC/PEP/CVE or issue number (signal\n * S1 alone). Naming where a decision is recorded is the one thing code cannot\n * do, and it separates an owned scoping note from an unowned admission.\n */\nexport function hasExternalReference(body: string): boolean {\n return REF_RE.test(body);\n}\n\n// --- tokenisation shared by the restatement detectors ----------------------\n\n/**\n * Words that say nothing about *which* code a comment describes. Kept in step\n * with `_comments.py`: shrinking the list costs recall, growing it costs\n * precision by discounting a genuinely novel word.\n */\nexport const STOPWORDS: ReadonlySet<string> = new Set(\n `a an the this that these those it its their his her our your my\n is are was were be been being am do does did done doing has have had having\n will would shall should can could may might must\n and or but nor so yet not no none\n to of for in on at by with from into onto out up down over under about\n as if then than when where which who whom whose what how why while\n we you they i he she them him us me\n also just only even still already again there here\n all any each every some\n via per etc eg ie vs\n need needs needed want wants make makes making let lets\n please note see above below`.split(/\\s+/),\n);\n\nconst CAMEL_PART_RE = /[A-Z]+(?=[A-Z][a-z])|[A-Z]?[a-z]+|[A-Z]+|\\d+/g;\nconst WORD_RE = /[A-Za-z_$][\\w$]*|\\d+/g;\n\n/** Split `snake_case` / `camelCase` / `SCREAMING_CASE` into lowercase parts. */\nexport function splitIdentifier(token: string): string[] {\n const parts: string[] = [];\n for (const chunk of token.split(/[_$]/)) {\n for (const match of chunk.match(CAMEL_PART_RE) ?? []) {\n parts.push(match.toLowerCase());\n }\n }\n return parts;\n}\n\n/**\n * Fold the common English inflections so `updates` / `updating` match `update`.\n *\n * The trailing-`e` strip is what makes the fold *symmetric*: without it\n * `creates` / `creating` reduce to `creat` while `create` stays `create`, and\n * the two never match — the shape that most often made a restatement look\n * novel. Deliberately crude otherwise; every extra conflation is a chance to\n * call a novel word a restatement.\n */\nexport function stem(word: string): string {\n let base = word;\n for (const suffix of [\"ing\", \"ied\", \"ies\", \"ers\", \"er\", \"ed\", \"es\", \"s\"]) {\n if (word.endsWith(suffix) && word.length - suffix.length >= 3) {\n base = word.slice(0, word.length - suffix.length);\n if (suffix === \"ied\" || suffix === \"ies\") return `${base}y`;\n break;\n }\n }\n return base.endsWith(\"e\") && base.length - 1 >= 3 ? base.slice(0, -1) : base;\n}\n\n/** Split prose into lowercase content words, dropping stopwords. */\nexport function contentTokens(text: string): string[] {\n const tokens: string[] = [];\n for (const match of text.match(WORD_RE) ?? []) {\n tokens.push(...splitIdentifier(match));\n }\n return tokens.filter((token) => !STOPWORDS.has(token));\n}\n\n/** Every identifier part appearing in a slice of source. */\nexport function codeTokens(text: string): Set<string> {\n const tokens = new Set<string>();\n for (const match of text.match(WORD_RE) ?? []) {\n for (const part of splitIdentifier(match)) tokens.add(part);\n }\n return tokens;\n}\n\n/** True when every content token of a comment already appears in the code. */\nexport function restates(commentTokens: readonly string[], code: ReadonlySet<string>): boolean {\n const stems = new Set<string>();\n for (const token of code) stems.add(stem(token));\n return commentTokens.every((token) => code.has(token) || stems.has(stem(token)));\n}\n\n// --- the verb-opener restatement shape (shared with `no-comment-cruft`) ------\n\nconst NARRATION_MAX_WORDS = 6;\nconst NARRATION_MIN_CONTENT = 1;\nconst TOKEN_PLURAL_MIN = 4;\n\n// Statements that compute something a comment could be restating. A block, a\n// class/function/type declaration, an `if`, a `for` — anything whose body the\n// comment could be labelling instead — is deliberately absent.\nconst RESTATABLE_STATEMENTS: ReadonlySet<string> = new Set([\n AST_NODE_TYPES.ExpressionStatement,\n AST_NODE_TYPES.ReturnStatement,\n AST_NODE_TYPES.ThrowStatement,\n AST_NODE_TYPES.VariableDeclaration,\n]);\n\n// Verbs that describe the mechanics of the next statement. A comment opening\n// with anything else (a noun, \"because\", \"we\", a ticket id) is not narration.\nconst NARRATION_VERB_RE =\n /^(?:add|append|assign|build|calculate|call|check|clear|close|compute|convert|copy|count|create|declare|decrement|define|delete|extract|fetch|filter|find|format|generate|get|handle|increment|init|initialise|initialize|insert|iterate|join|load|log|loop|make|map|merge|open|parse|print|process|push|read|remove|render|reset|return|save|send|set|setup|sort|split|start|stop|store|update|validate|wrap|write)(?:s|es|d|ed|ing)?$/i;\n\n// Words that carry no information about *which* code the comment describes, so\n// they are not required to appear in the line below.\nconst NARRATION_STOPWORDS: ReadonlySet<string> = new Set([\n \"a\", \"all\", \"an\", \"and\", \"any\", \"are\", \"as\", \"at\", \"back\", \"be\", \"both\", \"by\",\n \"each\", \"for\", \"from\", \"here\", \"if\", \"in\", \"into\", \"is\", \"it\", \"its\", \"just\",\n \"new\", \"of\", \"on\", \"one\", \"onto\", \"or\", \"our\", \"out\", \"over\", \"so\", \"that\",\n \"the\", \"then\", \"this\", \"to\", \"up\", \"us\", \"we\", \"when\", \"with\",\n]);\n\n/** Lowercase, with a single plural `s` folded away so `users` matches `user`. */\nexport function normalizeToken(word: string): string {\n const lower = word.toLowerCase();\n return lower.length > TOKEN_PLURAL_MIN && lower.endsWith(\"s\") && !lower.endsWith(\"ss\")\n ? lower.slice(0, -1)\n : lower;\n}\n\n/** Every identifier in a slice of source, plus its parts, with plurals folded. */\nfunction headTokens(source: string): ReadonlySet<string> {\n const tokens = new Set<string>();\n for (const identifier of source.match(/[A-Za-z_$][\\w$]*/g) ?? []) {\n tokens.add(normalizeToken(identifier));\n for (const part of identifier.split(/[_$]+|(?<=[a-z0-9])(?=[A-Z])/)) {\n if (part.length > 0) tokens.add(normalizeToken(part));\n }\n }\n return tokens;\n}\n\n/** The slice of ESLint's `SourceCode` these shapes read. */\nexport interface StatementReader {\n getTokenAfter: (\n node: TSESTree.Comment,\n options: { includeComments: boolean },\n ) => TSESTree.Token | null;\n getNodeByRangeIndex: (index: number) => TSESTree.Node | null;\n getText: (node: TSESTree.Node) => string;\n}\n\n/** A declaration with nothing but a zero/empty seed computes nothing to restate. */\nfunction isTrivialInitializer(node: TSESTree.VariableDeclaration): boolean {\n return node.declarations.every((declarator) => {\n const init = declarator.init;\n if (init == null || init.type === AST_NODE_TYPES.Literal) return true;\n return (\n (init.type === AST_NODE_TYPES.ArrayExpression && init.elements.length === 0) ||\n (init.type === AST_NODE_TYPES.ObjectExpression && init.properties.length === 0)\n );\n });\n}\n\n/**\n * The source of the single-line statement a comment sits directly above, or null\n * when what follows is a block, a declaration, a type member or anything else\n * the comment could be *labelling* rather than restating.\n */\nexport function restatableStatementBelow(comment: TSESTree.Comment, sourceCode: StatementReader): string | null {\n const token = sourceCode.getTokenAfter(comment, { includeComments: false });\n if (token === null || token.loc.start.line !== comment.loc.end.line + 1) return null;\n for (\n let node: TSESTree.Node | undefined | null = sourceCode.getNodeByRangeIndex(token.range[0]);\n node != null && node.type !== AST_NODE_TYPES.Program;\n node = node.parent\n ) {\n if (!RESTATABLE_STATEMENTS.has(node.type)) continue;\n if (node.loc.start.line !== token.loc.start.line || node.loc.end.line !== node.loc.start.line) {\n return null;\n }\n if (node.type === AST_NODE_TYPES.VariableDeclaration && isTrivialInitializer(node)) {\n return null;\n }\n return sourceCode.getText(node);\n }\n return null;\n}\n\n/**\n * True when a short verb-led comment adds nothing to the statement beneath it:\n * every content word after the opening verb already appears in that statement's\n * head — its assignment target or its callee.\n *\n * Corroboration is TOTAL: one unmatched word means the comment carries\n * something the code does not, so it stays. Only the head counts — everything\n * up to the first `(` — so the comment must restate what the statement\n * *computes*, not something it merely passes as an argument.\n */\nexport function restatesStatementHead(body: string, statement: string | null): boolean {\n if (statement === null) return false;\n const words = body.match(/[A-Za-z][\\w$]*/g) ?? [];\n const opener = words[0];\n if (opener === undefined || words.length > NARRATION_MAX_WORDS) return false;\n if (!NARRATION_VERB_RE.test(opener)) return false;\n const content = words\n .slice(1)\n .map(normalizeToken)\n .filter((word) => !NARRATION_STOPWORDS.has(word));\n if (content.length < NARRATION_MIN_CONTENT) return false;\n const head = statement.split(\"(\")[0] ?? statement;\n const code = headTokens(head);\n return content.every((word) => code.has(word));\n}\n","/**\n * @fileoverview no-conditional-in-test — a conditional in a test body can route around the assertion, so the test passes without asserting.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-conditional-in-test.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-conditional-in-test.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"noConditionalInTest\";\ntype Options = readonly [];\n\nconst TEST_CALLERS: ReadonlySet<string> = new Set([\"it\", \"test\"]);\n\n/**\n * Lifecycle hooks reached through the test object — `test.beforeEach(…)`,\n * `test.afterAll(…)`. `testCallerName` walks a member chain down to its ROOT\n * identifier, so these resolved to `test` and their callbacks were linted as\n * test bodies, contradicting the documented \"conditionals in `beforeEach` /\n * `beforeAll` are deliberately NOT reported\". Teardown is conditional by\n * nature, and there is no assertion in a teardown to hide.\n */\nconst HOOK_MEMBERS: ReadonlySet<string> = new Set([\n \"afterAll\",\n \"afterEach\",\n \"beforeAll\",\n \"beforeEach\",\n]);\n\nconst FUNCTION_TYPES: ReadonlySet<AST_NODE_TYPES> = new Set([\n AST_NODE_TYPES.FunctionDeclaration,\n AST_NODE_TYPES.FunctionExpression,\n AST_NODE_TYPES.ArrowFunctionExpression,\n]);\n\n/** Roots of assertion calls: `expect(x)`, `assert.ok(x)`, `expectTypeOf<T>()`. */\nconst ASSERTION_ROOTS: ReadonlySet<string> = new Set([\n \"expect\",\n \"expectTypeOf\",\n \"assert\",\n \"assertType\",\n]);\n\n/** Assertions that exist only in the type system and are erased at run time. */\nconst TYPE_ASSERTION_ROOTS: ReadonlySet<string> = new Set([\n \"expectTypeOf\",\n \"assertType\",\n]);\n\n/** The nearest enclosing function of `node`. */\nfunction nearestEnclosingFunction(node: TSESTree.Node): TSESTree.Node | null {\n for (let current = node.parent; current != null; current = current.parent) {\n if (FUNCTION_TYPES.has(current.type)) {\n return current;\n }\n }\n return null;\n}\n\n/** The base callee name of a call, unwrapping `.only` / `.skip` / `.each` chains. */\nfunction testCallerName(callee: TSESTree.Node): string | null {\n if (callee.type === AST_NODE_TYPES.Identifier) {\n return callee.name;\n }\n if (callee.type === AST_NODE_TYPES.MemberExpression) {\n return testCallerName(callee.object);\n }\n if (callee.type === AST_NODE_TYPES.CallExpression) {\n return testCallerName(callee.callee);\n }\n if (callee.type === AST_NODE_TYPES.TaggedTemplateExpression) {\n return testCallerName(callee.tag);\n }\n return null;\n}\n\n/** True when `fn` is the callback argument of an `it` or `test` call. */\nfunction isTestBody(fn: TSESTree.Node): boolean {\n const call = fn.parent;\n if (\n call?.type !== AST_NODE_TYPES.CallExpression ||\n !call.arguments.some((argument) => argument === fn)\n ) {\n return false;\n }\n if (\n call.callee.type === AST_NODE_TYPES.MemberExpression &&\n !call.callee.computed &&\n call.callee.property.type === AST_NODE_TYPES.Identifier &&\n HOOK_MEMBERS.has(call.callee.property.name)\n ) {\n return false;\n }\n const name = testCallerName(call.callee);\n return name !== null && TEST_CALLERS.has(name);\n}\n\n/** Walk `node`'s subtree until `predicate` matches. */\nfunction subtreeMatches(\n node: TSESTree.Node,\n predicate: (current: TSESTree.Node) => boolean,\n descendIntoFunctions = true,\n): boolean {\n let found = false;\n const visit = (current: TSESTree.Node): void => {\n if (found) {\n return;\n }\n if (predicate(current)) {\n found = true;\n return;\n }\n for (const key of Object.keys(current)) {\n if (key === \"parent\") {\n continue;\n }\n if (\n !descendIntoFunctions &&\n FUNCTION_TYPES.has(current.type) &&\n key === \"body\"\n ) {\n continue;\n }\n const value = (current as unknown as Record<string, unknown>)[key];\n if (Array.isArray(value)) {\n for (const child of value) {\n if (\n typeof child === \"object\" &&\n child !== null &&\n typeof (child as { type?: unknown }).type === \"string\"\n ) {\n visit(child as TSESTree.Node);\n }\n }\n } else if (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { type?: unknown }).type === \"string\"\n ) {\n visit(value as TSESTree.Node);\n }\n if (found) {\n return;\n }\n }\n };\n visit(node);\n return found;\n}\n\n/** The leftmost identifier a reference chain is rooted at: `!r.a.b` -> `r`. */\nfunction rootIdentifier(node: TSESTree.Node): string | null {\n switch (node.type) {\n case AST_NODE_TYPES.Identifier:\n return node.name;\n case AST_NODE_TYPES.MemberExpression:\n return rootIdentifier(node.object);\n case AST_NODE_TYPES.UnaryExpression:\n return rootIdentifier(node.argument);\n case AST_NODE_TYPES.AwaitExpression:\n return rootIdentifier(node.argument);\n case AST_NODE_TYPES.ChainExpression:\n case AST_NODE_TYPES.TSNonNullExpression:\n case AST_NODE_TYPES.TSAsExpression:\n return rootIdentifier(node.expression);\n case AST_NODE_TYPES.BinaryExpression:\n case AST_NODE_TYPES.LogicalExpression:\n return rootIdentifier(node.left);\n case AST_NODE_TYPES.CallExpression:\n return rootIdentifier(node.callee);\n default:\n return null;\n }\n}\n\n/** The identifier a call is rooted at: `expect(x).not.toBe(y)` -> `expect`. */\nfunction calleeRootName(call: TSESTree.CallExpression): string | null {\n let current: TSESTree.Node = call.callee;\n for (;;) {\n if (current.type === AST_NODE_TYPES.Identifier) {\n return current.name;\n }\n if (current.type === AST_NODE_TYPES.MemberExpression) {\n current = current.object;\n continue;\n }\n if (current.type === AST_NODE_TYPES.CallExpression) {\n current = current.callee;\n continue;\n }\n if (\n current.type === AST_NODE_TYPES.ChainExpression ||\n current.type === AST_NODE_TYPES.TSNonNullExpression\n ) {\n current = current.expression;\n continue;\n }\n return null;\n }\n}\n\nconst isAssertionCall = (node: TSESTree.Node): boolean =>\n node.type === AST_NODE_TYPES.CallExpression &&\n ASSERTION_ROOTS.has(calleeRootName(node) ?? \"\");\n\nconst isTypeAssertionCall = (node: TSESTree.Node): boolean =>\n node.type === AST_NODE_TYPES.CallExpression &&\n TYPE_ASSERTION_ROOTS.has(calleeRootName(node) ?? \"\");\n\nconst containsAssertion = (node: TSESTree.Node): boolean =>\n subtreeMatches(node, isAssertionCall);\n\n/** `test.skip(...)`, `this.skip()`, `ctx.skip()` — an explicit test escape. */\nconst containsSkipCall = (node: TSESTree.Node): boolean =>\n subtreeMatches(\n node,\n (current) =>\n current.type === AST_NODE_TYPES.CallExpression &&\n current.callee.type === AST_NODE_TYPES.MemberExpression &&\n !current.callee.computed &&\n current.callee.property.type === AST_NODE_TYPES.Identifier &&\n current.callee.property.name === \"skip\",\n );\n\n/**\n * `return` / `continue` / `break` in the branch's own scope — the ways a branch\n * can cut the rest of the test short. A `return` inside a nested callback does\n * not leave the test, so the walk stops at function boundaries.\n */\nconst containsEscape = (node: TSESTree.Node): boolean =>\n subtreeMatches(\n node,\n (current) =>\n current.type === AST_NODE_TYPES.ReturnStatement ||\n current.type === AST_NODE_TYPES.ContinueStatement ||\n current.type === AST_NODE_TYPES.BreakStatement,\n false,\n );\n\n/** The statements of a branch, whether or not it is wrapped in a block. */\nfunction branchStatements(\n branch: TSESTree.Statement,\n): readonly TSESTree.Statement[] {\n return branch.type === AST_NODE_TYPES.BlockStatement ? branch.body : [branch];\n}\n\n/** The statement immediately before `node` among its siblings, if any. */\nfunction previousSibling(node: TSESTree.Statement): TSESTree.Node | null {\n const parent = node.parent;\n let siblings: readonly TSESTree.Node[] | null = null;\n if (\n parent.type === AST_NODE_TYPES.BlockStatement ||\n parent.type === AST_NODE_TYPES.Program ||\n parent.type === AST_NODE_TYPES.StaticBlock\n ) {\n siblings = parent.body;\n } else if (parent.type === AST_NODE_TYPES.SwitchCase) {\n siblings = parent.consequent;\n }\n if (siblings === null) {\n return null;\n }\n const index = siblings.indexOf(node);\n return index > 0 ? (siblings[index - 1] ?? null) : null;\n}\n\n/**\n * Guard 1 — a narrowing `if` pinned by the assertion directly above it. The\n * preceding statement must assert on the same value the `if` narrows, so the\n * branch's direction is already established by a check that can fail.\n */\nfunction isPinnedNarrowingGuard(node: TSESTree.IfStatement): boolean {\n const testRoot = rootIdentifier(node.test);\n if (testRoot === null) {\n return false;\n }\n const previous = previousSibling(node);\n if (previous === null || previous.type !== AST_NODE_TYPES.ExpressionStatement) {\n return false;\n }\n let matched = false;\n subtreeMatches(previous, (current) => {\n if (\n current.type !== AST_NODE_TYPES.CallExpression ||\n current.callee.type !== AST_NODE_TYPES.Identifier ||\n current.callee.name !== \"expect\"\n ) {\n return false;\n }\n const subject = current.arguments[0];\n if (subject === undefined) {\n return false;\n }\n if (rootIdentifier(subject) === testRoot) {\n matched = true;\n return true;\n }\n return false;\n });\n return matched;\n}\n\n/** Guard 2 — the branch is an assertion spelled as a throw; the test stops here. */\nfunction isThrowingGuard(node: TSESTree.IfStatement): boolean {\n if (node.alternate !== null) {\n return false;\n }\n const statements = branchStatements(node.consequent);\n return (\n statements.length === 1 &&\n statements[0]?.type === AST_NODE_TYPES.ThrowStatement\n );\n}\n\n/** Every statement in `branch` is a bare type-level assertion call. */\nfunction isTypeAssertionBranch(branch: TSESTree.Statement): boolean {\n const statements = branchStatements(branch);\n return (\n statements.length > 0 &&\n statements.every(\n (statement) =>\n statement.type === AST_NODE_TYPES.ExpressionStatement &&\n isTypeAssertionCall(statement.expression),\n )\n );\n}\n\n/** Guard 4 — narrowing around assertions that are erased at run time. */\nfunction isTypeLevelNarrowing(node: TSESTree.IfStatement): boolean {\n return (\n isTypeAssertionBranch(node.consequent) &&\n (node.alternate === null || isTypeAssertionBranch(node.alternate))\n );\n}\n\n/** A branch that asserts nothing and cannot cut the test short. */\nconst isInertBranch = (branch: TSESTree.Statement): boolean =>\n !containsAssertion(branch) &&\n !containsEscape(branch) &&\n !containsSkipCall(branch);\n\n/**\n * Does the branch only REWRITE state — assign, update, delete, declare?\n *\n * Guard 5 is named \"state normalization\", and \"no assertion and no escape\" is a\n * strictly weaker test than that name implies: a branch full of ACTIONS asserts\n * nothing and escapes nothing either, and it is precisely the branch that makes\n * one test take two paths through the UI.\n */\nfunction isNormalizationStatement(statement: TSESTree.Statement): boolean {\n if (statement.type === AST_NODE_TYPES.VariableDeclaration) {\n return true;\n }\n if (statement.type === AST_NODE_TYPES.BlockStatement) {\n return statement.body.every(isNormalizationStatement);\n }\n if (statement.type !== AST_NODE_TYPES.ExpressionStatement) {\n return false;\n }\n const { expression } = statement;\n return (\n expression.type === AST_NODE_TYPES.AssignmentExpression ||\n expression.type === AST_NODE_TYPES.UpdateExpression ||\n (expression.type === AST_NODE_TYPES.UnaryExpression &&\n expression.operator === \"delete\")\n );\n}\n\n/**\n * Guard 5 — state normalization. The branch has no assertion to skip, no way\n * out of the test, and does nothing but rewrite state. Deliberately narrow: a\n * branch that returns, breaks, continues, calls `.skip(`, or DOES something is\n * exactly the defect this rule exists for and is NOT exempt.\n */\nfunction isInertNormalization(node: TSESTree.IfStatement): boolean {\n const branches = [node.consequent, node.alternate].filter(\n (branch): branch is TSESTree.Statement => branch !== null,\n );\n return branches.every(\n (branch) => isInertBranch(branch) && isNormalizationStatement(branch),\n );\n}\n\n/**\n * State normalization: a branch with no assertion to skip and no way out of the\n * test cannot hide anything. Deliberately narrow — a branch that returns,\n * breaks, continues or calls `.skip(` is the shape the rule exists for.\n */\nfunction isExemptIfStatement(node: TSESTree.IfStatement): boolean {\n return (\n isPinnedNarrowingGuard(node) ||\n isThrowingGuard(node) ||\n isTypeLevelNarrowing(node) ||\n isInertNormalization(node)\n );\n}\n\n/**\n * Guard 3 — `??` never reports (it is a default, never control flow over an\n * assertion), and `&&` / `||` report only in the shape that can actually skip an\n * assertion: a bare `a && expect(a).toBe(1);` statement.\n */\nfunction isShortCircuitedAssertion(node: TSESTree.LogicalExpression): boolean {\n return (\n node.operator !== \"??\" &&\n node.parent.type === AST_NODE_TYPES.ExpressionStatement &&\n containsAssertion(node.right)\n );\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-conditional-in-test\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow conditional logic (if, switch, ternary) in test bodies, which can hide missing assertions or test multiple code paths.\",\n },\n schema: [],\n messages: {\n noConditionalInTest:\n \"Avoid using conditional logic in tests. It can obscure intent and hide unexecuted assertions. Split the test instead.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (!isTestFile(context.filename)) {\n return {};\n }\n const report = (node: TSESTree.Node): void => {\n const enclosing = nearestEnclosingFunction(node);\n if (enclosing === null || !isTestBody(enclosing)) {\n return;\n }\n context.report({ node, messageId: \"noConditionalInTest\" });\n };\n return {\n IfStatement(node: TSESTree.IfStatement): void {\n if (isExemptIfStatement(node)) {\n return;\n }\n report(node);\n },\n SwitchStatement(node: TSESTree.SwitchStatement): void {\n report(node);\n },\n ConditionalExpression(node: TSESTree.ConditionalExpression): void {\n report(node);\n },\n LogicalExpression(node: TSESTree.LogicalExpression): void {\n if (!isShortCircuitedAssertion(node)) {\n return;\n }\n report(node);\n },\n };\n },\n});\n","/**\n * @fileoverview no-cors-wildcard-with-credentials — `Access-Control-Allow-Origin: *` together with credentials lets any site read authenticated responses.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-cors-wildcard-with-credentials.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-cors-wildcard-with-credentials.md\n */\n\nimport { type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\n\ntype MessageIds = \"corsWildcardWithCredentials\";\ntype Options = readonly [];\n\nconst ACAO_HEADER = \"access-control-allow-origin\";\nconst ACAC_HEADER = \"access-control-allow-credentials\";\nconst HEADER_SET_METHODS = new Set([\"setheader\", \"set\", \"append\"]);\n\n/**\n * True only for the boolean literal `true` (not `1`, not a truthy expression).\n */\nfunction isTrueLiteral(node: TSESTree.Node): boolean {\n return node.type === \"Literal\" && node.value === true;\n}\n\n/**\n * True if `node` is a string literal whose value equals `\"true\"`\n * (case-insensitive), or the boolean literal `true`. Header values are strings,\n * but some frameworks coerce a boolean, so both are accepted.\n */\nfunction isCredentialsTrueValue(node: TSESTree.Node): boolean {\n if (node.type === \"Literal\") {\n if (node.value === true) {\n return true;\n }\n if (typeof node.value === \"string\") {\n return node.value.trim().toLowerCase() === \"true\";\n }\n }\n return false;\n}\n\n/**\n * True if `node` is the string literal `\"*\"`.\n */\nfunction isStarLiteral(node: TSESTree.Node): boolean {\n return node.type === \"Literal\" && node.value === \"*\";\n}\n\n/**\n * True if a `\"*\"` string literal appears anywhere in `node`'s subtree. Walking\n * the whole subtree catches `\"*\"`, `[\"*\"]`, and the `flag ? origins : \"*\"`\n * conditional branch. A dynamic `origin: someVar` has no `\"*\"` literal, so it\n * does not fire.\n */\nfunction subtreeContainsStarLiteral(node: TSESTree.Node): boolean {\n if (isStarLiteral(node)) {\n return true;\n }\n for (const key of Object.keys(node)) {\n if (key === \"parent\" || key === \"loc\" || key === \"range\") {\n continue;\n }\n const value = (node as unknown as Record<string, unknown>)[key];\n if (Array.isArray(value)) {\n for (const child of value) {\n if (isNode(child) && subtreeContainsStarLiteral(child)) {\n return true;\n }\n }\n } else if (isNode(value) && subtreeContainsStarLiteral(value)) {\n return true;\n }\n }\n return false;\n}\n\nfunction isNode(value: unknown): value is TSESTree.Node {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { type?: unknown }).type === \"string\"\n );\n}\n\n/**\n * Returns the (non-computed) string name of a property key, or `undefined`.\n */\nfunction propertyKeyName(prop: TSESTree.Property): string | undefined {\n if (prop.computed) {\n return undefined;\n }\n const key = prop.key;\n if (key.type === \"Identifier\") {\n return key.name;\n }\n if (key.type === \"Literal\" && typeof key.value === \"string\") {\n return key.value;\n }\n return undefined;\n}\n\n/**\n * Extracts the callee's terminal identifier name for a call/new expression\n * (`cors` for `cors(...)` and `app.cors(...)`, `Cors` for `new Cors(...)`).\n */\nfunction calleeName(\n node: TSESTree.CallExpression | TSESTree.NewExpression,\n): string | undefined {\n const callee = node.callee;\n if (callee.type === \"Identifier\") {\n return callee.name;\n }\n if (\n callee.type === \"MemberExpression\" &&\n !callee.computed &&\n callee.property.type === \"Identifier\"\n ) {\n return callee.property.name;\n }\n return undefined;\n}\n\n/**\n * Detects the `cors({ origin: \"*\", credentials: true })` shape. Returns true\n * when the callee is `cors` / `Cors` and the first ObjectExpression argument\n * has `credentials: true` AND an `origin` whose subtree contains `\"*\"`.\n */\nfunction isCorsWildcardCredentialsCall(\n node: TSESTree.CallExpression | TSESTree.NewExpression,\n): boolean {\n const name = calleeName(node);\n if (name === undefined || name.toLowerCase() !== \"cors\") {\n return false;\n }\n const options = node.arguments.find(\n (arg): arg is TSESTree.ObjectExpression => arg.type === \"ObjectExpression\",\n );\n if (options === undefined) {\n return false;\n }\n let hasCredentials = false;\n let hasWildcardOrigin = false;\n for (const prop of options.properties) {\n if (prop.type !== \"Property\") {\n continue;\n }\n const key = propertyKeyName(prop);\n if (key === \"credentials\" && isTrueLiteral(prop.value)) {\n hasCredentials = true;\n } else if (key === \"origin\" && subtreeContainsStarLiteral(prop.value)) {\n hasWildcardOrigin = true;\n }\n }\n return hasCredentials && hasWildcardOrigin;\n}\n\n/**\n * True if the ObjectExpression is a header map setting BOTH\n * `Access-Control-Allow-Origin: \"*\"` and\n * `Access-Control-Allow-Credentials: \"true\"` (case-insensitive keys).\n */\nfunction isWildcardCredentialsHeaderObject(\n node: TSESTree.ObjectExpression,\n): boolean {\n let wildcardOrigin = false;\n let credentialsTrue = false;\n for (const prop of node.properties) {\n if (prop.type !== \"Property\") {\n continue;\n }\n const key = propertyKeyName(prop);\n if (key === undefined) {\n continue;\n }\n const header = key.toLowerCase();\n if (header === ACAO_HEADER && isStarLiteral(prop.value)) {\n wildcardOrigin = true;\n } else if (header === ACAC_HEADER && isCredentialsTrueValue(prop.value)) {\n credentialsTrue = true;\n }\n }\n return wildcardOrigin && credentialsTrue;\n}\n\ntype HeaderSetKind = \"origin\" | \"credentials\";\n\n/**\n * Classifies a `x.setHeader(name, value)` / `x.set(name, value)` /\n * `x.append(name, value)` call as an ACAO-wildcard set, an ACAC-true set, or\n * neither.\n */\nfunction classifyHeaderSetCall(\n node: TSESTree.CallExpression,\n): HeaderSetKind | undefined {\n const callee = node.callee;\n if (\n callee.type !== \"MemberExpression\" ||\n callee.computed ||\n callee.property.type !== \"Identifier\" ||\n !HEADER_SET_METHODS.has(callee.property.name.toLowerCase())\n ) {\n return undefined;\n }\n const [nameArg, valueArg] = node.arguments;\n if (\n nameArg === undefined ||\n valueArg === undefined ||\n nameArg.type !== \"Literal\" ||\n typeof nameArg.value !== \"string\"\n ) {\n return undefined;\n }\n const header = nameArg.value.toLowerCase();\n if (header === ACAO_HEADER && isStarLiteral(valueArg)) {\n return \"origin\";\n }\n if (header === ACAC_HEADER && isCredentialsTrueValue(valueArg)) {\n return \"credentials\";\n }\n return undefined;\n}\n\n/**\n * Nearest enclosing function node, or `undefined` for module scope. Used to\n * group split `setHeader`/`set` header assignments so a wildcard origin and a\n * credentials=true set only pair up when they live in the same scope.\n */\nfunction enclosingScope(node: TSESTree.Node): TSESTree.Node | undefined {\n let current: TSESTree.Node | undefined = node.parent;\n while (current) {\n if (\n current.type === \"FunctionDeclaration\" ||\n current.type === \"FunctionExpression\" ||\n current.type === \"ArrowFunctionExpression\"\n ) {\n return current;\n }\n current = current.parent;\n }\n return undefined;\n}\n\ninterface ScopeHeaderSets {\n originNodes: TSESTree.CallExpression[];\n credentialsNodes: TSESTree.CallExpression[];\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-cors-wildcard-with-credentials\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n 'Disallow CORS that reflects any Origin (`\"*\"`) while allowing credentials; any site could then read authenticated responses. Enumerate explicit trusted origins instead.',\n },\n schema: [],\n messages: {\n corsWildcardWithCredentials:\n 'CORS reflects any Origin (`\"*\"`) while allowing credentials — any site can read authenticated responses. Enumerate explicit trusted origins instead of using `\"*\"` with credentials.',\n },\n },\n defaultOptions: [],\n create(context) {\n const scopeHeaderSets = new Map<TSESTree.Node | \"module\", ScopeHeaderSets>();\n\n function recordHeaderSet(\n node: TSESTree.CallExpression,\n kind: HeaderSetKind,\n ): void {\n const key = enclosingScope(node) ?? \"module\";\n let entry = scopeHeaderSets.get(key);\n if (entry === undefined) {\n entry = { originNodes: [], credentialsNodes: [] };\n scopeHeaderSets.set(key, entry);\n }\n if (kind === \"origin\") {\n entry.originNodes.push(node);\n } else {\n entry.credentialsNodes.push(node);\n }\n }\n\n return {\n NewExpression(node: TSESTree.NewExpression): void {\n if (isCorsWildcardCredentialsCall(node)) {\n context.report({ node, messageId: \"corsWildcardWithCredentials\" });\n }\n },\n CallExpression(node: TSESTree.CallExpression): void {\n if (isCorsWildcardCredentialsCall(node)) {\n context.report({ node, messageId: \"corsWildcardWithCredentials\" });\n return;\n }\n const kind = classifyHeaderSetCall(node);\n if (kind !== undefined) {\n recordHeaderSet(node, kind);\n }\n },\n ObjectExpression(node: TSESTree.ObjectExpression): void {\n if (isWildcardCredentialsHeaderObject(node)) {\n context.report({ node, messageId: \"corsWildcardWithCredentials\" });\n }\n },\n \"Program:exit\"(): void {\n for (const { originNodes, credentialsNodes } of scopeHeaderSets.values()) {\n if (originNodes.length > 0 && credentialsNodes.length > 0) {\n for (const node of originNodes) {\n context.report({\n node,\n messageId: \"corsWildcardWithCredentials\",\n });\n }\n }\n }\n },\n };\n },\n});\n","/**\n * @fileoverview no-dynamic-sql — a runtime value interpolated into statement text is SQL injection, and it defeats the prepared-statement cache.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-dynamic-sql.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-dynamic-sql.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { stripSqlNoise } from \"./_sql.js\";\n\ntype MessageIds = \"dynamicSql\";\n\nexport interface RuleOptions {\n /** Statement-taking method names to inspect. Replaces the defaults. */\n readonly methods?: readonly string[];\n}\n\ntype Options = readonly [RuleOptions?];\n\nconst DEFAULT_METHODS: readonly string[] = [\"prepare\", \"exec\", \"query\"];\n\n/** A module-level constant fragment: `CANDIDATE_COLS`, `TABLE_NAME`. */\nconst CONSTANT_CASE_RE = /^[A-Z][A-Z0-9_]*$/;\n\n/**\n * True when an interpolated expression is a compile-time SQL fragment rather\n * than runtime data: a CONSTANT_CASE identifier, a member access whose final\n * property is CONSTANT_CASE (`TABLES.USERS`), or a string literal.\n */\nfunction isStaticFragment(expression: TSESTree.Expression): boolean {\n if (expression.type === AST_NODE_TYPES.Identifier) {\n return CONSTANT_CASE_RE.test(expression.name);\n }\n if (\n expression.type === AST_NODE_TYPES.MemberExpression &&\n !expression.computed &&\n expression.property.type === AST_NODE_TYPES.Identifier\n ) {\n return CONSTANT_CASE_RE.test(expression.property.name);\n }\n if (expression.type === AST_NODE_TYPES.Literal) {\n return typeof expression.value === \"string\";\n }\n return false;\n}\n\n/** The interpolated runtime expressions in a template literal. */\nfunction runtimeInterpolations(\n template: TSESTree.TemplateLiteral,\n): TSESTree.Expression[] {\n return template.expressions.filter(\n (expression) => !isStaticFragment(expression),\n );\n}\n\n/**\n * Flatten a `+` chain into its operands. `\"a\" + b + \"c\"` yields three nodes so\n * each can be judged independently.\n */\nfunction concatOperands(node: TSESTree.Expression): TSESTree.Expression[] {\n if (node.type === AST_NODE_TYPES.BinaryExpression && node.operator === \"+\") {\n return [...concatOperands(node.left), ...concatOperands(node.right)];\n }\n return [node];\n}\n\n/**\n * The runtime operands of a string-concatenation chain, or an empty array when\n * the node is not a concatenation that mixes a literal with a runtime value.\n * Requiring at least one string literal is what distinguishes statement\n * building from ordinary arithmetic.\n */\nfunction runtimeConcatOperands(node: TSESTree.Node): TSESTree.Expression[] {\n if (node.type !== AST_NODE_TYPES.BinaryExpression || node.operator !== \"+\") {\n return [];\n }\n const operands = concatOperands(node);\n const hasStringLiteral = operands.some(\n (operand) =>\n operand.type === AST_NODE_TYPES.Literal &&\n typeof operand.value === \"string\",\n );\n if (!hasStringLiteral) {\n return [];\n }\n return operands.filter(\n (operand) =>\n operand.type !== AST_NODE_TYPES.Literal && !isStaticFragment(operand),\n );\n}\n\n/**\n * A SQL data/DDL statement keyword. `exec` and `query` are generic method names\n * — `child_process.exec` shares them — so the statement text itself has to prove\n * it is SQL before an interpolation into it can be an injection.\n */\nconst SQL_STATEMENT_RE =\n /\\b(?:select\\s|insert\\s+into\\b|insert\\s+or\\b|update\\s+\\w|delete\\s+from\\b|replace\\s+into\\b|merge\\s+into\\b|upsert\\s+into\\b|create\\s+(?:temp(?:orary)?\\s+)?(?:table|index|view|trigger|schema|database)\\b|alter\\s+table\\b|drop\\s+(?:table|index|view|trigger)\\b|truncate\\s+table\\b|pragma\\s+\\w|with\\s+\\w+\\s+as\\s*\\(|from\\s+\\w+\\s+where\\b)/i;\n\n/** The marker a non-static operand contributes to the reconstructed statement text. */\nconst RUNTIME_MARKER = \" ? \";\n\n/**\n * The statically known text of a statement argument, with every runtime operand\n * replaced by a placeholder. Enough to answer \"is this SQL?\" for both the\n * template-literal and the `+`-concatenation shape.\n */\nfunction staticStatementText(node: TSESTree.Node): string {\n if (node.type === AST_NODE_TYPES.TemplateLiteral) {\n return node.quasis.map((quasi) => quasi.value.cooked ?? quasi.value.raw).join(RUNTIME_MARKER);\n }\n if (node.type === AST_NODE_TYPES.Literal) {\n return typeof node.value === \"string\" ? node.value : RUNTIME_MARKER;\n }\n if (node.type === AST_NODE_TYPES.BinaryExpression && node.operator === \"+\") {\n return staticStatementText(node.left) + staticStatementText(node.right);\n }\n return RUNTIME_MARKER;\n}\n\n/** True when the statement argument reads as SQL rather than as a shell command line. */\nfunction looksLikeSql(node: TSESTree.Node): boolean {\n return SQL_STATEMENT_RE.test(stripSqlNoise(staticStatementText(node)));\n}\n\n/** The inspected method name of `receiver.method(...)`, or null. */\nfunction statementMethodName(\n node: TSESTree.CallExpression,\n methods: ReadonlySet<string>,\n): string | null {\n const callee = node.callee;\n if (\n callee.type !== AST_NODE_TYPES.MemberExpression ||\n callee.computed ||\n callee.property.type !== AST_NODE_TYPES.Identifier\n ) {\n return null;\n }\n const name = callee.property.name;\n return methods.has(name) ? name : null;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-dynamic-sql\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow interpolating or concatenating a runtime value into a SQL statement passed to `prepare`/`exec`/`query`; use a placeholder and bind the value.\",\n },\n schema: [\n {\n type: \"object\",\n properties: {\n methods: {\n type: \"array\",\n items: { type: \"string\" },\n description:\n \"Statement-taking method names to inspect. Replaces the defaults.\",\n },\n },\n additionalProperties: false,\n },\n ],\n messages: {\n dynamicSql:\n \"Runtime value built into a SQL statement passed to `{{method}}()`. Use a `?` placeholder and pass the value through `.bind(...)` so the driver parameterises it.\",\n },\n },\n defaultOptions: [{}],\n create(context, [options]) {\n const methods = new Set(options?.methods ?? DEFAULT_METHODS);\n\n return {\n CallExpression(node: TSESTree.CallExpression): void {\n const method = statementMethodName(node, methods);\n if (method === null) {\n return;\n }\n\n const statement = node.arguments[0];\n if (statement === undefined || !looksLikeSql(statement)) {\n return;\n }\n\n const offenders =\n statement.type === AST_NODE_TYPES.TemplateLiteral\n ? runtimeInterpolations(statement)\n : runtimeConcatOperands(statement);\n\n for (const offender of offenders) {\n context.report({\n node: offender,\n messageId: \"dynamicSql\",\n data: { method },\n });\n }\n },\n };\n },\n});\n","/**\n * @fileoverview _sql — shared extraction of statically-resolvable SQL strings, with literal values and comments neutralised before any keyword scan.\n *\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/_sql.md\n */\n\nimport { AST_NODE_TYPES, type TSESLint, type TSESTree } from \"@typescript-eslint/utils\";\n\n/**\n * Blank out SQL string-literal contents and comment bodies.\n *\n * A single left-to-right scan, so precedence between strings and comments is\n * correct: a `--` or quote inside a string literal is protected (masked as\n * string data, never read as a comment), and a quote inside a comment is\n * ignored. Every masked character becomes a space except newlines, which are\n * preserved so the text keeps its shape. Doubled quotes (`''` / `\"\"`) are SQL's\n * in-string escape and keep the scanner inside the literal.\n */\nexport function stripSqlNoise(text: string): string {\n const out = [...text];\n const n = text.length;\n let i = 0;\n while (i < n) {\n const ch = text[i];\n if (ch === \"'\" || ch === '\"') {\n out[i] = \" \";\n i += 1;\n while (i < n) {\n const c = text[i];\n if (c === ch) {\n if (i + 1 < n && text[i + 1] === ch) {\n out[i] = \" \";\n out[i + 1] = \" \";\n i += 2;\n continue;\n }\n out[i] = \" \";\n i += 1;\n break;\n }\n if (c !== \"\\n\") {\n out[i] = \" \";\n }\n i += 1;\n }\n continue;\n }\n if (ch === \"-\" && text[i + 1] === \"-\") {\n while (i < n && text[i] !== \"\\n\") {\n out[i] = \" \";\n i += 1;\n }\n continue;\n }\n if (ch === \"/\" && text[i + 1] === \"*\") {\n out[i] = \" \";\n out[i + 1] = \" \";\n i += 2;\n while (i < n && !(text[i] === \"*\" && text[i + 1] === \"/\")) {\n if (text[i] !== \"\\n\") {\n out[i] = \" \";\n }\n i += 1;\n }\n if (i < n) {\n out[i] = \" \";\n out[i + 1] = \" \";\n i += 2;\n }\n continue;\n }\n i += 1;\n }\n return out.join(\"\");\n}\n\n/** The parameter marker a `${...}` substitution is replaced with before scanning. */\nconst SUBSTITUTION_MARKER = \"?\";\n\n/**\n * Reconstruct the SQL text of a string-bearing node, or null when the node does\n * not statically resolve to one. Handles the four shapes real TS SQL takes:\n * a plain string literal, a template literal (substitutions become `?`), a\n * `+`-concatenation of those, and an array of fragments destined for `.join()`.\n */\nexport function sqlTextOf(node: TSESTree.Node): string | null {\n switch (node.type) {\n case AST_NODE_TYPES.Literal:\n return typeof node.value === \"string\" ? node.value : null;\n case AST_NODE_TYPES.TemplateLiteral:\n return node.quasis.map((q) => q.value.cooked ?? q.value.raw).join(SUBSTITUTION_MARKER);\n case AST_NODE_TYPES.TaggedTemplateExpression:\n return sqlTextOf(node.quasi);\n case AST_NODE_TYPES.BinaryExpression: {\n if (node.operator !== \"+\") {\n return null;\n }\n const left = sqlTextOf(node.left);\n const right = sqlTextOf(node.right);\n return left !== null && right !== null ? left + right : null;\n }\n case AST_NODE_TYPES.ArrayExpression: {\n const parts: string[] = [];\n for (const element of node.elements) {\n if (element === null) {\n return null;\n }\n const part = sqlTextOf(element);\n if (part === null) {\n return null;\n }\n parts.push(part);\n }\n return parts.length > 0 ? parts.join(\" \") : null;\n }\n default:\n return null;\n }\n}\n\n/**\n * True when `node` is an array whose fragments are glued together by `.join(...)`\n * — the `['INSERT INTO t (...)', 'VALUES (?)', 'ON CONFLICT ...'].join(' ')`\n * shape. Only then may the elements be read as one statement; an unrelated array\n * of strings is not SQL.\n */\nfunction isJoinedFragmentArray(node: TSESTree.ArrayExpression): boolean {\n const parent = node.parent;\n return (\n parent?.type === AST_NODE_TYPES.MemberExpression &&\n parent.object === node &&\n !parent.computed &&\n parent.property.type === AST_NODE_TYPES.Identifier &&\n parent.property.name === \"join\" &&\n parent.parent?.type === AST_NODE_TYPES.CallExpression\n );\n}\n\n/** Every string-bearing descendant that a composite node has already absorbed. */\nfunction markConsumed(node: TSESTree.Node, consumed: WeakSet<TSESTree.Node>): void {\n consumed.add(node);\n for (const key of Object.keys(node)) {\n if (key === \"parent\") {\n continue;\n }\n const value = (node as unknown as Record<string, unknown>)[key];\n for (const child of Array.isArray(value) ? value : [value]) {\n if (child !== null && typeof child === \"object\" && \"type\" in child) {\n markConsumed(child as TSESTree.Node, consumed);\n }\n }\n }\n}\n\n/**\n * Build the ESLint visitor that hands each *whole* SQL statement to `handler`\n * exactly once, along with the node to report on.\n *\n * ESLint traverses parents before children, so a composite node (a\n * `+`-concatenation or a joined fragment array) is seen first and marks its\n * string descendants consumed — the fragments are never re-reported on their own.\n */\nexport function createSqlListener(\n handler: (sql: string, node: TSESTree.Node) => void,\n): TSESLint.RuleListener {\n const consumed = new WeakSet<TSESTree.Node>();\n\n const visit = (node: TSESTree.Node): void => {\n if (consumed.has(node)) {\n return;\n }\n const text = sqlTextOf(node);\n if (text === null) {\n return;\n }\n markConsumed(node, consumed);\n handler(stripSqlNoise(text), node);\n };\n\n return {\n BinaryExpression: (node: TSESTree.BinaryExpression): void => {\n visit(node);\n },\n ArrayExpression: (node: TSESTree.ArrayExpression): void => {\n if (isJoinedFragmentArray(node)) {\n visit(node);\n }\n },\n TemplateLiteral: (node: TSESTree.TemplateLiteral): void => {\n visit(node);\n },\n Literal: (node: TSESTree.Literal): void => {\n visit(node);\n },\n };\n}\n","/**\n * @fileoverview no-enum — a TypeScript `enum` emits runtime code, defaults to numbers, and does not tree-shake.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-enum.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-enum.md\n */\n\nimport { type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isGeneratedFile } from \"./_paths.js\";\n\ntype MessageIds = \"noEnum\";\ntype Options = readonly [\n {\n ignoreFiles?: readonly string[];\n }?,\n];\n\nfunction matchesAnyPattern(\n filename: string,\n patterns: readonly string[],\n): boolean {\n for (const pattern of patterns) {\n // Convert minimatch-ish globs to regex: ** -> .*, * -> [^/\\\\]*\n const regexSource = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/\\*\\*/g, \"::DOUBLESTAR::\")\n .replace(/\\*/g, \"[^/\\\\\\\\]*\")\n .replace(/::DOUBLESTAR::/g, \".*\");\n if (new RegExp(`^${regexSource}$`).test(filename)) {\n return true;\n }\n }\n return false;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-enum\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Disallow TypeScript `enum`; use string-literal unions or `as const` objects instead.\",\n },\n schema: [\n {\n type: \"object\",\n additionalProperties: false,\n properties: {\n ignoreFiles: {\n type: \"array\",\n items: { type: \"string\" },\n },\n },\n },\n ],\n messages: {\n noEnum:\n 'Enums are discouraged. Use a string-literal union (e.g. `type Status = \"active\" | \"inactive\"`) or an `as const` object instead.',\n },\n },\n defaultOptions: [{}],\n create(context, [optionsArg]) {\n const options = optionsArg ?? {};\n const ignoreFiles = options.ignoreFiles ?? [];\n const filename = context.filename;\n const sourceText = context.sourceCode.getText();\n\n // Generated code opts out through the SHARED `isGeneratedFile` predicate.\n // This rule used to carry its own narrower copy of all three of its signals\n // — a four-pattern path list and a 1KB `@generated` sniff — and every one of\n // them could be neutered with the suite green, because the shared predicate\n // already answered true for the same files. `ignoreFiles` stays: it names\n // paths a repo knows about and the shared predicate cannot.\n const isIgnoredByOption =\n ignoreFiles.length > 0 && matchesAnyPattern(filename, ignoreFiles);\n\n if (isIgnoredByOption || isGeneratedFile(filename, sourceText)) {\n return {};\n }\n\n return {\n TSEnumDeclaration(node: TSESTree.TSEnumDeclaration): void {\n context.report({\n node,\n messageId: \"noEnum\",\n });\n },\n };\n },\n});\n","/**\n * @fileoverview no-fat-try-blocks — a `try` holding more than three throwing statements catches failures its handler was never written for.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-fat-try-blocks.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-fat-try-blocks.md\n */\n\nimport { type TSESTree, AST_NODE_TYPES } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isGeneratedFile } from \"./_paths.js\";\n\ntype MessageIds = \"fatTryBlock\";\ntype Options = readonly [];\n\nconst MAX_TRY_BODY_STATEMENTS = 3;\n\nconst NESTED_FUNCTION_TYPES = new Set<AST_NODE_TYPES>([\n AST_NODE_TYPES.FunctionDeclaration,\n AST_NODE_TYPES.FunctionExpression,\n AST_NODE_TYPES.ArrowFunctionExpression,\n]);\n\n/**\n * Non-throwing member methods, recognised by NAME ALONE — so the set may hold\n * only names that are not also the vocabulary of an I/O client.\n *\n * `get`, `set`, `add`, `delete`, `has`, `clear`, `find`, `keys`, `values` and\n * `entries` are the `Map` / `Set` API, and they are equally `client.get(url)`,\n * `redis.set(k, v)`, `repo.find(where)` and `api.delete(id)`. A name-only test\n * cannot tell those apart, and resolving the ambiguity towards \"pure\" blinds\n * the rule to the exact swallow it exists to catch, so they are not here.\n * `isBareCallStatement` still exempts fire-and-forget `cache.set(k, v);`\n * structurally, which is the common non-I/O use of the names left out.\n *\n * What remains are Array / String / Number members with no I/O reading: nothing\n * calls `.padStart()` on a database handle.\n */\nconst PURE_METHODS = new Set<string>([\n \"map\", \"filter\", \"forEach\", \"reduce\", \"reduceRight\", \"findIndex\",\n \"findLast\", \"findLastIndex\", \"some\", \"every\", \"push\", \"pop\", \"shift\",\n \"unshift\", \"slice\", \"splice\", \"concat\", \"flat\", \"flatMap\", \"join\", \"reverse\",\n \"sort\", \"fill\", \"includes\", \"indexOf\", \"lastIndexOf\", \"at\", \"toString\",\n \"toLocaleString\", \"valueOf\", \"charAt\", \"charCodeAt\", \"codePointAt\", \"split\",\n \"padStart\", \"padEnd\", \"repeat\", \"trim\", \"trimStart\", \"trimEnd\", \"toUpperCase\",\n \"toLowerCase\", \"toFixed\", \"toPrecision\", \"startsWith\", \"endsWith\",\n]);\n\n/** Non-throwing global namespaces called as `X.method(...)`. */\nconst PURE_NAMESPACES = new Set<string>([\n \"Object\", \"Array\", \"Math\", \"JSON\", \"Number\", \"String\", \"Boolean\", \"console\",\n]);\n\n/**\n * `Namespace.method` pairs that throw despite the namespace being pure.\n *\n * `JSON.parse` is the canonical throwing call in JavaScript and the canonical\n * reason anybody writes `try`/`catch`; calling it non-throwing blinded the rule\n * to its most common subject. `JSON.stringify` also throws — circular\n * structures, `BigInt` — but is overwhelmingly called on a value the same\n * function just built, so it stays pure. That is a recall choice, stated rather\n * than hidden.\n */\nconst IMPURE_NAMESPACE_METHODS = new Set<string>([\"JSON.parse\"]);\n\n/** Constructors that do not throw on construction. */\nconst PURE_CONSTRUCTORS = new Set<string>([\n \"Map\", \"Set\", \"WeakMap\", \"WeakSet\", \"Date\", \"Error\", \"TypeError\",\n \"RangeError\", \"Array\", \"Object\", \"Headers\", \"URLSearchParams\", \"FormData\",\n \"TextEncoder\", \"TextDecoder\", \"Blob\", \"ReadableStream\", \"WritableStream\",\n \"TransformStream\", \"Response\", \"AbortController\",\n]);\n\nfunction isNode(value: unknown): value is TSESTree.Node {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { type?: unknown }).type === \"string\"\n );\n}\n\n/** A call whose value is a known pure, non-throwing helper. */\nfunction isPureCall(node: TSESTree.CallExpression): boolean {\n const callee = node.callee;\n if (callee.type !== AST_NODE_TYPES.MemberExpression) {\n return false;\n }\n const property = callee.property;\n if (property.type !== AST_NODE_TYPES.Identifier) {\n return false;\n }\n if (\n callee.object.type === AST_NODE_TYPES.Identifier &&\n PURE_NAMESPACES.has(callee.object.name)\n ) {\n return !IMPURE_NAMESPACE_METHODS.has(`${callee.object.name}.${property.name}`);\n }\n return PURE_METHODS.has(property.name);\n}\n\nfunction isPureNew(node: TSESTree.NewExpression): boolean {\n return (\n node.callee.type === AST_NODE_TYPES.Identifier &&\n PURE_CONSTRUCTORS.has(node.callee.name)\n );\n}\n\n/**\n * Walk `stmt`'s subtree until `predicate` matches a node. By default the walk\n * stays in the same scope (it does not descend into nested function/arrow\n * bodies); pass `descendIntoFunctions` to visit those too.\n */\nfunction subtreeMatches(\n stmt: TSESTree.Node,\n predicate: (node: TSESTree.Node) => boolean,\n descendIntoFunctions = false,\n): boolean {\n let found = false;\n\n const visit = (current: TSESTree.Node): void => {\n if (found) {\n return;\n }\n if (predicate(current)) {\n found = true;\n return;\n }\n for (const key of Object.keys(current)) {\n if (key === \"parent\") {\n continue;\n }\n if (\n !descendIntoFunctions &&\n NESTED_FUNCTION_TYPES.has(current.type) &&\n key === \"body\"\n ) {\n continue;\n }\n const value = (current as unknown as Record<string, unknown>)[key];\n if (Array.isArray(value)) {\n for (const child of value) {\n if (isNode(child)) {\n visit(child);\n }\n }\n } else if (isNode(value)) {\n visit(value);\n }\n if (found) {\n return;\n }\n }\n };\n\n visit(stmt);\n return found;\n}\n\nconst hasAwait = (node: TSESTree.Node): boolean =>\n subtreeMatches(node, (n) => n.type === AST_NODE_TYPES.AwaitExpression);\n\nconst hasThrowingCallOrNew = (node: TSESTree.Node): boolean =>\n subtreeMatches(\n node,\n (n) =>\n (n.type === AST_NODE_TYPES.CallExpression && !isPureCall(n)) ||\n (n.type === AST_NODE_TYPES.NewExpression && !isPureNew(n)),\n );\n\n/** Unwrap `await` / optional-chain / non-null wrappers to the core expression. */\nfunction unwrap(expr: TSESTree.Expression): TSESTree.Expression {\n let current = expr;\n while (\n current.type === AST_NODE_TYPES.ChainExpression ||\n current.type === AST_NODE_TYPES.TSNonNullExpression\n ) {\n current = current.expression;\n }\n return current;\n}\n\n/** A bare fire-and-forget call statement — `toast(\"done\");`, `logEvent(...);`. */\nfunction isBareCallStatement(stmt: TSESTree.Statement): boolean {\n return (\n stmt.type === AST_NODE_TYPES.ExpressionStatement &&\n unwrap(stmt.expression).type === AST_NODE_TYPES.CallExpression\n );\n}\n\n/**\n * Whether a top-level try-body statement can plausibly throw when the `try`\n * runs. `await` always counts; a bare fire-and-forget call statement does not.\n *\n * Blocks and `if`/`else` branches recurse so the bare-call exemption survives a\n * guard — a fire-and-forget call is no more throwing for sitting inside an\n * `if`. The guard's own TEST is still checked for a throwing call, keeping\n * `if (!validate(x))` counted. A compound statement still contributes at most\n * ONE to the caller's count; this predicate only decides whether it counts.\n */\nfunction canThrow(stmt: TSESTree.Statement): boolean {\n if (hasAwait(stmt)) {\n return true;\n }\n if (isBareCallStatement(stmt)) {\n return false;\n }\n if (stmt.type === AST_NODE_TYPES.BlockStatement) {\n return stmt.body.some(canThrow);\n }\n if (stmt.type === AST_NODE_TYPES.IfStatement) {\n return (\n hasThrowingCallOrNew(stmt.test) ||\n canThrow(stmt.consequent) ||\n (stmt.alternate !== null && canThrow(stmt.alternate))\n );\n }\n return hasThrowingCallOrNew(stmt);\n}\n\n/**\n * Conservative: is the `catch` handler guaranteed to re-throw? True when a\n * handler is present and its body's last statement is a `throw`.\n */\nfunction handlerRethrows(handler: TSESTree.CatchClause | null): boolean {\n if (handler === null) {\n return false;\n }\n const body = handler.body.body;\n const last = body[body.length - 1];\n return last !== undefined && last.type === AST_NODE_TYPES.ThrowStatement;\n}\n\n/** Statements that hand control straight through to their own parent. */\nconst PASS_THROUGH_PARENTS = new Set<AST_NODE_TYPES>([\n AST_NODE_TYPES.IfStatement,\n AST_NODE_TYPES.TryStatement,\n AST_NODE_TYPES.CatchClause,\n AST_NODE_TYPES.LabeledStatement,\n]);\n\n/**\n * Clause (a): nothing in the enclosing function runs after `node`. The node must\n * be last in its block, and every enclosing block must itself be last, up to the\n * function boundary. A loop, `switch`, or any other construct in between means\n * the statement can be followed by more work, so it is not terminal.\n */\nfunction isTerminalInFunction(node: TSESTree.Node): boolean {\n let current: TSESTree.Node = node;\n let parent: TSESTree.Node | undefined = current.parent;\n\n while (parent !== undefined) {\n if (parent.type === AST_NODE_TYPES.BlockStatement) {\n if (parent.body[parent.body.length - 1] !== current) {\n return false;\n }\n } else if (parent.type === AST_NODE_TYPES.Program) {\n return parent.body[parent.body.length - 1] === current;\n } else if (NESTED_FUNCTION_TYPES.has(parent.type)) {\n return true;\n } else if (!PASS_THROUGH_PARENTS.has(parent.type)) {\n return false;\n }\n current = parent;\n parent = current.parent;\n }\n return false;\n}\n\n/** `await f()` unwrapped to `f()`; everything else unwrapped as usual. */\nfunction unwrapAwait(expr: TSESTree.Expression): TSESTree.Expression {\n const inner = unwrap(expr);\n return inner.type === AST_NODE_TYPES.AwaitExpression\n ? unwrap(inner.argument)\n : inner;\n}\n\n/**\n * Clause (b): the handler ends by handing the failure off — a `return`, a\n * `throw`, or a bare call (`errorHandler(e, res);`). A handler that ends on\n * anything else (a branch, an assignment, a loop) is doing recovery work whose\n * correctness depends on which statement threw.\n */\nfunction handlerEndsByHandingOff(handler: TSESTree.CatchClause): boolean {\n const body = handler.body.body;\n const last = body[body.length - 1];\n if (last === undefined) {\n return false;\n }\n if (\n last.type === AST_NODE_TYPES.ReturnStatement ||\n last.type === AST_NODE_TYPES.ThrowStatement\n ) {\n return true;\n }\n return (\n last.type === AST_NODE_TYPES.ExpressionStatement &&\n unwrapAwait(last.expression).type === AST_NODE_TYPES.CallExpression\n );\n}\n\n/**\n * Every identifier bound by a `catch` parameter pattern. Type annotations are\n * skipped — `catch (e: Error)` binds `e`, not `Error`, and counting the type\n * would let a handler that merely constructs an `Error` pass clause (c).\n */\nfunction collectBindingNames(\n pattern: TSESTree.Node,\n names: Set<string>,\n): void {\n if (pattern.type === AST_NODE_TYPES.Identifier) {\n names.add(pattern.name);\n return;\n }\n if (pattern.type === AST_NODE_TYPES.ObjectPattern) {\n for (const property of pattern.properties) {\n collectBindingNames(\n property.type === AST_NODE_TYPES.RestElement\n ? property.argument\n : property.value,\n names,\n );\n }\n return;\n }\n if (pattern.type === AST_NODE_TYPES.ArrayPattern) {\n for (const element of pattern.elements) {\n if (element !== null) {\n collectBindingNames(element, names);\n }\n }\n return;\n }\n if (\n pattern.type === AST_NODE_TYPES.AssignmentPattern ||\n pattern.type === AST_NODE_TYPES.RestElement\n ) {\n collectBindingNames(\n pattern.type === AST_NODE_TYPES.AssignmentPattern\n ? pattern.left\n : pattern.argument,\n names,\n );\n }\n}\n\nfunction caughtBindingNames(handler: TSESTree.CatchClause): ReadonlySet<string> {\n const names = new Set<string>();\n if (handler.param !== null) {\n collectBindingNames(handler.param, names);\n }\n return names;\n}\n\n/** A member property / object key spelled `x` is not a reference to `x`. */\nfunction isPropertyName(node: TSESTree.Identifier): boolean {\n const parent = node.parent;\n if (parent.type === AST_NODE_TYPES.MemberExpression) {\n return parent.property === node && !parent.computed;\n }\n if (parent.type === AST_NODE_TYPES.Property) {\n return parent.key === node && !parent.computed;\n }\n return false;\n}\n\n/**\n * Clause (c): the handler references the caught error somewhere — it reports the\n * failure rather than discarding it. Nested callbacks count; a handler that logs\n * the error from inside a `.then()` still reports it.\n */\nfunction handlerMentionsCaughtBinding(handler: TSESTree.CatchClause): boolean {\n const names = caughtBindingNames(handler);\n if (names.size === 0) {\n return false;\n }\n return subtreeMatches(\n handler.body,\n (n) =>\n n.type === AST_NODE_TYPES.Identifier &&\n names.has(n.name) &&\n !isPropertyName(n),\n true,\n );\n}\n\n/** `null`, `undefined`, `false`, `void 0`, `[]`, `{}` — a success-shaped value. */\nfunction isSuccessShapedValue(expr: TSESTree.Expression): boolean {\n let current: TSESTree.Expression = expr;\n while (\n current.type === AST_NODE_TYPES.TSAsExpression ||\n current.type === AST_NODE_TYPES.TSNonNullExpression\n ) {\n current = current.expression;\n }\n if (current.type === AST_NODE_TYPES.Literal) {\n return current.value === null || current.value === false;\n }\n if (current.type === AST_NODE_TYPES.Identifier) {\n return current.name === \"undefined\";\n }\n if (current.type === AST_NODE_TYPES.UnaryExpression) {\n return current.operator === \"void\";\n }\n if (current.type === AST_NODE_TYPES.ArrayExpression) {\n return current.elements.length === 0;\n }\n if (current.type === AST_NODE_TYPES.ObjectExpression) {\n return current.properties.length === 0;\n }\n return false;\n}\n\n/**\n * Clause (d): the handler fabricates a success-shaped result. This is the shape\n * the rule exists for — an unknown one of N operations failed and the caller is\n * told \"nothing found\".\n */\nconst handlerReturnsSuccessShaped = (handler: TSESTree.CatchClause): boolean =>\n subtreeMatches(\n handler.body,\n (n) =>\n n.type === AST_NODE_TYPES.ReturnStatement &&\n n.argument !== null &&\n isSuccessShapedValue(n.argument),\n );\n\n/**\n * The terminal error-propagating boundary exemption.\n */\nfunction isTerminalErrorBoundary(node: TSESTree.TryStatement): boolean {\n const handler = node.handler;\n return (\n handler !== null &&\n isTerminalInFunction(node) &&\n handlerEndsByHandingOff(handler) &&\n handlerMentionsCaughtBinding(handler) &&\n !handlerReturnsSuccessShaped(handler)\n );\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-fat-try-blocks\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow `try` blocks with more than three top-level statements that can throw — isolate the throwing statement and move non-throwing work outside.\",\n },\n schema: [],\n messages: {\n fatTryBlock:\n \"This `try` block has {{count}} statements that can throw (max {{max}}). Isolate the throwing statement(s); move non-throwing work outside the `try`.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (isGeneratedFile(context.filename, context.sourceCode.text)) {\n return {};\n }\n\n const sourceCode = context.sourceCode;\n\n return {\n TryStatement(node: TSESTree.TryStatement): void {\n if (node.finalizer !== null) {\n return;\n }\n if (handlerRethrows(node.handler)) {\n return;\n }\n if (isTerminalErrorBoundary(node)) {\n return;\n }\n\n const count = node.block.body.filter(canThrow).length;\n if (count <= MAX_TRY_BODY_STATEMENTS) {\n return;\n }\n\n const tryKeyword = sourceCode.getFirstToken(node);\n context.report({\n node: tryKeyword ?? node,\n messageId: \"fatTryBlock\",\n data: { count, max: MAX_TRY_BODY_STATEMENTS },\n });\n },\n };\n },\n});\n","/**\n * @fileoverview no-hand-rolled-sleep — a hand-rolled promisified timer cannot be cancelled; the stdlib form takes an `AbortSignal`.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-hand-rolled-sleep.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-hand-rolled-sleep.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isGeneratedFile, isScriptFile, isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"handRolledSleep\" | \"handRolledTimeoutRace\";\ntype Options = readonly [\n {\n allowIn?: readonly string[];\n checkClientModules?: boolean;\n }?,\n];\n\n/** Receivers of an explicit `<obj>.setTimeout(...)` that still mean the global. */\nconst GLOBAL_OBJECTS: ReadonlySet<string> = new Set([\n \"globalThis\",\n \"window\",\n \"self\",\n \"global\",\n]);\n\n/** Modules whose presence proves the file is bundled for a non-Node runtime. */\nconst CLIENT_ONLY_MODULES =\n /^(react|react-dom|react-native|svelte|vue|preact|solid-js)(\\/|$)|^next\\/(navigation|router|link|image)$/;\n\n/** `Promise` combinators whose losing arm is discarded, leaking an orphan timer. */\nconst RACE_METHODS: ReadonlySet<string> = new Set([\"race\", \"any\"]);\n\n/**\n * Glob-ish matcher mirroring `require-fetch-timeout`'s: `**` spans separators,\n * `*` does not. Kept local for the same reason it is there — two call sites do\n * not yet justify a shared module, and the semantics must not drift silently.\n */\nfunction matchesAnyPattern(filename: string, patterns: readonly string[]): boolean {\n for (const pattern of patterns) {\n const regexSource = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/\\*\\*/g, \"::DOUBLESTAR::\")\n .replace(/\\*/g, \"[^/\\\\\\\\]*\")\n .replace(/::DOUBLESTAR::/g, \".*\");\n if (new RegExp(`^${regexSource}$`).test(filename)) {\n return true;\n }\n }\n return false;\n}\n\n/** True when `callee` names `setTimeout`, bare or on an explicit global object. */\nfunction isSetTimeoutCallee(callee: TSESTree.Node): boolean {\n if (callee.type === AST_NODE_TYPES.Identifier) {\n return callee.name === \"setTimeout\";\n }\n return (\n callee.type === AST_NODE_TYPES.MemberExpression &&\n !callee.computed &&\n callee.property.type === AST_NODE_TYPES.Identifier &&\n callee.property.name === \"setTimeout\" &&\n callee.object.type === AST_NODE_TYPES.Identifier &&\n GLOBAL_OBJECTS.has(callee.object.name)\n );\n}\n\nfunction soleCall(fn: TSESTree.ArrowFunctionExpression | TSESTree.FunctionExpression):\n | TSESTree.CallExpression\n | null {\n if (fn.body.type !== AST_NODE_TYPES.BlockStatement) {\n return fn.body.type === AST_NODE_TYPES.CallExpression ? fn.body : null;\n }\n if (fn.body.body.length !== 1) {\n return null;\n }\n const [only] = fn.body.body;\n if (only?.type !== AST_NODE_TYPES.ExpressionStatement) {\n return null;\n }\n return only.expression.type === AST_NODE_TYPES.CallExpression ? only.expression : null;\n}\n\n/** True for a delay that is a real wait: absent-of-literal, or a nonzero literal. */\nfunction isTimedDelay(delay: TSESTree.Node | undefined): boolean {\n if (delay === undefined) {\n return false;\n }\n if (delay.type === AST_NODE_TYPES.Literal && typeof delay.value === \"number\") {\n return delay.value !== 0;\n }\n // A variable / member / expression delay is the motivating case: a `sleep(ms)`\n // helper forwarding its parameter. Only a literal `0` is provably a yield.\n return true;\n}\n\n/**\n * True when `callback` settles `name` and carries no value: the bare identifier\n * `name`, or a zero-argument `() => name()` / `() => { name(); }` forwarder.\n * A callback passing a value is a delayed RESULT, which this rule leaves alone.\n */\nfunction settlesWithoutValue(callback: TSESTree.Node, name: string): boolean {\n if (callback.type === AST_NODE_TYPES.Identifier) {\n return callback.name === name;\n }\n if (\n callback.type !== AST_NODE_TYPES.ArrowFunctionExpression &&\n callback.type !== AST_NODE_TYPES.FunctionExpression\n ) {\n return false;\n }\n const call = soleCall(callback);\n return (\n call !== null &&\n call.arguments.length === 0 &&\n call.callee.type === AST_NODE_TYPES.Identifier &&\n call.callee.name === name\n );\n}\n\n/**\n * True when `callback` calls `name` — with or without an argument, since a\n * timeout arm conventionally rejects with an `Error`. Only consulted for the\n * REJECT parameter inside a `Promise.race`, where any rejection at all means\n * \"time this out\"; the value-carrying case that the resolve path excludes is\n * exactly what a rejection is supposed to look like.\n */\nfunction rejectsInCallback(callback: TSESTree.Node, name: string): boolean {\n if (callback.type === AST_NODE_TYPES.Identifier) {\n return callback.name === name;\n }\n if (\n callback.type !== AST_NODE_TYPES.ArrowFunctionExpression &&\n callback.type !== AST_NODE_TYPES.FunctionExpression\n ) {\n return false;\n }\n const call = soleCall(callback);\n return (\n call !== null &&\n call.callee.type === AST_NODE_TYPES.Identifier &&\n call.callee.name === name\n );\n}\n\n/** The name of an executor parameter at `index`, when it is a plain identifier. */\nfunction parameterName(\n fn: TSESTree.ArrowFunctionExpression | TSESTree.FunctionExpression,\n index: number,\n): string | null {\n const parameter = fn.params[index];\n return parameter?.type === AST_NODE_TYPES.Identifier ? parameter.name : null;\n}\n\n/**\n * True when `node` sits directly in the array literal handed to\n * `Promise.race([...])` / `Promise.any([...])` — the only position where a\n * delayed rejection means \"time this out\" and `AbortSignal.timeout` applies.\n */\nfunction isRaceArm(node: TSESTree.NewExpression): boolean {\n const array = node.parent;\n if (array?.type !== AST_NODE_TYPES.ArrayExpression) {\n return false;\n }\n const call = array.parent;\n return (\n call?.type === AST_NODE_TYPES.CallExpression &&\n call.arguments[0] === array &&\n call.callee.type === AST_NODE_TYPES.MemberExpression &&\n !call.callee.computed &&\n call.callee.object.type === AST_NODE_TYPES.Identifier &&\n call.callee.object.name === \"Promise\" &&\n call.callee.property.type === AST_NODE_TYPES.Identifier &&\n RACE_METHODS.has(call.callee.property.name)\n );\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-hand-rolled-sleep\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow hand-rolled promisified timers (`new Promise((r) => setTimeout(r, ms))`) and hand-rolled `Promise.race` timeout arms; the stdlib forms are cancellable, these are not.\",\n },\n schema: [\n {\n type: \"object\",\n additionalProperties: false,\n properties: {\n allowIn: {\n description:\n \"Glob patterns for modules exempt from the rule (e.g. a single sanctioned `sleep` utility). Matched against the ABSOLUTE file path, so anchor with a `**/` prefix (e.g. `**/lib/sleep.ts`).\",\n type: \"array\",\n items: { type: \"string\" },\n },\n checkClientModules: {\n description:\n \"Also report the sleep form in browser/React Native modules. Off by default: those bundles cannot import `node:timers/promises` and the web platform has no equivalent, so the fix is impossible to follow. Turn on only where every file can resolve `node:` builtins.\",\n type: \"boolean\",\n },\n },\n },\n ],\n messages: {\n handRolledSleep:\n \"Hand-rolled sleep: `new Promise((resolve) => setTimeout(resolve, ms))` cannot be cancelled, so an aborted request or a lost race still waits out the full delay. Use `import { setTimeout as sleep } from \\\"node:timers/promises\\\"` and pass `{ signal }`.\",\n handRolledTimeoutRace:\n \"Hand-rolled timeout arm: when the other promise wins, this timer is never cleared and keeps the event loop alive until it fires. Use `AbortSignal.timeout(ms)` and pass the signal to the operation.\",\n },\n },\n defaultOptions: [{}],\n create(context, [optionsArg]) {\n const { filename, sourceCode } = context;\n if (\n isTestFile(filename) ||\n isScriptFile(filename) ||\n isGeneratedFile(filename, sourceCode.getText())\n ) {\n return {};\n }\n\n const allowIn = optionsArg?.allowIn ?? [];\n if (allowIn.length > 0 && matchesAnyPattern(filename, allowIn)) {\n return {};\n }\n\n const checkClientModules = optionsArg?.checkClientModules ?? false;\n\n /**\n * True when this module provably ships to a non-Node runtime: a JSX file, a\n * `\"use client\"` directive, or an import of a client-only framework. Blunt\n * on purpose — over-skipping costs a report, under-skipping prints advice\n * the consumer physically cannot follow.\n */\n function isClientModule(): boolean {\n if (/\\.[cm]?[jt]sx$/.test(filename)) {\n return true;\n }\n const program = sourceCode.ast;\n for (const statement of program.body) {\n if (\n statement.type === AST_NODE_TYPES.ExpressionStatement &&\n statement.expression.type === AST_NODE_TYPES.Literal &&\n statement.expression.value === \"use client\"\n ) {\n return true;\n }\n if (\n statement.type === AST_NODE_TYPES.ImportDeclaration &&\n typeof statement.source.value === \"string\" &&\n CLIENT_ONLY_MODULES.test(statement.source.value)\n ) {\n return true;\n }\n }\n return false;\n }\n\n let clientModule: boolean | null = null;\n const reportsSleepHere = (): boolean => {\n if (checkClientModules) {\n return true;\n }\n clientModule ??= isClientModule();\n return !clientModule;\n };\n\n return {\n NewExpression(node: TSESTree.NewExpression): void {\n if (node.callee.type !== AST_NODE_TYPES.Identifier || node.callee.name !== \"Promise\") {\n return;\n }\n const executor = node.arguments[0];\n if (\n executor?.type !== AST_NODE_TYPES.ArrowFunctionExpression &&\n executor?.type !== AST_NODE_TYPES.FunctionExpression\n ) {\n return;\n }\n const call = soleCall(executor);\n if (call === null || !isSetTimeoutCallee(call.callee)) {\n return;\n }\n const [callback, delay] = call.arguments;\n if (callback === undefined || !isTimedDelay(delay)) {\n return;\n }\n\n const resolveName = parameterName(executor, 0);\n if (resolveName !== null && settlesWithoutValue(callback, resolveName)) {\n if (reportsSleepHere()) {\n context.report({ node, messageId: \"handRolledSleep\" });\n }\n return;\n }\n\n const rejectName = parameterName(executor, 1);\n if (\n rejectName !== null &&\n isRaceArm(node) &&\n rejectsInCallback(callback, rejectName)\n ) {\n context.report({ node, messageId: \"handRolledTimeoutRace\" });\n }\n },\n };\n },\n});\n","/**\n * @fileoverview no-insecure-random-id — `Math.random()` is predictable, so an id, token or key built from it is guessable.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-insecure-random-id.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-insecure-random-id.md\n */\n\nimport { type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"insecureRandomId\";\ntype Options = readonly [];\n\nconst STRONG_SECURITY_PATTERN =\n /token|secret|csrf|password|passwd|apikey|api[-_]?key|nonce|salt|uuid|authid/i;\n\nconst NON_SECURITY_ID_PATTERN =\n /temp|tmp|cache|correlation|request|req|trace|execution|dev|hmr|mock|test|perf|marker/i;\n\n/** Matches a static string fragment that reads as a path or DOM-id context. */\nconst PATH_OR_DOM_MARKER = /[\\\\/#]|\\.[A-Za-z0-9]/;\n\n/**\n * Returns true if `node` is a `Math.random()` CallExpression.\n */\nfunction isMathRandomCall(node: TSESTree.Node): node is TSESTree.CallExpression {\n if (node.type !== \"CallExpression\") {\n return false;\n }\n const callee = node.callee;\n if (callee.type !== \"MemberExpression\" || callee.computed) {\n return false;\n }\n const { object, property } = callee;\n return (\n object.type === \"Identifier\" &&\n object.name === \"Math\" &&\n property.type === \"Identifier\" &&\n property.name === \"random\"\n );\n}\n\n/**\n * Climbs the member/call chain in which `node` is the object/callee end, and\n * returns the outermost value node of that chain. For\n * `Math.random().toString(36).slice(2)` this returns the `.slice(2)` call —\n * i.e. the value that actually gets assigned/concatenated.\n */\nfunction climbValueChain(node: TSESTree.Node): TSESTree.Node {\n let current: TSESTree.Node = node;\n let parent = current.parent;\n\n while (parent) {\n if (\n parent.type === \"MemberExpression\" &&\n parent.object === current &&\n !parent.computed\n ) {\n current = parent;\n parent = current.parent;\n continue;\n }\n if (parent.type === \"CallExpression\" && parent.callee === current) {\n current = parent;\n parent = current.parent;\n continue;\n }\n break;\n }\n\n return current;\n}\n\n/**\n * Returns true if `node` (a `Math.random()` call) is the base of a member\n * chain that calls `.toString(36)` somewhere above it, e.g.\n * `Math.random().toString(36)` or `Math.random().toString(36).slice(2)`.\n */\nfunction isPartOfToString36Chain(node: TSESTree.Node): boolean {\n let current: TSESTree.Node = node;\n let parent = current.parent;\n\n while (parent) {\n if (\n parent.type === \"MemberExpression\" &&\n parent.object === current &&\n !parent.computed &&\n parent.property.type === \"Identifier\" &&\n parent.property.name === \"toString\"\n ) {\n const grandparent = parent.parent;\n if (\n grandparent &&\n grandparent.type === \"CallExpression\" &&\n grandparent.callee === parent\n ) {\n const firstArg = grandparent.arguments[0];\n if (firstArg && firstArg.type === \"Literal\" && firstArg.value === 36) {\n return true;\n }\n }\n }\n\n if (parent.type === \"MemberExpression\" && parent.object === current) {\n current = parent;\n parent = current.parent;\n continue;\n }\n if (parent.type === \"CallExpression\" && parent.callee === current) {\n current = parent;\n parent = current.parent;\n continue;\n }\n break;\n }\n\n return false;\n}\n\n/**\n * Walks up from `node` to find the name of the nearest enclosing binding\n * (VariableDeclarator id) or property (Property / PropertyDefinition key),\n * and returns it. Passes through string concatenation and template literals so\n * that `const tempPath = base + Math.random()...` resolves to `tempPath`.\n * Returns `undefined` if no such name is found before leaving the enclosing\n * initializer/value context.\n */\nfunction findEnclosingName(node: TSESTree.Node): string | undefined {\n let current: TSESTree.Node = node;\n let parent = current.parent;\n\n while (parent) {\n if (parent.type === \"VariableDeclarator\" && parent.init === current) {\n if (parent.id.type === \"Identifier\") {\n return parent.id.name;\n }\n return undefined;\n }\n\n if (parent.type === \"Property\" && parent.value === current) {\n const key = parent.key;\n if (!parent.computed && key.type === \"Identifier\") {\n return key.name;\n }\n if (key.type === \"Literal\" && typeof key.value === \"string\") {\n return key.value;\n }\n return undefined;\n }\n\n if (parent.type === \"PropertyDefinition\" && parent.value === current) {\n const key = parent.key;\n if (!parent.computed && key.type === \"Identifier\") {\n return key.name;\n }\n if (key.type === \"Literal\" && typeof key.value === \"string\") {\n return key.value;\n }\n return undefined;\n }\n\n if (\n parent.type === \"FunctionDeclaration\" ||\n parent.type === \"FunctionExpression\" ||\n parent.type === \"ArrowFunctionExpression\" ||\n parent.type === \"BlockStatement\" ||\n parent.type === \"ReturnStatement\" ||\n parent.type === \"ExpressionStatement\"\n ) {\n return undefined;\n }\n\n current = parent;\n parent = current.parent;\n }\n\n return undefined;\n}\n\n/**\n * Collects the static string fragments of a `+` concatenation / template\n * literal subtree into `out`.\n */\nfunction collectStaticStringParts(\n node: TSESTree.Node,\n out: string[],\n): void {\n if (node.type === \"Literal\" && typeof node.value === \"string\") {\n out.push(node.value);\n return;\n }\n if (node.type === \"TemplateLiteral\") {\n for (const quasi of node.quasis) {\n out.push(quasi.value.cooked ?? quasi.value.raw);\n }\n return;\n }\n if (node.type === \"BinaryExpression\" && node.operator === \"+\") {\n collectStaticStringParts(node.left, out);\n collectStaticStringParts(node.right, out);\n }\n}\n\n/**\n * Returns true if the random value is concatenated into a string whose static\n * parts read as a filename/path/DOM id (contain a slash, backslash, `#`, or a\n * `.ext`-style fragment).\n */\nfunction isConcatenatedIntoPathOrDomId(node: TSESTree.Node): boolean {\n const valueNode = climbValueChain(node);\n\n let current: TSESTree.Node = valueNode;\n let parent = current.parent;\n let top: TSESTree.Node | undefined;\n\n while (parent) {\n if (\n parent.type === \"BinaryExpression\" &&\n parent.operator === \"+\" &&\n (parent.left === current || parent.right === current)\n ) {\n top = parent;\n current = parent;\n parent = current.parent;\n continue;\n }\n if (parent.type === \"TemplateLiteral\") {\n top = parent;\n current = parent;\n parent = current.parent;\n continue;\n }\n break;\n }\n\n if (!top) {\n return false;\n }\n\n const parts: string[] = [];\n collectStaticStringParts(top, parts);\n return parts.some((part) => PATH_OR_DOM_MARKER.test(part));\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-insecure-random-id\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow using `Math.random()` to generate identifiers, tokens, or secrets; use `crypto.randomUUID()` or `crypto.getRandomValues(...)` instead.\",\n },\n schema: [],\n messages: {\n insecureRandomId:\n \"`Math.random()` is not cryptographically secure and is predictable; do not use it to generate IDs, tokens, or secrets. Use `crypto.randomUUID()` or `crypto.getRandomValues(...)` instead.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (isTestFile(context.filename)) {\n return {};\n }\n return {\n CallExpression(node: TSESTree.CallExpression): void {\n if (!isMathRandomCall(node)) {\n return;\n }\n\n const name = findEnclosingName(node);\n\n // A strong security name always fires — even a `sessionToken` or a name\n // that also happens to contain a correlation-id word.\n if (name !== undefined && STRONG_SECURITY_PATTERN.test(name)) {\n context.report({ node, messageId: \"insecureRandomId\" });\n return;\n }\n\n // Ephemeral / correlation ids (temp files, HMR sessions, dev request\n // ids, ...) are not security-sensitive — suppress, including the\n // `.toString(36)` idiom used to shape them.\n if (name !== undefined && NON_SECURITY_ID_PATTERN.test(name)) {\n return;\n }\n\n // A random value concatenated into a filename/path/DOM id is not a\n // security token.\n if (isConcatenatedIntoPathOrDomId(node)) {\n return;\n }\n\n // The classic insecure random-id idiom.\n if (isPartOfToString36Chain(node)) {\n context.report({ node, messageId: \"insecureRandomId\" });\n }\n },\n };\n },\n});\n","/**\n * @fileoverview no-json-stringify-error — `JSON.stringify` on an Error yields `{}` — `message` and `stack` are non-enumerable.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-json-stringify-error.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-json-stringify-error.md\n */\n\nimport { type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport type { Scope, SourceCode } from \"@typescript-eslint/utils/ts-eslint\";\n\ntype MessageIds = \"noJsonStringifyError\";\ntype Options = readonly [];\n\nconst ERROR_NAME_PATTERN = /^(e|err|error|ex|exc)$/i;\n\n/** Property names whose value is itself an error object (unsafe to stringify). */\nconst ERROR_PROP_PATTERN = /^(cause|lastError|error|err|exception|originalError|innerError)$/i;\n\n/** Property names whose value is a plain string — the recommended escape hatch. */\nconst SAFE_STRING_PROPS: ReadonlySet<string> = new Set([\"message\", \"stack\", \"name\"]);\n\n/**\n * Accessors that hold an error's *data* payload rather than a nested error.\n * These are ordinary enumerable JSON, so `JSON.stringify` on them is correct —\n * react-router's `ErrorResponse.data`, zod's `ZodError.issues`, an HTTP client's\n * `.status` / `.response.body`.\n */\nconst PAYLOAD_PROPS: ReadonlySet<string> = new Set([\n \"data\",\n \"status\",\n \"statuscode\",\n \"statustext\",\n \"code\",\n \"issues\",\n \"details\",\n \"body\",\n \"payload\",\n \"response\",\n \"info\",\n \"meta\",\n \"metadata\",\n \"context\",\n]);\n\n/**\n * Walk up the scope chain looking for a `catch` clause whose binding matches\n * `name`. We rely on the scope analysis provided by the parser rather than\n * type information, keeping the rule type-free.\n */\nfunction isCatchBinding(scope: Scope.Scope, name: string): boolean {\n let current: Scope.Scope | null = scope;\n while (current) {\n const variable = current.set.get(name);\n if (variable) {\n for (const def of variable.defs) {\n if (def.type === \"CatchClause\") {\n return true;\n }\n }\n }\n current = current.upper;\n }\n return false;\n}\n\n/**\n * True if a member-expression argument (`err.cause`, `this.lastError`) denotes an\n * Error value: an error-suggesting property name, or an error-suggesting base whose\n * property is not a known string accessor (`.message` / `.stack` / `.name`).\n */\nfunction memberSuggestsError(\n member: TSESTree.MemberExpression,\n scope: Scope.Scope,\n): boolean {\n const propName =\n !member.computed && member.property.type === \"Identifier\" ? member.property.name : null;\n\n if (propName !== null && ERROR_PROP_PATTERN.test(propName)) {\n return true;\n }\n\n const base = member.object;\n const baseSuggestsError =\n base.type === \"Identifier\" &&\n (ERROR_NAME_PATTERN.test(base.name) || isCatchBinding(scope, base.name));\n if (baseSuggestsError) {\n if (propName === null) {\n return true;\n }\n const lowered = propName.toLowerCase();\n return !SAFE_STRING_PROPS.has(lowered) && !PAYLOAD_PROPS.has(lowered);\n }\n\n return false;\n}\n\n/** The subject `x` of an `x instanceof Error` test, or null. */\nfunction instanceofErrorSubject(\n test: TSESTree.Expression,\n): TSESTree.Expression | null {\n if (\n test.type === \"BinaryExpression\" &&\n test.operator === \"instanceof\" &&\n test.right.type === \"Identifier\" &&\n test.right.name === \"Error\"\n ) {\n return test.left;\n }\n return null;\n}\n\n/** Names of a user-defined type-guard predicate: `isErrorLike`, `isError`, `hasErrorShape`. */\nconst TYPE_GUARD_PATTERN = /^(is|has)[A-Z]/;\n\n/** The narrowed subject `x` of a user-defined type-guard call `isFoo(x)`, or null. */\nfunction typeGuardSubject(\n test: TSESTree.Expression,\n): TSESTree.Expression | null {\n const arg = test.type === \"CallExpression\" ? test.arguments[0] : undefined;\n if (\n test.type === \"CallExpression\" &&\n test.callee.type === \"Identifier\" &&\n TYPE_GUARD_PATTERN.test(test.callee.name) &&\n test.arguments.length === 1 &&\n arg !== undefined &&\n arg.type !== \"SpreadElement\"\n ) {\n return arg;\n }\n return null;\n}\n\n/**\n * The subject `x` of a positive error-narrowing test — `x instanceof Error` or a\n * user-defined guard `isErrorLike(x)`. In both, the value IS the error in the\n * truthy branch, so `JSON.stringify(x)` belongs in the falsy (alternate) branch.\n */\nfunction positiveErrorSubject(\n test: TSESTree.Expression,\n): TSESTree.Expression | null {\n return instanceofErrorSubject(test) ?? typeGuardSubject(test);\n}\n\n/** The subject `x` of a negated error-narrowing test — `!(x instanceof Error)` / `!isErrorLike(x)`. */\nfunction negatedInstanceofErrorSubject(\n test: TSESTree.Expression,\n): TSESTree.Expression | null {\n if (test.type === \"UnaryExpression\" && test.operator === \"!\") {\n return positiveErrorSubject(test.argument);\n }\n return null;\n}\n\n/** Whether a branch statement unconditionally exits (its last statement returns/throws). */\nfunction branchTerminates(branch: TSESTree.Statement): boolean {\n const body = branch.type === \"BlockStatement\" ? branch.body : [branch];\n const last = body[body.length - 1];\n return (\n last !== undefined &&\n (last.type === \"ReturnStatement\" || last.type === \"ThrowStatement\")\n );\n}\n\n/**\n * True if an earlier guard `if (isErrorLike(arg)) return …` (or `instanceof Error`)\n * in an enclosing block narrows `argExpr` away from the error case before `node`,\n * so by the time `JSON.stringify(arg)` runs the value is the non-Error fallback.\n */\nfunction isNarrowedByEarlyReturn(\n node: TSESTree.Node,\n argExpr: TSESTree.Expression,\n sourceCode: Readonly<SourceCode>,\n): boolean {\n const argText = sourceCode.getText(argExpr);\n let current: TSESTree.Node | undefined = node.parent;\n while (current) {\n if (current.type === \"BlockStatement\" || current.type === \"Program\") {\n for (const stmt of current.body) {\n if (stmt.range[0] >= node.range[0]) {\n break;\n }\n if (\n stmt.type === \"IfStatement\" &&\n stmt.alternate === null &&\n branchTerminates(stmt.consequent)\n ) {\n const subject = positiveErrorSubject(stmt.test);\n if (subject && sourceCode.getText(subject) === argText) {\n return true;\n }\n }\n }\n }\n current = current.parent;\n }\n return false;\n}\n\nfunction nodeWithin(node: TSESTree.Node, container: TSESTree.Node | null): boolean {\n return (\n container !== null &&\n node.range[0] >= container.range[0] &&\n node.range[1] <= container.range[1]\n );\n}\n\n/**\n * True if `node` sits in the NON-error branch of an `argExpr instanceof Error`\n * guard — the branch where `argExpr` is provably not an Error, so stringifying it\n * is the correct fallback. Handles both the ternary and `if`/`else` shapes,\n * including the negated `!(x instanceof Error)` form.\n */\nfunction isGuardedByInstanceofError(\n node: TSESTree.Node,\n argExpr: TSESTree.Expression,\n sourceCode: Readonly<SourceCode>,\n): boolean {\n const argText = sourceCode.getText(argExpr);\n const sameSubject = (subject: TSESTree.Expression): boolean =>\n sourceCode.getText(subject) === argText;\n\n let current: TSESTree.Node | undefined = node.parent;\n while (current) {\n if (current.type === \"ConditionalExpression\") {\n const subject = positiveErrorSubject(current.test);\n if (subject && sameSubject(subject) && nodeWithin(node, current.alternate)) {\n return true;\n }\n const negated = negatedInstanceofErrorSubject(current.test);\n if (negated && sameSubject(negated) && nodeWithin(node, current.consequent)) {\n return true;\n }\n } else if (current.type === \"IfStatement\") {\n const subject = positiveErrorSubject(current.test);\n if (subject && sameSubject(subject) && nodeWithin(node, current.alternate)) {\n return true;\n }\n const negated = negatedInstanceofErrorSubject(current.test);\n if (negated && sameSubject(negated) && nodeWithin(node, current.consequent)) {\n return true;\n }\n }\n current = current.parent;\n }\n return false;\n}\n\nfunction isJsonStringify(callee: TSESTree.Expression): boolean {\n return (\n callee.type === \"MemberExpression\" &&\n !callee.computed &&\n callee.object.type === \"Identifier\" &&\n callee.object.name === \"JSON\" &&\n callee.property.type === \"Identifier\" &&\n callee.property.name === \"stringify\"\n );\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-json-stringify-error\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow `JSON.stringify` on an Error value; it yields `{}` because `message`/`stack` are non-enumerable.\",\n },\n schema: [],\n messages: {\n noJsonStringifyError:\n \"`JSON.stringify` on an Error yields `{}` because `message`/`stack` are non-enumerable. Log `err.message` / `err.stack`, or use a proper error serializer.\",\n },\n },\n defaultOptions: [],\n create(context) {\n return {\n CallExpression(node: TSESTree.CallExpression): void {\n if (!isJsonStringify(node.callee)) {\n return;\n }\n\n const firstArg = node.arguments[0];\n if (!firstArg) {\n return;\n }\n\n const scope = context.sourceCode.getScope(firstArg);\n\n let suggestsError: boolean;\n if (firstArg.type === \"Identifier\") {\n suggestsError =\n ERROR_NAME_PATTERN.test(firstArg.name) || isCatchBinding(scope, firstArg.name);\n } else if (firstArg.type === \"MemberExpression\") {\n suggestsError = memberSuggestsError(firstArg, scope);\n } else {\n return;\n }\n\n if (!suggestsError) {\n return;\n }\n\n if (\n isGuardedByInstanceofError(node, firstArg, context.sourceCode) ||\n isNarrowedByEarlyReturn(node, firstArg, context.sourceCode)\n ) {\n return;\n }\n\n context.report({\n node,\n messageId: \"noJsonStringifyError\",\n });\n },\n };\n },\n});\n","/**\n * @fileoverview no-log-only-catch — a catch that only logs keeps the program running broken, with a log line as the only signal.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-log-only-catch.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-log-only-catch.md\n */\n\nimport { AST_NODE_TYPES, ASTUtils, type TSESLint, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport {\n createLogMatcher,\n LOGGING_OPTION_PROPERTIES,\n type LoggingOptions,\n} from \"./_logging.js\";\nimport { createRule } from \"./_docs.js\";\nimport { isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"noLogOnlyCatch\" | \"emptyCatch\";\ntype Options = readonly [LoggingOptions?];\n\n// A micro-benchmark harness swallows the throw it is timing; `_paths` owns the\n// test-file question but does not yet know this segment, so it is local.\nconst BENCHMARK_DIR_RE = /(?:^|[\\\\/])benchmarks?[\\\\/]/;\n\n// Loop and branch bodies a lone try can be the whole content of. Reaching one\n// level up through these is what finds the rationale comment that real code\n// writes above the guard rather than inside the catch.\nconst SINGLE_STATEMENT_HOSTS: ReadonlySet<string> = new Set([\n AST_NODE_TYPES.DoWhileStatement,\n AST_NODE_TYPES.ForInStatement,\n AST_NODE_TYPES.ForOfStatement,\n AST_NODE_TYPES.ForStatement,\n AST_NODE_TYPES.IfStatement,\n AST_NODE_TYPES.WhileStatement,\n]);\n\nconst FUNCTION_TYPES: ReadonlySet<string> = new Set([\n AST_NODE_TYPES.ArrowFunctionExpression,\n AST_NODE_TYPES.FunctionDeclaration,\n AST_NODE_TYPES.FunctionExpression,\n]);\n\n/** The statement list a node sits directly in, plus its index in that list. */\nfunction statementSlot(\n node: TSESTree.Node,\n): { readonly list: readonly TSESTree.Node[]; readonly index: number } | null {\n const parent = node.parent;\n if (parent === undefined) return null;\n let list: readonly TSESTree.Node[];\n switch (parent.type) {\n case AST_NODE_TYPES.BlockStatement:\n case AST_NODE_TYPES.Program:\n case AST_NODE_TYPES.StaticBlock:\n list = parent.body;\n break;\n case AST_NODE_TYPES.SwitchCase:\n list = parent.consequent;\n break;\n default:\n return null;\n }\n const index = list.indexOf(node);\n return index === -1 ? null : { list, index };\n}\n\nfunction hasFollowingStatement(node: TSESTree.Node): boolean {\n for (\n let current: TSESTree.Node | undefined = node;\n current !== undefined && !FUNCTION_TYPES.has(current.type);\n current = current.parent\n ) {\n const slot = statementSlot(current);\n if (slot !== null && slot.index < slot.list.length - 1) return true;\n }\n return false;\n}\n\n/**\n * Class 1 — the try ends in a `return` and something follows the try, so the\n * catch's only job is to let control fall through to that fallback.\n */\nfunction fallbackFollowsTry(tryStatement: TSESTree.TryStatement): boolean {\n const body = tryStatement.block.body;\n const last = body.at(-1);\n return last?.type === AST_NODE_TYPES.ReturnStatement && hasFollowingStatement(tryStatement);\n}\n\n/** An explicit fallback seed: a literal, `undefined`, or an empty array/object. */\nfunction isSeedValue(node: TSESTree.Expression): boolean {\n const inner = node.type === AST_NODE_TYPES.TSAsExpression ? node.expression : node;\n switch (inner.type) {\n case AST_NODE_TYPES.Literal:\n return true;\n case AST_NODE_TYPES.Identifier:\n return inner.name === \"undefined\";\n case AST_NODE_TYPES.UnaryExpression:\n return inner.argument.type === AST_NODE_TYPES.Literal;\n case AST_NODE_TYPES.ArrayExpression:\n return inner.elements.length === 0;\n case AST_NODE_TYPES.ObjectExpression:\n return inner.properties.length === 0;\n default:\n return false;\n }\n}\n\n/**\n * Class 2 — `let x = <seed>;` immediately above the try, written inside it, read\n * after it. The seed IS the recovery value, so an empty catch is the whole\n * handler and there is nothing left for a comment to add.\n */\nfunction seededFallbackHandled(\n tryStatement: TSESTree.TryStatement,\n scope: TSESLint.Scope.Scope,\n): boolean {\n const slot = statementSlot(tryStatement);\n if (slot === null || slot.index === 0) return false;\n const previous = slot.list[slot.index - 1];\n if (previous?.type !== AST_NODE_TYPES.VariableDeclaration || previous.kind === \"const\") {\n return false;\n }\n const declarator = previous.declarations[0];\n if (previous.declarations.length !== 1 || declarator === undefined) return false;\n if (declarator.id.type !== AST_NODE_TYPES.Identifier) return false;\n if (declarator.init == null || !isSeedValue(declarator.init)) return false;\n\n const variable = ASTUtils.findVariable(scope, declarator.id.name);\n if (variable === null) return false;\n const [tryStart, tryEnd] = tryStatement.block.range;\n let writtenInTry = false;\n let readAfter = false;\n for (const reference of variable.references) {\n const [start] = reference.identifier.range;\n if (reference.isWrite() && start >= tryStart && start < tryEnd) writtenInTry = true;\n if (reference.isRead() && start >= tryStatement.range[1]) readAfter = true;\n }\n return writtenInTry && readAfter;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-log-only-catch\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow `catch` clauses that only log (or silently do nothing) and then swallow the error; rethrow or handle it instead.\",\n },\n schema: [\n {\n type: \"object\",\n additionalProperties: false,\n properties: { ...LOGGING_OPTION_PROPERTIES },\n },\n ],\n messages: {\n noLogOnlyCatch:\n \"Logging then swallowing the error hides failures. Rethrow the error or handle it for real.\",\n emptyCatch:\n \"Empty catch silently swallows the error. Rethrow it, handle it, or add a comment explaining why it is safe to ignore.\",\n },\n },\n defaultOptions: [{}],\n create(context, [loggingOptions]) {\n const matcher = createLogMatcher(loggingOptions);\n const filename = context.filename;\n const sourceCode = context.sourceCode;\n\n /** True when a statement is exactly a bare logging call, e.g. `console.error(err);`. */\n function isLoggingCallStatement(statement: TSESTree.Statement): boolean {\n if (statement.type !== \"ExpressionStatement\") {\n return false;\n }\n return matcher.isLoggingCall(statement.expression);\n }\n\n /** True when a `//`/`/* *\\/` run ends on the line directly above `node`. */\n function hasCommentDirectlyAbove(node: TSESTree.Node): boolean {\n const above = sourceCode.getCommentsBefore(node).at(-1);\n return above !== undefined && above.loc.end.line === node.loc.start.line - 1;\n }\n\n /**\n * Class 3 — a rationale written next to the braces instead of inside them.\n */\n function hasAdjacentRationale(node: TSESTree.CatchClause): boolean {\n const tryStatement = node.parent;\n if (hasCommentDirectlyAbove(tryStatement) || hasCommentDirectlyAbove(node)) return true;\n const block = tryStatement.parent;\n if (\n block?.type !== AST_NODE_TYPES.BlockStatement ||\n block.body.length !== 1 ||\n block.parent === undefined ||\n !SINGLE_STATEMENT_HOSTS.has(block.parent.type)\n ) {\n return false;\n }\n return hasCommentDirectlyAbove(block.parent);\n }\n\n if (isTestFile(filename) || BENCHMARK_DIR_RE.test(filename.replaceAll(\"\\\\\", \"/\"))) {\n return {};\n }\n\n return {\n CatchClause(node: TSESTree.CatchClause): void {\n const statements = node.body.body;\n\n // A comment inside the block documents an intentional ignore — for a\n // silent swallow and for a log-and-continue alike.\n const isDocumented =\n sourceCode.getCommentsInside(node.body).length > 0 || hasAdjacentRationale(node);\n\n if (statements.length === 0) {\n if (isDocumented) {\n return;\n }\n // The recovery can live outside the catch, where no comment can\n // describe it better than the code already does.\n if (\n fallbackFollowsTry(node.parent) ||\n seededFallbackHandled(node.parent, sourceCode.getScope(node))\n ) {\n return;\n }\n context.report({ node, messageId: \"emptyCatch\" });\n return;\n }\n\n if (isDocumented) {\n return;\n }\n\n const everyStatementIsLogging = statements.every((statement) =>\n isLoggingCallStatement(statement),\n );\n\n if (everyStatementIsLogging) {\n context.report({ node, messageId: \"noLogOnlyCatch\" });\n }\n },\n };\n },\n});\n","/**\n * @fileoverview _logging — shared recognition of logging / error-reporting calls, so the catch rules and the secret rule cannot disagree.\n *\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/_logging.md\n */\n\nimport { type TSESTree } from \"@typescript-eslint/utils\";\n\nexport const LOG_METHODS: ReadonlySet<string> = new Set([\n \"debug\",\n \"info\",\n \"warn\",\n \"warning\",\n \"error\",\n \"exception\",\n \"critical\",\n \"trace\",\n \"log\",\n \"fatal\",\n \"success\",\n]);\n\nexport const LOGGER_NAMES: ReadonlySet<string> = new Set([\n \"logger\",\n \"log\",\n \"logging\",\n \"loguru\",\n \"console\",\n \"_logger\",\n \"_log\",\n]);\n\n/** Factory methods that RETURN a logger (`logging.getLogger(name).info(...)`). */\nexport const LOGGER_FACTORIES: ReadonlySet<string> = new Set([\n \"getlogger\",\n \"get_logger\",\n]);\n\n/**\n * Names of free functions / methods that report an error to a handler or sink,\n * e.g. `onUnexpectedError`, `reportError`, `captureException`, `logError`. Kept\n * broad on purpose: pairing this with \"takes the caught binding\" is what makes\n * it precise.\n */\nexport const REPORT_NAME_RE = /error|report|capture|log|trace|warn/i;\n\n/** Shared `loggerNames` / `logFunctions` option shape. */\nexport interface LoggingOptions {\n readonly loggerNames?: readonly string[];\n readonly logFunctions?: readonly string[];\n}\n\n/**\n * JSON-schema properties for the shared logging options. Spread into a rule's\n * `schema[0].properties` so every rule that consults `_logging` accepts the same\n * declaration and a project configures its logger exactly once.\n */\nexport const LOGGING_OPTION_PROPERTIES = {\n loggerNames: { type: \"array\", items: { type: \"string\" } },\n logFunctions: { type: \"array\", items: { type: \"string\" } },\n} as const;\n\n/** The static callee name of a call (free function or method), or null. */\nexport function calleeName(callee: TSESTree.Node): string | null {\n if (callee.type === \"Identifier\") {\n return callee.name;\n }\n if (\n callee.type === \"MemberExpression\" &&\n !callee.computed &&\n callee.property.type === \"Identifier\"\n ) {\n return callee.property.name;\n }\n return null;\n}\n\nexport interface LogMatcher {\n /** Is `expr` a logger receiver (bare name, member chain, or factory call)? */\n isLoggerReceiver(expr: TSESTree.Expression | TSESTree.PrivateIdentifier): boolean;\n /** Is `expr` a project-declared free logging function call (`logEvent(...)`)? */\n isLogFunctionCall(expr: TSESTree.Node): boolean;\n /** Is `expr` a logging call of either shape? */\n isLoggingCall(expr: TSESTree.Node): boolean;\n}\n\n/**\n * Builds the log-recognition predicates for one rule invocation, folding in the\n * project's declared `loggerNames` / `logFunctions`. Call once per `create()`.\n */\nexport function createLogMatcher(options: LoggingOptions = {}): LogMatcher {\n const loggerNames: ReadonlySet<string> = new Set([\n ...LOGGER_NAMES,\n ...(options.loggerNames ?? []).map((name) => name.toLowerCase()),\n ]);\n const logFunctions: ReadonlySet<string> = new Set(options.logFunctions ?? []);\n\n function isLoggerReceiver(\n expr: TSESTree.Expression | TSESTree.PrivateIdentifier,\n ): boolean {\n switch (expr.type) {\n case \"Identifier\":\n return loggerNames.has(expr.name.toLowerCase());\n case \"MemberExpression\": {\n const { property, object } = expr;\n if (!expr.computed && property.type === \"Identifier\") {\n const lowered = property.name.toLowerCase();\n if (loggerNames.has(lowered) || LOGGER_FACTORIES.has(lowered)) {\n return true;\n }\n }\n return isLoggerReceiver(object);\n }\n case \"CallExpression\": {\n const callee = expr.callee;\n if (\n callee.type === \"MemberExpression\" &&\n !callee.computed &&\n callee.property.type === \"Identifier\" &&\n LOGGER_FACTORIES.has(callee.property.name.toLowerCase())\n ) {\n return true;\n }\n if (callee.type !== \"Super\") {\n return isLoggerReceiver(callee);\n }\n return false;\n }\n default:\n return false;\n }\n }\n\n function isLogFunctionCall(expr: TSESTree.Node): boolean {\n if (expr.type !== \"CallExpression\" || logFunctions.size === 0) {\n return false;\n }\n const name = calleeName(expr.callee);\n return name !== null && logFunctions.has(name);\n }\n\n function isLoggingCall(expr: TSESTree.Node): boolean {\n if (expr.type !== \"CallExpression\") {\n return false;\n }\n if (isLogFunctionCall(expr)) {\n return true;\n }\n const callee = expr.callee;\n if (\n callee.type !== \"MemberExpression\" ||\n callee.computed ||\n callee.property.type !== \"Identifier\"\n ) {\n return false;\n }\n if (!LOG_METHODS.has(callee.property.name.toLowerCase())) {\n return false;\n }\n return isLoggerReceiver(callee.object);\n }\n\n return { isLoggerReceiver, isLogFunctionCall, isLoggingCall };\n}\n","/**\n * @fileoverview no-offset-pagination — `OFFSET m` scans and discards m rows per page and shifts under concurrent writes, so rows repeat or vanish.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-offset-pagination.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-offset-pagination.md\n */\n\nimport { type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isTestFile } from \"./_paths.js\";\nimport { createSqlListener } from \"./_sql.js\";\n\ntype MessageIds = \"noOffsetPagination\";\ntype Options = readonly [];\n\n/**\n * `OFFSET` followed by a value or param token — the real pagination construct.\n * The parameter alternatives are the UNION of every marker the three packages\n * see, and are kept identical in SARJ025 and SARJ107.\n */\nconst OFFSET_PAGINATION = /\\bOFFSET\\s+(?:%s|%\\(\\w+\\)s|\\?\\d*|:\\w+|@\\w+|\\$\\d+|\\d+)/i;\n\n/** Cheap substring gate; noise-stripping can only ever remove keywords, never add them. */\nconst OFFSET_GATE = /offset/i;\n\nexport default createRule<Options, MessageIds>({\n name: \"no-offset-pagination\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow OFFSET pagination in embedded SQL; it is O(N) per page and drops or repeats rows under concurrent writes. Use a keyset cursor.\",\n },\n schema: [],\n messages: {\n noOffsetPagination:\n \"OFFSET pagination scans and discards every skipped row (O(N) per page) and shifts under concurrent inserts, so rows get repeated or missed. Use a keyset cursor: `WHERE id > ? ORDER BY id LIMIT ?`.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (isTestFile(context.filename) || !OFFSET_GATE.test(context.sourceCode.text)) {\n return {};\n }\n return createSqlListener((sql: string, node: TSESTree.Node): void => {\n if (!OFFSET_PAGINATION.test(sql)) {\n return;\n }\n context.report({ node, messageId: \"noOffsetPagination\" });\n });\n },\n});\n","/**\n * @fileoverview no-positional-tuple-return — a positional tuple crossing a module boundary names its fields only at the call site, so call sites disagree.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-positional-tuple-return.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-positional-tuple-return.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\n\ntype MessageIds = \"noPositionalTupleReturn\";\ntype Options = readonly [];\n\nconst MIN_ELEMENTS = 2;\n\n/** The pair length an accessor/mutator tuple has. */\nconst ACCESSOR_PAIR_LENGTH = 2;\n\n/** Type wrappers whose single type argument is the value actually returned. */\nconst AWAITABLE_TYPES: ReadonlySet<string> = new Set([\"Promise\", \"PromiseLike\", \"Awaited\"]);\n\n/** The tuple type a return annotation resolves to, unwrapping `Promise<...>`. */\nfunction tupleReturnType(node: TSESTree.TypeNode): TSESTree.TSTupleType | null {\n if (node.type === AST_NODE_TYPES.TSTupleType) {\n return node;\n }\n if (\n node.type === AST_NODE_TYPES.TSTypeReference &&\n node.typeName.type === AST_NODE_TYPES.Identifier &&\n AWAITABLE_TYPES.has(node.typeName.name)\n ) {\n const argument = node.typeArguments?.params[0];\n return argument === undefined ? null : tupleReturnType(argument);\n }\n return null;\n}\n\n/** Source text with all whitespace runs collapsed, for structural comparison. */\nfunction normalizedText(sourceCode: { getText: (node: TSESTree.Node) => string }, node: TSESTree.Node): string {\n return sourceCode.getText(node).replaceAll(/\\s+/g, \" \").trim();\n}\n\n/**\n * True when the tuple is one of the permitted shapes: variadic, labeled, tagged\n * by a leading literal type, or structurally homogeneous.\n */\nfunction isPermittedTuple(\n tuple: TSESTree.TSTupleType,\n sourceCode: { getText: (node: TSESTree.Node) => string },\n): boolean {\n const elements = tuple.elementTypes;\n if (elements.length < MIN_ELEMENTS) {\n return true;\n }\n if (elements.some((element) => element.type === AST_NODE_TYPES.TSRestType)) {\n return true;\n }\n if (elements.some((element) => element.type === AST_NODE_TYPES.TSNamedTupleMember)) {\n return true;\n }\n if (elements[0]?.type === AST_NODE_TYPES.TSLiteralType) {\n return true;\n }\n if (\n elements.length === ACCESSOR_PAIR_LENGTH &&\n elements.some((element) => element.type === AST_NODE_TYPES.TSFunctionType)\n ) {\n return true;\n }\n const texts = new Set(elements.map((element) => normalizedText(sourceCode, element)));\n return texts.size === 1;\n}\n\n/** The declared name of a function-ish node, or null for an anonymous one. */\nfunction functionName(node: TSESTree.Node): string | null {\n if (node.type === AST_NODE_TYPES.FunctionDeclaration) {\n return node.id?.name ?? null;\n }\n const parent = node.parent;\n if (parent?.type === AST_NODE_TYPES.VariableDeclarator && parent.id.type === AST_NODE_TYPES.Identifier) {\n return parent.id.name;\n }\n if (\n (parent?.type === AST_NODE_TYPES.MethodDefinition ||\n parent?.type === AST_NODE_TYPES.PropertyDefinition ||\n parent?.type === AST_NODE_TYPES.Property) &&\n parent.key.type === AST_NODE_TYPES.Identifier\n ) {\n return parent.key.name;\n }\n return null;\n}\n\n/**\n * True when an ancestor statement carries the `export` keyword inline —\n * `export function f`, `export const f =`, `export default function f`.\n */\nfunction isInlineExported(node: TSESTree.Node): boolean {\n for (let current: TSESTree.Node | undefined | null = node; current != null; current = current.parent) {\n const parent = current.parent;\n if (\n parent?.type === AST_NODE_TYPES.ExportNamedDeclaration ||\n parent?.type === AST_NODE_TYPES.ExportDefaultDeclaration\n ) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * The module-scope binding the function lives under — `split` for a top-level\n * `function split`, `Repo` for a method of a top-level `class Repo`. That is the\n * name an `export { … }` specifier elsewhere in the file would refer to. Null\n * when the function is not anchored to a named top-level declaration.\n */\nfunction moduleScopeBindingName(node: TSESTree.Node): string | null {\n let current: TSESTree.Node = node;\n let child: TSESTree.Node = node;\n while (current.parent != null && current.parent.type !== AST_NODE_TYPES.Program) {\n child = current;\n current = current.parent;\n }\n if (current.parent?.type !== AST_NODE_TYPES.Program) {\n return null;\n }\n if (\n current.type === AST_NODE_TYPES.FunctionDeclaration ||\n current.type === AST_NODE_TYPES.ClassDeclaration\n ) {\n return current.id?.name ?? null;\n }\n if (current.type === AST_NODE_TYPES.VariableDeclaration) {\n if (child.type !== AST_NODE_TYPES.VariableDeclarator || child.id.type !== AST_NODE_TYPES.Identifier) {\n return null;\n }\n return child.id.name;\n }\n return null;\n}\n\n/**\n * Local names this module puts on its public surface through a *detached* export\n * statement: `export { split }`, `export { split as s }`, `export default split`,\n * `export = split`. A re-export (`export { x } from \"./other\"`) names a binding\n * owned by another module, and a type-only export (`export type { x }`) does not\n * expose the value, so neither counts.\n */\nfunction specifierExportedNames(program: TSESTree.Program): ReadonlySet<string> {\n const names = new Set<string>();\n for (const statement of program.body) {\n if (\n statement.type === AST_NODE_TYPES.ExportNamedDeclaration &&\n statement.declaration == null &&\n statement.source == null &&\n statement.exportKind !== \"type\"\n ) {\n for (const specifier of statement.specifiers) {\n if (specifier.exportKind !== \"type\" && specifier.local.type === AST_NODE_TYPES.Identifier) {\n names.add(specifier.local.name);\n }\n }\n continue;\n }\n if (\n statement.type === AST_NODE_TYPES.ExportDefaultDeclaration &&\n statement.declaration.type === AST_NODE_TYPES.Identifier\n ) {\n names.add(statement.declaration.name);\n continue;\n }\n if (\n statement.type === AST_NODE_TYPES.TSExportAssignment &&\n statement.expression.type === AST_NODE_TYPES.Identifier\n ) {\n names.add(statement.expression.name);\n }\n }\n return names;\n}\n\n/**\n * True when the function is reachable from outside the module — the boundary the\n * rule is about. Either the declaration is exported inline, or its module-scope\n * binding is exported later through an export specifier.\n */\nfunction isExported(node: TSESTree.Node, specifierExports: ReadonlySet<string>): boolean {\n if (isInlineExported(node)) {\n return true;\n }\n if (specifierExports.size === 0) {\n return false;\n }\n const binding = moduleScopeBindingName(node);\n return binding !== null && specifierExports.has(binding);\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-positional-tuple-return\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Disallow returning a positional tuple of distinct fields from an exported function; return a named object so call sites cannot mismatch slots.\",\n },\n schema: [],\n messages: {\n noPositionalTupleReturn:\n \"Exported `{{name}}` returns a positional {{count}}-tuple, so every call site re-invents the field names and can disagree. Return a named object (or label the tuple members) instead.\",\n },\n },\n defaultOptions: [],\n create(context) {\n const specifierExports = specifierExportedNames(context.sourceCode.ast);\n const check = (\n node:\n | TSESTree.FunctionDeclaration\n | TSESTree.FunctionExpression\n | TSESTree.ArrowFunctionExpression,\n ): void => {\n const annotation = node.returnType?.typeAnnotation;\n if (annotation === undefined) {\n return;\n }\n const tuple = tupleReturnType(annotation);\n if (tuple === null || isPermittedTuple(tuple, context.sourceCode)) {\n return;\n }\n const name = functionName(node);\n if (name === null || name.startsWith(\"_\") || /^use[A-Z]/.test(name)) {\n return;\n }\n if (!isExported(node, specifierExports)) {\n return;\n }\n context.report({\n node: tuple,\n messageId: \"noPositionalTupleReturn\",\n data: { name, count: String(tuple.elementTypes.length) },\n });\n };\n return {\n FunctionDeclaration: check,\n FunctionExpression: check,\n ArrowFunctionExpression: check,\n };\n },\n});\n","/**\n * @fileoverview no-raw-env — a raw `process.env` read is untyped and unvalidated, so a missing variable surfaces as `undefined` in business logic.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-raw-env.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-raw-env.md\n */\n\nimport { type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isScriptFile, isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"noRawEnv\";\ntype Options = readonly [];\n\n/** Build / test / tooling config: `vite.config.ts`, `vitest.config.mts`, `playwright.config.ts`. */\nconst CONFIG_FILE_RE = /(^|[\\\\/])[\\w.-]+\\.config\\.[cm]?[jt]sx?$/;\n\n/**\n * Modules that define the validated env boundary have to read raw env exactly\n * once before handing values to Zod. Keep this path-scoped so ordinary\n * `config.ts`/settings helpers still use the boundary instead of becoming one.\n */\nconst ENV_BOUNDARY_FILE_RE =\n /(^|[\\\\/])(?:env|client-env|server-env|client-settings|server-settings)\\.[cm]?[jt]sx?$/;\n\nconst ENV_VALIDATION_MARKER_RE =\n /\\bcreateEnv\\s*\\(|\\bz\\.object\\s*\\(|\\.(?:safeParse|parse)\\s*\\(/;\n\nfunction isValidatedEnvBoundary(filename: string, sourceText: string): boolean {\n return (\n ENV_BOUNDARY_FILE_RE.test(filename.replaceAll(\"\\\\\", \"/\")) &&\n ENV_VALIDATION_MARKER_RE.test(sourceText)\n );\n}\n\n/** True for the `process.env` member node (dotted or as the base of `process.env[key]`). */\nfunction isProcessEnv(node: TSESTree.MemberExpression): boolean {\n return (\n !node.computed &&\n node.object.type === \"Identifier\" &&\n node.object.name === \"process\" &&\n node.property.type === \"Identifier\" &&\n node.property.name === \"env\"\n );\n}\n\n/** True for the `import.meta.env` member node (dotted or as the base of `import.meta.env[key]`). */\nfunction isImportMetaEnv(node: TSESTree.MemberExpression): boolean {\n return (\n !node.computed &&\n node.property.type === \"Identifier\" &&\n node.property.name === \"env\" &&\n node.object.type === \"MetaProperty\" &&\n node.object.meta.name === \"import\" &&\n node.object.property.name === \"meta\"\n );\n}\n\n// Build-time constants that bundlers (webpack/Vite) statically replace — there is\n// no runtime env value to route through the validated layer, so they are exempt.\nconst BUILD_TIME_CONSTANTS: ReadonlySet<string> = new Set([\n \"NODE_ENV\",\n \"MODE\",\n \"DEV\",\n \"PROD\",\n \"SSR\",\n]);\n\nconst PLATFORM_MARKERS: ReadonlySet<string> = new Set([\n \"NEXT_RUNTIME\",\n \"VERCEL\",\n \"VERCEL_ENV\",\n \"CI\",\n]);\n\n/**\n * True when `node` is the base of an exempt named access like\n * `process.env.NODE_ENV` or `process.env.VERCEL` — a bundler-replaced constant\n * or a platform-injected marker.\n */\nfunction isExemptVariableAccess(node: TSESTree.MemberExpression): boolean {\n const parent = node.parent;\n return (\n parent.type === \"MemberExpression\" &&\n parent.object === node &&\n !parent.computed &&\n parent.property.type === \"Identifier\" &&\n (BUILD_TIME_CONSTANTS.has(parent.property.name) ||\n PLATFORM_MARKERS.has(parent.property.name))\n );\n}\n\n/**\n * True when the env access is the TARGET of an assignment (`process.env.X = v`,\n * `process.env.X ??= v`, `delete process.env.X`) rather than a read. Writing a\n * variable for a child process reads no configuration value.\n */\nfunction isWriteTarget(node: TSESTree.MemberExpression): boolean {\n const access = node.parent.type === \"MemberExpression\" && node.parent.object === node ? node.parent : node;\n const parent = access.parent;\n if (parent.type === \"AssignmentExpression\") {\n return parent.left === access;\n }\n if (parent.type === \"UnaryExpression\") {\n return parent.operator === \"delete\";\n }\n return false;\n}\n\n/**\n * True when the WHOLE environment is spread into an object literal —\n * `{ ...process.env, NO_COLOR: \"1\" }`. That forwards the inherited environment\n * to a spawned process; it is not a read of any particular setting.\n */\nfunction isWholeEnvSpread(node: TSESTree.MemberExpression): boolean {\n const parent = node.parent;\n return parent.type === \"SpreadElement\" && parent.argument === node;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-raw-env\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow direct `process.env` access; use a Zod-validated env module instead.\",\n },\n schema: [],\n messages: {\n noRawEnv:\n \"Do not read from `process.env` directly. Import the Zod-validated env module instead so values are typed and validated at startup.\",\n },\n },\n defaultOptions: [],\n create(context) {\n const filename = context.filename;\n if (\n isTestFile(filename) ||\n isScriptFile(filename) ||\n CONFIG_FILE_RE.test(filename.replaceAll(\"\\\\\", \"/\")) ||\n isValidatedEnvBoundary(filename, context.sourceCode.text)\n ) {\n return {};\n }\n return {\n MemberExpression(node: TSESTree.MemberExpression): void {\n if (\n (isProcessEnv(node) || isImportMetaEnv(node)) &&\n !isExemptVariableAccess(node) &&\n !isWriteTarget(node) &&\n !isWholeEnvSpread(node)\n ) {\n context.report({\n node,\n messageId: \"noRawEnv\",\n });\n }\n },\n };\n },\n});\n","/**\n * @fileoverview no-raw-fetch-outside-clients — a bare `fetch` outside the client layer opts out of retry, timeout and status handling, and cannot be stubbed.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-raw-fetch-outside-clients.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-raw-fetch-outside-clients.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"rawFetch\";\n\nexport interface RuleOptions {\n /** Regular-expression sources matched against the filename. */\n readonly allow?: readonly string[];\n}\n\ntype Options = readonly [RuleOptions?];\n\n/**\n * Path shapes that legitimately own outbound HTTP. Written as regex sources\n * (not globs) so they can express both path separators.\n *\n * Test files are NOT in this list — they are handled unconditionally by\n * `isTestFile`, so overriding `allow` cannot accidentally un-exempt them.\n */\nconst DEFAULT_ALLOW: readonly string[] = [\n \"[\\\\\\\\/]clients?[\\\\\\\\/]\",\n \"-client\\\\.[cm]?[jt]sx?$\",\n \"[\\\\\\\\/]http-client\\\\.[cm]?[jt]sx?$\",\n // The `api` spelling of the same client-layer convention: an `api/` directory,\n // a bare `api.ts`, or a `*-api.ts` / `*.api.ts` module.\n \"[\\\\\\\\/]api[\\\\\\\\/]\",\n \"[\\\\\\\\/]api\\\\.[cm]?[jt]sx?$\",\n \"[-.]api\\\\.[cm]?[jt]sx?$\",\n \"[\\\\\\\\/]services?[\\\\\\\\/]\",\n \"[\\\\\\\\/](connectors|providers|integrations|adapters|fetchers)[\\\\\\\\/]\",\n \"[\\\\\\\\/]notifications[\\\\\\\\/]\",\n \"[Ss]ervice\\\\.[cm]?[jt]sx?$\",\n \"-(service|connector|adapter|sdk|fetcher)\\\\.[cm]?[jt]sx?$\",\n];\n\n/**\n * Non-production trees the shared `isTestFile` predicate does not spell:\n * Playwright/Cypress suites and their helpers, and jscodeshift's input/output\n * fixtures (text a codemod transforms, not code that runs).\n */\nconst NON_PRODUCTION_TREE_RE =\n /[\\\\/](playwright|cypress|__testfixtures__)[\\\\/]/;\n\n/** Receivers on which `.fetch()` is the global, not some cache/query API. */\nconst GLOBAL_RECEIVERS: ReadonlySet<string> = new Set([\n \"globalThis\",\n \"window\",\n \"self\",\n]);\n\nconst PRESIGNED_URL_NAME_RE = /(?:pre-?signed|signed|upload|download)Url$/i;\n\n/** True when `node` is a call to the global `fetch`. */\nfunction isGlobalFetchCall(node: TSESTree.CallExpression): boolean {\n const callee = node.callee;\n\n if (callee.type === \"Identifier\") {\n return callee.name === \"fetch\";\n }\n\n if (\n callee.type === \"MemberExpression\" &&\n !callee.computed &&\n callee.property.type === \"Identifier\" &&\n callee.property.name === \"fetch\" &&\n callee.object.type === \"Identifier\"\n ) {\n return GLOBAL_RECEIVERS.has(callee.object.name);\n }\n\n return false;\n}\n\nfunction identifierLikeName(node: TSESTree.Node): string | null {\n if (node.type === \"Identifier\") {\n return node.name;\n }\n if (\n node.type === \"MemberExpression\" &&\n !node.computed &&\n node.property.type === \"Identifier\"\n ) {\n return node.property.name;\n }\n return null;\n}\n\n/** True for a lone `fetch(new URL(...))` / `fetch(new Request(...))`. */\nfunction isConstructedArgumentHandoff(node: TSESTree.CallExpression): boolean {\n const [first] = node.arguments;\n return (\n node.arguments.length === 1 &&\n first !== undefined &&\n first.type === AST_NODE_TYPES.NewExpression\n );\n}\n\nfunction isPresignedUrlTransfer(node: TSESTree.CallExpression): boolean {\n const first = node.arguments[0];\n if (first === undefined) {\n return false;\n }\n const name = identifierLikeName(first);\n return name !== null && PRESIGNED_URL_NAME_RE.test(name);\n}\n\n/**\n * Compile the configured patterns once per file. An invalid pattern is skipped\n * rather than thrown: a bad `allow` entry should not take the whole lint run\n * down, and the rule failing closed (still reporting) is the safe direction.\n */\nfunction compile(patterns: readonly string[]): RegExp[] {\n const compiled: RegExp[] = [];\n for (const pattern of patterns) {\n try {\n compiled.push(new RegExp(pattern));\n } catch {\n // Skip the malformed entry; the remaining patterns still apply.\n }\n }\n return compiled;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-raw-fetch-outside-clients\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow calling the global `fetch` outside the client layer; route outbound HTTP through a client module that owns retry, timeout and status handling.\",\n },\n schema: [\n {\n type: \"object\",\n properties: {\n allow: {\n type: \"array\",\n items: { type: \"string\" },\n description:\n \"Regular-expression sources matched against the filename. Replaces the defaults.\",\n },\n },\n additionalProperties: false,\n },\n ],\n messages: {\n rawFetch:\n \"Raw `fetch()` outside a client module. Route the call through a client (e.g. `clients/*-client.ts`) so it inherits retry, timeout and status handling and stays stubbable in tests.\",\n },\n },\n defaultOptions: [{}],\n create(context, [options]) {\n const filename = context.filename;\n\n if (isTestFile(filename) || NON_PRODUCTION_TREE_RE.test(filename)) {\n return {};\n }\n\n const patterns = options?.allow ?? DEFAULT_ALLOW;\n const allowed = compile(patterns);\n\n if (allowed.some((re) => re.test(filename))) {\n return {};\n }\n\n return {\n CallExpression(node: TSESTree.CallExpression): void {\n if (isPresignedUrlTransfer(node) || isConstructedArgumentHandoff(node)) {\n return;\n }\n if (isGlobalFetchCall(node)) {\n context.report({ node, messageId: \"rawFetch\" });\n }\n },\n };\n },\n});\n","/**\n * @fileoverview no-repeated-string-literal — the same structured literal in two functions drifts the moment one copy is edited.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-repeated-string-literal.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-repeated-string-literal.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"noRepeatedStringLiteral\";\ntype Options = readonly [];\n\nconst MIN_LENGTH = 40;\nconst MIN_DISTINCT_SCOPES = 2;\nconst PREVIEW_LENGTH = 40;\n\n/** Case-sensitive on purpose: uppercase keywords mean SQL, lowercase means prose. */\nconst SQL_KEYWORD_RE =\n /\\b(SELECT|INSERT|UPDATE|DELETE|FROM|WHERE|JOIN|VALUES|ON CONFLICT|RETURNING|GROUP BY|ORDER BY)\\b/;\nconst IDENTIFIER_RE = /^[a-z_][a-z0-9_.]*$/;\n\nconst FUNCTION_TYPES: ReadonlySet<AST_NODE_TYPES> = new Set([\n AST_NODE_TYPES.FunctionDeclaration,\n AST_NODE_TYPES.FunctionExpression,\n AST_NODE_TYPES.ArrowFunctionExpression,\n]);\n\n/** True when the literal carries structure that rules out coincidental equality. */\nfunction isStructured(value: string): boolean {\n return value.includes(\"\\n\") || SQL_KEYWORD_RE.test(value) || IDENTIFIER_RE.test(value);\n}\n\nfunction preview(value: string): string {\n const oneLine = value.replaceAll(\"\\n\", \" \").trim();\n return oneLine.length <= PREVIEW_LENGTH ? oneLine : `${oneLine.slice(0, PREVIEW_LENGTH)}...`;\n}\n\n/** The enclosing function node, or null when the literal sits at module/class scope. */\nfunction enclosingFunction(node: TSESTree.Node): TSESTree.Node | null {\n for (let current = node.parent; current != null; current = current.parent) {\n if (FUNCTION_TYPES.has(current.type)) {\n return current;\n }\n }\n return null;\n}\n\n/**\n * True when the literal is scaffolding rather than a reusable value: an\n * import/`require` source (repeating a module path is the point) or a JSX\n * attribute value (styling strings, handled by the styling rules).\n */\nfunction isScaffolding(node: TSESTree.Node): boolean {\n const parent = node.parent;\n if (parent === undefined) {\n return true;\n }\n return (\n parent.type === AST_NODE_TYPES.ImportDeclaration ||\n parent.type === AST_NODE_TYPES.ExportNamedDeclaration ||\n parent.type === AST_NODE_TYPES.ExportAllDeclaration ||\n parent.type === AST_NODE_TYPES.TSImportType ||\n parent.type === AST_NODE_TYPES.JSXAttribute ||\n parent.type === AST_NODE_TYPES.TSLiteralType\n );\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-repeated-string-literal\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Disallow a long structured string literal repeated across functions; the copies drift when one is edited. Extract a module-level constant.\",\n },\n schema: [],\n messages: {\n noRepeatedStringLiteral:\n 'Structured string literal \"{{preview}}\" is repeated across functions (first use on line {{line}}) — extract a module-level constant so the copies cannot drift.',\n },\n },\n defaultOptions: [],\n create(context) {\n if (isTestFile(context.filename)) {\n return {};\n }\n const occurrences = new Map<string, TSESTree.Node[]>();\n const scopes = new WeakMap<TSESTree.Node, TSESTree.Node | null>();\n\n const record = (value: string, node: TSESTree.Node): void => {\n if (value.length < MIN_LENGTH || !isStructured(value) || isScaffolding(node)) {\n return;\n }\n const existing = occurrences.get(value);\n if (existing === undefined) {\n occurrences.set(value, [node]);\n } else {\n existing.push(node);\n }\n scopes.set(node, enclosingFunction(node));\n };\n\n return {\n Literal(node: TSESTree.Literal): void {\n if (typeof node.value === \"string\") {\n record(node.value, node);\n }\n },\n TemplateLiteral(node: TSESTree.TemplateLiteral): void {\n // A tagged template (`js`…``, `css`…``, `sql`…``) is a call, not a\n // string value — the tag, not this rule, decides what the text means.\n if (node.parent.type === AST_NODE_TYPES.TaggedTemplateExpression) {\n return;\n }\n const [only] = node.quasis;\n if (node.expressions.length === 0 && only !== undefined) {\n record(only.value.cooked ?? only.value.raw, node);\n }\n },\n \"Program:exit\": (): void => {\n for (const [value, nodes] of occurrences) {\n const distinctScopes = new Set(\n nodes.map((node) => scopes.get(node)).filter((scope) => scope != null),\n );\n if (distinctScopes.size < MIN_DISTINCT_SCOPES) {\n continue;\n }\n const [first, ...repeats] = nodes;\n if (first === undefined) {\n continue;\n }\n for (const node of repeats) {\n context.report({\n node,\n messageId: \"noRepeatedStringLiteral\",\n data: { preview: preview(value), line: String(first.loc.start.line) },\n });\n }\n }\n },\n };\n },\n});\n","/**\n * @fileoverview no-restated-comment — a comment whose every content word is already on the line below can only go out of date silently.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-restated-comment.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-restated-comment.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport {\n codeTokens,\n contentTokens,\n isProtected,\n restatableStatementBelow,\n restates,\n restatesStatementHead,\n} from \"./_comments.js\";\nimport { createRule } from \"./_docs.js\";\nimport { isGeneratedFile } from \"./_paths.js\";\n\ntype MessageIds = \"restatesLineBelow\";\ntype Options = readonly [];\n\nconst MAX_WORDS = 8;\nconst MIN_CONTENT_TOKENS = 2;\n\nconst DIRECTIVE_RE =\n /^(eslint\\b|eslint-|sarj-noqa\\b|@ts-|prettier-ignore|prettier\\b|biome-|c8\\b|v8\\b|istanbul\\b|@type\\b|@vite|webpack|<reference|<amd|global\\b|noinspection|todo\\b|fixme\\b|hack\\b|xxx\\b)/i;\n\n// Commented-out code and section banners belong to `no-comment-cruft`.\nconst CODEY_RE = /^[\\w.$[\\]'\"]+\\s*[:=]\\s*\\S|^[\\w.$]+\\s*\\(|^(?:return|throw|await|import|export|const|let|var)\\b.*[=()[\\]{}]/;\nconst BANNERISH_RE = /[=\\-─-╿*#~_.]{3,}|^[A-Z0-9 _:-]+$/;\n\nconst MODALITY_RE = /\\b(?:can|could|should|shall|may|might|must|will|would|cannot)\\b/i;\nconst LEAD_IN_RE = /:$/;\nconst EMPHASIS_RE = /\\*\\w[^*]*\\*|`[^`]+`/;\nconst NEGATION_WORD_RE = /\\b(?:no|not|never|neither|nor|without|none|non)\\b/i;\n\nconst ACTION_STMT_RE = /[\\w.$\\])]\\s*\\(|^\\s*(?:return|throw|await|yield)\\b/;\n\nconst NON_ASCII_LETTER_RE = /[^\\p{ASCII}\\p{N}\\p{P}\\p{Z}]/u;\n\n/** True when `a` and `b` are `//` comments on consecutive lines. */\nfunction areAdjacentLineComments(\n a: TSESTree.Comment | undefined,\n b: TSESTree.Comment | undefined,\n): boolean {\n return (\n a !== undefined &&\n b !== undefined &&\n a.type === \"Line\" &&\n b.type === \"Line\" &&\n b.loc.start.line === a.loc.end.line + 1\n );\n}\n\n/**\n * True when the statement below the comment heads a run of siblings of the same\n * kind — `// register secrets` over eight `registerSecret(…)` calls. The label\n * provides the grouping, and deleting it loses that.\n */\nfunction headsSiblingRun(node: TSESTree.Node): boolean {\n const parent = node.parent;\n if (parent === undefined) return false;\n const body: readonly TSESTree.Node[] | undefined =\n \"body\" in parent && Array.isArray(parent.body)\n ? (parent.body as readonly TSESTree.Node[])\n : undefined;\n if (body === undefined) return false;\n const index = body.indexOf(node);\n const next = index >= 0 ? body[index + 1] : undefined;\n return next !== undefined && next.type === node.type;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-restated-comment\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Flag a single-line comment whose every word already appears on the statement below it.\",\n },\n schema: [],\n messages: {\n restatesLineBelow:\n \"Comment restates the statement below it — delete it, or replace it with the *why*; the code already carries the *what*.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (isGeneratedFile(context.filename, context.sourceCode.text)) {\n return {};\n }\n const sourceCode = context.sourceCode;\n const lines = sourceCode.lines;\n\n function isStandalone(comment: TSESTree.Comment): boolean {\n const before = sourceCode.getTokenBefore(comment, { includeComments: false });\n return !before || before.loc.end.line < comment.loc.start.line;\n }\n\n function labelsASiblingRun(comment: TSESTree.Comment): boolean {\n const token = sourceCode.getTokenAfter(comment, { includeComments: false });\n if (token === null) return false;\n for (\n let node: TSESTree.Node | undefined | null = sourceCode.getNodeByRangeIndex(token.range[0]);\n node != null && node.type !== AST_NODE_TYPES.Program;\n node = node.parent\n ) {\n if (headsSiblingRun(node)) return true;\n }\n return false;\n }\n\n return {\n Program(): void {\n const comments = sourceCode.getAllComments();\n for (let i = 0; i < comments.length; i++) {\n const comment = comments[i];\n if (comment === undefined || comment.type !== \"Line\") continue;\n if (!isStandalone(comment)) continue;\n if (\n areAdjacentLineComments(comments[i - 1], comment) ||\n areAdjacentLineComments(comment, comments[i + 1])\n ) {\n continue; // one line of a paragraph, not a label for the next statement\n }\n const body = comment.value.replace(/^\\/*/, \"\").trim();\n if (body.length === 0 || body.endsWith(\"?\")) continue;\n if (DIRECTIVE_RE.test(body) || CODEY_RE.test(body) || BANNERISH_RE.test(body)) continue;\n if (NON_ASCII_LETTER_RE.test(body) || isProtected(body)) continue;\n if (MODALITY_RE.test(body) || LEAD_IN_RE.test(body) || EMPHASIS_RE.test(body)) continue;\n if (NEGATION_WORD_RE.test(body)) continue;\n if (body.split(/\\s+/).length > MAX_WORDS) continue;\n\n const tokens = contentTokens(body);\n if (tokens.length < MIN_CONTENT_TOKENS) continue;\n\n const statement = restatableStatementBelow(comment, sourceCode);\n if (statement === null) continue;\n if (restatesStatementHead(body, statement)) continue; // `no-comment-cruft` owns it\n\n const line = lines[comment.loc.start.line] ?? \"\";\n if (!ACTION_STMT_RE.test(line)) continue;\n\n if (labelsASiblingRun(comment)) continue;\n\n if (restates(tokens, codeTokens(line))) {\n context.report({ node: comment, messageId: \"restatesLineBelow\" });\n }\n }\n },\n };\n },\n});\n","/**\n * @fileoverview no-restated-jsdoc — a JSDoc block whose every word is already in the signature costs three lines and a review and says nothing.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-restated-jsdoc.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-restated-jsdoc.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isProtected, splitIdentifier, stem } from \"./_comments.js\";\nimport { isGeneratedFile } from \"./_paths.js\";\n\ntype MessageIds = \"restatesSignature\" | \"deleteBlock\";\ntype Options = readonly [];\n\n// Tags this rule models and can therefore judge. Anything else means the block\n// is doing something the rule does not understand, so it is left alone — which\n// includes every value-carrying tag (`@see`, `@example`, `@deprecated`,\n// `@throws`, …). A separate allowlist of those used to sit above this one; it\n// could be emptied with the whole suite green, because being outside this set\n// is already sufficient and the two sets were disjoint.\nconst MODELLED_TAGS: ReadonlySet<string> = new Set([\n \"arg\", \"argument\", \"async\", \"description\", \"param\", \"return\", \"returns\",\n]);\n\nconst PARAM_TAGS: ReadonlySet<string> = new Set([\"arg\", \"argument\", \"param\"]);\nconst RETURN_TAGS: ReadonlySet<string> = new Set([\"return\", \"returns\"]);\n\nconst DIRECTIVE_RE = /^\\s*(?:eslint\\b|eslint-|@ts-|prettier|biome-|c8\\b|v8\\b|istanbul\\b|@vite|webpack|@jsx|@jest-environment|@vitest-environment|#__)/i;\n\n// Prose filler that says nothing about *which* thing is being described. Wider\n// than the comment tokenizer's list because JSDoc conventionally repeats the\n// vocabulary of the type system itself (\"the callback prop\", \"an optional\n// string\") without that being a claim about this declaration.\nconst STOPWORDS: ReadonlySet<string> = new Set(\n `the a an of to for in on with and or as at by is are was be been being\n this that it its if whether when where which what will would can could should\n must may into from over about not no does do done has have had used use uses\n using given provided specified current new existing all any each per via based\n function method component hook class instance object value values data item\n items element callback handler prop props param parameter argument arg return\n returns returning result optional required default true false null undefined\n string number boolean array list promise`.split(/\\s+/),\n);\n\nconst WORD_RE = /[A-Za-z]+/g;\n\ninterface JsDocTag {\n readonly name: string;\n readonly text: string;\n}\n\n/** Split a JSDoc block into its free description and its tags. */\nfunction parseJsDoc(value: string): { description: string; tags: JsDocTag[] } {\n const lines = value.replace(/^\\*/, \"\").split(\"\\n\").map((line) => line.replace(/^\\s*\\*?\\s?/, \"\"));\n const description: string[] = [];\n const tags: { name: string; text: string }[] = [];\n let current: { name: string; text: string } | null = null;\n for (const line of lines) {\n const match = /^\\s*@(\\w[\\w-]*)\\s*(.*)$/.exec(line);\n if (match) {\n current = { name: (match[1] ?? \"\").toLowerCase(), text: match[2] ?? \"\" };\n tags.push(current);\n } else if (current !== null) {\n current.text += ` ${line.trim()}`;\n } else {\n description.push(line);\n }\n }\n return { description: description.join(\"\\n\").trim(), tags };\n}\n\n/** Every content word of `text`, lowercased, with filler dropped. */\nfunction proseTokens(text: string): string[] {\n return (text.match(WORD_RE) ?? [])\n .map((word) => word.toLowerCase())\n .filter((word) => word.length > 1 && !STOPWORDS.has(word));\n}\n\n/** True when every content word of `text` already appears in `known`. */\nfunction covered(text: string, known: ReadonlySet<string>): boolean {\n const stems = new Set<string>();\n for (const token of known) stems.add(stem(token));\n return proseTokens(text).every((word) => known.has(word) || stems.has(stem(word)));\n}\n\n/** The declared name and parameter names of the node a JSDoc block sits above. */\nfunction declarationNames(node: TSESTree.Node): { name: string; params: string[] } | null {\n switch (node.type) {\n // `export function f()` — the JSDoc sits above the `export`, so the token\n // after it resolves to the wrapper, not to the thing being documented.\n case AST_NODE_TYPES.ExportNamedDeclaration:\n case AST_NODE_TYPES.ExportDefaultDeclaration:\n return node.declaration == null ? null : declarationNames(node.declaration);\n case AST_NODE_TYPES.FunctionDeclaration:\n case AST_NODE_TYPES.TSDeclareFunction:\n return node.id === null ? null : { name: node.id.name, params: paramNames(node.params) };\n case AST_NODE_TYPES.ClassDeclaration:\n case AST_NODE_TYPES.TSInterfaceDeclaration:\n case AST_NODE_TYPES.TSTypeAliasDeclaration:\n case AST_NODE_TYPES.TSEnumDeclaration:\n return node.id === null ? null : { name: node.id.name, params: [] };\n case AST_NODE_TYPES.VariableDeclaration: {\n const declarator = node.declarations[0];\n if (declarator === undefined || declarator.id.type !== AST_NODE_TYPES.Identifier) return null;\n const init = declarator.init;\n const params =\n init != null &&\n (init.type === AST_NODE_TYPES.ArrowFunctionExpression ||\n init.type === AST_NODE_TYPES.FunctionExpression)\n ? paramNames(init.params)\n : [];\n return { name: declarator.id.name, params };\n }\n case AST_NODE_TYPES.MethodDefinition:\n case AST_NODE_TYPES.PropertyDefinition:\n case AST_NODE_TYPES.TSMethodSignature:\n case AST_NODE_TYPES.TSPropertySignature: {\n if (node.key.type !== AST_NODE_TYPES.Identifier) return null;\n const params =\n node.type === AST_NODE_TYPES.MethodDefinition\n ? paramNames(node.value.params)\n : node.type === AST_NODE_TYPES.TSMethodSignature\n ? paramNames(node.params)\n : [];\n return { name: node.key.name, params };\n }\n default:\n return null;\n }\n}\n\nfunction paramNames(params: readonly TSESTree.Parameter[]): string[] {\n const names: string[] = [];\n for (const param of params) {\n const target = param.type === AST_NODE_TYPES.AssignmentPattern ? param.left : param;\n if (target.type === AST_NODE_TYPES.Identifier) names.push(target.name);\n else if (target.type === AST_NODE_TYPES.TSParameterProperty) continue;\n }\n return names;\n}\n\nfunction tokensOf(names: readonly string[]): Set<string> {\n const tokens = new Set<string>();\n for (const name of names) for (const part of splitIdentifier(name)) tokens.add(part);\n return tokens;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-restated-jsdoc\",\n meta: {\n type: \"suggestion\",\n hasSuggestions: true,\n docs: {\n description:\n \"Flag a JSDoc block whose description and tags only re-spell the signature they document.\",\n },\n schema: [],\n messages: {\n restatesSignature:\n \"JSDoc only re-spells the signature — delete it, or say what the caller cannot read off the name (what it throws, what it assumes, why it exists).\",\n deleteBlock: \"Delete the JSDoc block.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (isGeneratedFile(context.filename, context.sourceCode.text)) {\n return {};\n }\n const sourceCode = context.sourceCode;\n\n return {\n Program(): void {\n for (const comment of sourceCode.getAllComments()) {\n if (comment.type !== \"Block\" || !comment.value.startsWith(\"*\")) continue;\n const { description, tags } = parseJsDoc(comment.value);\n if (DIRECTIVE_RE.test(description)) continue;\n const tagNames = new Set(tags.map((tag) => tag.name));\n if ([...tagNames].some((name) => !MODELLED_TAGS.has(name))) continue;\n if (isProtected(description)) continue;\n\n const token = sourceCode.getTokenAfter(comment, { includeComments: false });\n if (token === null || token.loc.start.line !== comment.loc.end.line + 1) continue;\n let node = sourceCode.getNodeByRangeIndex(token.range[0]);\n let declaration: { name: string; params: string[] } | null = null;\n while (node != null && node.type !== AST_NODE_TYPES.Program) {\n declaration = declarationNames(node);\n if (declaration !== null) break;\n node = node.parent ?? null;\n }\n if (declaration === null) continue;\n\n const paramTags = tags.filter((tag) => PARAM_TAGS.has(tag.name));\n const returnTags = tags.filter((tag) => RETURN_TAGS.has(tag.name));\n if (description.length === 0 && paramTags.length === 0 && returnTags.length === 0) {\n continue;\n }\n\n const nameTokens = tokensOf([declaration.name]);\n const paramTokens = tokensOf(declaration.params);\n const known = new Set([...nameTokens, ...paramTokens]);\n\n let addsNothing = covered(description, known);\n for (const tag of paramTags) {\n const text = tag.text.replace(/^\\{[^}]*\\}\\s*/, \"\");\n const match = /^\\[?([A-Za-z_$][\\w.$]*)\\]?\\s*-?\\s*([\\s\\S]*)$/.exec(text);\n if (match === null) {\n addsNothing = false;\n break;\n }\n const own = new Set([...splitIdentifier(match[1]?.split(\".\").pop() ?? \"\"), ...nameTokens]);\n if (!covered(match[2] ?? \"\", own)) {\n addsNothing = false;\n break;\n }\n for (const part of splitIdentifier(match[1]?.split(\".\").pop() ?? \"\")) known.add(part);\n }\n if (addsNothing) {\n for (const tag of returnTags) {\n if (!covered(tag.text.replace(/^\\{[^}]*\\}\\s*/, \"\"), known)) {\n addsNothing = false;\n break;\n }\n }\n }\n if (!addsNothing) continue;\n\n context.report({\n node: comment,\n messageId: \"restatesSignature\",\n suggest: [\n {\n messageId: \"deleteBlock\",\n fix: (fixer) => fixer.removeRange([comment.range[0], token.range[0]]),\n },\n ],\n });\n }\n },\n };\n },\n});\n","/**\n * @fileoverview no-secret-in-log — a secret passed to a logging call persists in log sinks far beyond its intended lifetime.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-secret-in-log.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-secret-in-log.md\n */\n\nimport { type TSESTree } from \"@typescript-eslint/utils\";\n\nimport {\n createLogMatcher,\n LOGGING_OPTION_PROPERTIES,\n type LoggingOptions,\n} from \"./_logging.js\";\nimport { createRule } from \"./_docs.js\";\nimport { isTestFile } from \"./_paths.js\";\nimport {\n FLAG_PREFIXES,\n INNOCUOUS_WORDS,\n isSecretName,\n leadingWord,\n tokenize,\n} from \"./_secret-names.js\";\n\ntype MessageIds = \"noSecretInLog\" | \"noRawBodyInLog\";\ntype Options = readonly [LoggingOptions?];\n\n/**\n * The shared metadata set plus the log-specific extras. Logging a secret's\n * label, expiry, ARN, URL, scope, or the DI component that holds it is metadata\n * ABOUT the credential, never the credential bytes, so it must not fire here —\n * `prefer-constant-time-secret-compare` uses the narrower shared set.\n */\nconst LOG_INNOCUOUS_WORDS: ReadonlySet<string> = new Set([\n ...INNOCUOUS_WORDS,\n \"name\",\n \"names\",\n \"label\",\n \"labels\",\n \"title\",\n \"expiry\",\n \"expiration\",\n \"expires\",\n \"ttl\",\n \"version\",\n \"versions\",\n \"policy\",\n \"rotation\",\n \"arn\",\n \"path\",\n \"paths\",\n \"issuer\",\n \"audience\",\n \"strength\",\n \"manager\",\n \"service\",\n \"services\",\n \"repository\",\n \"provider\",\n \"providers\",\n \"store\",\n \"factory\",\n \"handler\",\n \"controller\",\n \"bucket\",\n \"url\",\n \"uri\",\n \"endpoint\",\n \"endpoints\",\n \"scope\",\n \"scopes\",\n \"event\",\n \"events\",\n \"format\",\n \"at\",\n \"len\",\n \"length\",\n]);\n\nconst REDACTION_RE = /prefix|suffix|redact|mask|hash|hint|_len|length/i;\nconst WHOLE_TOKEN_REDACTION_MARKERS: ReadonlySet<string> = new Set([\"tag\"]);\n\n/** True if the name names a raw secret and is not a redacted derivative. */\nfunction isSecretKeyword(name: string): boolean {\n if (REDACTION_RE.test(name)) {\n return false;\n }\n if (tokenize(name).some((tok) => WHOLE_TOKEN_REDACTION_MARKERS.has(tok))) {\n return false;\n }\n return isSecretName(name, LOG_INNOCUOUS_WORDS);\n}\n\n/**\n * True if `prop`'s value is the raw secret rather than a redacted/derived form.\n * Shorthand (`{ token }`), a bare identifier (`{ apiKey: theKey }`), or a plain\n * member access (`{ apiKey: config.apiKey }`) all carry the secret verbatim. A\n * call (`token.slice(0, 6)`, `mask(token)`), template literal, ternary, concat,\n * or literal placeholder (`\"***\"`) is already redacted — logging it is safe.\n */\nfunction isRawSecretValue(prop: TSESTree.Property): boolean {\n if (prop.shorthand) {\n return true;\n }\n return prop.value.type === \"Identifier\" || prop.value.type === \"MemberExpression\";\n}\n\n/**\n * Trailing camel/snake words that name an un-redacted request/response blob. Kept\n * to an enumerated five: these are the containers whose *whole point* is \"the\n * bytes the client sent / the server returned\". Generic container words (`data`,\n * `input`, `args`, `event`, `result`, `payloadless` domain objects) are excluded\n * on purpose — see the `@fileoverview`.\n */\nconst RAW_BLOB_WORDS: ReadonlySet<string> = new Set([\n \"body\",\n \"bodies\",\n \"payload\",\n \"payloads\",\n \"params\",\n]);\n\n/**\n * Whole identifiers whose camelCase split ends in a word too generic to enumerate\n * (`formData` -> `data`) but which name a blob unambiguously on their own.\n */\nconst RAW_BLOB_IDENTIFIERS: ReadonlySet<string> = new Set([\"formdata\"]);\n\n/**\n * Substrings that mark a blob name as an already-derived, safe-to-log form:\n * `redactedBody`, `sanitizedPayload`, `truncatedBody`, `bodyPreview`.\n */\nconst BLOB_REDACTION_RE = /redact|sanit|scrub|mask|truncat|anonym|filtered|preview|summar/i;\n\n/**\n * Derivation markers that are only safe when matched as a WHOLE token — `safe` as\n * a substring would wrongly exempt `unsafeBody`.\n */\nconst BLOB_REDACTION_TOKENS: ReadonlySet<string> = new Set([\n \"safe\",\n \"clean\",\n \"shape\",\n \"keys\",\n \"public\",\n]);\n\n/** True if the name names a raw request/response blob and is not a derived form. */\nfunction isRawBlobName(name: string): boolean {\n if (REDACTION_RE.test(name) || BLOB_REDACTION_RE.test(name)) {\n return false;\n }\n const tokens = tokenize(name);\n if (tokens.some((tok) => BLOB_REDACTION_TOKENS.has(tok))) {\n return false;\n }\n // Same leading boolean-predicate words the secret arm uses: `hasBody` answers\n // \"is there one?\", it is not the blob.\n const first = leadingWord(name);\n if (first !== undefined && FLAG_PREFIXES.has(first)) {\n return false;\n }\n if (RAW_BLOB_IDENTIFIERS.has(name.toLowerCase())) {\n return true;\n }\n const last = tokens.at(-1);\n return last !== undefined && RAW_BLOB_WORDS.has(last);\n}\n\n/**\n * The blob name a logged value carries VERBATIM, or null when it does not carry\n * one. A bare identifier is the whole object; a non-computed member access is\n * judged by its PROPERTY, so `res.body` is the blob but `body.id` is a picked\n * field. Every other shape — call, template, literal, ternary, spread — has\n * already been through the author's hands and is left alone.\n */\nfunction rawBlobValueName(value: TSESTree.Node): string | null {\n if (value.type === \"Identifier\") {\n return isRawBlobName(value.name) ? value.name : null;\n }\n if (\n value.type === \"MemberExpression\" &&\n !value.computed &&\n value.property.type === \"Identifier\"\n ) {\n return isRawBlobName(value.property.name) ? value.property.name : null;\n }\n return null;\n}\n\n/** The static string name of an object-property key, or null when not statically named. */\nfunction propertyKeyName(prop: TSESTree.Property): string | null {\n if (prop.computed) {\n return null;\n }\n if (prop.key.type === \"Identifier\") {\n return prop.key.name;\n }\n if (prop.key.type === \"Literal\" && typeof prop.key.value === \"string\") {\n return prop.key.value;\n }\n return null;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-secret-in-log\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow passing a secret-named value or a raw request/response blob to a logging call; both leak to log sinks. Redact or omit.\",\n },\n schema: [\n {\n type: \"object\",\n additionalProperties: false,\n properties: { ...LOGGING_OPTION_PROPERTIES },\n },\n ],\n messages: {\n noSecretInLog:\n \"Secret `{{name}}` passed to a logging call leaks it to log sinks. Redact (e.g. `{{name}}Prefix: {{name}}.slice(0, 6)`) or omit it.\",\n noRawBodyInLog:\n \"Raw `{{name}}` passed to a logging call. Request/response blobs carry PII and often echo credentials back, and log sinks have no retention policy. Log a derived value instead (a status, `{{name}}.id`, a length, a truncated issue list) or pass it through a redactor (`redact({{name}})`).\",\n },\n },\n defaultOptions: [{}],\n create(context, [loggingOptions]) {\n const matcher = createLogMatcher(loggingOptions);\n // Bodies in a test file are fixtures the author wrote, not production PII.\n const blobArmApplies = !isTestFile(context.filename);\n\n /** Reports a bare positional argument that IS the secret. Did it fire? */\n function reportSecretArgument(arg: TSESTree.Node): boolean {\n const name =\n arg.type === \"Identifier\"\n ? arg.name\n : arg.type === \"MemberExpression\" &&\n !arg.computed &&\n arg.property.type === \"Identifier\"\n ? arg.property.name\n : null;\n if (name === null || !isSecretKeyword(name)) {\n return false;\n }\n context.report({ node: arg, messageId: \"noSecretInLog\", data: { name } });\n return true;\n }\n\n /** Reports a meta-object property whose key names a secret it carries raw. Did it fire? */\n function reportSecretProperty(prop: TSESTree.Property): boolean {\n const keyName = propertyKeyName(prop);\n if (keyName === null || !isSecretKeyword(keyName) || !isRawSecretValue(prop)) {\n return false;\n }\n context.report({ node: prop, messageId: \"noSecretInLog\", data: { name: keyName } });\n return true;\n }\n\n /** Reports `node` when `value` carries an un-redacted request/response blob. */\n function reportRawBlob(node: TSESTree.Node, value: TSESTree.Node): void {\n if (!blobArmApplies) {\n return;\n }\n const name = rawBlobValueName(value);\n if (name !== null) {\n context.report({ node, messageId: \"noRawBodyInLog\", data: { name } });\n }\n }\n\n return {\n CallExpression(node: TSESTree.CallExpression): void {\n if (!matcher.isLoggingCall(node)) {\n return;\n }\n\n for (const arg of node.arguments) {\n if (arg.type === \"ObjectExpression\") {\n for (const prop of arg.properties) {\n if (prop.type !== \"Property\") {\n continue;\n }\n if (!reportSecretProperty(prop)) {\n reportRawBlob(prop, prop.value);\n }\n }\n continue;\n }\n if (!reportSecretArgument(arg)) {\n reportRawBlob(arg, arg);\n }\n }\n },\n };\n },\n});\n","/**\n * @fileoverview _secret-names — shared predicate for whether an identifier names secret material, rather than merely embedding a secret word.\n *\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/_secret-names.md\n */\n\nexport const SECRET_WORDS: ReadonlySet<string> = new Set([\n \"token\",\n \"secret\",\n \"password\",\n \"passwd\",\n \"jwt\",\n \"secrets\",\n \"passwords\",\n \"credential\",\n \"credentials\",\n \"authorization\",\n \"signature\",\n \"hmac\",\n \"digest\",\n \"hash\",\n \"apikey\",\n \"bearer\",\n]);\n\n/**\n * Tokens that mark a counter, row-id, feature flag, or boolean presence/state\n * marker. As the TRAILING token they mean the identifier is metadata *about* a\n * secret, not the secret itself, so it is not a leak / timing surface even when a\n * secret word is also present: `tokenPresent`, `passwordSet`, and\n * `passwordConfigured` are booleans, not credentials. Leading such a word does\n * not disqualify — `validToken` / `presentToken` are credentials.\n */\nexport const INNOCUOUS_WORDS: ReadonlySet<string> = new Set([\n \"count\",\n \"counts\",\n \"budget\",\n \"limit\",\n \"limits\",\n \"id\",\n \"ids\",\n \"enabled\",\n \"disabled\",\n \"flag\",\n \"flags\",\n \"present\",\n \"set\",\n \"unset\",\n \"configured\",\n \"missing\",\n \"required\",\n \"valid\",\n \"invalid\",\n \"exists\",\n \"type\",\n \"types\",\n]);\n\n/**\n * A trailing token that makes the identifier metadata *about* a secret — its\n * category, handle or label — rather than the credential: `tokenType`,\n * `tokenName`, `sessionId`, `credentialKind`. `type`/`id` are already dropped by\n * the shared innocuous set; `name`/`kind` are added here because logging them\n * can still matter (SARJ012) but they are never a timing surface.\n */\nconst DESCRIPTOR_WORDS: ReadonlySet<string> = new Set([\n \"type\",\n \"types\",\n \"name\",\n \"names\",\n \"id\",\n \"ids\",\n \"kind\",\n \"kinds\",\n]);\n\n/**\n * A `type`/`kind` token anywhere marks an enum/category discriminator, not a\n * credential: `TOKEN_TYPE_SYSTEM`, `credentialType`, `grantKind`.\n */\nconst CATEGORY_WORDS: ReadonlySet<string> = new Set([\"type\", \"types\", \"kind\", \"kinds\"]);\n\n\n/**\n * A leading boolean-predicate word marks a flag, not the credential itself:\n * `isToken`, `hasSecret`, `has_secret`, `isTokenStrategy`. Consulted by the\n * SHARED `isSecretName`, so every consumer gets it: this is the exact mirror of\n * the trailing innocuous-word check that already lives there — a boolean\n * answering \"does a secret exist?\" leaks nothing whether the marker leads or\n * trails, and word ORDER should not decide whether a name counts as a\n * credential. Matched as a whole leading WORD via `leadingWord`, never as a\n * character prefix, so `hash_secret` (`hash` != `has`), `issuer_token`\n * (`issuer` != `is`) and `canary_token` (`canary` != `can`) keep firing.\n */\nexport const FLAG_PREFIXES: ReadonlySet<string> = new Set([\n \"is\",\n \"has\",\n \"was\",\n \"are\",\n \"can\",\n \"should\",\n]);\n\n/**\n * Words that make an identifier a secret *only* via an integrity/content hash\n * (`contentHash`, `metadataHash`, `rowHash`) rather than an authenticator. A name\n * that ALSO carries one of these keeps firing (`passwordHash`, `tokenHash`,\n * `computedHmac`, `signature`): those gate access, a plain digest of content does\n * not.\n */\nconst AUTH_WORDS: ReadonlySet<string> = new Set([\n \"token\",\n \"secret\",\n \"secrets\",\n \"password\",\n \"passwd\",\n \"passwords\",\n \"jwt\",\n \"credential\",\n \"credentials\",\n \"authorization\",\n \"signature\",\n \"hmac\",\n \"apikey\",\n \"bearer\",\n]);\n\n/**\n * camelCase / PascalCase / ALLCAPS / digit-run splitter, applied to each\n * snake/kebab segment. `APIKey` -> [\"API\", \"Key\"], `authToken` -> [\"auth\", \"Token\"].\n */\nconst CAMEL_RE = /[A-Z]+(?=[A-Z][a-z])|[A-Z]?[a-z]+|[A-Z]+|\\d+/g;\nconst SEGMENT_RE = /[^A-Za-z0-9]+/;\n\n/**\n * Ordered lowercase tokens from snake_case + camelCase decomposition. Also\n * yields each whole snake/kebab segment lowercased, so a pathological mixed-case\n * single word like `ToKeN` (which camel-splitting shreds into `to`/`ke`/`n`)\n * still surfaces its intended `token` form.\n */\nexport function tokenize(identifier: string): string[] {\n const tokens: string[] = [];\n for (const segment of identifier.split(SEGMENT_RE)) {\n if (!segment) {\n continue;\n }\n tokens.push(segment.toLowerCase());\n for (const part of segment.match(CAMEL_RE) ?? []) {\n tokens.push(part.toLowerCase());\n }\n }\n return tokens;\n}\n\n/** The first *word* of an identifier, from camelCase splitting. */\nexport function leadingWord(identifier: string): string | undefined {\n for (const segment of identifier.split(SEGMENT_RE)) {\n if (segment) {\n return (segment.match(CAMEL_RE) ?? [segment])[0]?.toLowerCase();\n }\n }\n return undefined;\n}\n\n/** True if an `api` token is immediately followed by a `key` token (`api_key`). */\nexport function hasApiKey(tokens: readonly string[]): boolean {\n for (let i = 0; i + 1 < tokens.length; i++) {\n if (tokens[i] === \"api\" && tokens[i + 1] === \"key\") {\n return true;\n }\n }\n return false;\n}\n\n/**\n * True if `identifier` names raw secret material (a credential, not metadata).\n * `innocuous` defaults to the shared metadata set; callers that need a wider\n * exemption list (e.g. `no-secret-in-log`) pass their own superset.\n *\n * Two symmetric metadata guards run before the secret-word scan: a TRAILING\n * innocuous word (`tokenCount`, `apiKeyId`) and a LEADING boolean-predicate word\n * (`hasSecret`, `is_token`). Both describe a name that is *about* a credential\n * rather than being one.\n */\nexport function isSecretName(\n identifier: string,\n innocuous: ReadonlySet<string> = INNOCUOUS_WORDS,\n): boolean {\n const tokens = tokenize(identifier);\n const last = tokens.at(-1);\n if (last !== undefined && innocuous.has(last)) {\n return false;\n }\n const first = leadingWord(identifier);\n if (first !== undefined && FLAG_PREFIXES.has(first)) {\n return false;\n }\n if (tokens.some((tok) => SECRET_WORDS.has(tok))) {\n return true;\n }\n return hasApiKey(tokens);\n}\n\n/**\n * True if `identifier` names an *authenticator* — an access-gating secret whose\n * bytes an attacker could recover by timing a byte-wise comparison.\n */\nexport function isAuthSecretName(identifier: string): boolean {\n if (!isSecretName(identifier)) {\n return false;\n }\n const tokens = tokenize(identifier);\n const last = tokens.at(-1);\n if (last !== undefined && DESCRIPTOR_WORDS.has(last)) {\n return false;\n }\n if (tokens.some((tok) => CATEGORY_WORDS.has(tok))) {\n return false;\n }\n if (tokens.some((tok) => AUTH_WORDS.has(tok))) {\n return true;\n }\n return hasApiKey(tokens);\n}\n","/**\n * @fileoverview no-select-star — `SELECT *` over-fetches and leaves the row contract implicit, so a schema change breaks row parsing silently.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-select-star.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-select-star.md\n */\n\nimport { type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isTestFile } from \"./_paths.js\";\nimport { createSqlListener } from \"./_sql.js\";\n\ntype MessageIds = \"noSelectStar\";\ntype Options = readonly [];\n\n/** A real SQL query shape, so prose containing the bare word \"from\" isn't matched. */\nconst QUERY_SHAPE = /\\bSELECT\\b[\\s\\S]*?\\bFROM\\b/i;\nconst SELECT_KEYWORD = /\\bSELECT\\b/gi;\nconst FROM_KEYWORD = /^FROM\\b/i;\nconst EXISTS_BEFORE = /\\bEXISTS\\s*\\(\\s*$/i;\n/** A `word.` immediately preceding a `*` marks a qualified star (`c.*`, `main.runs.*`). */\nconst QUALIFIED_PREFIX = /\\w\\.$/;\n\nconst SELECT_GATE = /select/i;\n\n/**\n * True when the `*` at `pos` is a column-projection star.\n *\n * A projection star expands columns: bare (`SELECT *`, `id, *`) or qualified\n * (`c.*`). It is NOT a `COUNT(*)` argument (parenthesised on both sides) nor an\n * `a * b` multiply (an operand follows rather than a terminator).\n */\nfunction isProjectionStar(sql: string, pos: number): boolean {\n if (QUALIFIED_PREFIX.test(sql.slice(0, pos))) {\n return true;\n }\n let before = pos - 1;\n while (before >= 0 && /\\s/.test(sql[before] ?? \"\")) {\n before -= 1;\n }\n let after = pos + 1;\n while (after < sql.length && /\\s/.test(sql[after] ?? \"\")) {\n after += 1;\n }\n const beforeChar = before >= 0 ? (sql[before] ?? \"\") : \"\";\n const afterChar = after < sql.length ? (sql[after] ?? \"\") : \"\";\n const terminates =\n afterChar === \"\" || afterChar === \",\" || afterChar === \")\" || FROM_KEYWORD.test(sql.slice(after));\n if (!terminates) {\n return false;\n }\n return !(beforeChar === \"(\" && afterChar === \")\");\n}\n\n/** True when the query projects a star that is not inside an `EXISTS (...)` subquery. */\nfunction hasRealSelectStar(sql: string): boolean {\n const selects = [...sql.matchAll(SELECT_KEYWORD)].map((m) => m.index);\n for (let pos = 0; pos < sql.length; pos++) {\n if (sql[pos] !== \"*\" || !isProjectionStar(sql, pos)) {\n continue;\n }\n const owning = selects.filter((start) => start < pos).at(-1);\n if (owning !== undefined && !EXISTS_BEFORE.test(sql.slice(0, owning))) {\n return true;\n }\n }\n return false;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-select-star\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow SELECT * in embedded SQL; it over-fetches and leaves the row contract implicit, so a schema change breaks row parsing silently.\",\n },\n schema: [],\n messages: {\n noSelectStar:\n \"`SELECT *` over-fetches and leaves the row shape implicit — a new or reordered column silently changes what this query returns. List the columns explicitly.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (isTestFile(context.filename) || !SELECT_GATE.test(context.sourceCode.text)) {\n return {};\n }\n return createSqlListener((sql: string, node: TSESTree.Node): void => {\n if (!QUERY_SHAPE.test(sql) || !hasRealSelectStar(sql)) {\n return;\n }\n context.report({ node, messageId: \"noSelectStar\" });\n });\n },\n});\n","/**\n * @fileoverview no-sentinel-return-on-catch — a `catch` returning `null` / `[]` / `{}` discards the error, so callers cannot tell empty from failed.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-sentinel-return-on-catch.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-sentinel-return-on-catch.md\n */\n\nimport { type TSESTree, AST_NODE_TYPES } from \"@typescript-eslint/utils\";\n\nimport {\n createLogMatcher,\n calleeName,\n LOGGING_OPTION_PROPERTIES,\n type LoggingOptions,\n REPORT_NAME_RE,\n} from \"./_logging.js\";\nimport { createRule } from \"./_docs.js\";\nimport { isGeneratedFile } from \"./_paths.js\";\n\ntype MessageIds = \"noSentinelReturn\";\ntype Options = readonly [LoggingOptions?];\n\ntype SentinelKind = \"nullish\" | \"boolean\" | \"array\" | \"object\" | \"string\";\n\n/** The sentinel \"kind\" of a returned expression, or null if not a sentinel. */\nfunction sentinelKind(arg: TSESTree.Expression | null): SentinelKind | null {\n if (arg === null) {\n return null;\n }\n if (arg.type === AST_NODE_TYPES.Literal) {\n if (arg.value === null) {\n return \"nullish\";\n }\n if (typeof arg.value === \"boolean\") {\n return \"boolean\";\n }\n if (typeof arg.value === \"string\") {\n return \"string\";\n }\n return null;\n }\n if (arg.type === AST_NODE_TYPES.Identifier && arg.name === \"undefined\") {\n return \"nullish\";\n }\n if (arg.type === AST_NODE_TYPES.ArrayExpression) {\n return \"array\";\n }\n if (arg.type === AST_NODE_TYPES.ObjectExpression) {\n return \"object\";\n }\n return null;\n}\n\n/** Whether a returned expression is one of the swallowing sentinels we flag. */\nfunction isSentinelArgument(arg: TSESTree.Expression | null): boolean {\n if (arg === null) {\n return false;\n }\n if (arg.type === AST_NODE_TYPES.Literal && arg.value === null) {\n return true;\n }\n if (arg.type === AST_NODE_TYPES.Literal && arg.value === false) {\n return true;\n }\n if (arg.type === AST_NODE_TYPES.Identifier && arg.name === \"undefined\") {\n return true;\n }\n if (arg.type === AST_NODE_TYPES.ArrayExpression && arg.elements.length === 0) {\n return true;\n }\n if (\n arg.type === AST_NODE_TYPES.ObjectExpression &&\n arg.properties.length === 0\n ) {\n return true;\n }\n return false;\n}\n\nfunction isFunctionNode(node: TSESTree.Node): boolean {\n return (\n node.type === AST_NODE_TYPES.FunctionDeclaration ||\n node.type === AST_NODE_TYPES.FunctionExpression ||\n node.type === AST_NODE_TYPES.ArrowFunctionExpression\n );\n}\n\nfunction isNode(value: unknown): value is TSESTree.Node {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { type?: unknown }).type === \"string\"\n );\n}\n\n/**\n * Walk `node`'s subtree applying `visit`, but do not descend into nested\n * function scopes — their statements don't run synchronously for the current\n * catch. Stops early once `visit` returns true.\n */\nfunction walkWithinScope(\n node: TSESTree.Node,\n visit: (current: TSESTree.Node) => boolean,\n): boolean {\n let found = false;\n\n const recurse = (current: TSESTree.Node): void => {\n if (found) {\n return;\n }\n if (visit(current)) {\n found = true;\n return;\n }\n if (isFunctionNode(current)) {\n return;\n }\n for (const key of Object.keys(current)) {\n if (key === \"parent\") {\n continue;\n }\n const value = (current as unknown as Record<string, unknown>)[key];\n if (Array.isArray(value)) {\n for (const child of value) {\n if (isNode(child)) {\n recurse(child);\n }\n }\n } else if (isNode(value)) {\n recurse(value);\n }\n }\n };\n\n recurse(node);\n return found;\n}\n\n/** Does this subtree throw (ignoring nested function scopes)? */\nfunction containsThrow(node: TSESTree.Node): boolean {\n return walkWithinScope(\n node,\n (current) => current.type === AST_NODE_TYPES.ThrowStatement,\n );\n}\n\n/** True when a parameter pattern binds `name` (plain, default, rest, or destructured). */\nfunction bindsName(param: TSESTree.Node, name: string): boolean {\n switch (param.type) {\n case AST_NODE_TYPES.Identifier:\n return param.name === name;\n case AST_NODE_TYPES.AssignmentPattern:\n return bindsName(param.left, name);\n case AST_NODE_TYPES.RestElement:\n return bindsName(param.argument, name);\n case AST_NODE_TYPES.ArrayPattern:\n return param.elements.some(\n (element) => element !== null && bindsName(element, name),\n );\n case AST_NODE_TYPES.ObjectPattern:\n return param.properties.some((property) =>\n property.type === AST_NODE_TYPES.RestElement\n ? bindsName(property.argument, name)\n : bindsName(property.value, name),\n );\n default:\n return false;\n }\n}\n\n/**\n * Does `node`'s subtree READ the identifier `name`, in a VALUE position?\n *\n * A bare name match is not enough: an object key, a nested key, a member\n * property of another object and a parameter that merely shadows the name all\n * swallow the error while looking \"logged\". So non-computed property keys and\n * non-computed member properties are skipped, and a nested function that\n * rebinds the name is not descended into. Each shape has a case in the tests.\n */\nfunction subtreeReadsName(node: TSESTree.Node, name: string): boolean {\n let found = false;\n\n /** True when this function rebinds `name`, so its body reads a different value. */\n const shadowsName = (fn: TSESTree.Node): boolean =>\n isFunctionNode(fn) &&\n (fn as unknown as { params: TSESTree.Parameter[] }).params.some((param) =>\n bindsName(param, name),\n );\n\n const recurse = (current: TSESTree.Node): void => {\n if (found) {\n return;\n }\n if (current.type === AST_NODE_TYPES.Identifier && current.name === name) {\n found = true;\n return;\n }\n if (shadowsName(current)) {\n return;\n }\n for (const key of Object.keys(current)) {\n if (key === \"parent\") {\n continue;\n }\n // `{ error: 1 }` — the key names a field; it does not read the binding.\n if (\n key === \"key\" &&\n current.type === AST_NODE_TYPES.Property &&\n !current.computed\n ) {\n continue;\n }\n // `response.err` — the property names a field on some other object.\n if (\n key === \"property\" &&\n current.type === AST_NODE_TYPES.MemberExpression &&\n !current.computed\n ) {\n continue;\n }\n const value = (current as unknown as Record<string, unknown>)[key];\n if (Array.isArray(value)) {\n for (const child of value) {\n if (isNode(child)) {\n recurse(child);\n }\n }\n } else if (isNode(value)) {\n recurse(value);\n }\n }\n };\n\n recurse(node);\n return found;\n}\n\n/**\n * Does the caught-error binding appear ANYWHERE in a call's arguments? The whole\n * argument subtree is searched, not just top-level positional args: a structured\n * logger takes the error nested in a meta object or behind a conditional\n * (`logEvent(\"x\", { error: err instanceof Error ? err.message : String(err) })`),\n * and that reports the error exactly as `report(err)` does.\n */\nfunction argsIncludeBinding(\n args: readonly TSESTree.CallExpressionArgument[],\n caughtName: string | null,\n): boolean {\n if (caughtName === null) {\n return false;\n }\n return args.some((arg) => subtreeReadsName(arg, caughtName));\n}\n\n/** The try block guarded by this catch. */\nfunction tryBlockOf(catchNode: TSESTree.CatchClause): TSESTree.BlockStatement {\n return catchNode.parent.block;\n}\n\n/** Constructors that throw on malformed input. */\nconst SAFE_PARSE_CONSTRUCTORS: ReadonlySet<string> = new Set([\n \"RegExp\",\n \"URL\",\n \"URLPattern\",\n]);\n\n/**\n * A parse-style call that throws on bad input: `JSON.parse(x)`, `YAML.parse(x)`,\n * `new RegExp(x)`, `new URL(x)`.\n */\nfunction isParseShapedNode(node: TSESTree.Node): boolean {\n if (\n node.type === AST_NODE_TYPES.CallExpression &&\n node.callee.type === AST_NODE_TYPES.MemberExpression &&\n !node.callee.computed &&\n node.callee.property.type === AST_NODE_TYPES.Identifier\n ) {\n return node.callee.property.name === \"parse\";\n }\n if (\n node.type === AST_NODE_TYPES.NewExpression &&\n node.callee.type === AST_NODE_TYPES.Identifier\n ) {\n return SAFE_PARSE_CONSTRUCTORS.has(node.callee.name);\n }\n return false;\n}\n\n/** Body-decoding methods of a `Request` / `Response` — they throw on bad input. */\nconst BODY_DECODE_METHODS: ReadonlySet<string> = new Set([\n \"json\",\n \"text\",\n \"arrayBuffer\",\n]);\n\nfunction isBodyDecodeNode(node: TSESTree.Node): boolean {\n return (\n node.type === AST_NODE_TYPES.CallExpression &&\n node.callee.type === AST_NODE_TYPES.MemberExpression &&\n !node.callee.computed &&\n node.callee.property.type === AST_NODE_TYPES.Identifier &&\n BODY_DECODE_METHODS.has(node.callee.property.name)\n );\n}\n\n/**\n * True when a return statement's argument SUBTREE contains a match. The whole\n * subtree is searched rather than the top node alone, because the parse is\n * usually consumed in place: `return new URL(s).protocol === \"https:\"` is a\n * `BinaryExpression`, not a `NewExpression`, and `return await request.json()`\n * is an `AwaitExpression`. Nested function scopes are not searched — a parse\n * inside a callback does not run when the `try` does.\n */\nfunction returnsMatching(\n stmt: TSESTree.Node,\n predicate: (node: TSESTree.Node) => boolean,\n): boolean {\n return (\n stmt.type === AST_NODE_TYPES.ReturnStatement &&\n stmt.argument !== null &&\n walkWithinScope(stmt.argument, predicate)\n );\n}\n\n/** The declared return type annotation of the nearest enclosing function, or null. */\nfunction enclosingReturnTypeNode(\n node: TSESTree.Node,\n): TSESTree.TypeNode | null {\n let current: TSESTree.Node | undefined | null = node.parent;\n while (current !== undefined && current !== null) {\n if (isFunctionNode(current) && \"returnType\" in current) {\n return current.returnType?.typeAnnotation ?? null;\n }\n current = current.parent;\n }\n return null;\n}\n\n/**\n * Function names that declare a boolean contract as clearly as a `: boolean`\n * annotation does. TypeScript INFERS the return type of\n * `async function isDirectory(d: string) { try { … } catch { return false } }`,\n * so demanding the annotation made the predicate exemption depend on a style\n * choice rather than on the contract.\n */\nconst PREDICATE_NAME_RE = /^(is|has|can|should|must|does|did|was|were|are)[A-Z]/;\nconst PREDICATE_SUFFIX_RE = /(Exists?|Available|Enabled|Disabled)$/;\n\n/** The name of the nearest enclosing function, or null for an anonymous one. */\nfunction enclosingFunctionName(node: TSESTree.Node): string | null {\n let current: TSESTree.Node | undefined | null = node.parent;\n while (current !== undefined && current !== null) {\n if (isFunctionNode(current)) {\n if (\n \"id\" in current &&\n isNode(current.id) &&\n current.id.type === AST_NODE_TYPES.Identifier\n ) {\n return current.id.name;\n }\n const parent = current.parent;\n if (\n parent?.type === AST_NODE_TYPES.VariableDeclarator &&\n parent.id.type === AST_NODE_TYPES.Identifier\n ) {\n return parent.id.name;\n }\n return null;\n }\n current = current.parent;\n }\n return null;\n}\n\n/**\n * True when the enclosing function's NAME declares it a predicate and the catch\n * returns a boolean. Same reasoning as `isDeclaredBooleanPredicate`, applied to\n * the (very common) unannotated spelling.\n */\nfunction isNamedBooleanPredicate(\n catchNode: TSESTree.CatchClause,\n kind: SentinelKind,\n): boolean {\n if (kind !== \"boolean\") {\n return false;\n }\n const name = enclosingFunctionName(catchNode);\n return (\n name !== null &&\n (PREDICATE_NAME_RE.test(name) || PREDICATE_SUFFIX_RE.test(name))\n );\n}\n\n/**\n * True when the enclosing function is a DECLARED predicate — annotated\n * `: boolean` (or `: Promise<boolean>`) — and the catch returns `false`. A\n * boolean return type cannot carry error information at all, so \"return a typed\n * Result\" is not advice that applies; the sentinel IS the whole contract. Only\n * `boolean` qualifies: a declared `T | null` return is the shape this rule\n * exists to flag and must keep firing.\n */\nfunction isDeclaredBooleanPredicate(\n catchNode: TSESTree.CatchClause,\n kind: SentinelKind,\n): boolean {\n if (kind !== \"boolean\") {\n return false;\n }\n let declared = enclosingReturnTypeNode(catchNode);\n if (\n declared?.type === AST_NODE_TYPES.TSTypeReference &&\n declared.typeName.type === AST_NODE_TYPES.Identifier &&\n declared.typeName.name === \"Promise\"\n ) {\n declared = declared.typeArguments?.params[0] ?? null;\n }\n return declared?.type === AST_NODE_TYPES.TSBooleanKeyword;\n}\n\n/** Does the try body return a safe-parse-style expression? */\nfunction tryReturnsSafeParse(catchNode: TSESTree.CatchClause): boolean {\n const tryBlock = tryBlockOf(catchNode);\n if (\n walkWithinScope(tryBlock, (current) =>\n returnsMatching(current, isParseShapedNode),\n )\n ) {\n return true;\n }\n const only = tryBlock.body.length === 1 ? tryBlock.body[0] : undefined;\n return only !== undefined && returnsMatching(only, isBodyDecodeNode);\n}\n\n/** The nearest enclosing function body, or null. */\nfunction enclosingFunctionBody(\n node: TSESTree.Node,\n): TSESTree.BlockStatement | null {\n let current: TSESTree.Node | undefined | null = node.parent;\n while (current !== undefined && current !== null) {\n if (\n isFunctionNode(current) &&\n \"body\" in current &&\n isNode(current.body) &&\n current.body.type === AST_NODE_TYPES.BlockStatement\n ) {\n return current.body;\n }\n current = current.parent;\n }\n return null;\n}\n\n/**\n * True when the enclosing function returns the same sentinel kind on a normal\n * (non-catch) path — a boolean predicate, a `T | undefined` accessor, etc. —\n * so the catch sentinel is the declared contract, not a swallow. Returns inside\n * the flagged catch itself are excluded.\n */\nfunction functionReturnsSameSentinelKindElsewhere(\n catchNode: TSESTree.CatchClause,\n kind: SentinelKind,\n): boolean {\n const functionBody = enclosingFunctionBody(catchNode);\n if (functionBody === null) {\n return false;\n }\n return walkWithinScope(functionBody, (current) => {\n if (current.type !== AST_NODE_TYPES.ReturnStatement) {\n return false;\n }\n if (isWithin(current, catchNode.body)) {\n return false;\n }\n return returnedSentinelKinds(current.argument).has(kind);\n });\n}\n\n/**\n * The sentinel kinds a returned expression can evaluate to. A bare sentinel\n * yields one; a ternary or a `??` / `||` fallback yields the kinds of its\n * branches, because `return valid ? value : false` puts `false` on a NORMAL\n * path just as plainly as `return false` does.\n */\nfunction returnedSentinelKinds(\n arg: TSESTree.Expression | null,\n): ReadonlySet<SentinelKind> {\n const kinds = new Set<SentinelKind>();\n if (arg === null) {\n return kinds;\n }\n const direct = sentinelKind(arg);\n if (direct !== null) {\n kinds.add(direct);\n return kinds;\n }\n if (arg.type === AST_NODE_TYPES.ConditionalExpression) {\n for (const branch of [arg.consequent, arg.alternate]) {\n for (const nested of returnedSentinelKinds(branch)) {\n kinds.add(nested);\n }\n }\n } else if (\n arg.type === AST_NODE_TYPES.LogicalExpression &&\n (arg.operator === \"??\" || arg.operator === \"||\")\n ) {\n for (const nested of returnedSentinelKinds(arg.right)) {\n kinds.add(nested);\n }\n }\n return kinds;\n}\n\n/** Is `node` inside `ancestor`'s subtree? */\nfunction isWithin(node: TSESTree.Node, ancestor: TSESTree.Node): boolean {\n let current: TSESTree.Node | undefined | null = node;\n while (current !== undefined && current !== null) {\n if (current === ancestor) {\n return true;\n }\n current = current.parent;\n }\n return false;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-sentinel-return-on-catch\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow swallowing a caught error by returning an empty sentinel (`null`, `undefined`, `false`, `[]`, `{}`) as the final statement of a `catch` block, unless the error is logged/reported or the sentinel is the declared safe-parse/predicate contract.\",\n },\n schema: [\n {\n type: \"object\",\n additionalProperties: false,\n properties: { ...LOGGING_OPTION_PROPERTIES },\n },\n ],\n messages: {\n noSentinelReturn:\n \"This `catch` block swallows the error by returning an empty sentinel without logging it. Rethrow it, log/report it, or return a typed Result.\",\n },\n },\n defaultOptions: [{}],\n create(context, [loggingOptions]) {\n if (isGeneratedFile(context.filename, context.sourceCode.text)) {\n return {};\n }\n\n const matcher = createLogMatcher(loggingOptions);\n\n /**\n * Does the catch body log or report the caught error before the sentinel\n * return? Either a logging call (logger receiver or a declared\n * `logFunctions` free function), or an error-reporting call whose name\n * matches `REPORT_NAME_RE` and whose arguments mention the caught binding.\n */\n function logsOrReportsError(\n catchBody: TSESTree.BlockStatement,\n caughtName: string | null,\n ): boolean {\n return walkWithinScope(catchBody, (current) => {\n if (current.type !== AST_NODE_TYPES.CallExpression) {\n return false;\n }\n if (matcher.isLoggingCall(current)) {\n return true;\n }\n const name = calleeName(current.callee);\n return (\n name !== null &&\n REPORT_NAME_RE.test(name) &&\n argsIncludeBinding(current.arguments, caughtName)\n );\n });\n }\n\n return {\n CatchClause(node: TSESTree.CatchClause): void {\n const body = node.body.body;\n if (body.length === 0) {\n return;\n }\n\n const last = body[body.length - 1];\n if (last === undefined || last.type !== AST_NODE_TYPES.ReturnStatement) {\n return;\n }\n\n if (!isSentinelArgument(last.argument)) {\n return;\n }\n\n if (containsThrow(node.body)) {\n return;\n }\n\n const caughtName =\n node.param?.type === AST_NODE_TYPES.Identifier\n ? node.param.name\n : null;\n\n if (logsOrReportsError(node.body, caughtName)) {\n return;\n }\n\n if (tryReturnsSafeParse(node)) {\n return;\n }\n\n const kind = sentinelKind(last.argument);\n if (kind !== null && isNamedBooleanPredicate(node, kind)) {\n return;\n }\n\n if (kind !== null && isDeclaredBooleanPredicate(node, kind)) {\n return;\n }\n\n if (\n kind !== null &&\n functionReturnsSameSentinelKindElsewhere(node, kind)\n ) {\n return;\n }\n\n context.report({\n node: last,\n messageId: \"noSentinelReturn\",\n });\n },\n };\n },\n});\n","/**\n * @fileoverview no-silent-promise-catch — `.catch(() => null)` deletes the rejection: no log, no metric, no rethrow, and a sentinel to the caller.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-silent-promise-catch.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-silent-promise-catch.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"silentCatch\";\ntype Options = readonly [];\n\n/** True for `x.json()` / `x.text()` — the receiver of a body-parse-fallback catch. */\nfunction isBodyParseCall(node: TSESTree.Expression): boolean {\n return (\n node.type === AST_NODE_TYPES.CallExpression &&\n node.arguments.length === 0 &&\n node.callee.type === AST_NODE_TYPES.MemberExpression &&\n !node.callee.computed &&\n node.callee.property.type === AST_NODE_TYPES.Identifier &&\n (node.callee.property.name === \"json\" ||\n node.callee.property.name === \"text\")\n );\n}\n\n/**\n * Teardown methods that reject when the resource is already gone — which is the\n * state the caller was asking for. The rejection carries no signal, so silencing\n * it is correct, the same reasoning as the `res.json()` fallback above.\n */\nconst TEARDOWN_METHODS: ReadonlySet<string> = new Set([\n \"cancel\",\n \"close\",\n \"abort\",\n \"destroy\",\n \"dispose\",\n \"release\",\n \"unlock\",\n \"disconnect\",\n]);\n\n/**\n * Tooling directives are machinery, not an explanation of the swallow. An\n * `eslint-disable` already suppresses the report through the normal channel, so\n * counting it as documentation would turn every directive into an unused one.\n */\nconst DIRECTIVE_COMMENT_RE =\n /^\\s*(eslint-|@ts-|prettier-ignore|biome-ignore|c8 |v8 |istanbul )/;\n\nconst isExplanatory = (comment: { value: string }): boolean =>\n !DIRECTIVE_COMMENT_RE.test(comment.value);\n\n/** True for `reader.cancel(reason)` / `stream.close()` — a teardown receiver. */\nfunction isTeardownCall(node: TSESTree.Expression): boolean {\n return (\n node.type === AST_NODE_TYPES.CallExpression &&\n node.callee.type === AST_NODE_TYPES.MemberExpression &&\n !node.callee.computed &&\n node.callee.property.type === AST_NODE_TYPES.Identifier &&\n TEARDOWN_METHODS.has(node.callee.property.name)\n );\n}\n\n/** True for expressions that provably discard the error: bare literals,\n * `undefined`, empty object/array literals. */\nfunction isSilentExpression(node: TSESTree.Expression): boolean {\n switch (node.type) {\n case AST_NODE_TYPES.Literal:\n // null / number / string / boolean literals (regex literals excluded —\n // nobody writes `.catch(() => /x/)` and they are not sentinel values).\n return !(\"regex\" in node);\n case AST_NODE_TYPES.Identifier:\n return node.name === \"undefined\";\n case AST_NODE_TYPES.UnaryExpression:\n // `void 0` — the other spelling of undefined.\n return (\n node.operator === \"void\" &&\n node.argument.type === AST_NODE_TYPES.Literal\n );\n case AST_NODE_TYPES.ObjectExpression:\n return node.properties.length === 0;\n case AST_NODE_TYPES.ArrayExpression:\n return node.elements.length === 0;\n case AST_NODE_TYPES.TSAsExpression:\n // `.catch(() => null as Foo | null)` is still silent.\n return isSilentExpression(node.expression);\n default:\n return false;\n }\n}\n\n/** True when the handler's whole body provably does nothing with the error. */\nfunction isSilentHandler(\n handler: TSESTree.ArrowFunctionExpression | TSESTree.FunctionExpression,\n): boolean {\n const body = handler.body;\n\n if (body.type !== AST_NODE_TYPES.BlockStatement) {\n // Arrow expression body: `.catch(() => null)`\n return isSilentExpression(body);\n }\n\n if (body.body.length === 0) {\n // `.catch(() => {})` / `.catch(function () {})`\n return true;\n }\n\n if (body.body.length === 1) {\n const only = body.body[0];\n if (only !== undefined && only.type === AST_NODE_TYPES.ReturnStatement) {\n // `.catch(() => { return null; })`\n return only.argument === null || isSilentExpression(only.argument);\n }\n }\n\n return false;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-silent-promise-catch\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow `.catch()` handlers that silently swallow the rejection (e.g. `.catch(() => null)`); log, rethrow, or handle the error.\",\n },\n schema: [],\n messages: {\n silentCatch:\n \"This `.catch()` swallows the rejection without logging, rethrowing, or handling it — failures become invisible and callers get an indistinguishable sentinel. Log the error (and only then map to a fallback), or let it propagate.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (isTestFile(context.filename)) {\n return {};\n }\n\n /**\n * True when the suppression is DOCUMENTED: a comment inside the handler\n * body, trailing the call on the same line, or on the line(s) directly above\n * the statement the call belongs to. The rule's complaint is that the\n * decision to discard the error is invisible — a comment is precisely what\n * makes it visible, so there is nothing left to report.\n */\n const hasExplanatoryComment = (\n call: TSESTree.CallExpression,\n handler: TSESTree.ArrowFunctionExpression | TSESTree.FunctionExpression,\n ): boolean => {\n const sourceCode = context.sourceCode;\n if (sourceCode.getCommentsInside(handler).some(isExplanatory)) {\n return true;\n }\n // Walk out to the enclosing statement so a comment above or beside\n // `lazyRoutePromise.catch(() => {});` is found rather than one sitting\n // between the receiver and `.catch`.\n let statement: TSESTree.Node = call;\n while (\n statement.parent !== undefined &&\n statement.parent !== null &&\n !statement.type.endsWith(\"Statement\") &&\n statement.type !== AST_NODE_TYPES.VariableDeclaration\n ) {\n statement = statement.parent;\n }\n if (sourceCode.getCommentsBefore(statement).some(isExplanatory)) {\n return true;\n }\n return sourceCode\n .getCommentsAfter(statement)\n .some(\n (c) => isExplanatory(c) && c.loc.start.line === statement.loc.end.line,\n );\n };\n\n return {\n CallExpression(node: TSESTree.CallExpression): void {\n if (\n node.callee.type !== AST_NODE_TYPES.MemberExpression ||\n node.callee.computed ||\n node.callee.property.type !== AST_NODE_TYPES.Identifier ||\n node.callee.property.name !== \"catch\"\n ) {\n return;\n }\n\n if (isBodyParseCall(node.callee.object)) {\n return;\n }\n\n if (isTeardownCall(node.callee.object)) {\n return;\n }\n\n // `p.catch(() => null).then(...)` — the next link consumes the fallback,\n // so it is a recovery step, not a value handed back to an outside caller.\n if (\n node.parent.type === AST_NODE_TYPES.MemberExpression &&\n node.parent.object === node\n ) {\n return;\n }\n\n if (node.arguments.length !== 1) {\n return;\n }\n const handler = node.arguments[0];\n if (\n handler === undefined ||\n (handler.type !== AST_NODE_TYPES.ArrowFunctionExpression &&\n handler.type !== AST_NODE_TYPES.FunctionExpression)\n ) {\n return;\n }\n\n if (hasExplanatoryComment(node, handler)) {\n return;\n }\n\n if (isSilentHandler(handler)) {\n // Anchor on the CallExpression, not the handler: when the handler\n // sits on a later line than the call (multi-line `.catch(`), a\n // handler-anchored report escapes an `eslint-disable-next-line`\n // above the call AND marks that directive as unused.\n context.report({ node, messageId: \"silentCatch\" });\n }\n },\n };\n },\n});\n","/**\n * @fileoverview no-sleep-in-test-body — a fixed sleep asserts on wall-clock time rather than on the signal, so the test flakes under CI load.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-sleep-in-test-body.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-sleep-in-test-body.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"noSleepInTestBody\";\ntype Options = readonly [];\n\n/** Free-function sleep helpers. A `sleep(50)` reads as a sleep whatever its module. */\nconst SLEEP_HELPERS: ReadonlySet<string> = new Set([\"sleep\", \"delay\", \"wait\", \"pause\"]);\n\n/** Test-case and per-test-hook callers whose callback body is \"the test body\". */\nconst TEST_CALLERS: ReadonlySet<string> = new Set([\n \"it\",\n \"test\",\n \"beforeEach\",\n \"afterEach\",\n]);\n\nconst FUNCTION_TYPES: ReadonlySet<AST_NODE_TYPES> = new Set([\n AST_NODE_TYPES.FunctionDeclaration,\n AST_NODE_TYPES.FunctionExpression,\n AST_NODE_TYPES.ArrowFunctionExpression,\n]);\n\n/** True for a nonzero numeric literal — the timing guess, as opposed to a `0` yield. */\nfunction isNonzeroNumericLiteral(node: TSESTree.Node | undefined): boolean {\n return node?.type === AST_NODE_TYPES.Literal && typeof node.value === \"number\" && node.value !== 0;\n}\n\n/** True when `node` is `setTimeout(<anything>, <nonzero literal>)`. */\nfunction isTimedSetTimeout(node: TSESTree.Node): boolean {\n return (\n node.type === AST_NODE_TYPES.CallExpression &&\n node.callee.type === AST_NODE_TYPES.Identifier &&\n node.callee.name === \"setTimeout\" &&\n node.arguments.length >= 2 &&\n isNonzeroNumericLiteral(node.arguments[1])\n );\n}\n\n/**\n * True when `node` is `new Promise((r) => setTimeout(r, n))` — including the\n * block-bodied `{ setTimeout(r, n); }` spelling.\n */\nfunction isPromiseSleep(node: TSESTree.NewExpression): boolean {\n if (node.callee.type !== AST_NODE_TYPES.Identifier || node.callee.name !== \"Promise\") {\n return false;\n }\n const executor = node.arguments[0];\n if (\n executor?.type !== AST_NODE_TYPES.ArrowFunctionExpression &&\n executor?.type !== AST_NODE_TYPES.FunctionExpression\n ) {\n return false;\n }\n const body = executor.body;\n if (body.type !== AST_NODE_TYPES.BlockStatement) {\n return isTimedSetTimeout(body);\n }\n return body.body.some(\n (stmt) => stmt.type === AST_NODE_TYPES.ExpressionStatement && isTimedSetTimeout(stmt.expression),\n );\n}\n\n/** True when `node` is `sleep(n)` / `delay(n)` with a nonzero numeric literal. */\nfunction isHelperSleep(node: TSESTree.CallExpression): boolean {\n return (\n node.callee.type === AST_NODE_TYPES.Identifier &&\n SLEEP_HELPERS.has(node.callee.name) &&\n node.arguments.length >= 1 &&\n isNonzeroNumericLiteral(node.arguments[0])\n );\n}\n\n/** The nearest enclosing function of `node`, skipping the `new Promise` executor. */\nfunction nearestEnclosingFunction(node: TSESTree.Node): TSESTree.Node | null {\n for (let current = node.parent; current != null; current = current.parent) {\n if (!FUNCTION_TYPES.has(current.type)) {\n continue;\n }\n const grandparent = current.parent;\n const isPromiseExecutor =\n grandparent?.type === AST_NODE_TYPES.NewExpression && isPromiseSleep(grandparent);\n if (!isPromiseExecutor) {\n return current;\n }\n }\n return null;\n}\n\n/** The base callee name of a call, unwrapping `.only` / `.skip` / `.each` chains. */\nfunction testCallerName(callee: TSESTree.Node): string | null {\n if (callee.type === AST_NODE_TYPES.Identifier) {\n return callee.name;\n }\n if (callee.type === AST_NODE_TYPES.MemberExpression) {\n return testCallerName(callee.object);\n }\n if (callee.type === AST_NODE_TYPES.CallExpression) {\n return testCallerName(callee.callee);\n }\n if (callee.type === AST_NODE_TYPES.TaggedTemplateExpression) {\n return testCallerName(callee.tag);\n }\n return null;\n}\n\n/** True when `fn` is the callback argument of an `it`/`test`/per-test-hook call. */\nfunction isTestBody(fn: TSESTree.Node): boolean {\n const call = fn.parent;\n if (\n call?.type !== AST_NODE_TYPES.CallExpression ||\n !call.arguments.some((argument) => argument === fn)\n ) {\n return false;\n }\n const name = testCallerName(call.callee);\n return name !== null && TEST_CALLERS.has(name);\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-sleep-in-test-body\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow a fixed timed sleep directly in a test body; it flakes under CI load. Synchronize on the signal or use fake timers.\",\n },\n schema: [],\n messages: {\n noSleepInTestBody:\n \"A fixed sleep in a test body asserts on wall-clock time and flakes under CI load. Await the promise the code returns, or drive time with `vi.useFakeTimers()` + `await vi.advanceTimersByTimeAsync(ms)`.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (!isTestFile(context.filename)) {\n return {};\n }\n const report = (node: TSESTree.Node): void => {\n const enclosing = nearestEnclosingFunction(node);\n if (enclosing === null || !isTestBody(enclosing)) {\n return;\n }\n context.report({ node, messageId: \"noSleepInTestBody\" });\n };\n return {\n NewExpression(node: TSESTree.NewExpression): void {\n if (isPromiseSleep(node)) {\n report(node);\n }\n },\n CallExpression(node: TSESTree.CallExpression): void {\n if (isHelperSleep(node)) {\n report(node);\n }\n },\n };\n },\n});\n","/**\n * @fileoverview no-storage-in-stateless-modules — private storage inside a module a team declared stateless diverges from the system of record, silently.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-storage-in-stateless-modules.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-storage-in-stateless-modules.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\n\ntype MessageIds = \"storageInStatelessModule\";\n\nexport interface RuleOptions {\n /** Regex sources matched against the filename. Empty means the rule is off. */\n readonly modules?: readonly string[];\n /** Storage method names to flag. Replaces the defaults. */\n readonly methods?: readonly string[];\n}\n\ntype Options = readonly [RuleOptions?];\n\nconst DEFAULT_METHODS: readonly string[] = [\n \"prepare\",\n \"put\",\n \"getWithMetadata\",\n];\n\n/**\n * Minimum argument count before a method call counts as storage access. `put`\n * needs a key AND a value; a single-argument `put` is usually something else.\n * Methods absent from this map need one argument.\n */\nconst MIN_ARGUMENTS: ReadonlyMap<string, number> = new Map([[\"put\", 2]]);\n\n/** Compile regex sources, skipping malformed entries rather than throwing. */\nfunction compile(patterns: readonly string[]): RegExp[] {\n const compiled: RegExp[] = [];\n for (const pattern of patterns) {\n try {\n compiled.push(new RegExp(pattern));\n } catch {\n // Skip the malformed entry; the remaining patterns still apply.\n }\n }\n return compiled;\n}\n\n/** The flagged storage method name of `receiver.method(...)`, or null. */\nfunction storageMethodName(\n node: TSESTree.CallExpression,\n methods: ReadonlySet<string>,\n): string | null {\n const callee = node.callee;\n if (\n callee.type !== AST_NODE_TYPES.MemberExpression ||\n callee.computed ||\n callee.property.type !== AST_NODE_TYPES.Identifier\n ) {\n return null;\n }\n const name = callee.property.name;\n if (!methods.has(name)) {\n return null;\n }\n if (node.arguments.length < (MIN_ARGUMENTS.get(name) ?? 1)) {\n return null;\n }\n return name;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-storage-in-stateless-modules\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow SQL or key/value access inside modules a team has declared stateless; derive state from the systems of record instead. No-op until `modules` is configured.\",\n },\n schema: [\n {\n type: \"object\",\n properties: {\n modules: {\n type: \"array\",\n items: { type: \"string\" },\n description:\n \"Regex sources matched against the filename. Empty (the default) disables the rule.\",\n },\n methods: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Storage method names to flag. Replaces the defaults.\",\n },\n },\n additionalProperties: false,\n },\n ],\n messages: {\n storageInStatelessModule:\n \"`{{method}}()` reaches for private storage inside a module declared stateless. Derive the state from a read against the system of record, or from a marker in the artefact this feature already produces.\",\n },\n },\n defaultOptions: [{}],\n create(context, [options]) {\n const modules = options?.modules ?? [];\n if (modules.length === 0) {\n return {};\n }\n\n const scoped = compile(modules);\n if (!scoped.some((re) => re.test(context.filename))) {\n return {};\n }\n\n const methods = new Set(options?.methods ?? DEFAULT_METHODS);\n\n return {\n CallExpression(node: TSESTree.CallExpression): void {\n const method = storageMethodName(node, methods);\n if (method !== null) {\n context.report({\n node,\n messageId: \"storageInStatelessModule\",\n data: { method },\n });\n }\n },\n };\n },\n});\n","/**\n * @fileoverview no-string-concat-in-loop — `+=` on a string inside a loop rebuilds the whole string every pass, which is O(n^2).\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-string-concat-in-loop.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-string-concat-in-loop.md\n */\n\nimport { type TSESTree } from \"@typescript-eslint/utils\";\nimport type { Scope } from \"@typescript-eslint/utils/ts-eslint\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isGeneratedFile } from \"./_paths.js\";\n\ntype MessageIds = \"noStringConcatInLoop\";\ntype Options = readonly [];\n\nconst LOOP_NODE_TYPES = new Set<string>([\n \"ForStatement\",\n \"ForOfStatement\",\n \"ForInStatement\",\n \"WhileStatement\",\n \"DoWhileStatement\",\n]);\n\n/**\n * Returns true if the given expression node is a string-producing literal:\n * a string `Literal` (`\"\"`, `\"...\"`, `'...'`) or a `TemplateLiteral`.\n */\nfunction isStringLiteralInit(node: TSESTree.Expression | null): boolean {\n if (node === null) {\n return false;\n }\n if (node.type === \"TemplateLiteral\") {\n return true;\n }\n if (node.type === \"Literal\") {\n return typeof node.value === \"string\";\n }\n return false;\n}\n\n/**\n * Walk the chain of enclosing scopes to find the variable definition for the\n * given identifier name. Returns the resolved `Variable`, or `undefined` if it\n * cannot be found (e.g. an undeclared global or an out-of-scope reference).\n */\nfunction findVariable(\n scope: Scope.Scope,\n name: string,\n): Scope.Variable | undefined {\n let current: Scope.Scope | null = scope;\n while (current !== null) {\n const variable = current.variables.find((v) => v.name === name);\n if (variable !== undefined) {\n return variable;\n }\n current = current.upper;\n }\n return undefined;\n}\n\n/**\n * Returns true if the variable was declared with a string-literal initializer.\n * Conservative: if the variable has no single string-initialized declarator\n * (no init, non-literal init, multiple conflicting declarators), returns false.\n */\nfunction isStringInitializedVariable(variable: Scope.Variable): boolean {\n // A variable can technically have multiple declarators (e.g. via `var`\n // hoisting / redeclaration). Only treat it as string-initialized when there\n // is exactly one declarator and it has a string-literal initializer.\n if (variable.defs.length !== 1) {\n return false;\n }\n const def = variable.defs[0];\n if (def === undefined || def.type !== \"Variable\") {\n // Parameters, function names, imports, etc. — type unknown, don't flag.\n return false;\n }\n const declarator = def.node;\n if (declarator.type !== \"VariableDeclarator\") {\n return false;\n }\n return isStringLiteralInit(declarator.init);\n}\n\n/**\n * Returns true if `target` appears as a direct operand of a `+` expression\n * (following left-associative `+` chains, e.g. `s + a + b`). Used to recognize\n * the longhand `s = s + <...>` reassignment, which has the same O(n^2) cost as\n * `s += <...>`. A non-`+` operand (`foo.s`, `s.slice()`, `x + y`) does not match.\n */\nfunction isConcatOperand(\n node: TSESTree.Expression | TSESTree.PrivateIdentifier,\n target: string,\n): boolean {\n if (node.type === \"Identifier\") {\n return node.name === target;\n }\n if (node.type === \"BinaryExpression\" && node.operator === \"+\") {\n return (\n isConcatOperand(node.left, target) || isConcatOperand(node.right, target)\n );\n }\n return false;\n}\n\n/**\n * Returns true if `rhs` is a `+` `BinaryExpression` in which `target` appears as\n * an operand — the reassignment shape `s = s + x` / `s = x + s` / `s = s + a + b`.\n */\nfunction isConcatOntoTarget(\n rhs: TSESTree.Expression,\n target: string,\n): boolean {\n if (rhs.type !== \"BinaryExpression\" || rhs.operator !== \"+\") {\n return false;\n }\n return isConcatOperand(rhs.left, target) || isConcatOperand(rhs.right, target);\n}\n\n/**\n * Returns true when the accumulator's declaration lives inside `loop`'s BODY, so\n * a fresh string is bound on every iteration.\n *\n * `let s = \"\"` before the loop is the cross-iteration accumulator this rule\n * targets. `let s = \"\"` inside the body is not: the `+=` runs a bounded number of\n * times against a string that is discarded at the end of the pass, and there is\n * no quadratic growth to remove — the parts are usually already collected into an\n * array afterwards. Compared by source range, which is exact for a declaration\n * that is lexically nested in the body.\n */\nfunction isDeclaredInsideLoop(\n variable: Scope.Variable,\n loop: TSESTree.Node,\n): boolean {\n const def = variable.defs[0];\n if (def === undefined) {\n return false;\n }\n const body = (\n loop as\n | TSESTree.ForStatement\n | TSESTree.ForOfStatement\n | TSESTree.ForInStatement\n | TSESTree.WhileStatement\n | TSESTree.DoWhileStatement\n ).body;\n const [declStart, declEnd] = def.node.range;\n const [bodyStart, bodyEnd] = body.range;\n return declStart >= bodyStart && declEnd <= bodyEnd;\n}\n\n/**\n * Returns true if `node` is contained within the body of a loop statement.\n * Walks ancestors and, for each loop, ensures the node is inside the loop's\n * BODY (not its test/init/update clauses, which run a bounded number of times\n * relative to the body and aren't the antipattern we target).\n */\nfunction enclosingLoop(node: TSESTree.Node): TSESTree.Node | null {\n let child: TSESTree.Node = node;\n let parent = node.parent;\n while (parent !== undefined && parent !== null) {\n if (LOOP_NODE_TYPES.has(parent.type)) {\n // `body` is the property that holds the looped statements for every\n // loop variant we care about.\n const loop = parent as\n | TSESTree.ForStatement\n | TSESTree.ForOfStatement\n | TSESTree.ForInStatement\n | TSESTree.WhileStatement\n | TSESTree.DoWhileStatement;\n if (loop.body === child) {\n return loop;\n }\n }\n child = parent;\n parent = parent.parent;\n }\n return null;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-string-concat-in-loop\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Disallow O(n^2) string building via `+=` on a string variable inside a loop; push parts to an array and `join` instead.\",\n },\n schema: [],\n messages: {\n noStringConcatInLoop:\n \"Avoid building a string with `+=` inside a loop — this is O(n^2). Push the parts onto an array and use `arr.join(\\\"\\\")` after the loop.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (isGeneratedFile(context.filename, context.sourceCode.text)) {\n return {};\n }\n\n // One defect per (accumulator, loop) — see @fileoverview. Keyed on the loop\n // node so sibling loops over the same variable each keep their report.\n const reported = new WeakMap<TSESTree.Node, Set<string>>();\n\n return {\n AssignmentExpression(node: TSESTree.AssignmentExpression): void {\n // The LHS must be a plain variable reference.\n if (node.left.type !== \"Identifier\") {\n return;\n }\n // Accept both the compound `s += x` and the longhand `s = s + x`; any\n // other operator/shape (`s = x + y`, `s -= x`, ...) is not accumulation.\n const isAccumulation =\n node.operator === \"+=\" ||\n (node.operator === \"=\" &&\n isConcatOntoTarget(node.right, node.left.name));\n if (!isAccumulation) {\n return;\n }\n // Must occur inside a loop body, else it's a one-shot append.\n const loop = enclosingLoop(node);\n if (loop === null) {\n return;\n }\n\n const scope = context.sourceCode.getScope(node);\n const variable = findVariable(scope, node.left.name);\n // Conservative: can't resolve the declaration -> don't flag.\n if (variable === undefined) {\n return;\n }\n if (!isStringInitializedVariable(variable)) {\n return;\n }\n // The O(n^2) claim requires the accumulator to SURVIVE across iterations.\n // One declared inside the loop body is a fresh string every pass, so its\n // length is bounded by one iteration's work and `join` cannot replace it.\n if (isDeclaredInsideLoop(variable, loop)) {\n return;\n }\n\n let seen = reported.get(loop);\n if (seen === undefined) {\n seen = new Set<string>();\n reported.set(loop, seen);\n }\n if (seen.has(node.left.name)) {\n return;\n }\n seen.add(node.left.name);\n\n context.report({\n node,\n messageId: \"noStringConcatInLoop\",\n });\n },\n };\n },\n});\n","/**\n * @fileoverview no-tautological-expect — an assertion whose operands are all literals decided its outcome before the code ran, so it can never fail.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-tautological-expect.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-tautological-expect.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"tautologicalComparison\" | \"tautologicalMatcher\";\ntype Options = readonly [];\n\n/** Matchers that take the expected value as their single argument. */\nconst EQUALITY_MATCHERS: ReadonlySet<string> = new Set([\"toBe\", \"toEqual\", \"toStrictEqual\"]);\n\n/** Matchers that take no argument, so the receiver alone fixes the outcome. */\nconst ZERO_ARG_MATCHERS: ReadonlySet<string> = new Set([\n \"toBeDefined\",\n \"toBeUndefined\",\n \"toBeNull\",\n \"toBeTruthy\",\n \"toBeFalsy\",\n \"toBeNaN\",\n]);\n\n/** Enough of the operand to identify it in the message without pasting a screenful. */\nconst OPERAND_PREVIEW_CHARS = 40;\n\n/** Sign prefixes: `-1` is a unary expression, not a literal, but it is constant. */\nconst NUMERIC_SIGNS: ReadonlySet<string> = new Set([\"-\", \"+\"]);\n\nfunction isLiteral(node: TSESTree.Node): boolean {\n switch (node.type) {\n case AST_NODE_TYPES.Literal:\n return true;\n case AST_NODE_TYPES.TemplateLiteral:\n return node.expressions.length === 0;\n case AST_NODE_TYPES.UnaryExpression:\n return NUMERIC_SIGNS.has(node.operator) && isLiteral(node.argument);\n case AST_NODE_TYPES.ArrayExpression:\n return node.elements.every((element) => element !== null && isLiteral(element));\n case AST_NODE_TYPES.ObjectExpression:\n return node.properties.every(\n (property) =>\n property.type === AST_NODE_TYPES.Property &&\n !property.computed &&\n isLiteral(property.value),\n );\n default:\n return false;\n }\n}\n\n/** The `expect(<single argument>)` call a matcher hangs directly off, if any. */\nfunction expectOperand(callee: TSESTree.MemberExpression): TSESTree.Node | null {\n const receiver = callee.object;\n if (\n receiver.type !== AST_NODE_TYPES.CallExpression ||\n receiver.callee.type !== AST_NODE_TYPES.Identifier ||\n receiver.callee.name !== \"expect\" ||\n receiver.arguments.length !== 1\n ) {\n return null;\n }\n return receiver.arguments[0] ?? null;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-tautological-expect\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow an assertion whose operands are all literals; its outcome is fixed before the code runs, so it can never fail.\",\n },\n schema: [],\n messages: {\n tautologicalComparison:\n \"`expect({{operand}}).{{matcher}}({{operand}})` compares a literal with an identical literal — it passes even if the code under test is deleted. Assert on a value the code produced, or delete the test.\",\n tautologicalMatcher:\n \"`expect({{operand}}).{{matcher}}()` asserts on a literal, so its outcome is fixed before the code runs. Assert on a value the code produced, or delete the test.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (!isTestFile(context.filename)) {\n return {};\n }\n /** The operand as written, collapsed to one line and elided for the message. */\n const preview = (node: TSESTree.Node): string => {\n const text = context.sourceCode.getText(node).replaceAll(/\\s+/gu, \" \");\n return text.length > OPERAND_PREVIEW_CHARS\n ? `${text.slice(0, OPERAND_PREVIEW_CHARS)}…`\n : text;\n };\n return {\n CallExpression(node: TSESTree.CallExpression): void {\n const callee = node.callee;\n if (callee.type !== AST_NODE_TYPES.MemberExpression || callee.computed) {\n return;\n }\n if (callee.property.type !== AST_NODE_TYPES.Identifier) {\n return;\n }\n const matcher = callee.property.name;\n const operand = expectOperand(callee);\n if (operand === null || !isLiteral(operand)) {\n return;\n }\n if (ZERO_ARG_MATCHERS.has(matcher) && node.arguments.length === 0) {\n context.report({\n node,\n messageId: \"tautologicalMatcher\",\n data: { operand: preview(operand), matcher },\n });\n return;\n }\n const expected = node.arguments[0];\n if (\n !EQUALITY_MATCHERS.has(matcher) ||\n node.arguments.length !== 1 ||\n expected === undefined ||\n !isLiteral(expected)\n ) {\n return;\n }\n // Textual identity, not structural: `expect(1).toBe(1.0)` is a\n // deliberate statement about representation and is left alone.\n if (context.sourceCode.getText(operand) !== context.sourceCode.getText(expected)) {\n return;\n }\n context.report({\n node,\n messageId: \"tautologicalComparison\",\n data: { operand: preview(operand), matcher },\n });\n },\n };\n },\n});\n","/**\n * @fileoverview no-trailing-value-narration — a trailing comment restating the literal beside it drifts the moment someone edits the arithmetic.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-trailing-value-narration.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-trailing-value-narration.md\n */\n\nimport { type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { codeTokens, hasExternalReference, stem } from \"./_comments.js\";\nimport { isGeneratedFile } from \"./_paths.js\";\n\ntype MessageIds = \"narratesValue\";\ntype Options = readonly [];\n\n// A number that is not part of an identifier or a dotted member path.\nconst NUMBER_RE = /(?<![\\w.])(\\d+(?:\\.\\d+)?)(?![\\w.])/g;\nconst WORD_RE = /[A-Za-z]+(?:'[a-z]+)?|\\d+(?:\\.\\d+)?/g;\n\n// Words that name the unit rather than the quantity — the one thing the code\n// does not say, and the reason the fix is a *name*, not a deletion.\nconst UNIT_WORDS: ReadonlySet<string> = new Set([\n \"bytes\", \"characters\", \"chars\", \"day\", \"days\", \"gb\", \"hour\", \"hours\", \"hr\",\n \"hrs\", \"hz\", \"items\", \"k\", \"kb\", \"khz\", \"m\", \"mb\", \"milliseconds\", \"min\",\n \"mins\", \"minute\", \"minutes\", \"ms\", \"pct\", \"percent\", \"px\", \"retries\", \"rows\",\n \"s\", \"sec\", \"second\", \"seconds\", \"secs\", \"times\", \"tokens\",\n]);\n\nconst STOPWORDS: ReadonlySet<string> = new Set([\n \"a\", \"an\", \"and\", \"are\", \"as\", \"at\", \"be\", \"by\", \"for\", \"in\", \"is\", \"it\",\n \"of\", \"on\", \"or\", \"that\", \"the\", \"this\", \"we\", \"with\",\n]);\n\nconst DIRECTIVE_RE =\n /^\\s*(?:eslint\\b|eslint-|sarj-noqa\\b|@ts-|prettier|biome-|c8\\b|v8\\b|istanbul\\b|todo\\b|fixme\\b|hack\\b|xxx\\b)/i;\n\nfunction numbersIn(text: string): Set<string> {\n return new Set(text.match(NUMBER_RE) ?? []);\n}\n\nfunction narratesValue(body: string, code: string): boolean {\n if (body.length === 0 || DIRECTIVE_RE.test(body) || hasExternalReference(body)) return false;\n const codeNumbers = numbersIn(code);\n if (codeNumbers.size === 0) return false;\n const words = (body.match(WORD_RE) ?? []).map((word) => word.toLowerCase());\n if (words.length === 0) return false;\n const commentNumbers = numbersIn(body);\n if (commentNumbers.size === 0) return false;\n for (const number of commentNumbers) {\n if (!codeNumbers.has(number)) return false;\n }\n const identifiers = codeTokens(code);\n const stems = new Set<string>();\n for (const token of identifiers) stems.add(stem(token));\n return words.every(\n (word) =>\n STOPWORDS.has(word) ||\n UNIT_WORDS.has(word) ||\n commentNumbers.has(word) ||\n identifiers.has(word) ||\n stems.has(stem(word)),\n );\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-trailing-value-narration\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Flag a trailing comment whose every word and number is already on the line it annotates.\",\n },\n schema: [],\n messages: {\n narratesValue:\n \"Trailing comment restates the literal on this line — put the unit in the name (STALE_TIME_MS) so it cannot drift.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (isGeneratedFile(context.filename, context.sourceCode.text)) {\n return {};\n }\n const sourceCode = context.sourceCode;\n\n function isTrailing(comment: TSESTree.Comment): boolean {\n const before = sourceCode.getTokenBefore(comment, { includeComments: false });\n return before !== null && before.loc.end.line === comment.loc.start.line;\n }\n\n return {\n Program(): void {\n for (const comment of sourceCode.getAllComments()) {\n if (!isTrailing(comment)) continue;\n const line = sourceCode.lines[comment.loc.start.line - 1] ?? \"\";\n const code = line.slice(0, comment.loc.start.column);\n const body = comment.value.replace(/^\\*+/, \"\").replace(/\\*+$/, \"\").trim();\n if (narratesValue(body, code)) {\n context.report({ node: comment, messageId: \"narratesValue\" });\n }\n }\n },\n };\n },\n});\n","/**\n * @fileoverview no-declaration-comment-wall — an enum body or class body whose member comments mostly re-spell the members is a wall the reader pays for by the block.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-declaration-comment-wall.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-declaration-comment-wall.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport {\n BARE_LABEL_RE,\n WALL_DEFAULTS,\n WALL_SCHEMA,\n type WallOptions,\n carriesValue,\n commentBody,\n declarationRange,\n isLabel,\n isTagsOnly,\n isWall,\n knownTokens,\n labelStems,\n novelWords,\n} from \"./_comment-wall.js\";\nimport { createRule } from \"./_docs.js\";\nimport { isGeneratedFile, isStoryFile, isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"commentWall\";\n\ntype Options = readonly [Partial<WallOptions>?];\n\n/** A member this rule can judge: something with a name and a source range. */\ninterface Judged {\n readonly node: TSESTree.Node;\n readonly key: TSESTree.Node;\n}\n\nfunction named(node: TSESTree.Node): Judged | undefined {\n switch (node.type) {\n case AST_NODE_TYPES.TSEnumMember:\n return { node, key: node.id };\n case AST_NODE_TYPES.PropertyDefinition:\n case AST_NODE_TYPES.TSAbstractPropertyDefinition:\n case AST_NODE_TYPES.MethodDefinition:\n case AST_NODE_TYPES.TSAbstractMethodDefinition:\n return node.computed ? undefined : { node, key: node.key };\n default:\n return undefined;\n }\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-declaration-comment-wall\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Flag an enum body or class body whose member comments mostly re-spell the members' own names.\",\n },\n schema: [WALL_SCHEMA],\n messages: {\n commentWall:\n \"{{restated}} of this declaration's {{commented}} member comments only re-spell the member's own name — delete them, and keep the rows that say what the name cannot.\",\n },\n },\n defaultOptions: [WALL_DEFAULTS],\n create(context, [provided]) {\n const options: WallOptions = { ...WALL_DEFAULTS, ...provided };\n const sourceCode = context.sourceCode;\n // Generated or vendored, a test fixture, or a demo story: three kinds of\n // file whose member comments are output rather than commentary.\n if (\n isGeneratedFile(context.filename, sourceCode.text) ||\n isTestFile(context.filename) ||\n isStoryFile(context.filename)\n ) {\n return {};\n }\n\n // One pass over the file's comments, indexed by the line they end on (a\n // leading comment) and the line they start on (a trailing one).\n const endingOn = new Map<number, TSESTree.Comment>();\n const startingOn = new Map<number, TSESTree.Comment>();\n for (const comment of sourceCode.getAllComments()) {\n endingOn.set(comment.loc.end.line, comment);\n if (!startingOn.has(comment.loc.start.line)) startingOn.set(comment.loc.start.line, comment);\n }\n\n /**\n * The comment documenting `member`: the block or line comment on the row\n * above it, or the one trailing its last row.\n *\n * A leading comment counts only when the MEMBER starts its own line, and\n * only when the comment is alone on ITS line; a trailing comment counts only\n * when it sits after the member it is read against. Between them no comment\n * can document two members, which is why this rule needs no claim set.\n */\n function documentingComment(member: TSESTree.Node): TSESTree.Comment | undefined {\n const beforeMember = sourceCode.getTokenBefore(member, { includeComments: false });\n const ownsItsLine =\n beforeMember === null || beforeMember.loc.end.line < member.loc.start.line;\n const lead = ownsItsLine ? endingOn.get(member.loc.start.line - 1) : undefined;\n if (lead !== undefined) {\n const before = sourceCode.getTokenBefore(lead, { includeComments: false });\n if (before === null || before.loc.end.line < lead.loc.start.line) return lead;\n }\n const trail = startingOn.get(member.loc.end.line);\n return trail !== undefined && trail.range[0] > member.range[0] ? trail : undefined;\n }\n\n /**\n * True when a comment heads a REGION instead of describing the member under\n * it. The body is ONE bare identifier word; it names something OTHER than\n * the member below it; and it shows region evidence, heading a run of\n * members of which only the first is commented, or set off by a blank line.\n */\n function isGroupLabel(comment: TSESTree.Comment, member: Judged, headsRun: boolean): boolean {\n if (comment.loc.end.line >= member.node.loc.start.line) return false;\n const body = commentBody(comment);\n if (!BARE_LABEL_RE.test(body)) return false;\n if (labelStems(body) === labelStems(sourceCode.getText(member.key))) return false;\n const lineAbove = sourceCode.lines[comment.loc.start.line - 2];\n return headsRun || (lineAbove !== undefined && lineAbove.trim().length === 0);\n }\n\n function check(node: TSESTree.Node, members: readonly TSESTree.Node[]): void {\n const judged = members.map(named).filter((member): member is Judged => member !== undefined);\n if (judged.length === 0) return;\n\n const documented = judged.map((member) => ({\n member,\n comment: documentingComment(member.node),\n }));\n let commented = 0;\n let restated = 0;\n for (const [index, { member, comment }] of documented.entries()) {\n if (comment === undefined) continue;\n const next = documented[index + 1];\n if (isGroupLabel(comment, member, next !== undefined && next.comment === undefined)) {\n continue;\n }\n commented += 1;\n const body = commentBody(comment);\n // A tag block is a directive to a documentation generator, and one\n // content word is a label; neither is a re-spelling of the name.\n if (body.length === 0 || carriesValue(body) || isTagsOnly(body) || isLabel(body)) {\n continue;\n }\n const [start, end] = declarationRange(member.node);\n if (novelWords(body, knownTokens(sourceCode.text.slice(start, end))) <= options.maxNovelWords) {\n restated += 1;\n }\n }\n\n if (!isWall(judged.length, commented, restated, options)) return;\n context.report({\n node,\n loc: {\n start: node.loc.start,\n end: { line: node.loc.start.line, column: node.loc.start.column + 1 },\n },\n messageId: \"commentWall\",\n data: { restated: String(restated), commented: String(commented) },\n });\n }\n\n return {\n ClassBody: (node: TSESTree.ClassBody) => {\n check(node, node.body);\n },\n TSEnumDeclaration: (node: TSESTree.TSEnumDeclaration) => {\n check(node, node.body.members);\n },\n };\n },\n});\n","/**\n * @fileoverview _comment-wall — the shared judgement behind the comment-VOLUME rules: a run of member comments that mostly re-spell their members is a wall.\n *\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/_comment-wall.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { isProtected, splitIdentifier, stem } from \"./_comments.js\";\n\n/** Every threshold the wall rules apply; each is documented at `WALL_DEFAULTS`. */\nexport interface WallOptions {\n readonly minCommentedMembers: number;\n readonly minCommentedRatio: number;\n readonly minRestatedRatio: number;\n readonly maxNovelWords: number;\n}\n\nexport const WALL_DEFAULTS: WallOptions = {\n // Below three rows \"a wall\" is not a fair description of what the reader sees.\n minCommentedMembers: 3,\n // A minority of commented members is a GROUP LABEL, not a wall.\n minCommentedRatio: 0.6,\n // Room for one substantive row in four; a declaration where a quarter of the\n // comments say something real is one someone was documenting, not decorating.\n minRestatedRatio: 0.75,\n // One word beyond the member's own text. Zero is `no-restated-jsdoc`'s test\n // and is already covered there; two admits definitions (\"Partial match\"\n // beside \"Exact match\").\n maxNovelWords: 1,\n};\n\n/** The `meta.schema` entry both wall rules expose, so the knobs cannot drift. */\nexport const WALL_SCHEMA = {\n type: \"object\",\n additionalProperties: false,\n properties: {\n minCommentedMembers: {\n type: \"integer\",\n minimum: 2,\n description: \"Fewest commented members that can count as a wall.\",\n },\n minCommentedRatio: {\n type: \"number\",\n minimum: 0,\n maximum: 1,\n description:\n \"Least share of the members that must be commented; below it the comments are group labels.\",\n },\n minRestatedRatio: {\n type: \"number\",\n minimum: 0,\n maximum: 1,\n description: \"Least share of the member comments that must be restatements.\",\n },\n maxNovelWords: {\n type: \"integer\",\n minimum: 0,\n description:\n \"Most content words a comment may add beyond its member's own source and still count as a restatement.\",\n },\n },\n} as const;\n\n// Tags that carry what the signature cannot. `no-restated-jsdoc` reaches the\n// same verdict by a different route — anything outside the small set of tags it\n// models leaves the block alone — so there is no shared list to drift against,\n// and this one stands on its own.\nconst VALUE_TAG_RE =\n /@(?:deprecated|see|example|throws|remarks|since|default|defaultvalue|link|internal|alpha|beta|experimental|template|typeparam|inheritdoc|todo|fixme|override)\\b/i;\n\n// A documented default. The default of an optional member is precisely the fact\n// its type cannot hold.\nconst DEFAULT_RE = /^\\s*@?default\\b|\\bdefaults? (?:to|:)/i;\n\n// A digit is a bound, a base, an index origin, a status code or a version — all\n// facts about the world rather than about the name. A unit word is the same fact\n// spelled without one.\nconst DIGIT_RE = /\\d/;\nconst UNIT_WORD_RE =\n /\\b(?:ms|milliseconds?|seconds?|minutes?|hours?|days?|weeks?|months?|years?|bytes?|kb|mb|gb|percent|pixels?|px|utc|epoch)\\b/i;\n\n// A quoted example value or an `e.g.` enumerates what the type only bounds.\nconst EXAMPLE_RE = /[\"'`]|\\be\\.g\\.|\\bi\\.e\\./;\n\n// Every word of the body belongs to a JSDoc tag, so the block is an instruction\n// to a documentation generator rather than a sentence about the member.\nconst TAG_TOKEN_RE = /@\\w+/g;\n\n// A rule of dashes is a banner; `no-comment-cruft` owns that shape.\nconst BANNER_RE = /[=\\-─-╿*#~_.]{3,}/;\n\n// Prose the tokenizer cannot read, so \"adds no new word\" is unmeasurable.\nconst NON_ASCII_LETTER_RE = /[^\\p{ASCII}\\p{N}\\p{P}\\p{Z}]/u;\n\n/**\n * Filler that says nothing about *which* member is being described. Wider than\n * `_comments.STOPWORDS` for the same reason `no-restated-jsdoc`'s list is:\n * member documentation conventionally repeats the vocabulary of the type system\n * itself (\"the optional callback value\") without that being a claim.\n *\n * Deliberately absent: `class`, `method`, `function`, `component`, `hook`,\n * `parameter`, `argument`. In a reflection or decorator type those words are the\n * whole claim — `Function` cannot say \"class\" and `number` cannot say\n * \"parameter\". The tag words `param` and `arg` stay: block punctuation, not\n * prose.\n */\nexport const WALL_STOPWORDS: ReadonlySet<string> = new Set(\n `the a an of to for in on with and or as at by is are was be been being\n this that it its if whether when where which what will would can could should\n must may into from over about not no does do done has have had used use uses\n using given provided specified current new existing all any each per via\n instance object value values data item\n items element callback handler prop props param arg return\n returns returning result optional required true false null undefined\n string number boolean array list promise set map record type name`.split(/\\s+/),\n);\n\nconst WORD_RE = /[A-Za-z][A-Za-z0-9]*/g;\n\n// A label is one bare identifier word: `// links`, `// clientMiddleware`. Two\n// words of prose is already a sentence about the member below it.\nexport const BARE_LABEL_RE = /^[A-Za-z][A-Za-z0-9]*$/;\n\n/** The identifier `body` spells, folded so `links` and `Links` are one word. */\nexport function labelStems(body: string): string {\n return splitIdentifier(body).map(stem).join(\" \");\n}\n\n/** Strip the `*` decoration off a block comment so JSDoc and `//` read alike. */\nexport function commentBody(comment: TSESTree.Comment): string {\n return comment.value\n .replace(/^\\*+/, \"\")\n .replace(/^[ \\t]*\\*[ \\t]?/gm, \"\")\n .trim();\n}\n\n/**\n * True when a member comment carries something a name and a type cannot — the\n * exemption floor shared by both wall rules. Counted as a comment, never as a\n * restatement.\n *\n * `isLabel` and `isTagsOnly` are deliberately NOT folded in here. On an object\n * TYPE a one-word comment really is a name restatement (`// links` over\n * `links`), which that rule's own group-label guard separates; the populations\n * that spell mapping tables that way belong to its sibling.\n */\nexport function carriesValue(body: string): boolean {\n return (\n isProtected(body) ||\n VALUE_TAG_RE.test(body) ||\n DEFAULT_RE.test(body) ||\n DIGIT_RE.test(body) ||\n UNIT_WORD_RE.test(body) ||\n EXAMPLE_RE.test(body) ||\n BANNER_RE.test(body) ||\n NON_ASCII_LETTER_RE.test(body)\n );\n}\n\n/**\n * True when `body` is one content word or fewer — a LABEL or a tag, never a\n * description of the member below it.\n *\n * With `maxNovelWords` at one, a single novel word scores as a restatement by\n * arithmetic rather than by meaning. One word beside a key is the opposite of a\n * re-spelling: it is the one thing the key does not say.\n */\nexport function isLabel(body: string): boolean {\n let content = 0;\n for (const word of body.match(WORD_RE) ?? []) {\n if (word.length >= 2 && !WALL_STOPWORDS.has(word.toLowerCase())) content += 1;\n }\n return content <= 1;\n}\n\n/** True when `body` carries no prose at all beyond its JSDoc tags. */\nexport function isTagsOnly(body: string): boolean {\n return body.length > 0 && body.replace(TAG_TOKEN_RE, \"\").trim().length === 0;\n}\n\n/** Every identifier part of a slice of source, plus its stem. */\nexport function knownTokens(source: string): ReadonlySet<string> {\n const tokens = new Set<string>();\n for (const identifier of source.match(/[A-Za-z_$][\\w$]*/g) ?? []) {\n for (const part of splitIdentifier(identifier)) {\n tokens.add(part);\n tokens.add(stem(part));\n }\n }\n return tokens;\n}\n\n/** Content words of `body` that do not already appear in `known`. */\nexport function novelWords(body: string, known: ReadonlySet<string>): number {\n let novel = 0;\n for (const word of body.match(WORD_RE) ?? []) {\n const lower = word.toLowerCase();\n if (lower.length < 2 || WALL_STOPWORDS.has(lower)) continue;\n if (!known.has(lower) && !known.has(stem(lower))) novel += 1;\n }\n return novel;\n}\n\n/**\n * True when a run of members carrying `commented` comments, `restated` of them\n * restatements, is a wall under `options`.\n */\nexport function isWall(\n members: number,\n commented: number,\n restated: number,\n options: WallOptions,\n): boolean {\n return (\n commented >= options.minCommentedMembers &&\n commented / members >= options.minCommentedRatio &&\n restated / commented >= options.minRestatedRatio\n );\n}\n\nconst OPAQUE_VALUE_TYPES: ReadonlySet<AST_NODE_TYPES> = new Set([\n AST_NODE_TYPES.FunctionExpression,\n AST_NODE_TYPES.ArrowFunctionExpression,\n AST_NODE_TYPES.ObjectExpression,\n AST_NODE_TYPES.ArrayExpression,\n]);\n\n/**\n * The part of a member a reader reads as its DECLARATION — the key, the type\n * annotation and, for a callable, the parameter list.\n *\n * A method body, an object value and an array value are all deliberately\n * excluded. Each names every identifier it touches, so reading a comment against\n * one makes almost any comment \"already said\": the token set stops being the\n * member's own words and becomes the value's. A label naming what a nested\n * object configures shares its vocabulary with that object and with nothing in\n * the name it labels.\n */\nexport function declarationRange(member: TSESTree.Node): [number, number] {\n const body = bodyOf(member);\n if (body === undefined) return [member.range[0], member.range[1]];\n return [member.range[0], body.range[0]];\n}\n\nfunction bodyOf(member: TSESTree.Node): TSESTree.Node | undefined {\n if (\n member.type === AST_NODE_TYPES.MethodDefinition ||\n member.type === AST_NODE_TYPES.TSAbstractMethodDefinition\n ) {\n return member.value.body ?? undefined;\n }\n if (member.type === AST_NODE_TYPES.Property || member.type === AST_NODE_TYPES.PropertyDefinition) {\n const value = member.value;\n if (value !== null && OPAQUE_VALUE_TYPES.has(value.type)) return value;\n }\n return undefined;\n}\n","/**\n * @fileoverview no-type-member-comment-wall — an object type whose member comments mostly re-spell the members is a wall the reader pays for by the block.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-type-member-comment-wall.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-type-member-comment-wall.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\n\nimport {\n BARE_LABEL_RE,\n WALL_DEFAULTS,\n WALL_SCHEMA,\n type WallOptions,\n carriesValue,\n commentBody,\n isWall,\n knownTokens,\n labelStems,\n novelWords,\n} from \"./_comment-wall.js\";\nimport { isGeneratedFile, isStoryFile, isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"commentWall\";\n\ntype Options = readonly [Partial<WallOptions>?];\n\n/** A member the rule can judge: a named property or method signature. */\ntype NamedMember = TSESTree.TSPropertySignature | TSESTree.TSMethodSignature;\n\nfunction isNamedMember(node: TSESTree.TypeElement): node is NamedMember {\n return (\n (node.type === AST_NODE_TYPES.TSPropertySignature ||\n node.type === AST_NODE_TYPES.TSMethodSignature) &&\n !node.computed\n );\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-type-member-comment-wall\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Flag an object type whose member comments mostly re-spell the members' own names and types.\",\n },\n schema: [WALL_SCHEMA],\n messages: {\n commentWall:\n \"{{restated}} of this type's {{commented}} member comments only re-spell the member's own name and type — delete them, and keep the rows that say what the name cannot.\",\n },\n },\n defaultOptions: [WALL_DEFAULTS],\n create(context, [provided]) {\n const options: WallOptions = { ...WALL_DEFAULTS, ...provided };\n const sourceCode = context.sourceCode;\n // Generated or vendored, a test fixture, or a demo story: three kinds of\n // file whose member comments are output rather than commentary.\n if (\n isGeneratedFile(context.filename, sourceCode.text, [\"externalTree\"]) ||\n isTestFile(context.filename, [\"fixtureTree\"]) ||\n isStoryFile(context.filename, [\"storyTree\"])\n ) {\n return {};\n }\n\n // One pass over the file's comments, indexed by the line they end on (a\n // leading comment) and the line they start on (a trailing one).\n const endingOn = new Map<number, TSESTree.Comment>();\n const startingOn = new Map<number, TSESTree.Comment>();\n for (const comment of sourceCode.getAllComments()) {\n endingOn.set(comment.loc.end.line, comment);\n if (!startingOn.has(comment.loc.start.line)) startingOn.set(comment.loc.start.line, comment);\n }\n\n /**\n * The comment documenting `member`: the block or line comment on the row\n * above it, or the one trailing its last row.\n *\n * A leading comment counts only when the MEMBER starts its own line, and\n * only when the comment is alone on ITS line; a trailing comment counts\n * only when it sits after the member it is read against. All three keep a\n * one-line type literal under a doc block from reading as three members\n * documented three times with the same words.\n */\n function documentingComment(member: NamedMember): TSESTree.Comment | undefined {\n const beforeMember = sourceCode.getTokenBefore(member, { includeComments: false });\n const ownsItsLine =\n beforeMember === null || beforeMember.loc.end.line < member.loc.start.line;\n const lead = ownsItsLine ? endingOn.get(member.loc.start.line - 1) : undefined;\n if (lead !== undefined) {\n const before = sourceCode.getTokenBefore(lead, { includeComments: false });\n if (before === null || before.loc.end.line < lead.loc.start.line) return lead;\n }\n const trail = startingOn.get(member.loc.end.line);\n return trail !== undefined && trail.range[0] > member.range[0] ? trail : undefined;\n }\n\n /**\n * True when a comment heads a REGION of the type instead of describing the\n * member under it — the exemption this rule documents and, before this\n * check, leaked on.\n *\n * Three conditions. The body is ONE bare identifier word; it names\n * something OTHER than the member below it (the decisive one — `// links`\n * over `LinkDescriptors` heads a group, `// links` over `links` restates a\n * name); and it shows region evidence, heading a run of members of which\n * only the first is commented, or set off by a blank line.\n */\n function isGroupLabel(\n comment: TSESTree.Comment,\n member: NamedMember,\n headsRun: boolean,\n ): boolean {\n if (comment.loc.end.line >= member.loc.start.line) return false;\n const body = commentBody(comment);\n if (!BARE_LABEL_RE.test(body)) return false;\n if (labelStems(body) === labelStems(sourceCode.getText(member.key))) return false;\n const lineAbove = sourceCode.lines[comment.loc.start.line - 2];\n return headsRun || (lineAbove !== undefined && lineAbove.trim().length === 0);\n }\n\n function check(node: TSESTree.TSInterfaceBody | TSESTree.TSTypeLiteral): void {\n const members = node.type === AST_NODE_TYPES.TSInterfaceBody ? node.body : node.members;\n const named = members.filter(isNamedMember);\n if (named.length === 0) return;\n\n const documented = named.map((member) => ({ member, comment: documentingComment(member) }));\n let commented = 0;\n let restated = 0;\n // A comment documents at most one member, so a shared block cannot be\n // counted once per member that happens to sit next to it.\n const claimed = new Set<TSESTree.Comment>();\n for (const [index, { member, comment }] of documented.entries()) {\n if (comment === undefined || claimed.has(comment)) continue;\n const next = documented[index + 1];\n if (isGroupLabel(comment, member, next !== undefined && next.comment === undefined)) {\n continue;\n }\n claimed.add(comment);\n commented += 1;\n const body = commentBody(comment);\n if (body.length === 0 || carriesValue(body)) continue;\n if (novelWords(body, knownTokens(sourceCode.getText(member))) <= options.maxNovelWords) {\n restated += 1;\n }\n }\n\n if (!isWall(named.length, commented, restated, options)) return;\n context.report({\n node,\n loc: {\n start: node.loc.start,\n end: { line: node.loc.start.line, column: node.loc.start.column + 1 },\n },\n messageId: \"commentWall\",\n data: { restated: String(restated), commented: String(commented) },\n });\n }\n\n return {\n TSInterfaceBody: check,\n TSTypeLiteral: check,\n };\n },\n});\n","/**\n * @fileoverview no-unnecessary-use-client — a `'use client'` file with no hooks, handlers or browser globals ships to the client for nothing.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-unnecessary-use-client.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-unnecessary-use-client.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport type { RuleContext, Scope } from \"@typescript-eslint/utils/ts-eslint\";\n\ntype MessageIds = \"unnecessaryUseClient\";\ntype Options = readonly [];\n\nconst HOOK_REGEX = /^use([A-Z]|$)/;\nconst EVENT_PROP_REGEX = /^on[A-Z]/;\nconst ERROR_FILE_REGEX = /\\b(?:global-)?error\\.[jt]sx?$/;\n\nconst BROWSER_GLOBALS: ReadonlySet<string> = new Set([\n \"window\",\n \"document\",\n \"navigator\",\n \"localStorage\",\n \"sessionStorage\",\n \"location\",\n \"history\",\n \"screen\",\n \"requestAnimationFrame\",\n \"cancelAnimationFrame\",\n \"CustomEvent\",\n \"Event\",\n \"MouseEvent\",\n \"KeyboardEvent\",\n \"TouchEvent\",\n]);\n\n/**\n * Modules whose very import forces a client boundary, independent of what the\n * file then does with them. `next/dynamic` is the case that matters: in the App\n * Router, `dynamic(..., { ssr: false })` is a BUILD ERROR in a Server Component\n * (\"`ssr: false` is not allowed with `next/dynamic` in Server Components\"), so a\n * lazy-wrapper module has no legal form without `'use client'`.\n */\nconst CLIENT_REQUIRED_MODULES: ReadonlySet<string> = new Set([\"next/dynamic\"]);\n\nconst CLIENT_ONLY_PACKAGES_REGEX =\n /^(?:@radix-ui\\/|framer-motion|react-dom|react-day-picker|@floating-ui\\/|react-select|react-toastify|react-hook-form|recharts|react-dropzone|react-slick|react-swipeable|react-resizable|react-draggable|react-beautiful-dnd|@hello-pangea\\/dnd|react-virtualized|react-window|@tanstack\\/react-table|@tanstack\\/react-query|react-redux|recoil|jotai|zustand|@tippyjs\\/react|react-color|react-datepicker|next-themes|react-helmet|react-helmet-async|styled-components|@emotion\\/)/;\n\ntype Ctx = Readonly<RuleContext<MessageIds, Options>>;\n\n/**\n * True for a package specifier — anything that is not a relative path or one of\n * the usual in-repo alias prefixes. A relative/aliased import points at code in\n * this repo, which this same rule already lints, so the \"cannot see into the\n * dependency\" argument does not apply to it.\n */\nconst isBareSpecifier = (source: string): boolean =>\n !source.startsWith(\".\") && !source.startsWith(\"/\") && !source.startsWith(\"@/\") && !source.startsWith(\"~\");\n\n/** The leftmost identifier of a JSX element name: `Primitive.Tabs` -> `Primitive`. */\nconst jsxRootName = (name: TSESTree.JSXTagNameExpression): string => {\n let current: TSESTree.JSXTagNameExpression = name;\n while (current.type === AST_NODE_TYPES.JSXMemberExpression) {\n current = current.object;\n }\n return current.type === AST_NODE_TYPES.JSXIdentifier ? current.name : \"\";\n};\n\n/** True when any identifier in `node`'s subtree names an imported binding. */\nconst subtreeReadsImportedBinding = (\n node: TSESTree.Node,\n imported: ReadonlySet<string>,\n): boolean => {\n if (node.type === AST_NODE_TYPES.Identifier) {\n return imported.has(node.name);\n }\n for (const key of Object.keys(node) as (keyof TSESTree.Node)[]) {\n if (key === \"parent\") continue;\n const value = node[key];\n for (const child of (Array.isArray(value) ? value : [value]) as unknown[]) {\n if (\n child !== null &&\n typeof child === \"object\" &&\n typeof (child as { type?: unknown }).type === \"string\" &&\n subtreeReadsImportedBinding(child as TSESTree.Node, imported)\n ) {\n return true;\n }\n }\n }\n return false;\n};\n\nconst isUseClientDirective = (\n node: TSESTree.Statement,\n): node is TSESTree.ExpressionStatement => {\n return (\n node.type === AST_NODE_TYPES.ExpressionStatement &&\n node.expression.type === AST_NODE_TYPES.Literal &&\n node.expression.value === \"use client\"\n );\n};\n\nconst isGlobalReference = (\n node: TSESTree.Identifier,\n context: Ctx,\n): boolean => {\n if (!BROWSER_GLOBALS.has(node.name)) return false;\n\n const parent = node.parent;\n if (parent !== undefined) {\n // `obj.window` — `window` is a property name, not a global reference.\n if (\n parent.type === AST_NODE_TYPES.MemberExpression &&\n parent.property === node &&\n !parent.computed\n ) {\n return false;\n }\n // `{ window: ... }` — property key, not a global reference.\n if (\n parent.type === AST_NODE_TYPES.Property &&\n parent.key === node &&\n !parent.computed\n ) {\n return false;\n }\n // Type annotations / type-only positions are not runtime references.\n if (parent.type.startsWith(\"TS\")) {\n return false;\n }\n }\n\n // If there's a local binding for this name anywhere up the chain, it's not\n // a reference to the browser global.\n let scope: Scope.Scope | null = context.sourceCode.getScope(node);\n while (scope !== null) {\n const variable = scope.set.get(node.name);\n if (variable !== undefined && variable.defs.length > 0) {\n return false;\n }\n scope = scope.upper;\n }\n\n return true;\n};\n\nexport default createRule<Options, MessageIds>({\n name: \"no-unnecessary-use-client\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Flag `'use client'` files with no hooks or event handlers — they could be RSC.\",\n },\n schema: [],\n messages: {\n unnecessaryUseClient:\n \"'use client' directive but no hooks (use*), JSX event handlers (on*), browser globals, or client-only imports found. Consider removing the directive and serving as a React Server Component.\",\n },\n },\n defaultOptions: [],\n create(context) {\n const filename = context.filename;\n if (ERROR_FILE_REGEX.test(filename)) {\n return {};\n }\n\n let directiveNode: TSESTree.ExpressionStatement | null = null;\n let hasClientIndicator = false;\n /** Every local name bound by an import, whatever the module. */\n const importedLocals = new Set<string>();\n /** Locals bound from a BARE (third-party) specifier — see @fileoverview. */\n const externalLocals = new Set<string>();\n\n const markIfHookOrContext = (\n callee: TSESTree.CallExpression[\"callee\"],\n ): void => {\n if (callee.type === AST_NODE_TYPES.Identifier) {\n if (HOOK_REGEX.test(callee.name) || callee.name === \"createContext\") {\n hasClientIndicator = true;\n }\n return;\n }\n if (\n callee.type === AST_NODE_TYPES.MemberExpression &&\n callee.property.type === AST_NODE_TYPES.Identifier\n ) {\n const name = callee.property.name;\n if (HOOK_REGEX.test(name) || name === \"createContext\") {\n hasClientIndicator = true;\n }\n }\n };\n\n return {\n Program(node): void {\n for (const stmt of node.body) {\n // Directives must be the first statements; once we see a non-\n // ExpressionStatement, stop scanning.\n if (stmt.type !== AST_NODE_TYPES.ExpressionStatement) break;\n if (isUseClientDirective(stmt)) {\n directiveNode = stmt;\n break;\n }\n }\n },\n CallExpression(node): void {\n // The `Program` visitor (entered first) has already determined whether\n // this file has a `'use client'` directive. If it doesn't, the result\n // can't change — skip all of the per-node indicator work, including the\n // hot scope-resolution in the `Identifier` visitor below.\n if (directiveNode === null) return;\n markIfHookOrContext(node.callee);\n },\n JSXAttribute(node): void {\n if (directiveNode === null) return;\n if (\n node.name.type === AST_NODE_TYPES.JSXIdentifier &&\n EVENT_PROP_REGEX.test(node.name.name)\n ) {\n hasClientIndicator = true;\n }\n },\n ImportDeclaration(node): void {\n if (directiveNode === null) return;\n if (typeof node.source.value !== \"string\") return;\n const source = node.source.value;\n if (\n CLIENT_ONLY_PACKAGES_REGEX.test(source) ||\n CLIENT_REQUIRED_MODULES.has(source)\n ) {\n hasClientIndicator = true;\n }\n for (const specifier of node.specifiers) {\n importedLocals.add(specifier.local.name);\n if (isBareSpecifier(source)) {\n externalLocals.add(specifier.local.name);\n }\n }\n },\n JSXOpeningElement(node): void {\n if (directiveNode === null) return;\n // Indicator 1: rendering a third-party component — this rule cannot see\n // whether the dependency itself needs a client boundary.\n if (externalLocals.has(jsxRootName(node.name))) {\n hasClientIndicator = true;\n }\n },\n ExportNamedDeclaration(node): void {\n if (directiveNode === null) return;\n if (node.source !== null) {\n hasClientIndicator = true;\n return;\n }\n // Indicator 2: `export const X = SomeImport.X` — a re-export written\n // the long way, so it must agree with the `export … from` branch above.\n if (\n node.declaration !== null &&\n subtreeReadsImportedBinding(node.declaration, importedLocals)\n ) {\n hasClientIndicator = true;\n }\n },\n ExportAllDeclaration(node): void {\n if (directiveNode === null) return;\n if (node.source !== null) {\n hasClientIndicator = true;\n }\n },\n ClassDeclaration(): void {\n if (directiveNode === null) return;\n hasClientIndicator = true;\n },\n ClassExpression(): void {\n if (directiveNode === null) return;\n hasClientIndicator = true;\n },\n Identifier(node): void {\n if (directiveNode === null) return;\n if (isGlobalReference(node, context)) {\n hasClientIndicator = true;\n }\n },\n \"Program:exit\"(): void {\n if (directiveNode !== null && !hasClientIndicator) {\n context.report({\n node: directiveNode,\n messageId: \"unnecessaryUseClient\",\n });\n }\n },\n };\n },\n});\n","/**\n * @fileoverview no-unsafe-mock-casting — a cast to `vi.Mock` / `jest.Mock` asserts a mock that may not exist; `vi.mocked()` checks it.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-unsafe-mock-casting.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-unsafe-mock-casting.md\n */\n\nimport { type TSESTree } from \"@typescript-eslint/utils\";\nimport { AST_NODE_TYPES } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isGeneratedFile } from \"./_paths.js\";\n\ntype MessageIds = \"unsafeMockCast\";\n\nfunction isMockTypeReference(node: TSESTree.TypeNode): boolean {\n if (node.type !== AST_NODE_TYPES.TSTypeReference) {\n return false;\n }\n \n const typeName = node.typeName;\n \n if (typeName.type === AST_NODE_TYPES.Identifier) {\n const name = typeName.name;\n return name === \"Mock\" || name === \"MockInstance\" || name === \"SpyInstance\";\n }\n \n if (typeName.type === AST_NODE_TYPES.TSQualifiedName) {\n const rightName = typeName.right.name;\n return rightName === \"Mock\" || rightName === \"MockInstance\" || rightName === \"SpyInstance\";\n }\n \n return false;\n}\n\nexport default createRule<[], MessageIds>({\n name: \"no-unsafe-mock-casting\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow casting to mock types like `jest.Mock` or `vi.Mock`. Use `vi.mocked()` or `jest.mocked()` instead.\",\n },\n schema: [],\n messages: {\n unsafeMockCast:\n \"Do not cast to a Mock type. Use `vi.mocked(fn)` or `jest.mocked(fn)` instead to preserve type safety.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (isGeneratedFile(context.filename, context.sourceCode.text)) {\n return {};\n }\n\n function checkAssertion(\n node: TSESTree.TSAsExpression | TSESTree.TSTypeAssertion,\n ): void {\n if (isMockTypeReference(node.typeAnnotation)) {\n context.report({ node, messageId: \"unsafeMockCast\" });\n }\n }\n\n return {\n TSAsExpression: checkAssertion,\n TSTypeAssertion: checkAssertion,\n };\n },\n});\n","/**\n * @fileoverview no-zod-native-enum — `z.nativeEnum` exists to wrap a TypeScript `enum`, which `no-enum` already bans.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-zod-native-enum.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-zod-native-enum.md\n */\n\nimport {\n ESLintUtils,\n type TSESLint,\n type TSESTree,\n type ParserServicesWithTypeInformation,\n AST_NODE_TYPES,\n} from \"@typescript-eslint/utils\";\nimport * as ts from \"typescript\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"nativeEnum\" | \"enumOfTsEnum\";\ntype Options = readonly [];\n\nconst IGNORE_PATTERNS: readonly RegExp[] = [\n /[\\\\/]generated[\\\\/]/,\n /\\.gen\\.tsx?$/,\n /\\.generated\\.tsx?$/,\n /\\.d\\.ts$/,\n];\n\nfunction isIgnoredFile(filename: string, sourceText: string): boolean {\n if (IGNORE_PATTERNS.some((re) => re.test(filename))) {\n return true;\n }\n return /@generated\\b/.test(sourceText.slice(0, 1024));\n}\n\n/** `zod`, `zod/v4`, `zod/mini`, `@hono/zod-openapi`, `@/lib/zod`, ... */\nfunction isZodModule(source: string): boolean {\n return /(^|[/@-])zod([/-]|$)/.test(source);\n}\n\n/** Unwraps `x as const` / `x satisfies T` / `(x)` down to the inner expression. */\nfunction unwrap(node: TSESTree.Expression): TSESTree.Expression {\n if (\n node.type === AST_NODE_TYPES.TSAsExpression ||\n node.type === AST_NODE_TYPES.TSSatisfiesExpression\n ) {\n return unwrap(node.expression);\n }\n return node;\n}\n\n/**\n * The string values of an object literal whose every property is a plain\n * `key: \"literal\"` pair, as raw source text (so quote style survives the fix).\n * Returns null when any member is a spread, a computed key, a method, a\n * shorthand, or a non-string value — those sets are not statically rewritable.\n */\nfunction stringValueTexts(\n node: TSESTree.ObjectExpression,\n sourceCode: Readonly<TSESLint.SourceCode>,\n): string[] | null {\n const texts: string[] = [];\n for (const prop of node.properties) {\n if (prop.type !== AST_NODE_TYPES.Property) {\n return null;\n }\n if (prop.computed || prop.shorthand || prop.method || prop.kind !== \"init\") {\n return null;\n }\n const value = prop.value;\n if (\n value.type !== AST_NODE_TYPES.Literal ||\n typeof value.value !== \"string\"\n ) {\n return null;\n }\n const text = sourceCode.getText(value);\n if (!texts.includes(text)) {\n texts.push(text);\n }\n }\n return texts.length > 0 ? texts : null;\n}\n\n/** Resolves an identifier to a `TSEnumDeclaration` declared in this file. */\nfunction resolvesToLocalEnum(\n node: TSESTree.Identifier,\n scope: TSESLint.Scope.Scope,\n): boolean {\n let current: TSESLint.Scope.Scope | null = scope;\n while (current !== null) {\n const variable = current.variables.find((v) => v.name === node.name);\n if (variable !== undefined) {\n return variable.defs.some(\n (def) => def.node.type === AST_NODE_TYPES.TSEnumDeclaration,\n );\n }\n current = current.upper;\n }\n return false;\n}\n\nconst ENUM_SYMBOL_FLAGS =\n ts.SymbolFlags.RegularEnum | ts.SymbolFlags.ConstEnum | ts.SymbolFlags.Enum;\n\n/**\n * Whether the identifier's resolved symbol is a TypeScript enum, following\n * import aliases. Catches `import { Status } from \"./types\"; z.enum(Status)`,\n * which lexical resolution alone cannot see.\n */\nfunction resolvesToImportedEnum(\n node: TSESTree.Identifier,\n services: ParserServicesWithTypeInformation,\n): boolean {\n const checker = services.program.getTypeChecker();\n const tsNode = services.esTreeNodeToTSNodeMap.get(node);\n let symbol = checker.getSymbolAtLocation(tsNode);\n if (symbol === undefined) {\n return false;\n }\n if ((symbol.flags & ts.SymbolFlags.Alias) !== 0) {\n symbol = checker.getAliasedSymbol(symbol);\n }\n return (symbol.flags & ENUM_SYMBOL_FLAGS) !== 0;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-zod-native-enum\",\n meta: {\n type: \"suggestion\",\n fixable: \"code\",\n docs: {\n description:\n \"Disallow `z.nativeEnum()` (and `z.enum()` over a TypeScript enum); use `z.enum([\\\"a\\\", \\\"b\\\"])` with a string-literal union instead.\",\n },\n schema: [],\n messages: {\n nativeEnum:\n '`z.nativeEnum()` exists to wrap a TypeScript `enum`, which `no-enum` bans. Use `z.enum([\"a\", \"b\"])` and derive the union with `z.infer<typeof Schema>`.',\n enumOfTsEnum:\n '`z.enum()` is being passed the TypeScript enum `{{name}}`, which `no-enum` bans. Pass a string-literal array instead: `z.enum([\"a\", \"b\"])`.',\n },\n },\n defaultOptions: [],\n create(context) {\n const sourceCode = context.sourceCode;\n if (isIgnoredFile(context.filename, sourceCode.getText())) {\n return {};\n }\n // A test that covers `z.nativeEnum` must call it; see @fileoverview.\n if (isTestFile(context.filename)) {\n return {};\n }\n\n let services: ParserServicesWithTypeInformation | null;\n try {\n services = ESLintUtils.getParserServices(context);\n } catch {\n services = null;\n }\n\n /** Local names imported from a zod module, e.g. `nativeEnum`, `enum_`. */\n const zodImportedNames = new Map<string, string>();\n\n function isZodMemberCall(node: TSESTree.CallExpression, api: string): boolean {\n const callee = node.callee;\n if (\n callee.type === AST_NODE_TYPES.MemberExpression &&\n !callee.computed &&\n callee.property.type === AST_NODE_TYPES.Identifier\n ) {\n return callee.property.name === api;\n }\n if (callee.type === AST_NODE_TYPES.Identifier) {\n return zodImportedNames.get(callee.name) === api;\n }\n return false;\n }\n\n function buildFix(\n node: TSESTree.CallExpression,\n ): TSESLint.ReportFixFunction | null {\n // A bare `nativeEnum(...)` imported from zod cannot be renamed in place —\n // `enum` is a reserved word, so there is no bare callee to rewrite to.\n // Rewriting only the argument would leave a `nativeEnum` call taking an\n // array, so this shape is report-only.\n const callee = node.callee;\n if (\n callee.type !== AST_NODE_TYPES.MemberExpression ||\n callee.property.type !== AST_NODE_TYPES.Identifier\n ) {\n return null;\n }\n const arg = node.arguments[0];\n if (\n arg === undefined ||\n node.arguments.length !== 1 ||\n arg.type === AST_NODE_TYPES.SpreadElement\n ) {\n return null;\n }\n const inner = unwrap(arg);\n if (inner.type !== AST_NODE_TYPES.ObjectExpression) {\n return null;\n }\n const values = stringValueTexts(inner, sourceCode);\n if (values === null) {\n return null;\n }\n const property = callee.property;\n const replacementArg = `[${values.join(\", \")}]`;\n return (fixer) => [\n fixer.replaceText(property, \"enum\"),\n fixer.replaceText(arg, replacementArg),\n ];\n }\n\n return {\n ImportDeclaration(node: TSESTree.ImportDeclaration): void {\n if (!isZodModule(node.source.value)) {\n return;\n }\n for (const spec of node.specifiers) {\n if (\n spec.type === AST_NODE_TYPES.ImportSpecifier &&\n spec.imported.type === AST_NODE_TYPES.Identifier\n ) {\n zodImportedNames.set(spec.local.name, spec.imported.name);\n }\n }\n },\n\n CallExpression(node: TSESTree.CallExpression): void {\n if (isZodMemberCall(node, \"nativeEnum\")) {\n const fix = buildFix(node);\n context.report({\n node,\n messageId: \"nativeEnum\",\n ...(fix === null ? {} : { fix }),\n });\n return;\n }\n\n if (!isZodMemberCall(node, \"enum\")) {\n return;\n }\n const arg = node.arguments[0];\n if (arg === undefined || arg.type !== AST_NODE_TYPES.Identifier) {\n return;\n }\n const isEnum =\n resolvesToLocalEnum(arg, sourceCode.getScope(arg)) ||\n (services !== null && resolvesToImportedEnum(arg, services));\n if (isEnum) {\n context.report({\n node,\n messageId: \"enumOfTsEnum\",\n data: { name: arg.name },\n });\n }\n },\n };\n },\n});\n","/**\n * @fileoverview prefer-constant-time-secret-compare — `===` on a secret short-circuits on the first differing byte, so the response time leaks the secret.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/prefer-constant-time-secret-compare.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/prefer-constant-time-secret-compare.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isAuthSecretName } from \"./_secret-names.js\";\nimport { isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"preferConstantTimeSecretCompare\";\ntype Options = readonly [];\n\nconst EQUALITY_OPERATORS: ReadonlySet<string> = new Set([\"===\", \"!==\", \"==\", \"!=\"]);\n\n/**\n * Identifiers that are compile-time sentinels rather than runtime values.\n * `undefined`/`NaN` make the comparison a presence check; an ALL-CAPS name is a\n * named constant or enum member (`TOKEN_TYPE_SYSTEM`), and timing a compare\n * against a value the attacker already knows leaks nothing.\n */\nconst SENTINEL_IDENTIFIERS: ReadonlySet<string> = new Set([\"undefined\", \"NaN\"]);\n\n/**\n * Words that mark a secret-SHAPED name as a placeholder rather than a live\n * credential: `TOKEN_SENTINEL`, `EMPTY_SECRET`, `PLACEHOLDER_API_KEY`. Comparing\n * against one of these is a presence check, not an authentication check, so it\n * stays excluded even though the secret-name heuristics match it.\n */\nconst SENTINEL_WORDS = /(^|_)(SENTINEL|EMPTY|NONE|NULL|UNSET|MISSING|PLACEHOLDER|DUMMY|FAKE|EXAMPLE)(_|$)/;\n\n/**\n * The camelCase spelling of the same idea: a marker VALUE whose name happens to\n * end in a secret-shaped word. A library exports `skipToken` as a unique\n * `Symbol` and callers test identity against it — there are no bytes to compare\n * and nothing an attacker could learn from the timing.\n */\nconst SENTINEL_PREFIX_RE =\n /^(skip|sentinel|empty|none|missing|unset|placeholder|dummy|fake|example|noop)[A-Z]/;\nconst AST_NODE_TYPE_RE = /^(?:TS|JSX)?[A-Z][A-Za-z]*(?:Signature|Keyword|Expression|Declaration|Element|Literal|Identifier)$/;\n\n/**\n * True when every cased character is upper-case and at least one letter exists —\n * AND the name is not itself secret-shaped.\n *\n * The ALL-CAPS carve-out exists for public named constants (`TOKEN_TYPE_SYSTEM`).\n * But environment secrets are conventionally SCREAMING_SNAKE too\n * (`ADMIN_TOKEN`, `ASHBY_API_KEY`, `SLACK_SIGNING_SECRET`), so an unqualified\n * ALL-CAPS bail-out made this rule blind to essentially every real secret\n * compare: `env.ADMIN_TOKEN === supplied` was silent while the camelCase\n * `env.adminToken === supplied` fired. That is the exact comparison this rule\n * exists to catch. Defer to the shared secret-name heuristics first.\n */\nfunction isConstantReference(identifier: string): boolean {\n if (AST_NODE_TYPE_RE.test(identifier)) return true;\n if (isAuthSecretName(identifier) && !SENTINEL_WORDS.test(identifier)) return false;\n return identifier === identifier.toUpperCase() && /[A-Za-z]/.test(identifier);\n}\n\n/**\n * True when this operand makes the comparison a non-timing-attack surface:\n * any literal (string / number / boolean / null / regex), a template literal\n * with no substitutions, `undefined`/`NaN`, or an ALL-CAPS constant reference.\n */\nfunction isExcludedOperand(node: TSESTree.Node): boolean {\n switch (node.type) {\n case AST_NODE_TYPES.Literal:\n return true;\n case AST_NODE_TYPES.TemplateLiteral:\n return node.expressions.length === 0;\n case AST_NODE_TYPES.Identifier:\n return (\n SENTINEL_IDENTIFIERS.has(node.name) ||\n SENTINEL_PREFIX_RE.test(node.name) ||\n isConstantReference(node.name)\n );\n case AST_NODE_TYPES.MemberExpression:\n return (\n !node.computed &&\n node.property.type === AST_NODE_TYPES.Identifier &&\n (SENTINEL_PREFIX_RE.test(node.property.name) ||\n isConstantReference(node.property.name))\n );\n default:\n return false;\n }\n}\n\n/** The identifier a plain operand denotes, or null for anything else. */\nfunction operandName(node: TSESTree.Node): string | null {\n if (node.type === AST_NODE_TYPES.Identifier) {\n return node.name;\n }\n if (\n node.type === AST_NODE_TYPES.MemberExpression &&\n !node.computed &&\n node.property.type === AST_NODE_TYPES.Identifier\n ) {\n return node.property.name;\n }\n return null;\n}\n\n/**\n * True when the operand names an authenticator worth a constant-time compare.\n *\n * A template literal counts when it interpolates one: `header === \\`Bearer\n * ${adminToken}\\`` is the canonical Workers auth check and is exactly as\n * timing-leaky as comparing the bare token, since the constant prefix only makes\n * the first bytes free.\n */\nfunction isSecretOperand(node: TSESTree.Node): boolean {\n if (node.type === AST_NODE_TYPES.TemplateLiteral) {\n return node.expressions.some((expression) => isSecretOperand(expression));\n }\n const name = operandName(node);\n return name !== null && isAuthSecretName(name);\n}\n\n/** The secret identifier this comparison exposes, for the diagnostic message. */\nfunction secretNameOf(node: TSESTree.Node): string | null {\n if (node.type === AST_NODE_TYPES.TemplateLiteral) {\n for (const expression of node.expressions) {\n const nested = secretNameOf(expression);\n if (nested !== null) {\n return nested;\n }\n }\n return null;\n }\n return operandName(node);\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"prefer-constant-time-secret-compare\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow `===`/`!==` on a secret-like value; short-circuiting comparison leaks the secret through timing. Use a constant-time compare.\",\n },\n schema: [],\n messages: {\n preferConstantTimeSecretCompare:\n \"`{{operator}}` on secret `{{name}}` short-circuits on the first differing byte and leaks it through timing. Compare constant-time instead (`crypto.subtle.timingSafeEqual` over equal-length SHA-256 digests).\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (isTestFile(context.filename)) {\n return {};\n }\n return {\n BinaryExpression(node: TSESTree.BinaryExpression): void {\n if (!EQUALITY_OPERATORS.has(node.operator)) {\n return;\n }\n const { left, right } = node;\n if (isExcludedOperand(left) || isExcludedOperand(right)) {\n return;\n }\n const secret = [left, right].find((operand) => isSecretOperand(operand));\n if (secret === undefined) {\n return;\n }\n context.report({\n node,\n messageId: \"preferConstantTimeSecretCompare\",\n data: { operator: node.operator, name: secretNameOf(secret) ?? \"\" },\n });\n },\n };\n },\n});\n","/**\n * @fileoverview prefer-discriminated-union — a boolean status flag beside many optionals makes illegal states representable.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/prefer-discriminated-union.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/prefer-discriminated-union.md\n */\n\nimport { type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { AST_NODE_TYPES } from \"@typescript-eslint/utils\";\n\ntype MessageIds = \"preferDiscriminatedUnion\";\ntype Options = readonly [];\n\n/**\n * Boolean-typed member names that read as a success/error status discriminant.\n */\nconst STATUS_MEMBER_NAMES: ReadonlySet<string> = new Set([\n \"success\",\n \"ok\",\n \"error\",\n \"failed\",\n \"isError\",\n]);\n\nconst MIN_OPTIONAL_MEMBERS = 2;\n\n/**\n * Returns the property key name for a member if it is a plain identifier or\n * string-literal property signature, otherwise `null`.\n */\nfunction getMemberName(member: TSESTree.TypeElement): string | null {\n if (member.type !== AST_NODE_TYPES.TSPropertySignature) {\n return null;\n }\n const { key } = member;\n if (key.type === AST_NODE_TYPES.Identifier) {\n return key.name;\n }\n if (key.type === AST_NODE_TYPES.Literal && typeof key.value === \"string\") {\n return key.value;\n }\n return null;\n}\n\n/**\n * Whether a property signature is annotated with `boolean`.\n */\nfunction isBooleanTyped(member: TSESTree.TSPropertySignature): boolean {\n return (\n member.typeAnnotation?.typeAnnotation.type ===\n AST_NODE_TYPES.TSBooleanKeyword\n );\n}\n\n/**\n * Returns true when the object type literal has BOTH a boolean-typed status\n * member AND at least `MIN_OPTIONAL_MEMBERS` optional members.\n */\nfunction looksLikeMutuallyExclusiveState(\n typeLiteral: TSESTree.TSTypeLiteral,\n): boolean {\n let hasStatusBoolean = false;\n let optionalCount = 0;\n let optionalPayloadCount = 0;\n\n for (const member of typeLiteral.members) {\n if (member.type !== AST_NODE_TYPES.TSPropertySignature) {\n continue;\n }\n\n if (member.optional) {\n optionalCount += 1;\n // A non-boolean optional is a PAYLOAD — the thing that can end up in the\n // wrong branch. An all-boolean record is a flag set; see @fileoverview.\n if (!isBooleanTyped(member)) {\n optionalPayloadCount += 1;\n }\n }\n\n const name = getMemberName(member);\n if (\n name !== null &&\n STATUS_MEMBER_NAMES.has(name) &&\n isBooleanTyped(member)\n ) {\n hasStatusBoolean = true;\n }\n }\n\n return (\n hasStatusBoolean &&\n optionalCount >= MIN_OPTIONAL_MEMBERS &&\n optionalPayloadCount >= 1\n );\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"prefer-discriminated-union\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Flag object types with a boolean status flag and many optionals; model them as a discriminated union instead.\",\n },\n schema: [],\n messages: {\n preferDiscriminatedUnion:\n \"This object type uses a boolean status flag alongside several optional fields, which lets illegal states be representable. Model it as a `z.discriminatedUnion` / discriminated union (e.g. `{ ok: true; data: T } | { ok: false; error: E }`) to make illegal states unrepresentable.\",\n },\n },\n defaultOptions: [],\n create(context) {\n function checkTypeLiteral(\n typeLiteral: TSESTree.TSTypeLiteral,\n reportNode: TSESTree.Node,\n ): void {\n if (looksLikeMutuallyExclusiveState(typeLiteral)) {\n context.report({\n node: reportNode,\n messageId: \"preferDiscriminatedUnion\",\n });\n }\n }\n\n return {\n TSInterfaceDeclaration(\n node: TSESTree.TSInterfaceDeclaration,\n ): void {\n // An interface body is structurally an object type literal; reuse the\n // same membership analysis by treating its `body.body` as members.\n const synthetic: TSESTree.TSTypeLiteral = {\n ...node.body,\n type: AST_NODE_TYPES.TSTypeLiteral,\n members: node.body.body,\n } as TSESTree.TSTypeLiteral;\n checkTypeLiteral(synthetic, node);\n },\n \"TSTypeAliasDeclaration > TSTypeLiteral\"(\n node: TSESTree.TSTypeLiteral,\n ): void {\n checkTypeLiteral(node, node.parent);\n },\n };\n },\n});\n","/**\n * @fileoverview prefer-module-level-constant — a literal-only collection or regex declared inside a function is rebuilt on every call.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/prefer-module-level-constant.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/prefer-module-level-constant.md\n */\n\nimport { type TSESTree, AST_NODE_TYPES } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isStoryFile, isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"hoistCollection\" | \"hoistRegex\";\n\ntype Options = readonly [\n {\n minElements?: number;\n checkRegex?: boolean;\n ignoreTestFiles?: boolean;\n }?,\n];\n\nconst DEFAULT_MIN_ELEMENTS = 3;\n\n/** How deep a nested literal may go before we stop trying to prove it static. */\nconst MAX_LITERAL_DEPTH = 4;\n\nconst IGNORE_PATTERNS: readonly RegExp[] = [\n /[\\\\/]generated[\\\\/]/,\n /\\.gen\\.tsx?$/,\n /\\.generated\\.tsx?$/,\n /\\.d\\.ts$/,\n];\n\n/**\n * Methods that mutate the receiver. A call to any of these on the binding is\n * proof the value is meant to be rebuilt per call.\n */\nconst MUTATING_METHODS: ReadonlySet<string> = new Set([\n // Array\n \"push\",\n \"pop\",\n \"shift\",\n \"unshift\",\n \"splice\",\n \"sort\",\n \"reverse\",\n \"fill\",\n \"copyWithin\",\n // Set / Map\n \"add\",\n \"set\",\n \"delete\",\n \"clear\",\n // Object-ish escape hatches\n \"assign\",\n]);\n\nconst FUNCTION_TYPES: ReadonlySet<AST_NODE_TYPES> = new Set([\n AST_NODE_TYPES.FunctionDeclaration,\n AST_NODE_TYPES.FunctionExpression,\n AST_NODE_TYPES.ArrowFunctionExpression,\n]);\n\nconst COLLECTION_CONSTRUCTORS: ReadonlySet<string> = new Set([\"Set\", \"Map\"]);\n\nfunction isIgnoredFile(filename: string, sourceText: string): boolean {\n if (IGNORE_PATTERNS.some((re) => re.test(filename))) {\n return true;\n }\n return /@generated\\b/.test(sourceText.slice(0, 1024));\n}\n\n/**\n * A test suite or a story: both keep their fixture tables next to the assertion\n * (or the story) that explains them. Delegated to `_paths` so this rule cannot\n * drift away from the other file-kind-scoped rules again.\n */\nfunction isLocalFixtureFile(filename: string): boolean {\n return isTestFile(filename) || isStoryFile(filename);\n}\n\n/** Unwraps `x as const` / `x satisfies T` down to the inner expression. */\nfunction unwrap(node: TSESTree.Node): TSESTree.Node {\n if (\n node.type === AST_NODE_TYPES.TSAsExpression ||\n node.type === AST_NODE_TYPES.TSSatisfiesExpression ||\n node.type === AST_NODE_TYPES.TSNonNullExpression\n ) {\n return unwrap(node.expression);\n }\n return node;\n}\n\n/** `g` and `y` carry `lastIndex` between calls, so hoisting changes behaviour. */\nconst HAS_STATEFUL_FLAG_RE = /[gy]/;\n\nfunction isRegexLiteral(node: TSESTree.Node): node is TSESTree.RegExpLiteral {\n return (\n node.type === AST_NODE_TYPES.Literal &&\n \"regex\" in node &&\n node.regex !== undefined\n );\n}\n\n/**\n * Whether the expression is built entirely out of literals — no identifier, no\n * call, no member access, no interpolation, no spread. This is the gate that\n * makes hoisting provably safe: a literal-only value cannot capture a\n * parameter, cannot observe call-time state, and cannot have side effects.\n */\nfunction isLiteralOnly(node: TSESTree.Node, depth: number): boolean {\n if (depth > MAX_LITERAL_DEPTH) {\n return false;\n }\n const inner = unwrap(node);\n switch (inner.type) {\n case AST_NODE_TYPES.Literal: {\n // A `RegExpLiteral` is an `AST_NODE_TYPES.Literal`, so without this a\n // stateful regex nested in a collection — `const patterns = [/a/g, /b/]`\n // — bypassed the top-level `g`/`y` check and the recommended hoist would\n // have carried `lastIndex` across calls.\n return !(isRegexLiteral(inner) && HAS_STATEFUL_FLAG_RE.test(inner.regex.flags));\n }\n case AST_NODE_TYPES.TemplateLiteral: {\n return inner.expressions.length === 0;\n }\n case AST_NODE_TYPES.UnaryExpression: {\n return (\n (inner.operator === \"-\" || inner.operator === \"+\") &&\n inner.argument.type === AST_NODE_TYPES.Literal &&\n typeof inner.argument.value === \"number\"\n );\n }\n case AST_NODE_TYPES.ArrayExpression: {\n return inner.elements.every(\n (el) =>\n el !== null &&\n el.type !== AST_NODE_TYPES.SpreadElement &&\n isLiteralOnly(el, depth + 1),\n );\n }\n case AST_NODE_TYPES.ObjectExpression: {\n return inner.properties.every((prop) => {\n if (prop.type !== AST_NODE_TYPES.Property) {\n return false;\n }\n if (prop.shorthand || prop.method || prop.kind !== \"init\") {\n return false;\n }\n if (prop.computed && prop.key.type !== AST_NODE_TYPES.Literal) {\n return false;\n }\n return isLiteralOnly(prop.value, depth + 1);\n });\n }\n default: {\n return false;\n }\n }\n}\n\n/** `Object.freeze(x)` → `x`; anything else is returned untouched. */\nfunction unwrapObjectFreeze(node: TSESTree.Node): TSESTree.Node {\n const inner = unwrap(node);\n if (\n inner.type === AST_NODE_TYPES.CallExpression &&\n inner.callee.type === AST_NODE_TYPES.MemberExpression &&\n !inner.callee.computed &&\n inner.callee.object.type === AST_NODE_TYPES.Identifier &&\n inner.callee.object.name === \"Object\" &&\n inner.callee.property.type === AST_NODE_TYPES.Identifier &&\n inner.callee.property.name === \"freeze\" &&\n inner.arguments.length === 1 &&\n inner.arguments[0] !== undefined &&\n inner.arguments[0].type !== AST_NODE_TYPES.SpreadElement\n ) {\n return unwrap(inner.arguments[0]);\n }\n return inner;\n}\n\ntype Candidate =\n | { kind: \"array\" | \"object\" | \"Set\" | \"Map\"; size: number }\n | { kind: \"regex\"; size: number };\n\n/**\n * Classifies the initializer, or returns null when it is not a hoistable\n * literal-only collection / regex.\n */\nfunction classify(init: TSESTree.Node, checkRegex: boolean): Candidate | null {\n const node = unwrapObjectFreeze(init);\n\n if (isRegexLiteral(node)) {\n if (!checkRegex) {\n return null;\n }\n if (HAS_STATEFUL_FLAG_RE.test(node.regex.flags)) {\n return null;\n }\n return { kind: \"regex\", size: 1 };\n }\n\n if (node.type === AST_NODE_TYPES.ArrayExpression) {\n return isLiteralOnly(node, 0)\n ? { kind: \"array\", size: node.elements.length }\n : null;\n }\n\n if (node.type === AST_NODE_TYPES.ObjectExpression) {\n return isLiteralOnly(node, 0)\n ? { kind: \"object\", size: node.properties.length }\n : null;\n }\n\n if (\n node.type === AST_NODE_TYPES.NewExpression &&\n node.callee.type === AST_NODE_TYPES.Identifier &&\n COLLECTION_CONSTRUCTORS.has(node.callee.name)\n ) {\n const arg = node.arguments[0];\n if (\n node.arguments.length !== 1 ||\n arg === undefined ||\n arg.type === AST_NODE_TYPES.SpreadElement\n ) {\n return null;\n }\n const entries = unwrap(arg);\n if (entries.type !== AST_NODE_TYPES.ArrayExpression) {\n return null;\n }\n return isLiteralOnly(entries, 0)\n ? { kind: node.callee.name === \"Set\" ? \"Set\" : \"Map\", size: entries.elements.length }\n : null;\n }\n\n return null;\n}\n\n/** The nearest enclosing function, or null when the node is at module scope. */\nfunction enclosingFunction(node: TSESTree.Node): TSESTree.Node | null {\n let current: TSESTree.Node | undefined | null = node.parent;\n while (current !== undefined && current !== null) {\n if (FUNCTION_TYPES.has(current.type)) {\n return current;\n }\n current = current.parent;\n }\n return null;\n}\n\n/**\n * Built-ins that read their argument and return a fresh value without keeping\n * or mutating the original, so passing the binding to them is still a read.\n */\nconst NON_RETAINING_BUILTINS: ReadonlyMap<string, ReadonlySet<string>> = new Map(\n [\n [\n \"Object\",\n new Set([\"keys\", \"values\", \"entries\", \"freeze\", \"fromEntries\", \"assign\"]),\n ],\n [\"Array\", new Set([\"from\", \"isArray\"])],\n [\"JSON\", new Set([\"stringify\"])],\n ],\n);\n\nfunction isNonRetainingBuiltinCall(\n node: TSESTree.CallExpression,\n argument: TSESTree.Identifier,\n): boolean {\n const callee = node.callee;\n if (\n callee.type === AST_NODE_TYPES.Identifier &&\n callee.name === \"structuredClone\"\n ) {\n return true;\n }\n if (\n callee.type !== AST_NODE_TYPES.MemberExpression ||\n callee.computed ||\n callee.object.type !== AST_NODE_TYPES.Identifier ||\n callee.property.type !== AST_NODE_TYPES.Identifier\n ) {\n return false;\n }\n const members = NON_RETAINING_BUILTINS.get(callee.object.name);\n if (members === undefined || !members.has(callee.property.name)) {\n return false;\n }\n // `Object.assign(X, src)` mutates its FIRST argument; only later positions\n // (sources) are reads.\n if (callee.object.name === \"Object\" && callee.property.name === \"assign\") {\n return node.arguments[0] !== argument;\n }\n return true;\n}\n\n/**\n * Whether this single reference to the binding is a provably non-mutating,\n * non-escaping read. Anything not on the whitelist is treated as unsafe, so an\n * unrecognised usage suppresses the report rather than risking a bad hoist.\n */\nfunction isSafeRead(identifier: TSESTree.Identifier): boolean {\n const parent = identifier.parent;\n\n if (parent.type === AST_NODE_TYPES.MemberExpression) {\n if (parent.object !== identifier) {\n // `foo[X]` — the binding is used as a key, which is a plain read.\n return true;\n }\n const grandparent = parent.parent;\n // `X.a = 1`, `X[0] = 1`, `X.a += 1`\n if (\n grandparent.type === AST_NODE_TYPES.AssignmentExpression &&\n grandparent.left === parent\n ) {\n return false;\n }\n // `X.a++`\n if (grandparent.type === AST_NODE_TYPES.UpdateExpression) {\n return false;\n }\n // `delete X.a`\n if (\n grandparent.type === AST_NODE_TYPES.UnaryExpression &&\n grandparent.operator === \"delete\"\n ) {\n return false;\n }\n // `X.push(...)`, `X.sort()`, ...\n if (\n !parent.computed &&\n parent.property.type === AST_NODE_TYPES.Identifier &&\n MUTATING_METHODS.has(parent.property.name) &&\n grandparent.type === AST_NODE_TYPES.CallExpression &&\n grandparent.callee === parent\n ) {\n return false;\n }\n // Everything else through a member expression — `X.length`, `X.includes(v)`,\n // `X[i]`, `X.get(k)`, even `arr.map(X.has)` — reads a property of the\n // binding without handing the binding itself out, so it cannot mutate it.\n return true;\n }\n\n // `for (const x of X)` — iteration is a read.\n if (\n parent.type === AST_NODE_TYPES.ForOfStatement &&\n parent.right === identifier\n ) {\n return true;\n }\n\n // `[...X]`, `{...X}`, `f(...X)` — every spread copies, so the original is\n // never handed out and hoisting stays safe.\n if (parent.type === AST_NODE_TYPES.SpreadElement) {\n return true;\n }\n\n // `\"a\" in X`, `X instanceof Y`, `X === undefined`\n if (parent.type === AST_NODE_TYPES.BinaryExpression) {\n return true;\n }\n\n // A bare argument to a built-in that is known not to retain or mutate its\n // input: `Object.entries(X)`, `Array.from(X)`, `JSON.stringify(X)`. Any other\n // call receiving the binding bare is an escape.\n if (\n parent.type === AST_NODE_TYPES.CallExpression &&\n parent.arguments.includes(identifier) &&\n isNonRetainingBuiltinCall(parent, identifier)\n ) {\n return true;\n }\n\n // `typeof X`, `!X`\n if (\n parent.type === AST_NODE_TYPES.UnaryExpression &&\n parent.operator !== \"delete\"\n ) {\n return true;\n }\n\n return false;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"prefer-module-level-constant\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Hoist literal-only constant collections and regexes out of function bodies to module scope so they are allocated once.\",\n },\n schema: [\n {\n type: \"object\",\n additionalProperties: false,\n properties: {\n minElements: { type: \"number\", minimum: 1 },\n checkRegex: { type: \"boolean\" },\n ignoreTestFiles: { type: \"boolean\" },\n },\n },\n ],\n messages: {\n hoistCollection:\n \"`{{name}}` is a literal-only {{kind}} rebuilt on every call. Hoist it to module scope so it is allocated once and can be reused, exported, and tested.\",\n hoistRegex:\n \"`{{name}}` is a constant regex recompiled on every call. Hoist it to module scope.\",\n },\n },\n defaultOptions: [{}],\n create(context, [optionsArg]) {\n const options = optionsArg ?? {};\n const minElements = options.minElements ?? DEFAULT_MIN_ELEMENTS;\n const checkRegex = options.checkRegex ?? true;\n const ignoreTestFiles = options.ignoreTestFiles ?? true;\n\n const sourceCode = context.sourceCode;\n const filename = context.filename;\n\n if (isIgnoredFile(filename, sourceCode.getText())) {\n return {};\n }\n if (ignoreTestFiles && isLocalFixtureFile(filename)) {\n return {};\n }\n\n function allReferencesAreSafeReads(\n declarator: TSESTree.VariableDeclarator,\n ): boolean {\n const variables = sourceCode.getDeclaredVariables(declarator);\n const variable = variables[0];\n if (variable === undefined) {\n return false;\n }\n for (const reference of variable.references) {\n // The initializer write itself is not a usage.\n if (reference.init === true) {\n continue;\n }\n if (reference.isWrite()) {\n return false;\n }\n // A `JSXIdentifier` reference means the constant is rendered as a JSX\n // tag name — not something this rule reasons about, so bail.\n if (reference.identifier.type !== AST_NODE_TYPES.Identifier) {\n return false;\n }\n if (!isSafeRead(reference.identifier)) {\n return false;\n }\n }\n return true;\n }\n\n return {\n VariableDeclarator(node: TSESTree.VariableDeclarator): void {\n const declaration = node.parent;\n if (\n declaration.type !== AST_NODE_TYPES.VariableDeclaration ||\n declaration.kind !== \"const\" ||\n declaration.declare === true\n ) {\n return;\n }\n if (node.id.type !== AST_NODE_TYPES.Identifier || node.init === null) {\n return;\n }\n if (enclosingFunction(node) === null) {\n return;\n }\n\n const candidate = classify(node.init, checkRegex);\n if (candidate === null) {\n return;\n }\n if (candidate.kind !== \"regex\" && candidate.size < minElements) {\n return;\n }\n if (!allReferencesAreSafeReads(node)) {\n return;\n }\n\n context.report({\n node: node.id,\n messageId:\n candidate.kind === \"regex\" ? \"hoistRegex\" : \"hoistCollection\",\n data: { name: node.id.name, kind: candidate.kind },\n });\n },\n };\n },\n});\n","/**\n * @fileoverview prefer-module-level-schema — a Zod schema built inside a function is rebuilt on every call, every request, every render.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/prefer-module-level-schema.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/prefer-module-level-schema.md\n */\n\nimport { AST_NODE_TYPES, type TSESLint, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isGeneratedFile, isTestFile } from \"./_paths.js\";\nimport { isZodModule } from \"./_zod.js\";\n\ntype MessageIds = \"hoistSchema\";\n\ntype Options = readonly [\n {\n factories?: readonly string[];\n ignoreTestFiles?: boolean;\n minProperties?: number;\n }?,\n];\n\n/**\n * The object-like composites. Each builds a container plus one schema instance\n * per member, so the per-call cost is real rather than notional.\n */\nconst DEFAULT_FACTORIES: readonly string[] = [\n \"discriminatedUnion\",\n \"intersection\",\n \"looseObject\",\n \"object\",\n \"record\",\n \"strictObject\",\n \"tuple\",\n \"union\",\n];\n\n/**\n * Two, not one — the value the \"deliberately not flagged\" list has always\n * PROMISED and never delivered. The gate is `properties.length <\n * minProperties`, so a default of 1 excludes `z.object({})` and nothing else,\n * while the documented exemption is the one-key inline schema.\n */\nconst DEFAULT_MIN_PROPERTIES = 2;\n\n/** Wrappers that already pay the construction cost exactly once. */\nconst MEMO_CALLEES: ReadonlySet<string> = new Set([\n \"lazy\",\n \"memo\",\n \"once\",\n \"useMemo\",\n]);\n\n/**\n * Methods that CONSUME a value rather than extend the schema. The chain walk\n * stops before them: `z.object({...}).parse(raw)` closes over `raw`, but `raw`\n * is the input, not part of the schema, and the schema in front of it hoists\n * perfectly well.\n */\nconst TERMINAL_METHODS: ReadonlySet<string> = new Set([\n \"isNullable\",\n \"isOptional\",\n \"parse\",\n \"parseAsync\",\n \"safeParse\",\n \"safeParseAsync\",\n \"spa\",\n]);\n\n/**\n * Zod combinator methods that take a schema and return a schema. An enclosing\n * one means the reported factory is a FRAGMENT of a larger schema expression\n * rather than a schema in its own right — `AstroConfigSchema.extend({ … })`\n * is not a `z.*` call, so `isZodCall` cannot see it, and the fragment inside it\n * was reported on its own.\n */\nconst ZOD_COMBINATOR_METHODS: ReadonlySet<string> = new Set([\n \"and\",\n \"array\",\n \"catch\",\n \"catchall\",\n \"default\",\n \"extend\",\n \"merge\",\n \"or\",\n \"pipe\",\n \"refine\",\n \"superRefine\",\n \"transform\",\n]);\n\n/**\n * Callees that render text in the CURRENTLY ACTIVE locale.\n *\n * A zero-argument `() => z.object({ otp: z.string().length(6, t`…`) })` exists\n * PRECISELY so the Lingui macro runs after `i18n.activate(locale)`.\n * `closesOverNothing` skips `ImportBinding` defs, so `t` was invisible and the\n * rule advised a hoist that freezes every validation message in whatever locale\n * happened to be active at module-eval time — a correctness regression, not\n * noise. A tagged template is the macro spelling every i18n library uses.\n */\nconst I18N_CALLEE_NAMES: ReadonlySet<string> = new Set([\n \"$t\",\n \"defineMessage\",\n \"gettext\",\n \"msg\",\n \"ngettext\",\n \"t\",\n \"translate\",\n]);\n\n/** Receivers whose methods render locale-dependent text (`i18n._`, `intl.formatMessage`). */\nconst I18N_RECEIVER_NAMES: ReadonlySet<string> = new Set([\n \"$i18n\",\n \"i18n\",\n \"intl\",\n]);\n\nconst FUNCTION_TYPES: ReadonlySet<AST_NODE_TYPES> = new Set([\n AST_NODE_TYPES.ArrowFunctionExpression,\n AST_NODE_TYPES.FunctionDeclaration,\n AST_NODE_TYPES.FunctionExpression,\n]);\n\n/**\n * The whole schema EXPRESSION, not just the factory call: climb out through\n * `.refine(...)`, `.superRefine(...)`, `.transform(...)`, `.default(...)` and\n * every other builder method applied to it.\n */\nfunction schemaExpression(node: TSESTree.CallExpression): TSESTree.Node {\n let current: TSESTree.Node = node;\n for (;;) {\n const parent: TSESTree.Node | undefined = current.parent ?? undefined;\n if (parent === undefined) {\n return current;\n }\n if (\n parent.type === AST_NODE_TYPES.MemberExpression &&\n parent.object === current &&\n !parent.computed &&\n parent.property.type === AST_NODE_TYPES.Identifier &&\n TERMINAL_METHODS.has(parent.property.name)\n ) {\n return current;\n }\n if (\n (parent.type === AST_NODE_TYPES.MemberExpression &&\n parent.object === current) ||\n (parent.type === AST_NODE_TYPES.CallExpression &&\n parent.callee === current) ||\n (parent.type === AST_NODE_TYPES.TSAsExpression &&\n parent.expression === current) ||\n (parent.type === AST_NODE_TYPES.TSNonNullExpression &&\n parent.expression === current)\n ) {\n current = parent;\n continue;\n }\n return current;\n }\n}\n\n/** The outermost function ancestor — hoisting targets module scope, not the nearest body. */\nfunction outermostEnclosingFunction(\n node: TSESTree.Node,\n): TSESTree.Node | undefined {\n let outermost: TSESTree.Node | undefined;\n let current: TSESTree.Node | undefined = node.parent ?? undefined;\n while (current !== undefined) {\n if (FUNCTION_TYPES.has(current.type)) {\n outermost = current;\n }\n current = current.parent ?? undefined;\n }\n return outermost;\n}\n\n/** Does any node in `root`'s subtree satisfy `predicate`? */\nfunction subtreeSome(\n root: TSESTree.Node,\n predicate: (node: TSESTree.Node) => boolean,\n): boolean {\n let found = false;\n const visit = (value: unknown): void => {\n if (found || value === null || typeof value !== \"object\") {\n return;\n }\n if (Array.isArray(value)) {\n for (const item of value) {\n visit(item);\n }\n return;\n }\n const candidate = value as Partial<TSESTree.Node> & Record<string, unknown>;\n if (typeof candidate.type !== \"string\") {\n return;\n }\n if (predicate(candidate as TSESTree.Node)) {\n found = true;\n return;\n }\n for (const key of Object.keys(candidate)) {\n if (key === \"parent\" || key === \"loc\" || key === \"range\") {\n continue;\n }\n visit(candidate[key]);\n }\n };\n visit(root);\n return found;\n}\n\n/** `this` / `super` / `arguments` anywhere inside pins the schema to its receiver. */\nfunction readsReceiver(node: TSESTree.Node): boolean {\n return subtreeSome(\n node,\n (inner) =>\n inner.type === AST_NODE_TYPES.ThisExpression ||\n inner.type === AST_NODE_TYPES.Super ||\n (inner.type === AST_NODE_TYPES.Identifier && inner.name === \"arguments\"),\n );\n}\n\n/**\n * Does the schema build a string whose VALUE depends on when it is evaluated?\n *\n * See `I18N_CALLEE_NAMES`. Hoisting such a schema moves the render from\n * call time to module-eval time, which is a behaviour change, not a\n * refactor — so this is a hard bail rather than a heuristic penalty.\n */\nfunction buildsLocalizedText(node: TSESTree.Node): boolean {\n return subtreeSome(node, (inner) => {\n if (inner.type === AST_NODE_TYPES.TaggedTemplateExpression) {\n return true;\n }\n if (inner.type !== AST_NODE_TYPES.CallExpression) {\n return false;\n }\n const { callee } = inner;\n if (callee.type === AST_NODE_TYPES.Identifier) {\n return I18N_CALLEE_NAMES.has(callee.name);\n }\n return (\n callee.type === AST_NODE_TYPES.MemberExpression &&\n !callee.computed &&\n callee.object.type === AST_NODE_TYPES.Identifier &&\n I18N_RECEIVER_NAMES.has(callee.object.name)\n );\n });\n}\n\nfunction collectReferences(\n scope: TSESLint.Scope.Scope,\n out: TSESLint.Scope.Reference[],\n): void {\n out.push(...scope.references);\n for (const child of scope.childScopes) {\n collectReferences(child, out);\n }\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"prefer-module-level-schema\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Declare a Zod schema at module scope when it closes over nothing in the enclosing function\",\n },\n schema: [\n {\n type: \"object\",\n properties: {\n factories: {\n type: \"array\",\n items: { type: \"string\" },\n description:\n \"Zod factory names to check. Defaults to the object-like composites; add `array` / `enum` to widen.\",\n },\n ignoreTestFiles: {\n type: \"boolean\",\n description:\n \"Skip test files, where a fixture schema belongs next to its assertion.\",\n },\n minProperties: {\n type: \"number\",\n minimum: 0,\n description:\n \"Minimum key count before an object-like schema is reported.\",\n },\n },\n additionalProperties: false,\n },\n ],\n messages: {\n hoistSchema:\n \"Move this `{{factory}}` schema to module scope. It uses nothing from `{{owner}}`, so it is rebuilt on every call for no benefit and cannot be exported, reused, or `z.infer`-ed from where it is.\",\n },\n },\n defaultOptions: [{}],\n create(context, [options]) {\n const factories = new Set(options?.factories ?? DEFAULT_FACTORIES);\n const ignoreTestFiles = options?.ignoreTestFiles ?? true;\n const minProperties = options?.minProperties ?? DEFAULT_MIN_PROPERTIES;\n\n const sourceCode = context.sourceCode;\n const filename = context.filename;\n if (isGeneratedFile(filename, sourceCode.getText())) {\n return {};\n }\n if (ignoreTestFiles && isTestFile(filename)) {\n return {};\n }\n\n const zodNamespaces = new Set<string>();\n\n function isZodCall(node: TSESTree.Node): node is TSESTree.CallExpression {\n return (\n node.type === AST_NODE_TYPES.CallExpression &&\n node.callee.type === AST_NODE_TYPES.MemberExpression &&\n !node.callee.computed &&\n node.callee.object.type === AST_NODE_TYPES.Identifier &&\n zodNamespaces.has(node.callee.object.name)\n );\n }\n\n function isCovered(node: TSESTree.CallExpression): boolean {\n let current: TSESTree.Node | undefined = node.parent ?? undefined;\n while (current !== undefined) {\n if (\n current !== node &&\n isZodCall(current) &&\n current.callee.type === AST_NODE_TYPES.MemberExpression &&\n current.callee.property.type === AST_NODE_TYPES.Identifier &&\n factories.has(current.callee.property.name)\n ) {\n return true;\n }\n if (\n current.type === AST_NODE_TYPES.CallExpression &&\n ((current.callee.type === AST_NODE_TYPES.Identifier &&\n MEMO_CALLEES.has(current.callee.name)) ||\n (current.callee.type === AST_NODE_TYPES.MemberExpression &&\n !current.callee.computed &&\n current.callee.property.type === AST_NODE_TYPES.Identifier &&\n MEMO_CALLEES.has(current.callee.property.name)))\n ) {\n return true;\n }\n current = current.parent ?? undefined;\n }\n return false;\n }\n\n /**\n * The OUTERMOST schema expression `expression` is a part of.\n *\n * `schemaExpression` climbs the builder chain hanging off the factory call;\n * this climbs the other axis — out of the shape object, the array, and the\n * argument list of whatever Zod construct encloses it. It exists because a\n * reported factory can be a FRAGMENT of a schema that does not itself move,\n * and prising one key's value out of an expression that is rebuilt per call\n * anyway saves nothing.\n */\n function outermostSchemaExpression(\n expression: TSESTree.Node,\n ): TSESTree.Node {\n // `confirmed` only advances past a Zod construct. Walking OUT of a shape\n // object is provisional until the call wrapping it turns out to be one:\n // `tool({ inputSchema: z.object({…}), execute })` also puts a schema in an\n // object literal, and treating that literal as the schema would inherit\n // `execute`'s free variables.\n let confirmed = expression;\n let current = expression;\n for (;;) {\n const parent: TSESTree.Node | undefined = current.parent ?? undefined;\n if (parent === undefined) {\n return confirmed;\n }\n if (\n (parent.type === AST_NODE_TYPES.Property && parent.value === current) ||\n parent.type === AST_NODE_TYPES.ObjectExpression ||\n parent.type === AST_NODE_TYPES.ArrayExpression\n ) {\n current = parent;\n continue;\n }\n if (\n parent.type === AST_NODE_TYPES.CallExpression &&\n parent.arguments.includes(current as TSESTree.CallExpressionArgument) &&\n isSchemaComposition(parent)\n ) {\n current = schemaExpression(parent);\n confirmed = current;\n continue;\n }\n return confirmed;\n }\n }\n\n /** A `z.*(…)` call, or a Zod combinator method applied to an existing schema. */\n function isSchemaComposition(node: TSESTree.CallExpression): boolean {\n // The combinator test runs FIRST: `isZodCall` is a type predicate, so\n // putting it on the left of `||` narrows `node` to `never` in the right\n // operand and the member access stops compiling.\n const { callee } = node;\n const isCombinator =\n callee.type === AST_NODE_TYPES.MemberExpression &&\n !callee.computed &&\n callee.property.type === AST_NODE_TYPES.Identifier &&\n ZOD_COMBINATOR_METHODS.has(callee.property.name);\n return isCombinator || isZodCall(node);\n }\n\n /** No reference inside the schema resolves to a binding the function owns. */\n function closesOverNothing(\n node: TSESTree.Node,\n enclosing: TSESTree.Node,\n ): boolean {\n const references: TSESLint.Scope.Reference[] = [];\n collectReferences(sourceCode.getScope(node), references);\n const [schemaStart, schemaEnd] = node.range;\n const [functionStart, functionEnd] = enclosing.range;\n for (const reference of references) {\n const [identifierStart] = reference.identifier.range;\n if (identifierStart < schemaStart || identifierStart >= schemaEnd) {\n continue;\n }\n const resolved = reference.resolved;\n if (resolved === null) {\n continue;\n }\n for (const definition of resolved.defs) {\n if (definition.type === \"ImportBinding\") {\n continue;\n }\n const [defStart, defEnd] = definition.node.range;\n // A binding declared INSIDE the schema travels with it. The callback\n // parameters of `.refine((value) => …)` / `.superRefine((data, ctx) =>\n // …)` / `z.preprocess((value) => …, …)` are the whole class, and the\n // enclosing-range test alone answered \"this closes over the function\"\n // for every one of them — so any schema carrying a refinement was\n // silently unreportable. What the documented `documenso` case actually\n // needs is the callback reading an OUTER binding, and that still\n // resolves outside this range and still bails.\n if (defStart >= schemaStart && defEnd <= schemaEnd) {\n continue;\n }\n if (defStart >= functionStart && defEnd <= functionEnd) {\n return false;\n }\n }\n }\n return true;\n }\n\n /** How the enclosing function should be named in the message. */\n function ownerName(enclosing: TSESTree.Node): string {\n const parent = enclosing.parent ?? undefined;\n if (\n enclosing.type === AST_NODE_TYPES.FunctionDeclaration &&\n enclosing.id !== null\n ) {\n return enclosing.id.name;\n }\n if (\n parent !== undefined &&\n parent.type === AST_NODE_TYPES.VariableDeclarator &&\n parent.id.type === AST_NODE_TYPES.Identifier\n ) {\n return parent.id.name;\n }\n if (\n parent !== undefined &&\n (parent.type === AST_NODE_TYPES.MethodDefinition ||\n parent.type === AST_NODE_TYPES.Property) &&\n parent.key.type === AST_NODE_TYPES.Identifier\n ) {\n return parent.key.name;\n }\n return \"this function\";\n }\n\n return {\n ImportDeclaration(node): void {\n if (!isZodModule(node.source.value)) {\n return;\n }\n for (const specifier of node.specifiers) {\n if (\n specifier.type === AST_NODE_TYPES.ImportNamespaceSpecifier ||\n specifier.type === AST_NODE_TYPES.ImportDefaultSpecifier ||\n (specifier.type === AST_NODE_TYPES.ImportSpecifier &&\n specifier.imported.type === AST_NODE_TYPES.Identifier &&\n specifier.imported.name === \"z\")\n ) {\n zodNamespaces.add(specifier.local.name);\n }\n }\n },\n CallExpression(node): void {\n if (zodNamespaces.size === 0 || !isZodCall(node)) {\n return;\n }\n const callee = node.callee as TSESTree.MemberExpression;\n if (callee.property.type !== AST_NODE_TYPES.Identifier) {\n return;\n }\n const factory = callee.property.name;\n if (!factories.has(factory)) {\n return;\n }\n const enclosing = outermostEnclosingFunction(node);\n if (enclosing === undefined) {\n return;\n }\n if (isCovered(node)) {\n return;\n }\n const shape = node.arguments[0];\n if (\n shape !== undefined &&\n shape.type === AST_NODE_TYPES.ObjectExpression &&\n shape.properties.length < minProperties\n ) {\n return;\n }\n const expression = schemaExpression(node);\n if (readsReceiver(expression)) {\n return;\n }\n if (buildsLocalizedText(expression)) {\n return;\n }\n // A fragment of a schema that cannot itself move is not reportable: the\n // enclosing expression is rebuilt on every call whatever we do to this\n // sub-schema. Only checked when an enclosing construct actually exists,\n // so `z.array(z.object({…}))` — where the whole expression IS hoistable\n // and `z.array` is not itself reportable — keeps reporting the inner\n // `z.object`, as the evidence file promises.\n const outermost = outermostSchemaExpression(expression);\n if (\n outermost !== expression &&\n (readsReceiver(outermost) ||\n buildsLocalizedText(outermost) ||\n !closesOverNothing(outermost, enclosing))\n ) {\n return;\n }\n if (!closesOverNothing(expression, enclosing)) {\n return;\n }\n context.report({\n node,\n messageId: \"hoistSchema\",\n data: { factory: `z.${factory}`, owner: ownerName(enclosing) },\n });\n },\n };\n },\n});\n","/**\n * @fileoverview _zod — the single source of truth for \"does this name read as a Zod schema?\".\n *\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/_zod.md\n */\n\n/** The `Z<Capital>` prefix convention: `ZUser`, `ZSubmitForm`. */\nexport const ZOD_PREFIX_RE = /^Z[A-Z]/;\n\n/** The `XxxSchema` suffix convention: `userSchema`, `SubmitFormDataSchema`. */\nexport const ZOD_SUFFIX_RE = /Schema$/;\n\n/** Either accepted convention. */\nexport const ZOD_SCHEMA_NAME_RE = /Schema$|^Z[A-Z]/;\n\n/**\n * Whether an import specifier resolves to Zod — `zod`, `zod/v4`, `zod/mini`,\n * `@hono/zod-validator`-style re-exports. Shared by `prefer-zod-enum` and\n * `prefer-zod-infer` so the two cannot disagree about what \"imports Zod\" means.\n */\nexport function isZodModule(source: string): boolean {\n return /(^|[/@-])zod([/-]|$)/.test(source);\n}\n","/**\n * @fileoverview prefer-non-nullable-collection — `T[] | null` gives an empty collection two representations and a null check to every caller.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/prefer-non-nullable-collection.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/prefer-non-nullable-collection.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isGeneratedFile, isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"preferNonNullableCollection\";\ntype Options = readonly [];\n\nconst ARRAY_TYPE_NAMES: ReadonlySet<string> = new Set([\"Array\", \"ReadonlyArray\"]);\n\nfunction propertyName(node: TSESTree.TSPropertySignature | TSESTree.PropertyDefinition): string {\n const key = node.key;\n if (key.type === AST_NODE_TYPES.Identifier) return key.name;\n if (key.type === AST_NODE_TYPES.Literal) return String(key.value);\n return \"collection\";\n}\n\nfunction isArrayType(node: TSESTree.TypeNode): boolean {\n if (node.type === AST_NODE_TYPES.TSArrayType) return true;\n return (\n node.type === AST_NODE_TYPES.TSTypeReference &&\n node.typeName.type === AST_NODE_TYPES.Identifier &&\n ARRAY_TYPE_NAMES.has(node.typeName.name)\n );\n}\n\nfunction isNullishType(node: TSESTree.TypeNode): boolean {\n return node.type === AST_NODE_TYPES.TSNullKeyword || node.type === AST_NODE_TYPES.TSUndefinedKeyword;\n}\n\nfunction isNullableArrayOnly(node: TSESTree.TSUnionType): boolean {\n const values = node.types.filter((member) => !isNullishType(member));\n return values.length > 0 && values.length < node.types.length && values.every(isArrayType);\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"prefer-non-nullable-collection\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Require array types to use an empty array instead of explicit nullish unions with two equivalent empty states.\",\n },\n schema: [],\n messages: {\n preferNonNullableCollection:\n \"`{{name}}` is a nullable array, so nullish and `[]` represent the same empty collection. Use a non-null array and default omitted values to `[]`.\",\n },\n },\n defaultOptions: [],\n create(context) {\n const normalizedFilename = context.filename.replaceAll(\"\\\\\", \"/\");\n if (\n isTestFile(context.filename) ||\n isGeneratedFile(context.filename, context.sourceCode.text) ||\n /\\/(?:vendor|vendored)\\//u.test(normalizedFilename)\n ) {\n return {};\n }\n\n function checkOptionalProperty(\n node: TSESTree.TSPropertySignature | TSESTree.PropertyDefinition,\n ): void {\n const annotation = node.typeAnnotation?.typeAnnotation;\n if (annotation === undefined) return;\n if (annotation.type !== AST_NODE_TYPES.TSUnionType || !isNullableArrayOnly(annotation)) {\n return;\n }\n context.report({\n node,\n messageId: \"preferNonNullableCollection\",\n data: { name: propertyName(node) },\n });\n }\n\n return {\n TSPropertySignature: checkOptionalProperty,\n PropertyDefinition: checkOptionalProperty,\n TSTypeAliasDeclaration(node): void {\n if (node.typeAnnotation.type !== AST_NODE_TYPES.TSUnionType) return;\n if (!isNullableArrayOnly(node.typeAnnotation)) return;\n context.report({\n node,\n messageId: \"preferNonNullableCollection\",\n data: { name: node.id.name },\n });\n },\n };\n },\n});\n","/**\n * @fileoverview prefer-schema-for-api-payload — reading a field off `response.json()` propagates `any` inward from the network boundary.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/prefer-schema-for-api-payload.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/prefer-schema-for-api-payload.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\nimport type { RuleContext, Scope } from \"@typescript-eslint/utils/ts-eslint\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isGeneratedFile, isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"unparsedJsonAccess\";\ntype Options = readonly [];\n\ntype Ctx = Readonly<RuleContext<MessageIds, Options>>;\n\n/**\n * Peel TypeScript wrapper nodes that don't affect the underlying value\n * (`as Foo`, `<Foo>x`, `x!`, `x satisfies Foo`, parentheses, optional chain\n * wrappers). Returns the inner expression we actually care about.\n */\nconst unwrap = (\n node: TSESTree.Node | null | undefined,\n): TSESTree.Node | null => {\n let current: TSESTree.Node | null | undefined = node;\n while (current !== null && current !== undefined) {\n if (\n current.type === AST_NODE_TYPES.TSAsExpression ||\n current.type === AST_NODE_TYPES.TSTypeAssertion ||\n current.type === AST_NODE_TYPES.TSNonNullExpression ||\n current.type === AST_NODE_TYPES.TSSatisfiesExpression\n ) {\n current = current.expression;\n } else if (current.type === AST_NODE_TYPES.ChainExpression) {\n current = current.expression;\n } else {\n break;\n }\n }\n return current ?? null;\n};\n\n/**\n * Promise-chain links that pass the payload along unchanged. `.parse` /\n * `.safeParse` are NOT here — those are the validation the rule is asking for.\n */\nconst PROMISE_CHAIN_METHODS: ReadonlySet<string> = new Set([\n \"then\",\n \"catch\",\n \"finally\",\n]);\n\n/** True for `ZUser.parse` / `ZUser.safeParse` handed to a chain link as a callback. */\nconst isSchemaParseReference = (\n node: TSESTree.Node | null | undefined,\n): boolean => {\n const inner = unwrap(node);\n return (\n inner !== null &&\n inner.type === AST_NODE_TYPES.MemberExpression &&\n !inner.computed &&\n inner.property.type === AST_NODE_TYPES.Identifier &&\n (inner.property.name === \"parse\" || inner.property.name === \"safeParse\")\n );\n};\n\n/**\n * Returns true if the expression is (optionally awaited) a raw payload source:\n * `<x>.json()` (a fetch/Request body) or `JSON.parse(<x>)`.\n *\n * Both hand back `any`, and the failure mode is the same: `payload.user.id`\n * type-checks against a shape the peer never sent, and surfaces at runtime as\n * `undefined` several frames away. Note this only matters at the point a FIELD\n * is read — `const raw: unknown = JSON.parse(body)` is the recommended shape and\n * is never reported, because nothing is accessed off it.\n */\nconst isRawPayloadSource = (\n node: TSESTree.Node | null | undefined,\n): boolean => {\n let current = unwrap(node);\n if (current === null) return false;\n if (current.type === AST_NODE_TYPES.AwaitExpression) {\n current = unwrap(current.argument);\n }\n if (current === null || current.type !== AST_NODE_TYPES.CallExpression) {\n return false;\n }\n const callee = unwrap(current.callee);\n if (callee === null || callee.type !== AST_NODE_TYPES.MemberExpression) {\n return false;\n }\n const property = unwrap(callee.property);\n if (property === null || property.type !== AST_NODE_TYPES.Identifier) {\n return false;\n }\n if (property.name === \"json\") {\n return true;\n }\n // A promise-chain link does not change what the value IS: the result of\n // `res.json().catch(() => ({}))` is still an unvalidated payload, and before\n // this the binding went untracked so the real field read below it was missed.\n // Unless the chain ends in a schema parse, in which case it is validated.\n if (PROMISE_CHAIN_METHODS.has(property.name)) {\n return (\n !current.arguments.some(isSchemaParseReference) &&\n isRawPayloadSource(callee.object)\n );\n }\n // `JSON.parse(...)` specifically — not any `.parse()`, which is usually the\n // schema validation we are asking for.\n const object = unwrap(callee.object);\n return (\n property.name === \"parse\" &&\n object !== null &&\n object.type === AST_NODE_TYPES.Identifier &&\n object.name === \"JSON\" &&\n // ...but not `JSON.parse(readFileSync(p, \"utf8\"))` — see isLocalFileRead.\n !isLocalFileRead(current.arguments[0])\n );\n};\n\n/** Filesystem readers whose result is repo-local text, not a peer's payload. */\nconst FILE_READ_RE = /^(readFile|readFileSync|readJson|readJsonSync|readJSON)$/;\n\n/**\n * True when the expression tree contains a filesystem read, i.e. the JSON came\n * off local disk rather than off the wire.\n *\n * The rule's premise is that the value is \"unvalidated and attacker-controlled\".\n * `JSON.parse(readFileSync(\"package.json\", \"utf8\"))` is neither: the bytes ship\n * with the repo, nobody else can write them, and a Zod schema over a file the\n * build already depends on adds a second place to update.\n */\nconst isLocalFileRead = (node: TSESTree.Node | null | undefined): boolean => {\n let found = false;\n const visit = (current: TSESTree.Node | null | undefined): void => {\n if (found || current === null || current === undefined) return;\n if (current.type === AST_NODE_TYPES.CallExpression) {\n const callee = unwrap(current.callee);\n const name =\n callee?.type === AST_NODE_TYPES.Identifier\n ? callee.name\n : callee?.type === AST_NODE_TYPES.MemberExpression &&\n !callee.computed &&\n callee.property.type === AST_NODE_TYPES.Identifier\n ? callee.property.name\n : null;\n if (name !== null && FILE_READ_RE.test(name)) {\n found = true;\n return;\n }\n }\n for (const key of Object.keys(current) as (keyof TSESTree.Node)[]) {\n if (key === \"parent\") continue;\n const value = current[key];\n for (const child of (Array.isArray(value) ? value : [value]) as unknown[]) {\n if (\n child !== null &&\n typeof child === \"object\" &&\n typeof (child as { type?: unknown }).type === \"string\"\n ) {\n visit(child as TSESTree.Node);\n }\n }\n }\n };\n visit(node);\n return found;\n};\n\n/** Assertion helpers whose argument is being checked, not consumed. */\nconst ASSERTION_CALLEE_RE = /^(expect|assert|should|invariant)$/;\n\n/**\n * True when the node sits inside an assertion call, e.g.\n * `expect(loaderData.method).toEqual(\"GET\")`.\n *\n * The rule's premise is that the field is READ and trusted. Inside an assertion\n * it is neither: the assertion states what the value must be, which is the same\n * check a schema would perform, and a schema parse would move the failure away\n * from the assertion that explains it.\n */\nconst isInsideAssertion = (node: TSESTree.Node): boolean => {\n for (\n let current: TSESTree.Node | undefined | null = node.parent;\n current !== undefined && current !== null;\n current = current.parent\n ) {\n if (current.type !== AST_NODE_TYPES.CallExpression) continue;\n let callee: TSESTree.Node = current.callee;\n while (callee.type === AST_NODE_TYPES.MemberExpression) {\n callee = callee.object;\n }\n if (callee.type === AST_NODE_TYPES.CallExpression) {\n callee = callee.callee;\n }\n if (\n callee.type === AST_NODE_TYPES.Identifier &&\n ASSERTION_CALLEE_RE.test(callee.name)\n ) {\n return true;\n }\n }\n return false;\n};\n\nconst findVariable = (\n scope: Scope.Scope | null,\n name: string,\n): Scope.Variable | null => {\n let current: Scope.Scope | null = scope;\n while (current !== null) {\n const variable = current.set.get(name);\n if (variable !== undefined) return variable;\n current = current.upper;\n }\n return null;\n};\n\n/**\n * Calls that CHECK their argument rather than trust it: a type-guard predicate\n * (`isProtectedResourceMetadata`) or a named validator.\n */\nconst GUARD_NAME_RE = /^(?:is|validate|parse|assert|decode|coerce)[A-Z]/;\n\n/**\n * True when the read is being TYPE-TESTED rather than trusted — the operand of\n * a `typeof`, the sole argument of `Array.isArray(...)`, or an argument to a\n * guard/validator call.\n *\n * This SKIPS the report without untracking the variable, so a later unguarded\n * read of a different field still fires. Recall cost 0 of 45.\n */\nconst isValidationRead = (node: TSESTree.Node): boolean => {\n let current: TSESTree.Node = node;\n let parent: TSESTree.Node | null | undefined = current.parent;\n while (\n parent !== null &&\n parent !== undefined &&\n (parent.type === AST_NODE_TYPES.TSAsExpression ||\n parent.type === AST_NODE_TYPES.TSTypeAssertion ||\n parent.type === AST_NODE_TYPES.TSNonNullExpression ||\n parent.type === AST_NODE_TYPES.TSSatisfiesExpression ||\n parent.type === AST_NODE_TYPES.ChainExpression)\n ) {\n current = parent;\n parent = parent.parent;\n }\n if (parent === null || parent === undefined) return false;\n\n if (\n parent.type === AST_NODE_TYPES.UnaryExpression &&\n parent.operator === \"typeof\" &&\n parent.argument === current\n ) {\n return true;\n }\n if (\n parent.type !== AST_NODE_TYPES.CallExpression ||\n !parent.arguments.some((arg): boolean => arg === current)\n ) {\n return false;\n }\n const callee = parent.callee;\n if (\n callee.type === AST_NODE_TYPES.MemberExpression &&\n !callee.computed &&\n callee.object.type === AST_NODE_TYPES.Identifier &&\n callee.object.name === \"Array\" &&\n callee.property.type === AST_NODE_TYPES.Identifier &&\n callee.property.name === \"isArray\"\n ) {\n return parent.arguments.length === 1;\n }\n return (\n callee.type === AST_NODE_TYPES.Identifier && GUARD_NAME_RE.test(callee.name)\n );\n};\n\n/**\n * True when a call sits in a boolean-test position (`if`/`while`/`for`/`?:`),\n * seen through `!`, `&&`/`||`, and optional-chaining wrappers — i.e. it narrows.\n */\nconst isGuardTestPosition = (node: TSESTree.Node): boolean => {\n let current: TSESTree.Node = node;\n let parent: TSESTree.Node | null | undefined = current.parent;\n while (parent !== undefined && parent !== null) {\n switch (parent.type) {\n case AST_NODE_TYPES.UnaryExpression:\n case AST_NODE_TYPES.LogicalExpression:\n case AST_NODE_TYPES.ChainExpression:\n current = parent;\n parent = parent.parent;\n continue;\n case AST_NODE_TYPES.IfStatement:\n case AST_NODE_TYPES.ConditionalExpression:\n case AST_NODE_TYPES.WhileStatement:\n case AST_NODE_TYPES.DoWhileStatement:\n case AST_NODE_TYPES.ForStatement:\n return parent.test === current;\n default:\n return false;\n }\n }\n return false;\n};\n\nconst isUnvalidatedVariableRef = (\n node: TSESTree.Node | null | undefined,\n scope: Scope.Scope,\n tracked: ReadonlySet<Scope.Variable>,\n): boolean => {\n const unwrapped = unwrap(node);\n if (unwrapped === null || unwrapped.type !== AST_NODE_TYPES.Identifier) {\n return false;\n }\n const variable = findVariable(scope, unwrapped.name);\n return variable !== null && tracked.has(variable);\n};\n\nexport default createRule<Options, MessageIds>({\n name: \"prefer-schema-for-api-payload\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Require Zod (or similar) schema validation on `response.json()` / `JSON.parse()` results before property access.\",\n },\n schema: [],\n messages: {\n unparsedJsonAccess:\n \"Property access on an unvalidated payload (`response.json()` / `JSON.parse()`) without a schema parse. Pipe through `XSchema.parse(...)` (Zod) before reading fields.\",\n },\n },\n defaultOptions: [],\n create(context: Ctx) {\n // A fixture parses what it just produced and asserts on it; see @fileoverview.\n if (isTestFile(context.filename) || isGeneratedFile(context.filename, context.sourceCode.text)) {\n return {};\n }\n\n const unvalidatedVariables = new Set<Scope.Variable>();\n\n /**\n * True when every binding a destructuring pattern introduces is type-tested\n * somewhere. Requiring EVERY binding (not any) keeps the report when one\n * field is checked and another is used unvalidated.\n */\n const isFullyNarrowedPattern = (\n declarator: TSESTree.VariableDeclarator,\n ): boolean => {\n const declared = context.sourceCode.getDeclaredVariables(declarator);\n return (\n declared.length > 0 &&\n declared.every((variable) =>\n variable.references.some((reference) =>\n isValidationRead(reference.identifier),\n ),\n )\n );\n };\n\n const trackInitializer = (\n declarator: TSESTree.VariableDeclarator,\n ): void => {\n if (!isRawPayloadSource(declarator.init)) return;\n const declaredVars = context.sourceCode.getDeclaredVariables(declarator);\n const variable = declaredVars[0];\n if (variable !== undefined) {\n unvalidatedVariables.add(variable);\n }\n };\n\n return {\n VariableDeclarator(node): void {\n const scope = context.sourceCode.getScope(node);\n\n if (node.id.type === AST_NODE_TYPES.Identifier) {\n trackInitializer(node);\n return;\n }\n\n if (\n node.id.type === AST_NODE_TYPES.ObjectPattern ||\n node.id.type === AST_NODE_TYPES.ArrayPattern\n ) {\n if (isRawPayloadSource(node.init)) {\n // `const { cacheTag } = await req.json()` where EVERY binding the\n // pattern introduces is then type-tested is the same \"the read IS\n // the validation\" case as `isValidationRead`, one node up.\n if (!isFullyNarrowedPattern(node)) {\n context.report({ node: node.id, messageId: \"unparsedJsonAccess\" });\n }\n return;\n }\n if (\n isUnvalidatedVariableRef(node.init, scope, unvalidatedVariables)\n ) {\n context.report({ node: node.id, messageId: \"unparsedJsonAccess\" });\n }\n }\n },\n AssignmentExpression(node): void {\n const scope = context.sourceCode.getScope(node);\n\n if (node.left.type === AST_NODE_TYPES.Identifier) {\n const variable = findVariable(scope, node.left.name);\n if (variable === null) return;\n if (isRawPayloadSource(node.right)) {\n unvalidatedVariables.add(variable);\n } else {\n // Reassigned to a parse call or something else: drop tracking.\n unvalidatedVariables.delete(variable);\n }\n return;\n }\n\n if (\n node.left.type === AST_NODE_TYPES.ObjectPattern ||\n node.left.type === AST_NODE_TYPES.ArrayPattern\n ) {\n if (isRawPayloadSource(node.right)) {\n context.report({\n node: node.left,\n messageId: \"unparsedJsonAccess\",\n });\n return;\n }\n if (\n isUnvalidatedVariableRef(node.right, scope, unvalidatedVariables)\n ) {\n context.report({\n node: node.left,\n messageId: \"unparsedJsonAccess\",\n });\n }\n }\n },\n CallExpression(node): void {\n if (node.callee.type !== AST_NODE_TYPES.Identifier) return;\n if (!GUARD_NAME_RE.test(node.callee.name) && !isGuardTestPosition(node)) {\n return;\n }\n const scope = context.sourceCode.getScope(node);\n for (const arg of node.arguments) {\n if (arg.type === AST_NODE_TYPES.SpreadElement) continue;\n const unwrapped = unwrap(arg);\n if (unwrapped === null || unwrapped.type !== AST_NODE_TYPES.Identifier) {\n continue;\n }\n const variable = findVariable(scope, unwrapped.name);\n if (variable !== null) unvalidatedVariables.delete(variable);\n }\n },\n MemberExpression(node): void {\n // The read is inside an assertion — the assertion IS the validation.\n if (isInsideAssertion(node)) return;\n // The read is being type-tested, not trusted. Skipping WITHOUT\n // untracking leaves a later unguarded read of another field reportable.\n if (isValidationRead(node)) return;\n const scope = context.sourceCode.getScope(node);\n const obj = unwrap(node.object);\n\n if (isRawPayloadSource(obj)) {\n // Direct `.foo` access on `(await r.json()).foo` is always bad,\n // unless the parent call is a `.parse()`/`.safeParse()` (a\n // validation) or a `.then()`/`.catch()`/`.finally()` (a promise-chain\n // link, not a field read — `isRawPayloadSource` carries the taint\n // through it so the real read below still fires).\n const parent = node.parent;\n if (\n parent.type === AST_NODE_TYPES.CallExpression &&\n parent.callee === node &&\n node.property.type === AST_NODE_TYPES.Identifier &&\n (node.property.name === \"parse\" ||\n node.property.name === \"safeParse\" ||\n PROMISE_CHAIN_METHODS.has(node.property.name))\n ) {\n return;\n }\n context.report({ node, messageId: \"unparsedJsonAccess\" });\n return;\n }\n\n if (\n obj !== null &&\n obj.type === AST_NODE_TYPES.Identifier &&\n isUnvalidatedVariableRef(obj, scope, unvalidatedVariables)\n ) {\n context.report({ node, messageId: \"unparsedJsonAccess\" });\n const variable = findVariable(scope, obj.name);\n if (variable !== null) {\n unvalidatedVariables.delete(variable);\n }\n }\n },\n };\n },\n});\n","/**\n * @fileoverview prefer-semantic-colors — a raw palette class or hex literal pins a colour the design system can no longer retheme.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/prefer-semantic-colors.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/prefer-semantic-colors.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\nimport { existsSync, readdirSync, readFileSync } from \"fs\";\nimport { dirname, join, parse } from \"path\";\n\nimport { createRule } from \"./_docs.js\";\nimport { classTokens, tailwindBase } from \"./_tailwind.js\";\n\ntype MessageIds = \"rawPalette\" | \"arbitraryColor\" | \"inlineColor\";\ntype Options = readonly [\n {\n requireSemanticTokens?: boolean;\n }?,\n];\n\nconst COLOR_PREFIXES =\n \"text|bg|border(?:-[trblxyse])?|ring(?:-offset)?|fill|stroke|from|via|to|divide|decoration|placeholder|accent|caret|shadow|outline\";\nconst PALETTE =\n \"red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|violet|purple|fuchsia|pink|rose|slate|gray|zinc|neutral|stone\";\nconst COLOR_FN = \"rgba?|hsla?|hwb|oklch|oklab|lab|lch|color\";\n\nconst PALETTE_STEP = \"50|[1-9]00|950\";\nconst RAW_PALETTE_RE = new RegExp(`^(?:${COLOR_PREFIXES})-(?:${PALETTE})-(?:${PALETTE_STEP})(?:/\\\\d{1,3})?$`);\nconst ARBITRARY_COLOR_RE = new RegExp(\n `^(?:${COLOR_PREFIXES})-\\\\[(?:#[0-9a-fA-F]{3,8}|(?:${COLOR_FN})\\\\([^\\\\]]*\\\\))\\\\]$`,\n \"i\",\n);\n\n/** Call expressions whose string args are className fragments. */\nconst CLASS_FNS = new Set<string>([\"cn\", \"clsx\", \"cva\", \"tv\", \"cx\", \"twMerge\", \"classnames\", \"classNames\"]);\nconst CLASS_NAME_RE = /class/i;\n\n/** CSS color-bearing properties, in their JSX (camelCase) and SVG-attribute forms. */\nconst STYLE_COLOR_PROPS = new Set<string>([\n \"color\",\n \"background\",\n \"backgroundColor\",\n \"borderColor\",\n \"borderTopColor\",\n \"borderRightColor\",\n \"borderBottomColor\",\n \"borderLeftColor\",\n \"outlineColor\",\n \"caretColor\",\n \"textDecorationColor\",\n \"columnRuleColor\",\n \"fill\",\n \"stroke\",\n \"stopColor\",\n \"floodColor\",\n \"lightingColor\",\n]);\nconst RAW_COLOR_VALUE_RE = new RegExp(`#[0-9a-fA-F]{3,8}\\\\b|\\\\b(?:${COLOR_FN})\\\\s*\\\\(`, \"i\");\n\nconst CSS_VAR_REFERENCE_RE = /var\\(\\s*--/;\n\nconst STORIES_FILE_RE = /\\.stories\\.[cm]?[jt]sx?$/i;\n\n/**\n * Token ROLES, not one vendor's token NAMES.\n *\n * The previous vocabulary was shadcn's and only shadcn's, so a repo with a\n * complete, consistently used design system was read as having none and the\n * `requireSemanticTokens` gate suppressed the rule across the whole repo.\n * Medusa is the worked example: its system is `bg-ui-bg-base` /\n * `text-ui-fg-subtle` backed by `--fg-base` / `--bg-base` custom properties, so\n * its `globals.css` was FOUND and then REJECTED. `dub` names its tokens\n * `content-default` / `bg-default` and lost the same way.\n *\n * Detection errs deliberately towards \"a system exists\". Guessing yes leaves\n * the rule RUNNING, and an author can disable any line it reports with a\n * reason; guessing no silently disables an error-level rule for a whole\n * repository, and nobody finds out. Those costs are not symmetric, which is why\n * this is a role vocabulary rather than an exact token list.\n */\nconst TOKEN_ROLES =\n \"background|foreground|primary|secondary|muted|accent|destructive|danger|success|warning|info|border|card|popover|surface|content|base|subtle|default|ring|input|fg|bg\";\nconst SEMANTIC_TOKEN_RE = new RegExp(\n `--(?:color-)?(?:${TOKEN_ROLES})\\\\b|(?:bg|text|border|ring|fill|stroke)-(?:ui-)?(?:${TOKEN_ROLES})\\\\b`,\n);\n\n/**\n * Tailwind v4 is CSS-first: there is no `tailwind.config.*` to find, and the\n * theme lives in an `@theme` block in the stylesheet. Without this, every v4\n * setup reads as \"no design system\" and the gate suppresses the rule.\n */\nconst THEME_BLOCK_RE = /@theme\\b/;\n\n/**\n * Files whose PRESENCE alone proves a configured Tailwind design system.\n *\n * Reading these for a token vocabulary was the second half of the same defect.\n * A `tailwind.config.*` frequently defines its theme by importing a preset\n * (`presets: [require(\"@medusajs/ui-preset\")]`) or by spreading a shared\n * object, so the token names are not textually present in the file that proves\n * they exist. `components.json` was already treated this way; the config files\n * are the same kind of evidence and are now treated the same.\n */\nconst PRESENCE_MARKERS = [\n \"components.json\",\n \"tailwind.config.js\",\n \"tailwind.config.cjs\",\n \"tailwind.config.mjs\",\n \"tailwind.config.ts\",\n \"tailwind.config.mts\",\n \"tailwind.config.cts\",\n];\n\n/**\n * Stylesheets that only count as evidence if they actually DECLARE tokens.\n *\n * Unlike a Tailwind config, the existence of a `globals.css` says nothing — every\n * app has one. So these are read and matched against `SEMANTIC_TOKEN_RE` or the\n * v4 `@theme` block.\n */\nconst CSS_DETECTION_FILES = [\n \"app/globals.css\",\n \"app/global.css\",\n \"app/styles/globals.css\",\n \"src/app/globals.css\",\n \"src/app/global.css\",\n \"src/global.css\",\n \"src/index.css\",\n \"src/styles/globals.css\",\n \"src/styles/index.css\",\n \"styles/globals.css\",\n \"styles/index.css\",\n];\n/**\n * Files that mark a directory as the root of a multi-package workspace.\n *\n * `package.json` is handled separately: only a `workspaces` field counts, since\n * every package has a `package.json` and treating it as a root would stop the\n * sideways scan at the nearest leaf package.\n */\nconst WORKSPACE_ROOT_FILES = [\n \"pnpm-workspace.yaml\",\n \"pnpm-workspace.yml\",\n \"turbo.json\",\n \"lerna.json\",\n];\n\n/** Where workspace packages live when the root declares no globs, or none parse. */\nconst DEFAULT_WORKSPACE_GLOBS = [\"packages/*\", \"apps/*\"];\n\n/** Upper bound on the sideways scan, so a huge monorepo cannot stall a lint run. */\nconst MAX_WORKSPACE_PACKAGES = 512;\n\n/** \"Is there a detection file at or above this directory?\" — a pure ancestry fact. */\nconst ancestryCache = new Map<string, boolean>();\n\n/** \"Does any package of this workspace carry a detection file?\", keyed by root. */\nconst workspaceScanCache = new Map<string, boolean>();\n\n/** Nearest workspace root at or above a directory, `null` if there is none. */\nconst workspaceRootCache = new Map<string, string | null>();\n\n/** SVG container elements whose children carry structural (not UI-token) colors. */\nconst SVG_DEFS_CONTAINERS = new Set<string>([\n \"mask\",\n \"clipPath\",\n \"defs\",\n \"pattern\",\n \"linearGradient\",\n \"radialGradient\",\n]);\n\n/** Neutral fill/stroke literals that are SVG drawing data, never a UI token. */\nconst SVG_EXEMPT_COLOR_VALUES = new Set<string>([\n \"#fff\",\n \"#ffffff\",\n \"#000\",\n \"#000000\",\n \"transparent\",\n \"none\",\n \"currentcolor\",\n \"inherit\",\n]);\n\n// A `fill`/`stroke` literal anywhere inside an `<svg>` subtree is drawing data\n// (icon/illustration artwork), not a reusable UI token — the color is inherent to\n// the graphic. Exempt any descendant of `<svg>` (which subsumes the defs\n// containers `<mask>`/`<clipPath>`/`<defs>`/`<pattern>`/gradients).\nfunction jsxElementName(node: TSESTree.JSXElement): string | null {\n const name = node.openingElement.name;\n if (name.type === AST_NODE_TYPES.JSXIdentifier) return name.name;\n if (name.type === AST_NODE_TYPES.JSXMemberExpression && name.property.type === AST_NODE_TYPES.JSXIdentifier) {\n return name.property.name;\n }\n return null;\n}\n\nfunction isSvgLikeElementName(name: string): boolean {\n return name === \"svg\" || SVG_DEFS_CONTAINERS.has(name) || /svg$/i.test(name);\n}\n\n/**\n * Intrinsic lowercase SVG shape primitives.\n *\n * A `fill`/`stroke` on a lowercase `<path>` is never a reusable-UI-token\n * position — real component styling goes through `className` or `style`, which\n * this guard does not touch — so the recall cost is zero.\n */\nconst SVG_SHAPE_PRIMITIVES = new Set<string>([\n \"circle\",\n \"ellipse\",\n \"g\",\n \"line\",\n \"path\",\n \"polygon\",\n \"polyline\",\n \"rect\",\n \"stop\",\n \"text\",\n \"tspan\",\n \"use\",\n]);\n\n/**\n * Files rendered by react-email or react-pdf.\n *\n * CSS-variable-backed semantic tokens cannot work in either target. `<Tailwind>`\n * from `@react-email/components` compiles classes to inline styles at render\n * time, and `hsl(var(--primary))` is undefined in a mail client; react-pdf has\n * no CSS custom properties at all. Raw palette classes and literal hex are the\n * correct practice there, so the rule's advice is unfollowable.\n */\nconst EMAIL_OR_PDF_IMPORT_RE = /@react-(?:email|pdf)\\//;\n\nconst isInsideSvg = (node: TSESTree.Node): boolean => {\n let current: TSESTree.Node | null | undefined = node.parent;\n while (current !== undefined && current !== null) {\n if (current.type === AST_NODE_TYPES.JSXElement) {\n const name = jsxElementName(current);\n if (name !== null && isSvgLikeElementName(name)) return true;\n }\n current = current.parent;\n }\n return false;\n};\n\nconst isInsideIconFactoryPath = (node: TSESTree.Node): boolean => {\n let current: TSESTree.Node | null | undefined = node.parent;\n while (current !== undefined && current !== null) {\n if (\n current.type === AST_NODE_TYPES.Property &&\n propName(current.key) === \"path\" &&\n current.parent.type === AST_NODE_TYPES.ObjectExpression &&\n current.parent.parent.type === AST_NODE_TYPES.CallExpression &&\n current.parent.parent.callee.type === AST_NODE_TYPES.Identifier &&\n current.parent.parent.callee.name === \"createIcon\"\n ) {\n return true;\n }\n current = current.parent;\n }\n return false;\n};\n\n/** Does this one directory carry a design-token marker? */\nconst hasMarkerAt = (dir: string): boolean => {\n if (PRESENCE_MARKERS.some((rel) => existsSync(join(dir, rel)))) return true;\n for (const rel of CSS_DETECTION_FILES) {\n const candidate = join(dir, rel);\n if (!existsSync(candidate)) continue;\n try {\n const css = readFileSync(candidate, \"utf8\");\n if (SEMANTIC_TOKEN_RE.test(css) || THEME_BLOCK_RE.test(css)) return true;\n } catch {\n // Ignore unreadable stylesheets; absence of evidence means no report.\n }\n }\n return false;\n};\n\n/**\n * Is there a marker at or above `startDir`? Walks to the filesystem root.\n *\n * There is deliberately no depth budget. A budget introduces a third answer —\n * \"ran out\" — which has to be reported as one of the other two, and reporting it\n * as \"no design system\" made this gate's result depend on the ORDER files were\n * linted in.\n *\n * Every visited directory is memoised, so the walk runs once per tree. Caching\n * the resolved answer for all of them is sound: each sits at or below wherever\n * the answer was settled, so \"at or above\" holds for each of them too.\n */\nconst hasMarkerAtOrAbove = (startDir: string): boolean => {\n let dir = startDir;\n const root = parse(dir).root;\n const visited: string[] = [];\n let answer: boolean;\n\n for (;;) {\n const cached = ancestryCache.get(dir);\n if (cached !== undefined) {\n answer = cached;\n break;\n }\n visited.push(dir);\n if (hasMarkerAt(dir)) {\n answer = true;\n break;\n }\n const parent = dirname(dir);\n if (dir === root || parent === dir) {\n answer = false;\n break;\n }\n dir = parent;\n }\n\n for (const seen of visited) ancestryCache.set(seen, answer);\n return answer;\n};\n\n/**\n * The workspace globs a root declares, from `package.json` or `pnpm-workspace.yaml`.\n *\n * The YAML is read with a line regex rather than a parser: a dependency-free rule\n * cannot pull one in, and the only shape that matters is the flat `packages:`\n * list every pnpm workspace writes.\n */\nconst readWorkspaceGlobs = (dir: string): string[] => {\n const globs: string[] = [];\n\n const packageJson = join(dir, \"package.json\");\n if (existsSync(packageJson)) {\n try {\n const parsed: unknown = JSON.parse(readFileSync(packageJson, \"utf8\"));\n const declared =\n typeof parsed === \"object\" && parsed !== null && \"workspaces\" in parsed\n ? (parsed as { workspaces?: unknown }).workspaces\n : undefined;\n const list = Array.isArray(declared)\n ? declared\n : typeof declared === \"object\" &&\n declared !== null &&\n Array.isArray((declared as { packages?: unknown }).packages)\n ? (declared as { packages: unknown[] }).packages\n : [];\n for (const entry of list) if (typeof entry === \"string\") globs.push(entry);\n } catch {\n // A malformed package.json is not this rule's problem to report.\n }\n }\n\n for (const name of [\"pnpm-workspace.yaml\", \"pnpm-workspace.yml\"]) {\n const yaml = join(dir, name);\n if (!existsSync(yaml)) continue;\n try {\n for (const line of readFileSync(yaml, \"utf8\").split(\"\\n\")) {\n const match = /^\\s*-\\s*[\"']?([^\"'#\\s]+)[\"']?\\s*$/u.exec(line);\n if (match?.[1] !== undefined) globs.push(match[1]);\n }\n } catch {\n // Same.\n }\n }\n\n return globs;\n};\n\n/** Expand a workspace glob one level: `packages/*`, `packages/**`, or a literal path. */\nconst expandWorkspaceGlob = (root: string, glob: string): string[] => {\n const star = glob.indexOf(\"*\");\n if (star === -1) return [join(root, glob)];\n\n const prefix = glob.slice(0, star).replace(/\\/$/u, \"\");\n const parent = prefix === \"\" ? root : join(root, prefix);\n try {\n return readdirSync(parent, { withFileTypes: true })\n .filter((entry) => entry.isDirectory() && !entry.name.startsWith(\".\"))\n .map((entry) => join(parent, entry.name));\n } catch {\n return [];\n }\n};\n\n/** Nearest directory at or above `startDir` that declares a multi-package workspace. */\nconst findWorkspaceRoot = (startDir: string): string | null => {\n let dir = startDir;\n const root = parse(dir).root;\n const visited: string[] = [];\n let answer: string | null;\n\n for (;;) {\n const cached = workspaceRootCache.get(dir);\n if (cached !== undefined) {\n answer = cached;\n break;\n }\n visited.push(dir);\n if (\n WORKSPACE_ROOT_FILES.some((name) => existsSync(join(dir, name))) ||\n readWorkspaceGlobs(dir).length > 0\n ) {\n answer = dir;\n break;\n }\n const parent = dirname(dir);\n if (dir === root || parent === dir) {\n answer = null;\n break;\n }\n dir = parent;\n }\n\n for (const seen of visited) workspaceRootCache.set(seen, answer);\n return answer;\n};\n\n/**\n * Does any package of this workspace carry a design-token marker?\n *\n * An upward walk alone silences a whole monorepo whose token config lives in a\n * sibling package: no ancestor chain from a source file passes through it. A\n * token system in a sibling package is still a token system — that is what a\n * workspace IS — so the scan goes sideways from the workspace root when, and only\n * when, the upward walk has already come back empty.\n */\nconst workspaceHasMarker = (root: string): boolean => {\n const cached = workspaceScanCache.get(root);\n if (cached !== undefined) return cached;\n\n const globs = readWorkspaceGlobs(root);\n const candidates = new Set<string>();\n for (const glob of globs.length > 0 ? globs : DEFAULT_WORKSPACE_GLOBS) {\n for (const dir of expandWorkspaceGlob(root, glob)) {\n candidates.add(dir);\n if (candidates.size >= MAX_WORKSPACE_PACKAGES) break;\n }\n if (candidates.size >= MAX_WORKSPACE_PACKAGES) break;\n }\n\n let found = false;\n for (const dir of candidates) {\n if (hasMarkerAt(dir)) {\n found = true;\n break;\n }\n }\n workspaceScanCache.set(root, found);\n return found;\n};\n\n/** Does a design-token system exist anywhere this file's project can see? */\nconst hasSemanticTokenSystem = (filename: string): boolean => {\n const dir = dirname(filename);\n if (hasMarkerAtOrAbove(dir)) return true;\n const root = findWorkspaceRoot(dir);\n return root !== null && workspaceHasMarker(root);\n};\n\nconst propName = (key: TSESTree.Property[\"key\"]): string | null => {\n if (key.type === AST_NODE_TYPES.Identifier) return key.name;\n if (key.type === AST_NODE_TYPES.Literal && typeof key.value === \"string\") return key.value;\n return null;\n};\n\nexport default createRule<Options, MessageIds>({\n name: \"prefer-semantic-colors\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Enforce design-system semantic color tokens (bg-primary, text-destructive, …) over raw Tailwind palette classes (text-red-500), arbitrary color values (bg-[#fff]), and inline color literals.\",\n },\n schema: [\n {\n type: \"object\",\n additionalProperties: false,\n properties: {\n requireSemanticTokens: { type: \"boolean\" },\n },\n },\n ],\n messages: {\n rawPalette:\n \"Raw palette class '{{class}}' — use a semantic token (e.g. text-foreground, bg-primary, text-destructive, bg-muted).\",\n arbitraryColor:\n \"Hardcoded color '{{class}}' — use a semantic token, or var(--…). For charts/brand add an eslint-disable with a reason.\",\n inlineColor:\n \"Hardcoded color '{{value}}' — use a semantic token / CSS variable. For charts/standalone pages add an eslint-disable with a reason.\",\n },\n },\n defaultOptions: [{}],\n create(context, [options]) {\n if (STORIES_FILE_RE.test(context.filename)) return {};\n if (EMAIL_OR_PDF_IMPORT_RE.test(context.sourceCode.getText())) return {};\n if (options?.requireSemanticTokens === true && !hasSemanticTokenSystem(context.filename)) {\n return {};\n }\n\n const reportClasses = (value: string, node: TSESTree.Node): void => {\n for (const token of classTokens(value)) {\n const base = tailwindBase(token);\n if (RAW_PALETTE_RE.test(base)) {\n context.report({ node, messageId: \"rawPalette\", data: { class: token } });\n } else if (ARBITRARY_COLOR_RE.test(base) && !CSS_VAR_REFERENCE_RE.test(base)) {\n context.report({ node, messageId: \"arbitraryColor\", data: { class: token } });\n }\n }\n };\n\n // Walk a node that holds className fragments: strings, templates, arrays, cva\n // variant objects, and conditionals. CallExpressions are handled separately, so\n // they're not recursed here (avoids double-reporting cn()/cva() args).\n const checkClassNode = (node: TSESTree.Node | null): void => {\n if (node === null) return;\n switch (node.type) {\n case AST_NODE_TYPES.Literal:\n if (typeof node.value === \"string\") reportClasses(node.value, node);\n break;\n case AST_NODE_TYPES.TemplateLiteral:\n for (const quasi of node.quasis) reportClasses(quasi.value.cooked ?? \"\", quasi);\n break;\n case AST_NODE_TYPES.ArrayExpression:\n for (const element of node.elements) {\n if (element !== null && element.type !== AST_NODE_TYPES.SpreadElement) checkClassNode(element);\n }\n break;\n case AST_NODE_TYPES.ObjectExpression:\n for (const property of node.properties) {\n if (property.type === AST_NODE_TYPES.Property) checkClassNode(property.value);\n }\n break;\n case AST_NODE_TYPES.ConditionalExpression:\n checkClassNode(node.consequent);\n checkClassNode(node.alternate);\n break;\n case AST_NODE_TYPES.LogicalExpression:\n checkClassNode(node.right);\n break;\n default:\n break;\n }\n };\n\n const checkColorValueNode = (node: TSESTree.Node): void => {\n if (\n node.type === AST_NODE_TYPES.Literal &&\n typeof node.value === \"string\" &&\n RAW_COLOR_VALUE_RE.test(node.value) &&\n !CSS_VAR_REFERENCE_RE.test(node.value)\n ) {\n context.report({ node, messageId: \"inlineColor\", data: { value: node.value } });\n }\n };\n\n return {\n \"JSXAttribute[name.name='className']\"(node: TSESTree.JSXAttribute): void {\n if (node.value === null) return;\n if (node.value.type === AST_NODE_TYPES.Literal) checkClassNode(node.value);\n else if (node.value.type === AST_NODE_TYPES.JSXExpressionContainer) {\n if (node.value.expression.type !== AST_NODE_TYPES.JSXEmptyExpression) {\n checkClassNode(node.value.expression);\n }\n }\n },\n CallExpression(node: TSESTree.CallExpression): void {\n if (node.callee.type === AST_NODE_TYPES.Identifier && CLASS_FNS.has(node.callee.name)) {\n for (const arg of node.arguments) {\n if (arg.type !== AST_NODE_TYPES.SpreadElement) checkClassNode(arg);\n }\n }\n },\n VariableDeclarator(node: TSESTree.VariableDeclarator): void {\n if (node.id.type === AST_NODE_TYPES.Identifier && CLASS_NAME_RE.test(node.id.name)) {\n checkClassNode(node.init);\n }\n },\n Property(node: TSESTree.Property): void {\n const name = propName(node.key);\n if (name !== null && CLASS_NAME_RE.test(name)) checkClassNode(node.value);\n },\n // SVG presentation attributes: <path fill=\"#7c3aed\" stroke=\"#7c3aed\" />.\n // Neutral drawing literals and anything inside an SVG defs container are\n // structural, not UI tokens, so they never fire.\n \"JSXAttribute[name.name=/^(fill|stroke|color)$/]\"(node: TSESTree.JSXAttribute): void {\n if (node.value?.type !== AST_NODE_TYPES.Literal) return;\n const owner = node.parent.name;\n if (owner.type === AST_NODE_TYPES.JSXIdentifier && SVG_SHAPE_PRIMITIVES.has(owner.name)) {\n return;\n }\n if (\n typeof node.value.value === \"string\" &&\n SVG_EXEMPT_COLOR_VALUES.has(node.value.value.toLowerCase())\n ) {\n return;\n }\n if (isInsideSvg(node) || isInsideIconFactoryPath(node)) return;\n checkColorValueNode(node.value);\n },\n \"JSXAttribute[name.name='style'] ObjectExpression > Property\"(node: TSESTree.Property): void {\n const name = propName(node.key);\n if (name !== null && STYLE_COLOR_PROPS.has(name)) checkColorValueNode(node.value);\n },\n };\n },\n});\n","/**\n * @fileoverview _tailwind — shared className-position helpers, so the Tailwind rules visit string literals and template quasis alike.\n *\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/_tailwind.md\n */\n\n/**\n * Strip Tailwind variant prefixes (`hover:`, `dark:`, `focus-visible:`, …) and a\n * leading `!` important marker, leaving the bare utility. Variants are\n * `[a-z0-9-]+:` runs at the start; a bracketed arbitrary value never starts a\n * token, so the `:` inside `[url(http://…)]` is not a variant separator.\n */\nexport const tailwindBase = (token: string): string =>\n token.replace(/^(?:[a-z0-9-]+:)+/i, \"\").replace(/^!/, \"\");\n\n/** Split a className string into its non-empty class tokens. */\nexport const classTokens = (value: string): readonly string[] =>\n value.split(/\\s+/).filter(Boolean);\n","/**\n * @fileoverview prefer-server-actions — an internal `/api/*` mutation hand-rolls the transport, types and error path a Server Action gets from the framework.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/prefer-server-actions.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/prefer-server-actions.md\n */\n\nimport { type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport type { RuleContext, Scope } from \"@typescript-eslint/utils/ts-eslint\";\n\ntype MessageIds = \"preferServerAction\";\ntype Options = readonly [];\n\nconst MUTATION_METHODS = new Set([\"POST\", \"PUT\", \"DELETE\", \"PATCH\"]);\nconst AXIOS_MUTATION_METHODS = new Set([\"post\", \"put\", \"delete\", \"patch\"]);\n\nconst SKIP_FILE_REGEX =\n /(?:\\.test\\.[jt]sx?$|\\.spec\\.[jt]sx?$|-(?:test|spec)\\.[jt]sx?$|\\/tests?\\/|\\/__tests__\\/|\\/__testfixtures__\\/|\\/scripts?\\/|\\/app\\/api\\/.*\\/route\\.[jt]sx?$|\\/pages\\/api\\/)/;\n\nconst NON_REACT_FRAMEWORK_RE =\n /^(?:@angular\\/|@nestjs\\/|vue$|vue\\/|svelte$|svelte\\/|solid-js$|solid-js\\/|@ember\\/|rxjs$|rxjs\\/)/;\n\ntype Ctx = Readonly<RuleContext<MessageIds, Options>>;\n\nfunction getScope(\n context: Ctx,\n node: TSESTree.Node,\n): Scope.Scope {\n return context.sourceCode.getScope(node);\n}\n\n/**\n * Walk up the scope chain looking for a variable declared with a single\n * initializer; if found, return the initializer expression so we can analyze\n * it. Falls back to the original node when resolution is not possible.\n */\nfunction resolveNode(\n node: TSESTree.Node | null | undefined,\n context: Ctx,\n): TSESTree.Node | null {\n if (!node) return null;\n if (node.type !== \"Identifier\") return node;\n\n let scope: Scope.Scope | null = getScope(context, node);\n while (scope) {\n const variable = scope.set.get(node.name);\n if (variable && variable.defs.length === 1) {\n const def = variable.defs[0];\n if (def && def.type === \"Variable\") {\n const declarator = def.node;\n if (\n declarator.type === \"VariableDeclarator\" &&\n declarator.init\n ) {\n return declarator.init;\n }\n }\n }\n scope = scope.upper;\n }\n return node;\n}\n\nfunction isApiUrl(\n node: TSESTree.Node | null | undefined,\n context: Ctx,\n): boolean {\n const resolved = resolveNode(node, context);\n if (!resolved) return false;\n\n if (resolved.type === \"Literal\" && typeof resolved.value === \"string\") {\n return resolved.value.startsWith(\"/api/\");\n }\n if (resolved.type === \"TemplateLiteral\") {\n const firstQuasi = resolved.quasis[0];\n const cooked = firstQuasi?.value.cooked;\n return typeof cooked === \"string\" && cooked.startsWith(\"/api/\");\n }\n if (resolved.type === \"BinaryExpression\" && resolved.operator === \"+\") {\n return isApiUrl(resolved.left, context);\n }\n return false;\n}\n\nfunction isMutationMethod(\n node: TSESTree.Node | null | undefined,\n context: Ctx,\n): boolean {\n const resolved = resolveNode(node, context);\n if (!resolved) return false;\n\n if (resolved.type === \"Literal\" && typeof resolved.value === \"string\") {\n return MUTATION_METHODS.has(resolved.value.toUpperCase());\n }\n\n if (\n resolved.type === \"TemplateLiteral\" &&\n resolved.expressions.length === 0\n ) {\n const val = resolved.quasis.map((q) => q.value.cooked).join(\"\");\n return MUTATION_METHODS.has(val.toUpperCase());\n }\n\n if (resolved.type === \"ConditionalExpression\") {\n return (\n isMutationMethod(resolved.consequent, context) ||\n isMutationMethod(resolved.alternate, context)\n );\n }\n\n if (resolved.type === \"LogicalExpression\" && resolved.operator === \"||\") {\n return (\n isMutationMethod(resolved.left, context) ||\n isMutationMethod(resolved.right, context)\n );\n }\n\n return false;\n}\n\nfunction getPropertyNode(\n objNode: TSESTree.Node | null | undefined,\n propName: string,\n): TSESTree.Node | null {\n if (!objNode || objNode.type !== \"ObjectExpression\") return null;\n for (const prop of objNode.properties) {\n if (prop.type !== \"Property\") continue;\n let keyName: string | null = null;\n if (prop.key.type === \"Identifier\" && !prop.computed) {\n keyName = prop.key.name;\n } else if (\n prop.key.type === \"Literal\" &&\n typeof prop.key.value === \"string\"\n ) {\n keyName = prop.key.value;\n }\n if (keyName === propName) {\n // Skip destructuring patterns — they're not valid as config values.\n if (\n prop.value.type === \"AssignmentPattern\" ||\n prop.value.type === \"ArrayPattern\" ||\n prop.value.type === \"ObjectPattern\"\n ) {\n return null;\n }\n return prop.value;\n }\n }\n return null;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"prefer-server-actions\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Prefer Next.js Server Actions over /api/* mutations.\",\n },\n schema: [],\n messages: {\n preferServerAction:\n \"Mutation against /api/* — prefer a Next.js Server Action for type-safety and to avoid the JSON round-trip.\",\n },\n },\n defaultOptions: [],\n create(context) {\n const filename = context.filename;\n if (SKIP_FILE_REGEX.test(filename)) {\n return {};\n }\n\n // Set by the ImportDeclaration visitor. Imports are hoisted to the top of a\n // module, so every one is seen before the first CallExpression below.\n let isNonReactFramework = false;\n\n return {\n ImportDeclaration(node) {\n if (\n typeof node.source.value === \"string\" &&\n NON_REACT_FRAMEWORK_RE.test(node.source.value)\n ) {\n isNonReactFramework = true;\n }\n },\n CallExpression(node) {\n if (isNonReactFramework) return;\n let isMutation = false;\n\n // 1. Standard fetch('/api/orders', { method: 'POST' })\n if (\n node.callee.type === \"Identifier\" &&\n node.callee.name === \"fetch\"\n ) {\n const urlArg = node.arguments[0];\n if (urlArg && urlArg.type !== \"SpreadElement\" && isApiUrl(urlArg, context)) {\n const initArg = node.arguments[1];\n if (initArg && initArg.type !== \"SpreadElement\") {\n const resolvedInit = resolveNode(initArg, context);\n const methodNode = getPropertyNode(resolvedInit, \"method\");\n if (methodNode && isMutationMethod(methodNode, context)) {\n isMutation = true;\n }\n }\n }\n }\n // 2. Custom wrappers or Axios: api.post('/api/orders') or axios.put('/api/orders')\n else if (\n node.callee.type === \"MemberExpression\" &&\n node.callee.property.type === \"Identifier\" &&\n !node.callee.computed\n ) {\n const methodName = node.callee.property.name.toLowerCase();\n if (AXIOS_MUTATION_METHODS.has(methodName)) {\n const urlArg = node.arguments[0];\n // Skip Express-style route definitions like\n // `router.post('/api/x', handler)`: a function argument means this\n // is registering a handler, not issuing a client mutation.\n const hasHandlerArg = node.arguments.some(\n (arg) =>\n arg.type === \"ArrowFunctionExpression\" ||\n arg.type === \"FunctionExpression\",\n );\n if (\n urlArg &&\n urlArg.type !== \"SpreadElement\" &&\n !hasHandlerArg &&\n isApiUrl(urlArg, context)\n ) {\n isMutation = true;\n }\n }\n }\n // 3. Direct axios/request call: axios({ method: 'post', url: '/api/orders' })\n else if (\n node.callee.type === \"Identifier\" &&\n (node.callee.name === \"axios\" || node.callee.name === \"request\")\n ) {\n const firstArg = node.arguments[0];\n if (firstArg && firstArg.type !== \"SpreadElement\") {\n const configArg = resolveNode(firstArg, context);\n if (configArg && configArg.type === \"ObjectExpression\") {\n const urlNode = getPropertyNode(configArg, \"url\");\n const methodNode = getPropertyNode(configArg, \"method\");\n if (\n urlNode &&\n isApiUrl(urlNode, context) &&\n methodNode &&\n isMutationMethod(methodNode, context)\n ) {\n isMutation = true;\n }\n }\n }\n }\n\n if (isMutation) {\n context.report({ node, messageId: \"preferServerAction\" });\n }\n },\n };\n },\n});\n","/**\n * @fileoverview prefer-string-literal-union — a raw `string` field with a closed set of values accepts every value outside it.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/prefer-string-literal-union.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/prefer-string-literal-union.md\n */\n\nimport { createRule } from \"./_docs.js\";\nimport {\n ESLintUtils,\n type TSESTree,\n type ParserServicesWithTypeInformation,\n AST_NODE_TYPES,\n} from \"@typescript-eslint/utils\";\nimport * as ts from \"typescript\";\n\ntype MessageIds = \"bareChoiceField\" | \"comparisonCluster\";\ntype Options = readonly [\n {\n ignoreFields?: readonly string[];\n }?,\n];\n\ntype FunctionNode =\n | TSESTree.FunctionDeclaration\n | TSESTree.FunctionExpression\n | TSESTree.ArrowFunctionExpression;\n\nconst CHOICE_TOKENS: ReadonlySet<string> = new Set([\n \"status\",\n \"state\",\n \"kind\",\n \"role\",\n \"priority\",\n \"severity\",\n \"direction\",\n \"tier\",\n \"stage\",\n \"type\",\n \"mode\",\n \"level\",\n]);\n\nconst LOWER_TOKEN_RE = /^[a-z][a-z0-9_-]{0,30}$/;\nconst MIN_CLUSTER_SIZE = 2;\n\nconst BOOLEANISH: ReadonlySet<string> = new Set([\"true\", \"false\"]);\n\n/**\n * An enum-shaped token worth a string-literal union: a short lowercase word of\n * 2+ chars that isn't a boolean-string. Single characters (`'a'`), file\n * paths/URLs/i18n keys (contain `/`, `:`, `.`), and `'true'`/`'false'` are NOT\n * closed-enum members — comparing against them is a flag/path/boolean guard.\n */\n\nfunction isEnumToken(lit: string): boolean {\n return LOWER_TOKEN_RE.test(lit) && lit.length >= 2 && !BOOLEANISH.has(lit);\n}\n\nconst IGNORE_PATTERNS: readonly RegExp[] = [\n /[\\\\/]generated[\\\\/]/,\n /\\.gen\\.tsx?$/,\n /\\.generated\\.tsx?$/,\n /\\.d\\.ts$/,\n];\n\nfunction isIgnoredFile(filename: string, sourceText: string): boolean {\n if (IGNORE_PATTERNS.some((re) => re.test(filename))) {\n return true;\n }\n return /@generated\\b/.test(sourceText.slice(0, 1024));\n}\n\n/**\n * The trailing word of a camelCase / snake_case identifier, lowercased.\n * `callStatus` -> `status`, `user_role` -> `role`, `estate` -> `estate`.\n */\nfunction lastWord(name: string): string {\n const words = name\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .split(/[_\\s]+/)\n .filter((w) => w.length > 0);\n const last = words[words.length - 1] ?? name;\n return last.toLowerCase();\n}\n\nfunction isChoiceLikeName(name: string): boolean {\n return CHOICE_TOKENS.has(lastWord(name));\n}\n\nfunction keyName(\n key: TSESTree.PropertyDefinition[\"key\"] | TSESTree.PropertyName,\n): string | null {\n if (key.type === AST_NODE_TYPES.Identifier) {\n return key.name;\n }\n if (key.type === AST_NODE_TYPES.Literal && typeof key.value === \"string\") {\n return key.value;\n }\n return null;\n}\n\nfunction isStringLiteralMember(t: TSESTree.TypeNode): boolean {\n return (\n t.type === AST_NODE_TYPES.TSLiteralType &&\n t.literal.type === AST_NODE_TYPES.Literal &&\n typeof t.literal.value === \"string\"\n );\n}\n\n/** Whether a type node is a union of 2+ string-literal types. */\nfunction isStringLiteralUnion(node: TSESTree.TypeNode | undefined): boolean {\n if (node?.type !== AST_NODE_TYPES.TSUnionType) {\n return false;\n }\n return node.types.filter(isStringLiteralMember).length >= MIN_CLUSTER_SIZE;\n}\n\n/**\n * Whether a resolved TS type includes the general `string` type — as opposed to\n * being (a union of) string-literal types. `CallStatus = \"a\" | \"b\"` has no\n * general-string member and is already the target state; a raw `string` (or\n * `string | undefined`) does, and a comparison cluster on it should become a\n * union. Requires type information; the comparison-cluster path is inert\n * without it.\n */\nfunction typeHasRawString(type: ts.Type): boolean {\n const parts = type.isUnion() ? type.types : [type];\n return parts.some((t) => (t.flags & ts.TypeFlags.String) !== 0);\n}\n\nfunction isExternalSourceFile(sf: ts.SourceFile | undefined): boolean {\n if (sf === undefined) {\n return false;\n }\n return sf.isDeclarationFile || sf.fileName.includes(\"/node_modules/\");\n}\n\nfunction symbolIsExternallyDeclared(sym: ts.Symbol | undefined): boolean {\n return (\n sym?.declarations?.some((d) => isExternalSourceFile(d.getSourceFile())) ??\n false\n );\n}\n\n/**\n * The iterable expression a destructuring binding element draws its value from,\n * e.g. `Object.entries(x)` for `key` in `for (const [key] of Object.entries(x))`\n * or the RHS of `const { a } = rhs`.\n */\nfunction bindingSourceExpression(\n decl: ts.BindingElement,\n): ts.Expression | undefined {\n let node: ts.Node = decl.parent;\n while (\n !ts.isForOfStatement(node) &&\n !(ts.isVariableDeclaration(node) && node.initializer !== undefined)\n ) {\n if (node.parent === undefined) {\n return undefined;\n }\n node = node.parent;\n }\n return ts.isForOfStatement(node) ? node.expression : node.initializer;\n}\n\n/** A stable key for a plain identifier or non-computed member chain, else null. */\nfunction refKey(node: TSESTree.Node): string | null {\n if (node.type === AST_NODE_TYPES.Identifier) {\n return node.name;\n }\n if (node.type === AST_NODE_TYPES.MemberExpression && !node.computed) {\n const inner = refKey(node.object);\n if (inner === null || node.property.type !== AST_NODE_TYPES.Identifier) {\n return null;\n }\n return `${inner}.${node.property.name}`;\n }\n return null;\n}\n\nfunction strLiteral(node: TSESTree.Node): string | null {\n if (node.type === AST_NODE_TYPES.Literal && typeof node.value === \"string\") {\n return node.value;\n }\n return null;\n}\n\ninterface ClusterEntry {\n node: TSESTree.Node;\n literals: Set<string>;\n allTokens: boolean;\n}\n\ninterface Scope {\n clusters: Map<string, ClusterEntry>;\n /** The function this scope belongs to; null at file scope. */\n fn: FunctionNode | null;\n}\n\ninterface CollectedProperty {\n name: string;\n container: TSESTree.Node;\n node: TSESTree.Node;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"prefer-string-literal-union\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Flag raw `string` choice fields and string-literal comparison clusters; prefer a string-literal union type.\",\n },\n schema: [\n {\n type: \"object\",\n additionalProperties: false,\n properties: {\n ignoreFields: {\n type: \"array\",\n items: { type: \"string\" },\n },\n },\n },\n ],\n messages: {\n bareChoiceField:\n '`{{name}}: string` looks like a choice field — prefer a string-literal union type (e.g. `type X = \"a\" | \"b\"`). Enums are banned by `no-enum`; use a union.',\n comparisonCluster:\n '`{{key}}` is compared against a closed set of string literals — define a string-literal union type (e.g. `type X = \"a\" | \"b\"`).',\n },\n },\n defaultOptions: [{}],\n create(context, [optionsArg]) {\n const filename = context.filename;\n const sourceText = context.sourceCode.getText();\n if (isIgnoredFile(filename, sourceText)) {\n return {};\n }\n\n const ignoredFields = new Set(\n (optionsArg?.ignoreFields ?? []).map((name) => name.toLowerCase()),\n );\n\n let services: ParserServicesWithTypeInformation | null;\n try {\n services = ESLintUtils.getParserServices(context);\n } catch {\n services = null;\n }\n\n const scopeStack: Scope[] = [];\n const validClusters: TSESTree.Node[] = [];\n const bareChoiceProps: CollectedProperty[] = [];\n const containersWithUnion = new Set<TSESTree.Node>();\n\n function operandIsRawString(node: TSESTree.Node): boolean {\n if (services === null) {\n return false;\n }\n return typeHasRawString(services.getTypeAtLocation(node));\n }\n\n /**\n * Whether the compared value provably originates from a type we don't own —\n * a property of a `.d.ts` / node_modules type (DOM `getComputedStyle().overflowY`,\n * `Task.status` from another package), the return of such a method\n * (`URLSearchParams.get()`, `str.toLowerCase()`), or a destructuring of one\n * (`Object.entries()` keys). A string-literal union is not an available fix\n * for these, so the cluster shape must not flag them.\n */\n function originIsExternal(node: ts.Node | undefined, depth: number): boolean {\n if (node === undefined || services === null || depth > 6) {\n return false;\n }\n const checker = services.program.getTypeChecker();\n if (\n ts.isParenthesizedExpression(node) ||\n ts.isNonNullExpression(node) ||\n ts.isAsExpression(node)\n ) {\n return originIsExternal(node.expression, depth + 1);\n }\n if (ts.isPropertyAccessExpression(node)) {\n return symbolIsExternallyDeclared(checker.getSymbolAtLocation(node.name));\n }\n if (ts.isCallExpression(node)) {\n return originIsExternal(node.expression, depth + 1);\n }\n if (ts.isIdentifier(node)) {\n const decl = checker.getSymbolAtLocation(node)?.valueDeclaration;\n if (decl === undefined) {\n return false;\n }\n if (ts.isVariableDeclaration(decl) && decl.initializer !== undefined) {\n return originIsExternal(decl.initializer, depth + 1);\n }\n if (ts.isBindingElement(decl)) {\n return originIsExternal(bindingSourceExpression(decl), depth + 1);\n }\n }\n return false;\n }\n\n function operandIsFlaggable(node: TSESTree.Node): boolean {\n return (\n operandIsRawString(node) &&\n !originIsExternal(services?.esTreeNodeToTSNodeMap.get(node), 0)\n );\n }\n\n /**\n * The string-literal members of a function's DECLARED return type, resolved\n * through named aliases and `Promise<...>`. Null when the function has no\n * annotation, type information is unavailable, or the type is not a\n * string-literal union. Computed lazily — only for a function that actually\n * accumulated a cluster — since it costs a type resolution.\n */\n function declaredReturnLiterals(fn: FunctionNode): ReadonlySet<string> | null {\n const annotation = fn.returnType?.typeAnnotation;\n if (annotation === undefined || services === null) {\n return null;\n }\n const tsNode = services.esTreeNodeToTSNodeMap.get(annotation);\n if (!ts.isTypeNode(tsNode)) {\n return null;\n }\n const checker = services.program.getTypeChecker();\n const declared = checker.getTypeFromTypeNode(tsNode);\n const type = checker.getAwaitedType(declared) ?? declared;\n const literals = new Set<string>();\n for (const part of type.isUnion() ? type.types : [type]) {\n if (part.isStringLiteral()) {\n literals.add(part.value);\n }\n }\n return literals.size >= MIN_CLUSTER_SIZE ? literals : null;\n }\n\n function pushScope(node: FunctionNode): void {\n scopeStack.push({ clusters: new Map(), fn: node });\n }\n\n function popScope(): void {\n const scope = scopeStack.pop();\n if (scope === undefined) {\n return;\n }\n const candidates = [...scope.clusters.values()].filter(\n (entry) => entry.allTokens && entry.literals.size >= MIN_CLUSTER_SIZE,\n );\n if (candidates.length === 0) {\n return;\n }\n const returnLiterals =\n scope.fn === null ? null : declaredReturnLiterals(scope.fn);\n for (const entry of candidates) {\n // The enclosing function declares the very union being compared against:\n // this is the narrowing boundary that produces it, so the `string`\n // operand is required, not a defect.\n if (\n returnLiterals !== null &&\n [...entry.literals].every((lit) => returnLiterals.has(lit))\n ) {\n continue;\n }\n validClusters.push(entry.node);\n }\n }\n\n function accumulate(\n key: string,\n literals: string[],\n node: TSESTree.Node,\n ): void {\n const scope = scopeStack[scopeStack.length - 1];\n if (scope === undefined) {\n return;\n }\n const allTokens = literals.every((lit) => isEnumToken(lit));\n const existing = scope.clusters.get(key);\n if (existing === undefined) {\n scope.clusters.set(key, {\n node,\n literals: new Set(literals),\n allTokens,\n });\n return;\n }\n for (const lit of literals) {\n existing.literals.add(lit);\n }\n existing.allTokens = existing.allTokens && allTokens;\n }\n\n function collectProperty(\n key: TSESTree.PropertyDefinition[\"key\"] | TSESTree.PropertyName,\n typeNode: TSESTree.TypeNode | undefined,\n container: TSESTree.Node,\n node: TSESTree.Node,\n ): void {\n if (isStringLiteralUnion(typeNode)) {\n containersWithUnion.add(container);\n return;\n }\n if (typeNode?.type !== AST_NODE_TYPES.TSStringKeyword) {\n return;\n }\n const name = keyName(key);\n if (\n name === null ||\n !isChoiceLikeName(name) ||\n ignoredFields.has(name.toLowerCase())\n ) {\n return;\n }\n bareChoiceProps.push({ name, container, node });\n }\n\n return {\n FunctionDeclaration: pushScope,\n \"FunctionDeclaration:exit\": popScope,\n FunctionExpression: pushScope,\n \"FunctionExpression:exit\": popScope,\n ArrowFunctionExpression: pushScope,\n \"ArrowFunctionExpression:exit\": popScope,\n\n BinaryExpression(node: TSESTree.BinaryExpression): void {\n if (\n node.operator !== \"===\" &&\n node.operator !== \"!==\" &&\n node.operator !== \"==\" &&\n node.operator !== \"!=\"\n ) {\n return;\n }\n const leftKey = refKey(node.left);\n const rightLit = strLiteral(node.right);\n const rightKey = refKey(node.right);\n const leftLit = strLiteral(node.left);\n if (leftKey !== null && rightLit !== null) {\n if (operandIsFlaggable(node.left)) {\n accumulate(leftKey, [rightLit], node);\n }\n } else if (rightKey !== null && leftLit !== null) {\n if (operandIsFlaggable(node.right)) {\n accumulate(rightKey, [leftLit], node);\n }\n }\n },\n\n SwitchStatement(node: TSESTree.SwitchStatement): void {\n const key = refKey(node.discriminant);\n if (key === null || !operandIsFlaggable(node.discriminant)) {\n return;\n }\n const literals: string[] = [];\n for (const c of node.cases) {\n if (c.test !== null) {\n const lit = strLiteral(c.test);\n if (lit !== null) {\n literals.push(lit);\n }\n }\n }\n if (literals.length > 0) {\n accumulate(key, literals, node);\n }\n },\n\n TSPropertySignature(node: TSESTree.TSPropertySignature): void {\n collectProperty(\n node.key,\n node.typeAnnotation?.typeAnnotation,\n node.parent,\n node,\n );\n },\n\n PropertyDefinition(node: TSESTree.PropertyDefinition): void {\n collectProperty(\n node.key,\n node.typeAnnotation?.typeAnnotation,\n node.parent,\n node,\n );\n },\n\n \"Program:exit\"(): void {\n for (const clusterNode of validClusters) {\n context.report({\n node: clusterNode,\n messageId: \"comparisonCluster\",\n data: { key: refKeyText(clusterNode) },\n });\n }\n for (const prop of bareChoiceProps) {\n if (containersWithUnion.has(prop.container)) {\n context.report({\n node: prop.node,\n messageId: \"bareChoiceField\",\n data: { name: prop.name },\n });\n }\n }\n },\n };\n\n function refKeyText(node: TSESTree.Node): string {\n if (node.type === AST_NODE_TYPES.BinaryExpression) {\n return refKey(node.left) ?? refKey(node.right) ?? \"value\";\n }\n if (node.type === AST_NODE_TYPES.SwitchStatement) {\n return refKey(node.discriminant) ?? \"value\";\n }\n return \"value\";\n }\n },\n});\n","/**\n * @fileoverview prefer-whole-object-assertion — a run of `expect`s on one receiver fails on the first mismatch and says nothing about the rest of the value.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/prefer-whole-object-assertion.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/prefer-whole-object-assertion.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isGeneratedFile, isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"combineAssertions\" | \"assertArrayOnce\";\ntype Options = readonly [];\n\n/**\n * Matchers whose per-key meaning `toMatchObject` reproduces exactly — but only\n * against a primitive literal, where `Object.is`, deep equality and strict deep\n * equality all coincide. See `literalText` for the other half of that pair.\n */\nconst MERGEABLE_MATCHERS: ReadonlySet<string> = new Set([\"toBe\", \"toEqual\", \"toStrictEqual\"]);\n\n/**\n * Matchers whose whole-array form (`expect(a).toEqual([...])`) preserves the\n * per-element comparison. `toBe` is excluded: element-wise identity is not what\n * `toEqual` on the array would check.\n */\nconst ARRAY_MATCHERS: ReadonlySet<string> = new Set([\"toEqual\", \"toStrictEqual\"]);\n\n/**\n * Properties whose receiver is a collection rather than a record. A run keyed on\n * `length` or `size` describes an array / Map / Set, and `toMatchObject` cannot\n * state a collection's size — this is the `.length`-mixed-with-elements class.\n */\nconst COLLECTION_PROPERTIES: ReadonlySet<string> = new Set([\"length\", \"size\"]);\n\n/**\n * Property names whose meaning as an OBJECT-LITERAL KEY is not \"a property of\n * this name\". There is exactly one in JavaScript.\n *\n * `__proto__: v` in a literal is the prototype SETTER, so the key never exists\n * and `toMatchObject` never checks it — the fix would DELETE the assertion it\n * claims to be merging. Quoting does not help: `\"__proto__\": v` is the same\n * production. The whole run is dropped rather than the one key, because there\n * is no `toMatchObject` literal that says what the run says.\n *\n * Audited for siblings: `constructor`, `toString`, `valueOf` and every other\n * inherited name ARE plain own keys in a literal, and jest's `subsetEquality`\n * walks the prototype chain when reading them off the received value, so those\n * merge faithfully. `get x() {}` / `async x() {}` are different PRODUCTIONS,\n * not different key names, and this fixer only ever emits `key: value`.\n */\nconst LITERAL_KEY_HAZARDS: ReadonlySet<string> = new Set([\"__proto__\"]);\n\n/** `-1` parses as a unary expression, not a literal, but it is still constant. */\nconst NUMERIC_SIGNS: ReadonlySet<string> = new Set([\"-\", \"+\"]);\n\n/** A run shorter than this is a single assertion; there is nothing to combine. */\nconst MIN_RUN_LENGTH = 2;\n\n/** How a run reaches into its receiver: `o.name`, or `xs[0]`. */\ntype AssertionKey =\n | { readonly kind: \"property\"; readonly name: string }\n | { readonly kind: \"index\"; readonly index: number };\n\ninterface Assertion {\n readonly statement: TSESTree.ExpressionStatement;\n /** The object the asserted member expression hangs off — the run's grouping key. */\n readonly receiver: TSESTree.Expression;\n readonly key: AssertionKey;\n readonly matcher: string;\n /** Source text of the expected value; `\"null\"` synthesised for `toBeNull()`. */\n readonly expectedText: string;\n /** False when the expected value is not a primitive literal, so cannot be merged. */\n readonly expectedIsLiteral: boolean;\n}\n\n/**\n * Source text of `node` when it is a primitive literal, otherwise `null`.\n * Regular expressions are excluded: `toBe(/x/)` is an identity check that\n * `toEqual` and `toMatchObject` do not reproduce.\n */\nfunction literalText(node: TSESTree.Node, getText: (node: TSESTree.Node) => string): string | null {\n switch (node.type) {\n case AST_NODE_TYPES.Literal:\n return \"regex\" in node ? null : getText(node);\n case AST_NODE_TYPES.TemplateLiteral:\n return node.expressions.length === 0 ? getText(node) : null;\n case AST_NODE_TYPES.UnaryExpression:\n return NUMERIC_SIGNS.has(node.operator) && literalText(node.argument, getText) !== null\n ? getText(node)\n : null;\n default:\n return null;\n }\n}\n\n/**\n * True for a receiver that can be evaluated twice with the same effect: an\n * identifier, `this`, or a member chain over one. A call anywhere in the chain\n * makes the merged form invoke it fewer times than the run did.\n *\n * The `node.optional` guard below — and its twin on `actual` in\n * `parseAssertion` — cannot be reached by any input, and no test pins them:\n * every optional link wraps the whole expression in a `ChainExpression`, which\n * `parseAssertion` has already rejected, and a parenthesised `(a?.b).c` leaves a\n * `ChainExpression` in the object position where this function's `default` arm\n * catches it. They are kept as belt and braces against a parser that stops\n * emitting `ChainExpression`, not because anything currently depends on them —\n * recorded here so the next reader does not spend an afternoon writing the test\n * that would prove them live.\n */\nfunction isPureReceiver(node: TSESTree.Node): boolean {\n switch (node.type) {\n case AST_NODE_TYPES.Identifier:\n case AST_NODE_TYPES.ThisExpression:\n return true;\n case AST_NODE_TYPES.MemberExpression:\n if (node.optional) {\n return false;\n }\n if (node.computed) {\n return node.property.type === AST_NODE_TYPES.Literal && isPureReceiver(node.object);\n }\n return isPureReceiver(node.object);\n default:\n return false;\n }\n}\n\n/** A non-negative integer array index written as a literal, else `null`. */\nfunction literalIndex(node: TSESTree.Node): number | null {\n if (node.type !== AST_NODE_TYPES.Literal || typeof node.value !== \"number\") {\n return null;\n }\n return Number.isInteger(node.value) && node.value >= 0 ? node.value : null;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"prefer-whole-object-assertion\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Collapse a run of consecutive assertions on the same object into one assertion about the whole object, so every mismatch is reported and nothing outside the asserted keys goes unchecked.\",\n },\n fixable: \"code\",\n messages: {\n combineAssertions:\n \"These {{count}} assertions each check one property of `{{receiver}}` against a literal, so the first mismatch hides the rest. Assert the object once: `expect({{receiver}}).toMatchObject({ … })`.\",\n assertArrayOnce:\n \"These {{count}} assertions check `{{receiver}}[0]`…`{{receiver}}[{{last}}]` one at a time, which never checks how long `{{receiver}}` is — extra elements pass unnoticed. Assert the array once: `expect({{receiver}}).{{matcher}}([ … ])`.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n if (!isTestFile(context.filename) || isGeneratedFile(context.filename, context.sourceCode.text)) {\n return {};\n }\n const { sourceCode } = context;\n\n function parseAssertion(statement: TSESTree.Statement): Assertion | null {\n if (statement.type !== AST_NODE_TYPES.ExpressionStatement) {\n return null;\n }\n const call = statement.expression;\n if (call.type !== AST_NODE_TYPES.CallExpression) {\n return null;\n }\n const callee = call.callee;\n if (\n callee.type !== AST_NODE_TYPES.MemberExpression ||\n callee.computed ||\n callee.property.type !== AST_NODE_TYPES.Identifier\n ) {\n return null;\n }\n const matcher = callee.property.name;\n const expectCall = callee.object;\n if (\n expectCall.type !== AST_NODE_TYPES.CallExpression ||\n expectCall.callee.type !== AST_NODE_TYPES.Identifier ||\n expectCall.callee.name !== \"expect\" ||\n expectCall.arguments.length !== 1\n ) {\n return null;\n }\n const actual = expectCall.arguments[0];\n if (actual === undefined || actual.type !== AST_NODE_TYPES.MemberExpression || actual.optional) {\n return null;\n }\n if (!isPureReceiver(actual.object)) {\n return null;\n }\n\n let key: AssertionKey;\n if (actual.computed) {\n const index = literalIndex(actual.property);\n if (index === null) {\n return null;\n }\n key = { kind: \"index\", index };\n } else {\n if (\n actual.property.type !== AST_NODE_TYPES.Identifier ||\n COLLECTION_PROPERTIES.has(actual.property.name) ||\n LITERAL_KEY_HAZARDS.has(actual.property.name)\n ) {\n return null;\n }\n key = { kind: \"property\", name: actual.property.name };\n }\n\n if (matcher === \"toBeNull\" && call.arguments.length === 0) {\n return { statement, receiver: actual.object, key, matcher, expectedText: \"null\", expectedIsLiteral: true };\n }\n if (!MERGEABLE_MATCHERS.has(matcher)) {\n return null;\n }\n const expected = call.arguments[0];\n if (call.arguments.length !== 1 || expected === undefined || expected.type === AST_NODE_TYPES.SpreadElement) {\n return null;\n }\n const literal = literalText(expected, (node) => sourceCode.getText(node));\n return {\n statement,\n receiver: actual.object,\n key,\n matcher,\n expectedText: literal ?? sourceCode.getText(expected),\n expectedIsLiteral: literal !== null,\n };\n }\n\n /**\n * True when a comment sits inside the span the fix rewrites — between two\n * statements of the run, or inside one of them.\n *\n * Such a comment cannot survive: the statements after the first are DELETED,\n * so their leading comments are left dangling above the merged assertion,\n * describing a statement that no longer exists. Worst case the dangling line\n * is an `eslint-disable-next-line`, which then becomes a fresh unused-directive\n * error the author did not write. Dropping a comment is also not \"exactly\n * equivalent to the code it replaces\", so the report stands and the fix is\n * withheld for a human.\n */\n function hasInterveningComment(run: readonly Assertion[]): boolean {\n return run.some(\n (assertion, index) =>\n sourceCode.getCommentsInside(assertion.statement).length > 0 ||\n (index > 0 && sourceCode.getCommentsBefore(assertion.statement).length > 0),\n );\n }\n\n /**\n * A property run is reportable only when the merged `toMatchObject` says\n * exactly what the run says: every matcher mergeable, every expected value a\n * primitive literal, and every key distinct so nothing is lost to a\n * duplicate object property.\n */\n function reportPropertyRun(run: readonly Assertion[]): void {\n const names = new Set<string>();\n for (const assertion of run) {\n if (assertion.key.kind !== \"property\" || !assertion.expectedIsLiteral) {\n return;\n }\n if (!MERGEABLE_MATCHERS.has(assertion.matcher) && assertion.matcher !== \"toBeNull\") {\n return;\n }\n if (names.has(assertion.key.name)) {\n return;\n }\n names.add(assertion.key.name);\n }\n const first = run[0];\n if (first === undefined) {\n return;\n }\n const receiverText = sourceCode.getText(first.receiver);\n const properties = run\n .map((assertion) =>\n assertion.key.kind === \"property\" ? `${assertion.key.name}: ${assertion.expectedText}` : \"\",\n )\n .join(\", \");\n context.report({\n node: first.statement,\n messageId: \"combineAssertions\",\n data: { count: String(run.length), receiver: receiverText },\n fix: hasInterveningComment(run)\n ? null\n : (fixer) => [\n fixer.replaceText(first.statement, `expect(${receiverText}).toMatchObject({ ${properties} });`),\n ...run.slice(1).map((assertion) => fixer.remove(assertion.statement)),\n ],\n });\n }\n\n /**\n * An indexed run is reportable when the indices cover `0..n-1` exactly and\n * one `toEqual` / `toStrictEqual` runs throughout, so `expect(xs).toEqual([…])`\n * makes the same per-element comparisons plus the length check the run is\n * missing. No fix: that added length check can turn a passing test red.\n */\n function reportIndexRun(run: readonly Assertion[]): void {\n const first = run[0];\n if (first === undefined || !ARRAY_MATCHERS.has(first.matcher)) {\n return;\n }\n const indices = new Set<number>();\n for (const assertion of run) {\n if (assertion.key.kind !== \"index\" || assertion.matcher !== first.matcher) {\n return;\n }\n indices.add(assertion.key.index);\n }\n if (indices.size !== run.length || Math.max(...indices) !== run.length - 1) {\n return;\n }\n context.report({\n node: first.statement,\n messageId: \"assertArrayOnce\",\n data: {\n count: String(run.length),\n receiver: sourceCode.getText(first.receiver),\n last: String(run.length - 1),\n matcher: first.matcher,\n },\n });\n }\n\n function checkBody(body: readonly TSESTree.Statement[]): void {\n let run: Assertion[] = [];\n\n const flush = (): void => {\n const first = run[0];\n if (first !== undefined && run.length >= MIN_RUN_LENGTH) {\n if (first.key.kind === \"property\") {\n reportPropertyRun(run);\n } else {\n reportIndexRun(run);\n }\n }\n run = [];\n };\n\n for (const statement of body) {\n const assertion = parseAssertion(statement);\n const previous = run.at(-1);\n if (\n assertion !== null &&\n previous !== undefined &&\n previous.key.kind === assertion.key.kind &&\n sourceCode.getText(previous.receiver) === sourceCode.getText(assertion.receiver)\n ) {\n run.push(assertion);\n continue;\n }\n flush();\n if (assertion !== null) {\n run = [assertion];\n }\n }\n flush();\n }\n\n return {\n BlockStatement: (node: TSESTree.BlockStatement): void => {\n checkBody(node.body);\n },\n Program: (node: TSESTree.Program): void => {\n checkBody(node.body);\n },\n };\n },\n});\n","/**\n * @fileoverview prefer-zod-enum — a union of `z.literal` strings infers exactly what `z.enum` does, in more syntax that hides the permitted values.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/prefer-zod-enum.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/prefer-zod-enum.md\n */\n\nimport { AST_NODE_TYPES, type TSESLint, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isZodModule } from \"./_zod.js\";\n\ntype MessageIds = \"preferEnum\";\ntype Options = readonly [];\n\nexport default createRule<Options, MessageIds>({\n name: \"prefer-zod-enum\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Prefer z.enum([...]) over z.union([z.literal(...), ...]) for string choices\",\n },\n fixable: \"code\",\n schema: [],\n messages: {\n preferEnum:\n \"Use `z.enum([...])` instead of a union of string-literal schemas.\",\n },\n },\n defaultOptions: [],\n create(context) {\n const sourceCode = context.sourceCode;\n const zodNamespaces = new Set<string>();\n\n function enumValues(\n node: TSESTree.CallExpression,\n ): readonly TSESTree.StringLiteral[] | null {\n const callee = node.callee;\n if (\n callee.type !== AST_NODE_TYPES.MemberExpression ||\n callee.computed ||\n callee.object.type !== AST_NODE_TYPES.Identifier ||\n !zodNamespaces.has(callee.object.name) ||\n callee.property.type !== AST_NODE_TYPES.Identifier ||\n callee.property.name !== \"union\" ||\n node.arguments.length !== 1\n ) {\n return null;\n }\n const argument = node.arguments[0];\n if (\n argument === undefined ||\n argument.type !== AST_NODE_TYPES.ArrayExpression ||\n argument.elements.length === 0\n ) {\n return null;\n }\n\n const values: TSESTree.StringLiteral[] = [];\n for (const element of argument.elements) {\n if (\n element === null ||\n element.type !== AST_NODE_TYPES.CallExpression ||\n element.arguments.length !== 1 ||\n element.callee.type !== AST_NODE_TYPES.MemberExpression ||\n element.callee.computed ||\n element.callee.object.type !== AST_NODE_TYPES.Identifier ||\n !zodNamespaces.has(element.callee.object.name) ||\n element.callee.property.type !== AST_NODE_TYPES.Identifier ||\n element.callee.property.name !== \"literal\"\n ) {\n return null;\n }\n const value = element.arguments[0];\n if (\n value === undefined ||\n value.type !== AST_NODE_TYPES.Literal ||\n typeof value.value !== \"string\"\n ) {\n return null;\n }\n values.push(value);\n }\n return values;\n }\n\n function buildFix(\n node: TSESTree.CallExpression,\n values: readonly TSESTree.StringLiteral[],\n ): TSESLint.ReportFixFunction | undefined {\n const argument = node.arguments[0];\n if (\n argument === undefined ||\n argument.type !== AST_NODE_TYPES.ArrayExpression ||\n sourceCode.getCommentsInside(argument).length > 0\n ) {\n return undefined;\n }\n const callee = node.callee;\n if (\n callee.type !== AST_NODE_TYPES.MemberExpression ||\n callee.property.type !== AST_NODE_TYPES.Identifier\n ) {\n return undefined;\n }\n return (fixer) => [\n fixer.replaceText(callee.property, \"enum\"),\n fixer.replaceText(\n argument,\n `[${values.map((value) => sourceCode.getText(value)).join(\", \")}]`,\n ),\n ];\n }\n\n return {\n ImportDeclaration(node): void {\n if (!isZodModule(node.source.value)) {\n return;\n }\n for (const specifier of node.specifiers) {\n if (\n specifier.type === AST_NODE_TYPES.ImportNamespaceSpecifier ||\n specifier.type === AST_NODE_TYPES.ImportDefaultSpecifier ||\n (specifier.type === AST_NODE_TYPES.ImportSpecifier &&\n specifier.imported.type === AST_NODE_TYPES.Identifier &&\n specifier.imported.name === \"z\")\n ) {\n zodNamespaces.add(specifier.local.name);\n }\n }\n },\n CallExpression(node): void {\n const values = enumValues(node);\n if (values === null) {\n return;\n }\n const fix = buildFix(node, values);\n context.report({\n node,\n messageId: \"preferEnum\",\n ...(fix === undefined ? {} : { fix }),\n });\n },\n };\n },\n});\n","/**\n * @fileoverview prefer-zod-infer — a hand-written type beside a Zod schema drifts silently the moment the schema gains a field.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/prefer-zod-infer.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/prefer-zod-infer.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isGeneratedFile, isStoryFile, isTestFile } from \"./_paths.js\";\nimport { isZodModule } from \"./_zod.js\";\n\ntype MessageIds = \"handWrittenTwin\";\ntype Options = readonly [\n {\n ignoreTypeNames?: readonly string[];\n requireIdenticalShape?: boolean;\n }?,\n];\n\n/**\n * Chained methods that leave a schema's inferred type alone. Everything else —\n * `.partial()`, `.omit()`, `.merge()`, `.transform()`, `.brand()`, … — means\n * the inferred type is deliberately not the object literal at the call site,\n * so the pair is none of this rule's business. See guard (d).\n */\nconst SHAPE_PRESERVING_METHODS: ReadonlySet<string> = new Set([\n \"describe\",\n \"refine\",\n \"superRefine\",\n \"check\",\n \"meta\",\n \"register\",\n]);\n\n/** Modifiers that make a member optional in the inferred type. */\nconst OPTIONAL_MODIFIERS: ReadonlySet<string> = new Set([\n \"optional\",\n \"nullish\",\n \"default\",\n \"prefault\",\n \"catch\",\n]);\n\n/** Modifiers that admit `null`. */\nconst NULLABLE_MODIFIERS: ReadonlySet<string> = new Set([\"nullable\", \"nullish\"]);\n\n/** Modifiers that replace the member's type outright. */\nconst RESHAPING_MODIFIERS: ReadonlySet<string> = new Set([\n \"transform\",\n \"pipe\",\n \"preprocess\",\n \"brand\",\n \"overwrite\",\n]);\n\n/** Methods whose receiver schema is being reshaped — see guard (f). */\nconst MODULE_LEVEL_RESHAPERS: ReadonlySet<string> = new Set([\n \"transform\",\n \"pipe\",\n \"preprocess\",\n]);\n\n/** Type names whose type arguments are hand-written types by construction. */\nconst ZOD_TYPE_CONSTRAINTS: ReadonlySet<string> = new Set([\n \"ZodType\",\n \"ZodSchema\",\n \"ZodTypeAny\",\n \"ZodMiniType\",\n \"Schema\",\n]);\n\n/** Zod leaf constructors and the TS AST node their inferred type is written as. */\nconst LEAF_NODE_TYPES: Readonly<Record<string, readonly AST_NODE_TYPES[]>> = {\n string: [AST_NODE_TYPES.TSStringKeyword],\n email: [AST_NODE_TYPES.TSStringKeyword],\n url: [AST_NODE_TYPES.TSStringKeyword],\n uuid: [AST_NODE_TYPES.TSStringKeyword],\n ulid: [AST_NODE_TYPES.TSStringKeyword],\n cuid: [AST_NODE_TYPES.TSStringKeyword],\n cuid2: [AST_NODE_TYPES.TSStringKeyword],\n nanoid: [AST_NODE_TYPES.TSStringKeyword],\n iso: [AST_NODE_TYPES.TSStringKeyword],\n number: [AST_NODE_TYPES.TSNumberKeyword],\n int: [AST_NODE_TYPES.TSNumberKeyword],\n float32: [AST_NODE_TYPES.TSNumberKeyword],\n float64: [AST_NODE_TYPES.TSNumberKeyword],\n boolean: [AST_NODE_TYPES.TSBooleanKeyword],\n bigint: [AST_NODE_TYPES.TSBigIntKeyword],\n symbol: [AST_NODE_TYPES.TSSymbolKeyword],\n any: [AST_NODE_TYPES.TSAnyKeyword],\n unknown: [AST_NODE_TYPES.TSUnknownKeyword],\n never: [AST_NODE_TYPES.TSNeverKeyword],\n void: [AST_NODE_TYPES.TSVoidKeyword],\n null: [AST_NODE_TYPES.TSNullKeyword],\n undefined: [AST_NODE_TYPES.TSUndefinedKeyword],\n literal: [AST_NODE_TYPES.TSLiteralType],\n date: [AST_NODE_TYPES.TSTypeReference],\n array: [AST_NODE_TYPES.TSArrayType, AST_NODE_TYPES.TSTypeReference],\n tuple: [AST_NODE_TYPES.TSTupleType],\n object: [AST_NODE_TYPES.TSTypeLiteral, AST_NODE_TYPES.TSTypeReference],\n strictObject: [AST_NODE_TYPES.TSTypeLiteral, AST_NODE_TYPES.TSTypeReference],\n looseObject: [AST_NODE_TYPES.TSTypeLiteral, AST_NODE_TYPES.TSTypeReference],\n record: [AST_NODE_TYPES.TSTypeReference, AST_NODE_TYPES.TSTypeLiteral],\n map: [AST_NODE_TYPES.TSTypeReference],\n set: [AST_NODE_TYPES.TSTypeReference],\n promise: [AST_NODE_TYPES.TSTypeReference],\n enum: [AST_NODE_TYPES.TSUnionType, AST_NODE_TYPES.TSTypeReference, AST_NODE_TYPES.TSLiteralType],\n nativeEnum: [AST_NODE_TYPES.TSUnionType, AST_NODE_TYPES.TSTypeReference, AST_NODE_TYPES.TSLiteralType],\n union: [AST_NODE_TYPES.TSUnionType, AST_NODE_TYPES.TSTypeReference],\n discriminatedUnion: [AST_NODE_TYPES.TSUnionType, AST_NODE_TYPES.TSTypeReference],\n intersection: [AST_NODE_TYPES.TSIntersectionType, AST_NODE_TYPES.TSTypeReference],\n};\n\ninterface SchemaField {\n readonly optional: boolean;\n readonly nullable: boolean;\n /** The `z.<leaf>` constructor, or `null` when the member references another schema. */\n readonly leaf: string | null;\n readonly reshaped: boolean;\n}\n\ninterface SchemaInfo {\n readonly name: string;\n readonly fields: ReadonlyMap<string, SchemaField>;\n}\n\ninterface TypeMember {\n readonly optional: boolean;\n readonly nullable: boolean;\n readonly annotation: TSESTree.TypeNode | null;\n}\n\ninterface TypeDeclaration {\n readonly name: string;\n readonly node: TSESTree.Node;\n readonly members: ReadonlyMap<string, TypeMember>;\n}\n\n/** `ZUserSchema` / `userSchema` / `ZUser` all describe the thing named `User`. */\nfunction normalizeSchemaName(name: string): string {\n return name\n .replace(/Schema$/i, \"\")\n .replace(/^Z(?=[A-Z])/, \"\")\n .toLowerCase();\n}\n\n/** `UserType` is the same claim as `User`; nothing else is stripped. */\nfunction normalizeTypeName(name: string): string {\n return name.replace(/Type$/, \"\").toLowerCase();\n}\n\n/** Strips `| null` / `| undefined` from a union and reports what it removed. */\nfunction unwrapNullish(annotation: TSESTree.TypeNode): {\n readonly core: TSESTree.TypeNode | null;\n readonly nullable: boolean;\n} {\n if (annotation.type !== AST_NODE_TYPES.TSUnionType) {\n return {\n core: annotation,\n nullable: annotation.type === AST_NODE_TYPES.TSNullKeyword,\n };\n }\n const rest: TSESTree.TypeNode[] = [];\n let nullable = false;\n for (const member of annotation.types) {\n if (member.type === AST_NODE_TYPES.TSNullKeyword) {\n nullable = true;\n continue;\n }\n if (member.type === AST_NODE_TYPES.TSUndefinedKeyword) {\n continue;\n }\n rest.push(member);\n }\n if (rest.length === 1) {\n return { core: rest[0] ?? null, nullable };\n }\n // A genuine union of two or more non-nullish members stays a union.\n return { core: rest.length === 0 ? null : annotation, nullable };\n}\n\n/**\n * Whether the annotation is the shape `z.<leaf>()` infers. `null` means \"cannot\n * tell\" — a member that references another schema, or a leaf this table does\n * not model. Only a definite `false` blocks a report.\n */\nfunction leafAgrees(\n leaf: string | null,\n annotation: TSESTree.TypeNode | null,\n): boolean | null {\n if (leaf === null || annotation === null) {\n return null;\n }\n const expected = LEAF_NODE_TYPES[leaf];\n if (expected === undefined) {\n return null;\n }\n const { core } = unwrapNullish(annotation);\n if (core === null) {\n return null;\n }\n return expected.includes(core.type);\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"prefer-zod-infer\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Derive a type from its Zod schema with `z.infer` instead of hand-writing a twin declaration beside it.\",\n },\n schema: [\n {\n type: \"object\",\n additionalProperties: false,\n properties: {\n ignoreTypeNames: {\n type: \"array\",\n items: { type: \"string\" },\n },\n requireIdenticalShape: { type: \"boolean\" },\n },\n },\n ],\n messages: {\n handWrittenTwin:\n \"`{{typeName}}` restates the shape of the Zod schema `{{schemaName}}` declared in this module. Derive it instead — `type {{typeName}} = z.infer<typeof {{schemaName}}>` — so a field added to the schema cannot silently leave the type behind.\",\n },\n },\n defaultOptions: [{}],\n create(context, [optionsArg]) {\n const ignorePatterns = (optionsArg?.ignoreTypeNames ?? []).map(\n (source) => new RegExp(source, \"u\"),\n );\n const requireIdenticalShape = optionsArg?.requireIdenticalShape ?? true;\n\n if (\n isTestFile(context.filename) ||\n isStoryFile(context.filename) ||\n isGeneratedFile(context.filename, context.sourceCode.text)\n ) {\n return {};\n }\n\n const zodNamespaces = new Set<string>();\n const schemas: SchemaInfo[] = [];\n const typeDeclarations: TypeDeclaration[] = [];\n /** Guard (c): every name mentioned inside a `z.ZodType<…>` type argument. */\n const constrainedTypeNames = new Set<string>();\n /** Guard (f): schemas this module pipes through a shape-changing method. */\n const reshapedSchemaNames = new Set<string>();\n\n /** The `z.…` call chain of `node`, base call first, or `null`. */\n function zodCallChain(\n node: TSESTree.Node,\n ): readonly TSESTree.CallExpression[] | null {\n const chain: TSESTree.CallExpression[] = [];\n let current: TSESTree.Node = node;\n while (current.type === AST_NODE_TYPES.CallExpression) {\n const callee = current.callee;\n if (\n callee.type !== AST_NODE_TYPES.MemberExpression ||\n callee.computed ||\n callee.property.type !== AST_NODE_TYPES.Identifier\n ) {\n return null;\n }\n chain.push(current);\n const receiver = callee.object;\n if (receiver.type === AST_NODE_TYPES.Identifier) {\n return zodNamespaces.has(receiver.name) ? chain.reverse() : null;\n }\n current = receiver;\n }\n return null;\n }\n\n /** The method name of a `z.foo()` / `.foo()` link in a chain. */\n function methodName(call: TSESTree.CallExpression): string {\n const callee = call.callee;\n return callee.type === AST_NODE_TYPES.MemberExpression &&\n callee.property.type === AST_NODE_TYPES.Identifier\n ? callee.property.name\n : \"\";\n }\n\n /** Modifier/leaf analysis of one `z.object({ key: <here> })` value. */\n function schemaField(node: TSESTree.Node): SchemaField {\n const modifiers: string[] = [];\n let current: TSESTree.Node = node;\n let leaf: string | null = null;\n\n while (current.type === AST_NODE_TYPES.CallExpression) {\n const callee = current.callee;\n if (\n callee.type !== AST_NODE_TYPES.MemberExpression ||\n callee.computed ||\n callee.property.type !== AST_NODE_TYPES.Identifier\n ) {\n break;\n }\n const receiver = callee.object;\n if (\n receiver.type === AST_NODE_TYPES.Identifier &&\n zodNamespaces.has(receiver.name)\n ) {\n leaf = callee.property.name;\n break;\n }\n modifiers.push(callee.property.name);\n current = receiver;\n }\n\n return {\n leaf,\n optional: modifiers.some((name) => OPTIONAL_MODIFIERS.has(name)),\n nullable: modifiers.some((name) => NULLABLE_MODIFIERS.has(name)),\n reshaped: modifiers.some((name) => RESHAPING_MODIFIERS.has(name)),\n };\n }\n\n /** Guard (d): only a plain `z.object({...})` literal describes its own shape. */\n function schemaFields(\n init: TSESTree.Node,\n ): ReadonlyMap<string, SchemaField> | null {\n const chain = zodCallChain(init);\n if (chain === null || chain.length === 0) {\n return null;\n }\n const [base, ...rest] = chain;\n if (base === undefined) {\n return null;\n }\n const baseMethod = methodName(base);\n if (baseMethod !== \"object\" && baseMethod !== \"strictObject\") {\n return null;\n }\n if (rest.some((call) => !SHAPE_PRESERVING_METHODS.has(methodName(call)))) {\n return null;\n }\n const shape = base.arguments[0];\n if (shape === undefined || shape.type !== AST_NODE_TYPES.ObjectExpression) {\n return null;\n }\n\n const fields = new Map<string, SchemaField>();\n for (const property of shape.properties) {\n if (property.type !== AST_NODE_TYPES.Property || property.computed) {\n return null; // a spread or computed key hides members from us\n }\n const { key } = property;\n const name =\n key.type === AST_NODE_TYPES.Identifier\n ? key.name\n : key.type === AST_NODE_TYPES.Literal && typeof key.value === \"string\"\n ? key.value\n : null;\n if (name === null) {\n return null;\n }\n fields.set(name, schemaField(property.value));\n }\n return fields.size === 0 ? null : fields;\n }\n\n /** The property signatures of an object type, or `null` if any member is exotic. */\n function typeMembers(\n members: readonly TSESTree.TypeElement[],\n ): ReadonlyMap<string, TypeMember> | null {\n const result = new Map<string, TypeMember>();\n for (const member of members) {\n if (member.type !== AST_NODE_TYPES.TSPropertySignature || member.computed) {\n return null;\n }\n const { key } = member;\n const name =\n key.type === AST_NODE_TYPES.Identifier\n ? key.name\n : key.type === AST_NODE_TYPES.Literal && typeof key.value === \"string\"\n ? key.value\n : null;\n if (name === null) {\n return null;\n }\n const annotation = member.typeAnnotation?.typeAnnotation ?? null;\n result.set(name, {\n optional: member.optional === true,\n nullable: annotation !== null && unwrapNullish(annotation).nullable,\n annotation,\n });\n }\n return result.size === 0 ? null : result;\n }\n\n function collectConstrainedNames(node: TSESTree.TypeNode): void {\n if (node.type === AST_NODE_TYPES.TSTypeReference) {\n if (node.typeName.type === AST_NODE_TYPES.Identifier) {\n constrainedTypeNames.add(node.typeName.name);\n }\n for (const argument of node.typeArguments?.params ?? []) {\n collectConstrainedNames(argument);\n }\n return;\n }\n if (node.type === AST_NODE_TYPES.TSArrayType) {\n collectConstrainedNames(node.elementType);\n return;\n }\n if (\n node.type === AST_NODE_TYPES.TSUnionType ||\n node.type === AST_NODE_TYPES.TSIntersectionType\n ) {\n for (const member of node.types) {\n collectConstrainedNames(member);\n }\n }\n }\n\n /** True when the pair is close enough to call one a restatement of the other. */\n function isTwin(\n fields: ReadonlyMap<string, SchemaField>,\n members: ReadonlyMap<string, TypeMember>,\n ): boolean {\n if (!requireIdenticalShape) {\n return true;\n }\n if (fields.size !== members.size) {\n return false;\n }\n let agreements = 0;\n for (const [name, field] of fields) {\n const member = members.get(name);\n if (member === undefined) {\n return false;\n }\n // Guard (d)/(e): a reshaped member's inferred type is not what is written.\n if (field.reshaped) {\n return false;\n }\n if (field.optional !== member.optional) {\n return false;\n }\n if (field.nullable !== member.nullable) {\n return false;\n }\n const agrees = leafAgrees(field.leaf, member.annotation);\n if (agrees === false) {\n return false;\n }\n if (agrees === true) {\n agreements += 1;\n }\n }\n // At least one member has to positively agree; a pair of types whose\n // members are all references to other symbols is a name coincidence.\n return agreements > 0;\n }\n\n return {\n ImportDeclaration(node): void {\n if (!isZodModule(node.source.value)) {\n return;\n }\n for (const specifier of node.specifiers) {\n if (\n specifier.type === AST_NODE_TYPES.ImportNamespaceSpecifier ||\n specifier.type === AST_NODE_TYPES.ImportDefaultSpecifier ||\n (specifier.type === AST_NODE_TYPES.ImportSpecifier &&\n specifier.imported.type === AST_NODE_TYPES.Identifier &&\n specifier.imported.name === \"z\")\n ) {\n zodNamespaces.add(specifier.local.name);\n }\n }\n },\n\n VariableDeclarator(node): void {\n if (node.id.type !== AST_NODE_TYPES.Identifier || node.init == null) {\n return;\n }\n const fields = schemaFields(node.init);\n if (fields !== null) {\n schemas.push({ name: node.id.name, fields });\n }\n },\n\n /** Guard (f): `XSchema.transform(...)` anywhere in the module. */\n \"MemberExpression[computed=false]\"(node: TSESTree.MemberExpression): void {\n if (\n node.object.type === AST_NODE_TYPES.Identifier &&\n node.property.type === AST_NODE_TYPES.Identifier &&\n MODULE_LEVEL_RESHAPERS.has(node.property.name)\n ) {\n reshapedSchemaNames.add(node.object.name);\n }\n },\n\n /** Guard (c): `z.ZodType<T>` and every other type argument it carries. */\n TSTypeReference(node): void {\n const { typeName } = node;\n const referenced =\n typeName.type === AST_NODE_TYPES.Identifier\n ? typeName.name\n : typeName.type === AST_NODE_TYPES.TSQualifiedName &&\n typeName.right.type === AST_NODE_TYPES.Identifier\n ? typeName.right.name\n : null;\n if (referenced === null || !ZOD_TYPE_CONSTRAINTS.has(referenced)) {\n return;\n }\n for (const argument of node.typeArguments?.params ?? []) {\n collectConstrainedNames(argument);\n }\n },\n\n TSInterfaceDeclaration(node): void {\n // Guard (b)/(g): generics and `extends` both mean \"not a restatement\".\n if (node.typeParameters !== undefined || (node.extends?.length ?? 0) > 0) {\n return;\n }\n const members = typeMembers(node.body.body);\n if (members !== null) {\n typeDeclarations.push({ name: node.id.name, node: node.id, members });\n }\n },\n\n TSTypeAliasDeclaration(node): void {\n if (\n node.typeParameters !== undefined ||\n node.typeAnnotation.type !== AST_NODE_TYPES.TSTypeLiteral\n ) {\n return;\n }\n const members = typeMembers(node.typeAnnotation.members);\n if (members !== null) {\n typeDeclarations.push({ name: node.id.name, node: node.id, members });\n }\n },\n\n \"Program:exit\"(): void {\n if (schemas.length === 0 || typeDeclarations.length === 0) {\n return;\n }\n const byName = new Map<string, SchemaInfo>();\n for (const schema of schemas) {\n const key = normalizeSchemaName(schema.name);\n if (key !== \"\" && !byName.has(key)) {\n byName.set(key, schema);\n }\n }\n\n for (const declaration of typeDeclarations) {\n if (constrainedTypeNames.has(declaration.name)) {\n continue;\n }\n if (ignorePatterns.some((pattern) => pattern.test(declaration.name))) {\n continue;\n }\n const schema = byName.get(normalizeTypeName(declaration.name));\n if (schema === undefined || reshapedSchemaNames.has(schema.name)) {\n continue;\n }\n if (!isTwin(schema.fields, declaration.members)) {\n continue;\n }\n context.report({\n node: declaration.node,\n messageId: \"handWrittenTwin\",\n data: { typeName: declaration.name, schemaName: schema.name },\n });\n }\n },\n };\n },\n});\n","/**\n * @fileoverview require-assert-never — a switch over a union whose `default` does no runtime work stops being exhaustive the day the union grows.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/require-assert-never.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/require-assert-never.md\n */\n\nimport { type TSESLint, type TSESTree, AST_NODE_TYPES } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\n\ntype MessageIds = \"missingAssertNever\";\ntype Options = readonly [];\n\n/**\n * Returns true if the statement performs some runtime work. An empty statement\n * or an empty block does nothing; everything else (`return`, `throw`, `break`,\n * a function call, an `if`, ...) is treated as legitimate runtime handling of\n * the default case.\n */\nconst isRuntimeHandlingStatement = (statement: TSESTree.Statement): boolean => {\n if (statement.type === AST_NODE_TYPES.EmptyStatement) return false;\n if (statement.type === AST_NODE_TYPES.BlockStatement) {\n return statement.body.some(isRuntimeHandlingStatement);\n }\n return true;\n};\n\n/**\n * A `default` clause with an empty body that is followed by another `case`\n * falls through into that case, which does the real work (e.g.\n * `default: case Single: handle();`). There is nothing to assert here.\n */\nconst isFallthroughDefault = (\n node: TSESTree.SwitchStatement,\n defaultIndex: number,\n): boolean => {\n const defaultCase = node.cases[defaultIndex];\n return (\n defaultCase !== undefined &&\n defaultCase.consequent.length === 0 &&\n defaultIndex < node.cases.length - 1\n );\n};\n\n/**\n * A `default` clause is a deliberate, documented no-op when its body is empty\n * (or an empty block) but carries a comment — e.g. `default: // do nothing`.\n * We can't distinguish a config-string switch from an exhaustive union switch\n * without type info, so a written-out intent to do nothing is honoured;\n * injecting `assertNever` there would throw at runtime. A bare empty default\n * with no comment is still flagged.\n */\nconst isCommentOnlyNoopDefault = (\n defaultCase: TSESTree.SwitchCase,\n sourceCode: Readonly<TSESLint.SourceCode>,\n): boolean => {\n if (defaultCase.consequent.length === 0) {\n const defaultToken = sourceCode.getFirstToken(defaultCase);\n const colonToken = defaultToken\n ? sourceCode.getTokenAfter(defaultToken)\n : null;\n return (\n colonToken !== null && sourceCode.getCommentsAfter(colonToken).length > 0\n );\n }\n const only = defaultCase.consequent[0];\n if (\n only !== undefined &&\n defaultCase.consequent.length === 1 &&\n only.type === AST_NODE_TYPES.BlockStatement &&\n only.body.length === 0\n ) {\n return sourceCode.getCommentsInside(only).length > 0;\n }\n return false;\n};\n\nexport default createRule<Options, MessageIds>({\n name: \"require-assert-never\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Require an exhaustive-style switch whose `default` case does no runtime work to call `assertNever(_)` so that discriminated unions are exhaustively checked at compile time. Switches with a legitimate runtime default (a reducer's `return state`, an HTTP-status `return fallback()`, a `break`, a `throw`, etc.) are left alone.\",\n },\n schema: [],\n messages: {\n missingAssertNever:\n \"Empty switch `default` case — add runtime handling or call `assertNever()` so the discriminated union is exhaustively checked at compile time.\",\n },\n },\n defaultOptions: [],\n create(context) {\n return {\n SwitchStatement(node: TSESTree.SwitchStatement): void {\n const defaultIndex = node.cases.findIndex(\n (caseNode) => caseNode.test === null,\n );\n // No `default` at all is fine — we don't demand exhaustiveness of every\n // switch, only of those that opted into a (no-op) default.\n if (defaultIndex === -1) return;\n const defaultCase = node.cases[defaultIndex];\n if (defaultCase === undefined) return;\n\n // A default that does real runtime work (return a fallback, break,\n // throw, log, ...) is legitimate — don't demand assertNever there. That\n // covers the canonical `assertNever(_)` too: it is a call statement, so\n // a separate recogniser for it decided nothing this line does not\n // already decide, and no test could tell the two apart.\n if (defaultCase.consequent.some(isRuntimeHandlingStatement)) return;\n\n // A fallthrough default hands control to a following case, which does\n // the work — there is nothing to assert.\n if (isFallthroughDefault(node, defaultIndex)) return;\n\n // A deliberate, comment-documented no-op default is honoured; we can't\n // prove the discriminant is a union without type info, and injecting\n // assertNever would throw at runtime on a config-string switch.\n if (isCommentOnlyNoopDefault(defaultCase, context.sourceCode)) return;\n\n // Otherwise the default is a bare, undocumented no-op: flag it.\n context.report({\n node: defaultCase,\n messageId: \"missingAssertNever\",\n });\n },\n };\n },\n});\n","/**\n * @fileoverview require-fetch-timeout — a `fetch` with no signal hangs for as long as the upstream stalls, holding the caller open with it.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/require-fetch-timeout.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/require-fetch-timeout.md\n */\n\nimport { AST_NODE_TYPES, ASTUtils, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isScriptFile, isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"missingSignal\";\ntype Options = readonly [\n {\n allowIn?: readonly string[];\n }?,\n];\n\n/** The explicit-global receivers of `<obj>.fetch(...)`. */\nconst GLOBAL_OBJECTS: ReadonlySet<string> = new Set([\n \"globalThis\",\n \"window\",\n \"self\",\n]);\n\nfunction matchesAnyPattern(\n filename: string,\n patterns: readonly string[],\n): boolean {\n for (const pattern of patterns) {\n // Convert minimatch-ish globs to regex: ** -> .*, * -> [^/\\\\]*\n const regexSource = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/\\*\\*/g, \"::DOUBLESTAR::\")\n .replace(/\\*/g, \"[^/\\\\\\\\]*\")\n .replace(/::DOUBLESTAR::/g, \".*\");\n if (new RegExp(`^${regexSource}$`).test(filename)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * True when the init argument provably lacks an abort signal: it is an object\n * literal with no `signal` property and no spread element. Any other shape\n * (identifier, call, spread, conditional, ...) may carry a signal, so it is\n * treated as safe.\n */\nfunction initProvablyLacksSignal(init: TSESTree.CallExpressionArgument): boolean {\n if (init.type !== AST_NODE_TYPES.ObjectExpression) {\n return false;\n }\n for (const prop of init.properties) {\n if (prop.type === AST_NODE_TYPES.SpreadElement) {\n return false;\n }\n if (\n (prop.key.type === AST_NODE_TYPES.Identifier &&\n prop.key.name === \"signal\") ||\n (prop.key.type === AST_NODE_TYPES.Literal && prop.key.value === \"signal\")\n ) {\n return false;\n }\n // A computed key could be \"signal\" at runtime; assume it is.\n if (prop.computed) {\n return false;\n }\n }\n return true;\n}\n\n/** True for a string or template literal — a URL spelled inline. */\nfunction isStringish(node: TSESTree.CallExpressionArgument): boolean {\n return (\n (node.type === AST_NODE_TYPES.Literal && typeof node.value === \"string\") ||\n node.type === AST_NODE_TYPES.TemplateLiteral\n );\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"require-fetch-timeout\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Require an abort `signal` (e.g. `AbortSignal.timeout(ms)`) on global `fetch()` calls so stalled upstreams cannot hang the caller forever.\",\n },\n schema: [\n {\n type: \"object\",\n additionalProperties: false,\n properties: {\n allowIn: {\n description:\n \"Glob patterns for wrapper modules exempt from the rule. Matched against the ABSOLUTE file path, so anchor with a `**/` prefix (e.g. `**/http-client.ts`).\",\n type: \"array\",\n items: { type: \"string\" },\n },\n },\n },\n ],\n messages: {\n missingSignal:\n \"This `fetch()` has no abort `signal` — a stalled upstream will hang it forever. Pass `{ signal: AbortSignal.timeout(ms) }` or a signal from an AbortController.\",\n },\n },\n defaultOptions: [{}],\n create(context, [optionsArg]) {\n // `isTestFile` knows jscodeshift's `__testfixtures__/` spelling, so the\n // local pattern this rule used to keep for it decided nothing.\n if (isTestFile(context.filename) || isScriptFile(context.filename)) {\n return {};\n }\n const allowIn = optionsArg?.allowIn ?? [];\n if (allowIn.length > 0 && matchesAnyPattern(context.filename, allowIn)) {\n return {};\n }\n\n /** True when `identifier` resolves to the global (no local binding shadows it). */\n function resolvesToGlobal(identifier: TSESTree.Identifier): boolean {\n const scope = context.sourceCode.getScope(identifier);\n const variable = ASTUtils.findVariable(scope, identifier.name);\n // Unresolved → implicit global. Resolved with zero defs → declared\n // global (languageOptions.globals). Any def is a local shadow.\n return variable === null || variable.defs.length === 0;\n }\n\n /** True for `fetch(...)` / `globalThis.fetch(...)` / `window.fetch(...)` /\n * `self.fetch(...)` where the receiver resolves to the global scope. */\n function isGlobalFetchCall(callee: TSESTree.Expression): boolean {\n if (callee.type === AST_NODE_TYPES.Identifier) {\n return callee.name === \"fetch\" && resolvesToGlobal(callee);\n }\n return (\n callee.type === AST_NODE_TYPES.MemberExpression &&\n !callee.computed &&\n callee.property.type === AST_NODE_TYPES.Identifier &&\n callee.property.name === \"fetch\" &&\n callee.object.type === AST_NODE_TYPES.Identifier &&\n GLOBAL_OBJECTS.has(callee.object.name) &&\n resolvesToGlobal(callee.object)\n );\n }\n\n return {\n CallExpression(node: TSESTree.CallExpression): void {\n if (!isGlobalFetchCall(node.callee)) {\n return;\n }\n\n // Proxy passthrough: a lone non-string argument is a Request (or\n // equivalent) being forwarded — the inbound request owns the\n // lifetime, and a fresh signal cannot be attached without an init.\n const [first, init] = node.arguments;\n if (node.arguments.length === 1 && first !== undefined && !isStringish(first)) {\n return;\n }\n\n if (init === undefined || initProvablyLacksSignal(init)) {\n context.report({ node, messageId: \"missingSignal\" });\n }\n },\n };\n },\n});\n","/**\n * @fileoverview require-interface-for-injected-service — an exported class with injected collaborators and no port above it can only be tested by mocking the class.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/require-interface-for-injected-service.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/require-interface-for-injected-service.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isGeneratedFile, isScriptFile, isStoryFile, isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"requireInterface\";\ntype Options = readonly [];\n\nconst CONFIGISH_TYPE_RE =\n /(?:Options|Opts|Config|Configuration|Settings|Params|Props|Args|Env|Environment|Callbacks|Flags)$/;\n\n/**\n * Parameter names that carry the same signal from the other side, plus the two\n * ambient-capability names the brief called out as weak evidence of a seam: a\n * class whose ONLY dependency is a logger or a clock is not the substitutability\n * problem this rule is about.\n */\nconst CONFIGISH_NAME_RE =\n /^(?:options|opts|config|configuration|settings|params|props|args|env|environment|callbacks|flags|logger|log|clock)$/i;\n\n/**\n * Third-party HTTP transports. A class whose ONLY stored collaborator is one of\n * these is a thin wrapper over somebody else's wire client: the Python side of\n * this standard excludes `*Client` for exactly this reason — an ABC over a class\n * whose collaborator is somebody else's HTTP transport substitutes nothing, and\n * a consumer's test fakes the transport (`respx`, `nock`, `msw`), not the wrapper.\n */\nconst HTTP_TRANSPORT_TYPE_RE = /^(?:KyInstance|AxiosInstance|Session)$/;\n\n/** Only the `*Client` naming carries the guard; see the transport-wrapper note in the header. */\n/**\n * TypeScript's own generic containers and mapped helpers. `data: Record<string,\n * Row>` names no implementation a consumer could swap — it is the same data a\n * bare `{ … }` annotation is, wearing a nominal name.\n */\nconst BUILTIN_CONTAINER_TYPE_RE =\n /^(?:Record|Map|WeakMap|Set|WeakSet|Array|ReadonlyArray|ReadonlyMap|ReadonlySet|Promise|Partial|Required|Readonly|Pick|Omit|Exclude|Extract|NonNullable|Awaited|Parameters|ReturnType|InstanceType)$/;\n\nconst TRANSPORT_WRAPPER_NAME_RE = /Client$/;\n\n/** `express.Router()` / `Router()` — the router-factory call that marks HTTP wiring. */\nconst ROUTER_FACTORY_NAME = \"Router\";\n\n/** Namespaced framework HTTP types (`express.Request`), never the DOM globals of the same name. */\nconst FRAMEWORK_HTTP_TYPES: ReadonlySet<string> = new Set([\"Request\", \"Response\", \"NextFunction\"]);\n\ninterface Collaborator {\n readonly name: string;\n /** Rightmost segment of the type name — what the config-ish guards test. */\n readonly typeName: string;\n /** Full source spelling, including any namespace qualifier, for the message. */\n readonly display: string;\n}\n\n/** The class's own declaration is what `export`s it; anonymous defaults have no name to report. */\nconst isExportedClass = (node: TSESTree.ClassDeclaration): boolean =>\n node.parent.type === AST_NODE_TYPES.ExportNamedDeclaration ||\n node.parent.type === AST_NODE_TYPES.ExportDefaultDeclaration;\n\n/** `catalog.Client` -> `\"catalog.Client\"`; a nested qualifier is flattened the same way. */\nconst qualifiedName = (name: TSESTree.EntityName): string =>\n name.type === AST_NODE_TYPES.Identifier\n ? name.name\n : name.type === AST_NODE_TYPES.TSQualifiedName\n ? `${qualifiedName(name.left)}.${name.right.name}`\n : \"\";\n\n/** The rightmost segment plus the full spelling of a bare type reference, or null for anything else. */\nconst readTypeReference = (\n annotation: TSESTree.TypeNode | undefined,\n): { readonly typeName: string; readonly display: string } | null => {\n // A bare type reference is the only shape that names a nominal collaborator.\n // A union, an array, or a function type is data or a callback, never something\n // a consumer would want to swap wholesale.\n if (annotation === undefined || annotation.type !== AST_NODE_TYPES.TSTypeReference) return null;\n const { typeName } = annotation;\n const rightmost =\n typeName.type === AST_NODE_TYPES.Identifier\n ? typeName.name\n : typeName.type === AST_NODE_TYPES.TSQualifiedName\n ? typeName.right.name\n : null;\n if (rightmost === null) return null;\n return { typeName: rightmost, display: qualifiedName(typeName) };\n};\n\nconst namedParameterCollaborator = (annotated: TSESTree.Parameter): Collaborator | null => {\n let target: TSESTree.Node = annotated;\n if (target.type === AST_NODE_TYPES.TSParameterProperty) target = target.parameter;\n if (target.type === AST_NODE_TYPES.AssignmentPattern) target = target.left;\n if (target.type !== AST_NODE_TYPES.Identifier) return null;\n // An inline `{ a: string }` on a NAMED parameter stays out: the bindings the\n // options-object walk below reads do not exist, so there is no collaborator to\n // name. `deps: SomeDeps` is covered by the bare-reference path.\n const reference = readTypeReference(target.typeAnnotation?.typeAnnotation);\n if (reference === null) return null;\n return { name: target.name, ...reference };\n};\n\ntype TypeReference = { readonly typeName: string; readonly display: string };\ntype MemberTypes = ReadonlyMap<string, TypeReference>;\n\n/** Property signatures of a `{ a: A; b: B }` body, keyed by property name. */\nconst propertySignatureTypes = (\n members: readonly TSESTree.TypeElement[],\n): Map<string, TypeReference> => {\n const types = new Map<string, TypeReference>();\n for (const member of members) {\n if (member.type !== AST_NODE_TYPES.TSPropertySignature) continue;\n if (member.computed || member.key.type !== AST_NODE_TYPES.Identifier) continue;\n const reference = readTypeReference(member.typeAnnotation?.typeAnnotation);\n if (reference === null) continue;\n types.set(member.key.name, reference);\n }\n return types;\n};\n\n/**\n * Every type name this module declares that a collaborator test needs to see\n * through: object shapes (so an options-object parameter's members can be read)\n * and aliases to a function type (so a callback wearing a nominal name is still\n * a callback).\n *\n * A bag or an alias declared in ANOTHER module is left alone rather than guessed\n * at — see the deliberate false negatives in the header.\n */\ninterface FileTypeIndex {\n /** `interface Deps { … }` / `type Deps = { … }`, by name. */\n readonly objects: ReadonlyMap<string, MemberTypes>;\n /** `type Replayer = (e: Event) => void` — a callback with a nominal name. */\n readonly functionAliases: ReadonlySet<string>;\n}\n\nconst fileTypeIndex = (program: TSESTree.Program): FileTypeIndex => {\n const objects = new Map<string, MemberTypes>();\n const functionAliases = new Set<string>();\n for (const statement of program.body) {\n const declaration =\n statement.type === AST_NODE_TYPES.ExportNamedDeclaration ? statement.declaration : statement;\n if (declaration?.type === AST_NODE_TYPES.TSInterfaceDeclaration) {\n objects.set(declaration.id.name, propertySignatureTypes(declaration.body.body));\n continue;\n }\n if (declaration?.type !== AST_NODE_TYPES.TSTypeAliasDeclaration) continue;\n const aliased = declaration.typeAnnotation;\n if (\n aliased.type === AST_NODE_TYPES.TSFunctionType ||\n aliased.type === AST_NODE_TYPES.TSConstructorType\n ) {\n functionAliases.add(declaration.id.name);\n continue;\n }\n // `type Deps = { … }` and `type Deps = Base & { … }` both resolve; the\n // intersection form is how a bag is usually extended.\n const literals =\n aliased.type === AST_NODE_TYPES.TSTypeLiteral\n ? [aliased]\n : aliased.type === AST_NODE_TYPES.TSIntersectionType\n ? aliased.types.filter((part) => part.type === AST_NODE_TYPES.TSTypeLiteral)\n : [];\n if (literals.length === 0) continue;\n const merged = new Map<string, TypeReference>();\n for (const literal of literals) {\n for (const [name, reference] of propertySignatureTypes(literal.members)) {\n merged.set(name, reference);\n }\n }\n objects.set(declaration.id.name, merged);\n }\n return { objects, functionAliases };\n};\n\n/**\n * Member types of an options-object parameter's annotation: the annotation's own\n * body when it is written inline, otherwise the declaration it names, resolved\n * in this file only.\n */\nconst bagMemberTypes = (\n annotation: TSESTree.TypeNode,\n declared: () => FileTypeIndex,\n): MemberTypes | null => {\n if (annotation.type === AST_NODE_TYPES.TSTypeLiteral) {\n return propertySignatureTypes(annotation.members);\n }\n // A qualified `catalog.Deps` names another module by construction.\n if (\n annotation.type !== AST_NODE_TYPES.TSTypeReference ||\n annotation.typeName.type !== AST_NODE_TYPES.Identifier\n ) {\n return null;\n }\n return declared().objects.get(annotation.typeName.name) ?? null;\n};\n\n/**\n * Collaborators reached through an options-object constructor,\n * `constructor({ userRepo, syncClient }: Deps)`. Each destructured binding is a\n * separate collaborator, because each one is separately stored on a field and\n * separately substitutable — exactly like a named parameter. Its type comes from\n * the bag's declaration, so `{ retries, timeoutMs }: HttpOptions` is dropped by\n * the same primitive-member test that drops `constructor(token: string)`.\n *\n * A rest element (`{ a, ...rest }`) and a nested pattern (`{ a: { b } }`) name\n * no single binding whose substitution a port would protect, so both are\n * skipped while the siblings beside them are still read.\n */\nconst objectPatternCollaborators = (\n pattern: TSESTree.ObjectPattern,\n declared: () => FileTypeIndex,\n): Collaborator[] => {\n const annotation = pattern.typeAnnotation?.typeAnnotation;\n if (annotation === undefined) return [];\n const members = bagMemberTypes(annotation, declared);\n if (members === null) return [];\n\n const collaborators: Collaborator[] = [];\n for (const property of pattern.properties) {\n if (property.type !== AST_NODE_TYPES.Property || property.computed) continue;\n if (property.key.type !== AST_NODE_TYPES.Identifier) continue;\n const key = property.key.name;\n const bound =\n property.value.type === AST_NODE_TYPES.AssignmentPattern\n ? property.value.left\n : property.value;\n if (bound.type !== AST_NODE_TYPES.Identifier) continue;\n // A renamed binding (`{ repo: userRepo }`) offers two names; either one\n // reading as config-ish is enough to drop it, on the same reasoning that\n // drops a config-ish parameter name.\n if (CONFIGISH_NAME_RE.test(key)) continue;\n const reference = members.get(key);\n if (reference === undefined) continue;\n collaborators.push({ name: bound.name, ...reference });\n }\n return collaborators;\n};\n\n/** Every collaborator a single constructor parameter contributes: 0, 1, or (destructured) many. */\nconst parameterCollaborators = (\n parameter: TSESTree.Parameter,\n declared: () => FileTypeIndex,\n): readonly Collaborator[] => {\n let target: TSESTree.Node = parameter;\n if (target.type === AST_NODE_TYPES.AssignmentPattern) target = target.left;\n if (target.type === AST_NODE_TYPES.ObjectPattern) {\n return objectPatternCollaborators(target, declared);\n }\n const named = namedParameterCollaborator(parameter);\n return named === null ? [] : [named];\n};\n\ninterface ConstructorFacts {\n /** Parameters assigned to an instance field, either as a parameter property or in the body. */\n readonly collaborators: readonly Collaborator[];\n /** How many instance fields the constructor fills with a `new` expression. */\n readonly constructedFields: number;\n}\n\n/** Names bound by `class Foo<T>` / `constructor<T>()` — placeholders, not implementations. */\nconst typeParameterNames = (\n ...declarations: readonly (TSESTree.TSTypeParameterDeclaration | undefined)[]\n): ReadonlySet<string> => {\n const names = new Set<string>();\n for (const declaration of declarations) {\n for (const parameter of declaration?.params ?? []) names.add(parameter.name.name);\n }\n return names;\n};\n\nconst readConstructor = (\n ctor: TSESTree.MethodDefinition,\n declared: () => FileTypeIndex,\n typeParameters: ReadonlySet<string>,\n): ConstructorFacts => {\n const body = ctor.value.body;\n const storedFrom = new Set<string>();\n let constructedFields = 0;\n\n if (body !== null && body !== undefined) {\n for (const statement of body.body) {\n if (statement.type !== AST_NODE_TYPES.ExpressionStatement) continue;\n const expression = statement.expression;\n if (\n expression.type !== AST_NODE_TYPES.AssignmentExpression ||\n expression.operator !== \"=\" ||\n expression.left.type !== AST_NODE_TYPES.MemberExpression ||\n expression.left.object.type !== AST_NODE_TYPES.ThisExpression\n ) {\n continue;\n }\n const source = expression.right;\n if (source.type === AST_NODE_TYPES.NewExpression) {\n constructedFields += 1;\n } else if (source.type === AST_NODE_TYPES.Identifier) {\n // `this.svc = svc`\n storedFrom.add(source.name);\n } else if (\n source.type === AST_NODE_TYPES.MemberExpression &&\n source.object.type === AST_NODE_TYPES.Identifier\n ) {\n // `this.slack = deps.slack` — a dependency bag spread onto fields.\n storedFrom.add(source.object.name);\n }\n }\n }\n\n const collaborators: Collaborator[] = [];\n for (const parameter of ctor.value.params) {\n for (const reference of parameterCollaborators(parameter, declared)) {\n const stored =\n parameter.type === AST_NODE_TYPES.TSParameterProperty || storedFrom.has(reference.name);\n if (!stored) continue;\n if (CONFIGISH_TYPE_RE.test(reference.typeName)) continue;\n if (CONFIGISH_NAME_RE.test(reference.name)) continue;\n // A bare type reference can still be one of three things a port would\n // protect nothing about, each of them the inline shape this rule already\n // rejects wearing a nominal name.\n if (typeParameters.has(reference.typeName)) continue;\n if (BUILTIN_CONTAINER_TYPE_RE.test(reference.typeName)) continue;\n if (declared().functionAliases.has(reference.typeName)) continue;\n collaborators.push(reference);\n }\n }\n\n return { collaborators, constructedFields };\n};\n\n/** Walk every descendant node, `parent` links excluded, until `found` returns true. */\nconst subtreeHas = (root: TSESTree.Node, found: (node: TSESTree.Node) => boolean): boolean => {\n let hit = false;\n const visit = (current: TSESTree.Node): void => {\n if (hit) return;\n if (found(current)) {\n hit = true;\n return;\n }\n for (const key of Object.keys(current) as (keyof TSESTree.Node)[]) {\n if (key === \"parent\") continue;\n const value = current[key];\n for (const child of (Array.isArray(value) ? value : [value]) as unknown[]) {\n if (\n child !== null &&\n typeof child === \"object\" &&\n typeof (child as { type?: unknown }).type === \"string\"\n ) {\n visit(child as TSESTree.Node);\n }\n }\n }\n };\n visit(root);\n return hit;\n};\n\n/**\n * Report whether the class body is HTTP framework wiring: it manufactures a\n * router (`express.Router()`), or it handles the framework's own namespaced\n * request/response objects. Such a class is mounted by the server's bootstrap,\n * never injected into anything, so there is no consumer to give a port to.\n */\nconst isFrameworkWiring = (body: TSESTree.ClassBody): boolean =>\n subtreeHas(body, (node) => {\n if (node.type === AST_NODE_TYPES.CallExpression) {\n const { callee } = node;\n if (callee.type === AST_NODE_TYPES.Identifier) return callee.name === ROUTER_FACTORY_NAME;\n return (\n callee.type === AST_NODE_TYPES.MemberExpression &&\n !callee.computed &&\n callee.property.type === AST_NODE_TYPES.Identifier &&\n callee.property.name === ROUTER_FACTORY_NAME\n );\n }\n // `express.Request` — qualified on purpose, so the DOM `Request`/`Response`\n // globals a Workers `fetch` handler names do not read as express wiring.\n return (\n node.type === AST_NODE_TYPES.TSTypeReference &&\n node.typeName.type === AST_NODE_TYPES.TSQualifiedName &&\n FRAMEWORK_HTTP_TYPES.has(node.typeName.right.name)\n );\n });\n\nconst stem = (name: string): string => name.replace(/^I(?=[A-Z])/, \"\").replace(/Impl$/, \"\");\n\n/** Interface declarations at the top level of this module, exported or not. */\nconst fileInterfaceNames = (program: TSESTree.Program): string[] => {\n const names: string[] = [];\n for (const statement of program.body) {\n const declaration =\n statement.type === AST_NODE_TYPES.ExportNamedDeclaration ? statement.declaration : statement;\n if (declaration?.type === AST_NODE_TYPES.TSInterfaceDeclaration) names.push(declaration.id.name);\n }\n return names;\n};\n\n/** Report whether the class is a thin wrapper over somebody else's HTTP transport. */\nconst isTransportWrapper = (\n className: string,\n collaborators: readonly Collaborator[],\n program: TSESTree.Program,\n): boolean => {\n const [only] = collaborators;\n if (collaborators.length !== 1 || only === undefined) return false;\n if (!HTTP_TRANSPORT_TYPE_RE.test(only.typeName)) return false;\n if (!TRANSPORT_WRAPPER_NAME_RE.test(className)) return false;\n const target = stem(className);\n return !fileInterfaceNames(program).some((name) => {\n const other = stem(name);\n return target.endsWith(other) || other.endsWith(target);\n });\n};\n\n/**\n * Public instance methods only. `kind === \"method\"` excludes getters and setters\n * on purpose: a class that exposes only accessors is a value object, and the\n * constructor is not a seam worth porting.\n */\nconst publicMethodNames = (body: TSESTree.ClassBody): string[] => {\n const names: string[] = [];\n for (const member of body.body) {\n if (member.type !== AST_NODE_TYPES.MethodDefinition) continue;\n if (member.kind !== \"method\" || member.static) continue;\n if (member.accessibility === \"private\" || member.accessibility === \"protected\") continue;\n if (member.key.type === AST_NODE_TYPES.PrivateIdentifier) continue;\n if (member.key.type === AST_NODE_TYPES.Identifier) names.push(member.key.name);\n else names.push(\"…\");\n }\n return names;\n};\n\nexport default createRule<Options, MessageIds>({\n name: \"require-interface-for-injected-service\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"An exported service class with constructor-injected collaborators must implement an interface, so consumers depend on a port they can substitute instead of mocking the class.\",\n },\n schema: [],\n messages: {\n requireInterface:\n \"`{{name}}` stores injected collaborator(s) ({{deps}}) but implements no interface, so every consumer depends on this concrete class and can only be tested by mocking it. Declare an interface with its public method signature(s) ({{methods}}) and `class {{name}} implements <Interface>`.\",\n },\n },\n defaultOptions: [],\n create(context) {\n const { filename } = context;\n if (isTestFile(filename) || isStoryFile(filename) || isScriptFile(filename)) return {};\n if (isGeneratedFile(filename, context.sourceCode.getText())) return {};\n\n // One pass over the module's top level, and only for a file that actually\n // has an options-object constructor to read.\n let declaredTypes: FileTypeIndex | null = null;\n const objectTypes = (): FileTypeIndex =>\n (declaredTypes ??= fileTypeIndex(context.sourceCode.ast));\n\n return {\n ClassDeclaration(node: TSESTree.ClassDeclaration): void {\n if (node.id === null) return;\n if (!isExportedClass(node)) return;\n // The port itself must never fire, and a class that extends anything —\n // an abstract base, a framework class, `Error` — already has one.\n if (node.abstract === true) return;\n if (node.superClass !== null) return;\n if (node.implements.length > 0) return;\n // A framework that instantiates by class token (NestJS `@Injectable()`)\n // makes the class its own contract.\n if (node.decorators.length > 0) return;\n\n const ctor = node.body.body.find(\n (member): member is TSESTree.MethodDefinition =>\n member.type === AST_NODE_TYPES.MethodDefinition && member.kind === \"constructor\",\n );\n if (ctor === undefined) return;\n\n const { collaborators, constructedFields } = readConstructor(\n ctor,\n objectTypes,\n typeParameterNames(node.typeParameters, ctor.value.typeParameters),\n );\n if (collaborators.length === 0) return;\n // A composition root BUILDS more than it RECEIVES — that is where\n // concrete types are supposed to be named, and a port above it protects\n // nobody. Constructing one internal helper while receiving a real\n // collaborator is an ordinary service, not a wiring class, so the test\n // is a ratio rather than the mere presence of a `new`.\n if (constructedFields > collaborators.length) return;\n // HTTP wiring: a router factory is mounted by the bootstrap, not injected.\n if (isFrameworkWiring(node.body)) return;\n // A lone third-party transport is not a seam a port could protect.\n if (isTransportWrapper(node.id.name, collaborators, context.sourceCode.ast)) return;\n\n const methods = publicMethodNames(node.body);\n if (methods.length === 0) return;\n\n context.report({\n node: node.id,\n messageId: \"requireInterface\",\n data: {\n name: node.id.name,\n deps: collaborators.map((c) => `${c.name}: ${c.display}`).join(\", \"),\n methods: methods.join(\", \"),\n },\n });\n },\n };\n },\n});\n","/**\n * @fileoverview require-zod-form-validation — `formData.get(k)` hands back an attacker-controlled `FormDataEntryValue | null`.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/require-zod-form-validation.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/require-zod-form-validation.md\n */\n\nimport { type TSESTree, AST_NODE_TYPES } from \"@typescript-eslint/utils\";\nimport type { RuleContext, Scope } from \"@typescript-eslint/utils/ts-eslint\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isTestFile } from \"./_paths.js\";\nimport { ZOD_SCHEMA_NAME_RE } from \"./_zod.js\";\n\ntype MessageIds = \"missingZodValidation\";\ntype Options = readonly [];\n\ntype Ctx = Readonly<RuleContext<MessageIds, Options>>;\n\n/**\n * Walk down a (possibly chained) receiver expression and decide whether it\n * originates from something that looks like a Zod schema — the bare `z` builder\n * (`z.object({...}).parse(...)`), a `Schema`-suffixed identifier\n * (`userSchema.parse(...)`), or a `Z`-prefixed identifier (`ZUser.parse(...)`).\n * Non-Zod receivers like `JSON` / `Date` are intentionally rejected.\n */\nconst looksLikeZodSchema = (node: TSESTree.Node): boolean => {\n let current: TSESTree.Node = node;\n while (true) {\n if (current.type === AST_NODE_TYPES.Identifier) {\n return current.name === \"z\" || ZOD_SCHEMA_NAME_RE.test(current.name);\n }\n if (current.type === AST_NODE_TYPES.CallExpression) {\n current = current.callee;\n continue;\n }\n if (current.type === AST_NODE_TYPES.MemberExpression) {\n current = current.object;\n continue;\n }\n return false;\n }\n};\n\n/**\n * Matches a Zod validation call: `<ZodSchema>.parse(...)` or\n * `<ZodSchema>.safeParse(...)`. Keys off the *receiver* looking like a Zod\n * schema rather than the method name alone, so `JSON.parse(...)` /\n * `Date.parse(...)` are NOT treated as validation.\n */\nconst isZodParseCall = (node: TSESTree.Node): boolean => {\n if (node.type !== AST_NODE_TYPES.CallExpression) return false;\n const callee = node.callee;\n if (callee.type !== AST_NODE_TYPES.MemberExpression) return false;\n if (callee.computed) return false;\n if (callee.property.type !== AST_NODE_TYPES.Identifier) return false;\n const method = callee.property.name;\n if (method !== \"parse\" && method !== \"safeParse\") return false;\n return looksLikeZodSchema(callee.object);\n};\n\n/**\n * Matches an (optionally awaited) `<x>.formData()` call — the canonical way a\n * `FormData` object is obtained from a `Request` / `Response`.\n */\nconst isFormDataMethodCall = (node: TSESTree.Node): boolean => {\n let current: TSESTree.Node = node;\n if (current.type === AST_NODE_TYPES.AwaitExpression) {\n current = current.argument;\n }\n if (current.type !== AST_NODE_TYPES.CallExpression) return false;\n const callee = current.callee;\n return (\n callee.type === AST_NODE_TYPES.MemberExpression &&\n !callee.computed &&\n callee.property.type === AST_NODE_TYPES.Identifier &&\n callee.property.name === \"formData\"\n );\n};\n\nexport default createRule<Options, MessageIds>({\n name: \"require-zod-form-validation\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Require Zod validation (`Schema.parse(...)` / `Schema.safeParse(...)`) when reading values out of a `FormData` object.\",\n },\n schema: [],\n messages: {\n missingZodValidation:\n \"FormData parsing must use Zod schema validation (e.g., Schema.parse() / Schema.safeParse())\",\n },\n },\n defaultOptions: [],\n create(context: Ctx) {\n if (isTestFile(context.filename)) {\n return {};\n }\n\n // A receiver is a FormData source if its name reads like form data, or if\n // it is a binding initialized from a `.formData()` call.\n const isFormSourceIdentifier = (node: TSESTree.Node): boolean => {\n if (node.type !== AST_NODE_TYPES.Identifier) return false;\n if (/formdata/i.test(node.name)) return true;\n\n let scope: Scope.Scope | null = context.sourceCode.getScope(node);\n while (scope !== null) {\n const variable = scope.set.get(node.name);\n if (variable !== undefined && variable.defs.length === 1) {\n const def = variable.defs[0];\n if (\n def !== undefined &&\n def.type === \"Variable\" &&\n def.node.type === AST_NODE_TYPES.VariableDeclarator &&\n def.node.init !== null\n ) {\n return isFormDataMethodCall(def.node.init);\n }\n return false;\n }\n scope = scope.upper;\n }\n return false;\n };\n\n const isFormDataGetCall = (node: TSESTree.CallExpression): boolean => {\n const callee = node.callee;\n if (callee.type !== AST_NODE_TYPES.MemberExpression) return false;\n if (\n callee.property.type !== AST_NODE_TYPES.Identifier ||\n callee.property.name !== \"get\"\n ) {\n return false;\n }\n return isFormSourceIdentifier(callee.object);\n };\n\n // Walk up from `node` looking for a surrounding Zod `.parse(...)` /\n // `.safeParse(...)` call. `.parent` is `null` at the Program root, so we\n // must guard for both null and undefined.\n const hasZodParseAncestor = (node: TSESTree.Node): boolean => {\n let parent: TSESTree.Node | null | undefined = node.parent;\n while (parent !== null && parent !== undefined) {\n if (isZodParseCall(parent)) return true;\n parent = parent.parent;\n }\n return false;\n };\n\n // `x instanceof File` / `x instanceof Blob` — a Zod schema adds nothing over\n // the `instanceof` narrowing for a binary upload.\n const isInstanceofNarrowing = (node: TSESTree.Node): boolean => {\n const parent: TSESTree.Node | null | undefined = node.parent;\n return (\n parent !== null &&\n parent !== undefined &&\n parent.type === AST_NODE_TYPES.BinaryExpression &&\n parent.operator === \"instanceof\" &&\n parent.left === node\n );\n };\n\n /** The identifier this `.get(...)` call is bound to, or null. */\n const boundDeclarator = (\n node: TSESTree.CallExpression,\n ): TSESTree.VariableDeclarator | null => {\n const parent = node.parent;\n if (\n parent.type === AST_NODE_TYPES.VariableDeclarator &&\n parent.init === node &&\n parent.id.type === AST_NODE_TYPES.Identifier\n ) {\n return parent;\n }\n return null;\n };\n\n /** Is any read of this binding validated (Zod parse, or `instanceof File`)? */\n const bindingIsValidated = (\n declarator: TSESTree.VariableDeclarator,\n ): boolean => {\n const variable = context.sourceCode.getDeclaredVariables(declarator)[0];\n if (variable === undefined) return false;\n return variable.references.some(\n (ref) =>\n hasZodParseAncestor(ref.identifier) ||\n isInstanceofNarrowing(ref.identifier),\n );\n };\n\n return {\n CallExpression(node: TSESTree.CallExpression): void {\n if (!isFormDataGetCall(node)) return;\n\n if (hasZodParseAncestor(node) || isInstanceofNarrowing(node)) return;\n\n const declarator = boundDeclarator(node);\n if (declarator !== null && bindingIsValidated(declarator)) return;\n\n context.report({\n node,\n messageId: \"missingZodValidation\",\n });\n },\n };\n },\n});\n","/**\n * @fileoverview store-insert-requires-on-conflict — a bare `INSERT` duplicates rows or throws under cron re-runs and queue redelivery.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/store-insert-requires-on-conflict.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/store-insert-requires-on-conflict.md\n */\n\nimport { type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isTestFile } from \"./_paths.js\";\nimport { createSqlListener } from \"./_sql.js\";\n\ntype MessageIds = \"storeInsertRequiresOnConflict\";\ntype Options = readonly [];\n\n/**\n * A real insert *write*: the keyword, a table identifier, an optional column\n * list, then `VALUES` / `SELECT` / `DEFAULT VALUES` with nothing in between.\n * Requiring that exact adjacency is what keeps English prose out — \"failed to\n * insert into the queue: values were rejected\" has words between the table and\n * the verb, so it does not match. The optional `OR <action>` clause is SQLite's\n * conflict resolution; it is matched here so `INSERT OR IGNORE INTO` is\n * recognised as an insert at all, then excused below.\n */\nconst INSERT_WRITE =\n /\\bINSERT\\s+(?:OR\\s+\\w+\\s+)?INTO\\s+[\\w.\"'`?$:@-]+\\s*(?:\\([^)]*\\)\\s*)?(?:VALUES|SELECT|DEFAULT\\s+VALUES)\\b/i;\n\n/** Conflict handling that makes the write replay-safe. */\nconst CONFLICT_HANDLED = /\\bON\\s+CONFLICT\\b|\\bON\\s+DUPLICATE\\s+KEY\\b|\\bINSERT\\s+OR\\s+(?:IGNORE|REPLACE)\\b/i;\n\nconst INSERT_GATE = /insert/i;\n\nexport default createRule<Options, MessageIds>({\n name: \"store-insert-requires-on-conflict\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Require an embedded SQL INSERT to carry ON CONFLICT; store writes replay under cron re-runs and queue redelivery and must be idempotent upserts.\",\n },\n schema: [],\n messages: {\n storeInsertRequiresOnConflict:\n \"This INSERT is not replay-safe: a cron re-run or queue redelivery duplicates the row (or fails the handler on a unique-constraint violation). Add `ON CONFLICT (...) DO UPDATE` / `DO NOTHING` (or `INSERT OR IGNORE`).\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (isTestFile(context.filename) || !INSERT_GATE.test(context.sourceCode.text)) {\n return {};\n }\n return createSqlListener((sql: string, node: TSESTree.Node): void => {\n if (!INSERT_WRITE.test(sql) || CONFLICT_HANDLED.test(sql)) {\n return;\n }\n context.report({ node, messageId: \"storeInsertRequiresOnConflict\" });\n });\n },\n});\n","/**\n * @fileoverview zod-naming-convention — a schema you cannot recognise at its use site sends every reader back to the declaration.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/zod-naming-convention.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/zod-naming-convention.md\n */\n\nimport { type TSESTree, AST_NODE_TYPES } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isGeneratedFile, isTestFile } from \"./_paths.js\";\nimport { ZOD_PREFIX_RE, ZOD_SCHEMA_NAME_RE, ZOD_SUFFIX_RE } from \"./_zod.js\";\n\ntype MessageIds = \"zPrefix\" | \"schemaSuffix\" | \"zodSchemaName\";\ntype Convention = \"prefix\" | \"suffix\" | \"either\";\ntype Options = readonly [\n {\n convention?: Convention;\n }?,\n];\n\nconst CONVENTIONS: Record<\n Convention,\n { readonly test: RegExp; readonly messageId: MessageIds }\n> = {\n prefix: { test: ZOD_PREFIX_RE, messageId: \"zPrefix\" },\n suffix: { test: ZOD_SUFFIX_RE, messageId: \"schemaSuffix\" },\n either: { test: ZOD_SCHEMA_NAME_RE, messageId: \"zodSchemaName\" },\n};\n\n/**\n * Guard (c): the binding already reads as a schema. `ZOD_SUFFIX_RE` is anchored\n * and case-sensitive by design (it is also the *recogniser* other rules use), so\n * it rejects `schema`, `schema1` and `numberSchemaOptional`. Those need no\n * rename — the whole point of the convention is that a reader spots a schema at\n * the use site, and every one of them does. Accepting them here only widens what\n * this rule tolerates; it never makes the shared recogniser stricter.\n */\nconst CONTAINS_SCHEMA_RE = /schema/i;\n\n/**\n * Guard (d): micro-benchmark trees. A schema declared in a benchmark is a\n * throwaway local fed to a suite a few lines below — the same \"no cross-module\n * use site for the convention to serve\" argument as the test-file guard, on a\n * path `isTestFile` does not match. Kept local to this rule rather than pushed\n * into `_paths` because a benchmark is not a test: it is not exempt from\n * correctness rules, only from naming ones.\n *\n * Anchored on a PATH SEGMENT so `workbench/` and `benchmarking-report.ts` are\n * unaffected.\n */\nconst BENCHMARK_PATH_RE = /(^|[\\\\/])(?:benchmarks?|bench)[\\\\/]/;\n\n/**\n * Guard (b): terminal methods on a `z.…` chain whose result is NOT a schema.\n * `.parse`/`.safeParse` return a parsed value or a result envelope, the codec\n * methods return the converted value, `z.toJSONSchema` returns a plain JSON\n * object, `z.registry()` returns a registry, and `.implement()` returns a\n * function. Naming any of them `xSchema` would be a lie.\n */\nconst NON_SCHEMA_TERMINALS: ReadonlySet<string> = new Set([\n \"parse\",\n \"parseAsync\",\n \"safeParse\",\n \"safeParseAsync\",\n \"encode\",\n \"decode\",\n \"encodeAsync\",\n \"decodeAsync\",\n \"safeEncode\",\n \"safeDecode\",\n \"safeEncodeAsync\",\n \"safeDecodeAsync\",\n \"toJSONSchema\",\n \"registry\",\n \"implement\",\n]);\n\n/** The method name a call chain ends on, e.g. `safeParse` for `z.string().safeParse(x)`. */\nconst terminalMethodName = (callee: TSESTree.MemberExpression): string | null =>\n !callee.computed && callee.property.type === AST_NODE_TYPES.Identifier\n ? callee.property.name\n : null;\n\n/**\n * Walks down a (possibly chained) callee like `z.object().extend().refine()` and\n * returns `true` if the chain originates from a bare `z` identifier — i.e. the\n * outermost MemberExpression on the chain has `z` as its receiver.\n */\nconst calleeChainStartsWithZ = (node: TSESTree.Node): boolean => {\n let current: TSESTree.Node = node;\n\n while (current.type === AST_NODE_TYPES.MemberExpression) {\n const receiver: TSESTree.Node = current.object;\n if (receiver.type === AST_NODE_TYPES.Identifier && receiver.name === \"z\") {\n return true;\n }\n if (receiver.type === AST_NODE_TYPES.CallExpression) {\n current = receiver.callee;\n continue;\n }\n return false;\n }\n\n return false;\n};\n\nexport default createRule<Options, MessageIds>({\n name: \"zod-naming-convention\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Enforce a consistent Zod schema naming convention — a `Z` prefix (`ZUser`) or a `Schema` suffix (`userSchema`); both are accepted by default.\",\n },\n schema: [\n {\n type: \"object\",\n additionalProperties: false,\n properties: {\n convention: {\n type: \"string\",\n enum: [\"prefix\", \"suffix\", \"either\"],\n },\n },\n },\n ],\n messages: {\n zPrefix: \"Zod schema names should start with Z (e.g. `ZUser`)\",\n schemaSuffix: \"Zod schema names should end with Schema (e.g. `userSchema`)\",\n zodSchemaName:\n \"Zod schema names should start with Z (`ZUser`) or end with Schema (`userSchema`)\",\n },\n },\n defaultOptions: [{}],\n create(context, [optionsArg]) {\n const convention = optionsArg?.convention ?? \"either\";\n const { test, messageId } = CONVENTIONS[convention];\n // Guard (c) relaxes the SUFFIX spelling, so it must not apply to a team that\n // explicitly asked for prefix-only — there `userschema` really is off-convention.\n const acceptsSchemaWord = convention !== \"prefix\";\n\n // Guard (a) / (d): a schema declared in a test or a benchmark is a local\n // fixture, not an API.\n if (\n isTestFile(context.filename) ||\n BENCHMARK_PATH_RE.test(context.filename.replaceAll(\"\\\\\", \"/\")) ||\n isGeneratedFile(context.filename, context.sourceCode.text)\n ) {\n return {};\n }\n\n return {\n VariableDeclarator(node: TSESTree.VariableDeclarator): void {\n const init = node.init;\n if (init === null || init === undefined) return;\n if (init.type !== AST_NODE_TYPES.CallExpression) return;\n\n const callee = init.callee;\n if (callee.type !== AST_NODE_TYPES.MemberExpression) return;\n\n if (!calleeChainStartsWithZ(callee)) return;\n\n // Guard (b): the chain ends on a call that yields a value/result, not a schema.\n const terminal = terminalMethodName(callee);\n if (terminal !== null && NON_SCHEMA_TERMINALS.has(terminal)) return;\n\n if (node.id.type !== AST_NODE_TYPES.Identifier) return;\n if (test.test(node.id.name)) return;\n // Guard (c): the name already reads as a schema in any casing.\n if (acceptsSchemaWord && CONTAINS_SCHEMA_RE.test(node.id.name)) return;\n\n context.report({\n node: node.id,\n messageId,\n });\n },\n };\n },\n});\n","/**\n * @fileoverview _renames — every rule this plugin has renamed, old name to new; the old names no longer resolve, so this map is what says what to write instead.\n *\n * It feeds `scripts/sync-rule-ledger.py`, which turns each entry into a `renamed` row of the shipped `rule-ledger.json` that `sarj-lint-configs doctor` reads.\n *\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/_renames.md\n */\n\nexport const renamedRules = {\n \"jsdoc-restates-signature\": \"no-restated-jsdoc\",\n \"no-async-callback-in-waitfor\": \"no-async-callback-in-wait-for\",\n \"strict-test-assertions\": \"prefer-whole-object-assertion\",\n \"trailing-value-narration\": \"no-trailing-value-narration\",\n} as const;\n\nexport type RenamedFrom = keyof typeof renamedRules;\nexport type RenamedTo = (typeof renamedRules)[RenamedFrom];\n","/**\n * @fileoverview _retired — a withdrawn rule name is burned, not recycled, because a consumer's `eslint-disable` comment or suppressions entry still names it.\n *\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/_retired.md\n */\n\n/** Why a name was withdrawn, and in which release. */\nexport interface RetiredRule {\n /** The plugin version whose release removed the rule. */\n readonly removedIn: string;\n /** One line a consumer can act on: why it went, and what (if anything) replaced it. */\n readonly reason: string;\n}\n\nexport const retiredRules: Readonly<Record<string, RetiredRule>> = {\n \"ban-loose-type-guards-in-tests\": {\n removedIn: \"5.0.0\",\n reason:\n \"Read at 39 findings with 0 true positives in the #183 corpus audit. Delete the config entry; no replacement.\",\n },\n \"no-implicit-attribute-access\": {\n removedIn: \"5.0.0\",\n reason:\n \"Read at 50 findings with 0 true positives in the #183 corpus audit. Delete the config entry; no replacement.\",\n },\n \"no-sequential-await\": {\n removedIn: \"3.0.0\",\n reason:\n \"218 findings, 100% range-contained in core `no-await-in-loop`, which the shipped config already enables. Delete the entry; `no-await-in-loop` covers it.\",\n },\n \"no-template-literal-in-log\": {\n removedIn: \"2.3.1\",\n reason: \"Withdrawn. Delete the config entry; no replacement.\",\n },\n \"no-unsafe-cast\": {\n removedIn: \"3.0.0\",\n reason:\n \"1,089 findings, matching `@typescript-eslint/consistent-type-assertions` (\\\"never\\\") at the identical line and column with zero residue. Delete the entry; keep that rule enabled.\",\n },\n \"prefer-setup-file-mocks\": {\n removedIn: \"5.0.0\",\n reason:\n \"Read at 50 findings with 0 true positives in the #183 corpus audit. Delete the config entry; no replacement.\",\n },\n \"prefer-shadcn\": {\n removedIn: \"3.0.0\",\n reason:\n \"645 findings, a subset of `react/forbid-elements`; its 24-position residue was all design-system primitives being told not to be the design system. Delete the entry.\",\n },\n \"primary-export-file-name\": {\n removedIn: \"4.0.0\",\n reason:\n \"Renamed files after one of their exports — 316 findings over 1,966 files sampled 11 harmful / 15 useless / 4 valuable, including telling `next.config.ts` to become `next-config.ts`. Delete the config entry.\",\n },\n \"require-parameterized-tests\": {\n removedIn: \"4.0.0\",\n reason:\n \"Landed in #153 and never wired up: absent from the `rules` record, every preset, and eslint.strict.mjs. Nothing to migrate.\",\n },\n \"require-schema-validate-search\": {\n removedIn: \"3.0.0\",\n reason:\n \"14 findings, all matched line-and-column by `@typescript-eslint/consistent-type-assertions`. Delete the entry.\",\n },\n \"single-public-export\": {\n removedIn: \"3.0.0\",\n reason:\n \"3 findings, all also reported by the then-live `primary-export-file-name` (itself withdrawn in 4.0.0). Delete the entry.\",\n },\n};\n","/**\n * @fileoverview index — the plugin's rule registry and its two presets; the historical rename map lives in `rules/_renames.ts`.\n */\n\nimport enforceFileStructure from \"./rules/enforce-file-structure.js\";\nimport noAsyncCallbackInWaitFor from \"./rules/no-async-callback-in-wait-for.js\";\nimport noClientSideDataFetching from \"./rules/no-client-side-data-fetching.js\";\nimport noCommentCruft from \"./rules/no-comment-cruft.js\";\nimport noConditionalInTest from \"./rules/no-conditional-in-test.js\";\nimport noCorsWildcardWithCredentials from \"./rules/no-cors-wildcard-with-credentials.js\";\nimport noDynamicSql from \"./rules/no-dynamic-sql.js\";\nimport noEnum from \"./rules/no-enum.js\";\nimport noFatTryBlocks from \"./rules/no-fat-try-blocks.js\";\nimport noHandRolledSleep from \"./rules/no-hand-rolled-sleep.js\";\nimport noInsecureRandomId from \"./rules/no-insecure-random-id.js\";\nimport noJsonStringifyError from \"./rules/no-json-stringify-error.js\";\nimport noLogOnlyCatch from \"./rules/no-log-only-catch.js\";\nimport noOffsetPagination from \"./rules/no-offset-pagination.js\";\nimport noPositionalTupleReturn from \"./rules/no-positional-tuple-return.js\";\nimport noRawEnv from \"./rules/no-raw-env.js\";\nimport noRawFetchOutsideClients from \"./rules/no-raw-fetch-outside-clients.js\";\nimport noRepeatedStringLiteral from \"./rules/no-repeated-string-literal.js\";\nimport noRestatedComment from \"./rules/no-restated-comment.js\";\nimport noRestatedJsdoc from \"./rules/no-restated-jsdoc.js\";\nimport noSecretInLog from \"./rules/no-secret-in-log.js\";\nimport noSelectStar from \"./rules/no-select-star.js\";\nimport noSentinelReturnOnCatch from \"./rules/no-sentinel-return-on-catch.js\";\nimport noSilentPromiseCatch from \"./rules/no-silent-promise-catch.js\";\nimport noSleepInTestBody from \"./rules/no-sleep-in-test-body.js\";\nimport noStorageInStatelessModules from \"./rules/no-storage-in-stateless-modules.js\";\nimport noStringConcatInLoop from \"./rules/no-string-concat-in-loop.js\";\nimport noTautologicalExpect from \"./rules/no-tautological-expect.js\";\nimport noTrailingValueNarration from \"./rules/no-trailing-value-narration.js\";\nimport noDeclarationCommentWall from \"./rules/no-declaration-comment-wall.js\";\nimport noTypeMemberCommentWall from \"./rules/no-type-member-comment-wall.js\";\nimport noUnnecessaryUseClient from \"./rules/no-unnecessary-use-client.js\";\nimport noUnsafeMockCasting from \"./rules/no-unsafe-mock-casting.js\";\nimport noZodNativeEnum from \"./rules/no-zod-native-enum.js\";\nimport preferConstantTimeSecretCompare from \"./rules/prefer-constant-time-secret-compare.js\";\nimport preferDiscriminatedUnion from \"./rules/prefer-discriminated-union.js\";\nimport preferModuleLevelConstant from \"./rules/prefer-module-level-constant.js\";\nimport preferModuleLevelSchema from \"./rules/prefer-module-level-schema.js\";\nimport preferNonNullableCollection from \"./rules/prefer-non-nullable-collection.js\";\nimport preferSchemaForApiPayload from \"./rules/prefer-schema-for-api-payload.js\";\nimport preferSemanticColors from \"./rules/prefer-semantic-colors.js\";\nimport preferServerActions from \"./rules/prefer-server-actions.js\";\nimport preferStringLiteralUnion from \"./rules/prefer-string-literal-union.js\";\nimport preferWholeObjectAssertion from \"./rules/prefer-whole-object-assertion.js\";\nimport preferZodEnum from \"./rules/prefer-zod-enum.js\";\nimport preferZodInfer from \"./rules/prefer-zod-infer.js\";\nimport requireAssertNever from \"./rules/require-assert-never.js\";\nimport requireFetchTimeout from \"./rules/require-fetch-timeout.js\";\nimport requireInterfaceForInjectedService from \"./rules/require-interface-for-injected-service.js\";\nimport requireZodFormValidation from \"./rules/require-zod-form-validation.js\";\nimport storeInsertRequiresOnConflict from \"./rules/store-insert-requires-on-conflict.js\";\nimport zodNamingConvention from \"./rules/zod-naming-convention.js\";\nimport { renamedRules } from \"./rules/_renames.js\";\nimport { retiredRules } from \"./rules/_retired.js\";\n\nconst rules = {\n\"enforce-file-structure\": enforceFileStructure,\n \"no-async-callback-in-wait-for\": noAsyncCallbackInWaitFor,\n \"no-client-side-data-fetching\": noClientSideDataFetching,\n \"no-comment-cruft\": noCommentCruft,\n \"no-conditional-in-test\": noConditionalInTest,\n \"no-cors-wildcard-with-credentials\": noCorsWildcardWithCredentials,\n \"no-dynamic-sql\": noDynamicSql,\n \"no-enum\": noEnum,\n \"no-fat-try-blocks\": noFatTryBlocks,\n \"no-hand-rolled-sleep\": noHandRolledSleep,\n \"no-insecure-random-id\": noInsecureRandomId,\n \"no-json-stringify-error\": noJsonStringifyError,\n \"no-log-only-catch\": noLogOnlyCatch,\n \"no-offset-pagination\": noOffsetPagination,\n \"no-positional-tuple-return\": noPositionalTupleReturn,\n \"no-raw-env\": noRawEnv,\n \"no-raw-fetch-outside-clients\": noRawFetchOutsideClients,\n \"no-repeated-string-literal\": noRepeatedStringLiteral,\n \"no-restated-comment\": noRestatedComment,\n \"no-restated-jsdoc\": noRestatedJsdoc,\n \"no-secret-in-log\": noSecretInLog,\n \"no-select-star\": noSelectStar,\n \"no-sentinel-return-on-catch\": noSentinelReturnOnCatch,\n \"no-silent-promise-catch\": noSilentPromiseCatch,\n \"no-sleep-in-test-body\": noSleepInTestBody,\n \"no-storage-in-stateless-modules\": noStorageInStatelessModules,\n \"no-string-concat-in-loop\": noStringConcatInLoop,\n \"no-tautological-expect\": noTautologicalExpect,\n \"no-trailing-value-narration\": noTrailingValueNarration,\n \"no-declaration-comment-wall\": noDeclarationCommentWall,\n \"no-type-member-comment-wall\": noTypeMemberCommentWall,\n \"no-unnecessary-use-client\": noUnnecessaryUseClient,\n \"no-unsafe-mock-casting\": noUnsafeMockCasting,\n \"no-zod-native-enum\": noZodNativeEnum,\n \"prefer-constant-time-secret-compare\": preferConstantTimeSecretCompare,\n \"prefer-discriminated-union\": preferDiscriminatedUnion,\n \"prefer-module-level-constant\": preferModuleLevelConstant,\n \"prefer-module-level-schema\": preferModuleLevelSchema,\n \"prefer-non-nullable-collection\": preferNonNullableCollection,\n \"prefer-schema-for-api-payload\": preferSchemaForApiPayload,\n \"prefer-semantic-colors\": preferSemanticColors,\n \"prefer-server-actions\": preferServerActions,\n \"prefer-string-literal-union\": preferStringLiteralUnion,\n \"prefer-whole-object-assertion\": preferWholeObjectAssertion,\n \"prefer-zod-enum\": preferZodEnum,\n \"prefer-zod-infer\": preferZodInfer,\n \"require-assert-never\": requireAssertNever,\n \"require-fetch-timeout\": requireFetchTimeout,\n \"require-interface-for-injected-service\": requireInterfaceForInjectedService,\n \"require-zod-form-validation\": requireZodFormValidation,\n \"store-insert-requires-on-conflict\": storeInsertRequiresOnConflict,\n \"zod-naming-convention\": zodNamingConvention,\n};\n\nconst meta = {\n name: \"@sarj/eslint-plugin\",\n version: \"9.2.0\",\n} as const;\n\nconst recommendedRules = {\n\"@sarj/enforce-file-structure\": \"warn\",\n \"@sarj/no-async-callback-in-wait-for\": \"warn\",\n \"@sarj/no-client-side-data-fetching\": \"warn\",\n \"@sarj/no-comment-cruft\": \"warn\",\n \"@sarj/no-conditional-in-test\": \"warn\",\n \"@sarj/no-cors-wildcard-with-credentials\": \"warn\",\n \"@sarj/no-dynamic-sql\": \"warn\",\n \"@sarj/no-fat-try-blocks\": \"warn\",\n \"@sarj/no-hand-rolled-sleep\": \"warn\",\n \"@sarj/no-insecure-random-id\": \"warn\",\n \"@sarj/no-json-stringify-error\": \"warn\",\n \"@sarj/no-log-only-catch\": \"warn\",\n \"@sarj/no-offset-pagination\": \"warn\",\n \"@sarj/no-positional-tuple-return\": \"warn\",\n \"@sarj/no-repeated-string-literal\": \"warn\",\n \"@sarj/no-restated-comment\": \"warn\",\n \"@sarj/no-restated-jsdoc\": \"warn\",\n \"@sarj/no-secret-in-log\": \"warn\",\n \"@sarj/no-select-star\": \"warn\",\n \"@sarj/no-sentinel-return-on-catch\": \"warn\",\n \"@sarj/no-silent-promise-catch\": \"warn\",\n \"@sarj/no-sleep-in-test-body\": \"warn\",\n \"@sarj/no-string-concat-in-loop\": \"warn\",\n \"@sarj/no-tautological-expect\": \"warn\",\n \"@sarj/no-trailing-value-narration\": \"warn\",\n \"@sarj/no-declaration-comment-wall\": \"warn\",\n \"@sarj/no-type-member-comment-wall\": \"warn\",\n \"@sarj/no-unnecessary-use-client\": \"warn\",\n \"@sarj/no-unsafe-mock-casting\": \"warn\",\n \"@sarj/no-zod-native-enum\": \"warn\",\n \"@sarj/prefer-constant-time-secret-compare\": \"error\",\n \"@sarj/prefer-discriminated-union\": \"warn\",\n \"@sarj/prefer-module-level-constant\": \"warn\",\n \"@sarj/prefer-module-level-schema\": \"warn\",\n \"@sarj/prefer-non-nullable-collection\": \"warn\",\n \"@sarj/prefer-schema-for-api-payload\": \"warn\",\n \"@sarj/prefer-semantic-colors\": [\"warn\", { requireSemanticTokens: true }],\n \"@sarj/prefer-server-actions\": \"warn\",\n \"@sarj/prefer-string-literal-union\": \"warn\",\n \"@sarj/prefer-whole-object-assertion\": \"warn\",\n \"@sarj/prefer-zod-enum\": \"warn\",\n \"@sarj/prefer-zod-infer\": \"warn\",\n \"@sarj/require-assert-never\": \"error\",\n \"@sarj/require-fetch-timeout\": \"warn\",\n \"@sarj/require-interface-for-injected-service\": \"warn\",\n \"@sarj/require-zod-form-validation\": \"error\",\n \"@sarj/store-insert-requires-on-conflict\": \"warn\",\n \"@sarj/zod-naming-convention\": \"warn\",\n} as const;\n\nconst strictRules = {\n\"@sarj/enforce-file-structure\": \"error\",\n \"@sarj/no-async-callback-in-wait-for\": \"error\",\n \"@sarj/no-client-side-data-fetching\": \"error\",\n \"@sarj/no-comment-cruft\": \"error\",\n \"@sarj/no-conditional-in-test\": \"error\",\n \"@sarj/no-cors-wildcard-with-credentials\": \"error\",\n \"@sarj/no-dynamic-sql\": \"error\",\n \"@sarj/no-enum\": \"error\",\n \"@sarj/no-fat-try-blocks\": \"error\",\n \"@sarj/no-hand-rolled-sleep\": \"error\",\n \"@sarj/no-insecure-random-id\": \"error\",\n \"@sarj/no-json-stringify-error\": \"error\",\n \"@sarj/no-log-only-catch\": \"error\",\n \"@sarj/no-offset-pagination\": \"error\",\n \"@sarj/no-positional-tuple-return\": \"error\",\n \"@sarj/no-raw-env\": \"error\",\n \"@sarj/no-raw-fetch-outside-clients\": \"error\",\n \"@sarj/no-repeated-string-literal\": \"error\",\n \"@sarj/no-restated-comment\": \"error\",\n \"@sarj/no-restated-jsdoc\": \"error\",\n \"@sarj/no-secret-in-log\": \"error\",\n \"@sarj/no-select-star\": \"error\",\n \"@sarj/no-sentinel-return-on-catch\": \"error\",\n \"@sarj/no-silent-promise-catch\": \"error\",\n \"@sarj/no-sleep-in-test-body\": \"error\",\n \"@sarj/no-storage-in-stateless-modules\": \"error\",\n \"@sarj/no-string-concat-in-loop\": \"error\",\n \"@sarj/no-tautological-expect\": \"error\",\n \"@sarj/no-trailing-value-narration\": \"error\",\n \"@sarj/no-declaration-comment-wall\": \"error\",\n \"@sarj/no-type-member-comment-wall\": \"error\",\n \"@sarj/no-unnecessary-use-client\": \"error\",\n \"@sarj/no-unsafe-mock-casting\": \"error\",\n \"@sarj/no-zod-native-enum\": \"error\",\n \"@sarj/prefer-constant-time-secret-compare\": \"error\",\n \"@sarj/prefer-discriminated-union\": \"error\",\n \"@sarj/prefer-module-level-constant\": \"error\",\n \"@sarj/prefer-module-level-schema\": \"error\",\n \"@sarj/prefer-non-nullable-collection\": \"error\",\n \"@sarj/prefer-schema-for-api-payload\": \"error\",\n \"@sarj/prefer-semantic-colors\": [\"error\", { requireSemanticTokens: true }],\n \"@sarj/prefer-server-actions\": \"error\",\n \"@sarj/prefer-string-literal-union\": \"error\",\n \"@sarj/prefer-whole-object-assertion\": \"error\",\n \"@sarj/prefer-zod-enum\": \"error\",\n \"@sarj/prefer-zod-infer\": \"error\",\n \"@sarj/require-assert-never\": \"error\",\n \"@sarj/require-fetch-timeout\": \"error\",\n \"@sarj/require-interface-for-injected-service\": \"error\",\n \"@sarj/require-zod-form-validation\": \"error\",\n \"@sarj/store-insert-requires-on-conflict\": \"error\",\n \"@sarj/zod-naming-convention\": \"error\",\n} as const;\n\ntype FlatPreset = {\n readonly name: string;\n readonly plugins: Record<string, unknown>;\n readonly rules: Record<string, unknown>;\n};\n\n/**\n * The presets, as FLAT config objects — `plugins` is the object form, so both go\n * straight into an `eslint.config.mjs` array with no spread. Neither sets\n * `files` or a parser, so they compose with whatever a repo already has.\n */\nconst plugin = {\n meta,\n rules,\n // Withdrawn names travel WITH the plugin so a consumer's migration script and\n // this repo's gates read one map, not two. See src/rules/_retired.ts.\n retiredRules,\n configs: {\n recommended: {} as FlatPreset,\n strict: {} as FlatPreset,\n },\n};\n\nplugin.configs.recommended = {\n name: \"@sarj/recommended\",\n plugins: { \"@sarj\": plugin },\n rules: recommendedRules,\n};\n\nplugin.configs.strict = {\n name: \"@sarj/strict\",\n plugins: { \"@sarj\": plugin },\n rules: strictRules,\n};\n\nexport default plugin;\nexport { type RetiredRule, retiredRules } from \"./rules/_retired.js\";\nexport { recommendedRules, renamedRules, rules, strictRules };\n"],"mappings":"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","names":["AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","isNode","subtreeMatches","AST_NODE_TYPES","matchesAnyPattern","AST_NODE_TYPES","propName","AST_NODE_TYPES","calleeName","AST_NODE_TYPES","FUNCTION_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","FUNCTION_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","DIRECTIVE_RE","areAdjacentLineComments","AST_NODE_TYPES","AST_NODE_TYPES","DIRECTIVE_RE","STOPWORDS","WORD_RE","AST_NODE_TYPES","propertyKeyName","keyName","AST_NODE_TYPES","AST_NODE_TYPES","isNode","calleeName","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","TEST_CALLERS","FUNCTION_TYPES","AST_NODE_TYPES","nearestEnclosingFunction","testCallerName","isTestBody","AST_NODE_TYPES","DEFAULT_METHODS","compile","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","preview","WORD_RE","STOPWORDS","DIRECTIVE_RE","AST_NODE_TYPES","AST_NODE_TYPES","NON_ASCII_LETTER_RE","WORD_RE","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","named","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","ESLintUtils","AST_NODE_TYPES","unwrap","AST_NODE_TYPES","ESLintUtils","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","IGNORE_PATTERNS","FUNCTION_TYPES","AST_NODE_TYPES","isIgnoredFile","unwrap","enclosingFunction","AST_NODE_TYPES","isZodModule","FUNCTION_TYPES","AST_NODE_TYPES","isZodModule","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","unwrap","AST_NODE_TYPES","findVariable","AST_NODE_TYPES","AST_NODE_TYPES","propName","keyName","ESLintUtils","AST_NODE_TYPES","ts","IGNORE_PATTERNS","isIgnoredFile","AST_NODE_TYPES","NUMERIC_SIGNS","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","isZodModule","AST_NODE_TYPES","AST_NODE_TYPES","isZodModule","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","ASTUtils","GLOBAL_OBJECTS","matchesAnyPattern","AST_NODE_TYPES","ASTUtils","isGlobalFetchCall","AST_NODE_TYPES","AST_NODE_TYPES","named","stem","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES"]}
|
|
1
|
+
{"version":3,"sources":["../src/rules/enforce-file-structure.ts","../src/rules/_docs.ts","../src/rules/_paths.ts","../src/rules/no-async-callback-in-wait-for.ts","../src/rules/no-client-side-data-fetching.ts","../src/rules/no-comment-cruft.ts","../src/rules/_comments.ts","../src/rules/no-conditional-in-test.ts","../src/rules/no-cors-wildcard-with-credentials.ts","../src/rules/no-dynamic-sql.ts","../src/rules/_sql.ts","../src/rules/no-enum.ts","../src/rules/no-fat-try-blocks.ts","../src/rules/no-hand-rolled-sleep.ts","../src/rules/no-insecure-random-id.ts","../src/rules/no-json-stringify-error.ts","../src/rules/no-log-only-catch.ts","../src/rules/_logging.ts","../src/rules/no-offset-pagination.ts","../src/rules/no-positional-tuple-return.ts","../src/rules/no-raw-env.ts","../src/rules/no-raw-fetch-outside-clients.ts","../src/rules/no-repeated-string-literal.ts","../src/rules/no-restated-comment.ts","../src/rules/no-restated-jsdoc.ts","../src/rules/no-secret-in-log.ts","../src/rules/_secret-names.ts","../src/rules/no-select-star.ts","../src/rules/no-sentinel-return-on-catch.ts","../src/rules/no-silent-promise-catch.ts","../src/rules/no-sleep-in-test-body.ts","../src/rules/no-storage-in-stateless-modules.ts","../src/rules/no-string-concat-in-loop.ts","../src/rules/no-tautological-expect.ts","../src/rules/no-trailing-value-narration.ts","../src/rules/no-declaration-comment-wall.ts","../src/rules/_comment-wall.ts","../src/rules/no-type-member-comment-wall.ts","../src/rules/no-unnecessary-use-client.ts","../src/rules/no-unsafe-mock-casting.ts","../src/rules/no-zod-native-enum.ts","../src/rules/prefer-constant-time-secret-compare.ts","../src/rules/prefer-discriminated-union.ts","../src/rules/prefer-module-level-constant.ts","../src/rules/prefer-module-level-schema.ts","../src/rules/_zod.ts","../src/rules/prefer-non-nullable-collection.ts","../src/rules/prefer-schema-for-api-payload.ts","../src/rules/prefer-semantic-colors.ts","../src/rules/_tailwind.ts","../src/rules/prefer-server-actions.ts","../src/rules/prefer-string-literal-union.ts","../src/rules/prefer-whole-object-assertion.ts","../src/rules/prefer-zod-enum.ts","../src/rules/prefer-zod-infer.ts","../src/rules/require-assert-never.ts","../src/rules/require-fetch-timeout.ts","../src/rules/require-interface-for-injected-service.ts","../src/rules/require-zod-form-validation.ts","../src/rules/store-insert-requires-on-conflict.ts","../src/rules/zod-naming-convention.ts","../src/rules/_renames.ts","../src/rules/_retired.ts","../src/index.ts"],"sourcesContent":["/**\n * @fileoverview enforce-file-structure — imports come first, then step-down order; a `use server` directive that is not the first statement is inert.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/enforce-file-structure.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/enforce-file-structure.md\n */\n\nimport { type TSESTree, AST_NODE_TYPES } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isGeneratedFile, isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"importsFirst\" | \"useServerDirective\";\ntype Options = readonly [];\n\ntype StatementKind = \"import\" | \"reexport\" | \"body\";\n\n/**\n * Classify a top-level statement by WHAT it introduces, not by the presence of\n * the `export` keyword.\n *\n * - `import ...` → \"import\"\n * - `export ... from`, `export * from`, → \"reexport\"\n * `export { a, b }` (local names)\n * - everything else, INCLUDING every → \"body\"\n * exported declaration/function\n *\n * Bucketing exported statements as \"body\" is the whole point: an exported\n * `interface`/`type`/`enum`/`class`/value-`const` is a declaration and an\n * exported `function` (or `export default <fn>`) is a function — both live in\n * the same body as their non-exported equivalents. That lets the dominant\n * step-down layout (public API first, private helpers below) pass instead of\n * forcing every `export`-prefixed statement into a terminal \"exports\" section.\n *\n * Re-exports are their own neutral group: a generated `_namespaces` barrel that\n * interleaves `import * as X` / `export { X }` must not be flagged, so\n * re-exports never trigger and are allowed anywhere in the file.\n */\nconst classifyStatement = (\n statement: TSESTree.ProgramStatement,\n): StatementKind => {\n switch (statement.type) {\n case AST_NODE_TYPES.ImportDeclaration:\n return \"import\";\n case AST_NODE_TYPES.ExportAllDeclaration:\n return \"reexport\";\n case AST_NODE_TYPES.ExportNamedDeclaration:\n // `export { a } from './x'` / `export { a, b }` re-export names without\n // declaring anything; only `export <decl>` introduces a body statement.\n return statement.declaration === null ? \"reexport\" : \"body\";\n default:\n return \"body\";\n }\n};\n\nconst isStringDirective = (statement: TSESTree.ProgramStatement): boolean =>\n statement.type === AST_NODE_TYPES.ExpressionStatement &&\n statement.expression.type === AST_NODE_TYPES.Literal &&\n typeof statement.expression.value === \"string\" &&\n statement.expression.value.startsWith(\"use \");\n\nconst isUseServerDirective = (\n statement: TSESTree.ProgramStatement,\n): boolean => {\n if (statement.type !== AST_NODE_TYPES.ExpressionStatement) return false;\n const expr = statement.expression;\n if (expr.type !== AST_NODE_TYPES.Literal) return false;\n return expr.value === \"use server\";\n};\n\nexport default createRule<Options, MessageIds>({\n name: \"enforce-file-structure\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Require `import` statements to come first, then allow step-down ordering (public API first, private helpers below) for the rest of the file. Exported statements are classified by WHAT they export — an exported interface is a declaration, an exported function is a function — so a public exported function followed by a private helper, or an exported interface among declarations, is allowed. Re-exports (`export { … } from`, `export *`, `export { … }`) are a neutral group, so generated namespace barrels pass. When a module contains a `use server` directive, it must be the first statement in the file.\",\n },\n schema: [],\n messages: {\n importsFirst:\n \"File structure violation: import statements must come before other declarations\",\n useServerDirective:\n \"A 'use server' directive must be the first statement in the file\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (isTestFile(context.filename) || isGeneratedFile(context.filename, context.sourceCode.text)) {\n return {};\n }\n\n return {\n Program(node: TSESTree.Program): void {\n const body = node.body;\n\n const misplacedUseServer = body.find(\n (statement, index) => index > 0 && isUseServerDirective(statement),\n );\n if (misplacedUseServer !== undefined) {\n context.report({\n node: misplacedUseServer,\n messageId: \"useServerDirective\",\n });\n }\n\n let seenBody = false;\n let inMisplacedRun = false;\n\n for (const statement of body) {\n if (isStringDirective(statement)) continue;\n\n switch (classifyStatement(statement)) {\n case \"reexport\":\n continue;\n case \"body\":\n seenBody = true;\n inMisplacedRun = false;\n continue;\n case \"import\":\n if (seenBody && !inMisplacedRun) {\n inMisplacedRun = true;\n context.report({\n node: statement,\n messageId: \"importsFirst\",\n });\n }\n continue;\n }\n }\n },\n };\n },\n});\n","/**\n * @fileoverview _docs — a rule's documentation links are DERIVED from its name, so a rename breaks a test instead of leaving a dead URL.\n *\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/_docs.md\n */\n\nimport { ESLintUtils } from \"@typescript-eslint/utils\";\n\nexport const REPO_BLOB = \"https://github.com/sarj-ai/standards/blob/main\";\nexport const TESTS_DIR = \"packages/typescript/tests/rules\";\nexport const EVIDENCE_DIR = \"docs/rules\";\n\nexport const examplesPath = (name: string): string =>\n `${TESTS_DIR}/${name}.test.ts`;\n\nexport const evidencePath = (name: string): string =>\n `${EVIDENCE_DIR}/${name}.md`;\n\nexport const examplesUrl = (name: string): string =>\n `${REPO_BLOB}/${examplesPath(name)}`;\n\nexport const evidenceUrl = (name: string): string =>\n `${REPO_BLOB}/${evidencePath(name)}`;\n\nexport const createRule = ESLintUtils.RuleCreator(evidenceUrl);\n","/**\n * @fileoverview _paths — shared file-kind predicates, so \"is this a test / script / generated file?\" is answered in exactly one place.\n *\n * A path joins a shared default only if its NAME makes a claim true for every rule; anything one rule needs alone is a named gate that rule opts into.\n *\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/_paths.md\n */\n\nconst SCRIPT_FILE_RE = /([\\\\/]scripts[\\\\/])|(\\.mjs$)/;\n\nconst STORY_FILE_RE = /\\.stories\\.[cm]?[jt]sx?$/i;\n// Gate `storyTree`. Storybook's own `stories_vue3-vite-default-ts/` spelling\n// included. Not a default: plenty of repos keep ordinary first-party components\n// under `stories/`, and to a rule about `process.env` those are production.\nconst STORY_TREE_RE = /(^|\\/)stories(?:[_-][^/]*)?\\//i;\n\n// `vendor` / `vendored` / `third[-_]?party` are shared, mirroring Python's\n// `_GENERATED_DIR_NAMES`: the directory name is itself the claim that an\n// upstream owns the text, and that claim holds for every rule.\nconst GENERATED_FILE_RE =\n /([\\\\/](?:generated|openapi-gen|graphql[\\\\/]types|vendor|vendored|third[-_]?party)[\\\\/])|(\\.gen\\.[cm]?[jt]sx?$)|(\\.generated\\.[cm]?[jt]sx?$)|(\\.d\\.[cm]?ts$)|(\\.types\\.[cm]?ts$)/;\n// Gate `externalTree`. Some `external/` trees really are a copy of someone\n// else's typings, but `src/services/external/` is first-party outbound\n// integration in most repos — the place a raw `process.env` read or an untimed\n// `fetch` matters most — so this cannot be a shared default.\nconst EXTERNAL_TREE_RE = /[\\\\/]external[\\\\/]/;\n\n// A BANNER match is safe and universal in a way a PATH match is not: no\n// hand-written file claims to be generator output. Subject-scoped on purpose —\n// the file itself has to be what the claim is ABOUT. See the evidence file.\nconst GENERATED_MARKER_RE =\n /(?:@generated\\b|this file (?:is|was|has been)[\\w\\s,'-]{0,40}?generated|auto-?generated file\\b|generated (?:with|by)|generated (?:graphql )?types|do not edit(?: directly| manually)?|do not (?:modify|change) this file)/i;\n\nconst TEST_BASENAME_RE = /[.\\-_](test|spec|e2e)\\.[cm]?[jt]sx?$/;\nconst TEST_INTEGRATION_BASENAME_RE = /\\.integration\\.[cm]?[jt]sx?$/;\n// `__fixtures__` / `__testfixtures__` are shared: the same category as the\n// `fixtures/` that has always been here, spelled the way jscodeshift and\n// Storybook spell it.\nconst TEST_DIR_RE = /(^|\\/)(tests?|__tests__|__mocks__|fixtures|__fixtures__|__testfixtures__|e2e|integration)\\//;\n// Gate `fixtureTree`: the SINGULAR `fixture/`. `src/fixture/seed.ts` is a\n// production database seeder in several repos, so exempting it from every\n// consumer of `isTestFile` is a scope change nobody asked for.\nconst FIXTURE_TREE_RE = /(^|\\/)fixture\\//;\n\n/**\n * Extra path gates `isGeneratedFile` honours on request. Not a default: see the\n * evidence document.\n */\nexport type GeneratedPathGate = \"externalTree\";\n\n/** Extra path gates `isTestFile` honours on request. */\nexport type TestPathGate = \"fixtureTree\";\n\n/** Extra path gates `isStoryFile` honours on request. */\nexport type StoryPathGate = \"storyTree\";\n\n/**\n * True for a test file: a `*.test.*` / `*.spec.*` basename, the `-test` /\n * `_test` suffix forms of the same, or anything under a `test/` / `tests/` /\n * `__tests__/` / `__mocks__/` / `fixtures/` / `__fixtures__/` /\n * `__testfixtures__/` / `e2e/` / `integration/` directory.\n *\n * Pass `[\"fixtureTree\"]` to also exempt the singular `fixture/`.\n */\nexport function isTestFile(filename: string, gates: readonly TestPathGate[] = []): boolean {\n const normalized = filename.replaceAll(\"\\\\\", \"/\");\n const base = normalized.slice(normalized.lastIndexOf(\"/\") + 1);\n if (TEST_BASENAME_RE.test(base) || TEST_INTEGRATION_BASENAME_RE.test(base)) {\n return true;\n }\n if (TEST_DIR_RE.test(normalized)) {\n return true;\n }\n return gates.includes(\"fixtureTree\") && FIXTURE_TREE_RE.test(normalized);\n}\n\n/**\n * True for a `*.stories.*` file. Pass `[\"storyTree\"]` to also match anything\n * inside a `stories/` tree.\n */\nexport function isStoryFile(filename: string, gates: readonly StoryPathGate[] = []): boolean {\n const normalized = filename.replaceAll(\"\\\\\", \"/\");\n if (STORY_FILE_RE.test(normalized)) {\n return true;\n }\n return gates.includes(\"storyTree\") && STORY_TREE_RE.test(normalized);\n}\n\n/**\n * True for a file whose text an upstream owns: generator output or a vendored\n * copy by path, or any file whose own header declares it generated.\n *\n * The banner arm is universal. The path arm defaults to generator output and\n * vendored trees; `[\"externalTree\"]` adds `external/`.\n */\nexport function isGeneratedFile(\n filename: string,\n sourceText = \"\",\n gates: readonly GeneratedPathGate[] = [],\n): boolean {\n const normalized = filename.replaceAll(\"\\\\\", \"/\");\n if (GENERATED_FILE_RE.test(normalized)) {\n return true;\n }\n if (gates.includes(\"externalTree\") && EXTERNAL_TREE_RE.test(normalized)) {\n return true;\n }\n return GENERATED_MARKER_RE.test(sourceText.slice(0, 2048));\n}\n\n/**\n * True for one-off tooling files: anything under a `scripts/` directory or a\n * `*.mjs` file. Dev scripts run interactively and die with the terminal, so\n * production-hardening rules (e.g. fetch timeouts) do not apply there.\n */\nexport function isScriptFile(filename: string): boolean {\n return SCRIPT_FILE_RE.test(filename);\n}\n","/**\n * @fileoverview no-async-callback-in-wait-for — an async `waitFor` callback swallows its own rejection, so the assertion inside it can never fail the test.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-async-callback-in-wait-for.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-async-callback-in-wait-for.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"noAsyncCallbackInWaitFor\";\ntype Options = readonly [];\n\n/**\n * `waitFor(…)` or `<x>.waitFor(…)`. Matching a bare Identifier only made the\n * `vi.waitFor` form structurally invisible.\n *\n * The receiver is deliberately unrestricted: the hazard belongs to the polling\n * contract, not to who owns the function. A computed member is not matched — the\n * name is not statically the callee there.\n */\nconst isWaitForCallee = (callee: TSESTree.CallExpression[\"callee\"]): boolean => {\n if (callee.type === AST_NODE_TYPES.Identifier) return callee.name === \"waitFor\";\n return (\n callee.type === AST_NODE_TYPES.MemberExpression &&\n !callee.computed &&\n callee.property.type === AST_NODE_TYPES.Identifier &&\n callee.property.name === \"waitFor\"\n );\n};\n\nexport default createRule<Options, MessageIds>({\n name: \"no-async-callback-in-wait-for\",\n meta: {\n type: \"problem\",\n docs: {\n description: \"Disallow async callbacks in `waitFor` to prevent swallowed promise rejections.\",\n },\n schema: [],\n messages: {\n noAsyncCallbackInWaitFor:\n \"The callback to `waitFor` should not be async. It expects synchronous assertions and runs the callback repeatedly.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (!isTestFile(context.filename)) {\n return {};\n }\n return {\n CallExpression(node: TSESTree.CallExpression) {\n if (!isWaitForCallee(node.callee)) return;\n const callback = node.arguments[0];\n if (\n callback &&\n (callback.type === AST_NODE_TYPES.ArrowFunctionExpression ||\n callback.type === AST_NODE_TYPES.FunctionExpression) &&\n callback.async\n ) {\n context.report({\n node: callback,\n messageId: \"noAsyncCallbackInWaitFor\",\n });\n }\n },\n };\n },\n});\n","/**\n * @fileoverview no-client-side-data-fetching — fetching in `useEffect` is a render -> effect -> fetch -> re-render waterfall with no server cache.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-client-side-data-fetching.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-client-side-data-fetching.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\n\ntype MessageIds = \"noClientFetch\";\ntype Options = readonly [];\n\nconst FETCH_LIBS: ReadonlySet<string> = new Set([\"axios\", \"ky\", \"superagent\"]);\n\n// Real HTTP verbs only. Explicitly excludes `create`, `defaults`,\n// `interceptors`, `isAxiosError`, etc.\nconst HTTP_METHOD_NAMES: ReadonlySet<string> = new Set([\n \"get\",\n \"post\",\n \"put\",\n \"delete\",\n \"patch\",\n \"request\",\n \"head\",\n \"options\",\n]);\n\n// Matched against whole path SEGMENTS (split on `/` and `.`), never as raw\n// substrings — otherwise `/api/login` (\"log\"), `/blog` (\"log\"), `/api/events`\n// (\"event\"), `/catalog` (\"log\"), and `/api/shipping` (\"ping\") would be wrongly\n// exempted.\nconst ANALYTICS_SEGMENTS: ReadonlySet<string> = new Set([\n \"analytics\",\n \"telemetry\",\n \"track\",\n \"log\",\n \"ping\",\n \"beacon\",\n \"metrics\",\n \"event\",\n]);\n\nfunction isEffectHookCall(node: TSESTree.CallExpression): boolean {\n const callee = node.callee;\n\n // useEffect(...) / useLayoutEffect(...)\n if (callee.type === AST_NODE_TYPES.Identifier) {\n return callee.name === \"useEffect\" || callee.name === \"useLayoutEffect\";\n }\n\n // React.useEffect(...) / React.useLayoutEffect(...)\n if (\n callee.type === AST_NODE_TYPES.MemberExpression &&\n !callee.computed &&\n callee.object.type === AST_NODE_TYPES.Identifier &&\n callee.object.name === \"React\" &&\n callee.property.type === AST_NODE_TYPES.Identifier\n ) {\n return (\n callee.property.name === \"useEffect\" ||\n callee.property.name === \"useLayoutEffect\"\n );\n }\n\n return false;\n}\n\n/**\n * Reads the `method` property of an options object passed to `fetch` / `axios`.\n * Returns the uppercased method name, or `null` if not statically determinable.\n */\nfunction readMethodProperty(\n optionsArg: TSESTree.Node | undefined,\n): string | null {\n if (!optionsArg || optionsArg.type !== AST_NODE_TYPES.ObjectExpression) {\n return null;\n }\n for (const prop of optionsArg.properties) {\n if (prop.type !== AST_NODE_TYPES.Property) continue;\n if (prop.computed) continue;\n const key = prop.key;\n const matchesMethodKey =\n (key.type === AST_NODE_TYPES.Identifier && key.name === \"method\") ||\n (key.type === AST_NODE_TYPES.Literal && key.value === \"method\");\n if (!matchesMethodKey) continue;\n if (\n prop.value.type === AST_NODE_TYPES.Literal &&\n typeof prop.value.value === \"string\"\n ) {\n return prop.value.value.toUpperCase();\n }\n return null;\n }\n return null;\n}\n\nfunction isFetchCall(node: TSESTree.CallExpression): boolean {\n const callee = node.callee;\n\n // fetch(url, options?)\n if (\n callee.type === AST_NODE_TYPES.Identifier &&\n callee.name === \"fetch\"\n ) {\n const method = readMethodProperty(node.arguments[1]);\n if (method !== null && method !== \"GET\") {\n return false;\n }\n return true;\n }\n\n // axios.get(...), ky.post(...), superagent.delete(...), ...\n if (\n callee.type === AST_NODE_TYPES.MemberExpression &&\n !callee.computed &&\n callee.object.type === AST_NODE_TYPES.Identifier &&\n FETCH_LIBS.has(callee.object.name) &&\n callee.property.type === AST_NODE_TYPES.Identifier\n ) {\n // Only flag actual HTTP method calls — NOT `axios.create`, `axios.defaults`,\n // `axios.interceptors`, `axios.isAxiosError`, etc.\n return HTTP_METHOD_NAMES.has(callee.property.name);\n }\n\n // axios(config) / ky(config) — treat as request unless method is explicitly non-GET.\n if (\n callee.type === AST_NODE_TYPES.Identifier &&\n (callee.name === \"axios\" || callee.name === \"ky\")\n ) {\n const firstArg = node.arguments[0];\n const secondArg = node.arguments[1];\n let configArg: TSESTree.Node | undefined;\n if (firstArg?.type === AST_NODE_TYPES.ObjectExpression) {\n configArg = firstArg;\n } else if (secondArg?.type === AST_NODE_TYPES.ObjectExpression) {\n configArg = secondArg;\n }\n const method = readMethodProperty(configArg);\n if (method !== null && method !== \"GET\") {\n return false;\n }\n return true;\n }\n\n return false;\n}\n\nfunction extractUrlString(node: TSESTree.CallExpression): string {\n const firstArg = node.arguments[0];\n if (!firstArg) return \"\";\n\n if (\n firstArg.type === AST_NODE_TYPES.Literal &&\n typeof firstArg.value === \"string\"\n ) {\n return firstArg.value;\n }\n if (firstArg.type === AST_NODE_TYPES.TemplateLiteral) {\n return firstArg.quasis.map((q) => q.value.cooked).join(\"\");\n }\n if (firstArg.type === AST_NODE_TYPES.Identifier) {\n return firstArg.name;\n }\n return \"\";\n}\n\nfunction isAnalyticsCall(node: TSESTree.CallExpression): boolean {\n const url = extractUrlString(node).toLowerCase();\n if (url === \"\") return false;\n // Split into path segments and file-extension parts; exempt only when a\n // WHOLE segment is a known analytics keyword.\n return url\n .split(/[/.]/)\n .some((segment) => ANALYTICS_SEGMENTS.has(segment));\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-client-side-data-fetching\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow data fetching inside `useEffect` / `useLayoutEffect`; prefer React Server Components, Server Actions, or a client-side cache (SWR / React Query).\",\n },\n schema: [],\n messages: {\n noClientFetch:\n \"Avoid direct data fetching inside useEffect / useLayoutEffect. This causes waterfalls and layout shifts. Prefer React Server Components, Server Actions, or client-side caching libraries like SWR or React Query.\",\n },\n },\n defaultOptions: [],\n create(context) {\n let effectDepth = 0;\n return {\n CallExpression(node: TSESTree.CallExpression): void {\n if (isEffectHookCall(node)) {\n effectDepth += 1;\n return;\n }\n if (effectDepth === 0) return;\n if (!isFetchCall(node)) return;\n if (isAnalyticsCall(node)) return;\n context.report({ node, messageId: \"noClientFetch\" });\n },\n \"CallExpression:exit\"(node: TSESTree.CallExpression): void {\n if (isEffectHookCall(node)) {\n effectDepth -= 1;\n }\n },\n };\n },\n});\n","/**\n * @fileoverview no-comment-cruft — commented-out code, section banners and file-header preambles are volume the reader pays for and nothing maintains.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-comment-cruft.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-comment-cruft.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { hasExternalReference, restatableStatementBelow, restatesStatementHead } from \"./_comments.js\";\nimport { isGeneratedFile } from \"./_paths.js\";\n\ntype MessageIds =\n | \"commentedOutCode\"\n | \"sectionBanner\"\n | \"fileHeaderPreamble\"\n | \"redundantNarration\"\n | \"untrackedTodo\";\ntype Options = readonly [];\n\nconst LEADING_PREAMBLE_MIN = 4;\n\n// Step-narration lead-ins (\"First, …\", \"Then, …\", \"Finally, …\", \"Step 2:\"). A\n// trailing comma/colon is required so English adverbs (\"finally the invariant\n// holds\") aren't mistaken for an enumeration marker.\nconst STEP_NARRATION_RE =\n /^(?:first(?:ly)?|second(?:ly)?|third(?:ly)?|then|next|after(?:wards| that)?|finally|lastly|now)\\s*[,:]\\s*\\S/i;\n\n// Self-admitted meta-commentary — the \"why later\", not the why. `TODO`/`FIXME`/\n// `HACK`/`XXX` are handled as directives (kept, with an owner, per convention).\n//\n// Every alternative here NAMES the debt: \"is a hack\", \"keeping it simple\", \"not\n// sure if\", \"could be refactored\". A bare `for now` used to be on the list and\n// is not, because it names nothing — it is an ordinary English temporal\n// qualifier that sits inside genuine scope and rationale comments. See\n// `isBareDeferral` below, which keeps the half of it that is really cruft.\nconst META_COMMENTARY_RE =\n /\\b(?:keeping (?:it|this) simple|could be (?:refactored|improved|cleaned up|simplified)|refactor(?:ed|ing)? (?:later|this)|not sure (?:if|whether|why|how)|quick[- ](?:and[- ]dirty|fix)|(?:a |bit of a )?hacky|is a hack|temporary (?:solution|workaround|fix|hack)|revisit (?:this|later|below)|clean (?:this|it) up|not ideal|placeholder for now)\\b/i;\n\nconst FOR_NOW_RE = /\\bfor now\\b/i;\n\n// Words that carry no information about WHAT is deferred, so they do not count\n// as substance around a `for now`.\nconst DEFERRAL_STOPWORDS: ReadonlySet<string> = new Set([\n \"a\", \"an\", \"and\", \"are\", \"as\", \"at\", \"be\", \"but\", \"by\", \"can\", \"could\", \"do\",\n \"does\", \"for\", \"from\", \"had\", \"has\", \"have\", \"here\", \"i\", \"in\", \"is\", \"it\",\n \"its\", \"just\", \"may\", \"might\", \"no\", \"not\", \"now\", \"of\", \"on\", \"only\", \"our\",\n \"shall\", \"should\", \"so\", \"still\", \"that\", \"the\", \"then\", \"there\", \"this\",\n \"to\", \"us\", \"was\", \"we\", \"were\", \"will\", \"with\", \"would\", \"you\", \"your\",\n]);\n\n/** Most content words a `for now` comment may carry and still be pure deferral. */\nconst DEFERRAL_MAX_CONTENT_WORDS = 2;\n\n/**\n * A `for now` comment that defers without saying anything: `// Empty for now.`,\n * `// Not needed for now`, `// login manually for now`.\n *\n * `for now` used to be an alternative inside `META_COMMENTARY_RE`, which made\n * the phrase evidence on its own. It is not. Every other alternative there NAMES\n * the debt; `for now` is two ordinary English words that sit just as happily\n * inside the *why* this rule's own message asks for:\n *\n * // our svg icons break if we use data urls, so disable inline assets for now\n * // skipping utils for now, as it has independent release process\n * // Empty for now. <- the real cruft\n *\n * The distinguishing fact is substance, not the phrase: a comment that defers\n * AND explains is a why-comment. Requiring the rest of the comment to be\n * near-empty keeps the contentless deferrals and drops the ones carrying a scope\n * limit, a reason, or an owner tag. `JUSTIFICATION_RE` does not rescue those —\n * its connective list is narrow, and \"as\", \"so <verb>\" and \"intentionally\" are\n * not on it, which is why they were reported at all. Numbers in\n * `docs/rules/no-comment-cruft.md`.\n */\nfunction isBareDeferral(text: string): boolean {\n if (!FOR_NOW_RE.test(text)) return false;\n const rest = text.replace(FOR_NOW_RE, \" \");\n const content = (rest.match(/[A-Za-z][\\w']*/g) ?? []).filter(\n (word) => !DEFERRAL_STOPWORDS.has(word.toLowerCase()),\n );\n return content.length <= DEFERRAL_MAX_CONTENT_WORDS;\n}\n\n// `sarj-noqa` is this repo's own suppression syntax (see `rule_base.py`). It was\n// missing here, so `// sarj-noqa: … — <reason>` on its own line was read as\n// prose and could itself be flagged.\nconst DIRECTIVE_RE =\n /^(eslint\\b|eslint-|sarj-noqa\\b|@ts-|prettier-ignore|prettier\\b|biome-|c8\\b|v8\\b|istanbul\\b|@type\\b|@vite|webpack|<reference|<amd|global\\b|noinspection|hack\\b|xxx\\b)/i;\n\nconst LICENSE_RE =\n /copyright|licen[cs]ed?|spdx|permission is hereby granted|all rights reserved/i;\n\n// An enumerated step in a numbered/bulleted plan: `1. get all tags`, `- read the\n// manifest`. A stack of these is an algorithm walkthrough — the \"why/how\" the\n// rule's own message asks for — even though no item ends in a full stop, which\n// is why `isProse` misses it.\nconst ENUMERATED_ITEM_RE = /^(?:\\d+[.):]|[-*•])\\s+\\S/;\nconst ENUMERATED_ITEM_MIN_WORDS = 3;\nconst ENUMERATED_PREAMBLE_MIN_ITEMS = 2;\n\nconst BANNER_FULL_RE = /^[\\s\\-=*#~_+.]{4,}$/;\nconst BANNER_RUN_RE = /={4,}|-{4,}|#{4,}|\\*{4,}|~{4,}|[\\u2500-\\u257f]{4,}/;\n\nconst REGION_MARKER_RE = /^#?(?:end)?region\\b(.*)$/i;\nconst REGION_TITLE_RE = /^[\\s:\\-\\u2013\\u2014]*\\w[\\w \\-/&+]*$/;\nconst REGION_TITLE_MAX_WORDS = 5;\n\nfunction isRegionMarker(text: string): boolean {\n const match = REGION_MARKER_RE.exec(text);\n if (match === null) return false;\n const title = (match[1] ?? \"\").trim();\n if (title.length === 0) return true;\n if (!REGION_TITLE_RE.test(title)) return false;\n return title.split(/\\s+/).length <= REGION_TITLE_MAX_WORDS;\n}\n\nconst SECTION_LABEL_WORDS: ReadonlySet<string> = new Set([\n \"actions\", \"components\", \"config\", \"configuration\", \"constant\", \"constants\",\n \"enums\", \"exports\", \"fixtures\", \"getters\", \"globals\", \"handler\", \"handlers\",\n \"helper\", \"helpers\", \"hook\", \"hooks\", \"imports\", \"interfaces\", \"main\",\n \"mocks\", \"models\", \"mutations\", \"props\", \"queries\", \"reducers\", \"routes\",\n \"schemas\", \"selectors\", \"setters\", \"setup\", \"state\", \"styles\", \"teardown\",\n \"type\", \"types\", \"util\", \"utilities\", \"utils\",\n]);\nconst SECTION_LABEL_RE = /^([A-Za-z]+)\\s*:?\\s*$/;\n\nfunction isSectionLabel(text: string): boolean {\n const match = SECTION_LABEL_RE.exec(text);\n return match !== null && SECTION_LABEL_WORDS.has((match[1] ?? \"\").toLowerCase());\n}\n\nconst HELPER_OPENER_RE = /^(?:a\\s+)?helper\\s+(?:function|method|component|hook|class|type|util(?:ity)?)\\b/i;\n\n// \"Let's not await the promise\" — the first-person-plural walkthrough voice.\n// Gated on the narration verb list because the third-person `lets` is a\n// different word doing real work: \"lets a same-day re-run find the message it\n// already posted\" explains a mechanism and must not be touched.\nconst LETS_RE =\n /^let'?s\\s+(?:not\\s+|just\\s+|now\\s+|first\\s+)?(?:add|append|assign|await|build|calculate|call|check|clear|close|compute|convert|copy|count|create|declare|decrement|define|delete|extract|fetch|filter|find|format|generate|get|handle|increment|init|initialise|initialize|insert|iterate|join|load|log|loop|map|merge|open|parse|print|process|push|read|remove|render|reset|return|save|send|set|setup|sort|split|start|stop|store|update|validate|wrap|write)(?:s|es|ed|ing)?\\b/i;\n\n// Enumeration markers that narrate a sequence: `// 1. Load the config`,\n// `// Phase 2: reconcile`. Flagged only when the file carries exactly one — a\n// *run* of them is a documented algorithm walkthrough, which is the kind of\n// comment this rule exists to protect. JSX-expression comments are exempt\n// wholesale (see `isStandalone`): `{/* Step 1: Select Patient */}` mirrors the\n// literal step labels of a UI wizard.\nconst ENUMERATION_RE = /^(?:\\d+[.)]\\s+\\S|(?:phase|step)\\s+\\d+\\b)/i;\n\n// Dummy translational comments: ultra-short comments that just restate the code.\n// Corroborated against the statement below by `restatesWholeStatement` — the\n// lexical match alone is NOT evidence. See that function.\nconst DUMMY_TRANSLATION_RE = /^(?:increment|return|returns|get|gets|set\\b(?! up\\b)|sets\\b(?! up\\b)|function to|method to)\\b/i;\n\nconst DIAGRAM_ARROW_RE = /[-=~]{2,}>|<[-=~]{2,}/;\n\nconst CODE_KEYWORD_RE =\n /^(import |export |const |let |var |function\\b|class |interface |type \\w|enum |return\\b|throw |await |async |if\\s*\\(|for\\s*\\(|while\\s*\\(|switch\\s*\\(|new |console\\.)/;\nconst CODE_TAIL_RE = /[;{}()]\\s*$|=>\\s*$|,\\s*$/;\n// LHS must be a real identifier (not a number literal — `0=Monday` in prose is\n// not an assignment) and `=` must not be `==`/`===`/`=>` (comparison/arrow).\n// The assignment branch additionally requires a code-tail — the line must end\n// with `;`, `)`, `}` or `]` — so plain prose like `count = number of items`\n// (which has no code-tail) is not mistaken for commented-out code.\nconst ASSIGN_RE = /^[A-Za-z_$][\\w.$[\\]]*\\s*(?:=(?![=>])|\\+=|-=|\\*=)\\s*\\S.*[;)}\\]]\\s*$/;\nconst CALL_RE = /^[A-Za-z_$][\\w.$]*\\([^)]*\\)\\s*;?\\s*$/;\n\n// Placeholders that only appear in grammar productions / desugaring examples,\n// never in real code: `%sent%`, `[opt]`, a standalone `<FunctionBody>`, `…` / `...`.\nconst PSEUDOCODE_RE = /%\\w+%|\\[opt\\]|(?:^|\\s)<[A-Za-z]\\w*>|…|\\.\\.\\./;\n\n// A triple-slash `///` directive keeps its third `/` after ESLint strips the\n// leading `//`, so strip 1–2 leading slashes (not exactly two) for `<reference`.\nfunction stripCommentMarker(line: string): string {\n return line.replace(/^\\s*\\/{1,2}/, \"\").replace(/^\\s*\\*+/, \"\").trim();\n}\n\nfunction isDirective(text: string): boolean {\n return DIRECTIVE_RE.test(text.trim());\n}\n\nfunction isBanner(text: string): boolean {\n const t = text.trim();\n if (!t) return false;\n if (BANNER_FULL_RE.test(t) || isRegionMarker(t)) return true;\n return BANNER_RUN_RE.test(t) && !DIAGRAM_ARROW_RE.test(t);\n}\n\n/**\n * `allowCall` is false where a bare statement cannot legally appear — inside an\n * interface body or a type literal. See `TYPE_MEMBER_CONTAINERS`.\n */\nfunction looksLikeCode(text: string, allowCall = true): boolean {\n const t = text.trim();\n if (!t) return false;\n if (CODE_KEYWORD_RE.test(t) && CODE_TAIL_RE.test(t)) return true;\n if (ASSIGN_RE.test(t)) return true;\n return allowCall && CALL_RE.test(t);\n}\n\nfunction hasPseudocode(text: string): boolean {\n return PSEUDOCODE_RE.test(text);\n}\n\n/** An explanatory item of a numbered/bulleted walkthrough. */\nfunction isEnumeratedProseItem(text: string): boolean {\n const t = text.trim();\n return ENUMERATED_ITEM_RE.test(t) && t.split(/\\s+/).length >= ENUMERATED_ITEM_MIN_WORDS;\n}\n\n// A prose lead-in preceding a code-shaped line marks that line as an\n// illustration (`// For example:`, a grammar production `FunctionExpression:`),\n// not commented-out code.\nfunction isProse(text: string): boolean {\n const t = text.trim();\n if (!t) return false;\n if (t.endsWith(\":\")) return true;\n if (\n /[.!?]$/.test(t) &&\n /\\s/.test(t) &&\n /[a-z]/.test(t) &&\n !looksLikeCode(t) &&\n t.split(/\\s+/).length >= 3\n ) {\n return true;\n }\n return false;\n}\n\nconst JUSTIFICATION_RE =\n /\\b(?:because|since|until|due to|so that|so we|so it|so the|otherwise|which is why|in order to|to avoid|to work around|to prevent|backwards? compat(?:ibility)?|for compatibility)\\b/i;\n\n/**\n * The same total-corroboration test as `restatesStatementHead`, widened from the\n * statement's HEAD to the whole statement.\n *\n * `restatesStatementHead` reads only the text before the first `(` — it wants\n * the comment to restate what the statement *computes*, not what it passes as an\n * argument. Flattening every `(` to whitespace hands that function the whole\n * statement as its own head; the tokeniser reads identifiers, so the\n * substitution changes nothing else. Reusing it rather than copying it keeps one\n * definition of \"restates\".\n */\nfunction restatesWholeStatement(body: string, statement: string | null): boolean {\n return statement !== null && restatesStatementHead(body, statement.replaceAll(\"(\", \" \"));\n}\n\n/**\n * Whether a single-line comment merely narrates the code rather than explaining\n * the *why*. Three deterministic shapes: step narration (\"First, …\"), self-\n * admitted meta-commentary (\"keeping it simple\"), and a restatement of the very\n * next line (`// increment the counter` above `counter += 1`).\n */\nfunction isRedundantNarration(\n body: string,\n statementBelow: string | null,\n standalone: boolean,\n isolatedEnumeration: boolean,\n nested: boolean,\n): boolean {\n const t = body.trim();\n if (!t || looksLikeCode(t) || hasPseudocode(t)) return false;\n if (standalone) {\n const justified = JUSTIFICATION_RE.test(t);\n if (STEP_NARRATION_RE.test(t) && !justified) return true;\n if (META_COMMENTARY_RE.test(t) && !justified) return true;\n if (isBareDeferral(t) && !justified) return true;\n if (HELPER_OPENER_RE.test(t) || LETS_RE.test(t)) return true;\n\n const words = t.split(/\\s+/);\n if (words.length > 1 && words.length <= 4 && DUMMY_TRANSLATION_RE.test(t) && !/[():=]/.test(t)) {\n const lowerT = t.toLowerCase();\n const rationaleWords = [\"when\", \"because\", \"if\", \"so that\", \"due to\", \"for\", \"instead of\", \"to prevent\", \"to avoid\", \"only\"];\n if (!rationaleWords.some((w) => lowerT.includes(w)) && restatesWholeStatement(t, statementBelow)) {\n return true;\n }\n }\n\n if (!nested && isSectionLabel(t)) return true;\n if (isolatedEnumeration && ENUMERATION_RE.test(t)) return true;\n }\n return restatesStatementHead(t, statementBelow);\n}\n\n// Statement-position containers. A comment whose innermost enclosing node is\n// anything else sits INSIDE an expression — an array, an object literal, a call\n// argument list — where a one-word label groups the elements beneath it rather\n// than signposting the file. `# config` inside pydantic's `__all__` is the\n// Python twin of this; both readings produce the same comment and only the\n// nesting tells them apart.\nconst STATEMENT_CONTAINERS: ReadonlySet<string> = new Set([\n AST_NODE_TYPES.Program,\n AST_NODE_TYPES.BlockStatement,\n AST_NODE_TYPES.ClassBody,\n AST_NODE_TYPES.StaticBlock,\n AST_NODE_TYPES.SwitchCase,\n AST_NODE_TYPES.TSModuleBlock,\n AST_NODE_TYPES.TSInterfaceBody,\n]);\n\n/**\n * Containers whose only legal children are TYPE MEMBERS. A call-shaped comment\n * here cannot be commented-out code, because the statement it looks like would\n * not have parsed in that position — it is a label naming the overload or\n * property beneath it.\n *\n * `TSModuleBlock` is deliberately absent even though a comment there is also\n * \"inside a type-ish container\": `namespace N { drop(); }` is legal, so a\n * call-shaped comment there CAN be commented-out code, and this rule already\n * treats a module block as a statement position (see `STATEMENT_CONTAINERS`).\n *\n * Recall cost ~zero: a commented-out interface MEMBER (`// name: string;`) never\n * matched the call branch anyway — the `: T;` tail defeats it — and the\n * assignment and keyword branches are untouched, so `// const a = 1;` inside a\n * type literal still fires.\n */\nconst TYPE_MEMBER_CONTAINERS: ReadonlySet<string> = new Set([\n AST_NODE_TYPES.TSInterfaceBody,\n AST_NODE_TYPES.TSTypeLiteral,\n]);\n\n/**\n * True when the comment at `index` belongs to a contiguous `//` run in which\n * some line cites a ticket, URL, RFC or issue number (protected-class signal\n * S1, applied at run granularity).\n *\n * Run granularity, not line: a scoping note puts its owner at the end, so\n * judging the last line alone reads \"for now\" as an unowned admission.\n */\nfunction runCitesAReference(comments: readonly TSESTree.Comment[], index: number): boolean {\n for (let i = index; i >= 0; i--) {\n if (i < index && !areAdjacentLineComments(comments[i], comments[i + 1])) break;\n if (hasExternalReference(stripCommentMarker(comments[i]?.value ?? \"\"))) return true;\n }\n for (let i = index + 1; i < comments.length; i++) {\n if (!areAdjacentLineComments(comments[i - 1], comments[i])) break;\n if (hasExternalReference(stripCommentMarker(comments[i]?.value ?? \"\"))) return true;\n }\n return false;\n}\n\n/** True when `a` and `b` are `//` comments on consecutive lines. */\nfunction areAdjacentLineComments(\n a: TSESTree.Comment | undefined,\n b: TSESTree.Comment | undefined,\n): boolean {\n return (\n a !== undefined &&\n b !== undefined &&\n a.type === \"Line\" &&\n b.type === \"Line\" &&\n b.loc.start.line === a.loc.end.line + 1\n );\n}\n\n/**\n * True when the comment at `index` is one line of a contiguous `//` block rather\n * than a lone annotation.\n */\nfunction isInsideCommentRun(comments: readonly TSESTree.Comment[], index: number): boolean {\n const comment = comments[index];\n return (\n areAdjacentLineComments(comments[index - 1], comment) ||\n areAdjacentLineComments(comment, comments[index + 1])\n );\n}\n\n/** How far back the illustration lead-in scan walks within one `//` block. */\nconst LEAD_IN_SCAN_LIMIT = 24;\n\nfunction hasIllustrationLeadInAbove(\n comments: readonly TSESTree.Comment[],\n index: number,\n): boolean {\n for (let i = index - 1; i >= 0 && index - i <= LEAD_IN_SCAN_LIMIT; i--) {\n if (!areAdjacentLineComments(comments[i], comments[i + 1])) return false;\n const body = stripCommentMarker(comments[i]?.value ?? \"\");\n if (body.length > 0 && body.endsWith(\":\")) return true;\n }\n return false;\n}\n\nfunction hasCommentedOutCode(\n texts: readonly string[],\n precedingProse: boolean,\n allowCall: boolean,\n): boolean {\n for (let i = 0; i < texts.length; i++) {\n const line = texts[i];\n if (line === undefined || !looksLikeCode(line, allowCall) || hasPseudocode(line)) {\n continue;\n }\n const prev = i > 0 ? texts[i - 1] : undefined;\n if (prev !== undefined ? isProse(prev) : precedingProse) continue;\n return true;\n }\n return false;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-comment-cruft\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Flag commented-out code, section-banner comments, and leading file-header comment preambles.\",\n },\n schema: [],\n messages: {\n commentedOutCode:\n \"Commented-out code — delete it; git history remembers.\",\n sectionBanner:\n \"Section-banner / region comment — structure code with functions, not ASCII rules.\",\n fileHeaderPreamble:\n \"File-header comment preamble — use a brief doc comment for the why, not a block of `//` lines.\",\n redundantNarration:\n \"Comment narrates the code — delete it or say *why*, not *what*. Code is self-documenting.\",\n untrackedTodo:\n \"Untracked TODO/FIXME marker — add an issue ticket or context link.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (isGeneratedFile(context.filename, context.sourceCode.text)) {\n return {};\n }\n\n const sourceCode = context.sourceCode;\n\n function isStandalone(comment: TSESTree.Comment): boolean {\n const before = sourceCode.getTokenBefore(comment, {\n includeComments: false,\n });\n return !before || before.loc.end.line < comment.loc.start.line;\n }\n\n function isJsDoc(comment: TSESTree.Comment): boolean {\n return comment.type === \"Block\" && /^\\*/.test(comment.value);\n }\n\n function reportLeadingPreamble(\n comments: readonly TSESTree.Comment[],\n firstCodeLine: number,\n ): void {\n const leading: TSESTree.Comment[] = [];\n let prevLine: number | null = null;\n for (const comment of comments) {\n if (comment.type !== \"Line\") break;\n if (comment.loc.start.line >= firstCodeLine) break;\n if (!isStandalone(comment)) break;\n const body = stripCommentMarker(comment.value);\n if (isDirective(body) || body.startsWith(\"!\")) continue;\n if (prevLine !== null && comment.loc.start.line !== prevLine + 1) break;\n leading.push(comment);\n prevLine = comment.loc.start.line;\n }\n const first = leading[0];\n if (first === undefined || leading.length < LEADING_PREAMBLE_MIN) return;\n const bodies = leading.map((c) => stripCommentMarker(c.value));\n if (bodies.some((body) => LICENSE_RE.test(body))) return;\n // A preamble carrying at least one prose sentence is documentation — the\n // \"why\" the rule wants — regardless of which comment syntax carries it.\n if (bodies.some((body) => isProse(body))) return;\n if (bodies.filter(isEnumeratedProseItem).length >= ENUMERATED_PREAMBLE_MIN_ITEMS) {\n return;\n }\n context.report({ node: first, messageId: \"fileHeaderPreamble\" });\n }\n\n return {\n Program(): void {\n const comments = sourceCode.getAllComments();\n const firstCodeLine =\n sourceCode.ast.tokens[0]?.loc.start.line ?? Number.MAX_SAFE_INTEGER;\n const enumerated = comments.filter(\n (c) => c.type === \"Line\" && ENUMERATION_RE.test(stripCommentMarker(c.value)),\n );\n\n for (let i = 0; i < comments.length; i++) {\n const comment = comments[i];\n if (comment === undefined) continue;\n if (isJsDoc(comment) || !isStandalone(comment)) continue;\n if (LICENSE_RE.test(comment.value)) continue;\n const texts = comment.value\n .split(\"\\n\")\n .map(stripCommentMarker)\n .filter((l) => l.length > 0 && !isDirective(l));\n\n const firstText = texts[0];\n if (firstText !== undefined && /^(?:todo|fixme)\\b/i.test(firstText)) {\n if (!runCitesAReference(comments, i)) {\n context.report({\n node: comment,\n messageId: \"untrackedTodo\",\n });\n }\n continue;\n }\n\n if (texts.some(isBanner)) {\n context.report({ node: comment, messageId: \"sectionBanner\" });\n continue;\n }\n const prev = comments[i - 1];\n const precedingProse =\n prev !== undefined &&\n prev.type === \"Line\" &&\n prev.loc.end.line === comment.loc.start.line - 1 &&\n isProse(stripCommentMarker(prev.value));\n const container = sourceCode.getNodeByRangeIndex(comment.range[0]);\n const inTypeMembers = container !== null && TYPE_MEMBER_CONTAINERS.has(container.type);\n if (\n hasCommentedOutCode(texts, precedingProse, !inTypeMembers) &&\n !hasIllustrationLeadInAbove(comments, i)\n ) {\n context.report({ node: comment, messageId: \"commentedOutCode\" });\n continue;\n }\n // Narration only for single-line comments (a multi-line block is\n // usually a real doc).\n if (comment.type === \"Line\" && texts.length === 1) {\n const body = texts[0];\n const statement = restatableStatementBelow(comment, sourceCode);\n const standalone = !isInsideCommentRun(comments, i);\n const nested = container !== null && !STATEMENT_CONTAINERS.has(container.type);\n if (\n body !== undefined &&\n !runCitesAReference(comments, i) &&\n isRedundantNarration(body, statement, standalone, enumerated.length === 1, nested)\n ) {\n context.report({ node: comment, messageId: \"redundantNarration\" });\n }\n }\n }\n\n reportLeadingPreamble(comments, firstCodeLine);\n },\n };\n },\n});\n","/**\n * @fileoverview _comments — shared comment analysis for the comment-hygiene rules, kept signal-for-signal identical to Python's `_comments.py`.\n *\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/_comments.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\n// S1 — external reference: URL, ticket key, RFC/PEP/CVE, bare issue number, or\n// an email/handle domain. Ticket keys allow letters after the first digit\n// (`PLATFORM-1YC`) and exclude the encoding acronyms sharing the shape.\nconst REF_RE =\n /https?:\\/\\/|\\bRFC[- ]?\\d+|\\bPEP[- ]?\\d+|\\bCVE-\\d{4}|\\b(?!UTF-|SHA-|ISO-|AES-|CRC-|MD-|PCM-|EOF-|API-|BASE-)[A-Z][A-Z0-9]{1,9}-\\d[A-Z0-9]{0,5}\\b|(?<![&\\w])#\\d{2,6}\\b|@[a-z][\\w.-]*\\.(?:us|com|ai|io|net|org|dev)\\b/;\n\n// S2 — version pin or comparison.\nconst VERSION_RE =\n /(?:>=|<=|==|<|>)\\s*v?\\d+\\.\\d+|\\bv\\d+\\.\\d+|\\b(?:since|until|as of)\\s+(?:v?\\d+\\.\\d+|Python\\s*\\d)/i;\n\n// S3 — a number carrying a unit, or an HTTP status code.\nconst UNITS_RE =\n /[~<>]?\\d+(?:\\.\\d+)?\\s?(?:ms|s\\b|sec\\b|seconds?\\b|min\\b|minutes?\\b|hours?\\b|days?\\b|KB|MB|MiB|GiB|kHz|Hz|bytes?\\b|bit\\b|-bit\\b|%|px\\b|rps\\b|qps\\b)|\\b[1-5]xx\\b|\\b(?:301|302|304|307|308|400|401|403|404|405|409|410|412|422|425|429|500|501|502|503|504)\\b/;\n\n// S4 — a causal connective tying behaviour to a consequence.\nconst CAUSAL_RE =\n /\\b(?:because|otherwise|so that|or else|would (?:break|fail|race|deadlock|leak|clobber|loop|crash|page|stall)|breaks?\\b|so we don'?t|to avoid\\b|caused\\b|causes\\b|gets? clobbered|keeps? (?:us|it|them) from|doesn'?t\\b.{0,24}\\b(?:page|fire|break|leak|loop)|eat into|would otherwise|trade-?offs?\\b)\\b/i;\n\n// S5 — negation of the obvious, or a flagged deliberate deviation.\nconst NEGATION_RE =\n /\\b(?:must not|must never|do(?:es)? not\\b|don'?t\\b.{0,30}\\b(?:leak|log|cache|retry|block|steal|wipe)|never\\b|deliberately|intentionally|counterintuitiv|NOT\\b)|(?<!based )\\bon purpose\\b|\\(not\\s|\\binstead of\\b|\\brather than\\b/;\n\n// S6 — upstream/vendor quirk, workaround provenance, or an external contract.\nconst UPSTREAM_RE =\n /\\b(?:upstream|workaround|quirk|backport|vendored|regression|fixed upstream|requires?\\b|convention\\b|rate.?limit|deprecat|opts? in(?:to)?\\b|raises?\\b.{0,60}\\b(?:when|if|unless)\\b)/i;\n\n// S7 — concurrency, ordering, or invariant vocabulary.\nconst INVARIANT_RE =\n /\\b(?:invariant|idempotent|race\\b|deadlock|re-?entran|atomic|thread-?safe|signal-?safe|lexicographic(?:al(?:ly)?)?|monotonic|must (?:run|be|happen|come|stay|hit|converge|configure)|before any\\b|lost the (?:claim )?race)\\b/i;\n\n// S8 — security reasoning.\nconst SECURITY_RE =\n /\\b(?:timing attack|constant-?time|replay|PII\\b|redact|secret|injection|spoof|fail-?closed|fail-?open|auth bypass|early-?exit timing)\\b/i;\n\nconst VENDOR_RE =\n /\\b(?:GitHub|Slack|Twilio|LiveKit|Kamailio|Groq|OpenAI|Anthropic|Cloudflare|FastAPI|Starlette|Sentry|Zoho|Salla|Ashby|Linear|BigQuery|Postgres|Neon|Drizzle|Vertex|Gemini|Firestore|Stripe|Next\\.js|React Compiler|pydantic|ruff|loguru|Lexical|Farasa|Orpheus|Whisper|schemathesis)(?:'s\\b|\\s+(?:requires?|returns?|expects?|allows?|rejects?|accepts?|sends?|caps?|limits?|wraps?|silently|outputs?|stores?|treats?|doesn'?t|does not|won'?t|can'?t|only|models)\\b)/;\n\nconst PROTECTED_SIGNALS: readonly RegExp[] = [\n REF_RE,\n VERSION_RE,\n UNITS_RE,\n CAUSAL_RE,\n NEGATION_RE,\n UPSTREAM_RE,\n INVARIANT_RE,\n SECURITY_RE,\n VENDOR_RE,\n];\n\n/**\n * True when a comment carries any of the nine protected-class signals.\n *\n * EXEMPTION FLOOR ONLY — a false result is not evidence the comment is worthless.\n */\nexport function isProtected(body: string): boolean {\n return PROTECTED_SIGNALS.some((signal) => signal.test(body));\n}\n\n/**\n * True when a comment cites a ticket, URL, RFC/PEP/CVE or issue number (signal\n * S1 alone). Naming where a decision is recorded is the one thing code cannot\n * do, and it separates an owned scoping note from an unowned admission.\n */\nexport function hasExternalReference(body: string): boolean {\n return REF_RE.test(body);\n}\n\n// --- tokenisation shared by the restatement detectors ----------------------\n\n/**\n * Words that say nothing about *which* code a comment describes. Kept in step\n * with `_comments.py`: shrinking the list costs recall, growing it costs\n * precision by discounting a genuinely novel word.\n */\nexport const STOPWORDS: ReadonlySet<string> = new Set(\n `a an the this that these those it its their his her our your my\n is are was were be been being am do does did done doing has have had having\n will would shall should can could may might must\n and or but nor so yet not no none\n to of for in on at by with from into onto out up down over under about\n as if then than when where which who whom whose what how why while\n we you they i he she them him us me\n also just only even still already again there here\n all any each every some\n via per etc eg ie vs\n need needs needed want wants make makes making let lets\n please note see above below`.split(/\\s+/),\n);\n\nconst CAMEL_PART_RE = /[A-Z]+(?=[A-Z][a-z])|[A-Z]?[a-z]+|[A-Z]+|\\d+/g;\nconst WORD_RE = /[A-Za-z_$][\\w$]*|\\d+/g;\n\n/** Split `snake_case` / `camelCase` / `SCREAMING_CASE` into lowercase parts. */\nexport function splitIdentifier(token: string): string[] {\n const parts: string[] = [];\n for (const chunk of token.split(/[_$]/)) {\n for (const match of chunk.match(CAMEL_PART_RE) ?? []) {\n parts.push(match.toLowerCase());\n }\n }\n return parts;\n}\n\n/**\n * Fold the common English inflections so `updates` / `updating` match `update`.\n *\n * The trailing-`e` strip is what makes the fold *symmetric*: without it\n * `creates` / `creating` reduce to `creat` while `create` stays `create`, and\n * the two never match — the shape that most often made a restatement look\n * novel. Deliberately crude otherwise; every extra conflation is a chance to\n * call a novel word a restatement.\n */\nexport function stem(word: string): string {\n let base = word;\n for (const suffix of [\"ing\", \"ied\", \"ies\", \"ers\", \"er\", \"ed\", \"es\", \"s\"]) {\n if (word.endsWith(suffix) && word.length - suffix.length >= 3) {\n base = word.slice(0, word.length - suffix.length);\n if (suffix === \"ied\" || suffix === \"ies\") return `${base}y`;\n break;\n }\n }\n return base.endsWith(\"e\") && base.length - 1 >= 3 ? base.slice(0, -1) : base;\n}\n\n/** Split prose into lowercase content words, dropping stopwords. */\nexport function contentTokens(text: string): string[] {\n const tokens: string[] = [];\n for (const match of text.match(WORD_RE) ?? []) {\n tokens.push(...splitIdentifier(match));\n }\n return tokens.filter((token) => !STOPWORDS.has(token));\n}\n\n/** Every identifier part appearing in a slice of source. */\nexport function codeTokens(text: string): Set<string> {\n const tokens = new Set<string>();\n for (const match of text.match(WORD_RE) ?? []) {\n for (const part of splitIdentifier(match)) tokens.add(part);\n }\n return tokens;\n}\n\n/** True when every content token of a comment already appears in the code. */\nexport function restates(commentTokens: readonly string[], code: ReadonlySet<string>): boolean {\n const stems = new Set<string>();\n for (const token of code) stems.add(stem(token));\n return commentTokens.every((token) => code.has(token) || stems.has(stem(token)));\n}\n\n// --- the verb-opener restatement shape (shared with `no-comment-cruft`) ------\n\nconst NARRATION_MAX_WORDS = 6;\nconst NARRATION_MIN_CONTENT = 1;\nconst TOKEN_PLURAL_MIN = 4;\n\n// Statements that compute something a comment could be restating. A block, a\n// class/function/type declaration, an `if`, a `for` — anything whose body the\n// comment could be labelling instead — is deliberately absent.\nconst RESTATABLE_STATEMENTS: ReadonlySet<string> = new Set([\n AST_NODE_TYPES.ExpressionStatement,\n AST_NODE_TYPES.ReturnStatement,\n AST_NODE_TYPES.ThrowStatement,\n AST_NODE_TYPES.VariableDeclaration,\n]);\n\n// Verbs that describe the mechanics of the next statement. A comment opening\n// with anything else (a noun, \"because\", \"we\", a ticket id) is not narration.\nconst NARRATION_VERB_RE =\n /^(?:add|append|assign|build|calculate|call|check|clear|close|compute|convert|copy|count|create|declare|decrement|define|delete|extract|fetch|filter|find|format|generate|get|handle|increment|init|initialise|initialize|insert|iterate|join|load|log|loop|make|map|merge|open|parse|print|process|push|read|remove|render|reset|return|save|send|set|setup|sort|split|start|stop|store|update|validate|wrap|write)(?:s|es|d|ed|ing)?$/i;\n\n// Words that carry no information about *which* code the comment describes, so\n// they are not required to appear in the line below.\nconst NARRATION_STOPWORDS: ReadonlySet<string> = new Set([\n \"a\", \"all\", \"an\", \"and\", \"any\", \"are\", \"as\", \"at\", \"back\", \"be\", \"both\", \"by\",\n \"each\", \"for\", \"from\", \"here\", \"if\", \"in\", \"into\", \"is\", \"it\", \"its\", \"just\",\n \"new\", \"of\", \"on\", \"one\", \"onto\", \"or\", \"our\", \"out\", \"over\", \"so\", \"that\",\n \"the\", \"then\", \"this\", \"to\", \"up\", \"us\", \"we\", \"when\", \"with\",\n]);\n\n/** Lowercase, with a single plural `s` folded away so `users` matches `user`. */\nexport function normalizeToken(word: string): string {\n const lower = word.toLowerCase();\n return lower.length > TOKEN_PLURAL_MIN && lower.endsWith(\"s\") && !lower.endsWith(\"ss\")\n ? lower.slice(0, -1)\n : lower;\n}\n\n/** Every identifier in a slice of source, plus its parts, with plurals folded. */\nfunction headTokens(source: string): ReadonlySet<string> {\n const tokens = new Set<string>();\n for (const identifier of source.match(/[A-Za-z_$][\\w$]*/g) ?? []) {\n tokens.add(normalizeToken(identifier));\n for (const part of identifier.split(/[_$]+|(?<=[a-z0-9])(?=[A-Z])/)) {\n if (part.length > 0) tokens.add(normalizeToken(part));\n }\n }\n return tokens;\n}\n\n/** The slice of ESLint's `SourceCode` these shapes read. */\nexport interface StatementReader {\n getTokenAfter: (\n node: TSESTree.Comment,\n options: { includeComments: boolean },\n ) => TSESTree.Token | null;\n getNodeByRangeIndex: (index: number) => TSESTree.Node | null;\n getText: (node: TSESTree.Node) => string;\n}\n\n/** A declaration with nothing but a zero/empty seed computes nothing to restate. */\nfunction isTrivialInitializer(node: TSESTree.VariableDeclaration): boolean {\n return node.declarations.every((declarator) => {\n const init = declarator.init;\n if (init == null || init.type === AST_NODE_TYPES.Literal) return true;\n return (\n (init.type === AST_NODE_TYPES.ArrayExpression && init.elements.length === 0) ||\n (init.type === AST_NODE_TYPES.ObjectExpression && init.properties.length === 0)\n );\n });\n}\n\n/**\n * The source of the single-line statement a comment sits directly above, or null\n * when what follows is a block, a declaration, a type member or anything else\n * the comment could be *labelling* rather than restating.\n */\nexport function restatableStatementBelow(comment: TSESTree.Comment, sourceCode: StatementReader): string | null {\n const token = sourceCode.getTokenAfter(comment, { includeComments: false });\n if (token === null || token.loc.start.line !== comment.loc.end.line + 1) return null;\n for (\n let node: TSESTree.Node | undefined | null = sourceCode.getNodeByRangeIndex(token.range[0]);\n node != null && node.type !== AST_NODE_TYPES.Program;\n node = node.parent\n ) {\n if (!RESTATABLE_STATEMENTS.has(node.type)) continue;\n if (node.loc.start.line !== token.loc.start.line || node.loc.end.line !== node.loc.start.line) {\n return null;\n }\n if (node.type === AST_NODE_TYPES.VariableDeclaration && isTrivialInitializer(node)) {\n return null;\n }\n return sourceCode.getText(node);\n }\n return null;\n}\n\n/**\n * True when a short verb-led comment adds nothing to the statement beneath it:\n * every content word after the opening verb already appears in that statement's\n * head — its assignment target or its callee.\n *\n * Corroboration is TOTAL: one unmatched word means the comment carries\n * something the code does not, so it stays. Only the head counts — everything\n * up to the first `(` — so the comment must restate what the statement\n * *computes*, not something it merely passes as an argument.\n */\nexport function restatesStatementHead(body: string, statement: string | null): boolean {\n if (statement === null) return false;\n const words = body.match(/[A-Za-z][\\w$]*/g) ?? [];\n const opener = words[0];\n if (opener === undefined || words.length > NARRATION_MAX_WORDS) return false;\n if (!NARRATION_VERB_RE.test(opener)) return false;\n const content = words\n .slice(1)\n .map(normalizeToken)\n .filter((word) => !NARRATION_STOPWORDS.has(word));\n if (content.length < NARRATION_MIN_CONTENT) return false;\n const head = statement.split(\"(\")[0] ?? statement;\n const code = headTokens(head);\n return content.every((word) => code.has(word));\n}\n","/**\n * @fileoverview no-conditional-in-test — a conditional in a test body can route around the assertion, so the test passes without asserting.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-conditional-in-test.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-conditional-in-test.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"noConditionalInTest\";\ntype Options = readonly [];\n\nconst TEST_CALLERS: ReadonlySet<string> = new Set([\"it\", \"test\"]);\n\n/**\n * Lifecycle hooks reached through the test object — `test.beforeEach(…)`,\n * `test.afterAll(…)`. `testCallerName` walks a member chain down to its ROOT\n * identifier, so these resolved to `test` and their callbacks were linted as\n * test bodies, contradicting the documented \"conditionals in `beforeEach` /\n * `beforeAll` are deliberately NOT reported\". Teardown is conditional by\n * nature, and there is no assertion in a teardown to hide.\n */\nconst HOOK_MEMBERS: ReadonlySet<string> = new Set([\n \"afterAll\",\n \"afterEach\",\n \"beforeAll\",\n \"beforeEach\",\n]);\n\nconst FUNCTION_TYPES: ReadonlySet<AST_NODE_TYPES> = new Set([\n AST_NODE_TYPES.FunctionDeclaration,\n AST_NODE_TYPES.FunctionExpression,\n AST_NODE_TYPES.ArrowFunctionExpression,\n]);\n\n/** Roots of assertion calls: `expect(x)`, `assert.ok(x)`, `expectTypeOf<T>()`. */\nconst ASSERTION_ROOTS: ReadonlySet<string> = new Set([\n \"expect\",\n \"expectTypeOf\",\n \"assert\",\n \"assertType\",\n]);\n\n/** Assertions that exist only in the type system and are erased at run time. */\nconst TYPE_ASSERTION_ROOTS: ReadonlySet<string> = new Set([\n \"expectTypeOf\",\n \"assertType\",\n]);\n\n/** The nearest enclosing function of `node`. */\nfunction nearestEnclosingFunction(node: TSESTree.Node): TSESTree.Node | null {\n for (let current = node.parent; current != null; current = current.parent) {\n if (FUNCTION_TYPES.has(current.type)) {\n return current;\n }\n }\n return null;\n}\n\n/** The base callee name of a call, unwrapping `.only` / `.skip` / `.each` chains. */\nfunction testCallerName(callee: TSESTree.Node): string | null {\n if (callee.type === AST_NODE_TYPES.Identifier) {\n return callee.name;\n }\n if (callee.type === AST_NODE_TYPES.MemberExpression) {\n return testCallerName(callee.object);\n }\n if (callee.type === AST_NODE_TYPES.CallExpression) {\n return testCallerName(callee.callee);\n }\n if (callee.type === AST_NODE_TYPES.TaggedTemplateExpression) {\n return testCallerName(callee.tag);\n }\n return null;\n}\n\n/** True when `fn` is the callback argument of an `it` or `test` call. */\nfunction isTestBody(fn: TSESTree.Node): boolean {\n const call = fn.parent;\n if (\n call?.type !== AST_NODE_TYPES.CallExpression ||\n !call.arguments.some((argument) => argument === fn)\n ) {\n return false;\n }\n if (\n call.callee.type === AST_NODE_TYPES.MemberExpression &&\n !call.callee.computed &&\n call.callee.property.type === AST_NODE_TYPES.Identifier &&\n HOOK_MEMBERS.has(call.callee.property.name)\n ) {\n return false;\n }\n const name = testCallerName(call.callee);\n return name !== null && TEST_CALLERS.has(name);\n}\n\n/** Walk `node`'s subtree until `predicate` matches. */\nfunction subtreeMatches(\n node: TSESTree.Node,\n predicate: (current: TSESTree.Node) => boolean,\n descendIntoFunctions = true,\n): boolean {\n let found = false;\n const visit = (current: TSESTree.Node): void => {\n if (found) {\n return;\n }\n if (predicate(current)) {\n found = true;\n return;\n }\n for (const key of Object.keys(current)) {\n if (key === \"parent\") {\n continue;\n }\n if (\n !descendIntoFunctions &&\n FUNCTION_TYPES.has(current.type) &&\n key === \"body\"\n ) {\n continue;\n }\n const value = (current as unknown as Record<string, unknown>)[key];\n if (Array.isArray(value)) {\n for (const child of value) {\n if (\n typeof child === \"object\" &&\n child !== null &&\n typeof (child as { type?: unknown }).type === \"string\"\n ) {\n visit(child as TSESTree.Node);\n }\n }\n } else if (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { type?: unknown }).type === \"string\"\n ) {\n visit(value as TSESTree.Node);\n }\n if (found) {\n return;\n }\n }\n };\n visit(node);\n return found;\n}\n\n/** The leftmost identifier a reference chain is rooted at: `!r.a.b` -> `r`. */\nfunction rootIdentifier(node: TSESTree.Node): string | null {\n switch (node.type) {\n case AST_NODE_TYPES.Identifier:\n return node.name;\n case AST_NODE_TYPES.MemberExpression:\n return rootIdentifier(node.object);\n case AST_NODE_TYPES.UnaryExpression:\n return rootIdentifier(node.argument);\n case AST_NODE_TYPES.AwaitExpression:\n return rootIdentifier(node.argument);\n case AST_NODE_TYPES.ChainExpression:\n case AST_NODE_TYPES.TSNonNullExpression:\n case AST_NODE_TYPES.TSAsExpression:\n return rootIdentifier(node.expression);\n case AST_NODE_TYPES.BinaryExpression:\n case AST_NODE_TYPES.LogicalExpression:\n return rootIdentifier(node.left);\n case AST_NODE_TYPES.CallExpression:\n return rootIdentifier(node.callee);\n default:\n return null;\n }\n}\n\n/** The identifier a call is rooted at: `expect(x).not.toBe(y)` -> `expect`. */\nfunction calleeRootName(call: TSESTree.CallExpression): string | null {\n let current: TSESTree.Node = call.callee;\n for (;;) {\n if (current.type === AST_NODE_TYPES.Identifier) {\n return current.name;\n }\n if (current.type === AST_NODE_TYPES.MemberExpression) {\n current = current.object;\n continue;\n }\n if (current.type === AST_NODE_TYPES.CallExpression) {\n current = current.callee;\n continue;\n }\n if (\n current.type === AST_NODE_TYPES.ChainExpression ||\n current.type === AST_NODE_TYPES.TSNonNullExpression\n ) {\n current = current.expression;\n continue;\n }\n return null;\n }\n}\n\nconst isAssertionCall = (node: TSESTree.Node): boolean =>\n node.type === AST_NODE_TYPES.CallExpression &&\n ASSERTION_ROOTS.has(calleeRootName(node) ?? \"\");\n\nconst isTypeAssertionCall = (node: TSESTree.Node): boolean =>\n node.type === AST_NODE_TYPES.CallExpression &&\n TYPE_ASSERTION_ROOTS.has(calleeRootName(node) ?? \"\");\n\nconst containsAssertion = (node: TSESTree.Node): boolean =>\n subtreeMatches(node, isAssertionCall);\n\n/** `test.skip(...)`, `this.skip()`, `ctx.skip()` — an explicit test escape. */\nconst containsSkipCall = (node: TSESTree.Node): boolean =>\n subtreeMatches(\n node,\n (current) =>\n current.type === AST_NODE_TYPES.CallExpression &&\n current.callee.type === AST_NODE_TYPES.MemberExpression &&\n !current.callee.computed &&\n current.callee.property.type === AST_NODE_TYPES.Identifier &&\n current.callee.property.name === \"skip\",\n );\n\n/**\n * `return` / `continue` / `break` in the branch's own scope — the ways a branch\n * can cut the rest of the test short. A `return` inside a nested callback does\n * not leave the test, so the walk stops at function boundaries.\n */\nconst containsEscape = (node: TSESTree.Node): boolean =>\n subtreeMatches(\n node,\n (current) =>\n current.type === AST_NODE_TYPES.ReturnStatement ||\n current.type === AST_NODE_TYPES.ContinueStatement ||\n current.type === AST_NODE_TYPES.BreakStatement,\n false,\n );\n\n/** The statements of a branch, whether or not it is wrapped in a block. */\nfunction branchStatements(\n branch: TSESTree.Statement,\n): readonly TSESTree.Statement[] {\n return branch.type === AST_NODE_TYPES.BlockStatement ? branch.body : [branch];\n}\n\n/** The statement immediately before `node` among its siblings, if any. */\nfunction previousSibling(node: TSESTree.Statement): TSESTree.Node | null {\n const parent = node.parent;\n let siblings: readonly TSESTree.Node[] | null = null;\n if (\n parent.type === AST_NODE_TYPES.BlockStatement ||\n parent.type === AST_NODE_TYPES.Program ||\n parent.type === AST_NODE_TYPES.StaticBlock\n ) {\n siblings = parent.body;\n } else if (parent.type === AST_NODE_TYPES.SwitchCase) {\n siblings = parent.consequent;\n }\n if (siblings === null) {\n return null;\n }\n const index = siblings.indexOf(node);\n return index > 0 ? (siblings[index - 1] ?? null) : null;\n}\n\n/**\n * Guard 1 — a narrowing `if` pinned by the assertion directly above it. The\n * preceding statement must assert on the same value the `if` narrows, so the\n * branch's direction is already established by a check that can fail.\n */\nfunction isPinnedNarrowingGuard(node: TSESTree.IfStatement): boolean {\n const testRoot = rootIdentifier(node.test);\n if (testRoot === null) {\n return false;\n }\n const previous = previousSibling(node);\n if (previous === null || previous.type !== AST_NODE_TYPES.ExpressionStatement) {\n return false;\n }\n let matched = false;\n subtreeMatches(previous, (current) => {\n if (\n current.type !== AST_NODE_TYPES.CallExpression ||\n current.callee.type !== AST_NODE_TYPES.Identifier ||\n current.callee.name !== \"expect\"\n ) {\n return false;\n }\n const subject = current.arguments[0];\n if (subject === undefined) {\n return false;\n }\n if (rootIdentifier(subject) === testRoot) {\n matched = true;\n return true;\n }\n return false;\n });\n return matched;\n}\n\n/** Guard 2 — the branch is an assertion spelled as a throw; the test stops here. */\nfunction isThrowingGuard(node: TSESTree.IfStatement): boolean {\n if (node.alternate !== null) {\n return false;\n }\n const statements = branchStatements(node.consequent);\n return (\n statements.length === 1 &&\n statements[0]?.type === AST_NODE_TYPES.ThrowStatement\n );\n}\n\n/** Every statement in `branch` is a bare type-level assertion call. */\nfunction isTypeAssertionBranch(branch: TSESTree.Statement): boolean {\n const statements = branchStatements(branch);\n return (\n statements.length > 0 &&\n statements.every(\n (statement) =>\n statement.type === AST_NODE_TYPES.ExpressionStatement &&\n isTypeAssertionCall(statement.expression),\n )\n );\n}\n\n/** Guard 4 — narrowing around assertions that are erased at run time. */\nfunction isTypeLevelNarrowing(node: TSESTree.IfStatement): boolean {\n return (\n isTypeAssertionBranch(node.consequent) &&\n (node.alternate === null || isTypeAssertionBranch(node.alternate))\n );\n}\n\n/** A branch that asserts nothing and cannot cut the test short. */\nconst isInertBranch = (branch: TSESTree.Statement): boolean =>\n !containsAssertion(branch) &&\n !containsEscape(branch) &&\n !containsSkipCall(branch);\n\n/**\n * Does the branch only REWRITE state — assign, update, delete, declare?\n *\n * Guard 5 is named \"state normalization\", and \"no assertion and no escape\" is a\n * strictly weaker test than that name implies: a branch full of ACTIONS asserts\n * nothing and escapes nothing either, and it is precisely the branch that makes\n * one test take two paths through the UI.\n */\nfunction isNormalizationStatement(statement: TSESTree.Statement): boolean {\n if (statement.type === AST_NODE_TYPES.VariableDeclaration) {\n return true;\n }\n if (statement.type === AST_NODE_TYPES.BlockStatement) {\n return statement.body.every(isNormalizationStatement);\n }\n if (statement.type !== AST_NODE_TYPES.ExpressionStatement) {\n return false;\n }\n const { expression } = statement;\n return (\n expression.type === AST_NODE_TYPES.AssignmentExpression ||\n expression.type === AST_NODE_TYPES.UpdateExpression ||\n (expression.type === AST_NODE_TYPES.UnaryExpression &&\n expression.operator === \"delete\")\n );\n}\n\n/**\n * Guard 5 — state normalization. The branch has no assertion to skip, no way\n * out of the test, and does nothing but rewrite state. Deliberately narrow: a\n * branch that returns, breaks, continues, calls `.skip(`, or DOES something is\n * exactly the defect this rule exists for and is NOT exempt.\n */\nfunction isInertNormalization(node: TSESTree.IfStatement): boolean {\n const branches = [node.consequent, node.alternate].filter(\n (branch): branch is TSESTree.Statement => branch !== null,\n );\n return branches.every(\n (branch) => isInertBranch(branch) && isNormalizationStatement(branch),\n );\n}\n\n/**\n * State normalization: a branch with no assertion to skip and no way out of the\n * test cannot hide anything. Deliberately narrow — a branch that returns,\n * breaks, continues or calls `.skip(` is the shape the rule exists for.\n */\nfunction isExemptIfStatement(node: TSESTree.IfStatement): boolean {\n return (\n isPinnedNarrowingGuard(node) ||\n isThrowingGuard(node) ||\n isTypeLevelNarrowing(node) ||\n isInertNormalization(node)\n );\n}\n\n/**\n * Guard 3 — `??` never reports (it is a default, never control flow over an\n * assertion), and `&&` / `||` report only in the shape that can actually skip an\n * assertion: a bare `a && expect(a).toBe(1);` statement.\n */\nfunction isShortCircuitedAssertion(node: TSESTree.LogicalExpression): boolean {\n return (\n node.operator !== \"??\" &&\n node.parent.type === AST_NODE_TYPES.ExpressionStatement &&\n containsAssertion(node.right)\n );\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-conditional-in-test\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow conditional logic (if, switch, ternary) in test bodies, which can hide missing assertions or test multiple code paths.\",\n },\n schema: [],\n messages: {\n noConditionalInTest:\n \"Avoid using conditional logic in tests. It can obscure intent and hide unexecuted assertions. Split the test instead.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (!isTestFile(context.filename)) {\n return {};\n }\n const report = (node: TSESTree.Node): void => {\n const enclosing = nearestEnclosingFunction(node);\n if (enclosing === null || !isTestBody(enclosing)) {\n return;\n }\n context.report({ node, messageId: \"noConditionalInTest\" });\n };\n return {\n IfStatement(node: TSESTree.IfStatement): void {\n if (isExemptIfStatement(node)) {\n return;\n }\n report(node);\n },\n SwitchStatement(node: TSESTree.SwitchStatement): void {\n report(node);\n },\n ConditionalExpression(node: TSESTree.ConditionalExpression): void {\n report(node);\n },\n LogicalExpression(node: TSESTree.LogicalExpression): void {\n if (!isShortCircuitedAssertion(node)) {\n return;\n }\n report(node);\n },\n };\n },\n});\n","/**\n * @fileoverview no-cors-wildcard-with-credentials — `Access-Control-Allow-Origin: *` together with credentials lets any site read authenticated responses.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-cors-wildcard-with-credentials.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-cors-wildcard-with-credentials.md\n */\n\nimport { type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\n\ntype MessageIds = \"corsWildcardWithCredentials\";\ntype Options = readonly [];\n\nconst ACAO_HEADER = \"access-control-allow-origin\";\nconst ACAC_HEADER = \"access-control-allow-credentials\";\nconst HEADER_SET_METHODS = new Set([\"setheader\", \"set\", \"append\"]);\n\n/**\n * True only for the boolean literal `true` (not `1`, not a truthy expression).\n */\nfunction isTrueLiteral(node: TSESTree.Node): boolean {\n return node.type === \"Literal\" && node.value === true;\n}\n\n/**\n * True if `node` is a string literal whose value equals `\"true\"`\n * (case-insensitive), or the boolean literal `true`. Header values are strings,\n * but some frameworks coerce a boolean, so both are accepted.\n */\nfunction isCredentialsTrueValue(node: TSESTree.Node): boolean {\n if (node.type === \"Literal\") {\n if (node.value === true) {\n return true;\n }\n if (typeof node.value === \"string\") {\n return node.value.trim().toLowerCase() === \"true\";\n }\n }\n return false;\n}\n\n/**\n * True if `node` is the string literal `\"*\"`.\n */\nfunction isStarLiteral(node: TSESTree.Node): boolean {\n return node.type === \"Literal\" && node.value === \"*\";\n}\n\n/**\n * True if a `\"*\"` string literal appears anywhere in `node`'s subtree. Walking\n * the whole subtree catches `\"*\"`, `[\"*\"]`, and the `flag ? origins : \"*\"`\n * conditional branch. A dynamic `origin: someVar` has no `\"*\"` literal, so it\n * does not fire.\n */\nfunction subtreeContainsStarLiteral(node: TSESTree.Node): boolean {\n if (isStarLiteral(node)) {\n return true;\n }\n for (const key of Object.keys(node)) {\n if (key === \"parent\" || key === \"loc\" || key === \"range\") {\n continue;\n }\n const value = (node as unknown as Record<string, unknown>)[key];\n if (Array.isArray(value)) {\n for (const child of value) {\n if (isNode(child) && subtreeContainsStarLiteral(child)) {\n return true;\n }\n }\n } else if (isNode(value) && subtreeContainsStarLiteral(value)) {\n return true;\n }\n }\n return false;\n}\n\nfunction isNode(value: unknown): value is TSESTree.Node {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { type?: unknown }).type === \"string\"\n );\n}\n\n/**\n * Returns the (non-computed) string name of a property key, or `undefined`.\n */\nfunction propertyKeyName(prop: TSESTree.Property): string | undefined {\n if (prop.computed) {\n return undefined;\n }\n const key = prop.key;\n if (key.type === \"Identifier\") {\n return key.name;\n }\n if (key.type === \"Literal\" && typeof key.value === \"string\") {\n return key.value;\n }\n return undefined;\n}\n\n/**\n * Extracts the callee's terminal identifier name for a call/new expression\n * (`cors` for `cors(...)` and `app.cors(...)`, `Cors` for `new Cors(...)`).\n */\nfunction calleeName(\n node: TSESTree.CallExpression | TSESTree.NewExpression,\n): string | undefined {\n const callee = node.callee;\n if (callee.type === \"Identifier\") {\n return callee.name;\n }\n if (\n callee.type === \"MemberExpression\" &&\n !callee.computed &&\n callee.property.type === \"Identifier\"\n ) {\n return callee.property.name;\n }\n return undefined;\n}\n\n/**\n * Detects the `cors({ origin: \"*\", credentials: true })` shape. Returns true\n * when the callee is `cors` / `Cors` and the first ObjectExpression argument\n * has `credentials: true` AND an `origin` whose subtree contains `\"*\"`.\n */\nfunction isCorsWildcardCredentialsCall(\n node: TSESTree.CallExpression | TSESTree.NewExpression,\n): boolean {\n const name = calleeName(node);\n if (name === undefined || name.toLowerCase() !== \"cors\") {\n return false;\n }\n const options = node.arguments.find(\n (arg): arg is TSESTree.ObjectExpression => arg.type === \"ObjectExpression\",\n );\n if (options === undefined) {\n return false;\n }\n let hasCredentials = false;\n let hasWildcardOrigin = false;\n for (const prop of options.properties) {\n if (prop.type !== \"Property\") {\n continue;\n }\n const key = propertyKeyName(prop);\n if (key === \"credentials\" && isTrueLiteral(prop.value)) {\n hasCredentials = true;\n } else if (key === \"origin\" && subtreeContainsStarLiteral(prop.value)) {\n hasWildcardOrigin = true;\n }\n }\n return hasCredentials && hasWildcardOrigin;\n}\n\n/**\n * True if the ObjectExpression is a header map setting BOTH\n * `Access-Control-Allow-Origin: \"*\"` and\n * `Access-Control-Allow-Credentials: \"true\"` (case-insensitive keys).\n */\nfunction isWildcardCredentialsHeaderObject(\n node: TSESTree.ObjectExpression,\n): boolean {\n let wildcardOrigin = false;\n let credentialsTrue = false;\n for (const prop of node.properties) {\n if (prop.type !== \"Property\") {\n continue;\n }\n const key = propertyKeyName(prop);\n if (key === undefined) {\n continue;\n }\n const header = key.toLowerCase();\n if (header === ACAO_HEADER && isStarLiteral(prop.value)) {\n wildcardOrigin = true;\n } else if (header === ACAC_HEADER && isCredentialsTrueValue(prop.value)) {\n credentialsTrue = true;\n }\n }\n return wildcardOrigin && credentialsTrue;\n}\n\ntype HeaderSetKind = \"origin\" | \"credentials\";\n\n/**\n * Classifies a `x.setHeader(name, value)` / `x.set(name, value)` /\n * `x.append(name, value)` call as an ACAO-wildcard set, an ACAC-true set, or\n * neither.\n */\nfunction classifyHeaderSetCall(\n node: TSESTree.CallExpression,\n): HeaderSetKind | undefined {\n const callee = node.callee;\n if (\n callee.type !== \"MemberExpression\" ||\n callee.computed ||\n callee.property.type !== \"Identifier\" ||\n !HEADER_SET_METHODS.has(callee.property.name.toLowerCase())\n ) {\n return undefined;\n }\n const [nameArg, valueArg] = node.arguments;\n if (\n nameArg === undefined ||\n valueArg === undefined ||\n nameArg.type !== \"Literal\" ||\n typeof nameArg.value !== \"string\"\n ) {\n return undefined;\n }\n const header = nameArg.value.toLowerCase();\n if (header === ACAO_HEADER && isStarLiteral(valueArg)) {\n return \"origin\";\n }\n if (header === ACAC_HEADER && isCredentialsTrueValue(valueArg)) {\n return \"credentials\";\n }\n return undefined;\n}\n\n/**\n * Nearest enclosing function node, or `undefined` for module scope. Used to\n * group split `setHeader`/`set` header assignments so a wildcard origin and a\n * credentials=true set only pair up when they live in the same scope.\n */\nfunction enclosingScope(node: TSESTree.Node): TSESTree.Node | undefined {\n let current: TSESTree.Node | undefined = node.parent;\n while (current) {\n if (\n current.type === \"FunctionDeclaration\" ||\n current.type === \"FunctionExpression\" ||\n current.type === \"ArrowFunctionExpression\"\n ) {\n return current;\n }\n current = current.parent;\n }\n return undefined;\n}\n\ninterface ScopeHeaderSets {\n originNodes: TSESTree.CallExpression[];\n credentialsNodes: TSESTree.CallExpression[];\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-cors-wildcard-with-credentials\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n 'Disallow CORS that reflects any Origin (`\"*\"`) while allowing credentials; any site could then read authenticated responses. Enumerate explicit trusted origins instead.',\n },\n schema: [],\n messages: {\n corsWildcardWithCredentials:\n 'CORS reflects any Origin (`\"*\"`) while allowing credentials — any site can read authenticated responses. Enumerate explicit trusted origins instead of using `\"*\"` with credentials.',\n },\n },\n defaultOptions: [],\n create(context) {\n const scopeHeaderSets = new Map<TSESTree.Node | \"module\", ScopeHeaderSets>();\n\n function recordHeaderSet(\n node: TSESTree.CallExpression,\n kind: HeaderSetKind,\n ): void {\n const key = enclosingScope(node) ?? \"module\";\n let entry = scopeHeaderSets.get(key);\n if (entry === undefined) {\n entry = { originNodes: [], credentialsNodes: [] };\n scopeHeaderSets.set(key, entry);\n }\n if (kind === \"origin\") {\n entry.originNodes.push(node);\n } else {\n entry.credentialsNodes.push(node);\n }\n }\n\n return {\n NewExpression(node: TSESTree.NewExpression): void {\n if (isCorsWildcardCredentialsCall(node)) {\n context.report({ node, messageId: \"corsWildcardWithCredentials\" });\n }\n },\n CallExpression(node: TSESTree.CallExpression): void {\n if (isCorsWildcardCredentialsCall(node)) {\n context.report({ node, messageId: \"corsWildcardWithCredentials\" });\n return;\n }\n const kind = classifyHeaderSetCall(node);\n if (kind !== undefined) {\n recordHeaderSet(node, kind);\n }\n },\n ObjectExpression(node: TSESTree.ObjectExpression): void {\n if (isWildcardCredentialsHeaderObject(node)) {\n context.report({ node, messageId: \"corsWildcardWithCredentials\" });\n }\n },\n \"Program:exit\"(): void {\n for (const { originNodes, credentialsNodes } of scopeHeaderSets.values()) {\n if (originNodes.length > 0 && credentialsNodes.length > 0) {\n for (const node of originNodes) {\n context.report({\n node,\n messageId: \"corsWildcardWithCredentials\",\n });\n }\n }\n }\n },\n };\n },\n});\n","/**\n * @fileoverview no-dynamic-sql — a runtime value interpolated into statement text is SQL injection, and it defeats the prepared-statement cache.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-dynamic-sql.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-dynamic-sql.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { stripSqlNoise } from \"./_sql.js\";\n\ntype MessageIds = \"dynamicSql\";\n\nexport interface RuleOptions {\n /** Statement-taking method names to inspect. Replaces the defaults. */\n readonly methods?: readonly string[];\n}\n\ntype Options = readonly [RuleOptions?];\n\nconst DEFAULT_METHODS: readonly string[] = [\"prepare\", \"exec\", \"query\"];\n\n/** A module-level constant fragment: `CANDIDATE_COLS`, `TABLE_NAME`. */\nconst CONSTANT_CASE_RE = /^[A-Z][A-Z0-9_]*$/;\n\n/**\n * True when an interpolated expression is a compile-time SQL fragment rather\n * than runtime data: a CONSTANT_CASE identifier, a member access whose final\n * property is CONSTANT_CASE (`TABLES.USERS`), or a string literal.\n */\nfunction isStaticFragment(expression: TSESTree.Expression): boolean {\n if (expression.type === AST_NODE_TYPES.Identifier) {\n return CONSTANT_CASE_RE.test(expression.name);\n }\n if (\n expression.type === AST_NODE_TYPES.MemberExpression &&\n !expression.computed &&\n expression.property.type === AST_NODE_TYPES.Identifier\n ) {\n return CONSTANT_CASE_RE.test(expression.property.name);\n }\n if (expression.type === AST_NODE_TYPES.Literal) {\n return typeof expression.value === \"string\";\n }\n return false;\n}\n\n/** The interpolated runtime expressions in a template literal. */\nfunction runtimeInterpolations(\n template: TSESTree.TemplateLiteral,\n): TSESTree.Expression[] {\n return template.expressions.filter(\n (expression) => !isStaticFragment(expression),\n );\n}\n\n/**\n * Flatten a `+` chain into its operands. `\"a\" + b + \"c\"` yields three nodes so\n * each can be judged independently.\n */\nfunction concatOperands(node: TSESTree.Expression): TSESTree.Expression[] {\n if (node.type === AST_NODE_TYPES.BinaryExpression && node.operator === \"+\") {\n return [...concatOperands(node.left), ...concatOperands(node.right)];\n }\n return [node];\n}\n\n/**\n * The runtime operands of a string-concatenation chain, or an empty array when\n * the node is not a concatenation that mixes a literal with a runtime value.\n * Requiring at least one string literal is what distinguishes statement\n * building from ordinary arithmetic.\n */\nfunction runtimeConcatOperands(node: TSESTree.Node): TSESTree.Expression[] {\n if (node.type !== AST_NODE_TYPES.BinaryExpression || node.operator !== \"+\") {\n return [];\n }\n const operands = concatOperands(node);\n const hasStringLiteral = operands.some(\n (operand) =>\n operand.type === AST_NODE_TYPES.Literal &&\n typeof operand.value === \"string\",\n );\n if (!hasStringLiteral) {\n return [];\n }\n return operands.filter(\n (operand) =>\n operand.type !== AST_NODE_TYPES.Literal && !isStaticFragment(operand),\n );\n}\n\n/**\n * A SQL data/DDL statement keyword. `exec` and `query` are generic method names\n * — `child_process.exec` shares them — so the statement text itself has to prove\n * it is SQL before an interpolation into it can be an injection.\n */\nconst SQL_STATEMENT_RE =\n /\\b(?:select\\s|insert\\s+into\\b|insert\\s+or\\b|update\\s+\\w|delete\\s+from\\b|replace\\s+into\\b|merge\\s+into\\b|upsert\\s+into\\b|create\\s+(?:temp(?:orary)?\\s+)?(?:table|index|view|trigger|schema|database)\\b|alter\\s+table\\b|drop\\s+(?:table|index|view|trigger)\\b|truncate\\s+table\\b|pragma\\s+\\w|with\\s+\\w+\\s+as\\s*\\(|from\\s+\\w+\\s+where\\b)/i;\n\n/** The marker a non-static operand contributes to the reconstructed statement text. */\nconst RUNTIME_MARKER = \" ? \";\n\n/**\n * The statically known text of a statement argument, with every runtime operand\n * replaced by a placeholder. Enough to answer \"is this SQL?\" for both the\n * template-literal and the `+`-concatenation shape.\n */\nfunction staticStatementText(node: TSESTree.Node): string {\n if (node.type === AST_NODE_TYPES.TemplateLiteral) {\n return node.quasis.map((quasi) => quasi.value.cooked ?? quasi.value.raw).join(RUNTIME_MARKER);\n }\n if (node.type === AST_NODE_TYPES.Literal) {\n return typeof node.value === \"string\" ? node.value : RUNTIME_MARKER;\n }\n if (node.type === AST_NODE_TYPES.BinaryExpression && node.operator === \"+\") {\n return staticStatementText(node.left) + staticStatementText(node.right);\n }\n return RUNTIME_MARKER;\n}\n\n/** True when the statement argument reads as SQL rather than as a shell command line. */\nfunction looksLikeSql(node: TSESTree.Node): boolean {\n return SQL_STATEMENT_RE.test(stripSqlNoise(staticStatementText(node)));\n}\n\n/** The inspected method name of `receiver.method(...)`, or null. */\nfunction statementMethodName(\n node: TSESTree.CallExpression,\n methods: ReadonlySet<string>,\n): string | null {\n const callee = node.callee;\n if (\n callee.type !== AST_NODE_TYPES.MemberExpression ||\n callee.computed ||\n callee.property.type !== AST_NODE_TYPES.Identifier\n ) {\n return null;\n }\n const name = callee.property.name;\n return methods.has(name) ? name : null;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-dynamic-sql\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow interpolating or concatenating a runtime value into a SQL statement passed to `prepare`/`exec`/`query`; use a placeholder and bind the value.\",\n },\n schema: [\n {\n type: \"object\",\n properties: {\n methods: {\n type: \"array\",\n items: { type: \"string\" },\n description:\n \"Statement-taking method names to inspect. Replaces the defaults.\",\n },\n },\n additionalProperties: false,\n },\n ],\n messages: {\n dynamicSql:\n \"Runtime value built into a SQL statement passed to `{{method}}()`. Use a `?` placeholder and pass the value through `.bind(...)` so the driver parameterises it.\",\n },\n },\n defaultOptions: [{}],\n create(context, [options]) {\n const methods = new Set(options?.methods ?? DEFAULT_METHODS);\n\n return {\n CallExpression(node: TSESTree.CallExpression): void {\n const method = statementMethodName(node, methods);\n if (method === null) {\n return;\n }\n\n const statement = node.arguments[0];\n if (statement === undefined || !looksLikeSql(statement)) {\n return;\n }\n\n const offenders =\n statement.type === AST_NODE_TYPES.TemplateLiteral\n ? runtimeInterpolations(statement)\n : runtimeConcatOperands(statement);\n\n for (const offender of offenders) {\n context.report({\n node: offender,\n messageId: \"dynamicSql\",\n data: { method },\n });\n }\n },\n };\n },\n});\n","/**\n * @fileoverview _sql — shared extraction of statically-resolvable SQL strings, with literal values and comments neutralised before any keyword scan.\n *\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/_sql.md\n */\n\nimport { AST_NODE_TYPES, type TSESLint, type TSESTree } from \"@typescript-eslint/utils\";\n\n/**\n * Blank out SQL string-literal contents and comment bodies.\n *\n * A single left-to-right scan, so precedence between strings and comments is\n * correct: a `--` or quote inside a string literal is protected (masked as\n * string data, never read as a comment), and a quote inside a comment is\n * ignored. Every masked character becomes a space except newlines, which are\n * preserved so the text keeps its shape. Doubled quotes (`''` / `\"\"`) are SQL's\n * in-string escape and keep the scanner inside the literal.\n */\nexport function stripSqlNoise(text: string): string {\n const out = [...text];\n const n = text.length;\n let i = 0;\n while (i < n) {\n const ch = text[i];\n if (ch === \"'\" || ch === '\"') {\n out[i] = \" \";\n i += 1;\n while (i < n) {\n const c = text[i];\n if (c === ch) {\n if (i + 1 < n && text[i + 1] === ch) {\n out[i] = \" \";\n out[i + 1] = \" \";\n i += 2;\n continue;\n }\n out[i] = \" \";\n i += 1;\n break;\n }\n if (c !== \"\\n\") {\n out[i] = \" \";\n }\n i += 1;\n }\n continue;\n }\n if (ch === \"-\" && text[i + 1] === \"-\") {\n while (i < n && text[i] !== \"\\n\") {\n out[i] = \" \";\n i += 1;\n }\n continue;\n }\n if (ch === \"/\" && text[i + 1] === \"*\") {\n out[i] = \" \";\n out[i + 1] = \" \";\n i += 2;\n while (i < n && !(text[i] === \"*\" && text[i + 1] === \"/\")) {\n if (text[i] !== \"\\n\") {\n out[i] = \" \";\n }\n i += 1;\n }\n if (i < n) {\n out[i] = \" \";\n out[i + 1] = \" \";\n i += 2;\n }\n continue;\n }\n i += 1;\n }\n return out.join(\"\");\n}\n\n/** The parameter marker a `${...}` substitution is replaced with before scanning. */\nconst SUBSTITUTION_MARKER = \"?\";\n\n/**\n * Reconstruct the SQL text of a string-bearing node, or null when the node does\n * not statically resolve to one. Handles the four shapes real TS SQL takes:\n * a plain string literal, a template literal (substitutions become `?`), a\n * `+`-concatenation of those, and an array of fragments destined for `.join()`.\n */\nexport function sqlTextOf(node: TSESTree.Node): string | null {\n switch (node.type) {\n case AST_NODE_TYPES.Literal:\n return typeof node.value === \"string\" ? node.value : null;\n case AST_NODE_TYPES.TemplateLiteral:\n return node.quasis.map((q) => q.value.cooked ?? q.value.raw).join(SUBSTITUTION_MARKER);\n case AST_NODE_TYPES.TaggedTemplateExpression:\n return sqlTextOf(node.quasi);\n case AST_NODE_TYPES.BinaryExpression: {\n if (node.operator !== \"+\") {\n return null;\n }\n const left = sqlTextOf(node.left);\n const right = sqlTextOf(node.right);\n return left !== null && right !== null ? left + right : null;\n }\n case AST_NODE_TYPES.ArrayExpression: {\n const parts: string[] = [];\n for (const element of node.elements) {\n if (element === null) {\n return null;\n }\n const part = sqlTextOf(element);\n if (part === null) {\n return null;\n }\n parts.push(part);\n }\n return parts.length > 0 ? parts.join(\" \") : null;\n }\n default:\n return null;\n }\n}\n\n/**\n * True when `node` is an array whose fragments are glued together by `.join(...)`\n * — the `['INSERT INTO t (...)', 'VALUES (?)', 'ON CONFLICT ...'].join(' ')`\n * shape. Only then may the elements be read as one statement; an unrelated array\n * of strings is not SQL.\n */\nfunction isJoinedFragmentArray(node: TSESTree.ArrayExpression): boolean {\n const parent = node.parent;\n return (\n parent?.type === AST_NODE_TYPES.MemberExpression &&\n parent.object === node &&\n !parent.computed &&\n parent.property.type === AST_NODE_TYPES.Identifier &&\n parent.property.name === \"join\" &&\n parent.parent?.type === AST_NODE_TYPES.CallExpression\n );\n}\n\n/** Every string-bearing descendant that a composite node has already absorbed. */\nfunction markConsumed(node: TSESTree.Node, consumed: WeakSet<TSESTree.Node>): void {\n consumed.add(node);\n for (const key of Object.keys(node)) {\n if (key === \"parent\") {\n continue;\n }\n const value = (node as unknown as Record<string, unknown>)[key];\n for (const child of Array.isArray(value) ? value : [value]) {\n if (child !== null && typeof child === \"object\" && \"type\" in child) {\n markConsumed(child as TSESTree.Node, consumed);\n }\n }\n }\n}\n\n/**\n * Build the ESLint visitor that hands each *whole* SQL statement to `handler`\n * exactly once, along with the node to report on.\n *\n * ESLint traverses parents before children, so a composite node (a\n * `+`-concatenation or a joined fragment array) is seen first and marks its\n * string descendants consumed — the fragments are never re-reported on their own.\n */\nexport function createSqlListener(\n handler: (sql: string, node: TSESTree.Node) => void,\n): TSESLint.RuleListener {\n const consumed = new WeakSet<TSESTree.Node>();\n\n const visit = (node: TSESTree.Node): void => {\n if (consumed.has(node)) {\n return;\n }\n const text = sqlTextOf(node);\n if (text === null) {\n return;\n }\n markConsumed(node, consumed);\n handler(stripSqlNoise(text), node);\n };\n\n return {\n BinaryExpression: (node: TSESTree.BinaryExpression): void => {\n visit(node);\n },\n ArrayExpression: (node: TSESTree.ArrayExpression): void => {\n if (isJoinedFragmentArray(node)) {\n visit(node);\n }\n },\n TemplateLiteral: (node: TSESTree.TemplateLiteral): void => {\n visit(node);\n },\n Literal: (node: TSESTree.Literal): void => {\n visit(node);\n },\n };\n}\n","/**\n * @fileoverview no-enum — a TypeScript `enum` emits runtime code, defaults to numbers, and does not tree-shake.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-enum.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-enum.md\n */\n\nimport { type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isGeneratedFile } from \"./_paths.js\";\n\ntype MessageIds = \"noEnum\";\ntype Options = readonly [\n {\n ignoreFiles?: readonly string[];\n }?,\n];\n\nfunction matchesAnyPattern(\n filename: string,\n patterns: readonly string[],\n): boolean {\n for (const pattern of patterns) {\n // Convert minimatch-ish globs to regex: ** -> .*, * -> [^/\\\\]*\n const regexSource = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/\\*\\*/g, \"::DOUBLESTAR::\")\n .replace(/\\*/g, \"[^/\\\\\\\\]*\")\n .replace(/::DOUBLESTAR::/g, \".*\");\n if (new RegExp(`^${regexSource}$`).test(filename)) {\n return true;\n }\n }\n return false;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-enum\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Disallow TypeScript `enum`; use string-literal unions or `as const` objects instead.\",\n },\n schema: [\n {\n type: \"object\",\n additionalProperties: false,\n properties: {\n ignoreFiles: {\n type: \"array\",\n items: { type: \"string\" },\n },\n },\n },\n ],\n messages: {\n noEnum:\n 'Enums are discouraged. Use a string-literal union (e.g. `type Status = \"active\" | \"inactive\"`) or an `as const` object instead.',\n },\n },\n defaultOptions: [{}],\n create(context, [optionsArg]) {\n const options = optionsArg ?? {};\n const ignoreFiles = options.ignoreFiles ?? [];\n const filename = context.filename;\n const sourceText = context.sourceCode.getText();\n\n // Generated code opts out through the SHARED `isGeneratedFile` predicate.\n // This rule used to carry its own narrower copy of all three of its signals\n // — a four-pattern path list and a 1KB `@generated` sniff — and every one of\n // them could be neutered with the suite green, because the shared predicate\n // already answered true for the same files. `ignoreFiles` stays: it names\n // paths a repo knows about and the shared predicate cannot.\n const isIgnoredByOption =\n ignoreFiles.length > 0 && matchesAnyPattern(filename, ignoreFiles);\n\n if (isIgnoredByOption || isGeneratedFile(filename, sourceText)) {\n return {};\n }\n\n return {\n TSEnumDeclaration(node: TSESTree.TSEnumDeclaration): void {\n context.report({\n node,\n messageId: \"noEnum\",\n });\n },\n };\n },\n});\n","/**\n * @fileoverview no-fat-try-blocks — a `try` holding more than three throwing statements catches failures its handler was never written for.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-fat-try-blocks.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-fat-try-blocks.md\n */\n\nimport { type TSESTree, AST_NODE_TYPES } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isGeneratedFile } from \"./_paths.js\";\n\ntype MessageIds = \"fatTryBlock\";\ntype Options = readonly [];\n\nconst MAX_TRY_BODY_STATEMENTS = 3;\n\nconst NESTED_FUNCTION_TYPES = new Set<AST_NODE_TYPES>([\n AST_NODE_TYPES.FunctionDeclaration,\n AST_NODE_TYPES.FunctionExpression,\n AST_NODE_TYPES.ArrowFunctionExpression,\n]);\n\n/**\n * Non-throwing member methods, recognised by NAME ALONE — so the set may hold\n * only names that are not also the vocabulary of an I/O client.\n *\n * `get`, `set`, `add`, `delete`, `has`, `clear`, `find`, `keys`, `values` and\n * `entries` are the `Map` / `Set` API, and they are equally `client.get(url)`,\n * `redis.set(k, v)`, `repo.find(where)` and `api.delete(id)`. A name-only test\n * cannot tell those apart, and resolving the ambiguity towards \"pure\" blinds\n * the rule to the exact swallow it exists to catch, so they are not here.\n * `isBareCallStatement` still exempts fire-and-forget `cache.set(k, v);`\n * structurally, which is the common non-I/O use of the names left out.\n *\n * What remains are Array / String / Number members with no I/O reading: nothing\n * calls `.padStart()` on a database handle.\n */\nconst PURE_METHODS = new Set<string>([\n \"map\", \"filter\", \"forEach\", \"reduce\", \"reduceRight\", \"findIndex\",\n \"findLast\", \"findLastIndex\", \"some\", \"every\", \"push\", \"pop\", \"shift\",\n \"unshift\", \"slice\", \"splice\", \"concat\", \"flat\", \"flatMap\", \"join\", \"reverse\",\n \"sort\", \"fill\", \"includes\", \"indexOf\", \"lastIndexOf\", \"at\", \"toString\",\n \"toLocaleString\", \"valueOf\", \"charAt\", \"charCodeAt\", \"codePointAt\", \"split\",\n \"padStart\", \"padEnd\", \"repeat\", \"trim\", \"trimStart\", \"trimEnd\", \"toUpperCase\",\n \"toLowerCase\", \"toFixed\", \"toPrecision\", \"startsWith\", \"endsWith\",\n]);\n\n/** Non-throwing global namespaces called as `X.method(...)`. */\nconst PURE_NAMESPACES = new Set<string>([\n \"Object\", \"Array\", \"Math\", \"JSON\", \"Number\", \"String\", \"Boolean\", \"console\",\n]);\n\n/**\n * `Namespace.method` pairs that throw despite the namespace being pure.\n *\n * `JSON.parse` is the canonical throwing call in JavaScript and the canonical\n * reason anybody writes `try`/`catch`; calling it non-throwing blinded the rule\n * to its most common subject. `JSON.stringify` also throws — circular\n * structures, `BigInt` — but is overwhelmingly called on a value the same\n * function just built, so it stays pure. That is a recall choice, stated rather\n * than hidden.\n */\nconst IMPURE_NAMESPACE_METHODS = new Set<string>([\"JSON.parse\"]);\n\n/** Constructors that do not throw on construction. */\nconst PURE_CONSTRUCTORS = new Set<string>([\n \"Map\", \"Set\", \"WeakMap\", \"WeakSet\", \"Date\", \"Error\", \"TypeError\",\n \"RangeError\", \"Array\", \"Object\", \"Headers\", \"URLSearchParams\", \"FormData\",\n \"TextEncoder\", \"TextDecoder\", \"Blob\", \"ReadableStream\", \"WritableStream\",\n \"TransformStream\", \"Response\", \"AbortController\",\n]);\n\nfunction isNode(value: unknown): value is TSESTree.Node {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { type?: unknown }).type === \"string\"\n );\n}\n\n/** A call whose value is a known pure, non-throwing helper. */\nfunction isPureCall(node: TSESTree.CallExpression): boolean {\n const callee = node.callee;\n if (callee.type !== AST_NODE_TYPES.MemberExpression) {\n return false;\n }\n const property = callee.property;\n if (property.type !== AST_NODE_TYPES.Identifier) {\n return false;\n }\n if (\n callee.object.type === AST_NODE_TYPES.Identifier &&\n PURE_NAMESPACES.has(callee.object.name)\n ) {\n return !IMPURE_NAMESPACE_METHODS.has(`${callee.object.name}.${property.name}`);\n }\n return PURE_METHODS.has(property.name);\n}\n\nfunction isPureNew(node: TSESTree.NewExpression): boolean {\n return (\n node.callee.type === AST_NODE_TYPES.Identifier &&\n PURE_CONSTRUCTORS.has(node.callee.name)\n );\n}\n\n/**\n * Walk `stmt`'s subtree until `predicate` matches a node. By default the walk\n * stays in the same scope (it does not descend into nested function/arrow\n * bodies); pass `descendIntoFunctions` to visit those too.\n */\nfunction subtreeMatches(\n stmt: TSESTree.Node,\n predicate: (node: TSESTree.Node) => boolean,\n descendIntoFunctions = false,\n): boolean {\n let found = false;\n\n const visit = (current: TSESTree.Node): void => {\n if (found) {\n return;\n }\n if (predicate(current)) {\n found = true;\n return;\n }\n for (const key of Object.keys(current)) {\n if (key === \"parent\") {\n continue;\n }\n if (\n !descendIntoFunctions &&\n NESTED_FUNCTION_TYPES.has(current.type) &&\n key === \"body\"\n ) {\n continue;\n }\n const value = (current as unknown as Record<string, unknown>)[key];\n if (Array.isArray(value)) {\n for (const child of value) {\n if (isNode(child)) {\n visit(child);\n }\n }\n } else if (isNode(value)) {\n visit(value);\n }\n if (found) {\n return;\n }\n }\n };\n\n visit(stmt);\n return found;\n}\n\nconst hasAwait = (node: TSESTree.Node): boolean =>\n subtreeMatches(node, (n) => n.type === AST_NODE_TYPES.AwaitExpression);\n\nconst hasThrowingCallOrNew = (node: TSESTree.Node): boolean =>\n subtreeMatches(\n node,\n (n) =>\n (n.type === AST_NODE_TYPES.CallExpression && !isPureCall(n)) ||\n (n.type === AST_NODE_TYPES.NewExpression && !isPureNew(n)),\n );\n\n/** Unwrap `await` / optional-chain / non-null wrappers to the core expression. */\nfunction unwrap(expr: TSESTree.Expression): TSESTree.Expression {\n let current = expr;\n while (\n current.type === AST_NODE_TYPES.ChainExpression ||\n current.type === AST_NODE_TYPES.TSNonNullExpression\n ) {\n current = current.expression;\n }\n return current;\n}\n\n/** A bare fire-and-forget call statement — `toast(\"done\");`, `logEvent(...);`. */\nfunction isBareCallStatement(stmt: TSESTree.Statement): boolean {\n return (\n stmt.type === AST_NODE_TYPES.ExpressionStatement &&\n unwrap(stmt.expression).type === AST_NODE_TYPES.CallExpression\n );\n}\n\n/**\n * Whether a top-level try-body statement can plausibly throw when the `try`\n * runs. `await` always counts; a bare fire-and-forget call statement does not.\n *\n * Blocks and `if`/`else` branches recurse so the bare-call exemption survives a\n * guard — a fire-and-forget call is no more throwing for sitting inside an\n * `if`. The guard's own TEST is still checked for a throwing call, keeping\n * `if (!validate(x))` counted. A compound statement still contributes at most\n * ONE to the caller's count; this predicate only decides whether it counts.\n */\nfunction canThrow(stmt: TSESTree.Statement): boolean {\n if (hasAwait(stmt)) {\n return true;\n }\n if (isBareCallStatement(stmt)) {\n return false;\n }\n if (stmt.type === AST_NODE_TYPES.BlockStatement) {\n return stmt.body.some(canThrow);\n }\n if (stmt.type === AST_NODE_TYPES.IfStatement) {\n return (\n hasThrowingCallOrNew(stmt.test) ||\n canThrow(stmt.consequent) ||\n (stmt.alternate !== null && canThrow(stmt.alternate))\n );\n }\n return hasThrowingCallOrNew(stmt);\n}\n\n/**\n * Conservative: is the `catch` handler guaranteed to re-throw? True when a\n * handler is present and its body's last statement is a `throw`.\n */\nfunction handlerRethrows(handler: TSESTree.CatchClause | null): boolean {\n if (handler === null) {\n return false;\n }\n const body = handler.body.body;\n const last = body[body.length - 1];\n return last !== undefined && last.type === AST_NODE_TYPES.ThrowStatement;\n}\n\n/** Statements that hand control straight through to their own parent. */\nconst PASS_THROUGH_PARENTS = new Set<AST_NODE_TYPES>([\n AST_NODE_TYPES.IfStatement,\n AST_NODE_TYPES.TryStatement,\n AST_NODE_TYPES.CatchClause,\n AST_NODE_TYPES.LabeledStatement,\n]);\n\n/**\n * Clause (a): nothing in the enclosing function runs after `node`. The node must\n * be last in its block, and every enclosing block must itself be last, up to the\n * function boundary. A loop, `switch`, or any other construct in between means\n * the statement can be followed by more work, so it is not terminal.\n */\nfunction isTerminalInFunction(node: TSESTree.Node): boolean {\n let current: TSESTree.Node = node;\n let parent: TSESTree.Node | undefined = current.parent;\n\n while (parent !== undefined) {\n if (parent.type === AST_NODE_TYPES.BlockStatement) {\n if (parent.body[parent.body.length - 1] !== current) {\n return false;\n }\n } else if (parent.type === AST_NODE_TYPES.Program) {\n return parent.body[parent.body.length - 1] === current;\n } else if (NESTED_FUNCTION_TYPES.has(parent.type)) {\n return true;\n } else if (!PASS_THROUGH_PARENTS.has(parent.type)) {\n return false;\n }\n current = parent;\n parent = current.parent;\n }\n return false;\n}\n\n/** `await f()` unwrapped to `f()`; everything else unwrapped as usual. */\nfunction unwrapAwait(expr: TSESTree.Expression): TSESTree.Expression {\n const inner = unwrap(expr);\n return inner.type === AST_NODE_TYPES.AwaitExpression\n ? unwrap(inner.argument)\n : inner;\n}\n\n/**\n * Clause (b): the handler ends by handing the failure off — a `return`, a\n * `throw`, or a bare call (`errorHandler(e, res);`). A handler that ends on\n * anything else (a branch, an assignment, a loop) is doing recovery work whose\n * correctness depends on which statement threw.\n */\nfunction handlerEndsByHandingOff(handler: TSESTree.CatchClause): boolean {\n const body = handler.body.body;\n const last = body[body.length - 1];\n if (last === undefined) {\n return false;\n }\n if (\n last.type === AST_NODE_TYPES.ReturnStatement ||\n last.type === AST_NODE_TYPES.ThrowStatement\n ) {\n return true;\n }\n return (\n last.type === AST_NODE_TYPES.ExpressionStatement &&\n unwrapAwait(last.expression).type === AST_NODE_TYPES.CallExpression\n );\n}\n\n/**\n * Every identifier bound by a `catch` parameter pattern. Type annotations are\n * skipped — `catch (e: Error)` binds `e`, not `Error`, and counting the type\n * would let a handler that merely constructs an `Error` pass clause (c).\n */\nfunction collectBindingNames(\n pattern: TSESTree.Node,\n names: Set<string>,\n): void {\n if (pattern.type === AST_NODE_TYPES.Identifier) {\n names.add(pattern.name);\n return;\n }\n if (pattern.type === AST_NODE_TYPES.ObjectPattern) {\n for (const property of pattern.properties) {\n collectBindingNames(\n property.type === AST_NODE_TYPES.RestElement\n ? property.argument\n : property.value,\n names,\n );\n }\n return;\n }\n if (pattern.type === AST_NODE_TYPES.ArrayPattern) {\n for (const element of pattern.elements) {\n if (element !== null) {\n collectBindingNames(element, names);\n }\n }\n return;\n }\n if (\n pattern.type === AST_NODE_TYPES.AssignmentPattern ||\n pattern.type === AST_NODE_TYPES.RestElement\n ) {\n collectBindingNames(\n pattern.type === AST_NODE_TYPES.AssignmentPattern\n ? pattern.left\n : pattern.argument,\n names,\n );\n }\n}\n\nfunction caughtBindingNames(handler: TSESTree.CatchClause): ReadonlySet<string> {\n const names = new Set<string>();\n if (handler.param !== null) {\n collectBindingNames(handler.param, names);\n }\n return names;\n}\n\n/** A member property / object key spelled `x` is not a reference to `x`. */\nfunction isPropertyName(node: TSESTree.Identifier): boolean {\n const parent = node.parent;\n if (parent.type === AST_NODE_TYPES.MemberExpression) {\n return parent.property === node && !parent.computed;\n }\n if (parent.type === AST_NODE_TYPES.Property) {\n return parent.key === node && !parent.computed;\n }\n return false;\n}\n\n/**\n * Clause (c): the handler references the caught error somewhere — it reports the\n * failure rather than discarding it. Nested callbacks count; a handler that logs\n * the error from inside a `.then()` still reports it.\n */\nfunction handlerMentionsCaughtBinding(handler: TSESTree.CatchClause): boolean {\n const names = caughtBindingNames(handler);\n if (names.size === 0) {\n return false;\n }\n return subtreeMatches(\n handler.body,\n (n) =>\n n.type === AST_NODE_TYPES.Identifier &&\n names.has(n.name) &&\n !isPropertyName(n),\n true,\n );\n}\n\n/** `null`, `undefined`, `false`, `void 0`, `[]`, `{}` — a success-shaped value. */\nfunction isSuccessShapedValue(expr: TSESTree.Expression): boolean {\n let current: TSESTree.Expression = expr;\n while (\n current.type === AST_NODE_TYPES.TSAsExpression ||\n current.type === AST_NODE_TYPES.TSNonNullExpression\n ) {\n current = current.expression;\n }\n if (current.type === AST_NODE_TYPES.Literal) {\n return current.value === null || current.value === false;\n }\n if (current.type === AST_NODE_TYPES.Identifier) {\n return current.name === \"undefined\";\n }\n if (current.type === AST_NODE_TYPES.UnaryExpression) {\n return current.operator === \"void\";\n }\n if (current.type === AST_NODE_TYPES.ArrayExpression) {\n return current.elements.length === 0;\n }\n if (current.type === AST_NODE_TYPES.ObjectExpression) {\n return current.properties.length === 0;\n }\n return false;\n}\n\n/**\n * Clause (d): the handler fabricates a success-shaped result. This is the shape\n * the rule exists for — an unknown one of N operations failed and the caller is\n * told \"nothing found\".\n */\nconst handlerReturnsSuccessShaped = (handler: TSESTree.CatchClause): boolean =>\n subtreeMatches(\n handler.body,\n (n) =>\n n.type === AST_NODE_TYPES.ReturnStatement &&\n n.argument !== null &&\n isSuccessShapedValue(n.argument),\n );\n\n/**\n * The terminal error-propagating boundary exemption.\n */\nfunction isTerminalErrorBoundary(node: TSESTree.TryStatement): boolean {\n const handler = node.handler;\n return (\n handler !== null &&\n isTerminalInFunction(node) &&\n handlerEndsByHandingOff(handler) &&\n handlerMentionsCaughtBinding(handler) &&\n !handlerReturnsSuccessShaped(handler)\n );\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-fat-try-blocks\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow `try` blocks with more than three top-level statements that can throw — isolate the throwing statement and move non-throwing work outside.\",\n },\n schema: [],\n messages: {\n fatTryBlock:\n \"This `try` block has {{count}} statements that can throw (max {{max}}). Isolate the throwing statement(s); move non-throwing work outside the `try`.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (isGeneratedFile(context.filename, context.sourceCode.text)) {\n return {};\n }\n\n const sourceCode = context.sourceCode;\n\n return {\n TryStatement(node: TSESTree.TryStatement): void {\n if (node.finalizer !== null) {\n return;\n }\n if (handlerRethrows(node.handler)) {\n return;\n }\n if (isTerminalErrorBoundary(node)) {\n return;\n }\n\n const count = node.block.body.filter(canThrow).length;\n if (count <= MAX_TRY_BODY_STATEMENTS) {\n return;\n }\n\n const tryKeyword = sourceCode.getFirstToken(node);\n context.report({\n node: tryKeyword ?? node,\n messageId: \"fatTryBlock\",\n data: { count, max: MAX_TRY_BODY_STATEMENTS },\n });\n },\n };\n },\n});\n","/**\n * @fileoverview no-hand-rolled-sleep — a hand-rolled promisified timer cannot be cancelled; the stdlib form takes an `AbortSignal`.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-hand-rolled-sleep.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-hand-rolled-sleep.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isGeneratedFile, isScriptFile, isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"handRolledSleep\" | \"handRolledTimeoutRace\";\ntype Options = readonly [\n {\n allowIn?: readonly string[];\n checkClientModules?: boolean;\n }?,\n];\n\n/** Receivers of an explicit `<obj>.setTimeout(...)` that still mean the global. */\nconst GLOBAL_OBJECTS: ReadonlySet<string> = new Set([\n \"globalThis\",\n \"window\",\n \"self\",\n \"global\",\n]);\n\n/** Modules whose presence proves the file is bundled for a non-Node runtime. */\nconst CLIENT_ONLY_MODULES =\n /^(react|react-dom|react-native|svelte|vue|preact|solid-js)(\\/|$)|^next\\/(navigation|router|link|image)$/;\n\n/** `Promise` combinators whose losing arm is discarded, leaking an orphan timer. */\nconst RACE_METHODS: ReadonlySet<string> = new Set([\"race\", \"any\"]);\n\n/**\n * Glob-ish matcher mirroring `require-fetch-timeout`'s: `**` spans separators,\n * `*` does not. Kept local for the same reason it is there — two call sites do\n * not yet justify a shared module, and the semantics must not drift silently.\n */\nfunction matchesAnyPattern(filename: string, patterns: readonly string[]): boolean {\n for (const pattern of patterns) {\n const regexSource = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/\\*\\*/g, \"::DOUBLESTAR::\")\n .replace(/\\*/g, \"[^/\\\\\\\\]*\")\n .replace(/::DOUBLESTAR::/g, \".*\");\n if (new RegExp(`^${regexSource}$`).test(filename)) {\n return true;\n }\n }\n return false;\n}\n\n/** True when `callee` names `setTimeout`, bare or on an explicit global object. */\nfunction isSetTimeoutCallee(callee: TSESTree.Node): boolean {\n if (callee.type === AST_NODE_TYPES.Identifier) {\n return callee.name === \"setTimeout\";\n }\n return (\n callee.type === AST_NODE_TYPES.MemberExpression &&\n !callee.computed &&\n callee.property.type === AST_NODE_TYPES.Identifier &&\n callee.property.name === \"setTimeout\" &&\n callee.object.type === AST_NODE_TYPES.Identifier &&\n GLOBAL_OBJECTS.has(callee.object.name)\n );\n}\n\nfunction soleCall(fn: TSESTree.ArrowFunctionExpression | TSESTree.FunctionExpression):\n | TSESTree.CallExpression\n | null {\n if (fn.body.type !== AST_NODE_TYPES.BlockStatement) {\n return fn.body.type === AST_NODE_TYPES.CallExpression ? fn.body : null;\n }\n if (fn.body.body.length !== 1) {\n return null;\n }\n const [only] = fn.body.body;\n if (only?.type !== AST_NODE_TYPES.ExpressionStatement) {\n return null;\n }\n return only.expression.type === AST_NODE_TYPES.CallExpression ? only.expression : null;\n}\n\n/** True for a delay that is a real wait: absent-of-literal, or a nonzero literal. */\nfunction isTimedDelay(delay: TSESTree.Node | undefined): boolean {\n if (delay === undefined) {\n return false;\n }\n if (delay.type === AST_NODE_TYPES.Literal && typeof delay.value === \"number\") {\n return delay.value !== 0;\n }\n // A variable / member / expression delay is the motivating case: a `sleep(ms)`\n // helper forwarding its parameter. Only a literal `0` is provably a yield.\n return true;\n}\n\n/**\n * True when `callback` settles `name` and carries no value: the bare identifier\n * `name`, or a zero-argument `() => name()` / `() => { name(); }` forwarder.\n * A callback passing a value is a delayed RESULT, which this rule leaves alone.\n */\nfunction settlesWithoutValue(callback: TSESTree.Node, name: string): boolean {\n if (callback.type === AST_NODE_TYPES.Identifier) {\n return callback.name === name;\n }\n if (\n callback.type !== AST_NODE_TYPES.ArrowFunctionExpression &&\n callback.type !== AST_NODE_TYPES.FunctionExpression\n ) {\n return false;\n }\n const call = soleCall(callback);\n return (\n call !== null &&\n call.arguments.length === 0 &&\n call.callee.type === AST_NODE_TYPES.Identifier &&\n call.callee.name === name\n );\n}\n\n/**\n * True when `callback` calls `name` — with or without an argument, since a\n * timeout arm conventionally rejects with an `Error`. Only consulted for the\n * REJECT parameter inside a `Promise.race`, where any rejection at all means\n * \"time this out\"; the value-carrying case that the resolve path excludes is\n * exactly what a rejection is supposed to look like.\n */\nfunction rejectsInCallback(callback: TSESTree.Node, name: string): boolean {\n if (callback.type === AST_NODE_TYPES.Identifier) {\n return callback.name === name;\n }\n if (\n callback.type !== AST_NODE_TYPES.ArrowFunctionExpression &&\n callback.type !== AST_NODE_TYPES.FunctionExpression\n ) {\n return false;\n }\n const call = soleCall(callback);\n return (\n call !== null &&\n call.callee.type === AST_NODE_TYPES.Identifier &&\n call.callee.name === name\n );\n}\n\n/** The name of an executor parameter at `index`, when it is a plain identifier. */\nfunction parameterName(\n fn: TSESTree.ArrowFunctionExpression | TSESTree.FunctionExpression,\n index: number,\n): string | null {\n const parameter = fn.params[index];\n return parameter?.type === AST_NODE_TYPES.Identifier ? parameter.name : null;\n}\n\n/**\n * True when `node` sits directly in the array literal handed to\n * `Promise.race([...])` / `Promise.any([...])` — the only position where a\n * delayed rejection means \"time this out\" and `AbortSignal.timeout` applies.\n */\nfunction isRaceArm(node: TSESTree.NewExpression): boolean {\n const array = node.parent;\n if (array?.type !== AST_NODE_TYPES.ArrayExpression) {\n return false;\n }\n const call = array.parent;\n return (\n call?.type === AST_NODE_TYPES.CallExpression &&\n call.arguments[0] === array &&\n call.callee.type === AST_NODE_TYPES.MemberExpression &&\n !call.callee.computed &&\n call.callee.object.type === AST_NODE_TYPES.Identifier &&\n call.callee.object.name === \"Promise\" &&\n call.callee.property.type === AST_NODE_TYPES.Identifier &&\n RACE_METHODS.has(call.callee.property.name)\n );\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-hand-rolled-sleep\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow hand-rolled promisified timers (`new Promise((r) => setTimeout(r, ms))`) and hand-rolled `Promise.race` timeout arms; the stdlib forms are cancellable, these are not.\",\n },\n schema: [\n {\n type: \"object\",\n additionalProperties: false,\n properties: {\n allowIn: {\n description:\n \"Glob patterns for modules exempt from the rule (e.g. a single sanctioned `sleep` utility). Matched against the ABSOLUTE file path, so anchor with a `**/` prefix (e.g. `**/lib/sleep.ts`).\",\n type: \"array\",\n items: { type: \"string\" },\n },\n checkClientModules: {\n description:\n \"Also report the sleep form in browser/React Native modules. Off by default: those bundles cannot import `node:timers/promises` and the web platform has no equivalent, so the fix is impossible to follow. Turn on only where every file can resolve `node:` builtins.\",\n type: \"boolean\",\n },\n },\n },\n ],\n messages: {\n handRolledSleep:\n \"Hand-rolled sleep: `new Promise((resolve) => setTimeout(resolve, ms))` cannot be cancelled, so an aborted request or a lost race still waits out the full delay. Use `import { setTimeout as sleep } from \\\"node:timers/promises\\\"` and pass `{ signal }`.\",\n handRolledTimeoutRace:\n \"Hand-rolled timeout arm: when the other promise wins, this timer is never cleared and keeps the event loop alive until it fires. Use `AbortSignal.timeout(ms)` and pass the signal to the operation.\",\n },\n },\n defaultOptions: [{}],\n create(context, [optionsArg]) {\n const { filename, sourceCode } = context;\n if (\n isTestFile(filename) ||\n isScriptFile(filename) ||\n isGeneratedFile(filename, sourceCode.getText())\n ) {\n return {};\n }\n\n const allowIn = optionsArg?.allowIn ?? [];\n if (allowIn.length > 0 && matchesAnyPattern(filename, allowIn)) {\n return {};\n }\n\n const checkClientModules = optionsArg?.checkClientModules ?? false;\n\n /**\n * True when this module provably ships to a non-Node runtime: a JSX file, a\n * `\"use client\"` directive, or an import of a client-only framework. Blunt\n * on purpose — over-skipping costs a report, under-skipping prints advice\n * the consumer physically cannot follow.\n */\n function isClientModule(): boolean {\n if (/\\.[cm]?[jt]sx$/.test(filename)) {\n return true;\n }\n const program = sourceCode.ast;\n for (const statement of program.body) {\n if (\n statement.type === AST_NODE_TYPES.ExpressionStatement &&\n statement.expression.type === AST_NODE_TYPES.Literal &&\n statement.expression.value === \"use client\"\n ) {\n return true;\n }\n if (\n statement.type === AST_NODE_TYPES.ImportDeclaration &&\n typeof statement.source.value === \"string\" &&\n CLIENT_ONLY_MODULES.test(statement.source.value)\n ) {\n return true;\n }\n }\n return false;\n }\n\n let clientModule: boolean | null = null;\n const reportsSleepHere = (): boolean => {\n if (checkClientModules) {\n return true;\n }\n clientModule ??= isClientModule();\n return !clientModule;\n };\n\n return {\n NewExpression(node: TSESTree.NewExpression): void {\n if (node.callee.type !== AST_NODE_TYPES.Identifier || node.callee.name !== \"Promise\") {\n return;\n }\n const executor = node.arguments[0];\n if (\n executor?.type !== AST_NODE_TYPES.ArrowFunctionExpression &&\n executor?.type !== AST_NODE_TYPES.FunctionExpression\n ) {\n return;\n }\n const call = soleCall(executor);\n if (call === null || !isSetTimeoutCallee(call.callee)) {\n return;\n }\n const [callback, delay] = call.arguments;\n if (callback === undefined || !isTimedDelay(delay)) {\n return;\n }\n\n const resolveName = parameterName(executor, 0);\n if (resolveName !== null && settlesWithoutValue(callback, resolveName)) {\n if (reportsSleepHere()) {\n context.report({ node, messageId: \"handRolledSleep\" });\n }\n return;\n }\n\n const rejectName = parameterName(executor, 1);\n if (\n rejectName !== null &&\n isRaceArm(node) &&\n rejectsInCallback(callback, rejectName)\n ) {\n context.report({ node, messageId: \"handRolledTimeoutRace\" });\n }\n },\n };\n },\n});\n","/**\n * @fileoverview no-insecure-random-id — `Math.random()` is predictable, so an id, token or key built from it is guessable.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-insecure-random-id.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-insecure-random-id.md\n */\n\nimport { type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"insecureRandomId\";\ntype Options = readonly [];\n\nconst STRONG_SECURITY_PATTERN =\n /token|secret|csrf|password|passwd|apikey|api[-_]?key|nonce|salt|uuid|authid/i;\n\nconst NON_SECURITY_ID_PATTERN =\n /temp|tmp|cache|correlation|request|req|trace|execution|dev|hmr|mock|test|perf|marker/i;\n\n/** Matches a static string fragment that reads as a path or DOM-id context. */\nconst PATH_OR_DOM_MARKER = /[\\\\/#]|\\.[A-Za-z0-9]/;\n\n/**\n * Returns true if `node` is a `Math.random()` CallExpression.\n */\nfunction isMathRandomCall(node: TSESTree.Node): node is TSESTree.CallExpression {\n if (node.type !== \"CallExpression\") {\n return false;\n }\n const callee = node.callee;\n if (callee.type !== \"MemberExpression\" || callee.computed) {\n return false;\n }\n const { object, property } = callee;\n return (\n object.type === \"Identifier\" &&\n object.name === \"Math\" &&\n property.type === \"Identifier\" &&\n property.name === \"random\"\n );\n}\n\n/**\n * Climbs the member/call chain in which `node` is the object/callee end, and\n * returns the outermost value node of that chain. For\n * `Math.random().toString(36).slice(2)` this returns the `.slice(2)` call —\n * i.e. the value that actually gets assigned/concatenated.\n */\nfunction climbValueChain(node: TSESTree.Node): TSESTree.Node {\n let current: TSESTree.Node = node;\n let parent = current.parent;\n\n while (parent) {\n if (\n parent.type === \"MemberExpression\" &&\n parent.object === current &&\n !parent.computed\n ) {\n current = parent;\n parent = current.parent;\n continue;\n }\n if (parent.type === \"CallExpression\" && parent.callee === current) {\n current = parent;\n parent = current.parent;\n continue;\n }\n break;\n }\n\n return current;\n}\n\n/**\n * Returns true if `node` (a `Math.random()` call) is the base of a member\n * chain that calls `.toString(36)` somewhere above it, e.g.\n * `Math.random().toString(36)` or `Math.random().toString(36).slice(2)`.\n */\nfunction isPartOfToString36Chain(node: TSESTree.Node): boolean {\n let current: TSESTree.Node = node;\n let parent = current.parent;\n\n while (parent) {\n if (\n parent.type === \"MemberExpression\" &&\n parent.object === current &&\n !parent.computed &&\n parent.property.type === \"Identifier\" &&\n parent.property.name === \"toString\"\n ) {\n const grandparent = parent.parent;\n if (\n grandparent &&\n grandparent.type === \"CallExpression\" &&\n grandparent.callee === parent\n ) {\n const firstArg = grandparent.arguments[0];\n if (firstArg && firstArg.type === \"Literal\" && firstArg.value === 36) {\n return true;\n }\n }\n }\n\n if (parent.type === \"MemberExpression\" && parent.object === current) {\n current = parent;\n parent = current.parent;\n continue;\n }\n if (parent.type === \"CallExpression\" && parent.callee === current) {\n current = parent;\n parent = current.parent;\n continue;\n }\n break;\n }\n\n return false;\n}\n\n/**\n * Walks up from `node` to find the name of the nearest enclosing binding\n * (VariableDeclarator id) or property (Property / PropertyDefinition key),\n * and returns it. Passes through string concatenation and template literals so\n * that `const tempPath = base + Math.random()...` resolves to `tempPath`.\n * Returns `undefined` if no such name is found before leaving the enclosing\n * initializer/value context.\n */\nfunction findEnclosingName(node: TSESTree.Node): string | undefined {\n let current: TSESTree.Node = node;\n let parent = current.parent;\n\n while (parent) {\n if (parent.type === \"VariableDeclarator\" && parent.init === current) {\n if (parent.id.type === \"Identifier\") {\n return parent.id.name;\n }\n return undefined;\n }\n\n if (parent.type === \"Property\" && parent.value === current) {\n const key = parent.key;\n if (!parent.computed && key.type === \"Identifier\") {\n return key.name;\n }\n if (key.type === \"Literal\" && typeof key.value === \"string\") {\n return key.value;\n }\n return undefined;\n }\n\n if (parent.type === \"PropertyDefinition\" && parent.value === current) {\n const key = parent.key;\n if (!parent.computed && key.type === \"Identifier\") {\n return key.name;\n }\n if (key.type === \"Literal\" && typeof key.value === \"string\") {\n return key.value;\n }\n return undefined;\n }\n\n if (\n parent.type === \"FunctionDeclaration\" ||\n parent.type === \"FunctionExpression\" ||\n parent.type === \"ArrowFunctionExpression\" ||\n parent.type === \"BlockStatement\" ||\n parent.type === \"ReturnStatement\" ||\n parent.type === \"ExpressionStatement\"\n ) {\n return undefined;\n }\n\n current = parent;\n parent = current.parent;\n }\n\n return undefined;\n}\n\n/**\n * Collects the static string fragments of a `+` concatenation / template\n * literal subtree into `out`.\n */\nfunction collectStaticStringParts(\n node: TSESTree.Node,\n out: string[],\n): void {\n if (node.type === \"Literal\" && typeof node.value === \"string\") {\n out.push(node.value);\n return;\n }\n if (node.type === \"TemplateLiteral\") {\n for (const quasi of node.quasis) {\n out.push(quasi.value.cooked ?? quasi.value.raw);\n }\n return;\n }\n if (node.type === \"BinaryExpression\" && node.operator === \"+\") {\n collectStaticStringParts(node.left, out);\n collectStaticStringParts(node.right, out);\n }\n}\n\n/**\n * Returns true if the random value is concatenated into a string whose static\n * parts read as a filename/path/DOM id (contain a slash, backslash, `#`, or a\n * `.ext`-style fragment).\n */\nfunction isConcatenatedIntoPathOrDomId(node: TSESTree.Node): boolean {\n const valueNode = climbValueChain(node);\n\n let current: TSESTree.Node = valueNode;\n let parent = current.parent;\n let top: TSESTree.Node | undefined;\n\n while (parent) {\n if (\n parent.type === \"BinaryExpression\" &&\n parent.operator === \"+\" &&\n (parent.left === current || parent.right === current)\n ) {\n top = parent;\n current = parent;\n parent = current.parent;\n continue;\n }\n if (parent.type === \"TemplateLiteral\") {\n top = parent;\n current = parent;\n parent = current.parent;\n continue;\n }\n break;\n }\n\n if (!top) {\n return false;\n }\n\n const parts: string[] = [];\n collectStaticStringParts(top, parts);\n return parts.some((part) => PATH_OR_DOM_MARKER.test(part));\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-insecure-random-id\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow using `Math.random()` to generate identifiers, tokens, or secrets; use `crypto.randomUUID()` or `crypto.getRandomValues(...)` instead.\",\n },\n schema: [],\n messages: {\n insecureRandomId:\n \"`Math.random()` is not cryptographically secure and is predictable; do not use it to generate IDs, tokens, or secrets. Use `crypto.randomUUID()` or `crypto.getRandomValues(...)` instead.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (isTestFile(context.filename)) {\n return {};\n }\n return {\n CallExpression(node: TSESTree.CallExpression): void {\n if (!isMathRandomCall(node)) {\n return;\n }\n\n const name = findEnclosingName(node);\n\n // A strong security name always fires — even a `sessionToken` or a name\n // that also happens to contain a correlation-id word.\n if (name !== undefined && STRONG_SECURITY_PATTERN.test(name)) {\n context.report({ node, messageId: \"insecureRandomId\" });\n return;\n }\n\n // Ephemeral / correlation ids (temp files, HMR sessions, dev request\n // ids, ...) are not security-sensitive — suppress, including the\n // `.toString(36)` idiom used to shape them.\n if (name !== undefined && NON_SECURITY_ID_PATTERN.test(name)) {\n return;\n }\n\n // A random value concatenated into a filename/path/DOM id is not a\n // security token.\n if (isConcatenatedIntoPathOrDomId(node)) {\n return;\n }\n\n // The classic insecure random-id idiom.\n if (isPartOfToString36Chain(node)) {\n context.report({ node, messageId: \"insecureRandomId\" });\n }\n },\n };\n },\n});\n","/**\n * @fileoverview no-json-stringify-error — `JSON.stringify` on an Error yields `{}` — `message` and `stack` are non-enumerable.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-json-stringify-error.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-json-stringify-error.md\n */\n\nimport { type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport type { Scope, SourceCode } from \"@typescript-eslint/utils/ts-eslint\";\n\ntype MessageIds = \"noJsonStringifyError\";\ntype Options = readonly [];\n\nconst ERROR_NAME_PATTERN = /^(e|err|error|ex|exc)$/i;\n\n/** Property names whose value is itself an error object (unsafe to stringify). */\nconst ERROR_PROP_PATTERN = /^(cause|lastError|error|err|exception|originalError|innerError)$/i;\n\n/** Property names whose value is a plain string — the recommended escape hatch. */\nconst SAFE_STRING_PROPS: ReadonlySet<string> = new Set([\"message\", \"stack\", \"name\"]);\n\n/**\n * Accessors that hold an error's *data* payload rather than a nested error.\n * These are ordinary enumerable JSON, so `JSON.stringify` on them is correct —\n * react-router's `ErrorResponse.data`, zod's `ZodError.issues`, an HTTP client's\n * `.status` / `.response.body`.\n */\nconst PAYLOAD_PROPS: ReadonlySet<string> = new Set([\n \"data\",\n \"status\",\n \"statuscode\",\n \"statustext\",\n \"code\",\n \"issues\",\n \"details\",\n \"body\",\n \"payload\",\n \"response\",\n \"info\",\n \"meta\",\n \"metadata\",\n \"context\",\n]);\n\n/**\n * Walk up the scope chain looking for a `catch` clause whose binding matches\n * `name`. We rely on the scope analysis provided by the parser rather than\n * type information, keeping the rule type-free.\n */\nfunction isCatchBinding(scope: Scope.Scope, name: string): boolean {\n let current: Scope.Scope | null = scope;\n while (current) {\n const variable = current.set.get(name);\n if (variable) {\n for (const def of variable.defs) {\n if (def.type === \"CatchClause\") {\n return true;\n }\n }\n }\n current = current.upper;\n }\n return false;\n}\n\n/**\n * True if a member-expression argument (`err.cause`, `this.lastError`) denotes an\n * Error value: an error-suggesting property name, or an error-suggesting base whose\n * property is not a known string accessor (`.message` / `.stack` / `.name`).\n */\nfunction memberSuggestsError(\n member: TSESTree.MemberExpression,\n scope: Scope.Scope,\n): boolean {\n const propName =\n !member.computed && member.property.type === \"Identifier\" ? member.property.name : null;\n\n if (propName !== null && ERROR_PROP_PATTERN.test(propName)) {\n return true;\n }\n\n const base = member.object;\n const baseSuggestsError =\n base.type === \"Identifier\" &&\n (ERROR_NAME_PATTERN.test(base.name) || isCatchBinding(scope, base.name));\n if (baseSuggestsError) {\n if (propName === null) {\n return true;\n }\n const lowered = propName.toLowerCase();\n return !SAFE_STRING_PROPS.has(lowered) && !PAYLOAD_PROPS.has(lowered);\n }\n\n return false;\n}\n\n/** The subject `x` of an `x instanceof Error` test, or null. */\nfunction instanceofErrorSubject(\n test: TSESTree.Expression,\n): TSESTree.Expression | null {\n if (\n test.type === \"BinaryExpression\" &&\n test.operator === \"instanceof\" &&\n test.right.type === \"Identifier\" &&\n test.right.name === \"Error\"\n ) {\n return test.left;\n }\n return null;\n}\n\n/** Names of a user-defined type-guard predicate: `isErrorLike`, `isError`, `hasErrorShape`. */\nconst TYPE_GUARD_PATTERN = /^(is|has)[A-Z]/;\n\n/** The narrowed subject `x` of a user-defined type-guard call `isFoo(x)`, or null. */\nfunction typeGuardSubject(\n test: TSESTree.Expression,\n): TSESTree.Expression | null {\n const arg = test.type === \"CallExpression\" ? test.arguments[0] : undefined;\n if (\n test.type === \"CallExpression\" &&\n test.callee.type === \"Identifier\" &&\n TYPE_GUARD_PATTERN.test(test.callee.name) &&\n test.arguments.length === 1 &&\n arg !== undefined &&\n arg.type !== \"SpreadElement\"\n ) {\n return arg;\n }\n return null;\n}\n\n/**\n * The subject `x` of a positive error-narrowing test — `x instanceof Error` or a\n * user-defined guard `isErrorLike(x)`. In both, the value IS the error in the\n * truthy branch, so `JSON.stringify(x)` belongs in the falsy (alternate) branch.\n */\nfunction positiveErrorSubject(\n test: TSESTree.Expression,\n): TSESTree.Expression | null {\n return instanceofErrorSubject(test) ?? typeGuardSubject(test);\n}\n\n/** The subject `x` of a negated error-narrowing test — `!(x instanceof Error)` / `!isErrorLike(x)`. */\nfunction negatedInstanceofErrorSubject(\n test: TSESTree.Expression,\n): TSESTree.Expression | null {\n if (test.type === \"UnaryExpression\" && test.operator === \"!\") {\n return positiveErrorSubject(test.argument);\n }\n return null;\n}\n\n/** Whether a branch statement unconditionally exits (its last statement returns/throws). */\nfunction branchTerminates(branch: TSESTree.Statement): boolean {\n const body = branch.type === \"BlockStatement\" ? branch.body : [branch];\n const last = body[body.length - 1];\n return (\n last !== undefined &&\n (last.type === \"ReturnStatement\" || last.type === \"ThrowStatement\")\n );\n}\n\n/**\n * True if an earlier guard `if (isErrorLike(arg)) return …` (or `instanceof Error`)\n * in an enclosing block narrows `argExpr` away from the error case before `node`,\n * so by the time `JSON.stringify(arg)` runs the value is the non-Error fallback.\n */\nfunction isNarrowedByEarlyReturn(\n node: TSESTree.Node,\n argExpr: TSESTree.Expression,\n sourceCode: Readonly<SourceCode>,\n): boolean {\n const argText = sourceCode.getText(argExpr);\n let current: TSESTree.Node | undefined = node.parent;\n while (current) {\n if (current.type === \"BlockStatement\" || current.type === \"Program\") {\n for (const stmt of current.body) {\n if (stmt.range[0] >= node.range[0]) {\n break;\n }\n if (\n stmt.type === \"IfStatement\" &&\n stmt.alternate === null &&\n branchTerminates(stmt.consequent)\n ) {\n const subject = positiveErrorSubject(stmt.test);\n if (subject && sourceCode.getText(subject) === argText) {\n return true;\n }\n }\n }\n }\n current = current.parent;\n }\n return false;\n}\n\nfunction nodeWithin(node: TSESTree.Node, container: TSESTree.Node | null): boolean {\n return (\n container !== null &&\n node.range[0] >= container.range[0] &&\n node.range[1] <= container.range[1]\n );\n}\n\n/**\n * True if `node` sits in the NON-error branch of an `argExpr instanceof Error`\n * guard — the branch where `argExpr` is provably not an Error, so stringifying it\n * is the correct fallback. Handles both the ternary and `if`/`else` shapes,\n * including the negated `!(x instanceof Error)` form.\n */\nfunction isGuardedByInstanceofError(\n node: TSESTree.Node,\n argExpr: TSESTree.Expression,\n sourceCode: Readonly<SourceCode>,\n): boolean {\n const argText = sourceCode.getText(argExpr);\n const sameSubject = (subject: TSESTree.Expression): boolean =>\n sourceCode.getText(subject) === argText;\n\n let current: TSESTree.Node | undefined = node.parent;\n while (current) {\n if (current.type === \"ConditionalExpression\") {\n const subject = positiveErrorSubject(current.test);\n if (subject && sameSubject(subject) && nodeWithin(node, current.alternate)) {\n return true;\n }\n const negated = negatedInstanceofErrorSubject(current.test);\n if (negated && sameSubject(negated) && nodeWithin(node, current.consequent)) {\n return true;\n }\n } else if (current.type === \"IfStatement\") {\n const subject = positiveErrorSubject(current.test);\n if (subject && sameSubject(subject) && nodeWithin(node, current.alternate)) {\n return true;\n }\n const negated = negatedInstanceofErrorSubject(current.test);\n if (negated && sameSubject(negated) && nodeWithin(node, current.consequent)) {\n return true;\n }\n }\n current = current.parent;\n }\n return false;\n}\n\nfunction isJsonStringify(callee: TSESTree.Expression): boolean {\n return (\n callee.type === \"MemberExpression\" &&\n !callee.computed &&\n callee.object.type === \"Identifier\" &&\n callee.object.name === \"JSON\" &&\n callee.property.type === \"Identifier\" &&\n callee.property.name === \"stringify\"\n );\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-json-stringify-error\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow `JSON.stringify` on an Error value; it yields `{}` because `message`/`stack` are non-enumerable.\",\n },\n schema: [],\n messages: {\n noJsonStringifyError:\n \"`JSON.stringify` on an Error yields `{}` because `message`/`stack` are non-enumerable. Log `err.message` / `err.stack`, or use a proper error serializer.\",\n },\n },\n defaultOptions: [],\n create(context) {\n return {\n CallExpression(node: TSESTree.CallExpression): void {\n if (!isJsonStringify(node.callee)) {\n return;\n }\n\n const firstArg = node.arguments[0];\n if (!firstArg) {\n return;\n }\n\n const scope = context.sourceCode.getScope(firstArg);\n\n let suggestsError: boolean;\n if (firstArg.type === \"Identifier\") {\n suggestsError =\n ERROR_NAME_PATTERN.test(firstArg.name) || isCatchBinding(scope, firstArg.name);\n } else if (firstArg.type === \"MemberExpression\") {\n suggestsError = memberSuggestsError(firstArg, scope);\n } else {\n return;\n }\n\n if (!suggestsError) {\n return;\n }\n\n if (\n isGuardedByInstanceofError(node, firstArg, context.sourceCode) ||\n isNarrowedByEarlyReturn(node, firstArg, context.sourceCode)\n ) {\n return;\n }\n\n context.report({\n node,\n messageId: \"noJsonStringifyError\",\n });\n },\n };\n },\n});\n","/**\n * @fileoverview no-log-only-catch — a catch that only logs keeps the program running broken, with a log line as the only signal.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-log-only-catch.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-log-only-catch.md\n */\n\nimport { AST_NODE_TYPES, ASTUtils, type TSESLint, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport {\n createLogMatcher,\n LOGGING_OPTION_PROPERTIES,\n type LoggingOptions,\n} from \"./_logging.js\";\nimport { createRule } from \"./_docs.js\";\nimport { isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"noLogOnlyCatch\" | \"emptyCatch\";\ntype Options = readonly [LoggingOptions?];\n\n// A micro-benchmark harness swallows the throw it is timing; `_paths` owns the\n// test-file question but does not yet know this segment, so it is local.\nconst BENCHMARK_DIR_RE = /(?:^|[\\\\/])benchmarks?[\\\\/]/;\n\n// Loop and branch bodies a lone try can be the whole content of. Reaching one\n// level up through these is what finds the rationale comment that real code\n// writes above the guard rather than inside the catch.\nconst SINGLE_STATEMENT_HOSTS: ReadonlySet<string> = new Set([\n AST_NODE_TYPES.DoWhileStatement,\n AST_NODE_TYPES.ForInStatement,\n AST_NODE_TYPES.ForOfStatement,\n AST_NODE_TYPES.ForStatement,\n AST_NODE_TYPES.IfStatement,\n AST_NODE_TYPES.WhileStatement,\n]);\n\nconst FUNCTION_TYPES: ReadonlySet<string> = new Set([\n AST_NODE_TYPES.ArrowFunctionExpression,\n AST_NODE_TYPES.FunctionDeclaration,\n AST_NODE_TYPES.FunctionExpression,\n]);\n\n/** The statement list a node sits directly in, plus its index in that list. */\nfunction statementSlot(\n node: TSESTree.Node,\n): { readonly list: readonly TSESTree.Node[]; readonly index: number } | null {\n const parent = node.parent;\n if (parent === undefined) return null;\n let list: readonly TSESTree.Node[];\n switch (parent.type) {\n case AST_NODE_TYPES.BlockStatement:\n case AST_NODE_TYPES.Program:\n case AST_NODE_TYPES.StaticBlock:\n list = parent.body;\n break;\n case AST_NODE_TYPES.SwitchCase:\n list = parent.consequent;\n break;\n default:\n return null;\n }\n const index = list.indexOf(node);\n return index === -1 ? null : { list, index };\n}\n\nfunction hasFollowingStatement(node: TSESTree.Node): boolean {\n for (\n let current: TSESTree.Node | undefined = node;\n current !== undefined && !FUNCTION_TYPES.has(current.type);\n current = current.parent\n ) {\n const slot = statementSlot(current);\n if (slot !== null && slot.index < slot.list.length - 1) return true;\n }\n return false;\n}\n\n/**\n * Class 1 — the try ends in a `return` and something follows the try, so the\n * catch's only job is to let control fall through to that fallback.\n */\nfunction fallbackFollowsTry(tryStatement: TSESTree.TryStatement): boolean {\n const body = tryStatement.block.body;\n const last = body.at(-1);\n return last?.type === AST_NODE_TYPES.ReturnStatement && hasFollowingStatement(tryStatement);\n}\n\n/** An explicit fallback seed: a literal, `undefined`, or an empty array/object. */\nfunction isSeedValue(node: TSESTree.Expression): boolean {\n const inner = node.type === AST_NODE_TYPES.TSAsExpression ? node.expression : node;\n switch (inner.type) {\n case AST_NODE_TYPES.Literal:\n return true;\n case AST_NODE_TYPES.Identifier:\n return inner.name === \"undefined\";\n case AST_NODE_TYPES.UnaryExpression:\n return inner.argument.type === AST_NODE_TYPES.Literal;\n case AST_NODE_TYPES.ArrayExpression:\n return inner.elements.length === 0;\n case AST_NODE_TYPES.ObjectExpression:\n return inner.properties.length === 0;\n default:\n return false;\n }\n}\n\n/**\n * Class 2 — `let x = <seed>;` immediately above the try, written inside it, read\n * after it. The seed IS the recovery value, so an empty catch is the whole\n * handler and there is nothing left for a comment to add.\n */\nfunction seededFallbackHandled(\n tryStatement: TSESTree.TryStatement,\n scope: TSESLint.Scope.Scope,\n): boolean {\n const slot = statementSlot(tryStatement);\n if (slot === null || slot.index === 0) return false;\n const previous = slot.list[slot.index - 1];\n if (previous?.type !== AST_NODE_TYPES.VariableDeclaration || previous.kind === \"const\") {\n return false;\n }\n const declarator = previous.declarations[0];\n if (previous.declarations.length !== 1 || declarator === undefined) return false;\n if (declarator.id.type !== AST_NODE_TYPES.Identifier) return false;\n if (declarator.init == null || !isSeedValue(declarator.init)) return false;\n\n const variable = ASTUtils.findVariable(scope, declarator.id.name);\n if (variable === null) return false;\n const [tryStart, tryEnd] = tryStatement.block.range;\n let writtenInTry = false;\n let readAfter = false;\n for (const reference of variable.references) {\n const [start] = reference.identifier.range;\n if (reference.isWrite() && start >= tryStart && start < tryEnd) writtenInTry = true;\n if (reference.isRead() && start >= tryStatement.range[1]) readAfter = true;\n }\n return writtenInTry && readAfter;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-log-only-catch\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow `catch` clauses that only log (or silently do nothing) and then swallow the error; rethrow or handle it instead.\",\n },\n schema: [\n {\n type: \"object\",\n additionalProperties: false,\n properties: { ...LOGGING_OPTION_PROPERTIES },\n },\n ],\n messages: {\n noLogOnlyCatch:\n \"Logging then swallowing the error hides failures. Rethrow the error or handle it for real.\",\n emptyCatch:\n \"Empty catch silently swallows the error. Rethrow it, handle it, or add a comment explaining why it is safe to ignore.\",\n },\n },\n defaultOptions: [{}],\n create(context, [loggingOptions]) {\n const matcher = createLogMatcher(loggingOptions);\n const filename = context.filename;\n const sourceCode = context.sourceCode;\n\n /** True when a statement is exactly a bare logging call, e.g. `console.error(err);`. */\n function isLoggingCallStatement(statement: TSESTree.Statement): boolean {\n if (statement.type !== \"ExpressionStatement\") {\n return false;\n }\n return matcher.isLoggingCall(statement.expression);\n }\n\n /** True when a `//`/`/* *\\/` run ends on the line directly above `node`. */\n function hasCommentDirectlyAbove(node: TSESTree.Node): boolean {\n const above = sourceCode.getCommentsBefore(node).at(-1);\n return above !== undefined && above.loc.end.line === node.loc.start.line - 1;\n }\n\n /**\n * Class 3 — a rationale written next to the braces instead of inside them.\n */\n function hasAdjacentRationale(node: TSESTree.CatchClause): boolean {\n const tryStatement = node.parent;\n if (hasCommentDirectlyAbove(tryStatement) || hasCommentDirectlyAbove(node)) return true;\n const block = tryStatement.parent;\n if (\n block?.type !== AST_NODE_TYPES.BlockStatement ||\n block.body.length !== 1 ||\n block.parent === undefined ||\n !SINGLE_STATEMENT_HOSTS.has(block.parent.type)\n ) {\n return false;\n }\n return hasCommentDirectlyAbove(block.parent);\n }\n\n if (isTestFile(filename) || BENCHMARK_DIR_RE.test(filename.replaceAll(\"\\\\\", \"/\"))) {\n return {};\n }\n\n return {\n CatchClause(node: TSESTree.CatchClause): void {\n const statements = node.body.body;\n\n // A comment inside the block documents an intentional ignore — for a\n // silent swallow and for a log-and-continue alike.\n const isDocumented =\n sourceCode.getCommentsInside(node.body).length > 0 || hasAdjacentRationale(node);\n\n if (statements.length === 0) {\n if (isDocumented) {\n return;\n }\n // The recovery can live outside the catch, where no comment can\n // describe it better than the code already does.\n if (\n fallbackFollowsTry(node.parent) ||\n seededFallbackHandled(node.parent, sourceCode.getScope(node))\n ) {\n return;\n }\n context.report({ node, messageId: \"emptyCatch\" });\n return;\n }\n\n if (isDocumented) {\n return;\n }\n\n const everyStatementIsLogging = statements.every((statement) =>\n isLoggingCallStatement(statement),\n );\n\n if (everyStatementIsLogging) {\n context.report({ node, messageId: \"noLogOnlyCatch\" });\n }\n },\n };\n },\n});\n","/**\n * @fileoverview _logging — shared recognition of logging / error-reporting calls, so the catch rules and the secret rule cannot disagree.\n *\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/_logging.md\n */\n\nimport { type TSESTree } from \"@typescript-eslint/utils\";\n\nexport const LOG_METHODS: ReadonlySet<string> = new Set([\n \"debug\",\n \"info\",\n \"warn\",\n \"warning\",\n \"error\",\n \"exception\",\n \"critical\",\n \"trace\",\n \"log\",\n \"fatal\",\n \"success\",\n]);\n\nexport const LOGGER_NAMES: ReadonlySet<string> = new Set([\n \"logger\",\n \"log\",\n \"logging\",\n \"loguru\",\n \"console\",\n \"_logger\",\n \"_log\",\n]);\n\n/** Factory methods that RETURN a logger (`logging.getLogger(name).info(...)`). */\nexport const LOGGER_FACTORIES: ReadonlySet<string> = new Set([\n \"getlogger\",\n \"get_logger\",\n]);\n\n/**\n * Names of free functions / methods that report an error to a handler or sink,\n * e.g. `onUnexpectedError`, `reportError`, `captureException`, `logError`. Kept\n * broad on purpose: pairing this with \"takes the caught binding\" is what makes\n * it precise.\n */\nexport const REPORT_NAME_RE = /error|report|capture|log|trace|warn/i;\n\n/** Shared `loggerNames` / `logFunctions` option shape. */\nexport interface LoggingOptions {\n readonly loggerNames?: readonly string[];\n readonly logFunctions?: readonly string[];\n}\n\n/**\n * JSON-schema properties for the shared logging options. Spread into a rule's\n * `schema[0].properties` so every rule that consults `_logging` accepts the same\n * declaration and a project configures its logger exactly once.\n */\nexport const LOGGING_OPTION_PROPERTIES = {\n loggerNames: { type: \"array\", items: { type: \"string\" } },\n logFunctions: { type: \"array\", items: { type: \"string\" } },\n} as const;\n\n/** The static callee name of a call (free function or method), or null. */\nexport function calleeName(callee: TSESTree.Node): string | null {\n if (callee.type === \"Identifier\") {\n return callee.name;\n }\n if (\n callee.type === \"MemberExpression\" &&\n !callee.computed &&\n callee.property.type === \"Identifier\"\n ) {\n return callee.property.name;\n }\n return null;\n}\n\nexport interface LogMatcher {\n /** Is `expr` a logger receiver (bare name, member chain, or factory call)? */\n isLoggerReceiver(expr: TSESTree.Expression | TSESTree.PrivateIdentifier): boolean;\n /** Is `expr` a project-declared free logging function call (`logEvent(...)`)? */\n isLogFunctionCall(expr: TSESTree.Node): boolean;\n /** Is `expr` a logging call of either shape? */\n isLoggingCall(expr: TSESTree.Node): boolean;\n}\n\n/**\n * Builds the log-recognition predicates for one rule invocation, folding in the\n * project's declared `loggerNames` / `logFunctions`. Call once per `create()`.\n */\nexport function createLogMatcher(options: LoggingOptions = {}): LogMatcher {\n const loggerNames: ReadonlySet<string> = new Set([\n ...LOGGER_NAMES,\n ...(options.loggerNames ?? []).map((name) => name.toLowerCase()),\n ]);\n const logFunctions: ReadonlySet<string> = new Set(options.logFunctions ?? []);\n\n function isLoggerReceiver(\n expr: TSESTree.Expression | TSESTree.PrivateIdentifier,\n ): boolean {\n switch (expr.type) {\n case \"Identifier\":\n return loggerNames.has(expr.name.toLowerCase());\n case \"MemberExpression\": {\n const { property, object } = expr;\n if (!expr.computed && property.type === \"Identifier\") {\n const lowered = property.name.toLowerCase();\n if (loggerNames.has(lowered) || LOGGER_FACTORIES.has(lowered)) {\n return true;\n }\n }\n return isLoggerReceiver(object);\n }\n case \"CallExpression\": {\n const callee = expr.callee;\n if (\n callee.type === \"MemberExpression\" &&\n !callee.computed &&\n callee.property.type === \"Identifier\" &&\n LOGGER_FACTORIES.has(callee.property.name.toLowerCase())\n ) {\n return true;\n }\n if (callee.type !== \"Super\") {\n return isLoggerReceiver(callee);\n }\n return false;\n }\n default:\n return false;\n }\n }\n\n function isLogFunctionCall(expr: TSESTree.Node): boolean {\n if (expr.type !== \"CallExpression\" || logFunctions.size === 0) {\n return false;\n }\n const name = calleeName(expr.callee);\n return name !== null && logFunctions.has(name);\n }\n\n function isLoggingCall(expr: TSESTree.Node): boolean {\n if (expr.type !== \"CallExpression\") {\n return false;\n }\n if (isLogFunctionCall(expr)) {\n return true;\n }\n const callee = expr.callee;\n if (\n callee.type !== \"MemberExpression\" ||\n callee.computed ||\n callee.property.type !== \"Identifier\"\n ) {\n return false;\n }\n if (!LOG_METHODS.has(callee.property.name.toLowerCase())) {\n return false;\n }\n return isLoggerReceiver(callee.object);\n }\n\n return { isLoggerReceiver, isLogFunctionCall, isLoggingCall };\n}\n","/**\n * @fileoverview no-offset-pagination — `OFFSET m` scans and discards m rows per page and shifts under concurrent writes, so rows repeat or vanish.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-offset-pagination.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-offset-pagination.md\n */\n\nimport { type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isTestFile } from \"./_paths.js\";\nimport { createSqlListener } from \"./_sql.js\";\n\ntype MessageIds = \"noOffsetPagination\";\ntype Options = readonly [];\n\n/**\n * `OFFSET` followed by a value or param token — the real pagination construct.\n * The parameter alternatives are the UNION of every marker the three packages\n * see, and are kept identical in SARJ025 and SARJ107.\n */\nconst OFFSET_PAGINATION = /\\bOFFSET\\s+(?:%s|%\\(\\w+\\)s|\\?\\d*|:\\w+|@\\w+|\\$\\d+|\\d+)/i;\n\n/** Cheap substring gate; noise-stripping can only ever remove keywords, never add them. */\nconst OFFSET_GATE = /offset/i;\n\nexport default createRule<Options, MessageIds>({\n name: \"no-offset-pagination\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow OFFSET pagination in embedded SQL; it is O(N) per page and drops or repeats rows under concurrent writes. Use a keyset cursor.\",\n },\n schema: [],\n messages: {\n noOffsetPagination:\n \"OFFSET pagination scans and discards every skipped row (O(N) per page) and shifts under concurrent inserts, so rows get repeated or missed. Use a keyset cursor: `WHERE id > ? ORDER BY id LIMIT ?`.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (isTestFile(context.filename) || !OFFSET_GATE.test(context.sourceCode.text)) {\n return {};\n }\n return createSqlListener((sql: string, node: TSESTree.Node): void => {\n if (!OFFSET_PAGINATION.test(sql)) {\n return;\n }\n context.report({ node, messageId: \"noOffsetPagination\" });\n });\n },\n});\n","/**\n * @fileoverview no-positional-tuple-return — a positional tuple crossing a module boundary names its fields only at the call site, so call sites disagree.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-positional-tuple-return.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-positional-tuple-return.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\n\ntype MessageIds = \"noPositionalTupleReturn\";\ntype Options = readonly [];\n\nconst MIN_ELEMENTS = 2;\n\n/** The pair length an accessor/mutator tuple has. */\nconst ACCESSOR_PAIR_LENGTH = 2;\n\n/** Type wrappers whose single type argument is the value actually returned. */\nconst AWAITABLE_TYPES: ReadonlySet<string> = new Set([\"Promise\", \"PromiseLike\", \"Awaited\"]);\n\n/** The tuple type a return annotation resolves to, unwrapping `Promise<...>`. */\nfunction tupleReturnType(node: TSESTree.TypeNode): TSESTree.TSTupleType | null {\n if (node.type === AST_NODE_TYPES.TSTupleType) {\n return node;\n }\n if (\n node.type === AST_NODE_TYPES.TSTypeReference &&\n node.typeName.type === AST_NODE_TYPES.Identifier &&\n AWAITABLE_TYPES.has(node.typeName.name)\n ) {\n const argument = node.typeArguments?.params[0];\n return argument === undefined ? null : tupleReturnType(argument);\n }\n return null;\n}\n\n/** Source text with all whitespace runs collapsed, for structural comparison. */\nfunction normalizedText(sourceCode: { getText: (node: TSESTree.Node) => string }, node: TSESTree.Node): string {\n return sourceCode.getText(node).replaceAll(/\\s+/g, \" \").trim();\n}\n\n/**\n * True when the tuple is one of the permitted shapes: variadic, labeled, tagged\n * by a leading literal type, or structurally homogeneous.\n */\nfunction isPermittedTuple(\n tuple: TSESTree.TSTupleType,\n sourceCode: { getText: (node: TSESTree.Node) => string },\n): boolean {\n const elements = tuple.elementTypes;\n if (elements.length < MIN_ELEMENTS) {\n return true;\n }\n if (elements.some((element) => element.type === AST_NODE_TYPES.TSRestType)) {\n return true;\n }\n if (elements.some((element) => element.type === AST_NODE_TYPES.TSNamedTupleMember)) {\n return true;\n }\n if (elements[0]?.type === AST_NODE_TYPES.TSLiteralType) {\n return true;\n }\n if (\n elements.length === ACCESSOR_PAIR_LENGTH &&\n elements.some((element) => element.type === AST_NODE_TYPES.TSFunctionType)\n ) {\n return true;\n }\n const texts = new Set(elements.map((element) => normalizedText(sourceCode, element)));\n return texts.size === 1;\n}\n\n/** The declared name of a function-ish node, or null for an anonymous one. */\nfunction functionName(node: TSESTree.Node): string | null {\n if (node.type === AST_NODE_TYPES.FunctionDeclaration) {\n return node.id?.name ?? null;\n }\n const parent = node.parent;\n if (parent?.type === AST_NODE_TYPES.VariableDeclarator && parent.id.type === AST_NODE_TYPES.Identifier) {\n return parent.id.name;\n }\n if (\n (parent?.type === AST_NODE_TYPES.MethodDefinition ||\n parent?.type === AST_NODE_TYPES.PropertyDefinition ||\n parent?.type === AST_NODE_TYPES.Property) &&\n parent.key.type === AST_NODE_TYPES.Identifier\n ) {\n return parent.key.name;\n }\n return null;\n}\n\n/**\n * True when an ancestor statement carries the `export` keyword inline —\n * `export function f`, `export const f =`, `export default function f`.\n */\nfunction isInlineExported(node: TSESTree.Node): boolean {\n for (let current: TSESTree.Node | undefined | null = node; current != null; current = current.parent) {\n const parent = current.parent;\n if (\n parent?.type === AST_NODE_TYPES.ExportNamedDeclaration ||\n parent?.type === AST_NODE_TYPES.ExportDefaultDeclaration\n ) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * The module-scope binding the function lives under — `split` for a top-level\n * `function split`, `Repo` for a method of a top-level `class Repo`. That is the\n * name an `export { … }` specifier elsewhere in the file would refer to. Null\n * when the function is not anchored to a named top-level declaration.\n */\nfunction moduleScopeBindingName(node: TSESTree.Node): string | null {\n let current: TSESTree.Node = node;\n let child: TSESTree.Node = node;\n while (current.parent != null && current.parent.type !== AST_NODE_TYPES.Program) {\n child = current;\n current = current.parent;\n }\n if (current.parent?.type !== AST_NODE_TYPES.Program) {\n return null;\n }\n if (\n current.type === AST_NODE_TYPES.FunctionDeclaration ||\n current.type === AST_NODE_TYPES.ClassDeclaration\n ) {\n return current.id?.name ?? null;\n }\n if (current.type === AST_NODE_TYPES.VariableDeclaration) {\n if (child.type !== AST_NODE_TYPES.VariableDeclarator || child.id.type !== AST_NODE_TYPES.Identifier) {\n return null;\n }\n return child.id.name;\n }\n return null;\n}\n\n/**\n * Local names this module puts on its public surface through a *detached* export\n * statement: `export { split }`, `export { split as s }`, `export default split`,\n * `export = split`. A re-export (`export { x } from \"./other\"`) names a binding\n * owned by another module, and a type-only export (`export type { x }`) does not\n * expose the value, so neither counts.\n */\nfunction specifierExportedNames(program: TSESTree.Program): ReadonlySet<string> {\n const names = new Set<string>();\n for (const statement of program.body) {\n if (\n statement.type === AST_NODE_TYPES.ExportNamedDeclaration &&\n statement.declaration == null &&\n statement.source == null &&\n statement.exportKind !== \"type\"\n ) {\n for (const specifier of statement.specifiers) {\n if (specifier.exportKind !== \"type\" && specifier.local.type === AST_NODE_TYPES.Identifier) {\n names.add(specifier.local.name);\n }\n }\n continue;\n }\n if (\n statement.type === AST_NODE_TYPES.ExportDefaultDeclaration &&\n statement.declaration.type === AST_NODE_TYPES.Identifier\n ) {\n names.add(statement.declaration.name);\n continue;\n }\n if (\n statement.type === AST_NODE_TYPES.TSExportAssignment &&\n statement.expression.type === AST_NODE_TYPES.Identifier\n ) {\n names.add(statement.expression.name);\n }\n }\n return names;\n}\n\n/**\n * True when the function is reachable from outside the module — the boundary the\n * rule is about. Either the declaration is exported inline, or its module-scope\n * binding is exported later through an export specifier.\n */\nfunction isExported(node: TSESTree.Node, specifierExports: ReadonlySet<string>): boolean {\n if (isInlineExported(node)) {\n return true;\n }\n if (specifierExports.size === 0) {\n return false;\n }\n const binding = moduleScopeBindingName(node);\n return binding !== null && specifierExports.has(binding);\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-positional-tuple-return\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Disallow returning a positional tuple of distinct fields from an exported function; return a named object so call sites cannot mismatch slots.\",\n },\n schema: [],\n messages: {\n noPositionalTupleReturn:\n \"Exported `{{name}}` returns a positional {{count}}-tuple, so every call site re-invents the field names and can disagree. Return a named object (or label the tuple members) instead.\",\n },\n },\n defaultOptions: [],\n create(context) {\n const specifierExports = specifierExportedNames(context.sourceCode.ast);\n const check = (\n node:\n | TSESTree.FunctionDeclaration\n | TSESTree.FunctionExpression\n | TSESTree.ArrowFunctionExpression,\n ): void => {\n const annotation = node.returnType?.typeAnnotation;\n if (annotation === undefined) {\n return;\n }\n const tuple = tupleReturnType(annotation);\n if (tuple === null || isPermittedTuple(tuple, context.sourceCode)) {\n return;\n }\n const name = functionName(node);\n if (name === null || name.startsWith(\"_\") || /^use[A-Z]/.test(name)) {\n return;\n }\n if (!isExported(node, specifierExports)) {\n return;\n }\n context.report({\n node: tuple,\n messageId: \"noPositionalTupleReturn\",\n data: { name, count: String(tuple.elementTypes.length) },\n });\n };\n return {\n FunctionDeclaration: check,\n FunctionExpression: check,\n ArrowFunctionExpression: check,\n };\n },\n});\n","/**\n * @fileoverview no-raw-env — a raw `process.env` read is untyped and unvalidated, so a missing variable surfaces as `undefined` in business logic.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-raw-env.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-raw-env.md\n */\n\nimport { type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isScriptFile, isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"noRawEnv\";\ntype Options = readonly [];\n\n/** Build / test / tooling config: `vite.config.ts`, `vitest.config.mts`, `playwright.config.ts`. */\nconst CONFIG_FILE_RE = /(^|[\\\\/])[\\w.-]+\\.config\\.[cm]?[jt]sx?$/;\n\n/**\n * Modules that define the validated env boundary have to read raw env exactly\n * once before handing values to Zod. Keep this path-scoped so ordinary\n * `config.ts`/settings helpers still use the boundary instead of becoming one.\n */\nconst ENV_BOUNDARY_FILE_RE =\n /(^|[\\\\/])(?:env|client-env|server-env|client-settings|server-settings)\\.[cm]?[jt]sx?$/;\n\nconst ENV_VALIDATION_MARKER_RE =\n /\\bcreateEnv\\s*\\(|\\bz\\.object\\s*\\(|\\.(?:safeParse|parse)\\s*\\(/;\n\nfunction isValidatedEnvBoundary(filename: string, sourceText: string): boolean {\n return (\n ENV_BOUNDARY_FILE_RE.test(filename.replaceAll(\"\\\\\", \"/\")) &&\n ENV_VALIDATION_MARKER_RE.test(sourceText)\n );\n}\n\n/** True for the `process.env` member node (dotted or as the base of `process.env[key]`). */\nfunction isProcessEnv(node: TSESTree.MemberExpression): boolean {\n return (\n !node.computed &&\n node.object.type === \"Identifier\" &&\n node.object.name === \"process\" &&\n node.property.type === \"Identifier\" &&\n node.property.name === \"env\"\n );\n}\n\n/** True for the `import.meta.env` member node (dotted or as the base of `import.meta.env[key]`). */\nfunction isImportMetaEnv(node: TSESTree.MemberExpression): boolean {\n return (\n !node.computed &&\n node.property.type === \"Identifier\" &&\n node.property.name === \"env\" &&\n node.object.type === \"MetaProperty\" &&\n node.object.meta.name === \"import\" &&\n node.object.property.name === \"meta\"\n );\n}\n\n// Build-time constants that bundlers (webpack/Vite) statically replace — there is\n// no runtime env value to route through the validated layer, so they are exempt.\nconst BUILD_TIME_CONSTANTS: ReadonlySet<string> = new Set([\n \"NODE_ENV\",\n \"MODE\",\n \"DEV\",\n \"PROD\",\n \"SSR\",\n]);\n\nconst PLATFORM_MARKERS: ReadonlySet<string> = new Set([\n \"NEXT_RUNTIME\",\n \"VERCEL\",\n \"VERCEL_ENV\",\n \"CI\",\n]);\n\n/**\n * True when `node` is the base of an exempt named access like\n * `process.env.NODE_ENV` or `process.env.VERCEL` — a bundler-replaced constant\n * or a platform-injected marker.\n */\nfunction isExemptVariableAccess(node: TSESTree.MemberExpression): boolean {\n const parent = node.parent;\n return (\n parent.type === \"MemberExpression\" &&\n parent.object === node &&\n !parent.computed &&\n parent.property.type === \"Identifier\" &&\n (BUILD_TIME_CONSTANTS.has(parent.property.name) ||\n PLATFORM_MARKERS.has(parent.property.name))\n );\n}\n\n/**\n * True when the env access is the TARGET of an assignment (`process.env.X = v`,\n * `process.env.X ??= v`, `delete process.env.X`) rather than a read. Writing a\n * variable for a child process reads no configuration value.\n */\nfunction isWriteTarget(node: TSESTree.MemberExpression): boolean {\n const access = node.parent.type === \"MemberExpression\" && node.parent.object === node ? node.parent : node;\n const parent = access.parent;\n if (parent.type === \"AssignmentExpression\") {\n return parent.left === access;\n }\n if (parent.type === \"UnaryExpression\") {\n return parent.operator === \"delete\";\n }\n return false;\n}\n\n/**\n * True when the WHOLE environment is spread into an object literal —\n * `{ ...process.env, NO_COLOR: \"1\" }`. That forwards the inherited environment\n * to a spawned process; it is not a read of any particular setting.\n */\nfunction isWholeEnvSpread(node: TSESTree.MemberExpression): boolean {\n const parent = node.parent;\n return parent.type === \"SpreadElement\" && parent.argument === node;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-raw-env\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow direct `process.env` access; use a Zod-validated env module instead.\",\n },\n schema: [],\n messages: {\n noRawEnv:\n \"Do not read from `process.env` directly. Import the Zod-validated env module instead so values are typed and validated at startup.\",\n },\n },\n defaultOptions: [],\n create(context) {\n const filename = context.filename;\n if (\n isTestFile(filename) ||\n isScriptFile(filename) ||\n CONFIG_FILE_RE.test(filename.replaceAll(\"\\\\\", \"/\")) ||\n isValidatedEnvBoundary(filename, context.sourceCode.text)\n ) {\n return {};\n }\n return {\n MemberExpression(node: TSESTree.MemberExpression): void {\n if (\n (isProcessEnv(node) || isImportMetaEnv(node)) &&\n !isExemptVariableAccess(node) &&\n !isWriteTarget(node) &&\n !isWholeEnvSpread(node)\n ) {\n context.report({\n node,\n messageId: \"noRawEnv\",\n });\n }\n },\n };\n },\n});\n","/**\n * @fileoverview no-raw-fetch-outside-clients — a bare `fetch` outside the client layer opts out of retry, timeout and status handling, and cannot be stubbed.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-raw-fetch-outside-clients.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-raw-fetch-outside-clients.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"rawFetch\";\n\nexport interface RuleOptions {\n /** Regular-expression sources matched against the filename. */\n readonly allow?: readonly string[];\n}\n\ntype Options = readonly [RuleOptions?];\n\n/**\n * Path shapes that legitimately own outbound HTTP. Written as regex sources\n * (not globs) so they can express both path separators.\n *\n * Test files are NOT in this list — they are handled unconditionally by\n * `isTestFile`, so overriding `allow` cannot accidentally un-exempt them.\n */\nconst DEFAULT_ALLOW: readonly string[] = [\n \"[\\\\\\\\/]clients?[\\\\\\\\/]\",\n \"-client\\\\.[cm]?[jt]sx?$\",\n \"[\\\\\\\\/]http-client\\\\.[cm]?[jt]sx?$\",\n // The `api` spelling of the same client-layer convention: an `api/` directory,\n // a bare `api.ts`, or a `*-api.ts` / `*.api.ts` module.\n \"[\\\\\\\\/]api[\\\\\\\\/]\",\n \"[\\\\\\\\/]api\\\\.[cm]?[jt]sx?$\",\n \"[-.]api\\\\.[cm]?[jt]sx?$\",\n \"[\\\\\\\\/]services?[\\\\\\\\/]\",\n \"[\\\\\\\\/](connectors|providers|integrations|adapters|fetchers)[\\\\\\\\/]\",\n \"[\\\\\\\\/]notifications[\\\\\\\\/]\",\n \"[Ss]ervice\\\\.[cm]?[jt]sx?$\",\n \"-(service|connector|adapter|sdk|fetcher)\\\\.[cm]?[jt]sx?$\",\n];\n\n/**\n * Non-production trees the shared `isTestFile` predicate does not spell:\n * Playwright/Cypress suites and their helpers, and jscodeshift's input/output\n * fixtures (text a codemod transforms, not code that runs).\n */\nconst NON_PRODUCTION_TREE_RE =\n /[\\\\/](playwright|cypress|__testfixtures__)[\\\\/]/;\n\n/** Receivers on which `.fetch()` is the global, not some cache/query API. */\nconst GLOBAL_RECEIVERS: ReadonlySet<string> = new Set([\n \"globalThis\",\n \"window\",\n \"self\",\n]);\n\nconst PRESIGNED_URL_NAME_RE = /(?:pre-?signed|signed|upload|download)Url$/i;\n\n/** True when `node` is a call to the global `fetch`. */\nfunction isGlobalFetchCall(node: TSESTree.CallExpression): boolean {\n const callee = node.callee;\n\n if (callee.type === \"Identifier\") {\n return callee.name === \"fetch\";\n }\n\n if (\n callee.type === \"MemberExpression\" &&\n !callee.computed &&\n callee.property.type === \"Identifier\" &&\n callee.property.name === \"fetch\" &&\n callee.object.type === \"Identifier\"\n ) {\n return GLOBAL_RECEIVERS.has(callee.object.name);\n }\n\n return false;\n}\n\nfunction identifierLikeName(node: TSESTree.Node): string | null {\n if (node.type === \"Identifier\") {\n return node.name;\n }\n if (\n node.type === \"MemberExpression\" &&\n !node.computed &&\n node.property.type === \"Identifier\"\n ) {\n return node.property.name;\n }\n return null;\n}\n\n/** True for a lone `fetch(new URL(...))` / `fetch(new Request(...))`. */\nfunction isConstructedArgumentHandoff(node: TSESTree.CallExpression): boolean {\n const [first] = node.arguments;\n return (\n node.arguments.length === 1 &&\n first !== undefined &&\n first.type === AST_NODE_TYPES.NewExpression\n );\n}\n\nfunction isPresignedUrlTransfer(node: TSESTree.CallExpression): boolean {\n const first = node.arguments[0];\n if (first === undefined) {\n return false;\n }\n const name = identifierLikeName(first);\n return name !== null && PRESIGNED_URL_NAME_RE.test(name);\n}\n\n/**\n * Compile the configured patterns once per file. An invalid pattern is skipped\n * rather than thrown: a bad `allow` entry should not take the whole lint run\n * down, and the rule failing closed (still reporting) is the safe direction.\n */\nfunction compile(patterns: readonly string[]): RegExp[] {\n const compiled: RegExp[] = [];\n for (const pattern of patterns) {\n try {\n compiled.push(new RegExp(pattern));\n } catch {\n // Skip the malformed entry; the remaining patterns still apply.\n }\n }\n return compiled;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-raw-fetch-outside-clients\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow calling the global `fetch` outside the client layer; route outbound HTTP through a client module that owns retry, timeout and status handling.\",\n },\n schema: [\n {\n type: \"object\",\n properties: {\n allow: {\n type: \"array\",\n items: { type: \"string\" },\n description:\n \"Regular-expression sources matched against the filename. Replaces the defaults.\",\n },\n },\n additionalProperties: false,\n },\n ],\n messages: {\n rawFetch:\n \"Raw `fetch()` outside a client module. Route the call through a client (e.g. `clients/*-client.ts`) so it inherits retry, timeout and status handling and stays stubbable in tests.\",\n },\n },\n defaultOptions: [{}],\n create(context, [options]) {\n const filename = context.filename;\n\n if (isTestFile(filename) || NON_PRODUCTION_TREE_RE.test(filename)) {\n return {};\n }\n\n const patterns = options?.allow ?? DEFAULT_ALLOW;\n const allowed = compile(patterns);\n\n if (allowed.some((re) => re.test(filename))) {\n return {};\n }\n\n return {\n CallExpression(node: TSESTree.CallExpression): void {\n if (isPresignedUrlTransfer(node) || isConstructedArgumentHandoff(node)) {\n return;\n }\n if (isGlobalFetchCall(node)) {\n context.report({ node, messageId: \"rawFetch\" });\n }\n },\n };\n },\n});\n","/**\n * @fileoverview no-repeated-string-literal — the same structured literal in two functions drifts the moment one copy is edited.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-repeated-string-literal.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-repeated-string-literal.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"noRepeatedStringLiteral\";\ntype Options = readonly [];\n\nconst MIN_LENGTH = 40;\nconst MIN_DISTINCT_SCOPES = 2;\nconst PREVIEW_LENGTH = 40;\n\n/** Case-sensitive on purpose: uppercase keywords mean SQL, lowercase means prose. */\nconst SQL_KEYWORD_RE =\n /\\b(SELECT|INSERT|UPDATE|DELETE|FROM|WHERE|JOIN|VALUES|ON CONFLICT|RETURNING|GROUP BY|ORDER BY)\\b/;\nconst IDENTIFIER_RE = /^[a-z_][a-z0-9_.]*$/;\n\nconst FUNCTION_TYPES: ReadonlySet<AST_NODE_TYPES> = new Set([\n AST_NODE_TYPES.FunctionDeclaration,\n AST_NODE_TYPES.FunctionExpression,\n AST_NODE_TYPES.ArrowFunctionExpression,\n]);\n\n/** True when the literal carries structure that rules out coincidental equality. */\nfunction isStructured(value: string): boolean {\n return value.includes(\"\\n\") || SQL_KEYWORD_RE.test(value) || IDENTIFIER_RE.test(value);\n}\n\nfunction preview(value: string): string {\n const oneLine = value.replaceAll(\"\\n\", \" \").trim();\n return oneLine.length <= PREVIEW_LENGTH ? oneLine : `${oneLine.slice(0, PREVIEW_LENGTH)}...`;\n}\n\n/** The enclosing function node, or null when the literal sits at module/class scope. */\nfunction enclosingFunction(node: TSESTree.Node): TSESTree.Node | null {\n for (let current = node.parent; current != null; current = current.parent) {\n if (FUNCTION_TYPES.has(current.type)) {\n return current;\n }\n }\n return null;\n}\n\n/**\n * True when the literal is scaffolding rather than a reusable value: an\n * import/`require` source (repeating a module path is the point) or a JSX\n * attribute value (styling strings, handled by the styling rules).\n */\nfunction isScaffolding(node: TSESTree.Node): boolean {\n const parent = node.parent;\n if (parent === undefined) {\n return true;\n }\n return (\n parent.type === AST_NODE_TYPES.ImportDeclaration ||\n parent.type === AST_NODE_TYPES.ExportNamedDeclaration ||\n parent.type === AST_NODE_TYPES.ExportAllDeclaration ||\n parent.type === AST_NODE_TYPES.TSImportType ||\n parent.type === AST_NODE_TYPES.JSXAttribute ||\n parent.type === AST_NODE_TYPES.TSLiteralType\n );\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-repeated-string-literal\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Disallow a long structured string literal repeated across functions; the copies drift when one is edited. Extract a module-level constant.\",\n },\n schema: [],\n messages: {\n noRepeatedStringLiteral:\n 'Structured string literal \"{{preview}}\" is repeated across functions (first use on line {{line}}) — extract a module-level constant so the copies cannot drift.',\n },\n },\n defaultOptions: [],\n create(context) {\n if (isTestFile(context.filename)) {\n return {};\n }\n const occurrences = new Map<string, TSESTree.Node[]>();\n const scopes = new WeakMap<TSESTree.Node, TSESTree.Node | null>();\n\n const record = (value: string, node: TSESTree.Node): void => {\n if (value.length < MIN_LENGTH || !isStructured(value) || isScaffolding(node)) {\n return;\n }\n const existing = occurrences.get(value);\n if (existing === undefined) {\n occurrences.set(value, [node]);\n } else {\n existing.push(node);\n }\n scopes.set(node, enclosingFunction(node));\n };\n\n return {\n Literal(node: TSESTree.Literal): void {\n if (typeof node.value === \"string\") {\n record(node.value, node);\n }\n },\n TemplateLiteral(node: TSESTree.TemplateLiteral): void {\n // A tagged template (`js`…``, `css`…``, `sql`…``) is a call, not a\n // string value — the tag, not this rule, decides what the text means.\n if (node.parent.type === AST_NODE_TYPES.TaggedTemplateExpression) {\n return;\n }\n const [only] = node.quasis;\n if (node.expressions.length === 0 && only !== undefined) {\n record(only.value.cooked ?? only.value.raw, node);\n }\n },\n \"Program:exit\": (): void => {\n for (const [value, nodes] of occurrences) {\n const distinctScopes = new Set(\n nodes.map((node) => scopes.get(node)).filter((scope) => scope != null),\n );\n if (distinctScopes.size < MIN_DISTINCT_SCOPES) {\n continue;\n }\n const [first, ...repeats] = nodes;\n if (first === undefined) {\n continue;\n }\n for (const node of repeats) {\n context.report({\n node,\n messageId: \"noRepeatedStringLiteral\",\n data: { preview: preview(value), line: String(first.loc.start.line) },\n });\n }\n }\n },\n };\n },\n});\n","/**\n * @fileoverview no-restated-comment — a comment whose every content word is already on the line below can only go out of date silently.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-restated-comment.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-restated-comment.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport {\n codeTokens,\n contentTokens,\n isProtected,\n restatableStatementBelow,\n restates,\n restatesStatementHead,\n} from \"./_comments.js\";\nimport { createRule } from \"./_docs.js\";\nimport { isGeneratedFile } from \"./_paths.js\";\n\ntype MessageIds = \"restatesLineBelow\";\ntype Options = readonly [];\n\nconst MAX_WORDS = 8;\nconst MIN_CONTENT_TOKENS = 2;\n\nconst DIRECTIVE_RE =\n /^(eslint\\b|eslint-|sarj-noqa\\b|@ts-|prettier-ignore|prettier\\b|biome-|c8\\b|v8\\b|istanbul\\b|@type\\b|@vite|webpack|<reference|<amd|global\\b|noinspection|todo\\b|fixme\\b|hack\\b|xxx\\b)/i;\n\n// Commented-out code and section banners belong to `no-comment-cruft`.\nconst CODEY_RE = /^[\\w.$[\\]'\"]+\\s*[:=]\\s*\\S|^[\\w.$]+\\s*\\(|^(?:return|throw|await|import|export|const|let|var)\\b.*[=()[\\]{}]/;\nconst BANNERISH_RE = /[=\\-─-╿*#~_.]{3,}|^[A-Z0-9 _:-]+$/;\n\nconst MODALITY_RE = /\\b(?:can|could|should|shall|may|might|must|will|would|cannot)\\b/i;\nconst LEAD_IN_RE = /:$/;\nconst EMPHASIS_RE = /\\*\\w[^*]*\\*|`[^`]+`/;\nconst NEGATION_WORD_RE = /\\b(?:no|not|never|neither|nor|without|none|non)\\b/i;\n\nconst ACTION_STMT_RE = /[\\w.$\\])]\\s*\\(|^\\s*(?:return|throw|await|yield)\\b/;\n\nconst NON_ASCII_LETTER_RE = /[^\\p{ASCII}\\p{N}\\p{P}\\p{Z}]/u;\n\n/** True when `a` and `b` are `//` comments on consecutive lines. */\nfunction areAdjacentLineComments(\n a: TSESTree.Comment | undefined,\n b: TSESTree.Comment | undefined,\n): boolean {\n return (\n a !== undefined &&\n b !== undefined &&\n a.type === \"Line\" &&\n b.type === \"Line\" &&\n b.loc.start.line === a.loc.end.line + 1\n );\n}\n\n/**\n * True when the statement below the comment heads a run of siblings of the same\n * kind — `// register secrets` over eight `registerSecret(…)` calls. The label\n * provides the grouping, and deleting it loses that.\n */\nfunction headsSiblingRun(node: TSESTree.Node): boolean {\n const parent = node.parent;\n if (parent === undefined) return false;\n const body: readonly TSESTree.Node[] | undefined =\n \"body\" in parent && Array.isArray(parent.body)\n ? (parent.body as readonly TSESTree.Node[])\n : undefined;\n if (body === undefined) return false;\n const index = body.indexOf(node);\n const next = index >= 0 ? body[index + 1] : undefined;\n return next !== undefined && next.type === node.type;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-restated-comment\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Flag a single-line comment whose every word already appears on the statement below it.\",\n },\n schema: [],\n messages: {\n restatesLineBelow:\n \"Comment restates the statement below it — delete it, or replace it with the *why*; the code already carries the *what*.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (isGeneratedFile(context.filename, context.sourceCode.text)) {\n return {};\n }\n const sourceCode = context.sourceCode;\n const lines = sourceCode.lines;\n\n function isStandalone(comment: TSESTree.Comment): boolean {\n const before = sourceCode.getTokenBefore(comment, { includeComments: false });\n return !before || before.loc.end.line < comment.loc.start.line;\n }\n\n function labelsASiblingRun(comment: TSESTree.Comment): boolean {\n const token = sourceCode.getTokenAfter(comment, { includeComments: false });\n if (token === null) return false;\n for (\n let node: TSESTree.Node | undefined | null = sourceCode.getNodeByRangeIndex(token.range[0]);\n node != null && node.type !== AST_NODE_TYPES.Program;\n node = node.parent\n ) {\n if (headsSiblingRun(node)) return true;\n }\n return false;\n }\n\n return {\n Program(): void {\n const comments = sourceCode.getAllComments();\n for (let i = 0; i < comments.length; i++) {\n const comment = comments[i];\n if (comment === undefined || comment.type !== \"Line\") continue;\n if (!isStandalone(comment)) continue;\n if (\n areAdjacentLineComments(comments[i - 1], comment) ||\n areAdjacentLineComments(comment, comments[i + 1])\n ) {\n continue; // one line of a paragraph, not a label for the next statement\n }\n const body = comment.value.replace(/^\\/*/, \"\").trim();\n if (body.length === 0 || body.endsWith(\"?\")) continue;\n if (DIRECTIVE_RE.test(body) || CODEY_RE.test(body) || BANNERISH_RE.test(body)) continue;\n if (NON_ASCII_LETTER_RE.test(body) || isProtected(body)) continue;\n if (MODALITY_RE.test(body) || LEAD_IN_RE.test(body) || EMPHASIS_RE.test(body)) continue;\n if (NEGATION_WORD_RE.test(body)) continue;\n if (body.split(/\\s+/).length > MAX_WORDS) continue;\n\n const tokens = contentTokens(body);\n if (tokens.length < MIN_CONTENT_TOKENS) continue;\n\n const statement = restatableStatementBelow(comment, sourceCode);\n if (statement === null) continue;\n if (restatesStatementHead(body, statement)) continue; // `no-comment-cruft` owns it\n\n const line = lines[comment.loc.start.line] ?? \"\";\n if (!ACTION_STMT_RE.test(line)) continue;\n\n if (labelsASiblingRun(comment)) continue;\n\n if (restates(tokens, codeTokens(line))) {\n context.report({ node: comment, messageId: \"restatesLineBelow\" });\n }\n }\n },\n };\n },\n});\n","/**\n * @fileoverview no-restated-jsdoc — a JSDoc block whose every word is already in the signature costs three lines and a review and says nothing.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-restated-jsdoc.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-restated-jsdoc.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isProtected, splitIdentifier, stem } from \"./_comments.js\";\nimport { isGeneratedFile } from \"./_paths.js\";\n\ntype MessageIds = \"restatesSignature\" | \"deleteBlock\";\ntype Options = readonly [];\n\n// Tags this rule models and can therefore judge. Anything else means the block\n// is doing something the rule does not understand, so it is left alone — which\n// includes every value-carrying tag (`@see`, `@example`, `@deprecated`,\n// `@throws`, …). A separate allowlist of those used to sit above this one; it\n// could be emptied with the whole suite green, because being outside this set\n// is already sufficient and the two sets were disjoint.\nconst MODELLED_TAGS: ReadonlySet<string> = new Set([\n \"arg\", \"argument\", \"async\", \"description\", \"param\", \"return\", \"returns\",\n]);\n\nconst PARAM_TAGS: ReadonlySet<string> = new Set([\"arg\", \"argument\", \"param\"]);\nconst RETURN_TAGS: ReadonlySet<string> = new Set([\"return\", \"returns\"]);\n\nconst DIRECTIVE_RE = /^\\s*(?:eslint\\b|eslint-|@ts-|prettier|biome-|c8\\b|v8\\b|istanbul\\b|@vite|webpack|@jsx|@jest-environment|@vitest-environment|#__)/i;\n\n// Prose filler that says nothing about *which* thing is being described. Wider\n// than the comment tokenizer's list because JSDoc conventionally repeats the\n// vocabulary of the type system itself (\"the callback prop\", \"an optional\n// string\") without that being a claim about this declaration.\nconst STOPWORDS: ReadonlySet<string> = new Set(\n `the a an of to for in on with and or as at by is are was be been being\n this that it its if whether when where which what will would can could should\n must may into from over about not no does do done has have had used use uses\n using given provided specified current new existing all any each per via based\n function method component hook class instance object value values data item\n items element callback handler prop props param parameter argument arg return\n returns returning result optional required default true false null undefined\n string number boolean array list promise`.split(/\\s+/),\n);\n\nconst WORD_RE = /[A-Za-z]+/g;\n\ninterface JsDocTag {\n readonly name: string;\n readonly text: string;\n}\n\n/** Split a JSDoc block into its free description and its tags. */\nfunction parseJsDoc(value: string): { description: string; tags: JsDocTag[] } {\n const lines = value.replace(/^\\*/, \"\").split(\"\\n\").map((line) => line.replace(/^\\s*\\*?\\s?/, \"\"));\n const description: string[] = [];\n const tags: { name: string; text: string }[] = [];\n let current: { name: string; text: string } | null = null;\n for (const line of lines) {\n const match = /^\\s*@(\\w[\\w-]*)\\s*(.*)$/.exec(line);\n if (match) {\n current = { name: (match[1] ?? \"\").toLowerCase(), text: match[2] ?? \"\" };\n tags.push(current);\n } else if (current !== null) {\n current.text += ` ${line.trim()}`;\n } else {\n description.push(line);\n }\n }\n return { description: description.join(\"\\n\").trim(), tags };\n}\n\n/** Every content word of `text`, lowercased, with filler dropped. */\nfunction proseTokens(text: string): string[] {\n return (text.match(WORD_RE) ?? [])\n .map((word) => word.toLowerCase())\n .filter((word) => word.length > 1 && !STOPWORDS.has(word));\n}\n\n/** True when every content word of `text` already appears in `known`. */\nfunction covered(text: string, known: ReadonlySet<string>): boolean {\n const stems = new Set<string>();\n for (const token of known) stems.add(stem(token));\n return proseTokens(text).every((word) => known.has(word) || stems.has(stem(word)));\n}\n\n/** The declared name and parameter names of the node a JSDoc block sits above. */\nfunction declarationNames(node: TSESTree.Node): { name: string; params: string[] } | null {\n switch (node.type) {\n // `export function f()` — the JSDoc sits above the `export`, so the token\n // after it resolves to the wrapper, not to the thing being documented.\n case AST_NODE_TYPES.ExportNamedDeclaration:\n case AST_NODE_TYPES.ExportDefaultDeclaration:\n return node.declaration == null ? null : declarationNames(node.declaration);\n case AST_NODE_TYPES.FunctionDeclaration:\n case AST_NODE_TYPES.TSDeclareFunction:\n return node.id === null ? null : { name: node.id.name, params: paramNames(node.params) };\n case AST_NODE_TYPES.ClassDeclaration:\n case AST_NODE_TYPES.TSInterfaceDeclaration:\n case AST_NODE_TYPES.TSTypeAliasDeclaration:\n case AST_NODE_TYPES.TSEnumDeclaration:\n return node.id === null ? null : { name: node.id.name, params: [] };\n case AST_NODE_TYPES.VariableDeclaration: {\n const declarator = node.declarations[0];\n if (declarator === undefined || declarator.id.type !== AST_NODE_TYPES.Identifier) return null;\n const init = declarator.init;\n const params =\n init != null &&\n (init.type === AST_NODE_TYPES.ArrowFunctionExpression ||\n init.type === AST_NODE_TYPES.FunctionExpression)\n ? paramNames(init.params)\n : [];\n return { name: declarator.id.name, params };\n }\n case AST_NODE_TYPES.MethodDefinition:\n case AST_NODE_TYPES.PropertyDefinition:\n case AST_NODE_TYPES.TSMethodSignature:\n case AST_NODE_TYPES.TSPropertySignature: {\n if (node.key.type !== AST_NODE_TYPES.Identifier) return null;\n const params =\n node.type === AST_NODE_TYPES.MethodDefinition\n ? paramNames(node.value.params)\n : node.type === AST_NODE_TYPES.TSMethodSignature\n ? paramNames(node.params)\n : [];\n return { name: node.key.name, params };\n }\n default:\n return null;\n }\n}\n\nfunction paramNames(params: readonly TSESTree.Parameter[]): string[] {\n const names: string[] = [];\n for (const param of params) {\n const target = param.type === AST_NODE_TYPES.AssignmentPattern ? param.left : param;\n if (target.type === AST_NODE_TYPES.Identifier) names.push(target.name);\n else if (target.type === AST_NODE_TYPES.TSParameterProperty) continue;\n }\n return names;\n}\n\nfunction tokensOf(names: readonly string[]): Set<string> {\n const tokens = new Set<string>();\n for (const name of names) for (const part of splitIdentifier(name)) tokens.add(part);\n return tokens;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-restated-jsdoc\",\n meta: {\n type: \"suggestion\",\n hasSuggestions: true,\n docs: {\n description:\n \"Flag a JSDoc block whose description and tags only re-spell the signature they document.\",\n },\n schema: [],\n messages: {\n restatesSignature:\n \"JSDoc only re-spells the signature — delete it, or say what the caller cannot read off the name (what it throws, what it assumes, why it exists).\",\n deleteBlock: \"Delete the JSDoc block.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (isGeneratedFile(context.filename, context.sourceCode.text)) {\n return {};\n }\n const sourceCode = context.sourceCode;\n\n return {\n Program(): void {\n for (const comment of sourceCode.getAllComments()) {\n if (comment.type !== \"Block\" || !comment.value.startsWith(\"*\")) continue;\n const { description, tags } = parseJsDoc(comment.value);\n if (DIRECTIVE_RE.test(description)) continue;\n const tagNames = new Set(tags.map((tag) => tag.name));\n if ([...tagNames].some((name) => !MODELLED_TAGS.has(name))) continue;\n if (isProtected(description)) continue;\n\n const token = sourceCode.getTokenAfter(comment, { includeComments: false });\n if (token === null || token.loc.start.line !== comment.loc.end.line + 1) continue;\n let node = sourceCode.getNodeByRangeIndex(token.range[0]);\n let declaration: { name: string; params: string[] } | null = null;\n while (node != null && node.type !== AST_NODE_TYPES.Program) {\n declaration = declarationNames(node);\n if (declaration !== null) break;\n node = node.parent ?? null;\n }\n if (declaration === null) continue;\n\n const paramTags = tags.filter((tag) => PARAM_TAGS.has(tag.name));\n const returnTags = tags.filter((tag) => RETURN_TAGS.has(tag.name));\n if (description.length === 0 && paramTags.length === 0 && returnTags.length === 0) {\n continue;\n }\n\n const nameTokens = tokensOf([declaration.name]);\n const paramTokens = tokensOf(declaration.params);\n const known = new Set([...nameTokens, ...paramTokens]);\n\n let addsNothing = covered(description, known);\n for (const tag of paramTags) {\n const text = tag.text.replace(/^\\{[^}]*\\}\\s*/, \"\");\n const match = /^\\[?([A-Za-z_$][\\w.$]*)\\]?\\s*-?\\s*([\\s\\S]*)$/.exec(text);\n if (match === null) {\n addsNothing = false;\n break;\n }\n const own = new Set([...splitIdentifier(match[1]?.split(\".\").pop() ?? \"\"), ...nameTokens]);\n if (!covered(match[2] ?? \"\", own)) {\n addsNothing = false;\n break;\n }\n for (const part of splitIdentifier(match[1]?.split(\".\").pop() ?? \"\")) known.add(part);\n }\n if (addsNothing) {\n for (const tag of returnTags) {\n if (!covered(tag.text.replace(/^\\{[^}]*\\}\\s*/, \"\"), known)) {\n addsNothing = false;\n break;\n }\n }\n }\n if (!addsNothing) continue;\n\n context.report({\n node: comment,\n messageId: \"restatesSignature\",\n suggest: [\n {\n messageId: \"deleteBlock\",\n fix: (fixer) => fixer.removeRange([comment.range[0], token.range[0]]),\n },\n ],\n });\n }\n },\n };\n },\n});\n","/**\n * @fileoverview no-secret-in-log — a secret passed to a logging call persists in log sinks far beyond its intended lifetime.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-secret-in-log.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-secret-in-log.md\n */\n\nimport { type TSESTree } from \"@typescript-eslint/utils\";\n\nimport {\n createLogMatcher,\n LOGGING_OPTION_PROPERTIES,\n type LoggingOptions,\n} from \"./_logging.js\";\nimport { createRule } from \"./_docs.js\";\nimport { isTestFile } from \"./_paths.js\";\nimport {\n FLAG_PREFIXES,\n INNOCUOUS_WORDS,\n isSecretName,\n leadingWord,\n tokenize,\n} from \"./_secret-names.js\";\n\ntype MessageIds = \"noSecretInLog\" | \"noRawBodyInLog\";\ntype Options = readonly [LoggingOptions?];\n\n/**\n * The shared metadata set plus the log-specific extras. Logging a secret's\n * label, expiry, ARN, URL, scope, or the DI component that holds it is metadata\n * ABOUT the credential, never the credential bytes, so it must not fire here —\n * `prefer-constant-time-secret-compare` uses the narrower shared set.\n */\nconst LOG_INNOCUOUS_WORDS: ReadonlySet<string> = new Set([\n ...INNOCUOUS_WORDS,\n \"name\",\n \"names\",\n \"label\",\n \"labels\",\n \"title\",\n \"expiry\",\n \"expiration\",\n \"expires\",\n \"ttl\",\n \"version\",\n \"versions\",\n \"policy\",\n \"rotation\",\n \"arn\",\n \"path\",\n \"paths\",\n \"issuer\",\n \"audience\",\n \"strength\",\n \"manager\",\n \"service\",\n \"services\",\n \"repository\",\n \"provider\",\n \"providers\",\n \"store\",\n \"factory\",\n \"handler\",\n \"controller\",\n \"bucket\",\n \"url\",\n \"uri\",\n \"endpoint\",\n \"endpoints\",\n \"scope\",\n \"scopes\",\n \"event\",\n \"events\",\n \"format\",\n \"at\",\n \"len\",\n \"length\",\n]);\n\nconst REDACTION_RE = /prefix|suffix|redact|mask|hash|hint|_len|length/i;\nconst WHOLE_TOKEN_REDACTION_MARKERS: ReadonlySet<string> = new Set([\"tag\"]);\n\n/** True if the name names a raw secret and is not a redacted derivative. */\nfunction isSecretKeyword(name: string): boolean {\n if (REDACTION_RE.test(name)) {\n return false;\n }\n if (tokenize(name).some((tok) => WHOLE_TOKEN_REDACTION_MARKERS.has(tok))) {\n return false;\n }\n return isSecretName(name, LOG_INNOCUOUS_WORDS);\n}\n\n/**\n * True if `prop`'s value is the raw secret rather than a redacted/derived form.\n * Shorthand (`{ token }`), a bare identifier (`{ apiKey: theKey }`), or a plain\n * member access (`{ apiKey: config.apiKey }`) all carry the secret verbatim. A\n * call (`token.slice(0, 6)`, `mask(token)`), template literal, ternary, concat,\n * or literal placeholder (`\"***\"`) is already redacted — logging it is safe.\n */\nfunction isRawSecretValue(prop: TSESTree.Property): boolean {\n if (prop.shorthand) {\n return true;\n }\n return prop.value.type === \"Identifier\" || prop.value.type === \"MemberExpression\";\n}\n\n/**\n * Trailing camel/snake words that name an un-redacted request/response blob. Kept\n * to an enumerated five: these are the containers whose *whole point* is \"the\n * bytes the client sent / the server returned\". Generic container words (`data`,\n * `input`, `args`, `event`, `result`, `payloadless` domain objects) are excluded\n * on purpose — see the `@fileoverview`.\n */\nconst RAW_BLOB_WORDS: ReadonlySet<string> = new Set([\n \"body\",\n \"bodies\",\n \"payload\",\n \"payloads\",\n \"params\",\n]);\n\n/**\n * Whole identifiers whose camelCase split ends in a word too generic to enumerate\n * (`formData` -> `data`) but which name a blob unambiguously on their own.\n */\nconst RAW_BLOB_IDENTIFIERS: ReadonlySet<string> = new Set([\"formdata\"]);\n\n/**\n * Substrings that mark a blob name as an already-derived, safe-to-log form:\n * `redactedBody`, `sanitizedPayload`, `truncatedBody`, `bodyPreview`.\n */\nconst BLOB_REDACTION_RE = /redact|sanit|scrub|mask|truncat|anonym|filtered|preview|summar/i;\n\n/**\n * Derivation markers that are only safe when matched as a WHOLE token — `safe` as\n * a substring would wrongly exempt `unsafeBody`.\n */\nconst BLOB_REDACTION_TOKENS: ReadonlySet<string> = new Set([\n \"safe\",\n \"clean\",\n \"shape\",\n \"keys\",\n \"public\",\n]);\n\n/** True if the name names a raw request/response blob and is not a derived form. */\nfunction isRawBlobName(name: string): boolean {\n if (REDACTION_RE.test(name) || BLOB_REDACTION_RE.test(name)) {\n return false;\n }\n const tokens = tokenize(name);\n if (tokens.some((tok) => BLOB_REDACTION_TOKENS.has(tok))) {\n return false;\n }\n // Same leading boolean-predicate words the secret arm uses: `hasBody` answers\n // \"is there one?\", it is not the blob.\n const first = leadingWord(name);\n if (first !== undefined && FLAG_PREFIXES.has(first)) {\n return false;\n }\n if (RAW_BLOB_IDENTIFIERS.has(name.toLowerCase())) {\n return true;\n }\n const last = tokens.at(-1);\n return last !== undefined && RAW_BLOB_WORDS.has(last);\n}\n\n/**\n * The blob name a logged value carries VERBATIM, or null when it does not carry\n * one. A bare identifier is the whole object; a non-computed member access is\n * judged by its PROPERTY, so `res.body` is the blob but `body.id` is a picked\n * field. Every other shape — call, template, literal, ternary, spread — has\n * already been through the author's hands and is left alone.\n */\nfunction rawBlobValueName(value: TSESTree.Node): string | null {\n if (value.type === \"Identifier\") {\n return isRawBlobName(value.name) ? value.name : null;\n }\n if (\n value.type === \"MemberExpression\" &&\n !value.computed &&\n value.property.type === \"Identifier\"\n ) {\n return isRawBlobName(value.property.name) ? value.property.name : null;\n }\n return null;\n}\n\n/** The static string name of an object-property key, or null when not statically named. */\nfunction propertyKeyName(prop: TSESTree.Property): string | null {\n if (prop.computed) {\n return null;\n }\n if (prop.key.type === \"Identifier\") {\n return prop.key.name;\n }\n if (prop.key.type === \"Literal\" && typeof prop.key.value === \"string\") {\n return prop.key.value;\n }\n return null;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-secret-in-log\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow passing a secret-named value or a raw request/response blob to a logging call; both leak to log sinks. Redact or omit.\",\n },\n schema: [\n {\n type: \"object\",\n additionalProperties: false,\n properties: { ...LOGGING_OPTION_PROPERTIES },\n },\n ],\n messages: {\n noSecretInLog:\n \"Secret `{{name}}` passed to a logging call leaks it to log sinks. Redact (e.g. `{{name}}Prefix: {{name}}.slice(0, 6)`) or omit it.\",\n noRawBodyInLog:\n \"Raw `{{name}}` passed to a logging call. Request/response blobs carry PII and often echo credentials back, and log sinks have no retention policy. Log a derived value instead (a status, `{{name}}.id`, a length, a truncated issue list) or pass it through a redactor (`redact({{name}})`).\",\n },\n },\n defaultOptions: [{}],\n create(context, [loggingOptions]) {\n const matcher = createLogMatcher(loggingOptions);\n // Bodies in a test file are fixtures the author wrote, not production PII.\n const blobArmApplies = !isTestFile(context.filename);\n\n /** Reports a bare positional argument that IS the secret. Did it fire? */\n function reportSecretArgument(arg: TSESTree.Node): boolean {\n const name =\n arg.type === \"Identifier\"\n ? arg.name\n : arg.type === \"MemberExpression\" &&\n !arg.computed &&\n arg.property.type === \"Identifier\"\n ? arg.property.name\n : null;\n if (name === null || !isSecretKeyword(name)) {\n return false;\n }\n context.report({ node: arg, messageId: \"noSecretInLog\", data: { name } });\n return true;\n }\n\n /** Reports a meta-object property whose key names a secret it carries raw. Did it fire? */\n function reportSecretProperty(prop: TSESTree.Property): boolean {\n const keyName = propertyKeyName(prop);\n if (keyName === null || !isSecretKeyword(keyName) || !isRawSecretValue(prop)) {\n return false;\n }\n context.report({ node: prop, messageId: \"noSecretInLog\", data: { name: keyName } });\n return true;\n }\n\n /** Reports `node` when `value` carries an un-redacted request/response blob. */\n function reportRawBlob(node: TSESTree.Node, value: TSESTree.Node): void {\n if (!blobArmApplies) {\n return;\n }\n const name = rawBlobValueName(value);\n if (name !== null) {\n context.report({ node, messageId: \"noRawBodyInLog\", data: { name } });\n }\n }\n\n return {\n CallExpression(node: TSESTree.CallExpression): void {\n if (!matcher.isLoggingCall(node)) {\n return;\n }\n\n for (const arg of node.arguments) {\n if (arg.type === \"ObjectExpression\") {\n for (const prop of arg.properties) {\n if (prop.type !== \"Property\") {\n continue;\n }\n if (!reportSecretProperty(prop)) {\n reportRawBlob(prop, prop.value);\n }\n }\n continue;\n }\n if (!reportSecretArgument(arg)) {\n reportRawBlob(arg, arg);\n }\n }\n },\n };\n },\n});\n","/**\n * @fileoverview _secret-names — shared predicate for whether an identifier names secret material, rather than merely embedding a secret word.\n *\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/_secret-names.md\n */\n\nexport const SECRET_WORDS: ReadonlySet<string> = new Set([\n \"token\",\n \"secret\",\n \"password\",\n \"passwd\",\n \"jwt\",\n \"secrets\",\n \"passwords\",\n \"credential\",\n \"credentials\",\n \"authorization\",\n \"signature\",\n \"hmac\",\n \"digest\",\n \"hash\",\n \"apikey\",\n \"bearer\",\n]);\n\n/**\n * Tokens that mark a counter, row-id, feature flag, or boolean presence/state\n * marker. As the TRAILING token they mean the identifier is metadata *about* a\n * secret, not the secret itself, so it is not a leak / timing surface even when a\n * secret word is also present: `tokenPresent`, `passwordSet`, and\n * `passwordConfigured` are booleans, not credentials. Leading such a word does\n * not disqualify — `validToken` / `presentToken` are credentials.\n */\nexport const INNOCUOUS_WORDS: ReadonlySet<string> = new Set([\n \"count\",\n \"counts\",\n \"budget\",\n \"limit\",\n \"limits\",\n \"id\",\n \"ids\",\n \"enabled\",\n \"disabled\",\n \"flag\",\n \"flags\",\n \"present\",\n \"set\",\n \"unset\",\n \"configured\",\n \"missing\",\n \"required\",\n \"valid\",\n \"invalid\",\n \"exists\",\n \"type\",\n \"types\",\n]);\n\n/**\n * A trailing token that makes the identifier metadata *about* a secret — its\n * category, handle or label — rather than the credential: `tokenType`,\n * `tokenName`, `sessionId`, `credentialKind`. `type`/`id` are already dropped by\n * the shared innocuous set; `name`/`kind` are added here because logging them\n * can still matter (SARJ012) but they are never a timing surface.\n */\nconst DESCRIPTOR_WORDS: ReadonlySet<string> = new Set([\n \"type\",\n \"types\",\n \"name\",\n \"names\",\n \"id\",\n \"ids\",\n \"kind\",\n \"kinds\",\n]);\n\n/**\n * A `type`/`kind` token anywhere marks an enum/category discriminator, not a\n * credential: `TOKEN_TYPE_SYSTEM`, `credentialType`, `grantKind`.\n */\nconst CATEGORY_WORDS: ReadonlySet<string> = new Set([\"type\", \"types\", \"kind\", \"kinds\"]);\n\n\n/**\n * A leading boolean-predicate word marks a flag, not the credential itself:\n * `isToken`, `hasSecret`, `has_secret`, `isTokenStrategy`. Consulted by the\n * SHARED `isSecretName`, so every consumer gets it: this is the exact mirror of\n * the trailing innocuous-word check that already lives there — a boolean\n * answering \"does a secret exist?\" leaks nothing whether the marker leads or\n * trails, and word ORDER should not decide whether a name counts as a\n * credential. Matched as a whole leading WORD via `leadingWord`, never as a\n * character prefix, so `hash_secret` (`hash` != `has`), `issuer_token`\n * (`issuer` != `is`) and `canary_token` (`canary` != `can`) keep firing.\n */\nexport const FLAG_PREFIXES: ReadonlySet<string> = new Set([\n \"is\",\n \"has\",\n \"was\",\n \"are\",\n \"can\",\n \"should\",\n]);\n\n/**\n * Words that make an identifier a secret *only* via an integrity/content hash\n * (`contentHash`, `metadataHash`, `rowHash`) rather than an authenticator. A name\n * that ALSO carries one of these keeps firing (`passwordHash`, `tokenHash`,\n * `computedHmac`, `signature`): those gate access, a plain digest of content does\n * not.\n */\nconst AUTH_WORDS: ReadonlySet<string> = new Set([\n \"token\",\n \"secret\",\n \"secrets\",\n \"password\",\n \"passwd\",\n \"passwords\",\n \"jwt\",\n \"credential\",\n \"credentials\",\n \"authorization\",\n \"signature\",\n \"hmac\",\n \"apikey\",\n \"bearer\",\n]);\n\n/**\n * camelCase / PascalCase / ALLCAPS / digit-run splitter, applied to each\n * snake/kebab segment. `APIKey` -> [\"API\", \"Key\"], `authToken` -> [\"auth\", \"Token\"].\n */\nconst CAMEL_RE = /[A-Z]+(?=[A-Z][a-z])|[A-Z]?[a-z]+|[A-Z]+|\\d+/g;\nconst SEGMENT_RE = /[^A-Za-z0-9]+/;\n\n/**\n * Ordered lowercase tokens from snake_case + camelCase decomposition. Also\n * yields each whole snake/kebab segment lowercased, so a pathological mixed-case\n * single word like `ToKeN` (which camel-splitting shreds into `to`/`ke`/`n`)\n * still surfaces its intended `token` form.\n */\nexport function tokenize(identifier: string): string[] {\n const tokens: string[] = [];\n for (const segment of identifier.split(SEGMENT_RE)) {\n if (!segment) {\n continue;\n }\n tokens.push(segment.toLowerCase());\n for (const part of segment.match(CAMEL_RE) ?? []) {\n tokens.push(part.toLowerCase());\n }\n }\n return tokens;\n}\n\n/** The first *word* of an identifier, from camelCase splitting. */\nexport function leadingWord(identifier: string): string | undefined {\n for (const segment of identifier.split(SEGMENT_RE)) {\n if (segment) {\n return (segment.match(CAMEL_RE) ?? [segment])[0]?.toLowerCase();\n }\n }\n return undefined;\n}\n\n/** True if an `api` token is immediately followed by a `key` token (`api_key`). */\nexport function hasApiKey(tokens: readonly string[]): boolean {\n for (let i = 0; i + 1 < tokens.length; i++) {\n if (tokens[i] === \"api\" && tokens[i + 1] === \"key\") {\n return true;\n }\n }\n return false;\n}\n\n/**\n * True if `identifier` names raw secret material (a credential, not metadata).\n * `innocuous` defaults to the shared metadata set; callers that need a wider\n * exemption list (e.g. `no-secret-in-log`) pass their own superset.\n *\n * Two symmetric metadata guards run before the secret-word scan: a TRAILING\n * innocuous word (`tokenCount`, `apiKeyId`) and a LEADING boolean-predicate word\n * (`hasSecret`, `is_token`). Both describe a name that is *about* a credential\n * rather than being one.\n */\nexport function isSecretName(\n identifier: string,\n innocuous: ReadonlySet<string> = INNOCUOUS_WORDS,\n): boolean {\n const tokens = tokenize(identifier);\n const last = tokens.at(-1);\n if (last !== undefined && innocuous.has(last)) {\n return false;\n }\n const first = leadingWord(identifier);\n if (first !== undefined && FLAG_PREFIXES.has(first)) {\n return false;\n }\n if (tokens.some((tok) => SECRET_WORDS.has(tok))) {\n return true;\n }\n return hasApiKey(tokens);\n}\n\n/**\n * True if `identifier` names an *authenticator* — an access-gating secret whose\n * bytes an attacker could recover by timing a byte-wise comparison.\n */\nexport function isAuthSecretName(identifier: string): boolean {\n if (!isSecretName(identifier)) {\n return false;\n }\n const tokens = tokenize(identifier);\n const last = tokens.at(-1);\n if (last !== undefined && DESCRIPTOR_WORDS.has(last)) {\n return false;\n }\n if (tokens.some((tok) => CATEGORY_WORDS.has(tok))) {\n return false;\n }\n if (tokens.some((tok) => AUTH_WORDS.has(tok))) {\n return true;\n }\n return hasApiKey(tokens);\n}\n","/**\n * @fileoverview no-select-star — `SELECT *` over-fetches and leaves the row contract implicit, so a schema change breaks row parsing silently.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-select-star.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-select-star.md\n */\n\nimport { type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isTestFile } from \"./_paths.js\";\nimport { createSqlListener } from \"./_sql.js\";\n\ntype MessageIds = \"noSelectStar\";\ntype Options = readonly [];\n\n/** A real SQL query shape, so prose containing the bare word \"from\" isn't matched. */\nconst QUERY_SHAPE = /\\bSELECT\\b[\\s\\S]*?\\bFROM\\b/i;\nconst SELECT_KEYWORD = /\\bSELECT\\b/gi;\nconst FROM_KEYWORD = /^FROM\\b/i;\nconst EXISTS_BEFORE = /\\bEXISTS\\s*\\(\\s*$/i;\n/** A `word.` immediately preceding a `*` marks a qualified star (`c.*`, `main.runs.*`). */\nconst QUALIFIED_PREFIX = /\\w\\.$/;\n\nconst SELECT_GATE = /select/i;\n\n/**\n * True when the `*` at `pos` is a column-projection star.\n *\n * A projection star expands columns: bare (`SELECT *`, `id, *`) or qualified\n * (`c.*`). It is NOT a `COUNT(*)` argument (parenthesised on both sides) nor an\n * `a * b` multiply (an operand follows rather than a terminator).\n */\nfunction isProjectionStar(sql: string, pos: number): boolean {\n if (QUALIFIED_PREFIX.test(sql.slice(0, pos))) {\n return true;\n }\n let before = pos - 1;\n while (before >= 0 && /\\s/.test(sql[before] ?? \"\")) {\n before -= 1;\n }\n let after = pos + 1;\n while (after < sql.length && /\\s/.test(sql[after] ?? \"\")) {\n after += 1;\n }\n const beforeChar = before >= 0 ? (sql[before] ?? \"\") : \"\";\n const afterChar = after < sql.length ? (sql[after] ?? \"\") : \"\";\n const terminates =\n afterChar === \"\" || afterChar === \",\" || afterChar === \")\" || FROM_KEYWORD.test(sql.slice(after));\n if (!terminates) {\n return false;\n }\n return !(beforeChar === \"(\" && afterChar === \")\");\n}\n\n/** True when the query projects a star that is not inside an `EXISTS (...)` subquery. */\nfunction hasRealSelectStar(sql: string): boolean {\n const selects = [...sql.matchAll(SELECT_KEYWORD)].map((m) => m.index);\n for (let pos = 0; pos < sql.length; pos++) {\n if (sql[pos] !== \"*\" || !isProjectionStar(sql, pos)) {\n continue;\n }\n const owning = selects.filter((start) => start < pos).at(-1);\n if (owning !== undefined && !EXISTS_BEFORE.test(sql.slice(0, owning))) {\n return true;\n }\n }\n return false;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-select-star\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow SELECT * in embedded SQL; it over-fetches and leaves the row contract implicit, so a schema change breaks row parsing silently.\",\n },\n schema: [],\n messages: {\n noSelectStar:\n \"`SELECT *` over-fetches and leaves the row shape implicit — a new or reordered column silently changes what this query returns. List the columns explicitly.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (isTestFile(context.filename) || !SELECT_GATE.test(context.sourceCode.text)) {\n return {};\n }\n return createSqlListener((sql: string, node: TSESTree.Node): void => {\n if (!QUERY_SHAPE.test(sql) || !hasRealSelectStar(sql)) {\n return;\n }\n context.report({ node, messageId: \"noSelectStar\" });\n });\n },\n});\n","/**\n * @fileoverview no-sentinel-return-on-catch — a `catch` returning `null` / `[]` / `{}` discards the error, so callers cannot tell empty from failed.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-sentinel-return-on-catch.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-sentinel-return-on-catch.md\n */\n\nimport { type TSESTree, AST_NODE_TYPES } from \"@typescript-eslint/utils\";\n\nimport {\n createLogMatcher,\n calleeName,\n LOGGING_OPTION_PROPERTIES,\n type LoggingOptions,\n REPORT_NAME_RE,\n} from \"./_logging.js\";\nimport { createRule } from \"./_docs.js\";\nimport { isGeneratedFile } from \"./_paths.js\";\n\ntype MessageIds = \"noSentinelReturn\";\ntype Options = readonly [LoggingOptions?];\n\ntype SentinelKind = \"nullish\" | \"boolean\" | \"array\" | \"object\" | \"string\";\n\n/** The sentinel \"kind\" of a returned expression, or null if not a sentinel. */\nfunction sentinelKind(arg: TSESTree.Expression | null): SentinelKind | null {\n if (arg === null) {\n return null;\n }\n if (arg.type === AST_NODE_TYPES.Literal) {\n if (arg.value === null) {\n return \"nullish\";\n }\n if (typeof arg.value === \"boolean\") {\n return \"boolean\";\n }\n if (typeof arg.value === \"string\") {\n return \"string\";\n }\n return null;\n }\n if (arg.type === AST_NODE_TYPES.Identifier && arg.name === \"undefined\") {\n return \"nullish\";\n }\n if (arg.type === AST_NODE_TYPES.ArrayExpression) {\n return \"array\";\n }\n if (arg.type === AST_NODE_TYPES.ObjectExpression) {\n return \"object\";\n }\n return null;\n}\n\n/** Whether a returned expression is one of the swallowing sentinels we flag. */\nfunction isSentinelArgument(arg: TSESTree.Expression | null): boolean {\n if (arg === null) {\n return false;\n }\n if (arg.type === AST_NODE_TYPES.Literal && arg.value === null) {\n return true;\n }\n if (arg.type === AST_NODE_TYPES.Literal && arg.value === false) {\n return true;\n }\n if (arg.type === AST_NODE_TYPES.Identifier && arg.name === \"undefined\") {\n return true;\n }\n if (arg.type === AST_NODE_TYPES.ArrayExpression && arg.elements.length === 0) {\n return true;\n }\n if (\n arg.type === AST_NODE_TYPES.ObjectExpression &&\n arg.properties.length === 0\n ) {\n return true;\n }\n return false;\n}\n\nfunction isFunctionNode(node: TSESTree.Node): boolean {\n return (\n node.type === AST_NODE_TYPES.FunctionDeclaration ||\n node.type === AST_NODE_TYPES.FunctionExpression ||\n node.type === AST_NODE_TYPES.ArrowFunctionExpression\n );\n}\n\nfunction isNode(value: unknown): value is TSESTree.Node {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { type?: unknown }).type === \"string\"\n );\n}\n\n/**\n * Walk `node`'s subtree applying `visit`, but do not descend into nested\n * function scopes — their statements don't run synchronously for the current\n * catch. Stops early once `visit` returns true.\n */\nfunction walkWithinScope(\n node: TSESTree.Node,\n visit: (current: TSESTree.Node) => boolean,\n): boolean {\n let found = false;\n\n const recurse = (current: TSESTree.Node): void => {\n if (found) {\n return;\n }\n if (visit(current)) {\n found = true;\n return;\n }\n if (isFunctionNode(current)) {\n return;\n }\n for (const key of Object.keys(current)) {\n if (key === \"parent\") {\n continue;\n }\n const value = (current as unknown as Record<string, unknown>)[key];\n if (Array.isArray(value)) {\n for (const child of value) {\n if (isNode(child)) {\n recurse(child);\n }\n }\n } else if (isNode(value)) {\n recurse(value);\n }\n }\n };\n\n recurse(node);\n return found;\n}\n\n/** Does this subtree throw (ignoring nested function scopes)? */\nfunction containsThrow(node: TSESTree.Node): boolean {\n return walkWithinScope(\n node,\n (current) => current.type === AST_NODE_TYPES.ThrowStatement,\n );\n}\n\n/** True when a parameter pattern binds `name` (plain, default, rest, or destructured). */\nfunction bindsName(param: TSESTree.Node, name: string): boolean {\n switch (param.type) {\n case AST_NODE_TYPES.Identifier:\n return param.name === name;\n case AST_NODE_TYPES.AssignmentPattern:\n return bindsName(param.left, name);\n case AST_NODE_TYPES.RestElement:\n return bindsName(param.argument, name);\n case AST_NODE_TYPES.ArrayPattern:\n return param.elements.some(\n (element) => element !== null && bindsName(element, name),\n );\n case AST_NODE_TYPES.ObjectPattern:\n return param.properties.some((property) =>\n property.type === AST_NODE_TYPES.RestElement\n ? bindsName(property.argument, name)\n : bindsName(property.value, name),\n );\n default:\n return false;\n }\n}\n\n/**\n * Does `node`'s subtree READ the identifier `name`, in a VALUE position?\n *\n * A bare name match is not enough: an object key, a nested key, a member\n * property of another object and a parameter that merely shadows the name all\n * swallow the error while looking \"logged\". So non-computed property keys and\n * non-computed member properties are skipped, and a nested function that\n * rebinds the name is not descended into. Each shape has a case in the tests.\n */\nfunction subtreeReadsName(node: TSESTree.Node, name: string): boolean {\n let found = false;\n\n /** True when this function rebinds `name`, so its body reads a different value. */\n const shadowsName = (fn: TSESTree.Node): boolean =>\n isFunctionNode(fn) &&\n (fn as unknown as { params: TSESTree.Parameter[] }).params.some((param) =>\n bindsName(param, name),\n );\n\n const recurse = (current: TSESTree.Node): void => {\n if (found) {\n return;\n }\n if (current.type === AST_NODE_TYPES.Identifier && current.name === name) {\n found = true;\n return;\n }\n if (shadowsName(current)) {\n return;\n }\n for (const key of Object.keys(current)) {\n if (key === \"parent\") {\n continue;\n }\n // `{ error: 1 }` — the key names a field; it does not read the binding.\n if (\n key === \"key\" &&\n current.type === AST_NODE_TYPES.Property &&\n !current.computed\n ) {\n continue;\n }\n // `response.err` — the property names a field on some other object.\n if (\n key === \"property\" &&\n current.type === AST_NODE_TYPES.MemberExpression &&\n !current.computed\n ) {\n continue;\n }\n const value = (current as unknown as Record<string, unknown>)[key];\n if (Array.isArray(value)) {\n for (const child of value) {\n if (isNode(child)) {\n recurse(child);\n }\n }\n } else if (isNode(value)) {\n recurse(value);\n }\n }\n };\n\n recurse(node);\n return found;\n}\n\n/**\n * Does the caught-error binding appear ANYWHERE in a call's arguments? The whole\n * argument subtree is searched, not just top-level positional args: a structured\n * logger takes the error nested in a meta object or behind a conditional\n * (`logEvent(\"x\", { error: err instanceof Error ? err.message : String(err) })`),\n * and that reports the error exactly as `report(err)` does.\n */\nfunction argsIncludeBinding(\n args: readonly TSESTree.CallExpressionArgument[],\n caughtName: string | null,\n): boolean {\n if (caughtName === null) {\n return false;\n }\n return args.some((arg) => subtreeReadsName(arg, caughtName));\n}\n\n/** The try block guarded by this catch. */\nfunction tryBlockOf(catchNode: TSESTree.CatchClause): TSESTree.BlockStatement {\n return catchNode.parent.block;\n}\n\n/** Constructors that throw on malformed input. */\nconst SAFE_PARSE_CONSTRUCTORS: ReadonlySet<string> = new Set([\n \"RegExp\",\n \"URL\",\n \"URLPattern\",\n]);\n\n/**\n * A parse-style call that throws on bad input: `JSON.parse(x)`, `YAML.parse(x)`,\n * `new RegExp(x)`, `new URL(x)`.\n */\nfunction isParseShapedNode(node: TSESTree.Node): boolean {\n if (\n node.type === AST_NODE_TYPES.CallExpression &&\n node.callee.type === AST_NODE_TYPES.MemberExpression &&\n !node.callee.computed &&\n node.callee.property.type === AST_NODE_TYPES.Identifier\n ) {\n return node.callee.property.name === \"parse\";\n }\n if (\n node.type === AST_NODE_TYPES.NewExpression &&\n node.callee.type === AST_NODE_TYPES.Identifier\n ) {\n return SAFE_PARSE_CONSTRUCTORS.has(node.callee.name);\n }\n return false;\n}\n\n/** Body-decoding methods of a `Request` / `Response` — they throw on bad input. */\nconst BODY_DECODE_METHODS: ReadonlySet<string> = new Set([\n \"json\",\n \"text\",\n \"arrayBuffer\",\n]);\n\nfunction isBodyDecodeNode(node: TSESTree.Node): boolean {\n return (\n node.type === AST_NODE_TYPES.CallExpression &&\n node.callee.type === AST_NODE_TYPES.MemberExpression &&\n !node.callee.computed &&\n node.callee.property.type === AST_NODE_TYPES.Identifier &&\n BODY_DECODE_METHODS.has(node.callee.property.name)\n );\n}\n\n/**\n * True when a return statement's argument SUBTREE contains a match. The whole\n * subtree is searched rather than the top node alone, because the parse is\n * usually consumed in place: `return new URL(s).protocol === \"https:\"` is a\n * `BinaryExpression`, not a `NewExpression`, and `return await request.json()`\n * is an `AwaitExpression`. Nested function scopes are not searched — a parse\n * inside a callback does not run when the `try` does.\n */\nfunction returnsMatching(\n stmt: TSESTree.Node,\n predicate: (node: TSESTree.Node) => boolean,\n): boolean {\n return (\n stmt.type === AST_NODE_TYPES.ReturnStatement &&\n stmt.argument !== null &&\n walkWithinScope(stmt.argument, predicate)\n );\n}\n\n/** The declared return type annotation of the nearest enclosing function, or null. */\nfunction enclosingReturnTypeNode(\n node: TSESTree.Node,\n): TSESTree.TypeNode | null {\n let current: TSESTree.Node | undefined | null = node.parent;\n while (current !== undefined && current !== null) {\n if (isFunctionNode(current) && \"returnType\" in current) {\n return current.returnType?.typeAnnotation ?? null;\n }\n current = current.parent;\n }\n return null;\n}\n\n/**\n * Function names that declare a boolean contract as clearly as a `: boolean`\n * annotation does. TypeScript INFERS the return type of\n * `async function isDirectory(d: string) { try { … } catch { return false } }`,\n * so demanding the annotation made the predicate exemption depend on a style\n * choice rather than on the contract.\n */\nconst PREDICATE_NAME_RE = /^(is|has|can|should|must|does|did|was|were|are)[A-Z]/;\nconst PREDICATE_SUFFIX_RE = /(Exists?|Available|Enabled|Disabled)$/;\n\n/** The name of the nearest enclosing function, or null for an anonymous one. */\nfunction enclosingFunctionName(node: TSESTree.Node): string | null {\n let current: TSESTree.Node | undefined | null = node.parent;\n while (current !== undefined && current !== null) {\n if (isFunctionNode(current)) {\n if (\n \"id\" in current &&\n isNode(current.id) &&\n current.id.type === AST_NODE_TYPES.Identifier\n ) {\n return current.id.name;\n }\n const parent = current.parent;\n if (\n parent?.type === AST_NODE_TYPES.VariableDeclarator &&\n parent.id.type === AST_NODE_TYPES.Identifier\n ) {\n return parent.id.name;\n }\n return null;\n }\n current = current.parent;\n }\n return null;\n}\n\n/**\n * True when the enclosing function's NAME declares it a predicate and the catch\n * returns a boolean. Same reasoning as `isDeclaredBooleanPredicate`, applied to\n * the (very common) unannotated spelling.\n */\nfunction isNamedBooleanPredicate(\n catchNode: TSESTree.CatchClause,\n kind: SentinelKind,\n): boolean {\n if (kind !== \"boolean\") {\n return false;\n }\n const name = enclosingFunctionName(catchNode);\n return (\n name !== null &&\n (PREDICATE_NAME_RE.test(name) || PREDICATE_SUFFIX_RE.test(name))\n );\n}\n\n/**\n * True when the enclosing function is a DECLARED predicate — annotated\n * `: boolean` (or `: Promise<boolean>`) — and the catch returns `false`. A\n * boolean return type cannot carry error information at all, so \"return a typed\n * Result\" is not advice that applies; the sentinel IS the whole contract. Only\n * `boolean` qualifies: a declared `T | null` return is the shape this rule\n * exists to flag and must keep firing.\n */\nfunction isDeclaredBooleanPredicate(\n catchNode: TSESTree.CatchClause,\n kind: SentinelKind,\n): boolean {\n if (kind !== \"boolean\") {\n return false;\n }\n let declared = enclosingReturnTypeNode(catchNode);\n if (\n declared?.type === AST_NODE_TYPES.TSTypeReference &&\n declared.typeName.type === AST_NODE_TYPES.Identifier &&\n declared.typeName.name === \"Promise\"\n ) {\n declared = declared.typeArguments?.params[0] ?? null;\n }\n return declared?.type === AST_NODE_TYPES.TSBooleanKeyword;\n}\n\n/** Does the try body return a safe-parse-style expression? */\nfunction tryReturnsSafeParse(catchNode: TSESTree.CatchClause): boolean {\n const tryBlock = tryBlockOf(catchNode);\n if (\n walkWithinScope(tryBlock, (current) =>\n returnsMatching(current, isParseShapedNode),\n )\n ) {\n return true;\n }\n const only = tryBlock.body.length === 1 ? tryBlock.body[0] : undefined;\n return only !== undefined && returnsMatching(only, isBodyDecodeNode);\n}\n\n/** The nearest enclosing function body, or null. */\nfunction enclosingFunctionBody(\n node: TSESTree.Node,\n): TSESTree.BlockStatement | null {\n let current: TSESTree.Node | undefined | null = node.parent;\n while (current !== undefined && current !== null) {\n if (\n isFunctionNode(current) &&\n \"body\" in current &&\n isNode(current.body) &&\n current.body.type === AST_NODE_TYPES.BlockStatement\n ) {\n return current.body;\n }\n current = current.parent;\n }\n return null;\n}\n\n/**\n * True when the enclosing function returns the same sentinel kind on a normal\n * (non-catch) path — a boolean predicate, a `T | undefined` accessor, etc. —\n * so the catch sentinel is the declared contract, not a swallow. Returns inside\n * the flagged catch itself are excluded.\n */\nfunction functionReturnsSameSentinelKindElsewhere(\n catchNode: TSESTree.CatchClause,\n kind: SentinelKind,\n): boolean {\n const functionBody = enclosingFunctionBody(catchNode);\n if (functionBody === null) {\n return false;\n }\n return walkWithinScope(functionBody, (current) => {\n if (current.type !== AST_NODE_TYPES.ReturnStatement) {\n return false;\n }\n if (isWithin(current, catchNode.body)) {\n return false;\n }\n return returnedSentinelKinds(current.argument).has(kind);\n });\n}\n\n/**\n * The sentinel kinds a returned expression can evaluate to. A bare sentinel\n * yields one; a ternary or a `??` / `||` fallback yields the kinds of its\n * branches, because `return valid ? value : false` puts `false` on a NORMAL\n * path just as plainly as `return false` does.\n */\nfunction returnedSentinelKinds(\n arg: TSESTree.Expression | null,\n): ReadonlySet<SentinelKind> {\n const kinds = new Set<SentinelKind>();\n if (arg === null) {\n return kinds;\n }\n const direct = sentinelKind(arg);\n if (direct !== null) {\n kinds.add(direct);\n return kinds;\n }\n if (arg.type === AST_NODE_TYPES.ConditionalExpression) {\n for (const branch of [arg.consequent, arg.alternate]) {\n for (const nested of returnedSentinelKinds(branch)) {\n kinds.add(nested);\n }\n }\n } else if (\n arg.type === AST_NODE_TYPES.LogicalExpression &&\n (arg.operator === \"??\" || arg.operator === \"||\")\n ) {\n for (const nested of returnedSentinelKinds(arg.right)) {\n kinds.add(nested);\n }\n }\n return kinds;\n}\n\n/** Is `node` inside `ancestor`'s subtree? */\nfunction isWithin(node: TSESTree.Node, ancestor: TSESTree.Node): boolean {\n let current: TSESTree.Node | undefined | null = node;\n while (current !== undefined && current !== null) {\n if (current === ancestor) {\n return true;\n }\n current = current.parent;\n }\n return false;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-sentinel-return-on-catch\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow swallowing a caught error by returning an empty sentinel (`null`, `undefined`, `false`, `[]`, `{}`) as the final statement of a `catch` block, unless the error is logged/reported or the sentinel is the declared safe-parse/predicate contract.\",\n },\n schema: [\n {\n type: \"object\",\n additionalProperties: false,\n properties: { ...LOGGING_OPTION_PROPERTIES },\n },\n ],\n messages: {\n noSentinelReturn:\n \"This `catch` block swallows the error by returning an empty sentinel without logging it. Rethrow it, log/report it, or return a typed Result.\",\n },\n },\n defaultOptions: [{}],\n create(context, [loggingOptions]) {\n if (isGeneratedFile(context.filename, context.sourceCode.text)) {\n return {};\n }\n\n const matcher = createLogMatcher(loggingOptions);\n\n /**\n * Does the catch body log or report the caught error before the sentinel\n * return? Either a logging call (logger receiver or a declared\n * `logFunctions` free function), or an error-reporting call whose name\n * matches `REPORT_NAME_RE` and whose arguments mention the caught binding.\n */\n function logsOrReportsError(\n catchBody: TSESTree.BlockStatement,\n caughtName: string | null,\n ): boolean {\n return walkWithinScope(catchBody, (current) => {\n if (current.type !== AST_NODE_TYPES.CallExpression) {\n return false;\n }\n if (matcher.isLoggingCall(current)) {\n return true;\n }\n const name = calleeName(current.callee);\n return (\n name !== null &&\n REPORT_NAME_RE.test(name) &&\n argsIncludeBinding(current.arguments, caughtName)\n );\n });\n }\n\n return {\n CatchClause(node: TSESTree.CatchClause): void {\n const body = node.body.body;\n if (body.length === 0) {\n return;\n }\n\n const last = body[body.length - 1];\n if (last === undefined || last.type !== AST_NODE_TYPES.ReturnStatement) {\n return;\n }\n\n if (!isSentinelArgument(last.argument)) {\n return;\n }\n\n if (containsThrow(node.body)) {\n return;\n }\n\n const caughtName =\n node.param?.type === AST_NODE_TYPES.Identifier\n ? node.param.name\n : null;\n\n if (logsOrReportsError(node.body, caughtName)) {\n return;\n }\n\n if (tryReturnsSafeParse(node)) {\n return;\n }\n\n const kind = sentinelKind(last.argument);\n if (kind !== null && isNamedBooleanPredicate(node, kind)) {\n return;\n }\n\n if (kind !== null && isDeclaredBooleanPredicate(node, kind)) {\n return;\n }\n\n if (\n kind !== null &&\n functionReturnsSameSentinelKindElsewhere(node, kind)\n ) {\n return;\n }\n\n context.report({\n node: last,\n messageId: \"noSentinelReturn\",\n });\n },\n };\n },\n});\n","/**\n * @fileoverview no-silent-promise-catch — `.catch(() => null)` deletes the rejection: no log, no metric, no rethrow, and a sentinel to the caller.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-silent-promise-catch.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-silent-promise-catch.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"silentCatch\";\ntype Options = readonly [];\n\n/** True for `x.json()` / `x.text()` — the receiver of a body-parse-fallback catch. */\nfunction isBodyParseCall(node: TSESTree.Expression): boolean {\n return (\n node.type === AST_NODE_TYPES.CallExpression &&\n node.arguments.length === 0 &&\n node.callee.type === AST_NODE_TYPES.MemberExpression &&\n !node.callee.computed &&\n node.callee.property.type === AST_NODE_TYPES.Identifier &&\n (node.callee.property.name === \"json\" ||\n node.callee.property.name === \"text\")\n );\n}\n\n/**\n * Teardown methods that reject when the resource is already gone — which is the\n * state the caller was asking for. The rejection carries no signal, so silencing\n * it is correct, the same reasoning as the `res.json()` fallback above.\n */\nconst TEARDOWN_METHODS: ReadonlySet<string> = new Set([\n \"cancel\",\n \"close\",\n \"abort\",\n \"destroy\",\n \"dispose\",\n \"release\",\n \"unlock\",\n \"disconnect\",\n]);\n\n/**\n * Tooling directives are machinery, not an explanation of the swallow. An\n * `eslint-disable` already suppresses the report through the normal channel, so\n * counting it as documentation would turn every directive into an unused one.\n */\nconst DIRECTIVE_COMMENT_RE =\n /^\\s*(eslint-|@ts-|prettier-ignore|biome-ignore|c8 |v8 |istanbul )/;\n\nconst isExplanatory = (comment: { value: string }): boolean =>\n !DIRECTIVE_COMMENT_RE.test(comment.value);\n\n/** True for `reader.cancel(reason)` / `stream.close()` — a teardown receiver. */\nfunction isTeardownCall(node: TSESTree.Expression): boolean {\n return (\n node.type === AST_NODE_TYPES.CallExpression &&\n node.callee.type === AST_NODE_TYPES.MemberExpression &&\n !node.callee.computed &&\n node.callee.property.type === AST_NODE_TYPES.Identifier &&\n TEARDOWN_METHODS.has(node.callee.property.name)\n );\n}\n\n/** True for expressions that provably discard the error: bare literals,\n * `undefined`, empty object/array literals. */\nfunction isSilentExpression(node: TSESTree.Expression): boolean {\n switch (node.type) {\n case AST_NODE_TYPES.Literal:\n // null / number / string / boolean literals (regex literals excluded —\n // nobody writes `.catch(() => /x/)` and they are not sentinel values).\n return !(\"regex\" in node);\n case AST_NODE_TYPES.Identifier:\n return node.name === \"undefined\";\n case AST_NODE_TYPES.UnaryExpression:\n // `void 0` — the other spelling of undefined.\n return (\n node.operator === \"void\" &&\n node.argument.type === AST_NODE_TYPES.Literal\n );\n case AST_NODE_TYPES.ObjectExpression:\n return node.properties.length === 0;\n case AST_NODE_TYPES.ArrayExpression:\n return node.elements.length === 0;\n case AST_NODE_TYPES.TSAsExpression:\n // `.catch(() => null as Foo | null)` is still silent.\n return isSilentExpression(node.expression);\n default:\n return false;\n }\n}\n\n/** True when the handler's whole body provably does nothing with the error. */\nfunction isSilentHandler(\n handler: TSESTree.ArrowFunctionExpression | TSESTree.FunctionExpression,\n): boolean {\n const body = handler.body;\n\n if (body.type !== AST_NODE_TYPES.BlockStatement) {\n // Arrow expression body: `.catch(() => null)`\n return isSilentExpression(body);\n }\n\n if (body.body.length === 0) {\n // `.catch(() => {})` / `.catch(function () {})`\n return true;\n }\n\n if (body.body.length === 1) {\n const only = body.body[0];\n if (only !== undefined && only.type === AST_NODE_TYPES.ReturnStatement) {\n // `.catch(() => { return null; })`\n return only.argument === null || isSilentExpression(only.argument);\n }\n }\n\n return false;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-silent-promise-catch\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow `.catch()` handlers that silently swallow the rejection (e.g. `.catch(() => null)`); log, rethrow, or handle the error.\",\n },\n schema: [],\n messages: {\n silentCatch:\n \"This `.catch()` swallows the rejection without logging, rethrowing, or handling it — failures become invisible and callers get an indistinguishable sentinel. Log the error (and only then map to a fallback), or let it propagate.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (isTestFile(context.filename)) {\n return {};\n }\n\n /**\n * True when the suppression is DOCUMENTED: a comment inside the handler\n * body, trailing the call on the same line, or on the line(s) directly above\n * the statement the call belongs to. The rule's complaint is that the\n * decision to discard the error is invisible — a comment is precisely what\n * makes it visible, so there is nothing left to report.\n */\n const hasExplanatoryComment = (\n call: TSESTree.CallExpression,\n handler: TSESTree.ArrowFunctionExpression | TSESTree.FunctionExpression,\n ): boolean => {\n const sourceCode = context.sourceCode;\n if (sourceCode.getCommentsInside(handler).some(isExplanatory)) {\n return true;\n }\n // Walk out to the enclosing statement so a comment above or beside\n // `lazyRoutePromise.catch(() => {});` is found rather than one sitting\n // between the receiver and `.catch`.\n let statement: TSESTree.Node = call;\n while (\n statement.parent !== undefined &&\n statement.parent !== null &&\n !statement.type.endsWith(\"Statement\") &&\n statement.type !== AST_NODE_TYPES.VariableDeclaration\n ) {\n statement = statement.parent;\n }\n if (sourceCode.getCommentsBefore(statement).some(isExplanatory)) {\n return true;\n }\n return sourceCode\n .getCommentsAfter(statement)\n .some(\n (c) => isExplanatory(c) && c.loc.start.line === statement.loc.end.line,\n );\n };\n\n return {\n CallExpression(node: TSESTree.CallExpression): void {\n if (\n node.callee.type !== AST_NODE_TYPES.MemberExpression ||\n node.callee.computed ||\n node.callee.property.type !== AST_NODE_TYPES.Identifier ||\n node.callee.property.name !== \"catch\"\n ) {\n return;\n }\n\n if (isBodyParseCall(node.callee.object)) {\n return;\n }\n\n if (isTeardownCall(node.callee.object)) {\n return;\n }\n\n // `p.catch(() => null).then(...)` — the next link consumes the fallback,\n // so it is a recovery step, not a value handed back to an outside caller.\n if (\n node.parent.type === AST_NODE_TYPES.MemberExpression &&\n node.parent.object === node\n ) {\n return;\n }\n\n if (node.arguments.length !== 1) {\n return;\n }\n const handler = node.arguments[0];\n if (\n handler === undefined ||\n (handler.type !== AST_NODE_TYPES.ArrowFunctionExpression &&\n handler.type !== AST_NODE_TYPES.FunctionExpression)\n ) {\n return;\n }\n\n if (hasExplanatoryComment(node, handler)) {\n return;\n }\n\n if (isSilentHandler(handler)) {\n // Anchor on the CallExpression, not the handler: when the handler\n // sits on a later line than the call (multi-line `.catch(`), a\n // handler-anchored report escapes an `eslint-disable-next-line`\n // above the call AND marks that directive as unused.\n context.report({ node, messageId: \"silentCatch\" });\n }\n },\n };\n },\n});\n","/**\n * @fileoverview no-sleep-in-test-body — a fixed sleep asserts on wall-clock time rather than on the signal, so the test flakes under CI load.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-sleep-in-test-body.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-sleep-in-test-body.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"noSleepInTestBody\";\ntype Options = readonly [];\n\n/** Free-function sleep helpers. A `sleep(50)` reads as a sleep whatever its module. */\nconst SLEEP_HELPERS: ReadonlySet<string> = new Set([\"sleep\", \"delay\", \"wait\", \"pause\"]);\n\n/** Test-case and per-test-hook callers whose callback body is \"the test body\". */\nconst TEST_CALLERS: ReadonlySet<string> = new Set([\n \"it\",\n \"test\",\n \"beforeEach\",\n \"afterEach\",\n]);\n\nconst FUNCTION_TYPES: ReadonlySet<AST_NODE_TYPES> = new Set([\n AST_NODE_TYPES.FunctionDeclaration,\n AST_NODE_TYPES.FunctionExpression,\n AST_NODE_TYPES.ArrowFunctionExpression,\n]);\n\n/** True for a nonzero numeric literal — the timing guess, as opposed to a `0` yield. */\nfunction isNonzeroNumericLiteral(node: TSESTree.Node | undefined): boolean {\n return node?.type === AST_NODE_TYPES.Literal && typeof node.value === \"number\" && node.value !== 0;\n}\n\n/** True when `node` is `setTimeout(<anything>, <nonzero literal>)`. */\nfunction isTimedSetTimeout(node: TSESTree.Node): boolean {\n return (\n node.type === AST_NODE_TYPES.CallExpression &&\n node.callee.type === AST_NODE_TYPES.Identifier &&\n node.callee.name === \"setTimeout\" &&\n node.arguments.length >= 2 &&\n isNonzeroNumericLiteral(node.arguments[1])\n );\n}\n\n/**\n * True when `node` is `new Promise((r) => setTimeout(r, n))` — including the\n * block-bodied `{ setTimeout(r, n); }` spelling.\n */\nfunction isPromiseSleep(node: TSESTree.NewExpression): boolean {\n if (node.callee.type !== AST_NODE_TYPES.Identifier || node.callee.name !== \"Promise\") {\n return false;\n }\n const executor = node.arguments[0];\n if (\n executor?.type !== AST_NODE_TYPES.ArrowFunctionExpression &&\n executor?.type !== AST_NODE_TYPES.FunctionExpression\n ) {\n return false;\n }\n const body = executor.body;\n if (body.type !== AST_NODE_TYPES.BlockStatement) {\n return isTimedSetTimeout(body);\n }\n return body.body.some(\n (stmt) => stmt.type === AST_NODE_TYPES.ExpressionStatement && isTimedSetTimeout(stmt.expression),\n );\n}\n\n/** True when `node` is `sleep(n)` / `delay(n)` with a nonzero numeric literal. */\nfunction isHelperSleep(node: TSESTree.CallExpression): boolean {\n return (\n node.callee.type === AST_NODE_TYPES.Identifier &&\n SLEEP_HELPERS.has(node.callee.name) &&\n node.arguments.length >= 1 &&\n isNonzeroNumericLiteral(node.arguments[0])\n );\n}\n\n/** The nearest enclosing function of `node`, skipping the `new Promise` executor. */\nfunction nearestEnclosingFunction(node: TSESTree.Node): TSESTree.Node | null {\n for (let current = node.parent; current != null; current = current.parent) {\n if (!FUNCTION_TYPES.has(current.type)) {\n continue;\n }\n const grandparent = current.parent;\n const isPromiseExecutor =\n grandparent?.type === AST_NODE_TYPES.NewExpression && isPromiseSleep(grandparent);\n if (!isPromiseExecutor) {\n return current;\n }\n }\n return null;\n}\n\n/** The base callee name of a call, unwrapping `.only` / `.skip` / `.each` chains. */\nfunction testCallerName(callee: TSESTree.Node): string | null {\n if (callee.type === AST_NODE_TYPES.Identifier) {\n return callee.name;\n }\n if (callee.type === AST_NODE_TYPES.MemberExpression) {\n return testCallerName(callee.object);\n }\n if (callee.type === AST_NODE_TYPES.CallExpression) {\n return testCallerName(callee.callee);\n }\n if (callee.type === AST_NODE_TYPES.TaggedTemplateExpression) {\n return testCallerName(callee.tag);\n }\n return null;\n}\n\n/** True when `fn` is the callback argument of an `it`/`test`/per-test-hook call. */\nfunction isTestBody(fn: TSESTree.Node): boolean {\n const call = fn.parent;\n if (\n call?.type !== AST_NODE_TYPES.CallExpression ||\n !call.arguments.some((argument) => argument === fn)\n ) {\n return false;\n }\n const name = testCallerName(call.callee);\n return name !== null && TEST_CALLERS.has(name);\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-sleep-in-test-body\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow a fixed timed sleep directly in a test body; it flakes under CI load. Synchronize on the signal or use fake timers.\",\n },\n schema: [],\n messages: {\n noSleepInTestBody:\n \"A fixed sleep in a test body asserts on wall-clock time and flakes under CI load. Await the promise the code returns, or drive time with `vi.useFakeTimers()` + `await vi.advanceTimersByTimeAsync(ms)`.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (!isTestFile(context.filename)) {\n return {};\n }\n const report = (node: TSESTree.Node): void => {\n const enclosing = nearestEnclosingFunction(node);\n if (enclosing === null || !isTestBody(enclosing)) {\n return;\n }\n context.report({ node, messageId: \"noSleepInTestBody\" });\n };\n return {\n NewExpression(node: TSESTree.NewExpression): void {\n if (isPromiseSleep(node)) {\n report(node);\n }\n },\n CallExpression(node: TSESTree.CallExpression): void {\n if (isHelperSleep(node)) {\n report(node);\n }\n },\n };\n },\n});\n","/**\n * @fileoverview no-storage-in-stateless-modules — private storage inside a module a team declared stateless diverges from the system of record, silently.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-storage-in-stateless-modules.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-storage-in-stateless-modules.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\n\ntype MessageIds = \"storageInStatelessModule\";\n\nexport interface RuleOptions {\n /** Regex sources matched against the filename. Empty means the rule is off. */\n readonly modules?: readonly string[];\n /** Storage method names to flag. Replaces the defaults. */\n readonly methods?: readonly string[];\n}\n\ntype Options = readonly [RuleOptions?];\n\nconst DEFAULT_METHODS: readonly string[] = [\n \"prepare\",\n \"put\",\n \"getWithMetadata\",\n];\n\n/**\n * Minimum argument count before a method call counts as storage access. `put`\n * needs a key AND a value; a single-argument `put` is usually something else.\n * Methods absent from this map need one argument.\n */\nconst MIN_ARGUMENTS: ReadonlyMap<string, number> = new Map([[\"put\", 2]]);\n\n/** Compile regex sources, skipping malformed entries rather than throwing. */\nfunction compile(patterns: readonly string[]): RegExp[] {\n const compiled: RegExp[] = [];\n for (const pattern of patterns) {\n try {\n compiled.push(new RegExp(pattern));\n } catch {\n // Skip the malformed entry; the remaining patterns still apply.\n }\n }\n return compiled;\n}\n\n/** The flagged storage method name of `receiver.method(...)`, or null. */\nfunction storageMethodName(\n node: TSESTree.CallExpression,\n methods: ReadonlySet<string>,\n): string | null {\n const callee = node.callee;\n if (\n callee.type !== AST_NODE_TYPES.MemberExpression ||\n callee.computed ||\n callee.property.type !== AST_NODE_TYPES.Identifier\n ) {\n return null;\n }\n const name = callee.property.name;\n if (!methods.has(name)) {\n return null;\n }\n if (node.arguments.length < (MIN_ARGUMENTS.get(name) ?? 1)) {\n return null;\n }\n return name;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-storage-in-stateless-modules\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow SQL or key/value access inside modules a team has declared stateless; derive state from the systems of record instead. No-op until `modules` is configured.\",\n },\n schema: [\n {\n type: \"object\",\n properties: {\n modules: {\n type: \"array\",\n items: { type: \"string\" },\n description:\n \"Regex sources matched against the filename. Empty (the default) disables the rule.\",\n },\n methods: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Storage method names to flag. Replaces the defaults.\",\n },\n },\n additionalProperties: false,\n },\n ],\n messages: {\n storageInStatelessModule:\n \"`{{method}}()` reaches for private storage inside a module declared stateless. Derive the state from a read against the system of record, or from a marker in the artefact this feature already produces.\",\n },\n },\n defaultOptions: [{}],\n create(context, [options]) {\n const modules = options?.modules ?? [];\n if (modules.length === 0) {\n return {};\n }\n\n const scoped = compile(modules);\n if (!scoped.some((re) => re.test(context.filename))) {\n return {};\n }\n\n const methods = new Set(options?.methods ?? DEFAULT_METHODS);\n\n return {\n CallExpression(node: TSESTree.CallExpression): void {\n const method = storageMethodName(node, methods);\n if (method !== null) {\n context.report({\n node,\n messageId: \"storageInStatelessModule\",\n data: { method },\n });\n }\n },\n };\n },\n});\n","/**\n * @fileoverview no-string-concat-in-loop — `+=` on a string inside a loop rebuilds the whole string every pass, which is O(n^2).\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-string-concat-in-loop.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-string-concat-in-loop.md\n */\n\nimport { type TSESTree } from \"@typescript-eslint/utils\";\nimport type { Scope } from \"@typescript-eslint/utils/ts-eslint\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isGeneratedFile } from \"./_paths.js\";\n\ntype MessageIds = \"noStringConcatInLoop\";\ntype Options = readonly [];\n\nconst LOOP_NODE_TYPES = new Set<string>([\n \"ForStatement\",\n \"ForOfStatement\",\n \"ForInStatement\",\n \"WhileStatement\",\n \"DoWhileStatement\",\n]);\n\n/**\n * Returns true if the given expression node is a string-producing literal:\n * a string `Literal` (`\"\"`, `\"...\"`, `'...'`) or a `TemplateLiteral`.\n */\nfunction isStringLiteralInit(node: TSESTree.Expression | null): boolean {\n if (node === null) {\n return false;\n }\n if (node.type === \"TemplateLiteral\") {\n return true;\n }\n if (node.type === \"Literal\") {\n return typeof node.value === \"string\";\n }\n return false;\n}\n\n/**\n * Walk the chain of enclosing scopes to find the variable definition for the\n * given identifier name. Returns the resolved `Variable`, or `undefined` if it\n * cannot be found (e.g. an undeclared global or an out-of-scope reference).\n */\nfunction findVariable(\n scope: Scope.Scope,\n name: string,\n): Scope.Variable | undefined {\n let current: Scope.Scope | null = scope;\n while (current !== null) {\n const variable = current.variables.find((v) => v.name === name);\n if (variable !== undefined) {\n return variable;\n }\n current = current.upper;\n }\n return undefined;\n}\n\n/**\n * Returns true if the variable was declared with a string-literal initializer.\n * Conservative: if the variable has no single string-initialized declarator\n * (no init, non-literal init, multiple conflicting declarators), returns false.\n */\nfunction isStringInitializedVariable(variable: Scope.Variable): boolean {\n // A variable can technically have multiple declarators (e.g. via `var`\n // hoisting / redeclaration). Only treat it as string-initialized when there\n // is exactly one declarator and it has a string-literal initializer.\n if (variable.defs.length !== 1) {\n return false;\n }\n const def = variable.defs[0];\n if (def === undefined || def.type !== \"Variable\") {\n // Parameters, function names, imports, etc. — type unknown, don't flag.\n return false;\n }\n const declarator = def.node;\n if (declarator.type !== \"VariableDeclarator\") {\n return false;\n }\n return isStringLiteralInit(declarator.init);\n}\n\n/**\n * Returns true if `target` appears as a direct operand of a `+` expression\n * (following left-associative `+` chains, e.g. `s + a + b`). Used to recognize\n * the longhand `s = s + <...>` reassignment, which has the same O(n^2) cost as\n * `s += <...>`. A non-`+` operand (`foo.s`, `s.slice()`, `x + y`) does not match.\n */\nfunction isConcatOperand(\n node: TSESTree.Expression | TSESTree.PrivateIdentifier,\n target: string,\n): boolean {\n if (node.type === \"Identifier\") {\n return node.name === target;\n }\n if (node.type === \"BinaryExpression\" && node.operator === \"+\") {\n return (\n isConcatOperand(node.left, target) || isConcatOperand(node.right, target)\n );\n }\n return false;\n}\n\n/**\n * Returns true if `rhs` is a `+` `BinaryExpression` in which `target` appears as\n * an operand — the reassignment shape `s = s + x` / `s = x + s` / `s = s + a + b`.\n */\nfunction isConcatOntoTarget(\n rhs: TSESTree.Expression,\n target: string,\n): boolean {\n if (rhs.type !== \"BinaryExpression\" || rhs.operator !== \"+\") {\n return false;\n }\n return isConcatOperand(rhs.left, target) || isConcatOperand(rhs.right, target);\n}\n\n/**\n * Returns true when the accumulator's declaration lives inside `loop`'s BODY, so\n * a fresh string is bound on every iteration.\n *\n * `let s = \"\"` before the loop is the cross-iteration accumulator this rule\n * targets. `let s = \"\"` inside the body is not: the `+=` runs a bounded number of\n * times against a string that is discarded at the end of the pass, and there is\n * no quadratic growth to remove — the parts are usually already collected into an\n * array afterwards. Compared by source range, which is exact for a declaration\n * that is lexically nested in the body.\n */\nfunction isDeclaredInsideLoop(\n variable: Scope.Variable,\n loop: TSESTree.Node,\n): boolean {\n const def = variable.defs[0];\n if (def === undefined) {\n return false;\n }\n const body = (\n loop as\n | TSESTree.ForStatement\n | TSESTree.ForOfStatement\n | TSESTree.ForInStatement\n | TSESTree.WhileStatement\n | TSESTree.DoWhileStatement\n ).body;\n const [declStart, declEnd] = def.node.range;\n const [bodyStart, bodyEnd] = body.range;\n return declStart >= bodyStart && declEnd <= bodyEnd;\n}\n\n/**\n * Returns true if `node` is contained within the body of a loop statement.\n * Walks ancestors and, for each loop, ensures the node is inside the loop's\n * BODY (not its test/init/update clauses, which run a bounded number of times\n * relative to the body and aren't the antipattern we target).\n */\nfunction enclosingLoop(node: TSESTree.Node): TSESTree.Node | null {\n let child: TSESTree.Node = node;\n let parent = node.parent;\n while (parent !== undefined && parent !== null) {\n if (LOOP_NODE_TYPES.has(parent.type)) {\n // `body` is the property that holds the looped statements for every\n // loop variant we care about.\n const loop = parent as\n | TSESTree.ForStatement\n | TSESTree.ForOfStatement\n | TSESTree.ForInStatement\n | TSESTree.WhileStatement\n | TSESTree.DoWhileStatement;\n if (loop.body === child) {\n return loop;\n }\n }\n child = parent;\n parent = parent.parent;\n }\n return null;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-string-concat-in-loop\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Disallow O(n^2) string building via `+=` on a string variable inside a loop; push parts to an array and `join` instead.\",\n },\n schema: [],\n messages: {\n noStringConcatInLoop:\n \"Avoid building a string with `+=` inside a loop — this is O(n^2). Push the parts onto an array and use `arr.join(\\\"\\\")` after the loop.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (isGeneratedFile(context.filename, context.sourceCode.text)) {\n return {};\n }\n\n // One defect per (accumulator, loop) — see @fileoverview. Keyed on the loop\n // node so sibling loops over the same variable each keep their report.\n const reported = new WeakMap<TSESTree.Node, Set<string>>();\n\n return {\n AssignmentExpression(node: TSESTree.AssignmentExpression): void {\n // The LHS must be a plain variable reference.\n if (node.left.type !== \"Identifier\") {\n return;\n }\n // Accept both the compound `s += x` and the longhand `s = s + x`; any\n // other operator/shape (`s = x + y`, `s -= x`, ...) is not accumulation.\n const isAccumulation =\n node.operator === \"+=\" ||\n (node.operator === \"=\" &&\n isConcatOntoTarget(node.right, node.left.name));\n if (!isAccumulation) {\n return;\n }\n // Must occur inside a loop body, else it's a one-shot append.\n const loop = enclosingLoop(node);\n if (loop === null) {\n return;\n }\n\n const scope = context.sourceCode.getScope(node);\n const variable = findVariable(scope, node.left.name);\n // Conservative: can't resolve the declaration -> don't flag.\n if (variable === undefined) {\n return;\n }\n if (!isStringInitializedVariable(variable)) {\n return;\n }\n // The O(n^2) claim requires the accumulator to SURVIVE across iterations.\n // One declared inside the loop body is a fresh string every pass, so its\n // length is bounded by one iteration's work and `join` cannot replace it.\n if (isDeclaredInsideLoop(variable, loop)) {\n return;\n }\n\n let seen = reported.get(loop);\n if (seen === undefined) {\n seen = new Set<string>();\n reported.set(loop, seen);\n }\n if (seen.has(node.left.name)) {\n return;\n }\n seen.add(node.left.name);\n\n context.report({\n node,\n messageId: \"noStringConcatInLoop\",\n });\n },\n };\n },\n});\n","/**\n * @fileoverview no-tautological-expect — an assertion whose operands are all literals decided its outcome before the code ran, so it can never fail.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-tautological-expect.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-tautological-expect.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"tautologicalComparison\" | \"tautologicalMatcher\";\ntype Options = readonly [];\n\n/** Matchers that take the expected value as their single argument. */\nconst EQUALITY_MATCHERS: ReadonlySet<string> = new Set([\"toBe\", \"toEqual\", \"toStrictEqual\"]);\n\n/** Matchers that take no argument, so the receiver alone fixes the outcome. */\nconst ZERO_ARG_MATCHERS: ReadonlySet<string> = new Set([\n \"toBeDefined\",\n \"toBeUndefined\",\n \"toBeNull\",\n \"toBeTruthy\",\n \"toBeFalsy\",\n \"toBeNaN\",\n]);\n\n/** Enough of the operand to identify it in the message without pasting a screenful. */\nconst OPERAND_PREVIEW_CHARS = 40;\n\n/** Sign prefixes: `-1` is a unary expression, not a literal, but it is constant. */\nconst NUMERIC_SIGNS: ReadonlySet<string> = new Set([\"-\", \"+\"]);\n\nfunction isLiteral(node: TSESTree.Node): boolean {\n switch (node.type) {\n case AST_NODE_TYPES.Literal:\n return true;\n case AST_NODE_TYPES.TemplateLiteral:\n return node.expressions.length === 0;\n case AST_NODE_TYPES.UnaryExpression:\n return NUMERIC_SIGNS.has(node.operator) && isLiteral(node.argument);\n case AST_NODE_TYPES.ArrayExpression:\n return node.elements.every((element) => element !== null && isLiteral(element));\n case AST_NODE_TYPES.ObjectExpression:\n return node.properties.every(\n (property) =>\n property.type === AST_NODE_TYPES.Property &&\n !property.computed &&\n isLiteral(property.value),\n );\n default:\n return false;\n }\n}\n\n/** The `expect(<single argument>)` call a matcher hangs directly off, if any. */\nfunction expectOperand(callee: TSESTree.MemberExpression): TSESTree.Node | null {\n const receiver = callee.object;\n if (\n receiver.type !== AST_NODE_TYPES.CallExpression ||\n receiver.callee.type !== AST_NODE_TYPES.Identifier ||\n receiver.callee.name !== \"expect\" ||\n receiver.arguments.length !== 1\n ) {\n return null;\n }\n return receiver.arguments[0] ?? null;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-tautological-expect\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow an assertion whose operands are all literals; its outcome is fixed before the code runs, so it can never fail.\",\n },\n schema: [],\n messages: {\n tautologicalComparison:\n \"`expect({{operand}}).{{matcher}}({{operand}})` compares a literal with an identical literal — it passes even if the code under test is deleted. Assert on a value the code produced, or delete the test.\",\n tautologicalMatcher:\n \"`expect({{operand}}).{{matcher}}()` asserts on a literal, so its outcome is fixed before the code runs. Assert on a value the code produced, or delete the test.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (!isTestFile(context.filename)) {\n return {};\n }\n /** The operand as written, collapsed to one line and elided for the message. */\n const preview = (node: TSESTree.Node): string => {\n const text = context.sourceCode.getText(node).replaceAll(/\\s+/gu, \" \");\n return text.length > OPERAND_PREVIEW_CHARS\n ? `${text.slice(0, OPERAND_PREVIEW_CHARS)}…`\n : text;\n };\n return {\n CallExpression(node: TSESTree.CallExpression): void {\n const callee = node.callee;\n if (callee.type !== AST_NODE_TYPES.MemberExpression || callee.computed) {\n return;\n }\n if (callee.property.type !== AST_NODE_TYPES.Identifier) {\n return;\n }\n const matcher = callee.property.name;\n const operand = expectOperand(callee);\n if (operand === null || !isLiteral(operand)) {\n return;\n }\n if (ZERO_ARG_MATCHERS.has(matcher) && node.arguments.length === 0) {\n context.report({\n node,\n messageId: \"tautologicalMatcher\",\n data: { operand: preview(operand), matcher },\n });\n return;\n }\n const expected = node.arguments[0];\n if (\n !EQUALITY_MATCHERS.has(matcher) ||\n node.arguments.length !== 1 ||\n expected === undefined ||\n !isLiteral(expected)\n ) {\n return;\n }\n // Textual identity, not structural: `expect(1).toBe(1.0)` is a\n // deliberate statement about representation and is left alone.\n if (context.sourceCode.getText(operand) !== context.sourceCode.getText(expected)) {\n return;\n }\n context.report({\n node,\n messageId: \"tautologicalComparison\",\n data: { operand: preview(operand), matcher },\n });\n },\n };\n },\n});\n","/**\n * @fileoverview no-trailing-value-narration — a trailing comment restating the literal beside it drifts the moment someone edits the arithmetic.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-trailing-value-narration.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-trailing-value-narration.md\n */\n\nimport { type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { codeTokens, hasExternalReference, stem } from \"./_comments.js\";\nimport { isGeneratedFile } from \"./_paths.js\";\n\ntype MessageIds = \"narratesValue\";\ntype Options = readonly [];\n\n// A number that is not part of an identifier or a dotted member path.\nconst NUMBER_RE = /(?<![\\w.])(\\d+(?:\\.\\d+)?)(?![\\w.])/g;\nconst WORD_RE = /[A-Za-z]+(?:'[a-z]+)?|\\d+(?:\\.\\d+)?/g;\n\n// Words that name the unit rather than the quantity — the one thing the code\n// does not say, and the reason the fix is a *name*, not a deletion.\nconst UNIT_WORDS: ReadonlySet<string> = new Set([\n \"bytes\", \"characters\", \"chars\", \"day\", \"days\", \"gb\", \"hour\", \"hours\", \"hr\",\n \"hrs\", \"hz\", \"items\", \"k\", \"kb\", \"khz\", \"m\", \"mb\", \"milliseconds\", \"min\",\n \"mins\", \"minute\", \"minutes\", \"ms\", \"pct\", \"percent\", \"px\", \"retries\", \"rows\",\n \"s\", \"sec\", \"second\", \"seconds\", \"secs\", \"times\", \"tokens\",\n]);\n\nconst STOPWORDS: ReadonlySet<string> = new Set([\n \"a\", \"an\", \"and\", \"are\", \"as\", \"at\", \"be\", \"by\", \"for\", \"in\", \"is\", \"it\",\n \"of\", \"on\", \"or\", \"that\", \"the\", \"this\", \"we\", \"with\",\n]);\n\nconst DIRECTIVE_RE =\n /^\\s*(?:eslint\\b|eslint-|sarj-noqa\\b|@ts-|prettier|biome-|c8\\b|v8\\b|istanbul\\b|todo\\b|fixme\\b|hack\\b|xxx\\b)/i;\n\nfunction numbersIn(text: string): Set<string> {\n return new Set(text.match(NUMBER_RE) ?? []);\n}\n\nfunction narratesValue(body: string, code: string): boolean {\n if (body.length === 0 || DIRECTIVE_RE.test(body) || hasExternalReference(body)) return false;\n const codeNumbers = numbersIn(code);\n if (codeNumbers.size === 0) return false;\n const words = (body.match(WORD_RE) ?? []).map((word) => word.toLowerCase());\n if (words.length === 0) return false;\n const commentNumbers = numbersIn(body);\n if (commentNumbers.size === 0) return false;\n for (const number of commentNumbers) {\n if (!codeNumbers.has(number)) return false;\n }\n const identifiers = codeTokens(code);\n const stems = new Set<string>();\n for (const token of identifiers) stems.add(stem(token));\n return words.every(\n (word) =>\n STOPWORDS.has(word) ||\n UNIT_WORDS.has(word) ||\n commentNumbers.has(word) ||\n identifiers.has(word) ||\n stems.has(stem(word)),\n );\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-trailing-value-narration\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Flag a trailing comment whose every word and number is already on the line it annotates.\",\n },\n schema: [],\n messages: {\n narratesValue:\n \"Trailing comment restates the literal on this line — put the unit in the name (STALE_TIME_MS) so it cannot drift.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (isGeneratedFile(context.filename, context.sourceCode.text)) {\n return {};\n }\n const sourceCode = context.sourceCode;\n\n function isTrailing(comment: TSESTree.Comment): boolean {\n const before = sourceCode.getTokenBefore(comment, { includeComments: false });\n return before !== null && before.loc.end.line === comment.loc.start.line;\n }\n\n return {\n Program(): void {\n for (const comment of sourceCode.getAllComments()) {\n if (!isTrailing(comment)) continue;\n const line = sourceCode.lines[comment.loc.start.line - 1] ?? \"\";\n const code = line.slice(0, comment.loc.start.column);\n const body = comment.value.replace(/^\\*+/, \"\").replace(/\\*+$/, \"\").trim();\n if (narratesValue(body, code)) {\n context.report({ node: comment, messageId: \"narratesValue\" });\n }\n }\n },\n };\n },\n});\n","/**\n * @fileoverview no-declaration-comment-wall — an enum body or class body whose member comments mostly re-spell the members is a wall the reader pays for by the block.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-declaration-comment-wall.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-declaration-comment-wall.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport {\n BARE_LABEL_RE,\n WALL_DEFAULTS,\n WALL_SCHEMA,\n type WallOptions,\n carriesValue,\n commentBody,\n declarationRange,\n isLabel,\n isTagsOnly,\n isWall,\n knownTokens,\n labelStems,\n novelWords,\n} from \"./_comment-wall.js\";\nimport { createRule } from \"./_docs.js\";\nimport { isGeneratedFile, isStoryFile, isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"commentWall\";\n\ntype Options = readonly [Partial<WallOptions>?];\n\n/** A member this rule can judge: something with a name and a source range. */\ninterface Judged {\n readonly node: TSESTree.Node;\n readonly key: TSESTree.Node;\n}\n\nfunction named(node: TSESTree.Node): Judged | undefined {\n switch (node.type) {\n case AST_NODE_TYPES.TSEnumMember:\n return { node, key: node.id };\n case AST_NODE_TYPES.PropertyDefinition:\n case AST_NODE_TYPES.TSAbstractPropertyDefinition:\n case AST_NODE_TYPES.MethodDefinition:\n case AST_NODE_TYPES.TSAbstractMethodDefinition:\n return node.computed ? undefined : { node, key: node.key };\n default:\n return undefined;\n }\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-declaration-comment-wall\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Flag an enum body or class body whose member comments mostly re-spell the members' own names.\",\n },\n schema: [WALL_SCHEMA],\n messages: {\n commentWall:\n \"{{restated}} of this declaration's {{commented}} member comments only re-spell the member's own name — delete them, and keep the rows that say what the name cannot.\",\n },\n },\n defaultOptions: [WALL_DEFAULTS],\n create(context, [provided]) {\n const options: WallOptions = { ...WALL_DEFAULTS, ...provided };\n const sourceCode = context.sourceCode;\n // Generated or vendored, a test fixture, or a demo story: three kinds of\n // file whose member comments are output rather than commentary.\n if (\n isGeneratedFile(context.filename, sourceCode.text) ||\n isTestFile(context.filename) ||\n isStoryFile(context.filename)\n ) {\n return {};\n }\n\n // One pass over the file's comments, indexed by the line they end on (a\n // leading comment) and the line they start on (a trailing one).\n const endingOn = new Map<number, TSESTree.Comment>();\n const startingOn = new Map<number, TSESTree.Comment>();\n for (const comment of sourceCode.getAllComments()) {\n endingOn.set(comment.loc.end.line, comment);\n if (!startingOn.has(comment.loc.start.line)) startingOn.set(comment.loc.start.line, comment);\n }\n\n /**\n * The comment documenting `member`: the block or line comment on the row\n * above it, or the one trailing its last row.\n *\n * A leading comment counts only when the MEMBER starts its own line, and\n * only when the comment is alone on ITS line; a trailing comment counts only\n * when it sits after the member it is read against. Between them no comment\n * can document two members, which is why this rule needs no claim set.\n */\n function documentingComment(member: TSESTree.Node): TSESTree.Comment | undefined {\n const beforeMember = sourceCode.getTokenBefore(member, { includeComments: false });\n const ownsItsLine =\n beforeMember === null || beforeMember.loc.end.line < member.loc.start.line;\n const lead = ownsItsLine ? endingOn.get(member.loc.start.line - 1) : undefined;\n if (lead !== undefined) {\n const before = sourceCode.getTokenBefore(lead, { includeComments: false });\n if (before === null || before.loc.end.line < lead.loc.start.line) return lead;\n }\n const trail = startingOn.get(member.loc.end.line);\n return trail !== undefined && trail.range[0] > member.range[0] ? trail : undefined;\n }\n\n /**\n * True when a comment heads a REGION instead of describing the member under\n * it. The body is ONE bare identifier word; it names something OTHER than\n * the member below it; and it shows region evidence, heading a run of\n * members of which only the first is commented, or set off by a blank line.\n */\n function isGroupLabel(comment: TSESTree.Comment, member: Judged, headsRun: boolean): boolean {\n if (comment.loc.end.line >= member.node.loc.start.line) return false;\n const body = commentBody(comment);\n if (!BARE_LABEL_RE.test(body)) return false;\n if (labelStems(body) === labelStems(sourceCode.getText(member.key))) return false;\n const lineAbove = sourceCode.lines[comment.loc.start.line - 2];\n return headsRun || (lineAbove !== undefined && lineAbove.trim().length === 0);\n }\n\n function check(node: TSESTree.Node, members: readonly TSESTree.Node[]): void {\n const judged = members.map(named).filter((member): member is Judged => member !== undefined);\n if (judged.length === 0) return;\n\n const documented = judged.map((member) => ({\n member,\n comment: documentingComment(member.node),\n }));\n let commented = 0;\n let restated = 0;\n for (const [index, { member, comment }] of documented.entries()) {\n if (comment === undefined) continue;\n const next = documented[index + 1];\n if (isGroupLabel(comment, member, next !== undefined && next.comment === undefined)) {\n continue;\n }\n commented += 1;\n const body = commentBody(comment);\n // A tag block is a directive to a documentation generator, and one\n // content word is a label; neither is a re-spelling of the name.\n if (body.length === 0 || carriesValue(body) || isTagsOnly(body) || isLabel(body)) {\n continue;\n }\n const [start, end] = declarationRange(member.node);\n if (novelWords(body, knownTokens(sourceCode.text.slice(start, end))) <= options.maxNovelWords) {\n restated += 1;\n }\n }\n\n if (!isWall(judged.length, commented, restated, options)) return;\n context.report({\n node,\n loc: {\n start: node.loc.start,\n end: { line: node.loc.start.line, column: node.loc.start.column + 1 },\n },\n messageId: \"commentWall\",\n data: { restated: String(restated), commented: String(commented) },\n });\n }\n\n return {\n ClassBody: (node: TSESTree.ClassBody) => {\n check(node, node.body);\n },\n TSEnumDeclaration: (node: TSESTree.TSEnumDeclaration) => {\n check(node, node.body.members);\n },\n };\n },\n});\n","/**\n * @fileoverview _comment-wall — the shared judgement behind the comment-VOLUME rules: a run of member comments that mostly re-spell their members is a wall.\n *\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/_comment-wall.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { isProtected, splitIdentifier, stem } from \"./_comments.js\";\n\n/** Every threshold the wall rules apply; each is documented at `WALL_DEFAULTS`. */\nexport interface WallOptions {\n readonly minCommentedMembers: number;\n readonly minCommentedRatio: number;\n readonly minRestatedRatio: number;\n readonly maxNovelWords: number;\n}\n\nexport const WALL_DEFAULTS: WallOptions = {\n // Below three rows \"a wall\" is not a fair description of what the reader sees.\n minCommentedMembers: 3,\n // A minority of commented members is a GROUP LABEL, not a wall.\n minCommentedRatio: 0.6,\n // Room for one substantive row in four; a declaration where a quarter of the\n // comments say something real is one someone was documenting, not decorating.\n minRestatedRatio: 0.75,\n // One word beyond the member's own text. Zero is `no-restated-jsdoc`'s test\n // and is already covered there; two admits definitions (\"Partial match\"\n // beside \"Exact match\").\n maxNovelWords: 1,\n};\n\n/** The `meta.schema` entry both wall rules expose, so the knobs cannot drift. */\nexport const WALL_SCHEMA = {\n type: \"object\",\n additionalProperties: false,\n properties: {\n minCommentedMembers: {\n type: \"integer\",\n minimum: 2,\n description: \"Fewest commented members that can count as a wall.\",\n },\n minCommentedRatio: {\n type: \"number\",\n minimum: 0,\n maximum: 1,\n description:\n \"Least share of the members that must be commented; below it the comments are group labels.\",\n },\n minRestatedRatio: {\n type: \"number\",\n minimum: 0,\n maximum: 1,\n description: \"Least share of the member comments that must be restatements.\",\n },\n maxNovelWords: {\n type: \"integer\",\n minimum: 0,\n description:\n \"Most content words a comment may add beyond its member's own source and still count as a restatement.\",\n },\n },\n} as const;\n\n// Tags that carry what the signature cannot. `no-restated-jsdoc` reaches the\n// same verdict by a different route — anything outside the small set of tags it\n// models leaves the block alone — so there is no shared list to drift against,\n// and this one stands on its own.\nconst VALUE_TAG_RE =\n /@(?:deprecated|see|example|throws|remarks|since|default|defaultvalue|link|internal|alpha|beta|experimental|template|typeparam|inheritdoc|todo|fixme|override)\\b/i;\n\n// A documented default. The default of an optional member is precisely the fact\n// its type cannot hold.\nconst DEFAULT_RE = /^\\s*@?default\\b|\\bdefaults? (?:to|:)/i;\n\n// A digit is a bound, a base, an index origin, a status code or a version — all\n// facts about the world rather than about the name. A unit word is the same fact\n// spelled without one.\nconst DIGIT_RE = /\\d/;\nconst UNIT_WORD_RE =\n /\\b(?:ms|milliseconds?|seconds?|minutes?|hours?|days?|weeks?|months?|years?|bytes?|kb|mb|gb|percent|pixels?|px|utc|epoch)\\b/i;\n\n// A quoted example value or an `e.g.` enumerates what the type only bounds.\nconst EXAMPLE_RE = /[\"'`]|\\be\\.g\\.|\\bi\\.e\\./;\n\n// Every word of the body belongs to a JSDoc tag, so the block is an instruction\n// to a documentation generator rather than a sentence about the member.\nconst TAG_TOKEN_RE = /@\\w+/g;\n\n// A rule of dashes is a banner; `no-comment-cruft` owns that shape.\nconst BANNER_RE = /[=\\-─-╿*#~_.]{3,}/;\n\n// Prose the tokenizer cannot read, so \"adds no new word\" is unmeasurable.\nconst NON_ASCII_LETTER_RE = /[^\\p{ASCII}\\p{N}\\p{P}\\p{Z}]/u;\n\n/**\n * Filler that says nothing about *which* member is being described. Wider than\n * `_comments.STOPWORDS` for the same reason `no-restated-jsdoc`'s list is:\n * member documentation conventionally repeats the vocabulary of the type system\n * itself (\"the optional callback value\") without that being a claim.\n *\n * Deliberately absent: `class`, `method`, `function`, `component`, `hook`,\n * `parameter`, `argument`. In a reflection or decorator type those words are the\n * whole claim — `Function` cannot say \"class\" and `number` cannot say\n * \"parameter\". The tag words `param` and `arg` stay: block punctuation, not\n * prose.\n */\nexport const WALL_STOPWORDS: ReadonlySet<string> = new Set(\n `the a an of to for in on with and or as at by is are was be been being\n this that it its if whether when where which what will would can could should\n must may into from over about not no does do done has have had used use uses\n using given provided specified current new existing all any each per via\n instance object value values data item\n items element callback handler prop props param arg return\n returns returning result optional required true false null undefined\n string number boolean array list promise set map record type name`.split(/\\s+/),\n);\n\nconst WORD_RE = /[A-Za-z][A-Za-z0-9]*/g;\n\n// A label is one bare identifier word: `// links`, `// clientMiddleware`. Two\n// words of prose is already a sentence about the member below it.\nexport const BARE_LABEL_RE = /^[A-Za-z][A-Za-z0-9]*$/;\n\n/** The identifier `body` spells, folded so `links` and `Links` are one word. */\nexport function labelStems(body: string): string {\n return splitIdentifier(body).map(stem).join(\" \");\n}\n\n/** Strip the `*` decoration off a block comment so JSDoc and `//` read alike. */\nexport function commentBody(comment: TSESTree.Comment): string {\n return comment.value\n .replace(/^\\*+/, \"\")\n .replace(/^[ \\t]*\\*[ \\t]?/gm, \"\")\n .trim();\n}\n\n/**\n * True when a member comment carries something a name and a type cannot — the\n * exemption floor shared by both wall rules. Counted as a comment, never as a\n * restatement.\n *\n * `isLabel` and `isTagsOnly` are deliberately NOT folded in here. On an object\n * TYPE a one-word comment really is a name restatement (`// links` over\n * `links`), which that rule's own group-label guard separates; the populations\n * that spell mapping tables that way belong to its sibling.\n */\nexport function carriesValue(body: string): boolean {\n return (\n isProtected(body) ||\n VALUE_TAG_RE.test(body) ||\n DEFAULT_RE.test(body) ||\n DIGIT_RE.test(body) ||\n UNIT_WORD_RE.test(body) ||\n EXAMPLE_RE.test(body) ||\n BANNER_RE.test(body) ||\n NON_ASCII_LETTER_RE.test(body)\n );\n}\n\n/**\n * True when `body` is one content word or fewer — a LABEL or a tag, never a\n * description of the member below it.\n *\n * With `maxNovelWords` at one, a single novel word scores as a restatement by\n * arithmetic rather than by meaning. One word beside a key is the opposite of a\n * re-spelling: it is the one thing the key does not say.\n */\nexport function isLabel(body: string): boolean {\n let content = 0;\n for (const word of body.match(WORD_RE) ?? []) {\n if (word.length >= 2 && !WALL_STOPWORDS.has(word.toLowerCase())) content += 1;\n }\n return content <= 1;\n}\n\n/** True when `body` carries no prose at all beyond its JSDoc tags. */\nexport function isTagsOnly(body: string): boolean {\n return body.length > 0 && body.replace(TAG_TOKEN_RE, \"\").trim().length === 0;\n}\n\n/** Every identifier part of a slice of source, plus its stem. */\nexport function knownTokens(source: string): ReadonlySet<string> {\n const tokens = new Set<string>();\n for (const identifier of source.match(/[A-Za-z_$][\\w$]*/g) ?? []) {\n for (const part of splitIdentifier(identifier)) {\n tokens.add(part);\n tokens.add(stem(part));\n }\n }\n return tokens;\n}\n\n/** Content words of `body` that do not already appear in `known`. */\nexport function novelWords(body: string, known: ReadonlySet<string>): number {\n let novel = 0;\n for (const word of body.match(WORD_RE) ?? []) {\n const lower = word.toLowerCase();\n if (lower.length < 2 || WALL_STOPWORDS.has(lower)) continue;\n if (!known.has(lower) && !known.has(stem(lower))) novel += 1;\n }\n return novel;\n}\n\n/**\n * True when a run of members carrying `commented` comments, `restated` of them\n * restatements, is a wall under `options`.\n */\nexport function isWall(\n members: number,\n commented: number,\n restated: number,\n options: WallOptions,\n): boolean {\n return (\n commented >= options.minCommentedMembers &&\n commented / members >= options.minCommentedRatio &&\n restated / commented >= options.minRestatedRatio\n );\n}\n\nconst OPAQUE_VALUE_TYPES: ReadonlySet<AST_NODE_TYPES> = new Set([\n AST_NODE_TYPES.FunctionExpression,\n AST_NODE_TYPES.ArrowFunctionExpression,\n AST_NODE_TYPES.ObjectExpression,\n AST_NODE_TYPES.ArrayExpression,\n]);\n\n/**\n * The part of a member a reader reads as its DECLARATION — the key, the type\n * annotation and, for a callable, the parameter list.\n *\n * A method body, an object value and an array value are all deliberately\n * excluded. Each names every identifier it touches, so reading a comment against\n * one makes almost any comment \"already said\": the token set stops being the\n * member's own words and becomes the value's. A label naming what a nested\n * object configures shares its vocabulary with that object and with nothing in\n * the name it labels.\n */\nexport function declarationRange(member: TSESTree.Node): [number, number] {\n const body = bodyOf(member);\n if (body === undefined) return [member.range[0], member.range[1]];\n return [member.range[0], body.range[0]];\n}\n\nfunction bodyOf(member: TSESTree.Node): TSESTree.Node | undefined {\n if (\n member.type === AST_NODE_TYPES.MethodDefinition ||\n member.type === AST_NODE_TYPES.TSAbstractMethodDefinition\n ) {\n return member.value.body ?? undefined;\n }\n if (member.type === AST_NODE_TYPES.Property || member.type === AST_NODE_TYPES.PropertyDefinition) {\n const value = member.value;\n if (value !== null && OPAQUE_VALUE_TYPES.has(value.type)) return value;\n }\n return undefined;\n}\n","/**\n * @fileoverview no-type-member-comment-wall — an object type whose member comments mostly re-spell the members is a wall the reader pays for by the block.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-type-member-comment-wall.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-type-member-comment-wall.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\n\nimport {\n BARE_LABEL_RE,\n WALL_DEFAULTS,\n WALL_SCHEMA,\n type WallOptions,\n carriesValue,\n commentBody,\n isWall,\n knownTokens,\n labelStems,\n novelWords,\n} from \"./_comment-wall.js\";\nimport { isGeneratedFile, isStoryFile, isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"commentWall\";\n\ntype Options = readonly [Partial<WallOptions>?];\n\n/** A member the rule can judge: a named property or method signature. */\ntype NamedMember = TSESTree.TSPropertySignature | TSESTree.TSMethodSignature;\n\nfunction isNamedMember(node: TSESTree.TypeElement): node is NamedMember {\n return (\n (node.type === AST_NODE_TYPES.TSPropertySignature ||\n node.type === AST_NODE_TYPES.TSMethodSignature) &&\n !node.computed\n );\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-type-member-comment-wall\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Flag an object type whose member comments mostly re-spell the members' own names and types.\",\n },\n schema: [WALL_SCHEMA],\n messages: {\n commentWall:\n \"{{restated}} of this type's {{commented}} member comments only re-spell the member's own name and type — delete them, and keep the rows that say what the name cannot.\",\n },\n },\n defaultOptions: [WALL_DEFAULTS],\n create(context, [provided]) {\n const options: WallOptions = { ...WALL_DEFAULTS, ...provided };\n const sourceCode = context.sourceCode;\n // Generated or vendored, a test fixture, or a demo story: three kinds of\n // file whose member comments are output rather than commentary.\n if (\n isGeneratedFile(context.filename, sourceCode.text, [\"externalTree\"]) ||\n isTestFile(context.filename, [\"fixtureTree\"]) ||\n isStoryFile(context.filename, [\"storyTree\"])\n ) {\n return {};\n }\n\n // One pass over the file's comments, indexed by the line they end on (a\n // leading comment) and the line they start on (a trailing one).\n const endingOn = new Map<number, TSESTree.Comment>();\n const startingOn = new Map<number, TSESTree.Comment>();\n for (const comment of sourceCode.getAllComments()) {\n endingOn.set(comment.loc.end.line, comment);\n if (!startingOn.has(comment.loc.start.line)) startingOn.set(comment.loc.start.line, comment);\n }\n\n /**\n * The comment documenting `member`: the block or line comment on the row\n * above it, or the one trailing its last row.\n *\n * A leading comment counts only when the MEMBER starts its own line, and\n * only when the comment is alone on ITS line; a trailing comment counts\n * only when it sits after the member it is read against. All three keep a\n * one-line type literal under a doc block from reading as three members\n * documented three times with the same words.\n */\n function documentingComment(member: NamedMember): TSESTree.Comment | undefined {\n const beforeMember = sourceCode.getTokenBefore(member, { includeComments: false });\n const ownsItsLine =\n beforeMember === null || beforeMember.loc.end.line < member.loc.start.line;\n const lead = ownsItsLine ? endingOn.get(member.loc.start.line - 1) : undefined;\n if (lead !== undefined) {\n const before = sourceCode.getTokenBefore(lead, { includeComments: false });\n if (before === null || before.loc.end.line < lead.loc.start.line) return lead;\n }\n const trail = startingOn.get(member.loc.end.line);\n return trail !== undefined && trail.range[0] > member.range[0] ? trail : undefined;\n }\n\n /**\n * True when a comment heads a REGION of the type instead of describing the\n * member under it — the exemption this rule documents and, before this\n * check, leaked on.\n *\n * Three conditions. The body is ONE bare identifier word; it names\n * something OTHER than the member below it (the decisive one — `// links`\n * over `LinkDescriptors` heads a group, `// links` over `links` restates a\n * name); and it shows region evidence, heading a run of members of which\n * only the first is commented, or set off by a blank line.\n */\n function isGroupLabel(\n comment: TSESTree.Comment,\n member: NamedMember,\n headsRun: boolean,\n ): boolean {\n if (comment.loc.end.line >= member.loc.start.line) return false;\n const body = commentBody(comment);\n if (!BARE_LABEL_RE.test(body)) return false;\n if (labelStems(body) === labelStems(sourceCode.getText(member.key))) return false;\n const lineAbove = sourceCode.lines[comment.loc.start.line - 2];\n return headsRun || (lineAbove !== undefined && lineAbove.trim().length === 0);\n }\n\n function check(node: TSESTree.TSInterfaceBody | TSESTree.TSTypeLiteral): void {\n const members = node.type === AST_NODE_TYPES.TSInterfaceBody ? node.body : node.members;\n const named = members.filter(isNamedMember);\n if (named.length === 0) return;\n\n const documented = named.map((member) => ({ member, comment: documentingComment(member) }));\n let commented = 0;\n let restated = 0;\n // A comment documents at most one member, so a shared block cannot be\n // counted once per member that happens to sit next to it.\n const claimed = new Set<TSESTree.Comment>();\n for (const [index, { member, comment }] of documented.entries()) {\n if (comment === undefined || claimed.has(comment)) continue;\n const next = documented[index + 1];\n if (isGroupLabel(comment, member, next !== undefined && next.comment === undefined)) {\n continue;\n }\n claimed.add(comment);\n commented += 1;\n const body = commentBody(comment);\n if (body.length === 0 || carriesValue(body)) continue;\n if (novelWords(body, knownTokens(sourceCode.getText(member))) <= options.maxNovelWords) {\n restated += 1;\n }\n }\n\n if (!isWall(named.length, commented, restated, options)) return;\n context.report({\n node,\n loc: {\n start: node.loc.start,\n end: { line: node.loc.start.line, column: node.loc.start.column + 1 },\n },\n messageId: \"commentWall\",\n data: { restated: String(restated), commented: String(commented) },\n });\n }\n\n return {\n TSInterfaceBody: check,\n TSTypeLiteral: check,\n };\n },\n});\n","/**\n * @fileoverview no-unnecessary-use-client — a `'use client'` file with no hooks, handlers or browser globals ships to the client for nothing.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-unnecessary-use-client.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-unnecessary-use-client.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport type { RuleContext, Scope } from \"@typescript-eslint/utils/ts-eslint\";\n\ntype MessageIds = \"unnecessaryUseClient\";\ntype Options = readonly [];\n\nconst HOOK_REGEX = /^use([A-Z]|$)/;\nconst EVENT_PROP_REGEX = /^on[A-Z]/;\nconst ERROR_FILE_REGEX = /\\b(?:global-)?error\\.[jt]sx?$/;\n\nconst BROWSER_GLOBALS: ReadonlySet<string> = new Set([\n \"window\",\n \"document\",\n \"navigator\",\n \"localStorage\",\n \"sessionStorage\",\n \"location\",\n \"history\",\n \"screen\",\n \"requestAnimationFrame\",\n \"cancelAnimationFrame\",\n \"CustomEvent\",\n \"Event\",\n \"MouseEvent\",\n \"KeyboardEvent\",\n \"TouchEvent\",\n]);\n\n/**\n * Modules whose very import forces a client boundary, independent of what the\n * file then does with them. `next/dynamic` is the case that matters: in the App\n * Router, `dynamic(..., { ssr: false })` is a BUILD ERROR in a Server Component\n * (\"`ssr: false` is not allowed with `next/dynamic` in Server Components\"), so a\n * lazy-wrapper module has no legal form without `'use client'`.\n */\nconst CLIENT_REQUIRED_MODULES: ReadonlySet<string> = new Set([\"next/dynamic\"]);\n\nconst CLIENT_ONLY_PACKAGES_REGEX =\n /^(?:@radix-ui\\/|framer-motion|react-dom|react-day-picker|@floating-ui\\/|react-select|react-toastify|react-hook-form|recharts|react-dropzone|react-slick|react-swipeable|react-resizable|react-draggable|react-beautiful-dnd|@hello-pangea\\/dnd|react-virtualized|react-window|@tanstack\\/react-table|@tanstack\\/react-query|react-redux|recoil|jotai|zustand|@tippyjs\\/react|react-color|react-datepicker|next-themes|react-helmet|react-helmet-async|styled-components|@emotion\\/)/;\n\ntype Ctx = Readonly<RuleContext<MessageIds, Options>>;\n\n/**\n * True for a package specifier — anything that is not a relative path or one of\n * the usual in-repo alias prefixes. A relative/aliased import points at code in\n * this repo, which this same rule already lints, so the \"cannot see into the\n * dependency\" argument does not apply to it.\n */\nconst isBareSpecifier = (source: string): boolean =>\n !source.startsWith(\".\") && !source.startsWith(\"/\") && !source.startsWith(\"@/\") && !source.startsWith(\"~\");\n\n/** The leftmost identifier of a JSX element name: `Primitive.Tabs` -> `Primitive`. */\nconst jsxRootName = (name: TSESTree.JSXTagNameExpression): string => {\n let current: TSESTree.JSXTagNameExpression = name;\n while (current.type === AST_NODE_TYPES.JSXMemberExpression) {\n current = current.object;\n }\n return current.type === AST_NODE_TYPES.JSXIdentifier ? current.name : \"\";\n};\n\n/** True when any identifier in `node`'s subtree names an imported binding. */\nconst subtreeReadsImportedBinding = (\n node: TSESTree.Node,\n imported: ReadonlySet<string>,\n): boolean => {\n if (node.type === AST_NODE_TYPES.Identifier) {\n return imported.has(node.name);\n }\n for (const key of Object.keys(node) as (keyof TSESTree.Node)[]) {\n if (key === \"parent\") continue;\n const value = node[key];\n for (const child of (Array.isArray(value) ? value : [value]) as unknown[]) {\n if (\n child !== null &&\n typeof child === \"object\" &&\n typeof (child as { type?: unknown }).type === \"string\" &&\n subtreeReadsImportedBinding(child as TSESTree.Node, imported)\n ) {\n return true;\n }\n }\n }\n return false;\n};\n\nconst isUseClientDirective = (\n node: TSESTree.Statement,\n): node is TSESTree.ExpressionStatement => {\n return (\n node.type === AST_NODE_TYPES.ExpressionStatement &&\n node.expression.type === AST_NODE_TYPES.Literal &&\n node.expression.value === \"use client\"\n );\n};\n\nconst isGlobalReference = (\n node: TSESTree.Identifier,\n context: Ctx,\n): boolean => {\n if (!BROWSER_GLOBALS.has(node.name)) return false;\n\n const parent = node.parent;\n if (parent !== undefined) {\n // `obj.window` — `window` is a property name, not a global reference.\n if (\n parent.type === AST_NODE_TYPES.MemberExpression &&\n parent.property === node &&\n !parent.computed\n ) {\n return false;\n }\n // `{ window: ... }` — property key, not a global reference.\n if (\n parent.type === AST_NODE_TYPES.Property &&\n parent.key === node &&\n !parent.computed\n ) {\n return false;\n }\n // Type annotations / type-only positions are not runtime references.\n if (parent.type.startsWith(\"TS\")) {\n return false;\n }\n }\n\n // If there's a local binding for this name anywhere up the chain, it's not\n // a reference to the browser global.\n let scope: Scope.Scope | null = context.sourceCode.getScope(node);\n while (scope !== null) {\n const variable = scope.set.get(node.name);\n if (variable !== undefined && variable.defs.length > 0) {\n return false;\n }\n scope = scope.upper;\n }\n\n return true;\n};\n\nexport default createRule<Options, MessageIds>({\n name: \"no-unnecessary-use-client\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Flag `'use client'` files with no hooks or event handlers — they could be RSC.\",\n },\n schema: [],\n messages: {\n unnecessaryUseClient:\n \"'use client' directive but no hooks (use*), JSX event handlers (on*), browser globals, or client-only imports found. Consider removing the directive and serving as a React Server Component.\",\n },\n },\n defaultOptions: [],\n create(context) {\n const filename = context.filename;\n if (ERROR_FILE_REGEX.test(filename)) {\n return {};\n }\n\n let directiveNode: TSESTree.ExpressionStatement | null = null;\n let hasClientIndicator = false;\n /** Every local name bound by an import, whatever the module. */\n const importedLocals = new Set<string>();\n /** Locals bound from a BARE (third-party) specifier — see @fileoverview. */\n const externalLocals = new Set<string>();\n\n const markIfHookOrContext = (\n callee: TSESTree.CallExpression[\"callee\"],\n ): void => {\n if (callee.type === AST_NODE_TYPES.Identifier) {\n if (HOOK_REGEX.test(callee.name) || callee.name === \"createContext\") {\n hasClientIndicator = true;\n }\n return;\n }\n if (\n callee.type === AST_NODE_TYPES.MemberExpression &&\n callee.property.type === AST_NODE_TYPES.Identifier\n ) {\n const name = callee.property.name;\n if (HOOK_REGEX.test(name) || name === \"createContext\") {\n hasClientIndicator = true;\n }\n }\n };\n\n return {\n Program(node): void {\n for (const stmt of node.body) {\n // Directives must be the first statements; once we see a non-\n // ExpressionStatement, stop scanning.\n if (stmt.type !== AST_NODE_TYPES.ExpressionStatement) break;\n if (isUseClientDirective(stmt)) {\n directiveNode = stmt;\n break;\n }\n }\n },\n CallExpression(node): void {\n // The `Program` visitor (entered first) has already determined whether\n // this file has a `'use client'` directive. If it doesn't, the result\n // can't change — skip all of the per-node indicator work, including the\n // hot scope-resolution in the `Identifier` visitor below.\n if (directiveNode === null) return;\n markIfHookOrContext(node.callee);\n },\n JSXAttribute(node): void {\n if (directiveNode === null) return;\n if (\n node.name.type === AST_NODE_TYPES.JSXIdentifier &&\n EVENT_PROP_REGEX.test(node.name.name)\n ) {\n hasClientIndicator = true;\n }\n },\n ImportDeclaration(node): void {\n if (directiveNode === null) return;\n if (typeof node.source.value !== \"string\") return;\n const source = node.source.value;\n if (\n CLIENT_ONLY_PACKAGES_REGEX.test(source) ||\n CLIENT_REQUIRED_MODULES.has(source)\n ) {\n hasClientIndicator = true;\n }\n for (const specifier of node.specifiers) {\n importedLocals.add(specifier.local.name);\n if (isBareSpecifier(source)) {\n externalLocals.add(specifier.local.name);\n }\n }\n },\n JSXOpeningElement(node): void {\n if (directiveNode === null) return;\n // Indicator 1: rendering a third-party component — this rule cannot see\n // whether the dependency itself needs a client boundary.\n if (externalLocals.has(jsxRootName(node.name))) {\n hasClientIndicator = true;\n }\n },\n ExportNamedDeclaration(node): void {\n if (directiveNode === null) return;\n if (node.source !== null) {\n hasClientIndicator = true;\n return;\n }\n // Indicator 2: `export const X = SomeImport.X` — a re-export written\n // the long way, so it must agree with the `export … from` branch above.\n if (\n node.declaration !== null &&\n subtreeReadsImportedBinding(node.declaration, importedLocals)\n ) {\n hasClientIndicator = true;\n }\n },\n ExportAllDeclaration(node): void {\n if (directiveNode === null) return;\n if (node.source !== null) {\n hasClientIndicator = true;\n }\n },\n ClassDeclaration(): void {\n if (directiveNode === null) return;\n hasClientIndicator = true;\n },\n ClassExpression(): void {\n if (directiveNode === null) return;\n hasClientIndicator = true;\n },\n Identifier(node): void {\n if (directiveNode === null) return;\n if (isGlobalReference(node, context)) {\n hasClientIndicator = true;\n }\n },\n \"Program:exit\"(): void {\n if (directiveNode !== null && !hasClientIndicator) {\n context.report({\n node: directiveNode,\n messageId: \"unnecessaryUseClient\",\n });\n }\n },\n };\n },\n});\n","/**\n * @fileoverview no-unsafe-mock-casting — a cast to `vi.Mock` / `jest.Mock` asserts a mock that may not exist; `vi.mocked()` checks it.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-unsafe-mock-casting.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-unsafe-mock-casting.md\n */\n\nimport { type TSESTree } from \"@typescript-eslint/utils\";\nimport { AST_NODE_TYPES } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isGeneratedFile } from \"./_paths.js\";\n\ntype MessageIds = \"unsafeMockCast\";\n\nfunction isMockTypeReference(node: TSESTree.TypeNode): boolean {\n if (node.type !== AST_NODE_TYPES.TSTypeReference) {\n return false;\n }\n \n const typeName = node.typeName;\n \n if (typeName.type === AST_NODE_TYPES.Identifier) {\n const name = typeName.name;\n return name === \"Mock\" || name === \"MockInstance\" || name === \"SpyInstance\";\n }\n \n if (typeName.type === AST_NODE_TYPES.TSQualifiedName) {\n const rightName = typeName.right.name;\n return rightName === \"Mock\" || rightName === \"MockInstance\" || rightName === \"SpyInstance\";\n }\n \n return false;\n}\n\nexport default createRule<[], MessageIds>({\n name: \"no-unsafe-mock-casting\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow casting to mock types like `jest.Mock` or `vi.Mock`. Use `vi.mocked()` or `jest.mocked()` instead.\",\n },\n schema: [],\n messages: {\n unsafeMockCast:\n \"Do not cast to a Mock type. Use `vi.mocked(fn)` or `jest.mocked(fn)` instead to preserve type safety.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (isGeneratedFile(context.filename, context.sourceCode.text)) {\n return {};\n }\n\n function checkAssertion(\n node: TSESTree.TSAsExpression | TSESTree.TSTypeAssertion,\n ): void {\n if (isMockTypeReference(node.typeAnnotation)) {\n context.report({ node, messageId: \"unsafeMockCast\" });\n }\n }\n\n return {\n TSAsExpression: checkAssertion,\n TSTypeAssertion: checkAssertion,\n };\n },\n});\n","/**\n * @fileoverview no-zod-native-enum — `z.nativeEnum` exists to wrap a TypeScript `enum`, which `no-enum` already bans.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-zod-native-enum.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-zod-native-enum.md\n */\n\nimport {\n ESLintUtils,\n type TSESLint,\n type TSESTree,\n type ParserServicesWithTypeInformation,\n AST_NODE_TYPES,\n} from \"@typescript-eslint/utils\";\nimport * as ts from \"typescript\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"nativeEnum\" | \"enumOfTsEnum\";\ntype Options = readonly [];\n\nconst IGNORE_PATTERNS: readonly RegExp[] = [\n /[\\\\/]generated[\\\\/]/,\n /\\.gen\\.tsx?$/,\n /\\.generated\\.tsx?$/,\n /\\.d\\.ts$/,\n];\n\nfunction isIgnoredFile(filename: string, sourceText: string): boolean {\n if (IGNORE_PATTERNS.some((re) => re.test(filename))) {\n return true;\n }\n return /@generated\\b/.test(sourceText.slice(0, 1024));\n}\n\n/** `zod`, `zod/v4`, `zod/mini`, `@hono/zod-openapi`, `@/lib/zod`, ... */\nfunction isZodModule(source: string): boolean {\n return /(^|[/@-])zod([/-]|$)/.test(source);\n}\n\n/** Unwraps `x as const` / `x satisfies T` / `(x)` down to the inner expression. */\nfunction unwrap(node: TSESTree.Expression): TSESTree.Expression {\n if (\n node.type === AST_NODE_TYPES.TSAsExpression ||\n node.type === AST_NODE_TYPES.TSSatisfiesExpression\n ) {\n return unwrap(node.expression);\n }\n return node;\n}\n\n/**\n * The string values of an object literal whose every property is a plain\n * `key: \"literal\"` pair, as raw source text (so quote style survives the fix).\n * Returns null when any member is a spread, a computed key, a method, a\n * shorthand, or a non-string value — those sets are not statically rewritable.\n */\nfunction stringValueTexts(\n node: TSESTree.ObjectExpression,\n sourceCode: Readonly<TSESLint.SourceCode>,\n): string[] | null {\n const texts: string[] = [];\n for (const prop of node.properties) {\n if (prop.type !== AST_NODE_TYPES.Property) {\n return null;\n }\n if (prop.computed || prop.shorthand || prop.method || prop.kind !== \"init\") {\n return null;\n }\n const value = prop.value;\n if (\n value.type !== AST_NODE_TYPES.Literal ||\n typeof value.value !== \"string\"\n ) {\n return null;\n }\n const text = sourceCode.getText(value);\n if (!texts.includes(text)) {\n texts.push(text);\n }\n }\n return texts.length > 0 ? texts : null;\n}\n\n/** Resolves an identifier to a `TSEnumDeclaration` declared in this file. */\nfunction resolvesToLocalEnum(\n node: TSESTree.Identifier,\n scope: TSESLint.Scope.Scope,\n): boolean {\n let current: TSESLint.Scope.Scope | null = scope;\n while (current !== null) {\n const variable = current.variables.find((v) => v.name === node.name);\n if (variable !== undefined) {\n return variable.defs.some(\n (def) => def.node.type === AST_NODE_TYPES.TSEnumDeclaration,\n );\n }\n current = current.upper;\n }\n return false;\n}\n\nconst ENUM_SYMBOL_FLAGS =\n ts.SymbolFlags.RegularEnum | ts.SymbolFlags.ConstEnum | ts.SymbolFlags.Enum;\n\n/**\n * Whether the identifier's resolved symbol is a TypeScript enum, following\n * import aliases. Catches `import { Status } from \"./types\"; z.enum(Status)`,\n * which lexical resolution alone cannot see.\n */\nfunction resolvesToImportedEnum(\n node: TSESTree.Identifier,\n services: ParserServicesWithTypeInformation,\n): boolean {\n const checker = services.program.getTypeChecker();\n const tsNode = services.esTreeNodeToTSNodeMap.get(node);\n let symbol = checker.getSymbolAtLocation(tsNode);\n if (symbol === undefined) {\n return false;\n }\n if ((symbol.flags & ts.SymbolFlags.Alias) !== 0) {\n symbol = checker.getAliasedSymbol(symbol);\n }\n return (symbol.flags & ENUM_SYMBOL_FLAGS) !== 0;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"no-zod-native-enum\",\n meta: {\n type: \"suggestion\",\n fixable: \"code\",\n docs: {\n description:\n \"Disallow `z.nativeEnum()` (and `z.enum()` over a TypeScript enum); use `z.enum([\\\"a\\\", \\\"b\\\"])` with a string-literal union instead.\",\n },\n schema: [],\n messages: {\n nativeEnum:\n '`z.nativeEnum()` exists to wrap a TypeScript `enum`, which `no-enum` bans. Use `z.enum([\"a\", \"b\"])` and derive the union with `z.infer<typeof Schema>`.',\n enumOfTsEnum:\n '`z.enum()` is being passed the TypeScript enum `{{name}}`, which `no-enum` bans. Pass a string-literal array instead: `z.enum([\"a\", \"b\"])`.',\n },\n },\n defaultOptions: [],\n create(context) {\n const sourceCode = context.sourceCode;\n if (isIgnoredFile(context.filename, sourceCode.getText())) {\n return {};\n }\n // A test that covers `z.nativeEnum` must call it; see @fileoverview.\n if (isTestFile(context.filename)) {\n return {};\n }\n\n let services: ParserServicesWithTypeInformation | null;\n try {\n services = ESLintUtils.getParserServices(context);\n } catch {\n services = null;\n }\n\n /** Local names imported from a zod module, e.g. `nativeEnum`, `enum_`. */\n const zodImportedNames = new Map<string, string>();\n\n function isZodMemberCall(node: TSESTree.CallExpression, api: string): boolean {\n const callee = node.callee;\n if (\n callee.type === AST_NODE_TYPES.MemberExpression &&\n !callee.computed &&\n callee.property.type === AST_NODE_TYPES.Identifier\n ) {\n return callee.property.name === api;\n }\n if (callee.type === AST_NODE_TYPES.Identifier) {\n return zodImportedNames.get(callee.name) === api;\n }\n return false;\n }\n\n function buildFix(\n node: TSESTree.CallExpression,\n ): TSESLint.ReportFixFunction | null {\n // A bare `nativeEnum(...)` imported from zod cannot be renamed in place —\n // `enum` is a reserved word, so there is no bare callee to rewrite to.\n // Rewriting only the argument would leave a `nativeEnum` call taking an\n // array, so this shape is report-only.\n const callee = node.callee;\n if (\n callee.type !== AST_NODE_TYPES.MemberExpression ||\n callee.property.type !== AST_NODE_TYPES.Identifier\n ) {\n return null;\n }\n const arg = node.arguments[0];\n if (\n arg === undefined ||\n node.arguments.length !== 1 ||\n arg.type === AST_NODE_TYPES.SpreadElement\n ) {\n return null;\n }\n const inner = unwrap(arg);\n if (inner.type !== AST_NODE_TYPES.ObjectExpression) {\n return null;\n }\n const values = stringValueTexts(inner, sourceCode);\n if (values === null) {\n return null;\n }\n const property = callee.property;\n const replacementArg = `[${values.join(\", \")}]`;\n return (fixer) => [\n fixer.replaceText(property, \"enum\"),\n fixer.replaceText(arg, replacementArg),\n ];\n }\n\n return {\n ImportDeclaration(node: TSESTree.ImportDeclaration): void {\n if (!isZodModule(node.source.value)) {\n return;\n }\n for (const spec of node.specifiers) {\n if (\n spec.type === AST_NODE_TYPES.ImportSpecifier &&\n spec.imported.type === AST_NODE_TYPES.Identifier\n ) {\n zodImportedNames.set(spec.local.name, spec.imported.name);\n }\n }\n },\n\n CallExpression(node: TSESTree.CallExpression): void {\n if (isZodMemberCall(node, \"nativeEnum\")) {\n const fix = buildFix(node);\n context.report({\n node,\n messageId: \"nativeEnum\",\n ...(fix === null ? {} : { fix }),\n });\n return;\n }\n\n if (!isZodMemberCall(node, \"enum\")) {\n return;\n }\n const arg = node.arguments[0];\n if (arg === undefined || arg.type !== AST_NODE_TYPES.Identifier) {\n return;\n }\n const isEnum =\n resolvesToLocalEnum(arg, sourceCode.getScope(arg)) ||\n (services !== null && resolvesToImportedEnum(arg, services));\n if (isEnum) {\n context.report({\n node,\n messageId: \"enumOfTsEnum\",\n data: { name: arg.name },\n });\n }\n },\n };\n },\n});\n","/**\n * @fileoverview prefer-constant-time-secret-compare — `===` on a secret short-circuits on the first differing byte, so the response time leaks the secret.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/prefer-constant-time-secret-compare.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/prefer-constant-time-secret-compare.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isAuthSecretName } from \"./_secret-names.js\";\nimport { isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"preferConstantTimeSecretCompare\";\ntype Options = readonly [];\n\nconst EQUALITY_OPERATORS: ReadonlySet<string> = new Set([\"===\", \"!==\", \"==\", \"!=\"]);\n\n/**\n * Identifiers that are compile-time sentinels rather than runtime values.\n * `undefined`/`NaN` make the comparison a presence check; an ALL-CAPS name is a\n * named constant or enum member (`TOKEN_TYPE_SYSTEM`), and timing a compare\n * against a value the attacker already knows leaks nothing.\n */\nconst SENTINEL_IDENTIFIERS: ReadonlySet<string> = new Set([\"undefined\", \"NaN\"]);\n\n/**\n * Words that mark a secret-SHAPED name as a placeholder rather than a live\n * credential: `TOKEN_SENTINEL`, `EMPTY_SECRET`, `PLACEHOLDER_API_KEY`. Comparing\n * against one of these is a presence check, not an authentication check, so it\n * stays excluded even though the secret-name heuristics match it.\n */\nconst SENTINEL_WORDS = /(^|_)(SENTINEL|EMPTY|NONE|NULL|UNSET|MISSING|PLACEHOLDER|DUMMY|FAKE|EXAMPLE)(_|$)/;\n\n/**\n * The camelCase spelling of the same idea: a marker VALUE whose name happens to\n * end in a secret-shaped word. A library exports `skipToken` as a unique\n * `Symbol` and callers test identity against it — there are no bytes to compare\n * and nothing an attacker could learn from the timing.\n */\nconst SENTINEL_PREFIX_RE =\n /^(skip|sentinel|empty|none|missing|unset|placeholder|dummy|fake|example|noop)[A-Z]/;\nconst AST_NODE_TYPE_RE = /^(?:TS|JSX)?[A-Z][A-Za-z]*(?:Signature|Keyword|Expression|Declaration|Element|Literal|Identifier)$/;\n\n/**\n * True when every cased character is upper-case and at least one letter exists —\n * AND the name is not itself secret-shaped.\n *\n * The ALL-CAPS carve-out exists for public named constants (`TOKEN_TYPE_SYSTEM`).\n * But environment secrets are conventionally SCREAMING_SNAKE too\n * (`ADMIN_TOKEN`, `ASHBY_API_KEY`, `SLACK_SIGNING_SECRET`), so an unqualified\n * ALL-CAPS bail-out made this rule blind to essentially every real secret\n * compare: `env.ADMIN_TOKEN === supplied` was silent while the camelCase\n * `env.adminToken === supplied` fired. That is the exact comparison this rule\n * exists to catch. Defer to the shared secret-name heuristics first.\n */\nfunction isConstantReference(identifier: string): boolean {\n if (AST_NODE_TYPE_RE.test(identifier)) return true;\n if (isAuthSecretName(identifier) && !SENTINEL_WORDS.test(identifier)) return false;\n return identifier === identifier.toUpperCase() && /[A-Za-z]/.test(identifier);\n}\n\n/**\n * True when this operand makes the comparison a non-timing-attack surface:\n * any literal (string / number / boolean / null / regex), a template literal\n * with no substitutions, `undefined`/`NaN`, or an ALL-CAPS constant reference.\n */\nfunction isExcludedOperand(node: TSESTree.Node): boolean {\n switch (node.type) {\n case AST_NODE_TYPES.Literal:\n return true;\n case AST_NODE_TYPES.TemplateLiteral:\n return node.expressions.length === 0;\n case AST_NODE_TYPES.Identifier:\n return (\n SENTINEL_IDENTIFIERS.has(node.name) ||\n SENTINEL_PREFIX_RE.test(node.name) ||\n isConstantReference(node.name)\n );\n case AST_NODE_TYPES.MemberExpression:\n return (\n !node.computed &&\n node.property.type === AST_NODE_TYPES.Identifier &&\n (SENTINEL_PREFIX_RE.test(node.property.name) ||\n isConstantReference(node.property.name))\n );\n default:\n return false;\n }\n}\n\n/** The identifier a plain operand denotes, or null for anything else. */\nfunction operandName(node: TSESTree.Node): string | null {\n if (node.type === AST_NODE_TYPES.Identifier) {\n return node.name;\n }\n if (\n node.type === AST_NODE_TYPES.MemberExpression &&\n !node.computed &&\n node.property.type === AST_NODE_TYPES.Identifier\n ) {\n return node.property.name;\n }\n return null;\n}\n\n/**\n * True when the operand names an authenticator worth a constant-time compare.\n *\n * A template literal counts when it interpolates one: `header === \\`Bearer\n * ${adminToken}\\`` is the canonical Workers auth check and is exactly as\n * timing-leaky as comparing the bare token, since the constant prefix only makes\n * the first bytes free.\n */\nfunction isSecretOperand(node: TSESTree.Node): boolean {\n if (node.type === AST_NODE_TYPES.TemplateLiteral) {\n return node.expressions.some((expression) => isSecretOperand(expression));\n }\n const name = operandName(node);\n return name !== null && isAuthSecretName(name);\n}\n\n/** The secret identifier this comparison exposes, for the diagnostic message. */\nfunction secretNameOf(node: TSESTree.Node): string | null {\n if (node.type === AST_NODE_TYPES.TemplateLiteral) {\n for (const expression of node.expressions) {\n const nested = secretNameOf(expression);\n if (nested !== null) {\n return nested;\n }\n }\n return null;\n }\n return operandName(node);\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"prefer-constant-time-secret-compare\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow `===`/`!==` on a secret-like value; short-circuiting comparison leaks the secret through timing. Use a constant-time compare.\",\n },\n schema: [],\n messages: {\n preferConstantTimeSecretCompare:\n \"`{{operator}}` on secret `{{name}}` short-circuits on the first differing byte and leaks it through timing. Compare constant-time instead (`crypto.subtle.timingSafeEqual` over equal-length SHA-256 digests).\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (isTestFile(context.filename)) {\n return {};\n }\n return {\n BinaryExpression(node: TSESTree.BinaryExpression): void {\n if (!EQUALITY_OPERATORS.has(node.operator)) {\n return;\n }\n const { left, right } = node;\n if (isExcludedOperand(left) || isExcludedOperand(right)) {\n return;\n }\n const secret = [left, right].find((operand) => isSecretOperand(operand));\n if (secret === undefined) {\n return;\n }\n context.report({\n node,\n messageId: \"preferConstantTimeSecretCompare\",\n data: { operator: node.operator, name: secretNameOf(secret) ?? \"\" },\n });\n },\n };\n },\n});\n","/**\n * @fileoverview prefer-discriminated-union — a boolean status flag beside many optionals makes illegal states representable.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/prefer-discriminated-union.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/prefer-discriminated-union.md\n */\n\nimport { type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { AST_NODE_TYPES } from \"@typescript-eslint/utils\";\n\ntype MessageIds = \"preferDiscriminatedUnion\";\ntype Options = readonly [];\n\n/**\n * Boolean-typed member names that read as a success/error status discriminant.\n */\nconst STATUS_MEMBER_NAMES: ReadonlySet<string> = new Set([\n \"success\",\n \"ok\",\n \"error\",\n \"failed\",\n \"isError\",\n]);\n\nconst MIN_OPTIONAL_MEMBERS = 2;\n\n/**\n * Returns the property key name for a member if it is a plain identifier or\n * string-literal property signature, otherwise `null`.\n */\nfunction getMemberName(member: TSESTree.TypeElement): string | null {\n if (member.type !== AST_NODE_TYPES.TSPropertySignature) {\n return null;\n }\n const { key } = member;\n if (key.type === AST_NODE_TYPES.Identifier) {\n return key.name;\n }\n if (key.type === AST_NODE_TYPES.Literal && typeof key.value === \"string\") {\n return key.value;\n }\n return null;\n}\n\n/**\n * Whether a property signature is annotated with `boolean`.\n */\nfunction isBooleanTyped(member: TSESTree.TSPropertySignature): boolean {\n return (\n member.typeAnnotation?.typeAnnotation.type ===\n AST_NODE_TYPES.TSBooleanKeyword\n );\n}\n\n/**\n * Returns true when the object type literal has BOTH a boolean-typed status\n * member AND at least `MIN_OPTIONAL_MEMBERS` optional members.\n */\nfunction looksLikeMutuallyExclusiveState(\n typeLiteral: TSESTree.TSTypeLiteral,\n): boolean {\n let hasStatusBoolean = false;\n let optionalCount = 0;\n let optionalPayloadCount = 0;\n\n for (const member of typeLiteral.members) {\n if (member.type !== AST_NODE_TYPES.TSPropertySignature) {\n continue;\n }\n\n if (member.optional) {\n optionalCount += 1;\n // A non-boolean optional is a PAYLOAD — the thing that can end up in the\n // wrong branch. An all-boolean record is a flag set; see @fileoverview.\n if (!isBooleanTyped(member)) {\n optionalPayloadCount += 1;\n }\n }\n\n const name = getMemberName(member);\n if (\n name !== null &&\n STATUS_MEMBER_NAMES.has(name) &&\n isBooleanTyped(member)\n ) {\n hasStatusBoolean = true;\n }\n }\n\n return (\n hasStatusBoolean &&\n optionalCount >= MIN_OPTIONAL_MEMBERS &&\n optionalPayloadCount >= 1\n );\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"prefer-discriminated-union\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Flag object types with a boolean status flag and many optionals; model them as a discriminated union instead.\",\n },\n schema: [],\n messages: {\n preferDiscriminatedUnion:\n \"This object type uses a boolean status flag alongside several optional fields, which lets illegal states be representable. Model it as a `z.discriminatedUnion` / discriminated union (e.g. `{ ok: true; data: T } | { ok: false; error: E }`) to make illegal states unrepresentable.\",\n },\n },\n defaultOptions: [],\n create(context) {\n function checkTypeLiteral(\n typeLiteral: TSESTree.TSTypeLiteral,\n reportNode: TSESTree.Node,\n ): void {\n if (looksLikeMutuallyExclusiveState(typeLiteral)) {\n context.report({\n node: reportNode,\n messageId: \"preferDiscriminatedUnion\",\n });\n }\n }\n\n return {\n TSInterfaceDeclaration(\n node: TSESTree.TSInterfaceDeclaration,\n ): void {\n // An interface body is structurally an object type literal; reuse the\n // same membership analysis by treating its `body.body` as members.\n const synthetic: TSESTree.TSTypeLiteral = {\n ...node.body,\n type: AST_NODE_TYPES.TSTypeLiteral,\n members: node.body.body,\n } as TSESTree.TSTypeLiteral;\n checkTypeLiteral(synthetic, node);\n },\n \"TSTypeAliasDeclaration > TSTypeLiteral\"(\n node: TSESTree.TSTypeLiteral,\n ): void {\n checkTypeLiteral(node, node.parent);\n },\n };\n },\n});\n","/**\n * @fileoverview prefer-module-level-constant — a literal-only collection or regex declared inside a function is rebuilt on every call.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/prefer-module-level-constant.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/prefer-module-level-constant.md\n */\n\nimport { type TSESTree, AST_NODE_TYPES } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isStoryFile, isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"hoistCollection\" | \"hoistRegex\";\n\ntype Options = readonly [\n {\n minElements?: number;\n checkRegex?: boolean;\n ignoreTestFiles?: boolean;\n }?,\n];\n\nconst DEFAULT_MIN_ELEMENTS = 3;\n\n/** How deep a nested literal may go before we stop trying to prove it static. */\nconst MAX_LITERAL_DEPTH = 4;\n\nconst IGNORE_PATTERNS: readonly RegExp[] = [\n /[\\\\/]generated[\\\\/]/,\n /\\.gen\\.tsx?$/,\n /\\.generated\\.tsx?$/,\n /\\.d\\.ts$/,\n];\n\n/**\n * Methods that mutate the receiver. A call to any of these on the binding is\n * proof the value is meant to be rebuilt per call.\n */\nconst MUTATING_METHODS: ReadonlySet<string> = new Set([\n // Array\n \"push\",\n \"pop\",\n \"shift\",\n \"unshift\",\n \"splice\",\n \"sort\",\n \"reverse\",\n \"fill\",\n \"copyWithin\",\n // Set / Map\n \"add\",\n \"set\",\n \"delete\",\n \"clear\",\n // Object-ish escape hatches\n \"assign\",\n]);\n\nconst FUNCTION_TYPES: ReadonlySet<AST_NODE_TYPES> = new Set([\n AST_NODE_TYPES.FunctionDeclaration,\n AST_NODE_TYPES.FunctionExpression,\n AST_NODE_TYPES.ArrowFunctionExpression,\n]);\n\nconst COLLECTION_CONSTRUCTORS: ReadonlySet<string> = new Set([\"Set\", \"Map\"]);\n\nfunction isIgnoredFile(filename: string, sourceText: string): boolean {\n if (IGNORE_PATTERNS.some((re) => re.test(filename))) {\n return true;\n }\n return /@generated\\b/.test(sourceText.slice(0, 1024));\n}\n\n/**\n * A test suite or a story: both keep their fixture tables next to the assertion\n * (or the story) that explains them. Delegated to `_paths` so this rule cannot\n * drift away from the other file-kind-scoped rules again.\n */\nfunction isLocalFixtureFile(filename: string): boolean {\n return isTestFile(filename) || isStoryFile(filename);\n}\n\n/** Unwraps `x as const` / `x satisfies T` down to the inner expression. */\nfunction unwrap(node: TSESTree.Node): TSESTree.Node {\n if (\n node.type === AST_NODE_TYPES.TSAsExpression ||\n node.type === AST_NODE_TYPES.TSSatisfiesExpression ||\n node.type === AST_NODE_TYPES.TSNonNullExpression\n ) {\n return unwrap(node.expression);\n }\n return node;\n}\n\n/** `g` and `y` carry `lastIndex` between calls, so hoisting changes behaviour. */\nconst HAS_STATEFUL_FLAG_RE = /[gy]/;\n\nfunction isRegexLiteral(node: TSESTree.Node): node is TSESTree.RegExpLiteral {\n return (\n node.type === AST_NODE_TYPES.Literal &&\n \"regex\" in node &&\n node.regex !== undefined\n );\n}\n\n/**\n * Whether the expression is built entirely out of literals — no identifier, no\n * call, no member access, no interpolation, no spread. This is the gate that\n * makes hoisting provably safe: a literal-only value cannot capture a\n * parameter, cannot observe call-time state, and cannot have side effects.\n */\nfunction isLiteralOnly(node: TSESTree.Node, depth: number): boolean {\n if (depth > MAX_LITERAL_DEPTH) {\n return false;\n }\n const inner = unwrap(node);\n switch (inner.type) {\n case AST_NODE_TYPES.Literal: {\n // A `RegExpLiteral` is an `AST_NODE_TYPES.Literal`, so without this a\n // stateful regex nested in a collection — `const patterns = [/a/g, /b/]`\n // — bypassed the top-level `g`/`y` check and the recommended hoist would\n // have carried `lastIndex` across calls.\n return !(isRegexLiteral(inner) && HAS_STATEFUL_FLAG_RE.test(inner.regex.flags));\n }\n case AST_NODE_TYPES.TemplateLiteral: {\n return inner.expressions.length === 0;\n }\n case AST_NODE_TYPES.UnaryExpression: {\n return (\n (inner.operator === \"-\" || inner.operator === \"+\") &&\n inner.argument.type === AST_NODE_TYPES.Literal &&\n typeof inner.argument.value === \"number\"\n );\n }\n case AST_NODE_TYPES.ArrayExpression: {\n return inner.elements.every(\n (el) =>\n el !== null &&\n el.type !== AST_NODE_TYPES.SpreadElement &&\n isLiteralOnly(el, depth + 1),\n );\n }\n case AST_NODE_TYPES.ObjectExpression: {\n return inner.properties.every((prop) => {\n if (prop.type !== AST_NODE_TYPES.Property) {\n return false;\n }\n if (prop.shorthand || prop.method || prop.kind !== \"init\") {\n return false;\n }\n if (prop.computed && prop.key.type !== AST_NODE_TYPES.Literal) {\n return false;\n }\n return isLiteralOnly(prop.value, depth + 1);\n });\n }\n default: {\n return false;\n }\n }\n}\n\n/** `Object.freeze(x)` → `x`; anything else is returned untouched. */\nfunction unwrapObjectFreeze(node: TSESTree.Node): TSESTree.Node {\n const inner = unwrap(node);\n if (\n inner.type === AST_NODE_TYPES.CallExpression &&\n inner.callee.type === AST_NODE_TYPES.MemberExpression &&\n !inner.callee.computed &&\n inner.callee.object.type === AST_NODE_TYPES.Identifier &&\n inner.callee.object.name === \"Object\" &&\n inner.callee.property.type === AST_NODE_TYPES.Identifier &&\n inner.callee.property.name === \"freeze\" &&\n inner.arguments.length === 1 &&\n inner.arguments[0] !== undefined &&\n inner.arguments[0].type !== AST_NODE_TYPES.SpreadElement\n ) {\n return unwrap(inner.arguments[0]);\n }\n return inner;\n}\n\ntype Candidate =\n | { kind: \"array\" | \"object\" | \"Set\" | \"Map\"; size: number }\n | { kind: \"regex\"; size: number };\n\n/**\n * Classifies the initializer, or returns null when it is not a hoistable\n * literal-only collection / regex.\n */\nfunction classify(init: TSESTree.Node, checkRegex: boolean): Candidate | null {\n const node = unwrapObjectFreeze(init);\n\n if (isRegexLiteral(node)) {\n if (!checkRegex) {\n return null;\n }\n if (HAS_STATEFUL_FLAG_RE.test(node.regex.flags)) {\n return null;\n }\n return { kind: \"regex\", size: 1 };\n }\n\n if (node.type === AST_NODE_TYPES.ArrayExpression) {\n return isLiteralOnly(node, 0)\n ? { kind: \"array\", size: node.elements.length }\n : null;\n }\n\n if (node.type === AST_NODE_TYPES.ObjectExpression) {\n return isLiteralOnly(node, 0)\n ? { kind: \"object\", size: node.properties.length }\n : null;\n }\n\n if (\n node.type === AST_NODE_TYPES.NewExpression &&\n node.callee.type === AST_NODE_TYPES.Identifier &&\n COLLECTION_CONSTRUCTORS.has(node.callee.name)\n ) {\n const arg = node.arguments[0];\n if (\n node.arguments.length !== 1 ||\n arg === undefined ||\n arg.type === AST_NODE_TYPES.SpreadElement\n ) {\n return null;\n }\n const entries = unwrap(arg);\n if (entries.type !== AST_NODE_TYPES.ArrayExpression) {\n return null;\n }\n return isLiteralOnly(entries, 0)\n ? { kind: node.callee.name === \"Set\" ? \"Set\" : \"Map\", size: entries.elements.length }\n : null;\n }\n\n return null;\n}\n\n/** The nearest enclosing function, or null when the node is at module scope. */\nfunction enclosingFunction(node: TSESTree.Node): TSESTree.Node | null {\n let current: TSESTree.Node | undefined | null = node.parent;\n while (current !== undefined && current !== null) {\n if (FUNCTION_TYPES.has(current.type)) {\n return current;\n }\n current = current.parent;\n }\n return null;\n}\n\n/**\n * Built-ins that read their argument and return a fresh value without keeping\n * or mutating the original, so passing the binding to them is still a read.\n */\nconst NON_RETAINING_BUILTINS: ReadonlyMap<string, ReadonlySet<string>> = new Map(\n [\n [\n \"Object\",\n new Set([\"keys\", \"values\", \"entries\", \"freeze\", \"fromEntries\", \"assign\"]),\n ],\n [\"Array\", new Set([\"from\", \"isArray\"])],\n [\"JSON\", new Set([\"stringify\"])],\n ],\n);\n\nfunction isNonRetainingBuiltinCall(\n node: TSESTree.CallExpression,\n argument: TSESTree.Identifier,\n): boolean {\n const callee = node.callee;\n if (\n callee.type === AST_NODE_TYPES.Identifier &&\n callee.name === \"structuredClone\"\n ) {\n return true;\n }\n if (\n callee.type !== AST_NODE_TYPES.MemberExpression ||\n callee.computed ||\n callee.object.type !== AST_NODE_TYPES.Identifier ||\n callee.property.type !== AST_NODE_TYPES.Identifier\n ) {\n return false;\n }\n const members = NON_RETAINING_BUILTINS.get(callee.object.name);\n if (members === undefined || !members.has(callee.property.name)) {\n return false;\n }\n // `Object.assign(X, src)` mutates its FIRST argument; only later positions\n // (sources) are reads.\n if (callee.object.name === \"Object\" && callee.property.name === \"assign\") {\n return node.arguments[0] !== argument;\n }\n return true;\n}\n\n/**\n * Whether this single reference to the binding is a provably non-mutating,\n * non-escaping read. Anything not on the whitelist is treated as unsafe, so an\n * unrecognised usage suppresses the report rather than risking a bad hoist.\n */\nfunction isSafeRead(identifier: TSESTree.Identifier): boolean {\n const parent = identifier.parent;\n\n if (parent.type === AST_NODE_TYPES.MemberExpression) {\n if (parent.object !== identifier) {\n // `foo[X]` — the binding is used as a key, which is a plain read.\n return true;\n }\n const grandparent = parent.parent;\n // `X.a = 1`, `X[0] = 1`, `X.a += 1`\n if (\n grandparent.type === AST_NODE_TYPES.AssignmentExpression &&\n grandparent.left === parent\n ) {\n return false;\n }\n // `X.a++`\n if (grandparent.type === AST_NODE_TYPES.UpdateExpression) {\n return false;\n }\n // `delete X.a`\n if (\n grandparent.type === AST_NODE_TYPES.UnaryExpression &&\n grandparent.operator === \"delete\"\n ) {\n return false;\n }\n // `X.push(...)`, `X.sort()`, ...\n if (\n !parent.computed &&\n parent.property.type === AST_NODE_TYPES.Identifier &&\n MUTATING_METHODS.has(parent.property.name) &&\n grandparent.type === AST_NODE_TYPES.CallExpression &&\n grandparent.callee === parent\n ) {\n return false;\n }\n // Everything else through a member expression — `X.length`, `X.includes(v)`,\n // `X[i]`, `X.get(k)`, even `arr.map(X.has)` — reads a property of the\n // binding without handing the binding itself out, so it cannot mutate it.\n return true;\n }\n\n // `for (const x of X)` — iteration is a read.\n if (\n parent.type === AST_NODE_TYPES.ForOfStatement &&\n parent.right === identifier\n ) {\n return true;\n }\n\n // `[...X]`, `{...X}`, `f(...X)` — every spread copies, so the original is\n // never handed out and hoisting stays safe.\n if (parent.type === AST_NODE_TYPES.SpreadElement) {\n return true;\n }\n\n // `\"a\" in X`, `X instanceof Y`, `X === undefined`\n if (parent.type === AST_NODE_TYPES.BinaryExpression) {\n return true;\n }\n\n // A bare argument to a built-in that is known not to retain or mutate its\n // input: `Object.entries(X)`, `Array.from(X)`, `JSON.stringify(X)`. Any other\n // call receiving the binding bare is an escape.\n if (\n parent.type === AST_NODE_TYPES.CallExpression &&\n parent.arguments.includes(identifier) &&\n isNonRetainingBuiltinCall(parent, identifier)\n ) {\n return true;\n }\n\n // `typeof X`, `!X`\n if (\n parent.type === AST_NODE_TYPES.UnaryExpression &&\n parent.operator !== \"delete\"\n ) {\n return true;\n }\n\n return false;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"prefer-module-level-constant\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Hoist literal-only constant collections and regexes out of function bodies to module scope so they are allocated once.\",\n },\n schema: [\n {\n type: \"object\",\n additionalProperties: false,\n properties: {\n minElements: { type: \"number\", minimum: 1 },\n checkRegex: { type: \"boolean\" },\n ignoreTestFiles: { type: \"boolean\" },\n },\n },\n ],\n messages: {\n hoistCollection:\n \"`{{name}}` is a literal-only {{kind}} rebuilt on every call. Hoist it to module scope so it is allocated once and can be reused, exported, and tested.\",\n hoistRegex:\n \"`{{name}}` is a constant regex recompiled on every call. Hoist it to module scope.\",\n },\n },\n defaultOptions: [{}],\n create(context, [optionsArg]) {\n const options = optionsArg ?? {};\n const minElements = options.minElements ?? DEFAULT_MIN_ELEMENTS;\n const checkRegex = options.checkRegex ?? true;\n const ignoreTestFiles = options.ignoreTestFiles ?? true;\n\n const sourceCode = context.sourceCode;\n const filename = context.filename;\n\n if (isIgnoredFile(filename, sourceCode.getText())) {\n return {};\n }\n if (ignoreTestFiles && isLocalFixtureFile(filename)) {\n return {};\n }\n\n function allReferencesAreSafeReads(\n declarator: TSESTree.VariableDeclarator,\n ): boolean {\n const variables = sourceCode.getDeclaredVariables(declarator);\n const variable = variables[0];\n if (variable === undefined) {\n return false;\n }\n for (const reference of variable.references) {\n // The initializer write itself is not a usage.\n if (reference.init === true) {\n continue;\n }\n if (reference.isWrite()) {\n return false;\n }\n // A `JSXIdentifier` reference means the constant is rendered as a JSX\n // tag name — not something this rule reasons about, so bail.\n if (reference.identifier.type !== AST_NODE_TYPES.Identifier) {\n return false;\n }\n if (!isSafeRead(reference.identifier)) {\n return false;\n }\n }\n return true;\n }\n\n return {\n VariableDeclarator(node: TSESTree.VariableDeclarator): void {\n const declaration = node.parent;\n if (\n declaration.type !== AST_NODE_TYPES.VariableDeclaration ||\n declaration.kind !== \"const\" ||\n declaration.declare === true\n ) {\n return;\n }\n if (node.id.type !== AST_NODE_TYPES.Identifier || node.init === null) {\n return;\n }\n if (enclosingFunction(node) === null) {\n return;\n }\n\n const candidate = classify(node.init, checkRegex);\n if (candidate === null) {\n return;\n }\n if (candidate.kind !== \"regex\" && candidate.size < minElements) {\n return;\n }\n if (!allReferencesAreSafeReads(node)) {\n return;\n }\n\n context.report({\n node: node.id,\n messageId:\n candidate.kind === \"regex\" ? \"hoistRegex\" : \"hoistCollection\",\n data: { name: node.id.name, kind: candidate.kind },\n });\n },\n };\n },\n});\n","/**\n * @fileoverview prefer-module-level-schema — a Zod schema built inside a function is rebuilt on every call, every request, every render.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/prefer-module-level-schema.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/prefer-module-level-schema.md\n */\n\nimport { AST_NODE_TYPES, type TSESLint, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isGeneratedFile, isTestFile } from \"./_paths.js\";\nimport { isZodModule } from \"./_zod.js\";\n\ntype MessageIds = \"hoistSchema\";\n\ntype Options = readonly [\n {\n factories?: readonly string[];\n ignoreTestFiles?: boolean;\n minProperties?: number;\n }?,\n];\n\n/**\n * The object-like composites. Each builds a container plus one schema instance\n * per member, so the per-call cost is real rather than notional.\n */\nconst DEFAULT_FACTORIES: readonly string[] = [\n \"discriminatedUnion\",\n \"intersection\",\n \"looseObject\",\n \"object\",\n \"record\",\n \"strictObject\",\n \"tuple\",\n \"union\",\n];\n\n/**\n * Two, not one — the value the \"deliberately not flagged\" list has always\n * PROMISED and never delivered. The gate is `properties.length <\n * minProperties`, so a default of 1 excludes `z.object({})` and nothing else,\n * while the documented exemption is the one-key inline schema.\n */\nconst DEFAULT_MIN_PROPERTIES = 2;\n\n/** Wrappers that already pay the construction cost exactly once. */\nconst MEMO_CALLEES: ReadonlySet<string> = new Set([\n \"lazy\",\n \"memo\",\n \"once\",\n \"useMemo\",\n]);\n\n/**\n * Methods that CONSUME a value rather than extend the schema. The chain walk\n * stops before them: `z.object({...}).parse(raw)` closes over `raw`, but `raw`\n * is the input, not part of the schema, and the schema in front of it hoists\n * perfectly well.\n */\nconst TERMINAL_METHODS: ReadonlySet<string> = new Set([\n \"isNullable\",\n \"isOptional\",\n \"parse\",\n \"parseAsync\",\n \"safeParse\",\n \"safeParseAsync\",\n \"spa\",\n]);\n\n/**\n * Zod combinator methods that take a schema and return a schema. An enclosing\n * one means the reported factory is a FRAGMENT of a larger schema expression\n * rather than a schema in its own right — `AstroConfigSchema.extend({ … })`\n * is not a `z.*` call, so `isZodCall` cannot see it, and the fragment inside it\n * was reported on its own.\n */\nconst ZOD_COMBINATOR_METHODS: ReadonlySet<string> = new Set([\n \"and\",\n \"array\",\n \"catch\",\n \"catchall\",\n \"default\",\n \"extend\",\n \"merge\",\n \"or\",\n \"pipe\",\n \"refine\",\n \"superRefine\",\n \"transform\",\n]);\n\n/**\n * Callees that render text in the CURRENTLY ACTIVE locale.\n *\n * A zero-argument `() => z.object({ otp: z.string().length(6, t`…`) })` exists\n * PRECISELY so the Lingui macro runs after `i18n.activate(locale)`.\n * `closesOverNothing` skips `ImportBinding` defs, so `t` was invisible and the\n * rule advised a hoist that freezes every validation message in whatever locale\n * happened to be active at module-eval time — a correctness regression, not\n * noise. A tagged template is the macro spelling every i18n library uses.\n */\nconst I18N_CALLEE_NAMES: ReadonlySet<string> = new Set([\n \"$t\",\n \"defineMessage\",\n \"gettext\",\n \"msg\",\n \"ngettext\",\n \"t\",\n \"translate\",\n]);\n\n/** Receivers whose methods render locale-dependent text (`i18n._`, `intl.formatMessage`). */\nconst I18N_RECEIVER_NAMES: ReadonlySet<string> = new Set([\n \"$i18n\",\n \"i18n\",\n \"intl\",\n]);\n\nconst FUNCTION_TYPES: ReadonlySet<AST_NODE_TYPES> = new Set([\n AST_NODE_TYPES.ArrowFunctionExpression,\n AST_NODE_TYPES.FunctionDeclaration,\n AST_NODE_TYPES.FunctionExpression,\n]);\n\n/**\n * The whole schema EXPRESSION, not just the factory call: climb out through\n * `.refine(...)`, `.superRefine(...)`, `.transform(...)`, `.default(...)` and\n * every other builder method applied to it.\n */\nfunction schemaExpression(node: TSESTree.CallExpression): TSESTree.Node {\n let current: TSESTree.Node = node;\n for (;;) {\n const parent: TSESTree.Node | undefined = current.parent ?? undefined;\n if (parent === undefined) {\n return current;\n }\n if (\n parent.type === AST_NODE_TYPES.MemberExpression &&\n parent.object === current &&\n !parent.computed &&\n parent.property.type === AST_NODE_TYPES.Identifier &&\n TERMINAL_METHODS.has(parent.property.name)\n ) {\n return current;\n }\n if (\n (parent.type === AST_NODE_TYPES.MemberExpression &&\n parent.object === current) ||\n (parent.type === AST_NODE_TYPES.CallExpression &&\n parent.callee === current) ||\n (parent.type === AST_NODE_TYPES.TSAsExpression &&\n parent.expression === current) ||\n (parent.type === AST_NODE_TYPES.TSNonNullExpression &&\n parent.expression === current)\n ) {\n current = parent;\n continue;\n }\n return current;\n }\n}\n\n/** The outermost function ancestor — hoisting targets module scope, not the nearest body. */\nfunction outermostEnclosingFunction(\n node: TSESTree.Node,\n): TSESTree.Node | undefined {\n let outermost: TSESTree.Node | undefined;\n let current: TSESTree.Node | undefined = node.parent ?? undefined;\n while (current !== undefined) {\n if (FUNCTION_TYPES.has(current.type)) {\n outermost = current;\n }\n current = current.parent ?? undefined;\n }\n return outermost;\n}\n\n/** Does any node in `root`'s subtree satisfy `predicate`? */\nfunction subtreeSome(\n root: TSESTree.Node,\n predicate: (node: TSESTree.Node) => boolean,\n): boolean {\n let found = false;\n const visit = (value: unknown): void => {\n if (found || value === null || typeof value !== \"object\") {\n return;\n }\n if (Array.isArray(value)) {\n for (const item of value) {\n visit(item);\n }\n return;\n }\n const candidate = value as Partial<TSESTree.Node> & Record<string, unknown>;\n if (typeof candidate.type !== \"string\") {\n return;\n }\n if (predicate(candidate as TSESTree.Node)) {\n found = true;\n return;\n }\n for (const key of Object.keys(candidate)) {\n if (key === \"parent\" || key === \"loc\" || key === \"range\") {\n continue;\n }\n visit(candidate[key]);\n }\n };\n visit(root);\n return found;\n}\n\n/** `this` / `super` / `arguments` anywhere inside pins the schema to its receiver. */\nfunction readsReceiver(node: TSESTree.Node): boolean {\n return subtreeSome(\n node,\n (inner) =>\n inner.type === AST_NODE_TYPES.ThisExpression ||\n inner.type === AST_NODE_TYPES.Super ||\n (inner.type === AST_NODE_TYPES.Identifier && inner.name === \"arguments\"),\n );\n}\n\n/**\n * Does the schema build a string whose VALUE depends on when it is evaluated?\n *\n * See `I18N_CALLEE_NAMES`. Hoisting such a schema moves the render from\n * call time to module-eval time, which is a behaviour change, not a\n * refactor — so this is a hard bail rather than a heuristic penalty.\n */\nfunction buildsLocalizedText(node: TSESTree.Node): boolean {\n return subtreeSome(node, (inner) => {\n if (inner.type === AST_NODE_TYPES.TaggedTemplateExpression) {\n return true;\n }\n if (inner.type !== AST_NODE_TYPES.CallExpression) {\n return false;\n }\n const { callee } = inner;\n if (callee.type === AST_NODE_TYPES.Identifier) {\n return I18N_CALLEE_NAMES.has(callee.name);\n }\n return (\n callee.type === AST_NODE_TYPES.MemberExpression &&\n !callee.computed &&\n callee.object.type === AST_NODE_TYPES.Identifier &&\n I18N_RECEIVER_NAMES.has(callee.object.name)\n );\n });\n}\n\nfunction collectReferences(\n scope: TSESLint.Scope.Scope,\n out: TSESLint.Scope.Reference[],\n): void {\n out.push(...scope.references);\n for (const child of scope.childScopes) {\n collectReferences(child, out);\n }\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"prefer-module-level-schema\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Declare a Zod schema at module scope when it closes over nothing in the enclosing function\",\n },\n schema: [\n {\n type: \"object\",\n properties: {\n factories: {\n type: \"array\",\n items: { type: \"string\" },\n description:\n \"Zod factory names to check. Defaults to the object-like composites; add `array` / `enum` to widen.\",\n },\n ignoreTestFiles: {\n type: \"boolean\",\n description:\n \"Skip test files, where a fixture schema belongs next to its assertion.\",\n },\n minProperties: {\n type: \"number\",\n minimum: 0,\n description:\n \"Minimum key count before an object-like schema is reported.\",\n },\n },\n additionalProperties: false,\n },\n ],\n messages: {\n hoistSchema:\n \"Move this `{{factory}}` schema to module scope. It uses nothing from `{{owner}}`, so it is rebuilt on every call for no benefit and cannot be exported, reused, or `z.infer`-ed from where it is.\",\n },\n },\n defaultOptions: [{}],\n create(context, [options]) {\n const factories = new Set(options?.factories ?? DEFAULT_FACTORIES);\n const ignoreTestFiles = options?.ignoreTestFiles ?? true;\n const minProperties = options?.minProperties ?? DEFAULT_MIN_PROPERTIES;\n\n const sourceCode = context.sourceCode;\n const filename = context.filename;\n if (isGeneratedFile(filename, sourceCode.getText())) {\n return {};\n }\n if (ignoreTestFiles && isTestFile(filename)) {\n return {};\n }\n\n const zodNamespaces = new Set<string>();\n\n function isZodCall(node: TSESTree.Node): node is TSESTree.CallExpression {\n return (\n node.type === AST_NODE_TYPES.CallExpression &&\n node.callee.type === AST_NODE_TYPES.MemberExpression &&\n !node.callee.computed &&\n node.callee.object.type === AST_NODE_TYPES.Identifier &&\n zodNamespaces.has(node.callee.object.name)\n );\n }\n\n function isCovered(node: TSESTree.CallExpression): boolean {\n let current: TSESTree.Node | undefined = node.parent ?? undefined;\n while (current !== undefined) {\n if (\n current !== node &&\n isZodCall(current) &&\n current.callee.type === AST_NODE_TYPES.MemberExpression &&\n current.callee.property.type === AST_NODE_TYPES.Identifier &&\n factories.has(current.callee.property.name)\n ) {\n return true;\n }\n if (\n current.type === AST_NODE_TYPES.CallExpression &&\n ((current.callee.type === AST_NODE_TYPES.Identifier &&\n MEMO_CALLEES.has(current.callee.name)) ||\n (current.callee.type === AST_NODE_TYPES.MemberExpression &&\n !current.callee.computed &&\n current.callee.property.type === AST_NODE_TYPES.Identifier &&\n MEMO_CALLEES.has(current.callee.property.name)))\n ) {\n return true;\n }\n current = current.parent ?? undefined;\n }\n return false;\n }\n\n /**\n * The OUTERMOST schema expression `expression` is a part of.\n *\n * `schemaExpression` climbs the builder chain hanging off the factory call;\n * this climbs the other axis — out of the shape object, the array, and the\n * argument list of whatever Zod construct encloses it. It exists because a\n * reported factory can be a FRAGMENT of a schema that does not itself move,\n * and prising one key's value out of an expression that is rebuilt per call\n * anyway saves nothing.\n */\n function outermostSchemaExpression(\n expression: TSESTree.Node,\n ): TSESTree.Node {\n // `confirmed` only advances past a Zod construct. Walking OUT of a shape\n // object is provisional until the call wrapping it turns out to be one:\n // `tool({ inputSchema: z.object({…}), execute })` also puts a schema in an\n // object literal, and treating that literal as the schema would inherit\n // `execute`'s free variables.\n let confirmed = expression;\n let current = expression;\n for (;;) {\n const parent: TSESTree.Node | undefined = current.parent ?? undefined;\n if (parent === undefined) {\n return confirmed;\n }\n if (\n (parent.type === AST_NODE_TYPES.Property && parent.value === current) ||\n parent.type === AST_NODE_TYPES.ObjectExpression ||\n parent.type === AST_NODE_TYPES.ArrayExpression\n ) {\n current = parent;\n continue;\n }\n if (\n parent.type === AST_NODE_TYPES.CallExpression &&\n parent.arguments.includes(current as TSESTree.CallExpressionArgument) &&\n isSchemaComposition(parent)\n ) {\n current = schemaExpression(parent);\n confirmed = current;\n continue;\n }\n return confirmed;\n }\n }\n\n /** A `z.*(…)` call, or a Zod combinator method applied to an existing schema. */\n function isSchemaComposition(node: TSESTree.CallExpression): boolean {\n // The combinator test runs FIRST: `isZodCall` is a type predicate, so\n // putting it on the left of `||` narrows `node` to `never` in the right\n // operand and the member access stops compiling.\n const { callee } = node;\n const isCombinator =\n callee.type === AST_NODE_TYPES.MemberExpression &&\n !callee.computed &&\n callee.property.type === AST_NODE_TYPES.Identifier &&\n ZOD_COMBINATOR_METHODS.has(callee.property.name);\n return isCombinator || isZodCall(node);\n }\n\n /** No reference inside the schema resolves to a binding the function owns. */\n function closesOverNothing(\n node: TSESTree.Node,\n enclosing: TSESTree.Node,\n ): boolean {\n const references: TSESLint.Scope.Reference[] = [];\n collectReferences(sourceCode.getScope(node), references);\n const [schemaStart, schemaEnd] = node.range;\n const [functionStart, functionEnd] = enclosing.range;\n for (const reference of references) {\n const [identifierStart] = reference.identifier.range;\n if (identifierStart < schemaStart || identifierStart >= schemaEnd) {\n continue;\n }\n const resolved = reference.resolved;\n if (resolved === null) {\n continue;\n }\n for (const definition of resolved.defs) {\n if (definition.type === \"ImportBinding\") {\n continue;\n }\n const [defStart, defEnd] = definition.node.range;\n // A binding declared INSIDE the schema travels with it. The callback\n // parameters of `.refine((value) => …)` / `.superRefine((data, ctx) =>\n // …)` / `z.preprocess((value) => …, …)` are the whole class, and the\n // enclosing-range test alone answered \"this closes over the function\"\n // for every one of them — so any schema carrying a refinement was\n // silently unreportable. What the documented `documenso` case actually\n // needs is the callback reading an OUTER binding, and that still\n // resolves outside this range and still bails.\n if (defStart >= schemaStart && defEnd <= schemaEnd) {\n continue;\n }\n if (defStart >= functionStart && defEnd <= functionEnd) {\n return false;\n }\n }\n }\n return true;\n }\n\n /** How the enclosing function should be named in the message. */\n function ownerName(enclosing: TSESTree.Node): string {\n const parent = enclosing.parent ?? undefined;\n if (\n enclosing.type === AST_NODE_TYPES.FunctionDeclaration &&\n enclosing.id !== null\n ) {\n return enclosing.id.name;\n }\n if (\n parent !== undefined &&\n parent.type === AST_NODE_TYPES.VariableDeclarator &&\n parent.id.type === AST_NODE_TYPES.Identifier\n ) {\n return parent.id.name;\n }\n if (\n parent !== undefined &&\n (parent.type === AST_NODE_TYPES.MethodDefinition ||\n parent.type === AST_NODE_TYPES.Property) &&\n parent.key.type === AST_NODE_TYPES.Identifier\n ) {\n return parent.key.name;\n }\n return \"this function\";\n }\n\n return {\n ImportDeclaration(node): void {\n if (!isZodModule(node.source.value)) {\n return;\n }\n for (const specifier of node.specifiers) {\n if (\n specifier.type === AST_NODE_TYPES.ImportNamespaceSpecifier ||\n specifier.type === AST_NODE_TYPES.ImportDefaultSpecifier ||\n (specifier.type === AST_NODE_TYPES.ImportSpecifier &&\n specifier.imported.type === AST_NODE_TYPES.Identifier &&\n specifier.imported.name === \"z\")\n ) {\n zodNamespaces.add(specifier.local.name);\n }\n }\n },\n CallExpression(node): void {\n if (zodNamespaces.size === 0 || !isZodCall(node)) {\n return;\n }\n const callee = node.callee as TSESTree.MemberExpression;\n if (callee.property.type !== AST_NODE_TYPES.Identifier) {\n return;\n }\n const factory = callee.property.name;\n if (!factories.has(factory)) {\n return;\n }\n const enclosing = outermostEnclosingFunction(node);\n if (enclosing === undefined) {\n return;\n }\n if (isCovered(node)) {\n return;\n }\n const shape = node.arguments[0];\n if (\n shape !== undefined &&\n shape.type === AST_NODE_TYPES.ObjectExpression &&\n shape.properties.length < minProperties\n ) {\n return;\n }\n const expression = schemaExpression(node);\n if (readsReceiver(expression)) {\n return;\n }\n if (buildsLocalizedText(expression)) {\n return;\n }\n // A fragment of a schema that cannot itself move is not reportable: the\n // enclosing expression is rebuilt on every call whatever we do to this\n // sub-schema. Only checked when an enclosing construct actually exists,\n // so `z.array(z.object({…}))` — where the whole expression IS hoistable\n // and `z.array` is not itself reportable — keeps reporting the inner\n // `z.object`, as the evidence file promises.\n const outermost = outermostSchemaExpression(expression);\n if (\n outermost !== expression &&\n (readsReceiver(outermost) ||\n buildsLocalizedText(outermost) ||\n !closesOverNothing(outermost, enclosing))\n ) {\n return;\n }\n if (!closesOverNothing(expression, enclosing)) {\n return;\n }\n context.report({\n node,\n messageId: \"hoistSchema\",\n data: { factory: `z.${factory}`, owner: ownerName(enclosing) },\n });\n },\n };\n },\n});\n","/**\n * @fileoverview _zod — the single source of truth for \"does this name read as a Zod schema?\".\n *\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/_zod.md\n */\n\n/** The `Z<Capital>` prefix convention: `ZUser`, `ZSubmitForm`. */\nexport const ZOD_PREFIX_RE = /^Z[A-Z]/;\n\n/** The `XxxSchema` suffix convention: `userSchema`, `SubmitFormDataSchema`. */\nexport const ZOD_SUFFIX_RE = /Schema$/;\n\n/** Either accepted convention. */\nexport const ZOD_SCHEMA_NAME_RE = /Schema$|^Z[A-Z]/;\n\n/**\n * Whether an import specifier resolves to Zod — `zod`, `zod/v4`, `zod/mini`,\n * `@hono/zod-validator`-style re-exports. Shared by `prefer-zod-enum` and\n * `prefer-zod-infer` so the two cannot disagree about what \"imports Zod\" means.\n */\nexport function isZodModule(source: string): boolean {\n return /(^|[/@-])zod([/-]|$)/.test(source);\n}\n","/**\n * @fileoverview prefer-non-nullable-collection — `T[] | null` gives an empty collection two representations and a null check to every caller.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/prefer-non-nullable-collection.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/prefer-non-nullable-collection.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isGeneratedFile, isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"preferNonNullableCollection\";\ntype Options = readonly [];\n\nconst ARRAY_TYPE_NAMES: ReadonlySet<string> = new Set([\"Array\", \"ReadonlyArray\"]);\n\nfunction propertyName(node: TSESTree.TSPropertySignature | TSESTree.PropertyDefinition): string {\n const key = node.key;\n if (key.type === AST_NODE_TYPES.Identifier) return key.name;\n if (key.type === AST_NODE_TYPES.Literal) return String(key.value);\n return \"collection\";\n}\n\nfunction isArrayType(node: TSESTree.TypeNode): boolean {\n if (node.type === AST_NODE_TYPES.TSArrayType) return true;\n return (\n node.type === AST_NODE_TYPES.TSTypeReference &&\n node.typeName.type === AST_NODE_TYPES.Identifier &&\n ARRAY_TYPE_NAMES.has(node.typeName.name)\n );\n}\n\nfunction isNullishType(node: TSESTree.TypeNode): boolean {\n return node.type === AST_NODE_TYPES.TSNullKeyword || node.type === AST_NODE_TYPES.TSUndefinedKeyword;\n}\n\nfunction isNullableArrayOnly(node: TSESTree.TSUnionType): boolean {\n const values = node.types.filter((member) => !isNullishType(member));\n return values.length > 0 && values.length < node.types.length && values.every(isArrayType);\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"prefer-non-nullable-collection\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Require array types to use an empty array instead of explicit nullish unions with two equivalent empty states.\",\n },\n schema: [],\n messages: {\n preferNonNullableCollection:\n \"`{{name}}` is a nullable array, so nullish and `[]` represent the same empty collection. Use a non-null array and default omitted values to `[]`.\",\n },\n },\n defaultOptions: [],\n create(context) {\n const normalizedFilename = context.filename.replaceAll(\"\\\\\", \"/\");\n if (\n isTestFile(context.filename) ||\n isGeneratedFile(context.filename, context.sourceCode.text) ||\n /\\/(?:vendor|vendored)\\//u.test(normalizedFilename)\n ) {\n return {};\n }\n\n function checkOptionalProperty(\n node: TSESTree.TSPropertySignature | TSESTree.PropertyDefinition,\n ): void {\n const annotation = node.typeAnnotation?.typeAnnotation;\n if (annotation === undefined) return;\n if (annotation.type !== AST_NODE_TYPES.TSUnionType || !isNullableArrayOnly(annotation)) {\n return;\n }\n context.report({\n node,\n messageId: \"preferNonNullableCollection\",\n data: { name: propertyName(node) },\n });\n }\n\n return {\n TSPropertySignature: checkOptionalProperty,\n PropertyDefinition: checkOptionalProperty,\n TSTypeAliasDeclaration(node): void {\n if (node.typeAnnotation.type !== AST_NODE_TYPES.TSUnionType) return;\n if (!isNullableArrayOnly(node.typeAnnotation)) return;\n context.report({\n node,\n messageId: \"preferNonNullableCollection\",\n data: { name: node.id.name },\n });\n },\n };\n },\n});\n","/**\n * @fileoverview prefer-schema-for-api-payload — reading a field off `response.json()` propagates `any` inward from the network boundary.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/prefer-schema-for-api-payload.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/prefer-schema-for-api-payload.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\nimport type { RuleContext, Scope } from \"@typescript-eslint/utils/ts-eslint\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isGeneratedFile, isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"unparsedJsonAccess\";\ntype Options = readonly [];\n\ntype Ctx = Readonly<RuleContext<MessageIds, Options>>;\n\n/**\n * Peel TypeScript wrapper nodes that don't affect the underlying value\n * (`as Foo`, `<Foo>x`, `x!`, `x satisfies Foo`, parentheses, optional chain\n * wrappers). Returns the inner expression we actually care about.\n */\nconst unwrap = (\n node: TSESTree.Node | null | undefined,\n): TSESTree.Node | null => {\n let current: TSESTree.Node | null | undefined = node;\n while (current !== null && current !== undefined) {\n if (\n current.type === AST_NODE_TYPES.TSAsExpression ||\n current.type === AST_NODE_TYPES.TSTypeAssertion ||\n current.type === AST_NODE_TYPES.TSNonNullExpression ||\n current.type === AST_NODE_TYPES.TSSatisfiesExpression\n ) {\n current = current.expression;\n } else if (current.type === AST_NODE_TYPES.ChainExpression) {\n current = current.expression;\n } else {\n break;\n }\n }\n return current ?? null;\n};\n\n/**\n * Promise-chain links that pass the payload along unchanged. `.parse` /\n * `.safeParse` are NOT here — those are the validation the rule is asking for.\n */\nconst PROMISE_CHAIN_METHODS: ReadonlySet<string> = new Set([\n \"then\",\n \"catch\",\n \"finally\",\n]);\n\n/** True for `ZUser.parse` / `ZUser.safeParse` handed to a chain link as a callback. */\nconst isSchemaParseReference = (\n node: TSESTree.Node | null | undefined,\n): boolean => {\n const inner = unwrap(node);\n return (\n inner !== null &&\n inner.type === AST_NODE_TYPES.MemberExpression &&\n !inner.computed &&\n inner.property.type === AST_NODE_TYPES.Identifier &&\n (inner.property.name === \"parse\" || inner.property.name === \"safeParse\")\n );\n};\n\n/**\n * Returns true if the expression is (optionally awaited) a raw payload source:\n * `<x>.json()` (a fetch/Request body) or `JSON.parse(<x>)`.\n *\n * Both hand back `any`, and the failure mode is the same: `payload.user.id`\n * type-checks against a shape the peer never sent, and surfaces at runtime as\n * `undefined` several frames away. Note this only matters at the point a FIELD\n * is read — `const raw: unknown = JSON.parse(body)` is the recommended shape and\n * is never reported, because nothing is accessed off it.\n */\nconst isRawPayloadSource = (\n node: TSESTree.Node | null | undefined,\n): boolean => {\n let current = unwrap(node);\n if (current === null) return false;\n if (current.type === AST_NODE_TYPES.AwaitExpression) {\n current = unwrap(current.argument);\n }\n if (current === null || current.type !== AST_NODE_TYPES.CallExpression) {\n return false;\n }\n const callee = unwrap(current.callee);\n if (callee === null || callee.type !== AST_NODE_TYPES.MemberExpression) {\n return false;\n }\n const property = unwrap(callee.property);\n if (property === null || property.type !== AST_NODE_TYPES.Identifier) {\n return false;\n }\n if (property.name === \"json\") {\n return true;\n }\n // A promise-chain link does not change what the value IS: the result of\n // `res.json().catch(() => ({}))` is still an unvalidated payload, and before\n // this the binding went untracked so the real field read below it was missed.\n // Unless the chain ends in a schema parse, in which case it is validated.\n if (PROMISE_CHAIN_METHODS.has(property.name)) {\n return (\n !current.arguments.some(isSchemaParseReference) &&\n isRawPayloadSource(callee.object)\n );\n }\n // `JSON.parse(...)` specifically — not any `.parse()`, which is usually the\n // schema validation we are asking for.\n const object = unwrap(callee.object);\n return (\n property.name === \"parse\" &&\n object !== null &&\n object.type === AST_NODE_TYPES.Identifier &&\n object.name === \"JSON\" &&\n // ...but not `JSON.parse(readFileSync(p, \"utf8\"))` — see isLocalFileRead.\n !isLocalFileRead(current.arguments[0])\n );\n};\n\n/** Filesystem readers whose result is repo-local text, not a peer's payload. */\nconst FILE_READ_RE = /^(readFile|readFileSync|readJson|readJsonSync|readJSON)$/;\n\n/**\n * True when the expression tree contains a filesystem read, i.e. the JSON came\n * off local disk rather than off the wire.\n *\n * The rule's premise is that the value is \"unvalidated and attacker-controlled\".\n * `JSON.parse(readFileSync(\"package.json\", \"utf8\"))` is neither: the bytes ship\n * with the repo, nobody else can write them, and a Zod schema over a file the\n * build already depends on adds a second place to update.\n */\nconst isLocalFileRead = (node: TSESTree.Node | null | undefined): boolean => {\n let found = false;\n const visit = (current: TSESTree.Node | null | undefined): void => {\n if (found || current === null || current === undefined) return;\n if (current.type === AST_NODE_TYPES.CallExpression) {\n const callee = unwrap(current.callee);\n const name =\n callee?.type === AST_NODE_TYPES.Identifier\n ? callee.name\n : callee?.type === AST_NODE_TYPES.MemberExpression &&\n !callee.computed &&\n callee.property.type === AST_NODE_TYPES.Identifier\n ? callee.property.name\n : null;\n if (name !== null && FILE_READ_RE.test(name)) {\n found = true;\n return;\n }\n }\n for (const key of Object.keys(current) as (keyof TSESTree.Node)[]) {\n if (key === \"parent\") continue;\n const value = current[key];\n for (const child of (Array.isArray(value) ? value : [value]) as unknown[]) {\n if (\n child !== null &&\n typeof child === \"object\" &&\n typeof (child as { type?: unknown }).type === \"string\"\n ) {\n visit(child as TSESTree.Node);\n }\n }\n }\n };\n visit(node);\n return found;\n};\n\n/** Assertion helpers whose argument is being checked, not consumed. */\nconst ASSERTION_CALLEE_RE = /^(expect|assert|should|invariant)$/;\n\n/**\n * True when the node sits inside an assertion call, e.g.\n * `expect(loaderData.method).toEqual(\"GET\")`.\n *\n * The rule's premise is that the field is READ and trusted. Inside an assertion\n * it is neither: the assertion states what the value must be, which is the same\n * check a schema would perform, and a schema parse would move the failure away\n * from the assertion that explains it.\n */\nconst isInsideAssertion = (node: TSESTree.Node): boolean => {\n for (\n let current: TSESTree.Node | undefined | null = node.parent;\n current !== undefined && current !== null;\n current = current.parent\n ) {\n if (current.type !== AST_NODE_TYPES.CallExpression) continue;\n let callee: TSESTree.Node = current.callee;\n while (callee.type === AST_NODE_TYPES.MemberExpression) {\n callee = callee.object;\n }\n if (callee.type === AST_NODE_TYPES.CallExpression) {\n callee = callee.callee;\n }\n if (\n callee.type === AST_NODE_TYPES.Identifier &&\n ASSERTION_CALLEE_RE.test(callee.name)\n ) {\n return true;\n }\n }\n return false;\n};\n\nconst findVariable = (\n scope: Scope.Scope | null,\n name: string,\n): Scope.Variable | null => {\n let current: Scope.Scope | null = scope;\n while (current !== null) {\n const variable = current.set.get(name);\n if (variable !== undefined) return variable;\n current = current.upper;\n }\n return null;\n};\n\n/**\n * Calls that CHECK their argument rather than trust it: a type-guard predicate\n * (`isProtectedResourceMetadata`) or a named validator.\n */\nconst GUARD_NAME_RE = /^(?:is|validate|parse|assert|decode|coerce)[A-Z]/;\n\n/**\n * True when the read is being TYPE-TESTED rather than trusted — the operand of\n * a `typeof`, the sole argument of `Array.isArray(...)`, or an argument to a\n * guard/validator call.\n *\n * This SKIPS the report without untracking the variable, so a later unguarded\n * read of a different field still fires. Recall cost 0 of 45.\n */\nconst isValidationRead = (node: TSESTree.Node): boolean => {\n let current: TSESTree.Node = node;\n let parent: TSESTree.Node | null | undefined = current.parent;\n while (\n parent !== null &&\n parent !== undefined &&\n (parent.type === AST_NODE_TYPES.TSAsExpression ||\n parent.type === AST_NODE_TYPES.TSTypeAssertion ||\n parent.type === AST_NODE_TYPES.TSNonNullExpression ||\n parent.type === AST_NODE_TYPES.TSSatisfiesExpression ||\n parent.type === AST_NODE_TYPES.ChainExpression)\n ) {\n current = parent;\n parent = parent.parent;\n }\n if (parent === null || parent === undefined) return false;\n\n if (\n parent.type === AST_NODE_TYPES.UnaryExpression &&\n parent.operator === \"typeof\" &&\n parent.argument === current\n ) {\n return true;\n }\n if (\n parent.type !== AST_NODE_TYPES.CallExpression ||\n !parent.arguments.some((arg): boolean => arg === current)\n ) {\n return false;\n }\n const callee = parent.callee;\n if (\n callee.type === AST_NODE_TYPES.MemberExpression &&\n !callee.computed &&\n callee.object.type === AST_NODE_TYPES.Identifier &&\n callee.object.name === \"Array\" &&\n callee.property.type === AST_NODE_TYPES.Identifier &&\n callee.property.name === \"isArray\"\n ) {\n return parent.arguments.length === 1;\n }\n return (\n callee.type === AST_NODE_TYPES.Identifier && GUARD_NAME_RE.test(callee.name)\n );\n};\n\n/**\n * True when a call sits in a boolean-test position (`if`/`while`/`for`/`?:`),\n * seen through `!`, `&&`/`||`, and optional-chaining wrappers — i.e. it narrows.\n */\nconst isGuardTestPosition = (node: TSESTree.Node): boolean => {\n let current: TSESTree.Node = node;\n let parent: TSESTree.Node | null | undefined = current.parent;\n while (parent !== undefined && parent !== null) {\n switch (parent.type) {\n case AST_NODE_TYPES.UnaryExpression:\n case AST_NODE_TYPES.LogicalExpression:\n case AST_NODE_TYPES.ChainExpression:\n current = parent;\n parent = parent.parent;\n continue;\n case AST_NODE_TYPES.IfStatement:\n case AST_NODE_TYPES.ConditionalExpression:\n case AST_NODE_TYPES.WhileStatement:\n case AST_NODE_TYPES.DoWhileStatement:\n case AST_NODE_TYPES.ForStatement:\n return parent.test === current;\n default:\n return false;\n }\n }\n return false;\n};\n\nconst isUnvalidatedVariableRef = (\n node: TSESTree.Node | null | undefined,\n scope: Scope.Scope,\n tracked: ReadonlySet<Scope.Variable>,\n): boolean => {\n const unwrapped = unwrap(node);\n if (unwrapped === null || unwrapped.type !== AST_NODE_TYPES.Identifier) {\n return false;\n }\n const variable = findVariable(scope, unwrapped.name);\n return variable !== null && tracked.has(variable);\n};\n\nexport default createRule<Options, MessageIds>({\n name: \"prefer-schema-for-api-payload\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Require Zod (or similar) schema validation on `response.json()` / `JSON.parse()` results before property access.\",\n },\n schema: [],\n messages: {\n unparsedJsonAccess:\n \"Property access on an unvalidated payload (`response.json()` / `JSON.parse()`) without a schema parse. Pipe through `XSchema.parse(...)` (Zod) before reading fields.\",\n },\n },\n defaultOptions: [],\n create(context: Ctx) {\n // A fixture parses what it just produced and asserts on it; see @fileoverview.\n if (isTestFile(context.filename) || isGeneratedFile(context.filename, context.sourceCode.text)) {\n return {};\n }\n\n const unvalidatedVariables = new Set<Scope.Variable>();\n\n /**\n * True when every binding a destructuring pattern introduces is type-tested\n * somewhere. Requiring EVERY binding (not any) keeps the report when one\n * field is checked and another is used unvalidated.\n */\n const isFullyNarrowedPattern = (\n declarator: TSESTree.VariableDeclarator,\n ): boolean => {\n const declared = context.sourceCode.getDeclaredVariables(declarator);\n return (\n declared.length > 0 &&\n declared.every((variable) =>\n variable.references.some((reference) =>\n isValidationRead(reference.identifier),\n ),\n )\n );\n };\n\n const trackInitializer = (\n declarator: TSESTree.VariableDeclarator,\n ): void => {\n if (!isRawPayloadSource(declarator.init)) return;\n const declaredVars = context.sourceCode.getDeclaredVariables(declarator);\n const variable = declaredVars[0];\n if (variable !== undefined) {\n unvalidatedVariables.add(variable);\n }\n };\n\n return {\n VariableDeclarator(node): void {\n const scope = context.sourceCode.getScope(node);\n\n if (node.id.type === AST_NODE_TYPES.Identifier) {\n trackInitializer(node);\n return;\n }\n\n if (\n node.id.type === AST_NODE_TYPES.ObjectPattern ||\n node.id.type === AST_NODE_TYPES.ArrayPattern\n ) {\n if (isRawPayloadSource(node.init)) {\n // `const { cacheTag } = await req.json()` where EVERY binding the\n // pattern introduces is then type-tested is the same \"the read IS\n // the validation\" case as `isValidationRead`, one node up.\n if (!isFullyNarrowedPattern(node)) {\n context.report({ node: node.id, messageId: \"unparsedJsonAccess\" });\n }\n return;\n }\n if (\n isUnvalidatedVariableRef(node.init, scope, unvalidatedVariables)\n ) {\n context.report({ node: node.id, messageId: \"unparsedJsonAccess\" });\n }\n }\n },\n AssignmentExpression(node): void {\n const scope = context.sourceCode.getScope(node);\n\n if (node.left.type === AST_NODE_TYPES.Identifier) {\n const variable = findVariable(scope, node.left.name);\n if (variable === null) return;\n if (isRawPayloadSource(node.right)) {\n unvalidatedVariables.add(variable);\n } else {\n // Reassigned to a parse call or something else: drop tracking.\n unvalidatedVariables.delete(variable);\n }\n return;\n }\n\n if (\n node.left.type === AST_NODE_TYPES.ObjectPattern ||\n node.left.type === AST_NODE_TYPES.ArrayPattern\n ) {\n if (isRawPayloadSource(node.right)) {\n context.report({\n node: node.left,\n messageId: \"unparsedJsonAccess\",\n });\n return;\n }\n if (\n isUnvalidatedVariableRef(node.right, scope, unvalidatedVariables)\n ) {\n context.report({\n node: node.left,\n messageId: \"unparsedJsonAccess\",\n });\n }\n }\n },\n CallExpression(node): void {\n if (node.callee.type !== AST_NODE_TYPES.Identifier) return;\n if (!GUARD_NAME_RE.test(node.callee.name) && !isGuardTestPosition(node)) {\n return;\n }\n const scope = context.sourceCode.getScope(node);\n for (const arg of node.arguments) {\n if (arg.type === AST_NODE_TYPES.SpreadElement) continue;\n const unwrapped = unwrap(arg);\n if (unwrapped === null || unwrapped.type !== AST_NODE_TYPES.Identifier) {\n continue;\n }\n const variable = findVariable(scope, unwrapped.name);\n if (variable !== null) unvalidatedVariables.delete(variable);\n }\n },\n MemberExpression(node): void {\n // The read is inside an assertion — the assertion IS the validation.\n if (isInsideAssertion(node)) return;\n // The read is being type-tested, not trusted. Skipping WITHOUT\n // untracking leaves a later unguarded read of another field reportable.\n if (isValidationRead(node)) return;\n const scope = context.sourceCode.getScope(node);\n const obj = unwrap(node.object);\n\n if (isRawPayloadSource(obj)) {\n // Direct `.foo` access on `(await r.json()).foo` is always bad,\n // unless the parent call is a `.parse()`/`.safeParse()` (a\n // validation) or a `.then()`/`.catch()`/`.finally()` (a promise-chain\n // link, not a field read — `isRawPayloadSource` carries the taint\n // through it so the real read below still fires).\n const parent = node.parent;\n if (\n parent.type === AST_NODE_TYPES.CallExpression &&\n parent.callee === node &&\n node.property.type === AST_NODE_TYPES.Identifier &&\n (node.property.name === \"parse\" ||\n node.property.name === \"safeParse\" ||\n PROMISE_CHAIN_METHODS.has(node.property.name))\n ) {\n return;\n }\n context.report({ node, messageId: \"unparsedJsonAccess\" });\n return;\n }\n\n if (\n obj !== null &&\n obj.type === AST_NODE_TYPES.Identifier &&\n isUnvalidatedVariableRef(obj, scope, unvalidatedVariables)\n ) {\n context.report({ node, messageId: \"unparsedJsonAccess\" });\n const variable = findVariable(scope, obj.name);\n if (variable !== null) {\n unvalidatedVariables.delete(variable);\n }\n }\n },\n };\n },\n});\n","/**\n * @fileoverview prefer-semantic-colors — a raw palette class or hex literal pins a colour the design system can no longer retheme.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/prefer-semantic-colors.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/prefer-semantic-colors.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\nimport { existsSync, readdirSync, readFileSync } from \"fs\";\nimport { dirname, join, parse } from \"path\";\n\nimport { createRule } from \"./_docs.js\";\nimport { classTokens, tailwindBase } from \"./_tailwind.js\";\n\ntype MessageIds = \"rawPalette\" | \"arbitraryColor\" | \"inlineColor\";\ntype Options = readonly [\n {\n requireSemanticTokens?: boolean;\n }?,\n];\n\nconst COLOR_PREFIXES =\n \"text|bg|border(?:-[trblxyse])?|ring(?:-offset)?|fill|stroke|from|via|to|divide|decoration|placeholder|accent|caret|shadow|outline\";\nconst PALETTE =\n \"red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|violet|purple|fuchsia|pink|rose|slate|gray|zinc|neutral|stone\";\nconst COLOR_FN = \"rgba?|hsla?|hwb|oklch|oklab|lab|lch|color\";\n\nconst PALETTE_STEP = \"50|[1-9]00|950\";\nconst RAW_PALETTE_RE = new RegExp(`^(?:${COLOR_PREFIXES})-(?:${PALETTE})-(?:${PALETTE_STEP})(?:/\\\\d{1,3})?$`);\nconst ARBITRARY_COLOR_RE = new RegExp(\n `^(?:${COLOR_PREFIXES})-\\\\[(?:#[0-9a-fA-F]{3,8}|(?:${COLOR_FN})\\\\([^\\\\]]*\\\\))\\\\]$`,\n \"i\",\n);\n\n/** Call expressions whose string args are className fragments. */\nconst CLASS_FNS = new Set<string>([\"cn\", \"clsx\", \"cva\", \"tv\", \"cx\", \"twMerge\", \"classnames\", \"classNames\"]);\nconst CLASS_NAME_RE = /class/i;\n\n/** CSS color-bearing properties, in their JSX (camelCase) and SVG-attribute forms. */\nconst STYLE_COLOR_PROPS = new Set<string>([\n \"color\",\n \"background\",\n \"backgroundColor\",\n \"borderColor\",\n \"borderTopColor\",\n \"borderRightColor\",\n \"borderBottomColor\",\n \"borderLeftColor\",\n \"outlineColor\",\n \"caretColor\",\n \"textDecorationColor\",\n \"columnRuleColor\",\n \"fill\",\n \"stroke\",\n \"stopColor\",\n \"floodColor\",\n \"lightingColor\",\n]);\nconst RAW_COLOR_VALUE_RE = new RegExp(`#[0-9a-fA-F]{3,8}\\\\b|\\\\b(?:${COLOR_FN})\\\\s*\\\\(`, \"i\");\n\nconst CSS_VAR_REFERENCE_RE = /var\\(\\s*--/;\n\nconst STORIES_FILE_RE = /\\.stories\\.[cm]?[jt]sx?$/i;\n\n/**\n * Token ROLES, not one vendor's token NAMES.\n *\n * The previous vocabulary was shadcn's and only shadcn's, so a repo with a\n * complete, consistently used design system was read as having none and the\n * `requireSemanticTokens` gate suppressed the rule across the whole repo.\n * Medusa is the worked example: its system is `bg-ui-bg-base` /\n * `text-ui-fg-subtle` backed by `--fg-base` / `--bg-base` custom properties, so\n * its `globals.css` was FOUND and then REJECTED. `dub` names its tokens\n * `content-default` / `bg-default` and lost the same way.\n *\n * Detection errs deliberately towards \"a system exists\". Guessing yes leaves\n * the rule RUNNING, and an author can disable any line it reports with a\n * reason; guessing no silently disables an error-level rule for a whole\n * repository, and nobody finds out. Those costs are not symmetric, which is why\n * this is a role vocabulary rather than an exact token list.\n */\nconst TOKEN_ROLES =\n \"background|foreground|primary|secondary|muted|accent|destructive|danger|success|warning|info|border|card|popover|surface|content|base|subtle|default|ring|input|fg|bg\";\nconst SEMANTIC_TOKEN_RE = new RegExp(\n `--(?:color-)?(?:${TOKEN_ROLES})\\\\b|(?:bg|text|border|ring|fill|stroke)-(?:ui-)?(?:${TOKEN_ROLES})\\\\b`,\n);\n\n/**\n * Tailwind v4 is CSS-first: there is no `tailwind.config.*` to find, and the\n * theme lives in an `@theme` block in the stylesheet. Without this, every v4\n * setup reads as \"no design system\" and the gate suppresses the rule.\n */\nconst THEME_BLOCK_RE = /@theme\\b/;\n\n/**\n * Files whose PRESENCE alone proves a configured Tailwind design system.\n *\n * Reading these for a token vocabulary was the second half of the same defect.\n * A `tailwind.config.*` frequently defines its theme by importing a preset\n * (`presets: [require(\"@medusajs/ui-preset\")]`) or by spreading a shared\n * object, so the token names are not textually present in the file that proves\n * they exist. `components.json` was already treated this way; the config files\n * are the same kind of evidence and are now treated the same.\n */\nconst PRESENCE_MARKERS = [\n \"components.json\",\n \"tailwind.config.js\",\n \"tailwind.config.cjs\",\n \"tailwind.config.mjs\",\n \"tailwind.config.ts\",\n \"tailwind.config.mts\",\n \"tailwind.config.cts\",\n];\n\n/**\n * Stylesheets that only count as evidence if they actually DECLARE tokens.\n *\n * Unlike a Tailwind config, the existence of a `globals.css` says nothing — every\n * app has one. So these are read and matched against `SEMANTIC_TOKEN_RE` or the\n * v4 `@theme` block.\n */\nconst CSS_DETECTION_FILES = [\n \"app/globals.css\",\n \"app/global.css\",\n \"app/styles/globals.css\",\n \"src/app/globals.css\",\n \"src/app/global.css\",\n \"src/global.css\",\n \"src/index.css\",\n \"src/styles/globals.css\",\n \"src/styles/index.css\",\n \"styles/globals.css\",\n \"styles/index.css\",\n];\n/**\n * Files that mark a directory as the root of a multi-package workspace.\n *\n * `package.json` is handled separately: only a `workspaces` field counts, since\n * every package has a `package.json` and treating it as a root would stop the\n * sideways scan at the nearest leaf package.\n */\nconst WORKSPACE_ROOT_FILES = [\n \"pnpm-workspace.yaml\",\n \"pnpm-workspace.yml\",\n \"turbo.json\",\n \"lerna.json\",\n];\n\n/** Where workspace packages live when the root declares no globs, or none parse. */\nconst DEFAULT_WORKSPACE_GLOBS = [\"packages/*\", \"apps/*\"];\n\n/** Upper bound on the sideways scan, so a huge monorepo cannot stall a lint run. */\nconst MAX_WORKSPACE_PACKAGES = 512;\n\n/** \"Is there a detection file at or above this directory?\" — a pure ancestry fact. */\nconst ancestryCache = new Map<string, boolean>();\n\n/** \"Does any package of this workspace carry a detection file?\", keyed by root. */\nconst workspaceScanCache = new Map<string, boolean>();\n\n/** Nearest workspace root at or above a directory, `null` if there is none. */\nconst workspaceRootCache = new Map<string, string | null>();\n\n/** SVG container elements whose children carry structural (not UI-token) colors. */\nconst SVG_DEFS_CONTAINERS = new Set<string>([\n \"mask\",\n \"clipPath\",\n \"defs\",\n \"pattern\",\n \"linearGradient\",\n \"radialGradient\",\n]);\n\n/** Neutral fill/stroke literals that are SVG drawing data, never a UI token. */\nconst SVG_EXEMPT_COLOR_VALUES = new Set<string>([\n \"#fff\",\n \"#ffffff\",\n \"#000\",\n \"#000000\",\n \"transparent\",\n \"none\",\n \"currentcolor\",\n \"inherit\",\n]);\n\n// A `fill`/`stroke` literal anywhere inside an `<svg>` subtree is drawing data\n// (icon/illustration artwork), not a reusable UI token — the color is inherent to\n// the graphic. Exempt any descendant of `<svg>` (which subsumes the defs\n// containers `<mask>`/`<clipPath>`/`<defs>`/`<pattern>`/gradients).\nfunction jsxElementName(node: TSESTree.JSXElement): string | null {\n const name = node.openingElement.name;\n if (name.type === AST_NODE_TYPES.JSXIdentifier) return name.name;\n if (name.type === AST_NODE_TYPES.JSXMemberExpression && name.property.type === AST_NODE_TYPES.JSXIdentifier) {\n return name.property.name;\n }\n return null;\n}\n\nfunction isSvgLikeElementName(name: string): boolean {\n return name === \"svg\" || SVG_DEFS_CONTAINERS.has(name) || /svg$/i.test(name);\n}\n\n/**\n * Intrinsic lowercase SVG shape primitives.\n *\n * A `fill`/`stroke` on a lowercase `<path>` is never a reusable-UI-token\n * position — real component styling goes through `className` or `style`, which\n * this guard does not touch — so the recall cost is zero.\n */\nconst SVG_SHAPE_PRIMITIVES = new Set<string>([\n \"circle\",\n \"ellipse\",\n \"g\",\n \"line\",\n \"path\",\n \"polygon\",\n \"polyline\",\n \"rect\",\n \"stop\",\n \"text\",\n \"tspan\",\n \"use\",\n]);\n\n/**\n * Files rendered by react-email or react-pdf.\n *\n * CSS-variable-backed semantic tokens cannot work in either target. `<Tailwind>`\n * from `@react-email/components` compiles classes to inline styles at render\n * time, and `hsl(var(--primary))` is undefined in a mail client; react-pdf has\n * no CSS custom properties at all. Raw palette classes and literal hex are the\n * correct practice there, so the rule's advice is unfollowable.\n */\nconst EMAIL_OR_PDF_IMPORT_RE = /@react-(?:email|pdf)\\//;\n\nconst isInsideSvg = (node: TSESTree.Node): boolean => {\n let current: TSESTree.Node | null | undefined = node.parent;\n while (current !== undefined && current !== null) {\n if (current.type === AST_NODE_TYPES.JSXElement) {\n const name = jsxElementName(current);\n if (name !== null && isSvgLikeElementName(name)) return true;\n }\n current = current.parent;\n }\n return false;\n};\n\nconst isInsideIconFactoryPath = (node: TSESTree.Node): boolean => {\n let current: TSESTree.Node | null | undefined = node.parent;\n while (current !== undefined && current !== null) {\n if (\n current.type === AST_NODE_TYPES.Property &&\n propName(current.key) === \"path\" &&\n current.parent.type === AST_NODE_TYPES.ObjectExpression &&\n current.parent.parent.type === AST_NODE_TYPES.CallExpression &&\n current.parent.parent.callee.type === AST_NODE_TYPES.Identifier &&\n current.parent.parent.callee.name === \"createIcon\"\n ) {\n return true;\n }\n current = current.parent;\n }\n return false;\n};\n\n/** Does this one directory carry a design-token marker? */\nconst hasMarkerAt = (dir: string): boolean => {\n if (PRESENCE_MARKERS.some((rel) => existsSync(join(dir, rel)))) return true;\n for (const rel of CSS_DETECTION_FILES) {\n const candidate = join(dir, rel);\n if (!existsSync(candidate)) continue;\n try {\n const css = readFileSync(candidate, \"utf8\");\n if (SEMANTIC_TOKEN_RE.test(css) || THEME_BLOCK_RE.test(css)) return true;\n } catch {\n // Ignore unreadable stylesheets; absence of evidence means no report.\n }\n }\n return false;\n};\n\n/**\n * Is there a marker at or above `startDir`? Walks to the filesystem root.\n *\n * There is deliberately no depth budget. A budget introduces a third answer —\n * \"ran out\" — which has to be reported as one of the other two, and reporting it\n * as \"no design system\" made this gate's result depend on the ORDER files were\n * linted in.\n *\n * Every visited directory is memoised, so the walk runs once per tree. Caching\n * the resolved answer for all of them is sound: each sits at or below wherever\n * the answer was settled, so \"at or above\" holds for each of them too.\n */\nconst hasMarkerAtOrAbove = (startDir: string): boolean => {\n let dir = startDir;\n const root = parse(dir).root;\n const visited: string[] = [];\n let answer: boolean;\n\n for (;;) {\n const cached = ancestryCache.get(dir);\n if (cached !== undefined) {\n answer = cached;\n break;\n }\n visited.push(dir);\n if (hasMarkerAt(dir)) {\n answer = true;\n break;\n }\n const parent = dirname(dir);\n if (dir === root || parent === dir) {\n answer = false;\n break;\n }\n dir = parent;\n }\n\n for (const seen of visited) ancestryCache.set(seen, answer);\n return answer;\n};\n\n/**\n * The workspace globs a root declares, from `package.json` or `pnpm-workspace.yaml`.\n *\n * The YAML is read with a line regex rather than a parser: a dependency-free rule\n * cannot pull one in, and the only shape that matters is the flat `packages:`\n * list every pnpm workspace writes.\n */\nconst readWorkspaceGlobs = (dir: string): string[] => {\n const globs: string[] = [];\n\n const packageJson = join(dir, \"package.json\");\n if (existsSync(packageJson)) {\n try {\n const parsed: unknown = JSON.parse(readFileSync(packageJson, \"utf8\"));\n const declared =\n typeof parsed === \"object\" && parsed !== null && \"workspaces\" in parsed\n ? (parsed as { workspaces?: unknown }).workspaces\n : undefined;\n const list = Array.isArray(declared)\n ? declared\n : typeof declared === \"object\" &&\n declared !== null &&\n Array.isArray((declared as { packages?: unknown }).packages)\n ? (declared as { packages: unknown[] }).packages\n : [];\n for (const entry of list) if (typeof entry === \"string\") globs.push(entry);\n } catch {\n // A malformed package.json is not this rule's problem to report.\n }\n }\n\n for (const name of [\"pnpm-workspace.yaml\", \"pnpm-workspace.yml\"]) {\n const yaml = join(dir, name);\n if (!existsSync(yaml)) continue;\n try {\n for (const line of readFileSync(yaml, \"utf8\").split(\"\\n\")) {\n const match = /^\\s*-\\s*[\"']?([^\"'#\\s]+)[\"']?\\s*$/u.exec(line);\n if (match?.[1] !== undefined) globs.push(match[1]);\n }\n } catch {\n // Same.\n }\n }\n\n return globs;\n};\n\n/** Expand a workspace glob one level: `packages/*`, `packages/**`, or a literal path. */\nconst expandWorkspaceGlob = (root: string, glob: string): string[] => {\n const star = glob.indexOf(\"*\");\n if (star === -1) return [join(root, glob)];\n\n const prefix = glob.slice(0, star).replace(/\\/$/u, \"\");\n const parent = prefix === \"\" ? root : join(root, prefix);\n try {\n return readdirSync(parent, { withFileTypes: true })\n .filter((entry) => entry.isDirectory() && !entry.name.startsWith(\".\"))\n .map((entry) => join(parent, entry.name));\n } catch {\n return [];\n }\n};\n\n/** Nearest directory at or above `startDir` that declares a multi-package workspace. */\nconst findWorkspaceRoot = (startDir: string): string | null => {\n let dir = startDir;\n const root = parse(dir).root;\n const visited: string[] = [];\n let answer: string | null;\n\n for (;;) {\n const cached = workspaceRootCache.get(dir);\n if (cached !== undefined) {\n answer = cached;\n break;\n }\n visited.push(dir);\n if (\n WORKSPACE_ROOT_FILES.some((name) => existsSync(join(dir, name))) ||\n readWorkspaceGlobs(dir).length > 0\n ) {\n answer = dir;\n break;\n }\n const parent = dirname(dir);\n if (dir === root || parent === dir) {\n answer = null;\n break;\n }\n dir = parent;\n }\n\n for (const seen of visited) workspaceRootCache.set(seen, answer);\n return answer;\n};\n\n/**\n * Does any package of this workspace carry a design-token marker?\n *\n * An upward walk alone silences a whole monorepo whose token config lives in a\n * sibling package: no ancestor chain from a source file passes through it. A\n * token system in a sibling package is still a token system — that is what a\n * workspace IS — so the scan goes sideways from the workspace root when, and only\n * when, the upward walk has already come back empty.\n */\nconst workspaceHasMarker = (root: string): boolean => {\n const cached = workspaceScanCache.get(root);\n if (cached !== undefined) return cached;\n\n const globs = readWorkspaceGlobs(root);\n const candidates = new Set<string>();\n for (const glob of globs.length > 0 ? globs : DEFAULT_WORKSPACE_GLOBS) {\n for (const dir of expandWorkspaceGlob(root, glob)) {\n candidates.add(dir);\n if (candidates.size >= MAX_WORKSPACE_PACKAGES) break;\n }\n if (candidates.size >= MAX_WORKSPACE_PACKAGES) break;\n }\n\n let found = false;\n for (const dir of candidates) {\n if (hasMarkerAt(dir)) {\n found = true;\n break;\n }\n }\n workspaceScanCache.set(root, found);\n return found;\n};\n\n/** Does a design-token system exist anywhere this file's project can see? */\nconst hasSemanticTokenSystem = (filename: string): boolean => {\n const dir = dirname(filename);\n if (hasMarkerAtOrAbove(dir)) return true;\n const root = findWorkspaceRoot(dir);\n return root !== null && workspaceHasMarker(root);\n};\n\nconst propName = (key: TSESTree.Property[\"key\"]): string | null => {\n if (key.type === AST_NODE_TYPES.Identifier) return key.name;\n if (key.type === AST_NODE_TYPES.Literal && typeof key.value === \"string\") return key.value;\n return null;\n};\n\nexport default createRule<Options, MessageIds>({\n name: \"prefer-semantic-colors\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Enforce design-system semantic color tokens (bg-primary, text-destructive, …) over raw Tailwind palette classes (text-red-500), arbitrary color values (bg-[#fff]), and inline color literals.\",\n },\n schema: [\n {\n type: \"object\",\n additionalProperties: false,\n properties: {\n requireSemanticTokens: { type: \"boolean\" },\n },\n },\n ],\n messages: {\n rawPalette:\n \"Raw palette class '{{class}}' — use a semantic token (e.g. text-foreground, bg-primary, text-destructive, bg-muted).\",\n arbitraryColor:\n \"Hardcoded color '{{class}}' — use a semantic token, or var(--…). For charts/brand add an eslint-disable with a reason.\",\n inlineColor:\n \"Hardcoded color '{{value}}' — use a semantic token / CSS variable. For charts/standalone pages add an eslint-disable with a reason.\",\n },\n },\n defaultOptions: [{}],\n create(context, [options]) {\n if (STORIES_FILE_RE.test(context.filename)) return {};\n if (EMAIL_OR_PDF_IMPORT_RE.test(context.sourceCode.getText())) return {};\n if (options?.requireSemanticTokens === true && !hasSemanticTokenSystem(context.filename)) {\n return {};\n }\n\n const reportClasses = (value: string, node: TSESTree.Node): void => {\n for (const token of classTokens(value)) {\n const base = tailwindBase(token);\n if (RAW_PALETTE_RE.test(base)) {\n context.report({ node, messageId: \"rawPalette\", data: { class: token } });\n } else if (ARBITRARY_COLOR_RE.test(base) && !CSS_VAR_REFERENCE_RE.test(base)) {\n context.report({ node, messageId: \"arbitraryColor\", data: { class: token } });\n }\n }\n };\n\n // Walk a node that holds className fragments: strings, templates, arrays, cva\n // variant objects, and conditionals. CallExpressions are handled separately, so\n // they're not recursed here (avoids double-reporting cn()/cva() args).\n const checkClassNode = (node: TSESTree.Node | null): void => {\n if (node === null) return;\n switch (node.type) {\n case AST_NODE_TYPES.Literal:\n if (typeof node.value === \"string\") reportClasses(node.value, node);\n break;\n case AST_NODE_TYPES.TemplateLiteral:\n for (const quasi of node.quasis) reportClasses(quasi.value.cooked ?? \"\", quasi);\n break;\n case AST_NODE_TYPES.ArrayExpression:\n for (const element of node.elements) {\n if (element !== null && element.type !== AST_NODE_TYPES.SpreadElement) checkClassNode(element);\n }\n break;\n case AST_NODE_TYPES.ObjectExpression:\n for (const property of node.properties) {\n if (property.type === AST_NODE_TYPES.Property) checkClassNode(property.value);\n }\n break;\n case AST_NODE_TYPES.ConditionalExpression:\n checkClassNode(node.consequent);\n checkClassNode(node.alternate);\n break;\n case AST_NODE_TYPES.LogicalExpression:\n checkClassNode(node.right);\n break;\n default:\n break;\n }\n };\n\n const checkColorValueNode = (node: TSESTree.Node): void => {\n if (\n node.type === AST_NODE_TYPES.Literal &&\n typeof node.value === \"string\" &&\n RAW_COLOR_VALUE_RE.test(node.value) &&\n !CSS_VAR_REFERENCE_RE.test(node.value)\n ) {\n context.report({ node, messageId: \"inlineColor\", data: { value: node.value } });\n }\n };\n\n return {\n \"JSXAttribute[name.name='className']\"(node: TSESTree.JSXAttribute): void {\n if (node.value === null) return;\n if (node.value.type === AST_NODE_TYPES.Literal) checkClassNode(node.value);\n else if (node.value.type === AST_NODE_TYPES.JSXExpressionContainer) {\n if (node.value.expression.type !== AST_NODE_TYPES.JSXEmptyExpression) {\n checkClassNode(node.value.expression);\n }\n }\n },\n CallExpression(node: TSESTree.CallExpression): void {\n if (node.callee.type === AST_NODE_TYPES.Identifier && CLASS_FNS.has(node.callee.name)) {\n for (const arg of node.arguments) {\n if (arg.type !== AST_NODE_TYPES.SpreadElement) checkClassNode(arg);\n }\n }\n },\n VariableDeclarator(node: TSESTree.VariableDeclarator): void {\n if (node.id.type === AST_NODE_TYPES.Identifier && CLASS_NAME_RE.test(node.id.name)) {\n checkClassNode(node.init);\n }\n },\n Property(node: TSESTree.Property): void {\n const name = propName(node.key);\n if (name !== null && CLASS_NAME_RE.test(name)) checkClassNode(node.value);\n },\n // SVG presentation attributes: <path fill=\"#7c3aed\" stroke=\"#7c3aed\" />.\n // Neutral drawing literals and anything inside an SVG defs container are\n // structural, not UI tokens, so they never fire.\n \"JSXAttribute[name.name=/^(fill|stroke|color)$/]\"(node: TSESTree.JSXAttribute): void {\n if (node.value?.type !== AST_NODE_TYPES.Literal) return;\n const owner = node.parent.name;\n if (owner.type === AST_NODE_TYPES.JSXIdentifier && SVG_SHAPE_PRIMITIVES.has(owner.name)) {\n return;\n }\n if (\n typeof node.value.value === \"string\" &&\n SVG_EXEMPT_COLOR_VALUES.has(node.value.value.toLowerCase())\n ) {\n return;\n }\n if (isInsideSvg(node) || isInsideIconFactoryPath(node)) return;\n checkColorValueNode(node.value);\n },\n \"JSXAttribute[name.name='style'] ObjectExpression > Property\"(node: TSESTree.Property): void {\n const name = propName(node.key);\n if (name !== null && STYLE_COLOR_PROPS.has(name)) checkColorValueNode(node.value);\n },\n };\n },\n});\n","/**\n * @fileoverview _tailwind — shared className-position helpers, so the Tailwind rules visit string literals and template quasis alike.\n *\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/_tailwind.md\n */\n\n/**\n * Strip Tailwind variant prefixes (`hover:`, `dark:`, `focus-visible:`, …) and a\n * leading `!` important marker, leaving the bare utility. Variants are\n * `[a-z0-9-]+:` runs at the start; a bracketed arbitrary value never starts a\n * token, so the `:` inside `[url(http://…)]` is not a variant separator.\n */\nexport const tailwindBase = (token: string): string =>\n token.replace(/^(?:[a-z0-9-]+:)+/i, \"\").replace(/^!/, \"\");\n\n/** Split a className string into its non-empty class tokens. */\nexport const classTokens = (value: string): readonly string[] =>\n value.split(/\\s+/).filter(Boolean);\n","/**\n * @fileoverview prefer-server-actions — an internal `/api/*` mutation hand-rolls the transport, types and error path a Server Action gets from the framework.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/prefer-server-actions.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/prefer-server-actions.md\n */\n\nimport { type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport type { RuleContext, Scope } from \"@typescript-eslint/utils/ts-eslint\";\n\ntype MessageIds = \"preferServerAction\";\ntype Options = readonly [];\n\nconst MUTATION_METHODS = new Set([\"POST\", \"PUT\", \"DELETE\", \"PATCH\"]);\nconst AXIOS_MUTATION_METHODS = new Set([\"post\", \"put\", \"delete\", \"patch\"]);\n\nconst SKIP_FILE_REGEX =\n /(?:\\.test\\.[jt]sx?$|\\.spec\\.[jt]sx?$|-(?:test|spec)\\.[jt]sx?$|\\/tests?\\/|\\/__tests__\\/|\\/__testfixtures__\\/|\\/scripts?\\/|\\/app\\/api\\/.*\\/route\\.[jt]sx?$|\\/pages\\/api\\/)/;\n\nconst NON_REACT_FRAMEWORK_RE =\n /^(?:@angular\\/|@nestjs\\/|vue$|vue\\/|svelte$|svelte\\/|solid-js$|solid-js\\/|@ember\\/|rxjs$|rxjs\\/)/;\n\ntype Ctx = Readonly<RuleContext<MessageIds, Options>>;\n\nfunction getScope(\n context: Ctx,\n node: TSESTree.Node,\n): Scope.Scope {\n return context.sourceCode.getScope(node);\n}\n\n/**\n * Walk up the scope chain looking for a variable declared with a single\n * initializer; if found, return the initializer expression so we can analyze\n * it. Falls back to the original node when resolution is not possible.\n */\nfunction resolveNode(\n node: TSESTree.Node | null | undefined,\n context: Ctx,\n): TSESTree.Node | null {\n if (!node) return null;\n if (node.type !== \"Identifier\") return node;\n\n let scope: Scope.Scope | null = getScope(context, node);\n while (scope) {\n const variable = scope.set.get(node.name);\n if (variable && variable.defs.length === 1) {\n const def = variable.defs[0];\n if (def && def.type === \"Variable\") {\n const declarator = def.node;\n if (\n declarator.type === \"VariableDeclarator\" &&\n declarator.init\n ) {\n return declarator.init;\n }\n }\n }\n scope = scope.upper;\n }\n return node;\n}\n\nfunction isApiUrl(\n node: TSESTree.Node | null | undefined,\n context: Ctx,\n): boolean {\n const resolved = resolveNode(node, context);\n if (!resolved) return false;\n\n if (resolved.type === \"Literal\" && typeof resolved.value === \"string\") {\n return resolved.value.startsWith(\"/api/\");\n }\n if (resolved.type === \"TemplateLiteral\") {\n const firstQuasi = resolved.quasis[0];\n const cooked = firstQuasi?.value.cooked;\n return typeof cooked === \"string\" && cooked.startsWith(\"/api/\");\n }\n if (resolved.type === \"BinaryExpression\" && resolved.operator === \"+\") {\n return isApiUrl(resolved.left, context);\n }\n return false;\n}\n\nfunction isMutationMethod(\n node: TSESTree.Node | null | undefined,\n context: Ctx,\n): boolean {\n const resolved = resolveNode(node, context);\n if (!resolved) return false;\n\n if (resolved.type === \"Literal\" && typeof resolved.value === \"string\") {\n return MUTATION_METHODS.has(resolved.value.toUpperCase());\n }\n\n if (\n resolved.type === \"TemplateLiteral\" &&\n resolved.expressions.length === 0\n ) {\n const val = resolved.quasis.map((q) => q.value.cooked).join(\"\");\n return MUTATION_METHODS.has(val.toUpperCase());\n }\n\n if (resolved.type === \"ConditionalExpression\") {\n return (\n isMutationMethod(resolved.consequent, context) ||\n isMutationMethod(resolved.alternate, context)\n );\n }\n\n if (resolved.type === \"LogicalExpression\" && resolved.operator === \"||\") {\n return (\n isMutationMethod(resolved.left, context) ||\n isMutationMethod(resolved.right, context)\n );\n }\n\n return false;\n}\n\nfunction getPropertyNode(\n objNode: TSESTree.Node | null | undefined,\n propName: string,\n): TSESTree.Node | null {\n if (!objNode || objNode.type !== \"ObjectExpression\") return null;\n for (const prop of objNode.properties) {\n if (prop.type !== \"Property\") continue;\n let keyName: string | null = null;\n if (prop.key.type === \"Identifier\" && !prop.computed) {\n keyName = prop.key.name;\n } else if (\n prop.key.type === \"Literal\" &&\n typeof prop.key.value === \"string\"\n ) {\n keyName = prop.key.value;\n }\n if (keyName === propName) {\n // Skip destructuring patterns — they're not valid as config values.\n if (\n prop.value.type === \"AssignmentPattern\" ||\n prop.value.type === \"ArrayPattern\" ||\n prop.value.type === \"ObjectPattern\"\n ) {\n return null;\n }\n return prop.value;\n }\n }\n return null;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"prefer-server-actions\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Prefer Next.js Server Actions over /api/* mutations.\",\n },\n schema: [],\n messages: {\n preferServerAction:\n \"Mutation against /api/* — prefer a Next.js Server Action for type-safety and to avoid the JSON round-trip.\",\n },\n },\n defaultOptions: [],\n create(context) {\n const filename = context.filename;\n if (SKIP_FILE_REGEX.test(filename)) {\n return {};\n }\n\n // Set by the ImportDeclaration visitor. Imports are hoisted to the top of a\n // module, so every one is seen before the first CallExpression below.\n let isNonReactFramework = false;\n\n return {\n ImportDeclaration(node) {\n if (\n typeof node.source.value === \"string\" &&\n NON_REACT_FRAMEWORK_RE.test(node.source.value)\n ) {\n isNonReactFramework = true;\n }\n },\n CallExpression(node) {\n if (isNonReactFramework) return;\n let isMutation = false;\n\n // 1. Standard fetch('/api/orders', { method: 'POST' })\n if (\n node.callee.type === \"Identifier\" &&\n node.callee.name === \"fetch\"\n ) {\n const urlArg = node.arguments[0];\n if (urlArg && urlArg.type !== \"SpreadElement\" && isApiUrl(urlArg, context)) {\n const initArg = node.arguments[1];\n if (initArg && initArg.type !== \"SpreadElement\") {\n const resolvedInit = resolveNode(initArg, context);\n const methodNode = getPropertyNode(resolvedInit, \"method\");\n if (methodNode && isMutationMethod(methodNode, context)) {\n isMutation = true;\n }\n }\n }\n }\n // 2. Custom wrappers or Axios: api.post('/api/orders') or axios.put('/api/orders')\n else if (\n node.callee.type === \"MemberExpression\" &&\n node.callee.property.type === \"Identifier\" &&\n !node.callee.computed\n ) {\n const methodName = node.callee.property.name.toLowerCase();\n if (AXIOS_MUTATION_METHODS.has(methodName)) {\n const urlArg = node.arguments[0];\n // Skip Express-style route definitions like\n // `router.post('/api/x', handler)`: a function argument means this\n // is registering a handler, not issuing a client mutation.\n const hasHandlerArg = node.arguments.some(\n (arg) =>\n arg.type === \"ArrowFunctionExpression\" ||\n arg.type === \"FunctionExpression\",\n );\n if (\n urlArg &&\n urlArg.type !== \"SpreadElement\" &&\n !hasHandlerArg &&\n isApiUrl(urlArg, context)\n ) {\n isMutation = true;\n }\n }\n }\n // 3. Direct axios/request call: axios({ method: 'post', url: '/api/orders' })\n else if (\n node.callee.type === \"Identifier\" &&\n (node.callee.name === \"axios\" || node.callee.name === \"request\")\n ) {\n const firstArg = node.arguments[0];\n if (firstArg && firstArg.type !== \"SpreadElement\") {\n const configArg = resolveNode(firstArg, context);\n if (configArg && configArg.type === \"ObjectExpression\") {\n const urlNode = getPropertyNode(configArg, \"url\");\n const methodNode = getPropertyNode(configArg, \"method\");\n if (\n urlNode &&\n isApiUrl(urlNode, context) &&\n methodNode &&\n isMutationMethod(methodNode, context)\n ) {\n isMutation = true;\n }\n }\n }\n }\n\n if (isMutation) {\n context.report({ node, messageId: \"preferServerAction\" });\n }\n },\n };\n },\n});\n","/**\n * @fileoverview prefer-string-literal-union — a raw `string` field with a closed set of values accepts every value outside it.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/prefer-string-literal-union.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/prefer-string-literal-union.md\n */\n\nimport { createRule } from \"./_docs.js\";\nimport {\n ESLintUtils,\n type TSESTree,\n type ParserServicesWithTypeInformation,\n AST_NODE_TYPES,\n} from \"@typescript-eslint/utils\";\nimport * as ts from \"typescript\";\n\ntype MessageIds = \"bareChoiceField\" | \"comparisonCluster\";\ntype Options = readonly [\n {\n ignoreFields?: readonly string[];\n }?,\n];\n\ntype FunctionNode =\n | TSESTree.FunctionDeclaration\n | TSESTree.FunctionExpression\n | TSESTree.ArrowFunctionExpression;\n\nconst CHOICE_TOKENS: ReadonlySet<string> = new Set([\n \"status\",\n \"state\",\n \"kind\",\n \"role\",\n \"priority\",\n \"severity\",\n \"direction\",\n \"tier\",\n \"stage\",\n \"type\",\n \"mode\",\n \"level\",\n]);\n\nconst LOWER_TOKEN_RE = /^[a-z][a-z0-9_-]{0,30}$/;\nconst MIN_CLUSTER_SIZE = 2;\n\nconst BOOLEANISH: ReadonlySet<string> = new Set([\"true\", \"false\"]);\n\n/**\n * An enum-shaped token worth a string-literal union: a short lowercase word of\n * 2+ chars that isn't a boolean-string. Single characters (`'a'`), file\n * paths/URLs/i18n keys (contain `/`, `:`, `.`), and `'true'`/`'false'` are NOT\n * closed-enum members — comparing against them is a flag/path/boolean guard.\n */\n\nfunction isEnumToken(lit: string): boolean {\n return LOWER_TOKEN_RE.test(lit) && lit.length >= 2 && !BOOLEANISH.has(lit);\n}\n\nconst IGNORE_PATTERNS: readonly RegExp[] = [\n /[\\\\/]generated[\\\\/]/,\n /\\.gen\\.tsx?$/,\n /\\.generated\\.tsx?$/,\n /\\.d\\.ts$/,\n];\n\nfunction isIgnoredFile(filename: string, sourceText: string): boolean {\n if (IGNORE_PATTERNS.some((re) => re.test(filename))) {\n return true;\n }\n return /@generated\\b/.test(sourceText.slice(0, 1024));\n}\n\n/**\n * The trailing word of a camelCase / snake_case identifier, lowercased.\n * `callStatus` -> `status`, `user_role` -> `role`, `estate` -> `estate`.\n */\nfunction lastWord(name: string): string {\n const words = name\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .split(/[_\\s]+/)\n .filter((w) => w.length > 0);\n const last = words[words.length - 1] ?? name;\n return last.toLowerCase();\n}\n\nfunction isChoiceLikeName(name: string): boolean {\n return CHOICE_TOKENS.has(lastWord(name));\n}\n\nfunction keyName(\n key: TSESTree.PropertyDefinition[\"key\"] | TSESTree.PropertyName,\n): string | null {\n if (key.type === AST_NODE_TYPES.Identifier) {\n return key.name;\n }\n if (key.type === AST_NODE_TYPES.Literal && typeof key.value === \"string\") {\n return key.value;\n }\n return null;\n}\n\nfunction isStringLiteralMember(t: TSESTree.TypeNode): boolean {\n return (\n t.type === AST_NODE_TYPES.TSLiteralType &&\n t.literal.type === AST_NODE_TYPES.Literal &&\n typeof t.literal.value === \"string\"\n );\n}\n\n/** Whether a type node is a union of 2+ string-literal types. */\nfunction isStringLiteralUnion(node: TSESTree.TypeNode | undefined): boolean {\n if (node?.type !== AST_NODE_TYPES.TSUnionType) {\n return false;\n }\n return node.types.filter(isStringLiteralMember).length >= MIN_CLUSTER_SIZE;\n}\n\n/**\n * Whether a resolved TS type includes the general `string` type — as opposed to\n * being (a union of) string-literal types. `CallStatus = \"a\" | \"b\"` has no\n * general-string member and is already the target state; a raw `string` (or\n * `string | undefined`) does, and a comparison cluster on it should become a\n * union. Requires type information; the comparison-cluster path is inert\n * without it.\n */\nfunction typeHasRawString(type: ts.Type): boolean {\n const parts = type.isUnion() ? type.types : [type];\n return parts.some((t) => (t.flags & ts.TypeFlags.String) !== 0);\n}\n\nfunction isExternalSourceFile(sf: ts.SourceFile | undefined): boolean {\n if (sf === undefined) {\n return false;\n }\n return sf.isDeclarationFile || sf.fileName.includes(\"/node_modules/\");\n}\n\nfunction symbolIsExternallyDeclared(sym: ts.Symbol | undefined): boolean {\n return (\n sym?.declarations?.some((d) => isExternalSourceFile(d.getSourceFile())) ??\n false\n );\n}\n\n/**\n * The iterable expression a destructuring binding element draws its value from,\n * e.g. `Object.entries(x)` for `key` in `for (const [key] of Object.entries(x))`\n * or the RHS of `const { a } = rhs`.\n */\nfunction bindingSourceExpression(\n decl: ts.BindingElement,\n): ts.Expression | undefined {\n let node: ts.Node = decl.parent;\n while (\n !ts.isForOfStatement(node) &&\n !(ts.isVariableDeclaration(node) && node.initializer !== undefined)\n ) {\n if (node.parent === undefined) {\n return undefined;\n }\n node = node.parent;\n }\n return ts.isForOfStatement(node) ? node.expression : node.initializer;\n}\n\n/** A stable key for a plain identifier or non-computed member chain, else null. */\nfunction refKey(node: TSESTree.Node): string | null {\n if (node.type === AST_NODE_TYPES.Identifier) {\n return node.name;\n }\n if (node.type === AST_NODE_TYPES.MemberExpression && !node.computed) {\n const inner = refKey(node.object);\n if (inner === null || node.property.type !== AST_NODE_TYPES.Identifier) {\n return null;\n }\n return `${inner}.${node.property.name}`;\n }\n return null;\n}\n\nfunction strLiteral(node: TSESTree.Node): string | null {\n if (node.type === AST_NODE_TYPES.Literal && typeof node.value === \"string\") {\n return node.value;\n }\n return null;\n}\n\ninterface ClusterEntry {\n node: TSESTree.Node;\n literals: Set<string>;\n allTokens: boolean;\n}\n\ninterface Scope {\n clusters: Map<string, ClusterEntry>;\n /** The function this scope belongs to; null at file scope. */\n fn: FunctionNode | null;\n}\n\ninterface CollectedProperty {\n name: string;\n container: TSESTree.Node;\n node: TSESTree.Node;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"prefer-string-literal-union\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Flag raw `string` choice fields and string-literal comparison clusters; prefer a string-literal union type.\",\n },\n schema: [\n {\n type: \"object\",\n additionalProperties: false,\n properties: {\n ignoreFields: {\n type: \"array\",\n items: { type: \"string\" },\n },\n },\n },\n ],\n messages: {\n bareChoiceField:\n '`{{name}}: string` looks like a choice field — prefer a string-literal union type (e.g. `type X = \"a\" | \"b\"`). Enums are banned by `no-enum`; use a union.',\n comparisonCluster:\n '`{{key}}` is compared against a closed set of string literals — define a string-literal union type (e.g. `type X = \"a\" | \"b\"`).',\n },\n },\n defaultOptions: [{}],\n create(context, [optionsArg]) {\n const filename = context.filename;\n const sourceText = context.sourceCode.getText();\n if (isIgnoredFile(filename, sourceText)) {\n return {};\n }\n\n const ignoredFields = new Set(\n (optionsArg?.ignoreFields ?? []).map((name) => name.toLowerCase()),\n );\n\n let services: ParserServicesWithTypeInformation | null;\n try {\n services = ESLintUtils.getParserServices(context);\n } catch {\n services = null;\n }\n\n const scopeStack: Scope[] = [];\n const validClusters: TSESTree.Node[] = [];\n const bareChoiceProps: CollectedProperty[] = [];\n const containersWithUnion = new Set<TSESTree.Node>();\n\n function operandIsRawString(node: TSESTree.Node): boolean {\n if (services === null) {\n return false;\n }\n return typeHasRawString(services.getTypeAtLocation(node));\n }\n\n /**\n * Whether the compared value provably originates from a type we don't own —\n * a property of a `.d.ts` / node_modules type (DOM `getComputedStyle().overflowY`,\n * `Task.status` from another package), the return of such a method\n * (`URLSearchParams.get()`, `str.toLowerCase()`), or a destructuring of one\n * (`Object.entries()` keys). A string-literal union is not an available fix\n * for these, so the cluster shape must not flag them.\n */\n function originIsExternal(node: ts.Node | undefined, depth: number): boolean {\n if (node === undefined || services === null || depth > 6) {\n return false;\n }\n const checker = services.program.getTypeChecker();\n if (\n ts.isParenthesizedExpression(node) ||\n ts.isNonNullExpression(node) ||\n ts.isAsExpression(node)\n ) {\n return originIsExternal(node.expression, depth + 1);\n }\n if (ts.isPropertyAccessExpression(node)) {\n return symbolIsExternallyDeclared(checker.getSymbolAtLocation(node.name));\n }\n if (ts.isCallExpression(node)) {\n return originIsExternal(node.expression, depth + 1);\n }\n if (ts.isIdentifier(node)) {\n const decl = checker.getSymbolAtLocation(node)?.valueDeclaration;\n if (decl === undefined) {\n return false;\n }\n if (ts.isVariableDeclaration(decl) && decl.initializer !== undefined) {\n return originIsExternal(decl.initializer, depth + 1);\n }\n if (ts.isBindingElement(decl)) {\n return originIsExternal(bindingSourceExpression(decl), depth + 1);\n }\n }\n return false;\n }\n\n function operandIsFlaggable(node: TSESTree.Node): boolean {\n return (\n operandIsRawString(node) &&\n !originIsExternal(services?.esTreeNodeToTSNodeMap.get(node), 0)\n );\n }\n\n /**\n * The string-literal members of a function's DECLARED return type, resolved\n * through named aliases and `Promise<...>`. Null when the function has no\n * annotation, type information is unavailable, or the type is not a\n * string-literal union. Computed lazily — only for a function that actually\n * accumulated a cluster — since it costs a type resolution.\n */\n function declaredReturnLiterals(fn: FunctionNode): ReadonlySet<string> | null {\n const annotation = fn.returnType?.typeAnnotation;\n if (annotation === undefined || services === null) {\n return null;\n }\n const tsNode = services.esTreeNodeToTSNodeMap.get(annotation);\n if (!ts.isTypeNode(tsNode)) {\n return null;\n }\n const checker = services.program.getTypeChecker();\n const declared = checker.getTypeFromTypeNode(tsNode);\n const type = checker.getAwaitedType(declared) ?? declared;\n const literals = new Set<string>();\n for (const part of type.isUnion() ? type.types : [type]) {\n if (part.isStringLiteral()) {\n literals.add(part.value);\n }\n }\n return literals.size >= MIN_CLUSTER_SIZE ? literals : null;\n }\n\n function pushScope(node: FunctionNode): void {\n scopeStack.push({ clusters: new Map(), fn: node });\n }\n\n function popScope(): void {\n const scope = scopeStack.pop();\n if (scope === undefined) {\n return;\n }\n const candidates = [...scope.clusters.values()].filter(\n (entry) => entry.allTokens && entry.literals.size >= MIN_CLUSTER_SIZE,\n );\n if (candidates.length === 0) {\n return;\n }\n const returnLiterals =\n scope.fn === null ? null : declaredReturnLiterals(scope.fn);\n for (const entry of candidates) {\n // The enclosing function declares the very union being compared against:\n // this is the narrowing boundary that produces it, so the `string`\n // operand is required, not a defect.\n if (\n returnLiterals !== null &&\n [...entry.literals].every((lit) => returnLiterals.has(lit))\n ) {\n continue;\n }\n validClusters.push(entry.node);\n }\n }\n\n function accumulate(\n key: string,\n literals: string[],\n node: TSESTree.Node,\n ): void {\n const scope = scopeStack[scopeStack.length - 1];\n if (scope === undefined) {\n return;\n }\n const allTokens = literals.every((lit) => isEnumToken(lit));\n const existing = scope.clusters.get(key);\n if (existing === undefined) {\n scope.clusters.set(key, {\n node,\n literals: new Set(literals),\n allTokens,\n });\n return;\n }\n for (const lit of literals) {\n existing.literals.add(lit);\n }\n existing.allTokens = existing.allTokens && allTokens;\n }\n\n function collectProperty(\n key: TSESTree.PropertyDefinition[\"key\"] | TSESTree.PropertyName,\n typeNode: TSESTree.TypeNode | undefined,\n container: TSESTree.Node,\n node: TSESTree.Node,\n ): void {\n if (isStringLiteralUnion(typeNode)) {\n containersWithUnion.add(container);\n return;\n }\n if (typeNode?.type !== AST_NODE_TYPES.TSStringKeyword) {\n return;\n }\n const name = keyName(key);\n if (\n name === null ||\n !isChoiceLikeName(name) ||\n ignoredFields.has(name.toLowerCase())\n ) {\n return;\n }\n bareChoiceProps.push({ name, container, node });\n }\n\n return {\n FunctionDeclaration: pushScope,\n \"FunctionDeclaration:exit\": popScope,\n FunctionExpression: pushScope,\n \"FunctionExpression:exit\": popScope,\n ArrowFunctionExpression: pushScope,\n \"ArrowFunctionExpression:exit\": popScope,\n\n BinaryExpression(node: TSESTree.BinaryExpression): void {\n if (\n node.operator !== \"===\" &&\n node.operator !== \"!==\" &&\n node.operator !== \"==\" &&\n node.operator !== \"!=\"\n ) {\n return;\n }\n const leftKey = refKey(node.left);\n const rightLit = strLiteral(node.right);\n const rightKey = refKey(node.right);\n const leftLit = strLiteral(node.left);\n if (leftKey !== null && rightLit !== null) {\n if (operandIsFlaggable(node.left)) {\n accumulate(leftKey, [rightLit], node);\n }\n } else if (rightKey !== null && leftLit !== null) {\n if (operandIsFlaggable(node.right)) {\n accumulate(rightKey, [leftLit], node);\n }\n }\n },\n\n SwitchStatement(node: TSESTree.SwitchStatement): void {\n const key = refKey(node.discriminant);\n if (key === null || !operandIsFlaggable(node.discriminant)) {\n return;\n }\n const literals: string[] = [];\n for (const c of node.cases) {\n if (c.test !== null) {\n const lit = strLiteral(c.test);\n if (lit !== null) {\n literals.push(lit);\n }\n }\n }\n if (literals.length > 0) {\n accumulate(key, literals, node);\n }\n },\n\n TSPropertySignature(node: TSESTree.TSPropertySignature): void {\n collectProperty(\n node.key,\n node.typeAnnotation?.typeAnnotation,\n node.parent,\n node,\n );\n },\n\n PropertyDefinition(node: TSESTree.PropertyDefinition): void {\n collectProperty(\n node.key,\n node.typeAnnotation?.typeAnnotation,\n node.parent,\n node,\n );\n },\n\n \"Program:exit\"(): void {\n for (const clusterNode of validClusters) {\n context.report({\n node: clusterNode,\n messageId: \"comparisonCluster\",\n data: { key: refKeyText(clusterNode) },\n });\n }\n for (const prop of bareChoiceProps) {\n if (containersWithUnion.has(prop.container)) {\n context.report({\n node: prop.node,\n messageId: \"bareChoiceField\",\n data: { name: prop.name },\n });\n }\n }\n },\n };\n\n function refKeyText(node: TSESTree.Node): string {\n if (node.type === AST_NODE_TYPES.BinaryExpression) {\n return refKey(node.left) ?? refKey(node.right) ?? \"value\";\n }\n if (node.type === AST_NODE_TYPES.SwitchStatement) {\n return refKey(node.discriminant) ?? \"value\";\n }\n return \"value\";\n }\n },\n});\n","/**\n * @fileoverview prefer-whole-object-assertion — a run of `expect`s on one receiver fails on the first mismatch and says nothing about the rest of the value.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/prefer-whole-object-assertion.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/prefer-whole-object-assertion.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isGeneratedFile, isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"combineAssertions\" | \"assertArrayOnce\";\ntype Options = readonly [];\n\n/**\n * Matchers whose per-key meaning `toMatchObject` reproduces exactly — but only\n * against a primitive literal, where `Object.is`, deep equality and strict deep\n * equality all coincide. See `literalText` for the other half of that pair.\n */\nconst MERGEABLE_MATCHERS: ReadonlySet<string> = new Set([\"toBe\", \"toEqual\", \"toStrictEqual\"]);\n\n/**\n * Matchers whose whole-array form (`expect(a).toEqual([...])`) preserves the\n * per-element comparison. `toBe` is excluded: element-wise identity is not what\n * `toEqual` on the array would check.\n */\nconst ARRAY_MATCHERS: ReadonlySet<string> = new Set([\"toEqual\", \"toStrictEqual\"]);\n\n/**\n * Properties whose receiver is a collection rather than a record. A run keyed on\n * `length` or `size` describes an array / Map / Set, and `toMatchObject` cannot\n * state a collection's size — this is the `.length`-mixed-with-elements class.\n */\nconst COLLECTION_PROPERTIES: ReadonlySet<string> = new Set([\"length\", \"size\"]);\n\n/**\n * Property names whose meaning as an OBJECT-LITERAL KEY is not \"a property of\n * this name\". There is exactly one in JavaScript.\n *\n * `__proto__: v` in a literal is the prototype SETTER, so the key never exists\n * and `toMatchObject` never checks it — the fix would DELETE the assertion it\n * claims to be merging. Quoting does not help: `\"__proto__\": v` is the same\n * production. The whole run is dropped rather than the one key, because there\n * is no `toMatchObject` literal that says what the run says.\n *\n * Audited for siblings: `constructor`, `toString`, `valueOf` and every other\n * inherited name ARE plain own keys in a literal, and jest's `subsetEquality`\n * walks the prototype chain when reading them off the received value, so those\n * merge faithfully. `get x() {}` / `async x() {}` are different PRODUCTIONS,\n * not different key names, and this fixer only ever emits `key: value`.\n */\nconst LITERAL_KEY_HAZARDS: ReadonlySet<string> = new Set([\"__proto__\"]);\n\n/** `-1` parses as a unary expression, not a literal, but it is still constant. */\nconst NUMERIC_SIGNS: ReadonlySet<string> = new Set([\"-\", \"+\"]);\n\n/** A run shorter than this is a single assertion; there is nothing to combine. */\nconst MIN_RUN_LENGTH = 2;\n\n/** How a run reaches into its receiver: `o.name`, or `xs[0]`. */\ntype AssertionKey =\n | { readonly kind: \"property\"; readonly name: string }\n | { readonly kind: \"index\"; readonly index: number };\n\ninterface Assertion {\n readonly statement: TSESTree.ExpressionStatement;\n /** The object the asserted member expression hangs off — the run's grouping key. */\n readonly receiver: TSESTree.Expression;\n readonly key: AssertionKey;\n readonly matcher: string;\n /** Source text of the expected value; `\"null\"` synthesised for `toBeNull()`. */\n readonly expectedText: string;\n /** False when the expected value is not a primitive literal, so cannot be merged. */\n readonly expectedIsLiteral: boolean;\n}\n\n/**\n * Source text of `node` when it is a primitive literal, otherwise `null`.\n * Regular expressions are excluded: `toBe(/x/)` is an identity check that\n * `toEqual` and `toMatchObject` do not reproduce.\n */\nfunction literalText(node: TSESTree.Node, getText: (node: TSESTree.Node) => string): string | null {\n switch (node.type) {\n case AST_NODE_TYPES.Literal:\n return \"regex\" in node ? null : getText(node);\n case AST_NODE_TYPES.TemplateLiteral:\n return node.expressions.length === 0 ? getText(node) : null;\n case AST_NODE_TYPES.UnaryExpression:\n return NUMERIC_SIGNS.has(node.operator) && literalText(node.argument, getText) !== null\n ? getText(node)\n : null;\n default:\n return null;\n }\n}\n\n/**\n * True for a receiver that can be evaluated twice with the same effect: an\n * identifier, `this`, or a member chain over one. A call anywhere in the chain\n * makes the merged form invoke it fewer times than the run did.\n *\n * The `node.optional` guard below — and its twin on `actual` in\n * `parseAssertion` — cannot be reached by any input, and no test pins them:\n * every optional link wraps the whole expression in a `ChainExpression`, which\n * `parseAssertion` has already rejected, and a parenthesised `(a?.b).c` leaves a\n * `ChainExpression` in the object position where this function's `default` arm\n * catches it. They are kept as belt and braces against a parser that stops\n * emitting `ChainExpression`, not because anything currently depends on them —\n * recorded here so the next reader does not spend an afternoon writing the test\n * that would prove them live.\n */\nfunction isPureReceiver(node: TSESTree.Node): boolean {\n switch (node.type) {\n case AST_NODE_TYPES.Identifier:\n case AST_NODE_TYPES.ThisExpression:\n return true;\n case AST_NODE_TYPES.MemberExpression:\n if (node.optional) {\n return false;\n }\n if (node.computed) {\n return node.property.type === AST_NODE_TYPES.Literal && isPureReceiver(node.object);\n }\n return isPureReceiver(node.object);\n default:\n return false;\n }\n}\n\n/** A non-negative integer array index written as a literal, else `null`. */\nfunction literalIndex(node: TSESTree.Node): number | null {\n if (node.type !== AST_NODE_TYPES.Literal || typeof node.value !== \"number\") {\n return null;\n }\n return Number.isInteger(node.value) && node.value >= 0 ? node.value : null;\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"prefer-whole-object-assertion\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Collapse a run of consecutive assertions on the same object into one assertion about the whole object, so every mismatch is reported and nothing outside the asserted keys goes unchecked.\",\n },\n fixable: \"code\",\n messages: {\n combineAssertions:\n \"These {{count}} assertions each check one property of `{{receiver}}` against a literal, so the first mismatch hides the rest. Assert the object once: `expect({{receiver}}).toMatchObject({ … })`.\",\n assertArrayOnce:\n \"These {{count}} assertions check `{{receiver}}[0]`…`{{receiver}}[{{last}}]` one at a time, which never checks how long `{{receiver}}` is — extra elements pass unnoticed. Assert the array once: `expect({{receiver}}).{{matcher}}([ … ])`.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n if (!isTestFile(context.filename) || isGeneratedFile(context.filename, context.sourceCode.text)) {\n return {};\n }\n const { sourceCode } = context;\n\n function parseAssertion(statement: TSESTree.Statement): Assertion | null {\n if (statement.type !== AST_NODE_TYPES.ExpressionStatement) {\n return null;\n }\n const call = statement.expression;\n if (call.type !== AST_NODE_TYPES.CallExpression) {\n return null;\n }\n const callee = call.callee;\n if (\n callee.type !== AST_NODE_TYPES.MemberExpression ||\n callee.computed ||\n callee.property.type !== AST_NODE_TYPES.Identifier\n ) {\n return null;\n }\n const matcher = callee.property.name;\n const expectCall = callee.object;\n if (\n expectCall.type !== AST_NODE_TYPES.CallExpression ||\n expectCall.callee.type !== AST_NODE_TYPES.Identifier ||\n expectCall.callee.name !== \"expect\" ||\n expectCall.arguments.length !== 1\n ) {\n return null;\n }\n const actual = expectCall.arguments[0];\n if (actual === undefined || actual.type !== AST_NODE_TYPES.MemberExpression || actual.optional) {\n return null;\n }\n if (!isPureReceiver(actual.object)) {\n return null;\n }\n\n let key: AssertionKey;\n if (actual.computed) {\n const index = literalIndex(actual.property);\n if (index === null) {\n return null;\n }\n key = { kind: \"index\", index };\n } else {\n if (\n actual.property.type !== AST_NODE_TYPES.Identifier ||\n COLLECTION_PROPERTIES.has(actual.property.name) ||\n LITERAL_KEY_HAZARDS.has(actual.property.name)\n ) {\n return null;\n }\n key = { kind: \"property\", name: actual.property.name };\n }\n\n if (matcher === \"toBeNull\" && call.arguments.length === 0) {\n return { statement, receiver: actual.object, key, matcher, expectedText: \"null\", expectedIsLiteral: true };\n }\n if (!MERGEABLE_MATCHERS.has(matcher)) {\n return null;\n }\n const expected = call.arguments[0];\n if (call.arguments.length !== 1 || expected === undefined || expected.type === AST_NODE_TYPES.SpreadElement) {\n return null;\n }\n const literal = literalText(expected, (node) => sourceCode.getText(node));\n return {\n statement,\n receiver: actual.object,\n key,\n matcher,\n expectedText: literal ?? sourceCode.getText(expected),\n expectedIsLiteral: literal !== null,\n };\n }\n\n /**\n * True when a comment sits inside the span the fix rewrites — between two\n * statements of the run, or inside one of them.\n *\n * Such a comment cannot survive: the statements after the first are DELETED,\n * so their leading comments are left dangling above the merged assertion,\n * describing a statement that no longer exists. Worst case the dangling line\n * is an `eslint-disable-next-line`, which then becomes a fresh unused-directive\n * error the author did not write. Dropping a comment is also not \"exactly\n * equivalent to the code it replaces\", so the report stands and the fix is\n * withheld for a human.\n */\n function hasInterveningComment(run: readonly Assertion[]): boolean {\n return run.some(\n (assertion, index) =>\n sourceCode.getCommentsInside(assertion.statement).length > 0 ||\n (index > 0 && sourceCode.getCommentsBefore(assertion.statement).length > 0),\n );\n }\n\n /**\n * A property run is reportable only when the merged `toMatchObject` says\n * exactly what the run says: every matcher mergeable, every expected value a\n * primitive literal, and every key distinct so nothing is lost to a\n * duplicate object property.\n */\n function reportPropertyRun(run: readonly Assertion[]): void {\n const names = new Set<string>();\n for (const assertion of run) {\n if (assertion.key.kind !== \"property\" || !assertion.expectedIsLiteral) {\n return;\n }\n if (!MERGEABLE_MATCHERS.has(assertion.matcher) && assertion.matcher !== \"toBeNull\") {\n return;\n }\n if (names.has(assertion.key.name)) {\n return;\n }\n names.add(assertion.key.name);\n }\n const first = run[0];\n if (first === undefined) {\n return;\n }\n const receiverText = sourceCode.getText(first.receiver);\n const properties = run\n .map((assertion) =>\n assertion.key.kind === \"property\" ? `${assertion.key.name}: ${assertion.expectedText}` : \"\",\n )\n .join(\", \");\n context.report({\n node: first.statement,\n messageId: \"combineAssertions\",\n data: { count: String(run.length), receiver: receiverText },\n fix: hasInterveningComment(run)\n ? null\n : (fixer) => [\n fixer.replaceText(first.statement, `expect(${receiverText}).toMatchObject({ ${properties} });`),\n ...run.slice(1).map((assertion) => fixer.remove(assertion.statement)),\n ],\n });\n }\n\n /**\n * An indexed run is reportable when the indices cover `0..n-1` exactly and\n * one `toEqual` / `toStrictEqual` runs throughout, so `expect(xs).toEqual([…])`\n * makes the same per-element comparisons plus the length check the run is\n * missing. No fix: that added length check can turn a passing test red.\n */\n function reportIndexRun(run: readonly Assertion[]): void {\n const first = run[0];\n if (first === undefined || !ARRAY_MATCHERS.has(first.matcher)) {\n return;\n }\n const indices = new Set<number>();\n for (const assertion of run) {\n if (assertion.key.kind !== \"index\" || assertion.matcher !== first.matcher) {\n return;\n }\n indices.add(assertion.key.index);\n }\n if (indices.size !== run.length || Math.max(...indices) !== run.length - 1) {\n return;\n }\n context.report({\n node: first.statement,\n messageId: \"assertArrayOnce\",\n data: {\n count: String(run.length),\n receiver: sourceCode.getText(first.receiver),\n last: String(run.length - 1),\n matcher: first.matcher,\n },\n });\n }\n\n function checkBody(body: readonly TSESTree.Statement[]): void {\n let run: Assertion[] = [];\n\n const flush = (): void => {\n const first = run[0];\n if (first !== undefined && run.length >= MIN_RUN_LENGTH) {\n if (first.key.kind === \"property\") {\n reportPropertyRun(run);\n } else {\n reportIndexRun(run);\n }\n }\n run = [];\n };\n\n for (const statement of body) {\n const assertion = parseAssertion(statement);\n const previous = run.at(-1);\n if (\n assertion !== null &&\n previous !== undefined &&\n previous.key.kind === assertion.key.kind &&\n sourceCode.getText(previous.receiver) === sourceCode.getText(assertion.receiver)\n ) {\n run.push(assertion);\n continue;\n }\n flush();\n if (assertion !== null) {\n run = [assertion];\n }\n }\n flush();\n }\n\n return {\n BlockStatement: (node: TSESTree.BlockStatement): void => {\n checkBody(node.body);\n },\n Program: (node: TSESTree.Program): void => {\n checkBody(node.body);\n },\n };\n },\n});\n","/**\n * @fileoverview prefer-zod-enum — a union of `z.literal` strings infers exactly what `z.enum` does, in more syntax that hides the permitted values.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/prefer-zod-enum.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/prefer-zod-enum.md\n */\n\nimport { AST_NODE_TYPES, type TSESLint, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isZodModule } from \"./_zod.js\";\n\ntype MessageIds = \"preferEnum\";\ntype Options = readonly [];\n\nexport default createRule<Options, MessageIds>({\n name: \"prefer-zod-enum\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Prefer z.enum([...]) over z.union([z.literal(...), ...]) for string choices\",\n },\n fixable: \"code\",\n schema: [],\n messages: {\n preferEnum:\n \"Use `z.enum([...])` instead of a union of string-literal schemas.\",\n },\n },\n defaultOptions: [],\n create(context) {\n const sourceCode = context.sourceCode;\n const zodNamespaces = new Set<string>();\n\n function enumValues(\n node: TSESTree.CallExpression,\n ): readonly TSESTree.StringLiteral[] | null {\n const callee = node.callee;\n if (\n callee.type !== AST_NODE_TYPES.MemberExpression ||\n callee.computed ||\n callee.object.type !== AST_NODE_TYPES.Identifier ||\n !zodNamespaces.has(callee.object.name) ||\n callee.property.type !== AST_NODE_TYPES.Identifier ||\n callee.property.name !== \"union\" ||\n node.arguments.length !== 1\n ) {\n return null;\n }\n const argument = node.arguments[0];\n if (\n argument === undefined ||\n argument.type !== AST_NODE_TYPES.ArrayExpression ||\n argument.elements.length === 0\n ) {\n return null;\n }\n\n const values: TSESTree.StringLiteral[] = [];\n for (const element of argument.elements) {\n if (\n element === null ||\n element.type !== AST_NODE_TYPES.CallExpression ||\n element.arguments.length !== 1 ||\n element.callee.type !== AST_NODE_TYPES.MemberExpression ||\n element.callee.computed ||\n element.callee.object.type !== AST_NODE_TYPES.Identifier ||\n !zodNamespaces.has(element.callee.object.name) ||\n element.callee.property.type !== AST_NODE_TYPES.Identifier ||\n element.callee.property.name !== \"literal\"\n ) {\n return null;\n }\n const value = element.arguments[0];\n if (\n value === undefined ||\n value.type !== AST_NODE_TYPES.Literal ||\n typeof value.value !== \"string\"\n ) {\n return null;\n }\n values.push(value);\n }\n return values;\n }\n\n function buildFix(\n node: TSESTree.CallExpression,\n values: readonly TSESTree.StringLiteral[],\n ): TSESLint.ReportFixFunction | undefined {\n const argument = node.arguments[0];\n if (\n argument === undefined ||\n argument.type !== AST_NODE_TYPES.ArrayExpression ||\n sourceCode.getCommentsInside(argument).length > 0\n ) {\n return undefined;\n }\n const callee = node.callee;\n if (\n callee.type !== AST_NODE_TYPES.MemberExpression ||\n callee.property.type !== AST_NODE_TYPES.Identifier\n ) {\n return undefined;\n }\n return (fixer) => [\n fixer.replaceText(callee.property, \"enum\"),\n fixer.replaceText(\n argument,\n `[${values.map((value) => sourceCode.getText(value)).join(\", \")}]`,\n ),\n ];\n }\n\n return {\n ImportDeclaration(node): void {\n if (!isZodModule(node.source.value)) {\n return;\n }\n for (const specifier of node.specifiers) {\n if (\n specifier.type === AST_NODE_TYPES.ImportNamespaceSpecifier ||\n specifier.type === AST_NODE_TYPES.ImportDefaultSpecifier ||\n (specifier.type === AST_NODE_TYPES.ImportSpecifier &&\n specifier.imported.type === AST_NODE_TYPES.Identifier &&\n specifier.imported.name === \"z\")\n ) {\n zodNamespaces.add(specifier.local.name);\n }\n }\n },\n CallExpression(node): void {\n const values = enumValues(node);\n if (values === null) {\n return;\n }\n const fix = buildFix(node, values);\n context.report({\n node,\n messageId: \"preferEnum\",\n ...(fix === undefined ? {} : { fix }),\n });\n },\n };\n },\n});\n","/**\n * @fileoverview prefer-zod-infer — a hand-written type beside a Zod schema drifts silently the moment the schema gains a field.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/prefer-zod-infer.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/prefer-zod-infer.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isGeneratedFile, isStoryFile, isTestFile } from \"./_paths.js\";\nimport { isZodModule } from \"./_zod.js\";\n\ntype MessageIds = \"handWrittenTwin\";\ntype Options = readonly [\n {\n ignoreTypeNames?: readonly string[];\n requireIdenticalShape?: boolean;\n }?,\n];\n\n/**\n * Chained methods that leave a schema's inferred type alone. Everything else —\n * `.partial()`, `.omit()`, `.merge()`, `.transform()`, `.brand()`, … — means\n * the inferred type is deliberately not the object literal at the call site,\n * so the pair is none of this rule's business. See guard (d).\n */\nconst SHAPE_PRESERVING_METHODS: ReadonlySet<string> = new Set([\n \"describe\",\n \"refine\",\n \"superRefine\",\n \"check\",\n \"meta\",\n \"register\",\n]);\n\n/** Modifiers that make a member optional in the inferred type. */\nconst OPTIONAL_MODIFIERS: ReadonlySet<string> = new Set([\n \"optional\",\n \"nullish\",\n \"default\",\n \"prefault\",\n \"catch\",\n]);\n\n/** Modifiers that admit `null`. */\nconst NULLABLE_MODIFIERS: ReadonlySet<string> = new Set([\"nullable\", \"nullish\"]);\n\n/** Modifiers that replace the member's type outright. */\nconst RESHAPING_MODIFIERS: ReadonlySet<string> = new Set([\n \"transform\",\n \"pipe\",\n \"preprocess\",\n \"brand\",\n \"overwrite\",\n]);\n\n/** Methods whose receiver schema is being reshaped — see guard (f). */\nconst MODULE_LEVEL_RESHAPERS: ReadonlySet<string> = new Set([\n \"transform\",\n \"pipe\",\n \"preprocess\",\n]);\n\n/** Type names whose type arguments are hand-written types by construction. */\nconst ZOD_TYPE_CONSTRAINTS: ReadonlySet<string> = new Set([\n \"ZodType\",\n \"ZodSchema\",\n \"ZodTypeAny\",\n \"ZodMiniType\",\n \"Schema\",\n]);\n\n/** Zod leaf constructors and the TS AST node their inferred type is written as. */\nconst LEAF_NODE_TYPES: Readonly<Record<string, readonly AST_NODE_TYPES[]>> = {\n string: [AST_NODE_TYPES.TSStringKeyword],\n email: [AST_NODE_TYPES.TSStringKeyword],\n url: [AST_NODE_TYPES.TSStringKeyword],\n uuid: [AST_NODE_TYPES.TSStringKeyword],\n ulid: [AST_NODE_TYPES.TSStringKeyword],\n cuid: [AST_NODE_TYPES.TSStringKeyword],\n cuid2: [AST_NODE_TYPES.TSStringKeyword],\n nanoid: [AST_NODE_TYPES.TSStringKeyword],\n iso: [AST_NODE_TYPES.TSStringKeyword],\n number: [AST_NODE_TYPES.TSNumberKeyword],\n int: [AST_NODE_TYPES.TSNumberKeyword],\n float32: [AST_NODE_TYPES.TSNumberKeyword],\n float64: [AST_NODE_TYPES.TSNumberKeyword],\n boolean: [AST_NODE_TYPES.TSBooleanKeyword],\n bigint: [AST_NODE_TYPES.TSBigIntKeyword],\n symbol: [AST_NODE_TYPES.TSSymbolKeyword],\n any: [AST_NODE_TYPES.TSAnyKeyword],\n unknown: [AST_NODE_TYPES.TSUnknownKeyword],\n never: [AST_NODE_TYPES.TSNeverKeyword],\n void: [AST_NODE_TYPES.TSVoidKeyword],\n null: [AST_NODE_TYPES.TSNullKeyword],\n undefined: [AST_NODE_TYPES.TSUndefinedKeyword],\n literal: [AST_NODE_TYPES.TSLiteralType],\n date: [AST_NODE_TYPES.TSTypeReference],\n array: [AST_NODE_TYPES.TSArrayType, AST_NODE_TYPES.TSTypeReference],\n tuple: [AST_NODE_TYPES.TSTupleType],\n object: [AST_NODE_TYPES.TSTypeLiteral, AST_NODE_TYPES.TSTypeReference],\n strictObject: [AST_NODE_TYPES.TSTypeLiteral, AST_NODE_TYPES.TSTypeReference],\n looseObject: [AST_NODE_TYPES.TSTypeLiteral, AST_NODE_TYPES.TSTypeReference],\n record: [AST_NODE_TYPES.TSTypeReference, AST_NODE_TYPES.TSTypeLiteral],\n map: [AST_NODE_TYPES.TSTypeReference],\n set: [AST_NODE_TYPES.TSTypeReference],\n promise: [AST_NODE_TYPES.TSTypeReference],\n enum: [AST_NODE_TYPES.TSUnionType, AST_NODE_TYPES.TSTypeReference, AST_NODE_TYPES.TSLiteralType],\n nativeEnum: [AST_NODE_TYPES.TSUnionType, AST_NODE_TYPES.TSTypeReference, AST_NODE_TYPES.TSLiteralType],\n union: [AST_NODE_TYPES.TSUnionType, AST_NODE_TYPES.TSTypeReference],\n discriminatedUnion: [AST_NODE_TYPES.TSUnionType, AST_NODE_TYPES.TSTypeReference],\n intersection: [AST_NODE_TYPES.TSIntersectionType, AST_NODE_TYPES.TSTypeReference],\n};\n\ninterface SchemaField {\n readonly optional: boolean;\n readonly nullable: boolean;\n /** The `z.<leaf>` constructor, or `null` when the member references another schema. */\n readonly leaf: string | null;\n readonly reshaped: boolean;\n}\n\ninterface SchemaInfo {\n readonly name: string;\n readonly fields: ReadonlyMap<string, SchemaField>;\n}\n\ninterface TypeMember {\n readonly optional: boolean;\n readonly nullable: boolean;\n readonly annotation: TSESTree.TypeNode | null;\n}\n\ninterface TypeDeclaration {\n readonly name: string;\n readonly node: TSESTree.Node;\n readonly members: ReadonlyMap<string, TypeMember>;\n}\n\n/** `ZUserSchema` / `userSchema` / `ZUser` all describe the thing named `User`. */\nfunction normalizeSchemaName(name: string): string {\n return name\n .replace(/Schema$/i, \"\")\n .replace(/^Z(?=[A-Z])/, \"\")\n .toLowerCase();\n}\n\n/** `UserType` is the same claim as `User`; nothing else is stripped. */\nfunction normalizeTypeName(name: string): string {\n return name.replace(/Type$/, \"\").toLowerCase();\n}\n\n/** Strips `| null` / `| undefined` from a union and reports what it removed. */\nfunction unwrapNullish(annotation: TSESTree.TypeNode): {\n readonly core: TSESTree.TypeNode | null;\n readonly nullable: boolean;\n} {\n if (annotation.type !== AST_NODE_TYPES.TSUnionType) {\n return {\n core: annotation,\n nullable: annotation.type === AST_NODE_TYPES.TSNullKeyword,\n };\n }\n const rest: TSESTree.TypeNode[] = [];\n let nullable = false;\n for (const member of annotation.types) {\n if (member.type === AST_NODE_TYPES.TSNullKeyword) {\n nullable = true;\n continue;\n }\n if (member.type === AST_NODE_TYPES.TSUndefinedKeyword) {\n continue;\n }\n rest.push(member);\n }\n if (rest.length === 1) {\n return { core: rest[0] ?? null, nullable };\n }\n // A genuine union of two or more non-nullish members stays a union.\n return { core: rest.length === 0 ? null : annotation, nullable };\n}\n\n/**\n * Whether the annotation is the shape `z.<leaf>()` infers. `null` means \"cannot\n * tell\" — a member that references another schema, or a leaf this table does\n * not model. Only a definite `false` blocks a report.\n */\nfunction leafAgrees(\n leaf: string | null,\n annotation: TSESTree.TypeNode | null,\n): boolean | null {\n if (leaf === null || annotation === null) {\n return null;\n }\n const expected = LEAF_NODE_TYPES[leaf];\n if (expected === undefined) {\n return null;\n }\n const { core } = unwrapNullish(annotation);\n if (core === null) {\n return null;\n }\n return expected.includes(core.type);\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"prefer-zod-infer\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Derive a type from its Zod schema with `z.infer` instead of hand-writing a twin declaration beside it.\",\n },\n schema: [\n {\n type: \"object\",\n additionalProperties: false,\n properties: {\n ignoreTypeNames: {\n type: \"array\",\n items: { type: \"string\" },\n },\n requireIdenticalShape: { type: \"boolean\" },\n },\n },\n ],\n messages: {\n handWrittenTwin:\n \"`{{typeName}}` restates the shape of the Zod schema `{{schemaName}}` declared in this module. Derive it instead — `type {{typeName}} = z.infer<typeof {{schemaName}}>` — so a field added to the schema cannot silently leave the type behind.\",\n },\n },\n defaultOptions: [{}],\n create(context, [optionsArg]) {\n const ignorePatterns = (optionsArg?.ignoreTypeNames ?? []).map(\n (source) => new RegExp(source, \"u\"),\n );\n const requireIdenticalShape = optionsArg?.requireIdenticalShape ?? true;\n\n if (\n isTestFile(context.filename) ||\n isStoryFile(context.filename) ||\n isGeneratedFile(context.filename, context.sourceCode.text)\n ) {\n return {};\n }\n\n const zodNamespaces = new Set<string>();\n const schemas: SchemaInfo[] = [];\n const typeDeclarations: TypeDeclaration[] = [];\n /** Guard (c): every name mentioned inside a `z.ZodType<…>` type argument. */\n const constrainedTypeNames = new Set<string>();\n /** Guard (f): schemas this module pipes through a shape-changing method. */\n const reshapedSchemaNames = new Set<string>();\n\n /** The `z.…` call chain of `node`, base call first, or `null`. */\n function zodCallChain(\n node: TSESTree.Node,\n ): readonly TSESTree.CallExpression[] | null {\n const chain: TSESTree.CallExpression[] = [];\n let current: TSESTree.Node = node;\n while (current.type === AST_NODE_TYPES.CallExpression) {\n const callee = current.callee;\n if (\n callee.type !== AST_NODE_TYPES.MemberExpression ||\n callee.computed ||\n callee.property.type !== AST_NODE_TYPES.Identifier\n ) {\n return null;\n }\n chain.push(current);\n const receiver = callee.object;\n if (receiver.type === AST_NODE_TYPES.Identifier) {\n return zodNamespaces.has(receiver.name) ? chain.reverse() : null;\n }\n current = receiver;\n }\n return null;\n }\n\n /** The method name of a `z.foo()` / `.foo()` link in a chain. */\n function methodName(call: TSESTree.CallExpression): string {\n const callee = call.callee;\n return callee.type === AST_NODE_TYPES.MemberExpression &&\n callee.property.type === AST_NODE_TYPES.Identifier\n ? callee.property.name\n : \"\";\n }\n\n /** Modifier/leaf analysis of one `z.object({ key: <here> })` value. */\n function schemaField(node: TSESTree.Node): SchemaField {\n const modifiers: string[] = [];\n let current: TSESTree.Node = node;\n let leaf: string | null = null;\n\n while (current.type === AST_NODE_TYPES.CallExpression) {\n const callee = current.callee;\n if (\n callee.type !== AST_NODE_TYPES.MemberExpression ||\n callee.computed ||\n callee.property.type !== AST_NODE_TYPES.Identifier\n ) {\n break;\n }\n const receiver = callee.object;\n if (\n receiver.type === AST_NODE_TYPES.Identifier &&\n zodNamespaces.has(receiver.name)\n ) {\n leaf = callee.property.name;\n break;\n }\n modifiers.push(callee.property.name);\n current = receiver;\n }\n\n return {\n leaf,\n optional: modifiers.some((name) => OPTIONAL_MODIFIERS.has(name)),\n nullable: modifiers.some((name) => NULLABLE_MODIFIERS.has(name)),\n reshaped: modifiers.some((name) => RESHAPING_MODIFIERS.has(name)),\n };\n }\n\n /** Guard (d): only a plain `z.object({...})` literal describes its own shape. */\n function schemaFields(\n init: TSESTree.Node,\n ): ReadonlyMap<string, SchemaField> | null {\n const chain = zodCallChain(init);\n if (chain === null || chain.length === 0) {\n return null;\n }\n const [base, ...rest] = chain;\n if (base === undefined) {\n return null;\n }\n const baseMethod = methodName(base);\n if (baseMethod !== \"object\" && baseMethod !== \"strictObject\") {\n return null;\n }\n if (rest.some((call) => !SHAPE_PRESERVING_METHODS.has(methodName(call)))) {\n return null;\n }\n const shape = base.arguments[0];\n if (shape === undefined || shape.type !== AST_NODE_TYPES.ObjectExpression) {\n return null;\n }\n\n const fields = new Map<string, SchemaField>();\n for (const property of shape.properties) {\n if (property.type !== AST_NODE_TYPES.Property || property.computed) {\n return null; // a spread or computed key hides members from us\n }\n const { key } = property;\n const name =\n key.type === AST_NODE_TYPES.Identifier\n ? key.name\n : key.type === AST_NODE_TYPES.Literal && typeof key.value === \"string\"\n ? key.value\n : null;\n if (name === null) {\n return null;\n }\n fields.set(name, schemaField(property.value));\n }\n return fields.size === 0 ? null : fields;\n }\n\n /** The property signatures of an object type, or `null` if any member is exotic. */\n function typeMembers(\n members: readonly TSESTree.TypeElement[],\n ): ReadonlyMap<string, TypeMember> | null {\n const result = new Map<string, TypeMember>();\n for (const member of members) {\n if (member.type !== AST_NODE_TYPES.TSPropertySignature || member.computed) {\n return null;\n }\n const { key } = member;\n const name =\n key.type === AST_NODE_TYPES.Identifier\n ? key.name\n : key.type === AST_NODE_TYPES.Literal && typeof key.value === \"string\"\n ? key.value\n : null;\n if (name === null) {\n return null;\n }\n const annotation = member.typeAnnotation?.typeAnnotation ?? null;\n result.set(name, {\n optional: member.optional === true,\n nullable: annotation !== null && unwrapNullish(annotation).nullable,\n annotation,\n });\n }\n return result.size === 0 ? null : result;\n }\n\n function collectConstrainedNames(node: TSESTree.TypeNode): void {\n if (node.type === AST_NODE_TYPES.TSTypeReference) {\n if (node.typeName.type === AST_NODE_TYPES.Identifier) {\n constrainedTypeNames.add(node.typeName.name);\n }\n for (const argument of node.typeArguments?.params ?? []) {\n collectConstrainedNames(argument);\n }\n return;\n }\n if (node.type === AST_NODE_TYPES.TSArrayType) {\n collectConstrainedNames(node.elementType);\n return;\n }\n if (\n node.type === AST_NODE_TYPES.TSUnionType ||\n node.type === AST_NODE_TYPES.TSIntersectionType\n ) {\n for (const member of node.types) {\n collectConstrainedNames(member);\n }\n }\n }\n\n /** True when the pair is close enough to call one a restatement of the other. */\n function isTwin(\n fields: ReadonlyMap<string, SchemaField>,\n members: ReadonlyMap<string, TypeMember>,\n ): boolean {\n if (!requireIdenticalShape) {\n return true;\n }\n if (fields.size !== members.size) {\n return false;\n }\n let agreements = 0;\n for (const [name, field] of fields) {\n const member = members.get(name);\n if (member === undefined) {\n return false;\n }\n // Guard (d)/(e): a reshaped member's inferred type is not what is written.\n if (field.reshaped) {\n return false;\n }\n if (field.optional !== member.optional) {\n return false;\n }\n if (field.nullable !== member.nullable) {\n return false;\n }\n const agrees = leafAgrees(field.leaf, member.annotation);\n if (agrees === false) {\n return false;\n }\n if (agrees === true) {\n agreements += 1;\n }\n }\n // At least one member has to positively agree; a pair of types whose\n // members are all references to other symbols is a name coincidence.\n return agreements > 0;\n }\n\n return {\n ImportDeclaration(node): void {\n if (!isZodModule(node.source.value)) {\n return;\n }\n for (const specifier of node.specifiers) {\n if (\n specifier.type === AST_NODE_TYPES.ImportNamespaceSpecifier ||\n specifier.type === AST_NODE_TYPES.ImportDefaultSpecifier ||\n (specifier.type === AST_NODE_TYPES.ImportSpecifier &&\n specifier.imported.type === AST_NODE_TYPES.Identifier &&\n specifier.imported.name === \"z\")\n ) {\n zodNamespaces.add(specifier.local.name);\n }\n }\n },\n\n VariableDeclarator(node): void {\n if (node.id.type !== AST_NODE_TYPES.Identifier || node.init == null) {\n return;\n }\n const fields = schemaFields(node.init);\n if (fields !== null) {\n schemas.push({ name: node.id.name, fields });\n }\n },\n\n /** Guard (f): `XSchema.transform(...)` anywhere in the module. */\n \"MemberExpression[computed=false]\"(node: TSESTree.MemberExpression): void {\n if (\n node.object.type === AST_NODE_TYPES.Identifier &&\n node.property.type === AST_NODE_TYPES.Identifier &&\n MODULE_LEVEL_RESHAPERS.has(node.property.name)\n ) {\n reshapedSchemaNames.add(node.object.name);\n }\n },\n\n /** Guard (c): `z.ZodType<T>` and every other type argument it carries. */\n TSTypeReference(node): void {\n const { typeName } = node;\n const referenced =\n typeName.type === AST_NODE_TYPES.Identifier\n ? typeName.name\n : typeName.type === AST_NODE_TYPES.TSQualifiedName &&\n typeName.right.type === AST_NODE_TYPES.Identifier\n ? typeName.right.name\n : null;\n if (referenced === null || !ZOD_TYPE_CONSTRAINTS.has(referenced)) {\n return;\n }\n for (const argument of node.typeArguments?.params ?? []) {\n collectConstrainedNames(argument);\n }\n },\n\n TSInterfaceDeclaration(node): void {\n // Guard (b)/(g): generics and `extends` both mean \"not a restatement\".\n if (node.typeParameters !== undefined || (node.extends?.length ?? 0) > 0) {\n return;\n }\n const members = typeMembers(node.body.body);\n if (members !== null) {\n typeDeclarations.push({ name: node.id.name, node: node.id, members });\n }\n },\n\n TSTypeAliasDeclaration(node): void {\n if (\n node.typeParameters !== undefined ||\n node.typeAnnotation.type !== AST_NODE_TYPES.TSTypeLiteral\n ) {\n return;\n }\n const members = typeMembers(node.typeAnnotation.members);\n if (members !== null) {\n typeDeclarations.push({ name: node.id.name, node: node.id, members });\n }\n },\n\n \"Program:exit\"(): void {\n if (schemas.length === 0 || typeDeclarations.length === 0) {\n return;\n }\n const byName = new Map<string, SchemaInfo>();\n for (const schema of schemas) {\n const key = normalizeSchemaName(schema.name);\n if (key !== \"\" && !byName.has(key)) {\n byName.set(key, schema);\n }\n }\n\n for (const declaration of typeDeclarations) {\n if (constrainedTypeNames.has(declaration.name)) {\n continue;\n }\n if (ignorePatterns.some((pattern) => pattern.test(declaration.name))) {\n continue;\n }\n const schema = byName.get(normalizeTypeName(declaration.name));\n if (schema === undefined || reshapedSchemaNames.has(schema.name)) {\n continue;\n }\n if (!isTwin(schema.fields, declaration.members)) {\n continue;\n }\n context.report({\n node: declaration.node,\n messageId: \"handWrittenTwin\",\n data: { typeName: declaration.name, schemaName: schema.name },\n });\n }\n },\n };\n },\n});\n","/**\n * @fileoverview require-assert-never — a switch over a union whose `default` does no runtime work stops being exhaustive the day the union grows.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/require-assert-never.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/require-assert-never.md\n */\n\nimport { type TSESLint, type TSESTree, AST_NODE_TYPES } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\n\ntype MessageIds = \"missingAssertNever\";\ntype Options = readonly [];\n\n/**\n * Returns true if the statement performs some runtime work. An empty statement\n * or an empty block does nothing; everything else (`return`, `throw`, `break`,\n * a function call, an `if`, ...) is treated as legitimate runtime handling of\n * the default case.\n */\nconst isRuntimeHandlingStatement = (statement: TSESTree.Statement): boolean => {\n if (statement.type === AST_NODE_TYPES.EmptyStatement) return false;\n if (statement.type === AST_NODE_TYPES.BlockStatement) {\n return statement.body.some(isRuntimeHandlingStatement);\n }\n return true;\n};\n\n/**\n * A `default` clause with an empty body that is followed by another `case`\n * falls through into that case, which does the real work (e.g.\n * `default: case Single: handle();`). There is nothing to assert here.\n */\nconst isFallthroughDefault = (\n node: TSESTree.SwitchStatement,\n defaultIndex: number,\n): boolean => {\n const defaultCase = node.cases[defaultIndex];\n return (\n defaultCase !== undefined &&\n defaultCase.consequent.length === 0 &&\n defaultIndex < node.cases.length - 1\n );\n};\n\n/**\n * A `default` clause is a deliberate, documented no-op when its body is empty\n * (or an empty block) but carries a comment — e.g. `default: // do nothing`.\n * We can't distinguish a config-string switch from an exhaustive union switch\n * without type info, so a written-out intent to do nothing is honoured;\n * injecting `assertNever` there would throw at runtime. A bare empty default\n * with no comment is still flagged.\n */\nconst isCommentOnlyNoopDefault = (\n defaultCase: TSESTree.SwitchCase,\n sourceCode: Readonly<TSESLint.SourceCode>,\n): boolean => {\n if (defaultCase.consequent.length === 0) {\n const defaultToken = sourceCode.getFirstToken(defaultCase);\n const colonToken = defaultToken\n ? sourceCode.getTokenAfter(defaultToken)\n : null;\n return (\n colonToken !== null && sourceCode.getCommentsAfter(colonToken).length > 0\n );\n }\n const only = defaultCase.consequent[0];\n if (\n only !== undefined &&\n defaultCase.consequent.length === 1 &&\n only.type === AST_NODE_TYPES.BlockStatement &&\n only.body.length === 0\n ) {\n return sourceCode.getCommentsInside(only).length > 0;\n }\n return false;\n};\n\nexport default createRule<Options, MessageIds>({\n name: \"require-assert-never\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Require an exhaustive-style switch whose `default` case does no runtime work to call `assertNever(_)` so that discriminated unions are exhaustively checked at compile time. Switches with a legitimate runtime default (a reducer's `return state`, an HTTP-status `return fallback()`, a `break`, a `throw`, etc.) are left alone.\",\n },\n schema: [],\n messages: {\n missingAssertNever:\n \"Empty switch `default` case — add runtime handling or call `assertNever()` so the discriminated union is exhaustively checked at compile time.\",\n },\n },\n defaultOptions: [],\n create(context) {\n return {\n SwitchStatement(node: TSESTree.SwitchStatement): void {\n const defaultIndex = node.cases.findIndex(\n (caseNode) => caseNode.test === null,\n );\n // No `default` at all is fine — we don't demand exhaustiveness of every\n // switch, only of those that opted into a (no-op) default.\n if (defaultIndex === -1) return;\n const defaultCase = node.cases[defaultIndex];\n if (defaultCase === undefined) return;\n\n // A default that does real runtime work (return a fallback, break,\n // throw, log, ...) is legitimate — don't demand assertNever there. That\n // covers the canonical `assertNever(_)` too: it is a call statement, so\n // a separate recogniser for it decided nothing this line does not\n // already decide, and no test could tell the two apart.\n if (defaultCase.consequent.some(isRuntimeHandlingStatement)) return;\n\n // A fallthrough default hands control to a following case, which does\n // the work — there is nothing to assert.\n if (isFallthroughDefault(node, defaultIndex)) return;\n\n // A deliberate, comment-documented no-op default is honoured; we can't\n // prove the discriminant is a union without type info, and injecting\n // assertNever would throw at runtime on a config-string switch.\n if (isCommentOnlyNoopDefault(defaultCase, context.sourceCode)) return;\n\n // Otherwise the default is a bare, undocumented no-op: flag it.\n context.report({\n node: defaultCase,\n messageId: \"missingAssertNever\",\n });\n },\n };\n },\n});\n","/**\n * @fileoverview require-fetch-timeout — a `fetch` with no signal hangs for as long as the upstream stalls, holding the caller open with it.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/require-fetch-timeout.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/require-fetch-timeout.md\n */\n\nimport { AST_NODE_TYPES, ASTUtils, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isScriptFile, isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"missingSignal\";\ntype Options = readonly [\n {\n allowIn?: readonly string[];\n }?,\n];\n\n/** The explicit-global receivers of `<obj>.fetch(...)`. */\nconst GLOBAL_OBJECTS: ReadonlySet<string> = new Set([\n \"globalThis\",\n \"window\",\n \"self\",\n]);\n\nfunction matchesAnyPattern(\n filename: string,\n patterns: readonly string[],\n): boolean {\n for (const pattern of patterns) {\n // Convert minimatch-ish globs to regex: ** -> .*, * -> [^/\\\\]*\n const regexSource = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/\\*\\*/g, \"::DOUBLESTAR::\")\n .replace(/\\*/g, \"[^/\\\\\\\\]*\")\n .replace(/::DOUBLESTAR::/g, \".*\");\n if (new RegExp(`^${regexSource}$`).test(filename)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * True when the init argument provably lacks an abort signal: it is an object\n * literal with no `signal` property and no spread element. Any other shape\n * (identifier, call, spread, conditional, ...) may carry a signal, so it is\n * treated as safe.\n */\nfunction initProvablyLacksSignal(init: TSESTree.CallExpressionArgument): boolean {\n if (init.type !== AST_NODE_TYPES.ObjectExpression) {\n return false;\n }\n for (const prop of init.properties) {\n if (prop.type === AST_NODE_TYPES.SpreadElement) {\n return false;\n }\n if (\n (prop.key.type === AST_NODE_TYPES.Identifier &&\n prop.key.name === \"signal\") ||\n (prop.key.type === AST_NODE_TYPES.Literal && prop.key.value === \"signal\")\n ) {\n return false;\n }\n // A computed key could be \"signal\" at runtime; assume it is.\n if (prop.computed) {\n return false;\n }\n }\n return true;\n}\n\n/** True for a string or template literal — a URL spelled inline. */\nfunction isStringish(node: TSESTree.CallExpressionArgument): boolean {\n return (\n (node.type === AST_NODE_TYPES.Literal && typeof node.value === \"string\") ||\n node.type === AST_NODE_TYPES.TemplateLiteral\n );\n}\n\nexport default createRule<Options, MessageIds>({\n name: \"require-fetch-timeout\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Require an abort `signal` (e.g. `AbortSignal.timeout(ms)`) on global `fetch()` calls so stalled upstreams cannot hang the caller forever.\",\n },\n schema: [\n {\n type: \"object\",\n additionalProperties: false,\n properties: {\n allowIn: {\n description:\n \"Glob patterns for wrapper modules exempt from the rule. Matched against the ABSOLUTE file path, so anchor with a `**/` prefix (e.g. `**/http-client.ts`).\",\n type: \"array\",\n items: { type: \"string\" },\n },\n },\n },\n ],\n messages: {\n missingSignal:\n \"This `fetch()` has no abort `signal` — a stalled upstream will hang it forever. Pass `{ signal: AbortSignal.timeout(ms) }` or a signal from an AbortController.\",\n },\n },\n defaultOptions: [{}],\n create(context, [optionsArg]) {\n // `isTestFile` knows jscodeshift's `__testfixtures__/` spelling, so the\n // local pattern this rule used to keep for it decided nothing.\n if (isTestFile(context.filename) || isScriptFile(context.filename)) {\n return {};\n }\n const allowIn = optionsArg?.allowIn ?? [];\n if (allowIn.length > 0 && matchesAnyPattern(context.filename, allowIn)) {\n return {};\n }\n\n /** True when `identifier` resolves to the global (no local binding shadows it). */\n function resolvesToGlobal(identifier: TSESTree.Identifier): boolean {\n const scope = context.sourceCode.getScope(identifier);\n const variable = ASTUtils.findVariable(scope, identifier.name);\n // Unresolved → implicit global. Resolved with zero defs → declared\n // global (languageOptions.globals). Any def is a local shadow.\n return variable === null || variable.defs.length === 0;\n }\n\n /** True for `fetch(...)` / `globalThis.fetch(...)` / `window.fetch(...)` /\n * `self.fetch(...)` where the receiver resolves to the global scope. */\n function isGlobalFetchCall(callee: TSESTree.Expression): boolean {\n if (callee.type === AST_NODE_TYPES.Identifier) {\n return callee.name === \"fetch\" && resolvesToGlobal(callee);\n }\n return (\n callee.type === AST_NODE_TYPES.MemberExpression &&\n !callee.computed &&\n callee.property.type === AST_NODE_TYPES.Identifier &&\n callee.property.name === \"fetch\" &&\n callee.object.type === AST_NODE_TYPES.Identifier &&\n GLOBAL_OBJECTS.has(callee.object.name) &&\n resolvesToGlobal(callee.object)\n );\n }\n\n return {\n CallExpression(node: TSESTree.CallExpression): void {\n if (!isGlobalFetchCall(node.callee)) {\n return;\n }\n\n // Proxy passthrough: a lone non-string argument is a Request (or\n // equivalent) being forwarded — the inbound request owns the\n // lifetime, and a fresh signal cannot be attached without an init.\n const [first, init] = node.arguments;\n if (node.arguments.length === 1 && first !== undefined && !isStringish(first)) {\n return;\n }\n\n if (init === undefined || initProvablyLacksSignal(init)) {\n context.report({ node, messageId: \"missingSignal\" });\n }\n },\n };\n },\n});\n","/**\n * @fileoverview require-interface-for-injected-service — an exported class with injected collaborators and no port above it can only be tested by mocking the class.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/require-interface-for-injected-service.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/require-interface-for-injected-service.md\n */\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isGeneratedFile, isScriptFile, isStoryFile, isTestFile } from \"./_paths.js\";\n\ntype MessageIds = \"requireInterface\";\ntype Options = readonly [];\n\nconst CONFIGISH_TYPE_RE =\n /(?:Options|Opts|Config|Configuration|Settings|Params|Props|Args|Env|Environment|Callbacks|Flags)$/;\n\n/**\n * Parameter names that carry the same signal from the other side, plus the two\n * ambient-capability names the brief called out as weak evidence of a seam: a\n * class whose ONLY dependency is a logger or a clock is not the substitutability\n * problem this rule is about.\n */\nconst CONFIGISH_NAME_RE =\n /^(?:options|opts|config|configuration|settings|params|props|args|env|environment|callbacks|flags|logger|log|clock)$/i;\n\n/**\n * Third-party HTTP transports. A class whose ONLY stored collaborator is one of\n * these is a thin wrapper over somebody else's wire client: the Python side of\n * this standard excludes `*Client` for exactly this reason — an ABC over a class\n * whose collaborator is somebody else's HTTP transport substitutes nothing, and\n * a consumer's test fakes the transport (`respx`, `nock`, `msw`), not the wrapper.\n */\nconst HTTP_TRANSPORT_TYPE_RE = /^(?:KyInstance|AxiosInstance|Session)$/;\n\n/** Only the `*Client` naming carries the guard; see the transport-wrapper note in the header. */\n/**\n * TypeScript's own generic containers and mapped helpers. `data: Record<string,\n * Row>` names no implementation a consumer could swap — it is the same data a\n * bare `{ … }` annotation is, wearing a nominal name.\n */\nconst BUILTIN_CONTAINER_TYPE_RE =\n /^(?:Record|Map|WeakMap|Set|WeakSet|Array|ReadonlyArray|ReadonlyMap|ReadonlySet|Promise|Partial|Required|Readonly|Pick|Omit|Exclude|Extract|NonNullable|Awaited|Parameters|ReturnType|InstanceType)$/;\n\nconst TRANSPORT_WRAPPER_NAME_RE = /Client$/;\n\n/** `express.Router()` / `Router()` — the router-factory call that marks HTTP wiring. */\nconst ROUTER_FACTORY_NAME = \"Router\";\n\n/** Namespaced framework HTTP types (`express.Request`), never the DOM globals of the same name. */\nconst FRAMEWORK_HTTP_TYPES: ReadonlySet<string> = new Set([\"Request\", \"Response\", \"NextFunction\"]);\n\ninterface Collaborator {\n readonly name: string;\n /** Rightmost segment of the type name — what the config-ish guards test. */\n readonly typeName: string;\n /** Full source spelling, including any namespace qualifier, for the message. */\n readonly display: string;\n}\n\n/** The class's own declaration is what `export`s it; anonymous defaults have no name to report. */\nconst isExportedClass = (node: TSESTree.ClassDeclaration): boolean =>\n node.parent.type === AST_NODE_TYPES.ExportNamedDeclaration ||\n node.parent.type === AST_NODE_TYPES.ExportDefaultDeclaration;\n\n/** `catalog.Client` -> `\"catalog.Client\"`; a nested qualifier is flattened the same way. */\nconst qualifiedName = (name: TSESTree.EntityName): string =>\n name.type === AST_NODE_TYPES.Identifier\n ? name.name\n : name.type === AST_NODE_TYPES.TSQualifiedName\n ? `${qualifiedName(name.left)}.${name.right.name}`\n : \"\";\n\n/** The rightmost segment plus the full spelling of a bare type reference, or null for anything else. */\nconst readTypeReference = (\n annotation: TSESTree.TypeNode | undefined,\n): { readonly typeName: string; readonly display: string } | null => {\n // A bare type reference is the only shape that names a nominal collaborator.\n // A union, an array, or a function type is data or a callback, never something\n // a consumer would want to swap wholesale.\n if (annotation === undefined || annotation.type !== AST_NODE_TYPES.TSTypeReference) return null;\n const { typeName } = annotation;\n const rightmost =\n typeName.type === AST_NODE_TYPES.Identifier\n ? typeName.name\n : typeName.type === AST_NODE_TYPES.TSQualifiedName\n ? typeName.right.name\n : null;\n if (rightmost === null) return null;\n return { typeName: rightmost, display: qualifiedName(typeName) };\n};\n\nconst namedParameterCollaborator = (annotated: TSESTree.Parameter): Collaborator | null => {\n let target: TSESTree.Node = annotated;\n if (target.type === AST_NODE_TYPES.TSParameterProperty) target = target.parameter;\n if (target.type === AST_NODE_TYPES.AssignmentPattern) target = target.left;\n if (target.type !== AST_NODE_TYPES.Identifier) return null;\n // An inline `{ a: string }` on a NAMED parameter stays out: the bindings the\n // options-object walk below reads do not exist, so there is no collaborator to\n // name. `deps: SomeDeps` is covered by the bare-reference path.\n const reference = readTypeReference(target.typeAnnotation?.typeAnnotation);\n if (reference === null) return null;\n return { name: target.name, ...reference };\n};\n\ntype TypeReference = { readonly typeName: string; readonly display: string };\ntype MemberTypes = ReadonlyMap<string, TypeReference>;\n\n/** Property signatures of a `{ a: A; b: B }` body, keyed by property name. */\nconst propertySignatureTypes = (\n members: readonly TSESTree.TypeElement[],\n): Map<string, TypeReference> => {\n const types = new Map<string, TypeReference>();\n for (const member of members) {\n if (member.type !== AST_NODE_TYPES.TSPropertySignature) continue;\n if (member.computed || member.key.type !== AST_NODE_TYPES.Identifier) continue;\n const reference = readTypeReference(member.typeAnnotation?.typeAnnotation);\n if (reference === null) continue;\n types.set(member.key.name, reference);\n }\n return types;\n};\n\n/**\n * Every type name this module declares that a collaborator test needs to see\n * through: object shapes (so an options-object parameter's members can be read)\n * and aliases to a function type (so a callback wearing a nominal name is still\n * a callback).\n *\n * A bag or an alias declared in ANOTHER module is left alone rather than guessed\n * at — see the deliberate false negatives in the header.\n */\ninterface FileTypeIndex {\n /** `interface Deps { … }` / `type Deps = { … }`, by name. */\n readonly objects: ReadonlyMap<string, MemberTypes>;\n /** `type Replayer = (e: Event) => void` — a callback with a nominal name. */\n readonly functionAliases: ReadonlySet<string>;\n}\n\nconst fileTypeIndex = (program: TSESTree.Program): FileTypeIndex => {\n const objects = new Map<string, MemberTypes>();\n const functionAliases = new Set<string>();\n for (const statement of program.body) {\n const declaration =\n statement.type === AST_NODE_TYPES.ExportNamedDeclaration ? statement.declaration : statement;\n if (declaration?.type === AST_NODE_TYPES.TSInterfaceDeclaration) {\n objects.set(declaration.id.name, propertySignatureTypes(declaration.body.body));\n continue;\n }\n if (declaration?.type !== AST_NODE_TYPES.TSTypeAliasDeclaration) continue;\n const aliased = declaration.typeAnnotation;\n if (\n aliased.type === AST_NODE_TYPES.TSFunctionType ||\n aliased.type === AST_NODE_TYPES.TSConstructorType\n ) {\n functionAliases.add(declaration.id.name);\n continue;\n }\n // `type Deps = { … }` and `type Deps = Base & { … }` both resolve; the\n // intersection form is how a bag is usually extended.\n const literals =\n aliased.type === AST_NODE_TYPES.TSTypeLiteral\n ? [aliased]\n : aliased.type === AST_NODE_TYPES.TSIntersectionType\n ? aliased.types.filter((part) => part.type === AST_NODE_TYPES.TSTypeLiteral)\n : [];\n if (literals.length === 0) continue;\n const merged = new Map<string, TypeReference>();\n for (const literal of literals) {\n for (const [name, reference] of propertySignatureTypes(literal.members)) {\n merged.set(name, reference);\n }\n }\n objects.set(declaration.id.name, merged);\n }\n return { objects, functionAliases };\n};\n\n/**\n * Member types of an options-object parameter's annotation: the annotation's own\n * body when it is written inline, otherwise the declaration it names, resolved\n * in this file only.\n */\nconst bagMemberTypes = (\n annotation: TSESTree.TypeNode,\n declared: () => FileTypeIndex,\n): MemberTypes | null => {\n if (annotation.type === AST_NODE_TYPES.TSTypeLiteral) {\n return propertySignatureTypes(annotation.members);\n }\n // A qualified `catalog.Deps` names another module by construction.\n if (\n annotation.type !== AST_NODE_TYPES.TSTypeReference ||\n annotation.typeName.type !== AST_NODE_TYPES.Identifier\n ) {\n return null;\n }\n return declared().objects.get(annotation.typeName.name) ?? null;\n};\n\n/**\n * Collaborators reached through an options-object constructor,\n * `constructor({ userRepo, syncClient }: Deps)`. Each destructured binding is a\n * separate collaborator, because each one is separately stored on a field and\n * separately substitutable — exactly like a named parameter. Its type comes from\n * the bag's declaration, so `{ retries, timeoutMs }: HttpOptions` is dropped by\n * the same primitive-member test that drops `constructor(token: string)`.\n *\n * A rest element (`{ a, ...rest }`) and a nested pattern (`{ a: { b } }`) name\n * no single binding whose substitution a port would protect, so both are\n * skipped while the siblings beside them are still read.\n */\nconst objectPatternCollaborators = (\n pattern: TSESTree.ObjectPattern,\n declared: () => FileTypeIndex,\n): Collaborator[] => {\n const annotation = pattern.typeAnnotation?.typeAnnotation;\n if (annotation === undefined) return [];\n const members = bagMemberTypes(annotation, declared);\n if (members === null) return [];\n\n const collaborators: Collaborator[] = [];\n for (const property of pattern.properties) {\n if (property.type !== AST_NODE_TYPES.Property || property.computed) continue;\n if (property.key.type !== AST_NODE_TYPES.Identifier) continue;\n const key = property.key.name;\n const bound =\n property.value.type === AST_NODE_TYPES.AssignmentPattern\n ? property.value.left\n : property.value;\n if (bound.type !== AST_NODE_TYPES.Identifier) continue;\n // A renamed binding (`{ repo: userRepo }`) offers two names; either one\n // reading as config-ish is enough to drop it, on the same reasoning that\n // drops a config-ish parameter name.\n if (CONFIGISH_NAME_RE.test(key)) continue;\n const reference = members.get(key);\n if (reference === undefined) continue;\n collaborators.push({ name: bound.name, ...reference });\n }\n return collaborators;\n};\n\n/** Every collaborator a single constructor parameter contributes: 0, 1, or (destructured) many. */\nconst parameterCollaborators = (\n parameter: TSESTree.Parameter,\n declared: () => FileTypeIndex,\n): readonly Collaborator[] => {\n let target: TSESTree.Node = parameter;\n if (target.type === AST_NODE_TYPES.AssignmentPattern) target = target.left;\n if (target.type === AST_NODE_TYPES.ObjectPattern) {\n return objectPatternCollaborators(target, declared);\n }\n const named = namedParameterCollaborator(parameter);\n return named === null ? [] : [named];\n};\n\ninterface ConstructorFacts {\n /** Parameters assigned to an instance field, either as a parameter property or in the body. */\n readonly collaborators: readonly Collaborator[];\n /** How many instance fields the constructor fills with a `new` expression. */\n readonly constructedFields: number;\n}\n\n/** Names bound by `class Foo<T>` / `constructor<T>()` — placeholders, not implementations. */\nconst typeParameterNames = (\n ...declarations: readonly (TSESTree.TSTypeParameterDeclaration | undefined)[]\n): ReadonlySet<string> => {\n const names = new Set<string>();\n for (const declaration of declarations) {\n for (const parameter of declaration?.params ?? []) names.add(parameter.name.name);\n }\n return names;\n};\n\nconst readConstructor = (\n ctor: TSESTree.MethodDefinition,\n declared: () => FileTypeIndex,\n typeParameters: ReadonlySet<string>,\n): ConstructorFacts => {\n const body = ctor.value.body;\n const storedFrom = new Set<string>();\n let constructedFields = 0;\n\n if (body !== null && body !== undefined) {\n for (const statement of body.body) {\n if (statement.type !== AST_NODE_TYPES.ExpressionStatement) continue;\n const expression = statement.expression;\n if (\n expression.type !== AST_NODE_TYPES.AssignmentExpression ||\n expression.operator !== \"=\" ||\n expression.left.type !== AST_NODE_TYPES.MemberExpression ||\n expression.left.object.type !== AST_NODE_TYPES.ThisExpression\n ) {\n continue;\n }\n const source = expression.right;\n if (source.type === AST_NODE_TYPES.NewExpression) {\n constructedFields += 1;\n } else if (source.type === AST_NODE_TYPES.Identifier) {\n // `this.svc = svc`\n storedFrom.add(source.name);\n } else if (\n source.type === AST_NODE_TYPES.MemberExpression &&\n source.object.type === AST_NODE_TYPES.Identifier\n ) {\n // `this.slack = deps.slack` — a dependency bag spread onto fields.\n storedFrom.add(source.object.name);\n }\n }\n }\n\n const collaborators: Collaborator[] = [];\n for (const parameter of ctor.value.params) {\n for (const reference of parameterCollaborators(parameter, declared)) {\n const stored =\n parameter.type === AST_NODE_TYPES.TSParameterProperty || storedFrom.has(reference.name);\n if (!stored) continue;\n if (CONFIGISH_TYPE_RE.test(reference.typeName)) continue;\n if (CONFIGISH_NAME_RE.test(reference.name)) continue;\n // A bare type reference can still be one of three things a port would\n // protect nothing about, each of them the inline shape this rule already\n // rejects wearing a nominal name.\n if (typeParameters.has(reference.typeName)) continue;\n if (BUILTIN_CONTAINER_TYPE_RE.test(reference.typeName)) continue;\n if (declared().functionAliases.has(reference.typeName)) continue;\n collaborators.push(reference);\n }\n }\n\n return { collaborators, constructedFields };\n};\n\n/** Walk every descendant node, `parent` links excluded, until `found` returns true. */\nconst subtreeHas = (root: TSESTree.Node, found: (node: TSESTree.Node) => boolean): boolean => {\n let hit = false;\n const visit = (current: TSESTree.Node): void => {\n if (hit) return;\n if (found(current)) {\n hit = true;\n return;\n }\n for (const key of Object.keys(current) as (keyof TSESTree.Node)[]) {\n if (key === \"parent\") continue;\n const value = current[key];\n for (const child of (Array.isArray(value) ? value : [value]) as unknown[]) {\n if (\n child !== null &&\n typeof child === \"object\" &&\n typeof (child as { type?: unknown }).type === \"string\"\n ) {\n visit(child as TSESTree.Node);\n }\n }\n }\n };\n visit(root);\n return hit;\n};\n\n/**\n * Report whether the class body is HTTP framework wiring: it manufactures a\n * router (`express.Router()`), or it handles the framework's own namespaced\n * request/response objects. Such a class is mounted by the server's bootstrap,\n * never injected into anything, so there is no consumer to give a port to.\n */\nconst isFrameworkWiring = (body: TSESTree.ClassBody): boolean =>\n subtreeHas(body, (node) => {\n if (node.type === AST_NODE_TYPES.CallExpression) {\n const { callee } = node;\n if (callee.type === AST_NODE_TYPES.Identifier) return callee.name === ROUTER_FACTORY_NAME;\n return (\n callee.type === AST_NODE_TYPES.MemberExpression &&\n !callee.computed &&\n callee.property.type === AST_NODE_TYPES.Identifier &&\n callee.property.name === ROUTER_FACTORY_NAME\n );\n }\n // `express.Request` — qualified on purpose, so the DOM `Request`/`Response`\n // globals a Workers `fetch` handler names do not read as express wiring.\n return (\n node.type === AST_NODE_TYPES.TSTypeReference &&\n node.typeName.type === AST_NODE_TYPES.TSQualifiedName &&\n FRAMEWORK_HTTP_TYPES.has(node.typeName.right.name)\n );\n });\n\nconst stem = (name: string): string => name.replace(/^I(?=[A-Z])/, \"\").replace(/Impl$/, \"\");\n\n/** Interface declarations at the top level of this module, exported or not. */\nconst fileInterfaceNames = (program: TSESTree.Program): string[] => {\n const names: string[] = [];\n for (const statement of program.body) {\n const declaration =\n statement.type === AST_NODE_TYPES.ExportNamedDeclaration ? statement.declaration : statement;\n if (declaration?.type === AST_NODE_TYPES.TSInterfaceDeclaration) names.push(declaration.id.name);\n }\n return names;\n};\n\n/** Report whether the class is a thin wrapper over somebody else's HTTP transport. */\nconst isTransportWrapper = (\n className: string,\n collaborators: readonly Collaborator[],\n program: TSESTree.Program,\n): boolean => {\n const [only] = collaborators;\n if (collaborators.length !== 1 || only === undefined) return false;\n if (!HTTP_TRANSPORT_TYPE_RE.test(only.typeName)) return false;\n if (!TRANSPORT_WRAPPER_NAME_RE.test(className)) return false;\n const target = stem(className);\n return !fileInterfaceNames(program).some((name) => {\n const other = stem(name);\n return target.endsWith(other) || other.endsWith(target);\n });\n};\n\n/**\n * Public instance methods only. `kind === \"method\"` excludes getters and setters\n * on purpose: a class that exposes only accessors is a value object, and the\n * constructor is not a seam worth porting.\n */\nconst publicMethodNames = (body: TSESTree.ClassBody): string[] => {\n const names: string[] = [];\n for (const member of body.body) {\n if (member.type !== AST_NODE_TYPES.MethodDefinition) continue;\n if (member.kind !== \"method\" || member.static) continue;\n if (member.accessibility === \"private\" || member.accessibility === \"protected\") continue;\n if (member.key.type === AST_NODE_TYPES.PrivateIdentifier) continue;\n if (member.key.type === AST_NODE_TYPES.Identifier) names.push(member.key.name);\n else names.push(\"…\");\n }\n return names;\n};\n\nexport default createRule<Options, MessageIds>({\n name: \"require-interface-for-injected-service\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"An exported service class with constructor-injected collaborators must implement an interface, so consumers depend on a port they can substitute instead of mocking the class.\",\n },\n schema: [],\n messages: {\n requireInterface:\n \"`{{name}}` stores injected collaborator(s) ({{deps}}) but implements no interface, so every consumer depends on this concrete class and can only be tested by mocking it. Declare an interface with its public method signature(s) ({{methods}}) and `class {{name}} implements <Interface>`.\",\n },\n },\n defaultOptions: [],\n create(context) {\n const { filename } = context;\n if (isTestFile(filename) || isStoryFile(filename) || isScriptFile(filename)) return {};\n if (isGeneratedFile(filename, context.sourceCode.getText())) return {};\n\n // One pass over the module's top level, and only for a file that actually\n // has an options-object constructor to read.\n let declaredTypes: FileTypeIndex | null = null;\n const objectTypes = (): FileTypeIndex =>\n (declaredTypes ??= fileTypeIndex(context.sourceCode.ast));\n\n return {\n ClassDeclaration(node: TSESTree.ClassDeclaration): void {\n if (node.id === null) return;\n if (!isExportedClass(node)) return;\n // The port itself must never fire, and a class that extends anything —\n // an abstract base, a framework class, `Error` — already has one.\n if (node.abstract === true) return;\n if (node.superClass !== null) return;\n if (node.implements.length > 0) return;\n // A framework that instantiates by class token (NestJS `@Injectable()`)\n // makes the class its own contract.\n if (node.decorators.length > 0) return;\n\n const ctor = node.body.body.find(\n (member): member is TSESTree.MethodDefinition =>\n member.type === AST_NODE_TYPES.MethodDefinition && member.kind === \"constructor\",\n );\n if (ctor === undefined) return;\n\n const { collaborators, constructedFields } = readConstructor(\n ctor,\n objectTypes,\n typeParameterNames(node.typeParameters, ctor.value.typeParameters),\n );\n if (collaborators.length === 0) return;\n // A composition root BUILDS more than it RECEIVES — that is where\n // concrete types are supposed to be named, and a port above it protects\n // nobody. Constructing one internal helper while receiving a real\n // collaborator is an ordinary service, not a wiring class, so the test\n // is a ratio rather than the mere presence of a `new`.\n if (constructedFields > collaborators.length) return;\n // HTTP wiring: a router factory is mounted by the bootstrap, not injected.\n if (isFrameworkWiring(node.body)) return;\n // A lone third-party transport is not a seam a port could protect.\n if (isTransportWrapper(node.id.name, collaborators, context.sourceCode.ast)) return;\n\n const methods = publicMethodNames(node.body);\n if (methods.length === 0) return;\n\n context.report({\n node: node.id,\n messageId: \"requireInterface\",\n data: {\n name: node.id.name,\n deps: collaborators.map((c) => `${c.name}: ${c.display}`).join(\", \"),\n methods: methods.join(\", \"),\n },\n });\n },\n };\n },\n});\n","/**\n * @fileoverview require-zod-form-validation — `formData.get(k)` hands back an attacker-controlled `FormDataEntryValue | null`.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/require-zod-form-validation.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/require-zod-form-validation.md\n */\n\nimport { type TSESTree, AST_NODE_TYPES } from \"@typescript-eslint/utils\";\nimport type { RuleContext, Scope } from \"@typescript-eslint/utils/ts-eslint\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isTestFile } from \"./_paths.js\";\nimport { ZOD_SCHEMA_NAME_RE } from \"./_zod.js\";\n\ntype MessageIds = \"missingZodValidation\";\ntype Options = readonly [];\n\ntype Ctx = Readonly<RuleContext<MessageIds, Options>>;\n\n/**\n * Walk down a (possibly chained) receiver expression and decide whether it\n * originates from something that looks like a Zod schema — the bare `z` builder\n * (`z.object({...}).parse(...)`), a `Schema`-suffixed identifier\n * (`userSchema.parse(...)`), or a `Z`-prefixed identifier (`ZUser.parse(...)`).\n * Non-Zod receivers like `JSON` / `Date` are intentionally rejected.\n */\nconst looksLikeZodSchema = (node: TSESTree.Node): boolean => {\n let current: TSESTree.Node = node;\n while (true) {\n if (current.type === AST_NODE_TYPES.Identifier) {\n return current.name === \"z\" || ZOD_SCHEMA_NAME_RE.test(current.name);\n }\n if (current.type === AST_NODE_TYPES.CallExpression) {\n current = current.callee;\n continue;\n }\n if (current.type === AST_NODE_TYPES.MemberExpression) {\n current = current.object;\n continue;\n }\n return false;\n }\n};\n\n/**\n * Matches a Zod validation call: `<ZodSchema>.parse(...)` or\n * `<ZodSchema>.safeParse(...)`. Keys off the *receiver* looking like a Zod\n * schema rather than the method name alone, so `JSON.parse(...)` /\n * `Date.parse(...)` are NOT treated as validation.\n */\nconst isZodParseCall = (node: TSESTree.Node): boolean => {\n if (node.type !== AST_NODE_TYPES.CallExpression) return false;\n const callee = node.callee;\n if (callee.type !== AST_NODE_TYPES.MemberExpression) return false;\n if (callee.computed) return false;\n if (callee.property.type !== AST_NODE_TYPES.Identifier) return false;\n const method = callee.property.name;\n if (method !== \"parse\" && method !== \"safeParse\") return false;\n return looksLikeZodSchema(callee.object);\n};\n\n/**\n * Matches an (optionally awaited) `<x>.formData()` call — the canonical way a\n * `FormData` object is obtained from a `Request` / `Response`.\n */\nconst isFormDataMethodCall = (node: TSESTree.Node): boolean => {\n let current: TSESTree.Node = node;\n if (current.type === AST_NODE_TYPES.AwaitExpression) {\n current = current.argument;\n }\n if (current.type !== AST_NODE_TYPES.CallExpression) return false;\n const callee = current.callee;\n return (\n callee.type === AST_NODE_TYPES.MemberExpression &&\n !callee.computed &&\n callee.property.type === AST_NODE_TYPES.Identifier &&\n callee.property.name === \"formData\"\n );\n};\n\nexport default createRule<Options, MessageIds>({\n name: \"require-zod-form-validation\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Require Zod validation (`Schema.parse(...)` / `Schema.safeParse(...)`) when reading values out of a `FormData` object.\",\n },\n schema: [],\n messages: {\n missingZodValidation:\n \"FormData parsing must use Zod schema validation (e.g., Schema.parse() / Schema.safeParse())\",\n },\n },\n defaultOptions: [],\n create(context: Ctx) {\n if (isTestFile(context.filename)) {\n return {};\n }\n\n // A receiver is a FormData source if its name reads like form data, or if\n // it is a binding initialized from a `.formData()` call.\n const isFormSourceIdentifier = (node: TSESTree.Node): boolean => {\n if (node.type !== AST_NODE_TYPES.Identifier) return false;\n if (/formdata/i.test(node.name)) return true;\n\n let scope: Scope.Scope | null = context.sourceCode.getScope(node);\n while (scope !== null) {\n const variable = scope.set.get(node.name);\n if (variable !== undefined && variable.defs.length === 1) {\n const def = variable.defs[0];\n if (\n def !== undefined &&\n def.type === \"Variable\" &&\n def.node.type === AST_NODE_TYPES.VariableDeclarator &&\n def.node.init !== null\n ) {\n return isFormDataMethodCall(def.node.init);\n }\n return false;\n }\n scope = scope.upper;\n }\n return false;\n };\n\n const isFormDataGetCall = (node: TSESTree.CallExpression): boolean => {\n const callee = node.callee;\n if (callee.type !== AST_NODE_TYPES.MemberExpression) return false;\n if (\n callee.property.type !== AST_NODE_TYPES.Identifier ||\n callee.property.name !== \"get\"\n ) {\n return false;\n }\n return isFormSourceIdentifier(callee.object);\n };\n\n // Walk up from `node` looking for a surrounding Zod `.parse(...)` /\n // `.safeParse(...)` call. `.parent` is `null` at the Program root, so we\n // must guard for both null and undefined.\n const hasZodParseAncestor = (node: TSESTree.Node): boolean => {\n let parent: TSESTree.Node | null | undefined = node.parent;\n while (parent !== null && parent !== undefined) {\n if (isZodParseCall(parent)) return true;\n parent = parent.parent;\n }\n return false;\n };\n\n // `x instanceof File` / `x instanceof Blob` — a Zod schema adds nothing over\n // the `instanceof` narrowing for a binary upload.\n const isInstanceofNarrowing = (node: TSESTree.Node): boolean => {\n const parent: TSESTree.Node | null | undefined = node.parent;\n return (\n parent !== null &&\n parent !== undefined &&\n parent.type === AST_NODE_TYPES.BinaryExpression &&\n parent.operator === \"instanceof\" &&\n parent.left === node\n );\n };\n\n /** The identifier this `.get(...)` call is bound to, or null. */\n const boundDeclarator = (\n node: TSESTree.CallExpression,\n ): TSESTree.VariableDeclarator | null => {\n const parent = node.parent;\n if (\n parent.type === AST_NODE_TYPES.VariableDeclarator &&\n parent.init === node &&\n parent.id.type === AST_NODE_TYPES.Identifier\n ) {\n return parent;\n }\n return null;\n };\n\n /** Is any read of this binding validated (Zod parse, or `instanceof File`)? */\n const bindingIsValidated = (\n declarator: TSESTree.VariableDeclarator,\n ): boolean => {\n const variable = context.sourceCode.getDeclaredVariables(declarator)[0];\n if (variable === undefined) return false;\n return variable.references.some(\n (ref) =>\n hasZodParseAncestor(ref.identifier) ||\n isInstanceofNarrowing(ref.identifier),\n );\n };\n\n return {\n CallExpression(node: TSESTree.CallExpression): void {\n if (!isFormDataGetCall(node)) return;\n\n if (hasZodParseAncestor(node) || isInstanceofNarrowing(node)) return;\n\n const declarator = boundDeclarator(node);\n if (declarator !== null && bindingIsValidated(declarator)) return;\n\n context.report({\n node,\n messageId: \"missingZodValidation\",\n });\n },\n };\n },\n});\n","/**\n * @fileoverview store-insert-requires-on-conflict — a bare `INSERT` duplicates rows or throws under cron re-runs and queue redelivery.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/store-insert-requires-on-conflict.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/store-insert-requires-on-conflict.md\n */\n\nimport { type TSESTree } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isTestFile } from \"./_paths.js\";\nimport { createSqlListener } from \"./_sql.js\";\n\ntype MessageIds = \"storeInsertRequiresOnConflict\";\ntype Options = readonly [];\n\n/**\n * A real insert *write*: the keyword, a table identifier, an optional column\n * list, then `VALUES` / `SELECT` / `DEFAULT VALUES` with nothing in between.\n * Requiring that exact adjacency is what keeps English prose out — \"failed to\n * insert into the queue: values were rejected\" has words between the table and\n * the verb, so it does not match. The optional `OR <action>` clause is SQLite's\n * conflict resolution; it is matched here so `INSERT OR IGNORE INTO` is\n * recognised as an insert at all, then excused below.\n */\nconst INSERT_WRITE =\n /\\bINSERT\\s+(?:OR\\s+\\w+\\s+)?INTO\\s+[\\w.\"'`?$:@-]+\\s*(?:\\([^)]*\\)\\s*)?(?:VALUES|SELECT|DEFAULT\\s+VALUES)\\b/i;\n\n/** Conflict handling that makes the write replay-safe. */\nconst CONFLICT_HANDLED = /\\bON\\s+CONFLICT\\b|\\bON\\s+DUPLICATE\\s+KEY\\b|\\bINSERT\\s+OR\\s+(?:IGNORE|REPLACE)\\b/i;\n\nconst INSERT_GATE = /insert/i;\n\nexport default createRule<Options, MessageIds>({\n name: \"store-insert-requires-on-conflict\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Require an embedded SQL INSERT to carry ON CONFLICT; store writes replay under cron re-runs and queue redelivery and must be idempotent upserts.\",\n },\n schema: [],\n messages: {\n storeInsertRequiresOnConflict:\n \"This INSERT is not replay-safe: a cron re-run or queue redelivery duplicates the row (or fails the handler on a unique-constraint violation). Add `ON CONFLICT (...) DO UPDATE` / `DO NOTHING` (or `INSERT OR IGNORE`).\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (isTestFile(context.filename) || !INSERT_GATE.test(context.sourceCode.text)) {\n return {};\n }\n return createSqlListener((sql: string, node: TSESTree.Node): void => {\n if (!INSERT_WRITE.test(sql) || CONFLICT_HANDLED.test(sql)) {\n return;\n }\n context.report({ node, messageId: \"storeInsertRequiresOnConflict\" });\n });\n },\n});\n","/**\n * @fileoverview zod-naming-convention — a schema you cannot recognise at its use site sends every reader back to the declaration.\n *\n * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/zod-naming-convention.test.ts\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/zod-naming-convention.md\n */\n\nimport { type TSESTree, AST_NODE_TYPES } from \"@typescript-eslint/utils\";\n\nimport { createRule } from \"./_docs.js\";\nimport { isGeneratedFile, isTestFile } from \"./_paths.js\";\nimport { ZOD_PREFIX_RE, ZOD_SCHEMA_NAME_RE, ZOD_SUFFIX_RE } from \"./_zod.js\";\n\ntype MessageIds = \"zPrefix\" | \"schemaSuffix\" | \"zodSchemaName\";\ntype Convention = \"prefix\" | \"suffix\" | \"either\";\ntype Options = readonly [\n {\n convention?: Convention;\n }?,\n];\n\nconst CONVENTIONS: Record<\n Convention,\n { readonly test: RegExp; readonly messageId: MessageIds }\n> = {\n prefix: { test: ZOD_PREFIX_RE, messageId: \"zPrefix\" },\n suffix: { test: ZOD_SUFFIX_RE, messageId: \"schemaSuffix\" },\n either: { test: ZOD_SCHEMA_NAME_RE, messageId: \"zodSchemaName\" },\n};\n\n/**\n * Guard (c): the binding already reads as a schema. `ZOD_SUFFIX_RE` is anchored\n * and case-sensitive by design (it is also the *recogniser* other rules use), so\n * it rejects `schema`, `schema1` and `numberSchemaOptional`. Those need no\n * rename — the whole point of the convention is that a reader spots a schema at\n * the use site, and every one of them does. Accepting them here only widens what\n * this rule tolerates; it never makes the shared recogniser stricter.\n */\nconst CONTAINS_SCHEMA_RE = /schema/i;\n\n/**\n * Guard (d): micro-benchmark trees. A schema declared in a benchmark is a\n * throwaway local fed to a suite a few lines below — the same \"no cross-module\n * use site for the convention to serve\" argument as the test-file guard, on a\n * path `isTestFile` does not match. Kept local to this rule rather than pushed\n * into `_paths` because a benchmark is not a test: it is not exempt from\n * correctness rules, only from naming ones.\n *\n * Anchored on a PATH SEGMENT so `workbench/` and `benchmarking-report.ts` are\n * unaffected.\n */\nconst BENCHMARK_PATH_RE = /(^|[\\\\/])(?:benchmarks?|bench)[\\\\/]/;\n\n/**\n * Guard (b): terminal methods on a `z.…` chain whose result is NOT a schema.\n * `.parse`/`.safeParse` return a parsed value or a result envelope, the codec\n * methods return the converted value, `z.toJSONSchema` returns a plain JSON\n * object, `z.registry()` returns a registry, and `.implement()` returns a\n * function. Naming any of them `xSchema` would be a lie.\n */\nconst NON_SCHEMA_TERMINALS: ReadonlySet<string> = new Set([\n \"parse\",\n \"parseAsync\",\n \"safeParse\",\n \"safeParseAsync\",\n \"encode\",\n \"decode\",\n \"encodeAsync\",\n \"decodeAsync\",\n \"safeEncode\",\n \"safeDecode\",\n \"safeEncodeAsync\",\n \"safeDecodeAsync\",\n \"toJSONSchema\",\n \"registry\",\n \"implement\",\n]);\n\n/** The method name a call chain ends on, e.g. `safeParse` for `z.string().safeParse(x)`. */\nconst terminalMethodName = (callee: TSESTree.MemberExpression): string | null =>\n !callee.computed && callee.property.type === AST_NODE_TYPES.Identifier\n ? callee.property.name\n : null;\n\n/**\n * Walks down a (possibly chained) callee like `z.object().extend().refine()` and\n * returns `true` if the chain originates from a bare `z` identifier — i.e. the\n * outermost MemberExpression on the chain has `z` as its receiver.\n */\nconst calleeChainStartsWithZ = (node: TSESTree.Node): boolean => {\n let current: TSESTree.Node = node;\n\n while (current.type === AST_NODE_TYPES.MemberExpression) {\n const receiver: TSESTree.Node = current.object;\n if (receiver.type === AST_NODE_TYPES.Identifier && receiver.name === \"z\") {\n return true;\n }\n if (receiver.type === AST_NODE_TYPES.CallExpression) {\n current = receiver.callee;\n continue;\n }\n return false;\n }\n\n return false;\n};\n\nexport default createRule<Options, MessageIds>({\n name: \"zod-naming-convention\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Enforce a consistent Zod schema naming convention — a `Z` prefix (`ZUser`) or a `Schema` suffix (`userSchema`); both are accepted by default.\",\n },\n schema: [\n {\n type: \"object\",\n additionalProperties: false,\n properties: {\n convention: {\n type: \"string\",\n enum: [\"prefix\", \"suffix\", \"either\"],\n },\n },\n },\n ],\n messages: {\n zPrefix: \"Zod schema names should start with Z (e.g. `ZUser`)\",\n schemaSuffix: \"Zod schema names should end with Schema (e.g. `userSchema`)\",\n zodSchemaName:\n \"Zod schema names should start with Z (`ZUser`) or end with Schema (`userSchema`)\",\n },\n },\n defaultOptions: [{}],\n create(context, [optionsArg]) {\n const convention = optionsArg?.convention ?? \"either\";\n const { test, messageId } = CONVENTIONS[convention];\n // Guard (c) relaxes the SUFFIX spelling, so it must not apply to a team that\n // explicitly asked for prefix-only — there `userschema` really is off-convention.\n const acceptsSchemaWord = convention !== \"prefix\";\n\n // Guard (a) / (d): a schema declared in a test or a benchmark is a local\n // fixture, not an API.\n if (\n isTestFile(context.filename) ||\n BENCHMARK_PATH_RE.test(context.filename.replaceAll(\"\\\\\", \"/\")) ||\n isGeneratedFile(context.filename, context.sourceCode.text)\n ) {\n return {};\n }\n\n return {\n VariableDeclarator(node: TSESTree.VariableDeclarator): void {\n const init = node.init;\n if (init === null || init === undefined) return;\n if (init.type !== AST_NODE_TYPES.CallExpression) return;\n\n const callee = init.callee;\n if (callee.type !== AST_NODE_TYPES.MemberExpression) return;\n\n if (!calleeChainStartsWithZ(callee)) return;\n\n // Guard (b): the chain ends on a call that yields a value/result, not a schema.\n const terminal = terminalMethodName(callee);\n if (terminal !== null && NON_SCHEMA_TERMINALS.has(terminal)) return;\n\n if (node.id.type !== AST_NODE_TYPES.Identifier) return;\n if (test.test(node.id.name)) return;\n // Guard (c): the name already reads as a schema in any casing.\n if (acceptsSchemaWord && CONTAINS_SCHEMA_RE.test(node.id.name)) return;\n\n context.report({\n node: node.id,\n messageId,\n });\n },\n };\n },\n});\n","/**\n * @fileoverview _renames — every rule this plugin has renamed, old name to new; the old names no longer resolve, so this map is what says what to write instead.\n *\n * It feeds `scripts/sync-rule-ledger.py`, which turns each entry into a `renamed` row of the shipped `rule-ledger.json` that `sarj-lint-configs doctor` reads.\n *\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/_renames.md\n */\n\nexport const renamedRules = {\n \"jsdoc-restates-signature\": \"no-restated-jsdoc\",\n \"no-async-callback-in-waitfor\": \"no-async-callback-in-wait-for\",\n \"strict-test-assertions\": \"prefer-whole-object-assertion\",\n \"trailing-value-narration\": \"no-trailing-value-narration\",\n} as const;\n\nexport type RenamedFrom = keyof typeof renamedRules;\nexport type RenamedTo = (typeof renamedRules)[RenamedFrom];\n","/**\n * @fileoverview _retired — a withdrawn rule name is burned, not recycled, because a consumer's `eslint-disable` comment or suppressions entry still names it.\n *\n * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/_retired.md\n */\n\n/** Why a name was withdrawn, and in which release. */\nexport interface RetiredRule {\n /** The plugin version whose release removed the rule. */\n readonly removedIn: string;\n /** One line a consumer can act on: why it went, and what (if anything) replaced it. */\n readonly reason: string;\n}\n\nexport const retiredRules: Readonly<Record<string, RetiredRule>> = {\n \"ban-loose-type-guards-in-tests\": {\n removedIn: \"5.0.0\",\n reason:\n \"Read at 39 findings with 0 true positives in the #183 corpus audit. Delete the config entry; no replacement.\",\n },\n \"no-implicit-attribute-access\": {\n removedIn: \"5.0.0\",\n reason:\n \"Read at 50 findings with 0 true positives in the #183 corpus audit. Delete the config entry; no replacement.\",\n },\n \"no-sequential-await\": {\n removedIn: \"3.0.0\",\n reason:\n \"218 findings, 100% range-contained in core `no-await-in-loop`, which the shipped config already enables. Delete the entry; `no-await-in-loop` covers it.\",\n },\n \"no-template-literal-in-log\": {\n removedIn: \"2.3.1\",\n reason: \"Withdrawn. Delete the config entry; no replacement.\",\n },\n \"no-unsafe-cast\": {\n removedIn: \"3.0.0\",\n reason:\n \"1,089 findings, matching `@typescript-eslint/consistent-type-assertions` (\\\"never\\\") at the identical line and column with zero residue. Delete the entry; keep that rule enabled.\",\n },\n \"prefer-setup-file-mocks\": {\n removedIn: \"5.0.0\",\n reason:\n \"Read at 50 findings with 0 true positives in the #183 corpus audit. Delete the config entry; no replacement.\",\n },\n \"prefer-shadcn\": {\n removedIn: \"3.0.0\",\n reason:\n \"645 findings, a subset of `react/forbid-elements`; its 24-position residue was all design-system primitives being told not to be the design system. Delete the entry.\",\n },\n \"primary-export-file-name\": {\n removedIn: \"4.0.0\",\n reason:\n \"Renamed files after one of their exports — 316 findings over 1,966 files sampled 11 harmful / 15 useless / 4 valuable, including telling `next.config.ts` to become `next-config.ts`. Delete the config entry.\",\n },\n \"require-parameterized-tests\": {\n removedIn: \"4.0.0\",\n reason:\n \"Landed in #153 and never wired up: absent from the `rules` record, every preset, and eslint.strict.mjs. Nothing to migrate.\",\n },\n \"require-schema-validate-search\": {\n removedIn: \"3.0.0\",\n reason:\n \"14 findings, all matched line-and-column by `@typescript-eslint/consistent-type-assertions`. Delete the entry.\",\n },\n \"single-public-export\": {\n removedIn: \"3.0.0\",\n reason:\n \"3 findings, all also reported by the then-live `primary-export-file-name` (itself withdrawn in 4.0.0). Delete the entry.\",\n },\n};\n","/**\n * @fileoverview index — the plugin's rule registry and its two presets; the historical rename map lives in `rules/_renames.ts`.\n */\n\nimport enforceFileStructure from \"./rules/enforce-file-structure.js\";\nimport noAsyncCallbackInWaitFor from \"./rules/no-async-callback-in-wait-for.js\";\nimport noClientSideDataFetching from \"./rules/no-client-side-data-fetching.js\";\nimport noCommentCruft from \"./rules/no-comment-cruft.js\";\nimport noConditionalInTest from \"./rules/no-conditional-in-test.js\";\nimport noCorsWildcardWithCredentials from \"./rules/no-cors-wildcard-with-credentials.js\";\nimport noDynamicSql from \"./rules/no-dynamic-sql.js\";\nimport noEnum from \"./rules/no-enum.js\";\nimport noFatTryBlocks from \"./rules/no-fat-try-blocks.js\";\nimport noHandRolledSleep from \"./rules/no-hand-rolled-sleep.js\";\nimport noInsecureRandomId from \"./rules/no-insecure-random-id.js\";\nimport noJsonStringifyError from \"./rules/no-json-stringify-error.js\";\nimport noLogOnlyCatch from \"./rules/no-log-only-catch.js\";\nimport noOffsetPagination from \"./rules/no-offset-pagination.js\";\nimport noPositionalTupleReturn from \"./rules/no-positional-tuple-return.js\";\nimport noRawEnv from \"./rules/no-raw-env.js\";\nimport noRawFetchOutsideClients from \"./rules/no-raw-fetch-outside-clients.js\";\nimport noRepeatedStringLiteral from \"./rules/no-repeated-string-literal.js\";\nimport noRestatedComment from \"./rules/no-restated-comment.js\";\nimport noRestatedJsdoc from \"./rules/no-restated-jsdoc.js\";\nimport noSecretInLog from \"./rules/no-secret-in-log.js\";\nimport noSelectStar from \"./rules/no-select-star.js\";\nimport noSentinelReturnOnCatch from \"./rules/no-sentinel-return-on-catch.js\";\nimport noSilentPromiseCatch from \"./rules/no-silent-promise-catch.js\";\nimport noSleepInTestBody from \"./rules/no-sleep-in-test-body.js\";\nimport noStorageInStatelessModules from \"./rules/no-storage-in-stateless-modules.js\";\nimport noStringConcatInLoop from \"./rules/no-string-concat-in-loop.js\";\nimport noTautologicalExpect from \"./rules/no-tautological-expect.js\";\nimport noTrailingValueNarration from \"./rules/no-trailing-value-narration.js\";\nimport noDeclarationCommentWall from \"./rules/no-declaration-comment-wall.js\";\nimport noTypeMemberCommentWall from \"./rules/no-type-member-comment-wall.js\";\nimport noUnnecessaryUseClient from \"./rules/no-unnecessary-use-client.js\";\nimport noUnsafeMockCasting from \"./rules/no-unsafe-mock-casting.js\";\nimport noZodNativeEnum from \"./rules/no-zod-native-enum.js\";\nimport preferConstantTimeSecretCompare from \"./rules/prefer-constant-time-secret-compare.js\";\nimport preferDiscriminatedUnion from \"./rules/prefer-discriminated-union.js\";\nimport preferModuleLevelConstant from \"./rules/prefer-module-level-constant.js\";\nimport preferModuleLevelSchema from \"./rules/prefer-module-level-schema.js\";\nimport preferNonNullableCollection from \"./rules/prefer-non-nullable-collection.js\";\nimport preferSchemaForApiPayload from \"./rules/prefer-schema-for-api-payload.js\";\nimport preferSemanticColors from \"./rules/prefer-semantic-colors.js\";\nimport preferServerActions from \"./rules/prefer-server-actions.js\";\nimport preferStringLiteralUnion from \"./rules/prefer-string-literal-union.js\";\nimport preferWholeObjectAssertion from \"./rules/prefer-whole-object-assertion.js\";\nimport preferZodEnum from \"./rules/prefer-zod-enum.js\";\nimport preferZodInfer from \"./rules/prefer-zod-infer.js\";\nimport requireAssertNever from \"./rules/require-assert-never.js\";\nimport requireFetchTimeout from \"./rules/require-fetch-timeout.js\";\nimport requireInterfaceForInjectedService from \"./rules/require-interface-for-injected-service.js\";\nimport requireZodFormValidation from \"./rules/require-zod-form-validation.js\";\nimport storeInsertRequiresOnConflict from \"./rules/store-insert-requires-on-conflict.js\";\nimport zodNamingConvention from \"./rules/zod-naming-convention.js\";\nimport { renamedRules } from \"./rules/_renames.js\";\nimport { retiredRules } from \"./rules/_retired.js\";\n\nconst rules = {\n\"enforce-file-structure\": enforceFileStructure,\n \"no-async-callback-in-wait-for\": noAsyncCallbackInWaitFor,\n \"no-client-side-data-fetching\": noClientSideDataFetching,\n \"no-comment-cruft\": noCommentCruft,\n \"no-conditional-in-test\": noConditionalInTest,\n \"no-cors-wildcard-with-credentials\": noCorsWildcardWithCredentials,\n \"no-dynamic-sql\": noDynamicSql,\n \"no-enum\": noEnum,\n \"no-fat-try-blocks\": noFatTryBlocks,\n \"no-hand-rolled-sleep\": noHandRolledSleep,\n \"no-insecure-random-id\": noInsecureRandomId,\n \"no-json-stringify-error\": noJsonStringifyError,\n \"no-log-only-catch\": noLogOnlyCatch,\n \"no-offset-pagination\": noOffsetPagination,\n \"no-positional-tuple-return\": noPositionalTupleReturn,\n \"no-raw-env\": noRawEnv,\n \"no-raw-fetch-outside-clients\": noRawFetchOutsideClients,\n \"no-repeated-string-literal\": noRepeatedStringLiteral,\n \"no-restated-comment\": noRestatedComment,\n \"no-restated-jsdoc\": noRestatedJsdoc,\n \"no-secret-in-log\": noSecretInLog,\n \"no-select-star\": noSelectStar,\n \"no-sentinel-return-on-catch\": noSentinelReturnOnCatch,\n \"no-silent-promise-catch\": noSilentPromiseCatch,\n \"no-sleep-in-test-body\": noSleepInTestBody,\n \"no-storage-in-stateless-modules\": noStorageInStatelessModules,\n \"no-string-concat-in-loop\": noStringConcatInLoop,\n \"no-tautological-expect\": noTautologicalExpect,\n \"no-trailing-value-narration\": noTrailingValueNarration,\n \"no-declaration-comment-wall\": noDeclarationCommentWall,\n \"no-type-member-comment-wall\": noTypeMemberCommentWall,\n \"no-unnecessary-use-client\": noUnnecessaryUseClient,\n \"no-unsafe-mock-casting\": noUnsafeMockCasting,\n \"no-zod-native-enum\": noZodNativeEnum,\n \"prefer-constant-time-secret-compare\": preferConstantTimeSecretCompare,\n \"prefer-discriminated-union\": preferDiscriminatedUnion,\n \"prefer-module-level-constant\": preferModuleLevelConstant,\n \"prefer-module-level-schema\": preferModuleLevelSchema,\n \"prefer-non-nullable-collection\": preferNonNullableCollection,\n \"prefer-schema-for-api-payload\": preferSchemaForApiPayload,\n \"prefer-semantic-colors\": preferSemanticColors,\n \"prefer-server-actions\": preferServerActions,\n \"prefer-string-literal-union\": preferStringLiteralUnion,\n \"prefer-whole-object-assertion\": preferWholeObjectAssertion,\n \"prefer-zod-enum\": preferZodEnum,\n \"prefer-zod-infer\": preferZodInfer,\n \"require-assert-never\": requireAssertNever,\n \"require-fetch-timeout\": requireFetchTimeout,\n \"require-interface-for-injected-service\": requireInterfaceForInjectedService,\n \"require-zod-form-validation\": requireZodFormValidation,\n \"store-insert-requires-on-conflict\": storeInsertRequiresOnConflict,\n \"zod-naming-convention\": zodNamingConvention,\n};\n\nconst meta = {\n name: \"@sarj/eslint-plugin\",\n version: \"9.3.0\",\n} as const;\n\nconst recommendedRules = {\n\"@sarj/enforce-file-structure\": \"warn\",\n \"@sarj/no-async-callback-in-wait-for\": \"warn\",\n \"@sarj/no-client-side-data-fetching\": \"warn\",\n \"@sarj/no-comment-cruft\": \"warn\",\n \"@sarj/no-conditional-in-test\": \"warn\",\n \"@sarj/no-cors-wildcard-with-credentials\": \"warn\",\n \"@sarj/no-dynamic-sql\": \"warn\",\n \"@sarj/no-fat-try-blocks\": \"warn\",\n \"@sarj/no-hand-rolled-sleep\": \"warn\",\n \"@sarj/no-insecure-random-id\": \"warn\",\n \"@sarj/no-json-stringify-error\": \"warn\",\n \"@sarj/no-log-only-catch\": \"warn\",\n \"@sarj/no-offset-pagination\": \"warn\",\n \"@sarj/no-positional-tuple-return\": \"warn\",\n \"@sarj/no-repeated-string-literal\": \"warn\",\n \"@sarj/no-restated-comment\": \"warn\",\n \"@sarj/no-restated-jsdoc\": \"warn\",\n \"@sarj/no-secret-in-log\": \"warn\",\n \"@sarj/no-select-star\": \"warn\",\n \"@sarj/no-sentinel-return-on-catch\": \"warn\",\n \"@sarj/no-silent-promise-catch\": \"warn\",\n \"@sarj/no-sleep-in-test-body\": \"warn\",\n \"@sarj/no-string-concat-in-loop\": \"warn\",\n \"@sarj/no-tautological-expect\": \"warn\",\n \"@sarj/no-trailing-value-narration\": \"warn\",\n \"@sarj/no-declaration-comment-wall\": \"warn\",\n \"@sarj/no-type-member-comment-wall\": \"warn\",\n \"@sarj/no-unnecessary-use-client\": \"warn\",\n \"@sarj/no-unsafe-mock-casting\": \"warn\",\n \"@sarj/no-zod-native-enum\": \"warn\",\n \"@sarj/prefer-constant-time-secret-compare\": \"error\",\n \"@sarj/prefer-discriminated-union\": \"warn\",\n \"@sarj/prefer-module-level-constant\": \"warn\",\n \"@sarj/prefer-module-level-schema\": \"warn\",\n \"@sarj/prefer-non-nullable-collection\": \"warn\",\n \"@sarj/prefer-schema-for-api-payload\": \"warn\",\n \"@sarj/prefer-semantic-colors\": [\"warn\", { requireSemanticTokens: true }],\n \"@sarj/prefer-server-actions\": \"warn\",\n \"@sarj/prefer-string-literal-union\": \"warn\",\n \"@sarj/prefer-whole-object-assertion\": \"warn\",\n \"@sarj/prefer-zod-enum\": \"warn\",\n \"@sarj/prefer-zod-infer\": \"warn\",\n \"@sarj/require-assert-never\": \"error\",\n \"@sarj/require-fetch-timeout\": \"warn\",\n \"@sarj/require-interface-for-injected-service\": \"warn\",\n \"@sarj/require-zod-form-validation\": \"error\",\n \"@sarj/store-insert-requires-on-conflict\": \"warn\",\n \"@sarj/zod-naming-convention\": \"warn\",\n} as const;\n\nconst strictRules = {\n\"@sarj/enforce-file-structure\": \"error\",\n \"@sarj/no-async-callback-in-wait-for\": \"error\",\n \"@sarj/no-client-side-data-fetching\": \"error\",\n \"@sarj/no-comment-cruft\": \"error\",\n \"@sarj/no-conditional-in-test\": \"error\",\n \"@sarj/no-cors-wildcard-with-credentials\": \"error\",\n \"@sarj/no-dynamic-sql\": \"error\",\n \"@sarj/no-enum\": \"error\",\n \"@sarj/no-fat-try-blocks\": \"error\",\n \"@sarj/no-hand-rolled-sleep\": \"error\",\n \"@sarj/no-insecure-random-id\": \"error\",\n \"@sarj/no-json-stringify-error\": \"error\",\n \"@sarj/no-log-only-catch\": \"error\",\n \"@sarj/no-offset-pagination\": \"error\",\n \"@sarj/no-positional-tuple-return\": \"error\",\n \"@sarj/no-raw-env\": \"error\",\n \"@sarj/no-raw-fetch-outside-clients\": \"error\",\n \"@sarj/no-repeated-string-literal\": \"error\",\n \"@sarj/no-restated-comment\": \"error\",\n \"@sarj/no-restated-jsdoc\": \"error\",\n \"@sarj/no-secret-in-log\": \"error\",\n \"@sarj/no-select-star\": \"error\",\n \"@sarj/no-sentinel-return-on-catch\": \"error\",\n \"@sarj/no-silent-promise-catch\": \"error\",\n \"@sarj/no-sleep-in-test-body\": \"error\",\n \"@sarj/no-storage-in-stateless-modules\": \"error\",\n \"@sarj/no-string-concat-in-loop\": \"error\",\n \"@sarj/no-tautological-expect\": \"error\",\n \"@sarj/no-trailing-value-narration\": \"error\",\n \"@sarj/no-declaration-comment-wall\": \"error\",\n \"@sarj/no-type-member-comment-wall\": \"error\",\n \"@sarj/no-unnecessary-use-client\": \"error\",\n \"@sarj/no-unsafe-mock-casting\": \"error\",\n \"@sarj/no-zod-native-enum\": \"error\",\n \"@sarj/prefer-constant-time-secret-compare\": \"error\",\n \"@sarj/prefer-discriminated-union\": \"error\",\n \"@sarj/prefer-module-level-constant\": \"error\",\n \"@sarj/prefer-module-level-schema\": \"error\",\n \"@sarj/prefer-non-nullable-collection\": \"error\",\n \"@sarj/prefer-schema-for-api-payload\": \"error\",\n \"@sarj/prefer-semantic-colors\": [\"error\", { requireSemanticTokens: true }],\n \"@sarj/prefer-server-actions\": \"error\",\n \"@sarj/prefer-string-literal-union\": \"error\",\n \"@sarj/prefer-whole-object-assertion\": \"error\",\n \"@sarj/prefer-zod-enum\": \"error\",\n \"@sarj/prefer-zod-infer\": \"error\",\n \"@sarj/require-assert-never\": \"error\",\n \"@sarj/require-fetch-timeout\": \"error\",\n \"@sarj/require-interface-for-injected-service\": \"error\",\n \"@sarj/require-zod-form-validation\": \"error\",\n \"@sarj/store-insert-requires-on-conflict\": \"error\",\n \"@sarj/zod-naming-convention\": \"error\",\n} as const;\n\ntype FlatPreset = {\n readonly name: string;\n readonly plugins: Record<string, unknown>;\n readonly rules: Record<string, unknown>;\n};\n\n/**\n * The presets, as FLAT config objects — `plugins` is the object form, so both go\n * straight into an `eslint.config.mjs` array with no spread. Neither sets\n * `files` or a parser, so they compose with whatever a repo already has.\n */\nconst plugin = {\n meta,\n rules,\n // Withdrawn names travel WITH the plugin so a consumer's migration script and\n // this repo's gates read one map, not two. See src/rules/_retired.ts.\n retiredRules,\n configs: {\n recommended: {} as FlatPreset,\n strict: {} as FlatPreset,\n },\n};\n\nplugin.configs.recommended = {\n name: \"@sarj/recommended\",\n plugins: { \"@sarj\": plugin },\n rules: recommendedRules,\n};\n\nplugin.configs.strict = {\n name: \"@sarj/strict\",\n plugins: { \"@sarj\": plugin },\n rules: strictRules,\n};\n\nexport default plugin;\nexport { type RetiredRule, retiredRules } from \"./rules/_retired.js\";\nexport { recommendedRules, renamedRules, rules, strictRules };\n"],"mappings":"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","names":["AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","isNode","subtreeMatches","AST_NODE_TYPES","matchesAnyPattern","AST_NODE_TYPES","propName","AST_NODE_TYPES","calleeName","AST_NODE_TYPES","FUNCTION_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","FUNCTION_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","DIRECTIVE_RE","areAdjacentLineComments","AST_NODE_TYPES","AST_NODE_TYPES","DIRECTIVE_RE","STOPWORDS","WORD_RE","AST_NODE_TYPES","propertyKeyName","keyName","AST_NODE_TYPES","AST_NODE_TYPES","isNode","calleeName","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","TEST_CALLERS","FUNCTION_TYPES","AST_NODE_TYPES","nearestEnclosingFunction","testCallerName","isTestBody","AST_NODE_TYPES","DEFAULT_METHODS","compile","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","preview","WORD_RE","STOPWORDS","DIRECTIVE_RE","AST_NODE_TYPES","AST_NODE_TYPES","NON_ASCII_LETTER_RE","WORD_RE","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","named","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","ESLintUtils","AST_NODE_TYPES","unwrap","AST_NODE_TYPES","ESLintUtils","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","IGNORE_PATTERNS","FUNCTION_TYPES","AST_NODE_TYPES","isIgnoredFile","unwrap","enclosingFunction","AST_NODE_TYPES","isZodModule","FUNCTION_TYPES","AST_NODE_TYPES","isZodModule","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","unwrap","AST_NODE_TYPES","findVariable","AST_NODE_TYPES","AST_NODE_TYPES","propName","keyName","ESLintUtils","AST_NODE_TYPES","ts","IGNORE_PATTERNS","isIgnoredFile","AST_NODE_TYPES","NUMERIC_SIGNS","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","isZodModule","AST_NODE_TYPES","AST_NODE_TYPES","isZodModule","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","ASTUtils","GLOBAL_OBJECTS","matchesAnyPattern","AST_NODE_TYPES","ASTUtils","isGlobalFetchCall","AST_NODE_TYPES","AST_NODE_TYPES","named","stem","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES"]}
|