eslint-plugin-complete 1.12.1 → 1.12.2

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint-plugin-complete",
3
- "version": "1.12.1",
3
+ "version": "1.12.2",
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"
@@ -0,0 +1,8 @@
1
+ import type { ImmutabilityCache, ImmutabilityOverrides } from "is-immutable-type";
2
+ import ts from "typescript";
3
+ /**
4
+ * TODO: Remove this workaround after https://github.com/RebeccaStevens/is-immutable-type/pull/637
5
+ * is released.
6
+ */
7
+ export declare function isImmutableTypeWithPrimitiveIntersectionPatch(program: ts.Program, type: ts.Type, overrides: ImmutabilityOverrides, cache: ImmutabilityCache): boolean;
8
+ //# 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;;;GAGG;AACH,wBAAgB,6CAA6C,CAC3D,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,72 @@
1
+ import { getTypeOfPropertyOfType } from "@typescript-eslint/type-utils";
2
+ import { Immutability, isImmutableType } from "is-immutable-type";
3
+ import ts from "typescript";
4
+ /**
5
+ * TODO: Remove this workaround after https://github.com/RebeccaStevens/is-immutable-type/pull/637
6
+ * is released.
7
+ */
8
+ export function isImmutableTypeWithPrimitiveIntersectionPatch(program, type, overrides, cache) {
9
+ cacheImmutablePrimitiveIntersections(program, type, overrides, cache);
10
+ return isImmutableType(program, type, overrides, cache);
11
+ }
12
+ function cacheImmutablePrimitiveIntersections(program, type, overrides, cache) {
13
+ const checker = program.getTypeChecker();
14
+ const seenTypes = new Set();
15
+ function visitType(typeToVisit) {
16
+ if (seenTypes.has(typeToVisit)) {
17
+ return;
18
+ }
19
+ seenTypes.add(typeToVisit);
20
+ if (typeToVisit.isIntersection()) {
21
+ for (const childType of typeToVisit.types) {
22
+ if (!isPrimitiveType(childType)) {
23
+ visitType(childType);
24
+ }
25
+ }
26
+ if (typeToVisit.types.some((childType) => isPrimitiveType(childType))
27
+ && typeToVisit.types.every((childType) => isPrimitiveType(childType)
28
+ || isImmutableType(program, childType, overrides, cache))) {
29
+ cache.set(typeToVisit, Immutability.Immutable);
30
+ return;
31
+ }
32
+ }
33
+ else if (typeToVisit.isUnion()) {
34
+ for (const childType of typeToVisit.types) {
35
+ visitType(childType);
36
+ }
37
+ }
38
+ if (isTypeReference(typeToVisit)) {
39
+ for (const typeArgument of checker.getTypeArguments(typeToVisit)) {
40
+ visitType(typeArgument);
41
+ }
42
+ }
43
+ for (const property of typeToVisit.getProperties()) {
44
+ const propertyType = getTypeOfPropertyOfType(checker, typeToVisit, property);
45
+ if (propertyType !== undefined) {
46
+ visitType(propertyType);
47
+ }
48
+ }
49
+ for (const indexKind of [ts.IndexKind.String, ts.IndexKind.Number]) {
50
+ const indexInfo = checker.getIndexInfoOfType(typeToVisit, indexKind);
51
+ if (indexInfo !== undefined) {
52
+ visitType(indexInfo.type);
53
+ }
54
+ }
55
+ }
56
+ visitType(type);
57
+ }
58
+ function isTypeReference(type) {
59
+ return ((type.flags & ts.TypeFlags.Object) !== 0
60
+ && (type.objectFlags & ts.ObjectFlags.Reference) !== 0);
61
+ }
62
+ function isPrimitiveType(type) {
63
+ const primitiveFlags = ts.TypeFlags.StringLike
64
+ | ts.TypeFlags.NumberLike
65
+ | ts.TypeFlags.BigIntLike
66
+ | ts.TypeFlags.BooleanLike
67
+ | ts.TypeFlags.ESSymbolLike
68
+ | ts.TypeFlags.VoidLike
69
+ | ts.TypeFlags.Null;
70
+ return (type.flags & primitiveFlags) !== 0;
71
+ }
72
+ //# 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":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAwCvD,eAAO,MAAM,2BAA2B;;CA0CtC,CAAC"}
1
+ {"version":3,"file":"type-declaration-immutability.d.ts","sourceRoot":"","sources":["../../../src/rules/type-declaration-immutability.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAqCvD,eAAO,MAAM,2BAA2B;;CA0CtC,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { ESLintUtils } from "@typescript-eslint/utils";
2
- import { getDefaultOverrides, Immutability, isImmutableType, } from "is-immutable-type";
2
+ import { getDefaultOverrides, Immutability } from "is-immutable-type";
3
+ import { isImmutableTypeWithPrimitiveIntersectionPatch } from "../patch.js";
3
4
  import { createRule } from "../utils.js";
4
5
  const IMMUTABILITY_OVERRIDES = [
5
6
  ...getDefaultOverrides(),
@@ -51,7 +52,7 @@ export const typeDeclarationImmutability = createRule({
51
52
  function checkInterface(node) {
52
53
  const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node);
53
54
  const type = checker.getTypeAtLocation(tsNode);
54
- if (!isImmutableType(program, type, IMMUTABILITY_OVERRIDES, immutabilityCache)) {
55
+ if (!isImmutableTypeWithPrimitiveIntersectionPatch(program, type, IMMUTABILITY_OVERRIDES, immutabilityCache)) {
55
56
  context.report({
56
57
  node: node.id,
57
58
  messageId: "mustBeImmutable",
@@ -1 +1 @@
1
- {"version":3,"file":"type-declaration-immutability.js","sourceRoot":"","sources":["../../../../../src/rules/type-declaration-immutability.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAKzC,MAAM,sBAAsB,GAAG;IAC7B,GAAG,mBAAmB,EAAE;IACxB;QACE,IAAI,EAAE;YACJ,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,eAAe;SACtB;QACD,IAAI,EAAE,YAAY,CAAC,YAAY;QAC/B,EAAE,EAAE,YAAY,CAAC,SAAS;KAC3B;IACD;QACE,IAAI,EAAE;YACJ,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,aAAa;SACpB;QACD,IAAI,EAAE,YAAY,CAAC,YAAY;QAC/B,EAAE,EAAE,YAAY,CAAC,SAAS;KAC3B;IACD;QACE,IAAI,EAAE;YACJ,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,aAAa;SACpB;QACD,IAAI,EAAE,YAAY,CAAC,YAAY;QAC/B,EAAE,EAAE,YAAY,CAAC,SAAS;KAC3B;CACO,CAAC;AAEX,MAAM,CAAC,MAAM,2BAA2B,GAAG,UAAU,CAAsB;IACzE,IAAI,EAAE,+BAA+B;IACrC,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,wCAAwC;YACrD,WAAW,EAAE,IAAI;YACjB,oBAAoB,EAAE,IAAI;SAC3B;QACD,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,eAAe,EAAE,+BAA+B;SACjD;KACF;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,MAAM,cAAc,GAAG,WAAW,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC9D,MAAM,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC;QACnC,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;QACzC,MAAM,iBAAiB,GAAsB,IAAI,OAAO,EAAE,CAAC;QAE3D,SAAS,cAAc,CAAC,IAAqC;YAC3D,MAAM,MAAM,GAAG,cAAc,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC9D,MAAM,IAAI,GAAG,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAE/C,IACE,CAAC,eAAe,CACd,OAAO,EACP,IAAI,EACJ,sBAAsB,EACtB,iBAAiB,CAClB,EACD,CAAC;gBACD,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI,EAAE,IAAI,CAAC,EAAE;oBACb,SAAS,EAAE,iBAAiB;iBAC7B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,CAAC;IACpD,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"type-declaration-immutability.js","sourceRoot":"","sources":["../../../../../src/rules/type-declaration-immutability.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,6CAA6C,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAKzC,MAAM,sBAAsB,GAAG;IAC7B,GAAG,mBAAmB,EAAE;IACxB;QACE,IAAI,EAAE;YACJ,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,eAAe;SACtB;QACD,IAAI,EAAE,YAAY,CAAC,YAAY;QAC/B,EAAE,EAAE,YAAY,CAAC,SAAS;KAC3B;IACD;QACE,IAAI,EAAE;YACJ,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,aAAa;SACpB;QACD,IAAI,EAAE,YAAY,CAAC,YAAY;QAC/B,EAAE,EAAE,YAAY,CAAC,SAAS;KAC3B;IACD;QACE,IAAI,EAAE;YACJ,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,aAAa;SACpB;QACD,IAAI,EAAE,YAAY,CAAC,YAAY;QAC/B,EAAE,EAAE,YAAY,CAAC,SAAS;KAC3B;CACO,CAAC;AAEX,MAAM,CAAC,MAAM,2BAA2B,GAAG,UAAU,CAAsB;IACzE,IAAI,EAAE,+BAA+B;IACrC,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,wCAAwC;YACrD,WAAW,EAAE,IAAI;YACjB,oBAAoB,EAAE,IAAI;SAC3B;QACD,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,eAAe,EAAE,+BAA+B;SACjD;KACF;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,MAAM,cAAc,GAAG,WAAW,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC9D,MAAM,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC;QACnC,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;QACzC,MAAM,iBAAiB,GAAsB,IAAI,OAAO,EAAE,CAAC;QAE3D,SAAS,cAAc,CAAC,IAAqC;YAC3D,MAAM,MAAM,GAAG,cAAc,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC9D,MAAM,IAAI,GAAG,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAE/C,IACE,CAAC,6CAA6C,CAC5C,OAAO,EACP,IAAI,EACJ,sBAAsB,EACtB,iBAAiB,CAClB,EACD,CAAC;gBACD,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI,EAAE,IAAI,CAAC,EAAE;oBACb,SAAS,EAAE,iBAAiB;iBAC7B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,CAAC;IACpD,CAAC;CACF,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint-plugin-complete",
3
- "version": "1.12.1",
3
+ "version": "1.12.2",
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"