@elaraai/east-diagnostics 1.0.28 → 1.0.30

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 (73) hide show
  1. package/README.md +13 -0
  2. package/dist/src/block-scope.d.ts +4 -1
  3. package/dist/src/block-scope.d.ts.map +1 -1
  4. package/dist/src/block-scope.js +19 -0
  5. package/dist/src/block-scope.js.map +1 -1
  6. package/dist/src/east-source.d.ts +17 -0
  7. package/dist/src/east-source.d.ts.map +1 -1
  8. package/dist/src/east-source.js +77 -0
  9. package/dist/src/east-source.js.map +1 -1
  10. package/dist/src/east-type.d.ts +2 -0
  11. package/dist/src/east-type.d.ts.map +1 -1
  12. package/dist/src/east-type.js +46 -0
  13. package/dist/src/east-type.js.map +1 -1
  14. package/dist/src/rules/index.d.ts +10 -0
  15. package/dist/src/rules/index.d.ts.map +1 -1
  16. package/dist/src/rules/index.js +31 -0
  17. package/dist/src/rules/index.js.map +1 -1
  18. package/dist/src/rules/no-build-time-clock.d.ts +3 -0
  19. package/dist/src/rules/no-build-time-clock.d.ts.map +1 -0
  20. package/dist/src/rules/no-build-time-clock.js +67 -0
  21. package/dist/src/rules/no-build-time-clock.js.map +1 -0
  22. package/dist/src/rules/no-compile-time-data-injection.d.ts.map +1 -1
  23. package/dist/src/rules/no-compile-time-data-injection.js +8 -3
  24. package/dist/src/rules/no-compile-time-data-injection.js.map +1 -1
  25. package/dist/src/rules/no-compile-time-seed-data.d.ts.map +1 -1
  26. package/dist/src/rules/no-compile-time-seed-data.js +4 -30
  27. package/dist/src/rules/no-compile-time-seed-data.js.map +1 -1
  28. package/dist/src/rules/no-cross-block-builder.d.ts +3 -0
  29. package/dist/src/rules/no-cross-block-builder.d.ts.map +1 -0
  30. package/dist/src/rules/no-cross-block-builder.js +112 -0
  31. package/dist/src/rules/no-cross-block-builder.js.map +1 -0
  32. package/dist/src/rules/no-duplicate-definition-name.d.ts +3 -0
  33. package/dist/src/rules/no-duplicate-definition-name.d.ts.map +1 -0
  34. package/dist/src/rules/no-duplicate-definition-name.js +73 -0
  35. package/dist/src/rules/no-duplicate-definition-name.js.map +1 -0
  36. package/dist/src/rules/no-dynamic-bind-path.d.ts +7 -0
  37. package/dist/src/rules/no-dynamic-bind-path.d.ts.map +1 -0
  38. package/dist/src/rules/no-dynamic-bind-path.js +53 -0
  39. package/dist/src/rules/no-dynamic-bind-path.js.map +1 -0
  40. package/dist/src/rules/no-handrolled-value-type-mirror.d.ts +3 -0
  41. package/dist/src/rules/no-handrolled-value-type-mirror.d.ts.map +1 -0
  42. package/dist/src/rules/no-handrolled-value-type-mirror.js +72 -0
  43. package/dist/src/rules/no-handrolled-value-type-mirror.js.map +1 -0
  44. package/dist/src/rules/no-host-comparison-on-east-values.d.ts +3 -0
  45. package/dist/src/rules/no-host-comparison-on-east-values.d.ts.map +1 -0
  46. package/dist/src/rules/no-host-comparison-on-east-values.js +70 -0
  47. package/dist/src/rules/no-host-comparison-on-east-values.js.map +1 -0
  48. package/dist/src/rules/no-host-in-east-block.d.ts.map +1 -1
  49. package/dist/src/rules/no-host-in-east-block.js +149 -31
  50. package/dist/src/rules/no-host-in-east-block.js.map +1 -1
  51. package/dist/src/rules/no-module-scope-east-macro.d.ts.map +1 -1
  52. package/dist/src/rules/no-module-scope-east-macro.js +8 -1
  53. package/dist/src/rules/no-module-scope-east-macro.js.map +1 -1
  54. package/dist/src/rules/no-state-outside-reactive.d.ts +3 -0
  55. package/dist/src/rules/no-state-outside-reactive.d.ts.map +1 -0
  56. package/dist/src/rules/no-state-outside-reactive.js +63 -0
  57. package/dist/src/rules/no-state-outside-reactive.js.map +1 -0
  58. package/dist/src/rules/prefer-const-ui-callbacks.d.ts +7 -0
  59. package/dist/src/rules/prefer-const-ui-callbacks.d.ts.map +1 -0
  60. package/dist/src/rules/prefer-const-ui-callbacks.js +50 -0
  61. package/dist/src/rules/prefer-const-ui-callbacks.js.map +1 -0
  62. package/dist/src/rules/prefer-some-none.d.ts.map +1 -1
  63. package/dist/src/rules/prefer-some-none.js +5 -0
  64. package/dist/src/rules/prefer-some-none.js.map +1 -1
  65. package/dist/src/rules/require-example-returns.d.ts +3 -0
  66. package/dist/src/rules/require-example-returns.d.ts.map +1 -0
  67. package/dist/src/rules/require-example-returns.js +58 -0
  68. package/dist/src/rules/require-example-returns.js.map +1 -0
  69. package/dist/src/rules/require-runner-platforms.d.ts +3 -0
  70. package/dist/src/rules/require-runner-platforms.d.ts.map +1 -0
  71. package/dist/src/rules/require-runner-platforms.js +99 -0
  72. package/dist/src/rules/require-runner-platforms.js.map +1 -0
  73. package/package.json +3 -3
