@onecx/angular-linter-rules 8.0.0-rc.1 → 8.0.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 (49) hide show
  1. package/README.md +0 -1
  2. package/package.json +6 -2
  3. package/src/index.d.ts +18 -0
  4. package/src/index.js +12 -0
  5. package/src/index.js.map +1 -0
  6. package/src/lib/configs.d.ts +2 -0
  7. package/src/lib/configs.js +16 -0
  8. package/src/lib/configs.js.map +1 -0
  9. package/src/lib/rules/index.d.ts +11 -0
  10. package/src/lib/rules/index.js +12 -0
  11. package/src/lib/rules/index.js.map +1 -0
  12. package/src/lib/rules/no-subscribe-assignment.rule.d.ts +4 -0
  13. package/src/lib/rules/no-subscribe-assignment.rule.js +132 -0
  14. package/src/lib/rules/no-subscribe-assignment.rule.js.map +1 -0
  15. package/src/lib/rules/no-translate-instant.rule.d.ts +4 -0
  16. package/src/lib/rules/no-translate-instant.rule.js +82 -0
  17. package/src/lib/rules/no-translate-instant.rule.js.map +1 -0
  18. package/src/lib/rules/prefer-translate-params.rule.d.ts +4 -0
  19. package/src/lib/rules/prefer-translate-params.rule.js +128 -0
  20. package/src/lib/rules/prefer-translate-params.rule.js.map +1 -0
  21. package/src/lib/types.d.ts +5 -0
  22. package/src/lib/types.js +3 -0
  23. package/src/lib/types.js.map +1 -0
  24. package/src/lib/utils/type-utils.d.ts +2 -0
  25. package/src/lib/utils/type-utils.js +17 -0
  26. package/src/lib/utils/type-utils.js.map +1 -0
  27. package/src/version.d.ts +2 -0
  28. package/src/version.js +6 -0
  29. package/src/version.js.map +1 -0
  30. package/eslint.config.cjs +0 -19
  31. package/jest.config.ts +0 -10
  32. package/project.json +0 -28
  33. package/src/index.ts +0 -11
  34. package/src/lib/configs.ts +0 -16
  35. package/src/lib/rules/index.ts +0 -9
  36. package/src/lib/rules/no-subscribe-assignment.rule.spec.ts +0 -118
  37. package/src/lib/rules/no-subscribe-assignment.rule.ts +0 -149
  38. package/src/lib/rules/no-translate-instant.rule.spec.ts +0 -122
  39. package/src/lib/rules/no-translate-instant.rule.ts +0 -98
  40. package/src/lib/rules/prefer-translate-params.rule.spec.ts +0 -97
  41. package/src/lib/rules/prefer-translate-params.rule.ts +0 -133
  42. package/src/lib/types.ts +0 -6
  43. package/src/lib/utils/type-utils.ts +0 -15
  44. package/src/types/rule-tester.d.ts +0 -3
  45. package/src/version.ts +0 -2
  46. package/tsconfig.json +0 -23
  47. package/tsconfig.lib.json +0 -10
  48. package/tsconfig.rule-tester.json +0 -5
  49. package/tsconfig.spec.json +0 -10
package/README.md CHANGED
@@ -11,7 +11,6 @@ npm install @onecx/angular-linter-rules
11
11
 
12
12
  ## Additional Commands
13
13
  - `npx nx run angular-linter-rules:build` - Builds the library and outputs the result to the `dist` folder.
14
- - `npx nx run angular-linter-rules:build-migrations` - Builds the migration files for the library.
15
14
  - `npx nx run angular-linter-rules:test` - Runs the unit tests for the library.
16
15
  - `npx nx run angular-linter-rules:lint` - Lints the library's codebase.
17
16
  - `npx nx run angular-linter-rules:release` - Releases a new version of the library to npm, following semantic versioning guidelines.
