@isentinel/eslint-config 6.0.0-beta.39 → 6.0.0-beta.40

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
@@ -771,6 +771,49 @@ selectors are simply added. A less specific entry cannot override a more
771
771
  specific default. The `overridesTypeAware` escape hatch still replaces the whole
772
772
  rule if you need full control.
773
773
 
774
+ ##### Roblox names
775
+
776
+ `strictCamelCase` and `StrictPascalCase` reject two capitals in a row, so a
777
+ `CFrame` has to be stored in `targetCframe` and the identifier stops matching
778
+ the type it holds. `allowedWords` lets listed words keep their own casing inside
779
+ a name, while the rest of the name is still checked. It is off by default:
780
+
781
+ ```ts
782
+ // eslint.config.ts
783
+ import isentinel from "@isentinel/eslint-config";
784
+
785
+ export default isentinel({
786
+ naming: {
787
+ // Use ROBLOX_ALLOWED_WORDS, generated from `@rbxts/types`
788
+ allowedWords: true,
789
+ },
790
+ });
791
+ ```
792
+
793
+ ```ts
794
+ const targetCFrame = new CFrame(); // ok
795
+ const listLayoutUIPadding = 0; // ok
796
+ const target_CFrame = 0; // still an error
797
+ ```
798
+
799
+ Pass an array to use exactly those words instead. Spread `ROBLOX_ALLOWED_WORDS`
800
+ to extend the list rather than replace it:
801
+
802
+ ```ts
803
+ import isentinel, { ROBLOX_ALLOWED_WORDS } from "@isentinel/eslint-config";
804
+
805
+ export default isentinel({
806
+ naming: {
807
+ allowedWords: [...ROBLOX_ALLOWED_WORDS, "HTTP", "URL"],
808
+ },
809
+ });
810
+ ```
811
+
812
+ The list reaches every selector, including your own `selectors` entries. A
813
+ selector opts out with its own `allowedWords: []`. Only the two strict formats
814
+ honour it, so it can never loosen `snake_case` or `UPPER_CASE`, and a word only
815
+ matches at a hump boundary, so it cannot split an existing hump.
816
+
774
817
  #### Oxlint
775
818
 
