@sarj/eslint-plugin 9.6.0 → 9.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -4,10 +4,10 @@ import { AST_NODE_TYPES } from "@typescript-eslint/utils";
4
4
  // src/rules/_docs.ts
5
5
  import { ESLintUtils } from "@typescript-eslint/utils";
6
6
  var REPO_BLOB = "https://github.com/sarj-ai/standards/blob/main";
7
- var EVIDENCE_DIR = "docs/rules";
8
- var evidencePath = (name) => `${EVIDENCE_DIR}/${name}.md`;
9
- var evidenceUrl = (name) => `${REPO_BLOB}/${evidencePath(name)}`;
10
- var createRule = ESLintUtils.RuleCreator(evidenceUrl);
7
+ var TESTS_DIR = "packages/typescript/tests/rules";
8
+ var examplesPath = (name) => `${TESTS_DIR}/${name}.test.ts`;
9
+ var examplesUrl = (name) => `${REPO_BLOB}/${examplesPath(name)}`;
10
+ var createRule = ESLintUtils.RuleCreator(examplesUrl);
11
11
 
12
12
  // src/rules/_paths.ts
13
13
  var SCRIPT_FILE_RE = /([\\/]scripts[\\/])|(\.mjs$)/;
@@ -92,8 +92,8 @@ var enforce_file_structure_default = createRule({
92
92
  }
93
93
  return {
94
94
  Program(node) {
95
- const body = node.body;
96
- const misplacedUseServer = body.find(
95
+ const body2 = node.body;
96
+ const misplacedUseServer = body2.find(
97
97
  (statement, index) => index > 0 && isUseServerDirective(statement)
98
98
  );
99
99
  if (misplacedUseServer !== void 0) {
@@ -104,7 +104,7 @@ var enforce_file_structure_default = createRule({
104
104
  }
105
105
  let seenBody = false;
106
106
  let inMisplacedRun = false;
107
- for (const statement of body) {
107
+ for (const statement of body2) {
108
108
  if (isStringDirective(statement)) continue;
109
109
  switch (classifyStatement(statement)) {
110
110
  case "reexport":
@@ -325,11 +325,11 @@ var PROTECTED_SIGNALS = [
325
325
  SECURITY_RE,
326
326
  VENDOR_RE
327
327
  ];
328
- function isProtected(body) {
329
- return PROTECTED_SIGNALS.some((signal) => signal.test(body));
328
+ function isProtected(body2) {
329
+ return PROTECTED_SIGNALS.some((signal) => signal.test(body2));
330
330
  }
331
- function hasExternalReference(body) {
332
- return REF_RE.test(body);
331
+ function hasExternalReference(body2) {
332
+ return REF_RE.test(body2);
333
333
  }
334
334
  var STOPWORDS = new Set(
335
335
  `a an the this that these those it its their his her our your my
@@ -477,9 +477,9 @@ function restatableStatementBelow(comment, sourceCode) {
477
477
  }
478
478
  return null;
479
479
  }
480
- function restatesStatementHead(body, statement) {
480
+ function restatesStatementHead(body2, statement) {
481
481
  if (statement === null) return false;
482
- const words = body.match(/[A-Za-z][\w$]*/g) ?? [];
482
+ const words = body2.match(/[A-Za-z][\w$]*/g) ?? [];
483
483
  const opener = words[0];
484
484
  if (opener === void 0 || words.length > NARRATION_MAX_WORDS) return false;
485
485
  if (!NARRATION_VERB_RE.test(opener)) return false;
@@ -678,11 +678,11 @@ function isProse(text) {
678
678
  return false;
679
679
  }
680
680
  var JUSTIFICATION_RE = /\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;
681
- function restatesWholeStatement(body, statement) {
682
- return statement !== null && restatesStatementHead(body, statement.replaceAll("(", " "));
681
+ function restatesWholeStatement(body2, statement) {
682
+ return statement !== null && restatesStatementHead(body2, statement.replaceAll("(", " "));
683
683
  }
684
- function isRedundantNarration(body, statementBelow, standalone, isolatedEnumeration, nested) {
685
- const t = body.trim();
684
+ function isRedundantNarration(body2, statementBelow, standalone, isolatedEnumeration, nested) {
685
+ const t = body2.trim();
686
686
  if (!t || looksLikeCode(t) || hasPseudocode(t)) return false;
687
687
  if (standalone) {
688
688
  const justified = JUSTIFICATION_RE.test(t);
@@ -757,8 +757,8 @@ function statementAttachmentBelow(comment, sourceCode) {
757
757
  }
758
758
  return null;
759
759
  }
760
- function isWeakWalkthroughComment(body, statement) {
761
- const normalized = body.replace(WALL_STEP_PREFIX_RE, "");
760
+ function isWeakWalkthroughComment(body2, statement) {
761
+ const normalized = body2.replace(WALL_STEP_PREFIX_RE, "");
762
762
  if (normalized.length === 0 || normalized.endsWith("?") || normalized.split(/\s+/).length > WALL_MAX_WORDS || isDirective(normalized) || isProtected(normalized) || !WALL_NARRATION_RE.test(normalized)) {
763
763
  return false;
764
764
  }
@@ -795,8 +795,8 @@ var LEAD_IN_SCAN_LIMIT = 24;
795
795
  function hasIllustrationLeadInAbove(comments, index) {
796
796
  for (let i = index - 1; i >= 0 && index - i <= LEAD_IN_SCAN_LIMIT; i--) {
797
797
  if (!areAdjacentLineComments(comments[i], comments[i + 1])) return false;
798
- const body = stripCommentMarker(comments[i]?.value ?? "");
799
- if (body.length > 0 && body.endsWith(":")) return true;
798
+ const body2 = stripCommentMarker(comments[i]?.value ?? "");
799
+ if (body2.length > 0 && body2.endsWith(":")) return true;
800
800
  }
801
801
  return false;
802
802
  }
@@ -850,12 +850,12 @@ var no_comment_cruft_default = createRule({
850
850
  if (comment.type !== "Line" || !isStandalone(comment)) continue;
851
851
  const attachment = statementAttachmentBelow(comment, sourceCode);
852
852
  if (attachment === null) continue;
853
- const body = stripCommentMarker(comment.value);
853
+ const body2 = stripCommentMarker(comment.value);
854
854
  const entries = attached.get(attachment.container) ?? [];
855
855
  entries.push({
856
856
  comment,
857
857
  index: attachment.index,
858
- weak: isWeakWalkthroughComment(body, attachment.statement)
858
+ weak: isWeakWalkthroughComment(body2, attachment.statement)
859
859
  });
860
860
  attached.set(attachment.container, entries);
861
861
  }
@@ -899,8 +899,8 @@ var no_comment_cruft_default = createRule({
899
899
  if (comment.type !== "Line") break;
900
900
  if (comment.loc.start.line >= firstCodeLine) break;
901
901
  if (!isStandalone(comment)) break;
902
- const body = stripCommentMarker(comment.value);
903
- if (isDirective(body) || body.startsWith("!")) continue;
902
+ const body2 = stripCommentMarker(comment.value);
903
+ if (isDirective(body2) || body2.startsWith("!")) continue;
904
904
  if (prevLine !== null && comment.loc.start.line !== prevLine + 1) break;
905
905
  leading.push(comment);
906
906
  prevLine = comment.loc.start.line;
@@ -908,8 +908,8 @@ var no_comment_cruft_default = createRule({
908
908
  const first = leading[0];
909
909
  if (first === void 0 || leading.length < LEADING_PREAMBLE_MIN) return;
910
910
  const bodies = leading.map((c) => stripCommentMarker(c.value));
911
- if (bodies.some((body) => LICENSE_RE.test(body))) return;
912
- if (bodies.some((body) => isProse(body))) return;
911
+ if (bodies.some((body2) => LICENSE_RE.test(body2))) return;
912
+ if (bodies.some((body2) => isProse(body2))) return;
913
913
  if (bodies.filter(isEnumeratedProseItem).length >= ENUMERATED_PREAMBLE_MIN_ITEMS) {
914
914
  return;
915
915
  }
@@ -970,11 +970,11 @@ var no_comment_cruft_default = createRule({
970
970
  continue;
971
971
  }
972
972
  if (comment.type === "Line" && texts.length === 1) {
973
- const body = texts[0];
973
+ const body2 = texts[0];
974
974
  const statement = restatableStatementBelow(comment, sourceCode);
975
975
  const standalone = !isInsideCommentRun(comments, i);
976
976
  const nested = container !== null && !STATEMENT_CONTAINERS.has(container.type);
977
- if (body !== void 0 && !runCitesAReference(comments, i) && isRedundantNarration(body, statement, standalone, enumerated.length === 1, nested)) {
977
+ if (body2 !== void 0 && !runCitesAReference(comments, i) && isRedundantNarration(body2, statement, standalone, enumerated.length === 1, nested)) {
978
978
  context.report({ node: comment, messageId: "redundantNarration" });
979
979
  }
980
980
  }
@@ -988,11 +988,12 @@ var no_comment_cruft_default = createRule({
988
988
  // src/rules/no-conditional-in-test.ts
989
989
  import { AST_NODE_TYPES as AST_NODE_TYPES6 } from "@typescript-eslint/utils";
990
990
  var TEST_CALLERS = /* @__PURE__ */ new Set(["it", "test"]);
991
- var HOOK_MEMBERS = /* @__PURE__ */ new Set([
991
+ var NON_TEST_MEMBERS = /* @__PURE__ */ new Set([
992
992
  "afterAll",
993
993
  "afterEach",
994
994
  "beforeAll",
995
- "beforeEach"
995
+ "beforeEach",
996
+ "describe"
996
997
  ]);
997
998
  var FUNCTION_TYPES = /* @__PURE__ */ new Set([
998
999
  AST_NODE_TYPES6.FunctionDeclaration,
@@ -1032,12 +1033,27 @@ function testCallerName(callee) {
1032
1033
  }
1033
1034
  return null;
1034
1035
  }
1036
+ function hasNonTestMember(callee) {
1037
+ if (callee.type === AST_NODE_TYPES6.MemberExpression) {
1038
+ if (!callee.computed && callee.property.type === AST_NODE_TYPES6.Identifier && NON_TEST_MEMBERS.has(callee.property.name)) {
1039
+ return true;
1040
+ }
1041
+ return hasNonTestMember(callee.object);
1042
+ }
1043
+ if (callee.type === AST_NODE_TYPES6.CallExpression) {
1044
+ return hasNonTestMember(callee.callee);
1045
+ }
1046
+ if (callee.type === AST_NODE_TYPES6.TaggedTemplateExpression) {
1047
+ return hasNonTestMember(callee.tag);
1048
+ }
1049
+ return false;
1050
+ }
1035
1051
  function isTestBody(fn) {
1036
1052
  const call = fn.parent;
1037
1053
  if (call?.type !== AST_NODE_TYPES6.CallExpression || !call.arguments.some((argument) => argument === fn)) {
1038
1054
  return false;
1039
1055
  }
1040
- if (call.callee.type === AST_NODE_TYPES6.MemberExpression && !call.callee.computed && call.callee.property.type === AST_NODE_TYPES6.Identifier && HOOK_MEMBERS.has(call.callee.property.name)) {
1056
+ if (hasNonTestMember(call.callee)) {
1041
1057
  return false;
1042
1058
  }
1043
1059
  const name = testCallerName(call.callee);
@@ -1763,6 +1779,7 @@ var no_enum_default = createRule({
1763
1779
  properties: {
1764
1780
  ignoreFiles: {
1765
1781
  type: "array",
1782
+ description: "Additional generated-file globs to ignore; shared generated paths and header markers are always ignored.",
1766
1783
  items: { type: "string" }
1767
1784
  }
1768
1785
  }
@@ -1972,8 +1989,8 @@ function handlerRethrows(handler) {
1972
1989
  if (handler === null) {
1973
1990
  return false;
1974
1991
  }
1975
- const body = handler.body.body;
1976
- const last = body[body.length - 1];
1992
+ const body2 = handler.body.body;
1993
+ const last = body2[body2.length - 1];
1977
1994
  return last !== void 0 && last.type === AST_NODE_TYPES9.ThrowStatement;
1978
1995
  }
1979
1996
  var PASS_THROUGH_PARENTS = /* @__PURE__ */ new Set([
@@ -2007,8 +2024,8 @@ function unwrapAwait(expr) {
2007
2024
  return inner.type === AST_NODE_TYPES9.AwaitExpression ? unwrap(inner.argument) : inner;
2008
2025
  }
2009
2026
  function handlerEndsByHandingOff(handler) {
2010
- const body = handler.body.body;
2011
- const last = body[body.length - 1];
2027
+ const body2 = handler.body.body;
2028
+ const last = body2[body2.length - 1];
2012
2029
  if (last === void 0) {
2013
2030
  return false;
2014
2031
  }
@@ -2582,8 +2599,8 @@ function negatedInstanceofErrorSubject(test) {
2582
2599
  return null;
2583
2600
  }
2584
2601
  function branchTerminates(branch) {
2585
- const body = branch.type === "BlockStatement" ? branch.body : [branch];
2586
- const last = body[body.length - 1];
2602
+ const body2 = branch.type === "BlockStatement" ? branch.body : [branch];
2603
+ const last = body2[body2.length - 1];
2587
2604
  return last !== void 0 && (last.type === "ReturnStatement" || last.type === "ThrowStatement");
2588
2605
  }
2589
2606
  function isNarrowedByEarlyReturn(node, argExpr, sourceCode) {
@@ -2835,8 +2852,8 @@ function hasFollowingStatement(node) {
2835
2852
  return false;
2836
2853
  }
2837
2854
  function fallbackFollowsTry(tryStatement) {
2838
- const body = tryStatement.block.body;
2839
- const last = body.at(-1);
2855
+ const body2 = tryStatement.block.body;
2856
+ const last = body2.at(-1);
2840
2857
  return last?.type === AST_NODE_TYPES11.ReturnStatement && hasFollowingStatement(tryStatement);
2841
2858
  }
2842
2859
  function isSeedValue(node) {
@@ -2953,6 +2970,123 @@ var no_log_only_catch_default = createRule({
2953
2970
  }
2954
2971
  });
2955
2972
 
2973
+ // src/rules/_prose-budget.ts
2974
+ import { AST_NODE_TYPES as AST_NODE_TYPES12 } from "@typescript-eslint/utils";
2975
+ var DIRECTIVE_RE2 = /^(?:!|eslint\b|eslint-|@ts-|prettier|biome-|c8\b|v8\b|istanbul\b|@vite|webpack|@jsx|@jest-environment|@vitest-environment|#__|todo\b|fixme\b|hack\b)/i;
2976
+ var LICENSE_RE2 = /\b(?:copyright|spdx-license-identifier|licensed under)\b/i;
2977
+ var TYPED_TAG_RE = /@(arg|argument|param|return|returns|yield|yields)\b/i;
2978
+ var VALUE_TAG_RE = /@(example|deprecated|see|remarks|throws|internal|public|alpha|beta|since|template|fileoverview)\b/i;
2979
+ var BOUNDARY_RE = /(?<=[.!?])["'`)\]]*\s+(?=[A-Z0-9`])/;
2980
+ var BULLET_RE = /^\s*(?:[-*+] |\d+[.)] )/;
2981
+ function body(comment) {
2982
+ return comment.value.replace(/^\*/, "").split("\n").map((line) => line.replace(/^\s*\*?\s?/, "")).join("\n").trim();
2983
+ }
2984
+ function eligible(text, includeValueTags) {
2985
+ return text.length > 0 && !DIRECTIVE_RE2.test(text) && !LICENSE_RE2.test(text) && (includeValueTags || !VALUE_TAG_RE.test(text));
2986
+ }
2987
+ function sentenceUnits(text) {
2988
+ const cleaned = text.replace(/https?:\/\/\S+/g, "URL").replace(/`[^`\n]+`/g, "CODE").replace(/\b\d+\.\d+\b/g, "NUMBER").replace(/\b(?:e\.g\.|i\.e\.|vs\.|etc\.)/gi, "ABBREVIATION");
2989
+ let units = 0;
2990
+ const prose = [];
2991
+ for (const raw of cleaned.split("\n")) {
2992
+ const line = raw.trim();
2993
+ if (line.length === 0 || /^[A-Za-z][A-Za-z ]+:$/.test(line)) continue;
2994
+ if (BULLET_RE.test(line)) units += 1;
2995
+ else prose.push(line);
2996
+ }
2997
+ if (prose.length > 0) units += prose.join(" ").split(BOUNDARY_RE).length;
2998
+ return units;
2999
+ }
3000
+ function proseGroups(filename, sourceCode, includeValueTags = false) {
3001
+ if (isGeneratedFile(filename, sourceCode.text) || isStoryFile(filename)) return [];
3002
+ const groups = [];
3003
+ let run = [];
3004
+ const flush = () => {
3005
+ if (run.length === 0) return;
3006
+ const text = run.map(body).join("\n");
3007
+ if (eligible(text, includeValueTags)) groups.push({ comment: run[0], text, hasTypedTags: TYPED_TAG_RE.test(text) });
3008
+ run = [];
3009
+ };
3010
+ for (const comment of sourceCode.getAllComments()) {
3011
+ const text = body(comment);
3012
+ if (comment.type === "Block") {
3013
+ flush();
3014
+ if (eligible(text, includeValueTags)) groups.push({ comment, text, hasTypedTags: TYPED_TAG_RE.test(text) });
3015
+ continue;
3016
+ }
3017
+ const ownLine = sourceCode.lines[comment.loc.start.line - 1]?.slice(0, comment.loc.start.column).trim() === "";
3018
+ if (!ownLine || !eligible(text, includeValueTags)) {
3019
+ flush();
3020
+ continue;
3021
+ }
3022
+ const previous = run.at(-1);
3023
+ if (previous !== void 0 && (comment.loc.start.line !== previous.loc.end.line + 1 || comment.loc.start.column !== previous.loc.start.column)) flush();
3024
+ run.push(comment);
3025
+ }
3026
+ flush();
3027
+ return groups;
3028
+ }
3029
+ function annotatedParameter(parameter) {
3030
+ if (parameter.type === AST_NODE_TYPES12.TSParameterProperty) return annotatedParameter(parameter.parameter);
3031
+ const target = parameter.type === AST_NODE_TYPES12.AssignmentPattern ? parameter.left : parameter;
3032
+ return "typeAnnotation" in target && target.typeAnnotation != null;
3033
+ }
3034
+ function typedFunction(node) {
3035
+ switch (node.type) {
3036
+ case AST_NODE_TYPES12.ExportNamedDeclaration:
3037
+ case AST_NODE_TYPES12.ExportDefaultDeclaration:
3038
+ return node.declaration != null && typedFunction(node.declaration);
3039
+ case AST_NODE_TYPES12.FunctionDeclaration:
3040
+ case AST_NODE_TYPES12.TSDeclareFunction:
3041
+ return node.returnType != null && node.params.every(annotatedParameter);
3042
+ case AST_NODE_TYPES12.VariableDeclaration: {
3043
+ const init = node.declarations[0]?.init;
3044
+ return init != null && (init.type === AST_NODE_TYPES12.ArrowFunctionExpression || init.type === AST_NODE_TYPES12.FunctionExpression) && init.returnType != null && init.params.every(annotatedParameter);
3045
+ }
3046
+ case AST_NODE_TYPES12.MethodDefinition:
3047
+ return node.value.returnType != null && node.value.params.every(annotatedParameter);
3048
+ case AST_NODE_TYPES12.TSMethodSignature:
3049
+ return node.returnType != null && node.params.every(annotatedParameter);
3050
+ default:
3051
+ return false;
3052
+ }
3053
+ }
3054
+ function documentsTypedFunction(sourceCode, comment) {
3055
+ const token = sourceCode.getTokenAfter(comment, { includeComments: false });
3056
+ if (token === null || token.loc.start.line !== comment.loc.end.line + 1) return false;
3057
+ let node = sourceCode.getNodeByRangeIndex(token.range[0]);
3058
+ while (node != null && node.type !== AST_NODE_TYPES12.Program) {
3059
+ if (typedFunction(node)) return true;
3060
+ node = node.parent ?? null;
3061
+ }
3062
+ return false;
3063
+ }
3064
+
3065
+ // src/rules/no-long-comment.ts
3066
+ var no_long_comment_default = createRule({
3067
+ name: "no-long-comment",
3068
+ meta: {
3069
+ type: "suggestion",
3070
+ docs: { description: "Limit in-code prose to two sentences." },
3071
+ schema: [],
3072
+ messages: {
3073
+ tooLong: "Comment exceeds two sentences \u2014 keep one local fact and clarify the code itself."
3074
+ }
3075
+ },
3076
+ defaultOptions: [],
3077
+ create(context) {
3078
+ return {
3079
+ Program() {
3080
+ for (const group of proseGroups(context.filename, context.sourceCode)) {
3081
+ if (!group.hasTypedTags && sentenceUnits(group.text) >= 3) {
3082
+ context.report({ node: group.comment, messageId: "tooLong" });
3083
+ }
3084
+ }
3085
+ }
3086
+ };
3087
+ }
3088
+ });
3089
+
2956
3090
  // src/rules/no-offset-pagination.ts
2957
3091
  import "@typescript-eslint/utils";
2958
3092
  var OFFSET_PAGINATION = /\bOFFSET\s+(?:%s|%\(\w+\)s|\?\d*|:\w+|@\w+|\$\d+|\d+)/i;
@@ -2984,15 +3118,15 @@ var no_offset_pagination_default = createRule({
2984
3118
  });
2985
3119
 
2986
3120
  // src/rules/no-positional-tuple-return.ts
2987
- import { AST_NODE_TYPES as AST_NODE_TYPES12 } from "@typescript-eslint/utils";
3121
+ import { AST_NODE_TYPES as AST_NODE_TYPES13 } from "@typescript-eslint/utils";
2988
3122
  var MIN_ELEMENTS = 2;
2989
3123
  var ACCESSOR_PAIR_LENGTH = 2;
2990
3124
  var AWAITABLE_TYPES = /* @__PURE__ */ new Set(["Promise", "PromiseLike", "Awaited"]);
2991
3125
  function tupleReturnType(node) {
2992
- if (node.type === AST_NODE_TYPES12.TSTupleType) {
3126
+ if (node.type === AST_NODE_TYPES13.TSTupleType) {
2993
3127
  return node;
2994
3128
  }
2995
- if (node.type === AST_NODE_TYPES12.TSTypeReference && node.typeName.type === AST_NODE_TYPES12.Identifier && AWAITABLE_TYPES.has(node.typeName.name)) {
3129
+ if (node.type === AST_NODE_TYPES13.TSTypeReference && node.typeName.type === AST_NODE_TYPES13.Identifier && AWAITABLE_TYPES.has(node.typeName.name)) {
2996
3130
  const argument = node.typeArguments?.params[0];
2997
3131
  return argument === void 0 ? null : tupleReturnType(argument);
2998
3132
  }
@@ -3006,30 +3140,30 @@ function isPermittedTuple(tuple, sourceCode) {
3006
3140
  if (elements.length < MIN_ELEMENTS) {
3007
3141
  return true;
3008
3142
  }
3009
- if (elements.some((element) => element.type === AST_NODE_TYPES12.TSRestType)) {
3143
+ if (elements.some((element) => element.type === AST_NODE_TYPES13.TSRestType)) {
3010
3144
  return true;
3011
3145
  }
3012
- if (elements.some((element) => element.type === AST_NODE_TYPES12.TSNamedTupleMember)) {
3146
+ if (elements.some((element) => element.type === AST_NODE_TYPES13.TSNamedTupleMember)) {
3013
3147
  return true;
3014
3148
  }
3015
- if (elements[0]?.type === AST_NODE_TYPES12.TSLiteralType) {
3149
+ if (elements[0]?.type === AST_NODE_TYPES13.TSLiteralType) {
3016
3150
  return true;
3017
3151
  }
3018
- if (elements.length === ACCESSOR_PAIR_LENGTH && elements.some((element) => element.type === AST_NODE_TYPES12.TSFunctionType)) {
3152
+ if (elements.length === ACCESSOR_PAIR_LENGTH && elements.some((element) => element.type === AST_NODE_TYPES13.TSFunctionType)) {
3019
3153
  return true;
3020
3154
  }
3021
3155
  const texts = new Set(elements.map((element) => normalizedText(sourceCode, element)));
3022
3156
  return texts.size === 1;
3023
3157
  }
3024
3158
  function functionName(node) {
3025
- if (node.type === AST_NODE_TYPES12.FunctionDeclaration) {
3159
+ if (node.type === AST_NODE_TYPES13.FunctionDeclaration) {
3026
3160
  return node.id?.name ?? null;
3027
3161
  }
3028
3162
  const parent = node.parent;
3029
- if (parent?.type === AST_NODE_TYPES12.VariableDeclarator && parent.id.type === AST_NODE_TYPES12.Identifier) {
3163
+ if (parent?.type === AST_NODE_TYPES13.VariableDeclarator && parent.id.type === AST_NODE_TYPES13.Identifier) {
3030
3164
  return parent.id.name;
3031
3165
  }
3032
- if ((parent?.type === AST_NODE_TYPES12.MethodDefinition || parent?.type === AST_NODE_TYPES12.PropertyDefinition || parent?.type === AST_NODE_TYPES12.Property) && parent.key.type === AST_NODE_TYPES12.Identifier) {
3166
+ if ((parent?.type === AST_NODE_TYPES13.MethodDefinition || parent?.type === AST_NODE_TYPES13.PropertyDefinition || parent?.type === AST_NODE_TYPES13.Property) && parent.key.type === AST_NODE_TYPES13.Identifier) {
3033
3167
  return parent.key.name;
3034
3168
  }
3035
3169
  return null;
@@ -3037,7 +3171,7 @@ function functionName(node) {
3037
3171
  function isInlineExported(node) {
3038
3172
  for (let current = node; current != null; current = current.parent) {
3039
3173
  const parent = current.parent;
3040
- if (parent?.type === AST_NODE_TYPES12.ExportNamedDeclaration || parent?.type === AST_NODE_TYPES12.ExportDefaultDeclaration) {
3174
+ if (parent?.type === AST_NODE_TYPES13.ExportNamedDeclaration || parent?.type === AST_NODE_TYPES13.ExportDefaultDeclaration) {
3041
3175
  return true;
3042
3176
  }
3043
3177
  }
@@ -3046,18 +3180,18 @@ function isInlineExported(node) {
3046
3180
  function moduleScopeBindingName(node) {
3047
3181
  let current = node;
3048
3182
  let child = node;
3049
- while (current.parent != null && current.parent.type !== AST_NODE_TYPES12.Program) {
3183
+ while (current.parent != null && current.parent.type !== AST_NODE_TYPES13.Program) {
3050
3184
  child = current;
3051
3185
  current = current.parent;
3052
3186
  }
3053
- if (current.parent?.type !== AST_NODE_TYPES12.Program) {
3187
+ if (current.parent?.type !== AST_NODE_TYPES13.Program) {
3054
3188
  return null;
3055
3189
  }
3056
- if (current.type === AST_NODE_TYPES12.FunctionDeclaration || current.type === AST_NODE_TYPES12.ClassDeclaration) {
3190
+ if (current.type === AST_NODE_TYPES13.FunctionDeclaration || current.type === AST_NODE_TYPES13.ClassDeclaration) {
3057
3191
  return current.id?.name ?? null;
3058
3192
  }
3059
- if (current.type === AST_NODE_TYPES12.VariableDeclaration) {
3060
- if (child.type !== AST_NODE_TYPES12.VariableDeclarator || child.id.type !== AST_NODE_TYPES12.Identifier) {
3193
+ if (current.type === AST_NODE_TYPES13.VariableDeclaration) {
3194
+ if (child.type !== AST_NODE_TYPES13.VariableDeclarator || child.id.type !== AST_NODE_TYPES13.Identifier) {
3061
3195
  return null;
3062
3196
  }
3063
3197
  return child.id.name;
@@ -3067,19 +3201,19 @@ function moduleScopeBindingName(node) {
3067
3201
  function specifierExportedNames(program) {
3068
3202
  const names = /* @__PURE__ */ new Set();
3069
3203
  for (const statement of program.body) {
3070
- if (statement.type === AST_NODE_TYPES12.ExportNamedDeclaration && statement.declaration == null && statement.source == null && statement.exportKind !== "type") {
3204
+ if (statement.type === AST_NODE_TYPES13.ExportNamedDeclaration && statement.declaration == null && statement.source == null && statement.exportKind !== "type") {
3071
3205
  for (const specifier of statement.specifiers) {
3072
- if (specifier.exportKind !== "type" && specifier.local.type === AST_NODE_TYPES12.Identifier) {
3206
+ if (specifier.exportKind !== "type" && specifier.local.type === AST_NODE_TYPES13.Identifier) {
3073
3207
  names.add(specifier.local.name);
3074
3208
  }
3075
3209
  }
3076
3210
  continue;
3077
3211
  }
3078
- if (statement.type === AST_NODE_TYPES12.ExportDefaultDeclaration && statement.declaration.type === AST_NODE_TYPES12.Identifier) {
3212
+ if (statement.type === AST_NODE_TYPES13.ExportDefaultDeclaration && statement.declaration.type === AST_NODE_TYPES13.Identifier) {
3079
3213
  names.add(statement.declaration.name);
3080
3214
  continue;
3081
3215
  }
3082
- if (statement.type === AST_NODE_TYPES12.TSExportAssignment && statement.expression.type === AST_NODE_TYPES12.Identifier) {
3216
+ if (statement.type === AST_NODE_TYPES13.TSExportAssignment && statement.expression.type === AST_NODE_TYPES13.Identifier) {
3083
3217
  names.add(statement.expression.name);
3084
3218
  }
3085
3219
  }
@@ -3191,11 +3325,11 @@ var no_raw_env_default = createRule({
3191
3325
  meta: {
3192
3326
  type: "problem",
3193
3327
  docs: {
3194
- description: "Disallow direct `process.env` access; use a Zod-validated env module instead."
3328
+ description: "Disallow direct `process.env` and `import.meta.env` reads outside validated boundaries."
3195
3329
  },
3196
3330
  schema: [],
3197
3331
  messages: {
3198
- noRawEnv: "Do not read from `process.env` directly. Import the Zod-validated env module instead so values are typed and validated at startup."
3332
+ noRawEnv: "Do not read raw environment values directly. Import the validated env module so values are typed and checked at startup."
3199
3333
  }
3200
3334
  },
3201
3335
  defaultOptions: [],
@@ -3218,13 +3352,11 @@ var no_raw_env_default = createRule({
3218
3352
  });
3219
3353
 
3220
3354
  // src/rules/no-raw-fetch-outside-clients.ts
3221
- import { AST_NODE_TYPES as AST_NODE_TYPES13 } from "@typescript-eslint/utils";
3355
+ import { AST_NODE_TYPES as AST_NODE_TYPES14 } from "@typescript-eslint/utils";
3222
3356
  var DEFAULT_ALLOW = [
3223
3357
  "[\\\\/]clients?[\\\\/]",
3224
3358
  "-client\\.[cm]?[jt]sx?$",
3225
3359
  "[\\\\/]http-client\\.[cm]?[jt]sx?$",
3226
- // The `api` spelling of the same client-layer convention: an `api/` directory,
3227
- // a bare `api.ts`, or a `*-api.ts` / `*.api.ts` module.
3228
3360
  "[\\\\/]api[\\\\/]",
3229
3361
  "[\\\\/]api\\.[cm]?[jt]sx?$",
3230
3362
  "[-.]api\\.[cm]?[jt]sx?$",
@@ -3262,7 +3394,7 @@ function identifierLikeName(node) {
3262
3394
  }
3263
3395
  function isConstructedArgumentHandoff(node) {
3264
3396
  const [first] = node.arguments;
3265
- return node.arguments.length === 1 && first !== void 0 && first.type === AST_NODE_TYPES13.NewExpression;
3397
+ return node.arguments.length === 1 && first !== void 0 && first.type === AST_NODE_TYPES14.NewExpression;
3266
3398
  }
3267
3399
  function isPresignedUrlTransfer(node) {
3268
3400
  const first = node.arguments[0];
@@ -3331,16 +3463,16 @@ var no_raw_fetch_outside_clients_default = createRule({
3331
3463
  });
3332
3464
 
3333
3465
  // src/rules/no-repeated-string-literal.ts
3334
- import { AST_NODE_TYPES as AST_NODE_TYPES14 } from "@typescript-eslint/utils";
3466
+ import { AST_NODE_TYPES as AST_NODE_TYPES15 } from "@typescript-eslint/utils";
3335
3467
  var MIN_LENGTH = 40;
3336
3468
  var MIN_DISTINCT_SCOPES = 2;
3337
3469
  var PREVIEW_LENGTH = 40;
3338
3470
  var SQL_KEYWORD_RE = /\b(SELECT|INSERT|UPDATE|DELETE|FROM|WHERE|JOIN|VALUES|ON CONFLICT|RETURNING|GROUP BY|ORDER BY)\b/;
3339
3471
  var IDENTIFIER_RE = /^[a-z_][a-z0-9_.]*$/;
3340
3472
  var FUNCTION_TYPES3 = /* @__PURE__ */ new Set([
3341
- AST_NODE_TYPES14.FunctionDeclaration,
3342
- AST_NODE_TYPES14.FunctionExpression,
3343
- AST_NODE_TYPES14.ArrowFunctionExpression
3473
+ AST_NODE_TYPES15.FunctionDeclaration,
3474
+ AST_NODE_TYPES15.FunctionExpression,
3475
+ AST_NODE_TYPES15.ArrowFunctionExpression
3344
3476
  ]);
3345
3477
  function isStructured(value) {
3346
3478
  return value.includes("\n") || SQL_KEYWORD_RE.test(value) || IDENTIFIER_RE.test(value);
@@ -3362,7 +3494,8 @@ function isScaffolding(node) {
3362
3494
  if (parent === void 0) {
3363
3495
  return true;
3364
3496
  }
3365
- return parent.type === AST_NODE_TYPES14.ImportDeclaration || parent.type === AST_NODE_TYPES14.ExportNamedDeclaration || parent.type === AST_NODE_TYPES14.ExportAllDeclaration || parent.type === AST_NODE_TYPES14.TSImportType || parent.type === AST_NODE_TYPES14.JSXAttribute || parent.type === AST_NODE_TYPES14.TSLiteralType;
3497
+ const isRequireSource = parent.type === AST_NODE_TYPES15.CallExpression && parent.callee.type === AST_NODE_TYPES15.Identifier && parent.callee.name === "require";
3498
+ return parent.type === AST_NODE_TYPES15.ImportDeclaration || parent.type === AST_NODE_TYPES15.ImportExpression || parent.type === AST_NODE_TYPES15.ExportNamedDeclaration || parent.type === AST_NODE_TYPES15.ExportAllDeclaration || parent.type === AST_NODE_TYPES15.TSImportType || parent.type === AST_NODE_TYPES15.JSXAttribute || parent.type === AST_NODE_TYPES15.TSLiteralType || isRequireSource;
3366
3499
  }
3367
3500
  var no_repeated_string_literal_default = createRule({
3368
3501
  name: "no-repeated-string-literal",
@@ -3402,7 +3535,7 @@ var no_repeated_string_literal_default = createRule({
3402
3535
  }
3403
3536
  },
3404
3537
  TemplateLiteral(node) {
3405
- if (node.parent.type === AST_NODE_TYPES14.TaggedTemplateExpression) {
3538
+ if (node.parent.type === AST_NODE_TYPES15.TaggedTemplateExpression) {
3406
3539
  return;
3407
3540
  }
3408
3541
  const [only] = node.quasis;
@@ -3436,10 +3569,10 @@ var no_repeated_string_literal_default = createRule({
3436
3569
  });
3437
3570
 
3438
3571
  // src/rules/no-restated-comment.ts
3439
- import { AST_NODE_TYPES as AST_NODE_TYPES15 } from "@typescript-eslint/utils";
3572
+ import { AST_NODE_TYPES as AST_NODE_TYPES16 } from "@typescript-eslint/utils";
3440
3573
  var MAX_WORDS = 8;
3441
3574
  var MIN_CONTENT_TOKENS = 2;
3442
- var DIRECTIVE_RE2 = /^(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;
3575
+ var DIRECTIVE_RE3 = /^(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;
3443
3576
  var CODEY_RE = /^[\w.$[\]'"]+\s*[:=]\s*\S|^[\w.$]+\s*\(|^(?:return|throw|await|import|export|const|let|var)\b.*[=()[\]{}]/;
3444
3577
  var BANNERISH_RE = /[=\-─-╿*#~_.]{3,}|^[A-Z0-9 _:-]+$/;
3445
3578
  var MODALITY_RE = /\b(?:can|could|should|shall|may|might|must|will|would|cannot)\b/i;
@@ -3457,10 +3590,10 @@ function areAdjacentLineComments2(a, b) {
3457
3590
  function headsSiblingRun(node) {
3458
3591
  const parent = node.parent;
3459
3592
  if (parent === void 0) return false;
3460
- const body = "body" in parent && Array.isArray(parent.body) ? parent.body : void 0;
3461
- if (body === void 0) return false;
3462
- const index = body.indexOf(node);
3463
- const next = index >= 0 ? body[index + 1] : void 0;
3593
+ const body2 = "body" in parent && Array.isArray(parent.body) ? parent.body : void 0;
3594
+ if (body2 === void 0) return false;
3595
+ const index = body2.indexOf(node);
3596
+ const next = index >= 0 ? body2[index + 1] : void 0;
3464
3597
  return next !== void 0 && next.type === node.type;
3465
3598
  }
3466
3599
  var no_restated_comment_default = createRule({
@@ -3489,7 +3622,7 @@ var no_restated_comment_default = createRule({
3489
3622
  function labelsASiblingRun(comment) {
3490
3623
  const token = sourceCode.getTokenAfter(comment, { includeComments: false });
3491
3624
  if (token === null) return false;
3492
- for (let node = sourceCode.getNodeByRangeIndex(token.range[0]); node != null && node.type !== AST_NODE_TYPES15.Program; node = node.parent) {
3625
+ for (let node = sourceCode.getNodeByRangeIndex(token.range[0]); node != null && node.type !== AST_NODE_TYPES16.Program; node = node.parent) {
3493
3626
  if (headsSiblingRun(node)) return true;
3494
3627
  }
3495
3628
  return false;
@@ -3500,8 +3633,8 @@ var no_restated_comment_default = createRule({
3500
3633
  const wallMembers = /* @__PURE__ */ new Set();
3501
3634
  let cluster = [];
3502
3635
  for (const candidate of comments) {
3503
- const body = candidate.value.replace(/^\/*/, "").trim();
3504
- if (candidate.type !== "Line" || !isStandalone(candidate) || isProtected(body) || !WALL_NARRATION_RE2.test(body)) {
3636
+ const body2 = candidate.value.replace(/^\/*/, "").trim();
3637
+ if (candidate.type !== "Line" || !isStandalone(candidate) || isProtected(body2) || !WALL_NARRATION_RE2.test(body2)) {
3505
3638
  continue;
3506
3639
  }
3507
3640
  const previous = cluster.at(-1);
@@ -3524,18 +3657,18 @@ var no_restated_comment_default = createRule({
3524
3657
  if (areAdjacentLineComments2(comments[i - 1], comment) || areAdjacentLineComments2(comment, comments[i + 1])) {
3525
3658
  continue;
3526
3659
  }
3527
- const body = comment.value.replace(/^\/*/, "").trim();
3528
- if (body.length === 0 || body.endsWith("?")) continue;
3529
- if (DIRECTIVE_RE2.test(body) || CODEY_RE.test(body) || BANNERISH_RE.test(body)) continue;
3530
- if (NON_ASCII_LETTER_RE.test(body) || isProtected(body)) continue;
3531
- if (MODALITY_RE.test(body) || LEAD_IN_RE.test(body) || EMPHASIS_RE.test(body)) continue;
3532
- if (NEGATION_WORD_RE.test(body)) continue;
3533
- if (body.split(/\s+/).length > MAX_WORDS) continue;
3534
- const tokens = contentTokens(body);
3660
+ const body2 = comment.value.replace(/^\/*/, "").trim();
3661
+ if (body2.length === 0 || body2.endsWith("?")) continue;
3662
+ if (DIRECTIVE_RE3.test(body2) || CODEY_RE.test(body2) || BANNERISH_RE.test(body2)) continue;
3663
+ if (NON_ASCII_LETTER_RE.test(body2) || isProtected(body2)) continue;
3664
+ if (MODALITY_RE.test(body2) || LEAD_IN_RE.test(body2) || EMPHASIS_RE.test(body2)) continue;
3665
+ if (NEGATION_WORD_RE.test(body2)) continue;
3666
+ if (body2.split(/\s+/).length > MAX_WORDS) continue;
3667
+ const tokens = contentTokens(body2);
3535
3668
  if (tokens.length < MIN_CONTENT_TOKENS) continue;
3536
3669
  const statement = restatableStatementBelow(comment, sourceCode);
3537
3670
  if (statement === null) continue;
3538
- if (restatesStatementHead(body, statement)) continue;
3671
+ if (restatesStatementHead(body2, statement)) continue;
3539
3672
  const line = lines[comment.loc.start.line] ?? "";
3540
3673
  if (!ACTION_STMT_RE.test(line)) continue;
3541
3674
  if (labelsASiblingRun(comment)) continue;
@@ -3549,7 +3682,7 @@ var no_restated_comment_default = createRule({
3549
3682
  });
3550
3683
 
3551
3684
  // src/rules/no-restated-jsdoc.ts
3552
- import { AST_NODE_TYPES as AST_NODE_TYPES16 } from "@typescript-eslint/utils";
3685
+ import { AST_NODE_TYPES as AST_NODE_TYPES17 } from "@typescript-eslint/utils";
3553
3686
  var MODELLED_TAGS = /* @__PURE__ */ new Set([
3554
3687
  "arg",
3555
3688
  "argument",
@@ -3561,7 +3694,7 @@ var MODELLED_TAGS = /* @__PURE__ */ new Set([
3561
3694
  ]);
3562
3695
  var PARAM_TAGS = /* @__PURE__ */ new Set(["arg", "argument", "param"]);
3563
3696
  var RETURN_TAGS = /* @__PURE__ */ new Set(["return", "returns"]);
3564
- var DIRECTIVE_RE3 = /^\s*(?:eslint\b|eslint-|@ts-|prettier|biome-|c8\b|v8\b|istanbul\b|@vite|webpack|@jsx|@jest-environment|@vitest-environment|#__)/i;
3697
+ var DIRECTIVE_RE4 = /^\s*(?:eslint\b|eslint-|@ts-|prettier|biome-|c8\b|v8\b|istanbul\b|@vite|webpack|@jsx|@jest-environment|@vitest-environment|#__)/i;
3565
3698
  var STOPWORDS2 = new Set(
3566
3699
  `the a an of to for in on with and or as at by is are was be been being
3567
3700
  this that it its if whether when where which what will would can could should
@@ -3603,30 +3736,30 @@ function declarationNames(node) {
3603
3736
  switch (node.type) {
3604
3737
  // `export function f()` — the JSDoc sits above the `export`, so the token
3605
3738
  // after it resolves to the wrapper, not to the thing being documented.
3606
- case AST_NODE_TYPES16.ExportNamedDeclaration:
3607
- case AST_NODE_TYPES16.ExportDefaultDeclaration:
3739
+ case AST_NODE_TYPES17.ExportNamedDeclaration:
3740
+ case AST_NODE_TYPES17.ExportDefaultDeclaration:
3608
3741
  return node.declaration == null ? null : declarationNames(node.declaration);
3609
- case AST_NODE_TYPES16.FunctionDeclaration:
3610
- case AST_NODE_TYPES16.TSDeclareFunction:
3742
+ case AST_NODE_TYPES17.FunctionDeclaration:
3743
+ case AST_NODE_TYPES17.TSDeclareFunction:
3611
3744
  return node.id === null ? null : { name: node.id.name, params: paramNames(node.params) };
3612
- case AST_NODE_TYPES16.ClassDeclaration:
3613
- case AST_NODE_TYPES16.TSInterfaceDeclaration:
3614
- case AST_NODE_TYPES16.TSTypeAliasDeclaration:
3615
- case AST_NODE_TYPES16.TSEnumDeclaration:
3745
+ case AST_NODE_TYPES17.ClassDeclaration:
3746
+ case AST_NODE_TYPES17.TSInterfaceDeclaration:
3747
+ case AST_NODE_TYPES17.TSTypeAliasDeclaration:
3748
+ case AST_NODE_TYPES17.TSEnumDeclaration:
3616
3749
  return node.id === null ? null : { name: node.id.name, params: [] };
3617
- case AST_NODE_TYPES16.VariableDeclaration: {
3750
+ case AST_NODE_TYPES17.VariableDeclaration: {
3618
3751
  const declarator = node.declarations[0];
3619
- if (declarator === void 0 || declarator.id.type !== AST_NODE_TYPES16.Identifier) return null;
3752
+ if (declarator === void 0 || declarator.id.type !== AST_NODE_TYPES17.Identifier) return null;
3620
3753
  const init = declarator.init;
3621
- const params = init != null && (init.type === AST_NODE_TYPES16.ArrowFunctionExpression || init.type === AST_NODE_TYPES16.FunctionExpression) ? paramNames(init.params) : [];
3754
+ const params = init != null && (init.type === AST_NODE_TYPES17.ArrowFunctionExpression || init.type === AST_NODE_TYPES17.FunctionExpression) ? paramNames(init.params) : [];
3622
3755
  return { name: declarator.id.name, params };
3623
3756
  }
3624
- case AST_NODE_TYPES16.MethodDefinition:
3625
- case AST_NODE_TYPES16.PropertyDefinition:
3626
- case AST_NODE_TYPES16.TSMethodSignature:
3627
- case AST_NODE_TYPES16.TSPropertySignature: {
3628
- if (node.key.type !== AST_NODE_TYPES16.Identifier) return null;
3629
- const params = node.type === AST_NODE_TYPES16.MethodDefinition ? paramNames(node.value.params) : node.type === AST_NODE_TYPES16.TSMethodSignature ? paramNames(node.params) : [];
3757
+ case AST_NODE_TYPES17.MethodDefinition:
3758
+ case AST_NODE_TYPES17.PropertyDefinition:
3759
+ case AST_NODE_TYPES17.TSMethodSignature:
3760
+ case AST_NODE_TYPES17.TSPropertySignature: {
3761
+ if (node.key.type !== AST_NODE_TYPES17.Identifier) return null;
3762
+ const params = node.type === AST_NODE_TYPES17.MethodDefinition ? paramNames(node.value.params) : node.type === AST_NODE_TYPES17.TSMethodSignature ? paramNames(node.params) : [];
3630
3763
  return { name: node.key.name, params };
3631
3764
  }
3632
3765
  default:
@@ -3636,9 +3769,9 @@ function declarationNames(node) {
3636
3769
  function paramNames(params) {
3637
3770
  const names = [];
3638
3771
  for (const param of params) {
3639
- const target = param.type === AST_NODE_TYPES16.AssignmentPattern ? param.left : param;
3640
- if (target.type === AST_NODE_TYPES16.Identifier) names.push(target.name);
3641
- else if (target.type === AST_NODE_TYPES16.TSParameterProperty) continue;
3772
+ const target = param.type === AST_NODE_TYPES17.AssignmentPattern ? param.left : param;
3773
+ if (target.type === AST_NODE_TYPES17.Identifier) names.push(target.name);
3774
+ else if (target.type === AST_NODE_TYPES17.TSParameterProperty) continue;
3642
3775
  }
3643
3776
  return names;
3644
3777
  }
@@ -3672,7 +3805,7 @@ var no_restated_jsdoc_default = createRule({
3672
3805
  for (const comment of sourceCode.getAllComments()) {
3673
3806
  if (comment.type !== "Block" || !comment.value.startsWith("*")) continue;
3674
3807
  const { description, tags } = parseJsDoc(comment.value);
3675
- if (DIRECTIVE_RE3.test(description)) continue;
3808
+ if (DIRECTIVE_RE4.test(description)) continue;
3676
3809
  const tagNames = new Set(tags.map((tag) => tag.name));
3677
3810
  if ([...tagNames].some((name) => !MODELLED_TAGS.has(name))) continue;
3678
3811
  if (isProtected(description)) continue;
@@ -3680,7 +3813,7 @@ var no_restated_jsdoc_default = createRule({
3680
3813
  if (token === null || token.loc.start.line !== comment.loc.end.line + 1) continue;
3681
3814
  let node = sourceCode.getNodeByRangeIndex(token.range[0]);
3682
3815
  let declaration = null;
3683
- while (node != null && node.type !== AST_NODE_TYPES16.Program) {
3816
+ while (node != null && node.type !== AST_NODE_TYPES17.Program) {
3684
3817
  declaration = declarationNames(node);
3685
3818
  if (declaration !== null) break;
3686
3819
  node = node.parent ?? null;
@@ -4139,12 +4272,12 @@ var no_select_star_default = createRule({
4139
4272
  });
4140
4273
 
4141
4274
  // src/rules/no-sentinel-return-on-catch.ts
4142
- import { AST_NODE_TYPES as AST_NODE_TYPES17 } from "@typescript-eslint/utils";
4275
+ import { AST_NODE_TYPES as AST_NODE_TYPES18 } from "@typescript-eslint/utils";
4143
4276
  function sentinelKind(arg) {
4144
4277
  if (arg === null) {
4145
4278
  return null;
4146
4279
  }
4147
- if (arg.type === AST_NODE_TYPES17.Literal) {
4280
+ if (arg.type === AST_NODE_TYPES18.Literal) {
4148
4281
  if (arg.value === null) {
4149
4282
  return "nullish";
4150
4283
  }
@@ -4156,13 +4289,13 @@ function sentinelKind(arg) {
4156
4289
  }
4157
4290
  return null;
4158
4291
  }
4159
- if (arg.type === AST_NODE_TYPES17.Identifier && arg.name === "undefined") {
4292
+ if (arg.type === AST_NODE_TYPES18.Identifier && arg.name === "undefined") {
4160
4293
  return "nullish";
4161
4294
  }
4162
- if (arg.type === AST_NODE_TYPES17.ArrayExpression) {
4295
+ if (arg.type === AST_NODE_TYPES18.ArrayExpression) {
4163
4296
  return "array";
4164
4297
  }
4165
- if (arg.type === AST_NODE_TYPES17.ObjectExpression) {
4298
+ if (arg.type === AST_NODE_TYPES18.ObjectExpression) {
4166
4299
  return "object";
4167
4300
  }
4168
4301
  return null;
@@ -4171,25 +4304,25 @@ function isSentinelArgument(arg) {
4171
4304
  if (arg === null) {
4172
4305
  return false;
4173
4306
  }
4174
- if (arg.type === AST_NODE_TYPES17.Literal && arg.value === null) {
4307
+ if (arg.type === AST_NODE_TYPES18.Literal && arg.value === null) {
4175
4308
  return true;
4176
4309
  }
4177
- if (arg.type === AST_NODE_TYPES17.Literal && arg.value === false) {
4310
+ if (arg.type === AST_NODE_TYPES18.Literal && arg.value === false) {
4178
4311
  return true;
4179
4312
  }
4180
- if (arg.type === AST_NODE_TYPES17.Identifier && arg.name === "undefined") {
4313
+ if (arg.type === AST_NODE_TYPES18.Identifier && arg.name === "undefined") {
4181
4314
  return true;
4182
4315
  }
4183
- if (arg.type === AST_NODE_TYPES17.ArrayExpression && arg.elements.length === 0) {
4316
+ if (arg.type === AST_NODE_TYPES18.ArrayExpression && arg.elements.length === 0) {
4184
4317
  return true;
4185
4318
  }
4186
- if (arg.type === AST_NODE_TYPES17.ObjectExpression && arg.properties.length === 0) {
4319
+ if (arg.type === AST_NODE_TYPES18.ObjectExpression && arg.properties.length === 0) {
4187
4320
  return true;
4188
4321
  }
4189
4322
  return false;
4190
4323
  }
4191
4324
  function isFunctionNode(node) {
4192
- return node.type === AST_NODE_TYPES17.FunctionDeclaration || node.type === AST_NODE_TYPES17.FunctionExpression || node.type === AST_NODE_TYPES17.ArrowFunctionExpression;
4325
+ return node.type === AST_NODE_TYPES18.FunctionDeclaration || node.type === AST_NODE_TYPES18.FunctionExpression || node.type === AST_NODE_TYPES18.ArrowFunctionExpression;
4193
4326
  }
4194
4327
  function isNode3(value) {
4195
4328
  return typeof value === "object" && value !== null && typeof value.type === "string";
@@ -4229,24 +4362,24 @@ function walkWithinScope(node, visit) {
4229
4362
  function containsThrow(node) {
4230
4363
  return walkWithinScope(
4231
4364
  node,
4232
- (current) => current.type === AST_NODE_TYPES17.ThrowStatement
4365
+ (current) => current.type === AST_NODE_TYPES18.ThrowStatement
4233
4366
  );
4234
4367
  }
4235
4368
  function bindsName(param, name) {
4236
4369
  switch (param.type) {
4237
- case AST_NODE_TYPES17.Identifier:
4370
+ case AST_NODE_TYPES18.Identifier:
4238
4371
  return param.name === name;
4239
- case AST_NODE_TYPES17.AssignmentPattern:
4372
+ case AST_NODE_TYPES18.AssignmentPattern:
4240
4373
  return bindsName(param.left, name);
4241
- case AST_NODE_TYPES17.RestElement:
4374
+ case AST_NODE_TYPES18.RestElement:
4242
4375
  return bindsName(param.argument, name);
4243
- case AST_NODE_TYPES17.ArrayPattern:
4376
+ case AST_NODE_TYPES18.ArrayPattern:
4244
4377
  return param.elements.some(
4245
4378
  (element) => element !== null && bindsName(element, name)
4246
4379
  );
4247
- case AST_NODE_TYPES17.ObjectPattern:
4380
+ case AST_NODE_TYPES18.ObjectPattern:
4248
4381
  return param.properties.some(
4249
- (property) => property.type === AST_NODE_TYPES17.RestElement ? bindsName(property.argument, name) : bindsName(property.value, name)
4382
+ (property) => property.type === AST_NODE_TYPES18.RestElement ? bindsName(property.argument, name) : bindsName(property.value, name)
4250
4383
  );
4251
4384
  default:
4252
4385
  return false;
@@ -4261,7 +4394,7 @@ function subtreeReadsName(node, name) {
4261
4394
  if (found) {
4262
4395
  return;
4263
4396
  }
4264
- if (current.type === AST_NODE_TYPES17.Identifier && current.name === name) {
4397
+ if (current.type === AST_NODE_TYPES18.Identifier && current.name === name) {
4265
4398
  found = true;
4266
4399
  return;
4267
4400
  }
@@ -4272,10 +4405,10 @@ function subtreeReadsName(node, name) {
4272
4405
  if (key === "parent") {
4273
4406
  continue;
4274
4407
  }
4275
- if (key === "key" && current.type === AST_NODE_TYPES17.Property && !current.computed) {
4408
+ if (key === "key" && current.type === AST_NODE_TYPES18.Property && !current.computed) {
4276
4409
  continue;
4277
4410
  }
4278
- if (key === "property" && current.type === AST_NODE_TYPES17.MemberExpression && !current.computed) {
4411
+ if (key === "property" && current.type === AST_NODE_TYPES18.MemberExpression && !current.computed) {
4279
4412
  continue;
4280
4413
  }
4281
4414
  const value = current[key];
@@ -4308,10 +4441,10 @@ var SAFE_PARSE_CONSTRUCTORS = /* @__PURE__ */ new Set([
4308
4441
  "URLPattern"
4309
4442
  ]);
4310
4443
  function isParseShapedNode(node) {
4311
- if (node.type === AST_NODE_TYPES17.CallExpression && node.callee.type === AST_NODE_TYPES17.MemberExpression && !node.callee.computed && node.callee.property.type === AST_NODE_TYPES17.Identifier) {
4444
+ if (node.type === AST_NODE_TYPES18.CallExpression && node.callee.type === AST_NODE_TYPES18.MemberExpression && !node.callee.computed && node.callee.property.type === AST_NODE_TYPES18.Identifier) {
4312
4445
  return node.callee.property.name === "parse";
4313
4446
  }
4314
- if (node.type === AST_NODE_TYPES17.NewExpression && node.callee.type === AST_NODE_TYPES17.Identifier) {
4447
+ if (node.type === AST_NODE_TYPES18.NewExpression && node.callee.type === AST_NODE_TYPES18.Identifier) {
4315
4448
  return SAFE_PARSE_CONSTRUCTORS.has(node.callee.name);
4316
4449
  }
4317
4450
  return false;
@@ -4322,10 +4455,10 @@ var BODY_DECODE_METHODS = /* @__PURE__ */ new Set([
4322
4455
  "arrayBuffer"
4323
4456
  ]);
4324
4457
  function isBodyDecodeNode(node) {
4325
- return node.type === AST_NODE_TYPES17.CallExpression && node.callee.type === AST_NODE_TYPES17.MemberExpression && !node.callee.computed && node.callee.property.type === AST_NODE_TYPES17.Identifier && BODY_DECODE_METHODS.has(node.callee.property.name);
4458
+ return node.type === AST_NODE_TYPES18.CallExpression && node.callee.type === AST_NODE_TYPES18.MemberExpression && !node.callee.computed && node.callee.property.type === AST_NODE_TYPES18.Identifier && BODY_DECODE_METHODS.has(node.callee.property.name);
4326
4459
  }
4327
4460
  function returnsMatching(stmt, predicate) {
4328
- return stmt.type === AST_NODE_TYPES17.ReturnStatement && stmt.argument !== null && walkWithinScope(stmt.argument, predicate);
4461
+ return stmt.type === AST_NODE_TYPES18.ReturnStatement && stmt.argument !== null && walkWithinScope(stmt.argument, predicate);
4329
4462
  }
4330
4463
  function enclosingReturnTypeNode(node) {
4331
4464
  let current = node.parent;
@@ -4343,11 +4476,11 @@ function enclosingFunctionName(node) {
4343
4476
  let current = node.parent;
4344
4477
  while (current !== void 0 && current !== null) {
4345
4478
  if (isFunctionNode(current)) {
4346
- if ("id" in current && isNode3(current.id) && current.id.type === AST_NODE_TYPES17.Identifier) {
4479
+ if ("id" in current && isNode3(current.id) && current.id.type === AST_NODE_TYPES18.Identifier) {
4347
4480
  return current.id.name;
4348
4481
  }
4349
4482
  const parent = current.parent;
4350
- if (parent?.type === AST_NODE_TYPES17.VariableDeclarator && parent.id.type === AST_NODE_TYPES17.Identifier) {
4483
+ if (parent?.type === AST_NODE_TYPES18.VariableDeclarator && parent.id.type === AST_NODE_TYPES18.Identifier) {
4351
4484
  return parent.id.name;
4352
4485
  }
4353
4486
  return null;
@@ -4368,10 +4501,10 @@ function isDeclaredBooleanPredicate(catchNode, kind) {
4368
4501
  return false;
4369
4502
  }
4370
4503
  let declared = enclosingReturnTypeNode(catchNode);
4371
- if (declared?.type === AST_NODE_TYPES17.TSTypeReference && declared.typeName.type === AST_NODE_TYPES17.Identifier && declared.typeName.name === "Promise") {
4504
+ if (declared?.type === AST_NODE_TYPES18.TSTypeReference && declared.typeName.type === AST_NODE_TYPES18.Identifier && declared.typeName.name === "Promise") {
4372
4505
  declared = declared.typeArguments?.params[0] ?? null;
4373
4506
  }
4374
- return declared?.type === AST_NODE_TYPES17.TSBooleanKeyword;
4507
+ return declared?.type === AST_NODE_TYPES18.TSBooleanKeyword;
4375
4508
  }
4376
4509
  function tryReturnsSafeParse(catchNode) {
4377
4510
  const tryBlock = tryBlockOf(catchNode);
@@ -4387,7 +4520,7 @@ function tryReturnsSafeParse(catchNode) {
4387
4520
  function enclosingFunctionBody(node) {
4388
4521
  let current = node.parent;
4389
4522
  while (current !== void 0 && current !== null) {
4390
- if (isFunctionNode(current) && "body" in current && isNode3(current.body) && current.body.type === AST_NODE_TYPES17.BlockStatement) {
4523
+ if (isFunctionNode(current) && "body" in current && isNode3(current.body) && current.body.type === AST_NODE_TYPES18.BlockStatement) {
4391
4524
  return current.body;
4392
4525
  }
4393
4526
  current = current.parent;
@@ -4400,7 +4533,7 @@ function functionReturnsSameSentinelKindElsewhere(catchNode, kind) {
4400
4533
  return false;
4401
4534
  }
4402
4535
  return walkWithinScope(functionBody, (current) => {
4403
- if (current.type !== AST_NODE_TYPES17.ReturnStatement) {
4536
+ if (current.type !== AST_NODE_TYPES18.ReturnStatement) {
4404
4537
  return false;
4405
4538
  }
4406
4539
  if (isWithin(current, catchNode.body)) {
@@ -4419,13 +4552,13 @@ function returnedSentinelKinds(arg) {
4419
4552
  kinds.add(direct);
4420
4553
  return kinds;
4421
4554
  }
4422
- if (arg.type === AST_NODE_TYPES17.ConditionalExpression) {
4555
+ if (arg.type === AST_NODE_TYPES18.ConditionalExpression) {
4423
4556
  for (const branch of [arg.consequent, arg.alternate]) {
4424
4557
  for (const nested of returnedSentinelKinds(branch)) {
4425
4558
  kinds.add(nested);
4426
4559
  }
4427
4560
  }
4428
- } else if (arg.type === AST_NODE_TYPES17.LogicalExpression && (arg.operator === "??" || arg.operator === "||")) {
4561
+ } else if (arg.type === AST_NODE_TYPES18.LogicalExpression && (arg.operator === "??" || arg.operator === "||")) {
4429
4562
  for (const nested of returnedSentinelKinds(arg.right)) {
4430
4563
  kinds.add(nested);
4431
4564
  }
@@ -4468,7 +4601,7 @@ var no_sentinel_return_on_catch_default = createRule({
4468
4601
  const matcher = createLogMatcher(loggingOptions);
4469
4602
  function logsOrReportsError(catchBody, caughtName) {
4470
4603
  return walkWithinScope(catchBody, (current) => {
4471
- if (current.type !== AST_NODE_TYPES17.CallExpression) {
4604
+ if (current.type !== AST_NODE_TYPES18.CallExpression) {
4472
4605
  return false;
4473
4606
  }
4474
4607
  if (matcher.isLoggingCall(current)) {
@@ -4480,12 +4613,12 @@ var no_sentinel_return_on_catch_default = createRule({
4480
4613
  }
4481
4614
  return {
4482
4615
  CatchClause(node) {
4483
- const body = node.body.body;
4484
- if (body.length === 0) {
4616
+ const body2 = node.body.body;
4617
+ if (body2.length === 0) {
4485
4618
  return;
4486
4619
  }
4487
- const last = body[body.length - 1];
4488
- if (last === void 0 || last.type !== AST_NODE_TYPES17.ReturnStatement) {
4620
+ const last = body2[body2.length - 1];
4621
+ if (last === void 0 || last.type !== AST_NODE_TYPES18.ReturnStatement) {
4489
4622
  return;
4490
4623
  }
4491
4624
  if (!isSentinelArgument(last.argument)) {
@@ -4494,7 +4627,7 @@ var no_sentinel_return_on_catch_default = createRule({
4494
4627
  if (containsThrow(node.body)) {
4495
4628
  return;
4496
4629
  }
4497
- const caughtName = node.param?.type === AST_NODE_TYPES17.Identifier ? node.param.name : null;
4630
+ const caughtName = node.param?.type === AST_NODE_TYPES18.Identifier ? node.param.name : null;
4498
4631
  if (logsOrReportsError(node.body, caughtName)) {
4499
4632
  return;
4500
4633
  }
@@ -4521,9 +4654,9 @@ var no_sentinel_return_on_catch_default = createRule({
4521
4654
  });
4522
4655
 
4523
4656
  // src/rules/no-silent-promise-catch.ts
4524
- import { AST_NODE_TYPES as AST_NODE_TYPES18 } from "@typescript-eslint/utils";
4657
+ import { AST_NODE_TYPES as AST_NODE_TYPES19 } from "@typescript-eslint/utils";
4525
4658
  function isBodyParseCall(node) {
4526
- return node.type === AST_NODE_TYPES18.CallExpression && node.arguments.length === 0 && node.callee.type === AST_NODE_TYPES18.MemberExpression && !node.callee.computed && node.callee.property.type === AST_NODE_TYPES18.Identifier && (node.callee.property.name === "json" || node.callee.property.name === "text");
4659
+ return node.type === AST_NODE_TYPES19.CallExpression && node.arguments.length === 0 && node.callee.type === AST_NODE_TYPES19.MemberExpression && !node.callee.computed && node.callee.property.type === AST_NODE_TYPES19.Identifier && (node.callee.property.name === "json" || node.callee.property.name === "text");
4527
4660
  }
4528
4661
  var TEARDOWN_METHODS = /* @__PURE__ */ new Set([
4529
4662
  "cancel",
@@ -4538,37 +4671,37 @@ var TEARDOWN_METHODS = /* @__PURE__ */ new Set([
4538
4671
  var DIRECTIVE_COMMENT_RE = /^\s*(eslint-|@ts-|prettier-ignore|biome-ignore|c8 |v8 |istanbul )/;
4539
4672
  var isExplanatory = (comment) => !DIRECTIVE_COMMENT_RE.test(comment.value);
4540
4673
  function isTeardownCall(node) {
4541
- return node.type === AST_NODE_TYPES18.CallExpression && node.callee.type === AST_NODE_TYPES18.MemberExpression && !node.callee.computed && node.callee.property.type === AST_NODE_TYPES18.Identifier && TEARDOWN_METHODS.has(node.callee.property.name);
4674
+ return node.type === AST_NODE_TYPES19.CallExpression && node.callee.type === AST_NODE_TYPES19.MemberExpression && !node.callee.computed && node.callee.property.type === AST_NODE_TYPES19.Identifier && TEARDOWN_METHODS.has(node.callee.property.name);
4542
4675
  }
4543
4676
  function isSilentExpression(node) {
4544
4677
  switch (node.type) {
4545
- case AST_NODE_TYPES18.Literal:
4678
+ case AST_NODE_TYPES19.Literal:
4546
4679
  return !("regex" in node);
4547
- case AST_NODE_TYPES18.Identifier:
4680
+ case AST_NODE_TYPES19.Identifier:
4548
4681
  return node.name === "undefined";
4549
- case AST_NODE_TYPES18.UnaryExpression:
4550
- return node.operator === "void" && node.argument.type === AST_NODE_TYPES18.Literal;
4551
- case AST_NODE_TYPES18.ObjectExpression:
4682
+ case AST_NODE_TYPES19.UnaryExpression:
4683
+ return node.operator === "void" && node.argument.type === AST_NODE_TYPES19.Literal;
4684
+ case AST_NODE_TYPES19.ObjectExpression:
4552
4685
  return node.properties.length === 0;
4553
- case AST_NODE_TYPES18.ArrayExpression:
4686
+ case AST_NODE_TYPES19.ArrayExpression:
4554
4687
  return node.elements.length === 0;
4555
- case AST_NODE_TYPES18.TSAsExpression:
4688
+ case AST_NODE_TYPES19.TSAsExpression:
4556
4689
  return isSilentExpression(node.expression);
4557
4690
  default:
4558
4691
  return false;
4559
4692
  }
4560
4693
  }
4561
4694
  function isSilentHandler(handler) {
4562
- const body = handler.body;
4563
- if (body.type !== AST_NODE_TYPES18.BlockStatement) {
4564
- return isSilentExpression(body);
4695
+ const body2 = handler.body;
4696
+ if (body2.type !== AST_NODE_TYPES19.BlockStatement) {
4697
+ return isSilentExpression(body2);
4565
4698
  }
4566
- if (body.body.length === 0) {
4699
+ if (body2.body.length === 0) {
4567
4700
  return true;
4568
4701
  }
4569
- if (body.body.length === 1) {
4570
- const only = body.body[0];
4571
- if (only !== void 0 && only.type === AST_NODE_TYPES18.ReturnStatement) {
4702
+ if (body2.body.length === 1) {
4703
+ const only = body2.body[0];
4704
+ if (only !== void 0 && only.type === AST_NODE_TYPES19.ReturnStatement) {
4572
4705
  return only.argument === null || isSilentExpression(only.argument);
4573
4706
  }
4574
4707
  }
@@ -4597,7 +4730,7 @@ var no_silent_promise_catch_default = createRule({
4597
4730
  return true;
4598
4731
  }
4599
4732
  let statement = call;
4600
- while (statement.parent !== void 0 && statement.parent !== null && !statement.type.endsWith("Statement") && statement.type !== AST_NODE_TYPES18.VariableDeclaration) {
4733
+ while (statement.parent !== void 0 && statement.parent !== null && !statement.type.endsWith("Statement") && statement.type !== AST_NODE_TYPES19.VariableDeclaration) {
4601
4734
  statement = statement.parent;
4602
4735
  }
4603
4736
  if (sourceCode.getCommentsBefore(statement).some(isExplanatory)) {
@@ -4609,7 +4742,7 @@ var no_silent_promise_catch_default = createRule({
4609
4742
  };
4610
4743
  return {
4611
4744
  CallExpression(node) {
4612
- if (node.callee.type !== AST_NODE_TYPES18.MemberExpression || node.callee.computed || node.callee.property.type !== AST_NODE_TYPES18.Identifier || node.callee.property.name !== "catch") {
4745
+ if (node.callee.type !== AST_NODE_TYPES19.MemberExpression || node.callee.computed || node.callee.property.type !== AST_NODE_TYPES19.Identifier || node.callee.property.name !== "catch") {
4613
4746
  return;
4614
4747
  }
4615
4748
  if (isBodyParseCall(node.callee.object)) {
@@ -4618,14 +4751,14 @@ var no_silent_promise_catch_default = createRule({
4618
4751
  if (isTeardownCall(node.callee.object)) {
4619
4752
  return;
4620
4753
  }
4621
- if (node.parent.type === AST_NODE_TYPES18.MemberExpression && node.parent.object === node) {
4754
+ if (node.parent.type === AST_NODE_TYPES19.MemberExpression && node.parent.object === node) {
4622
4755
  return;
4623
4756
  }
4624
4757
  if (node.arguments.length !== 1) {
4625
4758
  return;
4626
4759
  }
4627
4760
  const handler = node.arguments[0];
4628
- if (handler === void 0 || handler.type !== AST_NODE_TYPES18.ArrowFunctionExpression && handler.type !== AST_NODE_TYPES18.FunctionExpression) {
4761
+ if (handler === void 0 || handler.type !== AST_NODE_TYPES19.ArrowFunctionExpression && handler.type !== AST_NODE_TYPES19.FunctionExpression) {
4629
4762
  return;
4630
4763
  }
4631
4764
  if (hasExplanatoryComment(node, handler)) {
@@ -4640,7 +4773,7 @@ var no_silent_promise_catch_default = createRule({
4640
4773
  });
4641
4774
 
4642
4775
  // src/rules/no-sleep-in-test-body.ts
4643
- import { AST_NODE_TYPES as AST_NODE_TYPES19 } from "@typescript-eslint/utils";
4776
+ import { AST_NODE_TYPES as AST_NODE_TYPES20 } from "@typescript-eslint/utils";
4644
4777
  var SLEEP_HELPERS = /* @__PURE__ */ new Set(["sleep", "delay", "wait", "pause"]);
4645
4778
  var TEST_CALLERS2 = /* @__PURE__ */ new Set([
4646
4779
  "it",
@@ -4649,34 +4782,34 @@ var TEST_CALLERS2 = /* @__PURE__ */ new Set([
4649
4782
  "afterEach"
4650
4783
  ]);
4651
4784
  var FUNCTION_TYPES4 = /* @__PURE__ */ new Set([
4652
- AST_NODE_TYPES19.FunctionDeclaration,
4653
- AST_NODE_TYPES19.FunctionExpression,
4654
- AST_NODE_TYPES19.ArrowFunctionExpression
4785
+ AST_NODE_TYPES20.FunctionDeclaration,
4786
+ AST_NODE_TYPES20.FunctionExpression,
4787
+ AST_NODE_TYPES20.ArrowFunctionExpression
4655
4788
  ]);
4656
4789
  function isNonzeroNumericLiteral(node) {
4657
- return node?.type === AST_NODE_TYPES19.Literal && typeof node.value === "number" && node.value !== 0;
4790
+ return node?.type === AST_NODE_TYPES20.Literal && typeof node.value === "number" && node.value !== 0;
4658
4791
  }
4659
4792
  function isTimedSetTimeout(node) {
4660
- return node.type === AST_NODE_TYPES19.CallExpression && node.callee.type === AST_NODE_TYPES19.Identifier && node.callee.name === "setTimeout" && node.arguments.length >= 2 && isNonzeroNumericLiteral(node.arguments[1]);
4793
+ return node.type === AST_NODE_TYPES20.CallExpression && node.callee.type === AST_NODE_TYPES20.Identifier && node.callee.name === "setTimeout" && node.arguments.length >= 2 && isNonzeroNumericLiteral(node.arguments[1]);
4661
4794
  }
4662
4795
  function isPromiseSleep(node) {
4663
- if (node.callee.type !== AST_NODE_TYPES19.Identifier || node.callee.name !== "Promise") {
4796
+ if (node.callee.type !== AST_NODE_TYPES20.Identifier || node.callee.name !== "Promise") {
4664
4797
  return false;
4665
4798
  }
4666
4799
  const executor = node.arguments[0];
4667
- if (executor?.type !== AST_NODE_TYPES19.ArrowFunctionExpression && executor?.type !== AST_NODE_TYPES19.FunctionExpression) {
4800
+ if (executor?.type !== AST_NODE_TYPES20.ArrowFunctionExpression && executor?.type !== AST_NODE_TYPES20.FunctionExpression) {
4668
4801
  return false;
4669
4802
  }
4670
- const body = executor.body;
4671
- if (body.type !== AST_NODE_TYPES19.BlockStatement) {
4672
- return isTimedSetTimeout(body);
4803
+ const body2 = executor.body;
4804
+ if (body2.type !== AST_NODE_TYPES20.BlockStatement) {
4805
+ return isTimedSetTimeout(body2);
4673
4806
  }
4674
- return body.body.some(
4675
- (stmt) => stmt.type === AST_NODE_TYPES19.ExpressionStatement && isTimedSetTimeout(stmt.expression)
4807
+ return body2.body.some(
4808
+ (stmt) => stmt.type === AST_NODE_TYPES20.ExpressionStatement && isTimedSetTimeout(stmt.expression)
4676
4809
  );
4677
4810
  }
4678
4811
  function isHelperSleep(node) {
4679
- return node.callee.type === AST_NODE_TYPES19.Identifier && SLEEP_HELPERS.has(node.callee.name) && node.arguments.length >= 1 && isNonzeroNumericLiteral(node.arguments[0]);
4812
+ return node.callee.type === AST_NODE_TYPES20.Identifier && SLEEP_HELPERS.has(node.callee.name) && node.arguments.length >= 1 && isNonzeroNumericLiteral(node.arguments[0]);
4680
4813
  }
4681
4814
  function nearestEnclosingFunction2(node) {
4682
4815
  for (let current = node.parent; current != null; current = current.parent) {
@@ -4684,7 +4817,7 @@ function nearestEnclosingFunction2(node) {
4684
4817
  continue;
4685
4818
  }
4686
4819
  const grandparent = current.parent;
4687
- const isPromiseExecutor = grandparent?.type === AST_NODE_TYPES19.NewExpression && isPromiseSleep(grandparent);
4820
+ const isPromiseExecutor = grandparent?.type === AST_NODE_TYPES20.NewExpression && isPromiseSleep(grandparent);
4688
4821
  if (!isPromiseExecutor) {
4689
4822
  return current;
4690
4823
  }
@@ -4692,23 +4825,23 @@ function nearestEnclosingFunction2(node) {
4692
4825
  return null;
4693
4826
  }
4694
4827
  function testCallerName2(callee) {
4695
- if (callee.type === AST_NODE_TYPES19.Identifier) {
4828
+ if (callee.type === AST_NODE_TYPES20.Identifier) {
4696
4829
  return callee.name;
4697
4830
  }
4698
- if (callee.type === AST_NODE_TYPES19.MemberExpression) {
4831
+ if (callee.type === AST_NODE_TYPES20.MemberExpression) {
4699
4832
  return testCallerName2(callee.object);
4700
4833
  }
4701
- if (callee.type === AST_NODE_TYPES19.CallExpression) {
4834
+ if (callee.type === AST_NODE_TYPES20.CallExpression) {
4702
4835
  return testCallerName2(callee.callee);
4703
4836
  }
4704
- if (callee.type === AST_NODE_TYPES19.TaggedTemplateExpression) {
4837
+ if (callee.type === AST_NODE_TYPES20.TaggedTemplateExpression) {
4705
4838
  return testCallerName2(callee.tag);
4706
4839
  }
4707
4840
  return null;
4708
4841
  }
4709
4842
  function isTestBody2(fn) {
4710
4843
  const call = fn.parent;
4711
- if (call?.type !== AST_NODE_TYPES19.CallExpression || !call.arguments.some((argument) => argument === fn)) {
4844
+ if (call?.type !== AST_NODE_TYPES20.CallExpression || !call.arguments.some((argument) => argument === fn)) {
4712
4845
  return false;
4713
4846
  }
4714
4847
  const name = testCallerName2(call.callee);
@@ -4754,7 +4887,7 @@ var no_sleep_in_test_body_default = createRule({
4754
4887
  });
4755
4888
 
4756
4889
  // src/rules/no-storage-in-stateless-modules.ts
4757
- import { AST_NODE_TYPES as AST_NODE_TYPES20 } from "@typescript-eslint/utils";
4890
+ import { AST_NODE_TYPES as AST_NODE_TYPES21 } from "@typescript-eslint/utils";
4758
4891
  var DEFAULT_METHODS2 = [
4759
4892
  "prepare",
4760
4893
  "put",
@@ -4773,7 +4906,7 @@ function compile2(patterns) {
4773
4906
  }
4774
4907
  function storageMethodName(node, methods) {
4775
4908
  const callee = node.callee;
4776
- if (callee.type !== AST_NODE_TYPES20.MemberExpression || callee.computed || callee.property.type !== AST_NODE_TYPES20.Identifier) {
4909
+ if (callee.type !== AST_NODE_TYPES21.MemberExpression || callee.computed || callee.property.type !== AST_NODE_TYPES21.Identifier) {
4777
4910
  return null;
4778
4911
  }
4779
4912
  const name = callee.property.name;
@@ -4906,9 +5039,9 @@ function isDeclaredInsideLoop(variable, loop) {
4906
5039
  if (def === void 0) {
4907
5040
  return false;
4908
5041
  }
4909
- const body = loop.body;
5042
+ const body2 = loop.body;
4910
5043
  const [declStart, declEnd] = def.node.range;
4911
- const [bodyStart, bodyEnd] = body.range;
5044
+ const [bodyStart, bodyEnd] = body2.range;
4912
5045
  return declStart >= bodyStart && declEnd <= bodyEnd;
4913
5046
  }
4914
5047
  function enclosingLoop(node) {
@@ -4987,7 +5120,7 @@ var no_string_concat_in_loop_default = createRule({
4987
5120
  });
4988
5121
 
4989
5122
  // src/rules/no-tautological-expect.ts
4990
- import { AST_NODE_TYPES as AST_NODE_TYPES21 } from "@typescript-eslint/utils";
5123
+ import { AST_NODE_TYPES as AST_NODE_TYPES22 } from "@typescript-eslint/utils";
4991
5124
  var EQUALITY_MATCHERS = /* @__PURE__ */ new Set(["toBe", "toEqual", "toStrictEqual"]);
4992
5125
  var ZERO_ARG_MATCHERS = /* @__PURE__ */ new Set([
4993
5126
  "toBeDefined",
@@ -5001,17 +5134,17 @@ var OPERAND_PREVIEW_CHARS = 40;
5001
5134
  var NUMERIC_SIGNS = /* @__PURE__ */ new Set(["-", "+"]);
5002
5135
  function isLiteral(node) {
5003
5136
  switch (node.type) {
5004
- case AST_NODE_TYPES21.Literal:
5137
+ case AST_NODE_TYPES22.Literal:
5005
5138
  return true;
5006
- case AST_NODE_TYPES21.TemplateLiteral:
5139
+ case AST_NODE_TYPES22.TemplateLiteral:
5007
5140
  return node.expressions.length === 0;
5008
- case AST_NODE_TYPES21.UnaryExpression:
5141
+ case AST_NODE_TYPES22.UnaryExpression:
5009
5142
  return NUMERIC_SIGNS.has(node.operator) && isLiteral(node.argument);
5010
- case AST_NODE_TYPES21.ArrayExpression:
5143
+ case AST_NODE_TYPES22.ArrayExpression:
5011
5144
  return node.elements.every((element) => element !== null && isLiteral(element));
5012
- case AST_NODE_TYPES21.ObjectExpression:
5145
+ case AST_NODE_TYPES22.ObjectExpression:
5013
5146
  return node.properties.every(
5014
- (property) => property.type === AST_NODE_TYPES21.Property && !property.computed && isLiteral(property.value)
5147
+ (property) => property.type === AST_NODE_TYPES22.Property && !property.computed && isLiteral(property.value)
5015
5148
  );
5016
5149
  default:
5017
5150
  return false;
@@ -5019,7 +5152,7 @@ function isLiteral(node) {
5019
5152
  }
5020
5153
  function expectOperand(callee) {
5021
5154
  const receiver = callee.object;
5022
- if (receiver.type !== AST_NODE_TYPES21.CallExpression || receiver.callee.type !== AST_NODE_TYPES21.Identifier || receiver.callee.name !== "expect" || receiver.arguments.length !== 1) {
5155
+ if (receiver.type !== AST_NODE_TYPES22.CallExpression || receiver.callee.type !== AST_NODE_TYPES22.Identifier || receiver.callee.name !== "expect" || receiver.arguments.length !== 1) {
5023
5156
  return null;
5024
5157
  }
5025
5158
  return receiver.arguments[0] ?? null;
@@ -5049,10 +5182,10 @@ var no_tautological_expect_default = createRule({
5049
5182
  return {
5050
5183
  CallExpression(node) {
5051
5184
  const callee = node.callee;
5052
- if (callee.type !== AST_NODE_TYPES21.MemberExpression || callee.computed) {
5185
+ if (callee.type !== AST_NODE_TYPES22.MemberExpression || callee.computed) {
5053
5186
  return;
5054
5187
  }
5055
- if (callee.property.type !== AST_NODE_TYPES21.Identifier) {
5188
+ if (callee.property.type !== AST_NODE_TYPES22.Identifier) {
5056
5189
  return;
5057
5190
  }
5058
5191
  const matcher = callee.property.name;
@@ -5085,6 +5218,31 @@ var no_tautological_expect_default = createRule({
5085
5218
  }
5086
5219
  });
5087
5220
 
5221
+ // src/rules/no-typed-doc-sections.ts
5222
+ var no_typed_doc_sections_default = createRule({
5223
+ name: "no-typed-doc-sections",
5224
+ meta: {
5225
+ type: "suggestion",
5226
+ docs: { description: "Reject typed-signature repetition while preserving behavior that types cannot express." },
5227
+ schema: [],
5228
+ messages: {
5229
+ typedSection: "Typed JSDoc repeats parameters or returns \u2014 delete the tags and improve names or types instead."
5230
+ }
5231
+ },
5232
+ defaultOptions: [],
5233
+ create(context) {
5234
+ return {
5235
+ Program() {
5236
+ for (const group of proseGroups(context.filename, context.sourceCode, true)) {
5237
+ if (group.hasTypedTags && documentsTypedFunction(context.sourceCode, group.comment)) {
5238
+ context.report({ node: group.comment, messageId: "typedSection" });
5239
+ }
5240
+ }
5241
+ }
5242
+ };
5243
+ }
5244
+ });
5245
+
5088
5246
  // src/rules/no-trailing-value-narration.ts
5089
5247
  import "@typescript-eslint/utils";
5090
5248
  var NUMBER_RE = /(?<![\w.])(\d+(?:\.\d+)?)(?![\w.])/g;
@@ -5148,21 +5306,22 @@ var STOPWORDS3 = /* @__PURE__ */ new Set([
5148
5306
  "we",
5149
5307
  "with"
5150
5308
  ]);
5151
- var DIRECTIVE_RE4 = /^\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;
5309
+ var DIRECTIVE_RE5 = /^\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;
5152
5310
  function numbersIn(text) {
5153
5311
  return new Set(text.match(NUMBER_RE) ?? []);
5154
5312
  }
5155
- function narratesValue(body, code) {
5156
- if (body.length === 0 || DIRECTIVE_RE4.test(body) || hasExternalReference(body)) return false;
5313
+ function narratesValue(body2, code) {
5314
+ if (body2.length === 0 || DIRECTIVE_RE5.test(body2) || hasExternalReference(body2)) return false;
5157
5315
  const codeNumbers = numbersIn(code);
5158
5316
  if (codeNumbers.size === 0) return false;
5159
- const words = (body.match(WORD_RE3) ?? []).map((word) => word.toLowerCase());
5317
+ const words = (body2.match(WORD_RE3) ?? []).map((word) => word.toLowerCase());
5160
5318
  if (words.length === 0) return false;
5161
- const commentNumbers = numbersIn(body);
5319
+ const commentNumbers = numbersIn(body2);
5162
5320
  if (commentNumbers.size === 0) return false;
5163
5321
  for (const number of commentNumbers) {
5164
5322
  if (!codeNumbers.has(number)) return false;
5165
5323
  }
5324
+ if (!words.some((word) => UNIT_WORDS.has(word))) return false;
5166
5325
  const identifiers = codeTokens(code);
5167
5326
  const stems = /* @__PURE__ */ new Set();
5168
5327
  for (const token of identifiers) stems.add(stem(token));
@@ -5175,7 +5334,7 @@ var no_trailing_value_narration_default = createRule({
5175
5334
  meta: {
5176
5335
  type: "suggestion",
5177
5336
  docs: {
5178
- description: "Flag a trailing comment whose every word and number is already on the line it annotates."
5337
+ description: "Flag a trailing comment that repeats the line's numeric value only to name its unit."
5179
5338
  },
5180
5339
  schema: [],
5181
5340
  messages: {
@@ -5192,14 +5351,25 @@ var no_trailing_value_narration_default = createRule({
5192
5351
  const before = sourceCode.getTokenBefore(comment, { includeComments: false });
5193
5352
  return before !== null && before.loc.end.line === comment.loc.start.line;
5194
5353
  }
5354
+ function isInsideBrackets(comment) {
5355
+ let node = sourceCode.getNodeByRangeIndex(comment.range[0]);
5356
+ while (node != null) {
5357
+ if (node.type === "BlockStatement" || node.type === "Program") return false;
5358
+ if (node.type === "ArrayExpression" || node.type === "CallExpression" || node.type === "NewExpression") {
5359
+ return true;
5360
+ }
5361
+ node = node.parent;
5362
+ }
5363
+ return false;
5364
+ }
5195
5365
  return {
5196
5366
  Program() {
5197
5367
  for (const comment of sourceCode.getAllComments()) {
5198
- if (!isTrailing(comment)) continue;
5368
+ if (!isTrailing(comment) || isInsideBrackets(comment)) continue;
5199
5369
  const line = sourceCode.lines[comment.loc.start.line - 1] ?? "";
5200
5370
  const code = line.slice(0, comment.loc.start.column);
5201
- const body = comment.value.replace(/^\*+/, "").replace(/\*+$/, "").trim();
5202
- if (narratesValue(body, code)) {
5371
+ const body2 = comment.value.replace(/^\*+/, "").replace(/\*+$/, "").trim();
5372
+ if (narratesValue(body2, code)) {
5203
5373
  context.report({ node: comment, messageId: "narratesValue" });
5204
5374
  }
5205
5375
  }
@@ -5209,10 +5379,10 @@ var no_trailing_value_narration_default = createRule({
5209
5379
  });
5210
5380
 
5211
5381
  // src/rules/no-declaration-comment-wall.ts
5212
- import { AST_NODE_TYPES as AST_NODE_TYPES23 } from "@typescript-eslint/utils";
5382
+ import { AST_NODE_TYPES as AST_NODE_TYPES24 } from "@typescript-eslint/utils";
5213
5383
 
5214
5384
  // src/rules/_comment-wall.ts
5215
- import { AST_NODE_TYPES as AST_NODE_TYPES22 } from "@typescript-eslint/utils";
5385
+ import { AST_NODE_TYPES as AST_NODE_TYPES23 } from "@typescript-eslint/utils";
5216
5386
  var WALL_DEFAULTS = {
5217
5387
  // Below three rows "a wall" is not a fair description of what the reader sees.
5218
5388
  minCommentedMembers: 3,
@@ -5254,7 +5424,7 @@ var WALL_SCHEMA = {
5254
5424
  }
5255
5425
  }
5256
5426
  };
5257
- var VALUE_TAG_RE = /@(?:deprecated|see|example|throws|remarks|since|default|defaultvalue|link|internal|alpha|beta|experimental|template|typeparam|inheritdoc|todo|fixme|override)\b/i;
5427
+ var VALUE_TAG_RE2 = /@(?:deprecated|see|example|throws|remarks|since|default|defaultvalue|link|internal|alpha|beta|experimental|template|typeparam|inheritdoc|todo|fixme|override)\b/i;
5258
5428
  var DEFAULT_RE = /^\s*@?default\b|\bdefaults? (?:to|:)/i;
5259
5429
  var DIGIT_RE = /\d/;
5260
5430
  var UNIT_WORD_RE = /\b(?:ms|milliseconds?|seconds?|minutes?|hours?|days?|weeks?|months?|years?|bytes?|kb|mb|gb|percent|pixels?|px|utc|epoch)\b/i;
@@ -5274,24 +5444,24 @@ var WALL_STOPWORDS = new Set(
5274
5444
  );
5275
5445
  var WORD_RE4 = /[A-Za-z][A-Za-z0-9]*/g;
5276
5446
  var BARE_LABEL_RE = /^[A-Za-z][A-Za-z0-9]*$/;
5277
- function labelStems(body) {
5278
- return splitIdentifier(body).map(stem).join(" ");
5447
+ function labelStems(body2) {
5448
+ return splitIdentifier(body2).map(stem).join(" ");
5279
5449
  }
5280
5450
  function commentBody(comment) {
5281
5451
  return comment.value.replace(/^\*+/, "").replace(/^[ \t]*\*[ \t]?/gm, "").trim();
5282
5452
  }
5283
- function carriesValue(body) {
5284
- return isProtected(body) || VALUE_TAG_RE.test(body) || DEFAULT_RE.test(body) || DIGIT_RE.test(body) || UNIT_WORD_RE.test(body) || EXAMPLE_RE.test(body) || BANNER_RE.test(body) || NON_ASCII_LETTER_RE2.test(body);
5453
+ function carriesValue(body2) {
5454
+ return isProtected(body2) || VALUE_TAG_RE2.test(body2) || DEFAULT_RE.test(body2) || DIGIT_RE.test(body2) || UNIT_WORD_RE.test(body2) || EXAMPLE_RE.test(body2) || BANNER_RE.test(body2) || NON_ASCII_LETTER_RE2.test(body2);
5285
5455
  }
5286
- function isLabel(body) {
5456
+ function isLabel(body2) {
5287
5457
  let content = 0;
5288
- for (const word of body.match(WORD_RE4) ?? []) {
5458
+ for (const word of body2.match(WORD_RE4) ?? []) {
5289
5459
  if (word.length >= 2 && !WALL_STOPWORDS.has(word.toLowerCase())) content += 1;
5290
5460
  }
5291
5461
  return content <= 1;
5292
5462
  }
5293
- function isTagsOnly(body) {
5294
- return body.length > 0 && body.replace(TAG_TOKEN_RE, "").trim().length === 0;
5463
+ function isTagsOnly(body2) {
5464
+ return body2.length > 0 && body2.replace(TAG_TOKEN_RE, "").trim().length === 0;
5295
5465
  }
5296
5466
  function knownTokens(source) {
5297
5467
  const tokens = /* @__PURE__ */ new Set();
@@ -5303,9 +5473,9 @@ function knownTokens(source) {
5303
5473
  }
5304
5474
  return tokens;
5305
5475
  }
5306
- function novelWords(body, known) {
5476
+ function novelWords(body2, known) {
5307
5477
  let novel = 0;
5308
- for (const word of body.match(WORD_RE4) ?? []) {
5478
+ for (const word of body2.match(WORD_RE4) ?? []) {
5309
5479
  const lower = word.toLowerCase();
5310
5480
  if (lower.length < 2 || WALL_STOPWORDS.has(lower)) continue;
5311
5481
  if (!known.has(lower) && !known.has(stem(lower))) novel += 1;
@@ -5316,21 +5486,21 @@ function isWall(members, commented, restated, options) {
5316
5486
  return commented >= options.minCommentedMembers && commented / members >= options.minCommentedRatio && restated / commented >= options.minRestatedRatio;
5317
5487
  }
5318
5488
  var OPAQUE_VALUE_TYPES = /* @__PURE__ */ new Set([
5319
- AST_NODE_TYPES22.FunctionExpression,
5320
- AST_NODE_TYPES22.ArrowFunctionExpression,
5321
- AST_NODE_TYPES22.ObjectExpression,
5322
- AST_NODE_TYPES22.ArrayExpression
5489
+ AST_NODE_TYPES23.FunctionExpression,
5490
+ AST_NODE_TYPES23.ArrowFunctionExpression,
5491
+ AST_NODE_TYPES23.ObjectExpression,
5492
+ AST_NODE_TYPES23.ArrayExpression
5323
5493
  ]);
5324
5494
  function declarationRange(member) {
5325
- const body = bodyOf(member);
5326
- if (body === void 0) return [member.range[0], member.range[1]];
5327
- return [member.range[0], body.range[0]];
5495
+ const body2 = bodyOf(member);
5496
+ if (body2 === void 0) return [member.range[0], member.range[1]];
5497
+ return [member.range[0], body2.range[0]];
5328
5498
  }
5329
5499
  function bodyOf(member) {
5330
- if (member.type === AST_NODE_TYPES22.MethodDefinition || member.type === AST_NODE_TYPES22.TSAbstractMethodDefinition) {
5500
+ if (member.type === AST_NODE_TYPES23.MethodDefinition || member.type === AST_NODE_TYPES23.TSAbstractMethodDefinition) {
5331
5501
  return member.value.body ?? void 0;
5332
5502
  }
5333
- if (member.type === AST_NODE_TYPES22.Property || member.type === AST_NODE_TYPES22.PropertyDefinition) {
5503
+ if (member.type === AST_NODE_TYPES23.Property || member.type === AST_NODE_TYPES23.PropertyDefinition) {
5334
5504
  const value = member.value;
5335
5505
  if (value !== null && OPAQUE_VALUE_TYPES.has(value.type)) return value;
5336
5506
  }
@@ -5340,12 +5510,12 @@ function bodyOf(member) {
5340
5510
  // src/rules/no-declaration-comment-wall.ts
5341
5511
  function named(node) {
5342
5512
  switch (node.type) {
5343
- case AST_NODE_TYPES23.TSEnumMember:
5513
+ case AST_NODE_TYPES24.TSEnumMember:
5344
5514
  return { node, key: node.id };
5345
- case AST_NODE_TYPES23.PropertyDefinition:
5346
- case AST_NODE_TYPES23.TSAbstractPropertyDefinition:
5347
- case AST_NODE_TYPES23.MethodDefinition:
5348
- case AST_NODE_TYPES23.TSAbstractMethodDefinition:
5515
+ case AST_NODE_TYPES24.PropertyDefinition:
5516
+ case AST_NODE_TYPES24.TSAbstractPropertyDefinition:
5517
+ case AST_NODE_TYPES24.MethodDefinition:
5518
+ case AST_NODE_TYPES24.TSAbstractMethodDefinition:
5349
5519
  return node.computed ? void 0 : { node, key: node.key };
5350
5520
  default:
5351
5521
  return void 0;
@@ -5389,9 +5559,9 @@ var no_declaration_comment_wall_default = createRule({
5389
5559
  }
5390
5560
  function isGroupLabel(comment, member, headsRun) {
5391
5561
  if (comment.loc.end.line >= member.node.loc.start.line) return false;
5392
- const body = commentBody(comment);
5393
- if (!BARE_LABEL_RE.test(body)) return false;
5394
- if (labelStems(body) === labelStems(sourceCode.getText(member.key))) return false;
5562
+ const body2 = commentBody(comment);
5563
+ if (!BARE_LABEL_RE.test(body2)) return false;
5564
+ if (labelStems(body2) === labelStems(sourceCode.getText(member.key))) return false;
5395
5565
  const lineAbove = sourceCode.lines[comment.loc.start.line - 2];
5396
5566
  return headsRun || lineAbove !== void 0 && lineAbove.trim().length === 0;
5397
5567
  }
@@ -5404,19 +5574,21 @@ var no_declaration_comment_wall_default = createRule({
5404
5574
  }));
5405
5575
  let commented = 0;
5406
5576
  let restated = 0;
5577
+ const claimed = /* @__PURE__ */ new Set();
5407
5578
  for (const [index, { member, comment }] of documented.entries()) {
5408
- if (comment === void 0) continue;
5579
+ if (comment === void 0 || claimed.has(comment)) continue;
5409
5580
  const next = documented[index + 1];
5410
5581
  if (isGroupLabel(comment, member, next !== void 0 && next.comment === void 0)) {
5411
5582
  continue;
5412
5583
  }
5584
+ claimed.add(comment);
5413
5585
  commented += 1;
5414
- const body = commentBody(comment);
5415
- if (body.length === 0 || carriesValue(body) || isTagsOnly(body) || isLabel(body)) {
5586
+ const body2 = commentBody(comment);
5587
+ if (body2.length === 0 || carriesValue(body2) || isTagsOnly(body2) || isLabel(body2)) {
5416
5588
  continue;
5417
5589
  }
5418
5590
  const [start, end] = declarationRange(member.node);
5419
- if (novelWords(body, knownTokens(sourceCode.text.slice(start, end))) <= options.maxNovelWords) {
5591
+ if (novelWords(body2, knownTokens(sourceCode.text.slice(start, end))) <= options.maxNovelWords) {
5420
5592
  restated += 1;
5421
5593
  }
5422
5594
  }
@@ -5443,7 +5615,7 @@ var no_declaration_comment_wall_default = createRule({
5443
5615
  });
5444
5616
 
5445
5617
  // src/rules/no-union-in-comment.ts
5446
- import { AST_NODE_TYPES as AST_NODE_TYPES24 } from "@typescript-eslint/utils";
5618
+ import { AST_NODE_TYPES as AST_NODE_TYPES25 } from "@typescript-eslint/utils";
5447
5619
  var MAX_LITERAL_LENGTH = 28;
5448
5620
  var LITERAL = String.raw`(?:'[^'\n]*'|"[^"\n]*"|\`[^\`\n]*\`)`;
5449
5621
  var LEAD_IN_RE2 = /^(?:one of|either|values?|allowed(?: values)?|options?|possible(?: values)?)\s*[:=-]?\s*/i;
@@ -5462,14 +5634,14 @@ var STRING_BUILDERS = /* @__PURE__ */ new Set([
5462
5634
  function isBareString(node) {
5463
5635
  if (node === void 0) return false;
5464
5636
  switch (node.type) {
5465
- case AST_NODE_TYPES24.TSStringKeyword:
5637
+ case AST_NODE_TYPES25.TSStringKeyword:
5466
5638
  return true;
5467
5639
  // `string[]` holds members of the same closed set, one element at a time.
5468
- case AST_NODE_TYPES24.TSArrayType:
5640
+ case AST_NODE_TYPES25.TSArrayType:
5469
5641
  return isBareString(node.elementType);
5470
5642
  // `string | null` is still an unconstrained string, and so is `string | "a"`
5471
5643
  // — the checker collapses that one to `string`.
5472
- case AST_NODE_TYPES24.TSUnionType:
5644
+ case AST_NODE_TYPES25.TSUnionType:
5473
5645
  return node.types.some((member) => isBareString(member));
5474
5646
  default:
5475
5647
  return false;
@@ -5479,13 +5651,13 @@ function rootCallee(node) {
5479
5651
  let current = node;
5480
5652
  for (let hops = 0; current != null && hops < 12; hops += 1) {
5481
5653
  switch (current.type) {
5482
- case AST_NODE_TYPES24.CallExpression:
5654
+ case AST_NODE_TYPES25.CallExpression:
5483
5655
  current = current.callee;
5484
5656
  break;
5485
- case AST_NODE_TYPES24.MemberExpression:
5657
+ case AST_NODE_TYPES25.MemberExpression:
5486
5658
  current = current.object;
5487
5659
  break;
5488
- case AST_NODE_TYPES24.Identifier:
5660
+ case AST_NODE_TYPES25.Identifier:
5489
5661
  return current.name;
5490
5662
  default:
5491
5663
  return null;
@@ -5494,26 +5666,26 @@ function rootCallee(node) {
5494
5666
  return null;
5495
5667
  }
5496
5668
  function nameOf(key) {
5497
- if (key.type === AST_NODE_TYPES24.Identifier) return key.name;
5498
- if (key.type === AST_NODE_TYPES24.Literal && typeof key.value === "string") return key.value;
5669
+ if (key.type === AST_NODE_TYPES25.Identifier) return key.name;
5670
+ if (key.type === AST_NODE_TYPES25.Literal && typeof key.value === "string") return key.value;
5499
5671
  return null;
5500
5672
  }
5501
5673
  function targetOf(node) {
5502
5674
  switch (node.type) {
5503
- case AST_NODE_TYPES24.TSPropertySignature:
5504
- case AST_NODE_TYPES24.PropertyDefinition: {
5675
+ case AST_NODE_TYPES25.TSPropertySignature:
5676
+ case AST_NODE_TYPES25.PropertyDefinition: {
5505
5677
  const name = node.computed ? null : nameOf(node.key);
5506
5678
  if (name === null || !isBareString(node.typeAnnotation?.typeAnnotation)) return null;
5507
5679
  return { node, name };
5508
5680
  }
5509
- case AST_NODE_TYPES24.Property: {
5681
+ case AST_NODE_TYPES25.Property: {
5510
5682
  const name = node.computed || node.shorthand ? null : nameOf(node.key);
5511
5683
  const callee = rootCallee(node.value);
5512
5684
  if (name === null || callee === null || !STRING_BUILDERS.has(callee)) return null;
5513
5685
  return { node, name };
5514
5686
  }
5515
- case AST_NODE_TYPES24.VariableDeclarator: {
5516
- if (node.id.type !== AST_NODE_TYPES24.Identifier) return null;
5687
+ case AST_NODE_TYPES25.VariableDeclarator: {
5688
+ if (node.id.type !== AST_NODE_TYPES25.Identifier) return null;
5517
5689
  if (!isBareString(node.id.typeAnnotation?.typeAnnotation)) return null;
5518
5690
  return { node, name: node.id.name };
5519
5691
  }
@@ -5521,8 +5693,8 @@ function targetOf(node) {
5521
5693
  return null;
5522
5694
  }
5523
5695
  }
5524
- function unionLiterals(body) {
5525
- const list = body.replace(LEAD_IN_RE2, "").trim();
5696
+ function unionLiterals(body2) {
5697
+ const list = body2.replace(LEAD_IN_RE2, "").trim();
5526
5698
  if (!UNION_BODY_RE.test(list)) return null;
5527
5699
  const literals = (list.match(LITERAL_G) ?? []).map((raw) => raw.slice(1, -1));
5528
5700
  if (literals.some((literal) => literal.length === 0 || literal.length > MAX_LITERAL_LENGTH)) {
@@ -5562,7 +5734,7 @@ var no_union_in_comment_default = createRule({
5562
5734
  if (after === null || after.loc.start.line !== comment.loc.end.line + 1) return null;
5563
5735
  anchor = sourceCode.getNodeByRangeIndex(after.range[0]);
5564
5736
  }
5565
- for (let node = anchor; node != null && node.type !== AST_NODE_TYPES24.Program; node = node.parent) {
5737
+ for (let node = anchor; node != null && node.type !== AST_NODE_TYPES25.Program; node = node.parent) {
5566
5738
  const target = targetOf(node);
5567
5739
  if (target !== null) return target;
5568
5740
  }
@@ -5571,9 +5743,9 @@ var no_union_in_comment_default = createRule({
5571
5743
  return {
5572
5744
  Program() {
5573
5745
  for (const comment of sourceCode.getAllComments()) {
5574
- const body = comment.value.replace(/^\*+/, "").replace(/\*+$/, "").trim();
5575
- if (body.length === 0) continue;
5576
- const literals = unionLiterals(body);
5746
+ const body2 = comment.value.replace(/^\*+/, "").replace(/\*+$/, "").trim();
5747
+ if (body2.length === 0) continue;
5748
+ const literals = unionLiterals(body2);
5577
5749
  if (literals === null) continue;
5578
5750
  const target = annotated(comment);
5579
5751
  if (target === null) continue;
@@ -5591,9 +5763,9 @@ var no_union_in_comment_default = createRule({
5591
5763
  });
5592
5764
 
5593
5765
  // src/rules/no-type-member-comment-wall.ts
5594
- import { AST_NODE_TYPES as AST_NODE_TYPES25 } from "@typescript-eslint/utils";
5766
+ import { AST_NODE_TYPES as AST_NODE_TYPES26 } from "@typescript-eslint/utils";
5595
5767
  function isNamedMember(node) {
5596
- return (node.type === AST_NODE_TYPES25.TSPropertySignature || node.type === AST_NODE_TYPES25.TSMethodSignature) && !node.computed;
5768
+ return (node.type === AST_NODE_TYPES26.TSPropertySignature || node.type === AST_NODE_TYPES26.TSMethodSignature) && !node.computed;
5597
5769
  }
5598
5770
  var no_type_member_comment_wall_default = createRule({
5599
5771
  name: "no-type-member-comment-wall",
@@ -5633,14 +5805,14 @@ var no_type_member_comment_wall_default = createRule({
5633
5805
  }
5634
5806
  function isGroupLabel(comment, member, headsRun) {
5635
5807
  if (comment.loc.end.line >= member.loc.start.line) return false;
5636
- const body = commentBody(comment);
5637
- if (!BARE_LABEL_RE.test(body)) return false;
5638
- if (labelStems(body) === labelStems(sourceCode.getText(member.key))) return false;
5808
+ const body2 = commentBody(comment);
5809
+ if (!BARE_LABEL_RE.test(body2)) return false;
5810
+ if (labelStems(body2) === labelStems(sourceCode.getText(member.key))) return false;
5639
5811
  const lineAbove = sourceCode.lines[comment.loc.start.line - 2];
5640
5812
  return headsRun || lineAbove !== void 0 && lineAbove.trim().length === 0;
5641
5813
  }
5642
5814
  function check(node) {
5643
- const members = node.type === AST_NODE_TYPES25.TSInterfaceBody ? node.body : node.members;
5815
+ const members = node.type === AST_NODE_TYPES26.TSInterfaceBody ? node.body : node.members;
5644
5816
  const named2 = members.filter(isNamedMember);
5645
5817
  if (named2.length === 0) return;
5646
5818
  const documented = named2.map((member) => ({ member, comment: documentingComment(member) }));
@@ -5655,9 +5827,9 @@ var no_type_member_comment_wall_default = createRule({
5655
5827
  }
5656
5828
  claimed.add(comment);
5657
5829
  commented += 1;
5658
- const body = commentBody(comment);
5659
- if (body.length === 0 || carriesValue(body)) continue;
5660
- if (novelWords(body, knownTokens(sourceCode.getText(member))) <= options.maxNovelWords) {
5830
+ const body2 = commentBody(comment);
5831
+ if (body2.length === 0 || carriesValue(body2)) continue;
5832
+ if (novelWords(body2, knownTokens(sourceCode.getText(member))) <= options.maxNovelWords) {
5661
5833
  restated += 1;
5662
5834
  }
5663
5835
  }
@@ -5680,7 +5852,7 @@ var no_type_member_comment_wall_default = createRule({
5680
5852
  });
5681
5853
 
5682
5854
  // src/rules/no-unnecessary-use-client.ts
5683
- import { AST_NODE_TYPES as AST_NODE_TYPES26 } from "@typescript-eslint/utils";
5855
+ import { AST_NODE_TYPES as AST_NODE_TYPES27 } from "@typescript-eslint/utils";
5684
5856
  var HOOK_REGEX = /^use([A-Z]|$)/;
5685
5857
  var EVENT_PROP_REGEX = /^on[A-Z]/;
5686
5858
  var ERROR_FILE_REGEX = /\b(?:global-)?error\.[jt]sx?$/;
@@ -5706,13 +5878,13 @@ var CLIENT_ONLY_PACKAGES_REGEX = /^(?:@radix-ui\/|framer-motion|react-dom|react-
5706
5878
  var isBareSpecifier = (source) => !source.startsWith(".") && !source.startsWith("/") && !source.startsWith("@/") && !source.startsWith("~");
5707
5879
  var jsxRootName = (name) => {
5708
5880
  let current = name;
5709
- while (current.type === AST_NODE_TYPES26.JSXMemberExpression) {
5881
+ while (current.type === AST_NODE_TYPES27.JSXMemberExpression) {
5710
5882
  current = current.object;
5711
5883
  }
5712
- return current.type === AST_NODE_TYPES26.JSXIdentifier ? current.name : "";
5884
+ return current.type === AST_NODE_TYPES27.JSXIdentifier ? current.name : "";
5713
5885
  };
5714
5886
  var subtreeReadsImportedBinding = (node, imported) => {
5715
- if (node.type === AST_NODE_TYPES26.Identifier) {
5887
+ if (node.type === AST_NODE_TYPES27.Identifier) {
5716
5888
  return imported.has(node.name);
5717
5889
  }
5718
5890
  for (const key of Object.keys(node)) {
@@ -5727,16 +5899,16 @@ var subtreeReadsImportedBinding = (node, imported) => {
5727
5899
  return false;
5728
5900
  };
5729
5901
  var isUseClientDirective = (node) => {
5730
- return node.type === AST_NODE_TYPES26.ExpressionStatement && node.expression.type === AST_NODE_TYPES26.Literal && node.expression.value === "use client";
5902
+ return node.type === AST_NODE_TYPES27.ExpressionStatement && node.expression.type === AST_NODE_TYPES27.Literal && node.expression.value === "use client";
5731
5903
  };
5732
5904
  var isGlobalReference = (node, context) => {
5733
5905
  if (!BROWSER_GLOBALS.has(node.name)) return false;
5734
5906
  const parent = node.parent;
5735
5907
  if (parent !== void 0) {
5736
- if (parent.type === AST_NODE_TYPES26.MemberExpression && parent.property === node && !parent.computed) {
5908
+ if (parent.type === AST_NODE_TYPES27.MemberExpression && parent.property === node && !parent.computed) {
5737
5909
  return false;
5738
5910
  }
5739
- if (parent.type === AST_NODE_TYPES26.Property && parent.key === node && !parent.computed) {
5911
+ if (parent.type === AST_NODE_TYPES27.Property && parent.key === node && !parent.computed) {
5740
5912
  return false;
5741
5913
  }
5742
5914
  if (parent.type.startsWith("TS")) {
@@ -5776,13 +5948,13 @@ var no_unnecessary_use_client_default = createRule({
5776
5948
  const importedLocals = /* @__PURE__ */ new Set();
5777
5949
  const externalLocals = /* @__PURE__ */ new Set();
5778
5950
  const markIfHookOrContext = (callee) => {
5779
- if (callee.type === AST_NODE_TYPES26.Identifier) {
5951
+ if (callee.type === AST_NODE_TYPES27.Identifier) {
5780
5952
  if (HOOK_REGEX.test(callee.name) || callee.name === "createContext") {
5781
5953
  hasClientIndicator = true;
5782
5954
  }
5783
5955
  return;
5784
5956
  }
5785
- if (callee.type === AST_NODE_TYPES26.MemberExpression && callee.property.type === AST_NODE_TYPES26.Identifier) {
5957
+ if (callee.type === AST_NODE_TYPES27.MemberExpression && callee.property.type === AST_NODE_TYPES27.Identifier) {
5786
5958
  const name = callee.property.name;
5787
5959
  if (HOOK_REGEX.test(name) || name === "createContext") {
5788
5960
  hasClientIndicator = true;
@@ -5792,7 +5964,7 @@ var no_unnecessary_use_client_default = createRule({
5792
5964
  return {
5793
5965
  Program(node) {
5794
5966
  for (const stmt of node.body) {
5795
- if (stmt.type !== AST_NODE_TYPES26.ExpressionStatement) break;
5967
+ if (stmt.type !== AST_NODE_TYPES27.ExpressionStatement) break;
5796
5968
  if (isUseClientDirective(stmt)) {
5797
5969
  directiveNode = stmt;
5798
5970
  break;
@@ -5805,7 +5977,7 @@ var no_unnecessary_use_client_default = createRule({
5805
5977
  },
5806
5978
  JSXAttribute(node) {
5807
5979
  if (directiveNode === null) return;
5808
- if (node.name.type === AST_NODE_TYPES26.JSXIdentifier && EVENT_PROP_REGEX.test(node.name.name)) {
5980
+ if (node.name.type === AST_NODE_TYPES27.JSXIdentifier && EVENT_PROP_REGEX.test(node.name.name)) {
5809
5981
  hasClientIndicator = true;
5810
5982
  }
5811
5983
  },
@@ -5873,17 +6045,17 @@ var no_unnecessary_use_client_default = createRule({
5873
6045
 
5874
6046
  // src/rules/no-unsafe-mock-casting.ts
5875
6047
  import "@typescript-eslint/utils";
5876
- import { AST_NODE_TYPES as AST_NODE_TYPES27 } from "@typescript-eslint/utils";
6048
+ import { AST_NODE_TYPES as AST_NODE_TYPES28 } from "@typescript-eslint/utils";
5877
6049
  function isMockTypeReference(node) {
5878
- if (node.type !== AST_NODE_TYPES27.TSTypeReference) {
6050
+ if (node.type !== AST_NODE_TYPES28.TSTypeReference) {
5879
6051
  return false;
5880
6052
  }
5881
6053
  const typeName = node.typeName;
5882
- if (typeName.type === AST_NODE_TYPES27.Identifier) {
6054
+ if (typeName.type === AST_NODE_TYPES28.Identifier) {
5883
6055
  const name = typeName.name;
5884
6056
  return name === "Mock" || name === "MockInstance" || name === "SpyInstance";
5885
6057
  }
5886
- if (typeName.type === AST_NODE_TYPES27.TSQualifiedName) {
6058
+ if (typeName.type === AST_NODE_TYPES28.TSQualifiedName) {
5887
6059
  const rightName = typeName.right.name;
5888
6060
  return rightName === "Mock" || rightName === "MockInstance" || rightName === "SpyInstance";
5889
6061
  }
@@ -5921,7 +6093,7 @@ var no_unsafe_mock_casting_default = createRule({
5921
6093
  // src/rules/no-zod-native-enum.ts
5922
6094
  import {
5923
6095
  ESLintUtils as ESLintUtils2,
5924
- AST_NODE_TYPES as AST_NODE_TYPES28
6096
+ AST_NODE_TYPES as AST_NODE_TYPES29
5925
6097
  } from "@typescript-eslint/utils";
5926
6098
  import * as ts from "typescript";
5927
6099
  var IGNORE_PATTERNS = [
@@ -5940,7 +6112,7 @@ function isZodModule(source) {
5940
6112
  return /(^|[/@-])zod([/-]|$)/.test(source);
5941
6113
  }
5942
6114
  function unwrap2(node) {
5943
- if (node.type === AST_NODE_TYPES28.TSAsExpression || node.type === AST_NODE_TYPES28.TSSatisfiesExpression) {
6115
+ if (node.type === AST_NODE_TYPES29.TSAsExpression || node.type === AST_NODE_TYPES29.TSSatisfiesExpression) {
5944
6116
  return unwrap2(node.expression);
5945
6117
  }
5946
6118
  return node;
@@ -5948,14 +6120,14 @@ function unwrap2(node) {
5948
6120
  function stringValueTexts(node, sourceCode) {
5949
6121
  const texts = [];
5950
6122
  for (const prop of node.properties) {
5951
- if (prop.type !== AST_NODE_TYPES28.Property) {
6123
+ if (prop.type !== AST_NODE_TYPES29.Property) {
5952
6124
  return null;
5953
6125
  }
5954
6126
  if (prop.computed || prop.shorthand || prop.method || prop.kind !== "init") {
5955
6127
  return null;
5956
6128
  }
5957
6129
  const value = prop.value;
5958
- if (value.type !== AST_NODE_TYPES28.Literal || typeof value.value !== "string") {
6130
+ if (value.type !== AST_NODE_TYPES29.Literal || typeof value.value !== "string") {
5959
6131
  return null;
5960
6132
  }
5961
6133
  const text = sourceCode.getText(value);
@@ -5971,7 +6143,7 @@ function resolvesToLocalEnum(node, scope) {
5971
6143
  const variable = current.variables.find((v) => v.name === node.name);
5972
6144
  if (variable !== void 0) {
5973
6145
  return variable.defs.some(
5974
- (def) => def.node.type === AST_NODE_TYPES28.TSEnumDeclaration
6146
+ (def) => def.node.type === AST_NODE_TYPES29.TSEnumDeclaration
5975
6147
  );
5976
6148
  }
5977
6149
  current = current.upper;
@@ -6023,25 +6195,25 @@ var no_zod_native_enum_default = createRule({
6023
6195
  const zodImportedNames = /* @__PURE__ */ new Map();
6024
6196
  function isZodMemberCall(node, api) {
6025
6197
  const callee = node.callee;
6026
- if (callee.type === AST_NODE_TYPES28.MemberExpression && !callee.computed && callee.property.type === AST_NODE_TYPES28.Identifier) {
6198
+ if (callee.type === AST_NODE_TYPES29.MemberExpression && !callee.computed && callee.property.type === AST_NODE_TYPES29.Identifier) {
6027
6199
  return callee.property.name === api;
6028
6200
  }
6029
- if (callee.type === AST_NODE_TYPES28.Identifier) {
6201
+ if (callee.type === AST_NODE_TYPES29.Identifier) {
6030
6202
  return zodImportedNames.get(callee.name) === api;
6031
6203
  }
6032
6204
  return false;
6033
6205
  }
6034
6206
  function buildFix(node) {
6035
6207
  const callee = node.callee;
6036
- if (callee.type !== AST_NODE_TYPES28.MemberExpression || callee.property.type !== AST_NODE_TYPES28.Identifier) {
6208
+ if (callee.type !== AST_NODE_TYPES29.MemberExpression || callee.property.type !== AST_NODE_TYPES29.Identifier) {
6037
6209
  return null;
6038
6210
  }
6039
6211
  const arg = node.arguments[0];
6040
- if (arg === void 0 || node.arguments.length !== 1 || arg.type === AST_NODE_TYPES28.SpreadElement) {
6212
+ if (arg === void 0 || node.arguments.length !== 1 || arg.type === AST_NODE_TYPES29.SpreadElement) {
6041
6213
  return null;
6042
6214
  }
6043
6215
  const inner = unwrap2(arg);
6044
- if (inner.type !== AST_NODE_TYPES28.ObjectExpression) {
6216
+ if (inner.type !== AST_NODE_TYPES29.ObjectExpression) {
6045
6217
  return null;
6046
6218
  }
6047
6219
  const values = stringValueTexts(inner, sourceCode);
@@ -6061,7 +6233,7 @@ var no_zod_native_enum_default = createRule({
6061
6233
  return;
6062
6234
  }
6063
6235
  for (const spec of node.specifiers) {
6064
- if (spec.type === AST_NODE_TYPES28.ImportSpecifier && spec.imported.type === AST_NODE_TYPES28.Identifier) {
6236
+ if (spec.type === AST_NODE_TYPES29.ImportSpecifier && spec.imported.type === AST_NODE_TYPES29.Identifier) {
6065
6237
  zodImportedNames.set(spec.local.name, spec.imported.name);
6066
6238
  }
6067
6239
  }
@@ -6080,7 +6252,7 @@ var no_zod_native_enum_default = createRule({
6080
6252
  return;
6081
6253
  }
6082
6254
  const arg = node.arguments[0];
6083
- if (arg === void 0 || arg.type !== AST_NODE_TYPES28.Identifier) {
6255
+ if (arg === void 0 || arg.type !== AST_NODE_TYPES29.Identifier) {
6084
6256
  return;
6085
6257
  }
6086
6258
  const isEnum = resolvesToLocalEnum(arg, sourceCode.getScope(arg)) || services !== null && resolvesToImportedEnum(arg, services);
@@ -6097,7 +6269,7 @@ var no_zod_native_enum_default = createRule({
6097
6269
  });
6098
6270
 
6099
6271
  // src/rules/prefer-constant-time-secret-compare.ts
6100
- import { AST_NODE_TYPES as AST_NODE_TYPES29 } from "@typescript-eslint/utils";
6272
+ import { AST_NODE_TYPES as AST_NODE_TYPES30 } from "@typescript-eslint/utils";
6101
6273
  var EQUALITY_OPERATORS = /* @__PURE__ */ new Set(["===", "!==", "==", "!="]);
6102
6274
  var SENTINEL_IDENTIFIERS = /* @__PURE__ */ new Set(["undefined", "NaN"]);
6103
6275
  var SENTINEL_WORDS = /(^|_)(SENTINEL|EMPTY|NONE|NULL|UNSET|MISSING|PLACEHOLDER|DUMMY|FAKE|EXAMPLE)(_|$)/;
@@ -6110,36 +6282,36 @@ function isConstantReference(identifier) {
6110
6282
  }
6111
6283
  function isExcludedOperand(node) {
6112
6284
  switch (node.type) {
6113
- case AST_NODE_TYPES29.Literal:
6285
+ case AST_NODE_TYPES30.Literal:
6114
6286
  return true;
6115
- case AST_NODE_TYPES29.TemplateLiteral:
6287
+ case AST_NODE_TYPES30.TemplateLiteral:
6116
6288
  return node.expressions.length === 0;
6117
- case AST_NODE_TYPES29.Identifier:
6289
+ case AST_NODE_TYPES30.Identifier:
6118
6290
  return SENTINEL_IDENTIFIERS.has(node.name) || SENTINEL_PREFIX_RE.test(node.name) || isConstantReference(node.name);
6119
- case AST_NODE_TYPES29.MemberExpression:
6120
- return !node.computed && node.property.type === AST_NODE_TYPES29.Identifier && (SENTINEL_PREFIX_RE.test(node.property.name) || isConstantReference(node.property.name));
6291
+ case AST_NODE_TYPES30.MemberExpression:
6292
+ return !node.computed && node.property.type === AST_NODE_TYPES30.Identifier && (SENTINEL_PREFIX_RE.test(node.property.name) || isConstantReference(node.property.name));
6121
6293
  default:
6122
6294
  return false;
6123
6295
  }
6124
6296
  }
6125
6297
  function operandName(node) {
6126
- if (node.type === AST_NODE_TYPES29.Identifier) {
6298
+ if (node.type === AST_NODE_TYPES30.Identifier) {
6127
6299
  return node.name;
6128
6300
  }
6129
- if (node.type === AST_NODE_TYPES29.MemberExpression && !node.computed && node.property.type === AST_NODE_TYPES29.Identifier) {
6301
+ if (node.type === AST_NODE_TYPES30.MemberExpression && !node.computed && node.property.type === AST_NODE_TYPES30.Identifier) {
6130
6302
  return node.property.name;
6131
6303
  }
6132
6304
  return null;
6133
6305
  }
6134
6306
  function isSecretOperand(node) {
6135
- if (node.type === AST_NODE_TYPES29.TemplateLiteral) {
6307
+ if (node.type === AST_NODE_TYPES30.TemplateLiteral) {
6136
6308
  return node.expressions.some((expression) => isSecretOperand(expression));
6137
6309
  }
6138
6310
  const name = operandName(node);
6139
6311
  return name !== null && isAuthSecretName(name);
6140
6312
  }
6141
6313
  function secretNameOf(node) {
6142
- if (node.type === AST_NODE_TYPES29.TemplateLiteral) {
6314
+ if (node.type === AST_NODE_TYPES30.TemplateLiteral) {
6143
6315
  for (const expression of node.expressions) {
6144
6316
  const nested = secretNameOf(expression);
6145
6317
  if (nested !== null) {
@@ -6192,7 +6364,7 @@ var prefer_constant_time_secret_compare_default = createRule({
6192
6364
 
6193
6365
  // src/rules/prefer-discriminated-union.ts
6194
6366
  import "@typescript-eslint/utils";
6195
- import { AST_NODE_TYPES as AST_NODE_TYPES30 } from "@typescript-eslint/utils";
6367
+ import { AST_NODE_TYPES as AST_NODE_TYPES31 } from "@typescript-eslint/utils";
6196
6368
  var STATUS_MEMBER_NAMES = /* @__PURE__ */ new Set([
6197
6369
  "success",
6198
6370
  "ok",
@@ -6202,27 +6374,27 @@ var STATUS_MEMBER_NAMES = /* @__PURE__ */ new Set([
6202
6374
  ]);
6203
6375
  var MIN_OPTIONAL_MEMBERS = 2;
6204
6376
  function getMemberName(member) {
6205
- if (member.type !== AST_NODE_TYPES30.TSPropertySignature) {
6377
+ if (member.type !== AST_NODE_TYPES31.TSPropertySignature) {
6206
6378
  return null;
6207
6379
  }
6208
6380
  const { key } = member;
6209
- if (key.type === AST_NODE_TYPES30.Identifier) {
6381
+ if (key.type === AST_NODE_TYPES31.Identifier) {
6210
6382
  return key.name;
6211
6383
  }
6212
- if (key.type === AST_NODE_TYPES30.Literal && typeof key.value === "string") {
6384
+ if (key.type === AST_NODE_TYPES31.Literal && typeof key.value === "string") {
6213
6385
  return key.value;
6214
6386
  }
6215
6387
  return null;
6216
6388
  }
6217
6389
  function isBooleanTyped(member) {
6218
- return member.typeAnnotation?.typeAnnotation.type === AST_NODE_TYPES30.TSBooleanKeyword;
6390
+ return member.typeAnnotation?.typeAnnotation.type === AST_NODE_TYPES31.TSBooleanKeyword;
6219
6391
  }
6220
6392
  function looksLikeMutuallyExclusiveState(typeLiteral) {
6221
6393
  let hasStatusBoolean = false;
6222
6394
  let optionalCount = 0;
6223
6395
  let optionalPayloadCount = 0;
6224
6396
  for (const member of typeLiteral.members) {
6225
- if (member.type !== AST_NODE_TYPES30.TSPropertySignature) {
6397
+ if (member.type !== AST_NODE_TYPES31.TSPropertySignature) {
6226
6398
  continue;
6227
6399
  }
6228
6400
  if (member.optional) {
@@ -6243,7 +6415,7 @@ var prefer_discriminated_union_default = createRule({
6243
6415
  meta: {
6244
6416
  type: "suggestion",
6245
6417
  docs: {
6246
- description: "Flag object types with a boolean status flag and many optionals; model them as a discriminated union instead."
6418
+ description: "Flag object types with a boolean status member and at least two optional members, including a non-boolean payload."
6247
6419
  },
6248
6420
  schema: [],
6249
6421
  messages: {
@@ -6264,7 +6436,7 @@ var prefer_discriminated_union_default = createRule({
6264
6436
  TSInterfaceDeclaration(node) {
6265
6437
  const synthetic = {
6266
6438
  ...node.body,
6267
- type: AST_NODE_TYPES30.TSTypeLiteral,
6439
+ type: AST_NODE_TYPES31.TSTypeLiteral,
6268
6440
  members: node.body.body
6269
6441
  };
6270
6442
  checkTypeLiteral(synthetic, node);
@@ -6277,7 +6449,7 @@ var prefer_discriminated_union_default = createRule({
6277
6449
  });
6278
6450
 
6279
6451
  // src/rules/prefer-module-level-constant.ts
6280
- import { AST_NODE_TYPES as AST_NODE_TYPES31 } from "@typescript-eslint/utils";
6452
+ import { AST_NODE_TYPES as AST_NODE_TYPES32 } from "@typescript-eslint/utils";
6281
6453
  var DEFAULT_MIN_ELEMENTS = 3;
6282
6454
  var MAX_LITERAL_DEPTH = 4;
6283
6455
  var IGNORE_PATTERNS2 = [
@@ -6306,9 +6478,9 @@ var MUTATING_METHODS = /* @__PURE__ */ new Set([
6306
6478
  "assign"
6307
6479
  ]);
6308
6480
  var FUNCTION_TYPES5 = /* @__PURE__ */ new Set([
6309
- AST_NODE_TYPES31.FunctionDeclaration,
6310
- AST_NODE_TYPES31.FunctionExpression,
6311
- AST_NODE_TYPES31.ArrowFunctionExpression
6481
+ AST_NODE_TYPES32.FunctionDeclaration,
6482
+ AST_NODE_TYPES32.FunctionExpression,
6483
+ AST_NODE_TYPES32.ArrowFunctionExpression
6312
6484
  ]);
6313
6485
  var COLLECTION_CONSTRUCTORS = /* @__PURE__ */ new Set(["Set", "Map"]);
6314
6486
  function isIgnoredFile2(filename, sourceText) {
@@ -6321,14 +6493,14 @@ function isLocalFixtureFile(filename) {
6321
6493
  return isTestFile(filename) || isStoryFile(filename);
6322
6494
  }
6323
6495
  function unwrap3(node) {
6324
- if (node.type === AST_NODE_TYPES31.TSAsExpression || node.type === AST_NODE_TYPES31.TSSatisfiesExpression || node.type === AST_NODE_TYPES31.TSNonNullExpression) {
6496
+ if (node.type === AST_NODE_TYPES32.TSAsExpression || node.type === AST_NODE_TYPES32.TSSatisfiesExpression || node.type === AST_NODE_TYPES32.TSNonNullExpression) {
6325
6497
  return unwrap3(node.expression);
6326
6498
  }
6327
6499
  return node;
6328
6500
  }
6329
6501
  var HAS_STATEFUL_FLAG_RE = /[gy]/;
6330
6502
  function isRegexLiteral(node) {
6331
- return node.type === AST_NODE_TYPES31.Literal && "regex" in node && node.regex !== void 0;
6503
+ return node.type === AST_NODE_TYPES32.Literal && "regex" in node && node.regex !== void 0;
6332
6504
  }
6333
6505
  function isLiteralOnly(node, depth) {
6334
6506
  if (depth > MAX_LITERAL_DEPTH) {
@@ -6336,29 +6508,29 @@ function isLiteralOnly(node, depth) {
6336
6508
  }
6337
6509
  const inner = unwrap3(node);
6338
6510
  switch (inner.type) {
6339
- case AST_NODE_TYPES31.Literal: {
6511
+ case AST_NODE_TYPES32.Literal: {
6340
6512
  return !(isRegexLiteral(inner) && HAS_STATEFUL_FLAG_RE.test(inner.regex.flags));
6341
6513
  }
6342
- case AST_NODE_TYPES31.TemplateLiteral: {
6514
+ case AST_NODE_TYPES32.TemplateLiteral: {
6343
6515
  return inner.expressions.length === 0;
6344
6516
  }
6345
- case AST_NODE_TYPES31.UnaryExpression: {
6346
- return (inner.operator === "-" || inner.operator === "+") && inner.argument.type === AST_NODE_TYPES31.Literal && typeof inner.argument.value === "number";
6517
+ case AST_NODE_TYPES32.UnaryExpression: {
6518
+ return (inner.operator === "-" || inner.operator === "+") && inner.argument.type === AST_NODE_TYPES32.Literal && typeof inner.argument.value === "number";
6347
6519
  }
6348
- case AST_NODE_TYPES31.ArrayExpression: {
6520
+ case AST_NODE_TYPES32.ArrayExpression: {
6349
6521
  return inner.elements.every(
6350
- (el) => el !== null && el.type !== AST_NODE_TYPES31.SpreadElement && isLiteralOnly(el, depth + 1)
6522
+ (el) => el !== null && el.type !== AST_NODE_TYPES32.SpreadElement && isLiteralOnly(el, depth + 1)
6351
6523
  );
6352
6524
  }
6353
- case AST_NODE_TYPES31.ObjectExpression: {
6525
+ case AST_NODE_TYPES32.ObjectExpression: {
6354
6526
  return inner.properties.every((prop) => {
6355
- if (prop.type !== AST_NODE_TYPES31.Property) {
6527
+ if (prop.type !== AST_NODE_TYPES32.Property) {
6356
6528
  return false;
6357
6529
  }
6358
6530
  if (prop.shorthand || prop.method || prop.kind !== "init") {
6359
6531
  return false;
6360
6532
  }
6361
- if (prop.computed && prop.key.type !== AST_NODE_TYPES31.Literal) {
6533
+ if (prop.computed && prop.key.type !== AST_NODE_TYPES32.Literal) {
6362
6534
  return false;
6363
6535
  }
6364
6536
  return isLiteralOnly(prop.value, depth + 1);
@@ -6371,7 +6543,7 @@ function isLiteralOnly(node, depth) {
6371
6543
  }
6372
6544
  function unwrapObjectFreeze(node) {
6373
6545
  const inner = unwrap3(node);
6374
- if (inner.type === AST_NODE_TYPES31.CallExpression && inner.callee.type === AST_NODE_TYPES31.MemberExpression && !inner.callee.computed && inner.callee.object.type === AST_NODE_TYPES31.Identifier && inner.callee.object.name === "Object" && inner.callee.property.type === AST_NODE_TYPES31.Identifier && inner.callee.property.name === "freeze" && inner.arguments.length === 1 && inner.arguments[0] !== void 0 && inner.arguments[0].type !== AST_NODE_TYPES31.SpreadElement) {
6546
+ if (inner.type === AST_NODE_TYPES32.CallExpression && inner.callee.type === AST_NODE_TYPES32.MemberExpression && !inner.callee.computed && inner.callee.object.type === AST_NODE_TYPES32.Identifier && inner.callee.object.name === "Object" && inner.callee.property.type === AST_NODE_TYPES32.Identifier && inner.callee.property.name === "freeze" && inner.arguments.length === 1 && inner.arguments[0] !== void 0 && inner.arguments[0].type !== AST_NODE_TYPES32.SpreadElement) {
6375
6547
  return unwrap3(inner.arguments[0]);
6376
6548
  }
6377
6549
  return inner;
@@ -6387,19 +6559,19 @@ function classify(init, checkRegex) {
6387
6559
  }
6388
6560
  return { kind: "regex", size: 1 };
6389
6561
  }
6390
- if (node.type === AST_NODE_TYPES31.ArrayExpression) {
6562
+ if (node.type === AST_NODE_TYPES32.ArrayExpression) {
6391
6563
  return isLiteralOnly(node, 0) ? { kind: "array", size: node.elements.length } : null;
6392
6564
  }
6393
- if (node.type === AST_NODE_TYPES31.ObjectExpression) {
6565
+ if (node.type === AST_NODE_TYPES32.ObjectExpression) {
6394
6566
  return isLiteralOnly(node, 0) ? { kind: "object", size: node.properties.length } : null;
6395
6567
  }
6396
- if (node.type === AST_NODE_TYPES31.NewExpression && node.callee.type === AST_NODE_TYPES31.Identifier && COLLECTION_CONSTRUCTORS.has(node.callee.name)) {
6568
+ if (node.type === AST_NODE_TYPES32.NewExpression && node.callee.type === AST_NODE_TYPES32.Identifier && COLLECTION_CONSTRUCTORS.has(node.callee.name)) {
6397
6569
  const arg = node.arguments[0];
6398
- if (node.arguments.length !== 1 || arg === void 0 || arg.type === AST_NODE_TYPES31.SpreadElement) {
6570
+ if (node.arguments.length !== 1 || arg === void 0 || arg.type === AST_NODE_TYPES32.SpreadElement) {
6399
6571
  return null;
6400
6572
  }
6401
6573
  const entries = unwrap3(arg);
6402
- if (entries.type !== AST_NODE_TYPES31.ArrayExpression) {
6574
+ if (entries.type !== AST_NODE_TYPES32.ArrayExpression) {
6403
6575
  return null;
6404
6576
  }
6405
6577
  return isLiteralOnly(entries, 0) ? { kind: node.callee.name === "Set" ? "Set" : "Map", size: entries.elements.length } : null;
@@ -6428,10 +6600,10 @@ var NON_RETAINING_BUILTINS = /* @__PURE__ */ new Map(
6428
6600
  );
6429
6601
  function isNonRetainingBuiltinCall(node, argument) {
6430
6602
  const callee = node.callee;
6431
- if (callee.type === AST_NODE_TYPES31.Identifier && callee.name === "structuredClone") {
6603
+ if (callee.type === AST_NODE_TYPES32.Identifier && callee.name === "structuredClone") {
6432
6604
  return true;
6433
6605
  }
6434
- if (callee.type !== AST_NODE_TYPES31.MemberExpression || callee.computed || callee.object.type !== AST_NODE_TYPES31.Identifier || callee.property.type !== AST_NODE_TYPES31.Identifier) {
6606
+ if (callee.type !== AST_NODE_TYPES32.MemberExpression || callee.computed || callee.object.type !== AST_NODE_TYPES32.Identifier || callee.property.type !== AST_NODE_TYPES32.Identifier) {
6435
6607
  return false;
6436
6608
  }
6437
6609
  const members = NON_RETAINING_BUILTINS.get(callee.object.name);
@@ -6445,38 +6617,38 @@ function isNonRetainingBuiltinCall(node, argument) {
6445
6617
  }
6446
6618
  function isSafeRead(identifier) {
6447
6619
  const parent = identifier.parent;
6448
- if (parent.type === AST_NODE_TYPES31.MemberExpression) {
6620
+ if (parent.type === AST_NODE_TYPES32.MemberExpression) {
6449
6621
  if (parent.object !== identifier) {
6450
6622
  return true;
6451
6623
  }
6452
6624
  const grandparent = parent.parent;
6453
- if (grandparent.type === AST_NODE_TYPES31.AssignmentExpression && grandparent.left === parent) {
6625
+ if (grandparent.type === AST_NODE_TYPES32.AssignmentExpression && grandparent.left === parent) {
6454
6626
  return false;
6455
6627
  }
6456
- if (grandparent.type === AST_NODE_TYPES31.UpdateExpression) {
6628
+ if (grandparent.type === AST_NODE_TYPES32.UpdateExpression) {
6457
6629
  return false;
6458
6630
  }
6459
- if (grandparent.type === AST_NODE_TYPES31.UnaryExpression && grandparent.operator === "delete") {
6631
+ if (grandparent.type === AST_NODE_TYPES32.UnaryExpression && grandparent.operator === "delete") {
6460
6632
  return false;
6461
6633
  }
6462
- if (!parent.computed && parent.property.type === AST_NODE_TYPES31.Identifier && MUTATING_METHODS.has(parent.property.name) && grandparent.type === AST_NODE_TYPES31.CallExpression && grandparent.callee === parent) {
6634
+ if (!parent.computed && parent.property.type === AST_NODE_TYPES32.Identifier && MUTATING_METHODS.has(parent.property.name) && grandparent.type === AST_NODE_TYPES32.CallExpression && grandparent.callee === parent) {
6463
6635
  return false;
6464
6636
  }
6465
6637
  return true;
6466
6638
  }
6467
- if (parent.type === AST_NODE_TYPES31.ForOfStatement && parent.right === identifier) {
6639
+ if (parent.type === AST_NODE_TYPES32.ForOfStatement && parent.right === identifier) {
6468
6640
  return true;
6469
6641
  }
6470
- if (parent.type === AST_NODE_TYPES31.SpreadElement) {
6642
+ if (parent.type === AST_NODE_TYPES32.SpreadElement) {
6471
6643
  return true;
6472
6644
  }
6473
- if (parent.type === AST_NODE_TYPES31.BinaryExpression) {
6645
+ if (parent.type === AST_NODE_TYPES32.BinaryExpression) {
6474
6646
  return true;
6475
6647
  }
6476
- if (parent.type === AST_NODE_TYPES31.CallExpression && parent.arguments.includes(identifier) && isNonRetainingBuiltinCall(parent, identifier)) {
6648
+ if (parent.type === AST_NODE_TYPES32.CallExpression && parent.arguments.includes(identifier) && isNonRetainingBuiltinCall(parent, identifier)) {
6477
6649
  return true;
6478
6650
  }
6479
- if (parent.type === AST_NODE_TYPES31.UnaryExpression && parent.operator !== "delete") {
6651
+ if (parent.type === AST_NODE_TYPES32.UnaryExpression && parent.operator !== "delete") {
6480
6652
  return true;
6481
6653
  }
6482
6654
  return false;
@@ -6531,7 +6703,7 @@ var prefer_module_level_constant_default = createRule({
6531
6703
  if (reference.isWrite()) {
6532
6704
  return false;
6533
6705
  }
6534
- if (reference.identifier.type !== AST_NODE_TYPES31.Identifier) {
6706
+ if (reference.identifier.type !== AST_NODE_TYPES32.Identifier) {
6535
6707
  return false;
6536
6708
  }
6537
6709
  if (!isSafeRead(reference.identifier)) {
@@ -6543,10 +6715,10 @@ var prefer_module_level_constant_default = createRule({
6543
6715
  return {
6544
6716
  VariableDeclarator(node) {
6545
6717
  const declaration = node.parent;
6546
- if (declaration.type !== AST_NODE_TYPES31.VariableDeclaration || declaration.kind !== "const" || declaration.declare === true) {
6718
+ if (declaration.type !== AST_NODE_TYPES32.VariableDeclaration || declaration.kind !== "const" || declaration.declare === true) {
6547
6719
  return;
6548
6720
  }
6549
- if (node.id.type !== AST_NODE_TYPES31.Identifier || node.init === null) {
6721
+ if (node.id.type !== AST_NODE_TYPES32.Identifier || node.init === null) {
6550
6722
  return;
6551
6723
  }
6552
6724
  if (enclosingFunction2(node) === null) {
@@ -6573,7 +6745,7 @@ var prefer_module_level_constant_default = createRule({
6573
6745
  });
6574
6746
 
6575
6747
  // src/rules/prefer-module-level-schema.ts
6576
- import { AST_NODE_TYPES as AST_NODE_TYPES32 } from "@typescript-eslint/utils";
6748
+ import { AST_NODE_TYPES as AST_NODE_TYPES33 } from "@typescript-eslint/utils";
6577
6749
 
6578
6750
  // src/rules/_zod.ts
6579
6751
  var ZOD_PREFIX_RE = /^Z[A-Z]/;
@@ -6639,9 +6811,9 @@ var I18N_RECEIVER_NAMES = /* @__PURE__ */ new Set([
6639
6811
  "intl"
6640
6812
  ]);
6641
6813
  var FUNCTION_TYPES6 = /* @__PURE__ */ new Set([
6642
- AST_NODE_TYPES32.ArrowFunctionExpression,
6643
- AST_NODE_TYPES32.FunctionDeclaration,
6644
- AST_NODE_TYPES32.FunctionExpression
6814
+ AST_NODE_TYPES33.ArrowFunctionExpression,
6815
+ AST_NODE_TYPES33.FunctionDeclaration,
6816
+ AST_NODE_TYPES33.FunctionExpression
6645
6817
  ]);
6646
6818
  function schemaExpression(node) {
6647
6819
  let current = node;
@@ -6650,10 +6822,10 @@ function schemaExpression(node) {
6650
6822
  if (parent === void 0) {
6651
6823
  return current;
6652
6824
  }
6653
- if (parent.type === AST_NODE_TYPES32.MemberExpression && parent.object === current && !parent.computed && parent.property.type === AST_NODE_TYPES32.Identifier && TERMINAL_METHODS.has(parent.property.name)) {
6825
+ if (parent.type === AST_NODE_TYPES33.MemberExpression && parent.object === current && !parent.computed && parent.property.type === AST_NODE_TYPES33.Identifier && TERMINAL_METHODS.has(parent.property.name)) {
6654
6826
  return current;
6655
6827
  }
6656
- if (parent.type === AST_NODE_TYPES32.MemberExpression && parent.object === current || parent.type === AST_NODE_TYPES32.CallExpression && parent.callee === current || parent.type === AST_NODE_TYPES32.TSAsExpression && parent.expression === current || parent.type === AST_NODE_TYPES32.TSNonNullExpression && parent.expression === current) {
6828
+ if (parent.type === AST_NODE_TYPES33.MemberExpression && parent.object === current || parent.type === AST_NODE_TYPES33.CallExpression && parent.callee === current || parent.type === AST_NODE_TYPES33.TSAsExpression && parent.expression === current || parent.type === AST_NODE_TYPES33.TSNonNullExpression && parent.expression === current) {
6657
6829
  current = parent;
6658
6830
  continue;
6659
6831
  }
@@ -6704,22 +6876,22 @@ function subtreeSome(root, predicate) {
6704
6876
  function readsReceiver(node) {
6705
6877
  return subtreeSome(
6706
6878
  node,
6707
- (inner) => inner.type === AST_NODE_TYPES32.ThisExpression || inner.type === AST_NODE_TYPES32.Super || inner.type === AST_NODE_TYPES32.Identifier && inner.name === "arguments"
6879
+ (inner) => inner.type === AST_NODE_TYPES33.ThisExpression || inner.type === AST_NODE_TYPES33.Super || inner.type === AST_NODE_TYPES33.Identifier && inner.name === "arguments"
6708
6880
  );
6709
6881
  }
6710
6882
  function buildsLocalizedText(node) {
6711
6883
  return subtreeSome(node, (inner) => {
6712
- if (inner.type === AST_NODE_TYPES32.TaggedTemplateExpression) {
6884
+ if (inner.type === AST_NODE_TYPES33.TaggedTemplateExpression) {
6713
6885
  return true;
6714
6886
  }
6715
- if (inner.type !== AST_NODE_TYPES32.CallExpression) {
6887
+ if (inner.type !== AST_NODE_TYPES33.CallExpression) {
6716
6888
  return false;
6717
6889
  }
6718
6890
  const { callee } = inner;
6719
- if (callee.type === AST_NODE_TYPES32.Identifier) {
6891
+ if (callee.type === AST_NODE_TYPES33.Identifier) {
6720
6892
  return I18N_CALLEE_NAMES.has(callee.name);
6721
6893
  }
6722
- return callee.type === AST_NODE_TYPES32.MemberExpression && !callee.computed && callee.object.type === AST_NODE_TYPES32.Identifier && I18N_RECEIVER_NAMES.has(callee.object.name);
6894
+ return callee.type === AST_NODE_TYPES33.MemberExpression && !callee.computed && callee.object.type === AST_NODE_TYPES33.Identifier && I18N_RECEIVER_NAMES.has(callee.object.name);
6723
6895
  });
6724
6896
  }
6725
6897
  function collectReferences(scope, out) {
@@ -6776,15 +6948,15 @@ var prefer_module_level_schema_default = createRule({
6776
6948
  }
6777
6949
  const zodNamespaces = /* @__PURE__ */ new Set();
6778
6950
  function isZodCall(node) {
6779
- return node.type === AST_NODE_TYPES32.CallExpression && node.callee.type === AST_NODE_TYPES32.MemberExpression && !node.callee.computed && node.callee.object.type === AST_NODE_TYPES32.Identifier && zodNamespaces.has(node.callee.object.name);
6951
+ return node.type === AST_NODE_TYPES33.CallExpression && node.callee.type === AST_NODE_TYPES33.MemberExpression && !node.callee.computed && node.callee.object.type === AST_NODE_TYPES33.Identifier && zodNamespaces.has(node.callee.object.name);
6780
6952
  }
6781
6953
  function isCovered(node) {
6782
6954
  let current = node.parent ?? void 0;
6783
6955
  while (current !== void 0) {
6784
- if (current !== node && isZodCall(current) && current.callee.type === AST_NODE_TYPES32.MemberExpression && current.callee.property.type === AST_NODE_TYPES32.Identifier && factories.has(current.callee.property.name)) {
6956
+ if (current !== node && isZodCall(current) && current.callee.type === AST_NODE_TYPES33.MemberExpression && current.callee.property.type === AST_NODE_TYPES33.Identifier && factories.has(current.callee.property.name)) {
6785
6957
  return true;
6786
6958
  }
6787
- if (current.type === AST_NODE_TYPES32.CallExpression && (current.callee.type === AST_NODE_TYPES32.Identifier && MEMO_CALLEES.has(current.callee.name) || current.callee.type === AST_NODE_TYPES32.MemberExpression && !current.callee.computed && current.callee.property.type === AST_NODE_TYPES32.Identifier && MEMO_CALLEES.has(current.callee.property.name))) {
6959
+ if (current.type === AST_NODE_TYPES33.CallExpression && (current.callee.type === AST_NODE_TYPES33.Identifier && MEMO_CALLEES.has(current.callee.name) || current.callee.type === AST_NODE_TYPES33.MemberExpression && !current.callee.computed && current.callee.property.type === AST_NODE_TYPES33.Identifier && MEMO_CALLEES.has(current.callee.property.name))) {
6788
6960
  return true;
6789
6961
  }
6790
6962
  current = current.parent ?? void 0;
@@ -6799,11 +6971,11 @@ var prefer_module_level_schema_default = createRule({
6799
6971
  if (parent === void 0) {
6800
6972
  return confirmed;
6801
6973
  }
6802
- if (parent.type === AST_NODE_TYPES32.Property && parent.value === current || parent.type === AST_NODE_TYPES32.ObjectExpression || parent.type === AST_NODE_TYPES32.ArrayExpression) {
6974
+ if (parent.type === AST_NODE_TYPES33.Property && parent.value === current || parent.type === AST_NODE_TYPES33.ObjectExpression || parent.type === AST_NODE_TYPES33.ArrayExpression) {
6803
6975
  current = parent;
6804
6976
  continue;
6805
6977
  }
6806
- if (parent.type === AST_NODE_TYPES32.CallExpression && parent.arguments.includes(current) && isSchemaComposition(parent)) {
6978
+ if (parent.type === AST_NODE_TYPES33.CallExpression && parent.arguments.includes(current) && isSchemaComposition(parent)) {
6807
6979
  current = schemaExpression(parent);
6808
6980
  confirmed = current;
6809
6981
  continue;
@@ -6813,7 +6985,7 @@ var prefer_module_level_schema_default = createRule({
6813
6985
  }
6814
6986
  function isSchemaComposition(node) {
6815
6987
  const { callee } = node;
6816
- const isCombinator = callee.type === AST_NODE_TYPES32.MemberExpression && !callee.computed && callee.property.type === AST_NODE_TYPES32.Identifier && ZOD_COMBINATOR_METHODS.has(callee.property.name);
6988
+ const isCombinator = callee.type === AST_NODE_TYPES33.MemberExpression && !callee.computed && callee.property.type === AST_NODE_TYPES33.Identifier && ZOD_COMBINATOR_METHODS.has(callee.property.name);
6817
6989
  return isCombinator || isZodCall(node);
6818
6990
  }
6819
6991
  function closesOverNothing(node, enclosing) {
@@ -6847,13 +7019,13 @@ var prefer_module_level_schema_default = createRule({
6847
7019
  }
6848
7020
  function ownerName(enclosing) {
6849
7021
  const parent = enclosing.parent ?? void 0;
6850
- if (enclosing.type === AST_NODE_TYPES32.FunctionDeclaration && enclosing.id !== null) {
7022
+ if (enclosing.type === AST_NODE_TYPES33.FunctionDeclaration && enclosing.id !== null) {
6851
7023
  return enclosing.id.name;
6852
7024
  }
6853
- if (parent !== void 0 && parent.type === AST_NODE_TYPES32.VariableDeclarator && parent.id.type === AST_NODE_TYPES32.Identifier) {
7025
+ if (parent !== void 0 && parent.type === AST_NODE_TYPES33.VariableDeclarator && parent.id.type === AST_NODE_TYPES33.Identifier) {
6854
7026
  return parent.id.name;
6855
7027
  }
6856
- if (parent !== void 0 && (parent.type === AST_NODE_TYPES32.MethodDefinition || parent.type === AST_NODE_TYPES32.Property) && parent.key.type === AST_NODE_TYPES32.Identifier) {
7028
+ if (parent !== void 0 && (parent.type === AST_NODE_TYPES33.MethodDefinition || parent.type === AST_NODE_TYPES33.Property) && parent.key.type === AST_NODE_TYPES33.Identifier) {
6857
7029
  return parent.key.name;
6858
7030
  }
6859
7031
  return "this function";
@@ -6864,7 +7036,7 @@ var prefer_module_level_schema_default = createRule({
6864
7036
  return;
6865
7037
  }
6866
7038
  for (const specifier of node.specifiers) {
6867
- if (specifier.type === AST_NODE_TYPES32.ImportNamespaceSpecifier || specifier.type === AST_NODE_TYPES32.ImportDefaultSpecifier || specifier.type === AST_NODE_TYPES32.ImportSpecifier && specifier.imported.type === AST_NODE_TYPES32.Identifier && specifier.imported.name === "z") {
7039
+ if (specifier.type === AST_NODE_TYPES33.ImportNamespaceSpecifier || specifier.type === AST_NODE_TYPES33.ImportDefaultSpecifier || specifier.type === AST_NODE_TYPES33.ImportSpecifier && specifier.imported.type === AST_NODE_TYPES33.Identifier && specifier.imported.name === "z") {
6868
7040
  zodNamespaces.add(specifier.local.name);
6869
7041
  }
6870
7042
  }
@@ -6874,7 +7046,7 @@ var prefer_module_level_schema_default = createRule({
6874
7046
  return;
6875
7047
  }
6876
7048
  const callee = node.callee;
6877
- if (callee.property.type !== AST_NODE_TYPES32.Identifier) {
7049
+ if (callee.property.type !== AST_NODE_TYPES33.Identifier) {
6878
7050
  return;
6879
7051
  }
6880
7052
  const factory = callee.property.name;
@@ -6889,7 +7061,7 @@ var prefer_module_level_schema_default = createRule({
6889
7061
  return;
6890
7062
  }
6891
7063
  const shape = node.arguments[0];
6892
- if (shape !== void 0 && shape.type === AST_NODE_TYPES32.ObjectExpression && shape.properties.length < minProperties) {
7064
+ if (shape !== void 0 && shape.type === AST_NODE_TYPES33.ObjectExpression && shape.properties.length < minProperties) {
6893
7065
  return;
6894
7066
  }
6895
7067
  const expression = schemaExpression(node);
@@ -6917,20 +7089,20 @@ var prefer_module_level_schema_default = createRule({
6917
7089
  });
6918
7090
 
6919
7091
  // src/rules/prefer-non-nullable-collection.ts
6920
- import { AST_NODE_TYPES as AST_NODE_TYPES33 } from "@typescript-eslint/utils";
7092
+ import { AST_NODE_TYPES as AST_NODE_TYPES34 } from "@typescript-eslint/utils";
6921
7093
  var ARRAY_TYPE_NAMES = /* @__PURE__ */ new Set(["Array", "ReadonlyArray"]);
6922
7094
  function propertyName(node) {
6923
7095
  const key = node.key;
6924
- if (key.type === AST_NODE_TYPES33.Identifier) return key.name;
6925
- if (key.type === AST_NODE_TYPES33.Literal) return String(key.value);
7096
+ if (key.type === AST_NODE_TYPES34.Identifier) return key.name;
7097
+ if (key.type === AST_NODE_TYPES34.Literal) return String(key.value);
6926
7098
  return "collection";
6927
7099
  }
6928
7100
  function isArrayType(node) {
6929
- if (node.type === AST_NODE_TYPES33.TSArrayType) return true;
6930
- return node.type === AST_NODE_TYPES33.TSTypeReference && node.typeName.type === AST_NODE_TYPES33.Identifier && ARRAY_TYPE_NAMES.has(node.typeName.name);
7101
+ if (node.type === AST_NODE_TYPES34.TSArrayType) return true;
7102
+ return node.type === AST_NODE_TYPES34.TSTypeReference && node.typeName.type === AST_NODE_TYPES34.Identifier && ARRAY_TYPE_NAMES.has(node.typeName.name);
6931
7103
  }
6932
7104
  function isNullishType(node) {
6933
- return node.type === AST_NODE_TYPES33.TSNullKeyword || node.type === AST_NODE_TYPES33.TSUndefinedKeyword;
7105
+ return node.type === AST_NODE_TYPES34.TSNullKeyword || node.type === AST_NODE_TYPES34.TSUndefinedKeyword;
6934
7106
  }
6935
7107
  function isNullableArrayOnly(node) {
6936
7108
  const values = node.types.filter((member) => !isNullishType(member));
@@ -6941,7 +7113,7 @@ var prefer_non_nullable_collection_default = createRule({
6941
7113
  meta: {
6942
7114
  type: "suggestion",
6943
7115
  docs: {
6944
- description: "Require array types to use an empty array instead of explicit nullish unions with two equivalent empty states."
7116
+ description: "Require declared data-shape properties and direct aliases to use non-null arrays instead of explicit nullish unions."
6945
7117
  },
6946
7118
  schema: [],
6947
7119
  messages: {
@@ -6955,9 +7127,10 @@ var prefer_non_nullable_collection_default = createRule({
6955
7127
  return {};
6956
7128
  }
6957
7129
  function checkOptionalProperty(node) {
7130
+ if (node.optional) return;
6958
7131
  const annotation = node.typeAnnotation?.typeAnnotation;
6959
7132
  if (annotation === void 0) return;
6960
- if (annotation.type !== AST_NODE_TYPES33.TSUnionType || !isNullableArrayOnly(annotation)) {
7133
+ if (annotation.type !== AST_NODE_TYPES34.TSUnionType || !isNullableArrayOnly(annotation)) {
6961
7134
  return;
6962
7135
  }
6963
7136
  context.report({
@@ -6970,7 +7143,7 @@ var prefer_non_nullable_collection_default = createRule({
6970
7143
  TSPropertySignature: checkOptionalProperty,
6971
7144
  PropertyDefinition: checkOptionalProperty,
6972
7145
  TSTypeAliasDeclaration(node) {
6973
- if (node.typeAnnotation.type !== AST_NODE_TYPES33.TSUnionType) return;
7146
+ if (node.typeAnnotation.type !== AST_NODE_TYPES34.TSUnionType) return;
6974
7147
  if (!isNullableArrayOnly(node.typeAnnotation)) return;
6975
7148
  context.report({
6976
7149
  node,
@@ -6983,13 +7156,13 @@ var prefer_non_nullable_collection_default = createRule({
6983
7156
  });
6984
7157
 
6985
7158
  // src/rules/prefer-schema-for-api-payload.ts
6986
- import { AST_NODE_TYPES as AST_NODE_TYPES34 } from "@typescript-eslint/utils";
7159
+ import { AST_NODE_TYPES as AST_NODE_TYPES35 } from "@typescript-eslint/utils";
6987
7160
  var unwrap4 = (node) => {
6988
7161
  let current = node;
6989
7162
  while (current !== null && current !== void 0) {
6990
- if (current.type === AST_NODE_TYPES34.TSAsExpression || current.type === AST_NODE_TYPES34.TSTypeAssertion || current.type === AST_NODE_TYPES34.TSNonNullExpression || current.type === AST_NODE_TYPES34.TSSatisfiesExpression) {
7163
+ if (current.type === AST_NODE_TYPES35.TSAsExpression || current.type === AST_NODE_TYPES35.TSTypeAssertion || current.type === AST_NODE_TYPES35.TSNonNullExpression || current.type === AST_NODE_TYPES35.TSSatisfiesExpression) {
6991
7164
  current = current.expression;
6992
- } else if (current.type === AST_NODE_TYPES34.ChainExpression) {
7165
+ } else if (current.type === AST_NODE_TYPES35.ChainExpression) {
6993
7166
  current = current.expression;
6994
7167
  } else {
6995
7168
  break;
@@ -7004,23 +7177,23 @@ var PROMISE_CHAIN_METHODS = /* @__PURE__ */ new Set([
7004
7177
  ]);
7005
7178
  var isSchemaParseReference = (node) => {
7006
7179
  const inner = unwrap4(node);
7007
- return inner !== null && inner.type === AST_NODE_TYPES34.MemberExpression && !inner.computed && inner.property.type === AST_NODE_TYPES34.Identifier && (inner.property.name === "parse" || inner.property.name === "safeParse");
7180
+ return inner !== null && inner.type === AST_NODE_TYPES35.MemberExpression && !inner.computed && inner.property.type === AST_NODE_TYPES35.Identifier && (inner.property.name === "parse" || inner.property.name === "safeParse");
7008
7181
  };
7009
7182
  var isRawPayloadSource = (node) => {
7010
7183
  let current = unwrap4(node);
7011
7184
  if (current === null) return false;
7012
- if (current.type === AST_NODE_TYPES34.AwaitExpression) {
7185
+ if (current.type === AST_NODE_TYPES35.AwaitExpression) {
7013
7186
  current = unwrap4(current.argument);
7014
7187
  }
7015
- if (current === null || current.type !== AST_NODE_TYPES34.CallExpression) {
7188
+ if (current === null || current.type !== AST_NODE_TYPES35.CallExpression) {
7016
7189
  return false;
7017
7190
  }
7018
7191
  const callee = unwrap4(current.callee);
7019
- if (callee === null || callee.type !== AST_NODE_TYPES34.MemberExpression) {
7192
+ if (callee === null || callee.type !== AST_NODE_TYPES35.MemberExpression) {
7020
7193
  return false;
7021
7194
  }
7022
7195
  const property = unwrap4(callee.property);
7023
- if (property === null || property.type !== AST_NODE_TYPES34.Identifier) {
7196
+ if (property === null || property.type !== AST_NODE_TYPES35.Identifier) {
7024
7197
  return false;
7025
7198
  }
7026
7199
  if (property.name === "json") {
@@ -7030,17 +7203,16 @@ var isRawPayloadSource = (node) => {
7030
7203
  return !current.arguments.some(isSchemaParseReference) && isRawPayloadSource(callee.object);
7031
7204
  }
7032
7205
  const object = unwrap4(callee.object);
7033
- return property.name === "parse" && object !== null && object.type === AST_NODE_TYPES34.Identifier && object.name === "JSON" && // ...but not `JSON.parse(readFileSync(p, "utf8"))` — see isLocalFileRead.
7034
- !isLocalFileRead(current.arguments[0]);
7206
+ return property.name === "parse" && object !== null && object.type === AST_NODE_TYPES35.Identifier && object.name === "JSON" && !isLocalFileRead(current.arguments[0]);
7035
7207
  };
7036
7208
  var FILE_READ_RE = /^(readFile|readFileSync|readJson|readJsonSync|readJSON)$/;
7037
7209
  var isLocalFileRead = (node) => {
7038
7210
  let found = false;
7039
7211
  const visit = (current) => {
7040
7212
  if (found || current === null || current === void 0) return;
7041
- if (current.type === AST_NODE_TYPES34.CallExpression) {
7213
+ if (current.type === AST_NODE_TYPES35.CallExpression) {
7042
7214
  const callee = unwrap4(current.callee);
7043
- const name = callee?.type === AST_NODE_TYPES34.Identifier ? callee.name : callee?.type === AST_NODE_TYPES34.MemberExpression && !callee.computed && callee.property.type === AST_NODE_TYPES34.Identifier ? callee.property.name : null;
7215
+ const name = callee?.type === AST_NODE_TYPES35.Identifier ? callee.name : callee?.type === AST_NODE_TYPES35.MemberExpression && !callee.computed && callee.property.type === AST_NODE_TYPES35.Identifier ? callee.property.name : null;
7044
7216
  if (name !== null && FILE_READ_RE.test(name)) {
7045
7217
  found = true;
7046
7218
  return;
@@ -7062,15 +7234,15 @@ var isLocalFileRead = (node) => {
7062
7234
  var ASSERTION_CALLEE_RE = /^(expect|assert|should|invariant)$/;
7063
7235
  var isInsideAssertion = (node) => {
7064
7236
  for (let current = node.parent; current !== void 0 && current !== null; current = current.parent) {
7065
- if (current.type !== AST_NODE_TYPES34.CallExpression) continue;
7237
+ if (current.type !== AST_NODE_TYPES35.CallExpression) continue;
7066
7238
  let callee = current.callee;
7067
- while (callee.type === AST_NODE_TYPES34.MemberExpression) {
7239
+ while (callee.type === AST_NODE_TYPES35.MemberExpression) {
7068
7240
  callee = callee.object;
7069
7241
  }
7070
- if (callee.type === AST_NODE_TYPES34.CallExpression) {
7242
+ if (callee.type === AST_NODE_TYPES35.CallExpression) {
7071
7243
  callee = callee.callee;
7072
7244
  }
7073
- if (callee.type === AST_NODE_TYPES34.Identifier && ASSERTION_CALLEE_RE.test(callee.name)) {
7245
+ if (callee.type === AST_NODE_TYPES35.Identifier && ASSERTION_CALLEE_RE.test(callee.name)) {
7074
7246
  return true;
7075
7247
  }
7076
7248
  }
@@ -7089,39 +7261,39 @@ var GUARD_NAME_RE = /^(?:is|validate|parse|assert|decode|coerce)[A-Z]/;
7089
7261
  var isValidationRead = (node) => {
7090
7262
  let current = node;
7091
7263
  let parent = current.parent;
7092
- while (parent !== null && parent !== void 0 && (parent.type === AST_NODE_TYPES34.TSAsExpression || parent.type === AST_NODE_TYPES34.TSTypeAssertion || parent.type === AST_NODE_TYPES34.TSNonNullExpression || parent.type === AST_NODE_TYPES34.TSSatisfiesExpression || parent.type === AST_NODE_TYPES34.ChainExpression)) {
7264
+ while (parent !== null && parent !== void 0 && (parent.type === AST_NODE_TYPES35.TSAsExpression || parent.type === AST_NODE_TYPES35.TSTypeAssertion || parent.type === AST_NODE_TYPES35.TSNonNullExpression || parent.type === AST_NODE_TYPES35.TSSatisfiesExpression || parent.type === AST_NODE_TYPES35.ChainExpression)) {
7093
7265
  current = parent;
7094
7266
  parent = parent.parent;
7095
7267
  }
7096
7268
  if (parent === null || parent === void 0) return false;
7097
- if (parent.type === AST_NODE_TYPES34.UnaryExpression && parent.operator === "typeof" && parent.argument === current) {
7269
+ if (parent.type === AST_NODE_TYPES35.UnaryExpression && parent.operator === "typeof" && parent.argument === current) {
7098
7270
  return true;
7099
7271
  }
7100
- if (parent.type !== AST_NODE_TYPES34.CallExpression || !parent.arguments.some((arg) => arg === current)) {
7272
+ if (parent.type !== AST_NODE_TYPES35.CallExpression || !parent.arguments.some((arg) => arg === current)) {
7101
7273
  return false;
7102
7274
  }
7103
7275
  const callee = parent.callee;
7104
- if (callee.type === AST_NODE_TYPES34.MemberExpression && !callee.computed && callee.object.type === AST_NODE_TYPES34.Identifier && callee.object.name === "Array" && callee.property.type === AST_NODE_TYPES34.Identifier && callee.property.name === "isArray") {
7276
+ if (callee.type === AST_NODE_TYPES35.MemberExpression && !callee.computed && callee.object.type === AST_NODE_TYPES35.Identifier && callee.object.name === "Array" && callee.property.type === AST_NODE_TYPES35.Identifier && callee.property.name === "isArray") {
7105
7277
  return parent.arguments.length === 1;
7106
7278
  }
7107
- return callee.type === AST_NODE_TYPES34.Identifier && GUARD_NAME_RE.test(callee.name);
7279
+ return callee.type === AST_NODE_TYPES35.Identifier && GUARD_NAME_RE.test(callee.name);
7108
7280
  };
7109
7281
  var isGuardTestPosition = (node) => {
7110
7282
  let current = node;
7111
7283
  let parent = current.parent;
7112
7284
  while (parent !== void 0 && parent !== null) {
7113
7285
  switch (parent.type) {
7114
- case AST_NODE_TYPES34.UnaryExpression:
7115
- case AST_NODE_TYPES34.LogicalExpression:
7116
- case AST_NODE_TYPES34.ChainExpression:
7286
+ case AST_NODE_TYPES35.UnaryExpression:
7287
+ case AST_NODE_TYPES35.LogicalExpression:
7288
+ case AST_NODE_TYPES35.ChainExpression:
7117
7289
  current = parent;
7118
7290
  parent = parent.parent;
7119
7291
  continue;
7120
- case AST_NODE_TYPES34.IfStatement:
7121
- case AST_NODE_TYPES34.ConditionalExpression:
7122
- case AST_NODE_TYPES34.WhileStatement:
7123
- case AST_NODE_TYPES34.DoWhileStatement:
7124
- case AST_NODE_TYPES34.ForStatement:
7292
+ case AST_NODE_TYPES35.IfStatement:
7293
+ case AST_NODE_TYPES35.ConditionalExpression:
7294
+ case AST_NODE_TYPES35.WhileStatement:
7295
+ case AST_NODE_TYPES35.DoWhileStatement:
7296
+ case AST_NODE_TYPES35.ForStatement:
7125
7297
  return parent.test === current;
7126
7298
  default:
7127
7299
  return false;
@@ -7131,7 +7303,7 @@ var isGuardTestPosition = (node) => {
7131
7303
  };
7132
7304
  var isUnvalidatedVariableRef = (node, scope, tracked) => {
7133
7305
  const unwrapped = unwrap4(node);
7134
- if (unwrapped === null || unwrapped.type !== AST_NODE_TYPES34.Identifier) {
7306
+ if (unwrapped === null || unwrapped.type !== AST_NODE_TYPES35.Identifier) {
7135
7307
  return false;
7136
7308
  }
7137
7309
  const variable = findVariable2(scope, unwrapped.name);
@@ -7174,11 +7346,11 @@ var prefer_schema_for_api_payload_default = createRule({
7174
7346
  return {
7175
7347
  VariableDeclarator(node) {
7176
7348
  const scope = context.sourceCode.getScope(node);
7177
- if (node.id.type === AST_NODE_TYPES34.Identifier) {
7349
+ if (node.id.type === AST_NODE_TYPES35.Identifier) {
7178
7350
  trackInitializer(node);
7179
7351
  return;
7180
7352
  }
7181
- if (node.id.type === AST_NODE_TYPES34.ObjectPattern || node.id.type === AST_NODE_TYPES34.ArrayPattern) {
7353
+ if (node.id.type === AST_NODE_TYPES35.ObjectPattern || node.id.type === AST_NODE_TYPES35.ArrayPattern) {
7182
7354
  if (isRawPayloadSource(node.init)) {
7183
7355
  if (!isFullyNarrowedPattern(node)) {
7184
7356
  context.report({ node: node.id, messageId: "unparsedJsonAccess" });
@@ -7192,7 +7364,7 @@ var prefer_schema_for_api_payload_default = createRule({
7192
7364
  },
7193
7365
  AssignmentExpression(node) {
7194
7366
  const scope = context.sourceCode.getScope(node);
7195
- if (node.left.type === AST_NODE_TYPES34.Identifier) {
7367
+ if (node.left.type === AST_NODE_TYPES35.Identifier) {
7196
7368
  const variable = findVariable2(scope, node.left.name);
7197
7369
  if (variable === null) return;
7198
7370
  if (isRawPayloadSource(node.right)) {
@@ -7202,7 +7374,7 @@ var prefer_schema_for_api_payload_default = createRule({
7202
7374
  }
7203
7375
  return;
7204
7376
  }
7205
- if (node.left.type === AST_NODE_TYPES34.ObjectPattern || node.left.type === AST_NODE_TYPES34.ArrayPattern) {
7377
+ if (node.left.type === AST_NODE_TYPES35.ObjectPattern || node.left.type === AST_NODE_TYPES35.ArrayPattern) {
7206
7378
  if (isRawPayloadSource(node.right)) {
7207
7379
  context.report({
7208
7380
  node: node.left,
@@ -7219,15 +7391,15 @@ var prefer_schema_for_api_payload_default = createRule({
7219
7391
  }
7220
7392
  },
7221
7393
  CallExpression(node) {
7222
- if (node.callee.type !== AST_NODE_TYPES34.Identifier) return;
7394
+ if (node.callee.type !== AST_NODE_TYPES35.Identifier) return;
7223
7395
  if (!GUARD_NAME_RE.test(node.callee.name) && !isGuardTestPosition(node)) {
7224
7396
  return;
7225
7397
  }
7226
7398
  const scope = context.sourceCode.getScope(node);
7227
7399
  for (const arg of node.arguments) {
7228
- if (arg.type === AST_NODE_TYPES34.SpreadElement) continue;
7400
+ if (arg.type === AST_NODE_TYPES35.SpreadElement) continue;
7229
7401
  const unwrapped = unwrap4(arg);
7230
- if (unwrapped === null || unwrapped.type !== AST_NODE_TYPES34.Identifier) {
7402
+ if (unwrapped === null || unwrapped.type !== AST_NODE_TYPES35.Identifier) {
7231
7403
  continue;
7232
7404
  }
7233
7405
  const variable = findVariable2(scope, unwrapped.name);
@@ -7241,13 +7413,13 @@ var prefer_schema_for_api_payload_default = createRule({
7241
7413
  const obj = unwrap4(node.object);
7242
7414
  if (isRawPayloadSource(obj)) {
7243
7415
  const parent = node.parent;
7244
- if (parent.type === AST_NODE_TYPES34.CallExpression && parent.callee === node && node.property.type === AST_NODE_TYPES34.Identifier && (node.property.name === "parse" || node.property.name === "safeParse" || PROMISE_CHAIN_METHODS.has(node.property.name))) {
7416
+ if (parent.type === AST_NODE_TYPES35.CallExpression && parent.callee === node && node.property.type === AST_NODE_TYPES35.Identifier && (node.property.name === "parse" || node.property.name === "safeParse" || PROMISE_CHAIN_METHODS.has(node.property.name))) {
7245
7417
  return;
7246
7418
  }
7247
7419
  context.report({ node, messageId: "unparsedJsonAccess" });
7248
7420
  return;
7249
7421
  }
7250
- if (obj !== null && obj.type === AST_NODE_TYPES34.Identifier && isUnvalidatedVariableRef(obj, scope, unvalidatedVariables)) {
7422
+ if (obj !== null && obj.type === AST_NODE_TYPES35.Identifier && isUnvalidatedVariableRef(obj, scope, unvalidatedVariables)) {
7251
7423
  context.report({ node, messageId: "unparsedJsonAccess" });
7252
7424
  const variable = findVariable2(scope, obj.name);
7253
7425
  if (variable !== null) {
@@ -7260,7 +7432,7 @@ var prefer_schema_for_api_payload_default = createRule({
7260
7432
  });
7261
7433
 
7262
7434
  // src/rules/prefer-semantic-colors.ts
7263
- import { AST_NODE_TYPES as AST_NODE_TYPES35 } from "@typescript-eslint/utils";
7435
+ import { AST_NODE_TYPES as AST_NODE_TYPES36 } from "@typescript-eslint/utils";
7264
7436
  import { existsSync, readdirSync, readFileSync } from "fs";
7265
7437
  import { dirname, join, parse } from "path";
7266
7438
 
@@ -7360,8 +7532,8 @@ var SVG_EXEMPT_COLOR_VALUES = /* @__PURE__ */ new Set([
7360
7532
  ]);
7361
7533
  function jsxElementName(node) {
7362
7534
  const name = node.openingElement.name;
7363
- if (name.type === AST_NODE_TYPES35.JSXIdentifier) return name.name;
7364
- if (name.type === AST_NODE_TYPES35.JSXMemberExpression && name.property.type === AST_NODE_TYPES35.JSXIdentifier) {
7535
+ if (name.type === AST_NODE_TYPES36.JSXIdentifier) return name.name;
7536
+ if (name.type === AST_NODE_TYPES36.JSXMemberExpression && name.property.type === AST_NODE_TYPES36.JSXIdentifier) {
7365
7537
  return name.property.name;
7366
7538
  }
7367
7539
  return null;
@@ -7383,11 +7555,11 @@ var SVG_SHAPE_PRIMITIVES = /* @__PURE__ */ new Set([
7383
7555
  "tspan",
7384
7556
  "use"
7385
7557
  ]);
7386
- var EMAIL_OR_PDF_IMPORT_RE = /@react-(?:email|pdf)\//;
7558
+ var EMAIL_OR_PDF_MODULE_RE = /^@react-(?:email|pdf)\//;
7387
7559
  var isInsideSvg = (node) => {
7388
7560
  let current = node.parent;
7389
7561
  while (current !== void 0 && current !== null) {
7390
- if (current.type === AST_NODE_TYPES35.JSXElement) {
7562
+ if (current.type === AST_NODE_TYPES36.JSXElement) {
7391
7563
  const name = jsxElementName(current);
7392
7564
  if (name !== null && isSvgLikeElementName(name)) return true;
7393
7565
  }
@@ -7398,7 +7570,7 @@ var isInsideSvg = (node) => {
7398
7570
  var isInsideIconFactoryPath = (node) => {
7399
7571
  let current = node.parent;
7400
7572
  while (current !== void 0 && current !== null) {
7401
- if (current.type === AST_NODE_TYPES35.Property && propName(current.key) === "path" && current.parent.type === AST_NODE_TYPES35.ObjectExpression && current.parent.parent.type === AST_NODE_TYPES35.CallExpression && current.parent.parent.callee.type === AST_NODE_TYPES35.Identifier && current.parent.parent.callee.name === "createIcon") {
7573
+ if (current.type === AST_NODE_TYPES36.Property && propName(current.key) === "path" && current.parent.type === AST_NODE_TYPES36.ObjectExpression && current.parent.parent.type === AST_NODE_TYPES36.CallExpression && current.parent.parent.callee.type === AST_NODE_TYPES36.Identifier && current.parent.parent.callee.name === "createIcon") {
7402
7574
  return true;
7403
7575
  }
7404
7576
  current = current.parent;
@@ -7535,10 +7707,16 @@ var hasSemanticTokenSystem = (filename) => {
7535
7707
  return root !== null && workspaceHasMarker(root);
7536
7708
  };
7537
7709
  var propName = (key) => {
7538
- if (key.type === AST_NODE_TYPES35.Identifier) return key.name;
7539
- if (key.type === AST_NODE_TYPES35.Literal && typeof key.value === "string") return key.value;
7710
+ if (key.type === AST_NODE_TYPES36.Identifier) return key.name;
7711
+ if (key.type === AST_NODE_TYPES36.Literal && typeof key.value === "string") return key.value;
7540
7712
  return null;
7541
7713
  };
7714
+ var staticallyImportsEmailOrPdfRenderer = (program) => program.body.some((statement) => {
7715
+ if (statement.type !== AST_NODE_TYPES36.ImportDeclaration && statement.type !== AST_NODE_TYPES36.ExportNamedDeclaration && statement.type !== AST_NODE_TYPES36.ExportAllDeclaration) {
7716
+ return false;
7717
+ }
7718
+ return statement.source !== null && typeof statement.source.value === "string" && EMAIL_OR_PDF_MODULE_RE.test(statement.source.value);
7719
+ });
7542
7720
  var prefer_semantic_colors_default = createRule({
7543
7721
  name: "prefer-semantic-colors",
7544
7722
  meta: {
@@ -7564,44 +7742,49 @@ var prefer_semantic_colors_default = createRule({
7564
7742
  defaultOptions: [{}],
7565
7743
  create(context, [options]) {
7566
7744
  if (STORIES_FILE_RE.test(context.filename)) return {};
7567
- if (EMAIL_OR_PDF_IMPORT_RE.test(context.sourceCode.getText())) return {};
7745
+ if (staticallyImportsEmailOrPdfRenderer(context.sourceCode.ast)) return {};
7568
7746
  if (options?.requireSemanticTokens === true && !hasSemanticTokenSystem(context.filename)) {
7569
7747
  return {};
7570
7748
  }
7749
+ let importsEmailOrPdfRenderer = false;
7750
+ const pendingReports = [];
7751
+ const report = (node, messageId, data) => {
7752
+ pendingReports.push({ node, messageId, data });
7753
+ };
7571
7754
  const reportClasses = (value, node) => {
7572
7755
  for (const token of classTokens(value)) {
7573
7756
  const base = tailwindBase(token);
7574
7757
  if (RAW_PALETTE_RE.test(base)) {
7575
- context.report({ node, messageId: "rawPalette", data: { class: token } });
7758
+ report(node, "rawPalette", { class: token });
7576
7759
  } else if (ARBITRARY_COLOR_RE.test(base) && !CSS_VAR_REFERENCE_RE.test(base)) {
7577
- context.report({ node, messageId: "arbitraryColor", data: { class: token } });
7760
+ report(node, "arbitraryColor", { class: token });
7578
7761
  }
7579
7762
  }
7580
7763
  };
7581
7764
  const checkClassNode = (node) => {
7582
7765
  if (node === null) return;
7583
7766
  switch (node.type) {
7584
- case AST_NODE_TYPES35.Literal:
7767
+ case AST_NODE_TYPES36.Literal:
7585
7768
  if (typeof node.value === "string") reportClasses(node.value, node);
7586
7769
  break;
7587
- case AST_NODE_TYPES35.TemplateLiteral:
7770
+ case AST_NODE_TYPES36.TemplateLiteral:
7588
7771
  for (const quasi of node.quasis) reportClasses(quasi.value.cooked ?? "", quasi);
7589
7772
  break;
7590
- case AST_NODE_TYPES35.ArrayExpression:
7773
+ case AST_NODE_TYPES36.ArrayExpression:
7591
7774
  for (const element of node.elements) {
7592
- if (element !== null && element.type !== AST_NODE_TYPES35.SpreadElement) checkClassNode(element);
7775
+ if (element !== null && element.type !== AST_NODE_TYPES36.SpreadElement) checkClassNode(element);
7593
7776
  }
7594
7777
  break;
7595
- case AST_NODE_TYPES35.ObjectExpression:
7778
+ case AST_NODE_TYPES36.ObjectExpression:
7596
7779
  for (const property of node.properties) {
7597
- if (property.type === AST_NODE_TYPES35.Property) checkClassNode(property.value);
7780
+ if (property.type === AST_NODE_TYPES36.Property) checkClassNode(property.value);
7598
7781
  }
7599
7782
  break;
7600
- case AST_NODE_TYPES35.ConditionalExpression:
7783
+ case AST_NODE_TYPES36.ConditionalExpression:
7601
7784
  checkClassNode(node.consequent);
7602
7785
  checkClassNode(node.alternate);
7603
7786
  break;
7604
- case AST_NODE_TYPES35.LogicalExpression:
7787
+ case AST_NODE_TYPES36.LogicalExpression:
7605
7788
  checkClassNode(node.right);
7606
7789
  break;
7607
7790
  default:
@@ -7609,29 +7792,32 @@ var prefer_semantic_colors_default = createRule({
7609
7792
  }
7610
7793
  };
7611
7794
  const checkColorValueNode = (node) => {
7612
- if (node.type === AST_NODE_TYPES35.Literal && typeof node.value === "string" && RAW_COLOR_VALUE_RE.test(node.value) && !CSS_VAR_REFERENCE_RE.test(node.value)) {
7613
- context.report({ node, messageId: "inlineColor", data: { value: node.value } });
7795
+ if (node.type === AST_NODE_TYPES36.Literal && typeof node.value === "string" && RAW_COLOR_VALUE_RE.test(node.value) && !CSS_VAR_REFERENCE_RE.test(node.value)) {
7796
+ report(node, "inlineColor", { value: node.value });
7614
7797
  }
7615
7798
  };
7616
7799
  return {
7617
7800
  "JSXAttribute[name.name='className']"(node) {
7618
7801
  if (node.value === null) return;
7619
- if (node.value.type === AST_NODE_TYPES35.Literal) checkClassNode(node.value);
7620
- else if (node.value.type === AST_NODE_TYPES35.JSXExpressionContainer) {
7621
- if (node.value.expression.type !== AST_NODE_TYPES35.JSXEmptyExpression) {
7802
+ if (node.value.type === AST_NODE_TYPES36.Literal) checkClassNode(node.value);
7803
+ else if (node.value.type === AST_NODE_TYPES36.JSXExpressionContainer) {
7804
+ if (node.value.expression.type !== AST_NODE_TYPES36.JSXEmptyExpression) {
7622
7805
  checkClassNode(node.value.expression);
7623
7806
  }
7624
7807
  }
7625
7808
  },
7626
7809
  CallExpression(node) {
7627
- if (node.callee.type === AST_NODE_TYPES35.Identifier && CLASS_FNS.has(node.callee.name)) {
7810
+ if (node.callee.type === AST_NODE_TYPES36.Identifier && node.callee.name === "require" && node.arguments[0]?.type === AST_NODE_TYPES36.Literal && typeof node.arguments[0].value === "string" && EMAIL_OR_PDF_MODULE_RE.test(node.arguments[0].value)) {
7811
+ importsEmailOrPdfRenderer = true;
7812
+ }
7813
+ if (node.callee.type === AST_NODE_TYPES36.Identifier && CLASS_FNS.has(node.callee.name)) {
7628
7814
  for (const arg of node.arguments) {
7629
- if (arg.type !== AST_NODE_TYPES35.SpreadElement) checkClassNode(arg);
7815
+ if (arg.type !== AST_NODE_TYPES36.SpreadElement) checkClassNode(arg);
7630
7816
  }
7631
7817
  }
7632
7818
  },
7633
7819
  VariableDeclarator(node) {
7634
- if (node.id.type === AST_NODE_TYPES35.Identifier && CLASS_NAME_RE.test(node.id.name)) {
7820
+ if (node.id.type === AST_NODE_TYPES36.Identifier && CLASS_NAME_RE.test(node.id.name)) {
7635
7821
  checkClassNode(node.init);
7636
7822
  }
7637
7823
  },
@@ -7639,13 +7825,11 @@ var prefer_semantic_colors_default = createRule({
7639
7825
  const name = propName(node.key);
7640
7826
  if (name !== null && CLASS_NAME_RE.test(name)) checkClassNode(node.value);
7641
7827
  },
7642
- // SVG presentation attributes: <path fill="#7c3aed" stroke="#7c3aed" />.
7643
- // Neutral drawing literals and anything inside an SVG defs container are
7644
- // structural, not UI tokens, so they never fire.
7828
+ // SVG artwork colors are exempt; component presentation colors still report.
7645
7829
  "JSXAttribute[name.name=/^(fill|stroke|color)$/]"(node) {
7646
- if (node.value?.type !== AST_NODE_TYPES35.Literal) return;
7830
+ if (node.value?.type !== AST_NODE_TYPES36.Literal) return;
7647
7831
  const owner = node.parent.name;
7648
- if (owner.type === AST_NODE_TYPES35.JSXIdentifier && SVG_SHAPE_PRIMITIVES.has(owner.name)) {
7832
+ if (owner.type === AST_NODE_TYPES36.JSXIdentifier && SVG_SHAPE_PRIMITIVES.has(owner.name)) {
7649
7833
  return;
7650
7834
  }
7651
7835
  if (typeof node.value.value === "string" && SVG_EXEMPT_COLOR_VALUES.has(node.value.value.toLowerCase())) {
@@ -7657,6 +7841,15 @@ var prefer_semantic_colors_default = createRule({
7657
7841
  "JSXAttribute[name.name='style'] ObjectExpression > Property"(node) {
7658
7842
  const name = propName(node.key);
7659
7843
  if (name !== null && STYLE_COLOR_PROPS.has(name)) checkColorValueNode(node.value);
7844
+ },
7845
+ ImportExpression(node) {
7846
+ if (node.source.type === AST_NODE_TYPES36.Literal && typeof node.source.value === "string" && EMAIL_OR_PDF_MODULE_RE.test(node.source.value)) {
7847
+ importsEmailOrPdfRenderer = true;
7848
+ }
7849
+ },
7850
+ "Program:exit"() {
7851
+ if (importsEmailOrPdfRenderer) return;
7852
+ for (const descriptor of pendingReports) context.report(descriptor);
7660
7853
  }
7661
7854
  };
7662
7855
  }
@@ -7724,6 +7917,22 @@ function isMutationMethod(node, context) {
7724
7917
  }
7725
7918
  return false;
7726
7919
  }
7920
+ function isFunctionArgument(node, context) {
7921
+ const resolved = resolveNode(node, context);
7922
+ if (resolved?.type === "ArrowFunctionExpression" || resolved?.type === "FunctionExpression") {
7923
+ return true;
7924
+ }
7925
+ if (node.type !== "Identifier") return false;
7926
+ let scope = getScope(context, node);
7927
+ while (scope) {
7928
+ const variable = scope.set.get(node.name);
7929
+ if (variable?.defs.some((definition) => definition.type === "FunctionName")) {
7930
+ return true;
7931
+ }
7932
+ scope = scope.upper;
7933
+ }
7934
+ return false;
7935
+ }
7727
7936
  function getPropertyNode(objNode, propName2) {
7728
7937
  if (!objNode || objNode.type !== "ObjectExpression") return null;
7729
7938
  for (const prop of objNode.properties) {
@@ -7761,13 +7970,10 @@ var prefer_server_actions_default = createRule({
7761
7970
  if (SKIP_FILE_REGEX.test(filename)) {
7762
7971
  return {};
7763
7972
  }
7764
- let isNonReactFramework = false;
7973
+ const isNonReactFramework = context.sourceCode.ast.body.some(
7974
+ (node) => node.type === "ImportDeclaration" && typeof node.source.value === "string" && NON_REACT_FRAMEWORK_RE.test(node.source.value)
7975
+ );
7765
7976
  return {
7766
- ImportDeclaration(node) {
7767
- if (typeof node.source.value === "string" && NON_REACT_FRAMEWORK_RE.test(node.source.value)) {
7768
- isNonReactFramework = true;
7769
- }
7770
- },
7771
7977
  CallExpression(node) {
7772
7978
  if (isNonReactFramework) return;
7773
7979
  let isMutation = false;
@@ -7788,7 +7994,7 @@ var prefer_server_actions_default = createRule({
7788
7994
  if (AXIOS_MUTATION_METHODS.has(methodName)) {
7789
7995
  const urlArg = node.arguments[0];
7790
7996
  const hasHandlerArg = node.arguments.some(
7791
- (arg) => arg.type === "ArrowFunctionExpression" || arg.type === "FunctionExpression"
7997
+ (arg) => arg.type !== "SpreadElement" && isFunctionArgument(arg, context)
7792
7998
  );
7793
7999
  if (urlArg && urlArg.type !== "SpreadElement" && !hasHandlerArg && isApiUrl(urlArg, context)) {
7794
8000
  isMutation = true;
@@ -7815,10 +8021,35 @@ var prefer_server_actions_default = createRule({
7815
8021
  }
7816
8022
  });
7817
8023
 
8024
+ // src/rules/prefer-single-sentence-comment.ts
8025
+ var prefer_single_sentence_comment_default = createRule({
8026
+ name: "prefer-single-sentence-comment",
8027
+ meta: {
8028
+ type: "suggestion",
8029
+ docs: { description: "Prefer one sentence and self-documenting code over a two-sentence comment." },
8030
+ schema: [],
8031
+ messages: {
8032
+ preferOneSentence: "Two-sentence comment \u2014 prefer one sentence and self-documenting code."
8033
+ }
8034
+ },
8035
+ defaultOptions: [],
8036
+ create(context) {
8037
+ return {
8038
+ Program() {
8039
+ for (const group of proseGroups(context.filename, context.sourceCode)) {
8040
+ if (!group.hasTypedTags && sentenceUnits(group.text) === 2) {
8041
+ context.report({ node: group.comment, messageId: "preferOneSentence" });
8042
+ }
8043
+ }
8044
+ }
8045
+ };
8046
+ }
8047
+ });
8048
+
7818
8049
  // src/rules/prefer-string-literal-union.ts
7819
8050
  import {
7820
8051
  ESLintUtils as ESLintUtils3,
7821
- AST_NODE_TYPES as AST_NODE_TYPES36
8052
+ AST_NODE_TYPES as AST_NODE_TYPES37
7822
8053
  } from "@typescript-eslint/utils";
7823
8054
  import * as ts2 from "typescript";
7824
8055
  var CHOICE_TOKENS = /* @__PURE__ */ new Set([
@@ -7862,19 +8093,19 @@ function isChoiceLikeName(name) {
7862
8093
  return CHOICE_TOKENS.has(lastWord(name));
7863
8094
  }
7864
8095
  function keyName(key) {
7865
- if (key.type === AST_NODE_TYPES36.Identifier) {
8096
+ if (key.type === AST_NODE_TYPES37.Identifier) {
7866
8097
  return key.name;
7867
8098
  }
7868
- if (key.type === AST_NODE_TYPES36.Literal && typeof key.value === "string") {
8099
+ if (key.type === AST_NODE_TYPES37.Literal && typeof key.value === "string") {
7869
8100
  return key.value;
7870
8101
  }
7871
8102
  return null;
7872
8103
  }
7873
8104
  function isStringLiteralMember(t) {
7874
- return t.type === AST_NODE_TYPES36.TSLiteralType && t.literal.type === AST_NODE_TYPES36.Literal && typeof t.literal.value === "string";
8105
+ return t.type === AST_NODE_TYPES37.TSLiteralType && t.literal.type === AST_NODE_TYPES37.Literal && typeof t.literal.value === "string";
7875
8106
  }
7876
8107
  function isStringLiteralUnion(node) {
7877
- if (node?.type !== AST_NODE_TYPES36.TSUnionType) {
8108
+ if (node?.type !== AST_NODE_TYPES37.TSUnionType) {
7878
8109
  return false;
7879
8110
  }
7880
8111
  return node.types.filter(isStringLiteralMember).length >= MIN_CLUSTER_SIZE;
@@ -7903,12 +8134,12 @@ function bindingSourceExpression(decl) {
7903
8134
  return ts2.isForOfStatement(node) ? node.expression : node.initializer;
7904
8135
  }
7905
8136
  function refKey(node) {
7906
- if (node.type === AST_NODE_TYPES36.Identifier) {
8137
+ if (node.type === AST_NODE_TYPES37.Identifier) {
7907
8138
  return node.name;
7908
8139
  }
7909
- if (node.type === AST_NODE_TYPES36.MemberExpression && !node.computed) {
8140
+ if (node.type === AST_NODE_TYPES37.MemberExpression && !node.computed) {
7910
8141
  const inner = refKey(node.object);
7911
- if (inner === null || node.property.type !== AST_NODE_TYPES36.Identifier) {
8142
+ if (inner === null || node.property.type !== AST_NODE_TYPES37.Identifier) {
7912
8143
  return null;
7913
8144
  }
7914
8145
  return `${inner}.${node.property.name}`;
@@ -7916,7 +8147,7 @@ function refKey(node) {
7916
8147
  return null;
7917
8148
  }
7918
8149
  function strLiteral(node) {
7919
- if (node.type === AST_NODE_TYPES36.Literal && typeof node.value === "string") {
8150
+ if (node.type === AST_NODE_TYPES37.Literal && typeof node.value === "string") {
7920
8151
  return node.value;
7921
8152
  }
7922
8153
  return null;
@@ -8069,7 +8300,7 @@ var prefer_string_literal_union_default = createRule({
8069
8300
  containersWithUnion.add(container);
8070
8301
  return;
8071
8302
  }
8072
- if (typeNode?.type !== AST_NODE_TYPES36.TSStringKeyword) {
8303
+ if (typeNode?.type !== AST_NODE_TYPES37.TSStringKeyword) {
8073
8304
  return;
8074
8305
  }
8075
8306
  const name = keyName(key);
@@ -8157,10 +8388,10 @@ var prefer_string_literal_union_default = createRule({
8157
8388
  }
8158
8389
  };
8159
8390
  function refKeyText(node) {
8160
- if (node.type === AST_NODE_TYPES36.BinaryExpression) {
8391
+ if (node.type === AST_NODE_TYPES37.BinaryExpression) {
8161
8392
  return refKey(node.left) ?? refKey(node.right) ?? "value";
8162
8393
  }
8163
- if (node.type === AST_NODE_TYPES36.SwitchStatement) {
8394
+ if (node.type === AST_NODE_TYPES37.SwitchStatement) {
8164
8395
  return refKey(node.discriminant) ?? "value";
8165
8396
  }
8166
8397
  return "value";
@@ -8169,7 +8400,7 @@ var prefer_string_literal_union_default = createRule({
8169
8400
  });
8170
8401
 
8171
8402
  // src/rules/prefer-whole-object-assertion.ts
8172
- import { AST_NODE_TYPES as AST_NODE_TYPES37 } from "@typescript-eslint/utils";
8403
+ import { AST_NODE_TYPES as AST_NODE_TYPES38 } from "@typescript-eslint/utils";
8173
8404
  var MERGEABLE_MATCHERS = /* @__PURE__ */ new Set(["toBe", "toEqual", "toStrictEqual"]);
8174
8405
  var ARRAY_MATCHERS = /* @__PURE__ */ new Set(["toEqual", "toStrictEqual"]);
8175
8406
  var COLLECTION_PROPERTIES = /* @__PURE__ */ new Set(["length", "size"]);
@@ -8178,11 +8409,11 @@ var NUMERIC_SIGNS2 = /* @__PURE__ */ new Set(["-", "+"]);
8178
8409
  var MIN_RUN_LENGTH = 2;
8179
8410
  function literalText(node, getText) {
8180
8411
  switch (node.type) {
8181
- case AST_NODE_TYPES37.Literal:
8412
+ case AST_NODE_TYPES38.Literal:
8182
8413
  return "regex" in node ? null : getText(node);
8183
- case AST_NODE_TYPES37.TemplateLiteral:
8414
+ case AST_NODE_TYPES38.TemplateLiteral:
8184
8415
  return node.expressions.length === 0 ? getText(node) : null;
8185
- case AST_NODE_TYPES37.UnaryExpression:
8416
+ case AST_NODE_TYPES38.UnaryExpression:
8186
8417
  return NUMERIC_SIGNS2.has(node.operator) && literalText(node.argument, getText) !== null ? getText(node) : null;
8187
8418
  default:
8188
8419
  return null;
@@ -8190,15 +8421,15 @@ function literalText(node, getText) {
8190
8421
  }
8191
8422
  function isPureReceiver(node) {
8192
8423
  switch (node.type) {
8193
- case AST_NODE_TYPES37.Identifier:
8194
- case AST_NODE_TYPES37.ThisExpression:
8424
+ case AST_NODE_TYPES38.Identifier:
8425
+ case AST_NODE_TYPES38.ThisExpression:
8195
8426
  return true;
8196
- case AST_NODE_TYPES37.MemberExpression:
8427
+ case AST_NODE_TYPES38.MemberExpression:
8197
8428
  if (node.optional) {
8198
8429
  return false;
8199
8430
  }
8200
8431
  if (node.computed) {
8201
- return node.property.type === AST_NODE_TYPES37.Literal && isPureReceiver(node.object);
8432
+ return node.property.type === AST_NODE_TYPES38.Literal && isPureReceiver(node.object);
8202
8433
  }
8203
8434
  return isPureReceiver(node.object);
8204
8435
  default:
@@ -8206,7 +8437,7 @@ function isPureReceiver(node) {
8206
8437
  }
8207
8438
  }
8208
8439
  function literalIndex(node) {
8209
- if (node.type !== AST_NODE_TYPES37.Literal || typeof node.value !== "number") {
8440
+ if (node.type !== AST_NODE_TYPES38.Literal || typeof node.value !== "number") {
8210
8441
  return null;
8211
8442
  }
8212
8443
  return Number.isInteger(node.value) && node.value >= 0 ? node.value : null;
@@ -8232,24 +8463,24 @@ var prefer_whole_object_assertion_default = createRule({
8232
8463
  }
8233
8464
  const { sourceCode } = context;
8234
8465
  function parseAssertion(statement) {
8235
- if (statement.type !== AST_NODE_TYPES37.ExpressionStatement) {
8466
+ if (statement.type !== AST_NODE_TYPES38.ExpressionStatement) {
8236
8467
  return null;
8237
8468
  }
8238
8469
  const call = statement.expression;
8239
- if (call.type !== AST_NODE_TYPES37.CallExpression) {
8470
+ if (call.type !== AST_NODE_TYPES38.CallExpression) {
8240
8471
  return null;
8241
8472
  }
8242
8473
  const callee = call.callee;
8243
- if (callee.type !== AST_NODE_TYPES37.MemberExpression || callee.computed || callee.property.type !== AST_NODE_TYPES37.Identifier) {
8474
+ if (callee.type !== AST_NODE_TYPES38.MemberExpression || callee.computed || callee.property.type !== AST_NODE_TYPES38.Identifier) {
8244
8475
  return null;
8245
8476
  }
8246
8477
  const matcher = callee.property.name;
8247
8478
  const expectCall = callee.object;
8248
- if (expectCall.type !== AST_NODE_TYPES37.CallExpression || expectCall.callee.type !== AST_NODE_TYPES37.Identifier || expectCall.callee.name !== "expect" || expectCall.arguments.length !== 1) {
8479
+ if (expectCall.type !== AST_NODE_TYPES38.CallExpression || expectCall.callee.type !== AST_NODE_TYPES38.Identifier || expectCall.callee.name !== "expect" || expectCall.arguments.length !== 1) {
8249
8480
  return null;
8250
8481
  }
8251
8482
  const actual = expectCall.arguments[0];
8252
- if (actual === void 0 || actual.type !== AST_NODE_TYPES37.MemberExpression || actual.optional) {
8483
+ if (actual === void 0 || actual.type !== AST_NODE_TYPES38.MemberExpression || actual.optional) {
8253
8484
  return null;
8254
8485
  }
8255
8486
  if (!isPureReceiver(actual.object)) {
@@ -8263,7 +8494,7 @@ var prefer_whole_object_assertion_default = createRule({
8263
8494
  }
8264
8495
  key = { kind: "index", index };
8265
8496
  } else {
8266
- if (actual.property.type !== AST_NODE_TYPES37.Identifier || COLLECTION_PROPERTIES.has(actual.property.name) || LITERAL_KEY_HAZARDS.has(actual.property.name)) {
8497
+ if (actual.property.type !== AST_NODE_TYPES38.Identifier || COLLECTION_PROPERTIES.has(actual.property.name) || LITERAL_KEY_HAZARDS.has(actual.property.name)) {
8267
8498
  return null;
8268
8499
  }
8269
8500
  key = { kind: "property", name: actual.property.name };
@@ -8275,7 +8506,7 @@ var prefer_whole_object_assertion_default = createRule({
8275
8506
  return null;
8276
8507
  }
8277
8508
  const expected = call.arguments[0];
8278
- if (call.arguments.length !== 1 || expected === void 0 || expected.type === AST_NODE_TYPES37.SpreadElement) {
8509
+ if (call.arguments.length !== 1 || expected === void 0 || expected.type === AST_NODE_TYPES38.SpreadElement) {
8279
8510
  return null;
8280
8511
  }
8281
8512
  const literal = literalText(expected, (node) => sourceCode.getText(node));
@@ -8351,7 +8582,7 @@ var prefer_whole_object_assertion_default = createRule({
8351
8582
  }
8352
8583
  });
8353
8584
  }
8354
- function checkBody(body) {
8585
+ function checkBody(body2) {
8355
8586
  let run = [];
8356
8587
  const flush = () => {
8357
8588
  const first = run[0];
@@ -8364,7 +8595,7 @@ var prefer_whole_object_assertion_default = createRule({
8364
8595
  }
8365
8596
  run = [];
8366
8597
  };
8367
- for (const statement of body) {
8598
+ for (const statement of body2) {
8368
8599
  const assertion = parseAssertion(statement);
8369
8600
  const previous = run.at(-1);
8370
8601
  if (assertion !== null && previous !== void 0 && previous.key.kind === assertion.key.kind && sourceCode.getText(previous.receiver) === sourceCode.getText(assertion.receiver)) {
@@ -8390,7 +8621,7 @@ var prefer_whole_object_assertion_default = createRule({
8390
8621
  });
8391
8622
 
8392
8623
  // src/rules/prefer-zod-enum.ts
8393
- import { AST_NODE_TYPES as AST_NODE_TYPES38 } from "@typescript-eslint/utils";
8624
+ import { AST_NODE_TYPES as AST_NODE_TYPES39 } from "@typescript-eslint/utils";
8394
8625
  var prefer_zod_enum_default = createRule({
8395
8626
  name: "prefer-zod-enum",
8396
8627
  meta: {
@@ -8410,33 +8641,39 @@ var prefer_zod_enum_default = createRule({
8410
8641
  const zodNamespaces = /* @__PURE__ */ new Set();
8411
8642
  function enumValues(node) {
8412
8643
  const callee = node.callee;
8413
- if (callee.type !== AST_NODE_TYPES38.MemberExpression || callee.computed || callee.object.type !== AST_NODE_TYPES38.Identifier || !zodNamespaces.has(callee.object.name) || callee.property.type !== AST_NODE_TYPES38.Identifier || callee.property.name !== "union" || node.arguments.length !== 1) {
8644
+ if (callee.type !== AST_NODE_TYPES39.MemberExpression || callee.computed || callee.object.type !== AST_NODE_TYPES39.Identifier || !zodNamespaces.has(callee.object.name) || callee.property.type !== AST_NODE_TYPES39.Identifier || callee.property.name !== "union" || node.arguments.length !== 1) {
8414
8645
  return null;
8415
8646
  }
8416
8647
  const argument = node.arguments[0];
8417
- if (argument === void 0 || argument.type !== AST_NODE_TYPES38.ArrayExpression || argument.elements.length === 0) {
8648
+ if (argument === void 0 || argument.type !== AST_NODE_TYPES39.ArrayExpression || argument.elements.length === 0) {
8418
8649
  return null;
8419
8650
  }
8420
8651
  const values = [];
8652
+ let canFix = true;
8421
8653
  for (const element of argument.elements) {
8422
- if (element === null || element.type !== AST_NODE_TYPES38.CallExpression || element.arguments.length !== 1 || element.callee.type !== AST_NODE_TYPES38.MemberExpression || element.callee.computed || element.callee.object.type !== AST_NODE_TYPES38.Identifier || !zodNamespaces.has(element.callee.object.name) || element.callee.property.type !== AST_NODE_TYPES38.Identifier || element.callee.property.name !== "literal") {
8654
+ if (element?.type === AST_NODE_TYPES39.SpreadElement) {
8655
+ canFix = false;
8656
+ continue;
8657
+ }
8658
+ if (element === null || element.type !== AST_NODE_TYPES39.CallExpression || element.callee.type !== AST_NODE_TYPES39.MemberExpression || element.callee.computed || element.callee.object.type !== AST_NODE_TYPES39.Identifier || !zodNamespaces.has(element.callee.object.name) || element.callee.property.type !== AST_NODE_TYPES39.Identifier || element.callee.property.name !== "literal") {
8423
8659
  return null;
8424
8660
  }
8425
8661
  const value = element.arguments[0];
8426
- if (value === void 0 || value.type !== AST_NODE_TYPES38.Literal || typeof value.value !== "string") {
8427
- return null;
8662
+ if (element.arguments.length !== 1 || value === void 0 || value.type !== AST_NODE_TYPES39.Literal || typeof value.value !== "string") {
8663
+ canFix = false;
8664
+ continue;
8428
8665
  }
8429
8666
  values.push(value);
8430
8667
  }
8431
- return values;
8668
+ return canFix ? values : void 0;
8432
8669
  }
8433
8670
  function buildFix(node, values) {
8434
8671
  const argument = node.arguments[0];
8435
- if (argument === void 0 || argument.type !== AST_NODE_TYPES38.ArrayExpression || sourceCode.getCommentsInside(argument).length > 0) {
8672
+ if (argument === void 0 || argument.type !== AST_NODE_TYPES39.ArrayExpression || sourceCode.getCommentsInside(argument).length > 0) {
8436
8673
  return void 0;
8437
8674
  }
8438
8675
  const callee = node.callee;
8439
- if (callee.type !== AST_NODE_TYPES38.MemberExpression || callee.property.type !== AST_NODE_TYPES38.Identifier) {
8676
+ if (callee.type !== AST_NODE_TYPES39.MemberExpression || callee.property.type !== AST_NODE_TYPES39.Identifier) {
8440
8677
  return void 0;
8441
8678
  }
8442
8679
  return (fixer) => [
@@ -8453,7 +8690,7 @@ var prefer_zod_enum_default = createRule({
8453
8690
  return;
8454
8691
  }
8455
8692
  for (const specifier of node.specifiers) {
8456
- if (specifier.type === AST_NODE_TYPES38.ImportNamespaceSpecifier || specifier.type === AST_NODE_TYPES38.ImportDefaultSpecifier || specifier.type === AST_NODE_TYPES38.ImportSpecifier && specifier.imported.type === AST_NODE_TYPES38.Identifier && specifier.imported.name === "z") {
8693
+ if (specifier.type === AST_NODE_TYPES39.ImportNamespaceSpecifier || specifier.type === AST_NODE_TYPES39.ImportDefaultSpecifier || specifier.type === AST_NODE_TYPES39.ImportSpecifier && specifier.imported.type === AST_NODE_TYPES39.Identifier && specifier.imported.name === "z") {
8457
8694
  zodNamespaces.add(specifier.local.name);
8458
8695
  }
8459
8696
  }
@@ -8463,7 +8700,7 @@ var prefer_zod_enum_default = createRule({
8463
8700
  if (values === null) {
8464
8701
  return;
8465
8702
  }
8466
- const fix = buildFix(node, values);
8703
+ const fix = values === void 0 ? void 0 : buildFix(node, values);
8467
8704
  context.report({
8468
8705
  node,
8469
8706
  messageId: "preferEnum",
@@ -8475,7 +8712,7 @@ var prefer_zod_enum_default = createRule({
8475
8712
  });
8476
8713
 
8477
8714
  // src/rules/prefer-zod-infer.ts
8478
- import { AST_NODE_TYPES as AST_NODE_TYPES39 } from "@typescript-eslint/utils";
8715
+ import { AST_NODE_TYPES as AST_NODE_TYPES40 } from "@typescript-eslint/utils";
8479
8716
  var SHAPE_PRESERVING_METHODS = /* @__PURE__ */ new Set([
8480
8717
  "describe",
8481
8718
  "refine",
@@ -8512,44 +8749,44 @@ var ZOD_TYPE_CONSTRAINTS = /* @__PURE__ */ new Set([
8512
8749
  "Schema"
8513
8750
  ]);
8514
8751
  var LEAF_NODE_TYPES = {
8515
- string: [AST_NODE_TYPES39.TSStringKeyword],
8516
- email: [AST_NODE_TYPES39.TSStringKeyword],
8517
- url: [AST_NODE_TYPES39.TSStringKeyword],
8518
- uuid: [AST_NODE_TYPES39.TSStringKeyword],
8519
- ulid: [AST_NODE_TYPES39.TSStringKeyword],
8520
- cuid: [AST_NODE_TYPES39.TSStringKeyword],
8521
- cuid2: [AST_NODE_TYPES39.TSStringKeyword],
8522
- nanoid: [AST_NODE_TYPES39.TSStringKeyword],
8523
- iso: [AST_NODE_TYPES39.TSStringKeyword],
8524
- number: [AST_NODE_TYPES39.TSNumberKeyword],
8525
- int: [AST_NODE_TYPES39.TSNumberKeyword],
8526
- float32: [AST_NODE_TYPES39.TSNumberKeyword],
8527
- float64: [AST_NODE_TYPES39.TSNumberKeyword],
8528
- boolean: [AST_NODE_TYPES39.TSBooleanKeyword],
8529
- bigint: [AST_NODE_TYPES39.TSBigIntKeyword],
8530
- symbol: [AST_NODE_TYPES39.TSSymbolKeyword],
8531
- any: [AST_NODE_TYPES39.TSAnyKeyword],
8532
- unknown: [AST_NODE_TYPES39.TSUnknownKeyword],
8533
- never: [AST_NODE_TYPES39.TSNeverKeyword],
8534
- void: [AST_NODE_TYPES39.TSVoidKeyword],
8535
- null: [AST_NODE_TYPES39.TSNullKeyword],
8536
- undefined: [AST_NODE_TYPES39.TSUndefinedKeyword],
8537
- literal: [AST_NODE_TYPES39.TSLiteralType],
8538
- date: [AST_NODE_TYPES39.TSTypeReference],
8539
- array: [AST_NODE_TYPES39.TSArrayType, AST_NODE_TYPES39.TSTypeReference],
8540
- tuple: [AST_NODE_TYPES39.TSTupleType],
8541
- object: [AST_NODE_TYPES39.TSTypeLiteral, AST_NODE_TYPES39.TSTypeReference],
8542
- strictObject: [AST_NODE_TYPES39.TSTypeLiteral, AST_NODE_TYPES39.TSTypeReference],
8543
- looseObject: [AST_NODE_TYPES39.TSTypeLiteral, AST_NODE_TYPES39.TSTypeReference],
8544
- record: [AST_NODE_TYPES39.TSTypeReference, AST_NODE_TYPES39.TSTypeLiteral],
8545
- map: [AST_NODE_TYPES39.TSTypeReference],
8546
- set: [AST_NODE_TYPES39.TSTypeReference],
8547
- promise: [AST_NODE_TYPES39.TSTypeReference],
8548
- enum: [AST_NODE_TYPES39.TSUnionType, AST_NODE_TYPES39.TSTypeReference, AST_NODE_TYPES39.TSLiteralType],
8549
- nativeEnum: [AST_NODE_TYPES39.TSUnionType, AST_NODE_TYPES39.TSTypeReference, AST_NODE_TYPES39.TSLiteralType],
8550
- union: [AST_NODE_TYPES39.TSUnionType, AST_NODE_TYPES39.TSTypeReference],
8551
- discriminatedUnion: [AST_NODE_TYPES39.TSUnionType, AST_NODE_TYPES39.TSTypeReference],
8552
- intersection: [AST_NODE_TYPES39.TSIntersectionType, AST_NODE_TYPES39.TSTypeReference]
8752
+ string: [AST_NODE_TYPES40.TSStringKeyword],
8753
+ email: [AST_NODE_TYPES40.TSStringKeyword],
8754
+ url: [AST_NODE_TYPES40.TSStringKeyword],
8755
+ uuid: [AST_NODE_TYPES40.TSStringKeyword],
8756
+ ulid: [AST_NODE_TYPES40.TSStringKeyword],
8757
+ cuid: [AST_NODE_TYPES40.TSStringKeyword],
8758
+ cuid2: [AST_NODE_TYPES40.TSStringKeyword],
8759
+ nanoid: [AST_NODE_TYPES40.TSStringKeyword],
8760
+ iso: [AST_NODE_TYPES40.TSStringKeyword],
8761
+ number: [AST_NODE_TYPES40.TSNumberKeyword],
8762
+ int: [AST_NODE_TYPES40.TSNumberKeyword],
8763
+ float32: [AST_NODE_TYPES40.TSNumberKeyword],
8764
+ float64: [AST_NODE_TYPES40.TSNumberKeyword],
8765
+ boolean: [AST_NODE_TYPES40.TSBooleanKeyword],
8766
+ bigint: [AST_NODE_TYPES40.TSBigIntKeyword],
8767
+ symbol: [AST_NODE_TYPES40.TSSymbolKeyword],
8768
+ any: [AST_NODE_TYPES40.TSAnyKeyword],
8769
+ unknown: [AST_NODE_TYPES40.TSUnknownKeyword],
8770
+ never: [AST_NODE_TYPES40.TSNeverKeyword],
8771
+ void: [AST_NODE_TYPES40.TSVoidKeyword],
8772
+ null: [AST_NODE_TYPES40.TSNullKeyword],
8773
+ undefined: [AST_NODE_TYPES40.TSUndefinedKeyword],
8774
+ literal: [AST_NODE_TYPES40.TSLiteralType],
8775
+ date: [AST_NODE_TYPES40.TSTypeReference],
8776
+ array: [AST_NODE_TYPES40.TSArrayType, AST_NODE_TYPES40.TSTypeReference],
8777
+ tuple: [AST_NODE_TYPES40.TSTupleType],
8778
+ object: [AST_NODE_TYPES40.TSTypeLiteral, AST_NODE_TYPES40.TSTypeReference],
8779
+ strictObject: [AST_NODE_TYPES40.TSTypeLiteral, AST_NODE_TYPES40.TSTypeReference],
8780
+ looseObject: [AST_NODE_TYPES40.TSTypeLiteral, AST_NODE_TYPES40.TSTypeReference],
8781
+ record: [AST_NODE_TYPES40.TSTypeReference, AST_NODE_TYPES40.TSTypeLiteral],
8782
+ map: [AST_NODE_TYPES40.TSTypeReference],
8783
+ set: [AST_NODE_TYPES40.TSTypeReference],
8784
+ promise: [AST_NODE_TYPES40.TSTypeReference],
8785
+ enum: [AST_NODE_TYPES40.TSUnionType, AST_NODE_TYPES40.TSTypeReference, AST_NODE_TYPES40.TSLiteralType],
8786
+ nativeEnum: [AST_NODE_TYPES40.TSUnionType, AST_NODE_TYPES40.TSTypeReference, AST_NODE_TYPES40.TSLiteralType],
8787
+ union: [AST_NODE_TYPES40.TSUnionType, AST_NODE_TYPES40.TSTypeReference],
8788
+ discriminatedUnion: [AST_NODE_TYPES40.TSUnionType, AST_NODE_TYPES40.TSTypeReference],
8789
+ intersection: [AST_NODE_TYPES40.TSIntersectionType, AST_NODE_TYPES40.TSTypeReference]
8553
8790
  };
8554
8791
  function normalizeSchemaName(name) {
8555
8792
  return name.replace(/Schema$/i, "").replace(/^Z(?=[A-Z])/, "").toLowerCase();
@@ -8558,20 +8795,20 @@ function normalizeTypeName(name) {
8558
8795
  return name.replace(/Type$/, "").toLowerCase();
8559
8796
  }
8560
8797
  function unwrapNullish(annotation) {
8561
- if (annotation.type !== AST_NODE_TYPES39.TSUnionType) {
8798
+ if (annotation.type !== AST_NODE_TYPES40.TSUnionType) {
8562
8799
  return {
8563
8800
  core: annotation,
8564
- nullable: annotation.type === AST_NODE_TYPES39.TSNullKeyword
8801
+ nullable: annotation.type === AST_NODE_TYPES40.TSNullKeyword
8565
8802
  };
8566
8803
  }
8567
8804
  const rest = [];
8568
8805
  let nullable = false;
8569
8806
  for (const member of annotation.types) {
8570
- if (member.type === AST_NODE_TYPES39.TSNullKeyword) {
8807
+ if (member.type === AST_NODE_TYPES40.TSNullKeyword) {
8571
8808
  nullable = true;
8572
8809
  continue;
8573
8810
  }
8574
- if (member.type === AST_NODE_TYPES39.TSUndefinedKeyword) {
8811
+ if (member.type === AST_NODE_TYPES40.TSUndefinedKeyword) {
8575
8812
  continue;
8576
8813
  }
8577
8814
  rest.push(member);
@@ -8636,14 +8873,14 @@ var prefer_zod_infer_default = createRule({
8636
8873
  function zodCallChain(node) {
8637
8874
  const chain = [];
8638
8875
  let current = node;
8639
- while (current.type === AST_NODE_TYPES39.CallExpression) {
8876
+ while (current.type === AST_NODE_TYPES40.CallExpression) {
8640
8877
  const callee = current.callee;
8641
- if (callee.type !== AST_NODE_TYPES39.MemberExpression || callee.computed || callee.property.type !== AST_NODE_TYPES39.Identifier) {
8878
+ if (callee.type !== AST_NODE_TYPES40.MemberExpression || callee.computed || callee.property.type !== AST_NODE_TYPES40.Identifier) {
8642
8879
  return null;
8643
8880
  }
8644
8881
  chain.push(current);
8645
8882
  const receiver = callee.object;
8646
- if (receiver.type === AST_NODE_TYPES39.Identifier) {
8883
+ if (receiver.type === AST_NODE_TYPES40.Identifier) {
8647
8884
  return zodNamespaces.has(receiver.name) ? chain.reverse() : null;
8648
8885
  }
8649
8886
  current = receiver;
@@ -8652,19 +8889,19 @@ var prefer_zod_infer_default = createRule({
8652
8889
  }
8653
8890
  function methodName(call) {
8654
8891
  const callee = call.callee;
8655
- return callee.type === AST_NODE_TYPES39.MemberExpression && callee.property.type === AST_NODE_TYPES39.Identifier ? callee.property.name : "";
8892
+ return callee.type === AST_NODE_TYPES40.MemberExpression && callee.property.type === AST_NODE_TYPES40.Identifier ? callee.property.name : "";
8656
8893
  }
8657
8894
  function schemaField(node) {
8658
8895
  const modifiers = [];
8659
8896
  let current = node;
8660
8897
  let leaf = null;
8661
- while (current.type === AST_NODE_TYPES39.CallExpression) {
8898
+ while (current.type === AST_NODE_TYPES40.CallExpression) {
8662
8899
  const callee = current.callee;
8663
- if (callee.type !== AST_NODE_TYPES39.MemberExpression || callee.computed || callee.property.type !== AST_NODE_TYPES39.Identifier) {
8900
+ if (callee.type !== AST_NODE_TYPES40.MemberExpression || callee.computed || callee.property.type !== AST_NODE_TYPES40.Identifier) {
8664
8901
  break;
8665
8902
  }
8666
8903
  const receiver = callee.object;
8667
- if (receiver.type === AST_NODE_TYPES39.Identifier && zodNamespaces.has(receiver.name)) {
8904
+ if (receiver.type === AST_NODE_TYPES40.Identifier && zodNamespaces.has(receiver.name)) {
8668
8905
  leaf = callee.property.name;
8669
8906
  break;
8670
8907
  }
@@ -8695,16 +8932,16 @@ var prefer_zod_infer_default = createRule({
8695
8932
  return null;
8696
8933
  }
8697
8934
  const shape = base.arguments[0];
8698
- if (shape === void 0 || shape.type !== AST_NODE_TYPES39.ObjectExpression) {
8935
+ if (shape === void 0 || shape.type !== AST_NODE_TYPES40.ObjectExpression) {
8699
8936
  return null;
8700
8937
  }
8701
8938
  const fields = /* @__PURE__ */ new Map();
8702
8939
  for (const property of shape.properties) {
8703
- if (property.type !== AST_NODE_TYPES39.Property || property.computed) {
8940
+ if (property.type !== AST_NODE_TYPES40.Property || property.computed) {
8704
8941
  return null;
8705
8942
  }
8706
8943
  const { key } = property;
8707
- const name = key.type === AST_NODE_TYPES39.Identifier ? key.name : key.type === AST_NODE_TYPES39.Literal && typeof key.value === "string" ? key.value : null;
8944
+ const name = key.type === AST_NODE_TYPES40.Identifier ? key.name : key.type === AST_NODE_TYPES40.Literal && typeof key.value === "string" ? key.value : null;
8708
8945
  if (name === null) {
8709
8946
  return null;
8710
8947
  }
@@ -8715,11 +8952,11 @@ var prefer_zod_infer_default = createRule({
8715
8952
  function typeMembers(members) {
8716
8953
  const result = /* @__PURE__ */ new Map();
8717
8954
  for (const member of members) {
8718
- if (member.type !== AST_NODE_TYPES39.TSPropertySignature || member.computed) {
8955
+ if (member.type !== AST_NODE_TYPES40.TSPropertySignature || member.computed) {
8719
8956
  return null;
8720
8957
  }
8721
8958
  const { key } = member;
8722
- const name = key.type === AST_NODE_TYPES39.Identifier ? key.name : key.type === AST_NODE_TYPES39.Literal && typeof key.value === "string" ? key.value : null;
8959
+ const name = key.type === AST_NODE_TYPES40.Identifier ? key.name : key.type === AST_NODE_TYPES40.Literal && typeof key.value === "string" ? key.value : null;
8723
8960
  if (name === null) {
8724
8961
  return null;
8725
8962
  }
@@ -8733,8 +8970,8 @@ var prefer_zod_infer_default = createRule({
8733
8970
  return result.size === 0 ? null : result;
8734
8971
  }
8735
8972
  function collectConstrainedNames(node) {
8736
- if (node.type === AST_NODE_TYPES39.TSTypeReference) {
8737
- if (node.typeName.type === AST_NODE_TYPES39.Identifier) {
8973
+ if (node.type === AST_NODE_TYPES40.TSTypeReference) {
8974
+ if (node.typeName.type === AST_NODE_TYPES40.Identifier) {
8738
8975
  constrainedTypeNames.add(node.typeName.name);
8739
8976
  }
8740
8977
  for (const argument of node.typeArguments?.params ?? []) {
@@ -8742,11 +8979,11 @@ var prefer_zod_infer_default = createRule({
8742
8979
  }
8743
8980
  return;
8744
8981
  }
8745
- if (node.type === AST_NODE_TYPES39.TSArrayType) {
8982
+ if (node.type === AST_NODE_TYPES40.TSArrayType) {
8746
8983
  collectConstrainedNames(node.elementType);
8747
8984
  return;
8748
8985
  }
8749
- if (node.type === AST_NODE_TYPES39.TSUnionType || node.type === AST_NODE_TYPES39.TSIntersectionType) {
8986
+ if (node.type === AST_NODE_TYPES40.TSUnionType || node.type === AST_NODE_TYPES40.TSIntersectionType) {
8750
8987
  for (const member of node.types) {
8751
8988
  collectConstrainedNames(member);
8752
8989
  }
@@ -8790,13 +9027,13 @@ var prefer_zod_infer_default = createRule({
8790
9027
  return;
8791
9028
  }
8792
9029
  for (const specifier of node.specifiers) {
8793
- if (specifier.type === AST_NODE_TYPES39.ImportNamespaceSpecifier || specifier.type === AST_NODE_TYPES39.ImportDefaultSpecifier || specifier.type === AST_NODE_TYPES39.ImportSpecifier && specifier.imported.type === AST_NODE_TYPES39.Identifier && specifier.imported.name === "z") {
9030
+ if (specifier.type === AST_NODE_TYPES40.ImportNamespaceSpecifier || specifier.type === AST_NODE_TYPES40.ImportDefaultSpecifier || specifier.type === AST_NODE_TYPES40.ImportSpecifier && specifier.imported.type === AST_NODE_TYPES40.Identifier && specifier.imported.name === "z") {
8794
9031
  zodNamespaces.add(specifier.local.name);
8795
9032
  }
8796
9033
  }
8797
9034
  },
8798
9035
  VariableDeclarator(node) {
8799
- if (node.id.type !== AST_NODE_TYPES39.Identifier || node.init == null) {
9036
+ if (node.id.type !== AST_NODE_TYPES40.Identifier || node.init == null) {
8800
9037
  return;
8801
9038
  }
8802
9039
  const fields = schemaFields(node.init);
@@ -8804,16 +9041,16 @@ var prefer_zod_infer_default = createRule({
8804
9041
  schemas.push({ name: node.id.name, fields });
8805
9042
  }
8806
9043
  },
8807
- /** Guard (f): `XSchema.transform(...)` anywhere in the module. */
9044
+ /** Records `XSchema.transform(...)` and equivalent module-level reshaping. */
8808
9045
  "MemberExpression[computed=false]"(node) {
8809
- if (node.object.type === AST_NODE_TYPES39.Identifier && node.property.type === AST_NODE_TYPES39.Identifier && MODULE_LEVEL_RESHAPERS.has(node.property.name)) {
9046
+ if (node.object.type === AST_NODE_TYPES40.Identifier && node.property.type === AST_NODE_TYPES40.Identifier && MODULE_LEVEL_RESHAPERS.has(node.property.name)) {
8810
9047
  reshapedSchemaNames.add(node.object.name);
8811
9048
  }
8812
9049
  },
8813
- /** Guard (c): `z.ZodType<T>` and every other type argument it carries. */
9050
+ /** Records every type argument carried by a Zod constraint. */
8814
9051
  TSTypeReference(node) {
8815
9052
  const { typeName } = node;
8816
- const referenced = typeName.type === AST_NODE_TYPES39.Identifier ? typeName.name : typeName.type === AST_NODE_TYPES39.TSQualifiedName && typeName.right.type === AST_NODE_TYPES39.Identifier ? typeName.right.name : null;
9053
+ const referenced = typeName.type === AST_NODE_TYPES40.Identifier ? typeName.name : typeName.type === AST_NODE_TYPES40.TSQualifiedName && typeName.right.type === AST_NODE_TYPES40.Identifier ? typeName.right.name : null;
8817
9054
  if (referenced === null || !ZOD_TYPE_CONSTRAINTS.has(referenced)) {
8818
9055
  return;
8819
9056
  }
@@ -8831,7 +9068,7 @@ var prefer_zod_infer_default = createRule({
8831
9068
  }
8832
9069
  },
8833
9070
  TSTypeAliasDeclaration(node) {
8834
- if (node.typeParameters !== void 0 || node.typeAnnotation.type !== AST_NODE_TYPES39.TSTypeLiteral) {
9071
+ if (node.typeParameters !== void 0 || node.typeAnnotation.type !== AST_NODE_TYPES40.TSTypeLiteral) {
8835
9072
  return;
8836
9073
  }
8837
9074
  const members = typeMembers(node.typeAnnotation.members);
@@ -8876,10 +9113,10 @@ var prefer_zod_infer_default = createRule({
8876
9113
  });
8877
9114
 
8878
9115
  // src/rules/require-assert-never.ts
8879
- import { AST_NODE_TYPES as AST_NODE_TYPES40 } from "@typescript-eslint/utils";
9116
+ import { AST_NODE_TYPES as AST_NODE_TYPES41 } from "@typescript-eslint/utils";
8880
9117
  var isRuntimeHandlingStatement = (statement) => {
8881
- if (statement.type === AST_NODE_TYPES40.EmptyStatement) return false;
8882
- if (statement.type === AST_NODE_TYPES40.BlockStatement) {
9118
+ if (statement.type === AST_NODE_TYPES41.EmptyStatement) return false;
9119
+ if (statement.type === AST_NODE_TYPES41.BlockStatement) {
8883
9120
  return statement.body.some(isRuntimeHandlingStatement);
8884
9121
  }
8885
9122
  return true;
@@ -8895,7 +9132,7 @@ var isCommentOnlyNoopDefault = (defaultCase, sourceCode) => {
8895
9132
  return colonToken !== null && sourceCode.getCommentsAfter(colonToken).length > 0;
8896
9133
  }
8897
9134
  const only = defaultCase.consequent[0];
8898
- if (only !== void 0 && defaultCase.consequent.length === 1 && only.type === AST_NODE_TYPES40.BlockStatement && only.body.length === 0) {
9135
+ if (only !== void 0 && defaultCase.consequent.length === 1 && only.type === AST_NODE_TYPES41.BlockStatement && only.body.length === 0) {
8899
9136
  return sourceCode.getCommentsInside(only).length > 0;
8900
9137
  }
8901
9138
  return false;
@@ -8935,7 +9172,7 @@ var require_assert_never_default = createRule({
8935
9172
  });
8936
9173
 
8937
9174
  // src/rules/require-fetch-timeout.ts
8938
- import { AST_NODE_TYPES as AST_NODE_TYPES41, ASTUtils as ASTUtils2 } from "@typescript-eslint/utils";
9175
+ import { AST_NODE_TYPES as AST_NODE_TYPES42, ASTUtils as ASTUtils2 } from "@typescript-eslint/utils";
8939
9176
  var GLOBAL_OBJECTS2 = /* @__PURE__ */ new Set([
8940
9177
  "globalThis",
8941
9178
  "window",
@@ -8951,14 +9188,14 @@ function matchesAnyPattern3(filename, patterns) {
8951
9188
  return false;
8952
9189
  }
8953
9190
  function initProvablyLacksSignal(init) {
8954
- if (init.type !== AST_NODE_TYPES41.ObjectExpression) {
9191
+ if (init.type !== AST_NODE_TYPES42.ObjectExpression) {
8955
9192
  return false;
8956
9193
  }
8957
9194
  for (const prop of init.properties) {
8958
- if (prop.type === AST_NODE_TYPES41.SpreadElement) {
9195
+ if (prop.type === AST_NODE_TYPES42.SpreadElement) {
8959
9196
  return false;
8960
9197
  }
8961
- if (prop.key.type === AST_NODE_TYPES41.Identifier && prop.key.name === "signal" || prop.key.type === AST_NODE_TYPES41.Literal && prop.key.value === "signal") {
9198
+ if (prop.key.type === AST_NODE_TYPES42.Identifier && prop.key.name === "signal" || prop.key.type === AST_NODE_TYPES42.Literal && prop.key.value === "signal") {
8962
9199
  return false;
8963
9200
  }
8964
9201
  if (prop.computed) {
@@ -8968,7 +9205,7 @@ function initProvablyLacksSignal(init) {
8968
9205
  return true;
8969
9206
  }
8970
9207
  function isStringish(node) {
8971
- return node.type === AST_NODE_TYPES41.Literal && typeof node.value === "string" || node.type === AST_NODE_TYPES41.TemplateLiteral;
9208
+ return node.type === AST_NODE_TYPES42.Literal && typeof node.value === "string" || node.type === AST_NODE_TYPES42.TemplateLiteral;
8972
9209
  }
8973
9210
  var require_fetch_timeout_default = createRule({
8974
9211
  name: "require-fetch-timeout",
@@ -9009,10 +9246,10 @@ var require_fetch_timeout_default = createRule({
9009
9246
  return variable === null || variable.defs.length === 0;
9010
9247
  }
9011
9248
  function isGlobalFetchCall2(callee) {
9012
- if (callee.type === AST_NODE_TYPES41.Identifier) {
9249
+ if (callee.type === AST_NODE_TYPES42.Identifier) {
9013
9250
  return callee.name === "fetch" && resolvesToGlobal(callee);
9014
9251
  }
9015
- return callee.type === AST_NODE_TYPES41.MemberExpression && !callee.computed && callee.property.type === AST_NODE_TYPES41.Identifier && callee.property.name === "fetch" && callee.object.type === AST_NODE_TYPES41.Identifier && GLOBAL_OBJECTS2.has(callee.object.name) && resolvesToGlobal(callee.object);
9252
+ return callee.type === AST_NODE_TYPES42.MemberExpression && !callee.computed && callee.property.type === AST_NODE_TYPES42.Identifier && callee.property.name === "fetch" && callee.object.type === AST_NODE_TYPES42.Identifier && GLOBAL_OBJECTS2.has(callee.object.name) && resolvesToGlobal(callee.object);
9016
9253
  }
9017
9254
  return {
9018
9255
  CallExpression(node) {
@@ -9032,7 +9269,7 @@ var require_fetch_timeout_default = createRule({
9032
9269
  });
9033
9270
 
9034
9271
  // src/rules/require-interface-for-injected-service.ts
9035
- import { AST_NODE_TYPES as AST_NODE_TYPES42 } from "@typescript-eslint/utils";
9272
+ import { AST_NODE_TYPES as AST_NODE_TYPES43 } from "@typescript-eslint/utils";
9036
9273
  var CONFIGISH_TYPE_RE = /(?:Options|Opts|Config|Configuration|Settings|Params|Props|Args|Env|Environment|Callbacks|Flags)$/;
9037
9274
  var CONFIGISH_NAME_RE = /^(?:options|opts|config|configuration|settings|params|props|args|env|environment|callbacks|flags|logger|log|clock)$/i;
9038
9275
  var HTTP_TRANSPORT_TYPE_RE = /^(?:KyInstance|AxiosInstance|Session)$/;
@@ -9040,20 +9277,20 @@ var BUILTIN_CONTAINER_TYPE_RE = /^(?:Record|Map|WeakMap|Set|WeakSet|Array|Readon
9040
9277
  var TRANSPORT_WRAPPER_NAME_RE = /Client$/;
9041
9278
  var ROUTER_FACTORY_NAME = "Router";
9042
9279
  var FRAMEWORK_HTTP_TYPES = /* @__PURE__ */ new Set(["Request", "Response", "NextFunction"]);
9043
- var isExportedClass = (node) => node.parent.type === AST_NODE_TYPES42.ExportNamedDeclaration || node.parent.type === AST_NODE_TYPES42.ExportDefaultDeclaration;
9044
- var qualifiedName = (name) => name.type === AST_NODE_TYPES42.Identifier ? name.name : name.type === AST_NODE_TYPES42.TSQualifiedName ? `${qualifiedName(name.left)}.${name.right.name}` : "";
9280
+ var isExportedClass = (node) => node.parent.type === AST_NODE_TYPES43.ExportNamedDeclaration || node.parent.type === AST_NODE_TYPES43.ExportDefaultDeclaration;
9281
+ var qualifiedName = (name) => name.type === AST_NODE_TYPES43.Identifier ? name.name : name.type === AST_NODE_TYPES43.TSQualifiedName ? `${qualifiedName(name.left)}.${name.right.name}` : "";
9045
9282
  var readTypeReference = (annotation) => {
9046
- if (annotation === void 0 || annotation.type !== AST_NODE_TYPES42.TSTypeReference) return null;
9283
+ if (annotation === void 0 || annotation.type !== AST_NODE_TYPES43.TSTypeReference) return null;
9047
9284
  const { typeName } = annotation;
9048
- const rightmost = typeName.type === AST_NODE_TYPES42.Identifier ? typeName.name : typeName.type === AST_NODE_TYPES42.TSQualifiedName ? typeName.right.name : null;
9285
+ const rightmost = typeName.type === AST_NODE_TYPES43.Identifier ? typeName.name : typeName.type === AST_NODE_TYPES43.TSQualifiedName ? typeName.right.name : null;
9049
9286
  if (rightmost === null) return null;
9050
9287
  return { typeName: rightmost, display: qualifiedName(typeName) };
9051
9288
  };
9052
9289
  var namedParameterCollaborator = (annotated) => {
9053
9290
  let target = annotated;
9054
- if (target.type === AST_NODE_TYPES42.TSParameterProperty) target = target.parameter;
9055
- if (target.type === AST_NODE_TYPES42.AssignmentPattern) target = target.left;
9056
- if (target.type !== AST_NODE_TYPES42.Identifier) return null;
9291
+ if (target.type === AST_NODE_TYPES43.TSParameterProperty) target = target.parameter;
9292
+ if (target.type === AST_NODE_TYPES43.AssignmentPattern) target = target.left;
9293
+ if (target.type !== AST_NODE_TYPES43.Identifier) return null;
9057
9294
  const reference = readTypeReference(target.typeAnnotation?.typeAnnotation);
9058
9295
  if (reference === null) return null;
9059
9296
  return { name: target.name, ...reference };
@@ -9061,8 +9298,8 @@ var namedParameterCollaborator = (annotated) => {
9061
9298
  var propertySignatureTypes = (members) => {
9062
9299
  const types = /* @__PURE__ */ new Map();
9063
9300
  for (const member of members) {
9064
- if (member.type !== AST_NODE_TYPES42.TSPropertySignature) continue;
9065
- if (member.computed || member.key.type !== AST_NODE_TYPES42.Identifier) continue;
9301
+ if (member.type !== AST_NODE_TYPES43.TSPropertySignature) continue;
9302
+ if (member.computed || member.key.type !== AST_NODE_TYPES43.Identifier) continue;
9066
9303
  const reference = readTypeReference(member.typeAnnotation?.typeAnnotation);
9067
9304
  if (reference === null) continue;
9068
9305
  types.set(member.key.name, reference);
@@ -9073,18 +9310,18 @@ var fileTypeIndex = (program) => {
9073
9310
  const objects = /* @__PURE__ */ new Map();
9074
9311
  const functionAliases = /* @__PURE__ */ new Set();
9075
9312
  for (const statement of program.body) {
9076
- const declaration = statement.type === AST_NODE_TYPES42.ExportNamedDeclaration ? statement.declaration : statement;
9077
- if (declaration?.type === AST_NODE_TYPES42.TSInterfaceDeclaration) {
9313
+ const declaration = statement.type === AST_NODE_TYPES43.ExportNamedDeclaration ? statement.declaration : statement;
9314
+ if (declaration?.type === AST_NODE_TYPES43.TSInterfaceDeclaration) {
9078
9315
  objects.set(declaration.id.name, propertySignatureTypes(declaration.body.body));
9079
9316
  continue;
9080
9317
  }
9081
- if (declaration?.type !== AST_NODE_TYPES42.TSTypeAliasDeclaration) continue;
9318
+ if (declaration?.type !== AST_NODE_TYPES43.TSTypeAliasDeclaration) continue;
9082
9319
  const aliased = declaration.typeAnnotation;
9083
- if (aliased.type === AST_NODE_TYPES42.TSFunctionType || aliased.type === AST_NODE_TYPES42.TSConstructorType) {
9320
+ if (aliased.type === AST_NODE_TYPES43.TSFunctionType || aliased.type === AST_NODE_TYPES43.TSConstructorType) {
9084
9321
  functionAliases.add(declaration.id.name);
9085
9322
  continue;
9086
9323
  }
9087
- const literals = aliased.type === AST_NODE_TYPES42.TSTypeLiteral ? [aliased] : aliased.type === AST_NODE_TYPES42.TSIntersectionType ? aliased.types.filter((part) => part.type === AST_NODE_TYPES42.TSTypeLiteral) : [];
9324
+ const literals = aliased.type === AST_NODE_TYPES43.TSTypeLiteral ? [aliased] : aliased.type === AST_NODE_TYPES43.TSIntersectionType ? aliased.types.filter((part) => part.type === AST_NODE_TYPES43.TSTypeLiteral) : [];
9088
9325
  if (literals.length === 0) continue;
9089
9326
  const merged = /* @__PURE__ */ new Map();
9090
9327
  for (const literal of literals) {
@@ -9097,10 +9334,10 @@ var fileTypeIndex = (program) => {
9097
9334
  return { objects, functionAliases };
9098
9335
  };
9099
9336
  var bagMemberTypes = (annotation, declared) => {
9100
- if (annotation.type === AST_NODE_TYPES42.TSTypeLiteral) {
9337
+ if (annotation.type === AST_NODE_TYPES43.TSTypeLiteral) {
9101
9338
  return propertySignatureTypes(annotation.members);
9102
9339
  }
9103
- if (annotation.type !== AST_NODE_TYPES42.TSTypeReference || annotation.typeName.type !== AST_NODE_TYPES42.Identifier) {
9340
+ if (annotation.type !== AST_NODE_TYPES43.TSTypeReference || annotation.typeName.type !== AST_NODE_TYPES43.Identifier) {
9104
9341
  return null;
9105
9342
  }
9106
9343
  return declared().objects.get(annotation.typeName.name) ?? null;
@@ -9112,11 +9349,11 @@ var objectPatternCollaborators = (pattern, declared) => {
9112
9349
  if (members === null) return [];
9113
9350
  const collaborators = [];
9114
9351
  for (const property of pattern.properties) {
9115
- if (property.type !== AST_NODE_TYPES42.Property || property.computed) continue;
9116
- if (property.key.type !== AST_NODE_TYPES42.Identifier) continue;
9352
+ if (property.type !== AST_NODE_TYPES43.Property || property.computed) continue;
9353
+ if (property.key.type !== AST_NODE_TYPES43.Identifier) continue;
9117
9354
  const key = property.key.name;
9118
- const bound = property.value.type === AST_NODE_TYPES42.AssignmentPattern ? property.value.left : property.value;
9119
- if (bound.type !== AST_NODE_TYPES42.Identifier) continue;
9355
+ const bound = property.value.type === AST_NODE_TYPES43.AssignmentPattern ? property.value.left : property.value;
9356
+ if (bound.type !== AST_NODE_TYPES43.Identifier) continue;
9120
9357
  if (CONFIGISH_NAME_RE.test(key)) continue;
9121
9358
  const reference = members.get(key);
9122
9359
  if (reference === void 0) continue;
@@ -9126,8 +9363,8 @@ var objectPatternCollaborators = (pattern, declared) => {
9126
9363
  };
9127
9364
  var parameterCollaborators = (parameter, declared) => {
9128
9365
  let target = parameter;
9129
- if (target.type === AST_NODE_TYPES42.AssignmentPattern) target = target.left;
9130
- if (target.type === AST_NODE_TYPES42.ObjectPattern) {
9366
+ if (target.type === AST_NODE_TYPES43.AssignmentPattern) target = target.left;
9367
+ if (target.type === AST_NODE_TYPES43.ObjectPattern) {
9131
9368
  return objectPatternCollaborators(target, declared);
9132
9369
  }
9133
9370
  const named2 = namedParameterCollaborator(parameter);
@@ -9141,22 +9378,22 @@ var typeParameterNames = (...declarations) => {
9141
9378
  return names;
9142
9379
  };
9143
9380
  var readConstructor = (ctor, declared, typeParameters) => {
9144
- const body = ctor.value.body;
9381
+ const body2 = ctor.value.body;
9145
9382
  const storedFrom = /* @__PURE__ */ new Set();
9146
9383
  let constructedFields = 0;
9147
- if (body !== null && body !== void 0) {
9148
- for (const statement of body.body) {
9149
- if (statement.type !== AST_NODE_TYPES42.ExpressionStatement) continue;
9384
+ if (body2 !== null && body2 !== void 0) {
9385
+ for (const statement of body2.body) {
9386
+ if (statement.type !== AST_NODE_TYPES43.ExpressionStatement) continue;
9150
9387
  const expression = statement.expression;
9151
- if (expression.type !== AST_NODE_TYPES42.AssignmentExpression || expression.operator !== "=" || expression.left.type !== AST_NODE_TYPES42.MemberExpression || expression.left.object.type !== AST_NODE_TYPES42.ThisExpression) {
9388
+ if (expression.type !== AST_NODE_TYPES43.AssignmentExpression || expression.operator !== "=" || expression.left.type !== AST_NODE_TYPES43.MemberExpression || expression.left.object.type !== AST_NODE_TYPES43.ThisExpression) {
9152
9389
  continue;
9153
9390
  }
9154
9391
  const source = expression.right;
9155
- if (source.type === AST_NODE_TYPES42.NewExpression) {
9392
+ if (source.type === AST_NODE_TYPES43.NewExpression) {
9156
9393
  constructedFields += 1;
9157
- } else if (source.type === AST_NODE_TYPES42.Identifier) {
9394
+ } else if (source.type === AST_NODE_TYPES43.Identifier) {
9158
9395
  storedFrom.add(source.name);
9159
- } else if (source.type === AST_NODE_TYPES42.MemberExpression && source.object.type === AST_NODE_TYPES42.Identifier) {
9396
+ } else if (source.type === AST_NODE_TYPES43.MemberExpression && source.object.type === AST_NODE_TYPES43.Identifier) {
9160
9397
  storedFrom.add(source.object.name);
9161
9398
  }
9162
9399
  }
@@ -9164,7 +9401,7 @@ var readConstructor = (ctor, declared, typeParameters) => {
9164
9401
  const collaborators = [];
9165
9402
  for (const parameter of ctor.value.params) {
9166
9403
  for (const reference of parameterCollaborators(parameter, declared)) {
9167
- const stored = parameter.type === AST_NODE_TYPES42.TSParameterProperty || storedFrom.has(reference.name);
9404
+ const stored = parameter.type === AST_NODE_TYPES43.TSParameterProperty || storedFrom.has(reference.name);
9168
9405
  if (!stored) continue;
9169
9406
  if (CONFIGISH_TYPE_RE.test(reference.typeName)) continue;
9170
9407
  if (CONFIGISH_NAME_RE.test(reference.name)) continue;
@@ -9197,20 +9434,20 @@ var subtreeHas = (root, found) => {
9197
9434
  visit(root);
9198
9435
  return hit;
9199
9436
  };
9200
- var isFrameworkWiring = (body) => subtreeHas(body, (node) => {
9201
- if (node.type === AST_NODE_TYPES42.CallExpression) {
9437
+ var isFrameworkWiring = (body2) => subtreeHas(body2, (node) => {
9438
+ if (node.type === AST_NODE_TYPES43.CallExpression) {
9202
9439
  const { callee } = node;
9203
- if (callee.type === AST_NODE_TYPES42.Identifier) return callee.name === ROUTER_FACTORY_NAME;
9204
- return callee.type === AST_NODE_TYPES42.MemberExpression && !callee.computed && callee.property.type === AST_NODE_TYPES42.Identifier && callee.property.name === ROUTER_FACTORY_NAME;
9440
+ if (callee.type === AST_NODE_TYPES43.Identifier) return callee.name === ROUTER_FACTORY_NAME;
9441
+ return callee.type === AST_NODE_TYPES43.MemberExpression && !callee.computed && callee.property.type === AST_NODE_TYPES43.Identifier && callee.property.name === ROUTER_FACTORY_NAME;
9205
9442
  }
9206
- return node.type === AST_NODE_TYPES42.TSTypeReference && node.typeName.type === AST_NODE_TYPES42.TSQualifiedName && FRAMEWORK_HTTP_TYPES.has(node.typeName.right.name);
9443
+ return node.type === AST_NODE_TYPES43.TSTypeReference && node.typeName.type === AST_NODE_TYPES43.TSQualifiedName && FRAMEWORK_HTTP_TYPES.has(node.typeName.right.name);
9207
9444
  });
9208
9445
  var stem2 = (name) => name.replace(/^I(?=[A-Z])/, "").replace(/Impl$/, "");
9209
9446
  var fileInterfaceNames = (program) => {
9210
9447
  const names = [];
9211
9448
  for (const statement of program.body) {
9212
- const declaration = statement.type === AST_NODE_TYPES42.ExportNamedDeclaration ? statement.declaration : statement;
9213
- if (declaration?.type === AST_NODE_TYPES42.TSInterfaceDeclaration) names.push(declaration.id.name);
9449
+ const declaration = statement.type === AST_NODE_TYPES43.ExportNamedDeclaration ? statement.declaration : statement;
9450
+ if (declaration?.type === AST_NODE_TYPES43.TSInterfaceDeclaration) names.push(declaration.id.name);
9214
9451
  }
9215
9452
  return names;
9216
9453
  };
@@ -9225,14 +9462,14 @@ var isTransportWrapper = (className, collaborators, program) => {
9225
9462
  return target.endsWith(other) || other.endsWith(target);
9226
9463
  });
9227
9464
  };
9228
- var publicMethodNames = (body) => {
9465
+ var publicMethodNames = (body2) => {
9229
9466
  const names = [];
9230
- for (const member of body.body) {
9231
- if (member.type !== AST_NODE_TYPES42.MethodDefinition) continue;
9467
+ for (const member of body2.body) {
9468
+ if (member.type !== AST_NODE_TYPES43.MethodDefinition) continue;
9232
9469
  if (member.kind !== "method" || member.static) continue;
9233
9470
  if (member.accessibility === "private" || member.accessibility === "protected") continue;
9234
- if (member.key.type === AST_NODE_TYPES42.PrivateIdentifier) continue;
9235
- if (member.key.type === AST_NODE_TYPES42.Identifier) names.push(member.key.name);
9471
+ if (member.key.type === AST_NODE_TYPES43.PrivateIdentifier) continue;
9472
+ if (member.key.type === AST_NODE_TYPES43.Identifier) names.push(member.key.name);
9236
9473
  else names.push("\u2026");
9237
9474
  }
9238
9475
  return names;
@@ -9265,7 +9502,7 @@ var require_interface_for_injected_service_default = createRule({
9265
9502
  if (node.implements.length > 0) return;
9266
9503
  if (node.decorators.length > 0) return;
9267
9504
  const ctor = node.body.body.find(
9268
- (member) => member.type === AST_NODE_TYPES42.MethodDefinition && member.kind === "constructor"
9505
+ (member) => member.type === AST_NODE_TYPES43.MethodDefinition && member.kind === "constructor"
9269
9506
  );
9270
9507
  if (ctor === void 0) return;
9271
9508
  const { collaborators, constructedFields } = readConstructor(
@@ -9294,18 +9531,18 @@ var require_interface_for_injected_service_default = createRule({
9294
9531
  });
9295
9532
 
9296
9533
  // src/rules/require-zod-form-validation.ts
9297
- import { AST_NODE_TYPES as AST_NODE_TYPES43 } from "@typescript-eslint/utils";
9534
+ import { AST_NODE_TYPES as AST_NODE_TYPES44 } from "@typescript-eslint/utils";
9298
9535
  var looksLikeZodSchema = (node) => {
9299
9536
  let current = node;
9300
9537
  while (true) {
9301
- if (current.type === AST_NODE_TYPES43.Identifier) {
9538
+ if (current.type === AST_NODE_TYPES44.Identifier) {
9302
9539
  return current.name === "z" || ZOD_SCHEMA_NAME_RE.test(current.name);
9303
9540
  }
9304
- if (current.type === AST_NODE_TYPES43.CallExpression) {
9541
+ if (current.type === AST_NODE_TYPES44.CallExpression) {
9305
9542
  current = current.callee;
9306
9543
  continue;
9307
9544
  }
9308
- if (current.type === AST_NODE_TYPES43.MemberExpression) {
9545
+ if (current.type === AST_NODE_TYPES44.MemberExpression) {
9309
9546
  current = current.object;
9310
9547
  continue;
9311
9548
  }
@@ -9313,23 +9550,23 @@ var looksLikeZodSchema = (node) => {
9313
9550
  }
9314
9551
  };
9315
9552
  var isZodParseCall = (node) => {
9316
- if (node.type !== AST_NODE_TYPES43.CallExpression) return false;
9553
+ if (node.type !== AST_NODE_TYPES44.CallExpression) return false;
9317
9554
  const callee = node.callee;
9318
- if (callee.type !== AST_NODE_TYPES43.MemberExpression) return false;
9555
+ if (callee.type !== AST_NODE_TYPES44.MemberExpression) return false;
9319
9556
  if (callee.computed) return false;
9320
- if (callee.property.type !== AST_NODE_TYPES43.Identifier) return false;
9557
+ if (callee.property.type !== AST_NODE_TYPES44.Identifier) return false;
9321
9558
  const method = callee.property.name;
9322
9559
  if (method !== "parse" && method !== "safeParse") return false;
9323
9560
  return looksLikeZodSchema(callee.object);
9324
9561
  };
9325
9562
  var isFormDataMethodCall = (node) => {
9326
9563
  let current = node;
9327
- if (current.type === AST_NODE_TYPES43.AwaitExpression) {
9564
+ if (current.type === AST_NODE_TYPES44.AwaitExpression) {
9328
9565
  current = current.argument;
9329
9566
  }
9330
- if (current.type !== AST_NODE_TYPES43.CallExpression) return false;
9567
+ if (current.type !== AST_NODE_TYPES44.CallExpression) return false;
9331
9568
  const callee = current.callee;
9332
- return callee.type === AST_NODE_TYPES43.MemberExpression && !callee.computed && callee.property.type === AST_NODE_TYPES43.Identifier && callee.property.name === "formData";
9569
+ return callee.type === AST_NODE_TYPES44.MemberExpression && !callee.computed && callee.property.type === AST_NODE_TYPES44.Identifier && callee.property.name === "formData";
9333
9570
  };
9334
9571
  var require_zod_form_validation_default = createRule({
9335
9572
  name: "require-zod-form-validation",
@@ -9349,14 +9586,14 @@ var require_zod_form_validation_default = createRule({
9349
9586
  return {};
9350
9587
  }
9351
9588
  const isFormSourceIdentifier = (node) => {
9352
- if (node.type !== AST_NODE_TYPES43.Identifier) return false;
9589
+ if (node.type !== AST_NODE_TYPES44.Identifier) return false;
9353
9590
  if (/formdata/i.test(node.name)) return true;
9354
9591
  let scope = context.sourceCode.getScope(node);
9355
9592
  while (scope !== null) {
9356
9593
  const variable = scope.set.get(node.name);
9357
9594
  if (variable !== void 0 && variable.defs.length === 1) {
9358
9595
  const def = variable.defs[0];
9359
- if (def !== void 0 && def.type === "Variable" && def.node.type === AST_NODE_TYPES43.VariableDeclarator && def.node.init !== null) {
9596
+ if (def !== void 0 && def.type === "Variable" && def.node.type === AST_NODE_TYPES44.VariableDeclarator && def.node.init !== null) {
9360
9597
  return isFormDataMethodCall(def.node.init);
9361
9598
  }
9362
9599
  return false;
@@ -9367,8 +9604,8 @@ var require_zod_form_validation_default = createRule({
9367
9604
  };
9368
9605
  const isFormDataGetCall = (node) => {
9369
9606
  const callee = node.callee;
9370
- if (callee.type !== AST_NODE_TYPES43.MemberExpression) return false;
9371
- if (callee.property.type !== AST_NODE_TYPES43.Identifier || callee.property.name !== "get") {
9607
+ if (callee.type !== AST_NODE_TYPES44.MemberExpression) return false;
9608
+ if (callee.property.type !== AST_NODE_TYPES44.Identifier || callee.property.name !== "get") {
9372
9609
  return false;
9373
9610
  }
9374
9611
  return isFormSourceIdentifier(callee.object);
@@ -9383,11 +9620,11 @@ var require_zod_form_validation_default = createRule({
9383
9620
  };
9384
9621
  const isInstanceofNarrowing = (node) => {
9385
9622
  const parent = node.parent;
9386
- return parent !== null && parent !== void 0 && parent.type === AST_NODE_TYPES43.BinaryExpression && parent.operator === "instanceof" && parent.left === node;
9623
+ return parent !== null && parent !== void 0 && parent.type === AST_NODE_TYPES44.BinaryExpression && parent.operator === "instanceof" && parent.left === node && parent.right.type === AST_NODE_TYPES44.Identifier && (parent.right.name === "File" || parent.right.name === "Blob");
9387
9624
  };
9388
9625
  const boundDeclarator = (node) => {
9389
9626
  const parent = node.parent;
9390
- if (parent.type === AST_NODE_TYPES43.VariableDeclarator && parent.init === node && parent.id.type === AST_NODE_TYPES43.Identifier) {
9627
+ if (parent.type === AST_NODE_TYPES44.VariableDeclarator && parent.init === node && parent.id.type === AST_NODE_TYPES44.Identifier) {
9391
9628
  return parent;
9392
9629
  }
9393
9630
  return null;
@@ -9446,7 +9683,7 @@ var store_insert_requires_on_conflict_default = createRule({
9446
9683
  });
9447
9684
 
9448
9685
  // src/rules/zod-naming-convention.ts
9449
- import { AST_NODE_TYPES as AST_NODE_TYPES44 } from "@typescript-eslint/utils";
9686
+ import { AST_NODE_TYPES as AST_NODE_TYPES45 } from "@typescript-eslint/utils";
9450
9687
  var CONVENTIONS = {
9451
9688
  prefix: { test: ZOD_PREFIX_RE, messageId: "zPrefix" },
9452
9689
  suffix: { test: ZOD_SUFFIX_RE, messageId: "schemaSuffix" },
@@ -9471,15 +9708,15 @@ var NON_SCHEMA_TERMINALS = /* @__PURE__ */ new Set([
9471
9708
  "registry",
9472
9709
  "implement"
9473
9710
  ]);
9474
- var terminalMethodName = (callee) => !callee.computed && callee.property.type === AST_NODE_TYPES44.Identifier ? callee.property.name : null;
9711
+ var terminalMethodName = (callee) => !callee.computed && callee.property.type === AST_NODE_TYPES45.Identifier ? callee.property.name : null;
9475
9712
  var calleeChainStartsWithZ = (node) => {
9476
9713
  let current = node;
9477
- while (current.type === AST_NODE_TYPES44.MemberExpression) {
9714
+ while (current.type === AST_NODE_TYPES45.MemberExpression) {
9478
9715
  const receiver = current.object;
9479
- if (receiver.type === AST_NODE_TYPES44.Identifier && receiver.name === "z") {
9716
+ if (receiver.type === AST_NODE_TYPES45.Identifier && receiver.name === "z") {
9480
9717
  return true;
9481
9718
  }
9482
- if (receiver.type === AST_NODE_TYPES44.CallExpression) {
9719
+ if (receiver.type === AST_NODE_TYPES45.CallExpression) {
9483
9720
  current = receiver.callee;
9484
9721
  continue;
9485
9722
  }
@@ -9524,13 +9761,13 @@ var zod_naming_convention_default = createRule({
9524
9761
  VariableDeclarator(node) {
9525
9762
  const init = node.init;
9526
9763
  if (init === null || init === void 0) return;
9527
- if (init.type !== AST_NODE_TYPES44.CallExpression) return;
9764
+ if (init.type !== AST_NODE_TYPES45.CallExpression) return;
9528
9765
  const callee = init.callee;
9529
- if (callee.type !== AST_NODE_TYPES44.MemberExpression) return;
9766
+ if (callee.type !== AST_NODE_TYPES45.MemberExpression) return;
9530
9767
  if (!calleeChainStartsWithZ(callee)) return;
9531
9768
  const terminal = terminalMethodName(callee);
9532
9769
  if (terminal !== null && NON_SCHEMA_TERMINALS.has(terminal)) return;
9533
- if (node.id.type !== AST_NODE_TYPES44.Identifier) return;
9770
+ if (node.id.type !== AST_NODE_TYPES45.Identifier) return;
9534
9771
  if (test.test(node.id.name)) return;
9535
9772
  if (acceptsSchemaWord && CONTAINS_SCHEMA_RE.test(node.id.name)) return;
9536
9773
  context.report({
@@ -9554,47 +9791,47 @@ var renamedRules = {
9554
9791
  var retiredRules = {
9555
9792
  "ban-loose-type-guards-in-tests": {
9556
9793
  removedIn: "5.0.0",
9557
- reason: "Read at 39 findings with 0 true positives in the #183 corpus audit. Delete the config entry; no replacement."
9794
+ reason: "Delete the config entry and suppressions; there is no replacement."
9558
9795
  },
9559
9796
  "no-implicit-attribute-access": {
9560
9797
  removedIn: "5.0.0",
9561
- reason: "Read at 50 findings with 0 true positives in the #183 corpus audit. Delete the config entry; no replacement."
9798
+ reason: "Delete the config entry and suppressions; there is no replacement."
9562
9799
  },
9563
9800
  "no-sequential-await": {
9564
9801
  removedIn: "3.0.0",
9565
- reason: "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."
9802
+ reason: "Delete the entry; core `no-await-in-loop` covers it."
9566
9803
  },
9567
9804
  "no-template-literal-in-log": {
9568
9805
  removedIn: "2.3.1",
9569
- reason: "Withdrawn. Delete the config entry; no replacement."
9806
+ reason: "Delete the config entry and suppressions; there is no replacement."
9570
9807
  },
9571
9808
  "no-unsafe-cast": {
9572
9809
  removedIn: "3.0.0",
9573
- reason: '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.'
9810
+ reason: "Delete the entry; keep `@typescript-eslint/consistent-type-assertions` enabled."
9574
9811
  },
9575
9812
  "prefer-setup-file-mocks": {
9576
9813
  removedIn: "5.0.0",
9577
- reason: "Read at 50 findings with 0 true positives in the #183 corpus audit. Delete the config entry; no replacement."
9814
+ reason: "Delete the config entry and suppressions; there is no replacement."
9578
9815
  },
9579
9816
  "prefer-shadcn": {
9580
9817
  removedIn: "3.0.0",
9581
- reason: "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."
9818
+ reason: "Delete the entry; use `react/forbid-elements` for element restrictions."
9582
9819
  },
9583
9820
  "primary-export-file-name": {
9584
9821
  removedIn: "4.0.0",
9585
- reason: "Renamed files after one of their exports \u2014 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."
9822
+ reason: "Delete the config entry and suppressions; there is no replacement."
9586
9823
  },
9587
9824
  "require-parameterized-tests": {
9588
9825
  removedIn: "4.0.0",
9589
- reason: "Landed in #153 and never wired up: absent from the `rules` record, every preset, and eslint.strict.mjs. Nothing to migrate."
9826
+ reason: "Delete stale references; the rule was never registered."
9590
9827
  },
9591
9828
  "require-schema-validate-search": {
9592
9829
  removedIn: "3.0.0",
9593
- reason: "14 findings, all matched line-and-column by `@typescript-eslint/consistent-type-assertions`. Delete the entry."
9830
+ reason: "Delete the entry; use `@typescript-eslint/consistent-type-assertions`."
9594
9831
  },
9595
9832
  "single-public-export": {
9596
9833
  removedIn: "3.0.0",
9597
- reason: "3 findings, all also reported by the then-live `primary-export-file-name` (itself withdrawn in 4.0.0). Delete the entry."
9834
+ reason: "Delete the config entry and suppressions; there is no replacement."
9598
9835
  }
9599
9836
  };
9600
9837
 
@@ -9613,6 +9850,7 @@ var rules = {
9613
9850
  "no-insecure-random-id": no_insecure_random_id_default,
9614
9851
  "no-json-stringify-error": no_json_stringify_error_default,
9615
9852
  "no-log-only-catch": no_log_only_catch_default,
9853
+ "no-long-comment": no_long_comment_default,
9616
9854
  "no-offset-pagination": no_offset_pagination_default,
9617
9855
  "no-positional-tuple-return": no_positional_tuple_return_default,
9618
9856
  "no-raw-env": no_raw_env_default,
@@ -9628,6 +9866,7 @@ var rules = {
9628
9866
  "no-storage-in-stateless-modules": no_storage_in_stateless_modules_default,
9629
9867
  "no-string-concat-in-loop": no_string_concat_in_loop_default,
9630
9868
  "no-tautological-expect": no_tautological_expect_default,
9869
+ "no-typed-doc-sections": no_typed_doc_sections_default,
9631
9870
  "no-trailing-value-narration": no_trailing_value_narration_default,
9632
9871
  "no-declaration-comment-wall": no_declaration_comment_wall_default,
9633
9872
  "no-union-in-comment": no_union_in_comment_default,
@@ -9643,6 +9882,7 @@ var rules = {
9643
9882
  "prefer-schema-for-api-payload": prefer_schema_for_api_payload_default,
9644
9883
  "prefer-semantic-colors": prefer_semantic_colors_default,
9645
9884
  "prefer-server-actions": prefer_server_actions_default,
9885
+ "prefer-single-sentence-comment": prefer_single_sentence_comment_default,
9646
9886
  "prefer-string-literal-union": prefer_string_literal_union_default,
9647
9887
  "prefer-whole-object-assertion": prefer_whole_object_assertion_default,
9648
9888
  "prefer-zod-enum": prefer_zod_enum_default,
@@ -9656,7 +9896,7 @@ var rules = {
9656
9896
  };
9657
9897
  var meta = {
9658
9898
  name: "@sarj/eslint-plugin",
9659
- version: "9.6.0"
9899
+ version: "9.7.1"
9660
9900
  };
9661
9901
  var recommendedRules = {
9662
9902
  "@sarj/enforce-file-structure": "warn",
@@ -9671,6 +9911,7 @@ var recommendedRules = {
9671
9911
  "@sarj/no-insecure-random-id": "warn",
9672
9912
  "@sarj/no-json-stringify-error": "warn",
9673
9913
  "@sarj/no-log-only-catch": "warn",
9914
+ "@sarj/no-long-comment": "warn",
9674
9915
  "@sarj/no-offset-pagination": "warn",
9675
9916
  "@sarj/no-positional-tuple-return": "warn",
9676
9917
  "@sarj/no-repeated-string-literal": "warn",
@@ -9683,6 +9924,7 @@ var recommendedRules = {
9683
9924
  "@sarj/no-sleep-in-test-body": "warn",
9684
9925
  "@sarj/no-string-concat-in-loop": "warn",
9685
9926
  "@sarj/no-tautological-expect": "warn",
9927
+ "@sarj/no-typed-doc-sections": "warn",
9686
9928
  "@sarj/no-trailing-value-narration": "warn",
9687
9929
  "@sarj/no-declaration-comment-wall": "warn",
9688
9930
  "@sarj/no-union-in-comment": "warn",
@@ -9698,6 +9940,7 @@ var recommendedRules = {
9698
9940
  "@sarj/prefer-schema-for-api-payload": "warn",
9699
9941
  "@sarj/prefer-semantic-colors": ["warn", { requireSemanticTokens: true }],
9700
9942
  "@sarj/prefer-server-actions": "warn",
9943
+ "@sarj/prefer-single-sentence-comment": "warn",
9701
9944
  "@sarj/prefer-string-literal-union": "warn",
9702
9945
  "@sarj/prefer-whole-object-assertion": "warn",
9703
9946
  "@sarj/prefer-zod-enum": "warn",
@@ -9723,6 +9966,7 @@ var strictRules = {
9723
9966
  "@sarj/no-insecure-random-id": "error",
9724
9967
  "@sarj/no-json-stringify-error": "error",
9725
9968
  "@sarj/no-log-only-catch": "error",
9969
+ "@sarj/no-long-comment": "error",
9726
9970
  "@sarj/no-offset-pagination": "error",
9727
9971
  "@sarj/no-positional-tuple-return": "error",
9728
9972
  "@sarj/no-raw-env": "error",
@@ -9738,6 +9982,7 @@ var strictRules = {
9738
9982
  "@sarj/no-storage-in-stateless-modules": "error",
9739
9983
  "@sarj/no-string-concat-in-loop": "error",
9740
9984
  "@sarj/no-tautological-expect": "error",
9985
+ "@sarj/no-typed-doc-sections": "error",
9741
9986
  "@sarj/no-trailing-value-narration": "error",
9742
9987
  "@sarj/no-declaration-comment-wall": "error",
9743
9988
  "@sarj/no-union-in-comment": "error",
@@ -9753,6 +9998,7 @@ var strictRules = {
9753
9998
  "@sarj/prefer-schema-for-api-payload": "error",
9754
9999
  "@sarj/prefer-semantic-colors": ["error", { requireSemanticTokens: true }],
9755
10000
  "@sarj/prefer-server-actions": "error",
10001
+ "@sarj/prefer-single-sentence-comment": "warn",
9756
10002
  "@sarj/prefer-string-literal-union": "error",
9757
10003
  "@sarj/prefer-whole-object-assertion": "error",
9758
10004
  "@sarj/prefer-zod-enum": "error",