package/package.json CHANGED
@@ -1,13 +1,17 @@
1
1
  {
2
2
  "name": "@onecx/angular-linter-rules",
3
- "version": "8.0.0-rc.1",
3
+ "version": "8.0.0",
4
4
  "type": "commonjs",
5
5
  "main": "./src/index.js",
6
6
  "types": "./src/index.d.ts",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/onecx/onecx-portal-ui-libs"
10
+ },
7
11
  "publishConfig": {
8
12
  "access": "public"
9
13
  },
10
14
  "dependencies": {
11
15
  "tslib": "^2.3.0"
12
16
  }
13
- }
17
+ }
package/src/index.d.ts ADDED
@@ -0,0 +1,18 @@
1
+ import { rules } from './lib/rules';
2
+ import { configs } from './lib/configs';
3
+ export { rules, configs };
4
+ export declare const plugin: {
5
+ rules: {
6
+ readonly 'no-subscribe-assignment': import("@typescript-eslint/utils/dist/ts-eslint").RuleModule<"assignmentOutside", [], unknown, import("@typescript-eslint/utils/dist/ts-eslint").RuleListener> & {
7
+ name: string;
8
+ };
9
+ readonly 'no-translate-instant': import("@typescript-eslint/utils/dist/ts-eslint").RuleModule<"noTranslateInstant", [], unknown, import("@typescript-eslint/utils/dist/ts-eslint").RuleListener> & {
10
+ name: string;
11
+ };
12
+ readonly 'prefer-translate-params': import("@typescript-eslint/utils/dist/ts-eslint").RuleModule<"preferTranslateParams", [], unknown, import("@typescript-eslint/utils/dist/ts-eslint").RuleListener> & {
13
+ name: string;
14
+ };
15
+ };
16
+ configs: Record<string, import("@typescript-eslint/utils/dist/ts-eslint").ClassicConfig.Config>;
17
+ };
18
+ export type { AngularLinterRulesPlugin } from './lib/types';
package/src/index.js ADDED
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.plugin = exports.configs = exports.rules = void 0;
4
+ const rules_1 = require("./lib/rules");
5
+ Object.defineProperty(exports, "rules", { enumerable: true, get: function () { return rules_1.rules; } });
6
+ const configs_1 = require("./lib/configs");
7
+ Object.defineProperty(exports, "configs", { enumerable: true, get: function () { return configs_1.configs; } });
8
+ exports.plugin = {
9
+ rules: rules_1.rules,
10
+ configs: configs_1.configs,
11
+ };
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../libs/angular-linter-rules/src/index.ts"],"names":[],"mappings":";;;AAAA,uCAAmC;AAG1B,sFAHA,aAAK,OAGA;AAFd,2CAAuC;AAEvB,wFAFP,iBAAO,OAEO;AAEV,QAAA,MAAM,GAAG;IACpB,KAAK,EAAL,aAAK;IACL,OAAO,EAAP,iBAAO;CACR,CAAA"}
@@ -0,0 +1,2 @@
1
+ import type { TSESLint } from '@typescript-eslint/utils';
2
+ export declare const configs: Record<string, TSESLint.Linter.Config>;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.configs = void 0;
4
+ const rules_1 = require("./rules");
5
+ const pluginName = '@onecx/angular-linter-rules';
6
+ const recommendedRules = Object.keys(rules_1.rules).reduce((acc, ruleName) => {
7
+ acc[`${pluginName}/${ruleName}`] = 'warn';
8
+ return acc;
9
+ }, {});
10
+ exports.configs = {
11
+ recommended: {
12
+ plugins: [pluginName],
13
+ rules: recommendedRules,
14
+ },
15
+ };
16
+ //# sourceMappingURL=configs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configs.js","sourceRoot":"","sources":["../../../../../libs/angular-linter-rules/src/lib/configs.ts"],"names":[],"mappings":";;;AACA,mCAA+B;AAE/B,MAAM,UAAU,GAAG,6BAA6B,CAAA;AAEhD,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,aAAK,CAAC,CAAC,MAAM,CAA4C,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE;IAC9G,GAAG,CAAC,GAAG,UAAU,IAAI,QAAQ,EAAE,CAAC,GAAG,MAAM,CAAA;IACzC,OAAO,GAAG,CAAA;AACZ,CAAC,EAAE,EAAE,CAAC,CAAA;AAEO,QAAA,OAAO,GAA2C;IAC7D,WAAW,EAAE;QACX,OAAO,EAAE,CAAC,UAAU,CAAC;QACrB,KAAK,EAAE,gBAAgB;KACxB;CACF,CAAA"}
@@ -0,0 +1,11 @@
1
+ export declare const rules: {
2
+ readonly 'no-subscribe-assignment': import("@typescript-eslint/utils/dist/ts-eslint").RuleModule<"assignmentOutside", [], unknown, import("@typescript-eslint/utils/dist/ts-eslint").RuleListener> & {
3
+ name: string;
4
+ };
5
+ readonly 'no-translate-instant': import("@typescript-eslint/utils/dist/ts-eslint").RuleModule<"noTranslateInstant", [], unknown, import("@typescript-eslint/utils/dist/ts-eslint").RuleListener> & {
6
+ name: string;
7
+ };
8
+ readonly 'prefer-translate-params': import("@typescript-eslint/utils/dist/ts-eslint").RuleModule<"preferTranslateParams", [], unknown, import("@typescript-eslint/utils/dist/ts-eslint").RuleListener> & {
9
+ name: string;
10
+ };
11
+ };
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.rules = void 0;
4
+ const no_subscribe_assignment_rule_1 = require("./no-subscribe-assignment.rule");
5
+ const no_translate_instant_rule_1 = require("./no-translate-instant.rule");
6
+ const prefer_translate_params_rule_1 = require("./prefer-translate-params.rule");
7
+ exports.rules = {
8
+ 'no-subscribe-assignment': no_subscribe_assignment_rule_1.noSubscribeAssignment,
9
+ 'no-translate-instant': no_translate_instant_rule_1.noTranslateInstant,
10
+ 'prefer-translate-params': prefer_translate_params_rule_1.preferTranslateParams,
11
+ };
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../libs/angular-linter-rules/src/lib/rules/index.ts"],"names":[],"mappings":";;;AAAA,iFAAsE;AACtE,2EAAgE;AAChE,iFAAsE;AAEzD,QAAA,KAAK,GAAG;IACnB,yBAAyB,EAAE,oDAAqB;IAChD,sBAAsB,EAAE,8CAAkB;IAC1C,yBAAyB,EAAE,oDAAqB;CACxC,CAAA"}
@@ -0,0 +1,4 @@
1
+ import { ESLintUtils } from '@typescript-eslint/utils';
2
+ export declare const noSubscribeAssignment: ESLintUtils.RuleModule<"assignmentOutside", [], unknown, ESLintUtils.RuleListener> & {
3
+ name: string;
4
+ };
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.noSubscribeAssignment = void 0;
4
+ const utils_1 = require("@typescript-eslint/utils");
5
+ const createRule = utils_1.ESLintUtils.RuleCreator((name) => `https://github.com/onecx/onecx-portal-ui-libs/tree/main/libs/angular-linter-rules#${name}`);
6
+ function isSubscribeCall(node) {
7
+ return node.callee.type === utils_1.AST_NODE_TYPES.MemberExpression &&
8
+ node.callee.property.type === utils_1.AST_NODE_TYPES.Identifier &&
9
+ node.callee.property.name === 'subscribe';
10
+ }
11
+ function getFunctionArg(node) {
12
+ for (const arg of node.arguments) {
13
+ if (arg.type === utils_1.AST_NODE_TYPES.ArrowFunctionExpression || arg.type === utils_1.AST_NODE_TYPES.FunctionExpression) {
14
+ return arg;
15
+ }
16
+ }
17
+ return undefined;
18
+ }
19
+ function getAssignedIdentifiers(pattern) {
20
+ switch (pattern.type) {
21
+ case utils_1.AST_NODE_TYPES.Identifier:
22
+ return [pattern];
23
+ case utils_1.AST_NODE_TYPES.ArrayPattern:
24
+ return pattern.elements.flatMap((el) => (el ? getAssignedIdentifiers(el) : []));
25
+ case utils_1.AST_NODE_TYPES.ObjectPattern:
26
+ return pattern.properties.flatMap((p) => {
27
+ if (p.type === utils_1.AST_NODE_TYPES.Property)
28
+ return getAssignedIdentifiers(p.value);
29
+ if (p.type === utils_1.AST_NODE_TYPES.RestElement)
30
+ return getAssignedIdentifiers(p.argument);
31
+ return [];
32
+ });
33
+ case utils_1.AST_NODE_TYPES.RestElement:
34
+ return getAssignedIdentifiers(pattern.argument);
35
+ case utils_1.AST_NODE_TYPES.AssignmentPattern:
36
+ return getAssignedIdentifiers(pattern.left);
37
+ }
38
+ }
39
+ function getDeclaredVariablesInFunctionBody(body) {
40
+ const names = new Set();
41
+ if (body.type !== utils_1.AST_NODE_TYPES.BlockStatement)
42
+ return names;
43
+ for (const stmt of body.body) {
44
+ if (stmt.type !== utils_1.AST_NODE_TYPES.VariableDeclaration)
45
+ continue;
46
+ for (const decl of stmt.declarations) {
47
+ for (const id of getAssignedIdentifiers(decl.id)) {
48
+ names.add(id.name);
49
+ }
50
+ }
51
+ }
52
+ return names;
53
+ }
54
+ exports.noSubscribeAssignment = createRule({
55
+ name: 'no-subscribe-assignment',
56
+ meta: {
57
+ type: 'problem',
58
+ docs: {
59
+ description: 'Warn when assigning inside an Observable subscribe callback to variables declared outside the callback (including class members).',
60
+ },
61
+ schema: [],
62
+ messages: {
63
+ assignmentOutside: 'Avoid assigning to outer-scope variables inside `subscribe`. Prefer `map/tap` + `async` pipe or return the value.',
64
+ },
65
+ },
66
+ defaultOptions: [],
67
+ create(context) {
68
+ return {
69
+ CallExpression(node) {
70
+ if (!isSubscribeCall(node))
71
+ return;
72
+ const callback = getFunctionArg(node);
73
+ if (!callback)
74
+ return;
75
+ const callbackBody = callback.body;
76
+ const localDeclarations = getDeclaredVariablesInFunctionBody(callbackBody);
77
+ const reportIfOuter = (identifier) => {
78
+ if (localDeclarations.has(identifier.name))
79
+ return;
80
+ context.report({
81
+ node: identifier,
82
+ messageId: 'assignmentOutside',
83
+ });
84
+ };
85
+ const sourceCode = context.sourceCode;
86
+ const visitor = (n) => {
87
+ if (n.type === utils_1.AST_NODE_TYPES.AssignmentExpression) {
88
+ if (n.left.type === utils_1.AST_NODE_TYPES.MemberExpression) {
89
+ if (n.left.object.type === utils_1.AST_NODE_TYPES.ThisExpression) {
90
+ context.report({ node: n.left, messageId: 'assignmentOutside' });
91
+ }
92
+ return;
93
+ }
94
+ if (n.left.type === utils_1.AST_NODE_TYPES.Identifier) {
95
+ reportIfOuter(n.left);
96
+ return;
97
+ }
98
+ if (n.left.type === utils_1.AST_NODE_TYPES.ObjectPattern || n.left.type === utils_1.AST_NODE_TYPES.ArrayPattern) {
99
+ for (const id of getAssignedIdentifiers(n.left)) {
100
+ reportIfOuter(id);
101
+ }
102
+ }
103
+ return;
104
+ }
105
+ if (n.type === utils_1.AST_NODE_TYPES.UpdateExpression) {
106
+ if (n.argument.type === utils_1.AST_NODE_TYPES.Identifier) {
107
+ reportIfOuter(n.argument);
108
+ }
109
+ if (n.argument.type === utils_1.AST_NODE_TYPES.MemberExpression && n.argument.object.type === utils_1.AST_NODE_TYPES.ThisExpression) {
110
+ context.report({ node: n.argument, messageId: 'assignmentOutside' });
111
+ }
112
+ return;
113
+ }
114
+ for (const child of sourceCode.visitorKeys[n.type] ?? []) {
115
+ const val = n[child];
116
+ if (Array.isArray(val)) {
117
+ for (const item of val) {
118
+ if (item && typeof item.type === 'string')
119
+ visitor(item);
120
+ }
121
+ }
122
+ else if (val && typeof val.type === 'string') {
123
+ visitor(val);
124
+ }
125
+ }
126
+ };
127
+ visitor(callbackBody);
128
+ },
129
+ };
130
+ },
131
+ });
132
+ //# sourceMappingURL=no-subscribe-assignment.rule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-subscribe-assignment.rule.js","sourceRoot":"","sources":["../../../../../../libs/angular-linter-rules/src/lib/rules/no-subscribe-assignment.rule.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { ESLintUtils } from '@typescript-eslint/utils';
2
+ export declare const noTranslateInstant: ESLintUtils.RuleModule<"noTranslateInstant", [], unknown, ESLintUtils.RuleListener> & {
3
+ name: string;
4
+ };
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.noTranslateInstant = void 0;
4
+ const utils_1 = require("@typescript-eslint/utils");
5
+ const type_utils_1 = require("../utils/type-utils");
6
+ const createRule = utils_1.ESLintUtils.RuleCreator((name) => `https://github.com/onecx/onecx-portal-ui-libs/tree/main/libs/angular-linter-rules#${name}`);
7
+ const defaultAllowedFilePatterns = [/\.spec\.ts$/i, /\.test\.ts$/i, /\/testing\//i, /\/mocks\//i];
8
+ function isAllowedTestFile(filename) {
9
+ if (!filename || filename === '<input>' || filename === '<text>')
10
+ return false;
11
+ return defaultAllowedFilePatterns.some((re) => re.test(filename));
12
+ }
13
+ function isInstantMemberCall(node) {
14
+ if (node.callee.type !== utils_1.AST_NODE_TYPES.MemberExpression)
15
+ return false;
16
+ const property = node.callee.property;
17
+ if (property.type !== utils_1.AST_NODE_TYPES.Identifier || property.name !== 'instant')
18
+ return false;
19
+ const obj = node.callee.object;
20
+ if (obj.type === utils_1.AST_NODE_TYPES.Identifier) {
21
+ return obj.name === 'translate' || obj.name === 'translateService';
22
+ }
23
+ if (obj.type === utils_1.AST_NODE_TYPES.MemberExpression) {
24
+ if (obj.object.type !== utils_1.AST_NODE_TYPES.ThisExpression)
25
+ return false;
26
+ if (obj.property.type !== utils_1.AST_NODE_TYPES.Identifier)
27
+ return false;
28
+ return obj.property.name === 'translate' || obj.property.name === 'translateService';
29
+ }
30
+ return false;
31
+ }
32
+ function isTranslateServiceReceiver(context, node) {
33
+ if (node.callee.type !== utils_1.AST_NODE_TYPES.MemberExpression)
34
+ return false;
35
+ if (!context.sourceCode.parserServices?.program)
36
+ return false;
37
+ const { esTreeNodeToTSNodeMap, program } = context.sourceCode.parserServices;
38
+ if (!esTreeNodeToTSNodeMap)
39
+ return false;
40
+ const checker = program.getTypeChecker();
41
+ const receiverTsNode = esTreeNodeToTSNodeMap.get(node.callee.object);
42
+ const receiverType = checker.getTypeAtLocation(receiverTsNode);
43
+ if ((0, type_utils_1.isTranslateServiceType)(checker, receiverType))
44
+ return true;
45
+ const receiverTypeText = checker.typeToString(receiverType);
46
+ return receiverTypeText === 'TranslateService';
47
+ }
48
+ exports.noTranslateInstant = createRule({
49
+ name: 'no-translate-instant',
50
+ meta: {
51
+ type: 'problem',
52
+ docs: {
53
+ description: 'Disallow ngx-translate TranslateService.instant outside of tests.',
54
+ },
55
+ schema: [],
56
+ messages: {
57
+ noTranslateInstant: 'Avoid `TranslateService.instant(...)` in production code. Use stream-based translation (`get`/`stream`) or the translate pipe instead.',
58
+ },
59
+ },
60
+ defaultOptions: [],
61
+ create(context) {
62
+ const filename = context.filename;
63
+ const allowed = isAllowedTestFile(filename);
64
+ return {
65
+ CallExpression(node) {
66
+ if (allowed)
67
+ return;
68
+ if (isTranslateServiceReceiver(context, node)) {
69
+ context.report({ node: node.callee, messageId: 'noTranslateInstant' });
70
+ return;
71
+ }
72
+ if (!isInstantMemberCall(node))
73
+ return;
74
+ context.report({
75
+ node: node.callee,
76
+ messageId: 'noTranslateInstant',
77
+ });
78
+ },
79
+ };
80
+ },
81
+ });
82
+ //# sourceMappingURL=no-translate-instant.rule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-translate-instant.rule.js","sourceRoot":"","sources":["../../../../../../libs/angular-linter-rules/src/lib/rules/no-translate-instant.rule.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { ESLintUtils } from '@typescript-eslint/utils';
2
+ export declare const preferTranslateParams: ESLintUtils.RuleModule<"preferTranslateParams", [], unknown, ESLintUtils.RuleListener> & {
3
+ name: string;
4
+ };
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.preferTranslateParams = void 0;
4
+ const utils_1 = require("@typescript-eslint/utils");
5
+ const createRule = utils_1.ESLintUtils.RuleCreator((name) => `https://github.com/onecx/onecx-portal-ui-libs/tree/main/libs/angular-linter-rules#${name}`);
6
+ const defaultAllowedFilePatterns = [/\.spec\.ts$/i, /\.test\.ts$/i, /\/testing\//i, /\/mocks\//i];
7
+ function isAllowedTestFile(filename) {
8
+ if (!filename || filename === '<input>' || filename === '<text>')
9
+ return false;
10
+ return defaultAllowedFilePatterns.some((re) => re.test(filename));
11
+ }
12
+ function isTranslateGetOrStreamCallExpression(node) {
13
+ if (node.type !== utils_1.AST_NODE_TYPES.CallExpression)
14
+ return false;
15
+ if (node.callee.type !== utils_1.AST_NODE_TYPES.MemberExpression)
16
+ return false;
17
+ if (node.callee.property.type !== utils_1.AST_NODE_TYPES.Identifier)
18
+ return false;
19
+ return node.callee.property.name === 'get' || node.callee.property.name === 'stream';
20
+ }
21
+ function isTranslateInstantCallExpression(node) {
22
+ if (node.type !== utils_1.AST_NODE_TYPES.CallExpression)
23
+ return false;
24
+ if (node.callee.type !== utils_1.AST_NODE_TYPES.MemberExpression)
25
+ return false;
26
+ if (node.callee.property.type !== utils_1.AST_NODE_TYPES.Identifier)
27
+ return false;
28
+ return node.callee.property.name === 'instant';
29
+ }
30
+ function isTranslateGetOrStreamPipeCallExpression(node) {
31
+ if (node.type !== utils_1.AST_NODE_TYPES.CallExpression)
32
+ return false;
33
+ if (node.callee.type !== utils_1.AST_NODE_TYPES.MemberExpression)
34
+ return false;
35
+ if (node.callee.property.type !== utils_1.AST_NODE_TYPES.Identifier)
36
+ return false;
37
+ if (node.callee.property.name !== 'pipe')
38
+ return false;
39
+ const obj = node.callee.object;
40
+ return isTranslateGetOrStreamCallExpression(obj);
41
+ }
42
+ function containsBinaryPlus(context, node) {
43
+ let found = false;
44
+ const visit = (n) => {
45
+ if (found)
46
+ return;
47
+ if (n.type === utils_1.AST_NODE_TYPES.BinaryExpression && n.operator === '+') {
48
+ found = true;
49
+ return;
50
+ }
51
+ const keys = context.sourceCode.visitorKeys[n.type] ?? [];
52
+ for (const key of keys) {
53
+ const value = n[key];
54
+ if (!value)
55
+ continue;
56
+ if (Array.isArray(value)) {
57
+ for (const child of value) {
58
+ if (found)
59
+ return;
60
+ if (child && typeof child === 'object' && 'type' in child) {
61
+ visit(child);
62
+ }
63
+ }
64
+ continue;
65
+ }
66
+ if (value && typeof value === 'object' && 'type' in value) {
67
+ visit(value);
68
+ }
69
+ }
70
+ };
71
+ visit(node);
72
+ return found;
73
+ }
74
+ function isTranslatePipeExpression(node) {
75
+ if (node.type !== utils_1.AST_NODE_TYPES.BinaryExpression || node.operator !== '|')
76
+ return false;
77
+ const right = node.right;
78
+ return right.type === utils_1.AST_NODE_TYPES.Identifier && right.name === 'translate';
79
+ }
80
+ exports.preferTranslateParams = createRule({
81
+ name: 'prefer-translate-params',
82
+ meta: {
83
+ type: 'suggestion',
84
+ docs: {
85
+ description: 'Prefer translation parameters instead of concatenating translated strings (use e.g. `translate.get(key, { param })`).',
86
+ },
87
+ schema: [],
88
+ messages: {
89
+ preferTranslateParams: 'Avoid concatenating translated strings. Prefer translation parameters/placeholders instead (e.g. `translate.get(key, { value })`).',
90
+ },
91
+ },
92
+ defaultOptions: [],
93
+ create(context) {
94
+ const filename = context.filename;
95
+ const allowed = isAllowedTestFile(filename);
96
+ if (allowed) {
97
+ return {};
98
+ }
99
+ return {
100
+ BinaryExpression(node) {
101
+ if (node.operator !== '+')
102
+ return;
103
+ if (isTranslateGetOrStreamCallExpression(node.left) ||
104
+ isTranslateGetOrStreamCallExpression(node.right) ||
105
+ isTranslateInstantCallExpression(node.left) ||
106
+ isTranslateInstantCallExpression(node.right) ||
107
+ isTranslatePipeExpression(node.left) ||
108
+ isTranslatePipeExpression(node.right)) {
109
+ context.report({ node, messageId: 'preferTranslateParams' });
110
+ }
111
+ },
112
+ TemplateLiteral(node) {
113
+ if (!node.expressions.some((expr) => isTranslateGetOrStreamCallExpression(expr) || isTranslateInstantCallExpression(expr))) {
114
+ return;
115
+ }
116
+ context.report({ node, messageId: 'preferTranslateParams' });
117
+ },
118
+ CallExpression(node) {
119
+ if (!isTranslateGetOrStreamPipeCallExpression(node))
120
+ return;
121
+ if (!containsBinaryPlus(context, node))
122
+ return;
123
+ context.report({ node, messageId: 'preferTranslateParams' });
124
+ },
125
+ };
126
+ },
127
+ });
128
+ //# sourceMappingURL=prefer-translate-params.rule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefer-translate-params.rule.js","sourceRoot":"","sources":["../../../../../../libs/angular-linter-rules/src/lib/rules/prefer-translate-params.rule.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { TSESLint } from '@typescript-eslint/utils';
2
+ export type AngularLinterRulesPlugin = {
3
+ rules: Record<string, TSESLint.RuleModule<string, readonly unknown[]>>;
4
+ configs: Record<string, TSESLint.Linter.Config>;
5
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../libs/angular-linter-rules/src/lib/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import type ts from 'typescript';
2
+ export declare function isTranslateServiceType(typeChecker: ts.TypeChecker, type: ts.Type): boolean;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isTranslateServiceType = isTranslateServiceType;
4
+ function isTranslateServiceType(typeChecker, type) {
5
+ const symbol = type.getSymbol() ?? type.aliasSymbol;
6
+ if (!symbol)
7
+ return false;
8
+ const name = symbol.getName();
9
+ if (name !== 'TranslateService')
10
+ return false;
11
+ const declarations = symbol.getDeclarations() ?? [];
12
+ return declarations.some((decl) => {
13
+ const sourceFileName = decl.getSourceFile().fileName;
14
+ return sourceFileName.includes('/@ngx-translate/core/') || sourceFileName.includes('\\@ngx-translate\\core\\');
15
+ });
16
+ }
17
+ //# sourceMappingURL=type-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-utils.js","sourceRoot":"","sources":["../../../../../../libs/angular-linter-rules/src/lib/utils/type-utils.ts"],"names":[],"mappings":";;AAEA,wDAYC;AAZD,SAAgB,sBAAsB,CAAC,WAA2B,EAAE,IAAa;IAC/E,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,WAAW,CAAA;IACnD,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IAEzB,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAA;IAC7B,IAAI,IAAI,KAAK,kBAAkB;QAAE,OAAO,KAAK,CAAA;IAE7C,MAAM,YAAY,GAAG,MAAM,CAAC,eAAe,EAAE,IAAI,EAAE,CAAA;IACnD,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QAChC,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,QAAQ,CAAA;QACpD,OAAO,cAAc,CAAC,QAAQ,CAAC,uBAAuB,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,0BAA0B,CAAC,CAAA;IAChH,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const LIB_NAME = "@onecx/angular-linter-rules";
2
+ export declare const LIB_VERSION = "8.0.0";
package/src/version.js ADDED
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LIB_VERSION = exports.LIB_NAME = void 0;
4
+ exports.LIB_NAME = '@onecx/angular-linter-rules';
5
+ exports.LIB_VERSION = '8.0.0';
6
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../../../libs/angular-linter-rules/src/version.ts"],"names":[],"mappings":";;;AAAa,QAAA,QAAQ,GAAG,6BAA6B,CAAA;AACxC,QAAA,WAAW,GAAG,OAAO,CAAA"}
package/eslint.config.cjs DELETED
@@ -1,19 +0,0 @@
1
- const baseConfig = require('../.eslintrc.json')
2
-
3
- module.exports = [
4
- ...baseConfig,
5
- {
6
- files: ['**/*.json'],
7
- rules: {
8
- '@nx/dependency-checks': [
9
- 'error',
10
- {
11
- ignoredFiles: ['{projectRoot}/eslint.config.{js,cjs,mjs,ts,cts,mts}'],
12
- },
13
- ],
14
- },
15
- languageOptions: {
16
- parser: require('jsonc-eslint-parser'),
17
- },
18
- },
19
- ]
package/jest.config.ts DELETED
@@ -1,10 +0,0 @@
1
- export default {
2
- displayName: 'angular-linter-rules',
3
- preset: '../../jest.preset.js',
4
- testEnvironment: 'node',
5
- transform: {
6
- '^.+\\.[tj]s$': ['ts-jest', { tsconfig: '<rootDir>/tsconfig.spec.json' }],
7
- },
8
- moduleFileExtensions: ['ts', 'js', 'html'],
9
- coverageDirectory: '../../coverage/libs/angular-linter-rules',
10
- }
package/project.json DELETED
@@ -1,28 +0,0 @@
1
- {
2
- "name": "angular-linter-rules",
3
- "$schema": "../../node_modules/nx/schemas/project-schema.json",
4
- "sourceRoot": "libs/angular-linter-rules/src",
5
- "projectType": "library",
6
- "tags": [],
7
- "targets": {
8
- "build": {
9
- "executor": "@nx/js:tsc",
10
- "outputs": ["{options.outputPath}"],
11
- "options": {
12
- "outputPath": "dist/libs/angular-linter-rules",
13
- "main": "libs/angular-linter-rules/src/index.ts",
14
- "tsConfig": "libs/angular-linter-rules/tsconfig.lib.json",
15
- "assets": ["libs/angular-linter-rules/*.md"]
16
- }
17
- },
18
- "test": {
19
- "executor": "@nx/jest:jest",
20
- "outputs": ["{workspaceRoot}/coverage/{projectRoot}"],
21
- "options": {
22
- "jestConfig": "libs/angular-linter-rules/jest.config.ts",
23
- "codeCoverage": true,
24
- "passWithNoTests": true
25
- }
26
- }
27
- }
28
- }