package/README.md CHANGED
@@ -53,6 +53,19 @@ These share one principle: **inside an East block the code must be East all the
53
53
  - **`no-compile-time-data-injection`** - Build-time data ingestion (a `node:fs` import/call, `JSON.parse`, `process.env`) at module scope — load data at runtime via `e3.input` / datasets / platform tasks. (A genuine seed-time bootstrap with no East-side reader is an accepted warning.)
54
54
  - **`no-compile-time-seed-data`** - Host-computed data passed as the seed (3rd arg) of `e3.input(name, type, seed)` — a `new Map()`/array filled in place by host `for`-loops, or an object literal of host calls (`num(cfg.x)`, `BigInt(...)`) — bakes a build-time snapshot into the deployed program. The default must be a small *authored constant* (a literal, an empty/literal `Map`/`Set`/array/struct, or an East value `variant`/`some`/`none`/`East.value`) or omitted; load real/bulk data at runtime (a `BlobType` input parsed with `blob.decodeCsv(…)` in an `e3.task`, a platform `FileSystem.readFile`, or `e3.record` + `e3.mutation`).
55
55
 
56
+ ### Deploy/runtime-failure classes that type-check clean
57
+
58
+ - **`require-runner-platforms`** - An `e3.task` calling PROJECT-declared platform functions (`East.platform("proj.x", …)` stubs) whose options declare no `runner.platforms` `{ custom: … }` entry — fails only at dataflow runtime with "Platform function … is not available".
59
+ - **`no-cross-block-builder`** - A nested East callback emitting bindings via an OUTER block's `$` (`xs.map((_$, x) => { $.let(…) })`) — the binding lands in the wrong block.
60
+ - **`no-state-outside-reactive`** - east-ui `State.*` outside a `<Reactive>` builder — the UI function becomes async at analysis time and is rejected at deploy.
61
+ - **`prefer-const-ui-callbacks`** - An `East.function` handler written inline in a JSX prop — rebuilt each render, and `equalFor` can't distinguish function values, so memoized renderers miss the swap. Bind once with `$.const`.
62
+ - **`no-dynamic-bind-path`** - A `Data.bind` / `State.bind` / `Navigation.bind` key computed from an East value — bind keys must be IR-build constants or the binding is missing from the `ui()` manifest.
63
+ - **`no-build-time-clock`** - `Date.now()` / argless `new Date()` at module scope of East/e3 source — the BUILD clock gets baked into the deployed program.
64
+ - **`no-handrolled-value-type-mirror`** - A hand-authored `interface Foo {…}` mirroring an in-scope East type value `FooType` — derive it with `ValueTypeOf<typeof FooType>` so it can't drift.
65
+ - **`no-host-comparison-on-east-values`** - `===`/`<` on decoded East values (variants/options, `SortedMap`/`SortedSet`) — use `equalFor(T)` / `compareFor(T)`.
66
+ - **`require-example-returns`** - An `example()` without `returns` (for a non-`NullType`/`UIComponentType` output) — the harness runs the fn as a bare statement and the assertion false-passes.
67
+ - **`no-duplicate-definition-name`** - Two same-kind e3 definitions sharing a name string in one file — they collide at deploy time.
68
+
56
69
  ## Usage
57
70
 
