@azerothjs/language-service 0.4.0-beta.1

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 (98) hide show
  1. package/README.md +259 -0
  2. package/dist/html-source.d.ts +12 -0
  3. package/dist/html-source.d.ts.map +1 -0
  4. package/dist/html-source.js +108 -0
  5. package/dist/html-source.js.map +1 -0
  6. package/dist/index.d.ts +12 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +29 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/language-data.d.ts +41 -0
  11. package/dist/language-data.d.ts.map +1 -0
  12. package/dist/language-data.js +164 -0
  13. package/dist/language-data.js.map +1 -0
  14. package/dist/mapping.d.ts +71 -0
  15. package/dist/mapping.d.ts.map +1 -0
  16. package/dist/mapping.js +123 -0
  17. package/dist/mapping.js.map +1 -0
  18. package/dist/markup-model.d.ts +67 -0
  19. package/dist/markup-model.d.ts.map +1 -0
  20. package/dist/markup-model.js +313 -0
  21. package/dist/markup-model.js.map +1 -0
  22. package/dist/protocol.d.ts +176 -0
  23. package/dist/protocol.d.ts.map +1 -0
  24. package/dist/protocol.js +58 -0
  25. package/dist/protocol.js.map +1 -0
  26. package/dist/providers/completion.d.ts +26 -0
  27. package/dist/providers/completion.d.ts.map +1 -0
  28. package/dist/providers/completion.js +339 -0
  29. package/dist/providers/completion.js.map +1 -0
  30. package/dist/providers/css-service.d.ts +7 -0
  31. package/dist/providers/css-service.d.ts.map +1 -0
  32. package/dist/providers/css-service.js +84 -0
  33. package/dist/providers/css-service.js.map +1 -0
  34. package/dist/providers/diagnostics.d.ts +5 -0
  35. package/dist/providers/diagnostics.d.ts.map +1 -0
  36. package/dist/providers/diagnostics.js +89 -0
  37. package/dist/providers/diagnostics.js.map +1 -0
  38. package/dist/providers/editing.d.ts +17 -0
  39. package/dist/providers/editing.d.ts.map +1 -0
  40. package/dist/providers/editing.js +176 -0
  41. package/dist/providers/editing.js.map +1 -0
  42. package/dist/providers/hover.d.ts +5 -0
  43. package/dist/providers/hover.d.ts.map +1 -0
  44. package/dist/providers/hover.js +213 -0
  45. package/dist/providers/hover.js.map +1 -0
  46. package/dist/providers/html-service.d.ts +8 -0
  47. package/dist/providers/html-service.d.ts.map +1 -0
  48. package/dist/providers/html-service.js +108 -0
  49. package/dist/providers/html-service.js.map +1 -0
  50. package/dist/providers/inlay-hints.d.ts +25 -0
  51. package/dist/providers/inlay-hints.d.ts.map +1 -0
  52. package/dist/providers/inlay-hints.js +52 -0
  53. package/dist/providers/inlay-hints.js.map +1 -0
  54. package/dist/providers/navigation.d.ts +16 -0
  55. package/dist/providers/navigation.d.ts.map +1 -0
  56. package/dist/providers/navigation.js +107 -0
  57. package/dist/providers/navigation.js.map +1 -0
  58. package/dist/providers/semantic-tokens.d.ts +5 -0
  59. package/dist/providers/semantic-tokens.d.ts.map +1 -0
  60. package/dist/providers/semantic-tokens.js +63 -0
  61. package/dist/providers/semantic-tokens.js.map +1 -0
  62. package/dist/providers/signature.d.ts +5 -0
  63. package/dist/providers/signature.d.ts.map +1 -0
  64. package/dist/providers/signature.js +38 -0
  65. package/dist/providers/signature.js.map +1 -0
  66. package/dist/providers/structure.d.ts +19 -0
  67. package/dist/providers/structure.d.ts.map +1 -0
  68. package/dist/providers/structure.js +188 -0
  69. package/dist/providers/structure.js.map +1 -0
  70. package/dist/providers/symbols.d.ts +8 -0
  71. package/dist/providers/symbols.d.ts.map +1 -0
  72. package/dist/providers/symbols.js +108 -0
  73. package/dist/providers/symbols.js.map +1 -0
  74. package/dist/request.d.ts +37 -0
  75. package/dist/request.d.ts.map +1 -0
  76. package/dist/request.js +49 -0
  77. package/dist/request.js.map +1 -0
  78. package/dist/service.d.ts +73 -0
  79. package/dist/service.d.ts.map +1 -0
  80. package/dist/service.js +177 -0
  81. package/dist/service.js.map +1 -0
  82. package/dist/text.d.ts +25 -0
  83. package/dist/text.d.ts.map +1 -0
  84. package/dist/text.js +66 -0
  85. package/dist/text.js.map +1 -0
  86. package/dist/ts-project.d.ts +75 -0
  87. package/dist/ts-project.d.ts.map +1 -0
  88. package/dist/ts-project.js +266 -0
  89. package/dist/ts-project.js.map +1 -0
  90. package/dist/uri.d.ts +21 -0
  91. package/dist/uri.d.ts.map +1 -0
  92. package/dist/uri.js +41 -0
  93. package/dist/uri.js.map +1 -0
  94. package/dist/virtual-code.d.ts +27 -0
  95. package/dist/virtual-code.d.ts.map +1 -0
  96. package/dist/virtual-code.js +360 -0
  97. package/dist/virtual-code.js.map +1 -0
  98. package/package.json +61 -0
