@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
package/README.md CHANGED
@@ -16,7 +16,10 @@ real `ts.Program`, so they are type-aware, not regex heuristics.
16
16
  - **Shared rule set** - One engine, `runEastRules(ts, program, sourceFile, checker)`, reused across every surface.
17
17
  - **Type-aware** - Rules consult the TypeScript checker (e.g. resolving `BlockBuilder`, variant contextual types).
18
18
  - **No bundled compiler** - `typescript` is a peer dependency; the host's version is injected.
19
- - **Diagnostics service** - `createDiagnosticsService()` resolves the nearest tsconfig, holds a warm `LanguageService`, and merges native type errors with the East rules for a file.
19
+ - **Diagnostics service** - `createDiagnosticsService()` resolves the nearest tsconfig, holds a warm `LanguageService`, and merges native type errors with the East rules for a file. Supports in-memory overlays for unsaved buffers.
20
+ - **Readable East type errors** - native TS assignability errors on East types are rewritten via east's structural type diff (`diffTypes`), so a mismatch deep inside a recursive type reads as one localized line instead of pages of restated generics. The project's own `@elaraai/east` is resolved at runtime, so the diff always matches the project's type semantics.
21
+ - **LSP server** - `runEastLsp()` serves the same diagnostics over the Language Server Protocol (stdio, zero dependencies), usable by Claude Code plugin `lspServers`, Neovim, or any LSP client.
22
+ - **tsserver plugin** - the `@elaraai/east-diagnostics/tsserver-plugin` entry decorates the editor's existing TypeScript language service (no second program), shipped to VS Code via the East UI Preview extension's `typescriptServerPlugins` contribution.
20
23
 
21
24
  ## Rules
22
25
 
