@isentinel/eslint-config 6.0.0-beta.41 → 6.0.0-beta.43

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/README.md CHANGED
@@ -890,6 +890,49 @@ otherwise, you can install them manually:
890
890
  pnpm i -D eslint-plugin-eslint-plugin
891
891
  ```
892
892
 
893
+ #### Co-located Tests
894
+
895
+ `projectStructure` requires every source file to sit next to its test file,
896
+ through
897
+ [eslint-plugin-project-structure](https://github.com/Igorkowalski94/eslint-plugin-project-structure).
898
+ `src/place-service.ts` then has to be joined by `src/place-service.spec.ts`.
899
+ Only `enforceExistence` is driven here, so the rule never enforces naming:
900
+
901
+ ```ts
902
+ // eslint.config.ts
903
+ import isentinel from "@isentinel/eslint-config";
904
+
905
+ export default isentinel({
906
+ projectStructure: {
907
+ // The plugin's name placeholders, plus `{ext}` for the extension of the
908
+ // file that matched. Default: ["{node-name}.spec.{ext}"]
909
+ enforceExistence: "__tests__/{node-name}.test.{ext}",
910
+ // Default: every source file the preset lints
911
+ files: ["src/**/*.{ts,tsx}"],
912
+ // Default: tests, `.d.ts` files and build configs
913
+ ignores: ["**/index.ts"],
914
+ // Default: `process.cwd()`
915
+ projectRoot: import.meta.dirname,
916
+ // Restricts the check to one subtree. Default: all of `projectRoot`
917
+ structureRoot: "src",
918
+ },
919
+ });
920
+ ```
921
+
922
+ ```bash
923
+ pnpm i -D eslint-plugin-project-structure
924
+ ```
925
+
926
+ `{node-name}` matches the kebab-case filenames the preset enforces; the others
927
+ are `{nodeName}`, `{NodeName}`, `{node_name}` and `{NODE_NAME}`. A file already
928
+ matching a template is exempt from it. A source file with no test disables the
929
+ rule at the source.
930
+
931
+ Two caveats. Deleting `foo.spec.ts` does not change `foo.ts`, so a cached run
932
+ replays the old clean result — the check is only sound uncached. And the plugin
933
+ writes `projectStructure.cache.json` into `projectRoot` while it has something
934
+ to report, so gitignore it.
935
+
893
936
  ### Git hooks
894
937
 
895
938
  If you want to apply lint and auto-fix before every commit, use
package/dist/cli.mjs CHANGED
@@ -9,7 +9,7 @@ import path from "node:path";
9
9
  import { existsSync, readFileSync } from "fs";
10
10
  import { execSync } from "node:child_process";
11
11
  //#region package.json
12
- var version = "6.0.0-beta.41";
12
+ var version = "6.0.0-beta.43";
13
13
  var package_default = {
14
14
  name: "@isentinel/eslint-config",
15
15
  version,
@@ -155,6 +155,7 @@ var package_default = {
155
155
  "eslint-plugin-jest": "catalog:peer",
156
156
  "eslint-plugin-jest-extended": "catalog:peer",
157
157
  "eslint-plugin-n": "catalog:peer",
158
+ "eslint-plugin-project-structure": "catalog:peer",
158
159
  "eslint-plugin-react-jsx": "catalog:peer",
159
160
  "eslint-plugin-react-naming-convention": "catalog:peer",
160
161
  "eslint-plugin-react-x": "catalog:peer",
@@ -179,6 +180,7 @@ var package_default = {
179
180
  "eslint-plugin-jest": "^29.15.0",
180
181
  "eslint-plugin-jest-extended": "^3.0.0",
181
182
  "eslint-plugin-n": "^17.0.0 || ^18.0.0",
183
+ "eslint-plugin-project-structure": "^3.14.0",
182
184
  "eslint-plugin-react-jsx": "^5.10.0",
183
185
  "eslint-plugin-react-naming-convention": "^5.10.0",
184
186
  "eslint-plugin-react-x": "^5.10.0",
@@ -192,6 +194,7 @@ var package_default = {
192
194
  "eslint-plugin-jest": { "optional": true },
193
195
  "eslint-plugin-jest-extended": { "optional": true },
194
196
  "eslint-plugin-n": { "optional": true },
197
+ "eslint-plugin-project-structure": { "optional": true },
195
198
  "eslint-plugin-react-jsx": { "optional": true },
196
199
  "eslint-plugin-react-naming-convention": { "optional": true },
197
200
  "eslint-plugin-react-x": { "optional": true },
@@ -531,7 +534,7 @@ async function updateEslintFiles(result) {
531
534
  //#endregion
532
535
  //#region src/cli/constants-generated.ts
533
536
  const versionsMap = {
534
- "eslint": "10.7.0",
537
+ "eslint": "10.8.1",
535
538
  "eslint-plugin-jest": "29.16.0",
536
539
  "eslint-plugin-react-jsx": "5.17.3",
537
540
  "eslint-plugin-react-naming-convention": "5.17.3",
package/dist/index.d.mts CHANGED
@@ -6488,6 +6488,7 @@ interface OverrideSiteChains {
6488
6488
  jsonc: [JsoncRuleDefaults];
6489
6489
  markdown: [MarkdownRuleDefaults];
6490
6490
  naming: FeatureChain;
6491
+ projectStructure: FeatureChain;
6491
6492
  react: ReactChain;
6492
6493
  roblox: MainChain;
6493
6494
  toml: [TomlRuleDefaults];
@@ -6497,7 +6498,7 @@ interface OverrideSiteChains {
6497
6498
  type TestChain = [TestRuleDefaults, SourceFeatureRuleDefaults, MainRuleDefaults];
6498
6499
  type ValidateOptionsWith<O, VK extends VariantKey> = ValidateSite<O, "rules", MainChain, VK> & ValidateSubOptionsFromTable<O, OverrideSiteChains, VK> & ValidateTestOption<O, TestChain, VK>;
6499
6500
  //#endregion
6500
- //#region ../../../setup-pnpm/node_modules/.bin/store/v11/links/@/eslint-config-flat-gitignore/2.3.0/1320bd07004d149fd5c550ffda02aec5ecff7717d8f1602b7e9e51dffe8368d5/node_modules/eslint-config-flat-gitignore/dist/index.d.mts
6501
+ //#region ../../../setup-pnpm/node_modules/.bin/store/v11/links/@/eslint-config-flat-gitignore/2.3.0/0a594adbd94ca75e2950b1104992894d49bc93f4f2bc935ad192d7104e4c271e/node_modules/eslint-config-flat-gitignore/dist/index.d.mts
6501
6502
  interface FlatGitignoreOptions {
6502
6503
  /**
6503
6504
  * Name of the configuration.
@@ -7170,112 +7171,112 @@ interface RuleOptions {
7170
7171
  'eslint-plugin/unique-test-case-names'?: Linter.RuleEntry<[]>;
7171
7172
  /**
7172
7173
  * Enforce arrow function return style based on line length
7173
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.9.0/src/rules/arrow-return-style/documentation.md
7174
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.11.0/src/rules/arrow-return-style/documentation.md
7174
7175
  */
7175
7176
  'flawless/arrow-return-style'?: Linter.RuleEntry<FlawlessArrowReturnStyle>;
7176
7177
  /**
7177
7178
  * Disallow shorthand boolean JSX attributes
7178
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.9.0/src/rules/jsx-shorthand-boolean/documentation.md
7179
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.11.0/src/rules/jsx-shorthand-boolean/documentation.md
7179
7180
  */
7180
7181
  'flawless/jsx-shorthand-boolean'?: Linter.RuleEntry<[]>;
7181
7182
  /**
7182
7183
  * Enforce a consistent fragment form: the shorthand `<>...</>` or a named fragment
7183
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.9.0/src/rules/jsx-shorthand-fragment/documentation.md
7184
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.11.0/src/rules/jsx-shorthand-fragment/documentation.md
7184
7185
  */
7185
7186
  'flawless/jsx-shorthand-fragment'?: Linter.RuleEntry<FlawlessJsxShorthandFragment>;
7186
7187
  /**
7187
7188
  * Enforce a maximum number of lines of code in a function
7188
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.9.0/src/rules/max-lines-per-function/documentation.md
7189
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.11.0/src/rules/max-lines-per-function/documentation.md
7189
7190
  */
7190
7191
  'flawless/max-lines-per-function'?: Linter.RuleEntry<FlawlessMaxLinesPerFunction>;
7191
7192
  /**
7192
7193
  * Enforce naming conventions for everything across a codebase
7193
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.9.0/src/rules/naming-convention/documentation.md
7194
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.11.0/src/rules/naming-convention/documentation.md
7194
7195
  */
7195
7196
  'flawless/naming-convention'?: Linter.RuleEntry<FlawlessNamingConvention>;
7196
7197
  /**
7197
7198
  * Disallow conditional logic in tests
7198
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.9.0/src/rules/no-conditional-in-test/documentation.md
7199
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.11.0/src/rules/no-conditional-in-test/documentation.md
7199
7200
  */
7200
7201
  'flawless/no-conditional-in-test'?: Linter.RuleEntry<FlawlessNoConditionalInTest>;
7201
7202
  /**
7202
7203
  * Disallow anonymous arrow functions as export default declarations
7203
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.9.0/src/rules/no-export-default-arrow/documentation.md
7204
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.11.0/src/rules/no-export-default-arrow/documentation.md
7204
7205
  */
7205
7206
  'flawless/no-export-default-arrow'?: Linter.RuleEntry<[]>;
7206
7207
  /**
7207
7208
  * Disallow exact equality checks involving floating-point-sensitive values
7208
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.9.0/src/rules/no-floating-point-equality/documentation.md
7209
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.11.0/src/rules/no-floating-point-equality/documentation.md
7209
7210
  */
7210
7211
  'flawless/no-floating-point-equality'?: Linter.RuleEntry<[]>;
7211
7212
  /**
7212
7213
  * Disallow tsconfig options that redundantly re-set a value already provided by an extended config
7213
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.9.0/src/rules/no-redundant-tsconfig-options/documentation.md
7214
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.11.0/src/rules/no-redundant-tsconfig-options/documentation.md
7214
7215
  */
7215
7216
  'flawless/no-redundant-tsconfig-options'?: Linter.RuleEntry<[]>;
7216
7217
  /**
7217
7218
  * Disallow mocks created once and shared between tests
7218
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.9.0/src/rules/no-shared-mocks/documentation.md
7219
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.11.0/src/rules/no-shared-mocks/documentation.md
7219
7220
  */
7220
7221
  'flawless/no-shared-mocks'?: Linter.RuleEntry<[]>;
7221
7222
  /**
7222
7223
  * Disallow unnecessary usage of 'useCallback'
7223
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.9.0/src/rules/no-unnecessary-use-callback/documentation.md
7224
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.11.0/src/rules/no-unnecessary-use-callback/documentation.md
7224
7225
  */
7225
7226
  'flawless/no-unnecessary-use-callback'?: Linter.RuleEntry<[]>;
7226
7227
  /**
7227
7228
  * Disallow unnecessary usage of 'useMemo'
7228
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.9.0/src/rules/no-unnecessary-use-memo/documentation.md
7229
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.11.0/src/rules/no-unnecessary-use-memo/documentation.md
7229
7230
  */
7230
7231
  'flawless/no-unnecessary-use-memo'?: Linter.RuleEntry<[]>;
7231
7232
  /**
7232
7233
  * Enforce a blank line after `expect.assertions` and `expect.hasAssertions`
7233
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.9.0/src/rules/padding-after-expect-assertions/documentation.md
7234
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.11.0/src/rules/padding-after-expect-assertions/documentation.md
7234
7235
  */
7235
7236
  'flawless/padding-after-expect-assertions'?: Linter.RuleEntry<[]>;
7236
7237
  /**
7237
7238
  * Enforce destructuring assignment for component props
7238
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.9.0/src/rules/prefer-destructuring-assignment/documentation.md
7239
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.11.0/src/rules/prefer-destructuring-assignment/documentation.md
7239
7240
  */
7240
7241
  'flawless/prefer-destructuring-assignment'?: Linter.RuleEntry<[]>;
7241
7242
  /**
7242
7243
  * Prefer having the last statement in a test be an assertion
7243
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.9.0/src/rules/prefer-ending-with-an-expect/documentation.md
7244
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.11.0/src/rules/prefer-ending-with-an-expect/documentation.md
7244
7245
  */
7245
7246
  'flawless/prefer-ending-with-an-expect'?: Linter.RuleEntry<FlawlessPreferEndingWithAnExpect>;
7246
7247
  /**
7247
7248
  * Prefer `expect.assertions(<count>)` over `expect.hasAssertions()`
7248
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.9.0/src/rules/prefer-expect-assertions-count/documentation.md
7249
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.11.0/src/rules/prefer-expect-assertions-count/documentation.md
7249
7250
  */
7250
7251
  'flawless/prefer-expect-assertions-count'?: Linter.RuleEntry<[]>;
7251
7252
  /**
7252
7253
  * Enforce destructuring parameters in the function signature
7253
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.9.0/src/rules/prefer-parameter-destructuring/documentation.md
7254
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.11.0/src/rules/prefer-parameter-destructuring/documentation.md
7254
7255
  */
7255
7256
  'flawless/prefer-parameter-destructuring'?: Linter.RuleEntry<FlawlessPreferParameterDestructuring>;
7256
7257
  /**
7257
7258
  * Enforce that function component props are read-only
7258
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.9.0/src/rules/prefer-read-only-props/documentation.md
7259
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.11.0/src/rules/prefer-read-only-props/documentation.md
7259
7260
  */
7260
7261
  'flawless/prefer-read-only-props'?: Linter.RuleEntry<FlawlessPreferReadOnlyProps>;
7261
7262
  /**
7262
7263
  * Disallow impure calls such as `math.random` or `os.clock` during render
7263
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.9.0/src/rules/purity/documentation.md
7264
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.11.0/src/rules/purity/documentation.md
7264
7265
  */
7265
7266
  'flawless/purity'?: Linter.RuleEntry<FlawlessPurity>;
7266
7267
  /**
7267
7268
  * Prefer named imports for React runtime values and the React namespace for React types
7268
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.9.0/src/rules/react-namespace/documentation.md
7269
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.11.0/src/rules/react-namespace/documentation.md
7269
7270
  */
7270
7271
  'flawless/react-namespace'?: Linter.RuleEntry<[]>;
7271
7272
  /**
7272
7273
  * Enforce a configured sort order for TOML keys and tables
7273
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.9.0/src/rules/toml-sort-keys/documentation.md
7274
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.11.0/src/rules/toml-sort-keys/documentation.md
7274
7275
  */
7275
7276
  'flawless/toml-sort-keys'?: Linter.RuleEntry<FlawlessTomlSortKeys>;
7276
7277
  /**
7277
7278
  * Enforce blank lines around top-level YAML block collection keys
7278
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.9.0/src/rules/yaml-block-key-blank-lines/documentation.md
7279
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.11.0/src/rules/yaml-block-key-blank-lines/documentation.md
7279
7280
  */
7280
7281
  'flawless/yaml-block-key-blank-lines'?: Linter.RuleEntry<[]>;
7281
7282
  /**
@@ -10470,6 +10471,21 @@ interface RuleOptions {
10470
10471
  * @see https://eslint.org/docs/latest/rules/preserve-caught-error
10471
10472
  */
10472
10473
  'preserve-caught-error'?: Linter.RuleEntry<PreserveCaughtError>;
10474
+ /**
10475
+ * Enforce advanced naming rules and prohibit the use of given selectors in a given file. Have full control over what your file can contain and the naming conventions it must follow.
10476
+ * @see https://github.com/Igorkowalski94/eslint-plugin-project-structure/wiki/project%E2%80%91structure-%E2%80%8Bfile%E2%80%91composition#root
10477
+ */
10478
+ 'project-structure/file-composition'?: Linter.RuleEntry<ProjectStructureFileComposition>;
10479
+ /**
10480
+ * Enforce rules on folder structure to keep your repository consistent, orderly and well thought out.
10481
+ * @see https://github.com/Igorkowalski94/eslint-plugin-project-structure/wiki/project%E2%80%91structure-%E2%80%8Bfolder%E2%80%91structure#root
10482
+ */
10483
+ 'project-structure/folder-structure'?: Linter.RuleEntry<ProjectStructureFolderStructure>;
10484
+ /**
10485
+ * A key principle of a healthy project is to prevent the creation of a massive dependency tree, where removing or editing one feature triggers a chain reaction that impacts the entire project. Create independent modules to keep your project scalable and easy to maintain. Get rid of dependencies between modules and create truly independent functionalities.
10486
+ * @see https://github.com/Igorkowalski94/eslint-plugin-project-structure/wiki/project%E2%80%91structure-%E2%80%8Bindependent%E2%80%91modules#root
10487
+ */
10488
+ 'project-structure/independent-modules'?: Linter.RuleEntry<ProjectStructureIndependentModules>;
10473
10489
  /**
10474
10490
  * Require returning inside each `then()` to create readable and reusable Promise chains.
10475
10491
  * @see https://github.com/eslint-community/eslint-plugin-promise/blob/main/docs/rules/always-return.md
@@ -17163,6 +17179,16 @@ type _FlawlessNamingConventionFormatOptionsConfig = (_FlawlessNamingConventionPr
17163
17179
  type _FlawlessNamingConventionPredefinedFormats = ("camelCase" | "strictCamelCase" | "PascalCase" | "StrictPascalCase" | "snake_case" | "UPPER_CASE");
17164
17180
  type _FlawlessNamingConventionUnderscoreOptions = ("forbid" | "allow" | "require" | "requireDouble" | "allowDouble" | "allowSingleOrDouble");
17165
17181
  type _FlawlessNamingConvention_PrefixSuffixConfig = string[];
17182
+ type _FlawlessNamingConvention_TypeArgumentReferenceMatcher = (_FlawlessNamingConventionTypeArgumentReferenceMatcher & {
17183
+ name?: string;
17184
+ from?: string;
17185
+ });
17186
+ type _FlawlessNamingConventionTypeArgumentReferenceMatcher = ({
17187
+ [k: string]: unknown | undefined;
17188
+ } | {
17189
+ [k: string]: unknown | undefined;
17190
+ });
17191
+ type _FlawlessNamingConvention_TypeArgumentOfConfig = _FlawlessNamingConvention_TypeArgumentReferenceMatcher[];
17166
17192
  type _FlawlessNamingConventionTypeMatcher = (("boolean" | "string" | "number" | "function" | "array") | _FlawlessNamingConvention_TypeReferenceMatcher);
17167
17193
  type _FlawlessNamingConvention_TypeReferenceMatcher = (_FlawlessNamingConventionTypeReferenceMatcher & {
17168
17194
  name?: string;
@@ -17205,6 +17231,7 @@ type FlawlessNamingConvention = ({
17205
17231
  filter?: (string | _FlawlessNamingConvention_MatchRegexConfig);
17206
17232
  modifiers?: ("const" | "readonly" | "static" | "public" | "protected" | "private" | "#private" | "abstract" | "destructured" | "global" | "exported" | "unused" | "requiresQuotes" | "override" | "async" | "default" | "namespace" | "constAsserted")[];
17207
17233
  selector: ("default" | "variableLike" | "memberLike" | "typeLike" | "method" | "property" | "accessor" | "variable" | "function" | "parameter" | "objectStyleEnum" | "parameterProperty" | "classicAccessor" | "enumMember" | "objectStyleEnumMember" | "classMethod" | "objectLiteralMethod" | "typeMethod" | "classProperty" | "objectLiteralProperty" | "typeProperty" | "autoAccessor" | "class" | "interface" | "typeAlias" | "enum" | "typeParameter" | "import")[];
17234
+ typeArgumentOf?: _FlawlessNamingConvention_TypeArgumentOfConfig;
17208
17235
  types?: _FlawlessNamingConventionTypeMatcher[];
17209
17236
  } | {
17210
17237
  allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
@@ -17217,6 +17244,7 @@ type FlawlessNamingConvention = ({
17217
17244
  trailingUnderscore?: _FlawlessNamingConventionUnderscoreOptions;
17218
17245
  filter?: (string | _FlawlessNamingConvention_MatchRegexConfig);
17219
17246
  selector: "default";
17247
+ typeArgumentOf?: _FlawlessNamingConvention_TypeArgumentOfConfig;
17220
17248
  modifiers?: ("const" | "readonly" | "static" | "public" | "protected" | "private" | "#private" | "abstract" | "destructured" | "global" | "exported" | "unused" | "requiresQuotes" | "override" | "async" | "default" | "namespace" | "constAsserted")[];
17221
17249
  } | {
17222
17250
  allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
@@ -17229,6 +17257,7 @@ type FlawlessNamingConvention = ({
17229
17257
  trailingUnderscore?: _FlawlessNamingConventionUnderscoreOptions;
17230
17258
  filter?: (string | _FlawlessNamingConvention_MatchRegexConfig);
17231
17259
  selector: "variableLike";
17260
+ typeArgumentOf?: _FlawlessNamingConvention_TypeArgumentOfConfig;
17232
17261
  modifiers?: ("unused" | "async")[];
17233
17262
  } | {
17234
17263
  allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
@@ -17241,6 +17270,7 @@ type FlawlessNamingConvention = ({
17241
17270
  trailingUnderscore?: _FlawlessNamingConventionUnderscoreOptions;
17242
17271
  filter?: (string | _FlawlessNamingConvention_MatchRegexConfig);
17243
17272
  selector: "variable";
17273
+ typeArgumentOf?: _FlawlessNamingConvention_TypeArgumentOfConfig;
17244
17274
  modifiers?: ("const" | "constAsserted" | "destructured" | "exported" | "global" | "unused" | "async")[];
17245
17275
  types?: _FlawlessNamingConventionTypeMatcher[];
17246
17276
  } | {
@@ -17254,6 +17284,7 @@ type FlawlessNamingConvention = ({
17254
17284
  trailingUnderscore?: _FlawlessNamingConventionUnderscoreOptions;
17255
17285
  filter?: (string | _FlawlessNamingConvention_MatchRegexConfig);
17256
17286
  selector: "function";
17287
+ typeArgumentOf?: _FlawlessNamingConvention_TypeArgumentOfConfig;
17257
17288
  modifiers?: ("exported" | "global" | "unused" | "async")[];
17258
17289
  types?: _FlawlessNamingConventionTypeMatcher[];
17259
17290
  } | {
@@ -17267,6 +17298,7 @@ type FlawlessNamingConvention = ({
17267
17298
  trailingUnderscore?: _FlawlessNamingConventionUnderscoreOptions;
17268
17299
  filter?: (string | _FlawlessNamingConvention_MatchRegexConfig);
17269
17300
  selector: "parameter";
17301
+ typeArgumentOf?: _FlawlessNamingConvention_TypeArgumentOfConfig;
17270
17302
  modifiers?: ("destructured" | "unused")[];
17271
17303
  types?: _FlawlessNamingConventionTypeMatcher[];
17272
17304
  } | {
@@ -17280,6 +17312,7 @@ type FlawlessNamingConvention = ({
17280
17312
  trailingUnderscore?: _FlawlessNamingConventionUnderscoreOptions;
17281
17313
  filter?: (string | _FlawlessNamingConvention_MatchRegexConfig);
17282
17314
  selector: "objectStyleEnum";
17315
+ typeArgumentOf?: _FlawlessNamingConvention_TypeArgumentOfConfig;
17283
17316
  modifiers?: ("const" | "exported" | "global" | "unused")[];
17284
17317
  } | {
17285
17318
  allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
@@ -17292,6 +17325,7 @@ type FlawlessNamingConvention = ({
17292
17325
  trailingUnderscore?: _FlawlessNamingConventionUnderscoreOptions;
17293
17326
  filter?: (string | _FlawlessNamingConvention_MatchRegexConfig);
17294
17327
  selector: "memberLike";
17328
+ typeArgumentOf?: _FlawlessNamingConvention_TypeArgumentOfConfig;
17295
17329
  modifiers?: ("abstract" | "private" | "#private" | "protected" | "public" | "readonly" | "requiresQuotes" | "static" | "override" | "async")[];
17296
17330
  } | {
17297
17331
  allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
@@ -17304,6 +17338,7 @@ type FlawlessNamingConvention = ({
17304
17338
  trailingUnderscore?: _FlawlessNamingConventionUnderscoreOptions;
17305
17339
  filter?: (string | _FlawlessNamingConvention_MatchRegexConfig);
17306
17340
  selector: "classProperty";
17341
+ typeArgumentOf?: _FlawlessNamingConvention_TypeArgumentOfConfig;
17307
17342
  modifiers?: ("abstract" | "private" | "#private" | "protected" | "public" | "readonly" | "requiresQuotes" | "static" | "override")[];
17308
17343
  types?: _FlawlessNamingConventionTypeMatcher[];
17309
17344
  } | {
@@ -17317,6 +17352,7 @@ type FlawlessNamingConvention = ({
17317
17352
  trailingUnderscore?: _FlawlessNamingConventionUnderscoreOptions;
17318
17353
  filter?: (string | _FlawlessNamingConvention_MatchRegexConfig);
17319
17354
  selector: "objectLiteralProperty";
17355
+ typeArgumentOf?: _FlawlessNamingConvention_TypeArgumentOfConfig;
17320
17356
  modifiers?: ("public" | "requiresQuotes")[];
17321
17357
  types?: _FlawlessNamingConventionTypeMatcher[];
17322
17358
  } | {
@@ -17330,6 +17366,7 @@ type FlawlessNamingConvention = ({
17330
17366
  trailingUnderscore?: _FlawlessNamingConventionUnderscoreOptions;
17331
17367
  filter?: (string | _FlawlessNamingConvention_MatchRegexConfig);
17332
17368
  selector: "typeProperty";
17369
+ typeArgumentOf?: _FlawlessNamingConvention_TypeArgumentOfConfig;
17333
17370
  modifiers?: ("public" | "readonly" | "requiresQuotes")[];
17334
17371
  types?: _FlawlessNamingConventionTypeMatcher[];
17335
17372
  } | {
@@ -17343,6 +17380,7 @@ type FlawlessNamingConvention = ({
17343
17380
  trailingUnderscore?: _FlawlessNamingConventionUnderscoreOptions;
17344
17381
  filter?: (string | _FlawlessNamingConvention_MatchRegexConfig);
17345
17382
  selector: "parameterProperty";
17383
+ typeArgumentOf?: _FlawlessNamingConvention_TypeArgumentOfConfig;
17346
17384
  modifiers?: ("private" | "protected" | "public" | "readonly")[];
17347
17385
  types?: _FlawlessNamingConventionTypeMatcher[];
17348
17386
  } | {
@@ -17356,6 +17394,7 @@ type FlawlessNamingConvention = ({
17356
17394
  trailingUnderscore?: _FlawlessNamingConventionUnderscoreOptions;
17357
17395
  filter?: (string | _FlawlessNamingConvention_MatchRegexConfig);
17358
17396
  selector: "property";
17397
+ typeArgumentOf?: _FlawlessNamingConvention_TypeArgumentOfConfig;
17359
17398
  modifiers?: ("abstract" | "private" | "#private" | "protected" | "public" | "readonly" | "requiresQuotes" | "static" | "override" | "async")[];
17360
17399
  types?: _FlawlessNamingConventionTypeMatcher[];
17361
17400
  } | {
@@ -17369,6 +17408,7 @@ type FlawlessNamingConvention = ({
17369
17408
  trailingUnderscore?: _FlawlessNamingConventionUnderscoreOptions;
17370
17409
  filter?: (string | _FlawlessNamingConvention_MatchRegexConfig);
17371
17410
  selector: "classMethod";
17411
+ typeArgumentOf?: _FlawlessNamingConvention_TypeArgumentOfConfig;
17372
17412
  modifiers?: ("abstract" | "private" | "#private" | "protected" | "public" | "requiresQuotes" | "static" | "override" | "async")[];
17373
17413
  types?: _FlawlessNamingConventionTypeMatcher[];
17374
17414
  } | {
@@ -17382,6 +17422,7 @@ type FlawlessNamingConvention = ({
17382
17422
  trailingUnderscore?: _FlawlessNamingConventionUnderscoreOptions;
17383
17423
  filter?: (string | _FlawlessNamingConvention_MatchRegexConfig);
17384
17424
  selector: "objectLiteralMethod";
17425
+ typeArgumentOf?: _FlawlessNamingConvention_TypeArgumentOfConfig;
17385
17426
  modifiers?: ("public" | "requiresQuotes" | "async")[];
17386
17427
  types?: _FlawlessNamingConventionTypeMatcher[];
17387
17428
  } | {
@@ -17395,6 +17436,7 @@ type FlawlessNamingConvention = ({
17395
17436
  trailingUnderscore?: _FlawlessNamingConventionUnderscoreOptions;
17396
17437
  filter?: (string | _FlawlessNamingConvention_MatchRegexConfig);
17397
17438
  selector: "typeMethod";
17439
+ typeArgumentOf?: _FlawlessNamingConvention_TypeArgumentOfConfig;
17398
17440
  modifiers?: ("public" | "requiresQuotes")[];
17399
17441
  types?: _FlawlessNamingConventionTypeMatcher[];
17400
17442
  } | {
@@ -17408,6 +17450,7 @@ type FlawlessNamingConvention = ({
17408
17450
  trailingUnderscore?: _FlawlessNamingConventionUnderscoreOptions;
17409
17451
  filter?: (string | _FlawlessNamingConvention_MatchRegexConfig);
17410
17452
  selector: "method";
17453
+ typeArgumentOf?: _FlawlessNamingConvention_TypeArgumentOfConfig;
17411
17454
  modifiers?: ("abstract" | "private" | "#private" | "protected" | "public" | "requiresQuotes" | "static" | "override" | "async")[];
17412
17455
  types?: _FlawlessNamingConventionTypeMatcher[];
17413
17456
  } | {
@@ -17421,6 +17464,7 @@ type FlawlessNamingConvention = ({
17421
17464
  trailingUnderscore?: _FlawlessNamingConventionUnderscoreOptions;
17422
17465
  filter?: (string | _FlawlessNamingConvention_MatchRegexConfig);
17423
17466
  selector: "classicAccessor";
17467
+ typeArgumentOf?: _FlawlessNamingConvention_TypeArgumentOfConfig;
17424
17468
  modifiers?: ("abstract" | "private" | "protected" | "public" | "requiresQuotes" | "static" | "override")[];
17425
17469
  types?: _FlawlessNamingConventionTypeMatcher[];
17426
17470
  } | {
@@ -17434,6 +17478,7 @@ type FlawlessNamingConvention = ({
17434
17478
  trailingUnderscore?: _FlawlessNamingConventionUnderscoreOptions;
17435
17479
  filter?: (string | _FlawlessNamingConvention_MatchRegexConfig);
17436
17480
  selector: "autoAccessor";
17481
+ typeArgumentOf?: _FlawlessNamingConvention_TypeArgumentOfConfig;
17437
17482
  modifiers?: ("abstract" | "private" | "protected" | "public" | "requiresQuotes" | "static" | "override")[];
17438
17483
  types?: _FlawlessNamingConventionTypeMatcher[];
17439
17484
  } | {
@@ -17447,6 +17492,7 @@ type FlawlessNamingConvention = ({
17447
17492
  trailingUnderscore?: _FlawlessNamingConventionUnderscoreOptions;
17448
17493
  filter?: (string | _FlawlessNamingConvention_MatchRegexConfig);
17449
17494
  selector: "accessor";
17495
+ typeArgumentOf?: _FlawlessNamingConvention_TypeArgumentOfConfig;
17450
17496
  modifiers?: ("abstract" | "private" | "protected" | "public" | "requiresQuotes" | "static" | "override")[];
17451
17497
  types?: _FlawlessNamingConventionTypeMatcher[];
17452
17498
  } | {
@@ -17460,6 +17506,7 @@ type FlawlessNamingConvention = ({
17460
17506
  trailingUnderscore?: _FlawlessNamingConventionUnderscoreOptions;
17461
17507
  filter?: (string | _FlawlessNamingConvention_MatchRegexConfig);
17462
17508
  selector: "enumMember";
17509
+ typeArgumentOf?: _FlawlessNamingConvention_TypeArgumentOfConfig;
17463
17510
  modifiers?: ("requiresQuotes")[];
17464
17511
  } | {
17465
17512
  allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
@@ -17472,6 +17519,7 @@ type FlawlessNamingConvention = ({
17472
17519
  trailingUnderscore?: _FlawlessNamingConventionUnderscoreOptions;
17473
17520
  filter?: (string | _FlawlessNamingConvention_MatchRegexConfig);
17474
17521
  selector: "objectStyleEnumMember";
17522
+ typeArgumentOf?: _FlawlessNamingConvention_TypeArgumentOfConfig;
17475
17523
  modifiers?: ("requiresQuotes")[];
17476
17524
  } | {
17477
17525
  allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
@@ -17484,6 +17532,7 @@ type FlawlessNamingConvention = ({
17484
17532
  trailingUnderscore?: _FlawlessNamingConventionUnderscoreOptions;
17485
17533
  filter?: (string | _FlawlessNamingConvention_MatchRegexConfig);
17486
17534
  selector: "typeLike";
17535
+ typeArgumentOf?: _FlawlessNamingConvention_TypeArgumentOfConfig;
17487
17536
  modifiers?: ("abstract" | "exported" | "unused")[];
17488
17537
  } | {
17489
17538
  allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
@@ -17496,6 +17545,7 @@ type FlawlessNamingConvention = ({
17496
17545
  trailingUnderscore?: _FlawlessNamingConventionUnderscoreOptions;
17497
17546
  filter?: (string | _FlawlessNamingConvention_MatchRegexConfig);
17498
17547
  selector: "class";
17548
+ typeArgumentOf?: _FlawlessNamingConvention_TypeArgumentOfConfig;
17499
17549
  modifiers?: ("abstract" | "exported" | "unused")[];
17500
17550
  } | {
17501
17551
  allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
@@ -17508,6 +17558,7 @@ type FlawlessNamingConvention = ({
17508
17558
  trailingUnderscore?: _FlawlessNamingConventionUnderscoreOptions;
17509
17559
  filter?: (string | _FlawlessNamingConvention_MatchRegexConfig);
17510
17560
  selector: "interface";
17561
+ typeArgumentOf?: _FlawlessNamingConvention_TypeArgumentOfConfig;
17511
17562
  modifiers?: ("exported" | "unused")[];
17512
17563
  } | {
17513
17564
  allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
@@ -17520,6 +17571,7 @@ type FlawlessNamingConvention = ({
17520
17571
  trailingUnderscore?: _FlawlessNamingConventionUnderscoreOptions;
17521
17572
  filter?: (string | _FlawlessNamingConvention_MatchRegexConfig);
17522
17573
  selector: "typeAlias";
17574
+ typeArgumentOf?: _FlawlessNamingConvention_TypeArgumentOfConfig;
17523
17575
  modifiers?: ("exported" | "unused")[];
17524
17576
  } | {
17525
17577
  allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
@@ -17532,6 +17584,7 @@ type FlawlessNamingConvention = ({
17532
17584
  trailingUnderscore?: _FlawlessNamingConventionUnderscoreOptions;
17533
17585
  filter?: (string | _FlawlessNamingConvention_MatchRegexConfig);
17534
17586
  selector: "enum";
17587
+ typeArgumentOf?: _FlawlessNamingConvention_TypeArgumentOfConfig;
17535
17588
  modifiers?: ("exported" | "unused")[];
17536
17589
  } | {
17537
17590
  allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
@@ -17544,6 +17597,7 @@ type FlawlessNamingConvention = ({
17544
17597
  trailingUnderscore?: _FlawlessNamingConventionUnderscoreOptions;
17545
17598
  filter?: (string | _FlawlessNamingConvention_MatchRegexConfig);
17546
17599
  selector: "typeParameter";
17600
+ typeArgumentOf?: _FlawlessNamingConvention_TypeArgumentOfConfig;
17547
17601
  modifiers?: ("unused")[];
17548
17602
  } | {
17549
17603
  allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
@@ -17556,6 +17610,7 @@ type FlawlessNamingConvention = ({
17556
17610
  trailingUnderscore?: _FlawlessNamingConventionUnderscoreOptions;
17557
17611
  filter?: (string | _FlawlessNamingConvention_MatchRegexConfig);
17558
17612
  selector: "import";
17613
+ typeArgumentOf?: _FlawlessNamingConvention_TypeArgumentOfConfig;
17559
17614
  modifiers?: ("default" | "namespace")[];
17560
17615
  })[];
17561
17616
  interface _FlawlessNamingConvention_MatchRegexConfig {
@@ -23239,6 +23294,18 @@ type PreserveCaughtError = [] | [{
23239
23294
  argumentPosition: number;
23240
23295
  })[];
23241
23296
  }];
23297
+ // ----- project-structure/file-composition -----
23298
+ type ProjectStructureFileComposition = [] | [{
23299
+ [k: string]: unknown | undefined;
23300
+ }];
23301
+ // ----- project-structure/folder-structure -----
23302
+ type ProjectStructureFolderStructure = [] | [{
23303
+ [k: string]: unknown | undefined;
23304
+ }];
23305
+ // ----- project-structure/independent-modules -----
23306
+ type ProjectStructureIndependentModules = [] | [{
23307
+ [k: string]: unknown | undefined;
23308
+ }];
23242
23309
  // ----- promise/always-return -----
23243
23310
  type PromiseAlwaysReturn = [] | [{
23244
23311
  ignoreLastCallback?: boolean;
@@ -27119,7 +27186,7 @@ type Yoda = [] | [("always" | "never")] | [("always" | "never"), {
27119
27186
  onlyEquality?: boolean;
27120
27187
  }];
27121
27188
  // Names of all the configs
27122
- type ConfigNames = 'isentinel/eslint/comments' | 'isentinel/eslint/comments/src' | 'isentinel/e18e/rules' | 'isentinel/eslint-plugin/setup' | 'isentinel/eslint-plugin/rules' | 'isentinel/flawless/setup' | 'isentinel/flawless/rules' | 'isentinel/flawless/markdown-code' | 'isentinel/flawless/rules-type-aware' | 'isentinel/gitignore' | 'isentinel/ignores' | 'isentinel/imports/rules' | 'isentinel/imports/game' | 'isentinel/javascript/setup' | 'isentinel/javascript/rules' | 'isentinel/jsdoc/setup' | 'isentinel/jsdoc' | 'isentinel/jsonc/setup' | 'isentinel/jsonc/rules' | 'isentinel/jsonc/tsconfig' | 'isentinel/markdown/setup' | 'isentinel/markdown/processor' | 'isentinel/markdown/parser' | 'isentinel/markdown/disables' | 'isentinel/naming/setup' | 'isentinel/naming/ts/rules-type-aware' | 'isentinel/naming/tsx/rules-type-aware' | 'isentinel/node/rules' | 'isentinel/oxfmt/setup' | 'isentinel/oxfmt/javascript' | 'isentinel/oxfmt/typescript' | 'isentinel/oxfmt/css' | 'isentinel/oxfmt/scss' | 'isentinel/oxfmt/less' | 'isentinel/oxfmt/html' | 'isentinel/oxfmt/markdown' | 'isentinel/oxfmt/graphql' | 'isentinel/oxfmt/json' | 'isentinel/oxfmt/yaml' | 'isentinel/package-json/setup' | 'isentinel/package-json' | 'isentinel/package-json/root' | 'isentinel/perfectionist/setup' | 'isentinel/perfectionist' | 'isentinel/perfectionist/jsx' | 'isentinel/pnpm/setup' | 'isentinel/pnpm/package-json' | 'isentinel/pnpm/pnpm-workspace-yaml' | 'isentinel/promise' | 'isentinel/react/setup' | 'isentinel/react/setup/naming' | 'isentinel/react/setup/testing-library' | 'isentinel/react/rules' | 'isentinel/react/type-aware-rules' | 'isentinel/roblox/setup' | 'isentinel/roblox/parser' | 'isentinel/roblox/type-aware-parser' | 'isentinel/roblox' | 'isentinel/roblox/rules-type-aware' | 'isentinel/roblox/format-lua/setup' | 'isentinel/roblox/format-lua' | 'isentinel/small-rules/setup' | 'isentinel/small-rules' | 'isentinel/sonarjs' | 'isentinel/spelling/setup' | 'isentinel/spelling' | 'isentinel/stylistic/setup' | 'isentinel/stylistic' | 'isentinel/test/jest/setup' | 'isentinel/test/jest/rules' | 'isentinel/test/jest/type-tests' | 'isentinel/test/vitest/setup' | 'isentinel/test/vitest/rules' | 'isentinel/test/vitest/type-tests' | 'isentinel/toml/setup' | 'isentinel/toml/rules' | 'isentinel/typescript/setup' | 'isentinel/typescript/parser' | 'isentinel/typescript/type-aware-parser' | 'isentinel/typescript/rules' | 'isentinel/typescript/rules-type-aware' | 'isentinel/typescript/erasable-syntax-only' | 'isentinel/unicorn/setup' | 'isentinel/unicorn/rules' | 'isentinel/unicorn/root' | 'isentinel/yaml/setup' | 'isentinel/yaml/rules';
27189
+ type ConfigNames = 'isentinel/eslint/comments' | 'isentinel/eslint/comments/src' | 'isentinel/e18e/rules' | 'isentinel/eslint-plugin/setup' | 'isentinel/eslint-plugin/rules' | 'isentinel/flawless/setup' | 'isentinel/flawless/rules' | 'isentinel/flawless/markdown-code' | 'isentinel/flawless/rules-type-aware' | 'isentinel/gitignore' | 'isentinel/ignores' | 'isentinel/imports/rules' | 'isentinel/imports/game' | 'isentinel/javascript/setup' | 'isentinel/javascript/rules' | 'isentinel/jsdoc/setup' | 'isentinel/jsdoc' | 'isentinel/jsonc/setup' | 'isentinel/jsonc/rules' | 'isentinel/jsonc/tsconfig' | 'isentinel/markdown/setup' | 'isentinel/markdown/processor' | 'isentinel/markdown/parser' | 'isentinel/markdown/disables' | 'isentinel/naming/setup' | 'isentinel/naming/ts/rules-type-aware' | 'isentinel/naming/tsx/rules-type-aware' | 'isentinel/node/rules' | 'isentinel/oxfmt/setup' | 'isentinel/oxfmt/javascript' | 'isentinel/oxfmt/typescript' | 'isentinel/oxfmt/css' | 'isentinel/oxfmt/scss' | 'isentinel/oxfmt/less' | 'isentinel/oxfmt/html' | 'isentinel/oxfmt/markdown' | 'isentinel/oxfmt/graphql' | 'isentinel/oxfmt/json' | 'isentinel/oxfmt/yaml' | 'isentinel/package-json/setup' | 'isentinel/package-json' | 'isentinel/package-json/root' | 'isentinel/perfectionist/setup' | 'isentinel/perfectionist' | 'isentinel/perfectionist/jsx' | 'isentinel/pnpm/setup' | 'isentinel/pnpm/package-json' | 'isentinel/pnpm/pnpm-workspace-yaml' | 'isentinel/project-structure/setup' | 'isentinel/project-structure/rules' | 'isentinel/promise' | 'isentinel/react/setup' | 'isentinel/react/setup/naming' | 'isentinel/react/setup/testing-library' | 'isentinel/react/rules' | 'isentinel/react/type-aware-rules' | 'isentinel/roblox/setup' | 'isentinel/roblox/parser' | 'isentinel/roblox/type-aware-parser' | 'isentinel/roblox' | 'isentinel/roblox/rules-type-aware' | 'isentinel/roblox/format-lua/setup' | 'isentinel/roblox/format-lua' | 'isentinel/small-rules/setup' | 'isentinel/small-rules' | 'isentinel/sonarjs' | 'isentinel/spelling/setup' | 'isentinel/spelling' | 'isentinel/stylistic/setup' | 'isentinel/stylistic' | 'isentinel/test/jest/setup' | 'isentinel/test/jest/rules' | 'isentinel/test/jest/type-tests' | 'isentinel/test/vitest/setup' | 'isentinel/test/vitest/rules' | 'isentinel/test/vitest/type-tests' | 'isentinel/toml/setup' | 'isentinel/toml/rules' | 'isentinel/typescript/setup' | 'isentinel/typescript/parser' | 'isentinel/typescript/type-aware-parser' | 'isentinel/typescript/rules' | 'isentinel/typescript/rules-type-aware' | 'isentinel/typescript/erasable-syntax-only' | 'isentinel/unicorn/setup' | 'isentinel/unicorn/rules' | 'isentinel/unicorn/root' | 'isentinel/yaml/setup' | 'isentinel/yaml/rules';
27123
27190
  //#endregion
27124
27191
  //#region src/utils.d.ts
27125
27192
  type ExtractRuleOptions<T> = T extends Linter.RuleEntry<infer U> ? U : never;
@@ -27457,6 +27524,37 @@ interface NamingConfig extends OptionsOverridesTypeAware {
27457
27524
  */
27458
27525
  selectorsTsx?: Array<NamingSelector>;
27459
27526
  }
27527
+ interface ProjectStructureConfig extends OptionsOverrides {
27528
+ /**
27529
+ * The files each linted source file has to sit next to, as
27530
+ * `enforceExistence` templates. Takes the plugin's name placeholders
27531
+ * (`{nodeName}`, `{NodeName}`, `{node-name}`, `{node_name}`,
27532
+ * `{NODE_NAME}`) plus `{ext}` for the extension of the file that matched.
27533
+ * A file already matching a template is exempt from it.
27534
+ *
27535
+ * @default ["{node-name}.spec.{ext}"]
27536
+ */
27537
+ enforceExistence?: Array<string> | string;
27538
+ /**
27539
+ * Files exempt from the check.
27540
+ *
27541
+ * @default [...GLOB_TESTS, GLOB_DTS, ...GLOB_BUILD_CONFIGS]
27542
+ */
27543
+ ignores?: Array<string>;
27544
+ /**
27545
+ * The folder the enforced paths resolve against, and where the plugin
27546
+ * writes `projectStructure.cache.json` when it reports.
27547
+ *
27548
+ * @default process.cwd()
27549
+ */
27550
+ projectRoot?: string;
27551
+ /**
27552
+ * Restricts the check to one subtree of `projectRoot`, as a relative path.
27553
+ *
27554
+ * @default undefined - the whole of `projectRoot`
27555
+ */
27556
+ structureRoot?: string;
27557
+ }
27460
27558
  interface OptionsTypeScriptParserOptions {
27461
27559
  /**
27462
27560
  * Glob patterns for files that should be type aware.
@@ -27805,6 +27903,14 @@ interface OptionsConfig extends OptionsComponentExtensions, OptionsProjectType {
27805
27903
  * @see https://github.com/antfu/pnpm-workspace-utils
27806
27904
  */
27807
27905
  pnpm?: boolean | OptionsPnpm;
27906
+ /**
27907
+ * Require every source file to have a co-located test file, via
27908
+ * [eslint-plugin-project-structure](https://github.com/Igorkowalski94/eslint-plugin-project-structure).
27909
+ *
27910
+ * @default false
27911
+ * @requires eslint-plugin-project-structure
27912
+ */
27913
+ projectStructure?: boolean | ProjectStructureConfig;
27808
27914
  /**
27809
27915
  * Enable react rules.
27810
27916
  *
@@ -28243,6 +28349,9 @@ declare function perfectionist(config?: OptionsProjectType & PerfectionistConfig
28243
28349
  //#region src/eslint/configs/pnpm.d.ts
28244
28350
  declare function pnpm(options: OptionsPnpm & Required<OptionsIsInEditor>): Promise<Array<TypedFlatConfigItem>>;
28245
28351
  //#endregion
28352
+ //#region src/eslint/configs/project-structure.d.ts
28353
+ declare function projectStructure({ enforceExistence, files, ignores, overrides, projectRoot, structureRoot }?: ProjectStructureConfig): Promise<Array<TypedFlatConfigItem>>;
28354
+ //#endregion
28246
28355
  //#region src/eslint/configs/promise.d.ts
28247
28356
  declare function promise(): Array<TypedFlatConfigItem>;
28248
28357
  //#endregion
@@ -28349,4 +28458,4 @@ declare function unicorn({ complementIgnores, nameReplacements, roblox, root: cu
28349
28458
  //#region src/eslint/configs/yaml.d.ts
28350
28459
  declare function yaml({ files, overrides, stylistic }?: OptionsFiles & OptionsOverrides & OptionsStylistic): Promise<Array<TypedFlatConfigItem>>;
28351
28460
  //#endregion
28352
- export { type Awaitable, type ConfigNames, type ConfigSettings, type FlatConfigComposer, GLOB_ALL_JSON, GLOB_ALL_SRC, GLOB_BIN, GLOB_BUILD_CONFIGS, GLOB_CSS, GLOB_DTS, GLOB_EXCLUDE, GLOB_GRAPHQL, GLOB_HTML, GLOB_JS, GLOB_JSON, GLOB_JSON5, GLOB_JSONC, GLOB_JSX, GLOB_LESS, GLOB_LINTABLE_EXTENSIONS, GLOB_LUA, GLOB_MARKDOWN, GLOB_MARKDOWN_BLOCKS, GLOB_MARKDOWN_CODE, GLOB_MARKDOWN_IN_MARKDOWN, GLOB_MISE, GLOB_PACKAGE_JSON, GLOB_PACKAGE_JSON_ROOT, GLOB_POSTCSS, GLOB_ROOT, GLOB_ROOT_SRC, GLOB_SCSS, GLOB_SRC, GLOB_SRC_EXT, GLOB_SRC_EXTENSIONS, GLOB_STYLE, GLOB_TESTS, GLOB_TOML, GLOB_TS, GLOB_TSCONFIG, GLOB_TSX, GLOB_TYPE_TESTS, GLOB_XML, GLOB_YAML, GitignoreOptions, type JsdocOptions, MARKDOWN_PROCESSOR_NAME, type NamedFlatConfigItem, type NamedOptionsConfig, type NamingConfig, type NamingSelector, type OptionsComponentExtensions, type OptionsConfig, type OptionsE18e, type OptionsFiles, type OptionsFilesTypeAware, type OptionsFormatters, type OptionsHasRoblox, type OptionsHasTypeScript, type OptionsIsInEditor, type OptionsJest, type OptionsOverrides, type OptionsOverridesTypeAware, type OptionsPnpm, type OptionsProjectType, type OptionsStylistic, type OptionsTestFramework, type OptionsTypeScriptErasableOnly, type OptionsTypeScriptParserOptions, type OptionsTypeScriptWithTypes, type OptionsTypescript, type OptionsUnicorn, type OptionsVitest, type OxfmtOptions, type PerfectionistConfig, type PrettierOptions, ROBLOX_ALLOWED_WORDS, type ReactConfig, type ReactSettings, type Rules, type SpellCheckConfig, type StylisticConfig, StylisticConfigDefaults, type TypedFlatConfigItem, comments, isentinel as default, isentinel, defaultPluginRenaming, disables, e18e, eslintPlugin, flawless, gitignore, ignores$1 as ignores, imports, isAgentAutofixDisabled, isInAgentSession, isInEditorEnvironment, isInGitHooksOrLintStaged, javascript, jsdoc, jsonc, loadSmallRulesPlugin, markdown, naming, node, oxfmt, packageJson, perfectionist, pnpm, promise, react, roblox$1 as roblox, smallRules, sonarjs, sortCspell, sortGithubAction, sortMiseToml, sortPnpmWorkspace, sortRojoProject, sortTsconfig, spelling, stylistic$1 as stylistic, test, toml, typescript, unicorn, yaml };
28461
+ export { type Awaitable, type ConfigNames, type ConfigSettings, type FlatConfigComposer, GLOB_ALL_JSON, GLOB_ALL_SRC, GLOB_BIN, GLOB_BUILD_CONFIGS, GLOB_CSS, GLOB_DTS, GLOB_EXCLUDE, GLOB_GRAPHQL, GLOB_HTML, GLOB_JS, GLOB_JSON, GLOB_JSON5, GLOB_JSONC, GLOB_JSX, GLOB_LESS, GLOB_LINTABLE_EXTENSIONS, GLOB_LUA, GLOB_MARKDOWN, GLOB_MARKDOWN_BLOCKS, GLOB_MARKDOWN_CODE, GLOB_MARKDOWN_IN_MARKDOWN, GLOB_MISE, GLOB_PACKAGE_JSON, GLOB_PACKAGE_JSON_ROOT, GLOB_POSTCSS, GLOB_ROOT, GLOB_ROOT_SRC, GLOB_SCSS, GLOB_SRC, GLOB_SRC_EXT, GLOB_SRC_EXTENSIONS, GLOB_STYLE, GLOB_TESTS, GLOB_TOML, GLOB_TS, GLOB_TSCONFIG, GLOB_TSX, GLOB_TYPE_TESTS, GLOB_XML, GLOB_YAML, GitignoreOptions, type JsdocOptions, MARKDOWN_PROCESSOR_NAME, type NamedFlatConfigItem, type NamedOptionsConfig, type NamingConfig, type NamingSelector, type OptionsComponentExtensions, type OptionsConfig, type OptionsE18e, type OptionsFiles, type OptionsFilesTypeAware, type OptionsFormatters, type OptionsHasRoblox, type OptionsHasTypeScript, type OptionsIsInEditor, type OptionsJest, type OptionsOverrides, type OptionsOverridesTypeAware, type OptionsPnpm, type OptionsProjectType, type OptionsStylistic, type OptionsTestFramework, type OptionsTypeScriptErasableOnly, type OptionsTypeScriptParserOptions, type OptionsTypeScriptWithTypes, type OptionsTypescript, type OptionsUnicorn, type OptionsVitest, type OxfmtOptions, type PerfectionistConfig, type PrettierOptions, type ProjectStructureConfig, ROBLOX_ALLOWED_WORDS, type ReactConfig, type ReactSettings, type Rules, type SpellCheckConfig, type StylisticConfig, StylisticConfigDefaults, type TypedFlatConfigItem, comments, isentinel as default, isentinel, defaultPluginRenaming, disables, e18e, eslintPlugin, flawless, gitignore, ignores$1 as ignores, imports, isAgentAutofixDisabled, isInAgentSession, isInEditorEnvironment, isInGitHooksOrLintStaged, javascript, jsdoc, jsonc, loadSmallRulesPlugin, markdown, naming, node, oxfmt, packageJson, perfectionist, pnpm, projectStructure, promise, react, roblox$1 as roblox, smallRules, sonarjs, sortCspell, sortGithubAction, sortMiseToml, sortPnpmWorkspace, sortRojoProject, sortTsconfig, spelling, stylistic$1 as stylistic, test, toml, typescript, unicorn, yaml };