@ngrx/eslint-plugin 19.0.1 → 19.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/package.json +1 -1
  2. package/schematics/ng-add/index.d.ts +2 -1
  3. package/schematics/ng-add/index.js +167 -36
  4. package/schematics/ng-add/index.js.map +1 -1
  5. package/scripts/generate-docs.js +17 -7
  6. package/scripts/generate-docs.js.map +1 -1
  7. package/src/rules/component-store/avoid-combining-component-store-selectors.js +17 -7
  8. package/src/rules/component-store/avoid-combining-component-store-selectors.js.map +1 -1
  9. package/src/rules/component-store/avoid-mapping-component-store-selectors.js +17 -7
  10. package/src/rules/component-store/avoid-mapping-component-store-selectors.js.map +1 -1
  11. package/src/rules/component-store/require-super-ondestroy.js +34 -1
  12. package/src/rules/component-store/require-super-ondestroy.js.map +1 -1
  13. package/src/rules/component-store/updater-explicit-return-type.js +17 -7
  14. package/src/rules/component-store/updater-explicit-return-type.js.map +1 -1
  15. package/src/rules/effects/avoid-cyclic-effects.js +17 -7
  16. package/src/rules/effects/avoid-cyclic-effects.js.map +1 -1
  17. package/src/rules/effects/no-dispatch-in-effects.js +17 -7
  18. package/src/rules/effects/no-dispatch-in-effects.js.map +1 -1
  19. package/src/rules/effects/no-effects-in-providers.js +17 -7
  20. package/src/rules/effects/no-effects-in-providers.js.map +1 -1
  21. package/src/rules/effects/no-multiple-actions-in-effects.js +17 -7
  22. package/src/rules/effects/no-multiple-actions-in-effects.js.map +1 -1
  23. package/src/rules/effects/prefer-action-creator-in-of-type.js +17 -7
  24. package/src/rules/effects/prefer-action-creator-in-of-type.js.map +1 -1
  25. package/src/rules/effects/prefer-effect-callback-in-block-statement.js +17 -7
  26. package/src/rules/effects/prefer-effect-callback-in-block-statement.js.map +1 -1
  27. package/src/rules/effects/use-effects-lifecycle-interface.js +17 -7
  28. package/src/rules/effects/use-effects-lifecycle-interface.js.map +1 -1
  29. package/src/rules/operators/prefer-concat-latest-from.js +17 -7
  30. package/src/rules/operators/prefer-concat-latest-from.js.map +1 -1
  31. package/src/rules/signals/prefer-protected-state.js +17 -7
  32. package/src/rules/signals/prefer-protected-state.js.map +1 -1
  33. package/src/rules/signals/signal-state-no-arrays-at-root-level.js +17 -7
  34. package/src/rules/signals/signal-state-no-arrays-at-root-level.js.map +1 -1
  35. package/src/rules/signals/signal-store-feature-should-use-generic-type.js +17 -7
  36. package/src/rules/signals/signal-store-feature-should-use-generic-type.js.map +1 -1
  37. package/src/rules/signals/with-state-no-arrays-at-root-level.js +17 -7
  38. package/src/rules/signals/with-state-no-arrays-at-root-level.js.map +1 -1
  39. package/src/rules/store/avoid-combining-selectors.js +17 -7
  40. package/src/rules/store/avoid-combining-selectors.js.map +1 -1
  41. package/src/rules/store/avoid-dispatching-multiple-actions-sequentially.js +17 -7
  42. package/src/rules/store/avoid-dispatching-multiple-actions-sequentially.js.map +1 -1
  43. package/src/rules/store/avoid-duplicate-actions-in-reducer.js +17 -7
  44. package/src/rules/store/avoid-duplicate-actions-in-reducer.js.map +1 -1
  45. package/src/rules/store/avoid-mapping-selectors.js +17 -7
  46. package/src/rules/store/avoid-mapping-selectors.js.map +1 -1
  47. package/src/rules/store/good-action-hygiene.js +17 -7
  48. package/src/rules/store/good-action-hygiene.js.map +1 -1
  49. package/src/rules/store/no-multiple-global-stores.js +17 -7
  50. package/src/rules/store/no-multiple-global-stores.js.map +1 -1
  51. package/src/rules/store/no-reducer-in-key-names.js +17 -7
  52. package/src/rules/store/no-reducer-in-key-names.js.map +1 -1
  53. package/src/rules/store/no-store-subscription.js +17 -7
  54. package/src/rules/store/no-store-subscription.js.map +1 -1
  55. package/src/rules/store/no-typed-global-store.js +17 -7
  56. package/src/rules/store/no-typed-global-store.js.map +1 -1
  57. package/src/rules/store/on-function-explicit-return-type.js +17 -7
  58. package/src/rules/store/on-function-explicit-return-type.js.map +1 -1
  59. package/src/rules/store/prefer-action-creator-in-dispatch.js +17 -7
  60. package/src/rules/store/prefer-action-creator-in-dispatch.js.map +1 -1
  61. package/src/rules/store/prefer-action-creator.js +17 -7
  62. package/src/rules/store/prefer-action-creator.js.map +1 -1
  63. package/src/rules/store/prefer-inline-action-props.js +17 -7
  64. package/src/rules/store/prefer-inline-action-props.js.map +1 -1
  65. package/src/rules/store/prefer-one-generic-in-create-for-feature-selector.js +17 -7
  66. package/src/rules/store/prefer-one-generic-in-create-for-feature-selector.js.map +1 -1
  67. package/src/rules/store/prefer-selector-in-select.js +17 -7
  68. package/src/rules/store/prefer-selector-in-select.js.map +1 -1
  69. package/src/rules/store/prefix-selectors-with-select.js +17 -7
  70. package/src/rules/store/prefix-selectors-with-select.js.map +1 -1
  71. package/src/rules/store/select-style.js +17 -7
  72. package/src/rules/store/select-style.js.map +1 -1
  73. package/src/rules/store/use-consistent-global-store-name.js +17 -7
  74. package/src/rules/store/use-consistent-global-store-name.js.map +1 -1
  75. package/src/utils/helper-functions/folder.js +17 -7
  76. package/src/utils/helper-functions/folder.js.map +1 -1
  77. package/src/utils/helper-functions/rules.js +17 -7
  78. package/src/utils/helper-functions/rules.js.map +1 -1
  79. package/src/utils/helper-functions/versions.js +17 -7
  80. package/src/utils/helper-functions/versions.js.map +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ngrx/eslint-plugin",
3
- "version": "19.0.1",
3
+ "version": "19.2.0",
4
4
  "description": "NgRx ESLint Plugin",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1,3 +1,4 @@
1
1
  import type { Rule } from '@angular-devkit/schematics';
2
2
  import type { Schema } from './schema';
3
- export default function addNgRxESLintPlugin(schema: Schema): Rule;
3
+ export declare const possibleFlatConfigPaths: string[];
4
+ export default function (schema: Schema): Rule;
@@ -1,63 +1,194 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
37
  };
5
38
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.default = addNgRxESLintPlugin;
39
+ exports.possibleFlatConfigPaths = void 0;
40
+ exports.default = default_1;
7
41
  const strip_json_comments_1 = __importDefault(require("strip-json-comments"));