@@ -0,0 +1,188 @@
1
+ // Three structural features grouped together:
2
+ // - folding ranges: markup elements that span lines, plus TypeScript's own
3
+ // outlining spans (functions, blocks, imports, block comments);
4
+ // - code actions: TypeScript quick fixes for diagnostics at a range, with
5
+ // their edits mapped back to the original document;
6
+ // - formatting: TypeScript's formatter run over the virtual module, keeping
7
+ // only the edits that fall inside mapped (user-authored) spans - so the
8
+ // script and expressions are tidied while the markup is left untouched.
9
+ import ts from 'typescript';
10
+ import { collectMarkupNodes } from "../markup-model.js";
11
+ import { resolveLocation, spanToRange, toGenerated } from "../request.js";
12
+ /** Default formatter settings, matching the repo's 4-space, single-quote style. */
13
+ const FORMAT_OPTIONS = {
14
+ indentSize: 4,
15
+ tabSize: 4,
16
+ convertTabsToSpaces: true,
17
+ insertSpaceAfterCommaDelimiter: true,
18
+ insertSpaceAfterKeywordsInControlFlowStatements: true,
19
+ insertSpaceBeforeAndAfterBinaryOperators: true,
20
+ semicolons: ts.SemicolonPreference.Insert
21
+ };
22
+ /** Collapsible regions: multi-line markup elements + TS outlining spans. */
23
+ export function getFoldingRanges(ctx) {
24
+ const ranges = [];
25
+ const seen = new Set();
26
+ const add = (startLine, endLine, kind) => {
27
+ if (endLine <= startLine) {
28
+ return;
29
+ }
30
+ const key = `${startLine}:${endLine}`;
31
+ if (!seen.has(key)) {
32
+ seen.add(key);
33
+ ranges.push({ startLine, endLine, kind });
34
+ }
35
+ };
36
+ for (const node of collectMarkupNodes(ctx.source)) {
37
+ const startLine = ctx.lineIndex.positionAt(node.start).line;
38
+ const endLine = ctx.lineIndex.positionAt(node.end - 1).line;
39
+ add(startLine, endLine);
40
+ }
41
+ for (const span of ctx.project.service.getOutliningSpans(ctx.virtualFile)) {
42
+ const mapped = ctx.virtual.mapping.toOriginalRange(span.textSpan.start, span.textSpan.start + span.textSpan.length);
43
+ if (mapped === null) {
44
+ continue;
45
+ }
46
+ const startLine = ctx.lineIndex.positionAt(mapped.start).line;
47
+ const endLine = ctx.lineIndex.positionAt(mapped.end).line;
48
+ add(startLine, endLine, span.kind === ts.OutliningSpanKind.Comment ? 'comment' : span.kind === ts.OutliningSpanKind.Imports ? 'imports' : 'region');
49
+ }
50
+ return ranges;
51
+ }
52
+ /**
53
+ * Code actions for `range`: TypeScript quick fixes for the overlapping
54
+ * diagnostics, plus any applicable refactors (extract function/constant, …)
55
+ * whose edits map cleanly back to the source. Refactors that would touch
56
+ * generated markup scaffolding are skipped, since their edits can't be
57
+ * represented faithfully in the original document.
58
+ */
59
+ export function getCodeActions(ctx, range, errorCodes) {
60
+ const start = ctx.lineIndex.offsetAt(range.start);
61
+ const end = ctx.lineIndex.offsetAt(range.end);
62
+ const generated = ctx.virtual.mapping.toGeneratedRange(start, Math.max(end, start));
63
+ if (generated === null) {
64
+ return [];
65
+ }
66
+ const actions = [];
67
+ const codes = errorCodes.length > 0 ? errorCodes : commonFixCodes();
68
+ const fixes = ctx.project.service.getCodeFixesAtPosition(ctx.virtualFile, generated.start, generated.end, codes, FORMAT_OPTIONS, {});
69
+ for (const fix of fixes) {
70
+ const edit = changesToWorkspaceEdit(ctx, fix.changes);
71
+ if (edit !== null) {
72
+ actions.push({ title: fix.description, kind: 'quickfix', edit, isPreferred: fix.fixName === fixes[0]?.fixName });
73
+ }
74
+ }
75
+ actions.push(...refactors(ctx, generated.start, generated.end));
76
+ return actions;
77
+ }
78
+ /** Applicable refactors at the range whose edits map cleanly to the source. */
79
+ function refactors(ctx, start, end) {
80
+ const positionOrRange = { pos: start, end };
81
+ let applicable;
82
+ try {
83
+ applicable = ctx.project.service.getApplicableRefactors(ctx.virtualFile, positionOrRange, {});
84
+ }
85
+ catch {
86
+ return [];
87
+ }
88
+ const actions = [];
89
+ for (const refactor of applicable) {
90
+ for (const action of refactor.actions) {
91
+ let edits;
92
+ try {
93
+ edits = ctx.project.service.getEditsForRefactor(ctx.virtualFile, FORMAT_OPTIONS, positionOrRange, refactor.name, action.name, {});
94
+ }
95
+ catch {
96
+ continue;
97
+ }
98
+ if (!edits) {
99
+ continue;
100
+ }
101
+ const edit = changesToWorkspaceEdit(ctx, edits.edits);
102
+ if (edit !== null) {
103
+ actions.push({ title: action.description, kind: 'refactor', edit });
104
+ }
105
+ }
106
+ }
107
+ return actions;
108
+ }
109
+ /** Formats the document, applying only edits that map cleanly to the source. */
110
+ export function getFormattingEdits(ctx) {
111
+ return mapTextChanges(ctx, ctx.project.service.getFormattingEditsForDocument(ctx.virtualFile, FORMAT_OPTIONS));
112
+ }
113
+ /** Formatting edits triggered by typing `ch` at a position (e.g. `;`, `}`). */
114
+ export function getOnTypeFormattingEdits(ctx, position, ch) {
115
+ const generated = toGenerated(ctx, ctx.lineIndex.offsetAt(position));
116
+ if (generated === null) {
117
+ return [];
118
+ }
119
+ return mapTextChanges(ctx, ctx.project.service.getFormattingEditsAfterKeystroke(ctx.virtualFile, generated, ch, FORMAT_OPTIONS));
120
+ }
121
+ /** Maps TS formatting text changes back to original-document edits (dropping unmappable ones). */
122
+ function mapTextChanges(ctx, changes) {
123
+ const edits = [];
124
+ for (const change of changes) {
125
+ const mapped = ctx.virtual.mapping.toOriginalRange(change.span.start, change.span.start + change.span.length);
126
+ if (mapped !== null) {
127
+ edits.push({ range: ctx.lineIndex.rangeAt(mapped.start, mapped.end), newText: change.newText });
128
+ }
129
+ }
130
+ return edits;
131
+ }
132
+ /** Smart-selection (Expand Selection) chains for each caret position. */
133
+ export function getSelectionRanges(ctx, positions) {
134
+ return positions.map((position) => {
135
+ const fallback = { range: { start: position, end: position } };
136
+ const generated = toGenerated(ctx, ctx.lineIndex.offsetAt(position));
137
+ if (generated === null) {
138
+ return fallback;
139
+ }
140
+ const tsRange = ctx.project.service.getSmartSelectionRange(ctx.virtualFile, generated);
141
+ return convertSelectionRange(ctx, tsRange) ?? fallback;
142
+ });
143
+ }
144
+ /** Converts a TS selection-range tree to mapped ranges (innermost references its parent). */
145
+ function convertSelectionRange(ctx, tsRange) {
146
+ // Collect each level's mapped range from innermost outward.
147
+ const ranges = [];
148
+ let node = tsRange;
149
+ while (node) {
150
+ const range = spanToRange(ctx, node.textSpan);
151
+ if (range !== null) {
152
+ ranges.push(range);
153
+ }
154
+ node = node.parent;
155
+ }
156
+ // Link outermost (no parent) inward, so each level references its enclosing one.
157
+ let result;
158
+ for (let i = ranges.length - 1; i >= 0; i--) {
159
+ result = { range: ranges[i], parent: result };
160
+ }
161
+ return result ?? null;
162
+ }
163
+ /** Converts TS multi-file text changes into a mapped WorkspaceEdit. */
164
+ function changesToWorkspaceEdit(ctx, changes) {
165
+ const result = {};
166
+ for (const fileChange of changes) {
167
+ for (const textChange of fileChange.textChanges) {
168
+ const location = resolveLocation(ctx.project, fileChange.fileName, textChange.span);
169
+ if (location === null) {
170
+ return null;
171
+ }
172
+ (result[location.uri] ??= []).push({ range: location.range, newText: textChange.newText });
173
+ }
174
+ }
175
+ return { changes: result };
176
+ }
177
+ /** A few common quick-fixable error codes used when none are supplied. */
178
+ function commonFixCodes() {
179
+ return [
180
+ 2304, // Cannot find name
181
+ 2552, // Cannot find name (did you mean)
182
+ 2345, // Argument type not assignable
183
+ 2769, // No overload matches
184
+ 6133, // Declared but never used
185
+ 2307 // Cannot find module
186
+ ];
187
+ }
188
+ //# sourceMappingURL=structure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structure.js","sourceRoot":"","sources":["../../src/providers/structure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type DocumentSymbol, type WorkspaceSymbol } from '../protocol.ts';
2
+ import { type RequestContext } from '../request.ts';
3
+ import type { AzerothProject } from '../ts-project.ts';
4
+ /** The outline for the document. */
5
+ export declare function getDocumentSymbols(ctx: RequestContext): DocumentSymbol[];
6
+ /** Project-wide symbol search. */
7
+ export declare function getWorkspaceSymbols(project: AzerothProject, query: string): WorkspaceSymbol[];
8
+ //# sourceMappingURL=symbols.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbols.d.ts","sourceRoot":"","sources":["../../src/providers/symbols.ts"],"names":[],"mappings":"AAMA,OAAO,EAEH,KAAK,cAAc,EAGnB,KAAK,eAAe,EACvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,oCAAoC;AACpC,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,cAAc,GAAG,cAAc,EAAE,CAUxE;AA8CD,kCAAkC;AAClC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,eAAe,EAAE,CAmB7F"}
@@ -0,0 +1,108 @@
1
+ // Document symbols (the outline) and workspace symbols (project-wide search).
2
+ // Both come from TypeScript's navigation APIs over the virtual module; spans
3
+ // are mapped back to the original `.azeroth` source, and any symbol whose span
4
+ // lives purely in generated scaffolding is dropped.
5
+ import ts from 'typescript';
6
+ import { SymbolKind } from "../protocol.js";
7
+ import { resolveLocation } from "../request.js";
8
+ /** The outline for the document. */
9
+ export function getDocumentSymbols(ctx) {
10
+ const tree = ctx.project.service.getNavigationTree(ctx.virtualFile);
11
+ if (!tree?.childItems) {
12
+ return [];
13
+ }
14
+ return tree.childItems
15
+ .map(item => toDocumentSymbol(ctx, item))
16
+ .filter((s) => s !== null);
17
+ }
18
+ /** Recursively converts a TS navigation node to a DocumentSymbol. */
19
+ function toDocumentSymbol(ctx, item) {
20
+ const span = item.spans[0];
21
+ if (!span) {
22
+ return null;
23
+ }
24
+ // A declaration that contains markup straddles generated scaffolding, so its
25
+ // full span isn't one contiguous mapping. Map the two endpoints
26
+ // independently (both sit in verbatim script) to recover the source range.
27
+ const start = ctx.virtual.mapping.toOriginal(span.start);
28
+ const end = ctx.virtual.mapping.toOriginal(span.start + span.length);
29
+ if (start === null || end === null || end < start) {
30
+ return null;
31
+ }
32
+ const fullRange = ctx.lineIndex.rangeAt(start, end);
33
+ const selectionRange = nameRange(ctx, item) ?? fullRange;
34
+ const children = (item.childItems ?? [])
35
+ .map(child => toDocumentSymbol(ctx, child))
36
+ .filter((s) => s !== null);
37
+ return {
38
+ name: item.text,
39
+ kind: tsKindToSymbolKind(item.kind),
40
+ range: fullRange,
41
+ selectionRange,
42
+ children: children.length > 0 ? children : undefined
43
+ };
44
+ }
45
+ /** Maps a navigation node's name span (the identifier) to a source range. */
46
+ function nameRange(ctx, item) {
47
+ const span = item.nameSpan;
48
+ if (!span) {
49
+ return null;
50
+ }
51
+ const mapped = ctx.virtual.mapping.toOriginalRange(span.start, span.start + span.length);
52
+ return mapped === null ? null : ctx.lineIndex.rangeAt(mapped.start, mapped.end);
53
+ }
54
+ /** Project-wide symbol search. */
55
+ export function getWorkspaceSymbols(project, query) {
56
+ const items = project.service.getNavigateToItems(query, undefined, undefined, false);
57
+ const out = [];
58
+ for (const item of items) {
59
+ const location = resolveLocation(project, item.fileName, item.textSpan);
60
+ if (location === null) {
61
+ continue;
62
+ }
63
+ out.push({
64
+ name: item.name,
65
+ kind: tsKindToSymbolKind(item.kind),
66
+ location,
67
+ containerName: item.containerName || undefined
68
+ });
69
+ }
70
+ return out;
71
+ }
72
+ /** Maps a TS ScriptElementKind to an LSP SymbolKind. */
73
+ function tsKindToSymbolKind(kind) {
74
+ switch (kind) {
75
+ case ts.ScriptElementKind.moduleElement:
76
+ return SymbolKind.Module;
77
+ case ts.ScriptElementKind.classElement:
78
+ case ts.ScriptElementKind.localClassElement:
79
+ return SymbolKind.Class;
80
+ case ts.ScriptElementKind.interfaceElement:
81
+ return SymbolKind.Interface;
82
+ case ts.ScriptElementKind.enumElement:
83
+ return SymbolKind.Enum;
84
+ case ts.ScriptElementKind.enumMemberElement:
85
+ return SymbolKind.EnumMember;
86
+ case ts.ScriptElementKind.functionElement:
87
+ case ts.ScriptElementKind.localFunctionElement:
88
+ return SymbolKind.Function;
89
+ case ts.ScriptElementKind.memberFunctionElement:
90
+ case ts.ScriptElementKind.constructorImplementationElement:
91
+ return SymbolKind.Method;
92
+ case ts.ScriptElementKind.memberVariableElement:
93
+ case ts.ScriptElementKind.memberGetAccessorElement:
94
+ case ts.ScriptElementKind.memberSetAccessorElement:
95
+ return SymbolKind.Property;
96
+ case ts.ScriptElementKind.variableElement:
97
+ case ts.ScriptElementKind.letElement:
98
+ return SymbolKind.Variable;
99
+ case ts.ScriptElementKind.constElement:
100
+ return SymbolKind.Constant;
101
+ case ts.ScriptElementKind.typeElement:
102
+ case ts.ScriptElementKind.typeParameterElement:
103
+ return SymbolKind.TypeParameter;
104
+ default:
105
+ return SymbolKind.Variable;
106
+ }
107
+ }
108
+ //# sourceMappingURL=symbols.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbols.js","sourceRoot":"","sources":["../../src/providers/symbols.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import ts from 'typescript';
2
+ import type { Location, Range } from './protocol.ts';
3
+ import { LineIndex } from './text.ts';
4
+ import { AzerothProject, isVirtualFile, toAzerothPath, toVirtualFile } from './ts-project.ts';
5
+ import type { VirtualCode } from './virtual-code.ts';
6
+ /** Everything a provider needs to answer one request about one document. */
7
+ export interface RequestContext {
8
+ project: AzerothProject;
9
+ /** The `.azeroth` document URI. */
10
+ uri: string;
11
+ /** Filesystem path of the `.azeroth` document. */
12
+ azerothPath: string;
13
+ /** Synthetic virtual TS file name TypeScript knows it by. */
14
+ virtualFile: string;
15
+ /** Original source text. */
16
+ source: string;
17
+ /** Compiled virtual module + offset mapping. */
18
+ virtual: VirtualCode;
19
+ /** Line index over the original source. */
20
+ lineIndex: LineIndex;
21
+ }
22
+ /** Maps an original offset to the virtual module, or null if unmapped. */
23
+ export declare function toGenerated(ctx: RequestContext, offset: number): number | null;
24
+ /**
25
+ * Maps a TS text span in *this* document's virtual module back to an original
26
+ * range, or null when it covers generated scaffolding.
27
+ */
28
+ export declare function spanToRange(ctx: RequestContext, span: ts.TextSpan): Range | null;
29
+ /**
30
+ * Resolves a TS document span (possibly in another file) to an editor Location.
31
+ * Virtual files map back through their own mapping and report the `.azeroth`
32
+ * URI; real files report directly.
33
+ */
34
+ export declare function resolveLocation(project: AzerothProject, fileName: string, span: ts.TextSpan): Location | null;
35
+ /** Re-exports so providers import file-name helpers from one place. */
36
+ export { isVirtualFile, toAzerothPath, toVirtualFile };
37
+ //# sourceMappingURL=request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../src/request.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EACH,cAAc,EACd,aAAa,EACb,aAAa,EACb,aAAa,EAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,4EAA4E;AAC5E,MAAM,WAAW,cAAc;IAE3B,OAAO,EAAE,cAAc,CAAC;IACxB,mCAAmC;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,kDAAkD;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,WAAW,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,OAAO,EAAE,WAAW,CAAC;IACrB,2CAA2C;IAC3C,SAAS,EAAE,SAAS,CAAC;CACxB;AAED,0EAA0E;AAC1E,wBAAgB,WAAW,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG9E;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,GAAG,KAAK,GAAG,IAAI,CAQhF;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAsB7G;AAED,uEAAuE;AACvE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,49 @@
1
+ // Per-request context and the glue that translates TypeScript results (which
2
+ // live in virtual-file offsets) back into the original `.azeroth` document
3
+ // (line/character ranges). Every provider takes a RequestContext and leans on
4
+ // these helpers so the offset bookkeeping lives in exactly one place.
5
+ import ts from 'typescript';
6
+ import { LineIndex } from "./text.js";
7
+ import { pathToUri } from "./uri.js";
8
+ import { isVirtualFile, toAzerothPath, toVirtualFile } from "./ts-project.js";
9
+ /** Maps an original offset to the virtual module, or null if unmapped. */
10
+ export function toGenerated(ctx, offset) {
11
+ return ctx.virtual.mapping.toGenerated(offset);
12
+ }
13
+ /**
14
+ * Maps a TS text span in *this* document's virtual module back to an original
15
+ * range, or null when it covers generated scaffolding.
16
+ */
17
+ export function spanToRange(ctx, span) {
18
+ const mapped = ctx.virtual.mapping.toOriginalRange(span.start, span.start + span.length);
19
+ if (mapped === null) {
20
+ return null;
21
+ }
22
+ return ctx.lineIndex.rangeAt(mapped.start, mapped.end);
23
+ }
24
+ /**
25
+ * Resolves a TS document span (possibly in another file) to an editor Location.
26
+ * Virtual files map back through their own mapping and report the `.azeroth`
27
+ * URI; real files report directly.
28
+ */
29
+ export function resolveLocation(project, fileName, span) {
30
+ if (isVirtualFile(fileName)) {
31
+ const azerothPath = toAzerothPath(fileName);
32
+ const virtual = project.getVirtual(azerothPath);
33
+ const mapped = virtual.mapping.toOriginalRange(span.start, span.start + span.length);
34
+ if (mapped === null) {
35
+ return null;
36
+ }
37
+ const lineIndex = new LineIndex(project.getSource(azerothPath) ?? '');
38
+ return { uri: pathToUri(azerothPath), range: lineIndex.rangeAt(mapped.start, mapped.end) };
39
+ }
40
+ const text = ts.sys.readFile(fileName);
41
+ if (text === undefined) {
42
+ return null;
43
+ }
44
+ const lineIndex = new LineIndex(text);
45
+ return { uri: pathToUri(fileName), range: lineIndex.rangeAt(span.start, span.start + span.length) };
46
+ }
47
+ /** Re-exports so providers import file-name helpers from one place. */
48
+ export { isVirtualFile, toAzerothPath, toVirtualFile };
49
+ //# sourceMappingURL=request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.js","sourceRoot":"","sources":["../src/request.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,2EAA2E;AAC3E,8EAA8E;AAC9E,sEAAsE;AAEtE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAEH,aAAa,EACb,aAAa,EACb,aAAa,EAChB,MAAM,iBAAiB,CAAC;AAqBzB,0EAA0E;AAC1E,MAAM,UAAU,WAAW,CAAC,GAAmB,EAAE,MAAc;IAE3D,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;AACnD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,GAAmB,EAAE,IAAiB;IAE9D,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IACzF,IAAI,MAAM,KAAK,IAAI,EACnB,CAAC;QACG,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;AAC3D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,OAAuB,EAAE,QAAgB,EAAE,IAAiB;IAExF,IAAI,aAAa,CAAC,QAAQ,CAAC,EAC3B,CAAC;QACG,MAAM,WAAW,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QACrF,IAAI,MAAM,KAAK,IAAI,EACnB,CAAC;YACG,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;QACtE,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IAC/F,CAAC;IAED,MAAM,IAAI,GAAG,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,IAAI,KAAK,SAAS,EACtB,CAAC;QACG,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;AACxG,CAAC;AAED,uEAAuE;AACvE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,73 @@
1
+ import type { CodeAction, CompletionItem, Diagnostic, DocumentHighlight, DocumentSymbol, FoldingRange, Hover, InlayHint, Location, Position, Range, SelectionRange, SemanticTokens, SignatureHelp, TextEdit, WorkspaceEdit, WorkspaceSymbol } from './protocol.ts';
2
+ import { type CompletionOptions } from './providers/completion.ts';
3
+ import { type InlayHintOptions } from './providers/inlay-hints.ts';
4
+ /**
5
+ * Compiler-aware language intelligence for `.azeroth` files.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * const ls = new AzerothLanguageService(process.cwd());
10
+ * ls.didOpen('file:///App.azeroth', 'export default () => <h1>Hi {name()}</h1>;');
11
+ * ls.getHover('file:///App.azeroth', { line: 0, character: 36 }); // type of name()
12
+ * ```
13
+ */
14
+ export declare class AzerothLanguageService {
15
+ private readonly project;
16
+ constructor(workspaceDirectory: string, configPath?: string);
17
+ /** Registers or replaces a document's content. */
18
+ didOpen(uri: string, source: string): void;
19
+ /** Updates a document's content. */
20
+ didChange(uri: string, source: string): void;
21
+ /** Drops a document. */
22
+ didClose(uri: string): void;
23
+ /** Context-aware completion at a position. */
24
+ getCompletions(uri: string, position: Position, options?: CompletionOptions): CompletionItem[];
25
+ /** Lazily fills in a completion item's documentation/detail. */
26
+ resolveCompletion(uri: string, item: CompletionItem): CompletionItem;
27
+ /** Hover information at a position. */
28
+ getHover(uri: string, position: Position): Hover | null;
29
+ /** Definition location(s) for the symbol at a position. */
30
+ getDefinition(uri: string, position: Position): Location[];
31
+ /** Type-definition location(s) for the symbol at a position. */
32
+ getTypeDefinition(uri: string, position: Position): Location[];
33
+ /** All references to the symbol at a position. */
34
+ getReferences(uri: string, position: Position): Location[];
35
+ /** Occurrences of the symbol at a position, for editor highlighting. */
36
+ getDocumentHighlights(uri: string, position: Position): DocumentHighlight[];
37
+ /** Workspace edit to rename the symbol at a position. */
38
+ getRenameEdits(uri: string, position: Position, newName: string): WorkspaceEdit | null;
39
+ /** The document outline. */
40
+ getDocumentSymbols(uri: string): DocumentSymbol[];
41
+ /** Project-wide symbol search. */
42
+ getWorkspaceSymbols(query: string): WorkspaceSymbol[];
43
+ /** Signature help for the call enclosing a position. */
44
+ getSignatureHelp(uri: string, position: Position): SignatureHelp | null;
45
+ /** Diagnostics for the document. */
46
+ getDiagnostics(uri: string): Diagnostic[];
47
+ /** Packed semantic tokens for the markup in the document. */
48
+ getSemanticTokens(uri: string): SemanticTokens;
49
+ /** Folding ranges for the document. */
50
+ getFoldingRanges(uri: string): FoldingRange[];
51
+ /** Code actions (quick fixes) for a range. */
52
+ getCodeActions(uri: string, range: Range, errorCodes?: number[]): CodeAction[];
53
+ /** Whole-document formatting edits (script/expression regions only). */
54
+ getFormattingEdits(uri: string): TextEdit[];
55
+ /** Inline parameter-name / inferred-type hints for a range. */
56
+ getInlayHints(uri: string, range: Range, options?: InlayHintOptions): InlayHint[];
57
+ /** Smart-selection (Expand/Shrink Selection) chains for the given carets. */
58
+ getSelectionRanges(uri: string, positions: Position[]): SelectionRange[];
59
+ /** Formatting edits triggered by typing `ch` at a position. */
60
+ getOnTypeFormattingEdits(uri: string, position: Position, ch: string): TextEdit[];
61
+ /**
62
+ * After the caret types `>`, returns a snippet closing the just-opened tag
63
+ * (e.g. `$0</div>`), or null. Powers JSX-style tag auto-closing.
64
+ */
65
+ getAutoCloseTag(uri: string, position: Position): string | null;
66
+ /** Opening/closing tag-name ranges to edit together (linked editing). */
67
+ getLinkedEditingRanges(uri: string, position: Position): Range[] | null;
68
+ /** The compiled virtual TS for a document - exposed for tests/tooling. */
69
+ getVirtualCode(uri: string): string;
70
+ /** Builds a RequestContext for a known document, or null if unknown. */
71
+ private context;
72
+ }
73
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}