@elaraai/east-diagnostics 1.0.4 → 1.0.6
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 +4 -1
- package/dist/src/east-module.d.ts +45 -0
- package/dist/src/east-module.d.ts.map +1 -0
- package/dist/src/east-module.js +57 -0
- package/dist/src/east-module.js.map +1 -0
- package/dist/src/index.d.ts +8 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +5 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/lsp.d.ts +11 -0
- package/dist/src/lsp.d.ts.map +1 -0
- package/dist/src/lsp.js +236 -0
- package/dist/src/lsp.js.map +1 -0
- package/dist/src/rules/index.d.ts +1 -0
- package/dist/src/rules/index.d.ts.map +1 -1
- package/dist/src/rules/index.js +3 -0
- package/dist/src/rules/index.js.map +1 -1
- package/dist/src/rules/no-untracked-east-data.d.ts +3 -0
- package/dist/src/rules/no-untracked-east-data.d.ts.map +1 -0
- package/dist/src/rules/no-untracked-east-data.js +70 -0
- package/dist/src/rules/no-untracked-east-data.js.map +1 -0
- package/dist/src/service.d.ts +5 -0
- package/dist/src/service.d.ts.map +1 -1
- package/dist/src/service.js +34 -3
- package/dist/src/service.js.map +1 -1
- package/dist/src/tsserver-plugin.d.ts +25 -0
- package/dist/src/tsserver-plugin.d.ts.map +1 -0
- package/dist/src/tsserver-plugin.js +93 -0
- package/dist/src/tsserver-plugin.js.map +1 -0
- package/dist/src/type-diff-rewrite.d.ts +20 -0
- package/dist/src/type-diff-rewrite.d.ts.map +1 -0
- package/dist/src/type-diff-rewrite.js +94 -0
- package/dist/src/type-diff-rewrite.js.map +1 -0
- package/dist/src/type-reify.d.ts +25 -0
- package/dist/src/type-reify.d.ts.map +1 -0
- package/dist/src/type-reify.js +299 -0
- package/dist/src/type-reify.js.map +1 -0
- package/package.json +6 -2
- package/dist/src/rules/no-ts-helpers-in-east.d.ts +0 -3
- package/dist/src/rules/no-ts-helpers-in-east.d.ts.map +0 -1
- package/dist/src/rules/no-ts-helpers-in-east.js +0 -50
- package/dist/src/rules/no-ts-helpers-in-east.js.map +0 -1
package/dist/src/service.js
CHANGED
|
@@ -6,7 +6,12 @@ import { createRequire } from "node:module";
|
|
|
6
6
|
import { existsSync, readFileSync } from "node:fs";
|
|
7
7
|
import { dirname, join, resolve } from "node:path";
|
|
8
8
|
import { runEastRules } from "./run.js";
|
|
9
|
+
import { getEastModule } from "./east-module.js";
|
|
10
|
+
import { ASSIGNABILITY_CODES, rewriteEastAssignability } from "./type-diff-rewrite.js";
|
|
9
11
|
const MAX_MESSAGE_LENGTH = 300;
|
|
12
|
+
// Rewritten East type diffs are already pruned/capped by renderTypeDiff; allow
|
|
13
|
+
// them more room than raw native messages.
|
|
14
|
+
const MAX_REWRITTEN_LENGTH = 600;
|
|
10
15
|
function findNearestTsconfig(fromPath) {
|
|
11
16
|
let dir = dirname(resolve(fromPath));
|
|
12
17
|
for (;;) {
|
|
@@ -36,6 +41,10 @@ function toCategory(t, category) {
|
|
|
36
41
|
}
|
|
37
42
|
export function createDiagnosticsService(options = {}) {
|
|
38
43
|
const projects = new Map();
|
|
44
|
+
// Keyed by resolved path, shared across projects. analyze() bumps the file's
|
|
45
|
+
// version on every call, so overlay changes are picked up by the next
|
|
46
|
+
// diagnose without separate invalidation.
|
|
47
|
+
const overlays = new Map();
|
|
39
48
|
function getProject(tsconfigPath) {
|
|
40
49
|
const existing = projects.get(tsconfigPath);
|
|
41
50
|
if (existing !== undefined)
|
|
@@ -56,6 +65,9 @@ export function createDiagnosticsService(options = {}) {
|
|
|
56
65
|
getScriptVersion: (f) => String(project.versions.get(resolve(f)) ?? 0),
|
|
57
66
|
getScriptSnapshot: (f) => {
|
|
58
67
|
const path = resolve(f);
|
|
68
|
+
const overlay = overlays.get(path);
|
|
69
|
+
if (overlay !== undefined)
|
|
70
|
+
return t.ScriptSnapshot.fromString(overlay);
|
|
59
71
|
if (!existsSync(path))
|
|
60
72
|
return undefined;
|
|
61
73
|
return t.ScriptSnapshot.fromString(readFileSync(path, "utf-8"));
|
|
@@ -63,7 +75,7 @@ export function createDiagnosticsService(options = {}) {
|
|
|
63
75
|
getCurrentDirectory: () => projectDir,
|
|
64
76
|
getCompilationSettings: () => parsed.options,
|
|
65
77
|
getDefaultLibFileName: (o) => t.getDefaultLibFilePath(o),
|
|
66
|
-
fileExists: t.sys.fileExists,
|
|
78
|
+
fileExists: (f) => overlays.has(resolve(f)) || t.sys.fileExists(f),
|
|
67
79
|
readFile: t.sys.readFile,
|
|
68
80
|
readDirectory: t.sys.readDirectory,
|
|
69
81
|
directoryExists: t.sys.directoryExists,
|
|
@@ -93,16 +105,28 @@ export function createDiagnosticsService(options = {}) {
|
|
|
93
105
|
...project.service.getSemanticDiagnostics(file),
|
|
94
106
|
...project.service.getSyntacticDiagnostics(file),
|
|
95
107
|
];
|
|
108
|
+
const projectDir = dirname(tsconfigPath);
|
|
96
109
|
const nativeDiagnostics = native.flatMap((d) => {
|
|
97
110
|
if (d.start === undefined || d.length === undefined)
|
|
98
111
|
return [];
|
|
99
|
-
|
|
112
|
+
let message = t.flattenDiagnosticMessageText(d.messageText, " ");
|
|
113
|
+
let maxLength = MAX_MESSAGE_LENGTH;
|
|
114
|
+
if (ASSIGNABILITY_CODES.has(d.code)) {
|
|
115
|
+
const east = getEastModule(projectDir);
|
|
116
|
+
const rewritten = east !== undefined
|
|
117
|
+
? rewriteEastAssignability(t, program, sourceFile, d, east)
|
|
118
|
+
: undefined;
|
|
119
|
+
if (rewritten !== undefined) {
|
|
120
|
+
message = rewritten;
|
|
121
|
+
maxLength = MAX_REWRITTEN_LENGTH;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
100
124
|
return [{
|
|
101
125
|
ruleName: "tsc",
|
|
102
126
|
code: d.code,
|
|
103
127
|
start: d.start,
|
|
104
128
|
length: d.length,
|
|
105
|
-
messageText: message.length >
|
|
129
|
+
messageText: message.length > maxLength ? `${message.slice(0, maxLength)}…` : message,
|
|
106
130
|
category: toCategory(t, d.category),
|
|
107
131
|
}];
|
|
108
132
|
});
|
|
@@ -141,8 +165,15 @@ export function createDiagnosticsService(options = {}) {
|
|
|
141
165
|
project.service.getProgram();
|
|
142
166
|
return true;
|
|
143
167
|
},
|
|
168
|
+
setOverlay(filePath, content) {
|
|
169
|
+
overlays.set(resolve(filePath), content);
|
|
170
|
+
},
|
|
171
|
+
clearOverlay(filePath) {
|
|
172
|
+
overlays.delete(resolve(filePath));
|
|
173
|
+
},
|
|
144
174
|
dispose() {
|
|
145
175
|
projects.clear();
|
|
176
|
+
overlays.clear();
|
|
146
177
|
},
|
|
147
178
|
};
|
|
148
179
|
}
|
package/dist/src/service.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGnD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGnD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAEvF,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAC/B,+EAA+E;AAC/E,2CAA2C;AAC3C,MAAM,oBAAoB,GAAG,GAAG,CAAC;AAiCjC,SAAS,mBAAmB,CAAC,QAAgB;IAC3C,IAAI,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IACrC,SAAS,CAAC;QACR,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;QAC7C,IAAI,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;QAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,SAAS,CAAC;QACrC,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,UAAkB;IACxC,IAAI,CAAC;QACH,OAAO,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,YAAY,CAAa,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,YAAY,CAAa,CAAC;IAClE,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,CAAW,EAAE,QAA+B;IAC9D,IAAI,QAAQ,KAAK,CAAC,CAAC,kBAAkB,CAAC,KAAK;QAAE,OAAO,OAAO,CAAC;IAC5D,IAAI,QAAQ,KAAK,CAAC,CAAC,kBAAkB,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAChE,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,UAAqC,EAAE;IAC9E,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;IAC5C,6EAA6E;IAC7E,sEAAsE;IACtE,0CAA0C;IAC1C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE3C,SAAS,UAAU,CAAC,YAAoB;QACtC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC5C,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,QAAQ,CAAC;QAE5C,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;QACzC,MAAM,CAAC,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;QACrC,MAAM,UAAU,GAAG,CAAC,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClE,MAAM,MAAM,GAAG,CAAC,CAAC,0BAA0B,CAAC,UAAU,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAExF,MAAM,OAAO,GAAY;YACvB,EAAE,EAAE,CAAC;YACL,OAAO,EAAE,SAA0C;YACnD,aAAa,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/D,KAAK,EAAE,IAAI,GAAG,EAAE;YAChB,QAAQ,EAAE,IAAI,GAAG,EAAE;SACpB,CAAC;QAEF,MAAM,IAAI,GAA2B;YACnC,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,aAAa,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC;YACtE,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACtE,iBAAiB,EAAE,CAAC,CAAC,EAAE,EAAE;gBACvB,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBACxB,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACnC,IAAI,OAAO,KAAK,SAAS;oBAAE,OAAO,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBACvE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;oBAAE,OAAO,SAAS,CAAC;gBACxC,OAAO,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;YAClE,CAAC;YACD,mBAAmB,EAAE,GAAG,EAAE,CAAC,UAAU;YACrC,sBAAsB,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO;YAC5C,qBAAqB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC;YACxD,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;YAClE,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ;YACxB,aAAa,EAAE,CAAC,CAAC,GAAG,CAAC,aAAa;YAClC,eAAe,EAAE,CAAC,CAAC,GAAG,CAAC,eAAe;YACtC,cAAc,EAAE,CAAC,CAAC,GAAG,CAAC,cAAc;SACrC,CAAC;QACF,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS;YAAE,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;QAEjE,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,qBAAqB,CAAC,IAAI,EAAE,CAAC,CAAC,sBAAsB,EAAE,CAAC,CAAC;QAC5E,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACpC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,SAAS,OAAO,CAAC,QAAgB;QAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC/B,MAAM,YAAY,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,YAAY,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAEjD,MAAM,OAAO,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;QACzC,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC;QAErB,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAElE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC7C,MAAM,UAAU,GAAG,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,OAAO,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAExE,MAAM,MAAM,GAAG;YACb,GAAG,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,IAAI,CAAC;YAC/C,GAAG,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC,IAAI,CAAC;SACjD,CAAC;QACF,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;QACzC,MAAM,iBAAiB,GAAqB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YAC/D,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS;gBAAE,OAAO,EAAE,CAAC;YAC/D,IAAI,OAAO,GAAG,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;YACjE,IAAI,SAAS,GAAG,kBAAkB,CAAC;YACnC,IAAI,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpC,MAAM,IAAI,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;gBACvC,MAAM,SAAS,GAAG,IAAI,KAAK,SAAS;oBAClC,CAAC,CAAC,wBAAwB,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,CAAC;oBAC3D,CAAC,CAAC,SAAS,CAAC;gBACd,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;oBAC5B,OAAO,GAAG,SAAS,CAAC;oBACpB,SAAS,GAAG,oBAAoB,CAAC;gBACnC,CAAC;YACH,CAAC;YACD,OAAO,CAAC;oBACN,QAAQ,EAAE,KAAK;oBACf,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,WAAW,EAAE,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO;oBACrF,QAAQ,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC;iBACpC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,eAAe,GAAG,YAAY,CAClC,CAAC,EACD,OAAO,EACP,UAAU,EACV,OAAO,CAAC,cAAc,EAAE,EACxB,OAAO,CAAC,YAAY,IAAI,EAAE,EAC1B,OAAO,CAAC,KAAK,CACd,CAAC;QAEF,MAAM,WAAW,GAAG,CAAC,GAAG,iBAAiB,EAAE,GAAG,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QACjG,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;IACrC,CAAC;IAED,OAAO;QACL,QAAQ,CAAC,QAAQ;YACf,OAAO,OAAO,CAAC,QAAQ,CAAC,EAAE,WAAW,IAAI,EAAE,CAAC;QAC9C,CAAC;QACD,YAAY,CAAC,QAAQ;YACnB,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;YACjC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;YACvE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;YAC3C,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBAClC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC,6BAA6B,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBAC9E,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;gBAChE,OAAO,MAAM,CAAC,CAAC,QAAQ,KAAK,IAAI,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YACtF,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,oBAAoB,EAAE,6BAA6B,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,qBAAqB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/G,CAAC;QACD,IAAI,CAAC,OAAO;YACV,MAAM,YAAY,GAAG,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;YACzE,IAAI,YAAY,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAC;YAC7C,MAAM,OAAO,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;YACzC,2EAA2E;YAC3E,uEAAuE;YACvE,sEAAsE;YACtE,MAAM,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;YAC1C,IAAI,SAAS,KAAK,SAAS;gBAAE,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC;;gBAC1E,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,UAAU,CAAC,QAAQ,EAAE,OAAO;YAC1B,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;QAC3C,CAAC;QACD,YAAY,CAAC,QAAQ;YACnB,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrC,CAAC;QACD,OAAO;YACL,QAAQ,CAAC,KAAK,EAAE,CAAC;YACjB,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type * as ts from "typescript";
|
|
2
|
+
import type { TsModule } from "./types.js";
|
|
3
|
+
/** Structural subset of `ts.server.PluginCreateInfo` — keeps the package free
|
|
4
|
+
* of a tsserverlibrary type dependency. */
|
|
5
|
+
export interface TsserverPluginCreateInfo {
|
|
6
|
+
languageService: ts.LanguageService;
|
|
7
|
+
project: {
|
|
8
|
+
getCurrentDirectory(): string;
|
|
9
|
+
};
|
|
10
|
+
config?: {
|
|
11
|
+
disabled?: readonly string[];
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* tsserver plugin factory. Loaded by the TypeScript server via a
|
|
16
|
+
* `typescriptServerPlugins` contribution (VS Code) or a tsconfig
|
|
17
|
+
* `compilerOptions.plugins` entry; the host's `typescript` is injected.
|
|
18
|
+
*/
|
|
19
|
+
export declare function init(modules: {
|
|
20
|
+
typescript: TsModule;
|
|
21
|
+
}): {
|
|
22
|
+
create(info: TsserverPluginCreateInfo): ts.LanguageService;
|
|
23
|
+
};
|
|
24
|
+
export default init;
|
|
25
|
+
//# sourceMappingURL=tsserver-plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tsserver-plugin.d.ts","sourceRoot":"","sources":["../../src/tsserver-plugin.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAW3C;2CAC2C;AAC3C,MAAM,WAAW,wBAAwB;IACvC,eAAe,EAAE,EAAE,CAAC,eAAe,CAAC;IACpC,OAAO,EAAE;QAAE,mBAAmB,IAAI,MAAM,CAAA;KAAE,CAAC;IAC3C,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAC;CAC3C;AA8BD;;;;GAIG;AACH,wBAAgB,IAAI,CAAC,OAAO,EAAE;IAAE,UAAU,EAAE,QAAQ,CAAA;CAAE,GAAG;IAAE,MAAM,CAAC,IAAI,EAAE,wBAAwB,GAAG,EAAE,CAAC,eAAe,CAAA;CAAE,CAuDtH;AAED,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
6
|
+
import { dirname, join, resolve } from "node:path";
|
|
7
|
+
import { runEastRules } from "./run.js";
|
|
8
|
+
import { getEastModule } from "./east-module.js";
|
|
9
|
+
import { ASSIGNABILITY_CODES, rewriteEastAssignability } from "./type-diff-rewrite.js";
|
|
10
|
+
const CATEGORY = {
|
|
11
|
+
error: "Error",
|
|
12
|
+
warning: "Warning",
|
|
13
|
+
suggestion: "Suggestion",
|
|
14
|
+
};
|
|
15
|
+
// First-party @elaraai/* library src legitimately uses East-construction
|
|
16
|
+
// patterns the rules flag (every component factory looks like the
|
|
17
|
+
// data-builder antipattern) — same editor policy as the Claude plugin hook.
|
|
18
|
+
function isElaraaiPackageSrc(filePath) {
|
|
19
|
+
const file = resolve(filePath);
|
|
20
|
+
let dir = dirname(file);
|
|
21
|
+
for (;;) {
|
|
22
|
+
const candidate = join(dir, "package.json");
|
|
23
|
+
if (existsSync(candidate)) {
|
|
24
|
+
try {
|
|
25
|
+
const name = JSON.parse(readFileSync(candidate, "utf-8")).name;
|
|
26
|
+
return typeof name === "string" && name.startsWith("@elaraai/") && file.startsWith(join(dir, "src") + "/");
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
const parent = dirname(dir);
|
|
33
|
+
if (parent === dir)
|
|
34
|
+
return false;
|
|
35
|
+
dir = parent;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* tsserver plugin factory. Loaded by the TypeScript server via a
|
|
40
|
+
* `typescriptServerPlugins` contribution (VS Code) or a tsconfig
|
|
41
|
+
* `compilerOptions.plugins` entry; the host's `typescript` is injected.
|
|
42
|
+
*/
|
|
43
|
+
export function init(modules) {
|
|
44
|
+
const t = modules.typescript;
|
|
45
|
+
return {
|
|
46
|
+
create(info) {
|
|
47
|
+
const ls = info.languageService;
|
|
48
|
+
const proxy = Object.create(null);
|
|
49
|
+
for (const key of Object.keys(ls)) {
|
|
50
|
+
const member = ls[key];
|
|
51
|
+
proxy[key] = (...args) => member.apply(ls, args);
|
|
52
|
+
}
|
|
53
|
+
proxy.getSemanticDiagnostics = (fileName) => {
|
|
54
|
+
const prior = ls.getSemanticDiagnostics(fileName);
|
|
55
|
+
try {
|
|
56
|
+
const program = ls.getProgram();
|
|
57
|
+
const sourceFile = program?.getSourceFile(fileName);
|
|
58
|
+
if (program === undefined || sourceFile === undefined)
|
|
59
|
+
return prior;
|
|
60
|
+
const east = getEastModule(info.project.getCurrentDirectory());
|
|
61
|
+
const diagnostics = prior.map((d) => {
|
|
62
|
+
if (east === undefined || !ASSIGNABILITY_CODES.has(d.code))
|
|
63
|
+
return d;
|
|
64
|
+
const rewritten = rewriteEastAssignability(t, program, sourceFile, d, east);
|
|
65
|
+
return rewritten === undefined ? d : { ...d, messageText: rewritten };
|
|
66
|
+
});
|
|
67
|
+
if (!isElaraaiPackageSrc(fileName)) {
|
|
68
|
+
const ruleDiagnostics = runEastRules(t, program, sourceFile, program.getTypeChecker(), info.config?.disabled !== undefined ? { disabled: info.config.disabled } : {});
|
|
69
|
+
for (const d of ruleDiagnostics) {
|
|
70
|
+
diagnostics.push({
|
|
71
|
+
file: sourceFile,
|
|
72
|
+
start: d.start,
|
|
73
|
+
length: d.length,
|
|
74
|
+
messageText: `${d.messageText} (${d.ruleName})`,
|
|
75
|
+
category: t.DiagnosticCategory[CATEGORY[d.category]],
|
|
76
|
+
code: d.code,
|
|
77
|
+
source: "east",
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return diagnostics;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
// Never take down the editor's language service.
|
|
85
|
+
return prior;
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
return proxy;
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
export default init;
|
|
93
|
+
//# sourceMappingURL=tsserver-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tsserver-plugin.js","sourceRoot":"","sources":["../../src/tsserver-plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
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 { TsModule } from "./types.js";
|
|
7
|
+
import type { EastModule } from "./east-module.js";
|
|
8
|
+
/** TS assignability error codes worth attempting an East type-diff rewrite on. */
|
|
9
|
+
export declare const ASSIGNABILITY_CODES: ReadonlySet<number>;
|
|
10
|
+
/**
|
|
11
|
+
* Attempt to replace a native TS assignability diagnostic with a localized
|
|
12
|
+
* East type diff. East types are recursive and deeply generic, so the native
|
|
13
|
+
* message restates whole types and is unreadably long; `diffTypes` prunes
|
|
14
|
+
* everything compatible and reports only the offending subtrees.
|
|
15
|
+
*
|
|
16
|
+
* @returns The replacement message, or `undefined` when the diagnostic is not
|
|
17
|
+
* an East type mismatch this can improve (callers keep the native message).
|
|
18
|
+
*/
|
|
19
|
+
export declare function rewriteEastAssignability(t: TsModule, program: ts.Program, sourceFile: ts.SourceFile, diagnostic: ts.Diagnostic, east: EastModule): string | undefined;
|
|
20
|
+
//# sourceMappingURL=type-diff-rewrite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-diff-rewrite.d.ts","sourceRoot":"","sources":["../../src/type-diff-rewrite.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGnD,kFAAkF;AAClF,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAUlD,CAAC;AA2CH;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,CAAC,EAAE,QAAQ,EACX,OAAO,EAAE,EAAE,CAAC,OAAO,EACnB,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,IAAI,EAAE,UAAU,GACf,MAAM,GAAG,SAAS,CA6BpB"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { reifyEastType } from "./type-reify.js";
|
|
2
|
+
/** TS assignability error codes worth attempting an East type-diff rewrite on. */
|
|
3
|
+
export const ASSIGNABILITY_CODES = new Set([
|
|
4
|
+
2322, // Type 'X' is not assignable to type 'Y'.
|
|
5
|
+
2345, // Argument of type 'X' is not assignable to parameter of type 'Y'.
|
|
6
|
+
2375, // Type 'X' is not assignable to type 'Y' with exactOptionalPropertyTypes.
|
|
7
|
+
2379, // Getter/setter assignability variant of 2322.
|
|
8
|
+
2412, // Property assignability with exactOptionalPropertyTypes.
|
|
9
|
+
2719, // Type 'X' is not assignable to type 'Y'. Two different types with this name exist.
|
|
10
|
+
2739, // Type 'X' is missing the following properties from type 'Y'.
|
|
11
|
+
2740, // Type 'X' is missing the following properties from type 'Y' (array forms).
|
|
12
|
+
2741, // Property 'p' is missing in type 'X' but required in type 'Y'.
|
|
13
|
+
]);
|
|
14
|
+
function innermostNodeAt(t, sourceFile, position) {
|
|
15
|
+
function find(node) {
|
|
16
|
+
if (position < node.getStart(sourceFile) || position >= node.getEnd())
|
|
17
|
+
return undefined;
|
|
18
|
+
return t.forEachChild(node, find) ?? node;
|
|
19
|
+
}
|
|
20
|
+
return find(sourceFile);
|
|
21
|
+
}
|
|
22
|
+
// Walk outward from the diagnostic's node to the construct that pins down the
|
|
23
|
+
// (actual, expected) pair: an annotated declaration, a property assignment, or
|
|
24
|
+
// any expression with a contextual type.
|
|
25
|
+
function resolveTypePair(t, checker, node) {
|
|
26
|
+
let current = node;
|
|
27
|
+
for (let hops = 0; current !== undefined && hops < 6; current = current.parent, hops++) {
|
|
28
|
+
if (t.isVariableDeclaration(current) && current.type !== undefined && current.initializer !== undefined) {
|
|
29
|
+
return {
|
|
30
|
+
actual: checker.getTypeAtLocation(current.initializer),
|
|
31
|
+
expected: checker.getTypeFromTypeNode(current.type),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
if (t.isPropertyAssignment(current)) {
|
|
35
|
+
const expected = checker.getContextualType(current.initializer);
|
|
36
|
+
if (expected !== undefined) {
|
|
37
|
+
return { actual: checker.getTypeAtLocation(current.initializer), expected };
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (t.isExpression(current)) {
|
|
41
|
+
const expected = checker.getContextualType(current);
|
|
42
|
+
if (expected !== undefined) {
|
|
43
|
+
return { actual: checker.getTypeAtLocation(current), expected };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Attempt to replace a native TS assignability diagnostic with a localized
|
|
51
|
+
* East type diff. East types are recursive and deeply generic, so the native
|
|
52
|
+
* message restates whole types and is unreadably long; `diffTypes` prunes
|
|
53
|
+
* everything compatible and reports only the offending subtrees.
|
|
54
|
+
*
|
|
55
|
+
* @returns The replacement message, or `undefined` when the diagnostic is not
|
|
56
|
+
* an East type mismatch this can improve (callers keep the native message).
|
|
57
|
+
*/
|
|
58
|
+
export function rewriteEastAssignability(t, program, sourceFile, diagnostic, east) {
|
|
59
|
+
if (diagnostic.start === undefined || !ASSIGNABILITY_CODES.has(diagnostic.code))
|
|
60
|
+
return undefined;
|
|
61
|
+
const checker = program.getTypeChecker();
|
|
62
|
+
const node = innermostNodeAt(t, sourceFile, diagnostic.start);
|
|
63
|
+
if (node === undefined)
|
|
64
|
+
return undefined;
|
|
65
|
+
const pair = resolveTypePair(t, checker, node);
|
|
66
|
+
if (pair === undefined)
|
|
67
|
+
return undefined;
|
|
68
|
+
const actual = reifyEastType(t, checker, pair.actual, east);
|
|
69
|
+
const expected = reifyEastType(t, checker, pair.expected, east);
|
|
70
|
+
if (actual === undefined || expected === undefined)
|
|
71
|
+
return undefined;
|
|
72
|
+
// A mismatch between plain JS values is TypeScript's business, not East's.
|
|
73
|
+
if (!actual.eastShaped && !expected.eastShaped)
|
|
74
|
+
return undefined;
|
|
75
|
+
// An expected side of `.Never` means the parameter's East type is an
|
|
76
|
+
// unresolved generic (inference already failed upstream) — a diff against
|
|
77
|
+
// Never is noise, so keep the native message, which names the real cause.
|
|
78
|
+
if (expected.type === east.NeverType && actual.type !== east.NeverType)
|
|
79
|
+
return undefined;
|
|
80
|
+
let rendered;
|
|
81
|
+
try {
|
|
82
|
+
const diffs = east.diffTypes(actual.type, expected.type);
|
|
83
|
+
if (!Array.isArray(diffs) || diffs.length === 0)
|
|
84
|
+
return undefined;
|
|
85
|
+
rendered = east.renderTypeDiff(diffs);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
if (rendered.length === 0)
|
|
91
|
+
return undefined;
|
|
92
|
+
return `East type mismatch: ${rendered.split("\n").join("; ")}`;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=type-diff-rewrite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-diff-rewrite.js","sourceRoot":"","sources":["../../src/type-diff-rewrite.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
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 { TsModule } from "./types.js";
|
|
7
|
+
import type { EastModule } from "./east-module.js";
|
|
8
|
+
export interface ReifiedType {
|
|
9
|
+
/** The `EastType`, built with the project's own constructors. */
|
|
10
|
+
type: unknown;
|
|
11
|
+
/** Whether an East-specific shape was traversed; a reification built purely
|
|
12
|
+
* from raw JS values (e.g. `const s: string = 1`) is not East-related and
|
|
13
|
+
* must not trigger a rewrite. */
|
|
14
|
+
eastShaped: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Reify the TypeScript type of an East-related expression into an `EastType`
|
|
18
|
+
* built with the project's own `@elaraai/east` constructors (so it is interned
|
|
19
|
+
* and directly usable with `diffTypes`). Handles `Expr<T>` and subclasses (via
|
|
20
|
+
* the `[TypeSymbol]` property), the `{ type: "…" }` type encodings including
|
|
21
|
+
* recursive types, the raw-value forms `SubtypeExprOrValue` admits, and unions
|
|
22
|
+
* of those. Returns `undefined` for anything it cannot map faithfully.
|
|
23
|
+
*/
|
|
24
|
+
export declare function reifyEastType(t: TsModule, checker: ts.TypeChecker, type: ts.Type, east: EastModule): ReifiedType | undefined;
|
|
25
|
+
//# sourceMappingURL=type-reify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-reify.d.ts","sourceRoot":"","sources":["../../src/type-reify.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAiRnD,MAAM,WAAW,WAAW;IAC1B,iEAAiE;IACjE,IAAI,EAAE,OAAO,CAAC;IACd;;qCAEiC;IACjC,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,GAAG,WAAW,GAAG,SAAS,CAU5H"}
|