@@ -0,0 +1,45 @@
1
+ /**
2
+ * The slice of `@elaraai/east` the type-diff rewrite needs: the diff/render
3
+ * entry points plus the type constructors the reifier builds with (so the
4
+ * resulting types are interned and carry type ids, which `diffTypes` relies on).
5
+ */
6
+ export interface EastModule {
7
+ diffTypes(actual: unknown, expected: unknown, options?: {
8
+ maxDiffs?: number;
9
+ }): unknown[];
10
+ renderTypeDiff(diffs: readonly unknown[], options?: {
11
+ maxShown?: number;
12
+ maxDepth?: number;
13
+ maxMembers?: number;
14
+ }): string;
15
+ NeverType: unknown;
16
+ NullType: unknown;
17
+ BooleanType: unknown;
18
+ IntegerType: unknown;
19
+ FloatType: unknown;
20
+ StringType: unknown;
21
+ DateTimeType: unknown;
22
+ BlobType: unknown;
23
+ RefType(value: unknown): unknown;
24
+ ArrayType(value: unknown): unknown;
25
+ SetType(key: unknown): unknown;
26
+ DictType(key: unknown, value: unknown): unknown;
27
+ VectorType(element: unknown): unknown;
28
+ MatrixType(element: unknown): unknown;
29
+ StructType(fields: Record<string, unknown>): unknown;
30
+ VariantType(cases: Record<string, unknown>): unknown;
31
+ FunctionType(inputs: unknown[], output: unknown): unknown;
32
+ AsyncFunctionType(inputs: unknown[], output: unknown): unknown;
33
+ RecursiveType(f: (self: unknown) => unknown): unknown;
34
+ /** Least upper bound of two types; throws when none exists. */
35
+ TypeUnion(t1: unknown, t2: unknown): unknown;
36
+ }
37
+ /**
38
+ * Resolve the *project's* own `@elaraai/east` from `projectDir`, mirroring how
39
+ * the service loads the project's `typescript`. Synchronous `require` is tried
40
+ * first (Node >= 22.12 can require ESM); if that fails a background dynamic
41
+ * import fills the cache so a later diagnose picks it up. Returns `undefined`
42
+ * while unavailable — callers simply skip the rewrite.
43
+ */
44
+ export declare function getEastModule(projectDir: string): EastModule | undefined;
45
+ //# sourceMappingURL=east-module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"east-module.d.ts","sourceRoot":"","sources":["../../src/east-module.ts"],"names":[],"mappings":"AAQA;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,EAAE,CAAC;IAC1F,cAAc,CAAC,KAAK,EAAE,SAAS,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,CAAC;IAC3H,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;IACjC,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;IACnC,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC;IAC/B,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;IAChD,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;IACtC,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;IACtC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;IACrD,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;IACrD,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC;IAC1D,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC;IAC/D,aAAa,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,GAAG,OAAO,CAAC;IACtD,+DAA+D;IAC/D,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC;CAC9C;AAgBD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CA2BxE"}
@@ -0,0 +1,57 @@
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 { join } from "node:path";
7
+ import { pathToFileURL } from "node:url";
8
+ // `null` = resolution failed (don't retry every diagnose); absent = not tried.
9
+ const cache = new Map();
10
+ const pendingImports = new Set();
11
+ function validate(candidate) {
12
+ const m = candidate;
13
+ const mod = (typeof m?.["diffTypes"] === "function" ? m : m?.["default"]) ?? undefined;
14
+ if (mod === undefined)
15
+ return null;
16
+ const fns = ["diffTypes", "renderTypeDiff", "StructType", "VariantType", "ArrayType", "RecursiveType", "FunctionType", "TypeUnion"];
17
+ for (const f of fns)
18
+ if (typeof mod[f] !== "function")
19
+ return null;
20
+ if (mod["IntegerType"] === undefined)
21
+ return null;
22
+ return mod;
23
+ }
24
+ /**
25
+ * Resolve the *project's* own `@elaraai/east` from `projectDir`, mirroring how
26
+ * the service loads the project's `typescript`. Synchronous `require` is tried
27
+ * first (Node >= 22.12 can require ESM); if that fails a background dynamic
28
+ * import fills the cache so a later diagnose picks it up. Returns `undefined`
29
+ * while unavailable — callers simply skip the rewrite.
30
+ */
31
+ export function getEastModule(projectDir) {
32
+ const cached = cache.get(projectDir);
33
+ if (cached !== undefined)
34
+ return cached ?? undefined;
35
+ const require_ = createRequire(join(projectDir, "_.js"));
36
+ let entry;
37
+ try {
38
+ entry = require_.resolve("@elaraai/east");
39
+ }
40
+ catch {
41
+ cache.set(projectDir, null);
42
+ return undefined;
43
+ }
44
+ try {
45
+ const mod = validate(require_(entry));
46
+ cache.set(projectDir, mod);
47
+ return mod ?? undefined;
48
+ }
49
+ catch {
50
+ if (!pendingImports.has(projectDir)) {
51
+ pendingImports.add(projectDir);
52
+ import(pathToFileURL(entry).href).then((m) => cache.set(projectDir, validate(m)), () => cache.set(projectDir, null));
53
+ }
54
+ return undefined;
55
+ }
56
+ }
57
+ //# sourceMappingURL=east-module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"east-module.js","sourceRoot":"","sources":["../../src/east-module.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAiCzC,+EAA+E;AAC/E,MAAM,KAAK,GAAG,IAAI,GAAG,EAA6B,CAAC;AACnD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;AAEzC,SAAS,QAAQ,CAAC,SAAkB;IAClC,MAAM,CAAC,GAAG,SAAgD,CAAC;IAC3D,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,SAAS,CAAyC,CAAC,IAAI,SAAS,CAAC;IAChI,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,GAAG,GAAG,CAAC,WAAW,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;IACpI,KAAK,MAAM,CAAC,IAAI,GAAG;QAAE,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,UAAU;YAAE,OAAO,IAAI,CAAC;IACnE,IAAI,GAAG,CAAC,aAAa,CAAC,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAClD,OAAO,GAA4B,CAAC;AACtC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,UAAkB;IAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACrC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,IAAI,SAAS,CAAC;IAErD,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IACzD,IAAI,KAAa,CAAC;IAClB,IAAI,CAAC;QACH,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC5B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QACtC,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QAC3B,OAAO,GAAG,IAAI,SAAS,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACpC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAC/B,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CACpC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EACzC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAClC,CAAC;QACJ,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -7,4 +7,12 @@ export * from "./rules/index.js";
7
7
  export { runEastRules } from "./run.js";