58
71
  ```typescript
@@ -3,7 +3,7 @@
3
3
  * Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
4
4
  */
5
5
  import type * as ts from "typescript";
6
- import type { RuleContext } from "./types.js";
6
+ import type { RuleContext, TsModule } from "./types.js";
7
7
  /** True for an arrow/function whose first parameter is an East `BlockBuilder` —
8
8
  * the shape of every East block callback: `East.function`'s `$ => …`, the JSX
9
9
  * `<Reactive>{$ => …}}`, `ui(…, $ => …)`, a `.map(($, x) => …)` body. Keying on
@@ -24,4 +24,7 @@ export declare function isBlockBuilderCallback(node: ts.Node, ctx: RuleContext):
24
24
  export declare function enclosingBlockScope(node: ts.Node, ctx: RuleContext): ts.Node | undefined;
25
25
  /** Is `node` inside an East block scope (`East.function` body or BlockBuilder callback)? */
26
26
  export declare function insideBlockScope(node: ts.Node, ctx: RuleContext): boolean;
27
+ /** Is `node` (transitively) inside a `<Reactive>` element or a `Reactive.Root(…)`
28
+ * factory call — i.e. inside a reactive re-render scope? */
29
+ export declare function insideReactive(node: ts.Node, t: TsModule): boolean;
27
30
  //# sourceMappingURL=block-scope.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"block-scope.d.ts","sourceRoot":"","sources":["../../src/block-scope.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,WAAW,EAAY,MAAM,YAAY,CAAC;AAexD;;;;sEAIsE;AACtE,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAM/E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,GAAG,EAAE,CAAC,IAAI,GAAG,SAAS,CAWxF;AAED,4FAA4F;AAC5F,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAEzE"}
1
+ {"version":3,"file":"block-scope.d.ts","sourceRoot":"","sources":["../../src/block-scope.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAexD;;;;sEAIsE;AACtE,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAM/E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,GAAG,EAAE,CAAC,IAAI,GAAG,SAAS,CAWxF;AAED,4FAA4F;AAC5F,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAEzE;AAED;4DAC4D;AAC5D,wBAAgB,cAAc,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAclE"}
@@ -50,4 +50,23 @@ export function enclosingBlockScope(node, ctx) {
50
50
  export function insideBlockScope(node, ctx) {
51
51
  return enclosingBlockScope(node, ctx) !== undefined;
52
52
  }
53
+ /** Is `node` (transitively) inside a `<Reactive>` element or a `Reactive.Root(…)`
54
+ * factory call — i.e. inside a reactive re-render scope? */
55
+ export function insideReactive(node, t) {
56
+ let cur = node.parent;
57
+ while (cur !== undefined) {
58
+ if (t.isJsxElement(cur) && cur.openingElement.tagName.getText().endsWith("Reactive"))
59
+ return true;
60
+ if (t.isJsxSelfClosingElement(cur) && cur.tagName.getText().endsWith("Reactive"))
61
+ return true;
62
+ if (t.isCallExpression(cur)) {
63
+ const callee = cur.expression;
64
+ if (t.isPropertyAccessExpression(callee) && t.isIdentifier(callee.expression) && callee.expression.text === "Reactive") {
65
+ return true;
66
+ }
67
+ }
68
+ cur = cur.parent;
69
+ }
70
+ return false;
71
+ }
53
72
  //# sourceMappingURL=block-scope.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"block-scope.js","sourceRoot":"","sources":["../../src/block-scope.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpD,sFAAsF;AACtF,SAAS,kBAAkB,CAAC,IAAa,EAAE,CAAW;IACpD,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;IAC/B,OAAO,CACL,CAAC,CAAC,0BAA0B,CAAC,MAAM,CAAC;QACpC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC;QACjC,MAAM,CAAC,UAAU,CAAC,IAAI,KAAK,MAAM;QACjC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,eAAe,CAAC,CAC1E,CAAC;AACJ,CAAC;AAED;;;;sEAIsE;AACtE,MAAM,UAAU,sBAAsB,CAAC,IAAa,EAAE,GAAgB;IACpE,MAAM,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;IACjB,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5E,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACtC,OAAO,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AACvE,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAa,EAAE,GAAgB;IACjE,MAAM,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;IACjB,IAAI,SAA8B,CAAC;IACnC,IAAI,OAAO,GAAwB,IAAI,CAAC,MAAM,CAAC;IAC/C,OAAO,OAAO,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,kBAAkB,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,sBAAsB,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;YAC3E,SAAS,GAAG,OAAO,CAAC;QACtB,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAC3B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,gBAAgB,CAAC,IAAa,EAAE,GAAgB;IAC9D,OAAO,mBAAmB,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,SAAS,CAAC;AACtD,CAAC"}
1
+ {"version":3,"file":"block-scope.js","sourceRoot":"","sources":["../../src/block-scope.ts"],"names":[],"mappings":"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"}
@@ -4,10 +4,27 @@
4
4
  */
5
5
  import type * as ts from "typescript";
6
6
  import type { TsModule } from "./types.js";
7
+ /** The `ImportDeclaration` a symbol's (local, un-aliased) declaration belongs to,
8
+ * or undefined. Uses the LOCAL import symbol — the declaration IS the
9
+ * ImportSpecifier / NamespaceImport / ImportClause — and does NOT resolve the
10
+ * alias, which would jump into the imported package and lose the specifier. */
11
+ export declare function importDeclarationOf(sym: ts.Symbol | undefined, t: TsModule): ts.ImportDeclaration | undefined;
12
+ /** Does `id` resolve to a binding imported from an `@elaraai/*` package? The whole
13
+ * East ecosystem API — `East`, `Expr`, `variant`/`some`, `ArrayType`/`StructType`,
14
+ * `GoogleOr`, `Data`, … — is recognised by SYMBOL, never a brittle name list. */
15
+ export declare function resolvesToEastImport(id: ts.Identifier, checker: ts.TypeChecker, t: TsModule): boolean;
7
16
  /** Does this source file statically import or re-export from any `@elaraai/*`
8
17
  * package? — the signal that it is East/e3 source rather than plain TypeScript.
9
18
  * Cached per source file. */
10
19
  export declare function importsEastPackage(sf: ts.SourceFile, t: TsModule): boolean;
20
+ /** Does this file DECLARE an East/e3 program — an `East.<factory>(…)` call
21
+ * (function/asyncFunction/platform/…, with `East` symbol-resolved to an
22
+ * `@elaraai/*` import), an e3 definition call (`e3.input`/`e3.task`/… on the
23
+ * `@elaraai/e3` default import), or a `ui(…)` surface (the `@elaraai/e3-ui`
24
+ * import)? Host-side TOOLING (CLIs, build scripts, renderers) imports
25
+ * `@elaraai/*` for utilities but declares no program — build-time-data rules
26
+ * must not treat it as deployable source. Cached per source file. */
27
+ export declare function declaresEastProgram(sf: ts.SourceFile, checker: ts.TypeChecker, t: TsModule): boolean;
11
28
  /** Does a relative `../src`-style import specifier resolve WITHIN the importing
12
29
  * file's own package? A package's own spec/example importing `../src/index.js` is
13
30
  * the one legitimate relative-`src` import — it cannot import its own published
@@ -1 +1 @@
1
- {"version":3,"file":"east-source.d.ts","sourceRoot":"","sources":["../../src/east-source.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAGtC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAU3C;;6BAE6B;AAC7B,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAc1E;AAuBD;;;;;oCAKoC;AACpC,wBAAgB,wBAAwB,CAAC,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAS/F"}
1
+ {"version":3,"file":"east-source.d.ts","sourceRoot":"","sources":["../../src/east-source.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAGtC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C;;;+EAG+E;AAC/E,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC,EAAE,QAAQ,GAAG,EAAE,CAAC,iBAAiB,GAAG,SAAS,CAa7G;AAED;;iFAEiF;AACjF,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAGrG;AAUD;;6BAE6B;AAC7B,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAc1E;AASD;;;;;;qEAMqE;AACrE,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CA+BpG;AAuBD;;;;;oCAKoC;AACpC,wBAAgB,wBAAwB,CAAC,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAS/F"}
@@ -1,5 +1,35 @@
1
1
  import { existsSync } from "node:fs";
2
2
  import { dirname, join, resolve } from "node:path";
3
+ /** The `ImportDeclaration` a symbol's (local, un-aliased) declaration belongs to,
4
+ * or undefined. Uses the LOCAL import symbol — the declaration IS the
5
+ * ImportSpecifier / NamespaceImport / ImportClause — and does NOT resolve the
6
+ * alias, which would jump into the imported package and lose the specifier. */
7
+ export function importDeclarationOf(sym, t) {
8
+ for (const d of sym?.declarations ?? []) {
9
+ let n = d;
10
+ // ImportSpecifier -> NamedImports -> ImportClause -> ImportDeclaration; a
11
+ // NamespaceImport sits one level higher; a DEFAULT import binds the
12
+ // ImportClause itself (`import e3 from "@elaraai/e3"`).
13
+ if (t.isImportSpecifier(n))
14
+ n = n.parent.parent.parent;
15
+ else if (t.isNamespaceImport(n))
16
+ n = n.parent.parent;
17
+ else if (t.isImportClause(n))
18
+ n = n.parent;
19
+ else
20
+ continue;
21
+ if (t.isImportDeclaration(n))
22
+ return n;
23
+ }
24
+ return undefined;
25
+ }
26
+ /** Does `id` resolve to a binding imported from an `@elaraai/*` package? The whole
27
+ * East ecosystem API — `East`, `Expr`, `variant`/`some`, `ArrayType`/`StructType`,
28
+ * `GoogleOr`, `Data`, … — is recognised by SYMBOL, never a brittle name list. */
29
+ export function resolvesToEastImport(id, checker, t) {
30
+ const imp = importDeclarationOf(checker.getSymbolAtLocation(id), t);
31
+ return imp !== undefined && t.isStringLiteral(imp.moduleSpecifier) && imp.moduleSpecifier.text.startsWith("@elaraai/");
32
+ }
3
33
  // File-level "is this East/e3 source?" detection. Several rules describe abuses
