@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
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { isEastPlatformDefinitionType } from "../east-type.js";
|
|
2
|
+
import { importDeclarationOf } from "../east-source.js";
|
|
3
|
+
const NAME = "require-runner-platforms";
|
|
4
|
+
const CODE = 990022;
|
|
5
|
+
/** Is `node` a call `<e3>.task(...)` where `<e3>` is the DEFAULT import of `@elaraai/e3`? */
|
|
6
|
+
function isE3TaskCall(node, ctx) {
|
|
7
|
+
const t = ctx.ts;
|
|
8
|
+
const callee = node.expression;
|
|
9
|
+
if (!t.isPropertyAccessExpression(callee) || callee.name.text !== "task")
|
|
10
|
+
return false;
|
|
11
|
+
if (!t.isIdentifier(callee.expression))
|
|
12
|
+
return false;
|
|
13
|
+
const imp = importDeclarationOf(ctx.checker.getSymbolAtLocation(callee.expression), t);
|
|
14
|
+
return imp !== undefined && t.isStringLiteral(imp.moduleSpecifier) && imp.moduleSpecifier.text === "@elaraai/e3";
|
|
15
|
+
}
|
|
16
|
+
/** The names of PROJECT-declared platform functions called anywhere in `fnArg` —
|
|
17
|
+
* callees typed as platform definitions whose declaration is project source (a
|
|
18
|
+
* `.ts`/`.tsx` file, not a package `.d.ts`). `@elaraai`-shipped platform fns are
|
|
19
|
+
* provided by the runtimes and never need a custom platforms entry. */
|
|
20
|
+
function projectPlatformCalls(fnArg, ctx) {
|
|
21
|
+
const t = ctx.ts;
|
|
22
|
+
const names = [];
|
|
23
|
+
const visit = (n) => {
|
|
24
|
+
if (t.isCallExpression(n) && isEastPlatformDefinitionType(ctx.checker.getTypeAtLocation(n.expression))) {
|
|
25
|
+
const callee = n.expression;
|
|
26
|
+
const id = t.isIdentifier(callee) ? callee : t.isPropertyAccessExpression(callee) ? callee.name : undefined;
|
|
27
|
+
const sym = id !== undefined ? ctx.checker.getSymbolAtLocation(id) : undefined;
|
|
28
|
+
// Follow the import alias to the defining const — the declaration file is
|
|
29
|
+
// what distinguishes a project stub from a packaged platform fn.
|
|
30
|
+
const resolved = sym !== undefined && (sym.flags & t.SymbolFlags.Alias) !== 0 ? ctx.checker.getAliasedSymbol(sym) : sym;
|
|
31
|
+
const declaredInProject = (resolved?.declarations ?? []).some((d) => !d.getSourceFile().isDeclarationFile);
|
|
32
|
+
if (declaredInProject && id !== undefined)
|
|
33
|
+
names.push(id.text);
|
|
34
|
+
}
|
|
35
|
+
t.forEachChild(n, visit);
|
|
36
|
+
};
|
|
37
|
+
visit(fnArg);
|
|
38
|
+
return names;
|
|
39
|
+
}
|
|
40
|
+
/** Does the (visible) options literal declare a `runner.platforms` entry with a
|
|
41
|
+
* `custom` module? Returns undefined when the options are not statically
|
|
42
|
+
* inspectable (identifier / spread) — then we stay silent. */
|
|
43
|
+
function hasCustomPlatformsEntry(options, t) {
|
|
44
|
+
if (options === undefined)
|
|
45
|
+
return false; // no options at all — definitely no platforms
|
|
46
|
+
if (!t.isObjectLiteralExpression(options))
|
|
47
|
+
return undefined;
|
|
48
|
+
const runnerProp = options.properties.find((p) => t.isPropertyAssignment(p) && t.isIdentifier(p.name) && p.name.text === "runner");
|
|
49
|
+
if (runnerProp === undefined || !t.isPropertyAssignment(runnerProp))
|
|
50
|
+
return false;
|
|
51
|
+
if (!t.isObjectLiteralExpression(runnerProp.initializer))
|
|
52
|
+
return undefined;
|
|
53
|
+
const platformsProp = runnerProp.initializer.properties.find((p) => t.isPropertyAssignment(p) && t.isIdentifier(p.name) && p.name.text === "platforms");
|
|
54
|
+
if (platformsProp === undefined || !t.isPropertyAssignment(platformsProp))
|
|
55
|
+
return false;
|
|
56
|
+
if (!t.isArrayLiteralExpression(platformsProp.initializer))
|
|
57
|
+
return undefined;
|
|
58
|
+
return platformsProp.initializer.elements.some((el) => t.isObjectLiteralExpression(el) &&
|
|
59
|
+
el.properties.some((p) => t.isPropertyAssignment(p) && t.isIdentifier(p.name) && p.name.text === "custom"));
|
|
60
|
+
}
|
|
61
|
+
// An `e3.task` whose East function calls a PROJECT-declared platform function
|
|
62
|
+
// (an `East.platform("proj.x", …)` stub mirrored by the project's own platform
|
|
63
|
+
// module) needs `runner.platforms` to load that module — without a `{ custom:
|
|
64
|
+
// "…" }` entry the task deploys fine and fails at dataflow runtime with
|
|
65
|
+
// "Platform function 'proj.x' is not available".
|
|
66
|
+
export const requireRunnerPlatforms = {
|
|
67
|
+
name: NAME,
|
|
68
|
+
code: CODE,
|
|
69
|
+
description: "An e3.task calling project-declared platform functions must declare a runner.platforms custom module — otherwise it fails only at dataflow runtime.",
|
|
70
|
+
check(node, ctx) {
|
|
71
|
+
const t = ctx.ts;
|
|
72
|
+
if (!t.isCallExpression(node) || !isE3TaskCall(node, ctx))
|
|
73
|
+
return;
|
|
74
|
+
const fnArg = node.arguments[2];
|
|
75
|
+
if (fnArg === undefined)
|
|
76
|
+
return;
|
|
77
|
+
const calls = projectPlatformCalls(fnArg, ctx);
|
|
78
|
+
if (calls.length === 0)
|
|
79
|
+
return;
|
|
80
|
+
const ok = hasCustomPlatformsEntry(node.arguments[3], t);
|
|
81
|
+
if (ok === true || ok === undefined)
|
|
82
|
+
return; // present, or not statically visible
|
|
83
|
+
const nameArg = node.arguments[0];
|
|
84
|
+
const taskName = nameArg !== undefined && t.isStringLiteralLike(nameArg) ? nameArg.text : "…";
|
|
85
|
+
const unique = [...new Set(calls)].join(", ");
|
|
86
|
+
const sf = ctx.sourceFile;
|
|
87
|
+
const target = node.arguments[3] ?? node.expression;
|
|
88
|
+
const start = target.getStart(sf);
|
|
89
|
+
ctx.report({
|
|
90
|
+
ruleName: NAME,
|
|
91
|
+
code: CODE,
|
|
92
|
+
start,
|
|
93
|
+
length: target.getEnd() - start,
|
|
94
|
+
messageText: `Task "${taskName}" calls project platform function(s) ${unique} but its runner declares no custom platform module — it will fail at dataflow runtime with "Platform function … is not available". Add the module to the runner, e.g. \`{ runner: { runtime: "east-py", platforms: [{ custom: "platform_module" }] } }\`.`,
|
|
95
|
+
category: "warning",
|
|
96
|
+
});
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
//# sourceMappingURL=require-runner-platforms.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"require-runner-platforms.js","sourceRoot":"","sources":["../../../src/rules/require-runner-platforms.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elaraai/east-diagnostics",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.29",
|
|
4
4
|
"license": "AGPL-3.0-or-later",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "East-aware diagnostic rules over the TypeScript checker — one shared engine for the editor (tsserver plugin), the agent (headless daemon), and CI.",
|
|
@@ -44,8 +44,8 @@
|
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"@types/node": "^22.18.1",
|
|
46
46
|
"typescript": "~5.9.2",
|
|
47
|
-
"@elaraai/east": "1.0.
|
|
48
|
-
"@elaraai/e3": "1.0.
|
|
47
|
+
"@elaraai/east": "1.0.29",
|
|
48
|
+
"@elaraai/e3": "1.0.29"
|
|
49
49
|
},
|
|
50
50
|
"scripts": {
|
|
51
51
|
"build": "tsc",
|