@trackunit/eslint-plugin-trackunit 0.6.53 → 0.6.56

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.
Files changed (70) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/README.md +5 -4
  3. package/migrations/entry.js +3 -0
  4. package/migrations.json +3 -0
  5. package/package.json +4 -2
  6. package/src/index.d.ts +1 -1
  7. package/src/index.js +2 -1
  8. package/src/lib/config/index.d.ts +18 -0
  9. package/src/lib/config/plugins.d.ts +3 -0
  10. package/src/lib/config/presets/base.d.ts +11 -0
  11. package/src/lib/config/presets/base.js +1 -0
  12. package/src/lib/config/presets/react.d.ts +7 -0
  13. package/src/lib/config/presets/react.js +3 -0
  14. package/src/lib/rules/no-deprecated-graphql-fields/no-deprecated-graphql-fields.d.ts +4 -0
  15. package/src/lib/rules/no-deprecated-graphql-fields/no-deprecated-graphql-fields.js +104 -0
  16. package/src/lib/rules/no-deprecated-graphql-fields/schema-cache.d.ts +3 -0
  17. package/src/lib/rules/no-deprecated-graphql-fields/schema-cache.js +31 -0
  18. package/src/lib/rules-map.d.ts +3 -0
  19. package/src/lib/rules-map.js +2 -0
  20. package/src/index.js.map +0 -1
  21. package/src/lib/config/fragments/ignores.js.map +0 -1
  22. package/src/lib/config/fragments/import-rules.js.map +0 -1
  23. package/src/lib/config/fragments/jest-overrides.js.map +0 -1
  24. package/src/lib/config/fragments/jsdoc-rules.js.map +0 -1
  25. package/src/lib/config/fragments/module-boundaries.js.map +0 -1
  26. package/src/lib/config/fragments/no-direct-storage-access.js.map +0 -1
  27. package/src/lib/config/fragments/react-rules.js.map +0 -1
  28. package/src/lib/config/fragments/restricted-imports.js.map +0 -1
  29. package/src/lib/config/fragments/testing-library.js.map +0 -1
  30. package/src/lib/config/fragments/typescript-rules.js.map +0 -1
  31. package/src/lib/config/index.js.map +0 -1
  32. package/src/lib/config/plugins.js.map +0 -1
  33. package/src/lib/config/presets/base.js.map +0 -1
  34. package/src/lib/config/presets/e2e.js.map +0 -1
  35. package/src/lib/config/presets/react.js.map +0 -1
  36. package/src/lib/config/presets/server.js.map +0 -1
  37. package/src/lib/config/utils.js.map +0 -1
  38. package/src/lib/config-helpers/create-skip-when.js.map +0 -1
  39. package/src/lib/rules/component-name-matches-filename/component-name-matches-filename.js.map +0 -1
  40. package/src/lib/rules/cva-merge-base-classes-as-array/cva-merge-base-classes-as-array.js.map +0 -1
  41. package/src/lib/rules/design-guideline-button-icon-size-match/design-guideline-button-icon-size-match.js.map +0 -1
  42. package/src/lib/rules/no-internal-barrel-files/no-internal-barrel-files.js.map +0 -1
  43. package/src/lib/rules/no-internal-graphql-when-tagged-with-gql-public/no-internal-graphql-when-tagged-with-gql-public.js.map +0 -1
  44. package/src/lib/rules/no-jest-mock-trackunit-react-core-hooks/no-jest-mock-trackunit-react-core-hooks.js.map +0 -1
  45. package/src/lib/rules/no-template-strings-in-classname-prop/no-template-strings-in-classname-prop.js.map +0 -1
  46. package/src/lib/rules/no-typescript-assertion/no-typescript-assertion.js.map +0 -1
  47. package/src/lib/rules/one-component-per-file/one-component-per-file.js.map +0 -1
  48. package/src/lib/rules/prefer-destructured-imports/prefer-destructured-imports.js.map +0 -1
  49. package/src/lib/rules/prefer-event-specific-callback-naming/name-suggestion-strategies.js.map +0 -1
  50. package/src/lib/rules/prefer-event-specific-callback-naming/prefer-event-specific-callback-naming.js.map +0 -1
  51. package/src/lib/rules/prefer-event-specific-callback-naming/strategies/string-based.js.map +0 -1
  52. package/src/lib/rules/prefer-event-specific-callback-naming/strategies/type-based.js.map +0 -1
  53. package/src/lib/rules/prefer-event-specific-callback-naming/utils.js.map +0 -1
  54. package/src/lib/rules/prefer-field-components/prefer-field-components.js.map +0 -1
  55. package/src/lib/rules/prefer-mouse-event-handler-in-react-props/prefer-mouse-event-handler-in-react-props.js.map +0 -1
  56. package/src/lib/rules/require-classname-alternatives/require-classname-alternatives.js.map +0 -1
  57. package/src/lib/rules/require-component-prop-contracts/require-component-prop-contracts.js.map +0 -1
  58. package/src/lib/rules/require-list-item-virtualization-props/require-list-item-virtualization-props.js.map +0 -1
  59. package/src/lib/rules/require-optional-prop-initialization/require-optional-prop-initialization.js.map +0 -1
  60. package/src/lib/rules/require-optional-prop-initialization/suggestion-utils.js.map +0 -1
  61. package/src/lib/rules/require-storybook-folder-landing-page/require-storybook-folder-landing-page.js.map +0 -1
  62. package/src/lib/rules-map.js.map +0 -1
  63. package/src/lib/utils/ast-utils.js.map +0 -1
  64. package/src/lib/utils/classname-utils.js.map +0 -1
  65. package/src/lib/utils/component-utils.js.map +0 -1
  66. package/src/lib/utils/file-utils.js.map +0 -1
  67. package/src/lib/utils/import-utils.js.map +0 -1
  68. package/src/lib/utils/nx-utils.js.map +0 -1
  69. package/src/lib/utils/package-utils.js.map +0 -1
  70. package/src/lib/utils/typescript-utils.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,3 +1,39 @@
