@elaraai/east-diagnostics 1.0.28 → 1.0.29
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 +13 -0
- package/dist/src/block-scope.d.ts +4 -1
- package/dist/src/block-scope.d.ts.map +1 -1
- package/dist/src/block-scope.js +19 -0
- package/dist/src/block-scope.js.map +1 -1
- package/dist/src/east-source.d.ts +17 -0
- package/dist/src/east-source.d.ts.map +1 -1
- package/dist/src/east-source.js +77 -0
- package/dist/src/east-source.js.map +1 -1
- package/dist/src/east-type.d.ts +2 -0
- package/dist/src/east-type.d.ts.map +1 -1
- package/dist/src/east-type.js +46 -0
- package/dist/src/east-type.js.map +1 -1
- package/dist/src/rules/index.d.ts +10 -0
- package/dist/src/rules/index.d.ts.map +1 -1
- package/dist/src/rules/index.js +31 -0
- package/dist/src/rules/index.js.map +1 -1
- package/dist/src/rules/no-build-time-clock.d.ts +3 -0
- package/dist/src/rules/no-build-time-clock.d.ts.map +1 -0
- package/dist/src/rules/no-build-time-clock.js +67 -0
- package/dist/src/rules/no-build-time-clock.js.map +1 -0
- package/dist/src/rules/no-compile-time-data-injection.d.ts.map +1 -1
- package/dist/src/rules/no-compile-time-data-injection.js +8 -3
- package/dist/src/rules/no-compile-time-data-injection.js.map +1 -1
- package/dist/src/rules/no-compile-time-seed-data.d.ts.map +1 -1
- package/dist/src/rules/no-compile-time-seed-data.js +4 -30
- package/dist/src/rules/no-compile-time-seed-data.js.map +1 -1
- package/dist/src/rules/no-cross-block-builder.d.ts +3 -0
- package/dist/src/rules/no-cross-block-builder.d.ts.map +1 -0
- package/dist/src/rules/no-cross-block-builder.js +112 -0
- package/dist/src/rules/no-cross-block-builder.js.map +1 -0
- package/dist/src/rules/no-duplicate-definition-name.d.ts +3 -0
- package/dist/src/rules/no-duplicate-definition-name.d.ts.map +1 -0
- package/dist/src/rules/no-duplicate-definition-name.js +73 -0
- package/dist/src/rules/no-duplicate-definition-name.js.map +1 -0
- package/dist/src/rules/no-dynamic-bind-path.d.ts +7 -0
- package/dist/src/rules/no-dynamic-bind-path.d.ts.map +1 -0
- package/dist/src/rules/no-dynamic-bind-path.js +53 -0
- package/dist/src/rules/no-dynamic-bind-path.js.map +1 -0
- package/dist/src/rules/no-handrolled-value-type-mirror.d.ts +3 -0
- package/dist/src/rules/no-handrolled-value-type-mirror.d.ts.map +1 -0
- package/dist/src/rules/no-handrolled-value-type-mirror.js +72 -0
- package/dist/src/rules/no-handrolled-value-type-mirror.js.map +1 -0
- package/dist/src/rules/no-host-comparison-on-east-values.d.ts +3 -0
- package/dist/src/rules/no-host-comparison-on-east-values.d.ts.map +1 -0
- package/dist/src/rules/no-host-comparison-on-east-values.js +70 -0
- package/dist/src/rules/no-host-comparison-on-east-values.js.map +1 -0
- package/dist/src/rules/no-host-in-east-block.d.ts.map +1 -1
- package/dist/src/rules/no-host-in-east-block.js +149 -31
- package/dist/src/rules/no-host-in-east-block.js.map +1 -1
- package/dist/src/rules/no-module-scope-east-macro.d.ts.map +1 -1
- package/dist/src/rules/no-module-scope-east-macro.js +8 -1
- package/dist/src/rules/no-module-scope-east-macro.js.map +1 -1
- package/dist/src/rules/no-state-outside-reactive.d.ts +3 -0
- package/dist/src/rules/no-state-outside-reactive.d.ts.map +1 -0
- package/dist/src/rules/no-state-outside-reactive.js +63 -0
- package/dist/src/rules/no-state-outside-reactive.js.map +1 -0
- package/dist/src/rules/prefer-const-ui-callbacks.d.ts +7 -0
- package/dist/src/rules/prefer-const-ui-callbacks.d.ts.map +1 -0
- package/dist/src/rules/prefer-const-ui-callbacks.js +50 -0
- package/dist/src/rules/prefer-const-ui-callbacks.js.map +1 -0
- package/dist/src/rules/prefer-some-none.d.ts.map +1 -1
- package/dist/src/rules/prefer-some-none.js +5 -0
- package/dist/src/rules/prefer-some-none.js.map +1 -1
- package/dist/src/rules/require-example-returns.d.ts +3 -0
- package/dist/src/rules/require-example-returns.d.ts.map +1 -0
- package/dist/src/rules/require-example-returns.js +58 -0
- package/dist/src/rules/require-example-returns.js.map +1 -0
- package/dist/src/rules/require-runner-platforms.d.ts +3 -0
- package/dist/src/rules/require-runner-platforms.d.ts.map +1 -0
- package/dist/src/rules/require-runner-platforms.js +99 -0
- package/dist/src/rules/require-runner-platforms.js.map +1 -0
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-compile-time-seed-data.js","sourceRoot":"","sources":["../../../src/rules/no-compile-time-seed-data.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"no-compile-time-seed-data.js","sourceRoot":"","sources":["../../../src/rules/no-compile-time-seed-data.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-cross-block-builder.d.ts","sourceRoot":"","sources":["../../../src/rules/no-cross-block-builder.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAe,MAAM,aAAa,CAAC;AAyEzD,eAAO,MAAM,mBAAmB,EAAE,QAwCjC,CAAC"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { isBlockBuilderType } from "../east-type.js";
|
|
2
|
+
import { isBlockBuilderCallback } from "../block-scope.js";
|
|
3
|
+
import { chainRootReceiver } from "../east-ir.js";
|
|
4
|
+
const NAME = "no-cross-block-builder";
|
|
5
|
+
const CODE = 990023;
|
|
6
|
+
/** The nearest enclosing BlockBuilder callback of `node`, or undefined. */
|
|
7
|
+
function nearestBlockCallback(node, ctx) {
|
|
8
|
+
let cur = node.parent;
|
|
9
|
+
while (cur !== undefined) {
|
|
10
|
+
if (isBlockBuilderCallback(cur, ctx))
|
|
11
|
+
return cur;
|
|
12
|
+
cur = cur.parent;
|
|
13
|
+
}
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
/** Does any identifier in `call` (other than the builder root itself and
|
|
17
|
+
* property names) resolve to a declaration whose nearest function-like scope
|
|
18
|
+
* lies strictly BETWEEN `owner` and the call — i.e. an inner-callback binding
|
|
19
|
+
* that will be out of scope where the outer builder emits? */
|
|
20
|
+
function referencesCrossedScope(call, root, owner, ctx) {
|
|
21
|
+
const t = ctx.ts;
|
|
22
|
+
const isFnLike = (n) => t.isArrowFunction(n) || t.isFunctionExpression(n) || t.isFunctionDeclaration(n) || t.isMethodDeclaration(n);
|
|
23
|
+
const enclosingFn = (n) => {
|
|
24
|
+
let cur = n.parent;
|
|
25
|
+
while (cur !== undefined && !isFnLike(cur))
|
|
26
|
+
cur = cur.parent;
|
|
27
|
+
return cur;
|
|
28
|
+
};
|
|
29
|
+
const contains = (outer, inner) => outer.pos <= inner.pos && inner.end <= outer.end;
|
|
30
|
+
let crossed = false;
|
|
31
|
+
const visit = (n) => {
|
|
32
|
+
if (crossed)
|
|
33
|
+
return;
|
|
34
|
+
if (t.isIdentifier(n) && n !== root) {
|
|
35
|
+
const p = n.parent;
|
|
36
|
+
// Labels, not references: a property-access member name (`.let`), an
|
|
37
|
+
// object-literal property NAME (`{ some: (_$, x) => … }` match arms — its
|
|
38
|
+
// symbol's declaration is the PropertyAssignment inside the crossed arm),
|
|
39
|
+
// a JSX attribute name. Shorthand `{ x }` IS a reference and stays.
|
|
40
|
+
const isLabel = p !== undefined &&
|
|
41
|
+
((t.isPropertyAccessExpression(p) && p.name === n) ||
|
|
42
|
+
(t.isPropertyAssignment(p) && p.name === n) ||
|
|
43
|
+
(t.isJsxAttribute(p) && p.name === n));
|
|
44
|
+
if (!isLabel) {
|
|
45
|
+
const decl = ctx.checker.getSymbolAtLocation(n)?.valueDeclaration;
|
|
46
|
+
if (decl !== undefined) {
|
|
47
|
+
const declFn = enclosingFn(decl);
|
|
48
|
+
if (declFn !== undefined && declFn !== owner && contains(owner, declFn) && contains(declFn, call)) {
|
|
49
|
+
crossed = true;
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
t.forEachChild(n, visit);
|
|
56
|
+
};
|
|
57
|
+
visit(call);
|
|
58
|
+
return crossed;
|
|
59
|
+
}
|
|
60
|
+
// Every East block callback receives ITS OWN builder `$`; calling `$.let` /
|
|
61
|
+
// `$.const` / `$(…)` on an OUTER block's builder from inside a nested callback
|
|
62
|
+
// emits the binding into the outer block. When the emitted value references
|
|
63
|
+
// inner-callback bindings (`xs.map((_$, x) => { $.let(x.add(1n)) })` — the
|
|
64
|
+
// classic shadow-dodging shape) the binding lands where those values are out
|
|
65
|
+
// of scope: it type-checks (every `$` is a BlockBuilder) and breaks at East
|
|
66
|
+
// compile/run time. Hoisting a PURE constant via the outer `$`
|
|
67
|
+
// (`none: (_$) => $.const([], ArrayType(T))`) references nothing inner-scoped
|
|
68
|
+
// and is the established match-arm idiom — not flagged.
|
|
69
|
+
export const noCrossBlockBuilder = {
|
|
70
|
+
name: NAME,
|
|
71
|
+
code: CODE,
|
|
72
|
+
description: "Inside a nested East block callback, an outer-`$` emission referencing inner-scope values puts the binding where those values don't exist.",
|
|
73
|
+
check(node, ctx) {
|
|
74
|
+
const t = ctx.ts;
|
|
75
|
+
if (!t.isCallExpression(node))
|
|
76
|
+
return;
|
|
77
|
+
const root = chainRootReceiver(node.expression, ctx);
|
|
78
|
+
if (!t.isIdentifier(root))
|
|
79
|
+
return;
|
|
80
|
+
if (!isBlockBuilderType(ctx.checker.getTypeAtLocation(root)))
|
|
81
|
+
return;
|
|
82
|
+
// Which callback OWNS this `$`? (Its declaration is that callback's parameter.)
|
|
83
|
+
const sym = ctx.checker.getSymbolAtLocation(root);
|
|
84
|
+
const decl = sym?.valueDeclaration;
|
|
85
|
+
if (decl === undefined || !t.isParameter(decl))
|
|
86
|
+
return;
|
|
87
|
+
const owner = decl.parent;
|
|
88
|
+
if (!isBlockBuilderCallback(owner, ctx))
|
|
89
|
+
return;
|
|
90
|
+
// The nearest enclosing block callback of the CALL must be that same owner.
|
|
91
|
+
// (A plain TS closure between them doesn't open a new East block — walking
|
|
92
|
+
// to the nearest BlockBuilder callback skips it, so capture through helper
|
|
93
|
+
// closures resolves to the right block.)
|
|
94
|
+
const nearest = nearestBlockCallback(node, ctx);
|
|
95
|
+
if (nearest === undefined || nearest === owner)
|
|
96
|
+
return;
|
|
97
|
+
// Only a cross-scope REFERENCE breaks — a pure constant hoists harmlessly.
|
|
98
|
+
if (!referencesCrossedScope(node, root, owner, ctx))
|
|
99
|
+
return;
|
|
100
|
+
const sf = ctx.sourceFile;
|
|
101
|
+
const start = root.getStart(sf);
|
|
102
|
+
ctx.report({
|
|
103
|
+
ruleName: NAME,
|
|
104
|
+
code: CODE,
|
|
105
|
+
start,
|
|
106
|
+
length: node.getEnd() - start,
|
|
107
|
+
messageText: "This call uses an OUTER block's `$` inside a nested East callback while referencing inner-callback values — the binding is emitted into the outer block, where those values don't exist. Use the callback's own builder (name it `$`, not `_$`).",
|
|
108
|
+
category: "error",
|
|
109
|
+
});
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
//# sourceMappingURL=no-cross-block-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-cross-block-builder.js","sourceRoot":"","sources":["../../../src/rules/no-cross-block-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-duplicate-definition-name.d.ts","sourceRoot":"","sources":["../../../src/rules/no-duplicate-definition-name.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAe,MAAM,aAAa,CAAC;AAoCzD,eAAO,MAAM,yBAAyB,EAAE,QAkCvC,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { importDeclarationOf } from "../east-source.js";
|
|
2
|
+
const NAME = "no-duplicate-definition-name";
|
|
3
|
+
const CODE = 990031;
|
|
4
|
+
// Each e3 definition kind occupies its own dataset-path namespace; `task` and
|
|
5
|
+
// `customTask` share the `tasks.<name>` space.
|
|
6
|
+
const DEFINITION_KINDS = new Map([
|
|
7
|
+
["input", "input"],
|
|
8
|
+
["task", "task"],
|
|
9
|
+
["customTask", "task"],
|
|
10
|
+
["function", "function"],
|
|
11
|
+
["record", "record"],
|
|
12
|
+
["mutation", "mutation"],
|
|
13
|
+
]);
|
|
14
|
+
/** `<e3>.<member>("name", …)` where `<e3>` is the DEFAULT import of `@elaraai/e3`
|
|
15
|
+
* and member is a definition kind — returns the kind + name literal. */
|
|
16
|
+
function e3Definition(node, ctx) {
|
|
17
|
+
const t = ctx.ts;
|
|
18
|
+
if (!t.isCallExpression(node))
|
|
19
|
+
return undefined;
|
|
20
|
+
const callee = node.expression;
|
|
21
|
+
if (!t.isPropertyAccessExpression(callee) || !t.isIdentifier(callee.expression))
|
|
22
|
+
return undefined;
|
|
23
|
+
const kind = DEFINITION_KINDS.get(callee.name.text);
|
|
24
|
+
if (kind === undefined)
|
|
25
|
+
return undefined;
|
|
26
|
+
const imp = importDeclarationOf(ctx.checker.getSymbolAtLocation(callee.expression), t);
|
|
27
|
+
if (imp === undefined || !t.isStringLiteral(imp.moduleSpecifier) || imp.moduleSpecifier.text !== "@elaraai/e3")
|
|
28
|
+
return undefined;
|
|
29
|
+
const nameArg = node.arguments[0];
|
|
30
|
+
if (nameArg === undefined || !t.isStringLiteralLike(nameArg))
|
|
31
|
+
return undefined;
|
|
32
|
+
return { kind, nameArg };
|
|
33
|
+
}
|
|
34
|
+
// Two e3 definitions of the same kind sharing a name string occupy the same
|
|
35
|
+
// dataset path — the collision surfaces at DEPLOY time, not compile time.
|
|
36
|
+
// (Per-file scope: cross-file duplicates need a program-wide pass.)
|
|
37
|
+
export const noDuplicateDefinitionName = {
|
|
38
|
+
name: NAME,
|
|
39
|
+
code: CODE,
|
|
40
|
+
description: "Two e3 definitions of the same kind with the same name string collide at deploy time — names must be unique per kind.",
|
|
41
|
+
check(node, ctx) {
|
|
42
|
+
const t = ctx.ts;
|
|
43
|
+
// One pass per file, keyed off the SourceFile visit.
|
|
44
|
+
if (!t.isSourceFile(node))
|
|
45
|
+
return;
|
|
46
|
+
const seen = new Map();
|
|
47
|
+
const visit = (n) => {
|
|
48
|
+
const def = e3Definition(n, ctx);
|
|
49
|
+
if (def !== undefined) {
|
|
50
|
+
const key = `${def.kind}:${def.nameArg.text}`;
|
|
51
|
+
const first = seen.get(key);
|
|
52
|
+
if (first === undefined) {
|
|
53
|
+
seen.set(key, def.nameArg);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
const sf = ctx.sourceFile;
|
|
57
|
+
const start = def.nameArg.getStart(sf);
|
|
58
|
+
ctx.report({
|
|
59
|
+
ruleName: NAME,
|
|
60
|
+
code: CODE,
|
|
61
|
+
start,
|
|
62
|
+
length: def.nameArg.getEnd() - start,
|
|
63
|
+
messageText: `Duplicate e3 ${def.kind} name "${def.nameArg.text}" — it collides with the earlier definition at deploy time. Definition names must be unique per kind.`,
|
|
64
|
+
category: "error",
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
t.forEachChild(n, visit);
|
|
69
|
+
};
|
|
70
|
+
visit(node);
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
//# sourceMappingURL=no-duplicate-definition-name.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-duplicate-definition-name.js","sourceRoot":"","sources":["../../../src/rules/no-duplicate-definition-name.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
import type { EastRule } from "../types.js";
|
|
6
|
+
export declare const noDynamicBindPath: EastRule;
|
|
7
|
+
//# sourceMappingURL=no-dynamic-bind-path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-dynamic-bind-path.d.ts","sourceRoot":"","sources":["../../../src/rules/no-dynamic-bind-path.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAmB5C,eAAO,MAAM,iBAAiB,EAAE,QAiC/B,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { isEastExprType } from "../east-type.js";
|
|
2
|
+
import { resolvesToEastImport } from "../east-source.js";
|
|
3
|
+
const NAME = "no-dynamic-bind-path";
|
|
4
|
+
const CODE = 990026;
|
|
5
|
+
// The dataset/key a handle binds to must be a JS-side constant captured at
|
|
6
|
+
// IR-build time: `ui()` derives its manifest (reads/writes, permissions,
|
|
7
|
+
// reactive subscriptions) by inspecting `Data.bind` calls in the IR, and a
|
|
8
|
+
// path computed from an East value cannot be resolved there — the binding is
|
|
9
|
+
// missing from the manifest, so the surface silently doesn't react (or fails
|
|
10
|
+
// at runtime). Bind every candidate as a constant and select the VALUE in East.
|
|
11
|
+
const KEY_ARG_INDEX = {
|
|
12
|
+
Data: 0,
|
|
13
|
+
State: 1,
|
|
14
|
+
Navigation: 1,
|
|
15
|
+
};
|
|
16
|
+
export const noDynamicBindPath = {
|
|
17
|
+
name: NAME,
|
|
18
|
+
code: CODE,
|
|
19
|
+
description: "Data.bind / State.bind / Navigation.bind keys must be IR-build constants — an East-computed key can't be captured in the ui() manifest.",
|
|
20
|
+
check(node, ctx) {
|
|
21
|
+
const t = ctx.ts;
|
|
22
|
+
if (!t.isCallExpression(node))
|
|
23
|
+
return;
|
|
24
|
+
const callee = node.expression;
|
|
25
|
+
if (!t.isPropertyAccessExpression(callee) || callee.name.text !== "bind")
|
|
26
|
+
return;
|
|
27
|
+
if (!t.isIdentifier(callee.expression))
|
|
28
|
+
return;
|
|
29
|
+
const ns = callee.expression.text;
|
|
30
|
+
const argIndex = KEY_ARG_INDEX[ns];
|
|
31
|
+
if (argIndex === undefined)
|
|
32
|
+
return;
|
|
33
|
+
// Only the east-ui / e3-ui namespaces — resolved by symbol, not name alone.
|
|
34
|
+
if (!resolvesToEastImport(callee.expression, ctx.checker, t))
|
|
35
|
+
return;
|
|
36
|
+
const keyArg = node.arguments[argIndex];
|
|
37
|
+
if (keyArg === undefined)
|
|
38
|
+
return;
|
|
39
|
+
if (!isEastExprType(ctx.checker.getTypeAtLocation(keyArg)))
|
|
40
|
+
return;
|
|
41
|
+
const sf = ctx.sourceFile;
|
|
42
|
+
const start = keyArg.getStart(sf);
|
|
43
|
+
ctx.report({
|
|
44
|
+
ruleName: NAME,
|
|
45
|
+
code: CODE,
|
|
46
|
+
start,
|
|
47
|
+
length: keyArg.getEnd() - start,
|
|
48
|
+
messageText: `The \`${ns}.bind\` key is an East expression — bind keys must be JS-side constants captured at IR-build time, or the binding is missing from the ui() manifest (no subscription/permission). Bind each candidate as a constant and select the VALUE in East (\`cond.ifElse(() => a.read(), () => b.read())\`).`,
|
|
49
|
+
category: "error",
|
|
50
|
+
});
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=no-dynamic-bind-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-dynamic-bind-path.js","sourceRoot":"","sources":["../../../src/rules/no-dynamic-bind-path.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEzD,MAAM,IAAI,GAAG,sBAAsB,CAAC;AACpC,MAAM,IAAI,GAAG,MAAM,CAAC;AAEpB,2EAA2E;AAC3E,yEAAyE;AACzE,2EAA2E;AAC3E,6EAA6E;AAC7E,6EAA6E;AAC7E,gFAAgF;AAChF,MAAM,aAAa,GAA2B;IAC5C,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;IACR,UAAU,EAAE,CAAC;CACd,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAa;IACzC,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,WAAW,EACT,yIAAyI;IAC3I,KAAK,CAAC,IAAI,EAAE,GAAG;QACb,MAAM,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;QACjB,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC;YAAE,OAAO;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;QAC/B,IAAI,CAAC,CAAC,CAAC,0BAA0B,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO;QACjF,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC;YAAE,OAAO;QAC/C,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;QAClC,MAAM,QAAQ,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO;QACnC,4EAA4E;QAC5E,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAAE,OAAO;QAErE,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO;QACjC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAAE,OAAO;QAEnE,MAAM,EAAE,GAAG,GAAG,CAAC,UAAU,CAAC;QAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAClC,GAAG,CAAC,MAAM,CAAC;YACT,QAAQ,EAAE,IAAI;YACd,IAAI,EAAE,IAAI;YACV,KAAK;YACL,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,KAAK;YAC/B,WAAW,EACT,SAAS,EAAE,qSAAqS;YAClT,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-handrolled-value-type-mirror.d.ts","sourceRoot":"","sources":["../../../src/rules/no-handrolled-value-type-mirror.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAe,MAAM,aAAa,CAAC;AAoCzD,eAAO,MAAM,2BAA2B,EAAE,QAiCzC,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { importsEastPackage } from "../east-source.js";
|
|
2
|
+
const NAME = "no-handrolled-value-type-mirror";
|
|
3
|
+
const CODE = 990028;
|
|
4
|
+
/** Is there a VALUE binding named `name` in this file (import or top-level
|
|
5
|
+
* declaration) whose TS type is an East type constructor (`StructType<…>`,
|
|
6
|
+
* `ArrayType<…>`, …)? Syntactic scan + one checker probe. */
|
|
7
|
+
function eastTypeValueInFile(name, ctx) {
|
|
8
|
+
const t = ctx.ts;
|
|
9
|
+
for (const stmt of ctx.sourceFile.statements) {
|
|
10
|
+
let ident;
|
|
11
|
+
if (t.isImportDeclaration(stmt) && stmt.importClause?.namedBindings !== undefined && t.isNamedImports(stmt.importClause.namedBindings)) {
|
|
12
|
+
for (const spec of stmt.importClause.namedBindings.elements) {
|
|
13
|
+
if (spec.name.text === name && !spec.isTypeOnly)
|
|
14
|
+
ident = spec.name;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
else if (t.isVariableStatement(stmt)) {
|
|
18
|
+
for (const d of stmt.declarationList.declarations) {
|
|
19
|
+
if (t.isIdentifier(d.name) && d.name.text === name)
|
|
20
|
+
ident = d.name;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
if (ident !== undefined) {
|
|
24
|
+
const type = ctx.checker.getTypeAtLocation(ident);
|
|
25
|
+
const typeName = type.aliasSymbol?.name ?? type.symbol?.name;
|
|
26
|
+
if (typeName !== undefined && typeName.endsWith("Type"))
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
// A hand-authored TS `interface Foo { … }` next to an East type value `FooType`
|
|
33
|
+
// is a parallel MIRROR of the decoded value shape — it drifts silently the
|
|
34
|
+
// moment the East type gains a field, and no compiler complains (a renderer
|
|
35
|
+
// shipped with three missing config fields exactly this way). Decoded shapes
|
|
36
|
+
// must be DERIVED: `type Foo = ValueTypeOf<typeof FooType>`.
|
|
37
|
+
export const noHandrolledValueTypeMirror = {
|
|
38
|
+
name: NAME,
|
|
39
|
+
code: CODE,
|
|
40
|
+
description: "A hand-authored interface mirroring an in-scope East type — derive it with ValueTypeOf<typeof XType> instead.",
|
|
41
|
+
check(node, ctx) {
|
|
42
|
+
const t = ctx.ts;
|
|
43
|
+
let name;
|
|
44
|
+
if (t.isInterfaceDeclaration(node)) {
|
|
45
|
+
name = node.name;
|
|
46
|
+
}
|
|
47
|
+
else if (t.isTypeAliasDeclaration(node) && t.isTypeLiteralNode(node.type)) {
|
|
48
|
+
name = node.name;
|
|
49
|
+
}
|
|
50
|
+
if (name === undefined)
|
|
51
|
+
return;
|
|
52
|
+
if (!importsEastPackage(ctx.sourceFile, t))
|
|
53
|
+
return;
|
|
54
|
+
const base = name.text.endsWith("Value") ? name.text.slice(0, -"Value".length) : name.text;
|
|
55
|
+
const counterpart = `${base}Type`;
|
|
56
|
+
if (counterpart === name.text)
|
|
57
|
+
return;
|
|
58
|
+
if (!eastTypeValueInFile(counterpart, ctx))
|
|
59
|
+
return;
|
|
60
|
+
const sf = ctx.sourceFile;
|
|
61
|
+
const start = name.getStart(sf);
|
|
62
|
+
ctx.report({
|
|
63
|
+
ruleName: NAME,
|
|
64
|
+
code: CODE,
|
|
65
|
+
start,
|
|
66
|
+
length: name.getEnd() - start,
|
|
67
|
+
messageText: `\`${name.text}\` hand-mirrors the East type \`${counterpart}\` — it drifts silently when the East type gains a field. Derive it: \`type ${name.text} = ValueTypeOf<typeof ${counterpart}>\`.`,
|
|
68
|
+
category: "suggestion",
|
|
69
|
+
});
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=no-handrolled-value-type-mirror.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-handrolled-value-type-mirror.js","sourceRoot":"","sources":["../../../src/rules/no-handrolled-value-type-mirror.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-host-comparison-on-east-values.d.ts","sourceRoot":"","sources":["../../../src/rules/no-host-comparison-on-east-values.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAY,MAAM,aAAa,CAAC;AAmCtD,eAAO,MAAM,4BAA4B,EAAE,QAkC1C,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { importsEastPackage } from "../east-source.js";
|
|
2
|
+
const NAME = "no-host-comparison-on-east-values";
|
|
3
|
+
const CODE = 990029;
|
|
4
|
+
// The DECODED-value shapes whose host comparison is broken: variants/options
|
|
5
|
+
// (tagged structs — `===` is reference equality, always false for two decoded
|
|
6
|
+
// values) and the sorted containers (no meaningful `<`). Same name-keyed
|
|
7
|
+
// recognition as `no-handrolled-variant`.
|
|
8
|
+
const VALUE_SHAPE_NAMES = new Set(["variant", "option", "SortedMap", "SortedSet"]);
|
|
9
|
+
function isEastValueShapeType(type) {
|
|
10
|
+
const seen = new Set();
|
|
11
|
+
const stack = [type];
|
|
12
|
+
while (stack.length > 0) {
|
|
13
|
+
const current = stack.pop();
|
|
14
|
+
if (current === undefined || seen.has(current))
|
|
15
|
+
continue;
|
|
16
|
+
seen.add(current);
|
|
17
|
+
const name = current.aliasSymbol?.name ?? current.symbol?.name;
|
|
18
|
+
if (name !== undefined && VALUE_SHAPE_NAMES.has(name))
|
|
19
|
+
return true;
|
|
20
|
+
if (current.isUnionOrIntersection())
|
|
21
|
+
stack.push(...current.types);
|
|
22
|
+
}
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
function isNullish(e, t) {
|
|
26
|
+
return e.kind === t.SyntaxKind.NullKeyword || (t.isIdentifier(e) && e.text === "undefined");
|
|
27
|
+
}
|
|
28
|
+
// Host code handling DECODED East values (a `ValueTypeOf<…>` world: variants,
|
|
29
|
+
// options, SortedMap/SortedSet) must compare with `equalFor(T)` / order with
|
|
30
|
+
// `compareFor(T)`/`lessFor(T)` — `===` compares object identity (always false
|
|
31
|
+
// for two decoded variants) and `<`/`>` compare the wrong representation.
|
|
32
|
+
// Nothing else covers host-side code: the block rules only see East blocks.
|
|
33
|
+
export const noHostComparisonOnEastValues = {
|
|
34
|
+
name: NAME,
|
|
35
|
+
code: CODE,
|
|
36
|
+
description: "Flag ===/!==/</> on decoded East values (variants, options, SortedMap/SortedSet) — use equalFor(T) / compareFor(T).",
|
|
37
|
+
check(node, ctx) {
|
|
38
|
+
const t = ctx.ts;
|
|
39
|
+
if (!t.isBinaryExpression(node))
|
|
40
|
+
return;
|
|
41
|
+
const k = t.SyntaxKind;
|
|
42
|
+
const op = node.operatorToken.kind;
|
|
43
|
+
const equality = op === k.EqualsEqualsEqualsToken || op === k.ExclamationEqualsEqualsToken || op === k.EqualsEqualsToken || op === k.ExclamationEqualsToken;
|
|
44
|
+
const relational = op === k.LessThanToken || op === k.LessThanEqualsToken || op === k.GreaterThanToken || op === k.GreaterThanEqualsToken;
|
|
45
|
+
if (!equality && !relational)
|
|
46
|
+
return;
|
|
47
|
+
if (!importsEastPackage(ctx.sourceFile, t))
|
|
48
|
+
return;
|
|
49
|
+
// `v === null` / `v !== undefined` are legitimate presence checks.
|
|
50
|
+
if (isNullish(node.left, t) || isNullish(node.right, t))
|
|
51
|
+
return;
|
|
52
|
+
const leftShaped = isEastValueShapeType(ctx.checker.getTypeAtLocation(node.left));
|
|
53
|
+
const rightShaped = isEastValueShapeType(ctx.checker.getTypeAtLocation(node.right));
|
|
54
|
+
if (!leftShaped && !rightShaped)
|
|
55
|
+
return;
|
|
56
|
+
const sf = ctx.sourceFile;
|
|
57
|
+
const start = node.getStart(sf);
|
|
58
|
+
ctx.report({
|
|
59
|
+
ruleName: NAME,
|
|
60
|
+
code: CODE,
|
|
61
|
+
start,
|
|
62
|
+
length: node.getEnd() - start,
|
|
63
|
+
messageText: equality
|
|
64
|
+
? "Host equality on a decoded East value compares object identity — two equal variants are never `===`. Use `equalFor(T)(a, b)`."
|
|
65
|
+
: "Host ordering on a decoded East value compares the wrong representation. Use `compareFor(T)` / `lessFor(T)` (e.g. `arr.sort(compareFor(T))`).",
|
|
66
|
+
category: "warning",
|
|
67
|
+
});
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
//# sourceMappingURL=no-host-comparison-on-east-values.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-host-comparison-on-east-values.js","sourceRoot":"","sources":["../../../src/rules/no-host-comparison-on-east-values.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-host-in-east-block.d.ts","sourceRoot":"","sources":["../../../src/rules/no-host-in-east-block.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAyB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"no-host-in-east-block.d.ts","sourceRoot":"","sources":["../../../src/rules/no-host-in-east-block.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAyB,MAAM,aAAa,CAAC;AAsQnE,eAAO,MAAM,iBAAiB,EAAE,QAuH/B,CAAC"}
|