8
8
  export { createDiagnosticsService } from "./service.js";
9
9
  export type { DiagnosticsService, DiagnosticsServiceOptions } from "./service.js";
10
+ export { runEastLsp } from "./lsp.js";
11
+ export type { EastLspOptions } from "./lsp.js";
12
+ export { getEastModule } from "./east-module.js";
13
+ export type { EastModule } from "./east-module.js";
14
+ export { reifyEastType } from "./type-reify.js";
15
+ export { rewriteEastAssignability, ASSIGNABILITY_CODES } from "./type-diff-rewrite.js";
16
+ export { init as tsserverPluginInit } from "./tsserver-plugin.js";
17
+ export type { TsserverPluginCreateInfo } from "./tsserver-plugin.js";
10
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,mBAAmB,YAAY,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AACxD,YAAY,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,mBAAmB,YAAY,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AACxD,YAAY,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAClF,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,YAAY,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AACvF,OAAO,EAAE,IAAI,IAAI,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAClE,YAAY,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC"}
package/dist/src/index.js CHANGED
@@ -1,4 +1,9 @@
1
1
  export * from "./rules/index.js";
2
2
  export { runEastRules } from "./run.js";
3
3
  export { createDiagnosticsService } from "./service.js";
4
+ export { runEastLsp } from "./lsp.js";
5
+ export { getEastModule } from "./east-module.js";
6
+ export { reifyEastType } from "./type-reify.js";
7
+ export { rewriteEastAssignability, ASSIGNABILITY_CODES } from "./type-diff-rewrite.js";
8
+ export { init as tsserverPluginInit } from "./tsserver-plugin.js";
4
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAKA,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAKA,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAExD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AACvF,OAAO,EAAE,IAAI,IAAI,kBAAkB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { type DiagnosticsService } from "./service.js";
2
+ export interface EastLspOptions {
3
+ service?: DiagnosticsService;
4
+ input?: NodeJS.ReadableStream;
5
+ output?: NodeJS.WritableStream;
6
+ /** Called on `exit`; defaults to `process.exit`. */
7
+ exit?: (code: number) => void;
8
+ }
9
+ /** Run the East LSP server until the client disconnects. */
10
+ export declare function runEastLsp(options?: EastLspOptions): void;
11
+ //# sourceMappingURL=lsp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lsp.d.ts","sourceRoot":"","sources":["../../src/lsp.ts"],"names":[],"mappings":"AAMA,OAAO,EAA4B,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAuDjF,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IAC/B,oDAAoD;IACpD,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B;AAED,4DAA4D;AAC5D,wBAAgB,UAAU,CAAC,OAAO,GAAE,cAAmB,GAAG,IAAI,CAkL7D"}
@@ -0,0 +1,236 @@
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 { readFileSync } from "node:fs";
6
+ import { fileURLToPath } from "node:url";
7
+ import { createDiagnosticsService } from "./service.js";
8
+ const EAST_IMPORT_PATTERN = /@elaraai\//;
9
+ // Vendored / built / generated trees: never diagnose code the user doesn't own.
10
+ const SKIP_PATH = /[/\\](node_modules|dist|build|\.venv|\.git)[/\\]/;
11
+ const DEBOUNCE_MS = 100;
12
+ const SEVERITY = {
13
+ error: 1,
14
+ warning: 2,
15
+ suggestion: 3,
16
+ };
17
+ function lineStarts(content) {
18
+ const starts = [0];
19
+ for (let i = 0; i < content.length; i++) {
20
+ if (content[i] === "\n")
21
+ starts.push(i + 1);
22
+ }
23
+ return starts;
24
+ }
25
+ function offsetToPosition(starts, offset) {
26
+ let low = 0;
27
+ let high = starts.length - 1;
28
+ while (low < high) {
29
+ const mid = (low + high + 1) >> 1;
30
+ if (starts[mid] <= offset)
31
+ low = mid;
32
+ else
33
+ high = mid - 1;
34
+ }
35
+ return { line: low, character: offset - starts[low] };
36
+ }
37
+ function uriToPath(uri) {
38
+ if (!uri.startsWith("file://"))
39
+ return undefined;
40
+ try {
41
+ return fileURLToPath(uri);
42
+ }
43
+ catch {
44
+ return undefined;
45
+ }
46
+ }
47
+ /** Run the East LSP server until the client disconnects. */
48
+ export function runEastLsp(options = {}) {
49
+ const service = options.service ?? createDiagnosticsService();
50
+ const input = options.input ?? process.stdin;
51
+ const output = options.output ?? process.stdout;
52
+ const exit = options.exit ?? ((code) => process.exit(code));
53
+ // path -> current buffer content (mirrors the service overlay).
54
+ const open = new Map();
55
+ const pending = new Map();
56
+ let shuttingDown = false;
57
+ function send(message) {
58
+ const body = JSON.stringify({ jsonrpc: "2.0", ...message });
59
+ output.write(`Content-Length: ${Buffer.byteLength(body, "utf8")}\r\n\r\n${body}`);
60
+ }
61
+ function publish(path) {
62
+ const content = open.get(path) ?? (() => {
63
+ try {
64
+ return readFileSync(path, "utf-8");
65
+ }
66
+ catch {
67
+ return undefined;
68
+ }
69
+ })();
70
+ let diagnostics = [];
71
+ if (content !== undefined && !SKIP_PATH.test(path) && EAST_IMPORT_PATTERN.test(content)) {
72
+ const starts = lineStarts(content);
73
+ diagnostics = service.diagnose(path).map((d) => ({
74
+ range: {
75
+ start: offsetToPosition(starts, d.start),
76
+ end: offsetToPosition(starts, d.start + d.length),
77
+ },
78
+ severity: SEVERITY[d.category],
79
+ code: d.ruleName === "tsc" ? `TS${d.code}` : d.ruleName,
80
+ source: "east",
81
+ message: d.messageText,
82
+ }));
83
+ }
84
+ send({ method: "textDocument/publishDiagnostics", params: { uri: `file://${path}`, diagnostics } });
85
+ }
86
+ function schedule(path) {
87
+ const existing = pending.get(path);
88
+ if (existing !== undefined)
89
+ clearTimeout(existing);
90
+ pending.set(path, setTimeout(() => {
91
+ pending.delete(path);
92
+ try {
93
+ publish(path);
94
+ }
95
+ catch {
96
+ // Never let a diagnose failure kill the server.
97
+ }
98
+ }, DEBOUNCE_MS));
99
+ }
100
+ function handle(message) {
101
+ const { method, id, params } = message;
102
+ if (method === undefined)
103
+ return; // a response — we send no requests
104
+ switch (method) {
105
+ case "initialize": {
106
+ const folders = [];
107
+ const root = params?.rootUri ?? params?.rootPath;
108
+ if (typeof root === "string") {
109
+ const p = root.startsWith("file://") ? uriToPath(root) : root;
110
+ if (p !== undefined)
111
+ folders.push(p);
112
+ }
113
+ for (const f of params?.workspaceFolders ?? []) {
114
+ const p = uriToPath(f?.uri ?? "");
115
+ if (p !== undefined)
116
+ folders.push(p);
117
+ }
118
+ send({
119
+ id,
120
+ result: {
121
+ capabilities: {
122
+ textDocumentSync: { openClose: true, change: 1, save: { includeText: true } },
123
+ },
124
+ serverInfo: { name: "east-diagnostics" },
125
+ },
126
+ });
127
+ // Warm off the request path so initialize returns immediately.
128
+ setImmediate(() => {
129
+ for (const folder of folders) {
130
+ try {
131
+ service.warm(folder);
132
+ }
133
+ catch {
134
+ /* best-effort warm */
135
+ }
136
+ }
137
+ });
138
+ return;
139
+ }
140
+ case "initialized":
141
+ return;
142
+ case "shutdown":
143
+ shuttingDown = true;
144
+ send({ id, result: null });
145
+ return;
146
+ case "exit":
147
+ exit(shuttingDown ? 0 : 1);
148
+ return;
149
+ case "textDocument/didOpen": {
150
+ const path = uriToPath(params?.textDocument?.uri ?? "");
151
+ const text = params?.textDocument?.text;
152
+ if (path === undefined || typeof text !== "string")
153
+ return;
154
+ open.set(path, text);
155
+ service.setOverlay(path, text);
156
+ schedule(path);
157
+ return;
158
+ }
159
+ case "textDocument/didChange": {
160
+ const path = uriToPath(params?.textDocument?.uri ?? "");
161
+ const text = params?.contentChanges?.at?.(-1)?.text;
162
+ if (path === undefined || typeof text !== "string")
163
+ return;
164
+ open.set(path, text);
165
+ service.setOverlay(path, text);
166
+ schedule(path);
167
+ return;
168
+ }
169
+ case "textDocument/didSave": {
170
+ const path = uriToPath(params?.textDocument?.uri ?? "");
171
+ if (path === undefined)
172
+ return;
173
+ const text = params?.text;
174
+ if (typeof text === "string") {
175
+ open.set(path, text);
176
+ service.setOverlay(path, text);
177
+ }
178
+ else {
179
+ open.delete(path);
180
+ service.clearOverlay(path);
181
+ }
182
+ schedule(path);
183
+ return;
184
+ }
185
+ case "textDocument/didClose": {
186
+ const path = uriToPath(params?.textDocument?.uri ?? "");
187
+ if (path === undefined)
188
+ return;
189
+ open.delete(path);
190
+ service.clearOverlay(path);
191
+ const timer = pending.get(path);
192
+ if (timer !== undefined)
193
+ clearTimeout(timer);
194
+ pending.delete(path);
195
+ send({ method: "textDocument/publishDiagnostics", params: { uri: `file://${path}`, diagnostics: [] } });
196
+ return;
197
+ }
198
+ default:
199
+ if (id !== undefined) {
200
+ send({ id, error: { code: -32601, message: `Method not found: ${method}` } });
201
+ }
202
+ return;
203
+ }
204
+ }
205
+ // Content-Length framed reader.
206
+ let buffer = Buffer.alloc(0);
207
+ input.on("data", (chunk) => {
208
+ buffer = Buffer.concat([buffer, chunk]);
209
+ for (;;) {
210
+ const headerEnd = buffer.indexOf("\r\n\r\n");
211
+ if (headerEnd < 0)
212
+ return;
213
+ const header = buffer.subarray(0, headerEnd).toString("utf8");
214
+ const match = /Content-Length:\s*(\d+)/i.exec(header);
215
+ if (match === null) {
216
+ buffer = buffer.subarray(headerEnd + 4);
217
+ continue;
218
+ }
219
+ const length = Number(match[1]);
220
+ const bodyStart = headerEnd + 4;
221
+ if (buffer.length < bodyStart + length)
222
+ return;
223
+ const body = buffer.subarray(bodyStart, bodyStart + length).toString("utf8");
224
+ buffer = buffer.subarray(bodyStart + length);
225
+ try {
226
+ handle(JSON.parse(body));
227
+ }
228
+ catch {
229
+ // Malformed frame — skip it rather than dying mid-session.
230
+ }
231
+ }
232
+ });
233
+ input.on("close", () => exit(0));
234
+ input.on("end", () => exit(0));
235
+ }
236
+ //# sourceMappingURL=lsp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lsp.js","sourceRoot":"","sources":["../../src/lsp.ts"],"names":[],"mappings":"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"}
@@ -15,5 +15,6 @@ export { noUnexecutedEastExpression } from "./no-unexecuted-east-expression.js";
15
15
  export { noReinlinedEastBinding } from "./no-reinlined-east-binding.js";