1
+ ## 0.6.56 (2026-07-03)
2
+
3
+ ### 🚀 Features
4
+
5
+ - **eslint:** add no-deprecated-graphql-fields rule ([#24113](https://github.com/Trackunit/manager/pull/24113))
6
+
7
+ ### 🧱 Updated Dependencies
8
+
9
+ - Updated shared-utils to 1.15.56
10
+
11
+ ### ❤️ Thank You
12
+
13
+ - Cursor @cursoragent
14
+ - Michael Buss Rønne @man-trackunit
15
+
16
+ ## 0.6.55 (2026-07-02)
17
+
18
+ ### 🚀 Features
19
+
20
+ - **migrations:** standard migration scaffold for all publish:npm packages [GLU-1354] ([#24119](https://github.com/Trackunit/manager/pull/24119))
21
+
22
+ ### 🧱 Updated Dependencies
23
+
24
+ - Updated shared-utils to 1.15.55
25
+
26
+ ### ❤️ Thank You
27
+
28
+ - Cursor @cursoragent
29
+ - Mikkel Thorbjørn Andersen @mta-trackunit
30
+
31
+ ## 0.6.54 (2026-07-02)
32
+
33
+ ### 🧱 Updated Dependencies
34
+
35
+ - Updated shared-utils to 1.15.54
36
+
1
37
  ## 0.6.53 (2026-07-02)
2
38
 
3
39
  ### 🧱 Updated Dependencies
package/README.md CHANGED
@@ -78,16 +78,17 @@ All custom rules are enabled automatically through the presets under the `@track
78
78
  ### NX / Monorepo
79
79
 
80
80
 
81
- | Rule | Severity | Auto-fix | Description |
82
- | ------------------------------------------------------------ | -------- | -------- | ------------------------------------------------------------------------------------------------------ |
83
- | `@trackunit/no-internal-graphql-when-tagged-with-gql-public` | error | — | Prevents internal GraphQL usage in projects tagged with `gql-public`. Applied to `project.json` files. |
81
+ | Rule | Severity | Auto-fix | Description |
82
+ | ------------------------------------------------------------ | -------- | -------- | ------------------------------------------------------------------------------------------------------------------------- |
83
+ | `@trackunit/no-internal-graphql-when-tagged-with-gql-public` | error | — | Prevents internal GraphQL usage in projects tagged with `gql:public`. Applied to `project.json` files. |
84
+ | `@trackunit/no-deprecated-graphql-fields` | error | — | Prevents usage of `@deprecated` GraphQL fields in projects tagged with `dependencies:no-deprecated`. Applied to `project.json` files. |
84
85
 
85
86
 
86
87
  ### Storybook
87
88
 
88
89
  | Rule | Severity | Auto-fix | Description |
89
90
  | ----------------------------------------------------- | -------- | -------- | ------------------------------------------------------------------------------------------------------------------- |
90
- | `@trackunit/require-storybook-folder-landing-page` | | no | Requires a `*.docs.mdx` landing page (`<Meta title>`) for every ancestor folder implied by a story's title. Report-only; not yet enabled in a preset. |
91
+ | `@trackunit/require-storybook-folder-landing-page` | error | no | Requires a `*.docs.mdx` landing page (`<Meta title>`) for every ancestor folder implied by a story's title. Enabled for `*.stories.{ts,tsx}` files in the `react` preset. |
91
92
 
92
93
  ## Utilities
93
94
 
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=entry.js.map
@@ -0,0 +1,3 @@
1
+ {
2
+ "generators": {}
3
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trackunit/eslint-plugin-trackunit",
3
- "version": "0.6.53",
3
+ "version": "0.6.56",
4
4
  "license": "SEE LICENSE IN LICENSE.txt",
5
5
  "repository": "https://github.com/Trackunit/manager",
6
6
  "engines": {
@@ -26,8 +26,10 @@
26
26
  },
27
27
  "peerDependencies": {
28
28
  "@typescript-eslint/parser": "^8.58.1",
29
- "eslint": "^9.33.0"
29
+ "eslint": "^9.33.0",
30
+ "graphql": "^16.0.0"
30
31
  },
32
+ "migrations": "./migrations.json",
31
33
  "types": "./src/index.d.ts",
32
34
  "main": "./src/index.js",
33
35
  "type": "commonjs"
package/src/index.d.ts CHANGED
@@ -6,4 +6,4 @@ export { findMonorepoRoot } from "./lib/config/utils";
6
6
  export type { MatchCriteria, ProjectMetadata } from "./lib/utils/nx-utils";
7
7
  export { strictJsdocRules } from "./lib/config/fragments/jsdoc-rules";
8
8
  export { restrictedImportRules } from "./lib/config/fragments/restricted-imports";
9
- export { globals, jsdoc, nx, reactHooks, tsParser } from "./lib/config/plugins";
9
+ export { globals, jsdoc, localRulesPlugin, nx, reactHooks, tsParser } from "./lib/config/plugins";
package/src/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.tsParser = exports.reactHooks = exports.nx = exports.jsdoc = exports.globals = exports.restrictedImportRules = exports.strictJsdocRules = exports.findMonorepoRoot = exports.createSkipWhen = exports.configs = void 0;
3
+ exports.tsParser = exports.reactHooks = exports.nx = exports.localRulesPlugin = exports.jsdoc = exports.globals = exports.restrictedImportRules = exports.strictJsdocRules = exports.findMonorepoRoot = exports.createSkipWhen = exports.configs = void 0;
4
4
  const rules_map_1 = require("./lib/rules-map");
5
5
  exports.default = rules_map_1.rulesMap;
6
6
  var config_1 = require("./lib/config");
@@ -16,6 +16,7 @@ Object.defineProperty(exports, "restrictedImportRules", { enumerable: true, get:
16
16
  var plugins_1 = require("./lib/config/plugins");
17
17
  Object.defineProperty(exports, "globals", { enumerable: true, get: function () { return plugins_1.globals; } });
18
18
  Object.defineProperty(exports, "jsdoc", { enumerable: true, get: function () { return plugins_1.jsdoc; } });
19
+ Object.defineProperty(exports, "localRulesPlugin", { enumerable: true, get: function () { return plugins_1.localRulesPlugin; } });
19
20
  Object.defineProperty(exports, "nx", { enumerable: true, get: function () { return plugins_1.nx; } });
20
21
  Object.defineProperty(exports, "reactHooks", { enumerable: true, get: function () { return plugins_1.reactHooks; } });
21
22
  Object.defineProperty(exports, "tsParser", { enumerable: true, get: function () { return plugins_1.tsParser; } });
@@ -26,6 +26,9 @@ export declare const configs: {
26
26
  "no-typescript-assertion": import("@typescript-eslint/utils/ts-eslint").RuleModule<"angleBracketAssertion" | "asAssertion" | "nonNullAssertion", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
27
27
  name: string;
28
28
  };
29
+ "no-deprecated-graphql-fields": import("@typescript-eslint/utils/ts-eslint").RuleModule<"deprecatedFieldUsed", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
30
+ name: string;
31
+ };
29
32
  "no-internal-graphql-when-tagged-with-gql-public": import("@typescript-eslint/utils/ts-eslint").RuleModule<"internalGraphqlFileFound", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
30
33
  name: string;
31
34
  };
@@ -136,6 +139,7 @@ export declare const configs: {
136
139
  rules: {
137
140
  [x: string]: import("eslint").Linter.RuleEntry<any[]>;
138
141
  "@trackunit/no-internal-graphql-when-tagged-with-gql-public"?: undefined;
142
+ "@trackunit/no-deprecated-graphql-fields"?: undefined;
139
143
  "@typescript-eslint/no-require-imports"?: undefined;
140
144
  "@nx/enforce-module-boundaries"?: undefined;
141
145
  };
@@ -178,6 +182,7 @@ export declare const configs: {
178
182
  "no-unused-expressions": string;
179
183
  "no-shadow": string;
180
184
  "@trackunit/no-internal-graphql-when-tagged-with-gql-public"?: undefined;
185
+ "@trackunit/no-deprecated-graphql-fields"?: undefined;
181
186
  "@typescript-eslint/no-require-imports"?: undefined;
182
187
  "@nx/enforce-module-boundaries"?: undefined;
183
188
  };
@@ -215,6 +220,9 @@ export declare const configs: {
215
220
  "no-typescript-assertion": import("@typescript-eslint/utils/ts-eslint").RuleModule<"angleBracketAssertion" | "asAssertion" | "nonNullAssertion", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
216
221
  name: string;
217
222
  };
223
+ "no-deprecated-graphql-fields": import("@typescript-eslint/utils/ts-eslint").RuleModule<"deprecatedFieldUsed", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
224
+ name: string;
225
+ };
218
226
  "no-internal-graphql-when-tagged-with-gql-public": import("@typescript-eslint/utils/ts-eslint").RuleModule<"internalGraphqlFileFound", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
219
227
  name: string;
220
228
  };
@@ -288,6 +296,7 @@ export declare const configs: {
288
296
  };
289
297
  rules: {
290
298
  "@trackunit/no-internal-graphql-when-tagged-with-gql-public": string;
299
+ "@trackunit/no-deprecated-graphql-fields": string;
291
300
  "@typescript-eslint/no-require-imports"?: undefined;
292
301
  "@nx/enforce-module-boundaries"?: undefined;
293
302
  };
@@ -296,6 +305,7 @@ export declare const configs: {
296
305
  rules: {
297
306
  "@typescript-eslint/no-require-imports": string;
298
307
  "@trackunit/no-internal-graphql-when-tagged-with-gql-public"?: undefined;
308
+ "@trackunit/no-deprecated-graphql-fields"?: undefined;
299
309
  "@nx/enforce-module-boundaries"?: undefined;
300
310
  };
301
311
  plugins?: undefined;
@@ -305,6 +315,7 @@ export declare const configs: {
305
315
  rules: {
306
316
  "@nx/enforce-module-boundaries": string;
307
317
  "@trackunit/no-internal-graphql-when-tagged-with-gql-public"?: undefined;
318
+ "@trackunit/no-deprecated-graphql-fields"?: undefined;
308
319
  "@typescript-eslint/no-require-imports"?: undefined;
309
320
  };
310
321
  plugins?: undefined;
@@ -336,6 +347,9 @@ export declare const configs: {
336
347
  "no-typescript-assertion": import("@typescript-eslint/utils/ts-eslint").RuleModule<"angleBracketAssertion" | "asAssertion" | "nonNullAssertion", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
337
348
  name: string;
338
349
  };
350
+ "no-deprecated-graphql-fields": import("@typescript-eslint/utils/ts-eslint").RuleModule<"deprecatedFieldUsed", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
351
+ name: string;
352
+ };
339
353
  "no-internal-graphql-when-tagged-with-gql-public": import("@typescript-eslint/utils/ts-eslint").RuleModule<"internalGraphqlFileFound", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
340
354
  name: string;
341
355
  };
@@ -841,6 +855,7 @@ export declare const configs: {
841
855
  "@typescript-eslint/no-empty-function"?: undefined;
842
856
  "@trackunit/one-component-per-file"?: undefined;
843
857
  "@trackunit/component-name-matches-filename"?: undefined;
858
+ "@trackunit/require-storybook-folder-landing-page"?: undefined;
844
859
  };
845
860
  plugins?: undefined;
846
861
  settings?: undefined;
@@ -853,6 +868,7 @@ export declare const configs: {
853
868
  "@typescript-eslint/no-empty-function": string;
854
869
  "@trackunit/one-component-per-file": string;
855
870
  "@trackunit/component-name-matches-filename": string;
871
+ "@trackunit/require-storybook-folder-landing-page": string;
856
872
  "no-restricted-properties"?: undefined;
857
873
  };
858
874
  plugins?: undefined;
@@ -867,6 +883,7 @@ export declare const configs: {
867
883
  "jsdoc/require-jsdoc"?: undefined;
868
884
  "no-console"?: undefined;
869
885
  "@typescript-eslint/no-empty-function"?: undefined;
886
+ "@trackunit/require-storybook-folder-landing-page"?: undefined;
870
887
  };
871
888
  plugins?: undefined;
872
889
  settings?: undefined;
@@ -944,6 +961,7 @@ export declare const configs: {
944
961
  "@typescript-eslint/no-empty-function"?: undefined;
945
962
  "@trackunit/one-component-per-file"?: undefined;
946
963
  "@trackunit/component-name-matches-filename"?: undefined;
964
+ "@trackunit/require-storybook-folder-landing-page"?: undefined;
947
965
  "no-restricted-properties"?: undefined;
948
966
  };
949
967
  settings?: undefined;
@@ -44,6 +44,9 @@ export declare const localRulesPlugin: {
44
44
  "no-typescript-assertion": import("@typescript-eslint/utils/ts-eslint").RuleModule<"angleBracketAssertion" | "asAssertion" | "nonNullAssertion", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
45
45
  name: string;
46
46
  };
47
+ "no-deprecated-graphql-fields": import("@typescript-eslint/utils/ts-eslint").RuleModule<"deprecatedFieldUsed", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
48
+ name: string;
49
+ };
47
50
  "no-internal-graphql-when-tagged-with-gql-public": import("@typescript-eslint/utils/ts-eslint").RuleModule<"internalGraphqlFileFound", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
48
51
  name: string;
49
52
  };
@@ -26,6 +26,9 @@ export declare const base: (import("eslint").Linter.FlatConfig<import("eslint").
26
26
  "no-typescript-assertion": import("@typescript-eslint/utils/ts-eslint").RuleModule<"angleBracketAssertion" | "asAssertion" | "nonNullAssertion", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
27
27
  name: string;
28
28
  };
29
+ "no-deprecated-graphql-fields": import("@typescript-eslint/utils/ts-eslint").RuleModule<"deprecatedFieldUsed", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
30
+ name: string;
31
+ };
29
32
  "no-internal-graphql-when-tagged-with-gql-public": import("@typescript-eslint/utils/ts-eslint").RuleModule<"internalGraphqlFileFound", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
30
33
  name: string;
31
34
  };
@@ -136,6 +139,7 @@ export declare const base: (import("eslint").Linter.FlatConfig<import("eslint").
136
139
  rules: {
137
140
  [x: string]: import("eslint").Linter.RuleEntry<any[]>;
138
141
  "@trackunit/no-internal-graphql-when-tagged-with-gql-public"?: undefined;
142
+ "@trackunit/no-deprecated-graphql-fields"?: undefined;
139
143
  "@typescript-eslint/no-require-imports"?: undefined;
140
144
  "@nx/enforce-module-boundaries"?: undefined;
141
145
  };
@@ -178,6 +182,7 @@ export declare const base: (import("eslint").Linter.FlatConfig<import("eslint").
178
182
  "no-unused-expressions": string;
179
183
  "no-shadow": string;
180
184
  "@trackunit/no-internal-graphql-when-tagged-with-gql-public"?: undefined;
185
+ "@trackunit/no-deprecated-graphql-fields"?: undefined;
181
186
  "@typescript-eslint/no-require-imports"?: undefined;
182
187
  "@nx/enforce-module-boundaries"?: undefined;
183
188
  };
@@ -215,6 +220,9 @@ export declare const base: (import("eslint").Linter.FlatConfig<import("eslint").
215
220
  "no-typescript-assertion": import("@typescript-eslint/utils/ts-eslint").RuleModule<"angleBracketAssertion" | "asAssertion" | "nonNullAssertion", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
216
221
  name: string;
217
222
  };
223
+ "no-deprecated-graphql-fields": import("@typescript-eslint/utils/ts-eslint").RuleModule<"deprecatedFieldUsed", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
224
+ name: string;
225
+ };
218
226
  "no-internal-graphql-when-tagged-with-gql-public": import("@typescript-eslint/utils/ts-eslint").RuleModule<"internalGraphqlFileFound", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
219
227
  name: string;
220
228
  };
@@ -288,6 +296,7 @@ export declare const base: (import("eslint").Linter.FlatConfig<import("eslint").
288
296
  };
289
297
  rules: {
290
298
  "@trackunit/no-internal-graphql-when-tagged-with-gql-public": string;
299
+ "@trackunit/no-deprecated-graphql-fields": string;
291
300
  "@typescript-eslint/no-require-imports"?: undefined;
292
301
  "@nx/enforce-module-boundaries"?: undefined;
293
302
  };
@@ -296,6 +305,7 @@ export declare const base: (import("eslint").Linter.FlatConfig<import("eslint").
296
305
  rules: {
297
306
  "@typescript-eslint/no-require-imports": string;
298
307
  "@trackunit/no-internal-graphql-when-tagged-with-gql-public"?: undefined;
308
+ "@trackunit/no-deprecated-graphql-fields"?: undefined;
299
309
  "@nx/enforce-module-boundaries"?: undefined;
300
310
  };
301
311
  plugins?: undefined;
@@ -305,6 +315,7 @@ export declare const base: (import("eslint").Linter.FlatConfig<import("eslint").
305
315
  rules: {
306
316
  "@nx/enforce-module-boundaries": string;
307
317
  "@trackunit/no-internal-graphql-when-tagged-with-gql-public"?: undefined;
318
+ "@trackunit/no-deprecated-graphql-fields"?: undefined;
308
319
  "@typescript-eslint/no-require-imports"?: undefined;
309
320
  };
310
321
  plugins?: undefined;
@@ -121,6 +121,7 @@ exports.base = [
121
121
  },
122
122
  rules: {
123
123
  "@trackunit/no-internal-graphql-when-tagged-with-gql-public": "error",
124
+ "@trackunit/no-deprecated-graphql-fields": "warn",
124
125
  },
125
126
  },
126
127
  jest_overrides_1.baseJestOverrides,
@@ -25,6 +25,9 @@ export declare const reactPreset: (import("eslint").Linter.Config<import("eslint
25
25
  "no-typescript-assertion": import("@typescript-eslint/utils/ts-eslint").RuleModule<"angleBracketAssertion" | "asAssertion" | "nonNullAssertion", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
26
26
  name: string;
27
27
  };
28
+ "no-deprecated-graphql-fields": import("@typescript-eslint/utils/ts-eslint").RuleModule<"deprecatedFieldUsed", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
29
+ name: string;
30
+ };
28
31
  "no-internal-graphql-when-tagged-with-gql-public": import("@typescript-eslint/utils/ts-eslint").RuleModule<"internalGraphqlFileFound", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
29
32
  name: string;
30
33
  };
@@ -530,6 +533,7 @@ export declare const reactPreset: (import("eslint").Linter.Config<import("eslint
530
533
  "@typescript-eslint/no-empty-function"?: undefined;
531
534
  "@trackunit/one-component-per-file"?: undefined;
532
535
  "@trackunit/component-name-matches-filename"?: undefined;
536
+ "@trackunit/require-storybook-folder-landing-page"?: undefined;
533
537
  };
534
538
  plugins?: undefined;
535
539
  settings?: undefined;
@@ -542,6 +546,7 @@ export declare const reactPreset: (import("eslint").Linter.Config<import("eslint
542
546
  "@typescript-eslint/no-empty-function": string;
543
547
  "@trackunit/one-component-per-file": string;
544
548
  "@trackunit/component-name-matches-filename": string;
549
+ "@trackunit/require-storybook-folder-landing-page": string;
545
550
  "no-restricted-properties"?: undefined;
546
551
  };
547
552
  plugins?: undefined;
@@ -556,6 +561,7 @@ export declare const reactPreset: (import("eslint").Linter.Config<import("eslint
556
561
  "jsdoc/require-jsdoc"?: undefined;
557
562
  "no-console"?: undefined;
558
563
  "@typescript-eslint/no-empty-function"?: undefined;
564
+ "@trackunit/require-storybook-folder-landing-page"?: undefined;
559
565
  };
560
566
  plugins?: undefined;
561
567
  settings?: undefined;
@@ -633,6 +639,7 @@ export declare const reactPreset: (import("eslint").Linter.Config<import("eslint
633
639
  "@typescript-eslint/no-empty-function"?: undefined;
634
640
  "@trackunit/one-component-per-file"?: undefined;
635
641
  "@trackunit/component-name-matches-filename"?: undefined;
642
+ "@trackunit/require-storybook-folder-landing-page"?: undefined;
636
643
  "no-restricted-properties"?: undefined;
637
644
  };
638
645
  settings?: undefined;
@@ -71,6 +71,9 @@ exports.reactPreset = [
71
71
  "@typescript-eslint/no-empty-function": "off",
72
72
  "@trackunit/one-component-per-file": "off",
73
73
  "@trackunit/component-name-matches-filename": "off",
74
+ // Every Storybook folder implied by a story title must have a landing page
75
+ // (*.docs.mdx with a matching <Meta title>). See docs/STORYBOOK-LANDING-PAGES.md.
76
+ "@trackunit/require-storybook-folder-landing-page": "error",
74
77
  },
75
78
  },
76
79
  {
@@ -0,0 +1,4 @@
1
+ import { ESLintUtils } from "@typescript-eslint/utils";
2
+ export declare const noDeprecatedGraphqlFields: ESLintUtils.RuleModule<"deprecatedFieldUsed", [], unknown, ESLintUtils.RuleListener> & {
3
+ name: string;
4
+ };
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.noDeprecatedGraphqlFields = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const utils_1 = require("@typescript-eslint/utils");
6
+ const fs = tslib_1.__importStar(require("fs"));
7
+ const graphql_1 = require("graphql");
8
+ const path = tslib_1.__importStar(require("path"));
9
+ const file_utils_1 = require("../../utils/file-utils");
10
+ const schema_cache_1 = require("./schema-cache");
11
+ const createRule = utils_1.ESLintUtils.RuleCreator(name => `https://github.com/trackunit/manager/blob/main/libs/eslint/plugin-trackunit/src/lib/rules/${name}/${name}.ts`);
12
+ const EXCLUDED_DIRS = new Set(["node_modules", "generated", "dist"]);
13
+ const collectGraphqlFiles = (dir, files = []) => {
14
+ let entries;
15
+ try {
16
+ entries = fs.readdirSync(dir, { withFileTypes: true });
17
+ }
18
+ catch {
19
+ return files;
20
+ }
21
+ for (const entry of entries) {
22
+ const fullPath = path.join(dir, entry.name);
23
+ let stat;
24
+ try {
25
+ stat = fs.statSync(fullPath);
26
+ }
27
+ catch {
28
+ continue;
29
+ }
30
+ if (stat.isDirectory()) {
31
+ if (!EXCLUDED_DIRS.has(entry.name)) {
32
+ collectGraphqlFiles(fullPath, files);
33
+ }
34
+ }
35
+ else if (entry.name.endsWith(".graphql")) {
36
+ files.push(fullPath);
37
+ }
38
+ }
39
+ return files;
40
+ };
41
+ exports.noDeprecatedGraphqlFields = createRule({
42
+ name: "no-deprecated-graphql-fields",
43
+ meta: {
44
+ type: "problem",
45
+ docs: {
46
+ description: "Disallow usage of @deprecated GraphQL fields in .graphql operation files",
47
+ },
48
+ messages: {
49
+ deprecatedFieldUsed: "Deprecated GraphQL field used in {{file}}: {{message}}",
50
+ },
51
+ schema: [],
52
+ },
53
+ defaultOptions: [],
54
+ create(context) {
55
+ return {
56
+ Program: _node => {
57
+ const sourceFilePath = context.filename;
58
+ if (!sourceFilePath.endsWith("/project.json")) {
59
+ return;
60
+ }
61
+ const nxJsonPath = (0, file_utils_1.findNearestFile)(sourceFilePath, "nx.json");
62
+ if (!nxJsonPath) {
63
+ return;
64
+ }
65
+ const monorepoRoot = path.dirname(nxJsonPath);
66
+ const schemaPath = path.join(monorepoRoot, "libs", "api", "internal-gql-schema", "generated", "internal-schema.gql");
67
+ const schema = (0, schema_cache_1.getSchema)(schemaPath);
68
+ if (!schema) {
69
+ return;
70
+ }
71
+ const projectDir = path.dirname(sourceFilePath);
72
+ const graphqlFiles = collectGraphqlFiles(projectDir);
73
+ for (const gqlFile of graphqlFiles) {
74
+ let content;
75
+ try {
76
+ content = fs.readFileSync(gqlFile, "utf8");
77
+ }
78
+ catch {
79
+ continue;
80
+ }
81
+ let document;
82
+ try {
83
+ document = (0, graphql_1.parse)(content);
84
+ }
85
+ catch {
86
+ continue;
87
+ }
88
+ const errors = (0, graphql_1.validate)(schema, document, [graphql_1.NoDeprecatedCustomRule]);
89
+ for (const error of errors) {
90
+ context.report({
91
+ messageId: "deprecatedFieldUsed",
92
+ data: {
93
+ file: path.relative(monorepoRoot, gqlFile),
94
+ message: error.message,
95
+ },
96
+ loc: { line: 1, column: 0 },
97
+ });
98
+ }
99
+ }
100
+ },
101
+ };
102
+ },
103
+ });
104
+ //# sourceMappingURL=no-deprecated-graphql-fields.js.map
@@ -0,0 +1,3 @@
1
+ import { type GraphQLSchema } from "graphql";
2
+ export declare const getSchema: (schemaPath: string) => GraphQLSchema | null;
3
+ export declare const clearSchemaCache: () => void;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.clearSchemaCache = exports.getSchema = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const fs = tslib_1.__importStar(require("fs"));
6
+ const graphql_1 = require("graphql");
7
+ /**
8
+ * Caches parsed schemas by path to avoid re-parsing on every project.json lint.
9
+ * Isolated in its own module so tests can reset it independently of the rule's production exports.
10
+ */
11
+ const schemaCache = new Map();
12
+ const getSchema = (schemaPath) => {
13
+ if (schemaCache.has(schemaPath)) {
14
+ return schemaCache.get(schemaPath) ?? null;
15
+ }
16
+ try {
17
+ const content = fs.readFileSync(schemaPath, "utf8");
18
+ const schema = (0, graphql_1.buildSchema)(content);
19
+ schemaCache.set(schemaPath, schema);
20
+ return schema;
21
+ }
22
+ catch {
23
+ return null;
24
+ }
25
+ };
26
+ exports.getSchema = getSchema;
27
+ const clearSchemaCache = () => {
28
+ schemaCache.clear();
29
+ };
30
+ exports.clearSchemaCache = clearSchemaCache;
31
+ //# sourceMappingURL=schema-cache.js.map
@@ -22,6 +22,9 @@ export declare const rulesMap: {
22
22
  "no-typescript-assertion": ESLintUtils.RuleModule<"angleBracketAssertion" | "asAssertion" | "nonNullAssertion", [], unknown, ESLintUtils.RuleListener> & {
23
23
  name: string;
24
24
  };
25
+ "no-deprecated-graphql-fields": ESLintUtils.RuleModule<"deprecatedFieldUsed", [], unknown, ESLintUtils.RuleListener> & {
26
+ name: string;
27
+ };
25
28
  "no-internal-graphql-when-tagged-with-gql-public": ESLintUtils.RuleModule<"internalGraphqlFileFound", [], unknown, ESLintUtils.RuleListener> & {
26
29
  name: string;
27
30
  };
@@ -4,6 +4,7 @@ exports.rulesMap = void 0;
4
4
  const component_name_matches_filename_1 = require("./rules/component-name-matches-filename/component-name-matches-filename");
5
5
  const cva_merge_base_classes_as_array_1 = require("./rules/cva-merge-base-classes-as-array/cva-merge-base-classes-as-array");
6
6
  const design_guideline_button_icon_size_match_1 = require("./rules/design-guideline-button-icon-size-match/design-guideline-button-icon-size-match");
7
+ const no_deprecated_graphql_fields_1 = require("./rules/no-deprecated-graphql-fields/no-deprecated-graphql-fields");
7
8
  const no_internal_barrel_files_1 = require("./rules/no-internal-barrel-files/no-internal-barrel-files");
8
9
  const no_internal_graphql_when_tagged_with_gql_public_1 = require("./rules/no-internal-graphql-when-tagged-with-gql-public/no-internal-graphql-when-tagged-with-gql-public");
9
10
  const no_jest_mock_trackunit_react_core_hooks_1 = require("./rules/no-jest-mock-trackunit-react-core-hooks/no-jest-mock-trackunit-react-core-hooks");
@@ -25,6 +26,7 @@ exports.rulesMap = {
25
26
  "cva-merge-base-classes-as-array": cva_merge_base_classes_as_array_1.cvaMergeBaseClassesAsArray,
26
27
  "no-internal-barrel-files": no_internal_barrel_files_1.noInternalBarrelFiles,
27
28
  "no-typescript-assertion": no_typescript_assertion_1.noTypescriptAssertion,
29
+ "no-deprecated-graphql-fields": no_deprecated_graphql_fields_1.noDeprecatedGraphqlFields,
28
30
  "no-internal-graphql-when-tagged-with-gql-public": no_internal_graphql_when_tagged_with_gql_public_1.noInternalGraphqlWhenTaggedWithGqlPublic,
29
31
  "design-guideline-button-icon-size-match": design_guideline_button_icon_size_match_1.designGuidelineButtonIconSizeMatch,
30
32
  "no-template-strings-in-classname-prop": no_template_strings_in_classname_prop_1.noTemplateStringsInClassName,
package/src/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../libs/eslint/plugin-trackunit/src/index.ts"],"names":[],"mappings":";;;AAAA,+CAA2C;AAE3C,kBAAe,oBAAQ,CAAC;AAExB,uCAAuC;AAA9B,iGAAA,OAAO,OAAA;AAChB,0EAAuE;AAA9D,kHAAA,cAAc,OAAA;AACvB,4CAAsD;AAA7C,yGAAA,gBAAgB,OAAA;AAGzB,kEAAsE;AAA7D,+GAAA,gBAAgB,OAAA;AACzB,gFAAkF;AAAzE,2HAAA,qBAAqB,OAAA;AAC9B,gDAAgF;AAAvE,kGAAA,OAAO,OAAA;AAAE,gGAAA,KAAK,OAAA;AAAE,6FAAA,EAAE,OAAA;AAAE,qGAAA,UAAU,OAAA;AAAE,mGAAA,QAAQ,OAAA","sourcesContent":["import { rulesMap } from \"./lib/rules-map\";\n\nexport default rulesMap;\n\nexport { configs } from \"./lib/config\";\nexport { createSkipWhen } from \"./lib/config-helpers/create-skip-when\";\nexport { findMonorepoRoot } from \"./lib/config/utils\";\nexport type { MatchCriteria, ProjectMetadata } from \"./lib/utils/nx-utils\";\n\nexport { strictJsdocRules } from \"./lib/config/fragments/jsdoc-rules\";\nexport { restrictedImportRules } from \"./lib/config/fragments/restricted-imports\";\nexport { globals, jsdoc, nx, reactHooks, tsParser } from \"./lib/config/plugins\";\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ignores.js","sourceRoot":"","sources":["../../../../../../../../libs/eslint/plugin-trackunit/src/lib/config/fragments/ignores.ts"],"names":[],"mappings":";;;AAEa,QAAA,aAAa,GAAkB;IAC1C,OAAO,EAAE;QACP,oBAAoB;QACpB,qBAAqB;QACrB,kBAAkB;QAClB,sBAAsB;QACtB,kBAAkB;QAClB,iBAAiB;QACjB,mBAAmB;QACnB,kBAAkB;QAClB,4BAA4B;QAC5B,uBAAuB;QACvB,cAAc;QACd,eAAe;KAChB;CACF,CAAC","sourcesContent":["import type { Linter } from \"eslint\";\n\nexport const globalIgnores: Linter.Config = {\n ignores: [\n \"**/src/gql-api.tsx\",\n \"**/src/typings/**/*\",\n \"**/testUtils.tsx\",\n \"**/webpack.config.js\",\n \"**/jest.config.*\",\n \"**/jest.setup.*\",\n \"**/vite*.config.*\",\n \"**/vite*.setup.*\",\n \"**/src/**/generated/**/*.*\",\n \"**/src/**/generated.*\",\n \"**/dist/**/*\",\n \"**/*.docs.mdx\",\n ],\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"import-rules.js","sourceRoot":"","sources":["../../../../../../../../libs/eslint/plugin-trackunit/src/lib/config/fragments/import-rules.ts"],"names":[],"mappings":";;;AACA,4EAAuE;AACvE,wCAA0C;AAE7B,QAAA,WAAW,GAAuB;IAC7C,mBAAmB,EAAE;QACnB,OAAO;QACP;YACE,cAAc,EAAE,IAAI;SACrB;KACF;IACD,gBAAgB,EAAE,KAAK;CACxB,CAAC;AAEK,MAAM,wCAAwC,GAAG,CAAC,OAAe,EAAiB,EAAE,CACzF,IAAA,iCAAc,EAAC;IACb,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,YAAY,CAAC,EAAE;IAC9B,OAAO,EAAE;QACP,UAAU,EAAE,sBAAY;KACzB;IACD,KAAK,EAAE;QACL,qCAAqC,EAAE;YACrC,OAAO;YACP;gBACE,UAAU,EAAE,OAAO;gBACnB,eAAe,EAAE;oBACf,oBAAoB;oBACpB,oBAAoB;oBACpB,iBAAiB;oBACjB,iBAAiB;oBACjB,mBAAmB;oBACnB,YAAY;oBACZ,aAAa;oBACb,eAAe;oBACf,kBAAkB;oBAClB,kBAAkB;oBAClB,iBAAiB;oBACjB,iBAAiB;oBACjB,mBAAmB;oBACnB,0BAA0B;oBAC1B,uBAAuB;oBACvB,4BAA4B;oBAC5B,kBAAkB;oBAClB,eAAe;oBACf,aAAa;oBACb,6BAA6B;oBAC7B,oBAAoB;oBACpB,6CAA6C;oBAC7C,4BAA4B;iBAC7B;gBACD,oBAAoB,EAAE,KAAK;gBAC3B,gBAAgB,EAAE,IAAI;gBACtB,mBAAmB,EAAE,IAAI;aAC1B;SACF;KACF;CACF,CAAC,CAAC;AA1CQ,QAAA,wCAAwC,4CA0ChD","sourcesContent":["import type { Linter } from \"eslint\";\nimport { createSkipWhen } from \"../../config-helpers/create-skip-when\";\nimport { importPlugin } from \"../plugins\";\n\nexport const importRules: Linter.RulesRecord = {\n \"import-x/no-cycle\": [\n \"error\",\n {\n ignoreExternal: true,\n },\n ],\n \"import-x/first\": \"off\",\n};\n\nexport const createImportExtraneousDependenciesConfig = (rootDir: string): Linter.Config =>\n createSkipWhen({\n when: { tags: [\"scope:tool\"] },\n plugins: {\n \"import-x\": importPlugin,\n },\n rules: {\n \"import-x/no-extraneous-dependencies\": [\n \"error\",\n {\n packageDir: rootDir,\n devDependencies: [\n \"**/*.spec.{ts,tsx}\",\n \"**/*.test.{ts,tsx}\",\n \"**/jest.setup.*\",\n \"**/vite.setup.*\",\n \"**/vite.config.ts\",\n \"**/test/**\",\n \"**/tests/**\",\n \"**/testing/**\",\n \"**/test-setup/**\",\n \"**/test-utils/**\",\n \"**/__tests__/**\",\n \"**/__mocks__/**\",\n \"**/mocks.{ts,tsx}\",\n \"**/core-contexts-test/**\",\n \"**/*.stories.{ts,tsx}\",\n \"**/storybookUtils.{ts,tsx}\",\n \"**/.storybook/**\",\n \"**/scripts/**\",\n \"**/tools/**\",\n \"**/*.config.{ts,js,cjs,mjs}\",\n \"**/css/tailwind/**\",\n \"**/css/tailwind-custom-properties-plugin/**\",\n \"**/css/component-tokens/**\",\n ],\n optionalDependencies: false,\n peerDependencies: true,\n bundledDependencies: true,\n },\n ],\n },\n });\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"jest-overrides.js","sourceRoot":"","sources":["../../../../../../../../libs/eslint/plugin-trackunit/src/lib/config/fragments/jest-overrides.ts"],"names":[],"mappings":";;;AACA,wCAAkD;AAErC,QAAA,iBAAiB,GAAkB;IAC9C,KAAK,EAAE,CAAC,cAAc,EAAE,eAAe,CAAC;IACxC,eAAe,EAAE;QACf,WAAW,EAAE,CAAC;QACd,UAAU,EAAE,QAAQ;QACpB,aAAa,EAAE;YACb,OAAO,EAAE,CAAC,oBAAoB,CAAC;SAChC;KACF;IAED,OAAO,EAAE;QACP,IAAI,EAAJ,cAAI;QACJ,iBAAiB,EAAE,wBAAc;KAClC;IAED,KAAK,EAAE;QACL,GAAG,cAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK;QACjC,GAAG,cAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK;QAC3B,oCAAoC,EAAE,KAAK;QAC3C,sCAAsC,EAAE,KAAK;QAC7C,0CAA0C,EAAE,KAAK;QACjD,oCAAoC,EAAE,KAAK;QAC3C,oDAAoD,EAAE,OAAO;QAC7D,YAAY,EAAE,KAAK;QACnB,uBAAuB,EAAE,KAAK;QAC9B,0BAA0B,EAAE,KAAK;QACjC,+CAA+C,EAAE,KAAK;KACvD;CACF,CAAC","sourcesContent":["import type { Linter } from \"eslint\";\nimport { jest, testingLibrary } from \"../plugins\";\n\nexport const baseJestOverrides: Linter.Config = {\n files: [\"**/*.spec.ts\", \"**/*.spec.tsx\"],\n languageOptions: {\n ecmaVersion: 5,\n sourceType: \"script\",\n parserOptions: {\n project: [\"./tsconfig.*?.json\"],\n },\n },\n\n plugins: {\n jest,\n \"testing-library\": testingLibrary,\n },\n\n rules: {\n ...jest.configs.recommended.rules,\n ...jest.configs.style.rules,\n \"@typescript-eslint/no-explicit-any\": \"off\",\n \"@typescript-eslint/no-empty-function\": \"off\",\n \"@typescript-eslint/no-non-null-assertion\": \"off\",\n \"@trackunit/no-typescript-assertion\": \"off\",\n \"@trackunit/no-jest-mock-trackunit-react-core-hooks\": \"error\",\n \"no-console\": \"off\",\n \"no-restricted-globals\": \"off\",\n \"no-restricted-properties\": \"off\",\n \"@typescript-eslint/strict-boolean-expressions\": \"off\",\n },\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"jsdoc-rules.js","sourceRoot":"","sources":["../../../../../../../../libs/eslint/plugin-trackunit/src/lib/config/fragments/jsdoc-rules.ts"],"names":[],"mappings":";;;AAEa,QAAA,eAAe,GAAuB;IACjD,iBAAiB,EAAE;QACjB,OAAO;QACP,OAAO;QACP;YACE,UAAU,EAAE,CAAC;SACd;KACF;IACD,uBAAuB,EAAE,OAAO;IAChC,wBAAwB,EAAE,KAAK;IAC/B,yBAAyB,EAAE,KAAK;IAChC,4BAA4B,EAAE;QAC5B,OAAO;QACP;YACE,QAAQ,EAAE;gBACR;oBACE,OAAO,EAAE,sCAAsC;oBAC/C,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,qDAAqD;iBAC/D;aACF;SACF;KACF;CACF,CAAC;AAEW,QAAA,gBAAgB,GAAuB;IAClD,qBAAqB,EAAE;QACrB,OAAO;QACP;YACE,UAAU,EAAE,IAAI;YAEhB,OAAO,EAAE;gBACP,uBAAuB,EAAE,IAAI;gBAC7B,gBAAgB,EAAE,IAAI;gBACtB,mBAAmB,EAAE,IAAI;gBACzB,kBAAkB,EAAE,IAAI;gBACxB,gBAAgB,EAAE,IAAI;aACvB;SACF;KACF;IAED,0BAA0B,EAAE;QAC1B,OAAO;QACP;YACE,YAAY,EAAE,CAAC,KAAK,CAAC;SACtB;KACF;IAED,yBAAyB,EAAE,OAAO;IAClC,4BAA4B,EAAE,OAAO;IACrC,mBAAmB,EAAE,OAAO;IAC5B,iCAAiC,EAAE,OAAO;IAC1C,oBAAoB,EAAE,OAAO;IAC7B,4BAA4B,EAAE,OAAO;IACrC,uBAAuB,EAAE,OAAO;IAChC,mBAAmB,EAAE,OAAO;IAC5B,oBAAoB,EAAE,OAAO;IAC7B,uBAAuB,EAAE,OAAO;IAChC,kBAAkB,EAAE,OAAO;IAC3B,6BAA6B,EAAE,OAAO;IACtC,wBAAwB,EAAE,OAAO;IACjC,0BAA0B,EAAE,OAAO;IACnC,wBAAwB,EAAE,OAAO;IACjC,oCAAoC,EAAE,OAAO;IAC7C,6BAA6B,EAAE,OAAO;IACtC,6BAA6B,EAAE,OAAO;IACtC,6BAA6B,EAAE,OAAO;IACtC,mCAAmC,EAAE,OAAO;IAC5C,sBAAsB,EAAE,OAAO;IAC/B,4BAA4B,EAAE,OAAO;CACtC,CAAC","sourcesContent":["import type { Linter } from \"eslint\";\n\nexport const basicJsdocRules: Linter.RulesRecord = {\n \"jsdoc/tag-lines\": [\n \"error\",\n \"never\",\n {\n startLines: 1,\n },\n ],\n \"jsdoc/check-alignment\": \"error\",\n \"prefer-arrow-functions\": \"off\",\n \"jsdoc/check-indentation\": \"off\",\n \"jsdoc/no-restricted-syntax\": [\n \"error\",\n {\n contexts: [\n {\n comment: \"JsdocBlock:has(JsdocTag[tag=/type/])\",\n context: \"any\",\n message: \"Projects should not use @type annotation in JSDocs.\",\n },\n ],\n },\n ],\n};\n\nexport const strictJsdocRules: Linter.RulesRecord = {\n \"jsdoc/require-jsdoc\": [\n \"error\",\n {\n publicOnly: true,\n\n require: {\n ArrowFunctionExpression: true,\n ClassDeclaration: true,\n FunctionDeclaration: true,\n FunctionExpression: true,\n MethodDefinition: true,\n },\n },\n ],\n\n \"jsdoc/no-undefined-types\": [\n \"error\",\n {\n definedTypes: [\"JSX\"],\n },\n ],\n\n \"jsdoc/check-param-names\": \"error\",\n \"jsdoc/require-returns-type\": \"error\",\n \"jsdoc/valid-types\": \"error\",\n \"jsdoc/require-param-description\": \"error\",\n \"jsdoc/check-access\": \"error\",\n \"jsdoc/check-property-names\": \"error\",\n \"jsdoc/check-tag-names\": \"error\",\n \"jsdoc/check-types\": \"error\",\n \"jsdoc/check-values\": \"error\",\n \"jsdoc/check-alignment\": \"error\",\n \"jsdoc/empty-tags\": \"error\",\n \"jsdoc/implements-on-classes\": \"error\",\n \"jsdoc/multiline-blocks\": \"error\",\n \"jsdoc/no-multi-asterisks\": \"error\",\n \"jsdoc/require-property\": \"error\",\n \"jsdoc/require-property-description\": \"error\",\n \"jsdoc/require-property-name\": \"error\",\n \"jsdoc/require-property-type\": \"error\",\n \"jsdoc/require-returns-check\": \"error\",\n \"jsdoc/require-returns-description\": \"error\",\n \"jsdoc/require-yields\": \"error\",\n \"jsdoc/require-yields-check\": \"error\",\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"module-boundaries.js","sourceRoot":"","sources":["../../../../../../../../libs/eslint/plugin-trackunit/src/lib/config/fragments/module-boundaries.ts"],"names":[],"mappings":";;;AAEa,QAAA,mBAAmB,GAAuB;IACrD,+BAA+B,EAAE;QAC/B,OAAO;QACP;YACE,KAAK,EAAE,EAAE;YAET,cAAc,EAAE;gBACd;oBACE,SAAS,EAAE,UAAU;oBACrB,wBAAwB,EAAE,CAAC,gBAAgB,EAAE,YAAY,EAAE,cAAc,CAAC;oBAC1E,qBAAqB,EAAE,CAAC,SAAS,EAAE,eAAe,CAAC;iBACpD;gBACD;oBACE,SAAS,EAAE,gBAAgB;oBAC3B,wBAAwB,EAAE,CAAC,YAAY,EAAE,cAAc,CAAC;oBACxD,qBAAqB,EAAE,CAAC,SAAS,EAAE,eAAe,CAAC;iBACpD;gBACD;oBACE,SAAS,EAAE,YAAY;oBACvB,wBAAwB,EAAE,CAAC,YAAY,EAAE,cAAc,CAAC;oBACxD,qBAAqB,EAAE,CAAC,SAAS,EAAE,eAAe,CAAC;iBACpD;gBACD;oBACE,SAAS,EAAE,cAAc;oBACzB,wBAAwB,EAAE,CAAC,cAAc,CAAC;oBAC1C,qBAAqB,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC;iBAC7C;gBACD;oBACE,SAAS,EAAE,WAAW;oBACtB,wBAAwB,EAAE,CAAC,cAAc,EAAE,cAAc,CAAC;iBAC3D;gBACD;oBACE,SAAS,EAAE,cAAc;oBACzB,wBAAwB,EAAE,CAAC,cAAc,CAAC;iBAC3C;gBACD;oBACE,SAAS,EAAE,YAAY;oBACvB,wBAAwB,EAAE,CAAC,YAAY,CAAC;iBACzC;gBACD;oBACE,SAAS,EAAE,cAAc;oBACzB,wBAAwB,EAAE,CAAC,cAAc,CAAC;iBAC3C;gBACD;oBACE,SAAS,EAAE,iBAAiB;oBAC5B,wBAAwB,EAAE,CAAC,iBAAiB,EAAE,mBAAmB,CAAC;iBACnE;gBACD;oBACE,SAAS,EAAE,qBAAqB;oBAChC,wBAAwB,EAAE,CAAC,qBAAqB,EAAE,mBAAmB,CAAC;iBACvE;gBACD;oBACE,SAAS,EAAE,mBAAmB;oBAC9B,wBAAwB,EAAE,CAAC,mBAAmB,CAAC;iBAChD;gBACD;oBACE,SAAS,EAAE,4BAA4B;oBACvC,uBAAuB,EAAE,CAAC,YAAY,CAAC;iBACxC;gBACD;oBACE,SAAS,EAAE,cAAc;iBAC1B;gBACD;oBACE,SAAS,EAAE,YAAY;iBACxB;gBACD;oBACE,SAAS,EAAE,OAAO;iBACnB;gBACD;oBACE,SAAS,EAAE,OAAO;iBACnB;gBACD;oBACE,SAAS,EAAE,OAAO;iBACnB;gBACD;oBACE,SAAS,EAAE,OAAO;iBACnB;gBACD;oBACE,SAAS,EAAE,aAAa;oBACxB,wBAAwB,EAAE,CAAC,aAAa,CAAC;oBACzC,qBAAqB,EAAE,CAAC,WAAW,CAAC;oBACpC,uBAAuB,EAAE,CAAC,YAAY,CAAC;iBACxC;aACF;YAED,6BAA6B,EAAE,IAAI;YACnC,yBAAyB,EAAE,IAAI;SAChC;KACF;CACF,CAAC","sourcesContent":["import type { Linter } from \"eslint\";\n\nexport const moduleBoundaryRules: Linter.RulesRecord = {\n \"@nx/enforce-module-boundaries\": [\n \"error\",\n {\n allow: [],\n\n depConstraints: [\n {\n sourceTag: \"type:app\",\n onlyDependOnLibsWithTags: [\"type:extension\", \"type:react\", \"type:vanilla\"],\n bannedExternalImports: [\"i18next\", \"react-i18next\"],\n },\n {\n sourceTag: \"type:extension\",\n onlyDependOnLibsWithTags: [\"type:react\", \"type:vanilla\"],\n bannedExternalImports: [\"i18next\", \"react-i18next\"],\n },\n {\n sourceTag: \"type:react\",\n onlyDependOnLibsWithTags: [\"type:react\", \"type:vanilla\"],\n bannedExternalImports: [\"i18next\", \"react-i18next\"],\n },\n {\n sourceTag: \"type:vanilla\",\n onlyDependOnLibsWithTags: [\"type:vanilla\"],\n bannedExternalImports: [\"i18next\", \"react*\"],\n },\n {\n sourceTag: \"scope:app\",\n onlyDependOnLibsWithTags: [\"scope:client\", \"scope:server\"],\n },\n {\n sourceTag: \"scope:client\",\n onlyDependOnLibsWithTags: [\"scope:client\"],\n },\n {\n sourceTag: \"scope:tool\",\n onlyDependOnLibsWithTags: [\"scope:tool\"],\n },\n {\n sourceTag: \"scope:server\",\n onlyDependOnLibsWithTags: [\"scope:server\"],\n },\n {\n sourceTag: \"visibility:host\",\n onlyDependOnLibsWithTags: [\"visibility:host\", \"visibility:shared\"],\n },\n {\n sourceTag: \"visibility:iris-app\",\n onlyDependOnLibsWithTags: [\"visibility:iris-app\", \"visibility:shared\"],\n },\n {\n sourceTag: \"visibility:shared\",\n onlyDependOnLibsWithTags: [\"visibility:shared\"],\n },\n {\n sourceTag: \"dependencies:no-deprecated\",\n notDependOnLibsWithTags: [\"deprecated\"],\n },\n {\n sourceTag: \"gql:internal\",\n },\n {\n sourceTag: \"gql:public\",\n },\n {\n sourceTag: \"tier1\",\n },\n {\n sourceTag: \"tier2\",\n },\n {\n sourceTag: \"tier3\",\n },\n {\n sourceTag: \"tier4\",\n },\n {\n sourceTag: \"publish:npm\",\n onlyDependOnLibsWithTags: [\"publish:npm\"],\n bannedExternalImports: [\"@sentry/*\"],\n notDependOnLibsWithTags: [\"deprecated\"],\n },\n ],\n\n enforceBuildableLibDependency: true,\n banTransitiveDependencies: true,\n },\n ],\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"no-direct-storage-access.js","sourceRoot":"","sources":["../../../../../../../../libs/eslint/plugin-trackunit/src/lib/config/fragments/no-direct-storage-access.ts"],"names":[],"mappings":";;;AACA,oCAA4C;AAE5C,MAAM,mBAAmB,GACvB,uHAAuH,CAAC;AAC1H,MAAM,qBAAqB,GACzB,6HAA6H,CAAC;AAEnH,QAAA,0BAA0B,GAAqB;IAC1D,OAAO;IACP;QACE,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,mBAAmB;KAC7B;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,qBAAqB;KAC/B;CACF,CAAC;AAEW,QAAA,6BAA6B,GAAqB;IAC7D,OAAO;IACP;QACE,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,cAAc;QACxB,OAAO,EAAE,mBAAmB;KAC7B;IACD;QACE,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,gBAAgB;QAC1B,OAAO,EAAE,qBAAqB;KAC/B;IACD;QACE,MAAM,EAAE,YAAY;QACpB,QAAQ,EAAE,cAAc;QACxB,OAAO,EAAE,mBAAmB;KAC7B;IACD;QACE,MAAM,EAAE,YAAY;QACpB,QAAQ,EAAE,gBAAgB;QAC1B,OAAO,EAAE,qBAAqB;KAC/B;CACF,CAAC;AAEF,MAAM,8BAA8B,GAAG;IACrC,iEAAiE;IACjE,wEAAwE;IACxE,mEAAmE;IACnE,0EAA0E;CAC3E,CAAC;AAEW,QAAA,yCAAyC,GAAkB;IACtE,QAAQ,EAAE,IAAA,wBAAgB,GAAE;IAC5B,KAAK,EAAE,8BAA8B;IACrC,KAAK,EAAE;QACL,0BAA0B,EAAE,KAAK;KAClC;CACF,CAAC","sourcesContent":["import type { Linter } from \"eslint\";\nimport { findMonorepoRoot } from \"../utils\";\n\nconst localStorageMessage =\n \"Use useLocalStorage or useLocalStorageReducer from @trackunit/react-components instead of direct localStorage access.\";\nconst sessionStorageMessage =\n \"Use useSessionStorage or useSessionStorageReducer from @trackunit/react-components instead of direct sessionStorage access.\";\n\nexport const noDirectStorageGlobalsRule: Linter.RuleEntry = [\n \"error\",\n {\n name: \"localStorage\",\n message: localStorageMessage,\n },\n {\n name: \"sessionStorage\",\n message: sessionStorageMessage,\n },\n];\n\nexport const noDirectStoragePropertiesRule: Linter.RuleEntry = [\n \"error\",\n {\n object: \"window\",\n property: \"localStorage\",\n message: localStorageMessage,\n },\n {\n object: \"window\",\n property: \"sessionStorage\",\n message: sessionStorageMessage,\n },\n {\n object: \"globalThis\",\n property: \"localStorage\",\n message: localStorageMessage,\n },\n {\n object: \"globalThis\",\n property: \"sessionStorage\",\n message: sessionStorageMessage,\n },\n];\n\nconst storageHookImplementationFiles = [\n \"libs/react/components/src/hooks/localStorage/useLocalStorage.ts\",\n \"libs/react/components/src/hooks/localStorage/useLocalStorageReducer.ts\",\n \"libs/react/components/src/hooks/localStorage/useSessionStorage.ts\",\n \"libs/react/components/src/hooks/localStorage/useSessionStorageReducer.ts\",\n];\n\nexport const noDirectStoragePropertyExceptionOverrides: Linter.Config = {\n basePath: findMonorepoRoot(),\n files: storageHookImplementationFiles,\n rules: {\n \"no-restricted-properties\": \"off\",\n },\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"react-rules.js","sourceRoot":"","sources":["../../../../../../../../libs/eslint/plugin-trackunit/src/lib/config/fragments/react-rules.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Linter } from \"eslint\";\n\nexport const reactRules: Linter.RulesRecord = {\n \"react-hooks/rules-of-hooks\": \"error\",\n \"react-hooks/exhaustive-deps\": \"error\",\n\n \"react-hooks/config\": \"error\",\n \"react-hooks/error-boundaries\": \"error\",\n \"react-hooks/component-hook-factories\": \"error\",\n \"react-hooks/gating\": \"error\",\n \"react-hooks/globals\": \"error\",\n \"react-hooks/set-state-in-render\": \"error\",\n \"react-hooks/use-memo\": \"error\",\n \"react/self-closing-comp\": \"error\",\n \"react-hooks/unsupported-syntax\": \"error\",\n \"react-hooks/static-components\": \"error\",\n \"react-hooks/purity\": \"error\",\n\n \"react-hooks/immutability\": \"warn\",\n \"react/no-unstable-nested-components\": \"warn\",\n \"react-hooks/refs\": \"warn\",\n \"react-hooks/set-state-in-effect\": \"warn\",\n \"react-hooks/preserve-manual-memoization\": \"warn\",\n \"react-hooks/incompatible-library\": \"warn\",\n\n \"react/jsx-curly-brace-presence\": [\n \"error\",\n {\n children: \"never\",\n propElementValues: \"always\",\n props: \"never\",\n },\n ],\n\n \"react/jsx-key\": \"error\",\n \"react/jsx-no-leaked-render\": \"error\",\n \"react/jsx-uses-react\": \"error\",\n \"react/jsx-uses-vars\": \"error\",\n \"react/no-danger\": \"error\",\n \"react/no-unused-prop-types\": \"error\",\n \"react/jsx-sort-props\": \"error\",\n\n \"react/no-children-prop\": [\n \"error\",\n {\n allowFunctions: false,\n },\n ],\n};\n\nexport const reactCustomRules: Linter.RulesRecord = {\n \"@trackunit/no-template-strings-in-classname-prop\": \"error\",\n \"@trackunit/require-classname-alternatives\": [\n \"error\",\n {\n alternatives: {\n slate: [\"neutral\"],\n gray: [\"neutral\"],\n zinc: [\"neutral\"],\n stone: [\"neutral\"],\n teal: [\"cyan\"],\n purple: [\"violet\"],\n fuchsia: [\"pink\"],\n red: [\"danger\"],\n yellow: [\"warning\"],\n green: [\"success\"],\n emerald: [\"success\"],\n amber: [\"warning\", \"low\", \"idle\"],\n sky: [\"primary\", \"info\"],\n blue: [\"primary\", \"info\", \"working\", \"utilized\"],\n indigo: [\"primary\", \"violet\"],\n rose: [\"danger\", \"pink\"],\n },\n prefixes: [\n \"bg\",\n \"text\",\n \"border\",\n \"border-t\",\n \"border-r\",\n \"border-b\",\n \"border-l\",\n \"border-x\",\n \"border-y\",\n \"ring\",\n \"ring-offset\",\n \"outline\",\n \"divide\",\n \"shadow\",\n \"accent\",\n \"caret\",\n \"fill\",\n \"stroke\",\n \"decoration\",\n \"placeholder\",\n \"from\",\n \"via\",\n \"to\",\n ],\n },\n ],\n \"@trackunit/require-list-item-virtualization-props\": \"error\",\n \"@trackunit/cva-merge-base-classes-as-array\": \"error\",\n \"@trackunit/design-guideline-button-icon-size-match\": \"error\",\n \"@trackunit/prefer-destructured-imports\": [\n \"error\",\n {\n packages: {\n react: \"React\",\n },\n },\n ],\n \"@trackunit/require-optional-prop-initialization\": \"error\",\n \"@trackunit/prefer-event-specific-callback-naming\": [\n \"error\",\n {\n events: [\"onClick\", \"onSubmit\", \"onDoubleClick\"],\n },\n ],\n \"@trackunit/prefer-mouse-event-handler-in-react-props\": [\n \"error\",\n {\n allowedNames: [\"onClickClose\"],\n },\n ],\n \"@trackunit/prefer-field-components\": \"error\",\n \"@trackunit/one-component-per-file\": \"warn\",\n \"@trackunit/component-name-matches-filename\": [\n \"warn\",\n {\n allowedMismatches: [\n // i18next convention: every library's translation.tsx exports a `Trans` wrapper\n // named after the library component, not the file.\n { file: \"translation\", component: \"Trans\" },\n // React context pattern: *Context files always contain both the context object and\n // the provider component. The provider can't be renamed to match the file because\n // the context object already uses that name.\n { file: \"*Context\", component: \"*Provider\" },\n ],\n },\n ],\n};\n\nexport const reactTestingLibraryOverrides: Linter.Config = {\n files: [\"**/*.spec.ts\", \"**/*.spec.tsx\"],\n rules: {\n \"jest/no-commented-out-tests\": \"error\",\n \"jest/expect-expect\": \"error\",\n },\n};\n\nexport const reactStoryOverrides: Linter.Config = {\n files: [\"**/*.stories.ts\", \"**/*.stories.tsx\"],\n rules: {\n \"jsdoc/require-jsdoc\": \"off\",\n \"no-console\": \"off\",\n \"@typescript-eslint/no-empty-function\": \"off\",\n },\n};\n"]}