@elaraai/east-diagnostics 1.0.13 → 1.0.15

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.
Files changed (51) hide show
  1. package/README.md +21 -4
  2. package/dist/src/east-ir.d.ts +23 -0
  3. package/dist/src/east-ir.d.ts.map +1 -0
  4. package/dist/src/east-ir.js +55 -0
  5. package/dist/src/east-ir.js.map +1 -0
  6. package/dist/src/east-source.d.ts +18 -0
  7. package/dist/src/east-source.d.ts.map +1 -0
  8. package/dist/src/east-source.js +68 -0
  9. package/dist/src/east-source.js.map +1 -0
  10. package/dist/src/rules/index.d.ts +4 -1
  11. package/dist/src/rules/index.d.ts.map +1 -1
  12. package/dist/src/rules/index.js +16 -3
  13. package/dist/src/rules/index.js.map +1 -1
  14. package/dist/src/rules/no-compile-time-data-injection.d.ts +3 -0
  15. package/dist/src/rules/no-compile-time-data-injection.d.ts.map +1 -0
  16. package/dist/src/rules/no-compile-time-data-injection.js +107 -0
  17. package/dist/src/rules/no-compile-time-data-injection.js.map +1 -0
  18. package/dist/src/rules/no-compile-time-seed-data.d.ts +3 -0
  19. package/dist/src/rules/no-compile-time-seed-data.d.ts.map +1 -0
  20. package/dist/src/rules/no-compile-time-seed-data.js +209 -0
  21. package/dist/src/rules/no-compile-time-seed-data.js.map +1 -0
  22. package/dist/src/rules/no-host-in-east-block.d.ts +3 -0
  23. package/dist/src/rules/no-host-in-east-block.d.ts.map +1 -0
  24. package/dist/src/rules/no-host-in-east-block.js +266 -0
  25. package/dist/src/rules/no-host-in-east-block.js.map +1 -0
  26. package/dist/src/rules/no-let-const-in-expression.d.ts.map +1 -1
  27. package/dist/src/rules/no-let-const-in-expression.js +11 -10
  28. package/dist/src/rules/no-let-const-in-expression.js.map +1 -1
  29. package/dist/src/rules/no-module-scope-east-macro.d.ts +3 -0
  30. package/dist/src/rules/no-module-scope-east-macro.d.ts.map +1 -0
  31. package/dist/src/rules/no-module-scope-east-macro.js +150 -0
  32. package/dist/src/rules/no-module-scope-east-macro.js.map +1 -0
  33. package/dist/src/rules/no-redundant-east-cast.d.ts.map +1 -1
  34. package/dist/src/rules/no-redundant-east-cast.js +62 -24
  35. package/dist/src/rules/no-redundant-east-cast.js.map +1 -1
  36. package/dist/src/rules/no-relative-src-import.d.ts.map +1 -1
  37. package/dist/src/rules/no-relative-src-import.js +9 -2
  38. package/dist/src/rules/no-relative-src-import.js.map +1 -1
  39. package/dist/src/rules/no-unexecuted-east-expression.d.ts +4 -0
  40. package/dist/src/rules/no-unexecuted-east-expression.d.ts.map +1 -1
  41. package/dist/src/rules/no-unexecuted-east-expression.js +2 -12
  42. package/dist/src/rules/no-unexecuted-east-expression.js.map +1 -1
  43. package/dist/src/tsserver-plugin.d.ts +4 -0
  44. package/dist/src/tsserver-plugin.d.ts.map +1 -1
  45. package/dist/src/tsserver-plugin.js +15 -42
  46. package/dist/src/tsserver-plugin.js.map +1 -1
  47. package/package.json +3 -2
  48. package/dist/src/rules/no-east-data-builder-helper.d.ts +0 -3
  49. package/dist/src/rules/no-east-data-builder-helper.d.ts.map +0 -1
  50. package/dist/src/rules/no-east-data-builder-helper.js +0 -90
  51. package/dist/src/rules/no-east-data-builder-helper.js.map +0 -1