16
16
  export { noEastDataBuilderHelper } from "./no-east-data-builder-helper.js";
17
17
  export { preferJsxOverFactoryCall } from "./prefer-jsx-over-factory-call.js";
18
+ export { noUntrackedEastData } from "./no-untracked-east-data.js";
18
19
  export declare const allRules: readonly EastRule[];
19
20
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/rules/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAc5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,2BAA2B,EAAE,MAAM,uCAAuC,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAE7E,eAAO,MAAM,QAAQ,EAAE,SAAS,QAAQ,EAavC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/rules/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAe5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,2BAA2B,EAAE,MAAM,uCAAuC,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE,eAAO,MAAM,QAAQ,EAAE,SAAS,QAAQ,EAcvC,CAAC"}
@@ -10,6 +10,7 @@ import { noUnexecutedEastExpression } from "./no-unexecuted-east-expression.js";
10
10
  import { noReinlinedEastBinding } from "./no-reinlined-east-binding.js";
11
11
  import { noEastDataBuilderHelper } from "./no-east-data-builder-helper.js";
12
12
  import { preferJsxOverFactoryCall } from "./prefer-jsx-over-factory-call.js";
13
+ import { noUntrackedEastData } from "./no-untracked-east-data.js";
13
14
  export { noRedundantEastCast } from "./no-redundant-east-cast.js";
