@depup/angular-eslint__eslint-plugin 22.2.0-depup.0 → 22.3.0-depup.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 (66) hide show
  1. package/README.md +2 -2
  2. package/changes.json +1 -1
  3. package/dist/index.d.ts +7 -2
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +2 -0
  6. package/dist/rules/component-class-suffix.js +5 -5
  7. package/dist/rules/component-max-inline-declarations.js +7 -7
  8. package/dist/rules/computed-must-return.js +1 -1
  9. package/dist/rules/consistent-component-styles.js +1 -1
  10. package/dist/rules/contextual-decorator.js +1 -1
  11. package/dist/rules/contextual-lifecycle.js +1 -1
  12. package/dist/rules/directive-class-suffix.js +1 -1
  13. package/dist/rules/inject-at-top.d.ts +6 -2
  14. package/dist/rules/inject-at-top.d.ts.map +1 -1
  15. package/dist/rules/inject-at-top.js +53 -22
  16. package/dist/rules/no-async-lifecycle-method.js +1 -1
  17. package/dist/rules/no-attribute-decorator.js +1 -1
  18. package/dist/rules/no-developer-preview.js +1 -1
  19. package/dist/rules/no-duplicates-in-metadata-arrays.js +1 -1
  20. package/dist/rules/no-empty-lifecycle-method.js +1 -1
  21. package/dist/rules/no-experimental.js +1 -1
  22. package/dist/rules/no-forward-ref.js +1 -1
  23. package/dist/rules/no-implicit-take-until-destroyed.d.ts.map +1 -1
  24. package/dist/rules/no-implicit-take-until-destroyed.js +16 -6
  25. package/dist/rules/no-input-prefix.js +1 -1
  26. package/dist/rules/no-input-rename.js +1 -1
  27. package/dist/rules/no-inputs-metadata-property.js +1 -1
  28. package/dist/rules/no-lifecycle-call.js +1 -1
  29. package/dist/rules/no-output-native.js +1 -1
  30. package/dist/rules/no-output-on-prefix.js +1 -1
  31. package/dist/rules/no-output-rename.js +1 -1
  32. package/dist/rules/no-outputs-metadata-property.js +1 -1
  33. package/dist/rules/no-pipe-impure.js +1 -1
  34. package/dist/rules/no-queries-metadata-property.js +1 -1
  35. package/dist/rules/no-uncalled-signals.js +1 -1
  36. package/dist/rules/pipe-prefix.js +5 -5
  37. package/dist/rules/prefer-host-metadata-property.js +1 -1
  38. package/dist/rules/prefer-inject.js +1 -1
  39. package/dist/rules/prefer-on-push-component-change-detection.js +1 -1
  40. package/dist/rules/prefer-output-emitter-ref.js +1 -1
  41. package/dist/rules/prefer-output-readonly.js +1 -1
  42. package/dist/rules/prefer-service-decorator.js +1 -1
  43. package/dist/rules/prefer-signal-model.d.ts +7 -1
  44. package/dist/rules/prefer-signal-model.d.ts.map +1 -1
  45. package/dist/rules/prefer-signal-model.js +118 -40
  46. package/dist/rules/prefer-signals.js +1 -1
  47. package/dist/rules/prefer-standalone.js +1 -1
  48. package/dist/rules/reactive-context-must-read-signal.d.ts +16 -0
  49. package/dist/rules/reactive-context-must-read-signal.d.ts.map +1 -0
  50. package/dist/rules/reactive-context-must-read-signal.js +357 -0
  51. package/dist/rules/relative-url-prefix.js +1 -1
  52. package/dist/rules/require-lifecycle-on-prototype.js +1 -1
  53. package/dist/rules/require-localize-metadata.js +1 -1
  54. package/dist/rules/runtime-localize.js +1 -1
  55. package/dist/rules/sort-keys-in-type-decorator.js +1 -1
  56. package/dist/rules/sort-lifecycle-methods.js +1 -1
  57. package/dist/rules/use-component-selector.js +1 -1
  58. package/dist/rules/use-component-view-encapsulation.js +1 -1
  59. package/dist/rules/use-injectable-provided-in.d.ts +6 -3
  60. package/dist/rules/use-injectable-provided-in.d.ts.map +1 -1
  61. package/dist/rules/use-injectable-provided-in.js +14 -5
  62. package/dist/rules/use-lifecycle-interface.js +1 -1
  63. package/dist/rules/use-pipe-transform-interface.js +1 -1
  64. package/dist/utils/create-eslint-rule.d.ts.map +1 -1
  65. package/dist/utils/create-eslint-rule.js +1 -24
  66. package/package.json +7 -7
