@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.
- package/README.md +0 -1
- package/package.json +6 -2
- package/src/index.d.ts +18 -0
- package/src/index.js +12 -0
- package/src/index.js.map +1 -0
- package/src/lib/configs.d.ts +2 -0
- package/src/lib/configs.js +16 -0
- package/src/lib/configs.js.map +1 -0
- package/src/lib/rules/index.d.ts +11 -0
- package/src/lib/rules/index.js +12 -0
- package/src/lib/rules/index.js.map +1 -0
- package/src/lib/rules/no-subscribe-assignment.rule.d.ts +4 -0
- package/src/lib/rules/no-subscribe-assignment.rule.js +132 -0
- package/src/lib/rules/no-subscribe-assignment.rule.js.map +1 -0
- package/src/lib/rules/no-translate-instant.rule.d.ts +4 -0
- package/src/lib/rules/no-translate-instant.rule.js +82 -0
- package/src/lib/rules/no-translate-instant.rule.js.map +1 -0
- package/src/lib/rules/prefer-translate-params.rule.d.ts +4 -0
- package/src/lib/rules/prefer-translate-params.rule.js +128 -0
- package/src/lib/rules/prefer-translate-params.rule.js.map +1 -0
- package/src/lib/types.d.ts +5 -0
- package/src/lib/types.js +3 -0
- package/src/lib/types.js.map +1 -0
- package/src/lib/utils/type-utils.d.ts +2 -0
- package/src/lib/utils/type-utils.js +17 -0
- package/src/lib/utils/type-utils.js.map +1 -0
- package/src/version.d.ts +2 -0
- package/src/version.js +6 -0
- package/src/version.js.map +1 -0
- package/eslint.config.cjs +0 -19
- package/jest.config.ts +0 -10
- package/project.json +0 -28
- package/src/index.ts +0 -11
- package/src/lib/configs.ts +0 -16
- package/src/lib/rules/index.ts +0 -9
- package/src/lib/rules/no-subscribe-assignment.rule.spec.ts +0 -118
- package/src/lib/rules/no-subscribe-assignment.rule.ts +0 -149
- package/src/lib/rules/no-translate-instant.rule.spec.ts +0 -122
- package/src/lib/rules/no-translate-instant.rule.ts +0 -98
- package/src/lib/rules/prefer-translate-params.rule.spec.ts +0 -97
- package/src/lib/rules/prefer-translate-params.rule.ts +0 -133
- package/src/lib/types.ts +0 -6
- package/src/lib/utils/type-utils.ts +0 -15
- package/src/types/rule-tester.d.ts +0 -3
- package/src/version.ts +0 -2
- package/tsconfig.json +0 -23
- package/tsconfig.lib.json +0 -10
- package/tsconfig.rule-tester.json +0 -5
- 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
|
|
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
|
package/src/index.js.map
ADDED
|
@@ -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,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,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,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,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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"}
|
package/src/lib/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../libs/angular-linter-rules/src/lib/types.ts"],"names":[],"mappings":""}
|
|
@@ -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"}
|
package/src/version.d.ts
ADDED
package/src/version.js
ADDED
|
@@ -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
|
-
}
|