@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
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,
|
|
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"}
|
package/dist/src/block-scope.js
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/src/east-source.js
CHANGED
|
@@ -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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"}
|
package/dist/src/east-type.d.ts
CHANGED
|
@@ -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"}
|
package/dist/src/east-type.js
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/src/rules/index.js
CHANGED
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/rules/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,
|
|
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
|
|
62
|
-
//
|
|
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":"AAMA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;
|
|
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;
|
|
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 =
|
|
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;
|