4
34
  // that only make sense inside an East/e3 program (baking build-time data, building
5
35
  // East IR in a module-scope macro); gating them on a real `@elaraai/*` import keeps
@@ -26,6 +56,53 @@ export function importsEastPackage(sf, t) {
26
56
  importsCache.set(sf, found);
27
57
  return found;
28
58
  }
59
+ const declaresCache = new WeakMap();
60
+ /** e3 members whose call DECLARES part of a deployable program. */
61
+ const E3_DECLARATION_MEMBERS = new Set([
62
+ "input", "task", "customTask", "function", "record", "mutation", "package", "export",
63
+ ]);
64
+ /** Does this file DECLARE an East/e3 program — an `East.<factory>(…)` call
65
+ * (function/asyncFunction/platform/…, with `East` symbol-resolved to an
66
+ * `@elaraai/*` import), an e3 definition call (`e3.input`/`e3.task`/… on the
67
+ * `@elaraai/e3` default import), or a `ui(…)` surface (the `@elaraai/e3-ui`
68
+ * import)? Host-side TOOLING (CLIs, build scripts, renderers) imports
69
+ * `@elaraai/*` for utilities but declares no program — build-time-data rules
70
+ * must not treat it as deployable source. Cached per source file. */
71
+ export function declaresEastProgram(sf, checker, t) {
72
+ const cached = declaresCache.get(sf);
73
+ if (cached !== undefined)
74
+ return cached;
75
+ let found = false;
76
+ const visit = (n) => {
77
+ if (found)
78
+ return;
79
+ if (t.isCallExpression(n)) {
80
+ const callee = n.expression;
81
+ if (t.isPropertyAccessExpression(callee) && t.isIdentifier(callee.expression)) {
82
+ const root = callee.expression;
83
+ if (root.text === "East" && resolvesToEastImport(root, checker, t)) {
84
+ found = true;
85
+ return;
86
+ }
87
+ if (E3_DECLARATION_MEMBERS.has(callee.name.text)) {
88
+ const imp = importDeclarationOf(checker.getSymbolAtLocation(root), t);
89
+ if (imp !== undefined && t.isStringLiteral(imp.moduleSpecifier) && imp.moduleSpecifier.text === "@elaraai/e3") {
90
+ found = true;
91
+ return;
92
+ }
93
+ }
94
+ }
95
+ else if (t.isIdentifier(callee) && callee.text === "ui" && resolvesToEastImport(callee, checker, t)) {
96
+ found = true;
97
+ return;
98
+ }
99
+ }
100
+ t.forEachChild(n, visit);
101
+ };
102
+ visit(sf);
103
+ declaresCache.set(sf, found);
104
+ return found;
105
+ }
29
106
  const pkgDirCache = new Map();
30
107
  /** The nearest ancestor directory of `p` containing a `package.json`, or undefined. */