14
15
  export { preferExplicitEastType } from "./prefer-explicit-east-type.js";
15
16
  export { preferSomeNone } from "./prefer-some-none.js";
@@ -22,6 +23,7 @@ export { noUnexecutedEastExpression } from "./no-unexecuted-east-expression.js";
22
23
  export { noReinlinedEastBinding } from "./no-reinlined-east-binding.js";
23
24
  export { noEastDataBuilderHelper } from "./no-east-data-builder-helper.js";
24
25
  export { preferJsxOverFactoryCall } from "./prefer-jsx-over-factory-call.js";
26
+ export { noUntrackedEastData } from "./no-untracked-east-data.js";
25
27
  export const allRules = [
26
28
  noRedundantEastCast,
27
29
  preferExplicitEastType,
@@ -35,5 +37,6 @@ export const allRules = [
35
37
  noReinlinedEastBinding,
36
38
  noEastDataBuilderHelper,
37
39
  preferJsxOverFactoryCall,
40
+ noUntrackedEastData,
38
41
  ];
39
42
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/rules/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,2BAA2B,EAAE,MAAM,uCAAuC,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAE7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,2BAA2B,EAAE,MAAM,uCAAuC,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAE7E,MAAM,CAAC,MAAM,QAAQ,GAAwB;IAC3C,mBAAmB;IACnB,sBAAsB;IACtB,cAAc;IACd,mBAAmB;IACnB,oBAAoB;IACpB,2BAA2B;IAC3B,mBAAmB;IACnB,sBAAsB;IACtB,0BAA0B;IAC1B,sBAAsB;IACtB,uBAAuB;IACvB,wBAAwB;CACzB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/rules/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,2BAA2B,EAAE,MAAM,uCAAuC,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,2BAA2B,EAAE,MAAM,uCAAuC,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE,MAAM,CAAC,MAAM,QAAQ,GAAwB;IAC3C,mBAAmB;IACnB,sBAAsB;IACtB,cAAc;IACd,mBAAmB;IACnB,oBAAoB;IACpB,2BAA2B;IAC3B,mBAAmB;IACnB,sBAAsB;IACtB,0BAA0B;IAC1B,sBAAsB;IACtB,uBAAuB;IACvB,wBAAwB;IACxB,mBAAmB;CACpB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { EastRule } from "../types.js";
2
+ export declare const noUntrackedEastData: EastRule;
3
+ //# sourceMappingURL=no-untracked-east-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-untracked-east-data.d.ts","sourceRoot":"","sources":["../../../src/rules/no-untracked-east-data.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAe,MAAM,aAAa,CAAC;AA6BzD,eAAO,MAAM,mBAAmB,EAAE,QA8CjC,CAAC"}
@@ -0,0 +1,70 @@
1
+ import { insideBlockScope } from "../block-scope.js";
2
+ import { isEastExprType } from "../east-type.js";
3
+ const NAME = "no-untracked-east-data";
4
+ const CODE = 990013;
5
+ // Inside an East block, data destined for an East-typed position (a factory
6
+ // `data` argument, a JSX `data={...}` prop — anything whose contextual type
7
+ // accepts an `Expr`) must be bound with `$.const` / `$.let`, not a bare JS
8
+ // `const` literal. A bare `const` isn't tracked by the block builder: it
9
+ // carries no East type at the binding, and consuming it twice inlines the
10
+ // literal twice in the IR. TS-side config (column defs, encodings, `days`
11
+ // string lists) has a non-Expr contextual type and is exempt naturally.
12
+ /** The plain-JS-literal initializer of `decl`, or undefined. */
13
+ function plainLiteralInitializer(decl, t) {
14
+ const init = decl.initializer;
15
+ if (init === undefined)
16
+ return undefined;
17
+ const unwrapped = t.isAsExpression(init) || t.isSatisfiesExpression(init) ? init.expression : init;
18
+ if (t.isArrayLiteralExpression(unwrapped) || t.isObjectLiteralExpression(unwrapped)) {
19
+ return unwrapped;
20
+ }
21
+ return undefined;
22
+ }
23
+ export const noUntrackedEastData = {
24
+ name: NAME,
25
+ code: CODE,
26
+ description: "Inside East blocks, bind data consumed in East-typed positions with $.const/$.let, not a bare JS const.",
27
+ check(node, ctx) {
28
+ const t = ctx.ts;
29
+ if (!t.isIdentifier(node))
30
+ return;
31
+ // Only identifiers in a consuming position: a call argument or a JSX
32
+ // attribute expression value.
33
+ const parent = node.parent;
34
+ const isCallArg = parent !== undefined &&
35
+ t.isCallExpression(parent) &&
36
+ parent.expression !== node &&
37
+ parent.arguments.some((arg) => arg === node);
38
+ const isJsxValue = parent !== undefined && t.isJsxExpression(parent) && parent.expression === node;
39
+ if (!isCallArg && !isJsxValue)
40
+ return;
41
+ if (!insideBlockScope(node, ctx))
42
+ return;
43
+ // The position must be East-typed (its contextual type accepts an Expr).
44
+ const contextual = ctx.checker.getContextualType(node);
45
+ if (contextual === undefined || !isEastExprType(contextual))
46
+ return;
47
+ // The identifier must resolve to a bare-const plain literal declared
48
+ // inside an East block scope.
49
+ const symbol = ctx.checker.getSymbolAtLocation(node);
50
+ const decl = symbol?.valueDeclaration;
51
+ if (decl === undefined || !t.isVariableDeclaration(decl))
52
+ return;
53
+ if (plainLiteralInitializer(decl, t) === undefined)
54
+ return;
55
+ if (!insideBlockScope(decl, ctx))
56
+ return;
57
+ const sf = ctx.sourceFile;
58
+ const start = node.getStart(sf);
59
+ ctx.report({
60
+ ruleName: NAME,
61
+ code: CODE,
62
+ start,
63
+ length: node.getEnd() - start,
64
+ messageText: `Bare \`const ${node.text} = …\` isn't tracked by the East block builder. Bind East data with ` +
65
+ "`$.const([...], Type)` (or `$.let`) so the binding carries its East type and is evaluated once.",
66
+ category: "suggestion",
67
+ });
68
+ },
69
+ };
70
+ //# sourceMappingURL=no-untracked-east-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-untracked-east-data.js","sourceRoot":"","sources":["../../../src/rules/no-untracked-east-data.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,IAAI,GAAG,wBAAwB,CAAC;AACtC,MAAM,IAAI,GAAG,MAAM,CAAC;AAEpB,4EAA4E;AAC5E,4EAA4E;AAC5E,2EAA2E;AAC3E,yEAAyE;AACzE,0EAA0E;AAC1E,0EAA0E;AAC1E,wEAAwE;AAExE,gEAAgE;AAChE,SAAS,uBAAuB,CAC9B,IAA4B,EAC5B,CAAoB;IAEpB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC;IAC9B,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACzC,MAAM,SAAS,GAAG,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;IACnG,IAAI,CAAC,CAAC,wBAAwB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,yBAAyB,CAAC,SAAS,CAAC,EAAE,CAAC;QACpF,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAa;IAC3C,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,WAAW,EACT,yGAAyG;IAC3G,KAAK,CAAC,IAAI,EAAE,GAAG;QACb,MAAM,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;QACjB,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC;YAAE,OAAO;QAElC,qEAAqE;QACrE,8BAA8B;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,MAAM,SAAS,GACb,MAAM,KAAK,SAAS;YACpB,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC;YAC1B,MAAM,CAAC,UAAU,KAAK,IAAI;YAC1B,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;QAC/C,MAAM,UAAU,GAAG,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,UAAU,KAAK,IAAI,CAAC;QACnG,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU;YAAE,OAAO;QACtC,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,GAAG,CAAC;YAAE,OAAO;QAEzC,yEAAyE;QACzE,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACvD,IAAI,UAAU,KAAK,SAAS,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC;YAAE,OAAO;QAEpE,qEAAqE;QACrE,8BAA8B;QAC9B,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,MAAM,EAAE,gBAAgB,CAAC;QACtC,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC;YAAE,OAAO;QACjE,IAAI,uBAAuB,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,SAAS;YAAE,OAAO;QAC3D,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,GAAG,CAAC;YAAE,OAAO;QAEzC,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,gBAAgB,IAAI,CAAC,IAAI,sEAAsE;gBAC/F,iGAAiG;YACnG,QAAQ,EAAE,YAAY;SACvB,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -13,6 +13,11 @@ export interface DiagnosticsService {
13
13
  * first real `diagnose` doesn't pay the cold program+checker build. Returns
14
14
  * `false` when there is no tsconfig above `fromDir`. */
15
15
  warm(fromDir: string): boolean;
16
+ /** Provide in-memory content for a file (an LSP buffer); takes precedence
17
+ * over the on-disk content until cleared. */
18
+ setOverlay(filePath: string, content: string): void;
19
+ /** Drop the overlay for a file, reverting to on-disk content. */
20
+ clearOverlay(filePath: string): void;
16
21
  dispose(): void;
17
22
  }
18
23
  export declare function createDiagnosticsService(options?: DiagnosticsServiceOptions): DiagnosticsService;
@@ -1 +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"}
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;AAU/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;iDAC6C;IAC7C,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACpD,iEAAiE;IACjE,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,OAAO,IAAI,IAAI,CAAC;CACjB;AAmCD,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,yBAA8B,GAAG,kBAAkB,CAiJpG"}