@isentinel/eslint-config 6.2.0 → 6.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -334,8 +334,6 @@ function parseState(raw) {
334
334
  const envelope = parsed;
335
335
  return envelope.version === 2 ? envelope.data : void 0;
336
336
  }
337
- //#endregion
338
- //#region src/hybrid-status.ts
339
337
  /**
340
338
  * Absolute path to the hybrid-status file for a project root.
341
339
  *
@@ -358,12 +356,12 @@ function readHybridStatus(cwd) {
358
356
  }
359
357
  /**
360
358
  * Passively record whether the resolved ESLint config runs in hybrid mode.
361
- * Called from the factory on every config evaluation, so an unchanged status is
362
- * touched rather than rewritten: the file must not churn as editors and both
363
- * lint passes re-evaluate the config, yet its mtime must stay ahead of the
364
- * config's or the CLI re-runs its ~3s probe every lint. Every failure is
365
- * swallowed — config evaluation must never throw for this, and the CLI treats a
366
- * missing or stale file as "unknown" and re-probes.
359
+ * Called from the factory on every config evaluation in a lint child, so an
360
+ * unchanged status is touched rather than rewritten: the file must not churn
361
+ * as both lint passes re-evaluate the config, yet its mtime must stay ahead of
362
+ * the config's or the CLI re-runs its ~3s probe every lint. Every failure is
363
+ * swallowed — config evaluation must never throw for this, and the CLI treats
364
+ * a missing or stale file as "unknown" and re-probes.
367
365
  *
368
366
  * Skipped entirely when `node_modules` is absent (nothing installed, so no
369
367
  * cache home and no CLI to read it).
@@ -388,11 +386,13 @@ function writeHybridStatus(cwd, oxlint) {
388
386
  }
389
387
  /**
390
388
  * Convenience wrapper defaulting the project root to `process.cwd()`, used by
391
- * the factory so the passive write stays a one-liner at the call site.
389
+ * the factory so the passive write stays a one-liner at the call site. Writes
390
+ * only inside an `isentinel-lint` ESLint child (see {@link HYBRID_STATUS_ENV}).
392
391
  *
393
392
  * @param oxlint - Whether the config enabled hybrid mode.
394
393
  */
395
394
  function writeHybridStatusForCwd(oxlint) {
395
+ if (process.env["ISENTINEL_WRITE_HYBRID_STATUS"] !== "1") return;
396
396
  writeHybridStatus(process.cwd(), oxlint);
397
397
  }
398
398
  //#endregion
@@ -739,6 +739,17 @@ function resolveEditorConfigOptions(cwd) {
739
739
  return editorConfigToPrettier(properties);
740
740
  }
741
741
  /**
742
+ * Read a numeric `.editorconfig` value. An absent or empty value sets nothing.
743
+ *
744
+ * @param value - The raw property value.
745
+ * @returns The finite number, or `undefined`.
746
+ */
747
+ function editorConfigNumber(value) {
748
+ if (value === void 0 || value === "") return;
749
+ const parsed = Number(value);
750
+ return Number.isFinite(parsed) ? parsed : void 0;
751
+ }
752
+ /**
742
753
  * Map one `.editorconfig` section to oxfmt options, as the rule's config
743
754
  * loader does.
744
755
  *
@@ -753,17 +764,43 @@ function editorConfigToOxfmt(properties) {
753
764
  if (indentStyle === "tab" || indentStyle === "space") options["useTabs"] = indentStyle === "tab";
754
765
  const quoteType = properties["quote_type"];
755
766
  if (quoteType === "single" || quoteType === "double") options["singleQuote"] = quoteType === "single";
756
- const indentSize = Number(properties["indent_size"]);
757
- const tabWidth = Number(properties["tab_width"]);
758
- if (options["useTabs"] === false && properties["indent_size"] && Number.isFinite(indentSize)) options["tabWidth"] = indentSize;
759
- else if (properties["tab_width"] && Number.isFinite(tabWidth)) options["tabWidth"] = tabWidth;
760
- const printWidth = Number(properties["max_line_length"]);
761
- if (properties["max_line_length"] && Number.isFinite(printWidth)) options["printWidth"] = printWidth;
767
+ const indentSize = editorConfigNumber(properties["indent_size"]);
768
+ const tabWidth = editorConfigNumber(properties["tab_width"]);
769
+ if (indentSize !== void 0 && options["useTabs"] === false) options["tabWidth"] = indentSize;
770
+ else if (tabWidth !== void 0) options["tabWidth"] = tabWidth;
771
+ const printWidth = editorConfigNumber(properties["max_line_length"]);
772
+ if (printWidth !== void 0) options["printWidth"] = printWidth;
762
773
  const finalNewline = properties["insert_final_newline"];
763
774
  if (finalNewline === "true" || finalNewline === "false") options["insertFinalNewline"] = finalNewline === "true";
764
775
  return options;
765
776
  }
766
777
  //#endregion
778
+ //#region src/guards.ts
779
+ /**
780
+ * Internal runtime type guards. Prefer these over `as` assertions so values
781
+ * crossing untyped boundaries (`JSON.parse`, dynamic `import`, plugin objects)
782
+ * are validated at runtime rather than asserted away.
783
+ */
784
+ /**
785
+ * Whether a value is a non-null, non-array object usable as a string-keyed
786
+ * record. Narrows `unknown` without an assertion.
787
+ *
788
+ * @param value - The value to test.
789
+ * @returns Whether the value is a plain object.
790
+ */
791
+ function isRecord(value) {
792
+ return typeof value === "object" && value !== null && !Array.isArray(value);
793
+ }
794
+ /**
795
+ * Whether a value is an array whose every element is a string.
796
+ *
797
+ * @param value - The value to test.
798
+ * @returns Whether the value is a `string` array.
799
+ */
800
+ function isStringArray(value) {
801
+ return Array.isArray(value) && value.every((item) => typeof item === "string");
802
+ }
803
+ //#endregion
767
804
  //#region src/rules/oxfmt.ts