31
108
  function packageDirOf(p) {
@@ -1 +1 @@
1
- {"version":3,"file":"east-source.js","sourceRoot":"","sources":["../../src/east-source.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGnD,gFAAgF;AAChF,mFAAmF;AACnF,oFAAoF;AACpF,oFAAoF;AACpF,yEAAyE;AAEzE,MAAM,YAAY,GAAG,IAAI,OAAO,EAA0B,CAAC;AAE3D;;6BAE6B;AAC7B,MAAM,UAAU,kBAAkB,CAAC,EAAiB,EAAE,CAAW;IAC/D,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACpC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACxC,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC;QACjC,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC;YAAE,SAAS;QAC3E,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC;QAClC,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YACvF,KAAK,GAAG,IAAI,CAAC;YACb,MAAM;QACR,CAAC;IACH,CAAC;IACD,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAC5B,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,WAAW,GAAG,IAAI,GAAG,EAA8B,CAAC;AAE1D,uFAAuF;AACvF,SAAS,YAAY,CAAC,CAAS;IAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC1D,IAAI,GAAG,GAAG,KAAK,CAAC;IAChB,IAAI,MAA0B,CAAC;IAC/B,SAAS,CAAC;QACR,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;YAC1C,MAAM,GAAG,GAAG,CAAC;YACb,MAAM;QACR,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM;QAC1B,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;IACD,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC/B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;oCAKoC;AACpC,MAAM,UAAU,wBAAwB,CAAC,cAAsB,EAAE,aAAqB;IACpF,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;QACzC,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QACpC,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,aAAa,CAAC,CAAC;QAClE,OAAO,YAAY,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"east-source.js","sourceRoot":"","sources":["../../src/east-source.ts"],"names":[],"mappings":"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"}
@@ -5,4 +5,6 @@
5
5
  import type * as ts from "typescript";
6
6
  export declare function isEastExprType(type: ts.Type): boolean;
7
7
  export declare function isBlockBuilderType(type: ts.Type): boolean;
8
+ export declare function isEastPlatformDefinitionType(type: ts.Type): boolean;
9
+ export declare function isEastDefinitionType(type: ts.Type): boolean;
8
10
  //# sourceMappingURL=east-type.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"east-type.d.ts","sourceRoot":"","sources":["../../src/east-type.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAMtC,wBAAgB,cAAc,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,OAAO,CAgBrD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,OAAO,CAGzD"}
1
+ {"version":3,"file":"east-type.d.ts","sourceRoot":"","sources":["../../src/east-type.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAMtC,wBAAgB,cAAc,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,OAAO,CAgBrD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,OAAO,CAGzD;AA0BD,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,OAAO,CAEnE;AAiBD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,OAAO,CAK3D"}
@@ -25,4 +25,50 @@ export function isBlockBuilderType(type) {
25
25
  const name = type.aliasSymbol?.name ?? type.symbol?.name;
26
26
  return name === "BlockBuilder";
27
27
  }
28
+ /** Walk `type` (union/intersection members included) asking `match` of each
29
+ * constituent's alias/symbol name. */
30
+ function someTypeName(type, match) {
31
+ const seen = new Set();
32
+ const stack = [type];
33
+ while (stack.length > 0) {
34
+ const current = stack.pop();
35
+ if (current === undefined || seen.has(current))
36
+ continue;
37
+ seen.add(current);
38
+ const name = current.aliasSymbol?.name ?? current.symbol?.name;
39
+ if (name !== undefined && match(name))
40
+ return true;
41
+ if (current.isUnionOrIntersection())
42
+ stack.push(...current.types);
43
+ }
44
+ return false;
45
+ }
46
+ // East platform-function definitions — `East.platform(…)` / `East.asyncPlatform(…)`
47
+ // and the generic pair — are callable TS values typed by the named aliases
48
+ // `PlatformDefinition` / `AsyncPlatformDefinition` / `GenericPlatformDefinition` /
49
+ // `AsyncGenericPlatformDefinition` (declared in @elaraai/east). CALLING one emits a
50
+ // single `Platform` IR node — an East-level call exactly like calling a bound
51
+ // `East.function`, not a host macro — so the host-vs-East rules must treat such a
52
+ // callee as East wherever it lives (a project's own platform stubs included).
53
+ // Name-keyed, like `isEastExprType`.
54
+ export function isEastPlatformDefinitionType(type) {
55
+ return someTypeName(type, (name) => name.endsWith("PlatformDefinition"));
56
+ }
57
+ // e3 program declarations: `e3.task` → `TaskDef`, `e3.input` → `DatasetDef`,
58
+ // `e3.function` → `FunctionDef`, … . A module-scope helper returning one of these
59
+ // (or a platform definition) is a DECLARATION factory — host-side composition of
60
+ // the program's structure, which the host language is allowed to do — not a value
61
+ // macro that hand-builds East IR.
62
+ const E3_DEFINITION_NAMES = new Set([
63
+ "TaskDef",
64
+ "DatasetDef",
65
+ "DataTreeDef",
66
+ "FunctionDef",
67
+ "MutationDef",
68
+ "RecordDef",
69
+ "PackageDef",
70
+ ]);
71
+ export function isEastDefinitionType(type) {
72
+ return someTypeName(type, (name) => E3_DEFINITION_NAMES.has(name) || name.endsWith("PlatformDefinition"));
73
+ }
28
74
  //# sourceMappingURL=east-type.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"east-type.js","sourceRoot":"","sources":["../../src/east-type.ts"],"names":[],"mappings":"AAMA,uEAAuE;AACvE,4EAA4E;AAC5E,yEAAyE;AACzE,sBAAsB;AACtB,MAAM,UAAU,cAAc,CAAC,IAAa;IAC1C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAW,CAAC;IAChC,MAAM,KAAK,GAAc,CAAC,IAAI,CAAC,CAAC;IAChC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;QAC5B,IAAI,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,SAAS;QACzD,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAElB,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,EAAE,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC;QAC/D,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAElF,IAAI,OAAO,CAAC,qBAAqB,EAAE;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAClE,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;QACvC,IAAI,KAAK,KAAK,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAa;IAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;IACzD,OAAO,IAAI,KAAK,cAAc,CAAC;AACjC,CAAC"}
1
+ {"version":3,"file":"east-type.js","sourceRoot":"","sources":["../../src/east-type.ts"],"names":[],"mappings":"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"}
@@ -19,5 +19,15 @@ export { noCompileTimeDataInjection } from "./no-compile-time-data-injection.js"
19
19
  export { noCompileTimeSeedData } from "./no-compile-time-seed-data.js";
20
20
  export { noHostInEastBlock } from "./no-host-in-east-block.js";
21
21
  export { noModuleScopeEastMacro } from "./no-module-scope-east-macro.js";
22
+ export { requireRunnerPlatforms } from "./require-runner-platforms.js";
23
+ export { noCrossBlockBuilder } from "./no-cross-block-builder.js";
24
+ export { noStateOutsideReactive } from "./no-state-outside-reactive.js";
25
+ export { preferConstUiCallbacks } from "./prefer-const-ui-callbacks.js";
26
+ export { noDynamicBindPath } from "./no-dynamic-bind-path.js";
27
+ export { noBuildTimeClock } from "./no-build-time-clock.js";
28
+ export { noHandrolledValueTypeMirror } from "./no-handrolled-value-type-mirror.js";
29
+ export { noHostComparisonOnEastValues } from "./no-host-comparison-on-east-values.js";
30
+ export { requireExampleReturns } from "./require-example-returns.js";
31
+ export { noDuplicateDefinitionName } from "./no-duplicate-definition-name.js";
22
32
  export declare const allRules: readonly EastRule[];
23
33
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/rules/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAkB5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,2BAA2B,EAAE,MAAM,uCAAuC,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAEzE,eAAO,MAAM,QAAQ,EAAE,SAAS,QAAQ,EAqBvC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/rules/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AA4B5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,2BAA2B,EAAE,MAAM,uCAAuC,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,EAAE,4BAA4B,EAAE,MAAM,wCAAwC,CAAC;AACtF,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAE9E,eAAO,MAAM,QAAQ,EAAE,SAAS,QAAQ,EAgCvC,CAAC"}
@@ -14,6 +14,16 @@ import { noCompileTimeDataInjection } from "./no-compile-time-data-injection.js"
14
14
  import { noCompileTimeSeedData } from "./no-compile-time-seed-data.js";
15
15
  import { noHostInEastBlock } from "./no-host-in-east-block.js";
16
16
  import { noModuleScopeEastMacro } from "./no-module-scope-east-macro.js";
17
+ import { requireRunnerPlatforms } from "./require-runner-platforms.js";
18
+ import { noCrossBlockBuilder } from "./no-cross-block-builder.js";
19
+ import { noStateOutsideReactive } from "./no-state-outside-reactive.js";
20
+ import { preferConstUiCallbacks } from "./prefer-const-ui-callbacks.js";
21
+ import { noDynamicBindPath } from "./no-dynamic-bind-path.js";
22
+ import { noBuildTimeClock } from "./no-build-time-clock.js";
23
+ import { noHandrolledValueTypeMirror } from "./no-handrolled-value-type-mirror.js";
24
+ import { noHostComparisonOnEastValues } from "./no-host-comparison-on-east-values.js";
25
+ import { requireExampleReturns } from "./require-example-returns.js";
26
+ import { noDuplicateDefinitionName } from "./no-duplicate-definition-name.js";
17
27
  export { noRedundantEastCast } from "./no-redundant-east-cast.js";
18
28
  export { preferExplicitEastType } from "./prefer-explicit-east-type.js";
19
29
  export { preferSomeNone } from "./prefer-some-none.js";
@@ -30,6 +40,16 @@ export { noCompileTimeDataInjection } from "./no-compile-time-data-injection.js"
30
40
  export { noCompileTimeSeedData } from "./no-compile-time-seed-data.js";
31
41
  export { noHostInEastBlock } from "./no-host-in-east-block.js";
32
42
  export { noModuleScopeEastMacro } from "./no-module-scope-east-macro.js";
43
+ export { requireRunnerPlatforms } from "./require-runner-platforms.js";
44
+ export { noCrossBlockBuilder } from "./no-cross-block-builder.js";
45
+ export { noStateOutsideReactive } from "./no-state-outside-reactive.js";
46
+ export { preferConstUiCallbacks } from "./prefer-const-ui-callbacks.js";
47
+ export { noDynamicBindPath } from "./no-dynamic-bind-path.js";
48
+ export { noBuildTimeClock } from "./no-build-time-clock.js";
49
+ export { noHandrolledValueTypeMirror } from "./no-handrolled-value-type-mirror.js";
50
+ export { noHostComparisonOnEastValues } from "./no-host-comparison-on-east-values.js";
51
+ export { requireExampleReturns } from "./require-example-returns.js";
52
+ export { noDuplicateDefinitionName } from "./no-duplicate-definition-name.js";
33
53
  export const allRules = [
34
54
  // East-side idiom hygiene (original set)
35
55
  noRedundantEastCast,
@@ -51,5 +71,16 @@ export const allRules = [
51
71
  noModuleScopeEastMacro,
52
72
  noCompileTimeDataInjection,
53
73
  noCompileTimeSeedData,
74
+ // deploy/runtime-failure classes that type-check clean (epic #208)
75
+ requireRunnerPlatforms,
76
+ noCrossBlockBuilder,
77
+ noStateOutsideReactive,
78
+ preferConstUiCallbacks,
79
+ noDynamicBindPath,
80
+ noBuildTimeClock,
81
+ noHandrolledValueTypeMirror,
82
+ noHostComparisonOnEastValues,
83
+ requireExampleReturns,
84
+ noDuplicateDefinitionName,
54
85
  ];
55
86
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/rules/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,2BAA2B,EAAE,MAAM,uCAAuC,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAEzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,2BAA2B,EAAE,MAAM,uCAAuC,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAEzE,MAAM,CAAC,MAAM,QAAQ,GAAwB;IAC3C,yCAAyC;IACzC,mBAAmB;IACnB,sBAAsB;IACtB,cAAc;IACd,mBAAmB;IACnB,oBAAoB;IACpB,2BAA2B;IAC3B,mBAAmB;IACnB,sBAAsB;IACtB,0BAA0B;IAC1B,sBAAsB;IACtB,wBAAwB;IACxB,mBAAmB;IACnB,6EAA6E;IAC7E,wEAAwE;IACxE,oCAAoC;IACpC,iBAAiB;IACjB,sBAAsB;IACtB,0BAA0B;IAC1B,qBAAqB;CACtB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/rules/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { EastRule } from "../types.js";
2
+ export declare const noBuildTimeClock: EastRule;
3
+ //# sourceMappingURL=no-build-time-clock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-build-time-clock.d.ts","sourceRoot":"","sources":["../../../src/rules/no-build-time-clock.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAY,MAAM,aAAa,CAAC;AAkCtD,eAAO,MAAM,gBAAgB,EAAE,QAwC9B,CAAC"}
@@ -0,0 +1,67 @@
1
+ import { importsEastPackage } from "../east-source.js";
2
+ const NAME = "no-build-time-clock";
3
+ const CODE = 990027;
4
+ /** Is `node` lexically inside any function-like scope? Module-scope clock reads
5
+ * are the abuse; a platform `.implement((…) => Date.now())` body runs at
6
+ * RUNTIME and is fine. */
7
+ function insideFunction(node, t) {
8
+ let cur = node.parent;
9
+ while (cur !== undefined) {
10
+ if (t.isArrowFunction(cur) ||
11
+ t.isFunctionExpression(cur) ||
12
+ t.isFunctionDeclaration(cur) ||
13
+ t.isMethodDeclaration(cur) ||
14
+ t.isConstructorDeclaration(cur) ||
15
+ t.isGetAccessorDeclaration(cur) ||
16
+ t.isSetAccessorDeclaration(cur)) {
17
+ return true;
18
+ }
19
+ cur = cur.parent;
20
+ }
21
+ return false;
22
+ }
23
+ // East/e3 source is compiled and DEPLOYED; reading the clock at module
24
+ // evaluation (`Date.now()`, argless `new Date()`) freezes the BUILD moment into
25
+ // the program — a seed of `new Date(Date.now() - 2h)` means "2 hours before the
26
+ // deploy", drifting meaningless afterwards. Author constant datetimes, or read
27
+ // time at runtime inside a task via the Time platform. (Complements
28
+ // `no-compile-time-seed-data`, which only inspects `e3.input` seed arguments.)
29
+ export const noBuildTimeClock = {
30
+ name: NAME,
31
+ code: CODE,
32
+ description: "Flag Date.now() / argless new Date() at module scope of East/e3 source — the build clock gets baked into the deployed program.",
33
+ check(node, ctx) {
34
+ const t = ctx.ts;
35
+ let target;
36
+ if (t.isCallExpression(node) &&
37
+ t.isPropertyAccessExpression(node.expression) &&
38
+ t.isIdentifier(node.expression.expression) &&
39
+ node.expression.expression.text === "Date" &&
40
+ node.expression.name.text === "now") {
41
+ target = node;
42
+ }
43
+ else if (t.isNewExpression(node) &&
44
+ t.isIdentifier(node.expression) &&
45
+ node.expression.text === "Date" &&
46
+ (node.arguments === undefined || node.arguments.length === 0)) {
47
+ target = node;
48
+ }
49
+ if (target === undefined)
50
+ return;
51
+ if (!importsEastPackage(ctx.sourceFile, t))
52
+ return;
53
+ if (insideFunction(target, t))
54
+ return;
55
+ const sf = ctx.sourceFile;
56
+ const start = target.getStart(sf);
57
+ ctx.report({
58
+ ruleName: NAME,
59
+ code: CODE,
60
+ start,
61
+ length: target.getEnd() - start,
62
+ messageText: "Module-scope clock read in East/e3 source — this bakes the BUILD moment into the deployed program. Author a constant datetime (`new Date(\"2026-06-30T07:00:00Z\")`), or read time at runtime inside a task (the `Time` platform).",
63
+ category: "warning",
64
+ });
65
+ },
66
+ };
67
+ //# sourceMappingURL=no-build-time-clock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-build-time-clock.js","sourceRoot":"","sources":["../../../src/rules/no-build-time-clock.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,IAAI,GAAG,qBAAqB,CAAC;AACnC,MAAM,IAAI,GAAG,MAAM,CAAC;AAEpB;;0BAE0B;AAC1B,SAAS,cAAc,CAAC,IAAa,EAAE,CAAW;IAChD,IAAI,GAAG,GAAwB,IAAI,CAAC,MAAM,CAAC;IAC3C,OAAO,GAAG,KAAK,SAAS,EAAE,CAAC;QACzB,IACE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC;YACtB,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC;YAC3B,CAAC,CAAC,qBAAqB,CAAC,GAAG,CAAC;YAC5B,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC;YAC1B,CAAC,CAAC,wBAAwB,CAAC,GAAG,CAAC;YAC/B,CAAC,CAAC,wBAAwB,CAAC,GAAG,CAAC;YAC/B,CAAC,CAAC,wBAAwB,CAAC,GAAG,CAAC,EAC/B,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC;IACnB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,uEAAuE;AACvE,gFAAgF;AAChF,gFAAgF;AAChF,+EAA+E;AAC/E,oEAAoE;AACpE,+EAA+E;AAC/E,MAAM,CAAC,MAAM,gBAAgB,GAAa;IACxC,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,WAAW,EACT,gIAAgI;IAClI,KAAK,CAAC,IAAI,EAAE,GAAG;QACb,MAAM,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;QACjB,IAAI,MAA2B,CAAC;QAChC,IACE,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC;YACxB,CAAC,CAAC,0BAA0B,CAAC,IAAI,CAAC,UAAU,CAAC;YAC7C,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;YAC1C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,KAAK,MAAM;YAC1C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,EACnC,CAAC;YACD,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;aAAM,IACL,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC;YACvB,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;YAC/B,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,MAAM;YAC/B,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,EAC7D,CAAC;YACD,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;QACD,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO;QACjC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;YAAE,OAAO;QACnD,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;YAAE,OAAO;QAEtC,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,oOAAoO;YACtO,QAAQ,EAAE,SAAS;SACpB,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"no-compile-time-data-injection.d.ts","sourceRoot":"","sources":["../../../src/rules/no-compile-time-data-injection.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAyB,MAAM,aAAa,CAAC;AA6DnE,eAAO,MAAM,0BAA0B,EAAE,QAyDxC,CAAC"}
1
+ {"version":3,"file":"no-compile-time-data-injection.d.ts","sourceRoot":"","sources":["../../../src/rules/no-compile-time-data-injection.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAyB,MAAM,aAAa,CAAC;AA6DnE,eAAO,MAAM,0BAA0B,EAAE,QA6DxC,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { insideBlockScope } from "../block-scope.js";
2
- import { importsEastPackage } from "../east-source.js";
2
+ import { declaresEastProgram, importsEastPackage } from "../east-source.js";
3
3
  const NAME = "no-compile-time-data-injection";
4
4
  const CODE = 990015;
5
5
  const FS_MODULES = new Set(["node:fs", "fs", "node:fs/promises", "fs/promises"]);
@@ -58,10 +58,15 @@ export const noCompileTimeDataInjection = {
58
58
  description: "Flag build-time data ingestion (a node:fs import or call, JSON.parse, process.env) at module scope — load data at runtime via e3.input / datasets / platform tasks.",
59
59
  check(node, ctx) {
60
60
  const t = ctx.ts;
61
- // Only an East/e3 source file (one importing `@elaraai/*`) is subject to this —
62
- // a plain Node script reading files at module scope is none of our business.
61
+ // Only DEPLOYABLE East/e3 source is subject to this: a file that imports
62
+ // `@elaraai/*` AND declares a program (an `East.*` factory, an e3
63
+ // definition, a `ui()` surface). Host-side tooling — a CLI, a build
64
+ // script, a renderer — imports East for utilities and legitimately does
65
+ // runtime file I/O; a plain Node script is none of our business either.
63
66
  if (!importsEastPackage(ctx.sourceFile, t))
64
67
  return;
68
+ if (!declaresEastProgram(ctx.sourceFile, ctx.checker, t))
69
+ return;
65
70
  // The `import … from "node:fs"` itself.
66
71
  if (t.isImportDeclaration(node)) {
67
72
  const spec = node.moduleSpecifier;
@@ -1 +1 @@
1
- {"version":3,"file":"no-compile-time-data-injection.js","sourceRoot":"","sources":["../../../src/rules/no-compile-time-data-injection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"no-compile-time-data-injection.js","sourceRoot":"","sources":["../../../src/rules/no-compile-time-data-injection.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"no-compile-time-seed-data.d.ts","sourceRoot":"","sources":["../../../src/rules/no-compile-time-seed-data.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAyB,MAAM,aAAa,CAAC;AA4KnE,eAAO,MAAM,qBAAqB,EAAE,QA4CnC,CAAC"}
1
+ {"version":3,"file":"no-compile-time-seed-data.d.ts","sourceRoot":"","sources":["../../../src/rules/no-compile-time-seed-data.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAyB,MAAM,aAAa,CAAC;AAqJnE,eAAO,MAAM,qBAAqB,EAAE,QA4CnC,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { insideBlockScope } from "../block-scope.js";
2
+ import { importDeclarationOf, resolvesToEastImport } from "../east-source.js";
2
3
  const NAME = "no-compile-time-seed-data";
3
4
  const CODE = 990021;
4
5
  function fire(ctx, target, messageText) {
@@ -6,33 +7,6 @@ function fire(ctx, target, messageText) {
6
7
  const start = target.getStart(sf);
7
8
  ctx.report({ ruleName: NAME, code: CODE, start, length: target.getEnd() - start, messageText, category: "warning" });
8
9
  }
9
- /** The `ImportDeclaration` a symbol's (local, un-aliased) declaration belongs to. */
10
- function importDeclOfSymbol(sym, t) {
11
- for (const d of sym?.declarations ?? []) {
12
- let n = d;
13
- // ImportSpecifier -> NamedImports -> ImportClause -> ImportDeclaration; a
14
- // NamespaceImport sits one level higher; a DEFAULT import binds the
15
- // ImportClause itself (`import e3 from "@elaraai/e3"`).
16
- if (t.isImportSpecifier(n))
17
- n = n.parent.parent.parent;
18
- else if (t.isNamespaceImport(n))
19
- n = n.parent.parent;
20
- else if (t.isImportClause(n))
21
- n = n.parent;
22
- else
23
- continue;
24
- if (t.isImportDeclaration(n))
25
- return n;
26
- }
27
- return undefined;
28
- }
29
- /** Does `id` resolve to a binding imported from any `@elaraai/*` package? (Keyed by
30
- * SYMBOL → import specifier, like the other host-vs-East rules — never the text.) */
31
- function resolvesToEastImport(id, ctx) {
32
- const t = ctx.ts;
33
- const imp = importDeclOfSymbol(ctx.checker.getSymbolAtLocation(id), t);
34
- return imp !== undefined && t.isStringLiteral(imp.moduleSpecifier) && imp.moduleSpecifier.text.startsWith("@elaraai/");
35
- }
36
10
  /** Is `node` a call `<e3>.input(...)` where `<e3>` is the DEFAULT import of `@elaraai/e3`? */
37
11
  function isE3InputCall(node, ctx) {
38
12
  const t = ctx.ts;
@@ -41,7 +15,7 @@ function isE3InputCall(node, ctx) {
41
15
  return false;
42
16
  if (!t.isIdentifier(callee.expression))
43
17
  return false;
44
- const imp = importDeclOfSymbol(ctx.checker.getSymbolAtLocation(callee.expression), t);
18
+ const imp = importDeclarationOf(ctx.checker.getSymbolAtLocation(callee.expression), t);
45
19
  return imp !== undefined && t.isStringLiteral(imp.moduleSpecifier) && imp.moduleSpecifier.text === "@elaraai/e3";
46
20
  }
47
21
  /** The root identifier a call/member chain is rooted on (`a.b.c(...)` -> `a`). */
@@ -83,14 +57,14 @@ function embedsHostComputation(expr, ctx) {
83
57
  return;
84
58
  if (t.isCallExpression(n)) {
85
59
  const root = rootIdentifier(n.expression, t);
86
- if (root === undefined || !resolvesToEastImport(root, ctx)) {
60
+ if (root === undefined || !resolvesToEastImport(root, ctx.checker, t)) {
87
61
  bad = true;
88
62
  return;
89
63
  }
90
64
  }
91
65
  else if (t.isNewExpression(n)) {
92
66
  const ctor = n.expression;
93
- const ok = t.isIdentifier(ctor) && (VALUE_CTORS.has(ctor.text) || resolvesToEastImport(ctor, ctx));
67
+ const ok = t.isIdentifier(ctor) && (VALUE_CTORS.has(ctor.text) || resolvesToEastImport(ctor, ctx.checker, t));
94
68
  if (!ok) {
95
69
  bad = true;
96
70
  return;