@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.
Files changed (42) hide show
  1. package/README.md +4 -1
  2. package/dist/src/east-module.d.ts +45 -0
  3. package/dist/src/east-module.d.ts.map +1 -0
  4. package/dist/src/east-module.js +57 -0
  5. package/dist/src/east-module.js.map +1 -0
  6. package/dist/src/index.d.ts +8 -0
  7. package/dist/src/index.d.ts.map +1 -1
  8. package/dist/src/index.js +5 -0
  9. package/dist/src/index.js.map +1 -1
  10. package/dist/src/lsp.d.ts +11 -0
  11. package/dist/src/lsp.d.ts.map +1 -0
  12. package/dist/src/lsp.js +236 -0
  13. package/dist/src/lsp.js.map +1 -0
  14. package/dist/src/rules/index.d.ts +1 -0
  15. package/dist/src/rules/index.d.ts.map +1 -1
  16. package/dist/src/rules/index.js +3 -0
  17. package/dist/src/rules/index.js.map +1 -1
  18. package/dist/src/rules/no-untracked-east-data.d.ts +3 -0
  19. package/dist/src/rules/no-untracked-east-data.d.ts.map +1 -0
  20. package/dist/src/rules/no-untracked-east-data.js +70 -0
  21. package/dist/src/rules/no-untracked-east-data.js.map +1 -0
  22. package/dist/src/service.d.ts +5 -0
  23. package/dist/src/service.d.ts.map +1 -1
  24. package/dist/src/service.js +34 -3
  25. package/dist/src/service.js.map +1 -1
  26. package/dist/src/tsserver-plugin.d.ts +25 -0
  27. package/dist/src/tsserver-plugin.d.ts.map +1 -0
  28. package/dist/src/tsserver-plugin.js +93 -0
  29. package/dist/src/tsserver-plugin.js.map +1 -0
  30. package/dist/src/type-diff-rewrite.d.ts +20 -0
  31. package/dist/src/type-diff-rewrite.d.ts.map +1 -0
  32. package/dist/src/type-diff-rewrite.js +94 -0
  33. package/dist/src/type-diff-rewrite.js.map +1 -0
  34. package/dist/src/type-reify.d.ts +25 -0
  35. package/dist/src/type-reify.d.ts.map +1 -0
  36. package/dist/src/type-reify.js +299 -0
  37. package/dist/src/type-reify.js.map +1 -0
  38. package/package.json +6 -2
  39. package/dist/src/rules/no-ts-helpers-in-east.d.ts +0 -3
  40. package/dist/src/rules/no-ts-helpers-in-east.d.ts.map +0 -1
  41. package/dist/src/rules/no-ts-helpers-in-east.js +0 -50
  42. package/dist/src/rules/no-ts-helpers-in-east.js.map +0 -1
@@ -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
- const message = t.flattenDiagnosticMessageText(d.messageText, " ");
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 > MAX_MESSAGE_LENGTH ? `${message.slice(0, MAX_MESSAGE_LENGTH)}…` : message,
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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/service.ts"],"names":[],"mappings":"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"}
@@ -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":"AAOA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,kFAAkF;AAClF,MAAM,CAAC,MAAM,mBAAmB,GAAwB,IAAI,GAAG,CAAC;IAC9D,IAAI,EAAE,0CAA0C;IAChD,IAAI,EAAE,mEAAmE;IACzE,IAAI,EAAE,0EAA0E;IAChF,IAAI,EAAE,+CAA+C;IACrD,IAAI,EAAE,0DAA0D;IAChE,IAAI,EAAE,oFAAoF;IAC1F,IAAI,EAAE,8DAA8D;IACpE,IAAI,EAAE,4EAA4E;IAClF,IAAI,EAAE,gEAAgE;CACvE,CAAC,CAAC;AAEH,SAAS,eAAe,CAAC,CAAW,EAAE,UAAyB,EAAE,QAAgB;IAC/E,SAAS,IAAI,CAAC,IAAa;QACzB,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,QAAQ,IAAI,IAAI,CAAC,MAAM,EAAE;YAAE,OAAO,SAAS,CAAC;QACxF,OAAO,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC;IAC5C,CAAC;IACD,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC;AAC1B,CAAC;AAOD,8EAA8E;AAC9E,+EAA+E;AAC/E,yCAAyC;AACzC,SAAS,eAAe,CAAC,CAAW,EAAE,OAAuB,EAAE,IAAa;IAC1E,IAAI,OAAO,GAAwB,IAAI,CAAC;IACxC,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,OAAO,KAAK,SAAS,IAAI,IAAI,GAAG,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;QACvF,IAAI,CAAC,CAAC,qBAAqB,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACxG,OAAO;gBACL,MAAM,EAAE,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,WAAW,CAAC;gBACtD,QAAQ,EAAE,OAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC;aACpD,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,EAAE,CAAC;YACpC,MAAM,QAAQ,GAAG,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAChE,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC;YAC9E,CAAC;QACH,CAAC;QACD,IAAI,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;YACpD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC;YAClE,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,wBAAwB,CACtC,CAAW,EACX,OAAmB,EACnB,UAAyB,EACzB,UAAyB,EACzB,IAAgB;IAEhB,IAAI,UAAU,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAElG,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IACzC,MAAM,IAAI,GAAG,eAAe,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;IAC9D,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACzC,MAAM,IAAI,GAAG,eAAe,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAC/C,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAEzC,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAChE,IAAI,MAAM,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACrE,2EAA2E;IAC3E,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,QAAQ,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC;IACjE,qEAAqE;IACrE,0EAA0E;IAC1E,0EAA0E;IAC1E,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IAEzF,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QACzD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAClE,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5C,OAAO,uBAAuB,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAClE,CAAC"}
@@ -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"}