@sarj/eslint-plugin 19.16.0 → 19.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3623,6 +3623,110 @@ var no_bespoke_api_case_conversion_default = defineRule({
3623
3623
  }
3624
3624
  });
3625
3625
 
3626
+ // src/rules/_web-jsx.ts
3627
+ var TEXT_INPUTS = /* @__PURE__ */ new Set([
3628
+ "",
3629
+ "text",
3630
+ "password",
3631
+ "email",
3632
+ "search",
3633
+ "tel",
3634
+ "url",
3635
+ "number"
3636
+ ]);
3637
+ function isEditableTextControl(node, source) {
3638
+ if (node.name.type !== "JSXIdentifier" || !["input", "textarea"].includes(node.name.name))
3639
+ return false;
3640
+ if (mayHaveBooleanAttribute(node, ["disabled"]) || mayHaveBooleanAttribute(node, ["readOnly", "readonly"]))
3641
+ return false;
3642
+ if (node.name.name === "textarea") return true;
3643
+ const type = attributeString(node, source, ["type"])?.toLowerCase();
3644
+ return type !== void 0 && TEXT_INPUTS.has(type);
3645
+ }
3646
+ function effectiveAttribute(node, names) {
3647
+ return node.attributes.findLast(
3648
+ (attribute) => attribute.type === "JSXSpreadAttribute" || attribute.name.type === "JSXIdentifier" && names.includes(attribute.name.name)
3649
+ );
3650
+ }
3651
+ function attributeString(node, source, names) {
3652
+ const attribute = effectiveAttribute(node, names);
3653
+ if (attribute === void 0) return "";
3654
+ if (attribute.type === "JSXSpreadAttribute") return null;
3655
+ if (attribute.value === null) return "";
3656
+ const value = attribute.value.type === "JSXExpressionContainer" ? attribute.value.expression : attribute.value;
3657
+ return scopedStaticString(value, source);
3658
+ }
3659
+ function mayHaveBooleanAttribute(node, names) {
3660
+ const attribute = effectiveAttribute(node, names);
3661
+ if (attribute === void 0) return false;
3662
+ if (attribute.type === "JSXAttribute" && attribute.value?.type === "JSXExpressionContainer") {
3663
+ const value = attribute.value.expression;
3664
+ if (value.type === "Literal" && (value.value === false || value.value === null)) return false;
3665
+ }
3666
+ return true;
3667
+ }
3668
+
3669
+ // src/rules/no-blocked-input-paste.ts
3670
+ var NAME14 = "no-blocked-input-paste";
3671
+ var no_blocked_input_paste_default = defineRule({
3672
+ meta: {
3673
+ type: "problem",
3674
+ docs: {
3675
+ description: "Allow clipboard input when a text control has no replacement paste handling.",
3676
+ url: docsUrl(NAME14)
3677
+ },
3678
+ schema: [],
3679
+ messages: {
3680
+ blockedPaste: "This handler only cancels pasting into an editable text control. Allow clipboard and password-manager input, or provide explicit replacement paste handling."
3681
+ }
3682
+ },
3683
+ createOnce(context) {
3684
+ return {
3685
+ before() {
3686
+ if (isGeneratedFile({ filename: context.filename, cwd: context.cwd }, context.sourceCode.text))
3687
+ return false;
3688
+ },
3689
+ JSXOpeningElement(node) {
3690
+ if (!isEditableTextControl(node, context.sourceCode)) return;
3691
+ const blocker = blockingAttribute(node);
3692
+ if (blocker !== null) context.report({ node: blocker, messageId: "blockedPaste" });
3693
+ }
3694
+ };
3695
+ }
3696
+ });
3697
+ function blockingAttribute(node) {
3698
+ let blocker = null;
3699
+ for (const name of ["onPaste", "onPasteCapture"]) {
3700
+ const attribute = effectiveAttribute(node, [name]);
3701
+ if (attribute === void 0) continue;
3702
+ if (attribute.type !== "JSXAttribute" || attribute.value?.type !== "JSXExpressionContainer" || !onlyCancelsPaste(attribute.value.expression))
3703
+ return null;
3704
+ blocker ??= attribute;
3705
+ }
3706
+ return blocker;
3707
+ }
3708
+ function onlyCancelsPaste(expression) {
3709
+ const callback = unwrapExpression(expression);
3710
+ if (callback.type !== "ArrowFunctionExpression" && callback.type !== "FunctionExpression")
3711
+ return false;
3712
+ if (callback.body === null) return false;
3713
+ const [event] = callback.params;
3714
+ if (event?.type !== "Identifier") return false;
3715
+ let body3 = callback.body;
3716
+ if (body3.type === "BlockStatement") {
3717
+ if (body3.body.length !== 1) return false;
3718
+ const statement = body3.body[0];
3719
+ if (statement?.type === "ExpressionStatement") body3 = statement.expression;
3720
+ else if (statement?.type === "ReturnStatement" && statement.argument !== null)
3721
+ body3 = statement.argument;
3722
+ else return false;
3723
+ }
3724
+ body3 = unwrapExpression(body3);
3725
+ if (body3.type !== "CallExpression" || body3.optional || body3.arguments.length !== 0) return false;
3726
+ const callee = unwrapExpression(body3.callee);
3727
+ return callee.type === "MemberExpression" && !callee.optional && getPropertyName(callee) === "preventDefault" && callee.object.type === "Identifier" && callee.object.name === event.name;
3728
+ }
3729
+
3626
3730
  // src/utils/has-side-effect.ts