@@ -44,8 +44,8 @@ exports.default = (0, create_eslint_rule_1.createESLintRule)({
44
44
  requireLocalizeMeaning: `$localize tagged messages should contain a meaning. See more at ${STYLE_GUIDE_LINK_METADATA_FOR_TRANSLATION}`,
45
45
  requireLocalizeCustomId: `$localize tagged messages should contain a custom id{{patternMessage}}. See more at ${STYLE_GUIDE_LINK_METADATA_FOR_TRANSLATION}`,
46
46
  },
47
+ defaultOptions: [DEFAULT_OPTIONS],
47
48
  },
48
- defaultOptions: [DEFAULT_OPTIONS],
49
49
  create(context, [{ requireDescription, requireMeaning, requireCustomId }]) {
50
50
  return {
51
51
  TaggedTemplateExpression(taggedTemplateExpression) {
@@ -15,8 +15,8 @@ exports.default = (0, create_eslint_rule_1.createESLintRule)({
15
15
  messages: {
16
16
  runtimeLocalize: `$localize could be called before translations are loaded`,
17
17
  },
18
+ defaultOptions: [],
18
19
  },
19
- defaultOptions: [],
20
20
  create(context) {
21
21
  return {
22
22
  TaggedTemplateExpression(taggedTemplateExpression) {
@@ -103,8 +103,8 @@ exports.default = (0, create_eslint_rule_1.createESLintRule)({
103
103
  messages: {
104
104
  incorrectOrder: 'Keys in @{{decorator}} decorator should be ordered: {{expectedOrder}}',
105
105
  },
106
+ defaultOptions: [DEFAULT_ORDER],
106
107
  },
107
- defaultOptions: [DEFAULT_ORDER],
108
108
  create(context, [orderConfig]) {
109
109
  function checkContext(node, decoratorName) {
110
110
  const expectedOrder = orderConfig[decoratorName];
@@ -15,8 +15,8 @@ exports.default = (0, create_eslint_rule_1.createESLintRule)({
15
15
  messages: {
16
16
  lifecycleMethodsNotSorted: `Lifecycle Methods are not declared in order of execution`,
17
17
  },
18
+ defaultOptions: [],
18
19
  },
19
- defaultOptions: [],
20
20
  create(context) {
21
21
  const isBefore = (method1, method2) => {
22
22
  const methodIndex1 = utils_1.ASTUtils.angularLifecycleMethodsOrdered.indexOf(utils_1.ASTUtils.getMethodName(method1));
@@ -16,8 +16,8 @@ exports.default = (0, create_eslint_rule_1.createESLintRule)({
16
16
  messages: {
17
17
  useComponentSelector: 'The selector of the component is mandatory',
18
18
  },
19
+ defaultOptions: [],
19
20
  },
20
- defaultOptions: [],
21
21
  create(context) {
22
22
  return {
23
23
  [utils_1.Selectors.COMPONENT_CLASS_DECORATOR](node) {
@@ -18,8 +18,8 @@ exports.default = (0, create_eslint_rule_1.createESLintRule)({
18
18
  useComponentViewEncapsulation: `Using \`${VIEW_ENCAPSULATION_NONE}\` makes your styles global, which may have an unintended effect`,
19
19
  suggestRemoveViewEncapsulationNone: `Remove \`${VIEW_ENCAPSULATION_NONE}\``,
20
20
  },
21
+ defaultOptions: [],
21
22
  },
22
- defaultOptions: [],
23
23
  create(context) {
24
24
  const sourceCode = context.sourceCode;
25
25
  return {
@@ -1,6 +1,9 @@
1
- export type Options = [{
2
- readonly ignoreClassNamePattern?: string;
3
- }];
1
+ export type Options = [
2
+ {
3
+ readonly ignoreClassNamePattern?: string;
4
+ readonly allowProvidedInNull?: boolean;
5
+ }
6
+ ];
4
7
  export type MessageIds = 'useInjectableProvidedIn' | 'suggestInjector';
5
8
  export declare const RULE_NAME = "use-injectable-provided-in";
6
9
  declare const _default: import("@typescript-eslint/utils/ts-eslint").RuleModule<MessageIds, Options, import("../utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
@@ -1 +1 @@
1
- {"version":3,"file":"use-injectable-provided-in.d.ts","sourceRoot":"","sources":["../../src/rules/use-injectable-provided-in.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,OAAO,GAAG,CAAC;IAAE,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AACrE,MAAM,MAAM,UAAU,GAAG,yBAAyB,GAAG,iBAAiB,CAAC;AACvE,eAAO,MAAM,SAAS,+BAA+B,CAAC;;;;AAGtD,wBA2DG;AAEH,eAAO,MAAM,mBAAmB;;CAE/B,CAAC"}
1
+ {"version":3,"file":"use-injectable-provided-in.d.ts","sourceRoot":"","sources":["../../src/rules/use-injectable-provided-in.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,OAAO,GAAG;IACpB;QACE,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC;QACzC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;KACxC;CACF,CAAC;AACF,MAAM,MAAM,UAAU,GAAG,yBAAyB,GAAG,iBAAiB,CAAC;AACvE,eAAO,MAAM,SAAS,+BAA+B,CAAC;;;;AAMtD,wBAiEG;AAEH,eAAO,MAAM,mBAAmB;;CAE/B,CAAC"}
@@ -5,6 +5,9 @@ const utils_1 = require("@angular-eslint/utils");
5
5
  const create_eslint_rule_1 = require("../utils/create-eslint-rule");
6
6
  exports.RULE_NAME = 'use-injectable-provided-in';
7
7
  const METADATA_PROPERTY_NAME = 'providedIn';
8
+ const DEFAULT_OPTIONS = {
9
+ allowProvidedInNull: false,
10
+ };
8
11
  exports.default = (0, create_eslint_rule_1.createESLintRule)({
9
12
  name: exports.RULE_NAME,
10
13
  meta: {
@@ -20,6 +23,10 @@ exports.default = (0, create_eslint_rule_1.createESLintRule)({
20
23
  ignoreClassNamePattern: {
21
24
  type: 'string',
22
25
  },
26
+ allowProvidedInNull: {
27
+ type: 'boolean',
28
+ default: DEFAULT_OPTIONS.allowProvidedInNull,
29
+ },
23
30
  },
24
31
  additionalProperties: false,
25
32
  },
@@ -28,16 +35,18 @@ exports.default = (0, create_eslint_rule_1.createESLintRule)({
28
35
  useInjectableProvidedIn: `The \`${METADATA_PROPERTY_NAME}\` property is mandatory for \`Injectables\``,
29
36
  suggestInjector: `Use \`${METADATA_PROPERTY_NAME}: '{{injector}}'\``,
30
37
  },
38
+ defaultOptions: [DEFAULT_OPTIONS],
31
39
  },
32
- defaultOptions: [{}],
33
- create(context, [{ ignoreClassNamePattern }]) {
40
+ create(context, [{ ignoreClassNamePattern, allowProvidedInNull }]) {
34
41
  const injectableClassDecorator = `ClassDeclaration:not([id.name=${ignoreClassNamePattern}]):not(:has(TSClassImplements:matches([expression.property.name='HttpInterceptor'], [expression.name='HttpInterceptor']))) > Decorator[expression.callee.name="Injectable"]`;
35
42
  const providedInMetadataProperty = utils_1.Selectors.metadataProperty(METADATA_PROPERTY_NAME);
36
43
  const withoutProvidedInDecorator = `${injectableClassDecorator}:matches([expression.arguments.length=0], [expression.arguments.0.type='ObjectExpression']:not(:has(${providedInMetadataProperty})))`;
37
- const nullableProvidedInProperty = `${injectableClassDecorator} ${providedInMetadataProperty}:matches([value.type='Identifier'][value.name='undefined'], [value.type='Literal'][value.raw='null'])`;
44
+ const undefinedProvidedInProperty = `${injectableClassDecorator} ${providedInMetadataProperty}[value.type='Identifier'][value.name='undefined']`;
45
+ const nullProvidedInProperty = `${injectableClassDecorator} ${providedInMetadataProperty}[value.type='Literal'][value.raw='null']`;
38
46
  const selectors = [
39
47
  withoutProvidedInDecorator,
40
- nullableProvidedInProperty,
48
+ undefinedProvidedInProperty,
49
+ ...(allowProvidedInNull ? [] : [nullProvidedInProperty]),
41
50
  ].join(',');
42
51
  return {
43
52
  [selectors](node) {
@@ -59,5 +68,5 @@ exports.default = (0, create_eslint_rule_1.createESLintRule)({
59
68
  },
60
69
  });
61
70
  exports.RULE_DOCS_EXTENSION = {
62
- rationale: `Using 'providedIn' in the @Injectable() decorator (like '@Injectable({ providedIn: "root" })') enables tree-shaking, which means Angular can remove the service from your production bundle if it's never actually used. Without 'providedIn', services must be registered in a module's providers array, and Angular must include them in the bundle even if they're unused. This can significantly increase bundle size. Additionally, 'providedIn' makes services easier to use (no need to add them to module providers) and makes circular dependencies less likely. The 'providedIn' syntax is the modern, recommended way to provide services.`,
71
+ rationale: `Using 'providedIn' in the @Injectable() decorator (like '@Injectable({ providedIn: "root" })') enables tree-shaking, which means Angular can remove the service from your production bundle if it's never actually used. Without 'providedIn', services must be registered in a module's providers array, and Angular must include them in the bundle even if they're unused. This can significantly increase bundle size. Additionally, 'providedIn' makes services easier to use (no need to add them to module providers) and makes circular dependencies less likely. The 'providedIn' syntax is the modern, recommended way to provide services. Angular treats 'providedIn: null' as equivalent to omitting the property, so it is flagged by default. Set 'allowProvidedInNull' to true if you need to permit this pattern.`,
63
72
  };
@@ -17,8 +17,8 @@ exports.default = (0, create_eslint_rule_1.createESLintRule)({
17
17
  useLifecycleInterface: `Lifecycle interface '{{interfaceName}}' should be implemented for method '{{methodName}}'. (${STYLE_GUIDE_LINK})`,
18
18
  },
19
19
  fixable: 'code',
20
+ defaultOptions: [],
20
21
  },
21
- defaultOptions: [],
22
22
  create(context) {
23
23
  const angularLifecycleMethodsPattern = (0, utils_1.toPattern)([
24
24
  ...utils_1.ASTUtils.ANGULAR_LIFECYCLE_METHODS,
@@ -18,8 +18,8 @@ exports.default = (0, create_eslint_rule_1.createESLintRule)({
18
18
  messages: {
19
19
  usePipeTransformInterface: `Pipes should implement \`${PIPE_TRANSFORM}\` interface`,
20
20
  },
21
+ defaultOptions: [],
21
22
  },
22
- defaultOptions: [],
23
23
  create(context) {
24
24
  return {
25
25
  [`ClassDeclaration:not(:has(TSClassImplements:matches([expression.name='${PIPE_TRANSFORM}'], [expression.property.name='${PIPE_TRANSFORM}']))) > Decorator[expression.callee.name='Pipe']`]({ parent: classDeclaration, }) {
@@ -1 +1 @@
1
- {"version":3,"file":"create-eslint-rule.d.ts","sourceRoot":"","sources":["../../src/utils/create-eslint-rule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,MAAM,WAAW,QAAQ;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAiCD,eAAO,MAAM,gBAAgB;;CAG5B,CAAC"}
1
+ {"version":3,"file":"create-eslint-rule.d.ts","sourceRoot":"","sources":["../../src/utils/create-eslint-rule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,MAAM,WAAW,QAAQ;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,gBAAgB;;CAG5B,CAAC"}
@@ -2,27 +2,4 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createESLintRule = void 0;
4
4
  const utils_1 = require("@typescript-eslint/utils");
5
- /**
6
- * We need to patch the RuleCreator in order to preserve the defaultOptions
7
- * to use as part of documentation generation.
8
- */
9
- const patchedRuleCreator = (urlCreator) => {
10
- return function createRule({ name, meta, defaultOptions, create }) {
11
- const resolvedDefaultOptions = (defaultOptions ?? []);
12
- return {
13
- name,
14
- meta: Object.assign(Object.assign({}, meta), {
15
- docs: Object.assign(Object.assign({}, meta.docs), {
16
- url: urlCreator(name),
17
- }),
18
- }),
19
- defaultOptions: resolvedDefaultOptions,
20
- create(context) {
21
- const optionsWithDefault = utils_1.ESLintUtils.applyDefault(resolvedDefaultOptions, context.options);
22
- return create(context, optionsWithDefault);
23
- },
24
- };
25
- };
26
- };
27
- patchedRuleCreator.withoutDocs = utils_1.ESLintUtils.RuleCreator.withoutDocs;
28
- exports.createESLintRule = patchedRuleCreator((ruleName) => `https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/${ruleName}.md`);
5
+ exports.createESLintRule = utils_1.ESLintUtils.RuleCreator((ruleName) => `https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/docs/rules/${ruleName}.md`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@depup/angular-eslint__eslint-plugin",
3
- "version": "22.2.0-depup.0",
3
+ "version": "22.3.0-depup.0",
4
4
  "description": "ESLint plugin for Angular applications, following https://angular.dev/style-guide (with updated dependencies)",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
@@ -20,12 +20,12 @@
20
20
  "changes.json"
21
21
  ],
22
22
  "dependencies": {
23
- "ts-api-utils": "^2.5.0",
24
- "@angular-eslint/bundled-angular-compiler": "22.2.0",
25
- "@angular-eslint/utils": "22.2.0"
23
+ "@angular-eslint/bundled-angular-compiler": "22.3.0",
24
+ "@angular-eslint/utils": "22.3.0",
25
+ "ts-api-utils": "^2.5.0"
26
26
  },
27
27
  "devDependencies": {
28
- "@angular-eslint/test-utils": "22.2.0"
28
+ "@angular-eslint/test-utils": "22.3.0"
29
29
  },
30
30
  "peerDependencies": {
31
31
  "@typescript-eslint/utils": "^8.0.0",
@@ -50,8 +50,8 @@
50
50
  },
51
51
  "depsUpdated": 1,
52
52
  "originalPackage": "@angular-eslint/eslint-plugin",
53
- "originalVersion": "22.2.0",
54
- "processedAt": "2026-08-30T16:08:13.663Z",
53
+ "originalVersion": "22.3.0",
54
+ "processedAt": "2026-09-07T08:13:08.078Z",
55
55
  "smokeTest": "passed"
56
56
  }
57
57
  }