776
819
  The config can run alongside (or be replaced by)
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.39";
12
+ var version = "6.0.0-beta.40";
13
13
  var package_default = {
14
14
  name: "@isentinel/eslint-config",
15
15
  version,
@@ -62,9 +62,10 @@ var package_default = {
62
62
  "build:inspector": "pnpm build && pnpm dlx @eslint/config-inspector build --config eslint-inspector.config.ts --out-dir ./.eslint-config-inspector",
63
63
  "check:extensions": "node scripts/check-package-extensions.ts && node scripts/gen-package-extensions.ts --check",
64
64
  "check:published": "node scripts/check-published-extensions.ts",
65
+ "check:roblox-words": "node scripts/roblox-allowed-words-gen.ts --check",
65
66
  "check:type-aware": "node scripts/type-aware-gen.ts --check",
66
67
  "dev": "npx @eslint/config-inspector --config eslint-inspector.config.ts",
67
- "gen": "node scripts/typegen.ts && node scripts/typegen-oxlint.ts && node scripts/typegen-defaults.ts && node scripts/typegen-defaults-oxlint.ts && node scripts/versiongen.ts && node scripts/stylistic-gen.ts && node scripts/type-aware-gen.ts && node scripts/gen-package-extensions.ts",
68
+ "gen": "node scripts/typegen.ts && node scripts/typegen-oxlint.ts && node scripts/typegen-defaults.ts && node scripts/typegen-defaults-oxlint.ts && node scripts/versiongen.ts && node scripts/stylistic-gen.ts && node scripts/type-aware-gen.ts && node scripts/roblox-allowed-words-gen.ts && node scripts/gen-package-extensions.ts",
68
69
  "postgen": "echo 'Generation complete!'",
69
70
  "lint": "isentinel-lint",
70
71
  "oxlint": "oxlint",
@@ -139,6 +140,7 @@ var package_default = {
139
140
  "@eslint/config-inspector": "catalog:dev",
140
141
  "@isentinel/eslint-config": "workspace:*",
141
142
  "@isentinel/tsconfig": "catalog:dev",
143
+ "@rbxts/types": "catalog:dev",
142
144
  "@stylistic/eslint-plugin-migrate": "catalog:dev",
143
145
  "@total-typescript/shoehorn": "catalog:dev",
144
146
  "@types/node": "catalog:dev",
package/dist/index.d.mts CHANGED
@@ -4550,9 +4550,6 @@ interface ReactRuleDefaults {
4550
4550
  }];
4551
4551
  };
4552
4552
  "flawless/naming-convention": {
4553
- game_roblox: {
4554
- "severityOnly": "error";
4555
- };
4556
4553
  game_std: ["error", {
4557
4554
  "format": ["strictCamelCase"];
4558
4555
  "selector": "default";
@@ -4651,9 +4648,6 @@ interface ReactRuleDefaults {
4651
4648
  "modifiers": ["destructured"];
4652
4649
  "selector": "variable";
4653
4650
  }];
4654
- package_roblox: {
4655
- "severityOnly": "error";
4656
- };
4657
4651
  package_std: ["error", {
4658
4652
  "format": ["strictCamelCase"];
4659
4653
  "selector": "default";
@@ -5125,7 +5119,100 @@ interface SourceFeatureRuleDefaults {
5125
5119
  "*": "error";
5126
5120
  };
5127
5121
  "flawless/naming-convention": {
5128
- "*": ["error", {
5122
+ game_roblox: {
5123
+ "severityOnly": "error";
5124
+ };
5125
+ game_std: ["error", {
5126
+ "format": ["strictCamelCase"];
5127
+ "selector": "default";
5128
+ }, {
5129
+ "format": null;
5130
+ "selector": "import";
5131
+ }, {
5132
+ "format": null;
5133
+ "modifiers": ["destructured"];
5134
+ "selector": "variable";
5135
+ }, {
5136
+ "format": ["strictCamelCase"];
5137
+ "leadingUnderscore": "allow";
5138
+ "selector": "variable";
5139
+ }, {
5140
+ "format": null;
5141
+ "modifiers": ["destructured"];
5142
+ "selector": "parameter";
5143
+ }, {
5144
+ "format": ["strictCamelCase"];
5145
+ "leadingUnderscore": "allow";
5146
+ "selector": "parameter";
5147
+ }, {
5148
+ "format": ["StrictPascalCase"];
5149
+ "selector": "enumMember";
5150
+ }, {
5151
+ "format": ["UPPER_CASE"];
5152
+ "leadingUnderscore": "forbid";
5153
+ "modifiers": ["const", "global"];
5154
+ "selector": "variable";
5155
+ "trailingUnderscore": "forbid";
5156
+ "types": ["boolean", "number", "string"];
5157
+ }, {
5158
+ "format": ["UPPER_CASE"];
5159
+ "modifiers": ["constAsserted", "global"];
5160
+ "selector": "variable";
5161
+ }, {
5162
+ "filter": {
5163
+ "match": false;
5164
+ "regex": "^success$";
5165
+ };
5166
+ "format": ["PascalCase"];
5167
+ "prefix": ["is", "should", "has", "can", "did", "will", "was", "are"];
5168
+ "selector": "variable";
5169
+ "types": ["boolean"];
5170
+ }, {
5171
+ "filter": {
5172
+ "match": false;
5173
+ "regex": "^success$";
5174
+ };
5175
+ "format": ["UPPER_CASE"];
5176
+ "modifiers": ["const", "global"];
5177
+ "prefix": ["IS_", "SHOULD_", "HAS_", "CAN_", "DID_", "WILL_", "WAS_", "ARE_"];
5178
+ "selector": "variable";
5179
+ "types": ["boolean"];
5180
+ }, {
5181
+ "format": ["strictCamelCase"];
5182
+ "selector": ["function", "classMethod"];
5183
+ }, {
5184
+ "format": ["strictCamelCase"];
5185
+ "selector": ["method"];
5186
+ }, {
5187
+ "format": ["strictCamelCase"];
5188
+ "leadingUnderscore": "forbid";
5189
+ "selector": "classProperty";
5190
+ }, {
5191
+ "format": ["UPPER_CASE"];
5192
+ "modifiers": ["static", "readonly"];
5193
+ "selector": "classProperty";
5194
+ }, {
5195
+ "format": null;
5196
+ "selector": "objectLiteralProperty";
5197
+ }, {
5198
+ "format": ["StrictPascalCase"];
5199
+ "selector": "typeLike";
5200
+ }, {
5201
+ "format": ["StrictPascalCase"];
5202
+ "selector": "objectStyleEnum";
5203
+ }, {
5204
+ "format": ["strictCamelCase", "UPPER_CASE"];
5205
+ "modifiers": ["global"];
5206
+ "selector": "variable";
5207
+ }, {
5208
+ "format": null;
5209
+ "modifiers": ["destructured", "global"];
5210
+ "selector": "variable";
5211
+ }];
5212
+ package_roblox: {
5213
+ "severityOnly": "error";
5214
+ };
5215
+ package_std: ["error", {
5129
5216
  "format": ["strictCamelCase"];
5130
5217
  "selector": "default";
5131
5218
  }, {
@@ -7083,107 +7170,107 @@ interface RuleOptions {
7083
7170
  'eslint-plugin/unique-test-case-names'?: Linter.RuleEntry<[]>;
7084
7171
  /**
7085
7172
  * Enforce arrow function return style based on line length
7086
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/arrow-return-style/documentation.md
7173
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/arrow-return-style/documentation.md
7087
7174
  */
7088
7175
  'flawless/arrow-return-style'?: Linter.RuleEntry<FlawlessArrowReturnStyle>;
7089
7176
  /**
7090
7177
  * Disallow shorthand boolean JSX attributes
7091
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/jsx-shorthand-boolean/documentation.md
7178
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/jsx-shorthand-boolean/documentation.md
7092
7179
  */
7093
7180
  'flawless/jsx-shorthand-boolean'?: Linter.RuleEntry<[]>;
7094
7181
  /**
7095
7182
  * Enforce a consistent fragment form: the shorthand `<>...</>` or a named fragment
7096
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/jsx-shorthand-fragment/documentation.md
7183
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/jsx-shorthand-fragment/documentation.md
7097
7184
  */
7098
7185
  'flawless/jsx-shorthand-fragment'?: Linter.RuleEntry<FlawlessJsxShorthandFragment>;
7099
7186
  /**
7100
7187
  * Enforce a maximum number of lines of code in a function
7101
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/max-lines-per-function/documentation.md
7188
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/max-lines-per-function/documentation.md
7102
7189
  */
7103
7190
  'flawless/max-lines-per-function'?: Linter.RuleEntry<FlawlessMaxLinesPerFunction>;
7104
7191
  /**
7105
7192
  * Enforce naming conventions for everything across a codebase
7106
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/naming-convention/documentation.md
7193
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/naming-convention/documentation.md
7107
7194
  */
7108
7195
  'flawless/naming-convention'?: Linter.RuleEntry<FlawlessNamingConvention>;
7109
7196
  /**
7110
7197
  * Disallow conditional logic in tests
7111
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/no-conditional-in-test/documentation.md
7198
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/no-conditional-in-test/documentation.md
7112
7199
  */
7113
7200
  'flawless/no-conditional-in-test'?: Linter.RuleEntry<FlawlessNoConditionalInTest>;
7114
7201
  /**
7115
7202
  * Disallow anonymous arrow functions as export default declarations
7116
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/no-export-default-arrow/documentation.md
7203
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/no-export-default-arrow/documentation.md
7117
7204
  */
7118
7205
  'flawless/no-export-default-arrow'?: Linter.RuleEntry<[]>;
7119
7206
  /**
7120
7207
  * Disallow exact equality checks involving floating-point-sensitive values
7121
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/no-floating-point-equality/documentation.md
7208
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/no-floating-point-equality/documentation.md
7122
7209
  */
7123
7210
  'flawless/no-floating-point-equality'?: Linter.RuleEntry<[]>;
7124
7211
  /**
7125
7212
  * Disallow tsconfig options that redundantly re-set a value already provided by an extended config
7126
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/no-redundant-tsconfig-options/documentation.md
7213
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/no-redundant-tsconfig-options/documentation.md
7127
7214
  */
7128
7215
  'flawless/no-redundant-tsconfig-options'?: Linter.RuleEntry<[]>;
7129
7216
  /**
7130
7217
  * Disallow unnecessary usage of 'useCallback'
7131
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/no-unnecessary-use-callback/documentation.md
7218
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/no-unnecessary-use-callback/documentation.md
7132
7219
  */
7133
7220
  'flawless/no-unnecessary-use-callback'?: Linter.RuleEntry<[]>;
7134
7221
  /**
7135
7222
  * Disallow unnecessary usage of 'useMemo'
7136
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/no-unnecessary-use-memo/documentation.md
7223
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/no-unnecessary-use-memo/documentation.md
7137
7224
  */
7138
7225
  'flawless/no-unnecessary-use-memo'?: Linter.RuleEntry<[]>;
7139
7226
  /**
7140
7227
  * Enforce a blank line after `expect.assertions` and `expect.hasAssertions`
7141
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/padding-after-expect-assertions/documentation.md
7228
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/padding-after-expect-assertions/documentation.md
7142
7229
  */
7143
7230
  'flawless/padding-after-expect-assertions'?: Linter.RuleEntry<[]>;
7144
7231
  /**
7145
7232
  * Enforce destructuring assignment for component props
7146
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/prefer-destructuring-assignment/documentation.md
7233
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/prefer-destructuring-assignment/documentation.md
7147
7234
  */
7148
7235
  'flawless/prefer-destructuring-assignment'?: Linter.RuleEntry<[]>;
7149
7236
  /**
7150
7237
  * Prefer having the last statement in a test be an assertion
7151
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/prefer-ending-with-an-expect/documentation.md
7238
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/prefer-ending-with-an-expect/documentation.md
7152
7239
  */
7153
7240
  'flawless/prefer-ending-with-an-expect'?: Linter.RuleEntry<FlawlessPreferEndingWithAnExpect>;
7154
7241
  /**
7155
7242
  * Prefer `expect.assertions(<count>)` over `expect.hasAssertions()`
7156
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/prefer-expect-assertions-count/documentation.md
7243
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/prefer-expect-assertions-count/documentation.md
7157
7244
  */
7158
7245
  'flawless/prefer-expect-assertions-count'?: Linter.RuleEntry<[]>;
7159
7246
  /**
7160
7247
  * Enforce destructuring parameters in the function signature
7161
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/prefer-parameter-destructuring/documentation.md
7248
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/prefer-parameter-destructuring/documentation.md
7162
7249
  */
7163
7250
  'flawless/prefer-parameter-destructuring'?: Linter.RuleEntry<FlawlessPreferParameterDestructuring>;
7164
7251
  /**
7165
7252
  * Enforce that function component props are read-only
7166
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/prefer-read-only-props/documentation.md
7253
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/prefer-read-only-props/documentation.md
7167
7254
  */
7168
7255
  'flawless/prefer-read-only-props'?: Linter.RuleEntry<FlawlessPreferReadOnlyProps>;
7169
7256
  /**
7170
7257
  * Disallow impure calls such as `math.random` or `os.clock` during render
7171
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/purity/documentation.md
7258
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/purity/documentation.md
7172
7259
  */
7173
7260
  'flawless/purity'?: Linter.RuleEntry<FlawlessPurity>;
7174
7261
  /**
7175
7262
  * Prefer named imports for React runtime values and the React namespace for React types
7176
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/react-namespace/documentation.md
7263
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/react-namespace/documentation.md
7177
7264
  */
7178
7265
  'flawless/react-namespace'?: Linter.RuleEntry<[]>;
7179
7266
  /**
7180
7267
  * Enforce a configured sort order for TOML keys and tables
7181
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/toml-sort-keys/documentation.md
7268
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/toml-sort-keys/documentation.md
7182
7269
  */
7183
7270
  'flawless/toml-sort-keys'?: Linter.RuleEntry<FlawlessTomlSortKeys>;
7184
7271
  /**
7185
7272
  * Enforce blank lines around top-level YAML block collection keys
7186
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/yaml-block-key-blank-lines/documentation.md
7273
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/yaml-block-key-blank-lines/documentation.md
7187
7274
  */
7188
7275
  'flawless/yaml-block-key-blank-lines'?: Linter.RuleEntry<[]>;
7189
7276
  /**
@@ -17066,6 +17153,7 @@ type FlawlessMaxLinesPerFunction = [] | [{
17066
17153
  skipComments?: boolean;
17067
17154
  }];
17068
17155
  // ----- flawless/naming-convention -----
17156
+ type _FlawlessNamingConvention_AllowedWordsConfig = string[];
17069
17157
  type _FlawlessNamingConventionFormatOptionsConfig = (_FlawlessNamingConventionPredefinedFormats[] | null);
17070
17158
  type _FlawlessNamingConventionPredefinedFormats = ("camelCase" | "strictCamelCase" | "PascalCase" | "StrictPascalCase" | "snake_case" | "UPPER_CASE");
17071
17159
  type _FlawlessNamingConventionUnderscoreOptions = ("forbid" | "allow" | "require" | "requireDouble" | "allowDouble" | "allowSingleOrDouble");
@@ -17095,6 +17183,7 @@ type _FlawlessNamingConvention_TypeReferenceMatcher = (({
17095
17183
  });
17096
17184
  });
17097
17185
  type FlawlessNamingConvention = ({
17186
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
17098
17187
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
17099
17188
  failureMessage?: string;
17100
17189
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -17104,9 +17193,10 @@ type FlawlessNamingConvention = ({
17104
17193
  trailingUnderscore?: _FlawlessNamingConventionUnderscoreOptions;
17105
17194
  filter?: (string | _FlawlessNamingConvention_MatchRegexConfig);
17106
17195
  modifiers?: ("const" | "readonly" | "static" | "public" | "protected" | "private" | "#private" | "abstract" | "destructured" | "global" | "exported" | "unused" | "requiresQuotes" | "override" | "async" | "default" | "namespace" | "constAsserted")[];
17107
- selector: ("default" | "variableLike" | "memberLike" | "typeLike" | "method" | "property" | "accessor" | "variable" | "function" | "parameter" | "objectStyleEnum" | "parameterProperty" | "classicAccessor" | "enumMember" | "classMethod" | "objectLiteralMethod" | "typeMethod" | "classProperty" | "objectLiteralProperty" | "typeProperty" | "autoAccessor" | "class" | "interface" | "typeAlias" | "enum" | "typeParameter" | "import")[];
17196
+ 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")[];
17108
17197
  types?: _FlawlessNamingConventionTypeMatcher[];
17109
17198
  } | {
17199
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
17110
17200
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
17111
17201
  failureMessage?: string;
17112
17202
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -17118,6 +17208,7 @@ type FlawlessNamingConvention = ({
17118
17208
  selector: "default";
17119
17209
  modifiers?: ("const" | "readonly" | "static" | "public" | "protected" | "private" | "#private" | "abstract" | "destructured" | "global" | "exported" | "unused" | "requiresQuotes" | "override" | "async" | "default" | "namespace" | "constAsserted")[];
17120
17210
  } | {
17211
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
17121
17212
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
17122
17213
  failureMessage?: string;
17123
17214
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -17129,6 +17220,7 @@ type FlawlessNamingConvention = ({
17129
17220
  selector: "variableLike";
17130
17221
  modifiers?: ("unused" | "async")[];
17131
17222
  } | {
17223
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
17132
17224
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
17133
17225
  failureMessage?: string;
17134
17226
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -17141,6 +17233,7 @@ type FlawlessNamingConvention = ({
17141
17233
  modifiers?: ("const" | "constAsserted" | "destructured" | "exported" | "global" | "unused" | "async")[];
17142
17234
  types?: _FlawlessNamingConventionTypeMatcher[];
17143
17235
  } | {
17236
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
17144
17237
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
17145
17238
  failureMessage?: string;
17146
17239
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -17153,6 +17246,7 @@ type FlawlessNamingConvention = ({
17153
17246
  modifiers?: ("exported" | "global" | "unused" | "async")[];
17154
17247
  types?: _FlawlessNamingConventionTypeMatcher[];
17155
17248
  } | {
17249
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
17156
17250
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
17157
17251
  failureMessage?: string;
17158
17252
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -17165,6 +17259,7 @@ type FlawlessNamingConvention = ({
17165
17259
  modifiers?: ("destructured" | "unused")[];
17166
17260
  types?: _FlawlessNamingConventionTypeMatcher[];
17167
17261
  } | {
17262
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
17168
17263
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
17169
17264
  failureMessage?: string;
17170
17265
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -17176,6 +17271,7 @@ type FlawlessNamingConvention = ({
17176
17271
  selector: "objectStyleEnum";
17177
17272
  modifiers?: ("const" | "exported" | "global" | "unused")[];
17178
17273
  } | {
17274
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
17179
17275
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
17180
17276
  failureMessage?: string;
17181
17277
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -17187,6 +17283,7 @@ type FlawlessNamingConvention = ({
17187
17283
  selector: "memberLike";
17188
17284
  modifiers?: ("abstract" | "private" | "#private" | "protected" | "public" | "readonly" | "requiresQuotes" | "static" | "override" | "async")[];
17189
17285
  } | {
17286
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
17190
17287
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
17191
17288
  failureMessage?: string;
17192
17289
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -17199,6 +17296,7 @@ type FlawlessNamingConvention = ({
17199
17296
  modifiers?: ("abstract" | "private" | "#private" | "protected" | "public" | "readonly" | "requiresQuotes" | "static" | "override")[];
17200
17297
  types?: _FlawlessNamingConventionTypeMatcher[];
17201
17298
  } | {
17299
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
17202
17300
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
17203
17301
  failureMessage?: string;
17204
17302
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -17211,6 +17309,7 @@ type FlawlessNamingConvention = ({
17211
17309
  modifiers?: ("public" | "requiresQuotes")[];
17212
17310
  types?: _FlawlessNamingConventionTypeMatcher[];
17213
17311
  } | {
17312
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
17214
17313
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
17215
17314
  failureMessage?: string;
17216
17315
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -17223,6 +17322,7 @@ type FlawlessNamingConvention = ({
17223
17322
  modifiers?: ("public" | "readonly" | "requiresQuotes")[];
17224
17323
  types?: _FlawlessNamingConventionTypeMatcher[];
17225
17324
  } | {
17325
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
17226
17326
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
17227
17327
  failureMessage?: string;
17228
17328
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -17235,6 +17335,7 @@ type FlawlessNamingConvention = ({
17235
17335
  modifiers?: ("private" | "protected" | "public" | "readonly")[];
17236
17336
  types?: _FlawlessNamingConventionTypeMatcher[];
17237
17337
  } | {
17338
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
17238
17339
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
17239
17340
  failureMessage?: string;
17240
17341
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -17247,6 +17348,7 @@ type FlawlessNamingConvention = ({
17247
17348
  modifiers?: ("abstract" | "private" | "#private" | "protected" | "public" | "readonly" | "requiresQuotes" | "static" | "override" | "async")[];
17248
17349
  types?: _FlawlessNamingConventionTypeMatcher[];
17249
17350
  } | {
17351
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
17250
17352
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
17251
17353
  failureMessage?: string;
17252
17354
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -17259,6 +17361,7 @@ type FlawlessNamingConvention = ({
17259
17361
  modifiers?: ("abstract" | "private" | "#private" | "protected" | "public" | "requiresQuotes" | "static" | "override" | "async")[];
17260
17362
  types?: _FlawlessNamingConventionTypeMatcher[];
17261
17363
  } | {
17364
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
17262
17365
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
17263
17366
  failureMessage?: string;
17264
17367
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -17271,6 +17374,7 @@ type FlawlessNamingConvention = ({
17271
17374
  modifiers?: ("public" | "requiresQuotes" | "async")[];
17272
17375
  types?: _FlawlessNamingConventionTypeMatcher[];
17273
17376
  } | {
17377
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
17274
17378
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
17275
17379
  failureMessage?: string;
17276
17380
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -17283,6 +17387,7 @@ type FlawlessNamingConvention = ({
17283
17387
  modifiers?: ("public" | "requiresQuotes")[];
17284
17388
  types?: _FlawlessNamingConventionTypeMatcher[];
17285
17389
  } | {
17390
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
17286
17391
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
17287
17392
  failureMessage?: string;
17288
17393
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -17295,6 +17400,7 @@ type FlawlessNamingConvention = ({
17295
17400
  modifiers?: ("abstract" | "private" | "#private" | "protected" | "public" | "requiresQuotes" | "static" | "override" | "async")[];
17296
17401
  types?: _FlawlessNamingConventionTypeMatcher[];
17297
17402
  } | {
17403
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
17298
17404
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
17299
17405
  failureMessage?: string;
17300
17406
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -17307,6 +17413,7 @@ type FlawlessNamingConvention = ({
17307
17413
  modifiers?: ("abstract" | "private" | "protected" | "public" | "requiresQuotes" | "static" | "override")[];
17308
17414
  types?: _FlawlessNamingConventionTypeMatcher[];
17309
17415
  } | {
17416
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
17310
17417
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
17311
17418
  failureMessage?: string;
17312
17419
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -17319,6 +17426,7 @@ type FlawlessNamingConvention = ({
17319
17426
  modifiers?: ("abstract" | "private" | "protected" | "public" | "requiresQuotes" | "static" | "override")[];
17320
17427
  types?: _FlawlessNamingConventionTypeMatcher[];
17321
17428
  } | {
17429
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
17322
17430
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
17323
17431
  failureMessage?: string;
17324
17432
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -17331,6 +17439,7 @@ type FlawlessNamingConvention = ({
17331
17439
  modifiers?: ("abstract" | "private" | "protected" | "public" | "requiresQuotes" | "static" | "override")[];
17332
17440
  types?: _FlawlessNamingConventionTypeMatcher[];
17333
17441
  } | {
17442
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
17334
17443
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
17335
17444
  failureMessage?: string;
17336
17445
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -17342,6 +17451,19 @@ type FlawlessNamingConvention = ({
17342
17451
  selector: "enumMember";
17343
17452
  modifiers?: ("requiresQuotes")[];
17344
17453
  } | {
17454
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
17455
+ custom?: _FlawlessNamingConvention_MatchRegexConfig;
17456
+ failureMessage?: string;
17457
+ format: _FlawlessNamingConventionFormatOptionsConfig;
17458
+ leadingUnderscore?: _FlawlessNamingConventionUnderscoreOptions;
17459
+ prefix?: _FlawlessNamingConvention_PrefixSuffixConfig;
17460
+ suffix?: _FlawlessNamingConvention_PrefixSuffixConfig;
17461
+ trailingUnderscore?: _FlawlessNamingConventionUnderscoreOptions;
17462
+ filter?: (string | _FlawlessNamingConvention_MatchRegexConfig);
17463
+ selector: "objectStyleEnumMember";
17464
+ modifiers?: ("requiresQuotes")[];
17465
+ } | {
17466
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
17345
17467
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
17346
17468
  failureMessage?: string;
17347
17469
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -17353,6 +17475,7 @@ type FlawlessNamingConvention = ({
17353
17475
  selector: "typeLike";
17354
17476
  modifiers?: ("abstract" | "exported" | "unused")[];
17355
17477
  } | {
17478
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
17356
17479
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
17357
17480
  failureMessage?: string;
17358
17481
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -17364,6 +17487,7 @@ type FlawlessNamingConvention = ({
17364
17487
  selector: "class";
17365
17488
  modifiers?: ("abstract" | "exported" | "unused")[];
17366
17489
  } | {
17490
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
17367
17491
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
17368
17492
  failureMessage?: string;
17369
17493
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -17375,6 +17499,7 @@ type FlawlessNamingConvention = ({
17375
17499
  selector: "interface";
17376
17500
  modifiers?: ("exported" | "unused")[];
17377
17501
  } | {
17502
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
17378
17503
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
17379
17504
  failureMessage?: string;
17380
17505
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -17386,6 +17511,7 @@ type FlawlessNamingConvention = ({
17386
17511
  selector: "typeAlias";
17387
17512
  modifiers?: ("exported" | "unused")[];
17388
17513
  } | {
17514
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
17389
17515
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
17390
17516
  failureMessage?: string;
17391
17517
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -17397,6 +17523,7 @@ type FlawlessNamingConvention = ({
17397
17523
  selector: "enum";
17398
17524
  modifiers?: ("exported" | "unused")[];
17399
17525
  } | {
17526
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
17400
17527
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
17401
17528
  failureMessage?: string;
17402
17529
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -17408,6 +17535,7 @@ type FlawlessNamingConvention = ({
17408
17535
  selector: "typeParameter";
17409
17536
  modifiers?: ("unused")[];
17410
17537
  } | {
17538
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
17411
17539
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
17412
17540
  failureMessage?: string;
17413
17541
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -27273,6 +27401,22 @@ interface OptionsOverridesTypeAware extends OptionsOverrides {
27273
27401
  overridesTypeAware?: NonNullable<TypedFlatConfigItem["rules"]>;
27274
27402
  }
27275
27403
  interface NamingConfig extends OptionsOverridesTypeAware {
27404
+ /**
27405
+ * Words that keep their own casing inside a name when checking
27406
+ * `strictCamelCase` / `StrictPascalCase`, so an identifier may mirror the
27407
+ * type it holds - `targetCFrame` rather than `targetCframe`. The rest of
27408
+ * the name is still checked.
27409
+ *
27410
+ * `true` uses `ROBLOX_ALLOWED_WORDS`, the list generated from
27411
+ * `@rbxts/types`. An array uses exactly those words; spread
27412
+ * `ROBLOX_ALLOWED_WORDS` into it to extend rather than replace.
27413
+ *
27414
+ * Applies to every selector, including those passed via `selectors`. A
27415
+ * selector opts out with its own `allowedWords: []`.
27416
+ *
27417
+ * @default false
27418
+ */
27419
+ allowedWords?: Array<string> | boolean;
27276
27420
  /**
27277
27421
  * Whether the project targets Roblox. Enables `@rbxts/react`
27278
27422
  * type-reference matchers in the TSX config so React components and
@@ -27905,6 +28049,9 @@ declare function isentinel<const O extends Omit<OptionsConfig, "namedConfigs"> &
27905
28049
  namedConfigs?: boolean;
27906
28050
  }, const C extends Array<Awaitable<Array<TypedFlatConfigItem> | FlatConfigComposer<any, any> | TypedFlatConfigItem>>>(options: CatchAllOptionsArgument<O>, ...userConfigs: C & ContextualItems<C, UserConfigElement, TypedFlatConfigItem> & RequireNamedItems<O> & ValidateUserConfigs<C, O>): Promise<FlatConfigComposer<TypedFlatConfigItem, ConfigNames>>;
27907
28051
  //#endregion
28052
+ //#region src/generated/roblox-allowed-words.d.ts
28053
+ declare const ROBLOX_ALLOWED_WORDS: ReadonlyArray<string>;
28054
+ //#endregion
27908
28055
  //#region src/globs.d.ts
27909
28056
  declare const GLOB_ROOT: string[];
27910
28057
  declare const GLOB_ROOT_SRC: string[];
@@ -28186,4 +28333,4 @@ declare function unicorn({ complementIgnores, nameReplacements, roblox, root: cu
28186
28333
  //#region src/eslint/configs/yaml.d.ts
28187
28334
  declare function yaml({ files, overrides, stylistic }?: OptionsFiles & OptionsOverrides & OptionsStylistic): Promise<Array<TypedFlatConfigItem>>;
28188
28335
  //#endregion
28189
- 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 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 };
28336
+ 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 };
package/dist/index.mjs CHANGED
@@ -2689,12 +2689,137 @@ function markdown({ componentExts: componentExtensions = [], files = [GLOB_MARKD
2689
2689
  ];
2690
2690
  }
2691
2691
  //#endregion
2692
+ //#region src/generated/roblox-allowed-words.ts
2693
+ const ROBLOX_ALLOWED_WORDS = [
2694
+ "AdUIEventType",
2695
+ "AdUIType",
2696
+ "AnimationNodeBlend2DInputMode",
2697
+ "CFrame",
2698
+ "CloudCRUDService",
2699
+ "CreationDBService",
2700
+ "CrossDMScriptChangeListener",
2701
+ "DebuggerUIService",
2702
+ "FACSDataLod",
2703
+ "IKCollisionsMode",
2704
+ "IKControl",
2705
+ "ILegacyStudioBridge",
2706
+ "IXPLoadingStatus",
2707
+ "IXPService",
2708
+ "MLModelDeliveryService",
2709
+ "MLService",
2710
+ "MLSession",
2711
+ "PVAdornment",
2712
+ "PVInstance",
2713
+ "PackageUIService",
2714
+ "Path2DControlPoint",
2715
+ "QDir",
2716
+ "QFont",
2717
+ "RBXObject",
2718
+ "RBXScriptConnection",
2719
+ "RBXScriptSignal",
2720
+ "RTAnimationTracker",
2721
+ "TextXAlignment",
2722
+ "TextYAlignment",
2723
+ "UDim",
2724
+ "UGCAvatarService",
2725
+ "UIAspectRatioConstraint",
2726
+ "UIBase",
2727
+ "UICaptureMode",
2728
+ "UIComponent",
2729
+ "UIConstraint",
2730
+ "UICorner",
2731
+ "UIDragDetector",
2732
+ "UIDragSpeedAxisMapping",
2733
+ "UIFlexAlignment",
2734
+ "UIFlexItem",
2735
+ "UIFlexMode",
2736
+ "UIGradient",
2737
+ "UIGridLayout",
2738
+ "UIGridStyleLayout",
2739
+ "UILayout",
2740
+ "UIListLayout",
2741
+ "UIPadding",
2742
+ "UIPageLayout",
2743
+ "UIScale",
2744
+ "UIShadow",
2745
+ "UISizeConstraint",
2746
+ "UIStroke",
2747
+ "UITableLayout",
2748
+ "UITextSizeConstraint",
2749
+ "UITheme",
2750
+ "VRComfortSetting",
2751
+ "VRControllerModelMode",
2752
+ "VRDeviceType",
2753
+ "VRLaserPointerMode",
2754
+ "VRSafetyBubbleMode",
2755
+ "VRScaling",
2756
+ "VRService",
2757
+ "VRSessionState",
2758
+ "VRStatusService",
2759
+ "VRTouchpad",
2760
+ "ZIndexBehavior"
2761
+ ];
2762
+ //#endregion
2692
2763
  //#region src/eslint/configs/naming.ts
2693
2764
  init_globs();
2694
2765
  const RBXTS_REACT = "@rbxts/react";
2766
+ /**
2767
+ * Component-valued types from `@rbxts/react`.
2768
+ *
2769
+ * `ComponentType` is an alias for `ComponentClass | FunctionComponent`, and the
2770
+ * type matcher splits unions before matching, so both members have to be listed
2771
+ * for a `ComponentType`-annotated name to match.
2772
+ */
2773
+ const REACT_COMPONENT_TYPES = [
2774
+ {
2775
+ name: "ComponentClass",
2776
+ from: RBXTS_REACT
2777
+ },
2778
+ {
2779
+ name: "Context",
2780
+ from: RBXTS_REACT
2781
+ },
2782
+ {
2783
+ name: "ExoticComponent",
2784
+ from: RBXTS_REACT
2785
+ },
2786
+ {
2787
+ name: "FC",
2788
+ from: RBXTS_REACT
2789
+ },
2790
+ {
2791
+ name: "ForwardRefExoticComponent",
2792
+ from: RBXTS_REACT
2793
+ },
2794
+ {
2795
+ name: "FunctionComponent",
2796
+ from: RBXTS_REACT
2797
+ },
2798
+ {
2799
+ name: "LazyExoticComponent",
2800
+ from: RBXTS_REACT
2801
+ },
2802
+ {
2803
+ name: "MemoExoticComponent",
2804
+ from: RBXTS_REACT
2805
+ },
2806
+ {
2807
+ name: "NamedExoticComponent",
2808
+ from: RBXTS_REACT
2809
+ }
2810
+ ];
2811
+ const REACT_ELEMENT_RETURN_TYPES = [{ returns: {
2812
+ name: "Element",
2813
+ from: RBXTS_REACT
2814
+ } }, { returns: {
2815
+ name: "ReactNode",
2816
+ from: RBXTS_REACT
2817
+ } }];
2695
2818
  async function naming(options = {}) {
2696
- const { overridesTypeAware = {}, roblox: isRoblox = true, selectors = [], selectorsTsx = [], typeAware = true } = options;
2819
+ const { allowedWords = false, overridesTypeAware = {}, roblox: isRoblox = true, selectors = [], selectorsTsx = [], typeAware = true } = options;
2697
2820
  const eslintPluginFlawless = await interopDefault(import("eslint-plugin-flawless"));
2821
+ const configuredWords = allowedWords === true ? ROBLOX_ALLOWED_WORDS : allowedWords;
2822
+ const words = configuredWords === false || configuredWords.length === 0 ? void 0 : configuredWords;
2698
2823
  const tsFilesTypeAware = [GLOB_TS];
2699
2824
  const tsxFilesTypeAware = [GLOB_TSX];
2700
2825
  const ignoresTypeAware = options.ignoresTypeAware ?? [`**/*.md/**`, "**/*.d.{,c,m}ts"];
@@ -2702,7 +2827,8 @@ async function naming(options = {}) {
2702
2827
  return [
2703
2828
  {
2704
2829
  name: "isentinel/naming/setup",
2705
- plugins: { flawless: eslintPluginFlawless }
2830
+ plugins: { flawless: eslintPluginFlawless },
2831
+ ...words !== void 0 ? { settings: { flawless: { namingConvention: { allowedWords: words } } } } : {}
2706
2832
  },
2707
2833
  ...isTypeAware ? [{
2708
2834
  name: "isentinel/naming/ts/rules-type-aware",
@@ -2720,6 +2846,7 @@ async function naming(options = {}) {
2720
2846
  format: null,
2721
2847
  selector: "import"
2722
2848
  },
2849
+ ...isRoblox ? reactSelectors() : [],
2723
2850
  {
2724
2851
  format: null,
2725
2852
  modifiers: ["destructured"],
@@ -2883,38 +3010,7 @@ async function naming(options = {}) {
2883
3010
  leadingUnderscore: "allow",
2884
3011
  selector: "variable"
2885
3012
  },
2886
- ...isRoblox ? [{
2887
- format: ["StrictPascalCase"],
2888
- selector: ["parameter", "variable"],
2889
- types: [
2890
- {
2891
- name: "Context",
2892
- from: RBXTS_REACT
2893
- },
2894
- {
2895
- name: "FC",
2896
- from: RBXTS_REACT
2897
- },
2898
- {
2899
- name: "FunctionComponent",
2900
- from: RBXTS_REACT
2901
- }
2902
- ]
2903
- }, {
2904
- format: ["strictCamelCase", "StrictPascalCase"],
2905
- selector: [
2906
- "parameter",
2907
- "typeMethod",
2908
- "variable"
2909
- ],
2910
- types: [{ returns: {
2911
- name: "Element",
2912
- from: RBXTS_REACT
2913
- } }, { returns: {
2914
- name: "ReactNode",
2915
- from: RBXTS_REACT
2916
- } }]
2917
- }] : [],
3013
+ ...isRoblox ? reactSelectors() : [],
2918
3014
  {
2919
3015
  format: null,
2920
3016
  modifiers: ["destructured"],
@@ -3036,6 +3132,34 @@ async function naming(options = {}) {
3036
3132
  }] : []
3037
3133
  ];
3038
3134
  }
3135
+ /**
3136
+ * Selectors that let React component values carry component casing.
3137
+ *
3138
+ * @returns The naming-convention selectors for `@rbxts/react` types.
3139
+ */
3140
+ function reactSelectors() {
3141
+ return [
3142
+ {
3143
+ format: ["StrictPascalCase"],
3144
+ selector: ["parameter", "variable"],
3145
+ types: REACT_COMPONENT_TYPES
3146
+ },
3147
+ {
3148
+ format: ["strictCamelCase", "StrictPascalCase"],
3149
+ selector: ["classProperty", "typeProperty"],
3150
+ types: REACT_COMPONENT_TYPES
3151
+ },
3152
+ {
3153
+ format: ["strictCamelCase", "StrictPascalCase"],
3154
+ selector: [
3155
+ "parameter",
3156
+ "typeMethod",
3157
+ "variable"
3158
+ ],
3159
+ types: REACT_ELEMENT_RETURN_TYPES
3160
+ }
3161
+ ];
3162
+ }
3039
3163
  //#endregion
3040
3164
  //#region src/rules/node.ts
3041
3165
  /**
@@ -19964,4 +20088,4 @@ async function isentinel(options, ...userConfigs) {
19964
20088
  return composer;
19965
20089
  }
19966
20090
  //#endregion
19967
- export { 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, MARKDOWN_PROCESSOR_NAME, StylisticConfigDefaults, comments, isentinel as default, isentinel, defaultPluginRenaming, disables, e18e, eslintPlugin, flawless, gitignore, ignores, imports, isAgentAutofixDisabled, isInAgentSession, isInEditorEnvironment, isInGitHooksOrLintStaged, javascript, jsdoc, jsonc, loadSmallRulesPlugin, markdown, naming, node, oxfmt, packageJson, perfectionist, pnpm, promise, react, roblox, smallRules, sonarjs, sortCspell, sortGithubAction, sortMiseToml, sortPnpmWorkspace, sortRojoProject, sortTsconfig, spelling, stylistic, test, toml, typescript, unicorn, yaml };
20091
+ export { 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, MARKDOWN_PROCESSOR_NAME, ROBLOX_ALLOWED_WORDS, StylisticConfigDefaults, comments, isentinel as default, isentinel, defaultPluginRenaming, disables, e18e, eslintPlugin, flawless, gitignore, ignores, imports, isAgentAutofixDisabled, isInAgentSession, isInEditorEnvironment, isInGitHooksOrLintStaged, javascript, jsdoc, jsonc, loadSmallRulesPlugin, markdown, naming, node, oxfmt, packageJson, perfectionist, pnpm, promise, react, roblox, smallRules, sonarjs, sortCspell, sortGithubAction, sortMiseToml, sortPnpmWorkspace, sortRojoProject, sortTsconfig, spelling, stylistic, test, toml, typescript, unicorn, yaml };
package/dist/lint-cli.mjs CHANGED
@@ -38,7 +38,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
38
38
  }) : target, mod));
39
39
  //#endregion
40
40
  //#region package.json
41
- var version = "6.0.0-beta.39";
41
+ var version = "6.0.0-beta.40";
42
42
  //#endregion
43
43
  //#region src/lint-cli/lib/cli/types.ts
44
44
  /**
package/dist/oxlint.d.mts CHANGED
@@ -4487,107 +4487,107 @@ interface RuleOptions {
4487
4487
  'eslint-plugin/unique-test-case-names'?: Linter.RuleEntry<[]>;
4488
4488
  /**
4489
4489
  * Enforce arrow function return style based on line length
4490
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/arrow-return-style/documentation.md
4490
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/arrow-return-style/documentation.md
4491
4491
  */
4492
4492
  'flawless/arrow-return-style'?: Linter.RuleEntry<FlawlessArrowReturnStyle>;
4493
4493
  /**
4494
4494
  * Disallow shorthand boolean JSX attributes
4495
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/jsx-shorthand-boolean/documentation.md
4495
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/jsx-shorthand-boolean/documentation.md
4496
4496
  */
4497
4497
  'flawless/jsx-shorthand-boolean'?: Linter.RuleEntry<[]>;
4498
4498
  /**
4499
4499
  * Enforce a consistent fragment form: the shorthand `<>...</>` or a named fragment
4500
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/jsx-shorthand-fragment/documentation.md
4500
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/jsx-shorthand-fragment/documentation.md
4501
4501
  */
4502
4502
  'flawless/jsx-shorthand-fragment'?: Linter.RuleEntry<FlawlessJsxShorthandFragment>;
4503
4503
  /**
4504
4504
  * Enforce a maximum number of lines of code in a function
4505
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/max-lines-per-function/documentation.md
4505
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/max-lines-per-function/documentation.md
4506
4506
  */
4507
4507
  'flawless/max-lines-per-function'?: Linter.RuleEntry<FlawlessMaxLinesPerFunction>;
4508
4508
  /**
4509
4509
  * Enforce naming conventions for everything across a codebase
4510
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/naming-convention/documentation.md
4510
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/naming-convention/documentation.md
4511
4511
  */
4512
4512
  'flawless/naming-convention'?: Linter.RuleEntry<FlawlessNamingConvention>;
4513
4513
  /**
4514
4514
  * Disallow conditional logic in tests
4515
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/no-conditional-in-test/documentation.md
4515
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/no-conditional-in-test/documentation.md
4516
4516
  */
4517
4517
  'flawless/no-conditional-in-test'?: Linter.RuleEntry<FlawlessNoConditionalInTest>;
4518
4518
  /**
4519
4519
  * Disallow anonymous arrow functions as export default declarations
4520
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/no-export-default-arrow/documentation.md
4520
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/no-export-default-arrow/documentation.md
4521
4521
  */
4522
4522
  'flawless/no-export-default-arrow'?: Linter.RuleEntry<[]>;
4523
4523
  /**
4524
4524
  * Disallow exact equality checks involving floating-point-sensitive values
4525
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/no-floating-point-equality/documentation.md
4525
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/no-floating-point-equality/documentation.md
4526
4526
  */
4527
4527
  'flawless/no-floating-point-equality'?: Linter.RuleEntry<[]>;
4528
4528
  /**
4529
4529
  * Disallow tsconfig options that redundantly re-set a value already provided by an extended config
4530
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/no-redundant-tsconfig-options/documentation.md
4530
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/no-redundant-tsconfig-options/documentation.md
4531
4531
  */
4532
4532
  'flawless/no-redundant-tsconfig-options'?: Linter.RuleEntry<[]>;
4533
4533
  /**
4534
4534
  * Disallow unnecessary usage of 'useCallback'
4535
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/no-unnecessary-use-callback/documentation.md
4535
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/no-unnecessary-use-callback/documentation.md
4536
4536
  */
4537
4537
  'flawless/no-unnecessary-use-callback'?: Linter.RuleEntry<[]>;
4538
4538
  /**
4539
4539
  * Disallow unnecessary usage of 'useMemo'
4540
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/no-unnecessary-use-memo/documentation.md
4540
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/no-unnecessary-use-memo/documentation.md
4541
4541
  */
4542
4542
  'flawless/no-unnecessary-use-memo'?: Linter.RuleEntry<[]>;
4543
4543
  /**
4544
4544
  * Enforce a blank line after `expect.assertions` and `expect.hasAssertions`
4545
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/padding-after-expect-assertions/documentation.md
4545
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/padding-after-expect-assertions/documentation.md
4546
4546
  */
4547
4547
  'flawless/padding-after-expect-assertions'?: Linter.RuleEntry<[]>;
4548
4548
  /**
4549
4549
  * Enforce destructuring assignment for component props
4550
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/prefer-destructuring-assignment/documentation.md
4550
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/prefer-destructuring-assignment/documentation.md
4551
4551
  */
4552
4552
  'flawless/prefer-destructuring-assignment'?: Linter.RuleEntry<[]>;
4553
4553
  /**
4554
4554
  * Prefer having the last statement in a test be an assertion
4555
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/prefer-ending-with-an-expect/documentation.md
4555
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/prefer-ending-with-an-expect/documentation.md
4556
4556
  */
4557
4557
  'flawless/prefer-ending-with-an-expect'?: Linter.RuleEntry<FlawlessPreferEndingWithAnExpect>;
4558
4558
  /**
4559
4559
  * Prefer `expect.assertions(<count>)` over `expect.hasAssertions()`
4560
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/prefer-expect-assertions-count/documentation.md
4560
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/prefer-expect-assertions-count/documentation.md
4561
4561
  */
4562
4562
  'flawless/prefer-expect-assertions-count'?: Linter.RuleEntry<[]>;
4563
4563
  /**
4564
4564
  * Enforce destructuring parameters in the function signature
4565
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/prefer-parameter-destructuring/documentation.md
4565
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/prefer-parameter-destructuring/documentation.md
4566
4566
  */
4567
4567
  'flawless/prefer-parameter-destructuring'?: Linter.RuleEntry<FlawlessPreferParameterDestructuring>;
4568
4568
  /**
4569
4569
  * Enforce that function component props are read-only
4570
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/prefer-read-only-props/documentation.md
4570
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/prefer-read-only-props/documentation.md
4571
4571
  */
4572
4572
  'flawless/prefer-read-only-props'?: Linter.RuleEntry<FlawlessPreferReadOnlyProps>;
4573
4573
  /**
4574
4574
  * Disallow impure calls such as `math.random` or `os.clock` during render
4575
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/purity/documentation.md
4575
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/purity/documentation.md
4576
4576
  */
4577
4577
  'flawless/purity'?: Linter.RuleEntry<FlawlessPurity>;
4578
4578
  /**
4579
4579
  * Prefer named imports for React runtime values and the React namespace for React types
4580
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/react-namespace/documentation.md
4580
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/react-namespace/documentation.md
4581
4581
  */
4582
4582
  'flawless/react-namespace'?: Linter.RuleEntry<[]>;
4583
4583
  /**
4584
4584
  * Enforce a configured sort order for TOML keys and tables
4585
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/toml-sort-keys/documentation.md
4585
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/toml-sort-keys/documentation.md
4586
4586
  */
4587
4587
  'flawless/toml-sort-keys'?: Linter.RuleEntry<FlawlessTomlSortKeys>;
4588
4588
  /**
4589
4589
  * Enforce blank lines around top-level YAML block collection keys
4590
- * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.5.1/src/rules/yaml-block-key-blank-lines/documentation.md
4590
+ * @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.7.0/src/rules/yaml-block-key-blank-lines/documentation.md
4591
4591
  */
4592
4592
  'flawless/yaml-block-key-blank-lines'?: Linter.RuleEntry<[]>;
4593
4593
  /**
@@ -14470,6 +14470,7 @@ type FlawlessMaxLinesPerFunction = [] | [{
14470
14470
  skipComments?: boolean;
14471
14471
  }];
14472
14472
  // ----- flawless/naming-convention -----
14473
+ type _FlawlessNamingConvention_AllowedWordsConfig = string[];
14473
14474
  type _FlawlessNamingConventionFormatOptionsConfig = (_FlawlessNamingConventionPredefinedFormats[] | null);
14474
14475
  type _FlawlessNamingConventionPredefinedFormats = ("camelCase" | "strictCamelCase" | "PascalCase" | "StrictPascalCase" | "snake_case" | "UPPER_CASE");
14475
14476
  type _FlawlessNamingConventionUnderscoreOptions = ("forbid" | "allow" | "require" | "requireDouble" | "allowDouble" | "allowSingleOrDouble");
@@ -14499,6 +14500,7 @@ type _FlawlessNamingConvention_TypeReferenceMatcher = (({
14499
14500
  });
14500
14501
  });
14501
14502
  type FlawlessNamingConvention = ({
14503
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
14502
14504
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
14503
14505
  failureMessage?: string;
14504
14506
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -14508,9 +14510,10 @@ type FlawlessNamingConvention = ({
14508
14510
  trailingUnderscore?: _FlawlessNamingConventionUnderscoreOptions;
14509
14511
  filter?: (string | _FlawlessNamingConvention_MatchRegexConfig);
14510
14512
  modifiers?: ("const" | "readonly" | "static" | "public" | "protected" | "private" | "#private" | "abstract" | "destructured" | "global" | "exported" | "unused" | "requiresQuotes" | "override" | "async" | "default" | "namespace" | "constAsserted")[];
14511
- selector: ("default" | "variableLike" | "memberLike" | "typeLike" | "method" | "property" | "accessor" | "variable" | "function" | "parameter" | "objectStyleEnum" | "parameterProperty" | "classicAccessor" | "enumMember" | "classMethod" | "objectLiteralMethod" | "typeMethod" | "classProperty" | "objectLiteralProperty" | "typeProperty" | "autoAccessor" | "class" | "interface" | "typeAlias" | "enum" | "typeParameter" | "import")[];
14513
+ 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")[];
14512
14514
  types?: _FlawlessNamingConventionTypeMatcher[];
14513
14515
  } | {
14516
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
14514
14517
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
14515
14518
  failureMessage?: string;
14516
14519
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -14522,6 +14525,7 @@ type FlawlessNamingConvention = ({
14522
14525
  selector: "default";
14523
14526
  modifiers?: ("const" | "readonly" | "static" | "public" | "protected" | "private" | "#private" | "abstract" | "destructured" | "global" | "exported" | "unused" | "requiresQuotes" | "override" | "async" | "default" | "namespace" | "constAsserted")[];
14524
14527
  } | {
14528
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
14525
14529
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
14526
14530
  failureMessage?: string;
14527
14531
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -14533,6 +14537,7 @@ type FlawlessNamingConvention = ({
14533
14537
  selector: "variableLike";
14534
14538
  modifiers?: ("unused" | "async")[];
14535
14539
  } | {
14540
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
14536
14541
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
14537
14542
  failureMessage?: string;
14538
14543
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -14545,6 +14550,7 @@ type FlawlessNamingConvention = ({
14545
14550
  modifiers?: ("const" | "constAsserted" | "destructured" | "exported" | "global" | "unused" | "async")[];
14546
14551
  types?: _FlawlessNamingConventionTypeMatcher[];
14547
14552
  } | {
14553
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
14548
14554
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
14549
14555
  failureMessage?: string;
14550
14556
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -14557,6 +14563,7 @@ type FlawlessNamingConvention = ({
14557
14563
  modifiers?: ("exported" | "global" | "unused" | "async")[];
14558
14564
  types?: _FlawlessNamingConventionTypeMatcher[];
14559
14565
  } | {
14566
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
14560
14567
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
14561
14568
  failureMessage?: string;
14562
14569
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -14569,6 +14576,7 @@ type FlawlessNamingConvention = ({
14569
14576
  modifiers?: ("destructured" | "unused")[];
14570
14577
  types?: _FlawlessNamingConventionTypeMatcher[];
14571
14578
  } | {
14579
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
14572
14580
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
14573
14581
  failureMessage?: string;
14574
14582
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -14580,6 +14588,7 @@ type FlawlessNamingConvention = ({
14580
14588
  selector: "objectStyleEnum";
14581
14589
  modifiers?: ("const" | "exported" | "global" | "unused")[];
14582
14590
  } | {
14591
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
14583
14592
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
14584
14593
  failureMessage?: string;
14585
14594
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -14591,6 +14600,7 @@ type FlawlessNamingConvention = ({
14591
14600
  selector: "memberLike";
14592
14601
  modifiers?: ("abstract" | "private" | "#private" | "protected" | "public" | "readonly" | "requiresQuotes" | "static" | "override" | "async")[];
14593
14602
  } | {
14603
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
14594
14604
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
14595
14605
  failureMessage?: string;
14596
14606
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -14603,6 +14613,7 @@ type FlawlessNamingConvention = ({
14603
14613
  modifiers?: ("abstract" | "private" | "#private" | "protected" | "public" | "readonly" | "requiresQuotes" | "static" | "override")[];
14604
14614
  types?: _FlawlessNamingConventionTypeMatcher[];
14605
14615
  } | {
14616
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
14606
14617
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
14607
14618
  failureMessage?: string;
14608
14619
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -14615,6 +14626,7 @@ type FlawlessNamingConvention = ({
14615
14626
  modifiers?: ("public" | "requiresQuotes")[];
14616
14627
  types?: _FlawlessNamingConventionTypeMatcher[];
14617
14628
  } | {
14629
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
14618
14630
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
14619
14631
  failureMessage?: string;
14620
14632
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -14627,6 +14639,7 @@ type FlawlessNamingConvention = ({
14627
14639
  modifiers?: ("public" | "readonly" | "requiresQuotes")[];
14628
14640
  types?: _FlawlessNamingConventionTypeMatcher[];
14629
14641
  } | {
14642
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
14630
14643
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
14631
14644
  failureMessage?: string;
14632
14645
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -14639,6 +14652,7 @@ type FlawlessNamingConvention = ({
14639
14652
  modifiers?: ("private" | "protected" | "public" | "readonly")[];
14640
14653
  types?: _FlawlessNamingConventionTypeMatcher[];
14641
14654
  } | {
14655
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
14642
14656
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
14643
14657
  failureMessage?: string;
14644
14658
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -14651,6 +14665,7 @@ type FlawlessNamingConvention = ({
14651
14665
  modifiers?: ("abstract" | "private" | "#private" | "protected" | "public" | "readonly" | "requiresQuotes" | "static" | "override" | "async")[];
14652
14666
  types?: _FlawlessNamingConventionTypeMatcher[];
14653
14667
  } | {
14668
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
14654
14669
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
14655
14670
  failureMessage?: string;
14656
14671
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -14663,6 +14678,7 @@ type FlawlessNamingConvention = ({
14663
14678
  modifiers?: ("abstract" | "private" | "#private" | "protected" | "public" | "requiresQuotes" | "static" | "override" | "async")[];
14664
14679
  types?: _FlawlessNamingConventionTypeMatcher[];
14665
14680
  } | {
14681
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
14666
14682
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
14667
14683
  failureMessage?: string;
14668
14684
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -14675,6 +14691,7 @@ type FlawlessNamingConvention = ({
14675
14691
  modifiers?: ("public" | "requiresQuotes" | "async")[];
14676
14692
  types?: _FlawlessNamingConventionTypeMatcher[];
14677
14693
  } | {
14694
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
14678
14695
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
14679
14696
  failureMessage?: string;
14680
14697
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -14687,6 +14704,7 @@ type FlawlessNamingConvention = ({
14687
14704
  modifiers?: ("public" | "requiresQuotes")[];
14688
14705
  types?: _FlawlessNamingConventionTypeMatcher[];
14689
14706
  } | {
14707
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
14690
14708
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
14691
14709
  failureMessage?: string;
14692
14710
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -14699,6 +14717,7 @@ type FlawlessNamingConvention = ({
14699
14717
  modifiers?: ("abstract" | "private" | "#private" | "protected" | "public" | "requiresQuotes" | "static" | "override" | "async")[];
14700
14718
  types?: _FlawlessNamingConventionTypeMatcher[];
14701
14719
  } | {
14720
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
14702
14721
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
14703
14722
  failureMessage?: string;
14704
14723
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -14711,6 +14730,7 @@ type FlawlessNamingConvention = ({
14711
14730
  modifiers?: ("abstract" | "private" | "protected" | "public" | "requiresQuotes" | "static" | "override")[];
14712
14731
  types?: _FlawlessNamingConventionTypeMatcher[];
14713
14732
  } | {
14733
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
14714
14734
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
14715
14735
  failureMessage?: string;
14716
14736
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -14723,6 +14743,7 @@ type FlawlessNamingConvention = ({
14723
14743
  modifiers?: ("abstract" | "private" | "protected" | "public" | "requiresQuotes" | "static" | "override")[];
14724
14744
  types?: _FlawlessNamingConventionTypeMatcher[];
14725
14745
  } | {
14746
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
14726
14747
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
14727
14748
  failureMessage?: string;
14728
14749
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -14735,6 +14756,7 @@ type FlawlessNamingConvention = ({
14735
14756
  modifiers?: ("abstract" | "private" | "protected" | "public" | "requiresQuotes" | "static" | "override")[];
14736
14757
  types?: _FlawlessNamingConventionTypeMatcher[];
14737
14758
  } | {
14759
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
14738
14760
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
14739
14761
  failureMessage?: string;
14740
14762
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -14746,6 +14768,19 @@ type FlawlessNamingConvention = ({
14746
14768
  selector: "enumMember";
14747
14769
  modifiers?: ("requiresQuotes")[];
14748
14770
  } | {
14771
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
14772
+ custom?: _FlawlessNamingConvention_MatchRegexConfig;
14773
+ failureMessage?: string;
14774
+ format: _FlawlessNamingConventionFormatOptionsConfig;
14775
+ leadingUnderscore?: _FlawlessNamingConventionUnderscoreOptions;
14776
+ prefix?: _FlawlessNamingConvention_PrefixSuffixConfig;
14777
+ suffix?: _FlawlessNamingConvention_PrefixSuffixConfig;
14778
+ trailingUnderscore?: _FlawlessNamingConventionUnderscoreOptions;
14779
+ filter?: (string | _FlawlessNamingConvention_MatchRegexConfig);
14780
+ selector: "objectStyleEnumMember";
14781
+ modifiers?: ("requiresQuotes")[];
14782
+ } | {
14783
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
14749
14784
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
14750
14785
  failureMessage?: string;
14751
14786
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -14757,6 +14792,7 @@ type FlawlessNamingConvention = ({
14757
14792
  selector: "typeLike";
14758
14793
  modifiers?: ("abstract" | "exported" | "unused")[];
14759
14794
  } | {
14795
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
14760
14796
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
14761
14797
  failureMessage?: string;
14762
14798
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -14768,6 +14804,7 @@ type FlawlessNamingConvention = ({
14768
14804
  selector: "class";
14769
14805
  modifiers?: ("abstract" | "exported" | "unused")[];
14770
14806
  } | {
14807
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
14771
14808
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
14772
14809
  failureMessage?: string;
14773
14810
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -14779,6 +14816,7 @@ type FlawlessNamingConvention = ({
14779
14816
  selector: "interface";
14780
14817
  modifiers?: ("exported" | "unused")[];
14781
14818
  } | {
14819
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
14782
14820
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
14783
14821
  failureMessage?: string;
14784
14822
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -14790,6 +14828,7 @@ type FlawlessNamingConvention = ({
14790
14828
  selector: "typeAlias";
14791
14829
  modifiers?: ("exported" | "unused")[];
14792
14830
  } | {
14831
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
14793
14832
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
14794
14833
  failureMessage?: string;
14795
14834
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -14801,6 +14840,7 @@ type FlawlessNamingConvention = ({
14801
14840
  selector: "enum";
14802
14841
  modifiers?: ("exported" | "unused")[];
14803
14842
  } | {
14843
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
14804
14844
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
14805
14845
  failureMessage?: string;
14806
14846
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -14812,6 +14852,7 @@ type FlawlessNamingConvention = ({
14812
14852
  selector: "typeParameter";
14813
14853
  modifiers?: ("unused")[];
14814
14854
  } | {
14855
+ allowedWords?: _FlawlessNamingConvention_AllowedWordsConfig;
14815
14856
  custom?: _FlawlessNamingConvention_MatchRegexConfig;
14816
14857
  failureMessage?: string;
14817
14858
  format: _FlawlessNamingConventionFormatOptionsConfig;
@@ -24628,6 +24669,22 @@ interface OptionsOverridesTypeAware extends OptionsOverrides {
24628
24669
  overridesTypeAware?: NonNullable<TypedFlatConfigItem["rules"]>;
24629
24670
  }
24630
24671
  interface NamingConfig extends OptionsOverridesTypeAware {
24672
+ /**
24673
+ * Words that keep their own casing inside a name when checking
24674
+ * `strictCamelCase` / `StrictPascalCase`, so an identifier may mirror the
24675
+ * type it holds - `targetCFrame` rather than `targetCframe`. The rest of
24676
+ * the name is still checked.
24677
+ *
24678
+ * `true` uses `ROBLOX_ALLOWED_WORDS`, the list generated from
24679
+ * `@rbxts/types`. An array uses exactly those words; spread
24680
+ * `ROBLOX_ALLOWED_WORDS` into it to extend rather than replace.
24681
+ *
24682
+ * Applies to every selector, including those passed via `selectors`. A
24683
+ * selector opts out with its own `allowedWords: []`.
24684
+ *
24685
+ * @default false
24686
+ */
24687
+ allowedWords?: Array<string> | boolean;
24631
24688
  /**
24632
24689
  * Whether the project targets Roblox. Enables `@rbxts/react`
24633
24690
  * type-reference matchers in the TSX config so React components and
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@isentinel/eslint-config",
3
- "version": "6.0.0-beta.39",
3
+ "version": "6.0.0-beta.40",
4
4
  "description": "iSentinel's ESLint config",
5
5
  "keywords": [
6
6
  "eslint-config",
@@ -76,7 +76,7 @@
76
76
  "eslint-plugin-better-max-params": "1.0.0",
77
77
  "eslint-plugin-comment-length": "2.3.1",
78
78
  "eslint-plugin-de-morgan": "2.1.3",
79
- "eslint-plugin-flawless": "1.5.1",
79
+ "eslint-plugin-flawless": "1.7.0",
80
80
  "eslint-plugin-format-lua": "2.0.0",
81
81
  "eslint-plugin-import-lite": "0.6.0",
82
82
  "eslint-plugin-jsdoc": "63.2.2",
@@ -113,6 +113,7 @@
113
113
  "@eslint-react/shared": "5.17.3",
114
114
  "@eslint/config-inspector": "3.1.0",
115
115
  "@isentinel/tsconfig": "1.2.0",
116
+ "@rbxts/types": "1.0.943",
116
117
  "@stylistic/eslint-plugin-migrate": "4.4.1",
117
118
  "@total-typescript/shoehorn": "0.1.2",
118
119
  "@types/node": "24.1.0",
@@ -143,7 +144,7 @@
143
144
  "typescript": "6.0.3",
144
145
  "unplugin-unused": "0.5.7",
145
146
  "vitest": "4.1.10",
146
- "@isentinel/eslint-config": "6.0.0-beta.39"
147
+ "@isentinel/eslint-config": "6.0.0-beta.40"
147
148
  },
148
149
  "peerDependencies": {
149
150
  "@vitest/eslint-plugin": "^1.6.4",
@@ -205,9 +206,10 @@
205
206
  "build:inspector": "pnpm build && pnpm dlx @eslint/config-inspector build --config eslint-inspector.config.ts --out-dir ./.eslint-config-inspector",
206
207
  "check:extensions": "node scripts/check-package-extensions.ts && node scripts/gen-package-extensions.ts --check",
207
208
  "check:published": "node scripts/check-published-extensions.ts",
209
+ "check:roblox-words": "node scripts/roblox-allowed-words-gen.ts --check",
208
210
  "check:type-aware": "node scripts/type-aware-gen.ts --check",
209
211
  "dev": "npx @eslint/config-inspector --config eslint-inspector.config.ts",
210
- "gen": "node scripts/typegen.ts && node scripts/typegen-oxlint.ts && node scripts/typegen-defaults.ts && node scripts/typegen-defaults-oxlint.ts && node scripts/versiongen.ts && node scripts/stylistic-gen.ts && node scripts/type-aware-gen.ts && node scripts/gen-package-extensions.ts",
212
+ "gen": "node scripts/typegen.ts && node scripts/typegen-oxlint.ts && node scripts/typegen-defaults.ts && node scripts/typegen-defaults-oxlint.ts && node scripts/versiongen.ts && node scripts/stylistic-gen.ts && node scripts/type-aware-gen.ts && node scripts/roblox-allowed-words-gen.ts && node scripts/gen-package-extensions.ts",
211
213
  "postgen": "echo 'Generation complete!'",
212
214
  "lint": "isentinel-lint",
213
215
  "oxlint": "oxlint",