768
805
  const UNSUPPORTED_PRETTIER_KEYS = /* @__PURE__ */ new Set([
769
806
  "experimentalOperatorPosition",
@@ -830,12 +867,12 @@ function migratePrettierOptions(prettierOptions) {
830
867
  function migratePrettierOverrides(overrides) {
831
868
  if (!Array.isArray(overrides)) return [];
832
869
  return overrides.flatMap((override) => {
833
- if (typeof override !== "object" || override === null) return [];
870
+ if (!isRecord(override)) return [];
834
871
  const { excludeFiles, files, options } = override;
835
872
  return [{
836
873
  ...excludeFiles === void 0 ? {} : { excludeFiles: stringsOf(excludeFiles) },
837
874
  files: stringsOf(files),
838
- options: typeof options === "object" && options !== null ? migratePrettierOptions(options) : {}
875
+ options: isRecord(options) ? migratePrettierOptions(options) : {}
839
876
  }];
840
877
  });
841
878
  }
@@ -860,11 +897,16 @@ function buildOxfmtOptions({ oxfmtConfigOptions = {}, oxfmtOptions, prettierOpti
860
897
  * ESLint config and the standalone oxfmt config so both format Markdown the
861
898
  * same way.
862
899
  *
900
+ * Oxfmt would format code blocks with these options too, at the prose width.
901
+ * It leaves them alone instead, and ESLint formats each block with the options
902
+ * of its own language (see `isentinel/oxfmt/markdown-code/*`).
903
+ *
863
904
  * @param jsdocPrintWidth - Width for Markdown prose; 80 when unset.
864
905
  * @returns Options applied on top of the base for Markdown files.
865
906
  */
866
907
  function markdownOxfmtOptions(jsdocPrintWidth) {
867
908
  return {
909
+ embeddedLanguageFormatting: "off",
868
910
  printWidth: Number(jsdocPrintWidth) || 80,
869
911
  proseWrap: "always",
870
912
  tabWidth: 2
@@ -885,23 +927,6 @@ const YAML_OXFMT_OPTIONS = {
885
927
  useTabs: false
886
928
  };
887
929
  //#endregion
888
- //#region src/guards.ts
889
- /**
890
- * Internal runtime type guards. Prefer these over `as` assertions so values
891
- * crossing untyped boundaries (`JSON.parse`, dynamic `import`, plugin objects)
892
- * are validated at runtime rather than asserted away.
893
- */
894
- /**
895
- * Whether a value is a non-null, non-array object usable as a string-keyed
896
- * record. Narrows `unknown` without an assertion.
897
- *
898
- * @param value - The value to test.
899
- * @returns Whether the value is a plain object.
900
- */
901
- function isRecord(value) {
902
- return typeof value === "object" && value !== null && !Array.isArray(value);
903
- }
904
- //#endregion
905
930
  //#region src/rules/react.ts
906
931
  const DOM_IMPORT_MESSAGE = "Import from react-testing-library-lua instead; it re-exports the DOM utilities, and eslint-plugin-testing-library only detects one module per file.";
907
932
  /**
@@ -958,6 +983,7 @@ function mergeRestrictedDomImportRule(rule, domPackage) {
958
983
  function reactRules({ domPackage, filenameCase = "kebabCase", reactCompiler = true, stylistic = true, testing = false } = {}) {
959
984
  const restrictedDomImport = testing ? restrictedDomImportRule(domPackage) : void 0;
960
985
  return {
986
+ "flawless/no-unnecessary-prop-alias": ["error", { reportConflicts: true }],
961
987
  "flawless/no-unnecessary-use-callback": "error",
962
988
  "flawless/no-unnecessary-use-memo": "error",
963
989
  "flawless/purity": "error",
@@ -1507,8 +1533,6 @@ const SCRIPT_EXTENSIONS = [
1507
1533
  "ts",
1508
1534
  "tsx"
1509
1535
  ];
1510
- /** The extensions of the Markdown files ESLint lints code blocks in. */
1511
- const MARKDOWN_EXTENSIONS = ["md"];
1512
1536
  const JSON_EXTENSIONS = [
1513
1537
  "json",
1514
1538
  "json5",
@@ -1553,21 +1577,13 @@ function findOxfmtConfig(cwd = process.cwd()) {
1553
1577
  }
1554
1578
  }
1555
1579
  /**
1556
- * The overrides that set `printWidth` or `tabWidth` for Markdown files.
1580
+ * The string globs of an override's `files` or `excludeFiles`.
1557
1581
  *
1558
- * @param overrides - The config's `overrides`.
1559
- * @returns Each such override's scope and widths, in order.
1582
+ * @param value - One glob or a list of them, of unknown shape.
1583
+ * @returns The string globs.
1560
1584
  */
1561
- function markdownOverridesOf(overrides) {
1562
- if (!Array.isArray(overrides)) return [];
1563
- return overrides.flatMap((override) => {
1564
- if (!isRecord(override) || !overrideMatches(override, MARKDOWN_EXTENSIONS)) return [];
1565
- const widths = widthsOf(override["options"]);
1566
- return Object.keys(widths).length > 0 ? [{
1567
- ...scopeOf(override),
1568
- widths
1569
- }] : [];
1570
- });
1585
+ function globsOf(value) {
1586
+ return [value].flat().filter((glob) => typeof glob === "string");
1571
1587
  }
1572
1588
  /**
1573
1589
  * Where an override applies: its `files`, minus its `excludeFiles` and any
@@ -1577,12 +1593,9 @@ function markdownOverridesOf(overrides) {
1577
1593
  * @returns Its scope.
1578
1594
  */
1579
1595
  function scopeOf(override) {
1580
- const strings = (value) => {
1581
- return [value].flat().filter((glob) => typeof glob === "string");
1582
- };
1583
- const globs = strings(override["files"]);
1596
+ const globs = globsOf(override["files"]);
1584
1597
  return {
1585
- excludeFiles: [...strings(override["excludeFiles"]), ...globs.filter((glob) => glob.startsWith("!")).map((glob) => glob.slice(1))],
1598
+ excludeFiles: [...globsOf(override["excludeFiles"]), ...globs.filter((glob) => glob.startsWith("!")).map((glob) => glob.slice(1))],
1586
1599
  files: globs.filter((glob) => !glob.startsWith("!"))
1587
1600
  };
1588
1601
  }
@@ -1609,7 +1622,8 @@ function jsonLayoutOverrides(overrides) {
1609
1622
  }
1610
1623
  /**
1611
1624
  * Warn, at most once per process, about factory options that do not reach
1612
- * standalone oxfmt: it formats with `oxfmt.config.ts` alone.
1625
+ * standalone oxfmt: it formats with `oxfmt.config.ts` alone. They still choose
1626
+ * which Markdown code blocks ESLint formats.
1613
1627
  *
1614
1628
  * @param options - The factory options.
1615
1629
  * @param options.componentExts - Oxfmt formats only the extensions
@@ -1630,7 +1644,7 @@ function warnStandaloneOptions({ componentExts, formatters, gitignore, ignores }
1630
1644
  ].filter((name) => name !== void 0);
1631
1645
  if (names.length > 0) {
1632
1646
  state[WARNED_STANDALONE] = true;
1633
- console.warn(`[@isentinel/eslint-config] With formatter: "standalone", oxfmt formats with oxfmt.config.ts alone, so these options do not change formatting: ${names.join(", ")}. Set the equivalent in isentinelOxfmt() (formatters, componentExts, ignorePatterns, format options).`);
1647
+ console.warn(`[@isentinel/eslint-config] With formatter: "standalone", oxfmt formats with oxfmt.config.ts alone, so these options do not change what oxfmt formats: ${names.join(", ")}. They change only which Markdown code blocks ESLint formats. Set the equivalent in isentinelOxfmt() (formatters, componentExts, ignorePatterns, format options).`);
1634
1648
  }
1635
1649
  }
1636
1650
  /**
@@ -1658,8 +1672,7 @@ function warnScriptWidthOverrides(overrides, source) {
1658
1672
  * {@link findOxfmtConfig}): `.oxfmtrc.json`, `.oxfmtrc.jsonc`,
1659
1673
  * `oxfmt.config.ts` or `oxfmt.config.mts`.
1660
1674
  *
1661
- * @returns The format options and Markdown widths; empty options if none
1662
- * found.
1675
+ * @returns The format options and overrides; empty options if none found.
1663
1676
  * @rejects When the config is ambiguous or cannot be loaded.
1664
1677
  */
1665
1678
  async function resolveOxfmtConfig() {
@@ -1748,26 +1761,26 @@ function mirrorsSection(override, sections) {
1748
1761
  });
1749
1762
  }
1750
1763
  /**
1751
- * Turn a loaded oxfmt config into `oxfmt/oxfmt` rule options and the Markdown
1752
- * widths. The rule takes format options only, so `$schema`, `ignorePatterns`
1753
- * and `overrides` are dropped from the options.
1764
+ * Turn a loaded oxfmt config into `oxfmt/oxfmt` rule options, its ignore
1765
+ * patterns and its overrides. The rule takes format options only, so
1766
+ * `$schema`, `ignorePatterns` and `overrides` are dropped from the options.
1754
1767
  *
1755
1768
  * @param config - The loaded config.
1756
1769
  * @param config.$schema - Dropped.
1757
- * @param config.ignorePatterns - Dropped; oxfmt applies them itself.
1758
- * @param config.overrides - Dropped, after the width check; read for the
1759
- * Markdown widths.
1770
+ * @param config.ignorePatterns - Dropped from the options; oxfmt applies them
1771
+ * itself, except in Markdown code blocks.
1772
+ * @param config.overrides - Dropped from the options, after the width check.
1760
1773
  * @param configPath - The config file, for the warning.
1761
- * @returns The format options and Markdown widths.
1774
+ * @returns The format options, ignore patterns and overrides.
1762
1775
  */
1763
- function toResolvedConfig({ $schema: _schema, ignorePatterns: _ignorePatterns, overrides, ...options }, configPath) {
1776
+ function toResolvedConfig({ $schema: _schema, ignorePatterns, overrides, ...options }, configPath) {
1764
1777
  const sections = editorConfigOverrides(path.dirname(configPath));
1765
1778
  const list = Array.isArray(overrides) ? overrides : [];
1766
1779
  const copied = list.filter((override) => mirrorsSection(override, sections));
1767
1780
  warnScriptWidthOverrides(copied, ".editorconfig");
1768
1781
  warnScriptWidthOverrides(list.filter((override) => !copied.includes(override)), path.basename(configPath));
1769
1782
  return {
1770
- markdownOverrides: markdownOverridesOf(overrides),
1783
+ ignorePatterns: isStringArray(ignorePatterns) ? ignorePatterns : [],
1771
1784
  options,
1772
1785
  overrides: Array.isArray(overrides) ? overrides : []
1773
1786
  };
@@ -1787,20 +1800,6 @@ function rcConfig(configPath, content) {
1787
1800
  return toResolvedConfig(parsed, configPath);
1788
1801
  }
1789
1802
  /**
1790
- * Pick `printWidth` and `tabWidth` out of a set of format options.
1791
- *
1792
- * @param options - Format options, of unknown shape.
1793
- * @returns The widths it sets.
1794
- */
1795
- function widthsOf(options) {
1796
- if (!isRecord(options)) return {};
1797
- const { printWidth, tabWidth } = options;
1798
- return {
1799
- ...typeof printWidth === "number" ? { printWidth } : {},
1800
- ...typeof tabWidth === "number" ? { tabWidth } : {}
1801
- };
1802
- }
1803
- /**
1804
1803
  * Resolves the lowest Node major version a semver range can match.
1805
1804
  *
1806
1805
  * @param range - A semver range such as `>=24.12.0` or `^24 || ^26`.
@@ -1961,7 +1960,7 @@ function lazyPlugin(specifier, transform) {
1961
1960
  return proxy;
1962
1961
  }
1963
1962
  /**
1964
- * Load a plugin synchronously. `engines.node` is `>=24.12.0`, where
1963
+ * Load a plugin synchronously. `engines.node` is `>=24.15.0`, where
1965
1964
  * `require(esm)` is stable, so the ESM-only plugins need no async fallback.
1966
1965
  *
1967
1966
  * @param specifier - The plugin package to load.
@@ -1979,15 +1978,7 @@ function hydrate(specifier, transform) {
1979
1978
  //#endregion
1980
1979
  //#region src/eslint/configs/comments.ts
1981
1980
  init_globs();
1982
- async function comments({ markdownCode, markdownCodeOverrides = [], prettierOptions = {}, stylistic = true } = {}) {
1983
- function lengthRules(tabSize) {
1984
- return commentLengthRules({
1985
- maxLength: (Number(prettierOptions["jsdocPrintWidth"]) || 80) + 2,
1986
- multiLineMaxLength: Number(prettierOptions["jsdocPrintWidth"]) || 80,
1987
- semanticComments: ["oxlint-disable", "oxlint-enable"],
1988
- tabSize: tabSize ?? prettierOptions.tabWidth ?? 4
1989
- });
1990
- }
1981
+ async function comments({ prettierOptions = {}, stylistic = true } = {}) {
1991
1982
  const pluginCommentLength = lazyPlugin("eslint-plugin-comment-length");
1992
1983
  const pluginStylistic = lazyPlugin("@stylistic/eslint-plugin");
1993
1984
  return [{
@@ -2009,19 +2000,13 @@ async function comments({ markdownCode, markdownCodeOverrides = [], prettierOpti
2009
2000
  }, ...stylistic !== false ? [{
2010
2001
  name: "isentinel/eslint/comments/src",
2011
2002
  files: [GLOB_SRC],
2012
- rules: lengthRules(void 0)
2013
- }, ...markdownCode === void 0 ? [] : [{
2014
- name: "isentinel/eslint/comments/markdown-code",
2015
- files: [GLOB_MARKDOWN_CODE],
2016
- rules: lengthRules(markdownCode.tabWidth)
2017
- }, ...markdownCodeOverrides.map(({ excludeFiles, files, widths }, index) => {
2018
- return {
2019
- name: `isentinel/eslint/comments/markdown-code/override-${index}`,
2020
- files: files.map((glob) => `${glob}/${GLOB_SRC}`),
2021
- ignores: excludeFiles.map((glob) => `${glob}/**`),
2022
- rules: lengthRules(widths.tabWidth ?? markdownCode.tabWidth)
2023
- };
2024
- })]] : []];
2003
+ rules: commentLengthRules({
2004
+ maxLength: (Number(prettierOptions["jsdocPrintWidth"]) || 80) + 2,
2005
+ multiLineMaxLength: Number(prettierOptions["jsdocPrintWidth"]) || 80,
2006
+ semanticComments: ["oxlint-disable", "oxlint-enable"],
2007
+ tabSize: prettierOptions.tabWidth ?? 4
2008
+ })
2009
+ }] : []];
2025
2010
  }
2026
2011
  //#endregion
2027
2012
  //#region src/eslint/configs/disables.ts
@@ -2299,27 +2284,27 @@ async function eslintPlugin({ files = [GLOB_SRC], overrides = {} } = {}) {
2299
2284
  //#endregion
2300
2285
  //#region src/rules/flawless.ts
2301
2286
  /**
2302
- * Arrow return style rule on its own, for the Markdown code block override
2303
- * where only the line width differs.
2304
- *
2305
- * @param options - Shared rule options.
2306
- * @returns The rule map.
2287
+ * Luau globals whose functions only compute a value, for
2288
+ * `flawless/no-ignored-return`. `table` also has functions that mutate, so
2289
+ * only its pure members are listed.
2307
2290
  */
2308
- function arrowStyleRules({ maxLen, maxLength, printWidth, tabWidth } = {}) {
2309
- return { "flawless/arrow-return-style": ["error", {
2310
- jsxAlwaysUseExplicitReturn: true,
2311
- maxLen: maxLength ?? maxLen ?? printWidth ?? 100,
2312
- maxObjectProperties: 2,
2313
- namedExportsAlwaysUseExplicitReturn: true,
2314
- objectReturnStyle: "complex-explicit",
2315
- ...tabWidth !== void 0 ? { tabWidth } : {},
2316
- ...printWidth !== void 0 ? { useOxfmt: { printWidth } } : {}
2317
- }] };
2318
- }
2291
+ const ROBLOX_PURE_FUNCTIONS = [
2292
+ "bit32",
2293
+ "buffer",
2294
+ "math",
2295
+ "os",
2296
+ "string",
2297
+ "table.clone",
2298
+ "table.create",
2299
+ "table.isfrozen",
2300
+ "utf8",
2301
+ "vector"
2302
+ ];
2319
2303
  /**
2320
2304
  * Base (non-React) flawless rules shared between the ESLint and oxlint
2321
2305
  * factories. The React flawless rules live in the react rule map; the
2322
- * type-aware rules live in {@link flawlessTypeAwareRules}, plus the type-aware
2306
+ * type-aware rules live in {@link flawlessTypeAwareRules} and
2307
+ * {@link flawlessTypeAwareJsxRules}, plus the type-aware
2323
2308
  * `flawless/naming-convention` in its own config; the test-only rules, and the
2324
2309
  * non-JS `flawless/no-redundant-tsconfig-options`, `flawless/toml-*` and
2325
2310
  * `flawless/yaml-*` rules are configured by their own configs.
@@ -2329,6 +2314,7 @@ function arrowStyleRules({ maxLen, maxLength, printWidth, tabWidth } = {}) {
2329
2314
  */
2330
2315
  function flawlessRules({ antiSlop = false, roblox = true, stylistic = true, ...arrowOptions } = {}) {
2331
2316
  return {
2317
+ "flawless/cognitive-complexity": ["warn", { threshold: 15 }],
2332
2318
  "flawless/no-export-default-arrow": "error",
2333
2319
  "flawless/no-floating-point-equality": "error",
2334
2320
  ...stylistic === false ? {} : {
@@ -2352,12 +2338,22 @@ function flawlessRules({ antiSlop = false, roblox = true, stylistic = true, ...a
2352
2338
  */
2353
2339
  function flawlessTypeAwareRules({ antiSlop = false, roblox = true } = {}) {
2354
2340
  return {
2341
+ "flawless/no-ignored-return": roblox ? ["error", { pureFunctions: [...ROBLOX_PURE_FUNCTIONS] }] : "error",
2355
2342
  "flawless/no-redundant-type-annotation": "error",
2356
- "flawless/prefer-read-only-props": "error",
2357
2343
  ...antiSlop ? antiSlopTypeAwareRules({ roblox }) : {}
2358
2344
  };
2359
2345
  }
2360
2346
  /**
2347
+ * Type-aware flawless rules that only check function components. ESLint only,
2348
+ * like {@link flawlessTypeAwareRules}. Scoped to TSX files: type information is
2349
+ * only available for TypeScript, and components live in `.tsx` files.
2350
+ *
2351
+ * @returns The rule map.
2352
+ */
2353
+ function flawlessTypeAwareJsxRules() {
2354
+ return { "flawless/prefer-read-only-props": "error" };
2355
+ }
2356
+ /**
2361
2357
  * Syntactic anti-slop rules: patterns AI-written code tends to produce.
2362
2358
  *
2363
2359
  * `flawless/no-reflect-get` is complement-only: `Reflect` has no declaration
@@ -2368,15 +2364,36 @@ function flawlessTypeAwareRules({ antiSlop = false, roblox = true } = {}) {
2368
2364
  */
2369
2365
  function antiSlopRules({ roblox = true }) {
2370
2366
  return {
2367
+ "flawless/max-comment-length": ["error", { maximumWords: 50 }],
2371
2368
  "flawless/no-conditional-empty-object-spread": "error",
2369
+ "flawless/no-em-dash": "error",
2372
2370
  "flawless/no-known-value-widening": "error",
2373
2371
  "flawless/no-object-parameters": "error",
2374
2372
  "flawless/no-shape-in-symbol-names": "error",
2373
+ "flawless/no-trivial-functions": "error",
2374
+ "flawless/no-unknown-parameters": "error",
2375
2375
  "flawless/no-unsafe-dictionary-type": "error",
2376
2376
  ...roblox ? {} : { "flawless/no-reflect-get": "error" }
2377
2377
  };
2378
2378
  }
2379
2379
  /**
2380
+ * The arrow return style rule.
2381
+ *
2382
+ * @param options - Shared rule options.
2383
+ * @returns The rule map.
2384
+ */
2385
+ function arrowStyleRules({ maxLen, printWidth, tabWidth } = {}) {
2386
+ return { "flawless/arrow-return-style": ["error", {
2387
+ jsxAlwaysUseExplicitReturn: true,
2388
+ maxLen: maxLen ?? printWidth ?? 100,
2389
+ maxObjectProperties: 2,
2390
+ namedExportsAlwaysUseExplicitReturn: true,
2391
+ objectReturnStyle: "complex-explicit",
2392
+ ...tabWidth !== void 0 ? { tabWidth } : {},
2393
+ ...printWidth !== void 0 ? { useOxfmt: { printWidth } } : {}
2394
+ }] };
2395
+ }
2396
+ /**
2380
2397
  * Type-aware anti-slop rules.
2381
2398
  *
2382
2399
  * `flawless/no-reflect-set` is complement-only, like `flawless/no-reflect-get`.
@@ -2397,7 +2414,7 @@ function antiSlopTypeAwareRules({ roblox = true }) {
2397
2414
  //#region src/eslint/configs/flawless.ts
2398
2415
  init_globs();
2399
2416
  async function flawless(options = {}, prettierOptions = {}) {
2400
- const { antiSlop = false, complementIgnores, markdownCode = {}, markdownCodeOverrides = [], overridesTypeAware = {}, roblox = true, stylistic = true, typeAware = true } = options;
2417
+ const { antiSlop = false, complementIgnores, overridesTypeAware = {}, roblox = true, stylistic = true, typeAware = true } = options;
2401
2418
  const eslintPluginFlawless = await interopDefault(import("eslint-plugin-flawless"));
2402
2419
  const filesTypeAware = [GLOB_TS, GLOB_TSX];
2403
2420
  const ignoresTypeAware = options.ignoresTypeAware ?? [`**/*.md/**`, "**/*.d.{,c,m}ts"];
@@ -2412,13 +2429,6 @@ async function flawless(options = {}, prettierOptions = {}) {
2412
2429
  stylistic,
2413
2430
  tabWidth
2414
2431
  };
2415
- function markdownCodeRules(widths) {
2416
- return arrowStyleRules({
2417
- maxLength: Number(prettierOptions["jsdocPrintWidth"]) || 80,
2418
- printWidth: widths.printWidth ?? printWidth,
2419
- tabWidth: widths.tabWidth ?? tabWidth
2420
- });
2421
- }
2422
2432
  return [
2423
2433
  {
2424
2434
  name: "isentinel/flawless/setup",
@@ -2432,21 +2442,6 @@ async function flawless(options = {}, prettierOptions = {}) {
2432
2442
  roblox
2433
2443
  })
2434
2444
  },
2435
- ...stylistic !== false ? [{
2436
- name: "isentinel/flawless/markdown-code",
2437
- files: [GLOB_MARKDOWN_CODE],
2438
- rules: markdownCodeRules(markdownCode)
2439
- }, ...markdownCodeOverrides.map(({ excludeFiles, files, widths }, index) => {
2440
- return {
2441
- name: `isentinel/flawless/markdown-code/override-${index}`,
2442
- files: files.map((glob) => `${glob}/${GLOB_SRC}`),
2443
- ignores: excludeFiles.map((glob) => `${glob}/**`),
2444
- rules: markdownCodeRules({
2445
- ...markdownCode,
2446
- ...widths
2447
- })
2448
- };
2449
- })] : [],
2450
2445
  ...complementIgnores ? [{
2451
2446
  name: "isentinel/flawless/complement",
2452
2447
  files: [GLOB_SRC],
@@ -2456,6 +2451,12 @@ async function flawless(options = {}, prettierOptions = {}) {
2456
2451
  roblox: false
2457
2452
  })
2458
2453
  }] : [],
2454
+ ...isTypeAware ? [{
2455
+ name: "isentinel/flawless/tsx/rules-type-aware",
2456
+ files: [GLOB_TSX],
2457
+ ignores: ignoresTypeAware,
2458
+ rules: flawlessTypeAwareJsxRules()
2459
+ }] : [],
2459
2460
  ...isTypeAware ? [{
2460
2461
  name: "isentinel/flawless/rules-type-aware",
2461
2462
  files: filesTypeAware,
@@ -2483,7 +2484,7 @@ async function flawless(options = {}, prettierOptions = {}) {
2483
2484
  ];
2484
2485
  }
2485
2486
  //#endregion
2486
- //#region ../../../setup-pnpm/node_modules/.bin/store/v11/links/@eslint/compat/2.1.0/c5793be99df3f1294a68a791ed84f1ed609714ef294e5fa5fdeeff97455db3c8/node_modules/@eslint/compat/dist/esm/index.js
2487
+ //#region ../../../setup-pnpm/node_modules/.bin/store/v11/links/@eslint/compat/2.1.0/017f2a99c4964fa273bbabeb623136c3c3730f9415cea90ed2501194dbdd23bd/node_modules/@eslint/compat/dist/esm/index.js
2487
2488
  /**
2488
2489
  * @fileoverview Ignore file utilities for the compat package.
2489
2490
  * @author Nicholas C. Zakas
@@ -2512,7 +2513,7 @@ function convertIgnorePatternToMinimatch(pattern) {
2512
2513
  }
2513
2514
  var init_esm$1 = __esmMin((() => {}));
2514
2515
  //#endregion
2515
- //#region ../../../setup-pnpm/node_modules/.bin/store/v11/links/@/eslint-config-flat-gitignore/2.3.0/48bee61dfbd6416cb227d1c477eb8990bf234fa634e4ccd62a9520a90cc26602/node_modules/eslint-config-flat-gitignore/dist/index.mjs
2516
+ //#region ../../../setup-pnpm/node_modules/.bin/store/v11/links/@/eslint-config-flat-gitignore/2.3.0/f307e164f36f43b448a8ceebca34f679d5f323ee99520236b96e9853454ef176/node_modules/eslint-config-flat-gitignore/dist/index.mjs
2516
2517
  var dist_exports = /* @__PURE__ */ __exportAll$2({ default: () => ignore });
2517
2518
  function toArray(array) {
2518
2519
  array = array ?? [];
@@ -2714,6 +2715,21 @@ function imports({ stylistic = true, type = "game" } = {}) {
2714
2715
  }
2715
2716
  //#endregion
2716
2717
  //#region src/rules/javascript.ts
2718
+ /** `id-length` options shared by the ESLint rule and the native oxlint rule. */
2719
+ const ID_LENGTH_OPTIONS = {
2720
+ exceptions: [
2721
+ "_",
2722
+ "x",
2723
+ "y",
2724
+ "z",
2725
+ "a",
2726
+ "b",
2727
+ "e"
2728
+ ],
2729
+ max: 30,
2730
+ min: 2,
2731
+ properties: "never"
2732
+ };
2717
2733
  /**
2718
2734
  * Core JavaScript rules shared between the ESLint and oxlint factories.
2719
2735
  *
@@ -2918,20 +2934,6 @@ function javascriptRules({ isInEditor = false, roblox = true, stylistic = true }
2918
2934
  "valid-typeof": ["error", { requireStringLiterals: true }],
2919
2935
  "vars-on-top": "error",
2920
2936
  ...stylistic !== false ? {
2921
- "id-length": ["error", {
2922
- exceptions: [
2923
- "_",
2924
- "x",
2925
- "y",
2926
- "z",
2927
- "a",
2928
- "b",
2929
- "e"
2930
- ],
2931
- max: 30,
2932
- min: 2,
2933
- properties: "never"
2934
- }],
2935
2937
  "max-lines": ["warn", {
2936
2938
  max: 300,
2937
2939
  skipBlankLines: true,
@@ -2961,6 +2963,7 @@ async function javascript({ complementIgnores, isInEditor = false, overrides = {
2961
2963
  const pluginDeMorgan = lazyPlugin("eslint-plugin-de-morgan");
2962
2964
  const pluginMaxParameters = lazyPlugin("eslint-plugin-better-max-params");
2963
2965
  const pluginUnusedImports = await interopDefault(import("eslint-plugin-unused-imports"));
2966
+ const idLengthRules = stylistic !== false ? { "id-length": ["error", ID_LENGTH_OPTIONS] } : {};
2964
2967
  return [
2965
2968
  {
2966
2969
  name: "isentinel/javascript/setup",
@@ -2998,6 +3001,7 @@ async function javascript({ complementIgnores, isInEditor = false, overrides = {
2998
3001
  roblox,
2999
3002
  stylistic
3000
3003
  }),
3004
+ ...idLengthRules,
3001
3005
  ...overrides
3002
3006
  }
3003
3007
  },
@@ -3011,6 +3015,7 @@ async function javascript({ complementIgnores, isInEditor = false, overrides = {
3011
3015
  roblox: false,
3012
3016
  stylistic
3013
3017
  }),
3018
+ ...idLengthRules,
3014
3019
  ...overrides
3015
3020
  }
3016
3021
  }] : []
@@ -3209,7 +3214,7 @@ init_globs();
3209
3214
  * loading the plugin. `test/lazy-plugin.spec.ts` asserts the two match.
3210
3215
  */
3211
3216
  const MARKDOWN_PROCESSOR_NAME = "@eslint/markdown/markdown";
3212
- function markdown({ componentExts: componentExtensions = [], files = [GLOB_MARKDOWN], overrides = {}, type = "game" } = {}) {
3217
+ function markdown({ antiSlop = false, componentExts: componentExtensions = [], files = [GLOB_MARKDOWN], overrides = {}, type = "game" } = {}) {
3213
3218
  const markdownPlugin = lazyPlugin("@eslint/markdown");
3214
3219
  return [
3215
3220
  {
@@ -3253,6 +3258,7 @@ function markdown({ componentExts: componentExtensions = [], files = [GLOB_MARKD
3253
3258
  "markdown/table-column-count": "error",
3254
3259
  "style/indent": "off",
3255
3260
  "unicorn/no-missing-local-resource": "error",
3261
+ ...antiSlop ? { "flawless/no-em-dash": "error" } : {},
3256
3262
  ...type === "package" ? {
3257
3263
  "markdown/heading-increment": "error",
3258
3264
  "markdown/no-bare-urls": "error",
@@ -3830,6 +3836,12 @@ function reactSelectors() {
3830
3836
  selector: ["parameter", "variable"],
3831
3837
  types: REACT_COMPONENT_TYPES
3832
3838
  },
3839
+ {
3840
+ componentProp: true,
3841
+ format: ["StrictPascalCase"],
3842
+ selector: "typeProperty",
3843
+ types: REACT_COMPONENT_TYPES
3844
+ },
3833
3845
  {
3834
3846
  format: ["strictCamelCase", "StrictPascalCase"],
3835
3847
  selector: ["classProperty", "typeProperty"],
@@ -3915,6 +3927,53 @@ function resolveFormattedLanguages(formatters = true) {
3915
3927
  };
3916
3928
  }
3917
3929
  //#endregion
3930
+ //#region src/eslint/oxfmt-markdown-code.ts
3931
+ /** As `GLOB_MARKDOWN`, case-sensitive. */
3932
+ const MARKDOWN_FILE = /\.md$/;
3933
+ /**
3934
+ * Wrap eslint-plugin-oxfmt so `oxfmt/oxfmt` formats Markdown code blocks.
3935
+ *
3936
+ * The rule skips every virtual file, so a code block is formatted only by
3937
+ * the formatter of the file it is in. Oxfmt formats Markdown code blocks at
3938
+ * the prose width, so the preset turns that off and lets the rule format each
3939
+ * block with the options of its own language. Virtual files of other
3940
+ * processors (Vue blocks, say) stay skipped: oxfmt formats those files whole.
3941
+ *
3942
+ * @param plugin - The loaded plugin.
3943
+ * @returns The plugin with the wrapped rule.
3944
+ */
3945
+ function oxfmtMarkdownCode(plugin) {
3946
+ const { rules } = plugin;
3947
+ const rule = rules?.["oxfmt"];
3948
+ if (rule === void 0) return plugin;
3949
+ return {
3950
+ ...plugin,
3951
+ rules: {
3952
+ ...rules,
3953
+ oxfmt: markdownCodeRule(rule)
3954
+ }
3955
+ };
3956
+ }
3957
+ /**
3958
+ * Whether a file is a code block of a Markdown file.
3959
+ *
3960
+ * @param context - The rule context.
3961
+ * @returns Whether the file is a Markdown code block.
3962
+ */
3963
+ function isMarkdownCodeBlock({ filename, physicalFilename }) {
3964
+ return filename !== physicalFilename && MARKDOWN_FILE.test(physicalFilename);
3965
+ }
3966
+ function markdownCodeRule(rule) {
3967
+ return {
3968
+ ...rule,
3969
+ create(context) {
3970
+ if (!isMarkdownCodeBlock(context)) return rule.create(context);
3971
+ const proxy = Object.create(context, { physicalFilename: { value: context.filename } });
3972
+ return rule.create(proxy);
3973
+ }
3974
+ };
3975
+ }
3976
+ //#endregion
3918
3977
  //#region src/eslint/oxfmt-single-fix.ts
3919
3978
  /** Records the edit a fix makes, instead of making it. */
3920
3979
  const recordingFixer = { replaceTextRange(range, text) {
@@ -3943,7 +4002,8 @@ function oxfmtSingleFix(plugin) {
3943
4002
  }
3944
4003
  function editOf({ fix }) {
3945
4004
  if (typeof fix !== "function") return;
3946
- return fix(recordingFixer) ?? void 0;
4005
+ const edit = fix(recordingFixer);
4006
+ return edit !== null && "range" in edit ? edit : void 0;
3947
4007
  }
3948
4008
  /**
3949
4009
  * Merge non-overlapping edits into one that spans them all.
@@ -3954,7 +4014,7 @@ function editOf({ fix }) {
3954
4014
  */
3955
4015
  function mergeEdits(source, edits) {
3956
4016
  const sorted = edits.toSorted((first, second) => first.range[0] - second.range[0]);
3957
- const start = sorted[0].range[0];
4017
+ const start = sorted[0]?.range[0] ?? 0;
3958
4018
  let end = start;
3959
4019
  let text = "";
3960
4020
  for (const { range, text: insert } of sorted) {
@@ -4005,7 +4065,7 @@ function singleFixRule(rule) {
4005
4065
  const listeners = rule.create(proxy);
4006
4066
  return Object.fromEntries(Object.entries(listeners).map(([selector, listener]) => {
4007
4067
  return [selector, (...args) => {
4008
- listener(...args);
4068
+ if (listener !== void 0) Reflect.apply(listener, void 0, args);
4009
4069
  flush();
4010
4070
  }];
4011
4071
  }));
@@ -4028,7 +4088,7 @@ const defaultPluginRenaming = {
4028
4088
  //#region src/eslint/configs/oxfmt.ts
4029
4089
  init_globs();
4030
4090
  async function oxfmt(options) {
4031
- const { componentExts: componentExtensions = [], files: oxfmtFiles, formatters = {}, oxfmtConfigOptions = {}, oxfmtOptions: userOxfmtOptions, oxlint: enableOxlint = false, prettierOptions = {}, standalone = false } = options ?? {};
4091
+ const { componentExts: componentExtensions = [], files: oxfmtFiles, formatters = {}, oxfmtConfigOptions = {}, oxfmtIgnorePatterns = [], oxfmtOptions: userOxfmtOptions, oxlint: enableOxlint = false, prettierOptions = {}, standalone = false } = options ?? {};
4032
4092
  const languages = resolveFormattedLanguages(formatters);
4033
4093
  const oxfmtOptions = buildOxfmtOptions({
4034
4094
  oxfmtConfigOptions,
@@ -4049,7 +4109,28 @@ async function oxfmt(options) {
4049
4109
  disableNestedConfig: true
4050
4110
  }] };
4051
4111
  }
4052
- const pluginOxfmt = lazyPlugin("eslint-plugin-oxfmt", oxfmtSingleFix);
4112
+ /**
4113
+ * The `oxfmt/oxfmt` entry for Markdown code blocks, in every mode: oxfmt
4114
+ * leaves them alone, and oxlint cannot read Markdown. A code block takes
4115
+ * the root options of its language only: the rule does not load the
4116
+ * config, so its overrides and the `.editorconfig` sections, which match
4117
+ * by path, do not reach the block. The config's ignore patterns still do.
4118
+ *
4119
+ * @param layer - Options applied over the base options.
4120
+ * @returns The rule entry.
4121
+ */
4122
+ function codeBlockRule(layer = {}) {
4123
+ return { "oxfmt/oxfmt": ["error", {
4124
+ ...oxfmtOptions,
4125
+ ...layer,
4126
+ ignorePatterns: oxfmtIgnorePatterns,
4127
+ overrides: [],
4128
+ useConfig: false
4129
+ }] };
4130
+ }
4131
+ const pluginOxfmt = lazyPlugin("eslint-plugin-oxfmt", (plugin) => {
4132
+ return oxfmtSingleFix(oxfmtMarkdownCode(plugin));
4133
+ });
4053
4134
  const configPrettier = await interopDefault(import("eslint-config-prettier/flat"));
4054
4135
  const rulesToIgnore = ["curly", "style/quotes"];
4055
4136
  const rules = renameRules(configPrettier.rules, defaultPluginRenaming);
@@ -4091,9 +4172,80 @@ async function oxfmt(options) {
4091
4172
  files: [...FORMATTED_FILES.yaml],
4092
4173
  rules: formatRule(YAML_OXFMT_OPTIONS)
4093
4174
  });
4175
+ const codeBlocks = markdownCodeBlocks(languages, componentExtensions).map(([name, files, layer]) => {
4176
+ return {
4177
+ name: `isentinel/oxfmt/markdown-code/${name}`,
4178
+ files: files.map((glob) => `${GLOB_MARKDOWN}/${glob}`),
4179
+ rules: codeBlockRule(layer)
4180
+ };
4181
+ });
4182
+ if (languages.markdown) configs.push(...codeBlocks);
4183
+ else configs.push({
4184
+ name: "isentinel/oxfmt/markdown-code",
4185
+ files: codeBlocks.flatMap((block) => block.files),
4186
+ rules: { "oxfmt/oxfmt": "off" }
4187
+ });
4094
4188
  return configs;
4095
4189
  }
4096
4190
  /**
4191
+ * The code-block languages to format, with the options each one uses: the
4192
+ * same as a file of that language. Markdown blocks are left out: a config
4193
+ * that matches their virtual `*.md/*.md` files makes ESLint fail.
4194
+ *
4195
+ * @param languages - Which languages are formatted.
4196
+ * @param componentExtensions - Component extensions formatted as TypeScript.
4197
+ * @returns The code-block languages.
4198
+ */
4199
+ function markdownCodeBlocks(languages, componentExtensions) {
4200
+ const blocks = [[
4201
+ "javascript",
4202
+ [...FORMATTED_FILES.javascript],
4203
+ {}
4204
+ ], [
4205
+ "typescript",
4206
+ [...FORMATTED_FILES.typescript, ...componentExtensions.map((extension) => `**/*.${extension}`)],
4207
+ {}
4208
+ ]];
4209
+ if (languages.css) blocks.push([
4210
+ "css",
4211
+ [...FORMATTED_FILES.css],
4212
+ {}
4213
+ ], [
4214
+ "scss",
4215
+ [...FORMATTED_FILES.scss],
4216
+ {}
4217
+ ], [
4218
+ "less",
4219
+ [...FORMATTED_FILES.less],
4220
+ {}
4221
+ ]);
4222
+ if (languages.html) blocks.push([
4223
+ "html",
4224
+ [...FORMATTED_FILES.html],
4225
+ {}
4226
+ ]);
4227
+ if (languages.graphql) blocks.push([
4228
+ "graphql",
4229
+ [...FORMATTED_FILES.graphql],
4230
+ {}
4231
+ ]);
4232
+ if (languages.json) blocks.push([
4233
+ "json",
4234
+ [...FORMATTED_FILES.json],
4235
+ {}
4236
+ ], [
4237
+ "json5",
4238
+ [GLOB_JSON5],
4239
+ JSON5_OXFMT_OPTIONS
4240
+ ]);
4241
+ if (languages.yaml) blocks.push([
4242
+ "yaml",
4243
+ [...FORMATTED_FILES.yaml],
4244
+ YAML_OXFMT_OPTIONS
4245
+ ]);
4246
+ return blocks;
4247
+ }
4248
+ /**
4097
4249
  * A block for a language ESLint has no parser for: the plain parser lets
4098
4250
  * `oxfmt/oxfmt` see the file, and keeps ESLint from parsing Markdown code
4099
4251
  * blocks in it as JavaScript.
@@ -4998,7 +5150,6 @@ async function roblox(options = {}, formatLua = true) {
4998
5150
  function sonarjsRules({ isInEditor, roblox = true }) {
4999
5151
  return {
5000
5152
  "sonar/bool-param-default": "error",
5001
- "sonar/cognitive-complexity": "warn",
5002
5153
  "sonar/constructor-for-side-effects": "error",
5003
5154
  "sonar/destructuring-assignment-syntax": "error",
5004
5155
  "sonar/elseif-without-else": "off",
@@ -5014,12 +5165,10 @@ function sonarjsRules({ isInEditor, roblox = true }) {
5014
5165
  "sonar/no-duplicated-branches": "error",
5015
5166
  "sonar/no-element-overwrite": "error",
5016
5167
  "sonar/no-empty-collection": "error",
5017
- "sonar/no-floating-point-equality": "error",
5018
5168
  "sonar/no-gratuitous-expressions": "off",
5019
5169
  "sonar/no-identical-conditions": "error",
5020
5170
  "sonar/no-identical-expressions": "error",
5021
5171
  "sonar/no-identical-functions": "error",
5022
- "sonar/no-ignored-return": "error",
5023
5172
  "sonar/no-inverted-boolean-check": "error",
5024
5173
  "sonar/no-nested-conditional": "error",
5025
5174
  "sonar/no-nested-incdec": "error",
@@ -5065,7 +5214,6 @@ function sonarjsRules({ isInEditor, roblox = true }) {
5065
5214
  */
5066
5215
  function sonarjsTestRules({ jest = false, roblox = true } = {}) {
5067
5216
  return {
5068
- "sonar/no-incompatible-assertion-types": "error",
5069
5217
  ...jest ? {
5070
5218
  "sonar/no-mixed-completion-style": "error",
5071
5219
  "sonar/synchronous-suite-callback": "error"
@@ -5098,177 +5246,293 @@ async function sonarjs({ complementIgnores, isInEditor, roblox }) {
5098
5246
  //#region src/eslint/configs/sort.ts
5099
5247
  init_globs();
5100
5248
  /**
5101
- * Sort GitHub Actions workflow files.
5249
+ * Sort GitHub Actions workflow, composite action and label files.
5102
5250
  *
5103
5251
  * Requires `yaml` config.
5104
5252
  *
5105
5253
  * @returns An array of flat configuration items.
5106
5254
  */
5107
5255
  function sortGithubAction() {
5108
- return [{
5109
- name: "isentinel/sort/github-actions",
5110
- files: [`.github/workflows/${GLOB_YAML}`],
5111
- rules: {
5112
- "yaml/sort-keys": [
5256
+ return [
5257
+ {
5258
+ name: "isentinel/sort/github-actions",
5259
+ files: [`.github/workflows/${GLOB_YAML}`],
5260
+ rules: {
5261
+ "yaml/sort-keys": [
5262
+ "error",
5263
+ {
5264
+ order: [
5265
+ "name",
5266
+ "run-name",
5267
+ "on",
5268
+ "permissions",
5269
+ "env",
5270
+ "concurrency",
5271
+ "jobs"
5272
+ ],
5273
+ pathPattern: "^$"
5274
+ },
5275
+ {
5276
+ order: [
5277
+ "name",
5278
+ "permissions",
5279
+ "needs",
5280
+ "if",
5281
+ "runs-on",
5282
+ "environment",
5283
+ "concurrency",
5284
+ "outputs",
5285
+ "env",
5286
+ "defaults",
5287
+ "steps",
5288
+ "timeout-minutes",
5289
+ "strategy",
5290
+ "continue-on-error",
5291
+ "container",
5292
+ "services",
5293
+ "uses",
5294
+ "with",
5295
+ "secrets"
5296
+ ],
5297
+ pathPattern: "^jobs\\.[^.]+$"
5298
+ },
5299
+ {
5300
+ order: [
5301
+ "check_run",
5302
+ "check_suite",
5303
+ "create",
5304
+ "delete",
5305
+ "deployment",
5306
+ "deployment_status",
5307
+ "discussion",
5308
+ "discussion_comment",
5309
+ "fork",
5310
+ "gollum",
5311
+ "issue_comment",
5312
+ "issues",
5313
+ "label",
5314
+ "merge_group",
5315
+ "milestone",
5316
+ "page_build",
5317
+ "public",
5318
+ "pull_request",
5319
+ "pull_request_comment",
5320
+ "pull_request_review",
5321
+ "pull_request_review_comment",
5322
+ "pull_request_target",
5323
+ "push",
5324
+ "registry_package",
5325
+ "release",
5326
+ "repository_dispatch",
5327
+ "schedule",
5328
+ "status",
5329
+ "watch",
5330
+ "workflow_call",
5331
+ "workflow_dispatch",
5332
+ "workflow_run"
5333
+ ],
5334
+ pathPattern: "^on$"
5335
+ },
5336
+ {
5337
+ order: [
5338
+ "branches",
5339
+ "branches-ignore",
5340
+ "paths",
5341
+ "paths-ignore"
5342
+ ],
5343
+ pathPattern: "^on\\.pull_request$"
5344
+ },
5345
+ {
5346
+ order: [
5347
+ "branches",
5348
+ "branches-ignore",
5349
+ "paths",
5350
+ "paths-ignore"
5351
+ ],
5352
+ pathPattern: "^on\\.pull_request_target$"
5353
+ },
5354
+ {
5355
+ order: [
5356
+ "branches",
5357
+ "tags",
5358
+ "branches-ignore",
5359
+ "tags-ignore",
5360
+ "paths",
5361
+ "paths-ignore"
5362
+ ],
5363
+ pathPattern: "^on\\.push$"
5364
+ },
5365
+ {
5366
+ order: [
5367
+ "inputs",
5368
+ "outputs",
5369
+ "secrets"
5370
+ ],
5371
+ pathPattern: "^on\\.workflow_call$"
5372
+ },
5373
+ {
5374
+ order: ["inputs"],
5375
+ pathPattern: "^on\\.workflow_dispatch$"
5376
+ },
5377
+ {
5378
+ order: ["branches", "branches-ignore"],
5379
+ pathPattern: "^on\\.workflow_run$"
5380
+ },
5381
+ {
5382
+ order: [
5383
+ "description",
5384
+ "required",
5385
+ "default",
5386
+ "type"
5387
+ ],
5388
+ pathPattern: "^on\\.(workflow_call|workflow_dispatch)\\.inputs\\.[^.]+$"
5389
+ },
5390
+ {
5391
+ order: ["shell", "working-directory"],
5392
+ pathPattern: "^(defaults\\.run|jobs\\.[^.]+\\.defaults\\.run)$"
5393
+ },
5394
+ {
5395
+ order: ["group", "cancel-in-progress"],
5396
+ pathPattern: "^(concurrency|jobs\\.[^.]+\\.concurrency)$"
5397
+ },
5398
+ {
5399
+ order: [
5400
+ "name",
5401
+ "permissions",
5402
+ "needs",
5403
+ "if",
5404
+ "runs-on",
5405
+ "environment",
5406
+ "concurrency",
5407
+ "outputs",
5408
+ "env",
5409
+ "defaults",
5410
+ "steps",
5411
+ "timeout-minutes",
5412
+ "strategy",
5413
+ "continue-on-error",
5414
+ "container",
5415
+ "services",
5416
+ "uses",
5417
+ "with",
5418
+ "secrets"
5419
+ ],
5420
+ pathPattern: "^jobs\\. [^.]+$"
5421
+ },
5422
+ {
5423
+ order: [
5424
+ "id",
5425
+ "if",
5426
+ "name",
5427
+ "uses",
5428
+ "run",
5429
+ "working-directory",
5430
+ "with",
5431
+ "env",
5432
+ "continue-on-error",
5433
+ "timeout-minutes"
5434
+ ],
5435
+ pathPattern: "^jobs\\.[^.]+\\.steps\\[\\d+\\]$"
5436
+ },
5437
+ {
5438
+ order: ["args", "entrypoint"],
5439
+ pathPattern: "^jobs\\.[^.]+\\.steps\\[\\d+\\]\\.with$"
5440
+ },
5441
+ {
5442
+ order: [
5443
+ "matrix",
5444
+ "fail-fast",
5445
+ "max-parallel"
5446
+ ],
5447
+ pathPattern: "^jobs\\.[^.]+\\.strategy$"
5448
+ },
5449
+ {
5450
+ order: ["include", "exclude"],
5451
+ pathPattern: "^jobs\\.[^.]+\\.strategy\\.matrix$"
5452
+ },
5453
+ {
5454
+ order: [
5455
+ "image",
5456
+ "credentials",
5457
+ "env",
5458
+ "ports",
5459
+ "volumes",
5460
+ "options"
5461
+ ],
5462
+ pathPattern: "^jobs\\.[^.]+\\.container$"
5463
+ },
5464
+ {
5465
+ order: [
5466
+ "image",
5467
+ "credentials",
5468
+ "env",
5469
+ "ports",
5470
+ "volumes",
5471
+ "options"
5472
+ ],
5473
+ pathPattern: "^jobs\\.[^.]+\\.services\\.[^.]+$"
5474
+ },
5475
+ {
5476
+ order: { type: "asc" },
5477
+ pathPattern: "^(?!$|on$|jobs\\.[^.]+$|on\\.(pull_request|pull_request_target|push|workflow_call|workflow_dispatch|workflow_run)$).*"
5478
+ }
5479
+ ],
5480
+ "yaml/sort-sequence-values": [
5481
+ "error",
5482
+ {
5483
+ order: {
5484
+ natural: true,
5485
+ type: "asc"
5486
+ },
5487
+ pathPattern: "^on$"
5488
+ },
5489
+ {
5490
+ order: {
5491
+ natural: true,
5492
+ type: "asc"
5493
+ },
5494
+ pathPattern: "^on\\.[^.]+\\.(branches|branches-ignore|tags|tags-ignore|paths|paths-ignore|types)$"
5495
+ },
5496
+ {
5497
+ order: {
5498
+ natural: true,
5499
+ type: "asc"
5500
+ },
5501
+ pathPattern: "^jobs\\.[^.]+\\.needs$"
5502
+ }
5503
+ ]
5504
+ }
5505
+ },
5506
+ {
5507
+ name: "isentinel/sort/github-composite-actions",
5508
+ files: [`.github/actions/${GLOB_YAML}`],
5509
+ rules: { "yaml/sort-keys": [
5113
5510
  "error",
5114
5511
  {
5115
5512
  order: [
5116
5513
  "name",
5117
- "run-name",
5118
- "on",
5119
- "permissions",
5120
- "env",
5121
- "concurrency",
5122
- "jobs"
5123
- ],
5124
- pathPattern: "^$"
5125
- },
5126
- {
5127
- order: [
5128
- "name",
5129
- "permissions",
5130
- "needs",
5131
- "if",
5132
- "runs-on",
5133
- "environment",
5134
- "concurrency",
5135
- "outputs",
5136
- "env",
5137
- "defaults",
5138
- "steps",
5139
- "timeout-minutes",
5140
- "strategy",
5141
- "continue-on-error",
5142
- "container",
5143
- "services",
5144
- "uses",
5145
- "with",
5146
- "secrets"
5147
- ],
5148
- pathPattern: "^jobs\\.[^.]+$"
5149
- },
5150
- {
5151
- order: [
5152
- "check_run",
5153
- "check_suite",
5154
- "create",
5155
- "delete",
5156
- "deployment",
5157
- "deployment_status",
5158
- "discussion",
5159
- "discussion_comment",
5160
- "fork",
5161
- "gollum",
5162
- "issue_comment",
5163
- "issues",
5164
- "label",
5165
- "merge_group",
5166
- "milestone",
5167
- "page_build",
5168
- "public",
5169
- "pull_request",
5170
- "pull_request_comment",
5171
- "pull_request_review",
5172
- "pull_request_review_comment",
5173
- "pull_request_target",
5174
- "push",
5175
- "registry_package",
5176
- "release",
5177
- "repository_dispatch",
5178
- "schedule",
5179
- "status",
5180
- "watch",
5181
- "workflow_call",
5182
- "workflow_dispatch",
5183
- "workflow_run"
5184
- ],
5185
- pathPattern: "^on$"
5186
- },
5187
- {
5188
- order: [
5189
- "branches",
5190
- "branches-ignore",
5191
- "paths",
5192
- "paths-ignore"
5193
- ],
5194
- pathPattern: "^on\\.pull_request$"
5195
- },
5196
- {
5197
- order: [
5198
- "branches",
5199
- "branches-ignore",
5200
- "paths",
5201
- "paths-ignore"
5202
- ],
5203
- pathPattern: "^on\\.pull_request_target$"
5204
- },
5205
- {
5206
- order: [
5207
- "branches",
5208
- "tags",
5209
- "branches-ignore",
5210
- "tags-ignore",
5211
- "paths",
5212
- "paths-ignore"
5213
- ],
5214
- pathPattern: "^on\\.push$"
5215
- },
5216
- {
5217
- order: [
5514
+ "description",
5218
5515
  "inputs",
5219
5516
  "outputs",
5220
- "secrets"
5517
+ "runs"
5221
5518
  ],
5222
- pathPattern: "^on\\.workflow_call$"
5223
- },
5224
- {
5225
- order: ["inputs"],
5226
- pathPattern: "^on\\.workflow_dispatch$"
5227
- },
5228
- {
5229
- order: ["branches", "branches-ignore"],
5230
- pathPattern: "^on\\.workflow_run$"
5519
+ pathPattern: "^$"
5231
5520
  },
5232
5521
  {
5233
5522
  order: [
5234
5523
  "description",
5235
5524
  "required",
5236
- "default",
5237
- "type"
5525
+ "default"
5238
5526
  ],
5239
- pathPattern: "^on\\.(workflow_call|workflow_dispatch)\\.inputs\\.[^.]+$"
5527
+ pathPattern: "^inputs\\.[^.]+$"
5240
5528
  },
5241
5529
  {
5242
- order: ["shell", "working-directory"],
5243
- pathPattern: "^(defaults\\.run|jobs\\.[^.]+\\.defaults\\.run)$"
5530
+ order: ["description", "value"],
5531
+ pathPattern: "^outputs\\.[^.]+$"
5244
5532
  },
5245
5533
  {
5246
- order: ["group", "cancel-in-progress"],
5247
- pathPattern: "^(concurrency|jobs\\.[^.]+\\.concurrency)$"
5248
- },
5249
- {
5250
- order: [
5251
- "name",
5252
- "permissions",
5253
- "needs",
5254
- "if",
5255
- "runs-on",
5256
- "environment",
5257
- "concurrency",
5258
- "outputs",
5259
- "env",
5260
- "defaults",
5261
- "steps",
5262
- "timeout-minutes",
5263
- "strategy",
5264
- "continue-on-error",
5265
- "container",
5266
- "services",
5267
- "uses",
5268
- "with",
5269
- "secrets"
5270
- ],
5271
- pathPattern: "^jobs\\. [^.]+$"
5534
+ order: ["using", "steps"],
5535
+ pathPattern: "^runs$"
5272
5536
  },
5273
5537
  {
5274
5538
  order: [
@@ -5280,132 +5544,31 @@ function sortGithubAction() {
5280
5544
  "working-directory",
5281
5545
  "with",
5282
5546
  "env",
5547
+ "shell",
5283
5548
  "continue-on-error",
5284
5549
  "timeout-minutes"
5285
5550
  ],
5286
- pathPattern: "^jobs\\.[^.]+\\.steps\\[\\d+\\]$"
5287
- },
5288
- {
5289
- order: ["args", "entrypoint"],
5290
- pathPattern: "^jobs\\.[^.]+\\.steps\\[\\d+\\]\\.with$"
5291
- },
5292
- {
5293
- order: [
5294
- "matrix",
5295
- "fail-fast",
5296
- "max-parallel"
5297
- ],
5298
- pathPattern: "^jobs\\.[^.]+\\.strategy$"
5299
- },
5300
- {
5301
- order: ["include", "exclude"],
5302
- pathPattern: "^jobs\\.[^.]+\\.strategy\\.matrix$"
5303
- },
5304
- {
5305
- order: [
5306
- "image",
5307
- "credentials",
5308
- "env",
5309
- "ports",
5310
- "volumes",
5311
- "options"
5312
- ],
5313
- pathPattern: "^jobs\\.[^.]+\\.container$"
5314
- },
5315
- {
5316
- order: [
5317
- "image",
5318
- "credentials",
5319
- "env",
5320
- "ports",
5321
- "volumes",
5322
- "options"
5323
- ],
5324
- pathPattern: "^jobs\\.[^.]+\\.services\\.[^.]+$"
5551
+ pathPattern: "^runs\\.steps\\[\\d+\\]$"
5325
5552
  },
5326
5553
  {
5327
5554
  order: { type: "asc" },
5328
- pathPattern: "^(?!$|on$|jobs\\.[^.]+$|on\\.(pull_request|pull_request_target|push|workflow_call|workflow_dispatch|workflow_run)$).*"
5555
+ pathPattern: "^(?!^$|inputs\\.[^.]+$|outputs\\.[^.]+$|runs$|runs\\.steps\\[\\d+\\]$).*$"
5329
5556
  }
5330
- ],
5331
- "yaml/sort-sequence-values": [
5332
- "error",
5333
- {
5334
- order: {
5335
- natural: true,
5336
- type: "asc"
5337
- },
5338
- pathPattern: "^on$"
5339
- },
5340
- {
5341
- order: {
5342
- natural: true,
5343
- type: "asc"
5344
- },
5345
- pathPattern: "^on\\.[^.]+\\.(branches|branches-ignore|tags|tags-ignore|paths|paths-ignore|types)$"
5557
+ ] }
5558
+ },
5559
+ {
5560
+ name: "isentinel/sort/github-labels",
5561
+ files: [".github/labels.y{,a}ml"],
5562
+ rules: { "flawless/yaml-sort-sequence-by-key": ["error", {
5563
+ key: "name",
5564
+ order: {
5565
+ natural: true,
5566
+ type: "asc"
5346
5567
  },
5347
- {
5348
- order: {
5349
- natural: true,
5350
- type: "asc"
5351
- },
5352
- pathPattern: "^jobs\\.[^.]+\\.needs$"
5353
- }
5354
- ]
5355
- }
5356
- }, {
5357
- name: "isentinel/sort/github-composite-actions",
5358
- files: [`.github/actions/${GLOB_YAML}`],
5359
- rules: { "yaml/sort-keys": [
5360
- "error",
5361
- {
5362
- order: [
5363
- "name",
5364
- "description",
5365
- "inputs",
5366
- "outputs",
5367
- "runs"
5368
- ],
5369
5568
  pathPattern: "^$"
5370
- },
5371
- {
5372
- order: [
5373
- "description",
5374
- "required",
5375
- "default"
5376
- ],
5377
- pathPattern: "^inputs\\.[^.]+$"
5378
- },
5379
- {
5380
- order: ["description", "value"],
5381
- pathPattern: "^outputs\\.[^.]+$"
5382
- },
5383
- {
5384
- order: ["using", "steps"],
5385
- pathPattern: "^runs$"
5386
- },
5387
- {
5388
- order: [
5389
- "id",
5390
- "if",
5391
- "name",
5392
- "uses",
5393
- "run",
5394
- "working-directory",
5395
- "with",
5396
- "env",
5397
- "shell",
5398
- "continue-on-error",
5399
- "timeout-minutes"
5400
- ],
5401
- pathPattern: "^runs\\.steps\\[\\d+\\]$"
5402
- },
5403
- {
5404
- order: { type: "asc" },
5405
- pathPattern: "^(?!^$|inputs\\.[^.]+$|outputs\\.[^.]+$|runs$|runs\\.steps\\[\\d+\\]$).*$"
5406
- }
5407
- ] }
5408
- }];
5569
+ }] }
5570
+ }
5571
+ ];
5409
5572
  }
5410
5573
  /**
5411
5574
  * Sort mise configuration files by category.
@@ -5860,13 +6023,23 @@ function sortCspell() {
5860
6023
  "**/.cspell.y{,a}ml",
5861
6024
  "**/.cspell.config.y{,a}ml"
5862
6025
  ],
5863
- rules: { "yaml/sort-sequence-values": ["error", {
5864
- order: {
5865
- natural: true,
5866
- type: "asc"
5867
- },
5868
- pathPattern: "^((overrides|languageSettings)\\[\\d+\\]\\.)?(words|userWords|ignoreWords|noSuggestWords|flagWords|ignorePaths|dictionaries|enableFiletypes)$"
5869
- }] }
6026
+ rules: {
6027
+ "flawless/yaml-sort-sequence-by-key": ["error", {
6028
+ key: "name",
6029
+ order: {
6030
+ natural: true,
6031
+ type: "asc"
6032
+ },
6033
+ pathPattern: "^((overrides|languageSettings)\\[\\d+\\]\\.)?dictionaryDefinitions$"
6034
+ }],
6035
+ "yaml/sort-sequence-values": ["error", {
6036
+ order: {
6037
+ natural: true,
6038
+ type: "asc"
6039
+ },
6040
+ pathPattern: "^((overrides|languageSettings)\\[\\d+\\]\\.)?(words|userWords|ignoreWords|noSuggestWords|flagWords|ignorePaths|dictionaries|enableFiletypes)$"
6041
+ }]
6042
+ }
5870
6043
  }];
5871
6044
  }
5872
6045
  //#endregion
@@ -5932,13 +6105,12 @@ function spelling(options = {}) {
5932
6105
  * @param options - Resolved stylistic options.
5933
6106
  * @returns The rule map.
5934
6107
  */
5935
- function stylisticRules({ jsx = true, quotes = "double" } = {}) {
6108
+ function stylisticRules({ quotes = "double" } = {}) {
5936
6109
  return {
5937
6110
  "antfu/consistent-list-newline": "off",
5938
6111
  "antfu/if-newline": "off",
5939
6112
  "antfu/top-level-function": "error",
5940
6113
  "curly": ["error", "all"],
5941
- ...jsx ? { "style/jsx-curly-brace-presence": ["error", { propElementValues: "always" }] } : {},
5942
6114
  "style/lines-between-class-members": ["error", { enforce: [{
5943
6115
  blankLine: "always",
5944
6116
  next: "method",
@@ -5989,6 +6161,17 @@ function stylisticRules({ jsx = true, quotes = "double" } = {}) {
5989
6161
  ]
5990
6162
  };
5991
6163
  }
6164
+ /**
6165
+ * JSX-specific stylistic rules shared between the ESLint and oxlint factories.
6166
+ * Scoped to JSX/TSX files: a `.ts` or `.js` file cannot contain JSX, so the
6167
+ * rules would only cost a traversal there.
6168
+ *
6169
+ * @param options - Resolved stylistic options.
6170
+ * @returns The rule map.
6171
+ */
6172
+ function stylisticJsxRules({ jsx = true } = {}) {
6173
+ return jsx ? { "style/jsx-curly-brace-presence": ["error", { propElementValues: "always" }] } : {};
6174
+ }
5992
6175
  //#endregion
5993
6176
  //#region src/eslint/configs/stylistic.ts
5994
6177
  init_globs();
@@ -6012,25 +6195,47 @@ function stylistic(options = {}) {
6012
6195
  quotes,
6013
6196
  semi
6014
6197
  });
6015
- return [{
6016
- name: "isentinel/stylistic/setup",
6017
- plugins: {
6018
- antfu: pluginAntfu,
6019
- style: pluginStylistic
6020
- }
6021
- }, {
6022
- name: "isentinel/stylistic",
6023
- files: [GLOB_SRC],
6024
- rules: {
6025
- ...config.rules,
6026
- ...stylisticRules({
6027
- indent,
6028
- jsx,
6029
- quotes,
6030
- semi
6031
- })
6032
- }
6033
- }];
6198
+ const presetRules = Object.entries(config.rules ?? {});
6199
+ return [
6200
+ {
6201
+ name: "isentinel/stylistic/setup",
6202
+ plugins: {
6203
+ antfu: pluginAntfu,
6204
+ style: pluginStylistic
6205
+ }
6206
+ },
6207
+ {
6208
+ name: "isentinel/stylistic",
6209
+ files: [GLOB_SRC],
6210
+ rules: {
6211
+ ...Object.fromEntries(presetRules.filter((entry) => !isJsxRule(entry))),
6212
+ ...stylisticRules({
6213
+ indent,
6214
+ jsx,
6215
+ quotes,
6216
+ semi
6217
+ })
6218
+ }
6219
+ },
6220
+ ...jsx === false ? [] : [{
6221
+ name: "isentinel/stylistic/jsx",
6222
+ files: [GLOB_JSX, GLOB_TSX],
6223
+ rules: {
6224
+ ...Object.fromEntries(presetRules.filter(isJsxRule)),
6225
+ ...stylisticJsxRules({ jsx })
6226
+ }
6227
+ }]
6228
+ ];
6229
+ }
6230
+ /**
6231
+ * The preset's `style/jsx-*` rules only report on JSX, which a `.ts` or `.js`
6232
+ * file cannot contain, so they go to their own JSX/TSX-scoped block.
6233
+ *
6234
+ * @param entry - A `[name, entry]` pair from the preset rules.
6235
+ * @returns Whether the rule is a `style/jsx-*` rule.
6236
+ */
6237
+ function isJsxRule([name]) {
6238
+ return name.startsWith("style/jsx-");
6034
6239
  }
6035
6240
  //#endregion
6036
6241
  //#region src/rules/test.ts
@@ -6083,6 +6288,7 @@ function jestExtendedRules() {
6083
6288
  */
6084
6289
  function jestRules({ extended = false, isInEditor = false, roblox: isRoblox = true, stylistic = true } = {}) {
6085
6290
  return {
6291
+ "flawless/no-incompatible-assertion-types": "error",
6086
6292
  "flawless/no-shared-mocks": "error",
6087
6293
  "flawless/prefer-expect-assertions-count": "error",
6088
6294
  "jest/consistent-test-it": "error",
@@ -6162,6 +6368,7 @@ function jestRules({ extended = false, isInEditor = false, roblox: isRoblox = tr
6162
6368
  function vitestRules({ extended = false, isInEditor = false, stylistic = true } = {}) {
6163
6369
  return {
6164
6370
  "flawless/no-conditional-in-test": ["error", { allowOptionalChaining: false }],
6371
+ "flawless/no-incompatible-assertion-types": "error",
6165
6372
  "flawless/no-shared-mocks": "error",
6166
6373
  "flawless/prefer-ending-with-an-expect": ["warn", { assertFunctionNames: [
6167
6374
  "expect",
@@ -6894,7 +7101,7 @@ async function unicorn({ complementIgnores, nameReplacements, roblox = true, roo
6894
7101
  ];
6895
7102
  }
6896
7103
  //#endregion
6897
- //#region ../../../setup-pnpm/node_modules/.bin/store/v11/links/@/eslint-plugin-yml/3.5.0/eedfb7e8cfd566a06319a5894d49f61723d6a8793c9b4a69e6556dd999563774/node_modules/eslint-plugin-yml/lib/chunk-CfYAbeIz.mjs
7104
+ //#region ../../../setup-pnpm/node_modules/.bin/store/v11/links/@/eslint-plugin-yml/3.5.0/dab6fa0a572e2f603776d82efad12c6f3caccb36940fd989e9c4ddfa6a0dd18e/node_modules/eslint-plugin-yml/lib/chunk-CfYAbeIz.mjs
6898
7105
  var __defProp$1, __exportAll$1;
6899
7106
  var init_chunk_CfYAbeIz = __esmMin((() => {
6900
7107
  __defProp$1 = Object.defineProperty;
@@ -10077,7 +10284,7 @@ var init_lib$1 = __esmMin((() => {
10077
10284
  ({ ...meta_exports$1 });
10078
10285
  }));
10079
10286
  //#endregion
10080
- //#region ../../../setup-pnpm/node_modules/.bin/store/v11/links/@/eslint-plugin-yml/3.5.0/eedfb7e8cfd566a06319a5894d49f61723d6a8793c9b4a69e6556dd999563774/node_modules/eslint-plugin-yml/lib/index.mjs
10287
+ //#region ../../../setup-pnpm/node_modules/.bin/store/v11/links/@/eslint-plugin-yml/3.5.0/dab6fa0a572e2f603776d82efad12c6f3caccb36940fd989e9c4ddfa6a0dd18e/node_modules/eslint-plugin-yml/lib/index.mjs
10081
10288
  var lib_exports = /* @__PURE__ */ __exportAll$2({
10082
10289
  configs: () => configs,
10083
10290
  default: () => src_default,
@@ -15981,7 +16188,7 @@ var init_lib = __esmMin((() => {
15981
16188
  //#endregion
15982
16189
  //#region src/eslint/configs/yaml.ts
15983
16190
  init_globs();
15984
- async function yaml({ files = [GLOB_YAML, "**/github-actions-workflow"], overrides = {}, stylistic = true } = {}) {
16191
+ async function yaml({ files = [GLOB_YAML, "**/github-actions-workflow"], overrides = {}, prettierOptions = {}, stylistic = true } = {}) {
15985
16192
  const [pluginYaml, parserYaml, eslintPluginFlawless] = await Promise.all([
15986
16193
  interopDefault(Promise.resolve().then(() => (init_lib(), lib_exports))),
15987
16194
  interopDefault(import("yaml-eslint-parser")),
@@ -16008,6 +16215,13 @@ async function yaml({ files = [GLOB_YAML, "**/github-actions-workflow"], overrid
16008
16215
  "yaml/plain-scalar": "error",
16009
16216
  ...stylistic !== false ? {
16010
16217
  "flawless/yaml-block-key-blank-lines": "error",
16218
+ "style/max-len": ["error", {
16219
+ code: prettierOptions.printWidth ?? 100,
16220
+ comments: Number(prettierOptions["jsdocPrintWidth"]) || 80,
16221
+ ignorePattern: String.raw`^\s*(?:-\s+)?uses:\s`,
16222
+ ignoreUrls: true,
16223
+ tabWidth: 2
16224
+ }],
16011
16225
  "yaml/block-mapping": "error",
16012
16226
  "yaml/block-mapping-colon-indicator-newline": "error",
16013
16227
  "yaml/block-mapping-question-indicator-newline": "error",
@@ -16105,6 +16319,8 @@ const typeAwarePrefixes = /* @__PURE__ */ new Set([
16105
16319
  const typeAwareRuleIds = /* @__PURE__ */ new Set([
16106
16320
  "eslint-plugin/no-property-in-node",
16107
16321
  "flawless/naming-convention",
16322
+ "flawless/no-ignored-return",
16323
+ "flawless/no-incompatible-assertion-types",
16108
16324
  "flawless/no-materialized-filter-map",
16109
16325
  "flawless/no-redundant-type-annotation",
16110
16326
  "flawless/no-reflect-set",
@@ -16364,6 +16580,8 @@ var init_adapters = __esmMin((() => {
16364
16580
  ]);
16365
16581
  typeAwareJsPluginRules = /* @__PURE__ */ new Set([
16366
16582
  "eslint-plugin/no-property-in-node",
16583
+ "flawless/no-ignored-return",
16584
+ "flawless/no-incompatible-assertion-types",
16367
16585
  "jest/no-error-equal",
16368
16586
  "jest/no-unnecessary-assertion",
16369
16587
  "jest/unbound-method",
@@ -16373,12 +16591,9 @@ var init_adapters = __esmMin((() => {
16373
16591
  "react/no-implicit-ref",
16374
16592
  "react/no-leaked-conditional-rendering",
16375
16593
  "react/no-unused-props",
16376
- "sonar/no-ignored-return",
16377
- "sonar/no-incompatible-assertion-types",
16378
16594
  "sonar/no-redundant-optional",
16379
16595
  "sonar/no-try-promise",
16380
16596
  "sonar/prefer-immediate-return",
16381
- "ts/prefer-destructuring",
16382
16597
  "unicorn/no-non-function-verb-prefix"
16383
16598
  ]);
16384
16599
  ESLINT_ONLY = "eslint-only";
@@ -16430,7 +16645,8 @@ var init_adapters = __esmMin((() => {
16430
16645
  "no-shadow",
16431
16646
  "no-unused-expressions",
16432
16647
  "no-unused-private-class-members",
16433
- "no-useless-constructor"
16648
+ "no-useless-constructor",
16649
+ "prefer-destructuring"
16434
16650
  ]);
16435
16651
  UNICORN_NATIVE_RENAMES = { "no-for-each": "no-array-for-each" };
16436
16652
  }));
@@ -16744,14 +16960,19 @@ var init_oxlint_capabilities = __esmMin((() => {
16744
16960
  "eslint-plugin/test-case-shorthand-strings",
16745
16961
  "eslint-plugin/unique-test-case-names",
16746
16962
  "flawless/arrow-return-style",
16963
+ "flawless/cognitive-complexity",
16747
16964
  "flawless/jsx-shorthand-boolean",
16748
16965
  "flawless/jsx-shorthand-fragment",
16966
+ "flawless/max-comment-length",
16749
16967
  "flawless/max-lines-per-function",
16750
16968
  "flawless/naming-convention",
16751
16969
  "flawless/no-conditional-empty-object-spread",
16752
16970
  "flawless/no-conditional-in-test",
16971
+ "flawless/no-em-dash",
16753
16972
  "flawless/no-export-default-arrow",
16754
16973
  "flawless/no-floating-point-equality",
16974
+ "flawless/no-ignored-return",
16975
+ "flawless/no-incompatible-assertion-types",
16755
16976
  "flawless/no-known-value-widening",
16756
16977
  "flawless/no-materialized-filter-map",
16757
16978
  "flawless/no-object-parameters",
@@ -16762,8 +16983,10 @@ var init_oxlint_capabilities = __esmMin((() => {
16762
16983
  "flawless/no-shape-in-symbol-names",
16763
16984
  "flawless/no-shared-mocks",
16764
16985
  "flawless/no-shared-test-state",
16986
+ "flawless/no-trivial-functions",
16765
16987
  "flawless/no-unknown-parameters",
16766
16988
  "flawless/no-unknown-returns",
16989
+ "flawless/no-unnecessary-prop-alias",
16767
16990
  "flawless/no-unnecessary-use-callback",
16768
16991
  "flawless/no-unnecessary-use-memo",
16769
16992
  "flawless/no-unsafe-dictionary-type",
@@ -16779,6 +17002,7 @@ var init_oxlint_capabilities = __esmMin((() => {
16779
17002
  "flawless/react-namespace",
16780
17003
  "flawless/toml-sort-keys",
16781
17004
  "flawless/yaml-block-key-blank-lines",
17005
+ "flawless/yaml-sort-sequence-by-key",
16782
17006
  "for-direction",
16783
17007
  "func-call-spacing",
16784
17008
  "func-name-matching",
@@ -16916,6 +17140,7 @@ var init_oxlint_capabilities = __esmMin((() => {
16916
17140
  "jsdoc/no-restricted-syntax",
16917
17141
  "jsdoc/no-types",
16918
17142
  "jsdoc/no-undefined-types",
17143
+ "jsdoc/no-unnecessary-type-assertion",
16919
17144
  "jsdoc/normalize-see-links",
16920
17145
  "jsdoc/prefer-import-tag",
16921
17146
  "jsdoc/reject-any-type",
@@ -16955,6 +17180,7 @@ var init_oxlint_capabilities = __esmMin((() => {
16955
17180
  "jsdoc/sort-tags",
16956
17181
  "jsdoc/tag-lines",
16957
17182
  "jsdoc/text-escaping",
17183
+ "jsdoc/ts-ban-ts-comment",
16958
17184
  "jsdoc/ts-method-signature-style",
16959
17185
  "jsdoc/ts-no-empty-object-type",
16960
17186
  "jsdoc/ts-no-unnecessary-template-expression",
@@ -17208,6 +17434,7 @@ var init_oxlint_capabilities = __esmMin((() => {
17208
17434
  "perfectionist/sort-array-includes",
17209
17435
  "perfectionist/sort-arrays",
17210
17436
  "perfectionist/sort-classes",
17437
+ "perfectionist/sort-constructor-parameters",
17211
17438
  "perfectionist/sort-decorators",
17212
17439
  "perfectionist/sort-enums",
17213
17440
  "perfectionist/sort-export-attributes",
@@ -17369,6 +17596,7 @@ var init_oxlint_capabilities = __esmMin((() => {
17369
17596
  "small-rules/ban-react-fc",
17370
17597
  "small-rules/ban-types",
17371
17598
  "small-rules/consistent-compound-words",
17599
+ "small-rules/curly",
17372
17600
  "small-rules/directive-disable-enable-pair",
17373
17601
  "small-rules/directive-no-aggregating-enable",
17374
17602
  "small-rules/directive-no-duplicate-disable",
@@ -17380,53 +17608,89 @@ var init_oxlint_capabilities = __esmMin((() => {
17380
17608
  "small-rules/enforce-ianitor-check-type",
17381
17609
  "small-rules/isolated-functions",
17382
17610
  "small-rules/memoized-effect-dependencies",
17611
+ "small-rules/no-adjust-state-on-prop-change",
17383
17612
  "small-rules/no-array-constructor-elements",
17384
17613
  "small-rules/no-array-constructor-index-assignment",
17385
17614
  "small-rules/no-array-size-assignment",
17386
17615
  "small-rules/no-async-constructor",
17387
17616
  "small-rules/no-async-in-system",
17388
17617
  "small-rules/no-cascading-set-state",
17618
+ "small-rules/no-chain-state-updates",
17619
+ "small-rules/no-chained-type-assertions",
17620
+ "small-rules/no-cliffy-action-wrapper",
17389
17621
  "small-rules/no-color3-constructor",
17390
17622
  "small-rules/no-commented-code",
17623
+ "small-rules/no-conditional-empty-object-spread",
17391
17624
  "small-rules/no-constant-condition-with-break",
17392
17625
  "small-rules/no-dead-store",
17626
+ "small-rules/no-derived-state",
17627
+ "small-rules/no-discarded-rejection",
17393
17628
  "small-rules/no-error",
17629
+ "small-rules/no-event-handler",
17394
17630
  "small-rules/no-events-in-events-callback",
17631
+ "small-rules/no-external-store-subscription",
17395
17632
  "small-rules/no-filter-map-chain",
17396
17633
  "small-rules/no-floating-point-equality",
17397
17634
  "small-rules/no-giant-component",
17398
17635
  "small-rules/no-god-components",
17636
+ "small-rules/no-has-before-remove-in-jecs",
17399
17637
  "small-rules/no-ianitor-in-function-body",
17400
17638
  "small-rules/no-ianitor-success-access",
17401
17639
  "small-rules/no-identity-map",
17402
17640
  "small-rules/no-increment-decrement",
17641
+ "small-rules/no-initialize-state",
17403
17642
  "small-rules/no-inline-property-on-memo-component",
17643
+ "small-rules/no-inline-signature-types",
17404
17644
  "small-rules/no-instance-methods-without-this",
17645
+ "small-rules/no-jsx-spread-child",
17646
+ "small-rules/no-known-value-widening",
17405
17647
  "small-rules/no-loop-iterable-mutation",
17648
+ "small-rules/no-module-mocking",
17649
+ "small-rules/no-multiple-cliffy-commands",
17406
17650
  "small-rules/no-native-properties-spread",
17651
+ "small-rules/no-nested-hook-calls",
17407
17652
  "small-rules/no-new-instance-in-use-memo",
17653
+ "small-rules/no-object-parameters",
17654
+ "small-rules/no-pass-data-to-parent",
17655
+ "small-rules/no-pass-live-state-to-parent",
17408
17656
  "small-rules/no-print",
17657
+ "small-rules/no-real-temporary-directory",
17409
17658
  "small-rules/no-recursive",
17659
+ "small-rules/no-reduce-accumulator-copy",
17410
17660
  "small-rules/no-redundant-aspect-ratio-constraint",
17661
+ "small-rules/no-reflect-apply",
17662
+ "small-rules/no-reflect-get",
17411
17663
  "small-rules/no-render-helper-functions",
17664
+ "small-rules/no-reset-all-state-on-prop-change",
17412
17665
  "small-rules/no-restricted-property-assignment",
17666
+ "small-rules/no-runtime-in-type-files",
17667
+ "small-rules/no-runtime-typeof",
17668
+ "small-rules/no-shape-in-symbol-names",
17413
17669
  "small-rules/no-spec-file-extension",
17414
17670
  "small-rules/no-static-react-create-element",
17415
17671
  "small-rules/no-table-create-map",
17416
17672
  "small-rules/no-task-wait",
17673
+ "small-rules/no-test-timeout",
17417
17674
  "small-rules/no-trivial-assertions",
17418
17675
  "small-rules/no-underscore-react-props",
17676
+ "small-rules/no-unknown-parameters",
17677
+ "small-rules/no-unknown-returns",
17678
+ "small-rules/no-unknown-type-aliases",
17679
+ "small-rules/no-unsafe-dictionary-type",
17680
+ "small-rules/no-unsupported-syntax",
17419
17681
  "small-rules/no-unused-imports",
17420
17682
  "small-rules/no-unused-use-memo",
17421
17683
  "small-rules/no-use-memo-simple-expression",
17422
17684
  "small-rules/no-use-of-empty-return-value",
17423
17685
  "small-rules/no-useless-constants",
17424
17686
  "small-rules/no-useless-default",
17687
+ "small-rules/no-useless-empty-string-comparison",
17425
17688
  "small-rules/no-useless-use-effect",
17426
17689
  "small-rules/no-useless-use-memo",
17427
17690
  "small-rules/no-useless-use-spring",
17428
17691
  "small-rules/no-variadic-spread",
17429
17692
  "small-rules/no-warn",
17693
+ "small-rules/no-widen-then-assert",
17430
17694
  "small-rules/only-type-imports",
17431
17695
  "small-rules/prefer-class-properties",
17432
17696
  "small-rules/prefer-constant-dispatch",
@@ -17439,12 +17703,15 @@ var init_oxlint_capabilities = __esmMin((() => {
17439
17703
  "small-rules/prefer-idiv",
17440
17704
  "small-rules/prefer-local-portal-component",
17441
17705
  "small-rules/prefer-math-min-max",
17706
+ "small-rules/prefer-membership-filter-in-jecs",
17442
17707
  "small-rules/prefer-modding-inspect",
17443
17708
  "small-rules/prefer-module-scope-constants",
17709
+ "small-rules/prefer-native-collection-copy",
17710
+ "small-rules/prefer-optional-parameter",
17444
17711
  "small-rules/prefer-padding-components",
17445
17712
  "small-rules/prefer-pascal-case-enums",
17446
17713
  "small-rules/prefer-sequence-overloads",
17447
- "small-rules/prefer-single-world-query",
17714
+ "small-rules/prefer-single-world-query-in-jecs",
17448
17715
  "small-rules/prefer-singular-enums",
17449
17716
  "small-rules/prefer-ternary-conditional-rendering",
17450
17717
  "small-rules/prefer-udim2-shorthand",
@@ -17457,10 +17724,14 @@ var init_oxlint_capabilities = __esmMin((() => {
17457
17724
  "small-rules/require-paired-calls",
17458
17725
  "small-rules/require-react-component-keys",
17459
17726
  "small-rules/require-react-display-names",
17727
+ "small-rules/require-readable-spacing",
17728
+ "small-rules/require-safety-comment-for-type-assertion",
17460
17729
  "small-rules/require-switch-case-braces",
17461
17730
  "small-rules/require-throw-error-capture",
17731
+ "small-rules/require-tsx-for-hooks",
17462
17732
  "small-rules/require-unicode-regex",
17463
17733
  "small-rules/rerender-memo-with-default-value",
17734
+ "small-rules/starts-with-verb",
17464
17735
  "small-rules/strict-component-boundaries",
17465
17736
  "small-rules/use-exhaustive-dependencies",
17466
17737
  "small-rules/use-hook-at-top-level",
@@ -18454,6 +18725,8 @@ var init_oxlint_capabilities = __esmMin((() => {
18454
18725
  typeAwareJsPluginRuleNames = /* @__PURE__ */ new Set([
18455
18726
  "eslint-plugin/no-property-in-node",
18456
18727
  "flawless/naming-convention",
18728
+ "flawless/no-ignored-return",
18729
+ "flawless/no-incompatible-assertion-types",
18457
18730
  "flawless/no-materialized-filter-map",
18458
18731
  "flawless/no-redundant-type-annotation",
18459
18732
  "flawless/no-reflect-set",
@@ -18697,13 +18970,18 @@ var init_oxlint_capabilities = __esmMin((() => {
18697
18970
  "eslint-plugin/test-case-shorthand-strings",
18698
18971
  "eslint-plugin/unique-test-case-names",
18699
18972
  "flawless/arrow-return-style",
18973
+ "flawless/cognitive-complexity",
18700
18974
  "flawless/jsx-shorthand-boolean",
18701
18975
  "flawless/jsx-shorthand-fragment",
18976
+ "flawless/max-comment-length",
18702
18977
  "flawless/max-lines-per-function",
18703
18978
  "flawless/no-conditional-empty-object-spread",
18704
18979
  "flawless/no-conditional-in-test",
18980
+ "flawless/no-em-dash",
18705
18981
  "flawless/no-export-default-arrow",
18706
18982
  "flawless/no-floating-point-equality",
18983
+ "flawless/no-ignored-return",
18984
+ "flawless/no-incompatible-assertion-types",
18707
18985
  "flawless/no-known-value-widening",
18708
18986
  "flawless/no-materialized-filter-map",
18709
18987
  "flawless/no-object-parameters",
@@ -18712,7 +18990,10 @@ var init_oxlint_capabilities = __esmMin((() => {
18712
18990
  "flawless/no-reflect-set",
18713
18991
  "flawless/no-shape-in-symbol-names",
18714
18992
  "flawless/no-shared-mocks",
18993
+ "flawless/no-trivial-functions",
18994
+ "flawless/no-unknown-parameters",
18715
18995
  "flawless/no-unknown-returns",
18996
+ "flawless/no-unnecessary-prop-alias",
18716
18997
  "flawless/no-unnecessary-use-callback",
18717
18998
  "flawless/no-unnecessary-use-memo",
18718
18999
  "flawless/no-unsafe-dictionary-type",
@@ -19082,7 +19363,6 @@ var init_oxlint_capabilities = __esmMin((() => {
19082
19363
  "small-rules/require-async-suffix",
19083
19364
  "small-rules/strict-component-boundaries",
19084
19365
  "sonar/bool-param-default",
19085
- "sonar/cognitive-complexity",
19086
19366
  "sonar/constructor-for-side-effects",
19087
19367
  "sonar/destructuring-assignment-syntax",
19088
19368
  "sonar/elseif-without-else",
@@ -19099,13 +19379,10 @@ var init_oxlint_capabilities = __esmMin((() => {
19099
19379
  "sonar/no-duplicated-branches",
19100
19380
  "sonar/no-element-overwrite",
19101
19381
  "sonar/no-empty-collection",
19102
- "sonar/no-floating-point-equality",
19103
19382
  "sonar/no-gratuitous-expressions",
19104
19383
  "sonar/no-identical-conditions",
19105
19384
  "sonar/no-identical-expressions",
19106
19385
  "sonar/no-identical-functions",
19107
- "sonar/no-ignored-return",
19108
- "sonar/no-incompatible-assertion-types",
19109
19386
  "sonar/no-inverted-boolean-check",
19110
19387
  "sonar/no-mixed-completion-style",
19111
19388
  "sonar/no-nested-conditional",
@@ -19846,16 +20123,24 @@ var init_oxlint_native = __esmMin((() => {
19846
20123
  "react-perf/jsx-no-new-function-as-prop",
19847
20124
  "react-perf/jsx-no-new-object-as-prop",
19848
20125
  "react/button-has-type",
20126
+ "react/capitalized-calls",
19849
20127
  "react/checked-requires-onchange-or-readonly",
19850
20128
  "react/display-name",
20129
+ "react/error-boundaries",
19851
20130
  "react/exhaustive-deps",
20131
+ "react/exhaustive-effect-dependencies",
19852
20132
  "react/forbid-component-props",
19853
20133
  "react/forbid-dom-props",
19854
20134
  "react/forbid-elements",
19855
20135
  "react/forward-ref-uses-ref",
19856
20136
  "react/function-component-definition",
20137
+ "react/globals",
19857
20138
  "react/hook-use-state",
20139
+ "react/hooks",
19858
20140
  "react/iframe-missing-sandbox",
20141
+ "react/immutability",
20142
+ "react/incompatible-library",
20143
+ "react/invariant",
19859
20144
  "react/jsx-boolean-value",
19860
20145
  "react/jsx-curly-brace-presence",
19861
20146
  "react/jsx-filename-extension",
@@ -19874,11 +20159,13 @@ var init_oxlint_native = __esmMin((() => {
19874
20159
  "react/jsx-pascal-case",
19875
20160
  "react/jsx-props-no-spread-multi",
19876
20161
  "react/jsx-props-no-spreading",
20162
+ "react/memo-dependencies",
19877
20163
  "react/no-array-index-key",
19878
20164
  "react/no-children-prop",
19879
20165
  "react/no-clone-element",
19880
20166
  "react/no-danger",
19881
20167
  "react/no-danger-with-children",
20168
+ "react/no-deriving-state-in-effects",
19882
20169
  "react/no-did-mount-set-state",
19883
20170
  "react/no-did-update-set-state",
19884
20171
  "react/no-direct-mutation-state",
@@ -19901,14 +20188,25 @@ var init_oxlint_native = __esmMin((() => {
19901
20188
  "react/only-export-components",
19902
20189
  "react/prefer-es6-class",
19903
20190
  "react/prefer-function-component",
19904
- "react/react-compiler",
20191
+ "react/preserve-manual-memoization",
20192
+ "react/purity",
19905
20193
  "react/react-in-jsx-scope",
20194
+ "react/refs",
19906
20195
  "react/require-render-return",
20196
+ "react/rule-suppression",
19907
20197
  "react/rules-of-hooks",
19908
20198
  "react/self-closing-comp",
20199
+ "react/set-state-in-effect",
20200
+ "react/set-state-in-render",
19909
20201
  "react/state-in-constructor",
20202
+ "react/static-components",
19910
20203
  "react/style-prop-object",
20204
+ "react/syntax",
20205
+ "react/todo",
20206
+ "react/unsupported-syntax",
20207
+ "react/use-memo",
19911
20208
  "react/void-dom-elements-no-children",
20209
+ "react/void-use-memo",
19912
20210
  "require-await",
19913
20211
  "require-unicode-regexp",
19914
20212
  "require-yield",
@@ -19950,6 +20248,7 @@ var init_oxlint_native = __esmMin((() => {
19950
20248
  "typescript/no-extraneous-class",
19951
20249
  "typescript/no-floating-promises",
19952
20250
  "typescript/no-for-in-array",
20251
+ "typescript/no-generated-empty-object-type",
19953
20252
  "typescript/no-implied-eval",
19954
20253
  "typescript/no-import-type-side-effects",
19955
20254
  "typescript/no-inferrable-types",
@@ -19981,6 +20280,7 @@ var init_oxlint_native = __esmMin((() => {
19981
20280
  "typescript/no-unsafe-assignment",
19982
20281
  "typescript/no-unsafe-call",
19983
20282
  "typescript/no-unsafe-declaration-merging",
20283
+ "typescript/no-unsafe-enum-assignment",
19984
20284
  "typescript/no-unsafe-enum-comparison",
19985
20285
  "typescript/no-unsafe-function-type",
19986
20286
  "typescript/no-unsafe-member-access",
@@ -20301,6 +20601,7 @@ var init_oxlint_native = __esmMin((() => {
20301
20601
  "typescript/no-duplicate-type-constituents",
20302
20602
  "typescript/no-floating-promises",
20303
20603
  "typescript/no-for-in-array",
20604
+ "typescript/no-generated-empty-object-type",
20304
20605
  "typescript/no-implied-eval",
20305
20606
  "typescript/no-meaningless-void-operator",
20306
20607
  "typescript/no-misused-promises",
@@ -20318,6 +20619,7 @@ var init_oxlint_native = __esmMin((() => {
20318
20619
  "typescript/no-unsafe-argument",
20319
20620
  "typescript/no-unsafe-assignment",
20320
20621
  "typescript/no-unsafe-call",
20622
+ "typescript/no-unsafe-enum-assignment",
20321
20623
  "typescript/no-unsafe-enum-comparison",
20322
20624
  "typescript/no-unsafe-member-access",
20323
20625
  "typescript/no-unsafe-return",
@@ -20504,7 +20806,6 @@ var init_routing = __esmMin((() => {
20504
20806
  "sentinel/explicit-size-check"
20505
20807
  ]);
20506
20808
  KNOWN_INCOMPATIBLE_RULES = {
20507
- "jsdoc/require-param": "Oxlint applies an unexported outer function's JSDoc to a nested function (https://github.com/oxc-project/oxc/issues/27470).",
20508
20809
  "style/jsx-function-call-newline": "Formatting-rule ownership remains with ESLint and oxfmt.",
20509
20810
  "ts/no-shadow": "Oxlint skips every member of a declare namespace or declare module in .d.ts files (https://github.com/oxc-project/oxc/issues/27469).",
20510
20811
  "unicorn/no-missing-local-resource": "The preset only enables this rule for Markdown virtual files, which Oxlint cannot lint.",
@@ -20512,9 +20813,9 @@ var init_routing = __esmMin((() => {
20512
20813
  "vitest/prefer-each": "Oxlint ignores where test functions are imported from (https://github.com/oxc-project/oxc/issues/27471)."
20513
20814
  };
20514
20815
  JS_PLUGIN_PREFERRED_RULES = /* @__PURE__ */ new Set([
20515
- "id-length",
20516
20816
  "no-loop-func",
20517
- "unicorn/no-lonely-if"
20817
+ "unicorn/no-lonely-if",
20818
+ "unicorn/no-useless-undefined"
20518
20819
  ]);
20519
20820
  }));
20520
20821
  //#endregion
@@ -20858,19 +21159,10 @@ async function isentinel(options, ...userConfigs) {
20858
21159
  config: enableGitignore,
20859
21160
  explicit: "gitignore" in options
20860
21161
  }));
20861
- const markdownCodeWidths = formatter === "standalone" || formatters !== false && shouldEnableFeature(formatters, "markdown") ? {
20862
- markdownCode: markdownOxfmtOptions(prettierSettings["jsdocPrintWidth"]),
20863
- markdownCodeOverrides: [
20864
- ...markdownOverridesOf(sectionOverrides),
20865
- ...oxfmtConfig.markdownOverrides ?? [],
20866
- ...markdownOverridesOf(prettierSettings["overrides"])
20867
- ]
20868
- } : {};
20869
21162
  configs.push(smallRules({
20870
21163
  isInEditor,
20871
21164
  stylistic: stylisticOptions
20872
21165
  }), comments({
20873
- ...markdownCodeWidths,
20874
21166
  prettierOptions: widthSettings,
20875
21167
  stylistic: stylisticOptions
20876
21168
  }), flawless({
@@ -20878,7 +21170,6 @@ async function isentinel(options, ...userConfigs) {
20878
21170
  ..."tsconfigPath" in typescriptOptions ? { tsconfigPath: typescriptOptions.tsconfigPath } : {},
20879
21171
  ..."typeAware" in typescriptOptions ? { typeAware: typescriptOptions.typeAware } : {},
20880
21172
  antiSlop,
20881
- ...markdownCodeWidths,
20882
21173
  roblox: enableRoblox,
20883
21174
  stylistic: stylisticOptions
20884
21175
  }, widthSettings), ignores(options.ignores), imports({
@@ -20982,6 +21273,7 @@ async function isentinel(options, ...userConfigs) {
20982
21273
  if (enableYaml !== false && !typeAwareOnly) {
20983
21274
  configs.push(yaml({
20984
21275
  ...getOverrides(options, "yaml"),
21276
+ prettierOptions: widthSettings,
20985
21277
  stylistic: stylisticOptions
20986
21278
  }));
20987
21279
  if (stylisticOptions !== false) configs.push(sortGithubAction());
@@ -21002,6 +21294,7 @@ async function isentinel(options, ...userConfigs) {
21002
21294
  }
21003
21295
  if (enableMarkdown !== false && !typeAwareOnly) configs.push(markdown({
21004
21296
  ...getOverrides(options, "markdown"),
21297
+ antiSlop,
21005
21298
  componentExts: componentExtensions,
21006
21299
  type: projectType
21007
21300
  }));
@@ -21033,6 +21326,7 @@ async function isentinel(options, ...userConfigs) {
21033
21326
  yaml: false
21034
21327
  } : formatters,
21035
21328
  oxfmtConfigOptions,
21329
+ oxfmtIgnorePatterns: oxfmtConfig.ignorePatterns,
21036
21330
  oxfmtOptions: formatterOptions.oxfmtOptions,
21037
21331
  oxlint: oxlintMode === "full",
21038
21332
  prettierOptions: prettierSettings,