@taiga-ui/eslint-plugin-experience-next 0.449.0 → 0.451.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 +45 -0
- package/index.d.ts +8 -5
- package/index.esm.js +175 -59
- package/package.json +1 -1
- package/rules/injection-token-description.d.ts +1 -1
- package/rules/no-deep-imports-to-indexed-packages.d.ts +1 -1
- package/rules/no-deep-imports.d.ts +2 -2
- package/rules/no-implicit-public.d.ts +1 -1
- package/rules/no-string-literal-concat.d.ts +6 -0
package/README.md
CHANGED
|
@@ -49,6 +49,7 @@ export default [
|
|
|
49
49
|
| no-href-with-router-link | Do not use href and routerLink attributes together on the same element | | 🔧 | |
|
|
50
50
|
| no-implicit-public | Require explicit `public` modifier for class members and parameter properties | ✅ | 🔧 | |
|
|
51
51
|
| no-playwright-empty-fill | Enforce `clear()` over `fill('')` in Playwright tests | ✅ | 🔧 | |
|
|
52
|
+
| no-string-literal-concat | Disallow string literal concatenation; merge adjacent literals into one | ✅ | 🔧 | |
|
|
52
53
|
| object-single-line | Enforce single-line formatting for single-property objects when it fits `printWidth` | ✅ | 🔧 | |
|
|
53
54
|
| prefer-deep-imports | Allow deep imports of Taiga UI packages | | 🔧 | |
|
|
54
55
|
| prefer-multi-arg-push | Combine consecutive `.push()` calls on the same array into a single multi-argument call | ✅ | 🔧 | |
|
|
@@ -283,6 +284,50 @@ await page.getByLabel('Name').clear();
|
|
|
283
284
|
|
|
284
285
|
---
|
|
285
286
|
|
|
287
|
+
## no-string-literal-concat
|
|
288
|
+
|
|
289
|
+
Disallows concatenating string literals with `+`. Adjacent string literals are always mergeable into one — splitting
|
|
290
|
+
them with `+` adds noise without benefit, and multi-line splits are especially easy to miss.
|
|
291
|
+
|
|
292
|
+
Replaces the built-in `no-useless-concat` rule, which only catches same-line concatenation.
|
|
293
|
+
|
|
294
|
+
```ts
|
|
295
|
+
// ❌ error
|
|
296
|
+
const msg = 'Hello, ' + 'world!';
|
|
297
|
+
|
|
298
|
+
// ✅ after autofix
|
|
299
|
+
const msg = 'Hello, world!';
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
```ts
|
|
303
|
+
// ❌ error — also caught across lines
|
|
304
|
+
it(
|
|
305
|
+
'returns the last day of month when' +
|
|
306
|
+
' the result month has fewer days',
|
|
307
|
+
() => { ... },
|
|
308
|
+
);
|
|
309
|
+
|
|
310
|
+
// ✅ after autofix
|
|
311
|
+
it('returns the last day of month when the result month has fewer days', () => {
|
|
312
|
+
...
|
|
313
|
+
});
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
```ts
|
|
317
|
+
// ❌ error — string variables concatenated with +
|
|
318
|
+
const a = 'hello';
|
|
319
|
+
const b = 'world';
|
|
320
|
+
const c = a + b;
|
|
321
|
+
|
|
322
|
+
// ✅ after autofix
|
|
323
|
+
const c = `${a}${b}`;
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
> For mixed concatenation (`'prefix' + variable`) use the standard `prefer-template` rule, which is already enabled in
|
|
327
|
+
> `recommended`. Template literals (`` `foo` + `bar` ``) are not flagged by this rule.
|
|
328
|
+
|
|
329
|
+
---
|
|
330
|
+
|
|
286
331
|
## object-single-line
|
|
287
332
|
|
|
288
333
|
Single-property object literals that fit within `printWidth` characters on one line are collapsed to a single line.
|
package/index.d.ts
CHANGED
|
@@ -18,28 +18,31 @@ declare const plugin: {
|
|
|
18
18
|
'flat-exports': import("@typescript-eslint/utils/ts-eslint").RuleModule<"spreadArrays", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
|
|
19
19
|
name: string;
|
|
20
20
|
};
|
|
21
|
-
'injection-token-description': import("@typescript-eslint/utils/ts-eslint").RuleModule<"invalid-injection-token-description", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
|
|
21
|
+
'injection-token-description': import("@typescript-eslint/utils/ts-eslint").RuleModule<"invalid-injection-token-description", readonly unknown[], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
|
|
22
22
|
name: string;
|
|
23
23
|
};
|
|
24
|
-
'no-deep-imports': import("@typescript-eslint/utils/ts-eslint").RuleModule<"no-deep-imports",
|
|
24
|
+
'no-deep-imports': import("@typescript-eslint/utils/ts-eslint").RuleModule<"no-deep-imports", {
|
|
25
25
|
currentProject: string;
|
|
26
26
|
deepImport: string;
|
|
27
27
|
ignoreImports: string[];
|
|
28
28
|
importDeclaration: string;
|
|
29
29
|
projectName: string;
|
|
30
|
-
}], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
|
|
30
|
+
}[], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
|
|
31
31
|
name: string;
|
|
32
32
|
};
|
|
33
|
-
'no-deep-imports-to-indexed-packages': import("@typescript-eslint/utils/ts-eslint").RuleModule<"deepImport", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
|
|
33
|
+
'no-deep-imports-to-indexed-packages': import("@typescript-eslint/utils/ts-eslint").RuleModule<"deepImport", readonly unknown[], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
|
|
34
34
|
name: string;
|
|
35
35
|
};
|
|
36
36
|
'no-href-with-router-link': import("eslint").Rule.RuleModule;
|
|
37
|
-
'no-implicit-public': import("@typescript-eslint/utils/ts-eslint").RuleModule<"implicitPublic", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
|
|
37
|
+
'no-implicit-public': import("@typescript-eslint/utils/ts-eslint").RuleModule<"implicitPublic", readonly unknown[], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
|
|
38
38
|
name: string;
|
|
39
39
|
};
|
|
40
40
|
'no-playwright-empty-fill': import("@typescript-eslint/utils/ts-eslint").RuleModule<"useClear", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
|
|
41
41
|
name: string;
|
|
42
42
|
};
|
|
43
|
+
'no-string-literal-concat': import("@typescript-eslint/utils/ts-eslint").RuleModule<"mergeLiterals" | "useTemplate", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
|
|
44
|
+
name: string;
|
|
45
|
+
};
|
|
43
46
|
'object-single-line': import("@typescript-eslint/utils/ts-eslint").RuleModule<"oneLine", [{
|
|
44
47
|
printWidth: number;
|
|
45
48
|
}], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
|
package/index.esm.js
CHANGED
|
@@ -87,23 +87,25 @@ var htmlEslint = defineConfig([
|
|
|
87
87
|
String.raw `\[style\.border-top(\.[a-z]+)?\]`,
|
|
88
88
|
String.raw `\[style\.border-bottom(\.[a-z]+)?\]`,
|
|
89
89
|
],
|
|
90
|
-
message:
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
90
|
+
message: `
|
|
91
|
+
Use logical CSS properties instead of directional properties. Replace:
|
|
92
|
+
• left → inset-inline-start
|
|
93
|
+
• right → inset-inline-end
|
|
94
|
+
• top → inset-block-start
|
|
95
|
+
• bottom → inset-block-end
|
|
96
|
+
• margin-left → margin-inline-start
|
|
97
|
+
• margin-right → margin-inline-end
|
|
98
|
+
• margin-top → margin-block-start
|
|
99
|
+
• margin-bottom → margin-block-end
|
|
100
|
+
• padding-left → padding-inline-start
|
|
101
|
+
• padding-right → padding-inline-end
|
|
102
|
+
• padding-top → padding-block-start
|
|
103
|
+
• padding-bottom → padding-block-end
|
|
104
|
+
• border-left → border-inline-start
|
|
105
|
+
• border-right → border-inline-end
|
|
106
|
+
• border-top → border-block-start
|
|
107
|
+
• border-bottom → border-block-end
|
|
108
|
+
`,
|
|
107
109
|
tagPatterns: ['.*'],
|
|
108
110
|
},
|
|
109
111
|
],
|
|
@@ -346,6 +348,7 @@ var recommended = defineConfig([
|
|
|
346
348
|
],
|
|
347
349
|
'@stylistic/quotes': ['error', 'single', { avoidEscape: true }],
|
|
348
350
|
'@stylistic/type-annotation-spacing': 'error',
|
|
351
|
+
'@taiga-ui/experience-next/no-string-literal-concat': 'error',
|
|
349
352
|
'@typescript-eslint/adjacent-overload-signatures': 'off',
|
|
350
353
|
'@typescript-eslint/array-type': [
|
|
351
354
|
'error',
|
|
@@ -706,7 +709,6 @@ var recommended = defineConfig([
|
|
|
706
709
|
],
|
|
707
710
|
'no-return-assign': ['error', 'always'],
|
|
708
711
|
'no-unneeded-ternary': 'error',
|
|
709
|
-
'no-useless-concat': 'error',
|
|
710
712
|
'no-useless-escape': 'error',
|
|
711
713
|
'no-useless-rename': [
|
|
712
714
|
'error',
|
|
@@ -777,6 +779,7 @@ var recommended = defineConfig([
|
|
|
777
779
|
'sonarjs/no-identical-functions': 'error',
|
|
778
780
|
'sonarjs/no-inverted-boolean-check': 'error',
|
|
779
781
|
'spaced-comment': ['error', 'always', { markers: ['/'] }],
|
|
782
|
+
'template-curly-spacing': ['error', 'never'],
|
|
780
783
|
'unicorn/consistent-empty-array-spread': 'error',
|
|
781
784
|
'unicorn/escape-case': 'error',
|
|
782
785
|
'unicorn/filename-case': ['error', { case: 'kebabCase' }],
|
|
@@ -907,6 +910,7 @@ var recommended = defineConfig([
|
|
|
907
910
|
'error',
|
|
908
911
|
{ decorators: ['Component', 'Directive', 'NgModule', 'Pipe'] },
|
|
909
912
|
],
|
|
913
|
+
'no-multi-str': 'error',
|
|
910
914
|
'rxjs/no-compat': 'error',
|
|
911
915
|
'rxjs/no-connectable': 'error',
|
|
912
916
|
'rxjs/no-cyclic-action': 'error',
|
|
@@ -1313,8 +1317,8 @@ function intersect(a, b) {
|
|
|
1313
1317
|
return a.some((type) => origin.has(type));
|
|
1314
1318
|
}
|
|
1315
1319
|
|
|
1316
|
-
const createRule$
|
|
1317
|
-
var classPropertyNaming = createRule$
|
|
1320
|
+
const createRule$d = ESLintUtils.RuleCreator((name) => name);
|
|
1321
|
+
var classPropertyNaming = createRule$d({
|
|
1318
1322
|
create(context, [configs]) {
|
|
1319
1323
|
const parserServices = ESLintUtils.getParserServices(context);
|
|
1320
1324
|
const typeChecker = parserServices.program.getTypeChecker();
|
|
@@ -1347,8 +1351,8 @@ var classPropertyNaming = createRule$c({
|
|
|
1347
1351
|
},
|
|
1348
1352
|
};
|
|
1349
1353
|
},
|
|
1350
|
-
defaultOptions: [[]],
|
|
1351
1354
|
meta: {
|
|
1355
|
+
defaultOptions: [[]],
|
|
1352
1356
|
docs: {
|
|
1353
1357
|
description: 'Enforce custom naming for class properties based on their type.',
|
|
1354
1358
|
},
|
|
@@ -1483,9 +1487,9 @@ function isExternalPureTuple(typeChecker, type) {
|
|
|
1483
1487
|
return typeArgs.every((item) => isClassType(item));
|
|
1484
1488
|
}
|
|
1485
1489
|
|
|
1486
|
-
const createRule$
|
|
1490
|
+
const createRule$c = ESLintUtils.RuleCreator((name) => name);
|
|
1487
1491
|
const MESSAGE_ID$5 = 'spreadArrays';
|
|
1488
|
-
var flatExports = createRule$
|
|
1492
|
+
var flatExports = createRule$c({
|
|
1489
1493
|
create(context) {
|
|
1490
1494
|
const parserServices = ESLintUtils.getParserServices(context);
|
|
1491
1495
|
const typeChecker = parserServices.program.getTypeChecker();
|
|
@@ -1595,7 +1599,6 @@ var flatExports = createRule$b({
|
|
|
1595
1599
|
},
|
|
1596
1600
|
};
|
|
1597
1601
|
},
|
|
1598
|
-
defaultOptions: [],
|
|
1599
1602
|
meta: {
|
|
1600
1603
|
docs: {
|
|
1601
1604
|
description: 'Ensure exported const tuples contain spread arrays in pure entity chains.',
|
|
@@ -1612,8 +1615,8 @@ var flatExports = createRule$b({
|
|
|
1612
1615
|
|
|
1613
1616
|
const MESSAGE_ID$4 = 'invalid-injection-token-description';
|
|
1614
1617
|
const ERROR_MESSAGE$3 = "InjectionToken's description should contain token's name";
|
|
1615
|
-
const createRule$
|
|
1616
|
-
const rule$
|
|
1618
|
+
const createRule$b = ESLintUtils.RuleCreator((name) => name);
|
|
1619
|
+
const rule$8 = createRule$b({
|
|
1617
1620
|
create(context) {
|
|
1618
1621
|
return {
|
|
1619
1622
|
'NewExpression[callee.name="InjectionToken"]'(node) {
|
|
@@ -1651,7 +1654,6 @@ const rule$7 = createRule$a({
|
|
|
1651
1654
|
},
|
|
1652
1655
|
};
|
|
1653
1656
|
},
|
|
1654
|
-
defaultOptions: [],
|
|
1655
1657
|
meta: {
|
|
1656
1658
|
docs: { description: ERROR_MESSAGE$3 },
|
|
1657
1659
|
fixable: 'code',
|
|
@@ -1681,8 +1683,8 @@ const DEFAULT_OPTIONS = {
|
|
|
1681
1683
|
importDeclaration: '^@taiga-ui*',
|
|
1682
1684
|
projectName: String.raw `(?<=^@taiga-ui/)([-\w]+)`,
|
|
1683
1685
|
};
|
|
1684
|
-
const createRule$
|
|
1685
|
-
const rule$
|
|
1686
|
+
const createRule$a = ESLintUtils.RuleCreator((name) => name);
|
|
1687
|
+
const rule$7 = createRule$a({
|
|
1686
1688
|
create(context) {
|
|
1687
1689
|
const { currentProject, deepImport, ignoreImports, importDeclaration, projectName, } = { ...DEFAULT_OPTIONS, ...context.options[0] };
|
|
1688
1690
|
const hasNonCodeExtension = (source) => {
|
|
@@ -1730,8 +1732,8 @@ const rule$6 = createRule$9({
|
|
|
1730
1732
|
},
|
|
1731
1733
|
};
|
|
1732
1734
|
},
|
|
1733
|
-
defaultOptions: [DEFAULT_OPTIONS],
|
|
1734
1735
|
meta: {
|
|
1736
|
+
defaultOptions: [DEFAULT_OPTIONS],
|
|
1735
1737
|
docs: { description: ERROR_MESSAGE$2 },
|
|
1736
1738
|
fixable: 'code',
|
|
1737
1739
|
messages: { [MESSAGE_ID$3]: ERROR_MESSAGE$2 },
|
|
@@ -1769,13 +1771,13 @@ const rule$6 = createRule$9({
|
|
|
1769
1771
|
name: 'no-deep-imports',
|
|
1770
1772
|
});
|
|
1771
1773
|
|
|
1772
|
-
const createRule$
|
|
1774
|
+
const createRule$9 = ESLintUtils.RuleCreator((name) => name);
|
|
1773
1775
|
const resolveCacheByOptions = new WeakMap();
|
|
1774
1776
|
const nearestFileUpCache = new Map();
|
|
1775
1777
|
const markerCache = new Map();
|
|
1776
1778
|
const indexFileCache = new Map();
|
|
1777
1779
|
const indexExportsCache = new Map();
|
|
1778
|
-
var noDeepImportsToIndexedPackages = createRule$
|
|
1780
|
+
var noDeepImportsToIndexedPackages = createRule$9({
|
|
1779
1781
|
create(context) {
|
|
1780
1782
|
const parserServices = ESLintUtils.getParserServices(context);
|
|
1781
1783
|
const program = parserServices.program;
|
|
@@ -1923,7 +1925,6 @@ var noDeepImportsToIndexedPackages = createRule$8({
|
|
|
1923
1925
|
},
|
|
1924
1926
|
};
|
|
1925
1927
|
},
|
|
1926
|
-
defaultOptions: [],
|
|
1927
1928
|
meta: {
|
|
1928
1929
|
docs: {
|
|
1929
1930
|
description: 'Disallow deep imports only when package root index.ts (or index.d.ts) re-exports that subpath, and the package is marked by ng-package.json or package.json',
|
|
@@ -2018,8 +2019,8 @@ const config = {
|
|
|
2018
2019
|
},
|
|
2019
2020
|
};
|
|
2020
2021
|
|
|
2021
|
-
const createRule$
|
|
2022
|
-
const rule$
|
|
2022
|
+
const createRule$8 = ESLintUtils.RuleCreator((name) => name);
|
|
2023
|
+
const rule$6 = createRule$8({
|
|
2023
2024
|
create(context) {
|
|
2024
2025
|
const checkImplicitPublic = (node) => {
|
|
2025
2026
|
const classRef = getClass(node);
|
|
@@ -2069,7 +2070,6 @@ const rule$5 = createRule$7({
|
|
|
2069
2070
|
},
|
|
2070
2071
|
};
|
|
2071
2072
|
},
|
|
2072
|
-
defaultOptions: [],
|
|
2073
2073
|
meta: {
|
|
2074
2074
|
docs: {
|
|
2075
2075
|
description: 'Require explicit `public` modifier for class members and parameter properties',
|
|
@@ -2091,8 +2091,8 @@ function getClass(node) {
|
|
|
2091
2091
|
return getClass(node.parent);
|
|
2092
2092
|
}
|
|
2093
2093
|
|
|
2094
|
-
const createRule$
|
|
2095
|
-
const rule$
|
|
2094
|
+
const createRule$7 = ESLintUtils.RuleCreator((name) => name);
|
|
2095
|
+
const rule$5 = createRule$7({
|
|
2096
2096
|
create(context) {
|
|
2097
2097
|
const services = ESLintUtils.getParserServices(context);
|
|
2098
2098
|
const checker = services.program.getTypeChecker();
|
|
@@ -2129,7 +2129,6 @@ const rule$4 = createRule$6({
|
|
|
2129
2129
|
},
|
|
2130
2130
|
};
|
|
2131
2131
|
},
|
|
2132
|
-
defaultOptions: [],
|
|
2133
2132
|
meta: {
|
|
2134
2133
|
docs: {
|
|
2135
2134
|
description: "Enforce Playwright clear() instead of fill('') for emptying fields",
|
|
@@ -2180,6 +2179,124 @@ function isPlaywrightLocatorType(type) {
|
|
|
2180
2179
|
});
|
|
2181
2180
|
}
|
|
2182
2181
|
|
|
2182
|
+
const createRule$6 = ESLintUtils.RuleCreator((name) => name);
|
|
2183
|
+
function isStringLiteralNode(node) {
|
|
2184
|
+
return (node.type === AST_NODE_TYPES.Literal &&
|
|
2185
|
+
typeof node.value === 'string');
|
|
2186
|
+
}
|
|
2187
|
+
function collectParts(node) {
|
|
2188
|
+
if (node.type === AST_NODE_TYPES.BinaryExpression && node.operator === '+') {
|
|
2189
|
+
return [...collectParts(node.left), ...collectParts(node.right)];
|
|
2190
|
+
}
|
|
2191
|
+
return [node];
|
|
2192
|
+
}
|
|
2193
|
+
function isRootConcat(node) {
|
|
2194
|
+
const { parent } = node;
|
|
2195
|
+
return (parent.type !== AST_NODE_TYPES.BinaryExpression ||
|
|
2196
|
+
parent.operator !== '+');
|
|
2197
|
+
}
|
|
2198
|
+
function isStringType(type, checker) {
|
|
2199
|
+
if (type.isUnion()) {
|
|
2200
|
+
return type.types.every((t) => isStringType(t, checker));
|
|
2201
|
+
}
|
|
2202
|
+
return type.isStringLiteral() || checker.typeToString(type) === 'string';
|
|
2203
|
+
}
|
|
2204
|
+
function buildMergedString(parts) {
|
|
2205
|
+
const combined = parts.map((p) => p.value).join('');
|
|
2206
|
+
const quote = combined.includes("'") && !combined.includes('"') ? '"' : "'";
|
|
2207
|
+
const escaped = combined
|
|
2208
|
+
.replaceAll('\\', '\\\\')
|
|
2209
|
+
.replaceAll('\r', String.raw `\r`)
|
|
2210
|
+
.replaceAll('\n', String.raw `\n`)
|
|
2211
|
+
.replaceAll('\t', String.raw `\t`)
|
|
2212
|
+
.replaceAll(new RegExp(quote, 'g'), `\\${quote}`);
|
|
2213
|
+
return `${quote}${escaped}${quote}`;
|
|
2214
|
+
}
|
|
2215
|
+
function buildTemplateLiteral(parts, getText) {
|
|
2216
|
+
const inner = parts
|
|
2217
|
+
.map((part) => {
|
|
2218
|
+
if (isStringLiteralNode(part)) {
|
|
2219
|
+
return part.value
|
|
2220
|
+
.replaceAll('\\', '\\\\')
|
|
2221
|
+
.replaceAll('`', '\\`')
|
|
2222
|
+
.replaceAll('${', '\\${');
|
|
2223
|
+
}
|
|
2224
|
+
return `\${${getText(part)}}`;
|
|
2225
|
+
})
|
|
2226
|
+
.join('');
|
|
2227
|
+
return `\`${inner}\``;
|
|
2228
|
+
}
|
|
2229
|
+
const rule$4 = createRule$6({
|
|
2230
|
+
create(context) {
|
|
2231
|
+
const { sourceCode } = context;
|
|
2232
|
+
let parserServices = null;
|
|
2233
|
+
let checker = null;
|
|
2234
|
+
try {
|
|
2235
|
+
parserServices = ESLintUtils.getParserServices(context);
|
|
2236
|
+
checker = parserServices.program.getTypeChecker();
|
|
2237
|
+
}
|
|
2238
|
+
catch {
|
|
2239
|
+
// Type checking not available — only literal concatenation will be checked
|
|
2240
|
+
}
|
|
2241
|
+
function isStringNode(node) {
|
|
2242
|
+
if (isStringLiteralNode(node)) {
|
|
2243
|
+
return true;
|
|
2244
|
+
}
|
|
2245
|
+
if (!parserServices || !checker) {
|
|
2246
|
+
return false;
|
|
2247
|
+
}
|
|
2248
|
+
const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node);
|
|
2249
|
+
const type = checker.getTypeAtLocation(tsNode);
|
|
2250
|
+
return isStringType(type, checker);
|
|
2251
|
+
}
|
|
2252
|
+
return {
|
|
2253
|
+
BinaryExpression(node) {
|
|
2254
|
+
if (node.operator !== '+') {
|
|
2255
|
+
return;
|
|
2256
|
+
}
|
|
2257
|
+
if (!isRootConcat(node)) {
|
|
2258
|
+
return;
|
|
2259
|
+
}
|
|
2260
|
+
const parts = collectParts(node);
|
|
2261
|
+
const allLiterals = parts.every(isStringLiteralNode);
|
|
2262
|
+
if (allLiterals) {
|
|
2263
|
+
context.report({
|
|
2264
|
+
fix(fixer) {
|
|
2265
|
+
return fixer.replaceText(node, buildMergedString(parts));
|
|
2266
|
+
},
|
|
2267
|
+
messageId: 'mergeLiterals',
|
|
2268
|
+
node,
|
|
2269
|
+
});
|
|
2270
|
+
return;
|
|
2271
|
+
}
|
|
2272
|
+
if (parts.every((part) => part.type !== AST_NODE_TYPES.TemplateLiteral &&
|
|
2273
|
+
isStringNode(part))) {
|
|
2274
|
+
context.report({
|
|
2275
|
+
fix(fixer) {
|
|
2276
|
+
return fixer.replaceText(node, buildTemplateLiteral(parts, (n) => sourceCode.getText(n)));
|
|
2277
|
+
},
|
|
2278
|
+
messageId: 'useTemplate',
|
|
2279
|
+
node,
|
|
2280
|
+
});
|
|
2281
|
+
}
|
|
2282
|
+
},
|
|
2283
|
+
};
|
|
2284
|
+
},
|
|
2285
|
+
meta: {
|
|
2286
|
+
docs: {
|
|
2287
|
+
description: 'Disallow string concatenation. Merge adjacent string literals into one; use template literals for string variables.',
|
|
2288
|
+
},
|
|
2289
|
+
fixable: 'code',
|
|
2290
|
+
messages: {
|
|
2291
|
+
mergeLiterals: 'Merge string literals instead of concatenating them.',
|
|
2292
|
+
useTemplate: 'Use a template literal instead of string concatenation.',
|
|
2293
|
+
},
|
|
2294
|
+
schema: [],
|
|
2295
|
+
type: 'suggestion',
|
|
2296
|
+
},
|
|
2297
|
+
name: 'no-string-literal-concat',
|
|
2298
|
+
});
|
|
2299
|
+
|
|
2183
2300
|
const createRule$5 = ESLintUtils.RuleCreator((name) => name);
|
|
2184
2301
|
const rule$3 = createRule$5({
|
|
2185
2302
|
create(context, [{ printWidth }]) {
|
|
@@ -2440,8 +2557,8 @@ const rule$3 = createRule$5({
|
|
|
2440
2557
|
},
|
|
2441
2558
|
};
|
|
2442
2559
|
},
|
|
2443
|
-
defaultOptions: [{ printWidth: 90 }],
|
|
2444
2560
|
meta: {
|
|
2561
|
+
defaultOptions: [{ printWidth: 90 }],
|
|
2445
2562
|
docs: {
|
|
2446
2563
|
description: 'Enforce single-line formatting for single-property objects when possible (Prettier-friendly)',
|
|
2447
2564
|
},
|
|
@@ -2526,13 +2643,13 @@ var preferDeepImports = createRule$4({
|
|
|
2526
2643
|
},
|
|
2527
2644
|
};
|
|
2528
2645
|
},
|
|
2529
|
-
defaultOptions: [
|
|
2530
|
-
{
|
|
2531
|
-
importFilter: [],
|
|
2532
|
-
strict: false,
|
|
2533
|
-
},
|
|
2534
|
-
],
|
|
2535
2646
|
meta: {
|
|
2647
|
+
defaultOptions: [
|
|
2648
|
+
{
|
|
2649
|
+
importFilter: [],
|
|
2650
|
+
strict: false,
|
|
2651
|
+
},
|
|
2652
|
+
],
|
|
2536
2653
|
docs: { description: ERROR_MESSAGE },
|
|
2537
2654
|
fixable: 'code',
|
|
2538
2655
|
messages: { [MESSAGE_ID$1]: ERROR_MESSAGE },
|
|
@@ -2889,7 +3006,6 @@ const rule$2 = createRule$3({
|
|
|
2889
3006
|
},
|
|
2890
3007
|
};
|
|
2891
3008
|
},
|
|
2892
|
-
defaultOptions: [],
|
|
2893
3009
|
meta: {
|
|
2894
3010
|
docs: {
|
|
2895
3011
|
description: 'Enforce combining consecutive .push() calls on the same array into a single call.',
|
|
@@ -3041,13 +3157,13 @@ const rule$1 = createRule$2({
|
|
|
3041
3157
|
},
|
|
3042
3158
|
};
|
|
3043
3159
|
},
|
|
3044
|
-
defaultOptions: [
|
|
3045
|
-
{
|
|
3046
|
-
decorators: DEFAULT_DECORATORS,
|
|
3047
|
-
exceptions: DEFAULT_EXCEPTIONS,
|
|
3048
|
-
},
|
|
3049
|
-
],
|
|
3050
3160
|
meta: {
|
|
3161
|
+
defaultOptions: [
|
|
3162
|
+
{
|
|
3163
|
+
decorators: DEFAULT_DECORATORS,
|
|
3164
|
+
exceptions: DEFAULT_EXCEPTIONS,
|
|
3165
|
+
},
|
|
3166
|
+
],
|
|
3051
3167
|
docs: {
|
|
3052
3168
|
description: 'Shorten TuiXxxComponent / TuiYyyDirective in Angular metadata (supports configurable decorators and exceptions).',
|
|
3053
3169
|
},
|
|
@@ -3244,8 +3360,8 @@ var standaloneImportsSort = createRule$1({
|
|
|
3244
3360
|
},
|
|
3245
3361
|
};
|
|
3246
3362
|
},
|
|
3247
|
-
defaultOptions: [{ decorators: ['Component', 'Directive', 'NgModule', 'Pipe'] }],
|
|
3248
3363
|
meta: {
|
|
3364
|
+
defaultOptions: [{ decorators: ['Component', 'Directive', 'NgModule', 'Pipe'] }],
|
|
3249
3365
|
docs: { description: 'Sort Angular standalone imports inside decorators.' },
|
|
3250
3366
|
fixable: 'code',
|
|
3251
3367
|
messages: { incorrectOrder: 'Order in imports should be [{{expected}}]' },
|
|
@@ -3351,7 +3467,6 @@ const rule = createRule({
|
|
|
3351
3467
|
},
|
|
3352
3468
|
};
|
|
3353
3469
|
},
|
|
3354
|
-
defaultOptions: [],
|
|
3355
3470
|
meta: {
|
|
3356
3471
|
docs: {
|
|
3357
3472
|
description: `Ensures that keys and values are valid in a ${DOC_EXAMPLE_INTERFACE_NAME} interface.`,
|
|
@@ -3379,12 +3494,13 @@ const plugin = {
|
|
|
3379
3494
|
'class-property-naming': classPropertyNaming,
|
|
3380
3495
|
'decorator-key-sort': config$1,
|
|
3381
3496
|
'flat-exports': flatExports,
|
|
3382
|
-
'injection-token-description': rule$
|
|
3383
|
-
'no-deep-imports': rule$
|
|
3497
|
+
'injection-token-description': rule$8,
|
|
3498
|
+
'no-deep-imports': rule$7,
|
|
3384
3499
|
'no-deep-imports-to-indexed-packages': noDeepImportsToIndexedPackages,
|
|
3385
3500
|
'no-href-with-router-link': config,
|
|
3386
|
-
'no-implicit-public': rule$
|
|
3387
|
-
'no-playwright-empty-fill': rule$
|
|
3501
|
+
'no-implicit-public': rule$6,
|
|
3502
|
+
'no-playwright-empty-fill': rule$5,
|
|
3503
|
+
'no-string-literal-concat': rule$4,
|
|
3388
3504
|
'object-single-line': rule$3,
|
|
3389
3505
|
'prefer-deep-imports': preferDeepImports,
|
|
3390
3506
|
'prefer-multi-arg-push': rule$2,
|
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ESLintUtils } from '@typescript-eslint/utils';
|
|
2
|
-
export declare const rule: ESLintUtils.RuleModule<"invalid-injection-token-description", [], unknown, ESLintUtils.RuleListener> & {
|
|
2
|
+
export declare const rule: ESLintUtils.RuleModule<"invalid-injection-token-description", readonly unknown[], unknown, ESLintUtils.RuleListener> & {
|
|
3
3
|
name: string;
|
|
4
4
|
};
|
|
5
5
|
export default rule;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ESLintUtils } from '@typescript-eslint/utils';
|
|
2
|
-
declare const _default: ESLintUtils.RuleModule<"deepImport", [], unknown, ESLintUtils.RuleListener> & {
|
|
2
|
+
declare const _default: ESLintUtils.RuleModule<"deepImport", readonly unknown[], unknown, ESLintUtils.RuleListener> & {
|
|
3
3
|
name: string;
|
|
4
4
|
};
|
|
5
5
|
export default _default;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { ESLintUtils } from '@typescript-eslint/utils';
|
|
2
|
-
export declare const rule: ESLintUtils.RuleModule<"no-deep-imports",
|
|
2
|
+
export declare const rule: ESLintUtils.RuleModule<"no-deep-imports", {
|
|
3
3
|
currentProject: string;
|
|
4
4
|
deepImport: string;
|
|
5
5
|
ignoreImports: string[];
|
|
6
6
|
importDeclaration: string;
|
|
7
7
|
projectName: string;
|
|
8
|
-
}], unknown, ESLintUtils.RuleListener> & {
|
|
8
|
+
}[], unknown, ESLintUtils.RuleListener> & {
|
|
9
9
|
name: string;
|
|
10
10
|
};
|
|
11
11
|
export default rule;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ESLintUtils } from '@typescript-eslint/utils';
|
|
2
|
-
export declare const rule: ESLintUtils.RuleModule<"implicitPublic", [], unknown, ESLintUtils.RuleListener> & {
|
|
2
|
+
export declare const rule: ESLintUtils.RuleModule<"implicitPublic", readonly unknown[], unknown, ESLintUtils.RuleListener> & {
|
|
3
3
|
name: string;
|
|
4
4
|
};
|
|
5
5
|
export default rule;
|