@elaraai/east-diagnostics 1.0.4
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/LICENSE.md +31 -0
- package/README.md +74 -0
- package/dist/src/block-builder.d.ts +16 -0
- package/dist/src/block-builder.d.ts.map +1 -0
- package/dist/src/block-builder.js +19 -0
- package/dist/src/block-builder.js.map +1 -0
- package/dist/src/block-scope.d.ts +27 -0
- package/dist/src/block-scope.d.ts.map +1 -0
- package/dist/src/block-scope.js +53 -0
- package/dist/src/block-scope.js.map +1 -0
- package/dist/src/east-type.d.ts +8 -0
- package/dist/src/east-type.d.ts.map +1 -0
- package/dist/src/east-type.js +28 -0
- package/dist/src/east-type.js.map +1 -0
- package/dist/src/index.d.ts +10 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +4 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/rules/index.d.ts +19 -0
- package/dist/src/rules/index.d.ts.map +1 -0
- package/dist/src/rules/index.js +39 -0
- package/dist/src/rules/index.js.map +1 -0
- package/dist/src/rules/no-east-data-builder-helper.d.ts +3 -0
- package/dist/src/rules/no-east-data-builder-helper.d.ts.map +1 -0
- package/dist/src/rules/no-east-data-builder-helper.js +90 -0
- package/dist/src/rules/no-east-data-builder-helper.js.map +1 -0
- package/dist/src/rules/no-east-namespaced-type.d.ts +7 -0
- package/dist/src/rules/no-east-namespaced-type.d.ts.map +1 -0
- package/dist/src/rules/no-east-namespaced-type.js +32 -0
- package/dist/src/rules/no-east-namespaced-type.js.map +1 -0
- package/dist/src/rules/no-handrolled-variant.d.ts +3 -0
- package/dist/src/rules/no-handrolled-variant.d.ts.map +1 -0
- package/dist/src/rules/no-handrolled-variant.js +45 -0
- package/dist/src/rules/no-handrolled-variant.js.map +1 -0
- package/dist/src/rules/no-let-const-in-expression.d.ts +3 -0
- package/dist/src/rules/no-let-const-in-expression.d.ts.map +1 -0
- package/dist/src/rules/no-let-const-in-expression.js +51 -0
- package/dist/src/rules/no-let-const-in-expression.js.map +1 -0
- package/dist/src/rules/no-redundant-east-cast.d.ts +3 -0
- package/dist/src/rules/no-redundant-east-cast.d.ts.map +1 -0
- package/dist/src/rules/no-redundant-east-cast.js +44 -0
- package/dist/src/rules/no-redundant-east-cast.js.map +1 -0
- package/dist/src/rules/no-reinlined-east-binding.d.ts +3 -0
- package/dist/src/rules/no-reinlined-east-binding.d.ts.map +1 -0
- package/dist/src/rules/no-reinlined-east-binding.js +79 -0
- package/dist/src/rules/no-reinlined-east-binding.js.map +1 -0
- package/dist/src/rules/no-relative-src-import.d.ts +3 -0
- package/dist/src/rules/no-relative-src-import.d.ts.map +1 -0
- package/dist/src/rules/no-relative-src-import.js +40 -0
- package/dist/src/rules/no-relative-src-import.js.map +1 -0
- package/dist/src/rules/no-ts-helpers-in-east.d.ts +3 -0
- package/dist/src/rules/no-ts-helpers-in-east.d.ts.map +1 -0
- package/dist/src/rules/no-ts-helpers-in-east.js +50 -0
- package/dist/src/rules/no-ts-helpers-in-east.js.map +1 -0
- package/dist/src/rules/no-unexecuted-east-expression.d.ts +3 -0
- package/dist/src/rules/no-unexecuted-east-expression.d.ts.map +1 -0
- package/dist/src/rules/no-unexecuted-east-expression.js +50 -0
- package/dist/src/rules/no-unexecuted-east-expression.js.map +1 -0
- package/dist/src/rules/prefer-explicit-east-type.d.ts +3 -0
- package/dist/src/rules/prefer-explicit-east-type.d.ts.map +1 -0
- package/dist/src/rules/prefer-explicit-east-type.js +60 -0
- package/dist/src/rules/prefer-explicit-east-type.js.map +1 -0
- package/dist/src/rules/prefer-jsx-over-factory-call.d.ts +3 -0
- package/dist/src/rules/prefer-jsx-over-factory-call.d.ts.map +1 -0
- package/dist/src/rules/prefer-jsx-over-factory-call.js +141 -0
- package/dist/src/rules/prefer-jsx-over-factory-call.js.map +1 -0
- package/dist/src/rules/prefer-let-const-over-east-value.d.ts +7 -0
- package/dist/src/rules/prefer-let-const-over-east-value.d.ts.map +1 -0
- package/dist/src/rules/prefer-let-const-over-east-value.js +71 -0
- package/dist/src/rules/prefer-let-const-over-east-value.js.map +1 -0
- package/dist/src/rules/prefer-some-none.d.ts +7 -0
- package/dist/src/rules/prefer-some-none.d.ts.map +1 -0
- package/dist/src/rules/prefer-some-none.js +36 -0
- package/dist/src/rules/prefer-some-none.js.map +1 -0
- package/dist/src/run.d.ts +11 -0
- package/dist/src/run.d.ts.map +1 -0
- package/dist/src/run.js +25 -0
- package/dist/src/run.js.map +1 -0
- package/dist/src/service.d.ts +19 -0
- package/dist/src/service.d.ts.map +1 -0
- package/dist/src/service.js +149 -0
- package/dist/src/service.js.map +1 -0
- package/dist/src/types.d.ts +56 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefer-jsx-over-factory-call.js","sourceRoot":"","sources":["../../../src/rules/prefer-jsx-over-factory-call.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
import type { EastRule } from "../types.js";
|
|
6
|
+
export declare const preferLetConstOverEastValue: EastRule;
|
|
7
|
+
//# sourceMappingURL=prefer-let-const-over-east-value.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefer-let-const-over-east-value.d.ts","sourceRoot":"","sources":["../../../src/rules/prefer-let-const-over-east-value.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAc5C,eAAO,MAAM,2BAA2B,EAAE,QA0DzC,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { insideBlockScope } from "../block-scope.js";
|
|
2
|
+
const NAME = "prefer-let-const-over-east-value";
|
|
3
|
+
const CODE = 990006;
|
|
4
|
+
// Inside an East block, bind block-local values with $.let / $.const
|
|
5
|
+
// (which carry the East type at the call site). Both `const xs = East.value(...)`
|
|
6
|
+
// and `return East.value(...)` erase the type there — bind with the East type
|
|
7
|
+
// and return the variable instead. The third form is a callback's concise-arrow
|
|
8
|
+
// body (`hits.map(($, r) => East.value({…}, T))`): the callback's expected
|
|
9
|
+
// element type already supplies `T`, so the wrapper is redundant — return the
|
|
10
|
+
// plain value. A bare `East.value(x)` as a method argument (wrapping an external
|
|
11
|
+
// constant, no contextual type) stays valid.
|
|
12
|
+
export const preferLetConstOverEastValue = {
|
|
13
|
+
name: NAME,
|
|
14
|
+
code: CODE,
|
|
15
|
+
description: "Inside East.function blocks, bind with $.let/$.const (and return that) rather than East.value().",
|
|
16
|
+
check(node, ctx) {
|
|
17
|
+
const t = ctx.ts;
|
|
18
|
+
if (!t.isCallExpression(node))
|
|
19
|
+
return;
|
|
20
|
+
const callee = node.expression;
|
|
21
|
+
if (!t.isPropertyAccessExpression(callee))
|
|
22
|
+
return;
|
|
23
|
+
if (!t.isIdentifier(callee.expression) || callee.expression.text !== "East")
|
|
24
|
+
return;
|
|
25
|
+
if (callee.name.text !== "value")
|
|
26
|
+
return;
|
|
27
|
+
const parent = node.parent;
|
|
28
|
+
const asDeclaration = parent !== undefined && t.isVariableDeclaration(parent) && parent.initializer === node;
|
|
29
|
+
const asReturn = parent !== undefined && t.isReturnStatement(parent) && parent.expression === node;
|
|
30
|
+
// A concise-arrow body that is itself a callback argument: `.map(($, r) =>
|
|
31
|
+
// East.value({…}, T))`. The callback's expected type supplies `T`, so the
|
|
32
|
+
// wrapper is redundant. A free arrow assigned to a variable (no contextual
|
|
33
|
+
// East type) is excluded — there the type argument is load-bearing.
|
|
34
|
+
const asCallbackBody = parent !== undefined &&
|
|
35
|
+
t.isArrowFunction(parent) &&
|
|
36
|
+
parent.body === node &&
|
|
37
|
+
parent.parent !== undefined &&
|
|
38
|
+
t.isCallExpression(parent.parent) &&
|
|
39
|
+
parent.parent.arguments.some((arg) => arg === parent);
|
|
40
|
+
if (!asDeclaration && !asReturn && !asCallbackBody)
|
|
41
|
+
return;
|
|
42
|
+
if (!insideBlockScope(node, ctx))
|
|
43
|
+
return;
|
|
44
|
+
const sf = ctx.sourceFile;
|
|
45
|
+
const start = node.getStart(sf);
|
|
46
|
+
const inner = node.arguments[0];
|
|
47
|
+
ctx.report({
|
|
48
|
+
ruleName: NAME,
|
|
49
|
+
code: CODE,
|
|
50
|
+
start,
|
|
51
|
+
length: node.getEnd() - start,
|
|
52
|
+
messageText: asCallbackBody
|
|
53
|
+
? "Don't wrap a callback's return in `East.value(...)` — the callback's expected element type already supplies the East type. Return the plain value."
|
|
54
|
+
: asReturn
|
|
55
|
+
? "Don't `return East.value(...)` — it erases the East type. Bind the value with `$.let`/`$.const` (passing the East type) and return that variable."
|
|
56
|
+
: "Inside an East block, declare with `$.const(value, Type)` / `$.let(value, Type)` instead of `East.value(...)`, which erases the East type at the call site.",
|
|
57
|
+
category: "suggestion",
|
|
58
|
+
...(asCallbackBody && inner !== undefined
|
|
59
|
+
? {
|
|
60
|
+
fix: {
|
|
61
|
+
description: "Return the plain value (drop the redundant East.value wrapper)",
|
|
62
|
+
changes: [
|
|
63
|
+
{ start, length: node.getEnd() - start, newText: inner.getText(sf) },
|
|
64
|
+
],
|
|
65
|
+
},
|
|
66
|
+
}
|
|
67
|
+
: {}),
|
|
68
|
+
});
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=prefer-let-const-over-east-value.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefer-let-const-over-east-value.js","sourceRoot":"","sources":["../../../src/rules/prefer-let-const-over-east-value.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
import type { EastRule } from "../types.js";
|
|
6
|
+
export declare const preferSomeNone: EastRule;
|
|
7
|
+
//# sourceMappingURL=prefer-some-none.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefer-some-none.d.ts","sourceRoot":"","sources":["../../../src/rules/prefer-some-none.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAO5C,eAAO,MAAM,cAAc,EAAE,QA6B5B,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
const NAME = "prefer-some-none";
|
|
2
|
+
const CODE = 990003;
|
|
3
|
+
// `some(x)` / `none` are the canonical Option constructors; `variant("some", x)`
|
|
4
|
+
// and `variant("none", null)` produce the same value but are discouraged.
|
|
5
|
+
export const preferSomeNone = {
|
|
6
|
+
name: NAME,
|
|
7
|
+
code: CODE,
|
|
8
|
+
description: 'Prefer some()/none over variant("some", …)/variant("none", null).',
|
|
9
|
+
check(node, ctx) {
|
|
10
|
+
const t = ctx.ts;
|
|
11
|
+
if (!t.isCallExpression(node))
|
|
12
|
+
return;
|
|
13
|
+
const callee = node.expression;
|
|
14
|
+
if (!t.isIdentifier(callee) || callee.text !== "variant")
|
|
15
|
+
return;
|
|
16
|
+
const first = node.arguments[0];
|
|
17
|
+
if (first === undefined || !t.isStringLiteralLike(first))
|
|
18
|
+
return;
|
|
19
|
+
const tag = first.text;
|
|
20
|
+
if (tag !== "some" && tag !== "none")
|
|
21
|
+
return;
|
|
22
|
+
const sf = ctx.sourceFile;
|
|
23
|
+
const start = node.getStart(sf);
|
|
24
|
+
ctx.report({
|
|
25
|
+
ruleName: NAME,
|
|
26
|
+
code: CODE,
|
|
27
|
+
start,
|
|
28
|
+
length: node.getEnd() - start,
|
|
29
|
+
messageText: tag === "some"
|
|
30
|
+
? 'Use `some(value)` instead of `variant("some", value)`.'
|
|
31
|
+
: 'Use `none` instead of `variant("none", null)`.',
|
|
32
|
+
category: "warning",
|
|
33
|
+
});
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=prefer-some-none.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefer-some-none.js","sourceRoot":"","sources":["../../../src/rules/prefer-some-none.ts"],"names":[],"mappings":"AAMA,MAAM,IAAI,GAAG,kBAAkB,CAAC;AAChC,MAAM,IAAI,GAAG,MAAM,CAAC;AAEpB,iFAAiF;AACjF,0EAA0E;AAC1E,MAAM,CAAC,MAAM,cAAc,GAAa;IACtC,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,WAAW,EAAE,mEAAmE;IAChF,KAAK,CAAC,IAAI,EAAE,GAAG;QACb,MAAM,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;QACjB,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC;YAAE,OAAO;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;QAC/B,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO;QAEjE,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC;YAAE,OAAO;QACjE,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC;QACvB,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,MAAM;YAAE,OAAO;QAE7C,MAAM,EAAE,GAAG,GAAG,CAAC,UAAU,CAAC;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAChC,GAAG,CAAC,MAAM,CAAC;YACT,QAAQ,EAAE,IAAI;YACd,IAAI,EAAE,IAAI;YACV,KAAK;YACL,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK;YAC7B,WAAW,EACT,GAAG,KAAK,MAAM;gBACZ,CAAC,CAAC,wDAAwD;gBAC1D,CAAC,CAAC,gDAAgD;YACtD,QAAQ,EAAE,SAAS;SACpB,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
import type * as ts from "typescript";
|
|
6
|
+
import type { EastDiagnostic, EastRule, EastRulesOptions, TsModule } from "./types.js";
|
|
7
|
+
/** Run a set of East rules over one source file, returning diagnostics. The
|
|
8
|
+
* `typescript` module is injected so rules use the host's compiler version.
|
|
9
|
+
* `rules` defaults to `allRules` (the run-anywhere set). */
|
|
10
|
+
export declare function runEastRules(tsModule: TsModule, program: ts.Program, sourceFile: ts.SourceFile, checker: ts.TypeChecker, options?: EastRulesOptions, rules?: readonly EastRule[]): EastDiagnostic[];
|
|
11
|
+
//# sourceMappingURL=run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/run.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,gBAAgB,EAAe,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGpG;;4DAE4D;AAC5D,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,EAAE,CAAC,OAAO,EACnB,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,OAAO,EAAE,EAAE,CAAC,WAAW,EACvB,OAAO,GAAE,gBAAqB,EAC9B,KAAK,GAAE,SAAS,QAAQ,EAAa,GACpC,cAAc,EAAE,CAqBlB"}
|
package/dist/src/run.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { allRules } from "./rules/index.js";
|
|
2
|
+
/** Run a set of East rules over one source file, returning diagnostics. The
|
|
3
|
+
* `typescript` module is injected so rules use the host's compiler version.
|
|
4
|
+
* `rules` defaults to `allRules` (the run-anywhere set). */
|
|
5
|
+
export function runEastRules(tsModule, program, sourceFile, checker, options = {}, rules = allRules) {
|
|
6
|
+
const diagnostics = [];
|
|
7
|
+
const ctx = {
|
|
8
|
+
ts: tsModule,
|
|
9
|
+
sourceFile,
|
|
10
|
+
checker,
|
|
11
|
+
program,
|
|
12
|
+
options,
|
|
13
|
+
report: (d) => diagnostics.push(d),
|
|
14
|
+
};
|
|
15
|
+
const disabled = new Set(options.disabled ?? []);
|
|
16
|
+
const active = rules.filter((rule) => !disabled.has(rule.name));
|
|
17
|
+
const visit = (node) => {
|
|
18
|
+
for (const rule of active)
|
|
19
|
+
rule.check(node, ctx);
|
|
20
|
+
tsModule.forEachChild(node, visit);
|
|
21
|
+
};
|
|
22
|
+
visit(sourceFile);
|
|
23
|
+
return diagnostics;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/run.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C;;4DAE4D;AAC5D,MAAM,UAAU,YAAY,CAC1B,QAAkB,EAClB,OAAmB,EACnB,UAAyB,EACzB,OAAuB,EACvB,UAA4B,EAAE,EAC9B,QAA6B,QAAQ;IAErC,MAAM,WAAW,GAAqB,EAAE,CAAC;IACzC,MAAM,GAAG,GAAgB;QACvB,EAAE,EAAE,QAAQ;QACZ,UAAU;QACV,OAAO;QACP,OAAO;QACP,OAAO;QACP,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;KACnC,CAAC;IAEF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAEhE,MAAM,KAAK,GAAG,CAAC,IAAa,EAAQ,EAAE;QACpC,KAAK,MAAM,IAAI,IAAI,MAAM;YAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACjD,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC;IACF,KAAK,CAAC,UAAU,CAAC,CAAC;IAElB,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { EastDiagnostic, EastRule, EastRulesOptions } from "./types.js";
|
|
2
|
+
export interface DiagnosticsServiceOptions {
|
|
3
|
+
rules?: readonly EastRule[];
|
|
4
|
+
rulesOptions?: EastRulesOptions;
|
|
5
|
+
}
|
|
6
|
+
export interface DiagnosticsService {
|
|
7
|
+
/** Native (semantic + syntactic) diagnostics for the file plus East rule
|
|
8
|
+
* diagnostics, sorted by position. Returns `[]` if the file has no project. */
|
|
9
|
+
diagnose(filePath: string): EastDiagnostic[];
|
|
10
|
+
/** `diagnose`, rendered as an `<east-code-review>` block, or `""` if clean. */
|
|
11
|
+
diagnoseText(filePath: string): string;
|
|
12
|
+
/** Pre-build the LanguageService for the project nearest `fromDir` so the
|
|
13
|
+
* first real `diagnose` doesn't pay the cold program+checker build. Returns
|
|
14
|
+
* `false` when there is no tsconfig above `fromDir`. */
|
|
15
|
+
warm(fromDir: string): boolean;
|
|
16
|
+
dispose(): void;
|
|
17
|
+
}
|
|
18
|
+
export declare function createDiagnosticsService(options?: DiagnosticsServiceOptions): DiagnosticsService;
|
|
19
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/service.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAA0B,QAAQ,EAAE,gBAAgB,EAAY,MAAM,YAAY,CAAC;AAK/G,MAAM,WAAW,yBAAyB;IACxC,KAAK,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;IAC5B,YAAY,CAAC,EAAE,gBAAgB,CAAC;CACjC;AAED,MAAM,WAAW,kBAAkB;IACjC;mFAC+E;IAC/E,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,EAAE,CAAC;IAC7C,+EAA+E;IAC/E,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;IACvC;;4DAEwD;IACxD,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAC/B,OAAO,IAAI,IAAI,CAAC;CACjB;AAmCD,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,yBAA8B,GAAG,kBAAkB,CAwHpG"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
import { createRequire } from "node:module";
|
|
6
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
7
|
+
import { dirname, join, resolve } from "node:path";
|
|
8
|
+
import { runEastRules } from "./run.js";
|
|
9
|
+
const MAX_MESSAGE_LENGTH = 300;
|
|
10
|
+
function findNearestTsconfig(fromPath) {
|
|
11
|
+
let dir = dirname(resolve(fromPath));
|
|
12
|
+
for (;;) {
|
|
13
|
+
const candidate = join(dir, "tsconfig.json");
|
|
14
|
+
if (existsSync(candidate))
|
|
15
|
+
return candidate;
|
|
16
|
+
const parent = dirname(dir);
|
|
17
|
+
if (parent === dir)
|
|
18
|
+
return undefined;
|
|
19
|
+
dir = parent;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function loadTypeScript(projectDir) {
|
|
23
|
+
try {
|
|
24
|
+
return createRequire(join(projectDir, "_.js"))("typescript");
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return createRequire(import.meta.url)("typescript");
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function toCategory(t, category) {
|
|
31
|
+
if (category === t.DiagnosticCategory.Error)
|
|
32
|
+
return "error";
|
|
33
|
+
if (category === t.DiagnosticCategory.Warning)
|
|
34
|
+
return "warning";
|
|
35
|
+
return "suggestion";
|
|
36
|
+
}
|
|
37
|
+
export function createDiagnosticsService(options = {}) {
|
|
38
|
+
const projects = new Map();
|
|
39
|
+
function getProject(tsconfigPath) {
|
|
40
|
+
const existing = projects.get(tsconfigPath);
|
|
41
|
+
if (existing !== undefined)
|
|
42
|
+
return existing;
|
|
43
|
+
const projectDir = dirname(tsconfigPath);
|
|
44
|
+
const t = loadTypeScript(projectDir);
|
|
45
|
+
const configFile = t.readConfigFile(tsconfigPath, t.sys.readFile);
|
|
46
|
+
const parsed = t.parseJsonConfigFileContent(configFile.config ?? {}, t.sys, projectDir);
|
|
47
|
+
const project = {
|
|
48
|
+
ts: t,
|
|
49
|
+
service: undefined,
|
|
50
|
+
rootFileNames: new Set(parsed.fileNames.map((f) => resolve(f))),
|
|
51
|
+
adHoc: new Set(),
|
|
52
|
+
versions: new Map(),
|
|
53
|
+
};
|
|
54
|
+
const host = {
|
|
55
|
+
getScriptFileNames: () => [...project.rootFileNames, ...project.adHoc],
|
|
56
|
+
getScriptVersion: (f) => String(project.versions.get(resolve(f)) ?? 0),
|
|
57
|
+
getScriptSnapshot: (f) => {
|
|
58
|
+
const path = resolve(f);
|
|
59
|
+
if (!existsSync(path))
|
|
60
|
+
return undefined;
|
|
61
|
+
return t.ScriptSnapshot.fromString(readFileSync(path, "utf-8"));
|
|
62
|
+
},
|
|
63
|
+
getCurrentDirectory: () => projectDir,
|
|
64
|
+
getCompilationSettings: () => parsed.options,
|
|
65
|
+
getDefaultLibFileName: (o) => t.getDefaultLibFilePath(o),
|
|
66
|
+
fileExists: t.sys.fileExists,
|
|
67
|
+
readFile: t.sys.readFile,
|
|
68
|
+
readDirectory: t.sys.readDirectory,
|
|
69
|
+
directoryExists: t.sys.directoryExists,
|
|
70
|
+
getDirectories: t.sys.getDirectories,
|
|
71
|
+
};
|
|
72
|
+
if (t.sys.realpath !== undefined)
|
|
73
|
+
host.realpath = t.sys.realpath;
|
|
74
|
+
project.service = t.createLanguageService(host, t.createDocumentRegistry());
|
|
75
|
+
projects.set(tsconfigPath, project);
|
|
76
|
+
return project;
|
|
77
|
+
}
|
|
78
|
+
function analyze(filePath) {
|
|
79
|
+
const file = resolve(filePath);
|
|
80
|
+
const tsconfigPath = findNearestTsconfig(file);
|
|
81
|
+
if (tsconfigPath === undefined)
|
|
82
|
+
return undefined;
|
|
83
|
+
const project = getProject(tsconfigPath);
|
|
84
|
+
const t = project.ts;
|
|
85
|
+
if (!project.rootFileNames.has(file))
|
|
86
|
+
project.adHoc.add(file);
|
|
87
|
+
project.versions.set(file, (project.versions.get(file) ?? 0) + 1);
|
|
88
|
+
const program = project.service.getProgram();
|
|
89
|
+
const sourceFile = program?.getSourceFile(file);
|
|
90
|
+
if (program === undefined || sourceFile === undefined)
|
|
91
|
+
return undefined;
|
|
92
|
+
const native = [
|
|
93
|
+
...project.service.getSemanticDiagnostics(file),
|
|
94
|
+
...project.service.getSyntacticDiagnostics(file),
|
|
95
|
+
];
|
|
96
|
+
const nativeDiagnostics = native.flatMap((d) => {
|
|
97
|
+
if (d.start === undefined || d.length === undefined)
|
|
98
|
+
return [];
|
|
99
|
+
const message = t.flattenDiagnosticMessageText(d.messageText, " ");
|
|
100
|
+
return [{
|
|
101
|
+
ruleName: "tsc",
|
|
102
|
+
code: d.code,
|
|
103
|
+
start: d.start,
|
|
104
|
+
length: d.length,
|
|
105
|
+
messageText: message.length > MAX_MESSAGE_LENGTH ? `${message.slice(0, MAX_MESSAGE_LENGTH)}…` : message,
|
|
106
|
+
category: toCategory(t, d.category),
|
|
107
|
+
}];
|
|
108
|
+
});
|
|
109
|
+
const ruleDiagnostics = runEastRules(t, program, sourceFile, program.getTypeChecker(), options.rulesOptions ?? {}, options.rules);
|
|
110
|
+
const diagnostics = [...nativeDiagnostics, ...ruleDiagnostics].sort((a, b) => a.start - b.start);
|
|
111
|
+
return { diagnostics, sourceFile };
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
diagnose(filePath) {
|
|
115
|
+
return analyze(filePath)?.diagnostics ?? [];
|
|
116
|
+
},
|
|
117
|
+
diagnoseText(filePath) {
|
|
118
|
+
const result = analyze(filePath);
|
|
119
|
+
if (result === undefined || result.diagnostics.length === 0)
|
|
120
|
+
return "";
|
|
121
|
+
const { diagnostics, sourceFile } = result;
|
|
122
|
+
const lines = diagnostics.map((d) => {
|
|
123
|
+
const { line, character } = sourceFile.getLineAndCharacterOfPosition(d.start);
|
|
124
|
+
const label = d.ruleName === "tsc" ? `TS${d.code}` : d.ruleName;
|
|
125
|
+
return `- [${d.category}] ${line + 1}:${character + 1} (${label}) ${d.messageText}`;
|
|
126
|
+
});
|
|
127
|
+
return ["<east-code-review>", "## East issues in this file", "", ...lines, "</east-code-review>"].join("\n");
|
|
128
|
+
},
|
|
129
|
+
warm(fromDir) {
|
|
130
|
+
const tsconfigPath = findNearestTsconfig(join(resolve(fromDir), "_.ts"));
|
|
131
|
+
if (tsconfigPath === undefined)
|
|
132
|
+
return false;
|
|
133
|
+
const project = getProject(tsconfigPath);
|
|
134
|
+
// Force the program + global checker to build now (the cold cost) with one
|
|
135
|
+
// semantic pass; the global type-check warms the whole program, so the
|
|
136
|
+
// first real diagnose is fast instead of blowing the client's budget.
|
|
137
|
+
const [firstRoot] = project.rootFileNames;
|
|
138
|
+
if (firstRoot !== undefined)
|
|
139
|
+
project.service.getSemanticDiagnostics(firstRoot);
|
|
140
|
+
else
|
|
141
|
+
project.service.getProgram();
|
|
142
|
+
return true;
|
|
143
|
+
},
|
|
144
|
+
dispose() {
|
|
145
|
+
projects.clear();
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
import type * as ts from "typescript";
|
|
6
|
+
/** The `typescript` module instance, injected by the host (tsserver plugin,
|
|
7
|
+
* daemon, or test harness) so rules run against the host's compiler version. */
|
|
8
|
+
export type TsModule = typeof import("typescript");
|
|
9
|
+
export type EastDiagnosticCategory = "error" | "warning" | "suggestion";
|
|
10
|
+
/** A file-local text edit, in the same coordinate space as the diagnostic. */
|
|
11
|
+
export interface EastTextChange {
|
|
12
|
+
start: number;
|
|
13
|
+
length: number;
|
|
14
|
+
newText: string;
|
|
15
|
+
}
|
|
16
|
+
export interface EastFix {
|
|
17
|
+
description: string;
|
|
18
|
+
changes: EastTextChange[];
|
|
19
|
+
}
|
|
20
|
+
export interface EastDiagnostic {
|
|
21
|
+
ruleName: string;
|
|
22
|
+
code: number;
|
|
23
|
+
start: number;
|
|
24
|
+
length: number;
|
|
25
|
+
messageText: string;
|
|
26
|
+
category: EastDiagnosticCategory;
|
|
27
|
+
fix?: EastFix;
|
|
28
|
+
}
|
|
29
|
+
export interface EastRulesOptions {
|
|
30
|
+
/** Rule names to disable. */
|
|
31
|
+
disabled?: readonly string[];
|
|
32
|
+
preferExplicitEastType?: {
|
|
33
|
+
/** `"under-determined"` (default) flags only values whose East type can't
|
|
34
|
+
* be inferred (empty `[]` / `{}` / `new Map()` / `new Set()`).
|
|
35
|
+
* `"all-raw-values"` also flags any plain JS literal. */
|
|
36
|
+
mode?: "under-determined" | "all-raw-values";
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export interface RuleContext {
|
|
40
|
+
ts: TsModule;
|
|
41
|
+
sourceFile: ts.SourceFile;
|
|
42
|
+
checker: ts.TypeChecker;
|
|
43
|
+
/** The whole program — needed by rules that resolve cross-module types (e.g.
|
|
44
|
+
* `<source>/jsx-runtime`'s `JSX.Element`). Optional so a checker-only caller
|
|
45
|
+
* still works; rules that need it stay silent when it is absent. */
|
|
46
|
+
program?: ts.Program;
|
|
47
|
+
options: EastRulesOptions;
|
|
48
|
+
report(diagnostic: EastDiagnostic): void;
|
|
49
|
+
}
|
|
50
|
+
export interface EastRule {
|
|
51
|
+
name: string;
|
|
52
|
+
code: number;
|
|
53
|
+
description: string;
|
|
54
|
+
check(node: ts.Node, ctx: RuleContext): void;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAEtC;gFACgF;AAChF,MAAM,MAAM,QAAQ,GAAG,cAAc,YAAY,CAAC,CAAC;AAEnD,MAAM,MAAM,sBAAsB,GAAG,OAAO,GAAG,SAAS,GAAG,YAAY,CAAC;AAExE,8EAA8E;AAC9E,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,OAAO;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,cAAc,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,sBAAsB,CAAC;IACjC,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,6BAA6B;IAC7B,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,sBAAsB,CAAC,EAAE;QACvB;;iEAEyD;QACzD,IAAI,CAAC,EAAE,kBAAkB,GAAG,gBAAgB,CAAC;KAC9C,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,QAAQ,CAAC;IACb,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC;IAC1B,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC;IACxB;;wEAEoE;IACpE,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC;IACrB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,MAAM,CAAC,UAAU,EAAE,cAAc,GAAG,IAAI,CAAC;CAC1C;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAAC;CAC9C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@elaraai/east-diagnostics",
|
|
3
|
+
"version": "1.0.4",
|
|
4
|
+
"license": "AGPL-3.0-or-later",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"description": "East-aware diagnostic rules over the TypeScript checker — one shared engine for the editor (tsserver plugin), the agent (headless daemon), and CI.",
|
|
7
|
+
"main": "dist/src/index.js",
|
|
8
|
+
"types": "dist/src/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/src/index.d.ts",
|
|
12
|
+
"default": "./dist/src/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist/src",
|
|
17
|
+
"!dist/src/**/*.spec.*",
|
|
18
|
+
"README.md",
|
|
19
|
+
"LICENSE.md"
|
|
20
|
+
],
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": "git+https://github.com/elaraai/east-workspace.git",
|
|
24
|
+
"directory": "libs/east-diagnostics"
|
|
25
|
+
},
|
|
26
|
+
"keywords": [
|
|
27
|
+
"east",
|
|
28
|
+
"elara",
|
|
29
|
+
"diagnostics",
|
|
30
|
+
"typescript",
|
|
31
|
+
"lint"
|
|
32
|
+
],
|
|
33
|
+
"author": "Elara AI Pty Ltd",
|
|
34
|
+
"engines": {
|
|
35
|
+
"node": ">=22.0.0"
|
|
36
|
+
},
|
|
37
|
+
"peerDependencies": {
|
|
38
|
+
"typescript": ">=5.0.0"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@types/node": "^22.18.1",
|
|
42
|
+
"typescript": "~5.9.2",
|
|
43
|
+
"@elaraai/east": "1.0.4"
|
|
44
|
+
},
|
|
45
|
+
"scripts": {
|
|
46
|
+
"build": "tsc",
|
|
47
|
+
"test": "npm run build && node --enable-source-maps --test-reporter=spec --test 'dist/test/**/*.spec.js'"
|
|
48
|
+
}
|
|
49
|
+
}
|