@@ -0,0 +1,150 @@
1
+ import { isEastExprType, isBlockBuilderType } from "../east-type.js";
2
+ import { insideBlockScope } from "../block-scope.js";
3
+ import { chainRootReceiver } from "../east-ir.js";
4
+ import { importsEastPackage } from "../east-source.js";
5
+ const NAME = "no-module-scope-east-macro";
6
+ const CODE = 990011;
7
+ const VALUE_CONSTRUCTORS = new Set(["variant", "some"]);
8
+ function unparen(e, t) {
9
+ let cur = e;
10
+ while (t.isParenthesizedExpression(cur))
11
+ cur = cur.expression;
12
+ return cur;
13
+ }
14
+ function isJsx(node, t) {
15
+ return t.isJsxElement(node) || t.isJsxFragment(node) || t.isJsxSelfClosingElement(node) || (t.isParenthesizedExpression(node) && isJsx(node.expression, t));
16
+ }
17
+ // An untagged template literal with interpolation — `\`${o}|${l}\`` (a composite
18
+ // string key); `East.str\`…\`` is a tagged template and is NOT matched.
19
+ function isHostTemplate(e, t) {
20
+ return t.isTemplateExpression(unparen(e, t));
21
+ }
22
+ function isEastValueConstructor(expr, t) {
23
+ if (t.isCallExpression(expr)) {
24
+ const callee = expr.expression;
25
+ if (t.isIdentifier(callee) && VALUE_CONSTRUCTORS.has(callee.text))
26
+ return true;
27
+ return (t.isPropertyAccessExpression(callee) && t.isIdentifier(callee.expression) && callee.expression.text === "East" && callee.name.text === "value");
28
+ }
29
+ return t.isIdentifier(expr) && expr.text === "none";
30
+ }
31
+ function isEastBuilderCall(call, ctx) {
32
+ const t = ctx.ts;
33
+ const callee = call.expression;
34
+ if (t.isIdentifier(callee) && VALUE_CONSTRUCTORS.has(callee.text))
35
+ return true;
36
+ const root = chainRootReceiver(callee, ctx);
37
+ if (t.isIdentifier(root) && root.text === "East")
38
+ return true;
39
+ return isBlockBuilderType(ctx.checker.getTypeAtLocation(root));
40
+ }
41
+ function containsEastBuilder(expr, ctx) {
42
+ const t = ctx.ts;
43
+ let found = false;
44
+ const visit = (n) => {
45
+ if (found)
46
+ return;
47
+ if (t.isCallExpression(n) && isEastBuilderCall(n, ctx)) {
48
+ found = true;
49
+ return;
50
+ }
51
+ t.forEachChild(n, visit);
52
+ };
53
+ visit(expr);
54
+ return found;
55
+ }
56
+ function returnBuildsEast(r, ctx) {
57
+ const t = ctx.ts;
58
+ if (isJsx(r, t))
59
+ return false;
60
+ if (isEastValueConstructor(r, t))
61
+ return true;
62
+ if (isEastExprType(ctx.checker.getTypeAtLocation(r)))
63
+ return true;
64
+ const root = chainRootReceiver(r, ctx);
65
+ const rootType = ctx.checker.getTypeAtLocation(root);
66
+ if (isEastExprType(rootType) || isBlockBuilderType(rootType))
67
+ return true;
68
+ return containsEastBuilder(r, ctx);
69
+ }
70
+ function returnExpressions(fn, t) {
71
+ if (fn.body === undefined)
72
+ return [];
73
+ if (!t.isBlock(fn.body))
74
+ return [fn.body];
75
+ const out = [];
76
+ const visit = (n) => {
77
+ if (t.isFunctionDeclaration(n) || t.isFunctionExpression(n) || t.isArrowFunction(n))
78
+ return;
79
+ if (t.isReturnStatement(n) && n.expression !== undefined)
80
+ out.push(n.expression);
81
+ t.forEachChild(n, visit);
82
+ };
83
+ t.forEachChild(fn.body, visit);
84
+ return out;
85
+ }
86
+ // A module-scope (outside any East block) TS helper whose every return builds East
87
+ // IR (`variant`/`some`/`none`/`East.value`/an `Expr` chain) OR builds a composite
88
+ // string key from a host template literal (`(o, l) => \`${o}|${l}\``) is an
89
+ // authoring-time macro and the signature of a string-keyed / hand-built-IR data
90
+ // model. It cannot be serialized/recursed and expands inline at each call. Make it
91
+ // a real `East.function`, or model the data with typed keys / nested East
92
+ // structures. (In-block TS closures are flagged by `no-host-in-east-block`; this
93
+ // rule covers the module-scope helpers that the block-scoped rule cannot see.)
94
+ export const noModuleScopeEastMacro = {
95
+ name: NAME,
96
+ code: CODE,
97
+ description: "Flag a module-scope TS helper that builds East values/IR or a composite string key — make it a real East.function or model typed/nested East data.",
98
+ check(node, ctx) {
99
+ const t = ctx.ts;
100
+ // Only in East/e3 source — a plain string-key helper in ordinary TypeScript is
101
+ // not our concern (the East-IR arm already implies an `@elaraai/*` import; this
102
+ // gates the composite-key heuristic against non-East code).
103
+ if (!importsEastPackage(ctx.sourceFile, t))
104
+ return;
105
+ let fn;
106
+ let reportNode;
107
+ if (t.isFunctionDeclaration(node) && node.body !== undefined) {
108
+ fn = node;
109
+ reportNode = node.name ?? node;
110
+ }
111
+ else if (t.isVariableDeclaration(node) &&
112
+ node.initializer !== undefined &&
113
+ (t.isArrowFunction(node.initializer) || t.isFunctionExpression(node.initializer))) {
114
+ fn = node.initializer;
115
+ reportNode = node.name;
116
+ }
117
+ if (fn === undefined || reportNode === undefined)
118
+ return;
119
+ // In-block closures are `no-host-in-east-block`'s job; this rule is for the
120
+ // module-scope macros it can't see.
121
+ if (insideBlockScope(fn, ctx))
122
+ return;
123
+ // East block callbacks (`($, x) => …`) are not TS helpers.
124
+ const first = fn.parameters[0];
125
+ if (first !== undefined && isBlockBuilderType(ctx.checker.getTypeAtLocation(first.name)))
126
+ return;
127
+ const rs = returnExpressions(fn, t);
128
+ if (rs.some((r) => isJsx(r, t)))
129
+ return; // UI-composition helper
130
+ if (rs.length === 0)
131
+ return;
132
+ const everyBuildsEast = rs.every((r) => returnBuildsEast(r, ctx));
133
+ const everyHostKey = rs.every((r) => isHostTemplate(r, t));
134
+ if (!everyBuildsEast && !everyHostKey)
135
+ return;
136
+ const sf = ctx.sourceFile;
137
+ const start = reportNode.getStart(sf);
138
+ ctx.report({
139
+ ruleName: NAME,
140
+ code: CODE,
141
+ start,
142
+ length: reportNode.getEnd() - start,
143
+ messageText: everyHostKey
144
+ ? "This helper builds a composite string key from a host template literal — the signature of a string-keyed data model. Model the data with typed keys / nested East structures instead."
145
+ : "This module-scope TS helper builds East values/IR — an authoring-time macro that expands inline and can't be serialized. Make it a real `East.function`, or inline it.",
146
+ category: "warning",
147
+ });
148
+ },
149
+ };
150
+ //# sourceMappingURL=no-module-scope-east-macro.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-module-scope-east-macro.js","sourceRoot":"","sources":["../../../src/rules/no-module-scope-east-macro.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"no-redundant-east-cast.d.ts","sourceRoot":"","sources":["../../../src/rules/no-redundant-east-cast.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAU5C,eAAO,MAAM,mBAAmB,EAAE,QAkCjC,CAAC"}
1
+ {"version":3,"file":"no-redundant-east-cast.d.ts","sourceRoot":"","sources":["../../../src/rules/no-redundant-east-cast.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAyB,MAAM,aAAa,CAAC;AAuCnE,eAAO,MAAM,mBAAmB,EAAE,QAgEjC,CAAC"}
@@ -1,44 +1,82 @@
1
1
  import { matchBlockBuilderCall } from "../block-builder.js";
2
2
  const NAME = "no-redundant-east-cast";
3
3
  const CODE = 990001;
4
+ /** Is `expr` exactly an `East.value(...)` call (not `East.value(...).foo`)? */
5
+ function isEastValueCall(expr, t) {
6
+ if (!t.isCallExpression(expr))
7
+ return false;
8
+ const callee = expr.expression;
9
+ return (t.isPropertyAccessExpression(callee) &&
10
+ t.isIdentifier(callee.expression) &&
11
+ callee.expression.text === "East" &&
12
+ callee.name.text === "value");
13
+ }
14
+ function report(ctx, target, messageText, fixDescription, newText) {
15
+ const sf = ctx.sourceFile;
16
+ const start = target.getStart(sf);
17
+ const length = target.getEnd() - start;
18
+ ctx.report({
19
+ ruleName: NAME,
20
+ code: CODE,
21
+ start,
22
+ length,
23
+ messageText,
24
+ category: "warning",
25
+ fix: { description: fixDescription, changes: [{ start, length, newText }] },
26
+ });
27
+ }
4
28
  // `$.let` / `$.const` two-arg overload is `(<T>(expr: SubtypeExprOrValue<NoInfer<T>>, type: T) => ...)`:
5
- // `NoInfer<T>` makes the East type argument drive inference, so a TS cast on the
6
- // value is dead weight. (The one-arg overload infers from the value, where a
7
- // cast *would* matter — hence we only fire when the type argument is present.)
29
+ // `NoInfer<T>` makes the East type argument drive inference, so any TS type info on
30
+ // the value is dead weight — a cast (`as …`/`<…>`), a constructor's generic
31
+ // arguments (`new Map<K, V>()`), or an `East.value(x, T)` wrapper (the East type
32
+ // belongs on `$.let`/`$.const`, not duplicated inside). Each restates a type the
33
+ // East argument already governs and can silently drift from it.
8
34
  export const noRedundantEastCast = {
9
35
  name: NAME,
10
36
  code: CODE,
11
- description: "Disallow a TypeScript cast on the value argument of $.let/$.const when the East type argument is present (the type argument already drives inference).",
37
+ description: "Disallow TypeScript type info on the value of $.let/$.const that the East type argument already governs (a cast, `new Map<K,V>()` generics, or an `East.value(x,T)` wrapper).",
12
38
  check(node, ctx) {
13
39
  const match = matchBlockBuilderCall(node, ctx);
14
- if (match === undefined || match.args.length < 2)
40
+ if (match === undefined)
15
41
  return;
16
42
  const t = ctx.ts;
17
43
  const value = match.args[0];
18
44
  if (value === undefined)
19
45
  return;
20
- let inner;
46
+ const sf = ctx.sourceFile;
47
+ // Arm B — `East.value(x, T)` as the WHOLE first arg (not a sub-term like
48
+ // `East.value(1.0).divide(x)`): the East type belongs on `$.let`/`$.const`.
49
+ // Lift the value (and the type, from whichever of $.let / East.value carries
50
+ // it) up so the binding reads `$.let(x, T)`.
51
+ if (isEastValueCall(value, t)) {
52
+ const inner = value.arguments[0];
53
+ if (inner === undefined)
54
+ return;
55
+ const typeArg = match.args[1] ?? value.arguments[1];
56
+ const receiverText = match.call.expression.getText(sf);
57
+ const newText = `${receiverText}(${inner.getText(sf)}${typeArg !== undefined ? `, ${typeArg.getText(sf)}` : ""})`;
58
+ report(ctx, match.call, `Redundant \`East.value(...)\` inside \`$.${match.method}\`: pass the value (and its East type) to \`$.${match.method}\` directly.`, "Lift the value and type out of East.value(...)", newText);
59
+ return;
60
+ }
61
+ // The remaining arms need the explicit East type argument present (the one-arg
62
+ // overload infers from the value, where TS type info would matter).
63
+ if (match.args.length < 2)
64
+ return;
65
+ // Existing arm — a TS cast on the value.
66
+ let cast;
21
67
  if (t.isAsExpression(value))
22
- inner = value.expression;
68
+ cast = value.expression;
23
69
  else if (t.isTypeAssertionExpression(value))
24
- inner = value.expression;
25
- if (inner === undefined)
70
+ cast = value.expression;
71
+ if (cast !== undefined) {
72
+ report(ctx, value, `Redundant cast: \`$.${match.method}\` infers the value type from the East type argument; drop the \`as …\` on the value.`, "Remove redundant cast", cast.getText(sf));
26
73
  return;
27
- const sf = ctx.sourceFile;
28
- const start = value.getStart(sf);
29
- const length = value.getEnd() - start;
30
- ctx.report({
31
- ruleName: NAME,
32
- code: CODE,
33
- start,
34
- length,
35
- messageText: `Redundant cast: \`$.${match.method}\` infers the value type from the East type argument; drop the \`as …\` on the value.`,
36
- category: "warning",
37
- fix: {
38
- description: "Remove redundant cast",
39
- changes: [{ start, length, newText: inner.getText(sf) }],
40
- },
41
- });
74
+ }
75
+ // Arm A — redundant constructor generics, `new Map<K, V>()` / `new Set<T>()`.
76
+ if (t.isNewExpression(value) && value.typeArguments !== undefined && value.typeArguments.length > 0) {
77
+ const ctorArgs = (value.arguments ?? []).map((a) => a.getText(sf)).join(", ");
78
+ report(ctx, value, `Redundant type arguments: \`$.${match.method}\` infers the value type from the East type argument; drop the \`<…>\` on \`new ${value.expression.getText(sf)}\`.`, "Remove redundant constructor type arguments", `new ${value.expression.getText(sf)}(${ctorArgs})`);
79
+ }
42
80
  },
43
81
  };
44
82
  //# sourceMappingURL=no-redundant-east-cast.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"no-redundant-east-cast.js","sourceRoot":"","sources":["../../../src/rules/no-redundant-east-cast.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,MAAM,IAAI,GAAG,wBAAwB,CAAC;AACtC,MAAM,IAAI,GAAG,MAAM,CAAC;AAEpB,yGAAyG;AACzG,iFAAiF;AACjF,6EAA6E;AAC7E,+EAA+E;AAC/E,MAAM,CAAC,MAAM,mBAAmB,GAAa;IAC3C,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,WAAW,EACT,wJAAwJ;IAC1J,KAAK,CAAC,IAAI,EAAE,GAAG;QACb,MAAM,KAAK,GAAG,qBAAqB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC/C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO;QAEzD,MAAM,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO;QAEhC,IAAI,KAAgC,CAAC;QACrC,IAAI,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC;YAAE,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC;aACjD,IAAI,CAAC,CAAC,yBAAyB,CAAC,KAAK,CAAC;YAAE,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC;QACtE,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO;QAEhC,MAAM,EAAE,GAAG,GAAG,CAAC,UAAU,CAAC;QAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC;QACtC,GAAG,CAAC,MAAM,CAAC;YACT,QAAQ,EAAE,IAAI;YACd,IAAI,EAAE,IAAI;YACV,KAAK;YACL,MAAM;YACN,WAAW,EAAE,uBAAuB,KAAK,CAAC,MAAM,uFAAuF;YACvI,QAAQ,EAAE,SAAS;YACnB,GAAG,EAAE;gBACH,WAAW,EAAE,uBAAuB;gBACpC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;aACzD;SACF,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"no-redundant-east-cast.js","sourceRoot":"","sources":["../../../src/rules/no-redundant-east-cast.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"no-relative-src-import.d.ts","sourceRoot":"","sources":["../../../src/rules/no-relative-src-import.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAW5C,eAAO,MAAM,mBAAmB,EAAE,QA6BjC,CAAC"}
1
+ {"version":3,"file":"no-relative-src-import.d.ts","sourceRoot":"","sources":["../../../src/rules/no-relative-src-import.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAe5C,eAAO,MAAM,mBAAmB,EAAE,QA+BjC,CAAC"}
@@ -1,10 +1,14 @@
1
+ import { resolvesWithinOwnPackage } from "../east-source.js";
1
2
  const NAME = "no-relative-src-import";
2
3
  const CODE = 990007;
3
4
  const DEEP_PACKAGE_SRC = /^@elaraai\/[^/]+\/src(\/|$)/;
4
5
  const RELATIVE_SRC = /\/src(\/|$)/;
5
6
  // Tests and examples must import East packages by their published name
6
- // (`@elaraai/east`), not reach into a package's `src/` via a relative path or a
7
- // deep `/src` specifier — those bypass the package's public API surface.
7
+ // (`@elaraai/east`), not reach into ANOTHER package's `src/` via a relative path or
8
+ // a deep `/src` specifier — those bypass the package's public API surface. A
9
+ // package importing its OWN `src` relatively (`../src/index.js` from its tests) is
10
+ // the one legitimate case — it cannot import its own published name — so the
11
+ // relative branch is exempt when the path stays inside the importing package.
8
12
  export const noRelativeSrcImport = {
9
13
  name: NAME,
10
14
  code: CODE,
@@ -25,6 +29,9 @@ export const noRelativeSrcImport = {
25
29
  const deepPackageSrc = DEEP_PACKAGE_SRC.test(text);
26
30
  if (!relativeIntoSrc && !deepPackageSrc)
27
31
  return;
32
+ // A package importing its OWN `src` relatively is the one legitimate case.
33
+ if (relativeIntoSrc && !deepPackageSrc && resolvesWithinOwnPackage(ctx.sourceFile.fileName, text))
34
+ return;
28
35
  const sf = ctx.sourceFile;
29
36
  const start = specifier.getStart(sf);
30
37
  ctx.report({
@@ -1 +1 @@
1
- {"version":3,"file":"no-relative-src-import.js","sourceRoot":"","sources":["../../../src/rules/no-relative-src-import.ts"],"names":[],"mappings":"AAOA,MAAM,IAAI,GAAG,wBAAwB,CAAC;AACtC,MAAM,IAAI,GAAG,MAAM,CAAC;AAEpB,MAAM,gBAAgB,GAAG,6BAA6B,CAAC;AACvD,MAAM,YAAY,GAAG,aAAa,CAAC;AAEnC,uEAAuE;AACvE,gFAAgF;AAChF,yEAAyE;AACzE,MAAM,CAAC,MAAM,mBAAmB,GAAa;IAC3C,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,WAAW,EAAE,6EAA6E;IAC1F,KAAK,CAAC,IAAI,EAAE,GAAG;QACb,MAAM,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;QACjB,IAAI,SAAoC,CAAC;QACzC,IAAI,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC;YAAE,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC;aAC7D,IAAI,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC;YAAE,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC;;YAClE,OAAO;QAEZ,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC;YAAE,OAAO;QACrE,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;QAC5B,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxE,MAAM,cAAc,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,eAAe,IAAI,CAAC,cAAc;YAAE,OAAO;QAEhD,MAAM,EAAE,GAAG,GAAG,CAAC,UAAU,CAAC;QAC1B,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACrC,GAAG,CAAC,MAAM,CAAC;YACT,QAAQ,EAAE,IAAI;YACd,IAAI,EAAE,IAAI;YACV,KAAK;YACL,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,GAAG,KAAK;YAClC,WAAW,EACT,gIAAgI;YAClI,QAAQ,EAAE,SAAS;SACpB,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"no-relative-src-import.js","sourceRoot":"","sources":["../../../src/rules/no-relative-src-import.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAE7D,MAAM,IAAI,GAAG,wBAAwB,CAAC;AACtC,MAAM,IAAI,GAAG,MAAM,CAAC;AAEpB,MAAM,gBAAgB,GAAG,6BAA6B,CAAC;AACvD,MAAM,YAAY,GAAG,aAAa,CAAC;AAEnC,uEAAuE;AACvE,oFAAoF;AACpF,6EAA6E;AAC7E,mFAAmF;AACnF,6EAA6E;AAC7E,8EAA8E;AAC9E,MAAM,CAAC,MAAM,mBAAmB,GAAa;IAC3C,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,WAAW,EAAE,6EAA6E;IAC1F,KAAK,CAAC,IAAI,EAAE,GAAG;QACb,MAAM,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;QACjB,IAAI,SAAoC,CAAC;QACzC,IAAI,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC;YAAE,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC;aAC7D,IAAI,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC;YAAE,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC;;YAClE,OAAO;QAEZ,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC;YAAE,OAAO;QACrE,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;QAC5B,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxE,MAAM,cAAc,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,eAAe,IAAI,CAAC,cAAc;YAAE,OAAO;QAChD,2EAA2E;QAC3E,IAAI,eAAe,IAAI,CAAC,cAAc,IAAI,wBAAwB,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC;YAAE,OAAO;QAE1G,MAAM,EAAE,GAAG,GAAG,CAAC,UAAU,CAAC;QAC1B,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACrC,GAAG,CAAC,MAAM,CAAC;YACT,QAAQ,EAAE,IAAI;YACd,IAAI,EAAE,IAAI;YACV,KAAK;YACL,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,GAAG,KAAK;YAClC,WAAW,EACT,gIAAgI;YAClI,QAAQ,EAAE,SAAS;SACpB,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -1,3 +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
+ */
1
5
  import type { EastRule } from "../types.js";
2
6
  export declare const noUnexecutedEastExpression: EastRule;
3
7
  //# sourceMappingURL=no-unexecuted-east-expression.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"no-unexecuted-east-expression.d.ts","sourceRoot":"","sources":["../../../src/rules/no-unexecuted-east-expression.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAY5C,eAAO,MAAM,0BAA0B,EAAE,QAuCxC,CAAC"}
1
+ {"version":3,"file":"no-unexecuted-east-expression.d.ts","sourceRoot":"","sources":["../../../src/rules/no-unexecuted-east-expression.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAa5C,eAAO,MAAM,0BAA0B,EAAE,QA8BxC,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { isEastExprType, isBlockBuilderType } from "../east-type.js";
2
+ import { chainRootReceiver } from "../east-ir.js";
2
3
  const NAME = "no-unexecuted-east-expression";
3
4
  const CODE = 990009;
4
5
  // A bare expression statement whose value is an East `Expr` is dead: East
@@ -19,18 +20,7 @@ export const noUnexecutedEastExpression = {
19
20
  // Exclude any statement rooted in the block builder `$`: `$(...)`, `$.if(...)`,
20
21
  // chained `$.if(...).else(...)`, `$.try(...).catch(...)`, etc. Walk down the
21
22
  // call/member chain to its base receiver and check that.
22
- let root = expr;
23
- for (;;) {
24
- if (t.isCallExpression(root)) {
25
- root = root.expression;
26
- }
27
- else if (t.isPropertyAccessExpression(root) || t.isElementAccessExpression(root)) {
28
- root = root.expression;
29
- }
30
- else {
31
- break;
32
- }
33
- }
23
+ const root = chainRootReceiver(expr, ctx);
34
24
  if (isBlockBuilderType(ctx.checker.getTypeAtLocation(root)))
35
25
  return;
36
26
  if (!isEastExprType(ctx.checker.getTypeAtLocation(expr)))
@@ -1 +1 @@
1
- {"version":3,"file":"no-unexecuted-east-expression.js","sourceRoot":"","sources":["../../../src/rules/no-unexecuted-east-expression.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErE,MAAM,IAAI,GAAG,+BAA+B,CAAC;AAC7C,MAAM,IAAI,GAAG,MAAM,CAAC;AAEpB,0EAA0E;AAC1E,8EAA8E;AAC9E,0EAA0E;AAC1E,+EAA+E;AAC/E,0EAA0E;AAC1E,gEAAgE;AAChE,MAAM,CAAC,MAAM,0BAA0B,GAAa;IAClD,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,WAAW,EACT,oGAAoG;IACtG,KAAK,CAAC,IAAI,EAAE,GAAG;QACb,MAAM,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;QACjB,IAAI,CAAC,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC;YAAE,OAAO;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC;QAE7B,gFAAgF;QAChF,6EAA6E;QAC7E,yDAAyD;QACzD,IAAI,IAAI,GAAY,IAAI,CAAC;QACzB,SAAS,CAAC;YACR,IAAI,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7B,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC;YACzB,CAAC;iBAAM,IAAI,CAAC,CAAC,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,yBAAyB,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnF,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACN,MAAM;YACR,CAAC;QACH,CAAC;QACD,IAAI,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO;QAEpE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO;QAEjE,MAAM,EAAE,GAAG,GAAG,CAAC,UAAU,CAAC;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAChC,GAAG,CAAC,MAAM,CAAC;YACT,QAAQ,EAAE,IAAI;YACd,IAAI,EAAE,IAAI;YACV,KAAK;YACL,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK;YAC7B,WAAW,EACT,0JAA0J;YAC5J,QAAQ,EAAE,SAAS;SACpB,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"no-unexecuted-east-expression.js","sourceRoot":"","sources":["../../../src/rules/no-unexecuted-east-expression.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,MAAM,IAAI,GAAG,+BAA+B,CAAC;AAC7C,MAAM,IAAI,GAAG,MAAM,CAAC;AAEpB,0EAA0E;AAC1E,8EAA8E;AAC9E,0EAA0E;AAC1E,+EAA+E;AAC/E,0EAA0E;AAC1E,gEAAgE;AAChE,MAAM,CAAC,MAAM,0BAA0B,GAAa;IAClD,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,WAAW,EACT,oGAAoG;IACtG,KAAK,CAAC,IAAI,EAAE,GAAG;QACb,MAAM,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;QACjB,IAAI,CAAC,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC;YAAE,OAAO;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC;QAE7B,gFAAgF;QAChF,6EAA6E;QAC7E,yDAAyD;QACzD,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC1C,IAAI,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO;QAEpE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO;QAEjE,MAAM,EAAE,GAAG,GAAG,CAAC,UAAU,CAAC;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAChC,GAAG,CAAC,MAAM,CAAC;YACT,QAAQ,EAAE,IAAI;YACd,IAAI,EAAE,IAAI;YACV,KAAK;YACL,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK;YAC7B,WAAW,EACT,0JAA0J;YAC5J,QAAQ,EAAE,SAAS;SACpB,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -1,3 +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
+ */
1
5
  import type * as ts from "typescript";
2
6
  import type { TsModule } from "./types.js";
3
7
  /** Structural subset of `ts.server.PluginCreateInfo` — keeps the package free
@@ -1 +1 @@
1
- {"version":3,"file":"tsserver-plugin.d.ts","sourceRoot":"","sources":["../../src/tsserver-plugin.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAW3C;2CAC2C;AAC3C,MAAM,WAAW,wBAAwB;IACvC,eAAe,EAAE,EAAE,CAAC,eAAe,CAAC;IACpC,OAAO,EAAE;QAAE,mBAAmB,IAAI,MAAM,CAAA;KAAE,CAAC;IAC3C,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAC;CAC3C;AA8BD;;;;GAIG;AACH,wBAAgB,IAAI,CAAC,OAAO,EAAE;IAAE,UAAU,EAAE,QAAQ,CAAA;CAAE,GAAG;IAAE,MAAM,CAAC,IAAI,EAAE,wBAAwB,GAAG,EAAE,CAAC,eAAe,CAAA;CAAE,CAuDtH;AAED,eAAe,IAAI,CAAC"}
1
+ {"version":3,"file":"tsserver-plugin.d.ts","sourceRoot":"","sources":["../../src/tsserver-plugin.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAW3C;2CAC2C;AAC3C,MAAM,WAAW,wBAAwB;IACvC,eAAe,EAAE,EAAE,CAAC,eAAe,CAAC;IACpC,OAAO,EAAE;QAAE,mBAAmB,IAAI,MAAM,CAAA;KAAE,CAAC;IAC3C,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAC;CAC3C;AAQD;;;;GAIG;AACH,wBAAgB,IAAI,CAAC,OAAO,EAAE;IAAE,UAAU,EAAE,QAAQ,CAAA;CAAE,GAAG;IAAE,MAAM,CAAC,IAAI,EAAE,wBAAwB,GAAG,EAAE,CAAC,eAAe,CAAA;CAAE,CAyDtH;AAED,eAAe,IAAI,CAAC"}
@@ -1,9 +1,3 @@
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 { existsSync, readFileSync } from "node:fs";
6
- import { dirname, join, resolve } from "node:path";
7
1
  import { runEastRules } from "./run.js";
8
2
  import { getEastModule } from "./east-module.js";
9
3
  import { ASSIGNABILITY_CODES, rewriteEastAssignability } from "./type-diff-rewrite.js";
@@ -12,29 +6,6 @@ const CATEGORY = {
12
6
  warning: "Warning",
13
7
  suggestion: "Suggestion",
14
8
  };
15
- // First-party @elaraai/* library src legitimately uses East-construction
16
- // patterns the rules flag (every component factory looks like the
17
- // data-builder antipattern) — same editor policy as the Claude plugin hook.
18
- function isElaraaiPackageSrc(filePath) {
19
- const file = resolve(filePath);
20
- let dir = dirname(file);
21
- for (;;) {
22
- const candidate = join(dir, "package.json");
23
- if (existsSync(candidate)) {
24
- try {
25
- const name = JSON.parse(readFileSync(candidate, "utf-8")).name;
26
- return typeof name === "string" && name.startsWith("@elaraai/") && file.startsWith(join(dir, "src") + "/");
27
- }
28
- catch {
29
- return false;
30
- }
31
- }
32
- const parent = dirname(dir);
33
- if (parent === dir)
34
- return false;
35
- dir = parent;
36
- }
37
- }
38
9
  /**
39
10
  * tsserver plugin factory. Loaded by the TypeScript server via a
40
11
  * `typescriptServerPlugins` contribution (VS Code) or a tsconfig
@@ -64,19 +35,21 @@ export function init(modules) {
64
35
  const rewritten = rewriteEastAssignability(t, program, sourceFile, d, east);
65
36
  return rewritten === undefined ? d : { ...d, messageText: rewritten };
66
37
  });
67
- if (!isElaraaiPackageSrc(fileName)) {
68
- const ruleDiagnostics = runEastRules(t, program, sourceFile, program.getTypeChecker(), info.config?.disabled !== undefined ? { disabled: info.config.disabled } : {});
69
- for (const d of ruleDiagnostics) {
70
- diagnostics.push({
71
- file: sourceFile,
72
- start: d.start,
73
- length: d.length,
74
- messageText: `${d.messageText} (${d.ruleName})`,
75
- category: t.DiagnosticCategory[CATEGORY[d.category]],
76
- code: d.code,
77
- source: "east",
78
- });
79
- }
38
+ // The rules self-gate on East-ness (an East type/block/e3 construct, or
39
+ // an `@elaraai/*` import), so they only fire where there is actually East
40
+ // code — no package-identity restriction. Per-project suppression is the
41
+ // `disabled` config, like any linter.
42
+ const ruleDiagnostics = runEastRules(t, program, sourceFile, program.getTypeChecker(), info.config?.disabled !== undefined ? { disabled: info.config.disabled } : {});
43
+ for (const d of ruleDiagnostics) {
44
+ diagnostics.push({
45
+ file: sourceFile,
46
+ start: d.start,
47
+ length: d.length,
48
+ messageText: `${d.messageText} (${d.ruleName})`,
49
+ category: t.DiagnosticCategory[CATEGORY[d.category]],
50
+ code: d.code,
51
+ source: "east",
52
+ });
80
53
  }
81
54
  return diagnostics;
82
55
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tsserver-plugin.js","sourceRoot":"","sources":["../../src/tsserver-plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tsserver-plugin.js","sourceRoot":"","sources":["../../src/tsserver-plugin.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elaraai/east-diagnostics",
3
- "version": "1.0.13",
3
+ "version": "1.0.15",
4
4
  "license": "AGPL-3.0-or-later",
5
5
  "type": "module",
6
6
  "description": "East-aware diagnostic rules over the TypeScript checker — one shared engine for the editor (tsserver plugin), the agent (headless daemon), and CI.",
@@ -44,7 +44,8 @@
44
44
  "devDependencies": {
45
45
  "@types/node": "^22.18.1",
46
46
  "typescript": "~5.9.2",
47
- "@elaraai/east": "1.0.13"
47
+ "@elaraai/east": "1.0.15",
48
+ "@elaraai/e3": "1.0.15"
48
49
  },
49
50
  "scripts": {
50
51
  "build": "tsc",
@@ -1,3 +0,0 @@
1
- import type { EastRule } from "../types.js";
2
- export declare const noEastDataBuilderHelper: EastRule;
3
- //# sourceMappingURL=no-east-data-builder-helper.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"no-east-data-builder-helper.d.ts","sourceRoot":"","sources":["../../../src/rules/no-east-data-builder-helper.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAyB,MAAM,aAAa,CAAC;AAiEnE,eAAO,MAAM,uBAAuB,EAAE,QAqCrC,CAAC"}
@@ -1,90 +0,0 @@
1
- import { isBlockBuilderType } from "../east-type.js";
2
- const NAME = "no-east-data-builder-helper";
3
- const CODE = 990011;
4
- const VALUE_CONSTRUCTORS = new Set(["variant", "some"]);
5
- // Is `expr` a hand-built East value constructor — `variant(...)`, `some(...)`,
6
- // `none`, or `East.value(...)`? These produce East data at TS evaluation time.
7
- function isEastValueConstructor(expr, t) {
8
- if (t.isCallExpression(expr)) {
9
- const callee = expr.expression;
10
- if (t.isIdentifier(callee) && VALUE_CONSTRUCTORS.has(callee.text))
11
- return true;
12
- return (t.isPropertyAccessExpression(callee) &&
13
- t.isIdentifier(callee.expression) &&
14
- callee.expression.text === "East" &&
15
- callee.name.text === "value");
16
- }
17
- return t.isIdentifier(expr) && expr.text === "none";
18
- }
19
- // The expressions a function/arrow returns, not descending into nested functions
20
- // (a concise arrow body counts as its single return).
21
- function returnExpressions(fn, t) {
22
- if (fn.body === undefined)
23
- return [];
24
- if (!t.isBlock(fn.body))
25
- return [fn.body];
26
- const out = [];
27
- const visit = (n) => {
28
- if (t.isFunctionDeclaration(n) || t.isFunctionExpression(n) || t.isArrowFunction(n))
29
- return;
30
- if (t.isReturnStatement(n) && n.expression !== undefined)
31
- out.push(n.expression);
32
- t.forEachChild(n, visit);
33
- };
34
- t.forEachChild(fn.body, visit);
35
- return out;
36
- }
37
- function isBuilderFunction(fn, ctx) {
38
- const t = ctx.ts;
39
- // East block callbacks (`($, x) => …`) take a BlockBuilder first; they are East
40
- // callbacks, not TS-level data helpers — exclude them.
41
- const first = fn.parameters[0];
42
- if (first !== undefined && isBlockBuilderType(ctx.checker.getTypeAtLocation(first.name))) {
43
- return false;
44
- }
45
- const returns = returnExpressions(fn, t);
46
- return returns.length > 0 && returns.every((r) => isEastValueConstructor(r, t));
47
- }
48
- // A TS function/arrow whose whole job is to return a hand-built East value
49
- // (`variant`/`some`/`none`/`East.value`) is an authoring-time macro: it expands
50
- // inline at each call, it is not a real `East.function` (it cannot be serialized,
51
- // recursed, or sent to the engine), and it hides the East value's shape behind a
52
- // JS call. Inline the constructor at each call site (repetition is welcome) or,
53
- // when reuse is genuine, make it a real `East.function`. UI-composition helpers
54
- // returning JSX (`(l) => <Badge>{l}</Badge>`) and `East.function(…)` bindings are
55
- // structurally distinct (their bodies are not value constructors) and never match.
56
- export const noEastDataBuilderHelper = {
57
- name: NAME,
58
- code: CODE,
59
- description: "Flag a TS helper whose only job is to return a hand-built East value (variant/some/none/East.value) — inline it or make it a real East.function.",
60
- check(node, ctx) {
61
- const t = ctx.ts;
62
- let fn;
63
- let reportNode;
64
- if (t.isFunctionDeclaration(node) && node.body !== undefined) {
65
- fn = node;
66
- reportNode = node.name ?? node;
67
- }
68
- else if (t.isVariableDeclaration(node) &&
69
- node.initializer !== undefined &&
70
- (t.isArrowFunction(node.initializer) || t.isFunctionExpression(node.initializer))) {
71
- fn = node.initializer;
72
- reportNode = node.name;
73
- }
74
- if (fn === undefined || reportNode === undefined)
75
- return;
76
- if (!isBuilderFunction(fn, ctx))
77
- return;
78
- const sf = ctx.sourceFile;
79
- const start = reportNode.getStart(sf);
80
- ctx.report({
81
- ruleName: NAME,
82
- code: CODE,
83
- start,
84
- length: reportNode.getEnd() - start,
85
- messageText: "This helper just returns a hand-built East value (`variant`/`some`/`none`/`East.value`), so it is an authoring-time macro, not a real East function. Inline the constructor at each call site (repetition is welcome), or make it a real `East.function` if you need a reusable East computation.",
86
- category: "warning",
87
- });
88
- },
89
- };
90
- //# sourceMappingURL=no-east-data-builder-helper.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"no-east-data-builder-helper.js","sourceRoot":"","sources":["../../../src/rules/no-east-data-builder-helper.ts"],"names":[],"mappings":"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"}