3627
3731
  var BINARY_CONVERSIONS = /* @__PURE__ */ new Set([
3628
3732
  "==",
@@ -4052,7 +4156,7 @@ function selectorChoice(sourceCode2, call, binding3) {
4052
4156
  }
4053
4157
 
4054
4158
  // src/rules/no-boolean-selector-parameter.ts
4055
- var NAME14 = "no-boolean-selector-parameter";
4159
+ var NAME15 = "no-boolean-selector-parameter";
4056
4160
  function preservesBlockObjectCallback(owner) {
4057
4161
  const property = parentOf(owner);
4058
4162
  if (property?.type !== "Property" || property.computed) return false;
@@ -4080,7 +4184,7 @@ var no_boolean_selector_parameter_default = defineRule({
4080
4184
  type: "suggestion",
4081
4185
  docs: {
4082
4186
  description: "Prefer intention-revealing operations over a boolean parameter selecting between actions.",
4083
- url: docsUrl(NAME14)
4187
+ url: docsUrl(NAME15)
4084
4188
  },
4085
4189
  schema: [],
4086
4190
  fixable: "code",
@@ -4149,7 +4253,7 @@ var no_boolean_selector_parameter_default = defineRule({
4149
4253
  });
4150
4254
 
4151
4255
  // src/rules/no-broad-return-type.ts
4152
- var NAME15 = "no-broad-return-type";
4256
+ var NAME16 = "no-broad-return-type";
4153
4257
  function isBroad(type, facts, flags) {
4154
4258
  if ((type.flags & (flags.Unknown | flags.NonPrimitive)) !== 0) return true;
4155
4259
  const indexes = facts.indexValueFlags.get(type) ?? [];
@@ -4206,7 +4310,7 @@ var no_broad_return_type_default = defineRule({
4206
4310
  fixable: "code",
4207
4311
  docs: {
4208
4312
  description: "Report explicit broad return annotations that erase a known return value.",
4209
- url: docsUrl(NAME15)
4313
+ url: docsUrl(NAME16)
4210
4314
  },
4211
4315
  schema: [],
4212
4316
  messages: {
@@ -4294,7 +4398,7 @@ var no_broad_return_type_default = defineRule({
4294
4398
  });
4295
4399
 
4296
4400
  // src/rules/no-client-side-data-fetching.ts
4297
- var NAME16 = "no-client-side-data-fetching";
4401
+ var NAME17 = "no-client-side-data-fetching";
4298
4402
  var FETCH_LIBS = /* @__PURE__ */ new Set(["axios", "ky", "superagent"]);
4299
4403
  var HTTP_METHOD_NAMES = /* @__PURE__ */ new Set([
4300
4404
  "get",
@@ -4374,7 +4478,7 @@ var no_client_side_data_fetching_default = defineRule({
4374
4478
  type: "problem",
4375
4479
  docs: {
4376
4480
  description: "Disallow direct data fetching inside `useEffect` or `useLayoutEffect`.",
4377
- url: docsUrl(NAME16)
4481
+ url: docsUrl(NAME17)
4378
4482
  },
4379
4483
  schema: [],
4380
4484
  messages: {
@@ -5023,7 +5127,7 @@ var no_comment_cruft_default = defineRule({
5023
5127
  });
5024
5128
 
5025
5129
  // src/rules/no-conditional-empty-object-spread.ts
5026
- var NAME17 = "no-conditional-empty-object-spread";
5130
+ var NAME18 = "no-conditional-empty-object-spread";
5027
5131
  function isEmptyObject(node) {
5028
5132
  return node.type === "ObjectExpression" && node.properties.length === 0;
5029
5133
  }
@@ -5033,7 +5137,7 @@ var no_conditional_empty_object_spread_default = defineRule({
5033
5137
  fixable: "code",
5034
5138
  docs: {
5035
5139
  description: "Build conditional properties explicitly instead of spreading an empty-object branch.",
5036
- url: docsUrl(NAME17)
5140
+ url: docsUrl(NAME18)
5037
5141
  },
5038
5142
  schema: [],
5039
5143
  messages: {
@@ -5240,7 +5344,7 @@ function overloadProof(file) {
5240
5344
  }
5241
5345
 
5242
5346
  // src/rules/no-contradictory-overload-return.ts
5243
- var NAME18 = "no-contradictory-overload-return";
5347
+ var NAME19 = "no-contradictory-overload-return";
5244
5348
  var TOP_LEVEL_PARENTS = /* @__PURE__ */ new Set(["Program", "ExportNamedDeclaration", "ExportDefaultDeclaration"]);
5245
5349
  function candidateShape(node) {
5246
5350
  const parent = parentOf(node);
@@ -5256,7 +5360,7 @@ var no_contradictory_overload_return_default = defineRule({
5256
5360
  fixable: "code",
5257
5361
  docs: {
5258
5362
  description: "Preserve the input/result relationship promised by literal overloads.",
5259
- url: docsUrl(NAME18)
5363
+ url: docsUrl(NAME19)
5260
5364
  },
5261
5365
  schema: [],
5262
5366
  messages: {
@@ -5465,7 +5569,7 @@ function ordinaryHostReference(reference) {
5465
5569
  }
5466
5570
 
5467
5571
  // src/rules/no-contradictory-type-predicate.ts
5468
- var NAME19 = "no-contradictory-type-predicate";
5572
+ var NAME20 = "no-contradictory-type-predicate";
5469
5573
  var RUNTIME_KINDS = ["string", "number", "bigint", "boolean", "symbol", "undefined", "object", "function"];
5470
5574
  var ANY_RUNTIME_KIND = new Set(RUNTIME_KINDS);
5471
5575
  function parameterPredicate(node) {
@@ -5479,7 +5583,7 @@ var no_contradictory_type_predicate_default = defineRule({
5479
5583
  fixable: "code",
5480
5584
  docs: {
5481
5585
  description: "Keep explicit type predicates consistent with their primitive, array or record membership check.",
5482
- url: docsUrl(NAME19)
5586
+ url: docsUrl(NAME20)
5483
5587
  },
5484
5588
  schema: [],
5485
5589
  messages: {
@@ -5697,7 +5801,7 @@ function primitiveKind(type, native, allowLiterals) {
5697
5801
  }
5698
5802
 
5699
5803
  // src/rules/no-cors-wildcard-with-credentials.ts
5700
- var NAME20 = "no-cors-wildcard-with-credentials";
5804
+ var NAME21 = "no-cors-wildcard-with-credentials";
5701
5805
  var ACAO_HEADER = "access-control-allow-origin";
5702
5806
  var ACAC_HEADER = "access-control-allow-credentials";
5703
5807
  var HEADER_METHODS = /* @__PURE__ */ new Set(["set", "setHeader", "append", "delete", "removeHeader"]);
@@ -5730,7 +5834,7 @@ var no_cors_wildcard_with_credentials_default = defineRule({
5730
5834
  type: "problem",
5731
5835
  docs: {
5732
5836
  description: "Review wildcard CORS origins combined with an explicit credentials opt-in.",
5733
- url: docsUrl(NAME20)
5837
+ url: docsUrl(NAME21)
5734
5838
  },
5735
5839
  schema: [],
5736
5840
  messages: {
@@ -6118,7 +6222,7 @@ function isAuthSecretName(identifier) {
6118
6222
  }
6119
6223
 
6120
6224
  // src/rules/no-credential-in-browser-storage.ts
6121
- var NAME21 = "no-credential-in-browser-storage";
6225
+ var NAME22 = "no-credential-in-browser-storage";
6122
6226
  var STORAGE_NAMES = /* @__PURE__ */ new Set(["localStorage", "sessionStorage"]);
6123
6227
  var METADATA_WORDS = /* @__PURE__ */ new Set(["page", "cursor", "next", "hint", "expires", "expiry", "expiration"]);
6124
6228
  var GLOBAL_OBJECTS = /* @__PURE__ */ new Set(["window", "globalThis", "self"]);
@@ -6127,7 +6231,7 @@ var no_credential_in_browser_storage_default = defineRule({
6127
6231
  type: "problem",
6128
6232
  docs: {
6129
6233
  description: "Do not write credential-named values to browser storage or script-readable cookies.",
6130
- url: docsUrl(NAME21)
6234
+ url: docsUrl(NAME22)
6131
6235
  },
6132
6236
  schema: [],
6133
6237
  messages: {
@@ -6263,7 +6367,7 @@ function canAutofixNextConfigLiteral(sourceCode2) {
6263
6367
  }
6264
6368
 
6265
6369
  // src/rules/no-dangerously-allow-svg.ts
6266
- var NAME22 = "no-dangerously-allow-svg";
6370
+ var NAME23 = "no-dangerously-allow-svg";
6267
6371
  var NEXT_CONFIG_RE = /(?:^|\/)next\.config\.[cm]?[jt]s$/;
6268
6372
  function literalString(node) {
6269
6373
  if (node?.value.type === "Literal" && typeof node.value.value === "string") return node.value.value;
@@ -6287,7 +6391,7 @@ var no_dangerously_allow_svg_default = defineRule({
6287
6391
  meta: {
6288
6392
  type: "problem",
6289
6393
  fixable: "code",
6290
- docs: { description: "Require an explicit hardening policy for Next Image SVG delivery", url: docsUrl(NAME22) },
6394
+ docs: { description: "Require an explicit hardening policy for Next Image SVG delivery", url: docsUrl(NAME23) },
6291
6395
  schema: [],
6292
6396
  messages: {
6293
6397
  noDangerouslyAllowSvg: "SVG opt-in requires a recognized explicit script-blocking sandbox CSP and attachment disposition under this policy."
@@ -6761,7 +6865,7 @@ var no_detached_global_fetch_default = defineRule({
6761
6865
  });
6762
6866
 
6763
6867
  // src/rules/no-discarded-validation-result.ts
6764
- var NAME23 = "no-discarded-validation-result";
6868
+ var NAME24 = "no-discarded-validation-result";
6765
6869
  var CHANGING = /* @__PURE__ */ new Set(["transform", "default", "prefault", "catch", "coerce", "trim", "toLowerCase", "toUpperCase", "normalize", "preprocess"]);
6766
6870
  var VALIDATION_METHODS = /* @__PURE__ */ new Set(["parse", "parseAsync", "safeParse", "safeParseAsync"]);
6767
6871
  var no_discarded_validation_result_default = defineRule({
@@ -6769,7 +6873,7 @@ var no_discarded_validation_result_default = defineRule({
6769
6873
  type: "problem",
6770
6874
  docs: {
6771
6875
  description: "Consume Zod validation outcomes and transformed outputs instead of discarding them.",
6772
- url: docsUrl(NAME23)
6876
+ url: docsUrl(NAME24)
6773
6877
  },
6774
6878
  schema: [],
6775
6879
  messages: { discarded: "Consume this validation result; its outcome or transformed value is currently discarded." }
@@ -6846,7 +6950,7 @@ function zodValueImport(definition) {
6846
6950
  }
6847
6951
 
6848
6952
  // src/rules/no-duplicate-lifecycle-refresh-listeners.ts
6849
- var NAME24 = "no-duplicate-lifecycle-refresh-listeners";
6953
+ var NAME25 = "no-duplicate-lifecycle-refresh-listeners";
6850
6954
  var ROUTER_MODULE = "next/navigation";
6851
6955
  var RECEIVER_EVENTS = /* @__PURE__ */ new Map([["window", "focus"], ["document", "visibilitychange"]]);
6852
6956
  function importsRouterHook(body3) {
@@ -6881,7 +6985,7 @@ var no_duplicate_lifecycle_refresh_listeners_default = defineRule({
6881
6985
  type: "suggestion",
6882
6986
  docs: {
6883
6987
  description: "Do not register one Next.js route-refresh callback for both focus and visibilitychange.",
6884
- url: docsUrl(NAME24)
6988
+ url: docsUrl(NAME25)
6885
6989
  },
6886
6990
  schema: [],
6887
6991
  messages: {
@@ -7006,7 +7110,7 @@ var no_duplicate_lifecycle_refresh_listeners_default = defineRule({
7006
7110
  });
7007
7111
 
7008
7112
  // src/rules/no-duplicate-test-case.ts
7009
- var NAME25 = "no-duplicate-test-case";
7113
+ var NAME26 = "no-duplicate-test-case";
7010
7114
  var TEST_MODULES = /* @__PURE__ */ new Set(["vitest", "@jest/globals", "bun:test"]);
7011
7115
  var TEST_NAMES2 = /* @__PURE__ */ new Set(["it", "test"]);
7012
7116
  var MODIFIERS = /* @__PURE__ */ new Set(["only", "skip", "concurrent", "sequential", "fails", "failing", "todo"]);
@@ -7084,7 +7188,7 @@ function objectKey(node) {
7084
7188
  var no_duplicate_test_case_default = defineRule({
7085
7189
  meta: {
7086
7190
  type: "suggestion",
7087
- docs: { description: "Report repeated literal rows in framework each tables and Vitest for tables.", url: docsUrl(NAME25) },
7191
+ docs: { description: "Report repeated literal rows in framework each tables and Vitest for tables.", url: docsUrl(NAME26) },
7088
7192
  schema: [],
7089
7193
  messages: { duplicateCase: "This literal row repeats case {{first}} with the same inputs and expected values. Remove the accidental copy or add the intended distinct boundary; preserve intentional repetition explicitly." }
7090
7194
  },
@@ -7358,7 +7462,7 @@ function isDiscardedSqlText(node) {
7358
7462
  }
7359
7463
 
7360
7464
  // src/rules/no-dynamic-sql.ts
7361
- var NAME26 = "no-dynamic-sql";
7465
+ var NAME27 = "no-dynamic-sql";
7362
7466
  var DEFAULT_METHODS = ["prepare", "exec", "query"];
7363
7467
  var CONSTANT_CASE_RE = /^[A-Z][A-Z0-9_]*$/;
7364
7468
  function runtimeInterpolations(template) {
@@ -7455,7 +7559,7 @@ var no_dynamic_sql_default = defineRule({
7455
7559
  type: "problem",
7456
7560
  docs: {
7457
7561
  description: "Disallow runtime values and fragments interpolated into SQL passed to statement-execution methods.",
7458
- url: docsUrl(NAME26)
7562
+ url: docsUrl(NAME27)
7459
7563
  },
7460
7564
  schema: [
7461
7565
  {
@@ -7510,7 +7614,7 @@ var no_dynamic_sql_default = defineRule({
7510
7614
  });
7511
7615
 
7512
7616
  // src/rules/no-enum.ts
7513
- var NAME27 = "no-enum";
7617
+ var NAME28 = "no-enum";
7514
7618
  var no_enum_default = defineRule({
7515
7619
  meta: {
7516
7620
  defaultOptions: [{}],
@@ -7518,7 +7622,7 @@ var no_enum_default = defineRule({
7518
7622
  fixable: "code",
7519
7623
  docs: {
7520
7624
  description: "Disallow TypeScript `enum`; use string-literal unions or `as const` objects instead.",
7521
- url: docsUrl(NAME27)
7625
+ url: docsUrl(NAME28)
7522
7626
  },
7523
7627
  schema: [
7524
7628
  {
@@ -8531,7 +8635,7 @@ function transfers(node, sourceCode2) {
8531
8635
  }
8532
8636
 
8533
8637
  // src/rules/no-exception-text-in-5xx-response.ts
8534
- var NAME28 = "no-exception-text-in-5xx-response";
8638
+ var NAME29 = "no-exception-text-in-5xx-response";
8535
8639
  function nextResponseLocals(program) {
8536
8640
  return program.body.flatMap((statement) => statement.type === "ImportDeclaration" && statement.source.value === "next/server" ? statement.specifiers.flatMap((specifier) => specifier.type === "ImportSpecifier" && specifier.imported.type === "Identifier" && specifier.imported.name === "NextResponse" ? [specifier.local.name] : []) : []);
8537
8641
  }
@@ -8553,7 +8657,7 @@ var no_exception_text_in_5xx_response_default = defineRule({
8553
8657
  type: "problem",
8554
8658
  docs: {
8555
8659
  description: "Keep caught exception messages and stacks out of returned 5xx JSON responses and Server Action results.",
8556
- url: docsUrl(NAME28)
8660
+ url: docsUrl(NAME29)
8557
8661
  },
8558
8662
  schema: [],
8559
8663
  messages: {
@@ -9470,7 +9574,7 @@ function directCalls(binding3, arity) {
9470
9574
  }
9471
9575
 
9472
9576
  // src/rules/no-excess-jsx-props.ts
9473
- var NAME29 = "no-excess-jsx-props";
9577
+ var NAME30 = "no-excess-jsx-props";
9474
9578
  var RESERVED_PROPS = /* @__PURE__ */ new Set(["key", "ref", "__self", "__source"]);
9475
9579
  var JSX_DIRECTIVE = /@jsx(?:ImportSource|Runtime|Frag)?(?:\s|$)/iu;
9476
9580
  var MAX_VALUE_DEPTH = 64;
@@ -9792,7 +9896,7 @@ function closedObjectType(native) {
9792
9896
  var no_excess_jsx_props_default = defineRule({
9793
9897
  meta: {
9794
9898
  type: "suggestion",
9795
- docs: { description: "Report statically known fields spread outside a resolved component props contract.", url: docsUrl(NAME29) },
9899
+ docs: { description: "Report statically known fields spread outside a resolved component props contract.", url: docsUrl(NAME30) },
9796
9900
  schema: [],
9797
9901
  messages: {
9798
9902
  excess: "This spread forwards fields outside the receiving component's declared contract: {{fields}}. Forward the needed fields explicitly or review the contract; an annotation alone does not remove runtime fields."
@@ -9872,7 +9976,7 @@ var no_excess_jsx_props_default = defineRule({
9872
9976
  });
9873
9977
 
9874
9978
  // src/rules/no-excessive-cognitive-complexity.ts
9875
- var NAME30 = "no-excessive-cognitive-complexity";
9979
+ var NAME31 = "no-excessive-cognitive-complexity";
9876
9980
  var SEPARATELY_SCORED = /* @__PURE__ */ new Set([
9877
9981
  "FunctionDeclaration",
9878
9982
  "FunctionExpression",
@@ -9991,7 +10095,7 @@ var no_excessive_cognitive_complexity_default = defineRule({
9991
10095
  type: "suggestion",
9992
10096
  docs: {
9993
10097
  description: `Report an error for function bodies with cognitive complexity above ${ERROR_COMPLEXITY}.`,
9994
- url: docsUrl(NAME30)
10098
+ url: docsUrl(NAME31)
9995
10099
  },
9996
10100
  schema: [],
9997
10101
  defaultOptions: [],
@@ -10021,13 +10125,13 @@ var no_excessive_cognitive_complexity_default = defineRule({
10021
10125
  });
10022
10126
 
10023
10127
  // src/rules/no-explicit-type-predicate.ts
10024
- var NAME31 = "no-explicit-type-predicate";
10128
+ var NAME32 = "no-explicit-type-predicate";
10025
10129
  var no_explicit_type_predicate_default = defineRule({
10026
10130
  meta: {
10027
10131
  type: "suggestion",
10028
10132
  docs: {
10029
10133
  description: "Use compiler-checked narrowing instead of handwritten type predicates.",
10030
- url: docsUrl(NAME31)
10134
+ url: docsUrl(NAME32)
10031
10135
  },
10032
10136
  schema: [],
10033
10137
  messages: { noExplicitTypePredicate: "Replace this handwritten type predicate with a direct discriminator check or compiler-inferred narrowing. Parse unknown data with a schema and consume the validated result; preserve required external callable contracts." }
@@ -10046,7 +10150,7 @@ var no_explicit_type_predicate_default = defineRule({
10046
10150
  });
10047
10151
 
10048
10152
  // src/rules/no-fat-try-blocks.ts
10049
- var NAME32 = "no-fat-try-blocks";
10153
+ var NAME33 = "no-fat-try-blocks";
10050
10154
  var MAX_TRY_BODY_STATEMENTS = 3;
10051
10155
  var NESTED_FUNCTION_TYPES = /* @__PURE__ */ new Set([
10052
10156
  "FunctionDeclaration",
@@ -10382,7 +10486,7 @@ var no_fat_try_blocks_default = defineRule({
10382
10486
  type: "problem",
10383
10487
  docs: {
10384
10488
  description: "Review try blocks exceeding the configured count of syntactically selected operations.",
10385
- url: docsUrl(NAME32)
10489
+ url: docsUrl(NAME33)
10386
10490
  },
10387
10491
  schema: [
10388
10492
  {
@@ -10437,7 +10541,7 @@ var no_fat_try_blocks_default = defineRule({
10437
10541
  });
10438
10542
 
10439
10543
  // src/rules/no-first-party-module-mock.ts
10440
- var NAME33 = "no-first-party-module-mock";
10544
+ var NAME34 = "no-first-party-module-mock";
10441
10545
  var MOCK_METHODS = /* @__PURE__ */ new Set(["mock", "doMock", "unstable_mockModule"]);
10442
10546
  function isFirstParty(source, prefixes) {
10443
10547
  return source.startsWith("./") || source.startsWith("../") || prefixes.some((prefix) => source.startsWith(prefix));
@@ -10455,7 +10559,7 @@ var no_first_party_module_mock_default = defineRule({
10455
10559
  meta: {
10456
10560
  defaultOptions: [{ additionalModulePrefixes: [] }],
10457
10561
  type: "problem",
10458
- docs: { description: "Prefer injected collaborators over mocking maintained first-party modules in tests.", url: docsUrl(NAME33) },
10562
+ docs: { description: "Prefer injected collaborators over mocking maintained first-party modules in tests.", url: docsUrl(NAME34) },
10459
10563
  schema: [{ type: "object", additionalProperties: false, properties: { additionalModulePrefixes: { description: "Additional maintained module prefixes that tests must not mock.", type: "array", items: { type: "string", minLength: 1 }, uniqueItems: true } } }],
10460
10564
  messages: { noFirstPartyModuleMock: "This test replaces the maintained module `{{module}}`. Inject a narrow collaborator or test the real module; suppress locally only when module lookup or bootstrap behavior is the contract." }
10461
10565
  },
@@ -10786,7 +10890,7 @@ function abrupt(node) {
10786
10890
  }
10787
10891
 
10788
10892
  // src/rules/no-generic-json-parser.ts
10789
- var NAME34 = "no-generic-json-parser";
10893
+ var NAME35 = "no-generic-json-parser";
10790
10894
  var OPEN_FACTORIES = /* @__PURE__ */ new Set(["any", "unknown", "json", "record", "partialRecord"]);
10791
10895
  var WRAPPERS = /* @__PURE__ */ new Set(["optional", "nullable", "nullish", "default", "catch", "readonly", "brand", "describe", "meta"]);
10792
10896
  var PARSE_METHODS = /* @__PURE__ */ new Set(["parse", "parseAsync", "safeParse", "safeParseAsync"]);
@@ -10797,7 +10901,7 @@ var no_generic_json_parser_default = defineRule({
10797
10901
  type: "suggestion",
10798
10902
  docs: {
10799
10903
  description: "Parse known JSON fields with an object schema instead of an open JSON or record parser.",
10800
- url: docsUrl(NAME34)
10904
+ url: docsUrl(NAME35)
10801
10905
  },
10802
10906
  schema: [],
10803
10907
  messages: { genericParser: "The generic parser does not declare `{{field}}`; parse a focused object schema for the fields this code reads." }
@@ -11177,7 +11281,7 @@ function memberPropertyName(node) {
11177
11281
  }
11178
11282
 
11179
11283
  // src/rules/no-generic-single-export-module.ts
11180
- var NAME35 = "no-generic-single-export-module";
11284
+ var NAME36 = "no-generic-single-export-module";
11181
11285
  function fileParts(filename) {
11182
11286
  const base = filename.replaceAll("\\", "/").split("/").at(-1) ?? "";
11183
11287
  const extension = base.match(/(\.[cm]?[jt]sx?)$/u)?.[1] ?? ".ts";
@@ -11193,7 +11297,7 @@ var no_generic_single_export_module_default = defineRule({
11193
11297
  type: "suggestion",
11194
11298
  docs: {
11195
11299
  description: "Disallow generic module stems when one runtime export already names the responsibility.",
11196
- url: docsUrl(NAME35)
11300
+ url: docsUrl(NAME36)
11197
11301
  },
11198
11302
  schema: [],
11199
11303
  messages: {
@@ -11348,7 +11452,7 @@ var no_growing_array_spread_in_loop_default = defineRule({
11348
11452
  });
11349
11453
 
11350
11454
  // src/rules/no-hand-rolled-sleep.ts
11351
- var NAME36 = "no-hand-rolled-sleep";
11455
+ var NAME37 = "no-hand-rolled-sleep";
11352
11456
  var GLOBAL_OBJECTS3 = /* @__PURE__ */ new Set([
11353
11457
  "globalThis",
11354
11458
  "window",
@@ -11410,7 +11514,7 @@ var no_hand_rolled_sleep_default = defineRule({
11410
11514
  type: "problem",
11411
11515
  docs: {
11412
11516
  description: "Disallow uncancellable promisified timers and timeout arms.",
11413
- url: docsUrl(NAME36)
11517
+ url: docsUrl(NAME37)
11414
11518
  },
11415
11519
  schema: [
11416
11520
  {
@@ -11548,7 +11652,7 @@ var tailwindBase = (token) => token.slice(tailwindVariantPrefix(token).length).r
11548
11652
  var classTokens = (value) => value.split(/\s+/).filter(Boolean);
11549
11653
 
11550
11654
  // src/rules/no-hand-rolled-spinner.ts
11551
- var NAME37 = "no-hand-rolled-spinner";
11655
+ var NAME38 = "no-hand-rolled-spinner";
11552
11656
  var DESIGN_SYSTEM_PATH = /(?:^|[/\\])components[/\\]ui[/\\]/u;
11553
11657
  var DIRECTIONAL_BORDER = /^border-([trblsexy])-(.+)$/u;
11554
11658
  var CSS_LENGTH = /^-?(?:\d+(?:\.\d+)?|\.\d+)(?:cap|ch|cm|dvh|dvw|em|ex|ic|in|lh|lvh|lvw|mm|pc|pt|px|q|rcap|rch|rem|rex|ric|rlh|svh|svw|vb|vh|vi|vmax|vmin|vw|%)$/u;
@@ -11591,7 +11695,7 @@ var no_hand_rolled_spinner_default = defineRule({
11591
11695
  type: "suggestion",
11592
11696
  docs: {
11593
11697
  description: "Disallow intrinsic elements styled as Tailwind border-ring spinners outside the design-system implementation.",
11594
- url: docsUrl(NAME37)
11698
+ url: docsUrl(NAME38)
11595
11699
  },
11596
11700
  schema: [],
11597
11701
  messages: {
@@ -11627,7 +11731,7 @@ var no_hand_rolled_spinner_default = defineRule({
11627
11731
  });
11628
11732
 
11629
11733
  // src/rules/no-impossible-zod-literal-bounds.ts
11630
- var NAME38 = "no-impossible-zod-literal-bounds";
11734
+ var NAME39 = "no-impossible-zod-literal-bounds";
11631
11735
  var KINDS = /* @__PURE__ */ new Map([
11632
11736
  ["array", "array"],
11633
11737
  ["number", "number"],
@@ -11713,7 +11817,7 @@ var no_impossible_zod_literal_bounds_default = defineRule({
11713
11817
  type: "problem",
11714
11818
  docs: {
11715
11819
  description: "Disallow same-chain literal Zod bounds whose accepted set is mathematically empty.",
11716
- url: docsUrl(NAME38)
11820
+ url: docsUrl(NAME39)
11717
11821
  },
11718
11822
  schema: [
11719
11823
  {
@@ -11920,7 +12024,7 @@ function collectionPropertyFix(sourceCode2, node) {
11920
12024
  }
11921
12025
 
11922
12026
  // src/rules/no-in-operator-on-built-in-collections.ts
11923
- var NAME39 = "no-in-operator-on-built-in-collections";
12027
+ var NAME40 = "no-in-operator-on-built-in-collections";
11924
12028
  var COLLECTION_NAMES = /* @__PURE__ */ new Set([
11925
12029
  "Map",
11926
12030
  "ReadonlyMap",
@@ -11944,7 +12048,7 @@ var no_in_operator_on_built_in_collections_default = defineRule({
11944
12048
  fixable: "code",
11945
12049
  docs: {
11946
12050
  description: "Do not use the `in` operator to test entries in built-in Map and Set collections.",
11947
- url: docsUrl(NAME39)
12051
+ url: docsUrl(NAME40)
11948
12052
  },
11949
12053
  schema: [],
11950
12054
  messages: {
@@ -12106,7 +12210,7 @@ function isUuidRecipe(sourceCode2, node, reported) {
12106
12210
  }
12107
12211
 
12108
12212
  // src/rules/no-insecure-random-id.ts
12109
- var NAME40 = "no-insecure-random-id";
12213
+ var NAME41 = "no-insecure-random-id";
12110
12214
  var STRONG_SECURITY_WORDS = /* @__PURE__ */ new Set([
12111
12215
  "apikey",
12112
12216
  "csrf",
@@ -12188,7 +12292,7 @@ var no_insecure_random_id_default = defineRule({
12188
12292
  type: "problem",
12189
12293
  docs: {
12190
12294
  description: "Disallow using `Math.random()` to generate identifiers, tokens, or secrets; use `crypto.randomUUID()` or `crypto.getRandomValues(...)` instead.",
12191
- url: docsUrl(NAME40)
12295
+ url: docsUrl(NAME41)
12192
12296
  },
12193
12297
  fixable: "code",
12194
12298
  schema: [],
@@ -12282,7 +12386,7 @@ function incompatibleWrite(file, exactOptionalPropertyTypes, call, targetNode, w
12282
12386
  }
12283
12387
 
12284
12388
  // src/rules/no-invalid-typed-mutation.ts
12285
- var NAME41 = "no-invalid-typed-mutation";
12389
+ var NAME42 = "no-invalid-typed-mutation";
12286
12390
  var GLOBAL_RECEIVERS2 = /* @__PURE__ */ new Set(["globalThis", "window", "self"]);
12287
12391
  var NAMESPACE_OR_RECEIVER = /* @__PURE__ */ new Set(["Object", "Reflect", ...GLOBAL_RECEIVERS2]);
12288
12392
  var SUPPORTED_METHODS = {
@@ -12416,7 +12520,7 @@ var no_invalid_typed_mutation_default = defineRule({
12416
12520
  type: "problem",
12417
12521
  docs: {
12418
12522
  description: "Keep native object mutation APIs from writing incompatible values into declared property types.",
12419
- url: docsUrl(NAME41)
12523
+ url: docsUrl(NAME42)
12420
12524
  },
12421
12525
  schema: [],
12422
12526
  messages: {
@@ -12525,8 +12629,61 @@ var no_invalid_typed_mutation_default = defineRule({
12525
12629
  }
12526
12630
  });
12527
12631
 
12632
+ // src/rules/no-invalid-web-resource-hints.ts
12633
+ var NAME43 = "no-invalid-web-resource-hints";
12634
+ var RESOURCE_TAGS = /* @__PURE__ */ new Set(["img", "iframe", "link", "script"]);
12635
+ var LAZY_TAGS = /* @__PURE__ */ new Set(["img", "iframe", "video", "audio"]);
12636
+ var no_invalid_web_resource_hints_default = defineRule({
12637
+ meta: {
12638
+ type: "problem",
12639
+ docs: {
12640
+ description: "Keep native resource hints consistent with browser loading and preload request modes.",
12641
+ url: docsUrl(NAME43)
12642
+ },
12643
+ schema: [],
12644
+ messages: {
12645
+ criticalLazy: "This image is marked high priority and lazy-loaded. Review whether it is critical and load it eagerly, or keep lazy loading and remove the priority boost.",
12646
+ obsoleteImportance: "The importance attribute is obsolete. Review whether fetchPriority is needed for this resource.",
12647
+ invalidLoading: 'loading="auto" is unsupported. Omit loading for the default eager behavior, or select lazy loading deliberately.',
12648
+ preloadAs: "A preload needs its resource destination in as so the browser can reuse it for the matching request.",
12649
+ fontCors: 'Font preloads need anonymous CORS, including same-origin fonts. Set crossOrigin="anonymous" so the preload matches the font request.'
12650
+ }
12651
+ },
12652
+ createOnce(context) {
12653
+ return {
12654
+ before() {
12655
+ if (isGeneratedFile({ filename: context.filename, cwd: context.cwd }, context.sourceCode.text))
12656
+ return false;
12657
+ },
12658
+ JSXOpeningElement(node) {
12659
+ if (node.name.type !== "JSXIdentifier") return;
12660
+ const tag = node.name.name;
12661
+ const text = (names) => attributeString(node, context.sourceCode, names);
12662
+ const importance = text(["importance"]);
12663
+ if (RESOURCE_TAGS.has(tag) && importance !== null && importance !== "")
12664
+ context.report({ node, messageId: "obsoleteImportance" });
12665
+ const loading = text(["loading"])?.toLowerCase();
12666
+ if (LAZY_TAGS.has(tag) && loading === "auto")
12667
+ context.report({ node, messageId: "invalidLoading" });
12668
+ if (tag === "img" && loading === "lazy" && text(["fetchPriority", "fetchpriority"])?.toLowerCase() === "high") {
12669
+ context.report({ node, messageId: "criticalLazy" });
12670
+ }
12671
+ if (tag !== "link" || !text(["rel"])?.toLowerCase().split(/\s+/u).includes("preload"))
12672
+ return;
12673
+ const destination = text(["as"])?.toLowerCase();
12674
+ if (destination === "") context.report({ node, messageId: "preloadAs" });
12675
+ if (destination !== "font") return;
12676
+ const cors = effectiveAttribute(node, ["crossOrigin", "crossorigin"]);
12677
+ if (cors === void 0 || text(["crossOrigin", "crossorigin"])?.toLowerCase() === "use-credentials") {
12678
+ context.report({ node, messageId: "fontCors" });
12679
+ }
12680
+ }
12681
+ };
12682
+ }
12683
+ });
12684
+
12528
12685
  // src/rules/no-invalid-zod-custom-parse.ts
12529
- var NAME42 = "no-invalid-zod-custom-parse";
12686
+ var NAME44 = "no-invalid-zod-custom-parse";
12530
12687
  var ZOD_MODULES = /* @__PURE__ */ new Set(["zod", "zod/v4"]);
12531
12688
  var DECLARATION_FILE_RE = /\.d\.(?:[cm]?ts|[^/.]+\.ts)$/;
12532
12689
  function nativeZodDeclaration(declaration) {
@@ -12604,7 +12761,7 @@ var no_invalid_zod_custom_parse_default = defineRule({
12604
12761
  type: "problem",
12605
12762
  docs: {
12606
12763
  description: "Do not parse an incompatible primitive literal through an unvalidated Zod custom schema.",
12607
- url: docsUrl(NAME42)
12764
+ url: docsUrl(NAME44)
12608
12765
  },
12609
12766
  schema: [],
12610
12767
  messages: {
@@ -12672,7 +12829,7 @@ var no_invalid_zod_custom_parse_default = defineRule({
12672
12829
  });
12673
12830
 
12674
12831
  // src/rules/no-json-stringify-error.ts
12675
- var NAME43 = "no-json-stringify-error";
12832
+ var NAME45 = "no-json-stringify-error";
12676
12833
  var BUILTIN_ERROR_CONSTRUCTORS = /* @__PURE__ */ new Set([
12677
12834
  "AggregateError",
12678
12835
  "DOMException",
@@ -13031,7 +13188,7 @@ var no_json_stringify_error_default = defineRule({
13031
13188
  type: "problem",
13032
13189
  docs: {
13033
13190
  description: "Avoid generic JSON serialization that can omit native Error details.",
13034
- url: docsUrl(NAME43)
13191
+ url: docsUrl(NAME45)
13035
13192
  },
13036
13193
  schema: [],
13037
13194
  messages: {
@@ -13191,7 +13348,7 @@ function serializedLiteral(sourceCode2, node, fields2) {
13191
13348
  }
13192
13349
 
13193
13350
  // src/rules/no-json-stringify-object-equality.ts
13194
- var NAME44 = "no-json-stringify-object-equality";
13351
+ var NAME46 = "no-json-stringify-object-equality";
13195
13352
  var EQUALITY_OPERATORS = /* @__PURE__ */ new Set(["!=", "!==", "==", "==="]);
13196
13353
  function unwrapComparisonExpression(node) {
13197
13354
  let current = unwrapExpression(node);
@@ -13279,7 +13436,7 @@ var no_json_stringify_object_equality_default = defineRule({
13279
13436
  type: "problem",
13280
13437
  docs: {
13281
13438
  description: "Do not use JSON serialization as structural object equality.",
13282
- url: docsUrl(NAME44)
13439
+ url: docsUrl(NAME46)
13283
13440
  },
13284
13441
  schema: [],
13285
13442
  fixable: "code",
@@ -13299,13 +13456,13 @@ var no_json_stringify_object_equality_default = defineRule({
13299
13456
  const nodes = pending.flatMap(({ left, right }) => [left, right]);
13300
13457
  const types = file.typesOf(nodes);
13301
13458
  const checker = file.checker;
13302
- const contains2 = (node, i) => {
13459
+ const contains3 = (node, i) => {
13303
13460
  const syntax = syntaxMayContainObject(node);
13304
13461
  if (syntax !== null) return syntax;
13305
13462
  const type = types[i];
13306
13463
  return type === void 0 || typeMayContainObject(type, checker, flags);
13307
13464
  };
13308
- return pending.map(({ left, right }, i) => contains2(left, 2 * i) || contains2(right, 2 * i + 1));
13465
+ return pending.map(({ left, right }, i) => contains3(left, 2 * i) || contains3(right, 2 * i + 1));
13309
13466
  }
13310
13467
  return {
13311
13468
  before() {
@@ -13345,7 +13502,7 @@ var no_json_stringify_object_equality_default = defineRule({
13345
13502
  });
13346
13503
 
13347
13504
  // src/rules/no-known-value-widening.ts
13348
- var NAME45 = "no-known-value-widening";
13505
+ var NAME47 = "no-known-value-widening";
13349
13506
  var PROPERTIED_ANNOTATIONS = /* @__PURE__ */ new Set([
13350
13507
  "TSAnyKeyword",
13351
13508
  "TSArrayType",
@@ -13517,7 +13674,7 @@ var no_known_value_widening_default = defineRule({
13517
13674
  fixable: "code",
13518
13675
  docs: {
13519
13676
  description: "Preserve a known value's contract instead of widening a local binding to unknown, object, or an unknown-valued dictionary.",
13520
- url: docsUrl(NAME45)
13677
+ url: docsUrl(NAME47)
13521
13678
  },
13522
13679
  schema: [],
13523
13680
  messages: {
@@ -13707,7 +13864,7 @@ function createLogMatcher(options = {}) {
13707
13864
  }
13708
13865
 
13709
13866
  // src/rules/no-log-only-catch.ts
13710
- var NAME46 = "no-log-only-catch";
13867
+ var NAME48 = "no-log-only-catch";
13711
13868
  var BENCHMARK_DIR_RE = /(?:^|[\\/])benchmarks?[\\/]/;
13712
13869
  var SINGLE_STATEMENT_HOSTS = /* @__PURE__ */ new Set([
13713
13870
  "DoWhileStatement",
@@ -13806,7 +13963,7 @@ var no_log_only_catch_default = defineRule({
13806
13963
  type: "problem",
13807
13964
  docs: {
13808
13965
  description: "Disallow `catch` clauses that only log (or silently do nothing) and then swallow the error; rethrow or handle it instead.",
13809
- url: docsUrl(NAME46)
13966
+ url: docsUrl(NAME48)
13810
13967
  },
13811
13968
  schema: [
13812
13969
  {
@@ -13902,7 +14059,7 @@ var no_log_only_catch_default = defineRule({
13902
14059
  });
13903
14060
 
13904
14061
  // src/rules/no-logical-or-fallback.ts
13905
- var NAME47 = "no-logical-or-fallback";
14062
+ var NAME49 = "no-logical-or-fallback";
13906
14063
  var GLOBAL_RECEIVERS3 = /* @__PURE__ */ new Set(["globalThis", "window", "self"]);
13907
14064
  var PRIMITIVE = 1;
13908
14065
  var FALLBACK = 2;
@@ -13954,7 +14111,7 @@ var no_logical_or_fallback_default = defineRule({
13954
14111
  type: "suggestion",
13955
14112
  docs: {
13956
14113
  description: "Use nullish defaults or explicit falsy-value checks instead of logical OR fallbacks.",
13957
- url: docsUrl(NAME47)
14114
+ url: docsUrl(NAME49)
13958
14115
  },
13959
14116
  schema: [],
13960
14117
  messages: {
@@ -14050,7 +14207,7 @@ var no_logical_or_fallback_default = defineRule({
14050
14207
  });
14051
14208
 
14052
14209
  // src/rules/no-long-comment.ts
14053
- var NAME48 = "no-long-comment";
14210
+ var NAME50 = "no-long-comment";
14054
14211
  var EXCESSIVE_SENTENCE_COUNT = 8;
14055
14212
  var EXCESSIVE_WORD_COUNT = 120;
14056
14213
  var PROSE_WORD_RE = /[\p{L}\p{N}][\p{L}\p{N}'’-]*/gu;
@@ -14082,7 +14239,7 @@ var no_long_comment_default = defineRule({
14082
14239
  fixable: "code",
14083
14240
  docs: {
14084
14241
  description: "Flag unusually large unstructured JSDoc blocks in implementation code.",
14085
- url: docsUrl(NAME48)
14242
+ url: docsUrl(NAME50)
14086
14243
  },
14087
14244
  schema: [],
14088
14245
  messages: {
@@ -14107,6 +14264,69 @@ var no_long_comment_default = defineRule({
14107
14264
  }
14108
14265
  });
14109
14266
 
14267
+ // src/rules/no-message-origin-string-matching.ts
14268
+ var NAME51 = "no-message-origin-string-matching";
14269
+ var GLOBALS = /* @__PURE__ */ new Set(["window", "self", "globalThis"]);
14270
+ var STRING_MATCHERS = /* @__PURE__ */ new Set(["startsWith", "endsWith", "includes"]);
14271
+ var no_message_origin_string_matching_default = defineRule({
14272
+ meta: {
14273
+ type: "problem",
14274
+ docs: {
14275
+ description: "Compare incoming browser message origins against exact trusted origins.",
14276
+ url: docsUrl(NAME51)
14277
+ },
14278
+ schema: [],
14279
+ messages: {
14280
+ originMatch: "A prefix, suffix or substring match does not establish a trusted message origin. Compare exact allowlisted origins, or parse the origin and validate the intended scheme, host and port."
14281
+ }
14282
+ },
14283
+ createOnce(context) {
14284
+ let events;
14285
+ return {
14286
+ before() {
14287
+ events = /* @__PURE__ */ new Set();
14288
+ if (isGeneratedFile({ filename: context.filename, cwd: context.cwd }, context.sourceCode.text))
14289
+ return false;
14290
+ },
14291
+ CallExpression(node) {
14292
+ const source = context.sourceCode;
14293
+ const event = messageParameter(node, source);
14294
+ if (event !== null) events.add(event);
14295
+ const callee = unwrapExpression(node.callee);
14296
+ if (callee.type !== "MemberExpression" || !STRING_MATCHERS.has(getPropertyName(callee) ?? ""))
14297
+ return;
14298
+ const origin = unwrapExpression(callee.object);
14299
+ if (origin.type !== "MemberExpression" || getPropertyName(origin) !== "origin") return;
14300
+ const receiver = unwrapExpression(origin.object);
14301
+ if (receiver.type !== "Identifier") return;
14302
+ const binding3 = findVariable(source.getScope(receiver), receiver.name);
14303
+ if (binding3 !== null && events.has(binding3))
14304
+ context.report({ node, messageId: "originMatch" });
14305
+ }
14306
+ };
14307
+ }
14308
+ });
14309
+ function messageParameter(call, source) {
14310
+ const callee = unwrapExpression(call.callee);
14311
+ const ambientCall = callee.type === "Identifier" && callee.name === "addEventListener" && isAmbient(callee, source);
14312
+ const globalCall = callee.type === "MemberExpression" && getPropertyName(callee) === "addEventListener" && callee.object.type === "Identifier" && GLOBALS.has(callee.object.name) && isAmbient(callee.object, source);
14313
+ const [type, listener] = call.arguments;
14314
+ if (!ambientCall && !globalCall || type === void 0 || scopedStaticString(type, source) !== "message" || listener === void 0)
14315
+ return null;
14316
+ const callback = unwrapExpression(listener);
14317
+ if (callback.type !== "ArrowFunctionExpression" && callback.type !== "FunctionExpression")
14318
+ return null;
14319
+ if (callback.body === null) return null;
14320
+ const [parameter] = callback.params;
14321
+ if (parameter?.type !== "Identifier") return null;
14322
+ const binding3 = findVariable(source.getScope(callback.body), parameter.name);
14323
+ return binding3?.references.some((reference) => reference.isWrite()) ? null : binding3;
14324
+ }
14325
+ function isAmbient(node, source) {
14326
+ const binding3 = findVariable(source.getScope(node), node.name);
14327
+ return binding3 === null || binding3.defs.length === 0;
14328
+ }
14329
+
14110
14330
  // src/rules/no-mutating-container-transform.ts
14111
14331
  var MUTATORS = /* @__PURE__ */ new Set(["copyWithin", "fill", "pop", "push", "reverse", "shift", "sort", "splice", "unshift"]);
14112
14332
  var PRIMITIVES = /* @__PURE__ */ new Set([
@@ -14306,7 +14526,7 @@ var no_mutating_container_transform_default = defineRule({
14306
14526
  });
14307
14527
 
14308
14528
  // src/rules/no-mutating-input-with-result.ts
14309
- var NAME49 = "no-mutating-input-with-result";
14529
+ var NAME52 = "no-mutating-input-with-result";
14310
14530
  function command(annotation) {
14311
14531
  if (annotation.type === "TSVoidKeyword" || annotation.type === "TSUndefinedKeyword" || annotation.type === "TSNeverKeyword") return true;
14312
14532
  if (annotation.type === "TSTypeReference" && annotation.typeName.type === "Identifier" && annotation.typeName.name === "Promise" && annotation.typeArguments?.params.length === 1) {
@@ -14384,7 +14604,7 @@ var no_mutating_input_with_result_default = defineRule({
14384
14604
  type: "suggestion",
14385
14605
  docs: {
14386
14606
  description: "Return replacement object values instead of writing input fields in result-returning functions.",
14387
- url: docsUrl(NAME49)
14607
+ url: docsUrl(NAME52)
14388
14608
  },
14389
14609
  schema: [],
14390
14610
  messages: { inputWrite: "This result-returning function writes input `{{name}}`; return a replacement value or declare an in-place command returning void." }
@@ -14460,7 +14680,7 @@ function globalReceiver(node, sourceCode2) {
14460
14680
  }
14461
14681
 
14462
14682
  // src/rules/no-negative-only-http-status-assertion.ts
14463
- var NAME50 = "no-negative-only-http-status-assertion";
14683
+ var NAME53 = "no-negative-only-http-status-assertion";
14464
14684
  var SERVER_ERROR_MIN = 500;
14465
14685
  var SERVER_ERROR_MAX = 599;
14466
14686
  var HTTP_STATUS_MIN = 100;
@@ -14560,7 +14780,7 @@ var no_negative_only_http_status_assertion_default = defineRule({
14560
14780
  type: "problem",
14561
14781
  docs: {
14562
14782
  description: "Assert the intended HTTP status instead of only excluding a server error.",
14563
- url: docsUrl(NAME50)
14783
+ url: docsUrl(NAME53)
14564
14784
  },
14565
14785
  schema: [],
14566
14786
  messages: { expectedStatus: "This assertion only excludes a server error; assert the intended HTTP status for the same response." }
@@ -14585,7 +14805,7 @@ var no_negative_only_http_status_assertion_default = defineRule({
14585
14805
  });
14586
14806
 
14587
14807
  // src/rules/no-numeric-search-param-coercion.ts
14588
- var NAME51 = "no-numeric-search-param-coercion";
14808
+ var NAME54 = "no-numeric-search-param-coercion";
14589
14809
  var GLOBAL_PARSERS = /* @__PURE__ */ new Set(["parseInt", "parseFloat", "Number"]);
14590
14810
  var NUMBER_PARSERS = /* @__PURE__ */ new Set(["parseInt", "parseFloat"]);
14591
14811
  var SEARCH_PARAM_TYPES = /* @__PURE__ */ new Set(["URLSearchParams", "ReadonlyURLSearchParams"]);
@@ -14626,7 +14846,7 @@ var no_numeric_search_param_coercion_default = defineRule({
14626
14846
  type: "problem",
14627
14847
  docs: {
14628
14848
  description: "Parse numeric URL search parameters with a schema instead of parseInt or Number.",
14629
- url: docsUrl(NAME51)
14849
+ url: docsUrl(NAME54)
14630
14850
  },
14631
14851
  schema: [],
14632
14852
  messages: {
@@ -14670,7 +14890,7 @@ var no_numeric_search_param_coercion_default = defineRule({
14670
14890
  });
14671
14891
 
14672
14892
  // src/rules/no-offset-pagination.ts
14673
- var NAME52 = "no-offset-pagination";
14893
+ var NAME55 = "no-offset-pagination";
14674
14894
  var OFFSET_PAGINATION = /\bOFFSET\s+(?:%s|%\(\w+\)s|\?\d*|:\w+|@\w+|\$\d+|\d+)/i;
14675
14895
  var PAGINATION_CONTEXT = /\bSELECT\b[\s\S]*\bFROM\b[\s\S]*\bOFFSET\b|\bLIMIT\s+(?:%s|%\(\w+\)s|\?\d*|:\w+|@\w+|\$\d+|\d+)\s+OFFSET\b/i;
14676
14896
  var no_offset_pagination_default = defineRule({
@@ -14678,7 +14898,7 @@ var no_offset_pagination_default = defineRule({
14678
14898
  type: "problem",
14679
14899
  docs: {
14680
14900
  description: "Prefer keyset pagination for embedded SQL queries using OFFSET.",
14681
- url: docsUrl(NAME52)
14901
+ url: docsUrl(NAME55)
14682
14902
  },
14683
14903
  schema: [],
14684
14904
  messages: {
@@ -14704,7 +14924,7 @@ var no_offset_pagination_default = defineRule({
14704
14924
  });
14705
14925
 
14706
14926
  // src/rules/no-oxlint-directive.ts
14707
- var NAME53 = "no-oxlint-directive";
14927
+ var NAME56 = "no-oxlint-directive";
14708
14928
  var OXLINT_DIRECTIVE_RE = /^(\s*)oxlint-(disable-next-line|disable-line|disable|enable)(?=\s|$)/u;
14709
14929
  var no_oxlint_directive_default = defineRule({
14710
14930
  meta: {
@@ -14712,7 +14932,7 @@ var no_oxlint_directive_default = defineRule({
14712
14932
  fixable: "code",
14713
14933
  docs: {
14714
14934
  description: "Write every suppression directive with the `eslint-*` spelling.",
14715
- url: docsUrl(NAME53)
14935
+ url: docsUrl(NAME56)
14716
14936
  },
14717
14937
  schema: [],
14718
14938
  messages: {
@@ -14825,7 +15045,7 @@ function closedNamespace(namespace, initializer) {
14825
15045
  }
14826
15046
 
14827
15047
  // src/rules/no-partial-type-predicate.ts
14828
- var NAME54 = "no-partial-type-predicate";
15048
+ var NAME57 = "no-partial-type-predicate";
14829
15049
  var MAX_LENGTH_WITNESS = 256;
14830
15050
  function predicateCandidate(node) {
14831
15051
  const annotation = node.returnType?.typeAnnotation;
@@ -14869,7 +15089,7 @@ var no_partial_type_predicate_default = defineRule({
14869
15089
  fixable: "code",
14870
15090
  docs: {
14871
15091
  description: "Do not give a partial primitive filter an explicit type predicate that excludes valid values in the false branch.",
14872
- url: docsUrl(NAME54)
15092
+ url: docsUrl(NAME57)
14873
15093
  },
14874
15094
  schema: [],
14875
15095
  messages: { partialPredicate: "This predicate returns false for {{witness}}, which still belongs to `{{target}}`. Its false branch can therefore narrow unsafely. Use a boolean value filter or a predicate that recognizes every promised value." }
@@ -15033,6 +15253,65 @@ function showWitness(value) {
15033
15253
  return `\`${JSON.stringify(value)}\``;
15034
15254
  }
15035
15255
 
15256
+ // src/rules/no-password-get-form.ts
15257
+ var NAME58 = "no-password-get-form";
15258
+ var no_password_get_form_default = defineRule({
15259
+ meta: {
15260
+ type: "problem",
15261
+ docs: {
15262
+ description: "Keep named password controls out of native GET form submissions.",
15263
+ url: docsUrl(NAME58)
15264
+ },
15265
+ schema: [],
15266
+ messages: {
15267
+ passwordGet: "This native GET form can put a named password in the URL. Review the endpoint contract and submit credentials with POST."
15268
+ }
15269
+ },
15270
+ createOnce(context) {
15271
+ return {
15272
+ before() {
15273
+ if (isGeneratedFile({ filename: context.filename, cwd: context.cwd }, context.sourceCode.text))
15274
+ return false;
15275
+ },
15276
+ JSXElement(node) {
15277
+ const opening = node.openingElement;
15278
+ if (opening.name.type !== "JSXIdentifier" || opening.name.name !== "form") return;
15279
+ const method = attributeString(opening, context.sourceCode, ["method"])?.toLowerCase();
15280
+ if (method === void 0 || method === "post" || method === "dialog") return;
15281
+ if (attributeString(opening, context.sourceCode, ["action"]) === null || effectiveAttribute(opening, ["onSubmit", "onSubmitCapture"]) !== void 0)
15282
+ return;
15283
+ if (!hasSubmissionOverride(node) && containsPassword(node.children, context.sourceCode))
15284
+ context.report({ node: opening, messageId: "passwordGet" });
15285
+ }
15286
+ };
15287
+ }
15288
+ });
15289
+ function containsPassword(children, source) {
15290
+ for (const child of children) {
15291
+ if (child.type === "JSXFragment") {
15292
+ if (containsPassword(child.children, source)) return true;
15293
+ continue;
15294
+ }
15295
+ if (child.type !== "JSXElement" || child.openingElement.name.type !== "JSXIdentifier") continue;
15296
+ const opening = child.openingElement;
15297
+ const tag = opening.name.type === "JSXIdentifier" ? opening.name.name : "";
15298
+ if (!/^[a-z]/u.test(tag) || tag === "form" || tag === "fieldset" && mayHaveBooleanAttribute(opening, ["disabled"]))
15299
+ continue;
15300
+ if (tag === "input" && isSubmittedPassword(opening, source)) return true;
15301
+ if (containsPassword(child.children, source)) return true;
15302
+ }
15303
+ return false;
15304
+ }
15305
+ function isSubmittedPassword(opening, source) {
15306
+ const name = attributeString(opening, source, ["name"]);
15307
+ return attributeString(opening, source, ["type"])?.toLowerCase() === "password" && name !== null && name !== "" && !mayHaveBooleanAttribute(opening, ["disabled"]) && effectiveAttribute(opening, ["form"]) === void 0;
15308
+ }
15309
+ function hasSubmissionOverride(node) {
15310
+ if (node.type === "JSXOpeningElement" && node.name.type === "JSXIdentifier" && ["button", "input"].includes(node.name.name) && effectiveAttribute(node, ["formMethod", "formmethod", "formAction", "formaction"]) !== void 0)
15311
+ return true;
15312
+ return forEachOwnAstChild(node, hasSubmissionOverride);
15313
+ }
15314
+
15036
15315
  // src/rules/_labeled-tuple-object-fix.ts
15037
15316
  var UNSAFE_NAMES = /* @__PURE__ */ new Set([
15038
15317
  "__proto__",
@@ -15135,7 +15414,7 @@ function matchingReturn(object, fields2) {
15135
15414
  }
15136
15415
 
15137
15416
  // src/rules/no-positional-tuple-return.ts
15138
- var NAME55 = "no-positional-tuple-return";
15417
+ var NAME59 = "no-positional-tuple-return";
15139
15418
  var MIN_ELEMENTS = 2;
15140
15419
  var AWAITABLE_TYPES = /* @__PURE__ */ new Set([
15141
15420
  "Promise",
@@ -15391,7 +15670,7 @@ var no_positional_tuple_return_default = defineRule({
15391
15670
  fixable: "code",
15392
15671
  docs: {
15393
15672
  description: "Disallow returning a multi-field tuple from a named function; return a named object so call sites cannot mismatch slots.",
15394
- url: docsUrl(NAME55)
15673
+ url: docsUrl(NAME59)
15395
15674
  },
15396
15675
  schema: [],
15397
15676
  messages: {
@@ -15523,13 +15802,13 @@ var no_positional_tuple_return_default = defineRule({
15523
15802
  });
15524
15803
 
15525
15804
  // src/rules/no-production-browser-source-maps.ts
15526
- var NAME56 = "no-production-browser-source-maps";
15805
+ var NAME60 = "no-production-browser-source-maps";
15527
15806
  var NEXT_CONFIG_RE2 = /(?:^|\/)next\.config\.[cm]?[jt]s$/;
15528
15807
  var no_production_browser_source_maps_default = defineRule({
15529
15808
  meta: {
15530
15809
  type: "problem",
15531
15810
  fixable: "code",
15532
- docs: { description: "Next.js production browser source maps expose application source", url: docsUrl(NAME56) },
15811
+ docs: { description: "Next.js production browser source maps expose application source", url: docsUrl(NAME60) },
15533
15812
  schema: [],
15534
15813
  messages: {
15535
15814
  noProductionBrowserSourceMaps: "Do not publish production browser source maps. Upload private maps to your monitoring service instead."
@@ -15922,7 +16201,7 @@ var no_raw_env_default = defineRule({
15922
16201
  });
15923
16202
 
15924
16203
  // src/rules/no-raw-fetch-outside-clients.ts
15925
- var NAME57 = "no-raw-fetch-outside-clients";
16204
+ var NAME61 = "no-raw-fetch-outside-clients";
15926
16205
  var DEFAULT_ALLOW = [
15927
16206
  "[\\\\/]clients?[\\\\/]",
15928
16207
  "-client\\.[cm]?[jt]sx?$",
@@ -16049,7 +16328,7 @@ var no_raw_fetch_outside_clients_default = defineRule({
16049
16328
  type: "problem",
16050
16329
  docs: {
16051
16330
  description: "Disallow calling the global `fetch` outside the client layer; route outbound HTTP through a client module that owns retry, timeout and status handling.",
16052
- url: docsUrl(NAME57)
16331
+ url: docsUrl(NAME61)
16053
16332
  },
16054
16333
  schema: [
16055
16334
  {
@@ -16311,7 +16590,7 @@ function functionNode2(node) {
16311
16590
  }
16312
16591
 
16313
16592
  // src/rules/no-readonly-prop-state.ts
16314
- var NAME58 = "no-readonly-prop-state";
16593
+ var NAME62 = "no-readonly-prop-state";
16315
16594
  var MAX_TYPE_DEPTH = 16;
16316
16595
  function isReadonlyUseState(source, node) {
16317
16596
  if (node.optional || node.arguments.length !== 1 || !reactHook(source, node.callee, "useState")) return false;
@@ -16351,7 +16630,7 @@ function isPrimitiveType(native, type, depth = 0) {
16351
16630
  var no_readonly_prop_state_default = defineRule({
16352
16631
  meta: {
16353
16632
  type: "suggestion",
16354
- docs: { description: "Review props copied into state without a usable updater.", url: docsUrl(NAME58) },
16633
+ docs: { description: "Review props copied into state without a usable updater.", url: docsUrl(NAME62) },
16355
16634
  schema: [],
16356
16635
  messages: {
16357
16636
  readonlyPropState: "This prop is copied into state without an observed updater. Derive it from current props, or make an intentional initial snapshot explicit; review the lifecycle before changing it."
@@ -16426,7 +16705,7 @@ function identitySpread(sourceCode2, callback) {
16426
16705
  }
16427
16706
 
16428
16707
  // src/rules/no-reduce-accumulator-copy.ts
16429
- var NAME59 = "no-reduce-accumulator-copy";
16708
+ var NAME63 = "no-reduce-accumulator-copy";
16430
16709
  var COPY_METHODS = /* @__PURE__ */ new Set(["concat", "slice", "toSpliced", "toSorted", "toReversed", "with"]);
16431
16710
  var REDUCE_METHODS = /* @__PURE__ */ new Set(["reduce", "reduceRight"]);
16432
16711
  var ARRAY_INTERFACES = /* @__PURE__ */ new Set(["Array", "ReadonlyArray"]);
@@ -16449,7 +16728,7 @@ var no_reduce_accumulator_copy_default = defineRule({
16449
16728
  fixable: "code",
16450
16729
  docs: {
16451
16730
  description: "Review copies of the accumulated collection inside a built-in reduce callback.",
16452
- url: docsUrl(NAME59)
16731
+ url: docsUrl(NAME63)
16453
16732
  },
16454
16733
  schema: [],
16455
16734
  messages: {
@@ -16663,7 +16942,7 @@ function minimalConsumerFix(sourceCode2, annotation, removed) {
16663
16942
  }
16664
16943
 
16665
16944
  // src/rules/no-redundant-consumer-union.ts
16666
- var NAME60 = "no-redundant-consumer-union";
16945
+ var NAME64 = "no-redundant-consumer-union";
16667
16946
  function scalarFields(native, type) {
16668
16947
  const { ast, sync } = native;
16669
16948
  if (!closedObjectContract(native, type, true)) return null;
@@ -16784,7 +17063,7 @@ var no_redundant_consumer_union_default = defineRule({
16784
17063
  meta: {
16785
17064
  type: "suggestion",
16786
17065
  fixable: "code",
16787
- docs: { description: "Keep the covering object contract in a private scalar consumer union.", url: docsUrl(NAME60) },
17066
+ docs: { description: "Keep the covering object contract in a private scalar consumer union.", url: docsUrl(NAME64) },
16788
17067
  schema: [],
16789
17068
  messages: {
16790
17069
  redundant: "{{covered}} is already accepted by {{covering}} in this private scalar consumer. Review keeping the covering {{covering}} contract; preserve producer information and runtime objects."
@@ -16841,7 +17120,7 @@ var no_redundant_consumer_union_default = defineRule({
16841
17120
  });
16842
17121
 
16843
17122
  // src/rules/no-redundant-local-alias.ts
16844
- var NAME61 = "no-redundant-local-alias";
17123
+ var NAME65 = "no-redundant-local-alias";
16845
17124
  function stableSource(variable, alias) {
16846
17125
  const definition = variable.defs[0];
16847
17126
  if (variable.defs.length !== 1 || definition === void 0 || variable.references.some((reference) => reference.isWrite() && !reference.init)) return false;
@@ -16914,7 +17193,7 @@ var no_redundant_local_alias_default = defineRule({
16914
17193
  fixable: "code",
16915
17194
  docs: {
16916
17195
  description: "Pass the original local into an object field instead of creating a single-use rename.",
16917
- url: docsUrl(NAME61)
17196
+ url: docsUrl(NAME65)
16918
17197
  },
16919
17198
  schema: [],
16920
17199
  messages: { redundantAlias: "This alias is read only by its matching object field; pass `{{source}}` directly as `{{target}}: {{source}}`." }
@@ -16982,7 +17261,7 @@ function methodReceiver(node, method, argumentCount) {
16982
17261
  }
16983
17262
 
16984
17263
  // src/rules/no-redundant-optional-array-default.ts
16985
- var NAME62 = "no-redundant-optional-array-default";
17264
+ var NAME66 = "no-redundant-optional-array-default";
16986
17265
  function hasArrayFallback(node) {
16987
17266
  const argument = node.arguments[0];
16988
17267
  if (node.arguments.length !== 1 || argument === void 0) return false;
@@ -17002,7 +17281,7 @@ var no_redundant_optional_array_default_default = defineRule({
17002
17281
  type: "problem",
17003
17282
  docs: {
17004
17283
  description: "Remove `.optional()` immediately inside a Zod array default.",
17005
- url: docsUrl(NAME62)
17284
+ url: docsUrl(NAME66)
17006
17285
  },
17007
17286
  fixable: "code",
17008
17287
  schema: [],
@@ -17147,7 +17426,7 @@ function ownedStringReturn(sourceCode2, entry, binding3, value) {
17147
17426
  }
17148
17427
 
17149
17428
  // src/rules/no-repeated-string-literal.ts
17150
- var NAME63 = "no-repeated-string-literal";
17429
+ var NAME67 = "no-repeated-string-literal";
17151
17430
  var MIN_LENGTH = 40;
17152
17431
  var MIN_DISTINCT_SCOPES = 2;
17153
17432
  var PREVIEW_LENGTH = 40;
@@ -17183,7 +17462,7 @@ var no_repeated_string_literal_default = defineRule({
17183
17462
  fixable: "code",
17184
17463
  docs: {
17185
17464
  description: "Disallow a long structured string literal repeated across functions; the copies drift when one is edited. Extract a module-level constant.",
17186
- url: docsUrl(NAME63)
17465
+ url: docsUrl(NAME67)
17187
17466
  },
17188
17467
  schema: [],
17189
17468
  messages: {
@@ -17253,7 +17532,7 @@ var no_repeated_string_literal_default = defineRule({
17253
17532
  });
17254
17533
 
17255
17534
  // src/rules/no-restated-comment.ts
17256
- var NAME64 = "no-restated-comment";
17535
+ var NAME68 = "no-restated-comment";
17257
17536
  var MAX_WORDS = 8;
17258
17537
  var MIN_CONTENT_TOKENS = 2;
17259
17538
  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;
@@ -17317,7 +17596,7 @@ var no_restated_comment_default = defineRule({
17317
17596
  fixable: "code",
17318
17597
  docs: {
17319
17598
  description: "Flag short standalone comments that repeat the adjacent statement's identifiers.",
17320
- url: docsUrl(NAME64)
17599
+ url: docsUrl(NAME68)
17321
17600
  },
17322
17601
  schema: [],
17323
17602
  messages: {
@@ -17414,7 +17693,7 @@ function isRestatableLabel(body3) {
17414
17693
  }
17415
17694
 
17416
17695
  // src/rules/no-restated-jsdoc.ts
17417
- var NAME65 = "no-restated-jsdoc";
17696
+ var NAME69 = "no-restated-jsdoc";
17418
17697
  var MODELLED_TAGS = /* @__PURE__ */ new Set([
17419
17698
  "arg",
17420
17699
  "argument",
@@ -17488,7 +17767,7 @@ var no_restated_jsdoc_default = defineRule({
17488
17767
  fixable: "code",
17489
17768
  docs: {
17490
17769
  description: "Flag JSDoc prose that appears to repeat declaration names without adding behavioral information.",
17491
- url: docsUrl(NAME65)
17770
+ url: docsUrl(NAME69)
17492
17771
  },
17493
17772
  schema: [],
17494
17773
  messages: {
@@ -17626,7 +17905,7 @@ function proseTokens(text) {
17626
17905
  }
17627
17906
 
17628
17907
  // src/rules/no-restricted-library-load.ts
17629
- var NAME66 = "no-restricted-library-load";
17908
+ var NAME70 = "no-restricted-library-load";
17630
17909
  function matchesModule(source, module) {
17631
17910
  return source === module || source.startsWith(`${module}/`);
17632
17911
  }
@@ -17640,7 +17919,7 @@ var no_restricted_library_load_default = defineRule({
17640
17919
  type: "problem",
17641
17920
  docs: {
17642
17921
  description: "Apply configured library restrictions to literal runtime loads and CommonJS resolution references.",
17643
- url: docsUrl(NAME66)
17922
+ url: docsUrl(NAME70)
17644
17923
  },
17645
17924
  schema: [
17646
17925
  {
@@ -17724,7 +18003,7 @@ var no_restricted_library_load_default = defineRule({
17724
18003
  });
17725
18004
 
17726
18005
  // src/rules/no-return-disposed-resource.ts
17727
- var NAME67 = "no-return-disposed-resource";
18006
+ var NAME71 = "no-return-disposed-resource";
17728
18007
  function resourceOwner(source, value, seen = /* @__PURE__ */ new Set()) {
17729
18008
  const node = unwrapExpression(value);
17730
18009
  if (node.type !== "Identifier") return null;
@@ -17739,7 +18018,7 @@ function resourceOwner(source, value, seen = /* @__PURE__ */ new Set()) {
17739
18018
  var no_return_disposed_resource_default = defineRule({
17740
18019
  meta: {
17741
18020
  type: "problem",
17742
- docs: { description: "Do not return a resource whose using declaration disposes it before the caller receives it.", url: docsUrl(NAME67) },
18021
+ docs: { description: "Do not return a resource whose using declaration disposes it before the caller receives it.", url: docsUrl(NAME71) },
17743
18022
  schema: [],
17744
18023
  messages: { disposedReturn: "This using resource is disposed when its function returns; keep the consumer inside its lifetime or transfer ownership explicitly." }
17745
18024
  },
@@ -17760,7 +18039,7 @@ var no_return_disposed_resource_default = defineRule({
17760
18039
  });
17761
18040
 
17762
18041
  // src/rules/no-router-refresh-polling.ts
17763
- var NAME68 = "no-router-refresh-polling";
18042
+ var NAME72 = "no-router-refresh-polling";
17764
18043
  function enclosingIntervalCallback(sourceCode2, node) {
17765
18044
  for (let ancestor = parentOf(node); ancestor !== null; ancestor = parentOf(ancestor)) {
17766
18045
  if (ancestor.type === "FunctionDeclaration") return null;
@@ -17783,7 +18062,7 @@ var no_router_refresh_polling_default = defineRule({
17783
18062
  type: "suggestion",
17784
18063
  docs: {
17785
18064
  description: "Do not poll by calling a Next.js router's refresh method from a timer.",
17786
- url: docsUrl(NAME68)
18065
+ url: docsUrl(NAME72)
17787
18066
  },
17788
18067
  schema: [],
17789
18068
  messages: { routerRefreshPolling: "Poll the named fetch or server action instead of calling router.refresh() from a timer." }
@@ -17840,14 +18119,14 @@ var no_router_refresh_polling_default = defineRule({
17840
18119
  });
17841
18120
 
17842
18121
  // src/rules/no-runtime-typeof.ts
17843
- var NAME69 = "no-runtime-typeof";
18122
+ var NAME73 = "no-runtime-typeof";
17844
18123
  var EQUALITY_OPERATORS2 = /* @__PURE__ */ new Set(["===", "!==", "==", "!="]);
17845
18124
  var no_runtime_typeof_default = defineRule({
17846
18125
  meta: {
17847
18126
  type: "suggestion",
17848
18127
  docs: {
17849
18128
  description: "Prefer Zod boundary schemas or discriminated unions over runtime typeof checks.",
17850
- url: docsUrl(NAME69)
18129
+ url: docsUrl(NAME73)
17851
18130
  },
17852
18131
  schema: [],
17853
18132
  messages: {
@@ -17875,7 +18154,7 @@ var no_runtime_typeof_default = defineRule({
17875
18154
  });
17876
18155
 
17877
18156
  // src/rules/no-secret-in-log.ts
17878
- var NAME70 = "no-secret-in-log";
18157
+ var NAME74 = "no-secret-in-log";
17879
18158
  var LOG_INNOCUOUS_WORDS = /* @__PURE__ */ new Set([
17880
18159
  ...INNOCUOUS_WORDS,
17881
18160
  "name",
@@ -18036,7 +18315,7 @@ var no_secret_in_log_default = defineRule({
18036
18315
  type: "problem",
18037
18316
  docs: {
18038
18317
  description: "Disallow passing a secret-named value or a raw request/response blob to a logging call; both leak to log sinks. Redact or omit.",
18039
- url: docsUrl(NAME70)
18318
+ url: docsUrl(NAME74)
18040
18319
  },
18041
18320
  schema: [
18042
18321
  {
@@ -18300,7 +18579,7 @@ function ownedBindings(sourceCode2, owner) {
18300
18579
  }
18301
18580
 
18302
18581
  // src/rules/no-select-star.ts
18303
- var NAME71 = "no-select-star";
18582
+ var NAME75 = "no-select-star";
18304
18583
  var QUERY_SELECT = /\bSELECT\b/i;
18305
18584
  var QUERY_FROM = /\bFROM\b/i;
18306
18585
  var SQL_TOKEN = /[A-Za-z_\u0080-\u{10FFFF}][A-Za-z0-9_$\u0080-\u{10FFFF}]*|\d+(?:\.\d+)?|\.[ \t\r\n\f\v]*\[(?:[^\]]|\]\])*\]|[-+*/<>=~!@#%^&|\x60?]+|[(),.;]/gu;
@@ -18430,7 +18709,7 @@ var no_select_star_default = defineRule({
18430
18709
  type: "problem",
18431
18710
  docs: {
18432
18711
  description: "Prefer explicit column projections over SELECT * in embedded SQL.",
18433
- url: docsUrl(NAME71)
18712
+ url: docsUrl(NAME75)
18434
18713
  },
18435
18714
  schema: [],
18436
18715
  fixable: "code",
@@ -18460,7 +18739,7 @@ var no_select_star_default = defineRule({
18460
18739
  });
18461
18740
 
18462
18741
  // src/rules/no-sentinel-return-on-catch.ts
18463
- var NAME72 = "no-sentinel-return-on-catch";
18742
+ var NAME76 = "no-sentinel-return-on-catch";
18464
18743
  function unwrapSentinelExpression(arg) {
18465
18744
  let current = arg;
18466
18745
  while (current?.type === "TSAsExpression" || current?.type === "TSTypeAssertion" || current?.type === "TSSatisfiesExpression") {
@@ -18694,7 +18973,7 @@ var no_sentinel_return_on_catch_default = defineRule({
18694
18973
  type: "problem",
18695
18974
  docs: {
18696
18975
  description: "Disallow swallowing a caught error by returning an empty sentinel unless the error is handled or the sentinel is part of the function contract.",
18697
- url: docsUrl(NAME72)
18976
+ url: docsUrl(NAME76)
18698
18977
  },
18699
18978
  schema: [
18700
18979
  {
@@ -18810,7 +19089,7 @@ var no_server_env_in_client_component_default = defineRule({
18810
19089
  });
18811
19090
 
18812
19091
  // src/rules/no-server-file-uploads.ts
18813
- var NAME73 = "no-server-file-uploads";
19092
+ var NAME77 = "no-server-file-uploads";
18814
19093
  function hasDirective(statements, directive2) {
18815
19094
  for (const statement of statements) {
18816
19095
  if (statement.type !== "ExpressionStatement" || typeof statement.directive !== "string") return false;
@@ -18838,7 +19117,7 @@ function isBufferImport(node) {
18838
19117
  var no_server_file_uploads_default = defineRule({
18839
19118
  meta: {
18840
19119
  type: "problem",
18841
- docs: { description: "Keep native File handling outside explicit server boundaries.", url: docsUrl(NAME73) },
19120
+ docs: { description: "Keep native File handling outside explicit server boundaries.", url: docsUrl(NAME77) },
18842
19121
  schema: [],
18843
19122
  messages: { serverFile: "Keep File handling in the browser and upload directly to object storage with an authorized signed URL; accept object keys and metadata on the server." }
18844
19123
  },
@@ -18917,7 +19196,7 @@ var no_server_file_uploads_default = defineRule({
18917
19196
  });
18918
19197
 
18919
19198
  // src/rules/no-silent-promise-catch.ts
18920
- var NAME74 = "no-silent-promise-catch";
19199
+ var NAME78 = "no-silent-promise-catch";
18921
19200
  var BODY_PARSE_METHODS = /* @__PURE__ */ new Set([
18922
19201
  "arrayBuffer",
18923
19202
  "blob",
@@ -19109,7 +19388,7 @@ var no_silent_promise_catch_default = defineRule({
19109
19388
  type: "problem",
19110
19389
  docs: {
19111
19390
  description: "Disallow `.catch()` and second-argument `.then()` handlers that silently swallow a rejection; log, rethrow, or handle the error.",
19112
- url: docsUrl(NAME74)
19391
+ url: docsUrl(NAME78)
19113
19392
  },
19114
19393
  schema: [],
19115
19394
  messages: {
@@ -19150,7 +19429,7 @@ var no_silent_promise_catch_default = defineRule({
19150
19429
  });
19151
19430
 
19152
19431
  // src/rules/no-sleep-in-test-body.ts
19153
- var NAME75 = "no-sleep-in-test-body";
19432
+ var NAME79 = "no-sleep-in-test-body";
19154
19433
  var SLEEP_HELPERS = /* @__PURE__ */ new Set(["sleep", "delay", "wait", "pause"]);
19155
19434
  var TEST_CALLERS2 = /* @__PURE__ */ new Set([
19156
19435
  "it",
@@ -19241,7 +19520,7 @@ var no_sleep_in_test_body_default = defineRule({
19241
19520
  type: "problem",
19242
19521
  docs: {
19243
19522
  description: "Avoid fixed timed sleeps directly in test bodies; synchronize on observable behavior or use controlled timers.",
19244
- url: docsUrl(NAME75)
19523
+ url: docsUrl(NAME79)
19245
19524
  },
19246
19525
  schema: [],
19247
19526
  messages: {
@@ -19285,7 +19564,7 @@ var no_sleep_in_test_body_default = defineRule({
19285
19564
  });
19286
19565
 
19287
19566
  // src/rules/no-storage-in-stateless-modules.ts
19288
- var NAME76 = "no-storage-in-stateless-modules";
19567
+ var NAME80 = "no-storage-in-stateless-modules";
19289
19568
  var DEFAULT_METHODS2 = [
19290
19569
  "prepare",
19291
19570
  "put",
@@ -19357,7 +19636,7 @@ var no_storage_in_stateless_modules_default = defineRule({
19357
19636
  type: "problem",
19358
19637
  docs: {
19359
19638
  description: "Disallow SQL or key/value access inside configured stateless modules; derive state from a system of record instead.",
19360
- url: docsUrl(NAME76)
19639
+ url: docsUrl(NAME80)
19361
19640
  },
19362
19641
  schema: [
19363
19642
  {
@@ -19462,7 +19741,7 @@ function named2(node, name) {
19462
19741
  }
19463
19742
 
19464
19743
  // src/rules/no-string-concat-in-loop.ts
19465
- var NAME77 = "no-string-concat-in-loop";
19744
+ var NAME81 = "no-string-concat-in-loop";
19466
19745
  var LOOP_NODE_TYPES = /* @__PURE__ */ new Set([
19467
19746
  "ForStatement",
19468
19747
  "ForOfStatement",
@@ -19610,7 +19889,7 @@ var no_string_concat_in_loop_default = defineRule({
19610
19889
  fixable: "code",
19611
19890
  docs: {
19612
19891
  description: "Prefer collecting string fragments over repeatedly accumulating a growing string inside a loop.",
19613
- url: docsUrl(NAME77)
19892
+ url: docsUrl(NAME81)
19614
19893
  },
19615
19894
  schema: [],
19616
19895
  messages: {
@@ -19657,7 +19936,7 @@ var no_string_concat_in_loop_default = defineRule({
19657
19936
  });
19658
19937
 
19659
19938
  // src/rules/no-tautological-expect.ts
19660
- var NAME78 = "no-tautological-expect";
19939
+ var NAME82 = "no-tautological-expect";
19661
19940
  var EQUALITY_MATCHERS2 = /* @__PURE__ */ new Set(["toBe", "toEqual", "toStrictEqual"]);
19662
19941
  var ZERO_ARG_MATCHERS = /* @__PURE__ */ new Map([
19663
19942
  ["toBeDefined", (value) => value !== void 0],
@@ -19833,7 +20112,7 @@ var no_tautological_expect_default = defineRule({
19833
20112
  type: "problem",
19834
20113
  docs: {
19835
20114
  description: "Disallow supported assertions fixed by literal setup or immutable self identity.",
19836
- url: docsUrl(NAME78)
20115
+ url: docsUrl(NAME82)
19837
20116
  },
19838
20117
  schema: [],
19839
20118
  messages: {
@@ -19870,7 +20149,7 @@ var no_tautological_expect_default = defineRule({
19870
20149
  });
19871
20150
 
19872
20151
  // src/rules/no-trailing-value-narration.ts
19873
- var NAME79 = "no-trailing-value-narration";
20152
+ var NAME83 = "no-trailing-value-narration";
19874
20153
  var NUMBER_RE = /(?<![\w.])(\d+(?:\.\d+)?)(?![\w.])/g;
19875
20154
  var WORD_RE4 = /[\p{L}\p{M}]+(?:'[\p{L}\p{M}]+)?|\d+(?:\.\d+)?/gu;
19876
20155
  var UNIT_WORDS = /* @__PURE__ */ new Set([
@@ -19993,7 +20272,7 @@ var no_trailing_value_narration_default = defineRule({
19993
20272
  fixable: "code",
19994
20273
  docs: {
19995
20274
  description: "Flag a trailing comment that repeats the line's numeric value only to name its unit.",
19996
- url: docsUrl(NAME79)
20275
+ url: docsUrl(NAME83)
19997
20276
  },
19998
20277
  schema: [],
19999
20278
  messages: {
@@ -20209,7 +20488,7 @@ var no_type_member_comment_wall_default = defineRule({
20209
20488
  });
20210
20489
 
20211
20490
  // src/rules/no-typed-doc-sections.ts
20212
- var NAME80 = "no-typed-doc-sections";
20491
+ var NAME84 = "no-typed-doc-sections";
20213
20492
  var TYPED_TAG_RE3 = /^\s*@(arg|argument|param|return|returns|yield|yields)\b(.*)$/iu;
20214
20493
  var PARAM_TAGS2 = /* @__PURE__ */ new Set(["arg", "argument", "param"]);
20215
20494
  var PARAMETER_FILLER = /* @__PURE__ */ new Set([
@@ -20381,7 +20660,7 @@ var no_typed_doc_sections_default = defineRule({
20381
20660
  fixable: "code",
20382
20661
  docs: {
20383
20662
  description: "Reject typed-signature repetition while preserving behavior that types cannot express.",
20384
- url: docsUrl(NAME80)
20663
+ url: docsUrl(NAME84)
20385
20664
  },
20386
20665
  schema: [],
20387
20666
  messages: {
@@ -20743,7 +21022,7 @@ function translationExemptElement(opening, isText) {
20743
21022
  }
20744
21023
 
20745
21024
  // src/rules/no-unlocalized-jsx-attributes.ts
20746
- var NAME81 = "no-unlocalized-jsx-attributes";
21025
+ var NAME85 = "no-unlocalized-jsx-attributes";
20747
21026
  var DEFAULT_ATTRIBUTES = ["title", "placeholder", "alt", "aria-label", "aria-description"];
20748
21027
  var ID_REFERENCES = /* @__PURE__ */ new Set([
20749
21028
  "aria-labelledby",
@@ -20763,7 +21042,7 @@ var no_unlocalized_jsx_attributes_default = defineRule({
20763
21042
  type: "suggestion",
20764
21043
  docs: {
20765
21044
  description: "Require translation for literal user-visible JSX attributes in opted-in localized interfaces.",
20766
- url: docsUrl(NAME81)
21045
+ url: docsUrl(NAME85)
20767
21046
  },
20768
21047
  schema: [
20769
21048
  {
@@ -20812,14 +21091,14 @@ var no_unlocalized_jsx_attributes_default = defineRule({
20812
21091
  });
20813
21092
 
20814
21093
  // src/rules/no-unlocalized-jsx-text.ts
20815
- var NAME82 = "no-unlocalized-jsx-text";
21094
+ var NAME86 = "no-unlocalized-jsx-text";
20816
21095
  var no_unlocalized_jsx_text_default = defineRule({
20817
21096
  meta: {
20818
21097
  defaultOptions: [{ enabled: true }],
20819
21098
  type: "suggestion",
20820
21099
  docs: {
20821
21100
  description: "Require translation for literal JSX text in opted-in localized interfaces.",
20822
- url: docsUrl(NAME82)
21101
+ url: docsUrl(NAME86)
20823
21102
  },
20824
21103
  schema: [
20825
21104
  {
@@ -20856,7 +21135,7 @@ var no_unlocalized_jsx_text_default = defineRule({
20856
21135
  });
20857
21136
 
20858
21137
  // src/rules/no-unlocalized-toast.ts
20859
- var NAME83 = "no-unlocalized-toast";
21138
+ var NAME87 = "no-unlocalized-toast";
20860
21139
  var DEFAULT_FUNCTIONS = [
20861
21140
  { module: "sonner", export: "toast" },
20862
21141
  { module: "react-hot-toast", export: "default" }
@@ -20868,7 +21147,7 @@ var no_unlocalized_toast_default = defineRule({
20868
21147
  type: "suggestion",
20869
21148
  docs: {
20870
21149
  description: "Require translation for literal toast messages in opted-in localized interfaces.",
20871
- url: docsUrl(NAME83)
21150
+ url: docsUrl(NAME87)
20872
21151
  },
20873
21152
  schema: [
20874
21153
  {
@@ -20926,7 +21205,7 @@ var no_unlocalized_toast_default = defineRule({
20926
21205
  });
20927
21206
 
20928
21207
  // src/rules/no-unnecessary-use-client.ts
20929
- var NAME84 = "no-unnecessary-use-client";
21208
+ var NAME88 = "no-unnecessary-use-client";
20930
21209
  var HOOK_REGEX = /^use([A-Z]|$)/;
20931
21210
  var EVENT_PROP_REGEX = /^on[A-Z]/;
20932
21211
  var ERROR_FILE_REGEX = /(?:^|[\\/])(?:global-)?error\.[jt]sx?$/;
@@ -21015,7 +21294,7 @@ var no_unnecessary_use_client_default = defineRule({
21015
21294
  type: "suggestion",
21016
21295
  docs: {
21017
21296
  description: "Flag `'use client'` files with no hooks or event handlers \u2014 they could be RSC.",
21018
- url: docsUrl(NAME84)
21297
+ url: docsUrl(NAME88)
21019
21298
  },
21020
21299
  schema: [],
21021
21300
  messages: {
@@ -21107,7 +21386,7 @@ var no_unnecessary_use_client_default = defineRule({
21107
21386
  });
21108
21387
 
21109
21388
  // src/rules/no-unsafe-mock-casting.ts
21110
- var NAME85 = "no-unsafe-mock-casting";
21389
+ var NAME89 = "no-unsafe-mock-casting";
21111
21390
  var MOCK_TYPE_NAMES = /* @__PURE__ */ new Set([
21112
21391
  "Mock",
21113
21392
  "Mocked",
@@ -21139,7 +21418,7 @@ var no_unsafe_mock_casting_default = defineRule({
21139
21418
  fixable: "code",
21140
21419
  docs: {
21141
21420
  description: "Disallow casting to mock types like `jest.Mock` or `vi.Mock`. Use `vi.mocked()` or `jest.mocked()` instead.",
21142
- url: docsUrl(NAME85)
21421
+ url: docsUrl(NAME89)
21143
21422
  },
21144
21423
  schema: [],
21145
21424
  messages: {
@@ -21200,7 +21479,7 @@ var no_unsafe_mock_casting_default = defineRule({
21200
21479
  });
21201
21480
 
21202
21481
  // src/rules/no-unsafe-test-double-cast.ts
21203
- var NAME86 = "no-unsafe-test-double-cast";
21482
+ var NAME90 = "no-unsafe-test-double-cast";
21204
21483
  var MOCK_FACTORIES = /* @__PURE__ */ new Set(["fn", "spyOn"]);
21205
21484
  var SIMPLE_LITERAL_TYPES = /* @__PURE__ */ new Set(["string", "number", "boolean", "bigint"]);
21206
21485
  function containsMockFactory(node, source) {
@@ -21227,7 +21506,7 @@ var no_unsafe_test_double_cast_default = defineRule({
21227
21506
  fixable: "code",
21228
21507
  docs: {
21229
21508
  description: "Disallow mock-backed test doubles that bypass collaborator contracts through double assertions.",
21230
- url: docsUrl(NAME86)
21509
+ url: docsUrl(NAME90)
21231
21510
  },
21232
21511
  schema: [],
21233
21512
  messages: { noUnsafeTestDoubleCast: "This mock-backed partial object bypasses the collaborator contract through `unknown`. Use a narrow injected port and typed recording fake, or make the fixture satisfy the real contract." }
@@ -21273,7 +21552,7 @@ function simpleMockObject(node, sourceCode2) {
21273
21552
  }
21274
21553
 
21275
21554
  // src/rules/no-vague-suppression-description.ts
21276
- var NAME87 = "no-vague-suppression-description";
21555
+ var NAME91 = "no-vague-suppression-description";
21277
21556
  var DIRECTIVE_WITH_DESCRIPTION_RE = /^(?:eslint|oxlint)-(?:disable|disable-next-line|disable-line)\b[^:\n]*?\s*(?::|--)\s*(.+?)\s*$/iu;
21278
21557
  var TS_EXPECT_ERROR_WITH_DESCRIPTION_RE = /^@ts-expect-error\b(?:(?:\s*(?::|--)\s*)|\s+)(.+?)\s*$/iu;
21279
21558
  var VAGUE_RE = /^(?:needed|required|same|n\/a|legacy|intentional(?:ly)?|ignore(?:d)?|false positive|type error|typescript|to satisfy (?:the )?(?:linter|typescript|type checker))\.?$/iu;
@@ -21285,7 +21564,7 @@ var no_vague_suppression_description_default = defineRule({
21285
21564
  type: "suggestion",
21286
21565
  docs: {
21287
21566
  description: "Require suppression descriptions to name the concrete mismatch or invariant instead of a generic non-reason.",
21288
- url: docsUrl(NAME87)
21567
+ url: docsUrl(NAME91)
21289
21568
  },
21290
21569
  schema: [],
21291
21570
  messages: {
@@ -21312,7 +21591,7 @@ var no_vague_suppression_description_default = defineRule({
21312
21591
  });
21313
21592
 
21314
21593
  // src/rules/no-zod-native-enum.ts
21315
- var NAME88 = "no-zod-native-enum";
21594
+ var NAME92 = "no-zod-native-enum";
21316
21595
  function unwrap3(node) {
21317
21596
  if (node.type === "TSAsExpression" || node.type === "TSSatisfiesExpression") return unwrap3(node.expression);
21318
21597
  return node;
@@ -21331,7 +21610,7 @@ var no_zod_native_enum_default = defineRule({
21331
21610
  type: "suggestion",
21332
21611
  docs: {
21333
21612
  description: 'Disallow `z.nativeEnum()` (and `z.enum()` over a TypeScript enum); use `z.enum(["a", "b"])` with a string-literal union instead.',
21334
- url: docsUrl(NAME88)
21613
+ url: docsUrl(NAME92)
21335
21614
  },
21336
21615
  schema: [],
21337
21616
  messages: {
@@ -21430,7 +21709,7 @@ var no_zod_native_enum_default = defineRule({
21430
21709
  });
21431
21710
 
21432
21711
  // src/rules/no-zod-parse-typed-object.ts
21433
- var NAME89 = "no-zod-parse-typed-object";
21712
+ var NAME93 = "no-zod-parse-typed-object";
21434
21713
  var PARSE_METHODS2 = /* @__PURE__ */ new Set(["parse", "parseAsync", "safeParse", "safeParseAsync"]);
21435
21714
  var DECLARATION_FILE3 = /\.d\.[cm]?ts$/u;
21436
21715
  function isAssignable(env, source, target) {
@@ -21582,7 +21861,7 @@ function isZodDeclaration(signature) {
21582
21861
  var no_zod_parse_typed_object_default = defineRule({
21583
21862
  meta: {
21584
21863
  type: "suggestion",
21585
- docs: { description: "Reuse known object contracts instead of parsing them again with Zod.", url: docsUrl(NAME89) },
21864
+ docs: { description: "Reuse known object contracts instead of parsing them again with Zod.", url: docsUrl(NAME93) },
21586
21865
  schema: [],
21587
21866
  messages: {
21588
21867
  typedObject: "This object already has a compatible TypeScript contract. Reuse the typed value and make defaults or normalization explicit; reserve Zod parsing for unknown boundary data."
@@ -21642,7 +21921,7 @@ var no_zod_parse_typed_object_default = defineRule({
21642
21921
  });
21643
21922
 
21644
21923
  // src/rules/prefer-await-in-async-return.ts
21645
- var NAME90 = "prefer-await-in-async-return";
21924
+ var NAME94 = "prefer-await-in-async-return";
21646
21925
  function directAsyncReturnOwner(node) {
21647
21926
  const parent = parentOf(node);
21648
21927
  if (parent?.type === "ArrowFunctionExpression" && parent.body === node) {
@@ -21697,7 +21976,7 @@ var prefer_await_in_async_return_default = defineRule({
21697
21976
  type: "suggestion",
21698
21977
  docs: {
21699
21978
  description: "Prefer explicit `await` for proven Promise `.then` calls; the default scope checks direct async returns.",
21700
- url: docsUrl(NAME90)
21979
+ url: docsUrl(NAME94)
21701
21980
  },
21702
21981
  schema: [{
21703
21982
  type: "object",
@@ -21776,7 +22055,7 @@ var prefer_await_in_async_return_default = defineRule({
21776
22055
  });
21777
22056
 
21778
22057
  // src/rules/prefer-coded-error-result.ts
21779
- var NAME91 = "prefer-coded-error-result";
22058
+ var NAME95 = "prefer-coded-error-result";
21780
22059
  var MAX_DEPTH = 16;
21781
22060
  var MAX_VARIANTS = 64;
21782
22061
  var MAX_TYPE_STEPS = 256;
@@ -22257,7 +22536,7 @@ var prefer_coded_error_result_default = defineRule({
22257
22536
  type: "suggestion",
22258
22537
  docs: {
22259
22538
  description: "Return a stable error code and typed context instead of only a rendered failure message.",
22260
- url: docsUrl(NAME91)
22539
+ url: docsUrl(NAME95)
22261
22540
  },
22262
22541
  schema: [],
22263
22542
  messages: {
@@ -22318,7 +22597,7 @@ var prefer_coded_error_result_default = defineRule({
22318
22597
 
22319
22598
  // src/rules/prefer-configured-cloud-scope.ts
22320
22599
  import { URL as NativeURL } from "url";
22321
- var NAME92 = "prefer-configured-cloud-scope";
22600
+ var NAME96 = "prefer-configured-cloud-scope";
22322
22601
  var ACCOUNT_PREFIX = "https://api.cloudflare.com/client/v4/accounts/";
22323
22602
  var ACCOUNT_URL = /^https:\/\/api\.cloudflare\.com\/client\/v4\/accounts\/[a-fA-F\d]{32}(?=\/|[?#]|$)/u;
22324
22603
  var GLOBAL_RECEIVERS5 = /* @__PURE__ */ new Set(["globalThis", "global", "self", "window"]);
@@ -22340,7 +22619,7 @@ var prefer_configured_cloud_scope_default = defineRule({
22340
22619
  type: "suggestion",
22341
22620
  docs: {
22342
22621
  description: "Prefer validated deployment configuration for account scope in outgoing cloud management requests.",
22343
- url: docsUrl(NAME92)
22622
+ url: docsUrl(NAME96)
22344
22623
  },
22345
22624
  schema: [],
22346
22625
  messages: {
@@ -22569,7 +22848,7 @@ var prefer_configured_cloud_scope_default = defineRule({
22569
22848
  });
22570
22849
 
22571
22850
  // src/rules/prefer-constant-time-secret-compare.ts
22572
- var NAME93 = "prefer-constant-time-secret-compare";
22851
+ var NAME97 = "prefer-constant-time-secret-compare";
22573
22852
  var EQUALITY_OPERATORS3 = /* @__PURE__ */ new Set(["===", "!==", "==", "!="]);
22574
22853
  var AUTH_TOKEN_QUALIFIERS = /* @__PURE__ */ new Set(["access", "refresh", "session", "admin", "csrf", "xsrf", "auth", "authentication", "signing", "api"]);
22575
22854
  var SENTINEL_IDENTIFIERS = /* @__PURE__ */ new Set(["undefined", "NaN"]);
@@ -22633,7 +22912,7 @@ var prefer_constant_time_secret_compare_default = defineRule({
22633
22912
  type: "problem",
22634
22913
  docs: {
22635
22914
  description: "Prefer a supported constant-time comparison primitive for secret-like values.",
22636
- url: docsUrl(NAME93)
22915
+ url: docsUrl(NAME97)
22637
22916
  },
22638
22917
  schema: [],
22639
22918
  messages: {
@@ -22721,7 +23000,7 @@ function constInitializer4(definition) {
22721
23000
  }
22722
23001
 
22723
23002
  // src/rules/prefer-dependency-interface.ts
22724
- var NAME94 = "prefer-dependency-interface";
23003
+ var NAME98 = "prefer-dependency-interface";
22725
23004
  function readsInterfaceMember(use, members2) {
22726
23005
  const parent = parentOf(use);
22727
23006
  if (parent?.type !== "MemberExpression" || parent.object !== use || !members2.has(getPropertyName(parent) ?? "")) return false;
@@ -22751,7 +23030,7 @@ var prefer_dependency_interface_default = defineRule({
22751
23030
  type: "suggestion",
22752
23031
  docs: {
22753
23032
  description: "Annotate retained collaborators with their existing interface when the consumer uses only that contract.",
22754
- url: docsUrl(NAME94)
23033
+ url: docsUrl(NAME98)
22755
23034
  },
22756
23035
  schema: [],
22757
23036
  messages: { interface: "Use the existing `{{contract}}` interface for this dependency; its consumer uses only that contract." }
@@ -23132,25 +23411,115 @@ function literalTag(node) {
23132
23411
  return typeof node.value === "string" || typeof node.value === "number" || typeof node.value === "boolean" ? node.value : void 0;
23133
23412
  }
23134
23413
 
23414
+ // src/rules/_discriminated-union-projections.ts
23415
+ function projectedBooleanPairs(owner, returned2, source) {
23416
+ if (owner.async || owner.generator || isPresent(owner.typeParameters) || owner.body?.type !== "BlockStatement" || parentOf(returned2) !== owner.body || owner.body.body.at(-1) !== returned2 || returned2.argument?.type !== "ObjectExpression") return [];
23417
+ const contract = returnContract(owner, source);
23418
+ const shape = contract === void 0 ? void 0 : objectContract(contract.members);
23419
+ if (shape === void 0 || contract === void 0) return [];
23420
+ const properties2 = returnedProperties([returned2.argument], shape)?.[0];
23421
+ if (properties2 === void 0) return [];
23422
+ const fields2 = [...shape.members].filter(([, member3]) => !member3.optional && booleanType(member3.typeAnnotation?.typeAnnotation, source));
23423
+ if (fields2.length > 8) return [];
23424
+ const comparisons = [];
23425
+ for (const [field] of fields2) {
23426
+ const value = properties2.get(field);
23427
+ if (value?.type !== "BinaryExpression" || value.operator !== "===" || value.left.type !== "Identifier" || !constantSyntax(value.right, source)) continue;
23428
+ const binding3 = localSnapshot(value.left, owner, source);
23429
+ if (binding3 !== null) comparisons.push({ field, binding: binding3, left: value.left, right: value.right });
23430
+ }
23431
+ return comparisons.flatMap((left, index) => comparisons.slice(index + 1).filter((right) => right.binding === left.binding).map((right) => ({ reportNode: contract.reportNode, left, right })));
23432
+ }
23433
+ function localSnapshot(identifier, owner, source) {
23434
+ const variable = findVariable(source.getScope(identifier), identifier.name);
23435
+ const declaration = variable?.defs[0]?.node;
23436
+ if (variable === null || variable.defs.length !== 1 || declaration?.type !== "VariableDeclarator" || !isConstDeclaration(parentOf(declaration)) || !isPresent(declaration.init) || enclosingFunction(declaration) !== owner || declaration.range[1] >= identifier.range[0] || !stableValueBinding(variable)) return null;
23437
+ return variable;
23438
+ }
23439
+ function constantSyntax(node, source) {
23440
+ if (node.type === "Literal") return typeof node.value === "string" || typeof node.value === "number" && Number.isFinite(node.value);
23441
+ if (node.type !== "MemberExpression" || node.computed || node.optional || node.object.type !== "Identifier" || node.property.type !== "Identifier") return false;
23442
+ const variable = findVariable(source.getScope(node.object), node.object.name);
23443
+ const definition = variable?.defs[0]?.node;
23444
+ if (variable === null || variable.defs.length !== 1 || definition?.type !== "TSEnumDeclaration" && definition?.type !== "ImportSpecifier" || !stableValueBinding(variable)) return false;
23445
+ return variable.references.every((reference) => {
23446
+ if (typeOnlyReference(reference)) return true;
23447
+ const member3 = parentOf(reference.identifier);
23448
+ if (member3?.type !== "MemberExpression" || member3.object !== reference.identifier || member3.computed || member3.optional || writtenMember(member3)) return false;
23449
+ const use = parentOf(member3);
23450
+ return !((use?.type === "CallExpression" || use?.type === "NewExpression") && use.callee === member3);
23451
+ });
23452
+ }
23453
+ function enumConstant(node, native) {
23454
+ if (node.type !== "MemberExpression") return false;
23455
+ const root = native.node(node.object);
23456
+ const member3 = native.node(node.property);
23457
+ let symbol = root === void 0 ? void 0 : native.checker.getSymbolAtLocation(root);
23458
+ if (symbol === void 0 || member3 === void 0) return false;
23459
+ if ((symbol.flags & native.sync.SymbolFlags.Alias) !== 0) symbol = native.checker.getAliasedSymbol(symbol);
23460
+ const declarations = symbol.declarations;
23461
+ if (declarations.length !== 1 || declarations[0]?.kind !== native.ast.SyntaxKind.EnumDeclaration) return false;
23462
+ const selected = native.checker.getSymbolAtLocation(member3)?.declarations;
23463
+ return selected?.length === 1 && selected[0]?.kind === native.ast.SyntaxKind.EnumMember;
23464
+ }
23465
+ function projectedBooleanEvidence(file, candidates2) {
23466
+ const nodes = candidates2.flatMap(({ left, right }) => [left.left, right.left, left.right, right.right]);
23467
+ const types = file.typesOf(nodes);
23468
+ const unions = types.flatMap((type) => type !== void 0 && type.isUnionType() ? [type] : []);
23469
+ const lists = file.batch(unions.map((type) => type.getTypes.gen()));
23470
+ let index = 0;
23471
+ const domains = types.map((type) => type === void 0 ? void 0 : primitiveValues(type.isUnionType() ? lists[index++] ?? [] : [type], file));
23472
+ const native = nativeTypes(file);
23473
+ const constants = /* @__PURE__ */ new Map();
23474
+ function constant(node, value) {
23475
+ if (node.type === "Literal") return node.value === value;
23476
+ let valid = constants.get(node);
23477
+ if (valid === void 0) {
23478
+ valid = enumConstant(node, native);
23479
+ constants.set(node, valid);
23480
+ }
23481
+ return valid;
23482
+ }
23483
+ return candidates2.map(({ left, right }, ordinal) => {
23484
+ const [a, b, x, y] = domains.slice(ordinal * 4, ordinal * 4 + 4);
23485
+ const first = x?.[0];
23486
+ const second = y?.[0];
23487
+ return a !== void 0 && b !== void 0 && x?.length === 1 && y?.length === 1 && first !== void 0 && second !== void 0 && first !== second && constant(left.right, first) && constant(right.right, second) && a.includes(first) && a.includes(second) && b.includes(first) && b.includes(second);
23488
+ });
23489
+ }
23490
+ function primitiveValues(types, file) {
23491
+ if (types.length < 1 || types.length > 16) return void 0;
23492
+ const values = [];
23493
+ for (const type of types) {
23494
+ if ((type.flags & (file.flags.StringLiteral | file.flags.NumberLiteral)) === 0) return void 0;
23495
+ const value = type.value;
23496
+ if (typeof value !== "string" && !(typeof value === "number" && Number.isFinite(value))) return void 0;
23497
+ values.push(value);
23498
+ }
23499
+ return values;
23500
+ }
23501
+
23135
23502
  // src/rules/prefer-discriminated-union.ts
23136
- var NAME95 = "prefer-discriminated-union";
23503
+ var NAME99 = "prefer-discriminated-union";
23137
23504
  var prefer_discriminated_union_default = defineRule({
23138
23505
  meta: {
23139
23506
  type: "suggestion",
23140
23507
  fixable: "code",
23141
23508
  docs: {
23142
23509
  description: "Preserve producer-proven tag/payload and Boolean state relationships in return types.",
23143
- url: docsUrl(NAME95)
23510
+ url: docsUrl(NAME99)
23144
23511
  },
23145
23512
  schema: [],
23146
23513
  messages: {
23147
23514
  preferProducedVariants: "This producer returns tag-specific payloads for `{{tag}}`, but its flat return contract makes them optional. If these variants define the domain, use a discriminated union with each variant's required payload, or give this producer a precise return type separate from the broader contract.",
23148
- preferProducedState: "This producer returns a restricted set of literal combinations for `{{fields}}`, while its Boolean fields permit all four. Review a union preserving every returned combination, or a typed disposition if these are domain phases. Other writers and readers of a shared contract require review."
23515
+ preferProducedState: "This producer returns a restricted set of literal combinations for `{{fields}}`, while its Boolean fields permit all four. Review a union preserving every returned combination, or a typed disposition if these are domain phases. Other writers and readers of a shared contract require review.",
23516
+ preferProjectedState: "This producer compares the same immutable primitive snapshot with distinct state values for `{{fields}}`, but its Boolean return contract also permits true/true. Review returning the authoritative state or preserving every produced combination in a union. Keep independent dimensions and unknown states; other writers and readers of a shared contract require review."
23149
23517
  }
23150
23518
  },
23151
23519
  createOnce(context) {
23152
23520
  const reportedContracts = /* @__PURE__ */ new Set();
23153
23521
  const producers = [];
23522
+ const returns = /* @__PURE__ */ new Map();
23154
23523
  function rememberProducer(node) {
23155
23524
  producers.push(node);
23156
23525
  }
@@ -23170,6 +23539,7 @@ var prefer_discriminated_union_default = defineRule({
23170
23539
  before() {
23171
23540
  reportedContracts.clear();
23172
23541
  producers.length = 0;
23542
+ returns.clear();
23173
23543
  const file = { filename: context.filename, cwd: context.cwd };
23174
23544
  if (isTestFile(file) || isGeneratedFile(file, context.sourceCode.text)) return false;
23175
23545
  return void 0;
@@ -23177,8 +23547,28 @@ var prefer_discriminated_union_default = defineRule({
23177
23547
  ArrowFunctionExpression: rememberProducer,
23178
23548
  FunctionDeclaration: rememberProducer,
23179
23549
  FunctionExpression: rememberProducer,
23550
+ ReturnStatement(node) {
23551
+ const owner = enclosingFunction(node);
23552
+ if (owner !== null) returns.set(owner, returns.has(owner) ? null : node);
23553
+ },
23180
23554
  "Program:exit"() {
23181
23555
  for (const producer of producers) checkProducer(producer);
23556
+ if (hasIdentifierNamed(context.sourceCode, "eval")) return;
23557
+ const candidates2 = [];
23558
+ for (const producer of producers) {
23559
+ const returned2 = returns.get(producer);
23560
+ if (!isPresent(returned2)) continue;
23561
+ candidates2.push(...projectedBooleanPairs(producer, returned2, context.sourceCode).filter(({ reportNode }) => !reportedContracts.has(reportNode)));
23562
+ if (candidates2.length > 128) return;
23563
+ }
23564
+ if (candidates2.length === 0) return;
23565
+ const evidence = tsrsServices(context)?.run((file) => projectedBooleanEvidence(file, candidates2));
23566
+ if (!isPresent(evidence)) return;
23567
+ candidates2.forEach(({ reportNode, left, right }, index) => {
23568
+ if (evidence[index] !== true || reportedContracts.has(reportNode)) return;
23569
+ reportedContracts.add(reportNode);
23570
+ context.report({ node: reportNode, messageId: "preferProjectedState", data: { fields: [left.field, right.field].join("`, `") } });
23571
+ });
23182
23572
  }
23183
23573
  };
23184
23574
  }
@@ -23221,7 +23611,7 @@ function privateVariantType(properties2, result, sourceCode2) {
23221
23611
  }
23222
23612
 
23223
23613
  // src/rules/prefer-ecmascript-private-members.ts
23224
- var NAME96 = "prefer-ecmascript-private-members";
23614
+ var NAME100 = "prefer-ecmascript-private-members";
23225
23615
  function isConvertible(member3) {
23226
23616
  return member3.accessibility === "private" && !(member3.type === "MethodDefinition" && member3.kind === "constructor") && !member3.computed && member3.key.type === "Identifier" && (member3.decorators?.length ?? 0) === 0 && !("declare" in member3 && member3.declare) && !member3.override && !(member3.type === "MethodDefinition" && (member3.value.body ?? null) === null);
23227
23617
  }
@@ -23231,7 +23621,7 @@ var prefer_ecmascript_private_members_default = defineRule({
23231
23621
  fixable: "code",
23232
23622
  docs: {
23233
23623
  description: "Prefer ECMAScript `#private` class members over TypeScript-only `private` members.",
23234
- url: docsUrl(NAME96)
23624
+ url: docsUrl(NAME100)
23235
23625
  },
23236
23626
  schema: [],
23237
23627
  messages: {
@@ -23285,7 +23675,7 @@ var prefer_ecmascript_private_members_default = defineRule({
23285
23675
  });
23286
23676
 
23287
23677
  // src/rules/prefer-immutable-module-constant.ts
23288
- var NAME97 = "prefer-immutable-module-constant";
23678
+ var NAME101 = "prefer-immutable-module-constant";
23289
23679
  var CONSTANT_NAME = /^_?[A-Z][A-Z0-9_]*$/;
23290
23680
  var JAVASCRIPT_FILE_RE = /\.[cm]?jsx?$/i;
23291
23681
  var MUTATING_METHODS = /* @__PURE__ */ new Set([
@@ -23458,7 +23848,7 @@ var prefer_immutable_module_constant_default = defineRule({
23458
23848
  fixable: "code",
23459
23849
  docs: {
23460
23850
  description: "Require module-level constant collections to expose readonly state.",
23461
- url: docsUrl(NAME97)
23851
+ url: docsUrl(NAME101)
23462
23852
  },
23463
23853
  schema: [],
23464
23854
  defaultOptions: [],
@@ -23564,7 +23954,7 @@ function unwrapTransparentExport(node) {
23564
23954
  }
23565
23955
 
23566
23956
  // src/rules/prefer-input-group-search.ts
23567
- var NAME98 = "prefer-input-group-search";
23957
+ var NAME102 = "prefer-input-group-search";
23568
23958
  var INPUT_MODULE = /(?:^|\/)components\/ui\/input$/u;
23569
23959
  var INPUT_GROUP_MODULE = /(?:^|\/)components\/ui\/input-group$/u;
23570
23960
  var MAX_JSX_DISTANCE = 2;
@@ -23635,7 +24025,7 @@ var prefer_input_group_search_default = defineRule({
23635
24025
  type: "suggestion",
23636
24026
  docs: {
23637
24027
  description: "Require search icons and shared Input controls in the same visual wrapper to use InputGroup.",
23638
- url: docsUrl(NAME98)
24028
+ url: docsUrl(NAME102)
23639
24029
  },
23640
24030
  schema: [],
23641
24031
  messages: {
@@ -23719,7 +24109,7 @@ var prefer_input_group_search_default = defineRule({
23719
24109
  });
23720
24110
 
23721
24111
  // src/rules/prefer-logical-tailwind-utilities.ts
23722
- var NAME99 = "prefer-logical-tailwind-utilities";
24112
+ var NAME103 = "prefer-logical-tailwind-utilities";
23723
24113
  var PREFIXES = {
23724
24114
  ml: "ms",
23725
24115
  mr: "me",
@@ -23773,7 +24163,7 @@ var prefer_logical_tailwind_utilities_default = defineRule({
23773
24163
  type: "suggestion",
23774
24164
  docs: {
23775
24165
  description: "Prefer logical Tailwind utilities in explicitly opted-in bidirectional interfaces.",
23776
- url: docsUrl(NAME99)
24166
+ url: docsUrl(NAME103)
23777
24167
  },
23778
24168
  schema: [
23779
24169
  {
@@ -23840,7 +24230,7 @@ var prefer_logical_tailwind_utilities_default = defineRule({
23840
24230
  });
23841
24231
 
23842
24232
  // src/rules/prefer-millisecond-control-duration-schema.ts
23843
- var NAME100 = "prefer-millisecond-control-duration-schema";
24233
+ var NAME104 = "prefer-millisecond-control-duration-schema";
23844
24234
  var CONTROL_SECONDS_RE = /(?:^|_)(?:timeout|delay|interval|backoff|ttl|lease|heartbeat|debounce|throttle)_seconds$/i;
23845
24235
  var CONTROL_SECONDS_CAMEL_RE = /(?:timeout|delay|interval|backoff|ttl|lease|heartbeat|debounce|throttle)Seconds$/i;
23846
24236
  var NUMERIC_REFINEMENTS = /* @__PURE__ */ new Set(["int", "min", "max", "positive", "nonnegative", "finite", "multipleOf", "optional", "nullable", "nullish", "default", "describe", "brand", "readonly"]);
@@ -23852,7 +24242,7 @@ var prefer_millisecond_control_duration_schema_default = defineRule({
23852
24242
  type: "suggestion",
23853
24243
  docs: {
23854
24244
  description: "Require application-owned Zod control-duration fields to use millisecond granularity.",
23855
- url: docsUrl(NAME100)
24245
+ url: docsUrl(NAME104)
23856
24246
  },
23857
24247
  schema: [],
23858
24248
  messages: {
@@ -23938,7 +24328,7 @@ var prefer_millisecond_control_duration_schema_default = defineRule({
23938
24328
  });
23939
24329
 
23940
24330
  // src/rules/prefer-minimal-parameter-contract.ts
23941
- var NAME101 = "prefer-minimal-parameter-contract";
24331
+ var NAME105 = "prefer-minimal-parameter-contract";
23942
24332
  function inlineFields(ast, node, reads) {
23943
24333
  const fields2 = /* @__PURE__ */ new Map();
23944
24334
  for (const member3 of node.members) {
@@ -23957,7 +24347,7 @@ var prefer_minimal_parameter_contract_default = defineRule({
23957
24347
  meta: {
23958
24348
  type: "suggestion",
23959
24349
  fixable: "code",
23960
- docs: { description: "Prefer the proven read-only subset for a private consumer parameter.", url: docsUrl(NAME101) },
24350
+ docs: { description: "Prefer the proven read-only subset for a private consumer parameter.", url: docsUrl(NAME105) },
23961
24351
  schema: [],
23962
24352
  messages: {
23963
24353
  minimal: "This private consumer reads only {{used}} but also requires {{unused}}. Review a smaller consumer contract; preserve the original runtime object and producer type."
@@ -24356,7 +24746,7 @@ var prefer_module_level_constant_default = defineRule({
24356
24746
  });
24357
24747
 
24358
24748
  // src/rules/prefer-module-level-schema.ts
24359
- var NAME102 = "prefer-module-level-schema";
24749
+ var NAME106 = "prefer-module-level-schema";
24360
24750
  var DEFAULT_FACTORIES = [
24361
24751
  "discriminatedUnion",
24362
24752
  "intersection",
@@ -24538,7 +24928,7 @@ var prefer_module_level_schema_default = defineRule({
24538
24928
  type: "problem",
24539
24929
  docs: {
24540
24930
  description: "Declare a Zod schema at module scope when it closes over nothing in the enclosing function",
24541
- url: docsUrl(NAME102)
24931
+ url: docsUrl(NAME106)
24542
24932
  },
24543
24933
  schema: [
24544
24934
  {
@@ -24688,7 +25078,7 @@ var prefer_module_level_schema_default = defineRule({
24688
25078
  });
24689
25079
 
24690
25080
  // src/rules/prefer-module-level-refined-schema.ts
24691
- var NAME103 = "prefer-module-level-refined-schema";
25081
+ var NAME107 = "prefer-module-level-refined-schema";
24692
25082
  var BENCHMARK_PATH_RE = /(^|[/\\])(?:benchmarks?|bench)[/\\]/;
24693
25083
  var FACTORIES = /* @__PURE__ */ new Set([
24694
25084
  "array",
@@ -24838,7 +25228,7 @@ var prefer_module_level_refined_schema_default = defineRule({
24838
25228
  type: "suggestion",
24839
25229
  docs: {
24840
25230
  description: "Declare closed Zod scalar, format, and wrapper schemas at module scope.",
24841
- url: docsUrl(NAME103)
25231
+ url: docsUrl(NAME107)
24842
25232
  },
24843
25233
  schema: [],
24844
25234
  messages: {
@@ -24936,7 +25326,7 @@ var prefer_module_level_refined_schema_default = defineRule({
24936
25326
  });
24937
25327
 
24938
25328
  // src/rules/prefer-multi-value-zod-literal.ts
24939
- var NAME104 = "prefer-multi-value-zod-literal";
25329
+ var NAME108 = "prefer-multi-value-zod-literal";
24940
25330
  function isStaticPrimitive(node, sourceCode2) {
24941
25331
  node = unwrapExpression(node);
24942
25332
  if (node.type === "Literal") {
@@ -24963,7 +25353,7 @@ var prefer_multi_value_zod_literal_default = defineRule({
24963
25353
  type: "suggestion",
24964
25354
  docs: {
24965
25355
  description: "Use the Zod 4 multi-value literal API instead of a union of literal schemas.",
24966
- url: docsUrl(NAME104)
25356
+ url: docsUrl(NAME108)
24967
25357
  },
24968
25358
  schema: [
24969
25359
  {
@@ -25126,7 +25516,7 @@ function closedType(node) {
25126
25516
  }
25127
25517
 
25128
25518
  // src/rules/prefer-named-callback-domain.ts
25129
- var NAME105 = "prefer-named-callback-domain";
25519
+ var NAME109 = "prefer-named-callback-domain";
25130
25520
  function isLiteralUnion(node) {
25131
25521
  return node.type === "TSUnionType" && node.types.length >= 2 && node.types.every((part) => part.type === "TSLiteralType");
25132
25522
  }
@@ -25146,7 +25536,7 @@ var prefer_named_callback_domain_default = defineRule({
25146
25536
  fixable: "code",
25147
25537
  docs: {
25148
25538
  description: "Name literal-union domains used by callbacks in exported contracts.",
25149
- url: docsUrl(NAME105)
25539
+ url: docsUrl(NAME109)
25150
25540
  },
25151
25541
  schema: [],
25152
25542
  messages: {
@@ -25185,7 +25575,7 @@ var prefer_named_callback_domain_default = defineRule({
25185
25575
  });
25186
25576
 
25187
25577
  // src/rules/prefer-named-complex-return-type.ts
25188
- var NAME106 = "prefer-named-complex-return-type";
25578
+ var NAME110 = "prefer-named-complex-return-type";
25189
25579
  function unwrap5(node) {
25190
25580
  if (node.type === "TSTypeReference" && node.typeArguments?.params.length === 1) {
25191
25581
  const [inner] = node.typeArguments.params;
@@ -25223,7 +25613,7 @@ var prefer_named_complex_return_type_default = defineRule({
25223
25613
  fixable: "code",
25224
25614
  docs: {
25225
25615
  description: "Prefer a named contract for structurally complex function return types.",
25226
- url: docsUrl(NAME106)
25616
+ url: docsUrl(NAME110)
25227
25617
  },
25228
25618
  schema: [],
25229
25619
  messages: {
@@ -25246,14 +25636,14 @@ var prefer_named_complex_return_type_default = defineRule({
25246
25636
  });
25247
25637
 
25248
25638
  // src/rules/prefer-native-fetch-in-server-actions.ts
25249
- var NAME107 = "prefer-native-fetch-in-server-actions";
25639
+ var NAME111 = "prefer-native-fetch-in-server-actions";
25250
25640
  var KY_MODULE = /^ky(?:\/.*)?$/u;
25251
25641
  var prefer_native_fetch_in_server_actions_default = defineRule({
25252
25642
  meta: {
25253
25643
  type: "problem",
25254
25644
  docs: {
25255
25645
  description: "Server action modules should call native fetch instead of importing ky.",
25256
- url: docsUrl(NAME107)
25646
+ url: docsUrl(NAME111)
25257
25647
  },
25258
25648
  schema: [],
25259
25649
  defaultOptions: [],
@@ -25289,7 +25679,7 @@ function isTypeOnly(node) {
25289
25679
  }
25290
25680
 
25291
25681
  // src/rules/prefer-native-random-uuid.ts
25292
- var NAME108 = "prefer-native-random-uuid";
25682
+ var NAME112 = "prefer-native-random-uuid";
25293
25683
  function requireUuidCallee(node) {
25294
25684
  return node?.type === "CallExpression" && node.callee.type === "Identifier" && node.callee.name === "require" && node.arguments.length === 1 && node.arguments[0]?.type === "Literal" && node.arguments[0].value === "uuid" ? node.callee : null;
25295
25685
  }
@@ -25302,7 +25692,7 @@ var prefer_native_random_uuid_default = defineRule({
25302
25692
  type: "suggestion",
25303
25693
  docs: {
25304
25694
  description: "Prefer `globalThis.crypto.randomUUID()` over resolved zero-argument UUID v4 bindings from the `uuid` package.",
25305
- url: docsUrl(NAME108)
25695
+ url: docsUrl(NAME112)
25306
25696
  },
25307
25697
  hasSuggestions: true,
25308
25698
  fixable: "code",
@@ -25390,7 +25780,7 @@ var prefer_native_random_uuid_default = defineRule({
25390
25780
  });
25391
25781
 
25392
25782
  // src/rules/prefer-node-crypto-hash.ts
25393
- var NAME109 = "prefer-node-crypto-hash";
25783
+ var NAME113 = "prefer-node-crypto-hash";
25394
25784
  var UNSAFE_NAMESPACE_METHODS = /* @__PURE__ */ new Set(["__defineGetter__", "__defineSetter__", "valueOf"]);
25395
25785
  var UNSAFE_AUTHORITY_IDENTIFIERS = [
25396
25786
  "eval",
@@ -25494,7 +25884,7 @@ var prefer_node_crypto_hash_default = defineRule({
25494
25884
  fixable: "code",
25495
25885
  docs: {
25496
25886
  description: "Prefer the modern one-shot node:crypto hash API when streaming state is unnecessary.",
25497
- url: docsUrl(NAME109)
25887
+ url: docsUrl(NAME113)
25498
25888
  },
25499
25889
  schema: [],
25500
25890
  messages: { preferNodeCryptoHash: "Prefer the modern one-shot node:crypto hash API when streaming state is unnecessary." }
@@ -25724,7 +26114,7 @@ function hasRetainedFactoryCall(binding3, removed) {
25724
26114
  }
25725
26115
 
25726
26116
  // src/rules/prefer-node-fs-promises.ts
25727
- var NAME110 = "prefer-node-fs-promises";
26117
+ var NAME114 = "prefer-node-fs-promises";
25728
26118
  function memberName3(node) {
25729
26119
  if (!node.computed && node.property.type === "Identifier") return node.property.name;
25730
26120
  if (node.computed && node.property.type === "Literal" && typeof node.property.value === "string") {
@@ -25757,7 +26147,7 @@ var prefer_node_fs_promises_default = defineRule({
25757
26147
  type: "suggestion",
25758
26148
  docs: {
25759
26149
  description: "Prefer promise-based Node.js filesystem APIs over synchronous calls in production modules.",
25760
- url: docsUrl(NAME110)
26150
+ url: docsUrl(NAME114)
25761
26151
  },
25762
26152
  schema: [],
25763
26153
  messages: {
@@ -25900,7 +26290,7 @@ function sameTypeBinding(sourceCode2, alias, annotation, parameter) {
25900
26290
  }
25901
26291
 
25902
26292
  // src/rules/prefer-nominal-id-types.ts
25903
- var NAME111 = "prefer-nominal-id-types";
26293
+ var NAME115 = "prefer-nominal-id-types";
25904
26294
  var OPERATIONAL_ROLES = /* @__PURE__ */ new Set([
25905
26295
  "request",
25906
26296
  "trace",
@@ -26016,7 +26406,7 @@ var prefer_nominal_id_types_default = defineRule({
26016
26406
  fixable: "code",
26017
26407
  docs: {
26018
26408
  description: "Distinguish identifier roles sharing primitive types at callable boundaries.",
26019
- url: docsUrl(NAME111)
26409
+ url: docsUrl(NAME115)
26020
26410
  },
26021
26411
  schema: [],
26022
26412
  messages: {
@@ -26045,7 +26435,7 @@ var prefer_nominal_id_types_default = defineRule({
26045
26435
  });
26046
26436
 
26047
26437
  // src/rules/prefer-non-nullable-collection.ts
26048
- var NAME112 = "prefer-non-nullable-collection";
26438
+ var NAME116 = "prefer-non-nullable-collection";
26049
26439
  var ARRAY_TYPE_NAMES2 = /* @__PURE__ */ new Set(["Array", "ReadonlyArray"]);
26050
26440
  var NULL_GUARD_OPERATORS = /* @__PURE__ */ new Set(["==", "==="]);
26051
26441
  var EMPTY_GUARD_OPERATORS = /* @__PURE__ */ new Set(["==", "===", "<="]);
@@ -26400,7 +26790,7 @@ var prefer_non_nullable_collection_default = defineRule({
26400
26790
  fixable: "code",
26401
26791
  docs: {
26402
26792
  description: "Suggest reviewing nullish arrays that use local empty-array defaults or a shared null-or-empty guard.",
26403
- url: docsUrl(NAME112)
26793
+ url: docsUrl(NAME116)
26404
26794
  },
26405
26795
  schema: [],
26406
26796
  messages: {
@@ -26511,7 +26901,7 @@ var prefer_non_nullable_collection_default = defineRule({
26511
26901
  });
26512
26902
 
26513
26903
  // src/rules/prefer-nullish-filter-predicate.ts
26514
- var NAME113 = "prefer-nullish-filter-predicate";
26904
+ var NAME117 = "prefer-nullish-filter-predicate";
26515
26905
  var SUMMARY = "Prefer an explicit nullish predicate when `filter(Boolean)` removes only nullish values but does not narrow the result type.";
26516
26906
  function isBuiltinArrayFilter(native, symbol) {
26517
26907
  const kinds2 = native.ast.SyntaxKind;
@@ -26568,7 +26958,7 @@ function isLiteralValue(node) {
26568
26958
  var prefer_nullish_filter_predicate_default = defineRule({
26569
26959
  meta: {
26570
26960
  type: "suggestion",
26571
- docs: { description: SUMMARY, url: docsUrl(NAME113) },
26961
+ docs: { description: SUMMARY, url: docsUrl(NAME117) },
26572
26962
  hasSuggestions: true,
26573
26963
  fixable: "code",
26574
26964
  schema: [],
@@ -26661,7 +27051,7 @@ var prefer_nullish_filter_predicate_default = defineRule({
26661
27051
  });
26662
27052
 
26663
27053
  // src/rules/prefer-schema-for-api-payload.ts
26664
- var NAME114 = "prefer-schema-for-api-payload";
27054
+ var NAME118 = "prefer-schema-for-api-payload";
26665
27055
  var unwrap6 = (node) => {
26666
27056
  let current = node ?? null;
26667
27057
  while (current !== null && (isErasedExpression(current) || current.type === "ChainExpression")) current = current.expression;
@@ -26944,7 +27334,7 @@ var prefer_schema_for_api_payload_default = defineRule({
26944
27334
  type: "problem",
26945
27335
  docs: {
26946
27336
  description: "Require Zod (or similar) schema validation on `response.json()` / `JSON.parse()` results before property access.",
26947
- url: docsUrl(NAME114)
27337
+ url: docsUrl(NAME118)
26948
27338
  },
26949
27339
  schema: [],
26950
27340
  messages: {
@@ -27127,7 +27517,7 @@ var prefer_schema_for_api_payload_default = defineRule({
27127
27517
  // src/rules/prefer-semantic-colors.ts
27128
27518
  import { existsSync as existsSync3, lstatSync, readdirSync as readdirSync2, readFileSync as readFileSync2 } from "fs";
27129
27519
  import { dirname as dirname3, join as join3, parse } from "path";
27130
- var NAME115 = "prefer-semantic-colors";
27520
+ var NAME119 = "prefer-semantic-colors";
27131
27521
  var COLOR_PREFIXES = "text|bg|border(?:-[trblxyse])?|ring(?:-offset)?|fill|stroke|from|via|to|divide|decoration|placeholder|accent|caret|shadow|outline";
27132
27522
  var PALETTE = "red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|violet|purple|fuchsia|pink|rose|slate|gray|zinc|neutral|stone";
27133
27523
  var COLOR_FN = "rgba?|hsla?|hwb|oklch|oklab|lab|lch|color";
@@ -27459,7 +27849,7 @@ var prefer_semantic_colors_default = defineRule({
27459
27849
  type: "suggestion",
27460
27850
  docs: {
27461
27851
  description: "Enforce semantic color tokens over raw Tailwind palette classes, arbitrary color values, and inline color literals.",
27462
- url: docsUrl(NAME115)
27852
+ url: docsUrl(NAME119)
27463
27853
  },
27464
27854
  schema: [
27465
27855
  {
@@ -27646,7 +28036,7 @@ function packageWorkspaceGlobs(parsed) {
27646
28036
  }
27647
28037
 
27648
28038
  // src/rules/prefer-server-actions.ts
27649
- var NAME116 = "prefer-server-actions";
28039
+ var NAME120 = "prefer-server-actions";
27650
28040
  var MUTATION_METHODS = /* @__PURE__ */ new Set(["POST", "PUT", "DELETE", "PATCH"]);
27651
28041
  var AXIOS_MUTATION_METHODS = /* @__PURE__ */ new Set(["post", "put", "delete", "patch"]);
27652
28042
  var SKIP_FILE_REGEX = /(?:\.test\.[jt]sx?$|\.spec\.[jt]sx?$|-(?:test|spec)\.[jt]sx?$|\/tests?\/|\/__tests__\/|\/__testfixtures__\/|\/scripts?\/|(?:^|\/)app(?:\/.*)?\/route\.[jt]sx?$|(?:^|\/)middleware\.[jt]sx?$|\/pages\/api\/)/;
@@ -27785,7 +28175,7 @@ var prefer_server_actions_default = defineRule({
27785
28175
  type: "suggestion",
27786
28176
  docs: {
27787
28177
  description: "Prefer Next.js Server Actions over same-origin API mutations.",
27788
- url: docsUrl(NAME116)
28178
+ url: docsUrl(NAME120)
27789
28179
  },
27790
28180
  schema: [
27791
28181
  {
@@ -27871,7 +28261,7 @@ var prefer_server_actions_default = defineRule({
27871
28261
  });
27872
28262
 
27873
28263
  // src/rules/prefer-server-data-preparation.ts
27874
- var NAME117 = "prefer-server-data-preparation";
28264
+ var NAME121 = "prefer-server-data-preparation";
27875
28265
  var METHODS = /* @__PURE__ */ new Set(["map", "filter", "flatMap"]);
27876
28266
  var DOM_EVENTS = /* @__PURE__ */ new Set(["onClick", "onChange", "onInput", "onSubmit"]);
27877
28267
  var BINARY = /* @__PURE__ */ new Set(["===", "!==", "==", "!=", ">", ">=", "<", "<=", "+", "-", "*", "/", "%"]);
@@ -28003,7 +28393,7 @@ function typedProofs(native) {
28003
28393
  var prefer_server_data_preparation_default = defineRule({
28004
28394
  meta: {
28005
28395
  type: "suggestion",
28006
- docs: { description: "Prepare data-only input collections before an interactive client view when possible.", url: docsUrl(NAME117) },
28396
+ docs: { description: "Prepare data-only input collections before an interactive client view when possible.", url: docsUrl(NAME121) },
28007
28397
  schema: [],
28008
28398
  messages: {
28009
28399
  prepareData: "Review preparing this prop-only collection in its producer or Server Component when the inputs are available there. Keep operations depending on unsaved edits or browser interaction reactive in the client."
@@ -28921,7 +29311,7 @@ var ParseErrorCode;
28921
29311
  })(ParseErrorCode || (ParseErrorCode = {}));
28922
29312
 
28923
29313
  // src/rules/prefer-shadcn-primitives.ts
28924
- var NAME118 = "prefer-shadcn-primitives";
29314
+ var NAME122 = "prefer-shadcn-primitives";
28925
29315
  var RAW_PRIMITIVES = {
28926
29316
  button: { capability: "Button", replacement: "Button" },
28927
29317
  dialog: { capability: "Dialog", replacement: "Dialog or AlertDialog family" },
@@ -29130,7 +29520,7 @@ function rawElementName(node) {
29130
29520
  const name = node.name.name;
29131
29521
  return Object.hasOwn(RAW_PRIMITIVES, name) ? name : null;
29132
29522
  }
29133
- function effectiveAttribute(node, attributeName) {
29523
+ function effectiveAttribute2(node, attributeName) {
29134
29524
  for (const attribute of node.attributes.toReversed()) {
29135
29525
  if (attribute.type === "JSXSpreadAttribute") {
29136
29526
  return { kind: "unknown" };
@@ -29173,7 +29563,7 @@ function isLabelableElement(node) {
29173
29563
  const name = node.openingElement.name.name;
29174
29564
  if (!LABELABLE_ELEMENTS.has(name)) return false;
29175
29565
  if (name !== "input") return true;
29176
- const typeAttribute = effectiveAttribute(node.openingElement, "type");
29566
+ const typeAttribute = effectiveAttribute2(node.openingElement, "type");
29177
29567
  if (typeAttribute.kind === "unknown") return false;
29178
29568
  return !(typeAttribute.kind === "known" && typeAttribute.value.toLowerCase() === "hidden");
29179
29569
  }
@@ -29189,14 +29579,14 @@ function containsLabelableElement(node) {
29189
29579
  });
29190
29580
  }
29191
29581
  function isStaticallyAssociatedLabel(node) {
29192
- const htmlFor = effectiveAttribute(node, "htmlFor");
29582
+ const htmlFor = effectiveAttribute2(node, "htmlFor");
29193
29583
  if (htmlFor.kind === "known" && htmlFor.value.trim().length > 0) return true;
29194
29584
  return node.parent.type === "JSXElement" && containsLabelableElement(node.parent);
29195
29585
  }
29196
29586
  function replacementFor2(node, element) {
29197
- if (element === "select" && mayHaveBooleanAttribute(node, "multiple")) return null;
29587
+ if (element === "select" && mayHaveBooleanAttribute2(node, "multiple")) return null;
29198
29588
  if (element !== "input") return RAW_PRIMITIVES[element];
29199
- const typeAttribute = effectiveAttribute(node, "type");
29589
+ const typeAttribute = effectiveAttribute2(node, "type");
29200
29590
  if (typeAttribute.kind === "unknown") return null;
29201
29591
  const inputType = typeAttribute.kind === "known" ? typeAttribute.value.toLowerCase() : "text";
29202
29592
  if (inputType === "hidden" || inputType === "file") return null;
@@ -29209,7 +29599,7 @@ function replacementFor2(node, element) {
29209
29599
  if (AMBIGUOUS_INPUT_TYPES.has(inputType)) return null;
29210
29600
  return RAW_PRIMITIVES.input;
29211
29601
  }
29212
- function mayHaveBooleanAttribute(node, name) {
29602
+ function mayHaveBooleanAttribute2(node, name) {
29213
29603
  for (const attribute of node.attributes.toReversed()) {
29214
29604
  if (attribute.type === "JSXSpreadAttribute") return true;
29215
29605
  if (attribute.name.type !== "JSXIdentifier" || attribute.name.name !== name) continue;
@@ -29223,7 +29613,7 @@ var prefer_shadcn_primitives_default = defineRule({
29223
29613
  type: "suggestion",
29224
29614
  docs: {
29225
29615
  description: "Require visible raw JSX controls to use the corresponding shared shadcn primitive.",
29226
- url: docsUrl(NAME118)
29616
+ url: docsUrl(NAME122)
29227
29617
  },
29228
29618
  schema: [
29229
29619
  {
@@ -29271,7 +29661,7 @@ var prefer_shadcn_primitives_default = defineRule({
29271
29661
  JSXOpeningElement(node) {
29272
29662
  const element = rawElementName(node);
29273
29663
  if (element === null) return;
29274
- if (mayHaveBooleanAttribute(node, "hidden") || hasHiddenAncestor2(node)) return;
29664
+ if (mayHaveBooleanAttribute2(node, "hidden") || hasHiddenAncestor2(node)) return;
29275
29665
  if (element === "label" && !isStaticallyAssociatedLabel(node)) return;
29276
29666
  const replacement = replacementFor2(node, element);
29277
29667
  if (replacement === null) return;
@@ -29296,7 +29686,7 @@ var prefer_shadcn_primitives_default = defineRule({
29296
29686
  });
29297
29687
  function hasHiddenAncestor2(node) {
29298
29688
  for (let ancestor = parentOf(node); ancestor !== null; ancestor = parentOf(ancestor)) {
29299
- if (ancestor.type === "JSXElement" && mayHaveBooleanAttribute(ancestor.openingElement, "hidden")) return true;
29689
+ if (ancestor.type === "JSXElement" && mayHaveBooleanAttribute2(ancestor.openingElement, "hidden")) return true;
29300
29690
  }
29301
29691
  return false;
29302
29692
  }
@@ -29330,7 +29720,7 @@ function matchingAliasTargets(paths, alias) {
29330
29720
  }
29331
29721
 
29332
29722
  // src/rules/prefer-shared-zod-enum.ts
29333
- var NAME119 = "prefer-shared-zod-enum";
29723
+ var NAME123 = "prefer-shared-zod-enum";
29334
29724
  function literalDomain(node) {
29335
29725
  if (node.arguments.length !== 1) return null;
29336
29726
  const first = node.arguments[0];
@@ -29369,7 +29759,7 @@ var prefer_shared_zod_enum_default = defineRule({
29369
29759
  type: "suggestion",
29370
29760
  docs: {
29371
29761
  description: "Give repeated literal Zod enum domains one reusable module-level schema.",
29372
- url: docsUrl(NAME119)
29762
+ url: docsUrl(NAME123)
29373
29763
  },
29374
29764
  schema: [],
29375
29765
  messages: {
@@ -29426,7 +29816,7 @@ var prefer_shared_zod_enum_default = defineRule({
29426
29816
  });
29427
29817
 
29428
29818
  // src/rules/prefer-switch-for-repeated-equality.ts
29429
- var NAME120 = "prefer-switch-for-repeated-equality";
29819
+ var NAME124 = "prefer-switch-for-repeated-equality";
29430
29820
  function discriminantName(test) {
29431
29821
  if (test.type !== "BinaryExpression" || test.operator !== "===") return null;
29432
29822
  const leftIsCase = isCaseValue(test.left);
@@ -29503,7 +29893,7 @@ var prefer_switch_for_repeated_equality_default = defineRule({
29503
29893
  fixable: "code",
29504
29894
  docs: {
29505
29895
  description: "Prefer switch over long if/else-if chains that compare one value for strict equality.",
29506
- url: docsUrl(NAME120)
29896
+ url: docsUrl(NAME124)
29507
29897
  },
29508
29898
  schema: [],
29509
29899
  messages: {
@@ -29553,7 +29943,7 @@ var prefer_switch_for_repeated_equality_default = defineRule({
29553
29943
  });
29554
29944
 
29555
29945
  // src/rules/prefer-test-fixture-reuse.ts
29556
- var NAME121 = "prefer-test-fixture-reuse";
29946
+ var NAME125 = "prefer-test-fixture-reuse";
29557
29947
  var MAX_DEPTH2 = 8;
29558
29948
  var FRAMEWORKS = /* @__PURE__ */ new Set(["vitest", "@playwright/test"]);
29559
29949
  var TEST_MODIFIERS4 = /* @__PURE__ */ new Set(["only", "skip", "concurrent", "sequential"]);
@@ -29682,7 +30072,7 @@ var prefer_test_fixture_reuse_default = defineRule({
29682
30072
  type: "suggestion",
29683
30073
  docs: {
29684
30074
  description: "Reuse a requested test fixture instead of constructing another instance of its class.",
29685
- url: docsUrl(NAME121)
30075
+ url: docsUrl(NAME125)
29686
30076
  },
29687
30077
  schema: [],
29688
30078
  messages: { reuseFixture: "This class is already supplied by the requested `{{fixture}}` fixture; reuse it or request a typed factory for independent instances." }
@@ -29716,7 +30106,7 @@ var prefer_test_fixture_reuse_default = defineRule({
29716
30106
  });
29717
30107
 
29718
30108
  // src/rules/prefer-typed-reflection.ts
29719
- var NAME122 = "prefer-typed-reflection";
30109
+ var NAME126 = "prefer-typed-reflection";
29720
30110
  function knownType(native, type) {
29721
30111
  if (type.isUnionType()) return type.getTypes().every((part) => knownType(native, part));
29722
30112
  const flags = native.sync.TypeFlags;
@@ -29746,7 +30136,7 @@ var prefer_typed_reflection_default = defineRule({
29746
30136
  fixable: "code",
29747
30137
  docs: {
29748
30138
  description: "Prefer typed access when Reflect.get or Reflect.apply discards a known contract.",
29749
- url: docsUrl(NAME122)
30139
+ url: docsUrl(NAME126)
29750
30140
  },
29751
30141
  schema: [],
29752
30142
  messages: {
@@ -29912,7 +30302,7 @@ var prefer_typed_reflection_default = defineRule({
29912
30302
  });
29913
30303
 
29914
30304
  // src/rules/prefer-whole-object-assertion.ts
29915
- var NAME123 = "prefer-whole-object-assertion";
30305
+ var NAME127 = "prefer-whole-object-assertion";
29916
30306
  var MERGEABLE_MATCHERS = /* @__PURE__ */ new Set(["toBe", "toEqual", "toStrictEqual"]);
29917
30307
  var SYNTHETIC_LITERAL_MATCHERS = /* @__PURE__ */ new Map([
29918
30308
  ["toBeNull", "null"]
@@ -30002,7 +30392,7 @@ var prefer_whole_object_assertion_default = defineRule({
30002
30392
  type: "suggestion",
30003
30393
  docs: {
30004
30394
  description: "Collapse consecutive assertions on one object into a whole-object assertion so related mismatches are reported together.",
30005
- url: docsUrl(NAME123)
30395
+ url: docsUrl(NAME127)
30006
30396
  },
30007
30397
  messages: {
30008
30398
  combineAssertions: "Consider combining these {{count}} assertions on `{{receiver}}` with `toMatchObject` when structural matching preserves property presence and getter or proxy behavior.",
@@ -30149,7 +30539,7 @@ var prefer_whole_object_assertion_default = defineRule({
30149
30539
  });
30150
30540
 
30151
30541
  // src/rules/prefer-zod-enum-validator.ts
30152
- var NAME124 = "prefer-zod-enum-validator";
30542
+ var NAME128 = "prefer-zod-enum-validator";
30153
30543
  function isInput(node, name) {
30154
30544
  if (node == null) return false;
30155
30545
  const value = unwrapExpression(node);
@@ -30240,7 +30630,7 @@ var prefer_zod_enum_validator_default = defineRule({
30240
30630
  type: "suggestion",
30241
30631
  docs: {
30242
30632
  description: "Express closed string validators with a reusable Zod enum schema.",
30243
- url: docsUrl(NAME124)
30633
+ url: docsUrl(NAME128)
30244
30634
  },
30245
30635
  schema: [],
30246
30636
  messages: { useEnumSchema: "Replace this closed string validator with a named z.enum([\u2026]) schema and derive its type with z.infer. Use parse for parsing or safeParse for a boolean check; preserve intentional failure behavior." }
@@ -30268,7 +30658,7 @@ var prefer_zod_enum_validator_default = defineRule({
30268
30658
  });
30269
30659
 
30270
30660
  // src/rules/prefer-zod-infer.ts
30271
- var NAME125 = "prefer-zod-infer";
30661
+ var NAME129 = "prefer-zod-infer";
30272
30662
  function absent(value) {
30273
30663
  return value === void 0 || value === null;
30274
30664
  }
@@ -30644,7 +31034,7 @@ var prefer_zod_infer_default = defineRule({
30644
31034
  fixable: "code",
30645
31035
  docs: {
30646
31036
  description: "Derive a type from its Zod schema with `z.infer` instead of hand-writing a twin declaration beside it.",
30647
- url: docsUrl(NAME125)
31037
+ url: docsUrl(NAME129)
30648
31038
  },
30649
31039
  schema: [
30650
31040
  {
@@ -31094,7 +31484,7 @@ function returnsContract(authority, returned2) {
31094
31484
  }
31095
31485
 
31096
31486
  // src/rules/prefer-zod-parse-output-type.ts
31097
- var NAME126 = "prefer-zod-parse-output-type";
31487
+ var NAME130 = "prefer-zod-parse-output-type";
31098
31488
  function isLocalZodObjectSchema(node, namespaces) {
31099
31489
  let current = node;
31100
31490
  while (current.type === "CallExpression") {
@@ -31240,7 +31630,7 @@ var prefer_zod_parse_output_type_default = defineRule({
31240
31630
  fixable: "code",
31241
31631
  docs: {
31242
31632
  description: "Consider deriving validated return contracts from the Zod schema when the schema owns the contract.",
31243
- url: docsUrl(NAME126)
31633
+ url: docsUrl(NAME130)
31244
31634
  },
31245
31635
  schema: [],
31246
31636
  messages: {
@@ -31528,7 +31918,7 @@ var production_derived_test_cases_default = defineRule({
31528
31918
  });
31529
31919
 
31530
31920
  // src/rules/repeated-static-call-cases.ts
31531
- var NAME127 = "repeated-static-call-cases";
31921
+ var NAME131 = "repeated-static-call-cases";
31532
31922
  var TEST_MODULES2 = /* @__PURE__ */ new Set(["@jest/globals", "@playwright/test", "bun:test", "node:test", "vitest"]);
31533
31923
  var TEST_NAMES3 = /* @__PURE__ */ new Set(["it", "test"]);
31534
31924
  var TEST_MODIFIERS5 = /* @__PURE__ */ new Set(["concurrent", "fails", "only", "sequential", "skip"]);
@@ -31652,7 +32042,7 @@ var repeated_static_call_cases_default = defineRule({
31652
32042
  type: "suggestion",
31653
32043
  docs: {
31654
32044
  description: "Review three or more consecutive static-input call assertions as potential named cases.",
31655
- url: docsUrl(NAME127)
32045
+ url: docsUrl(NAME131)
31656
32046
  },
31657
32047
  schema: [],
31658
32048
  messages: { repeatedStaticCallCases: "These {{count}} consecutive assertions repeat a call with static inputs. If independent, use named parameterized cases or subtests; preserve ordered scenarios as one test." }
@@ -31795,7 +32185,7 @@ function isPrimitiveReturn(node, annotation) {
31795
32185
  }
31796
32186
 
31797
32187
  // src/rules/require-assert-never.ts
31798
- var NAME128 = "require-assert-never";
32188
+ var NAME132 = "require-assert-never";
31799
32189
  function isRuntimeHandlingStatement(statement) {
31800
32190
  if (statement.type === "EmptyStatement") return false;
31801
32191
  if (statement.type === "BreakStatement") return statement.label !== null;
@@ -31865,7 +32255,7 @@ var require_assert_never_default = defineRule({
31865
32255
  fixable: "code",
31866
32256
  docs: {
31867
32257
  description: "Require a never witness in empty switch defaults so discriminated unions remain exhaustive at compile time.",
31868
- url: docsUrl(NAME128)
32258
+ url: docsUrl(NAME132)
31869
32259
  },
31870
32260
  schema: [],
31871
32261
  messages: {
@@ -31909,7 +32299,7 @@ var require_assert_never_default = defineRule({
31909
32299
  });
31910
32300
 
31911
32301
  // src/rules/require-button-accessible-name.ts
31912
- var NAME129 = "require-button-accessible-name";
32302
+ var NAME133 = "require-button-accessible-name";
31913
32303
  var DELEGATING_PROPS = /* @__PURE__ */ new Set(["render", "asChild"]);
31914
32304
  function delegatesRendering(opening) {
31915
32305
  return opening.attributes.some(
@@ -31922,7 +32312,7 @@ var require_button_accessible_name_default = defineRule({
31922
32312
  type: "problem",
31923
32313
  docs: {
31924
32314
  description: "Require an accessible name on statically unnamed native or configured JSX buttons.",
31925
- url: docsUrl(NAME129)
32315
+ url: docsUrl(NAME133)
31926
32316
  },
31927
32317
  schema: [
31928
32318
  {
@@ -31976,7 +32366,7 @@ var require_button_accessible_name_default = defineRule({
31976
32366
  });
31977
32367
 
31978
32368
  // src/rules/require-camelcase-properties.ts
31979
- var NAME130 = "require-camelcase-properties";
32369
+ var NAME134 = "require-camelcase-properties";
31980
32370
  var SNAKE_CASE_RE2 = /^[a-z][a-z0-9]*(?:_[a-z0-9]+)+$/u;
31981
32371
  function blocksRename(member3, name) {
31982
32372
  if (member3.type === "TSIndexSignature" || "computed" in member3 && member3.computed) return true;
@@ -31990,7 +32380,7 @@ var require_camelcase_properties_default = defineRule({
31990
32380
  fixable: "code",
31991
32381
  docs: {
31992
32382
  description: "Require unquoted lower snake_case TypeScript properties and dot access to use camelCase.",
31993
- url: docsUrl(NAME130)
32383
+ url: docsUrl(NAME134)
31994
32384
  },
31995
32385
  schema: [],
31996
32386
  defaultOptions: [],
@@ -32054,7 +32444,7 @@ var require_camelcase_properties_default = defineRule({
32054
32444
  });
32055
32445
 
32056
32446
  // src/rules/require-constrained-schema-integer.ts
32057
- var NAME131 = "require-constrained-schema-integer";
32447
+ var NAME135 = "require-constrained-schema-integer";
32058
32448
  var FIELD_MINIMUMS = /* @__PURE__ */ new Map([["limit", 1], ["version", 0]]);
32059
32449
  var NUMBER_FACTORIES = /* @__PURE__ */ new Set(["number", "int", "int32", "uint32"]);
32060
32450
  var OBJECT_FACTORIES = /* @__PURE__ */ new Set(["object", "strictObject", "looseObject"]);
@@ -32096,7 +32486,7 @@ var require_constrained_schema_integer_default = defineRule({
32096
32486
  type: "suggestion",
32097
32487
  docs: {
32098
32488
  description: "Declare integer and lower-bound validation for numeric limit and version schema fields.",
32099
- url: docsUrl(NAME131)
32489
+ url: docsUrl(NAME135)
32100
32490
  },
32101
32491
  schema: [],
32102
32492
  messages: { constrainInteger: "Declare `{{field}}` as an integer with a lower bound of {{minimum}} or greater, or reuse its named domain schema." }
@@ -32575,14 +32965,14 @@ function closedNominalInheritanceFix(sourceCode2, file, call, consumer, implemen
32575
32965
  }
32576
32966
 
32577
32967
  // src/rules/require-explicit-contract-implementation.ts
32578
- var NAME132 = "require-explicit-contract-implementation";
32968
+ var NAME136 = "require-explicit-contract-implementation";
32579
32969
  var require_explicit_contract_implementation_default = defineRule({
32580
32970
  meta: {
32581
32971
  type: "problem",
32582
32972
  fixable: "code",
32583
32973
  docs: {
32584
32974
  description: "Require nominal inheritance when an injected abstract class is rejected by an instanceof guard.",
32585
- url: docsUrl(NAME132)
32975
+ url: docsUrl(NAME136)
32586
32976
  },
32587
32977
  schema: [],
32588
32978
  messages: {
@@ -33273,7 +33663,7 @@ function abstractContractOperations(node, functionAliases) {
33273
33663
  }
33274
33664
 
33275
33665
  // src/rules/require-explicit-service-contract.ts
33276
- var NAME133 = "require-explicit-service-contract";
33666
+ var NAME137 = "require-explicit-service-contract";
33277
33667
  var JAVASCRIPT_FILE_RE2 = /\.(?:js|jsx|mjs|cjs)$/iu;
33278
33668
  var BOUNDARY_SUFFIX = /(?:Service|ServiceImpl|Store|Repository|Provider|Executor|Enqueuer|Runner|Platform|Manager|ManagerImpl|Detector|Control|Refresher|Reader|Settlement|Retry|Stop|Catalog|DAO)$/u;
33279
33669
  var NON_SERVICE_SUFFIX = /(?:Router|Middleware|Builder)$/u;
@@ -33289,7 +33679,7 @@ var require_explicit_service_contract_default = defineRule({
33289
33679
  type: "problem",
33290
33680
  docs: {
33291
33681
  description: "Require explicit contracts for classes that invoke retained collaborators.",
33292
- url: docsUrl(NAME133)
33682
+ url: docsUrl(NAME137)
33293
33683
  },
33294
33684
  schema: [],
33295
33685
  fixable: "code",
@@ -33325,7 +33715,7 @@ var require_explicit_service_contract_default = defineRule({
33325
33715
  });
33326
33716
 
33327
33717
  // src/rules/require-fetch-timeout.ts
33328
- var NAME134 = "require-fetch-timeout";
33718
+ var NAME138 = "require-fetch-timeout";
33329
33719
  function emptySignal(expression, resolvesToGlobal) {
33330
33720
  const value = unwrapExpression(expression);
33331
33721
  if (value.type === "Literal" && value.value === null)
@@ -33387,7 +33777,7 @@ var require_fetch_timeout_default = defineRule({
33387
33777
  type: "problem",
33388
33778
  docs: {
33389
33779
  description: "Require an explicit abort signal on locally analyzable global fetch calls.",
33390
- url: docsUrl(NAME134)
33780
+ url: docsUrl(NAME138)
33391
33781
  },
33392
33782
  schema: [
33393
33783
  {
@@ -33478,8 +33868,90 @@ var require_fetch_timeout_default = defineRule({
33478
33868
  }
33479
33869
  });
33480
33870
 
33871
+ // src/rules/require-ime-safe-enter-handler.ts
33872
+ var NAME139 = "require-ime-safe-enter-handler";
33873
+ var require_ime_safe_enter_handler_default = defineRule({
33874
+ meta: {
33875
+ type: "problem",
33876
+ docs: {
33877
+ description: "Preserve IME composition before Enter submits or blurs a native text control.",
33878
+ url: docsUrl(NAME139)
33879
+ },
33880
+ schema: [],
33881
+ messages: {
33882
+ composition: "Enter also confirms IME composition. Guard composition before submitting the form or blurring this control; retain the required Safari fallback for your supported browsers."
33883
+ }
33884
+ },
33885
+ createOnce(context) {
33886
+ return {
33887
+ before() {
33888
+ if (isGeneratedFile({ filename: context.filename, cwd: context.cwd }, context.sourceCode.text))
33889
+ return false;
33890
+ },
33891
+ JSXOpeningElement(node) {
33892
+ if (!isEditableTextControl(node, context.sourceCode)) return;
33893
+ if (effectiveAttribute(node, ["onCompositionStart", "onCompositionEnd"]) !== void 0)
33894
+ return;
33895
+ const attribute = effectiveAttribute(node, ["onKeyDown"]);
33896
+ if (attribute?.type !== "JSXAttribute" || attribute.value?.type !== "JSXExpressionContainer")
33897
+ return;
33898
+ const callback = unwrapExpression(attribute.value.expression);
33899
+ if (callback.type !== "ArrowFunctionExpression" && callback.type !== "FunctionExpression")
33900
+ return;
33901
+ const [event] = callback.params;
33902
+ if (event?.type !== "Identifier" || callback.body === null) return;
33903
+ const binding3 = findVariable(context.sourceCode.getScope(callback.body), event.name);
33904
+ if (binding3 === null || binding3.references.some((reference) => reference.isWrite())) return;
33905
+ const matches = (identifier) => findVariable(context.sourceCode.getScope(identifier), identifier.name) === binding3;
33906
+ if (contains2(callback.body, (part) => isGuard(part, matches))) return;
33907
+ if (contains2(
33908
+ callback.body,
33909
+ (part) => part.type === "IfStatement" && positiveEnterGate(part.test, matches) && contains2(part.consequent, (action) => nativeAction(action, matches))
33910
+ )) {
33911
+ context.report({ node: attribute, messageId: "composition" });
33912
+ }
33913
+ }
33914
+ };
33915
+ }
33916
+ });
33917
+ function contains2(node, predicate) {
33918
+ if (["FunctionExpression", "ArrowFunctionExpression", "FunctionDeclaration"].includes(node.type))
33919
+ return false;
33920
+ return predicate(node) || forEachOwnAstChild(node, (child) => contains2(child, predicate));
33921
+ }
33922
+ function eventMember(node, event, property) {
33923
+ const value = unwrapExpression(node);
33924
+ return value.type === "MemberExpression" && getPropertyName(value) === property && value.object.type === "Identifier" && event(value.object);
33925
+ }
33926
+ function isGuard(node, event) {
33927
+ if (node.type !== "MemberExpression") return false;
33928
+ const property = getPropertyName(node);
33929
+ if (!["isComposing", "keyCode", "ctrlKey", "metaKey"].includes(property ?? "")) return false;
33930
+ return node.object.type === "Identifier" && event(node.object) || eventMember(node.object, event, "nativeEvent");
33931
+ }
33932
+ function positiveEnterGate(node, event) {
33933
+ const test = unwrapExpression(node);
33934
+ if (isEnter(test, event)) return true;
33935
+ if (test.type !== "LogicalExpression" || test.operator !== "&&") return false;
33936
+ const unshifted = (part) => part.type === "UnaryExpression" && part.operator === "!" && eventMember(part.argument, event, "shiftKey");
33937
+ return isEnter(test.left, event) && unshifted(test.right) || isEnter(test.right, event) && unshifted(test.left);
33938
+ }
33939
+ function isEnter(node, event) {
33940
+ if (node.type !== "BinaryExpression" || !["===", "=="].includes(node.operator)) return false;
33941
+ return eventMember(node.left, event, "key") && node.right.type === "Literal" && node.right.value === "Enter" || eventMember(node.right, event, "key") && node.left.type === "Literal" && node.left.value === "Enter";
33942
+ }
33943
+ function nativeAction(node, event) {
33944
+ if (node.type !== "CallExpression") return false;
33945
+ const callee = unwrapExpression(node.callee);
33946
+ if (callee.type !== "MemberExpression") return false;
33947
+ const property = getPropertyName(callee);
33948
+ if (property === "blur") return eventMember(callee.object, event, "currentTarget");
33949
+ const form = unwrapExpression(callee.object);
33950
+ return property === "requestSubmit" && form.type === "MemberExpression" && getPropertyName(form) === "form" && eventMember(form.object, event, "currentTarget");
33951
+ }
33952
+
33481
33953
  // src/rules/require-interface-for-exported-class.ts
33482
- var NAME135 = "require-interface-for-exported-class";
33954
+ var NAME140 = "require-interface-for-exported-class";
33483
33955
  var JAVASCRIPT_FILE_RE3 = /\.(?:js|jsx|mjs|cjs)$/iu;
33484
33956
  function isPublicInstanceMember2(member3) {
33485
33957
  return !member3.static && member3.accessibility !== "private" && member3.accessibility !== "protected" && member3.key.type !== "PrivateIdentifier";
@@ -33540,7 +34012,7 @@ var require_interface_for_exported_class_default = defineRule({
33540
34012
  type: "suggestion",
33541
34013
  docs: {
33542
34014
  description: "Require exported concrete classes with public behavior to declare a contract.",
33543
- url: docsUrl(NAME135)
34015
+ url: docsUrl(NAME140)
33544
34016
  },
33545
34017
  schema: [],
33546
34018
  fixable: "code",
@@ -33582,7 +34054,7 @@ var require_interface_for_exported_class_default = defineRule({
33582
34054
  });
33583
34055
 
33584
34056
  // src/rules/require-jwt-lifetime.ts
33585
- var NAME136 = "require-jwt-lifetime";
34057
+ var NAME141 = "require-jwt-lifetime";
33586
34058
  function isJoseValueImport(declaration) {
33587
34059
  return declaration.type === "ImportDeclaration" && declaration.importKind !== "type" && declaration.source.value === "jose";
33588
34060
  }
@@ -33591,7 +34063,7 @@ var require_jwt_lifetime_default = defineRule({
33591
34063
  type: "problem",
33592
34064
  docs: {
33593
34065
  description: "Require an expiration claim or a maximum token age when returning a verified JWT.",
33594
- url: docsUrl(NAME136)
34066
+ url: docsUrl(NAME141)
33595
34067
  },
33596
34068
  schema: [],
33597
34069
  messages: { lifetime: "Require the JWT exp claim or set maxTokenAge before returning this verification result." }
@@ -33650,7 +34122,7 @@ var require_jwt_lifetime_default = defineRule({
33650
34122
  });
33651
34123
 
33652
34124
  // src/rules/require-pascal-case-zod-schema-name.ts
33653
- var NAME137 = "require-pascal-case-zod-schema-name";
34125
+ var NAME142 = "require-pascal-case-zod-schema-name";
33654
34126
  var PASCAL_SCHEMA_NAME_RE = /^[A-Z][A-Za-z0-9]*Schema$/;
33655
34127
  var BENCHMARK_PATH_RE2 = /(^|[\\/])(?:benchmarks?|bench)[\\/]/;
33656
34128
  var NON_SCHEMA_TERMINALS2 = /* @__PURE__ */ new Set([
@@ -33821,7 +34293,7 @@ var require_pascal_case_zod_schema_name_default = defineRule({
33821
34293
  fixable: "code",
33822
34294
  docs: {
33823
34295
  description: "Require confirmed module-level Zod schema contracts to use PascalCase with a `Schema` suffix.",
33824
- url: docsUrl(NAME137)
34296
+ url: docsUrl(NAME142)
33825
34297
  },
33826
34298
  schema: [],
33827
34299
  defaultOptions: [],
@@ -33931,7 +34403,7 @@ var require_pascal_case_zod_schema_name_default = defineRule({
33931
34403
  });
33932
34404
 
33933
34405
  // src/rules/require-port-for-service.ts
33934
- var NAME138 = "require-port-for-service";
34406
+ var NAME143 = "require-port-for-service";
33935
34407
  var HTTP_TRANSPORT_TYPE_RE = /^(?:KyInstance|AxiosInstance|Session)$/;
33936
34408
  var TRANSPORT_WRAPPER_NAME_RE = /(?:Client$|^Http[A-Z])/;
33937
34409
  var ERROR_VALUE_NAME_RE = /Error$/;
@@ -34065,7 +34537,7 @@ var require_port_for_service_default = defineRule({
34065
34537
  type: "suggestion",
34066
34538
  docs: {
34067
34539
  description: "Advise when an exported service with injected collaborators has public methods not covered by its declared ports.",
34068
- url: docsUrl(NAME138)
34540
+ url: docsUrl(NAME143)
34069
34541
  },
34070
34542
  schema: [],
34071
34543
  fixable: "code",
@@ -34105,7 +34577,7 @@ var require_port_for_service_default = defineRule({
34105
34577
  });
34106
34578
 
34107
34579
  // src/rules/require-sql-access-class.ts
34108
- var NAME139 = "require-sql-access-class";
34580
+ var NAME144 = "require-sql-access-class";
34109
34581
  var DIRECT_EXECUTION_METHODS = /* @__PURE__ */ new Set([
34110
34582
  "all",
34111
34583
  "batch",
@@ -34303,7 +34775,7 @@ var require_sql_access_class_default = defineRule({
34303
34775
  type: "suggestion",
34304
34776
  docs: {
34305
34777
  description: "Keep SQL reads and writes inside a class that receives its database dependency.",
34306
- url: docsUrl(NAME139)
34778
+ url: docsUrl(NAME144)
34307
34779
  },
34308
34780
  schema: [],
34309
34781
  messages: {
@@ -34375,7 +34847,7 @@ function staticMatcherFix(sourceCode2, property) {
34375
34847
  }
34376
34848
 
34377
34849
  // src/rules/require-static-next-matcher.ts
34378
- var NAME140 = "require-static-next-matcher";
34850
+ var NAME145 = "require-static-next-matcher";
34379
34851
  var NEXT_ENTRY_FILE = /(?:^|[/\\])(?:middleware|proxy)\.[cm]?[jt]sx?$/u;
34380
34852
  function isStaticValue(node) {
34381
34853
  const value = unwrapExpression(node);
@@ -34407,7 +34879,7 @@ var require_static_next_matcher_default = defineRule({
34407
34879
  fixable: "code",
34408
34880
  docs: {
34409
34881
  description: "Require Next.js middleware and proxy matcher configuration to contain only build-time literals.",
34410
- url: docsUrl(NAME140)
34882
+ url: docsUrl(NAME145)
34411
34883
  },
34412
34884
  schema: [],
34413
34885
  messages: {
@@ -34451,7 +34923,7 @@ var require_static_next_matcher_default = defineRule({
34451
34923
  });
34452
34924
 
34453
34925
  // src/rules/require-svg-accessible-name.ts
34454
- var NAME141 = "require-svg-accessible-name";
34926
+ var NAME146 = "require-svg-accessible-name";
34455
34927
  var DECORATIVE_ROLES = /* @__PURE__ */ new Set(["none", "presentation"]);
34456
34928
  var NAME_ATTRIBUTES = ["aria-label", "aria-labelledby"];
34457
34929
  var NO_ICON_MODULES = [];
@@ -34460,7 +34932,7 @@ var require_svg_accessible_name_default = defineRule({
34460
34932
  type: "problem",
34461
34933
  docs: {
34462
34934
  description: "Require a name or explicit decorative semantics on inline SVG elements.",
34463
- url: docsUrl(NAME141)
34935
+ url: docsUrl(NAME146)
34464
34936
  },
34465
34937
  schema: [],
34466
34938
  messages: {
@@ -34492,7 +34964,7 @@ var require_svg_accessible_name_default = defineRule({
34492
34964
  });
34493
34965
 
34494
34966
  // src/rules/require-use-form-default-values.ts
34495
- var NAME142 = "require-use-form-default-values";
34967
+ var NAME147 = "require-use-form-default-values";
34496
34968
  var UNSAFE_FORM_MEMBERS = /* @__PURE__ */ new Set(["__defineGetter__", "__defineSetter__", "__proto__", "valueOf"]);
34497
34969
  function staticPropertyName2(property) {
34498
34970
  return property.computed ? null : getPropertyName(property);
@@ -34535,7 +35007,7 @@ var require_use_form_default_values_default = defineRule({
34535
35007
  type: "problem",
34536
35008
  docs: {
34537
35009
  description: "Require explicit form-level initialization or a field default for directly bound Controller fields.",
34538
- url: docsUrl(NAME142)
35010
+ url: docsUrl(NAME147)
34539
35011
  },
34540
35012
  schema: [],
34541
35013
  messages: { requireUseFormDefaultValues: "Add non-undefined defaultValues/values to the associated useForm call or non-undefined defaultValue to this field." }
@@ -34674,7 +35146,7 @@ var require_use_form_default_values_default = defineRule({
34674
35146
  });
34675
35147
 
34676
35148
  // src/rules/require-use-server-in-actions-file.ts
34677
- var NAME143 = "require-use-server-in-actions-file";
35149
+ var NAME148 = "require-use-server-in-actions-file";
34678
35150
  var ACTION_MODULE_RE = /(?:^|\/)app\/.*\/(?:actions|[^/]+-actions)\.[cm]?[jt]s$/u;
34679
35151
  function isUseServerDirective2(statement) {
34680
35152
  return statement.type === "ExpressionStatement" && statement.directive === "use server";
@@ -34695,7 +35167,7 @@ var require_use_server_in_actions_file_default = defineRule({
34695
35167
  type: "problem",
34696
35168
  docs: {
34697
35169
  description: "route action module missing the use server directive",
34698
- url: docsUrl(NAME143)
35170
+ url: docsUrl(NAME148)
34699
35171
  },
34700
35172
  schema: [],
34701
35173
  messages: {
@@ -34721,7 +35193,7 @@ var require_use_server_in_actions_file_default = defineRule({
34721
35193
  });
34722
35194
 
34723
35195
  // src/rules/require-zod-form-validation.ts
34724
- var NAME144 = "require-zod-form-validation";
35196
+ var NAME149 = "require-zod-form-validation";
34725
35197
  var ZOD_PARSE_METHODS = /* @__PURE__ */ new Set([
34726
35198
  "parse",
34727
35199
  "safeParse",
@@ -34780,7 +35252,7 @@ var require_zod_form_validation_default = defineRule({
34780
35252
  type: "problem",
34781
35253
  docs: {
34782
35254
  description: "Require Zod validation (`Schema.parse(...)` / `Schema.safeParse(...)`) when reading values out of a `FormData` object.",
34783
- url: docsUrl(NAME144)
35255
+ url: docsUrl(NAME149)
34784
35256
  },
34785
35257
  schema: [],
34786
35258
  messages: {
@@ -35068,7 +35540,7 @@ function declaresFramework(metadata, name) {
35068
35540
  }
35069
35541
 
35070
35542
  // src/rules/sole-export-matches-filename.ts
35071
- var NAME145 = "sole-export-matches-filename";
35543
+ var NAME150 = "sole-export-matches-filename";
35072
35544
  var EXCLUDED_STEMS = /* @__PURE__ */ new Set(["global", "index", "types"]);
35073
35545
  function stem3(filename) {
35074
35546
  const base = filename.replaceAll("\\", "/").split("/").at(-1) ?? "";
@@ -35082,7 +35554,7 @@ var sole_export_matches_filename_default = defineRule({
35082
35554
  type: "suggestion",
35083
35555
  docs: {
35084
35556
  description: "Make a module filename reflect its sole named public runtime export.",
35085
- url: docsUrl(NAME145)
35557
+ url: docsUrl(NAME150)
35086
35558
  },
35087
35559
  schema: [],
35088
35560
  messages: {
@@ -35825,7 +36297,7 @@ var stepdown_default = defineRule({
35825
36297
  });
35826
36298
 
35827
36299
  // src/rules/store-insert-requires-on-conflict.ts
35828
- var NAME146 = "store-insert-requires-on-conflict";
36300
+ var NAME151 = "store-insert-requires-on-conflict";
35829
36301
  var INSERT_WRITE = /\bINSERT\s+(?:OR\s+\w+\s+)?INTO\s+[\w."'`?$:@-]+\s*(?:\([^)]*\)\s*)?(?:VALUES|SELECT|DEFAULT\s+VALUES)\b/i;
35830
36302
  var CONFLICT_HANDLED = /\bON\s+CONFLICT\b|\bON\s+DUPLICATE\s+KEY\b|\bINSERT\s+OR\s+(?:IGNORE|REPLACE)\b|\bINSERT\b[\s\S]*?\bSELECT\b[\s\S]*?\bWHERE\s+NOT\s+EXISTS\b/i;
35831
36303
  var REPLAY_CONTRACT_NAME = /(?:enqueue|ensure|migrate|recordOnce|schedule|seed|upsert|getOrCreate|createIfAbsent|insertIfAbsent)/i;
@@ -35854,7 +36326,7 @@ var store_insert_requires_on_conflict_default = defineRule({
35854
36326
  type: "problem",
35855
36327
  docs: {
35856
36328
  description: "Review conflict handling for embedded inserts in replay-named callables.",
35857
- url: docsUrl(NAME146)
36329
+ url: docsUrl(NAME151)
35858
36330
  },
35859
36331
  schema: [],
35860
36332
  messages: {
@@ -35879,7 +36351,7 @@ var store_insert_requires_on_conflict_default = defineRule({
35879
36351
  });
35880
36352
 
35881
36353
  // src/rules/test-loops-over-literal-cases.ts
35882
- var NAME147 = "test-loops-over-literal-cases";
36354
+ var NAME152 = "test-loops-over-literal-cases";
35883
36355
  var TEST_CALLERS3 = /* @__PURE__ */ new Set(["it", "test"]);
35884
36356
  var TEST_MODIFIERS6 = /* @__PURE__ */ new Set(["concurrent", "fails", "only", "sequential", "skip"]);
35885
36357
  var ASSERTION_ROOTS = /* @__PURE__ */ new Set([
@@ -35975,7 +36447,7 @@ var test_loops_over_literal_cases_default = defineRule({
35975
36447
  type: "suggestion",
35976
36448
  docs: {
35977
36449
  description: "Disallow assertions over an inline literal case loop in a test; parameterization reports and names every case independently.",
35978
- url: docsUrl(NAME147)
36450
+ url: docsUrl(NAME152)
35979
36451
  },
35980
36452
  schema: [],
35981
36453
  messages: {
@@ -36039,7 +36511,7 @@ var test_loops_over_literal_cases_default = defineRule({
36039
36511
  });
36040
36512
 
36041
36513
  // src/rules/test-phase-label-comment.ts
36042
- var NAME148 = "test-phase-label-comment";
36514
+ var NAME153 = "test-phase-label-comment";
36043
36515
  var PHASE_WORD = String.raw`arrange|act|assert(?:ion)?s?|given|when|then|exercise|execute|verif(?:y|ication)|cleanup|prepare|sanity(?:\s+check)?`;
36044
36516
  var PHASE_RE = new RegExp(
36045
36517
  String.raw`^[-=~*_#.\s]{0,40}(?:${PHASE_WORD})(?:\s*(?:[/&+,|]|->|and)\s*(?:${PHASE_WORD}))*[-=~*_#.\s:;!–—]{0,40}$`,
@@ -36067,7 +36539,7 @@ var test_phase_label_comment_default = defineRule({
36067
36539
  fixable: "code",
36068
36540
  docs: {
36069
36541
  description: "Tests must not use bare Arrange, Act, Assert, Given, When, or Then phase comments.",
36070
- url: docsUrl(NAME148)
36542
+ url: docsUrl(NAME153)
36071
36543
  },
36072
36544
  schema: [],
36073
36545
  messages: { removeLabel: "Bare test phase label \u2014 delete it and let the test names and helpers carry the structure." }
@@ -36120,6 +36592,7 @@ var RULES = {
36120
36592
  "named-child-schema-type": named_child_schema_type_default,
36121
36593
  "no-bare-return-from-test-catch": no_bare_return_from_test_catch_default,
36122
36594
  "no-bespoke-api-case-conversion": no_bespoke_api_case_conversion_default,
36595
+ "no-blocked-input-paste": no_blocked_input_paste_default,
36123
36596
  "no-boolean-selector-parameter": no_boolean_selector_parameter_default,
36124
36597
  "no-broad-return-type": no_broad_return_type_default,
36125
36598
  "no-client-side-data-fetching": no_client_side_data_fetching_default,
@@ -36153,6 +36626,7 @@ var RULES = {
36153
36626
  "no-in-operator-on-built-in-collections": no_in_operator_on_built_in_collections_default,
36154
36627
  "no-insecure-random-id": no_insecure_random_id_default,
36155
36628
  "no-invalid-typed-mutation": no_invalid_typed_mutation_default,
36629
+ "no-invalid-web-resource-hints": no_invalid_web_resource_hints_default,
36156
36630
  "no-invalid-zod-custom-parse": no_invalid_zod_custom_parse_default,
36157
36631
  "no-json-stringify-error": no_json_stringify_error_default,
36158
36632
  "no-json-stringify-object-equality": no_json_stringify_object_equality_default,
@@ -36160,6 +36634,7 @@ var RULES = {
36160
36634
  "no-log-only-catch": no_log_only_catch_default,
36161
36635
  "no-logical-or-fallback": no_logical_or_fallback_default,
36162
36636
  "no-long-comment": no_long_comment_default,
36637
+ "no-message-origin-string-matching": no_message_origin_string_matching_default,
36163
36638
  "no-mutating-container-transform": no_mutating_container_transform_default,
36164
36639
  "no-mutating-input-with-result": no_mutating_input_with_result_default,
36165
36640
  "no-negative-only-http-status-assertion": no_negative_only_http_status_assertion_default,
@@ -36167,6 +36642,7 @@ var RULES = {
36167
36642
  "no-offset-pagination": no_offset_pagination_default,
36168
36643
  "no-oxlint-directive": no_oxlint_directive_default,
36169
36644
  "no-partial-type-predicate": no_partial_type_predicate_default,
36645
+ "no-password-get-form": no_password_get_form_default,
36170
36646
  "no-positional-tuple-return": no_positional_tuple_return_default,
36171
36647
  "no-production-browser-source-maps": no_production_browser_source_maps_default,
36172
36648
  "no-raw-env": no_raw_env_default,
@@ -36254,6 +36730,7 @@ var RULES = {
36254
36730
  "require-explicit-contract-implementation": require_explicit_contract_implementation_default,
36255
36731
  "require-explicit-service-contract": require_explicit_service_contract_default,
36256
36732
  "require-fetch-timeout": require_fetch_timeout_default,
36733
+ "require-ime-safe-enter-handler": require_ime_safe_enter_handler_default,
36257
36734
  "require-interface-for-exported-class": require_interface_for_exported_class_default,
36258
36735
  "require-jwt-lifetime": require_jwt_lifetime_default,
36259
36736
  "require-pascal-case-zod-schema-name": require_pascal_case_zod_schema_name_default,
@@ -36266,7 +36743,7 @@ var RULES = {
36266
36743
  "require-zod-form-validation": require_zod_form_validation_default,
36267
36744
  "sole-export-matches-filename": sole_export_matches_filename_default,
36268
36745
  "source-coupled-test": source_coupled_test_default,
36269
- "stepdown": stepdown_default,
36746
+ stepdown: stepdown_default,
36270
36747
  "store-insert-requires-on-conflict": store_insert_requires_on_conflict_default,
36271
36748
  "test-loops-over-literal-cases": test_loops_over_literal_cases_default,
36272
36749
  "test-phase-label-comment": test_phase_label_comment_default