eslint-plugin-complete 1.12.1 → 1.12.3
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/dist/package.json +4 -3
- package/dist/src/patch.d.ts +5 -0
- package/dist/src/patch.d.ts.map +1 -0
- package/dist/src/patch.js +114 -0
- package/dist/src/patch.js.map +1 -0
- package/dist/src/rules/type-declaration-immutability.d.ts.map +1 -1
- package/dist/src/rules/type-declaration-immutability.js +42 -4
- package/dist/src/rules/type-declaration-immutability.js.map +1 -1
- package/package.json +4 -3
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eslint-plugin-complete",
|
|
3
|
-
"version": "1.12.
|
|
3
|
+
"version": "1.12.3",
|
|
4
4
|
"description": "An ESLint plugin that contains useful rules.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"eslint",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"scripts": {
|
|
37
37
|
"build": "bun run ./scripts/build.ts",
|
|
38
38
|
"create-rule": "bun run ./scripts/createRule.ts",
|
|
39
|
-
"docs": "bun run build && eslint-doc-generator && bunx prettier --write .",
|
|
39
|
+
"docs": "bun run build && eslint-doc-generator && bunx prettier --write docs website-root.md",
|
|
40
40
|
"generate": "bun run ./scripts/generate.ts",
|
|
41
41
|
"lint": "bun run ./scripts/lint.ts",
|
|
42
42
|
"test": "jest"
|
|
@@ -44,7 +44,8 @@
|
|
|
44
44
|
"dependencies": {
|
|
45
45
|
"@typescript-eslint/type-utils": "catalog:",
|
|
46
46
|
"@typescript-eslint/utils": "catalog:",
|
|
47
|
-
"is-immutable-type": "catalog:"
|
|
47
|
+
"is-immutable-type": "catalog:",
|
|
48
|
+
"ts-api-utils": "catalog:"
|
|
48
49
|
},
|
|
49
50
|
"devDependencies": {
|
|
50
51
|
"@babel/core": "catalog:",
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ImmutabilityCache, ImmutabilityOverrides } from "is-immutable-type";
|
|
2
|
+
import ts from "typescript";
|
|
3
|
+
/** TODO: Open a PR for this once the other PR is accepted. */
|
|
4
|
+
export declare function isImmutableTypeWithPatches(program: ts.Program, type: ts.Type, overrides: ImmutabilityOverrides, cache: ImmutabilityCache): boolean;
|
|
5
|
+
//# sourceMappingURL=patch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patch.d.ts","sourceRoot":"","sources":["../../src/patch.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EACjB,qBAAqB,EACtB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,8DAA8D;AAC9D,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,EAAE,CAAC,OAAO,EACnB,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,SAAS,EAAE,qBAAqB,EAChC,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAGT"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { getTypeOfPropertyOfType } from "@typescript-eslint/type-utils";
|
|
2
|
+
import { Immutability, isImmutableType } from "is-immutable-type";
|
|
3
|
+
import ts from "typescript";
|
|
4
|
+
/** TODO: Open a PR for this once the other PR is accepted. */
|
|
5
|
+
export function isImmutableTypeWithPatches(program, type, overrides, cache) {
|
|
6
|
+
cachePatchedImmutableTypes(program, type, overrides, cache);
|
|
7
|
+
return isImmutableType(program, type, overrides, cache);
|
|
8
|
+
}
|
|
9
|
+
function cachePatchedImmutableTypes(program, type, overrides, cache) {
|
|
10
|
+
const checker = program.getTypeChecker();
|
|
11
|
+
const seenTypes = new Set();
|
|
12
|
+
function visitType(typeToVisit) {
|
|
13
|
+
if (seenTypes.has(typeToVisit)) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
seenTypes.add(typeToVisit);
|
|
17
|
+
// The ReadonlyArray override does not match tuples reached through the type checker.
|
|
18
|
+
if (isTupleType(checker, typeToVisit)) {
|
|
19
|
+
const typeArguments = checker.getTypeArguments(typeToVisit);
|
|
20
|
+
for (const typeArgument of typeArguments) {
|
|
21
|
+
visitType(typeArgument);
|
|
22
|
+
}
|
|
23
|
+
if (typeToVisit.target.readonly) {
|
|
24
|
+
const isImmutable = typeArguments.every((typeArgument) => isImmutableType(program, typeArgument, overrides, cache));
|
|
25
|
+
const genericAlias = getGenericTupleAlias(typeToVisit);
|
|
26
|
+
if (!isImmutable && genericAlias !== undefined) {
|
|
27
|
+
cache.set(genericAlias, Immutability.ReadonlyDeep);
|
|
28
|
+
}
|
|
29
|
+
else if (isImmutable) {
|
|
30
|
+
const cacheKey = getTupleCacheKey(typeToVisit);
|
|
31
|
+
if (cacheKey !== undefined) {
|
|
32
|
+
cache.set(cacheKey, Immutability.Immutable);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (typeToVisit.isIntersection()) {
|
|
39
|
+
for (const childType of typeToVisit.types) {
|
|
40
|
+
if (!isPrimitiveType(childType)) {
|
|
41
|
+
visitType(childType);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (isImmutablePrimitiveIntersection(program, typeToVisit, overrides, cache)) {
|
|
45
|
+
cache.set(typeToVisit, Immutability.Immutable);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
else if (typeToVisit.isUnion()) {
|
|
50
|
+
for (const childType of typeToVisit.types) {
|
|
51
|
+
visitType(childType);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (isTypeReference(typeToVisit)) {
|
|
55
|
+
for (const typeArgument of checker.getTypeArguments(typeToVisit)) {
|
|
56
|
+
visitType(typeArgument);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
for (const property of typeToVisit.getProperties()) {
|
|
60
|
+
const propertyType = getTypeOfPropertyOfType(checker, typeToVisit, property);
|
|
61
|
+
if (propertyType !== undefined) {
|
|
62
|
+
visitType(propertyType);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
for (const indexKind of [ts.IndexKind.String, ts.IndexKind.Number]) {
|
|
66
|
+
const indexInfo = checker.getIndexInfoOfType(typeToVisit, indexKind);
|
|
67
|
+
if (indexInfo !== undefined) {
|
|
68
|
+
visitType(indexInfo.type);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
visitType(type);
|
|
73
|
+
}
|
|
74
|
+
function isTupleType(checker, type) {
|
|
75
|
+
return checker.isTupleType(type);
|
|
76
|
+
}
|
|
77
|
+
function getTupleCacheKey(type) {
|
|
78
|
+
if (getGenericTupleAlias(type) !== undefined) {
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
return type.node ?? type.target;
|
|
82
|
+
}
|
|
83
|
+
function getGenericTupleAlias(type) {
|
|
84
|
+
const node = type.node;
|
|
85
|
+
return node !== undefined
|
|
86
|
+
&& ts.isTypeAliasDeclaration(node)
|
|
87
|
+
&& node.typeParameters !== undefined
|
|
88
|
+
? node
|
|
89
|
+
: undefined;
|
|
90
|
+
}
|
|
91
|
+
function isTypeReference(type) {
|
|
92
|
+
return ((type.flags & ts.TypeFlags.Object) !== 0
|
|
93
|
+
&& (type.objectFlags & ts.ObjectFlags.Reference) !== 0);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* TODO: Remove this workaround after https://github.com/RebeccaStevens/is-immutable-type/pull/637
|
|
97
|
+
* is released.
|
|
98
|
+
*/
|
|
99
|
+
function isImmutablePrimitiveIntersection(program, type, overrides, cache) {
|
|
100
|
+
return (type.types.some((childType) => isPrimitiveType(childType))
|
|
101
|
+
&& type.types.every((childType) => isPrimitiveType(childType)
|
|
102
|
+
|| isImmutableType(program, childType, overrides, cache)));
|
|
103
|
+
}
|
|
104
|
+
function isPrimitiveType(type) {
|
|
105
|
+
const primitiveFlags = ts.TypeFlags.StringLike
|
|
106
|
+
| ts.TypeFlags.NumberLike
|
|
107
|
+
| ts.TypeFlags.BigIntLike
|
|
108
|
+
| ts.TypeFlags.BooleanLike
|
|
109
|
+
| ts.TypeFlags.ESSymbolLike
|
|
110
|
+
| ts.TypeFlags.VoidLike
|
|
111
|
+
| ts.TypeFlags.Null;
|
|
112
|
+
return (type.flags & primitiveFlags) !== 0;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=patch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patch.js","sourceRoot":"","sources":["../../../../src/patch.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type-declaration-immutability.d.ts","sourceRoot":"","sources":["../../../src/rules/type-declaration-immutability.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"type-declaration-immutability.d.ts","sourceRoot":"","sources":["../../../src/rules/type-declaration-immutability.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAuCvD,eAAO,MAAM,2BAA2B;;CA2GtC,CAAC"}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
+
import { getTypeOfPropertyOfType } from "@typescript-eslint/type-utils";
|
|
1
2
|
import { ESLintUtils } from "@typescript-eslint/utils";
|
|
2
|
-
import { getDefaultOverrides, Immutability
|
|
3
|
+
import { getDefaultOverrides, Immutability } from "is-immutable-type";
|
|
4
|
+
import { isPropertyReadonlyInType } from "ts-api-utils";
|
|
5
|
+
import ts from "typescript";
|
|
6
|
+
import { isImmutableTypeWithPatches } from "../patch.js";
|
|
3
7
|
import { createRule } from "../utils.js";
|
|
4
8
|
const IMMUTABILITY_OVERRIDES = [
|
|
5
9
|
...getDefaultOverrides(),
|
|
@@ -39,7 +43,7 @@ export const typeDeclarationImmutability = createRule({
|
|
|
39
43
|
},
|
|
40
44
|
schema: [],
|
|
41
45
|
messages: {
|
|
42
|
-
mustBeImmutable:
|
|
46
|
+
mustBeImmutable: 'Interface must be immutable. Found {{violationCount}} field {{violationNoun}}; the first offending field is "{{firstFieldName}}".',
|
|
43
47
|
},
|
|
44
48
|
},
|
|
45
49
|
defaultOptions: [],
|
|
@@ -47,17 +51,51 @@ export const typeDeclarationImmutability = createRule({
|
|
|
47
51
|
const parserServices = ESLintUtils.getParserServices(context);
|
|
48
52
|
const { program } = parserServices;
|
|
49
53
|
const checker = program.getTypeChecker();
|
|
50
|
-
const immutabilityCache = new WeakMap();
|
|
51
54
|
function checkInterface(node) {
|
|
52
55
|
const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node);
|
|
53
56
|
const type = checker.getTypeAtLocation(tsNode);
|
|
54
|
-
|
|
57
|
+
const immutabilityCache = new WeakMap();
|
|
58
|
+
if (!isImmutableTypeWithPatches(program, type, IMMUTABILITY_OVERRIDES, immutabilityCache)) {
|
|
59
|
+
const offendingFields = getOffendingFields(type);
|
|
60
|
+
const firstFieldName = offendingFields[0] ?? "(unknown)";
|
|
61
|
+
const violationCount = offendingFields.length === 0 ? 1 : offendingFields.length;
|
|
55
62
|
context.report({
|
|
56
63
|
node: node.id,
|
|
57
64
|
messageId: "mustBeImmutable",
|
|
65
|
+
data: {
|
|
66
|
+
firstFieldName,
|
|
67
|
+
violationCount,
|
|
68
|
+
violationNoun: violationCount === 1 ? "violation" : "violations",
|
|
69
|
+
},
|
|
58
70
|
});
|
|
59
71
|
}
|
|
60
72
|
}
|
|
73
|
+
function getOffendingFields(type) {
|
|
74
|
+
const offendingFields = type
|
|
75
|
+
.getProperties()
|
|
76
|
+
.filter((property) => isOffendingProperty(type, property))
|
|
77
|
+
.map((property) => property.getName());
|
|
78
|
+
for (const indexKind of [ts.IndexKind.String, ts.IndexKind.Number]) {
|
|
79
|
+
const indexInfo = checker.getIndexInfoOfType(type, indexKind);
|
|
80
|
+
if (indexInfo !== undefined
|
|
81
|
+
&& (!indexInfo.isReadonly || !isImmutable(indexInfo.type))) {
|
|
82
|
+
offendingFields.push(indexKind === ts.IndexKind.String
|
|
83
|
+
? "[string index]"
|
|
84
|
+
: "[number index]");
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return offendingFields;
|
|
88
|
+
}
|
|
89
|
+
function isOffendingProperty(containingType, property) {
|
|
90
|
+
if (!isPropertyReadonlyInType(containingType, property.getEscapedName(), checker)) {
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
const propertyType = getTypeOfPropertyOfType(checker, containingType, property);
|
|
94
|
+
return propertyType !== undefined && !isImmutable(propertyType);
|
|
95
|
+
}
|
|
96
|
+
function isImmutable(type) {
|
|
97
|
+
return isImmutableTypeWithPatches(program, type, IMMUTABILITY_OVERRIDES, new WeakMap());
|
|
98
|
+
}
|
|
61
99
|
return { TSInterfaceDeclaration: checkInterface };
|
|
62
100
|
},
|
|
63
101
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type-declaration-immutability.js","sourceRoot":"","sources":["../../../../../src/rules/type-declaration-immutability.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"type-declaration-immutability.js","sourceRoot":"","sources":["../../../../../src/rules/type-declaration-immutability.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eslint-plugin-complete",
|
|
3
|
-
"version": "1.12.
|
|
3
|
+
"version": "1.12.3",
|
|
4
4
|
"description": "An ESLint plugin that contains useful rules.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"eslint",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"scripts": {
|
|
37
37
|
"build": "bun run ./scripts/build.ts",
|
|
38
38
|
"create-rule": "bun run ./scripts/createRule.ts",
|
|
39
|
-
"docs": "bun run build && eslint-doc-generator && bunx prettier --write .",
|
|
39
|
+
"docs": "bun run build && eslint-doc-generator && bunx prettier --write docs website-root.md",
|
|
40
40
|
"generate": "bun run ./scripts/generate.ts",
|
|
41
41
|
"lint": "bun run ./scripts/lint.ts",
|
|
42
42
|
"test": "jest"
|
|
@@ -44,7 +44,8 @@
|
|
|
44
44
|
"dependencies": {
|
|
45
45
|
"@typescript-eslint/type-utils": "8.68.0",
|
|
46
46
|
"@typescript-eslint/utils": "8.68.0",
|
|
47
|
-
"is-immutable-type": "5.0.4"
|
|
47
|
+
"is-immutable-type": "5.0.4",
|
|
48
|
+
"ts-api-utils": "2.5.0"
|
|
48
49
|
},
|
|
49
50
|
"devDependencies": {
|
|
50
51
|
"@babel/core": "7.29.7",
|