8
- function addNgRxESLintPlugin(schema) {
42
+ const ts = __importStar(require("typescript"));
43
+ exports.possibleFlatConfigPaths = [
44
+ 'eslint.config.js',
45
+ 'eslint.config.mjs',
46
+ 'eslint.config.cjs',
47
+ ];
48
+ function default_1(schema) {
9
49
  return (host, context) => {
10
- const eslintConfigPath = '.eslintrc.json';
50
+ const jsonConfigPath = '.eslintrc.json';
51
+ const flatConfigPath = exports.possibleFlatConfigPaths.find((path) => host.exists(path));
11
52
  const docs = 'https://ngrx.io/guide/eslint-plugin';
12
- const eslint = host.read(eslintConfigPath)?.toString('utf-8');
13
- if (!eslint) {
53
+ if (flatConfigPath) {
54
+ updateFlatConfig(host, context, flatConfigPath, schema, docs);
55
+ return host;
56
+ }
57
+ if (!host.exists(jsonConfigPath)) {
14
58
  context.logger.warn(`
15
- Could not find the ESLint config at \`${eslintConfigPath}\`.
59
+ Could not find an ESLint config at any of ${exports.possibleFlatConfigPaths.join(', ')} or \`${jsonConfigPath}\`.
16
60
  The NgRx ESLint Plugin is installed but not configured.
17
-
18
61
  Please see ${docs} to configure the NgRx ESLint Plugin.
19
- `);
62
+ `);
20
63
  return host;
21
64
  }
22
- try {
23
- const json = JSON.parse((0, strip_json_comments_1.default)(eslint));
24
- if (json.overrides) {
25
- if (!json.overrides.some((override) => override.extends?.some((extend) => extend.startsWith('plugin:@ngrx')))) {
26
- json.overrides.push(configurePlugin(schema.config));
27
- }
65
+ updateJsonConfig(host, context, jsonConfigPath, schema, docs);
66
+ return host;
67
+ };
68
+ }
69
+ function updateFlatConfig(host, context, flatConfigPath, schema, docs) {
70
+ const ngrxPlugin = '@ngrx/eslint-plugin/v9';
71
+ const content = host.read(flatConfigPath)?.toString('utf-8');
72
+ if (!content) {
73
+ context.logger.error(`Could not read the ESLint flat config at \`${flatConfigPath}\`.`);
74
+ return;
75
+ }
76
+ if (content.includes(ngrxPlugin)) {
77
+ context.logger.info(`Skipping installation, the NgRx ESLint Plugin is already installed in your flat config.`);
78
+ return;
79
+ }
80
+ if (!content.includes('tseslint.config')) {
81
+ context.logger.warn(`No tseslint found, skipping the installation of the NgRx ESLint Plugin in your flat config.`);
82
+ return;
83
+ }
84
+ const source = ts.createSourceFile(flatConfigPath, content, ts.ScriptTarget.Latest, true);
85
+ const recorder = host.beginUpdate(flatConfigPath);
86
+ addImport();
87
+ addNgRxPlugin();
88
+ host.commitUpdate(recorder);
89
+ context.logger.info(`
90
+ The NgRx ESLint Plugin is installed and configured using the '${schema.config}' configuration in your flat config.
91
+ See ${docs} for more details.
92
+ `);
93
+ function addImport() {
94
+ const isESM = content.includes('export default');
95
+ if (isESM) {
96
+ const lastImport = source.statements
97
+ .filter((statement) => ts.isImportDeclaration(statement))
98
+ .reverse()[0];
99
+ recorder.insertRight(lastImport?.end ?? 0, `\nimport ngrx from '${ngrxPlugin}';`);
100
+ }
101
+ else {
102
+ const lastRequireVariableDeclaration = source.statements
103
+ .filter((statement) => {
104
+ if (!ts.isVariableStatement(statement))
105
+ return false;
106
+ const decl = statement.declarationList.declarations[0];
107
+ if (!decl.initializer)
108
+ return false;
109
+ return (ts.isCallExpression(decl.initializer) &&
110
+ decl.initializer.expression.getText() === 'require');
111
+ })
112
+ .reverse()[0];
113
+ recorder.insertRight(lastRequireVariableDeclaration?.end ?? 0, `\nconst ngrx = require('${ngrxPlugin}');`);
114
+ }
115
+ }
116
+ function addNgRxPlugin() {
117
+ let tseslintConfigCall = null;
118
+ function findTsEslintConfigCalls(node) {
119
+ if (tseslintConfigCall) {
120
+ return;
28
121
  }
29
- else if (!json.extends?.some((extend) => extend.startsWith('plugin:@ngrx'))) {
30
- json.overrides = [configurePlugin(schema.config)];
122
+ if (ts.isCallExpression(node) &&
123
+ node.expression.getText() === 'tseslint.config') {
124
+ tseslintConfigCall = node;
31
125
  }
32
- host.overwrite(eslintConfigPath, JSON.stringify(json, null, 2));
33
- context.logger.info(`
34
- The NgRx ESLint Plugin is installed and configured with the '${schema.config}' config.
35
-
36
- Take a look at the docs at ${docs} if you want to change the default configuration.
37
- `);
38
- return host;
126
+ ts.forEachChild(node, findTsEslintConfigCalls);
39
127
  }
40
- catch (err) {
41
- const detailsContent = err instanceof Error
42
- ? `
128
+ findTsEslintConfigCalls(source);
129
+ if (tseslintConfigCall) {
130
+ tseslintConfigCall = tseslintConfigCall;
131
+ const lastArgument = tseslintConfigCall.arguments[tseslintConfigCall.arguments.length - 1];
132
+ const plugin = ` {
133
+ files: ['**/*.ts'],
134
+ extends: [
135
+ ...ngrx.configs.${schema.config},
136
+ ],
137
+ rules: {},
138
+ }`;
139
+ if (lastArgument) {
140
+ recorder.remove(lastArgument.pos, lastArgument.end - lastArgument.pos);
141
+ recorder.insertRight(lastArgument.pos, `${lastArgument.getFullText()},\n${plugin}`);
142
+ }
143
+ else {
144
+ recorder.insertRight(tseslintConfigCall.end - 1, `\n${plugin}\n`);
145
+ }
146
+ }
147
+ }
148
+ }
149
+ function updateJsonConfig(host, context, jsonConfigPath, schema, docs) {
150
+ const eslint = host.read(jsonConfigPath)?.toString('utf-8');
151
+ if (!eslint) {
152
+ context.logger.error(`
153
+ Could not find the ESLint config at \`${jsonConfigPath}\`.
154
+ The NgRx ESLint Plugin is installed but not configured.
155
+ Please see ${docs} to configure the NgRx ESLint Plugin.
156
+ `);
157
+ return;
158
+ }
159
+ try {
160
+ const json = JSON.parse((0, strip_json_comments_1.default)(eslint));
161
+ const plugin = {
162
+ files: ['*.ts'],
163
+ extends: [`plugin:@ngrx/${schema.config}`],
164
+ };
165
+ if (json.overrides) {
166
+ if (!json.overrides.some((override) => override.extends?.some((extend) => extend.startsWith('plugin:@ngrx')))) {
167
+ json.overrides.push(plugin);
168
+ }
169
+ }
170
+ else if (!json.extends?.some((extend) => extend.startsWith('plugin:@ngrx'))) {
171
+ json.overrides = [plugin];
172
+ }
173
+ host.overwrite(jsonConfigPath, JSON.stringify(json, null, 2));
174
+ context.logger.info(`
175
+ The NgRx ESLint Plugin is installed and configured with the '${schema.config}' config.
176
+ Take a look at the docs at ${docs} if you want to change the default configuration.
177
+ `);
178
+ }
179
+ catch (err) {
180
+ const detailsContent = err instanceof Error
181
+ ? `
43
182
  Details:
44
183
  ${err.message}
45
184
  `
46
- : '';
47
- context.logger.warn(`
185
+ : '';
186
+ context.logger.warn(`
48
187
  Something went wrong while adding the NgRx ESLint Plugin.
49
188
  The NgRx ESLint Plugin is installed but not configured.
50
-
51
189
  Please see ${docs} to configure the NgRx ESLint Plugin.
52
190
  ${detailsContent}
53
191
  `);
54
- }
55
- };
56
- function configurePlugin(config) {
57
- return {
58
- files: ['*.ts'],
59
- extends: [`plugin:@ngrx/${config}`],
60
- };
61
192
  }
62
193
  }
63
194
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../modules/eslint-plugin/schematics/ng-add/index.ts"],"names":[],"mappings":";;;;;AAIA,sCAiEC;AApED,8EAAoD;AAGpD,SAAwB,mBAAmB,CAAC,MAAc;IACxD,OAAO,CAAC,IAAU,EAAE,OAAyB,EAAE,EAAE;QAC/C,MAAM,gBAAgB,GAAG,gBAAgB,CAAC;QAC1C,MAAM,IAAI,GAAG,qCAAqC,CAAC;QAEnD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC9D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;wCACc,gBAAgB;;;aAG3C,IAAI;CAChB,CAAC,CAAC;YACG,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,6BAAiB,EAAC,MAAM,CAAC,CAAC,CAAC;YACnD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,IACE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAa,EAAE,EAAE,CACrC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,MAAW,EAAE,EAAE,CACrC,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,CAClC,CACF,EACD,CAAC;oBACD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC;iBAAM,IACL,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,MAAW,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,EACvE,CAAC;gBACD,IAAI,CAAC,SAAS,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YACpD,CAAC;YAED,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAEhE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;iEACuC,MAAM,CAAC,MAAM;;+BAE/C,IAAI;GAChC,CAAC,CAAC;YACC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,cAAc,GAClB,GAAG,YAAY,KAAK;gBAClB,CAAC,CAAC;;EAEV,GAAG,CAAC,OAAO;CACZ;gBACS,CAAC,CAAC,EAAE,CAAC;YACT,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;;;;aAIb,IAAI;EACf,cAAc;CACf,CAAC,CAAC;QACC,CAAC;IACH,CAAC,CAAC;IACF,SAAS,eAAe,CAAC,MAAwB;QAC/C,OAAO;YACL,KAAK,EAAE,CAAC,MAAM,CAAC;YACf,OAAO,EAAE,CAAC,gBAAgB,MAAM,EAAE,CAAC;SACpC,CAAC;IACJ,CAAC;AACH,CAAC","sourcesContent":["import type { Rule, SchematicContext, Tree } from '@angular-devkit/schematics';\nimport stripJsonComments from 'strip-json-comments';\nimport type { Schema } from './schema';\n\nexport default function addNgRxESLintPlugin(schema: Schema): Rule {\n return (host: Tree, context: SchematicContext) => {\n const eslintConfigPath = '.eslintrc.json';\n const docs = 'https://ngrx.io/guide/eslint-plugin';\n\n const eslint = host.read(eslintConfigPath)?.toString('utf-8');\n if (!eslint) {\n context.logger.warn(`\nCould not find the ESLint config at \\`${eslintConfigPath}\\`.\nThe NgRx ESLint Plugin is installed but not configured.\n\nPlease see ${docs} to configure the NgRx ESLint Plugin.\n`);\n return host;\n }\n\n try {\n const json = JSON.parse(stripJsonComments(eslint));\n if (json.overrides) {\n if (\n !json.overrides.some((override: any) =>\n override.extends?.some((extend: any) =>\n extend.startsWith('plugin:@ngrx')\n )\n )\n ) {\n json.overrides.push(configurePlugin(schema.config));\n }\n } else if (\n !json.extends?.some((extend: any) => extend.startsWith('plugin:@ngrx'))\n ) {\n json.overrides = [configurePlugin(schema.config)];\n }\n\n host.overwrite(eslintConfigPath, JSON.stringify(json, null, 2));\n\n context.logger.info(`\n The NgRx ESLint Plugin is installed and configured with the '${schema.config}' config.\n\n Take a look at the docs at ${docs} if you want to change the default configuration.\n `);\n return host;\n } catch (err) {\n const detailsContent =\n err instanceof Error\n ? `\nDetails:\n${err.message}\n`\n : '';\n context.logger.warn(`\nSomething went wrong while adding the NgRx ESLint Plugin.\nThe NgRx ESLint Plugin is installed but not configured.\n\nPlease see ${docs} to configure the NgRx ESLint Plugin.\n${detailsContent}\n`);\n }\n };\n function configurePlugin(config: Schema['config']): Record<string, unknown> {\n return {\n files: ['*.ts'],\n extends: [`plugin:@ngrx/${config}`],\n };\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../modules/eslint-plugin/schematics/ng-add/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Rule, SchematicContext, Tree } from '@angular-devkit/schematics';\nimport stripJsonComments from 'strip-json-comments';\nimport type { Schema } from './schema';\nimport * as ts from 'typescript';\n\nexport const possibleFlatConfigPaths = [\n 'eslint.config.js',\n 'eslint.config.mjs',\n 'eslint.config.cjs',\n];\n\nexport default function (schema: Schema): Rule {\n return (host: Tree, context: SchematicContext) => {\n const jsonConfigPath = '.eslintrc.json';\n const flatConfigPath = possibleFlatConfigPaths.find((path) =>\n host.exists(path)\n );\n const docs = 'https://ngrx.io/guide/eslint-plugin';\n\n if (flatConfigPath) {\n updateFlatConfig(host, context, flatConfigPath, schema, docs);\n return host;\n }\n\n if (!host.exists(jsonConfigPath)) {\n context.logger.warn(`\nCould not find an ESLint config at any of ${possibleFlatConfigPaths.join(\n ', '\n )} or \\`${jsonConfigPath}\\`.\nThe NgRx ESLint Plugin is installed but not configured.\nPlease see ${docs} to configure the NgRx ESLint Plugin.\n `);\n return host;\n }\n\n updateJsonConfig(host, context, jsonConfigPath, schema, docs);\n return host;\n };\n}\n\nfunction updateFlatConfig(\n host: Tree,\n context: SchematicContext,\n flatConfigPath: string,\n schema: Schema,\n docs: string\n): void {\n const ngrxPlugin = '@ngrx/eslint-plugin/v9';\n const content = host.read(flatConfigPath)?.toString('utf-8');\n if (!content) {\n context.logger.error(\n `Could not read the ESLint flat config at \\`${flatConfigPath}\\`.`\n );\n return;\n }\n\n if (content.includes(ngrxPlugin)) {\n context.logger.info(\n `Skipping installation, the NgRx ESLint Plugin is already installed in your flat config.`\n );\n return;\n }\n\n if (!content.includes('tseslint.config')) {\n context.logger.warn(\n `No tseslint found, skipping the installation of the NgRx ESLint Plugin in your flat config.`\n );\n return;\n }\n\n const source = ts.createSourceFile(\n flatConfigPath,\n content,\n ts.ScriptTarget.Latest,\n true\n );\n\n const recorder = host.beginUpdate(flatConfigPath);\n addImport();\n addNgRxPlugin();\n\n host.commitUpdate(recorder);\n context.logger.info(`\nThe NgRx ESLint Plugin is installed and configured using the '${schema.config}' configuration in your flat config.\nSee ${docs} for more details.\n `);\n\n function addImport() {\n const isESM = content!.includes('export default');\n if (isESM) {\n const lastImport = source.statements\n .filter((statement) => ts.isImportDeclaration(statement))\n .reverse()[0];\n recorder.insertRight(\n lastImport?.end ?? 0,\n `\\nimport ngrx from '${ngrxPlugin}';`\n );\n } else {\n const lastRequireVariableDeclaration = source.statements\n .filter((statement) => {\n if (!ts.isVariableStatement(statement)) return false;\n const decl = statement.declarationList.declarations[0];\n if (!decl.initializer) return false;\n return (\n ts.isCallExpression(decl.initializer) &&\n decl.initializer.expression.getText() === 'require'\n );\n })\n .reverse()[0];\n\n recorder.insertRight(\n lastRequireVariableDeclaration?.end ?? 0,\n `\\nconst ngrx = require('${ngrxPlugin}');`\n );\n }\n }\n\n function addNgRxPlugin() {\n let tseslintConfigCall: ts.CallExpression | null = null;\n function findTsEslintConfigCalls(node: ts.Node) {\n if (tseslintConfigCall) {\n return;\n }\n\n if (\n ts.isCallExpression(node) &&\n node.expression.getText() === 'tseslint.config'\n ) {\n tseslintConfigCall = node;\n }\n ts.forEachChild(node, findTsEslintConfigCalls);\n }\n findTsEslintConfigCalls(source);\n\n if (tseslintConfigCall) {\n tseslintConfigCall = tseslintConfigCall as ts.CallExpression;\n const lastArgument =\n tseslintConfigCall.arguments[tseslintConfigCall.arguments.length - 1];\n const plugin = ` {\n files: ['**/*.ts'],\n extends: [\n ...ngrx.configs.${schema.config},\n ],\n rules: {},\n }`;\n\n if (lastArgument) {\n recorder.remove(lastArgument.pos, lastArgument.end - lastArgument.pos);\n recorder.insertRight(\n lastArgument.pos,\n `${lastArgument.getFullText()},\\n${plugin}`\n );\n } else {\n recorder.insertRight(tseslintConfigCall.end - 1, `\\n${plugin}\\n`);\n }\n }\n }\n}\n\nfunction updateJsonConfig(\n host: Tree,\n context: SchematicContext,\n jsonConfigPath: string,\n schema: Schema,\n docs: string\n): void {\n const eslint = host.read(jsonConfigPath)?.toString('utf-8');\n if (!eslint) {\n context.logger.error(`\nCould not find the ESLint config at \\`${jsonConfigPath}\\`.\nThe NgRx ESLint Plugin is installed but not configured.\nPlease see ${docs} to configure the NgRx ESLint Plugin.\n`);\n return;\n }\n\n try {\n const json = JSON.parse(stripJsonComments(eslint));\n const plugin = {\n files: ['*.ts'],\n extends: [`plugin:@ngrx/${schema.config}`],\n };\n if (json.overrides) {\n if (\n !json.overrides.some((override: any) =>\n override.extends?.some((extend: any) =>\n extend.startsWith('plugin:@ngrx')\n )\n )\n ) {\n json.overrides.push(plugin);\n }\n } else if (\n !json.extends?.some((extend: any) => extend.startsWith('plugin:@ngrx'))\n ) {\n json.overrides = [plugin];\n }\n\n host.overwrite(jsonConfigPath, JSON.stringify(json, null, 2));\n\n context.logger.info(`\nThe NgRx ESLint Plugin is installed and configured with the '${schema.config}' config.\nTake a look at the docs at ${docs} if you want to change the default configuration.\n`);\n } catch (err) {\n const detailsContent =\n err instanceof Error\n ? `\nDetails:\n${err.message}\n`\n : '';\n context.logger.warn(`\nSomething went wrong while adding the NgRx ESLint Plugin.\nThe NgRx ESLint Plugin is installed but not configured.\nPlease see ${docs} to configure the NgRx ESLint Plugin.\n${detailsContent}\n`);\n }\n}\n"]}
@@ -15,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
15
15
  }) : function(o, v) {
16
16
  o["default"] = v;
17
17
  });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
25
35
  Object.defineProperty(exports, "__esModule", { value: true });
26
36
  const fs_1 = require("fs");
27
37
  const path = __importStar(require("path"));
@@ -1 +1 @@
1
- {"version":3,"file":"generate-docs.js","sourceRoot":"","sources":["../../../../modules/eslint-plugin/scripts/generate-docs.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2BAA6D;AAC7D,2CAA6B;AAC7B,uCAAiD;AACjD,+DAAuE;AAEvE,MAAM,cAAc,GAAG,wBAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACrD,MAAM,WAAW,GAAG,2BAA2B,CAAC;AAChD,MAAM,UAAU,GAAG,sDAAsD,CAAC;AAE1E,KAAK,MAAM,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,wBAAgB,CAAC,EAAE,CAAC;IACpE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,QAAQ,KAAK,CAAC,CAAC;IACxD,IAAI,CAAC,IAAA,eAAU,EAAC,OAAO,CAAC,EAAE,CAAC;QACzB,IAAA,kBAAa,EAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC7B,CAAC;IACD,MAAM,GAAG,GAAG,IAAA,iBAAY,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,GAAG,CAAC,SAAS,CAC9B,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAAC,MAAM,CAC9C,CAAC;IACF,MAAM,MAAM,GAAG,IAAA,iBAAM,EACnB,KAAK,QAAQ;;EAEf,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,gDAAgD,CAAC,CAAC,CAAC,EAAE;;EAEpE,IAAI,CAAC,IAAI,EAAE,WAAW;;cAEV,IAAI,CAAC,IAAI;iBACN,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;oBACxB,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;gCACtB,IAAI,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;sBAExE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAC7D;;;;;EAKF,UAAU,EAAE,EACV;QACE,MAAM,EAAE,UAAU;QAClB,GAAG,cAAc;KAClB,CACF,CAAC;IAEF,IAAA,kBAAa,EAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AACjC,CAAC","sourcesContent":["import { readFileSync, writeFileSync, existsSync } from 'fs';\nimport * as path from 'path';\nimport { format, resolveConfig } from 'prettier';\nimport { rulesForGenerate } from '../src/utils/helper-functions/rules';\n\nconst prettierConfig = resolveConfig.sync(__dirname);\nconst PLACEHOLDER = '<!-- MANUAL-DOC:START -->';\nconst RULES_PATH = './projects/ngrx.io/content/guide/eslint-plugin/rules';\n\nfor (const [ruleName, { meta }] of Object.entries(rulesForGenerate)) {\n const docPath = path.join(RULES_PATH, `${ruleName}.md`);\n if (!existsSync(docPath)) {\n writeFileSync(docPath, ``);\n }\n const doc = readFileSync(docPath, 'utf-8');\n const docContent = doc.substring(\n doc.indexOf(PLACEHOLDER) + PLACEHOLDER.length\n );\n const newDoc = format(\n `# ${ruleName}\n\n${meta.version ? '> Required NgRx Version Range: ${meta.version}' : ''} \n\n${meta.docs?.description}\n\n- **Type**: ${meta.type}\n- **Fixable**: ${meta.fixable ? 'Yes' : 'No'}\n- **Suggestion**: ${meta.hasSuggestions ? 'Yes' : 'No'}\n- **Requires type checking**: ${meta.docs?.requiresTypeChecking ? 'Yes' : 'No'}\n- **Configurable**: ${\n Array.isArray(meta.schema) && meta.schema.length ? 'Yes' : 'No'\n }\n\n<!-- Everything above this generated, do not edit -->\n<!-- MANUAL-DOC:START -->\n\n${docContent}`,\n {\n parser: 'markdown',\n ...prettierConfig,\n }\n );\n\n writeFileSync(docPath, newDoc);\n}\n"]}
1
+ {"version":3,"file":"generate-docs.js","sourceRoot":"","sources":["../../../../modules/eslint-plugin/scripts/generate-docs.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2BAA6D;AAC7D,2CAA6B;AAC7B,uCAAiD;AACjD,+DAAuE;AAEvE,MAAM,cAAc,GAAG,wBAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACrD,MAAM,WAAW,GAAG,2BAA2B,CAAC;AAChD,MAAM,UAAU,GAAG,sDAAsD,CAAC;AAE1E,KAAK,MAAM,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,wBAAgB,CAAC,EAAE,CAAC;IACpE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,QAAQ,KAAK,CAAC,CAAC;IACxD,IAAI,CAAC,IAAA,eAAU,EAAC,OAAO,CAAC,EAAE,CAAC;QACzB,IAAA,kBAAa,EAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC7B,CAAC;IACD,MAAM,GAAG,GAAG,IAAA,iBAAY,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,GAAG,CAAC,SAAS,CAC9B,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAAC,MAAM,CAC9C,CAAC;IACF,MAAM,MAAM,GAAG,IAAA,iBAAM,EACnB,KAAK,QAAQ;;EAEf,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,gDAAgD,CAAC,CAAC,CAAC,EAAE;;EAEpE,IAAI,CAAC,IAAI,EAAE,WAAW;;cAEV,IAAI,CAAC,IAAI;iBACN,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;oBACxB,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;gCACtB,IAAI,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;sBAExE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAC7D;;;;;EAKF,UAAU,EAAE,EACV;QACE,MAAM,EAAE,UAAU;QAClB,GAAG,cAAc;KAClB,CACF,CAAC;IAEF,IAAA,kBAAa,EAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AACjC,CAAC","sourcesContent":["import { readFileSync, writeFileSync, existsSync } from 'fs';\nimport * as path from 'path';\nimport { format, resolveConfig } from 'prettier';\nimport { rulesForGenerate } from '../src/utils/helper-functions/rules';\n\nconst prettierConfig = resolveConfig.sync(__dirname);\nconst PLACEHOLDER = '<!-- MANUAL-DOC:START -->';\nconst RULES_PATH = './projects/ngrx.io/content/guide/eslint-plugin/rules';\n\nfor (const [ruleName, { meta }] of Object.entries(rulesForGenerate)) {\n const docPath = path.join(RULES_PATH, `${ruleName}.md`);\n if (!existsSync(docPath)) {\n writeFileSync(docPath, ``);\n }\n const doc = readFileSync(docPath, 'utf-8');\n const docContent = doc.substring(\n doc.indexOf(PLACEHOLDER) + PLACEHOLDER.length\n );\n const newDoc = format(\n `# ${ruleName}\n\n${meta.version ? '> Required NgRx Version Range: ${meta.version}' : ''} \n\n${meta.docs?.description}\n\n- **Type**: ${meta.type}\n- **Fixable**: ${meta.fixable ? 'Yes' : 'No'}\n- **Suggestion**: ${meta.hasSuggestions ? 'Yes' : 'No'}\n- **Requires type checking**: ${meta.docs?.requiresTypeChecking ? 'Yes' : 'No'}\n- **Configurable**: ${\n Array.isArray(meta.schema) && meta.schema.length ? 'Yes' : 'No'\n }\n\n<!-- Everything above this generated, do not edit -->\n<!-- MANUAL-DOC:START -->\n\n${docContent}`,\n {\n parser: 'markdown',\n ...prettierConfig,\n }\n );\n\n writeFileSync(docPath, newDoc);\n}\n"]}
@@ -15,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
15
15
  }) : function(o, v) {
16
16
  o["default"] = v;
17
17
  });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
25
35
  Object.defineProperty(exports, "__esModule", { value: true });
26
36
  exports.messageId = void 0;
27
37
  const path = __importStar(require("path"));
@@ -1 +1 @@
1
- {"version":3,"file":"avoid-combining-component-store-selectors.js","sourceRoot":"","sources":["../../../../../../modules/eslint-plugin/src/rules/component-store/avoid-combining-component-store-selectors.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AACA,2CAA6B;AAC7B,qDAAgD;AAChD,uCAA0E;AAC7D,QAAA,SAAS,GAAG,uCAAuC,CAAC;AAIjE,kBAAe,IAAA,yBAAU,EAAsB;IAC7C,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI;IACjC,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,UAAU,EAAE,iBAAiB;QAC7B,IAAI,EAAE;YACJ,WAAW,EAAE,mDAAmD;SACjE;QACD,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,CAAC,iBAAS,CAAC,EAAE,0CAA0C;SACxD;KACF;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;QAClB,MAAM,UAAU,GAAG,IAAA,kCAA0B,EAAC,OAAO,CAAC,CAAC;QAEvD,MAAM,WAAW,GAAG,oFAAoF,CAAC;QACzG,MAAM,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC,IAAA,uBAAe,EAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAErE,MAAM,cAAc,GAA8B,EAAE,CAAC;QACrD,OAAO;YACL,CAAC,yFAAyF,WAAW,MAAM,WAAW,EAAE,CAAC,CACvH,IAA6B;gBAE7B,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;YACD,CAAC,+CAA+C,YAAY,MAAM,YAAY,EAAE,CAAC,CAC/E,IAA6B;gBAE7B,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;YACD,CAAC,kDAAkD,CAAC;gBAClD,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;oBAClC,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI;wBACJ,SAAS,EAAT,iBAAS;qBACV,CAAC,CAAC;gBACL,CAAC;gBACD,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;YAC5B,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC","sourcesContent":["import type { TSESTree } from '@typescript-eslint/utils';\nimport * as path from 'path';\nimport { createRule } from '../../rule-creator';\nimport { getNgrxComponentStoreNames, namedExpression } from '../../utils';\nexport const messageId = 'avoidCombiningComponentStoreSelectors';\ntype MessageIds = typeof messageId;\ntype Options = readonly [];\n\nexport default createRule<Options, MessageIds>({\n name: path.parse(__filename).name,\n meta: {\n type: 'suggestion',\n ngrxModule: 'component-store',\n docs: {\n description: 'Prefer combining selectors at the selector level.',\n },\n schema: [],\n messages: {\n [messageId]: 'Combine selectors at the selector level.',\n },\n },\n defaultOptions: [],\n create: (context) => {\n const storeNames = getNgrxComponentStoreNames(context);\n\n const thisSelects = `CallExpression[callee.object.type='ThisExpression'][callee.property.name='select']`;\n const storeSelects = storeNames ? namedExpression(storeNames) : null;\n\n const selectsInArray: TSESTree.CallExpression[] = [];\n return {\n [`ClassDeclaration[superClass.name=/Store/] CallExpression[callee.name='combineLatest'] ${thisSelects} ~ ${thisSelects}`](\n node: TSESTree.CallExpression\n ) {\n selectsInArray.push(node);\n },\n [`CallExpression[callee.name='combineLatest'] ${storeSelects} ~ ${storeSelects}`](\n node: TSESTree.CallExpression\n ) {\n selectsInArray.push(node);\n },\n [`CallExpression[callee.name='combineLatest']:exit`]() {\n for (const node of selectsInArray) {\n context.report({\n node,\n messageId,\n });\n }\n selectsInArray.length = 0;\n },\n };\n },\n});\n"]}
1
+ {"version":3,"file":"avoid-combining-component-store-selectors.js","sourceRoot":"","sources":["../../../../../../modules/eslint-plugin/src/rules/component-store/avoid-combining-component-store-selectors.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,2CAA6B;AAC7B,qDAAgD;AAChD,uCAA0E;AAC7D,QAAA,SAAS,GAAG,uCAAuC,CAAC;AAIjE,kBAAe,IAAA,yBAAU,EAAsB;IAC7C,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI;IACjC,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,UAAU,EAAE,iBAAiB;QAC7B,IAAI,EAAE;YACJ,WAAW,EAAE,mDAAmD;SACjE;QACD,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,CAAC,iBAAS,CAAC,EAAE,0CAA0C;SACxD;KACF;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;QAClB,MAAM,UAAU,GAAG,IAAA,kCAA0B,EAAC,OAAO,CAAC,CAAC;QAEvD,MAAM,WAAW,GAAG,oFAAoF,CAAC;QACzG,MAAM,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC,IAAA,uBAAe,EAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAErE,MAAM,cAAc,GAA8B,EAAE,CAAC;QACrD,OAAO;YACL,CAAC,yFAAyF,WAAW,MAAM,WAAW,EAAE,CAAC,CACvH,IAA6B;gBAE7B,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;YACD,CAAC,+CAA+C,YAAY,MAAM,YAAY,EAAE,CAAC,CAC/E,IAA6B;gBAE7B,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;YACD,CAAC,kDAAkD,CAAC;gBAClD,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;oBAClC,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI;wBACJ,SAAS,EAAT,iBAAS;qBACV,CAAC,CAAC;gBACL,CAAC;gBACD,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;YAC5B,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC","sourcesContent":["import type { TSESTree } from '@typescript-eslint/utils';\nimport * as path from 'path';\nimport { createRule } from '../../rule-creator';\nimport { getNgrxComponentStoreNames, namedExpression } from '../../utils';\nexport const messageId = 'avoidCombiningComponentStoreSelectors';\ntype MessageIds = typeof messageId;\ntype Options = readonly [];\n\nexport default createRule<Options, MessageIds>({\n name: path.parse(__filename).name,\n meta: {\n type: 'suggestion',\n ngrxModule: 'component-store',\n docs: {\n description: 'Prefer combining selectors at the selector level.',\n },\n schema: [],\n messages: {\n [messageId]: 'Combine selectors at the selector level.',\n },\n },\n defaultOptions: [],\n create: (context) => {\n const storeNames = getNgrxComponentStoreNames(context);\n\n const thisSelects = `CallExpression[callee.object.type='ThisExpression'][callee.property.name='select']`;\n const storeSelects = storeNames ? namedExpression(storeNames) : null;\n\n const selectsInArray: TSESTree.CallExpression[] = [];\n return {\n [`ClassDeclaration[superClass.name=/Store/] CallExpression[callee.name='combineLatest'] ${thisSelects} ~ ${thisSelects}`](\n node: TSESTree.CallExpression\n ) {\n selectsInArray.push(node);\n },\n [`CallExpression[callee.name='combineLatest'] ${storeSelects} ~ ${storeSelects}`](\n node: TSESTree.CallExpression\n ) {\n selectsInArray.push(node);\n },\n [`CallExpression[callee.name='combineLatest']:exit`]() {\n for (const node of selectsInArray) {\n context.report({\n node,\n messageId,\n });\n }\n selectsInArray.length = 0;\n },\n };\n },\n});\n"]}
@@ -15,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
15
15
  }) : function(o, v) {
16
16
  o["default"] = v;
17
17
  });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
25
35
  Object.defineProperty(exports, "__esModule", { value: true });
26
36
  exports.messageId = void 0;
27
37
  const path = __importStar(require("path"));
@@ -1 +1 @@
1
- {"version":3,"file":"avoid-mapping-component-store-selectors.js","sourceRoot":"","sources":["../../../../../../modules/eslint-plugin/src/rules/component-store/avoid-mapping-component-store-selectors.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AACA,2CAA6B;AAC7B,qDAAgD;AAChD,uCAGqB;AAER,QAAA,SAAS,GAAG,qCAAqC,CAAC;AAK/D,kBAAe,IAAA,yBAAU,EAAsB;IAC7C,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI;IACjC,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,UAAU,EAAE,iBAAiB;QAC7B,IAAI,EAAE;YACJ,WAAW,EAAE,iDAAiD;SAC/D;QACD,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,CAAC,iBAAS,CAAC,EAAE,0CAA0C;SACxD;KACF;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;QAClB,MAAM,UAAU,GAAG,IAAA,kCAA0B,EAAC,OAAO,CAAC,CAAC;QAEvD,MAAM,mBAAmB,GAAG,+DAA+D,CAAC;QAC5F,MAAM,SAAS,GAAG;YAChB,mJAAmJ,mBAAmB,EAAE;YACxK,UAAU;gBACR,GAAG,IAAA,+BAAuB,EAAC,UAAU,CAAC,GAAG,mBAAmB,EAAE;SACjE;aACE,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,GAAG,CAAC,CAAC;QAEb,OAAO;YACL,CAAC,SAAS,CAAC,CAAC,IAAsC;gBAChD,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI;oBACJ,SAAS,EAAT,iBAAS;iBACV,CAAC,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC","sourcesContent":["import type { TSESTree } from '@typescript-eslint/utils';\nimport * as path from 'path';\nimport { createRule } from '../../rule-creator';\nimport {\n getNgrxComponentStoreNames,\n namedCallableExpression,\n} from '../../utils';\n\nexport const messageId = 'avoidMappingComponentStoreSelectors';\n\ntype MessageIds = typeof messageId;\ntype Options = readonly [];\n\nexport default createRule<Options, MessageIds>({\n name: path.parse(__filename).name,\n meta: {\n type: 'problem',\n ngrxModule: 'component-store',\n docs: {\n description: 'Avoid mapping logic outside the selector level.',\n },\n schema: [],\n messages: {\n [messageId]: 'Map logic at the selector level instead.',\n },\n },\n defaultOptions: [],\n create: (context) => {\n const storeNames = getNgrxComponentStoreNames(context);\n\n const mapOperatorSelector = `[callee.property.name=pipe] > CallExpression[callee.name=map]`;\n const selectors = [\n `ClassDeclaration[superClass.name=/Store/] CallExpression:has(CallExpression[callee.object.type='ThisExpression'][callee.property.name='select'])${mapOperatorSelector}`,\n storeNames &&\n `${namedCallableExpression(storeNames)}${mapOperatorSelector}`,\n ]\n .filter(Boolean)\n .join(',');\n\n return {\n [selectors](node: TSESTree.ArrowFunctionExpression) {\n context.report({\n node,\n messageId,\n });\n },\n };\n },\n});\n"]}
1
+ {"version":3,"file":"avoid-mapping-component-store-selectors.js","sourceRoot":"","sources":["../../../../../../modules/eslint-plugin/src/rules/component-store/avoid-mapping-component-store-selectors.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,2CAA6B;AAC7B,qDAAgD;AAChD,uCAGqB;AAER,QAAA,SAAS,GAAG,qCAAqC,CAAC;AAK/D,kBAAe,IAAA,yBAAU,EAAsB;IAC7C,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI;IACjC,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,UAAU,EAAE,iBAAiB;QAC7B,IAAI,EAAE;YACJ,WAAW,EAAE,iDAAiD;SAC/D;QACD,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,CAAC,iBAAS,CAAC,EAAE,0CAA0C;SACxD;KACF;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;QAClB,MAAM,UAAU,GAAG,IAAA,kCAA0B,EAAC,OAAO,CAAC,CAAC;QAEvD,MAAM,mBAAmB,GAAG,+DAA+D,CAAC;QAC5F,MAAM,SAAS,GAAG;YAChB,mJAAmJ,mBAAmB,EAAE;YACxK,UAAU;gBACR,GAAG,IAAA,+BAAuB,EAAC,UAAU,CAAC,GAAG,mBAAmB,EAAE;SACjE;aACE,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,GAAG,CAAC,CAAC;QAEb,OAAO;YACL,CAAC,SAAS,CAAC,CAAC,IAAsC;gBAChD,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI;oBACJ,SAAS,EAAT,iBAAS;iBACV,CAAC,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC","sourcesContent":["import type { TSESTree } from '@typescript-eslint/utils';\nimport * as path from 'path';\nimport { createRule } from '../../rule-creator';\nimport {\n getNgrxComponentStoreNames,\n namedCallableExpression,\n} from '../../utils';\n\nexport const messageId = 'avoidMappingComponentStoreSelectors';\n\ntype MessageIds = typeof messageId;\ntype Options = readonly [];\n\nexport default createRule<Options, MessageIds>({\n name: path.parse(__filename).name,\n meta: {\n type: 'problem',\n ngrxModule: 'component-store',\n docs: {\n description: 'Avoid mapping logic outside the selector level.',\n },\n schema: [],\n messages: {\n [messageId]: 'Map logic at the selector level instead.',\n },\n },\n defaultOptions: [],\n create: (context) => {\n const storeNames = getNgrxComponentStoreNames(context);\n\n const mapOperatorSelector = `[callee.property.name=pipe] > CallExpression[callee.name=map]`;\n const selectors = [\n `ClassDeclaration[superClass.name=/Store/] CallExpression:has(CallExpression[callee.object.type='ThisExpression'][callee.property.name='select'])${mapOperatorSelector}`,\n storeNames &&\n `${namedCallableExpression(storeNames)}${mapOperatorSelector}`,\n ]\n .filter(Boolean)\n .join(',');\n\n return {\n [selectors](node: TSESTree.ArrowFunctionExpression) {\n context.report({\n node,\n messageId,\n });\n },\n };\n },\n});\n"]}
@@ -1,7 +1,40 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.messageId = void 0;
4
- const path = require("path");
37
+ const path = __importStar(require("path"));
5
38
  const rule_creator_1 = require("../../rule-creator");
6
39
  exports.messageId = 'requireSuperOnDestroy';
7
40
  exports.default = (0, rule_creator_1.createRule)({
@@ -1 +1 @@
1
- {"version":3,"file":"require-super-ondestroy.js","sourceRoot":"","sources":["../../../../../../modules/eslint-plugin/src/rules/component-store/require-super-ondestroy.ts"],"names":[],"mappings":";;;AAAA,6BAA8B;AAC9B,qDAAgD;AAGnC,QAAA,SAAS,GAAG,uBAAuB,CAAC;AAIjD,kBAAe,IAAA,yBAAU,EAAsB;IAC7C,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI;IACjC,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,UAAU,EAAE,iBAAiB;QAC7B,IAAI,EAAE;YACJ,WAAW,EACT,yFAAyF;SAC5F;QACD,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,CAAC,iBAAS,CAAC,EACT,yEAAyE;SAC5E;KACF;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;QAClB,MAAM,yBAAyB,GAAG,0CAA0C,CAAC;QAC7E,MAAM,uBAAuB,GAAG,gBAAgB,CAAC;QAEjD,IAAI,2BAA2B,GAAG,KAAK,CAAC;QAExC,OAAO;YACL,CAAC,0FAA0F,uBAAuB,IAAI,CAAC,CACrH,CAA2B;gBAE3B,2BAA2B,GAAG,IAAI,CAAC;YACrC,CAAC;YACD,CAAC,oCAAoC,uBAAuB,KAAK,yBAAyB,mGAAmG,CAAC,CAC5L,IAAyB;gBAEzB,IAAI,CAAC,2BAA2B,EAAE,CAAC;oBACjC,OAAO;gBACT,CAAC;gBAED,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI;oBACJ,SAAS,EAAT,iBAAS;iBACV,CAAC,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC","sourcesContent":["import path = require('path');\nimport { createRule } from '../../rule-creator';\nimport { TSESTree } from '@typescript-eslint/types';\n\nexport const messageId = 'requireSuperOnDestroy';\ntype MessageIds = typeof messageId;\ntype Options = readonly [];\n\nexport default createRule<Options, MessageIds>({\n name: path.parse(__filename).name,\n meta: {\n type: 'problem',\n ngrxModule: 'component-store',\n docs: {\n description:\n 'Overriden ngOnDestroy method in component stores require a call to super.ngOnDestroy().',\n },\n schema: [],\n messages: {\n [messageId]:\n \"Call super.ngOnDestroy() inside a component store's ngOnDestroy method.\",\n },\n },\n defaultOptions: [],\n create: (context) => {\n const ngOnDestroyMethodSelector = `MethodDefinition[key.name='ngOnDestroy']`;\n const componentStoreClassName = 'ComponentStore';\n\n let hasNgrxComponentStoreImport = false;\n\n return {\n [`ImportDeclaration[source.value='@ngrx/component-store'] ImportSpecifier[imported.name='${componentStoreClassName}']`](\n _: TSESTree.ImportSpecifier\n ) {\n hasNgrxComponentStoreImport = true;\n },\n [`ClassDeclaration[superClass.name=${componentStoreClassName}] ${ngOnDestroyMethodSelector}:not(:has(CallExpression[callee.object.type='Super'][callee.property.name='ngOnDestroy'])) > .key`](\n node: TSESTree.Identifier\n ) {\n if (!hasNgrxComponentStoreImport) {\n return;\n }\n\n context.report({\n node,\n messageId,\n });\n },\n };\n },\n});\n"]}
1
+ {"version":3,"file":"require-super-ondestroy.js","sourceRoot":"","sources":["../../../../../../modules/eslint-plugin/src/rules/component-store/require-super-ondestroy.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA6B;AAC7B,qDAAgD;AAGnC,QAAA,SAAS,GAAG,uBAAuB,CAAC;AAIjD,kBAAe,IAAA,yBAAU,EAAsB;IAC7C,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI;IACjC,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,UAAU,EAAE,iBAAiB;QAC7B,IAAI,EAAE;YACJ,WAAW,EACT,yFAAyF;SAC5F;QACD,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,CAAC,iBAAS,CAAC,EACT,yEAAyE;SAC5E;KACF;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;QAClB,MAAM,yBAAyB,GAAG,0CAA0C,CAAC;QAC7E,MAAM,uBAAuB,GAAG,gBAAgB,CAAC;QAEjD,IAAI,2BAA2B,GAAG,KAAK,CAAC;QAExC,OAAO;YACL,CAAC,0FAA0F,uBAAuB,IAAI,CAAC,CACrH,CAA2B;gBAE3B,2BAA2B,GAAG,IAAI,CAAC;YACrC,CAAC;YACD,CAAC,oCAAoC,uBAAuB,KAAK,yBAAyB,mGAAmG,CAAC,CAC5L,IAAyB;gBAEzB,IAAI,CAAC,2BAA2B,EAAE,CAAC;oBACjC,OAAO;gBACT,CAAC;gBAED,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI;oBACJ,SAAS,EAAT,iBAAS;iBACV,CAAC,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC","sourcesContent":["import * as path from 'path';\nimport { createRule } from '../../rule-creator';\nimport { TSESTree } from '@typescript-eslint/types';\n\nexport const messageId = 'requireSuperOnDestroy';\ntype MessageIds = typeof messageId;\ntype Options = readonly [];\n\nexport default createRule<Options, MessageIds>({\n name: path.parse(__filename).name,\n meta: {\n type: 'problem',\n ngrxModule: 'component-store',\n docs: {\n description:\n 'Overriden ngOnDestroy method in component stores require a call to super.ngOnDestroy().',\n },\n schema: [],\n messages: {\n [messageId]:\n \"Call super.ngOnDestroy() inside a component store's ngOnDestroy method.\",\n },\n },\n defaultOptions: [],\n create: (context) => {\n const ngOnDestroyMethodSelector = `MethodDefinition[key.name='ngOnDestroy']`;\n const componentStoreClassName = 'ComponentStore';\n\n let hasNgrxComponentStoreImport = false;\n\n return {\n [`ImportDeclaration[source.value='@ngrx/component-store'] ImportSpecifier[imported.name='${componentStoreClassName}']`](\n _: TSESTree.ImportSpecifier\n ) {\n hasNgrxComponentStoreImport = true;\n },\n [`ClassDeclaration[superClass.name=${componentStoreClassName}] ${ngOnDestroyMethodSelector}:not(:has(CallExpression[callee.object.type='Super'][callee.property.name='ngOnDestroy'])) > .key`](\n node: TSESTree.Identifier\n ) {\n if (!hasNgrxComponentStoreImport) {\n return;\n }\n\n context.report({\n node,\n messageId,\n });\n },\n };\n },\n});\n"]}
@@ -15,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
15
15
  }) : function(o, v) {
16
16
  o["default"] = v;
17
17
  });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
25
35
  Object.defineProperty(exports, "__esModule", { value: true });
26
36
  exports.messageId = void 0;
27
37
  const path = __importStar(require("path"));
@@ -1 +1 @@
1
- {"version":3,"file":"updater-explicit-return-type.js","sourceRoot":"","sources":["../../../../../../modules/eslint-plugin/src/rules/component-store/updater-explicit-return-type.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AACA,2CAA6B;AAC7B,qDAAgD;AAChD,uCAA0E;AAE7D,QAAA,SAAS,GAAG,2BAA2B,CAAC;AAKrD,kBAAe,IAAA,yBAAU,EAAsB;IAC7C,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI;IACjC,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,UAAU,EAAE,iBAAiB;QAC7B,IAAI,EAAE;YACJ,WAAW,EAAE,gDAAgD;SAC9D;QACD,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,CAAC,iBAAS,CAAC,EACT,6HAA6H;SAChI;KACF;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;QAClB,MAAM,UAAU,GAAG,IAAA,kCAA0B,EAAC,OAAO,CAAC,CAAC;QACvD,MAAM,qBAAqB,GAAG,0DAA0D,CAAC;QACzF,MAAM,SAAS,GAAG;YAChB,mIAAmI,qBAAqB,EAAE;YAC1J,UAAU;gBACR,GAAG,IAAA,uBAAe,EAChB,UAAU,CACX,sCAAsC,qBAAqB,EAAE;SACjE;aACE,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,GAAG,CAAC,CAAC;QAEb,OAAO;YACL,CAAC,SAAS,CAAC,CAAC,IAAsC;gBAChD,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI;oBACJ,SAAS,EAAT,iBAAS;iBACV,CAAC,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC","sourcesContent":["import type { TSESTree } from '@typescript-eslint/utils';\nimport * as path from 'path';\nimport { createRule } from '../../rule-creator';\nimport { getNgrxComponentStoreNames, namedExpression } from '../../utils';\n\nexport const messageId = 'updaterExplicitReturnType';\n\ntype MessageIds = typeof messageId;\ntype Options = readonly [];\n\nexport default createRule<Options, MessageIds>({\n name: path.parse(__filename).name,\n meta: {\n type: 'problem',\n ngrxModule: 'component-store',\n docs: {\n description: '`Updater` should have an explicit return type.',\n },\n schema: [],\n messages: {\n [messageId]:\n '`Updater` should have an explicit return type when using arrow functions: `this.store.updater((state, value): State => {}`.',\n },\n },\n defaultOptions: [],\n create: (context) => {\n const storeNames = getNgrxComponentStoreNames(context);\n const withoutTypeAnnotation = `ArrowFunctionExpression:not([returnType.typeAnnotation])`;\n const selectors = [\n `ClassDeclaration[superClass.name=/Store/] CallExpression[callee.object.type='ThisExpression'][callee.property.name='updater'] > ${withoutTypeAnnotation}`,\n storeNames &&\n `${namedExpression(\n storeNames\n )}[callee.property.name='updater'] > ${withoutTypeAnnotation}`,\n ]\n .filter(Boolean)\n .join(',');\n\n return {\n [selectors](node: TSESTree.ArrowFunctionExpression) {\n context.report({\n node,\n messageId,\n });\n },\n };\n },\n});\n"]}
1
+ {"version":3,"file":"updater-explicit-return-type.js","sourceRoot":"","sources":["../../../../../../modules/eslint-plugin/src/rules/component-store/updater-explicit-return-type.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,2CAA6B;AAC7B,qDAAgD;AAChD,uCAA0E;AAE7D,QAAA,SAAS,GAAG,2BAA2B,CAAC;AAKrD,kBAAe,IAAA,yBAAU,EAAsB;IAC7C,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI;IACjC,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,UAAU,EAAE,iBAAiB;QAC7B,IAAI,EAAE;YACJ,WAAW,EAAE,gDAAgD;SAC9D;QACD,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,CAAC,iBAAS,CAAC,EACT,6HAA6H;SAChI;KACF;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;QAClB,MAAM,UAAU,GAAG,IAAA,kCAA0B,EAAC,OAAO,CAAC,CAAC;QACvD,MAAM,qBAAqB,GAAG,0DAA0D,CAAC;QACzF,MAAM,SAAS,GAAG;YAChB,mIAAmI,qBAAqB,EAAE;YAC1J,UAAU;gBACR,GAAG,IAAA,uBAAe,EAChB,UAAU,CACX,sCAAsC,qBAAqB,EAAE;SACjE;aACE,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,GAAG,CAAC,CAAC;QAEb,OAAO;YACL,CAAC,SAAS,CAAC,CAAC,IAAsC;gBAChD,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI;oBACJ,SAAS,EAAT,iBAAS;iBACV,CAAC,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC","sourcesContent":["import type { TSESTree } from '@typescript-eslint/utils';\nimport * as path from 'path';\nimport { createRule } from '../../rule-creator';\nimport { getNgrxComponentStoreNames, namedExpression } from '../../utils';\n\nexport const messageId = 'updaterExplicitReturnType';\n\ntype MessageIds = typeof messageId;\ntype Options = readonly [];\n\nexport default createRule<Options, MessageIds>({\n name: path.parse(__filename).name,\n meta: {\n type: 'problem',\n ngrxModule: 'component-store',\n docs: {\n description: '`Updater` should have an explicit return type.',\n },\n schema: [],\n messages: {\n [messageId]:\n '`Updater` should have an explicit return type when using arrow functions: `this.store.updater((state, value): State => {}`.',\n },\n },\n defaultOptions: [],\n create: (context) => {\n const storeNames = getNgrxComponentStoreNames(context);\n const withoutTypeAnnotation = `ArrowFunctionExpression:not([returnType.typeAnnotation])`;\n const selectors = [\n `ClassDeclaration[superClass.name=/Store/] CallExpression[callee.object.type='ThisExpression'][callee.property.name='updater'] > ${withoutTypeAnnotation}`,\n storeNames &&\n `${namedExpression(\n storeNames\n )}[callee.property.name='updater'] > ${withoutTypeAnnotation}`,\n ]\n .filter(Boolean)\n .join(',');\n\n return {\n [selectors](node: TSESTree.ArrowFunctionExpression) {\n context.report({\n node,\n messageId,\n });\n },\n };\n },\n});\n"]}
@@ -15,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
15
15
  }) : function(o, v) {
16
16
  o["default"] = v;
17
17
  });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
25
35
  Object.defineProperty(exports, "__esModule", { value: true });
26
36
  exports.messageId = void 0;
27
37
  const utils_1 = require("@typescript-eslint/utils");
@@ -1 +1 @@
1
- {"version":3,"file":"avoid-cyclic-effects.js","sourceRoot":"","sources":["../../../../../../modules/eslint-plugin/src/rules/effects/avoid-cyclic-effects.ts"],"names":[],"mappings":"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","sourcesContent":["import { ESLintUtils, type TSESTree } from '@typescript-eslint/utils';\nimport * as path from 'path';\nimport * as ts from 'typescript';\nimport { createRule } from '../../rule-creator';\nimport {\n asPattern,\n createEffectExpression,\n getNgRxEffectActions,\n isCallExpression,\n isIdentifier,\n isTypeReference,\n} from '../../utils';\n\nexport const messageId = 'avoidCyclicEffects';\n\ntype MessageIds = typeof messageId;\ntype Options = readonly [];\n\n// This rule is a modified version (to support dispatch: false) from the eslint-plugin-rxjs plugin.\n// The original implementation can be found at https://github.com/cartant/eslint-plugin-rxjs/blob/main/source/rules/no-cyclic-action.ts\n// Thank you Nicholas Jamieson (@cartant).\n\nexport default createRule<Options, MessageIds>({\n name: path.parse(__filename).name,\n meta: {\n type: 'problem',\n ngrxModule: 'effects',\n docs: {\n description: 'Avoid `Effect` that re-emit filtered actions.',\n requiresTypeChecking: true,\n },\n schema: [],\n messages: {\n [messageId]: '`Effect` that re-emit filtered actions are forbidden.',\n },\n },\n defaultOptions: [],\n create: (context) => {\n const { identifiers = [] } = getNgRxEffectActions(context);\n const actionsNames = identifiers.length > 0 ? asPattern(identifiers) : null;\n\n if (!actionsNames) {\n return {};\n }\n\n const services = ESLintUtils.getParserServices(context);\n const typeChecker = services.program.getTypeChecker();\n\n function checkNode(pipeCallExpression: TSESTree.CallExpression) {\n const operatorCallExpression = pipeCallExpression.arguments.find(\n (arg) =>\n isCallExpression(arg) &&\n isIdentifier(arg.callee) &&\n arg.callee.name === 'ofType'\n );\n if (!operatorCallExpression) {\n return;\n }\n const operatorType = services.getTypeAtLocation(operatorCallExpression);\n const [signature] = typeChecker.getSignaturesOfType(\n operatorType,\n ts.SignatureKind.Call\n );\n\n if (!signature) {\n return;\n }\n const operatorReturnType =\n typeChecker.getReturnTypeOfSignature(signature);\n if (!isTypeReference(operatorReturnType)) {\n return;\n }\n const [operatorElementType] =\n typeChecker.getTypeArguments(operatorReturnType);\n if (!operatorElementType) {\n return;\n }\n\n const pipeType = services.getTypeAtLocation(pipeCallExpression);\n if (!isTypeReference(pipeType)) {\n return;\n }\n const [pipeElementType] = typeChecker.getTypeArguments(pipeType);\n if (!pipeElementType) {\n return;\n }\n\n const operatorActionTypes = getActionTypes(operatorElementType);\n const pipeActionTypes = getActionTypes(pipeElementType);\n\n for (const actionType of operatorActionTypes) {\n if (pipeActionTypes.includes(actionType)) {\n context.report({\n node: pipeCallExpression.callee,\n messageId,\n });\n return;\n }\n }\n }\n\n function getActionType(symbol: ts.Symbol): ts.Type | null {\n const { valueDeclaration } = symbol;\n\n if (!valueDeclaration) {\n return null;\n }\n\n if (valueDeclaration.kind === ts.SyntaxKind.PropertyDeclaration) {\n const { parent } = symbol as typeof symbol & { parent: ts.Symbol };\n return parent.valueDeclaration\n ? typeChecker.getTypeOfSymbolAtLocation(\n parent,\n parent.valueDeclaration\n )\n : null;\n }\n\n return typeChecker.getTypeOfSymbolAtLocation(symbol, valueDeclaration);\n }\n\n function getActionTypes(type: ts.Type): string[] {\n if (type.isUnion()) {\n const memberActionTypes: string[] = [];\n for (const memberType of type.types) {\n memberActionTypes.push(...getActionTypes(memberType));\n }\n return memberActionTypes;\n }\n\n const symbol = typeChecker.getPropertyOfType(type, 'type');\n\n if (!symbol) {\n return [];\n }\n\n const actionType = getActionType(symbol);\n\n if (!actionType) {\n return [];\n }\n\n // TODO: support \"dynamic\" types\n // e.g. const genericFoo = createAction(`${subject} FOO`); (resolves to 'string')\n if (typeChecker.typeToString(actionType) === 'string') {\n return [];\n }\n return [typeChecker.typeToString(actionType)];\n }\n\n let firstPipe = true;\n return {\n [`${createEffectExpression}:not([arguments.1]:has(Property[key.name='dispatch'][value.value=false])) CallExpression[callee.property.name='pipe'][callee.object.property.name=${actionsNames}]`](\n node\n ) {\n if (firstPipe) {\n checkNode(node);\n firstPipe = false;\n return;\n }\n },\n\n [`${createEffectExpression}:not([arguments.1]:has(Property[key.name='dispatch'][value.value=false])) CallExpression[callee.property.name='pipe']:exit`]() {\n firstPipe = true;\n },\n };\n },\n});\n"]}
1
+ {"version":3,"file":"avoid-cyclic-effects.js","sourceRoot":"","sources":["../../../../../../modules/eslint-plugin/src/rules/effects/avoid-cyclic-effects.ts"],"names":[],"mappings":"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","sourcesContent":["import { ESLintUtils, type TSESTree } from '@typescript-eslint/utils';\nimport * as path from 'path';\nimport * as ts from 'typescript';\nimport { createRule } from '../../rule-creator';\nimport {\n asPattern,\n createEffectExpression,\n getNgRxEffectActions,\n isCallExpression,\n isIdentifier,\n isTypeReference,\n} from '../../utils';\n\nexport const messageId = 'avoidCyclicEffects';\n\ntype MessageIds = typeof messageId;\ntype Options = readonly [];\n\n// This rule is a modified version (to support dispatch: false) from the eslint-plugin-rxjs plugin.\n// The original implementation can be found at https://github.com/cartant/eslint-plugin-rxjs/blob/main/source/rules/no-cyclic-action.ts\n// Thank you Nicholas Jamieson (@cartant).\n\nexport default createRule<Options, MessageIds>({\n name: path.parse(__filename).name,\n meta: {\n type: 'problem',\n ngrxModule: 'effects',\n docs: {\n description: 'Avoid `Effect` that re-emit filtered actions.',\n requiresTypeChecking: true,\n },\n schema: [],\n messages: {\n [messageId]: '`Effect` that re-emit filtered actions are forbidden.',\n },\n },\n defaultOptions: [],\n create: (context) => {\n const { identifiers = [] } = getNgRxEffectActions(context);\n const actionsNames = identifiers.length > 0 ? asPattern(identifiers) : null;\n\n if (!actionsNames) {\n return {};\n }\n\n const services = ESLintUtils.getParserServices(context);\n const typeChecker = services.program.getTypeChecker();\n\n function checkNode(pipeCallExpression: TSESTree.CallExpression) {\n const operatorCallExpression = pipeCallExpression.arguments.find(\n (arg) =>\n isCallExpression(arg) &&\n isIdentifier(arg.callee) &&\n arg.callee.name === 'ofType'\n );\n if (!operatorCallExpression) {\n return;\n }\n const operatorType = services.getTypeAtLocation(operatorCallExpression);\n const [signature] = typeChecker.getSignaturesOfType(\n operatorType,\n ts.SignatureKind.Call\n );\n\n if (!signature) {\n return;\n }\n const operatorReturnType =\n typeChecker.getReturnTypeOfSignature(signature);\n if (!isTypeReference(operatorReturnType)) {\n return;\n }\n const [operatorElementType] =\n typeChecker.getTypeArguments(operatorReturnType);\n if (!operatorElementType) {\n return;\n }\n\n const pipeType = services.getTypeAtLocation(pipeCallExpression);\n if (!isTypeReference(pipeType)) {\n return;\n }\n const [pipeElementType] = typeChecker.getTypeArguments(pipeType);\n if (!pipeElementType) {\n return;\n }\n\n const operatorActionTypes = getActionTypes(operatorElementType);\n const pipeActionTypes = getActionTypes(pipeElementType);\n\n for (const actionType of operatorActionTypes) {\n if (pipeActionTypes.includes(actionType)) {\n context.report({\n node: pipeCallExpression.callee,\n messageId,\n });\n return;\n }\n }\n }\n\n function getActionType(symbol: ts.Symbol): ts.Type | null {\n const { valueDeclaration } = symbol;\n\n if (!valueDeclaration) {\n return null;\n }\n\n if (valueDeclaration.kind === ts.SyntaxKind.PropertyDeclaration) {\n const { parent } = symbol as typeof symbol & { parent: ts.Symbol };\n return parent.valueDeclaration\n ? typeChecker.getTypeOfSymbolAtLocation(\n parent,\n parent.valueDeclaration\n )\n : null;\n }\n\n return typeChecker.getTypeOfSymbolAtLocation(symbol, valueDeclaration);\n }\n\n function getActionTypes(type: ts.Type): string[] {\n if (type.isUnion()) {\n const memberActionTypes: string[] = [];\n for (const memberType of type.types) {\n memberActionTypes.push(...getActionTypes(memberType));\n }\n return memberActionTypes;\n }\n\n const symbol = typeChecker.getPropertyOfType(type, 'type');\n\n if (!symbol) {\n return [];\n }\n\n const actionType = getActionType(symbol);\n\n if (!actionType) {\n return [];\n }\n\n // TODO: support \"dynamic\" types\n // e.g. const genericFoo = createAction(`${subject} FOO`); (resolves to 'string')\n if (typeChecker.typeToString(actionType) === 'string') {\n return [];\n }\n return [typeChecker.typeToString(actionType)];\n }\n\n let firstPipe = true;\n return {\n [`${createEffectExpression}:not([arguments.1]:has(Property[key.name='dispatch'][value.value=false])) CallExpression[callee.property.name='pipe'][callee.object.property.name=${actionsNames}]`](\n node\n ) {\n if (firstPipe) {\n checkNode(node);\n firstPipe = false;\n return;\n }\n },\n\n [`${createEffectExpression}:not([arguments.1]:has(Property[key.name='dispatch'][value.value=false])) CallExpression[callee.property.name='pipe']:exit`]() {\n firstPipe = true;\n },\n };\n },\n});\n"]}