@singapore-editor/lsp-plugin 0.1.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 (185) hide show
  1. package/README.md +103 -0
  2. package/dist/bufferSync.d.ts +12 -0
  3. package/dist/bufferSync.d.ts.map +1 -0
  4. package/dist/bufferSync.js +35 -0
  5. package/dist/bufferSync.js.map +1 -0
  6. package/dist/codeActions.d.ts +83 -0
  7. package/dist/codeActions.d.ts.map +1 -0
  8. package/dist/codeActions.js +294 -0
  9. package/dist/codeActions.js.map +1 -0
  10. package/dist/colorAlpha.d.ts +4 -0
  11. package/dist/colorAlpha.d.ts.map +1 -0
  12. package/dist/colorAlpha.js +28 -0
  13. package/dist/colorAlpha.js.map +1 -0
  14. package/dist/completion.d.ts +124 -0
  15. package/dist/completion.d.ts.map +1 -0
  16. package/dist/completion.js +609 -0
  17. package/dist/completion.js.map +1 -0
  18. package/dist/completionCommit.d.ts +19 -0
  19. package/dist/completionCommit.d.ts.map +1 -0
  20. package/dist/completionCommit.js +57 -0
  21. package/dist/completionCommit.js.map +1 -0
  22. package/dist/completionController.d.ts +89 -0
  23. package/dist/completionController.d.ts.map +1 -0
  24. package/dist/completionController.js +376 -0
  25. package/dist/completionController.js.map +1 -0
  26. package/dist/completionProviders.d.ts +50 -0
  27. package/dist/completionProviders.d.ts.map +1 -0
  28. package/dist/completionProviders.js +64 -0
  29. package/dist/completionProviders.js.map +1 -0
  30. package/dist/connectionContext.d.ts +7 -0
  31. package/dist/connectionContext.d.ts.map +1 -0
  32. package/dist/definitionLinkController.d.ts +54 -0
  33. package/dist/definitionLinkController.d.ts.map +1 -0
  34. package/dist/definitionLinkController.js +221 -0
  35. package/dist/definitionLinkController.js.map +1 -0
  36. package/dist/definitionNavigation.d.ts +76 -0
  37. package/dist/definitionNavigation.d.ts.map +1 -0
  38. package/dist/definitionNavigation.js +143 -0
  39. package/dist/definitionNavigation.js.map +1 -0
  40. package/dist/diagnosticNotes.d.ts +7 -0
  41. package/dist/diagnosticNotes.d.ts.map +1 -0
  42. package/dist/diagnosticNotes.js +37 -0
  43. package/dist/diagnosticNotes.js.map +1 -0
  44. package/dist/diagnosticProjection.d.ts +31 -0
  45. package/dist/diagnosticProjection.d.ts.map +1 -0
  46. package/dist/diagnosticProjection.js +79 -0
  47. package/dist/diagnosticProjection.js.map +1 -0
  48. package/dist/diagnostics.d.ts +16 -0
  49. package/dist/diagnostics.d.ts.map +1 -0
  50. package/dist/diagnostics.js +94 -0
  51. package/dist/diagnostics.js.map +1 -0
  52. package/dist/diagnosticsPresenter.d.ts +64 -0
  53. package/dist/diagnosticsPresenter.d.ts.map +1 -0
  54. package/dist/diagnosticsPresenter.js +305 -0
  55. package/dist/diagnosticsPresenter.js.map +1 -0
  56. package/dist/document.d.ts +69 -0
  57. package/dist/document.d.ts.map +1 -0
  58. package/dist/document.js +190 -0
  59. package/dist/document.js.map +1 -0
  60. package/dist/documentHighlightController.d.ts +34 -0
  61. package/dist/documentHighlightController.d.ts.map +1 -0
  62. package/dist/documentHighlightController.js +101 -0
  63. package/dist/documentHighlightController.js.map +1 -0
  64. package/dist/documentSnapshot.d.ts +9 -0
  65. package/dist/documentSnapshot.d.ts.map +1 -0
  66. package/dist/documentSnapshot.js +31 -0
  67. package/dist/documentSnapshot.js.map +1 -0
  68. package/dist/documentSync.d.ts +53 -0
  69. package/dist/documentSync.d.ts.map +1 -0
  70. package/dist/documentSync.js +334 -0
  71. package/dist/documentSync.js.map +1 -0
  72. package/dist/documentSyncController.d.ts +26 -0
  73. package/dist/documentSyncController.d.ts.map +1 -0
  74. package/dist/documentSyncController.js +24 -0
  75. package/dist/documentSyncController.js.map +1 -0
  76. package/dist/formatOnType.d.ts +43 -0
  77. package/dist/formatOnType.d.ts.map +1 -0
  78. package/dist/formatOnType.js +198 -0
  79. package/dist/formatOnType.js.map +1 -0
  80. package/dist/formatting.d.ts +18 -0
  81. package/dist/formatting.d.ts.map +1 -0
  82. package/dist/formatting.js +52 -0
  83. package/dist/formatting.js.map +1 -0
  84. package/dist/fuzzyMatch.d.ts +22 -0
  85. package/dist/fuzzyMatch.d.ts.map +1 -0
  86. package/dist/fuzzyMatch.js +216 -0
  87. package/dist/fuzzyMatch.js.map +1 -0
  88. package/dist/hoverParticipant.d.ts +24 -0
  89. package/dist/hoverParticipant.d.ts.map +1 -0
  90. package/dist/hoverParticipant.js +156 -0
  91. package/dist/hoverParticipant.js.map +1 -0
  92. package/dist/index.d.ts +18 -0
  93. package/dist/index.d.ts.map +1 -0
  94. package/dist/index.js +17 -0
  95. package/dist/keyCommands.d.ts +19 -0
  96. package/dist/keyCommands.d.ts.map +1 -0
  97. package/dist/keyCommands.js +21 -0
  98. package/dist/keyCommands.js.map +1 -0
  99. package/dist/lane.d.ts +28 -0
  100. package/dist/lane.d.ts.map +1 -0
  101. package/dist/lane.js +138 -0
  102. package/dist/lane.js.map +1 -0
  103. package/dist/lspConnection.d.ts +94 -0
  104. package/dist/lspConnection.d.ts.map +1 -0
  105. package/dist/lspConnection.js +195 -0
  106. package/dist/lspConnection.js.map +1 -0
  107. package/dist/lspConnectionPool.d.ts +34 -0
  108. package/dist/lspConnectionPool.d.ts.map +1 -0
  109. package/dist/lspConnectionPool.js +255 -0
  110. package/dist/lspConnectionPool.js.map +1 -0
  111. package/dist/minimalEdits.d.ts +21 -0
  112. package/dist/minimalEdits.d.ts.map +1 -0
  113. package/dist/minimalEdits.js +181 -0
  114. package/dist/minimalEdits.js.map +1 -0
  115. package/dist/paths.d.ts +6 -0
  116. package/dist/paths.d.ts.map +1 -0
  117. package/dist/paths.js +38 -0
  118. package/dist/paths.js.map +1 -0
  119. package/dist/plugin.d.ts +100 -0
  120. package/dist/plugin.d.ts.map +1 -0
  121. package/dist/plugin.js +837 -0
  122. package/dist/plugin.js.map +1 -0
  123. package/dist/plugin.styles.d.ts +31 -0
  124. package/dist/plugin.styles.d.ts.map +1 -0
  125. package/dist/plugin.styles.js +102 -0
  126. package/dist/plugin.styles.js.map +1 -0
  127. package/dist/pluginTypes.d.ts +41 -0
  128. package/dist/pluginTypes.d.ts.map +1 -0
  129. package/dist/pluginTypes.js +0 -0
  130. package/dist/pullDiagnostics.d.ts +30 -0
  131. package/dist/pullDiagnostics.d.ts.map +1 -0
  132. package/dist/pullDiagnostics.js +94 -0
  133. package/dist/pullDiagnostics.js.map +1 -0
  134. package/dist/renameWidget.d.ts +30 -0
  135. package/dist/renameWidget.d.ts.map +1 -0
  136. package/dist/renameWidget.js +117 -0
  137. package/dist/renameWidget.js.map +1 -0
  138. package/dist/semanticTokenDecoder.d.ts +81 -0
  139. package/dist/semanticTokenDecoder.d.ts.map +1 -0
  140. package/dist/semanticTokenDecoder.js +132 -0
  141. package/dist/semanticTokenDecoder.js.map +1 -0
  142. package/dist/semanticTokens.d.ts +47 -0
  143. package/dist/semanticTokens.d.ts.map +1 -0
  144. package/dist/semanticTokens.js +68 -0
  145. package/dist/semanticTokens.js.map +1 -0
  146. package/dist/serverSet.d.ts +69 -0
  147. package/dist/serverSet.d.ts.map +1 -0
  148. package/dist/serverSet.js +331 -0
  149. package/dist/serverSet.js.map +1 -0
  150. package/dist/signatureHelp.d.ts +40 -0
  151. package/dist/signatureHelp.d.ts.map +1 -0
  152. package/dist/signatureHelp.js +108 -0
  153. package/dist/signatureHelp.js.map +1 -0
  154. package/dist/signatureHelpController.d.ts +52 -0
  155. package/dist/signatureHelpController.d.ts.map +1 -0
  156. package/dist/signatureHelpController.js +160 -0
  157. package/dist/signatureHelpController.js.map +1 -0
  158. package/dist/sourceText.d.ts +22 -0
  159. package/dist/sourceText.d.ts.map +1 -0
  160. package/dist/sourceText.js +70 -0
  161. package/dist/sourceText.js.map +1 -0
  162. package/dist/types.d.ts +238 -0
  163. package/dist/types.d.ts.map +1 -0
  164. package/dist/types.js +17 -0
  165. package/dist/types.js.map +1 -0
  166. package/dist/viewDocumentSnapshot.d.ts +5 -0
  167. package/dist/viewDocumentSnapshot.d.ts.map +1 -0
  168. package/dist/viewDocumentSnapshot.js +12 -0
  169. package/dist/viewDocumentSnapshot.js.map +1 -0
  170. package/dist/websocket.d.ts +6 -0
  171. package/dist/websocket.d.ts.map +1 -0
  172. package/dist/websocket.js +4 -0
  173. package/dist/workspaceEdit.d.ts +66 -0
  174. package/dist/workspaceEdit.d.ts.map +1 -0
  175. package/dist/workspaceEdit.js +276 -0
  176. package/dist/workspaceEdit.js.map +1 -0
  177. package/dist/workspaceEditProvenance.d.ts +5 -0
  178. package/dist/workspaceEditProvenance.d.ts.map +1 -0
  179. package/dist/workspaceEditProvenance.js +16 -0
  180. package/dist/workspaceEditProvenance.js.map +1 -0
  181. package/dist/workspaceTextEdits.d.ts +60 -0
  182. package/dist/workspaceTextEdits.d.ts.map +1 -0
  183. package/dist/workspaceTextEdits.js +395 -0
  184. package/dist/workspaceTextEdits.js.map +1 -0
  185. package/package.json +118 -0
@@ -0,0 +1,4 @@
1
+ import { acquireLanguageServerLane } from "./lane.js";
2
+ import { LanguageServerDocument, createLanguageServerDocument } from "./document.js";
3
+ import { createLanguageServerPlugin, createLanguageServerSetPlugin } from "./plugin.js";
4
+ export { LanguageServerDocument, acquireLanguageServerLane, createLanguageServerDocument, createLanguageServerPlugin, createLanguageServerSetPlugin };
@@ -0,0 +1,66 @@
1
+ export type ParsedWorkspaceEdit = {
2
+ readonly annotations: ReadonlyMap<string, WorkspaceEditAnnotation>;
3
+ readonly operations: readonly WorkspaceEditOperation[];
4
+ };
5
+ export type WorkspaceEditAnnotation = {
6
+ readonly description?: string;
7
+ readonly label: string;
8
+ readonly needsConfirmation: boolean;
9
+ };
10
+ export type ParsedWorkspacePosition = {
11
+ readonly character: number;
12
+ readonly line: number;
13
+ };
14
+ export type ParsedWorkspaceTextEdit = {
15
+ readonly annotationId?: string;
16
+ readonly newText: string;
17
+ readonly range: {
18
+ readonly end: ParsedWorkspacePosition;
19
+ readonly start: ParsedWorkspacePosition;
20
+ };
21
+ };
22
+ export type WorkspaceEditOperation = {
23
+ readonly annotationId?: string;
24
+ readonly edits: readonly ParsedWorkspaceTextEdit[];
25
+ readonly kind: 'text-document';
26
+ readonly uri: string;
27
+ readonly version: number | null;
28
+ } | {
29
+ readonly annotationId?: string;
30
+ readonly ignoreIfExists: boolean;
31
+ readonly kind: 'create';
32
+ readonly overwrite: boolean;
33
+ readonly uri: string;
34
+ } | {
35
+ readonly annotationId?: string;
36
+ readonly ignoreIfExists: boolean;
37
+ readonly kind: 'rename';
38
+ readonly newUri: string;
39
+ readonly oldUri: string;
40
+ readonly overwrite: boolean;
41
+ } | {
42
+ readonly annotationId?: string;
43
+ readonly ignoreIfNotExists: boolean;
44
+ readonly kind: 'delete';
45
+ readonly recursive: boolean;
46
+ readonly uri: string;
47
+ };
48
+ export type WorkspaceEditFailure = {
49
+ readonly code: WorkspaceEditFailureCode;
50
+ readonly editIndex?: number;
51
+ readonly operationIndex?: number;
52
+ readonly reason: string;
53
+ };
54
+ export type WorkspaceEditFailureCode = 'ambiguous-inserts' | 'invalid-annotation' | 'invalid-position' | 'invalid-workspace-edit' | 'overlapping-edits' | 'reversed-range' | 'snapshot-drift' | 'unsupported-snippet' | 'version-mismatch';
55
+ export type ParseWorkspaceEditResult = ParseResult<ParsedWorkspaceEdit>;
56
+ type ParseResult<T> = {
57
+ readonly ok: true;
58
+ readonly value: T;
59
+ } | {
60
+ readonly error: WorkspaceEditFailure;
61
+ readonly ok: false;
62
+ };
63
+ export declare function parseWorkspaceEdit(input: unknown): ParseWorkspaceEditResult;
64
+ export { prepareWorkspaceTextReplay } from './workspaceTextEdits';
65
+ export type { PreparedWorkspaceTextEdit, PreparedWorkspaceTextSegment, PreparedWorkspaceTextStep, PrepareWorkspaceTextReplayResult, WorkspaceTextDocumentProvenance, WorkspaceTextReplayInput, WorkspaceTextReplaySegmentInput, WorkspaceTextReplayTarget, } from './workspaceTextEdits';
66
+ //# sourceMappingURL=workspaceEdit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspaceEdit.d.ts","sourceRoot":"","sources":["../src/workspaceEdit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,276 @@
1
+ import { prepareWorkspaceTextReplay } from "./workspaceTextEdits.js";
2
+ //#region src/workspaceEdit.ts
3
+ var EMPTY_OPERATIONS = Object.freeze([]);
4
+ function parseWorkspaceEdit(input) {
5
+ if (input === null || input === void 0) return emptyWorkspaceEdit();
6
+ if (!isRecord(input)) return invalidWorkspaceEdit("WorkspaceEdit must be an object");
7
+ const annotations = parseAnnotations(input);
8
+ if (!annotations.ok) return annotations;
9
+ const hasChanges = hasOwn(input, "changes");
10
+ const hasDocumentChanges = hasOwn(input, "documentChanges");
11
+ if (hasChanges && hasDocumentChanges) return invalidWorkspaceEdit("WorkspaceEdit cannot contain both changes and documentChanges");
12
+ if (hasDocumentChanges) return parseDocumentChanges(input.documentChanges, annotations.value);
13
+ if (hasChanges) return parseLegacyChanges(input.changes, annotations.value);
14
+ return workspaceEditResult(annotations.value, EMPTY_OPERATIONS);
15
+ }
16
+ function parseAnnotations(input) {
17
+ if (!hasOwn(input, "changeAnnotations")) return parsed(/* @__PURE__ */ new Map());
18
+ if (!isRecord(input.changeAnnotations)) return failed("invalid-annotation", "changeAnnotations must be an object");
19
+ const annotations = /* @__PURE__ */ new Map();
20
+ for (const [id, value] of Object.entries(input.changeAnnotations)) {
21
+ const annotation = parseAnnotation(value);
22
+ if (!annotation.ok) return annotation;
23
+ annotations.set(id, annotation.value);
24
+ }
25
+ return parsed(annotations);
26
+ }
27
+ function parseAnnotation(input) {
28
+ if (!isRecord(input) || typeof input.label !== "string") return failed("invalid-annotation", "Every change annotation must have a string label");
29
+ if (hasOwn(input, "needsConfirmation") && typeof input.needsConfirmation !== "boolean") return failed("invalid-annotation", "Annotation needsConfirmation must be a boolean");
30
+ if (hasOwn(input, "description") && typeof input.description !== "string") return failed("invalid-annotation", "Annotation description must be a string");
31
+ return parsed(Object.freeze({
32
+ ...typeof input.description === "string" ? { description: input.description } : {},
33
+ label: input.label,
34
+ needsConfirmation: input.needsConfirmation === true
35
+ }));
36
+ }
37
+ function parseDocumentChanges(input, annotations) {
38
+ if (!Array.isArray(input)) return invalidWorkspaceEdit("documentChanges must be an array");
39
+ const operations = [];
40
+ for (let operationIndex = 0; operationIndex < input.length; operationIndex += 1) {
41
+ const operation = parseOperation(input[operationIndex], annotations, operationIndex);
42
+ if (!operation.ok) return operation;
43
+ operations.push(operation.value);
44
+ }
45
+ return workspaceEditResult(annotations, Object.freeze(operations));
46
+ }
47
+ function parseLegacyChanges(input, annotations) {
48
+ if (!isRecord(input)) return invalidWorkspaceEdit("changes must be an object");
49
+ const operations = [];
50
+ const entries = Object.entries(input).sort(([left], [right]) => compareCodeUnits(left, right));
51
+ for (let operationIndex = 0; operationIndex < entries.length; operationIndex += 1) {
52
+ const [uri, value] = entries[operationIndex];
53
+ const edits = parseTextEdits(value, annotations, operationIndex);
54
+ if (!edits.ok) return edits;
55
+ operations.push(Object.freeze({
56
+ edits: edits.value,
57
+ kind: "text-document",
58
+ uri,
59
+ version: null
60
+ }));
61
+ }
62
+ return workspaceEditResult(annotations, Object.freeze(operations));
63
+ }
64
+ function parseOperation(input, annotations, operationIndex) {
65
+ if (!isRecord(input)) return invalidOperation(operationIndex, "WorkspaceEdit operation must be an object");
66
+ if (!hasOwn(input, "kind")) return parseTextDocumentOperation(input, annotations, operationIndex);
67
+ if (input.kind === "create") return parseCreateOperation(input, annotations, operationIndex);
68
+ if (input.kind === "rename") return parseRenameOperation(input, annotations, operationIndex);
69
+ if (input.kind === "delete") return parseDeleteOperation(input, annotations, operationIndex);
70
+ return invalidOperation(operationIndex, "WorkspaceEdit contains an unknown resource operation");
71
+ }
72
+ function parseTextDocumentOperation(input, annotations, operationIndex) {
73
+ if (!isRecord(input.textDocument) || typeof input.textDocument.uri !== "string") return invalidOperation(operationIndex, "Text document operation must have a string URI");
74
+ const version = input.textDocument.version;
75
+ if (version !== null && !Number.isInteger(version)) return invalidOperation(operationIndex, "Text document version must be an integer or null");
76
+ const annotationId = parseAnnotationReference(input, annotations, operationIndex);
77
+ if (!annotationId.ok) return annotationId;
78
+ const edits = parseTextEdits(input.edits, annotations, operationIndex);
79
+ if (!edits.ok) return edits;
80
+ return parsed(Object.freeze({
81
+ ...optionalAnnotationId(annotationId.value),
82
+ edits: edits.value,
83
+ kind: "text-document",
84
+ uri: input.textDocument.uri,
85
+ version
86
+ }));
87
+ }
88
+ function parseCreateOperation(input, annotations, operationIndex) {
89
+ if (typeof input.uri !== "string") return invalidOperation(operationIndex, "Create operation must have a string URI");
90
+ const annotationId = parseAnnotationReference(input, annotations, operationIndex);
91
+ if (!annotationId.ok) return annotationId;
92
+ const options = parseResourceOptions(input.options, operationIndex);
93
+ if (!options.ok) return options;
94
+ const overwrite = resourceBoolean(options.value, "overwrite", operationIndex);
95
+ if (!overwrite.ok) return overwrite;
96
+ const ignoreIfExists = resourceBoolean(options.value, "ignoreIfExists", operationIndex);
97
+ if (!ignoreIfExists.ok) return ignoreIfExists;
98
+ return parsed(Object.freeze({
99
+ ...optionalAnnotationId(annotationId.value),
100
+ ignoreIfExists: ignoreIfExists.value,
101
+ kind: "create",
102
+ overwrite: overwrite.value,
103
+ uri: input.uri
104
+ }));
105
+ }
106
+ function parseRenameOperation(input, annotations, operationIndex) {
107
+ if (typeof input.oldUri !== "string" || typeof input.newUri !== "string") return invalidOperation(operationIndex, "Rename operation must have string oldUri and newUri");
108
+ const annotationId = parseAnnotationReference(input, annotations, operationIndex);
109
+ if (!annotationId.ok) return annotationId;
110
+ const options = parseResourceOptions(input.options, operationIndex);
111
+ if (!options.ok) return options;
112
+ const overwrite = resourceBoolean(options.value, "overwrite", operationIndex);
113
+ if (!overwrite.ok) return overwrite;
114
+ const ignoreIfExists = resourceBoolean(options.value, "ignoreIfExists", operationIndex);
115
+ if (!ignoreIfExists.ok) return ignoreIfExists;
116
+ return parsed(Object.freeze({
117
+ ...optionalAnnotationId(annotationId.value),
118
+ ignoreIfExists: ignoreIfExists.value,
119
+ kind: "rename",
120
+ newUri: input.newUri,
121
+ oldUri: input.oldUri,
122
+ overwrite: overwrite.value
123
+ }));
124
+ }
125
+ function parseDeleteOperation(input, annotations, operationIndex) {
126
+ if (typeof input.uri !== "string") return invalidOperation(operationIndex, "Delete operation must have a string URI");
127
+ const annotationId = parseAnnotationReference(input, annotations, operationIndex);
128
+ if (!annotationId.ok) return annotationId;
129
+ const options = parseResourceOptions(input.options, operationIndex);
130
+ if (!options.ok) return options;
131
+ const recursive = resourceBoolean(options.value, "recursive", operationIndex);
132
+ if (!recursive.ok) return recursive;
133
+ const ignoreIfNotExists = resourceBoolean(options.value, "ignoreIfNotExists", operationIndex);
134
+ if (!ignoreIfNotExists.ok) return ignoreIfNotExists;
135
+ return parsed(Object.freeze({
136
+ ...optionalAnnotationId(annotationId.value),
137
+ ignoreIfNotExists: ignoreIfNotExists.value,
138
+ kind: "delete",
139
+ recursive: recursive.value,
140
+ uri: input.uri
141
+ }));
142
+ }
143
+ function parseResourceOptions(input, operationIndex) {
144
+ if (input === void 0) return parsed(void 0);
145
+ if (isRecord(input)) return parsed(input);
146
+ return invalidOperation(operationIndex, "Resource operation options must be an object");
147
+ }
148
+ function resourceBoolean(options, key, operationIndex) {
149
+ if (!options || !hasOwn(options, key)) return parsed(false);
150
+ if (typeof options[key] === "boolean") return parsed(options[key]);
151
+ return invalidOperation(operationIndex, `Resource option ${key} must be a boolean`);
152
+ }
153
+ function parseTextEdits(input, annotations, operationIndex) {
154
+ if (!Array.isArray(input)) return invalidOperation(operationIndex, "Text document edits must be an array");
155
+ const edits = [];
156
+ for (let editIndex = 0; editIndex < input.length; editIndex += 1) {
157
+ const edit = parseTextEdit(input[editIndex], annotations, operationIndex, editIndex);
158
+ if (!edit.ok) return edit;
159
+ edits.push(edit.value);
160
+ }
161
+ return parsed(Object.freeze(edits));
162
+ }
163
+ function parseTextEdit(input, annotations, operationIndex, editIndex) {
164
+ if (!isRecord(input)) return invalidTextEdit(operationIndex, editIndex, "Text edit must be an object");
165
+ if (hasOwn(input, "snippet")) return failed("unsupported-snippet", "Snippet text edits are unsupported", {
166
+ editIndex,
167
+ operationIndex
168
+ });
169
+ if (typeof input.newText !== "string") return invalidTextEdit(operationIndex, editIndex, "Text edit newText must be a string");
170
+ if (!isRecord(input.range)) return invalidPosition(operationIndex, editIndex, "Text edit range must be an object");
171
+ const start = parsePosition(input.range.start, operationIndex, editIndex);
172
+ if (!start.ok) return start;
173
+ const end = parsePosition(input.range.end, operationIndex, editIndex);
174
+ if (!end.ok) return end;
175
+ const annotationId = parseAnnotationReference(input, annotations, operationIndex, editIndex);
176
+ if (!annotationId.ok) return annotationId;
177
+ return parsed(Object.freeze({
178
+ ...optionalAnnotationId(annotationId.value),
179
+ newText: input.newText,
180
+ range: Object.freeze({
181
+ end: end.value,
182
+ start: start.value
183
+ })
184
+ }));
185
+ }
186
+ function parsePosition(input, operationIndex, editIndex) {
187
+ if (!isRecord(input)) return invalidPosition(operationIndex, editIndex, "Position must be an object");
188
+ if (!isNonNegativeInteger(input.line) || !isNonNegativeInteger(input.character)) return invalidPosition(operationIndex, editIndex, "Position line and character must be non-negative integers");
189
+ return parsed(Object.freeze({
190
+ character: input.character,
191
+ line: input.line
192
+ }));
193
+ }
194
+ function parseAnnotationReference(input, annotations, operationIndex, editIndex) {
195
+ if (!hasOwn(input, "annotationId")) return parsed(void 0);
196
+ if (typeof input.annotationId !== "string") return failed("invalid-annotation", "annotationId must be a string", {
197
+ editIndex,
198
+ operationIndex
199
+ });
200
+ if (annotations.has(input.annotationId)) return parsed(input.annotationId);
201
+ return failed("invalid-annotation", `Unknown change annotation ${input.annotationId}`, {
202
+ editIndex,
203
+ operationIndex
204
+ });
205
+ }
206
+ function optionalAnnotationId(annotationId) {
207
+ if (annotationId === void 0) return {};
208
+ return { annotationId };
209
+ }
210
+ function emptyWorkspaceEdit() {
211
+ return workspaceEditResult(/* @__PURE__ */ new Map(), EMPTY_OPERATIONS);
212
+ }
213
+ function workspaceEditResult(annotations, operations) {
214
+ return parsed(Object.freeze({
215
+ annotations,
216
+ operations
217
+ }));
218
+ }
219
+ function invalidWorkspaceEdit(reason) {
220
+ return failed("invalid-workspace-edit", reason);
221
+ }
222
+ function invalidOperation(operationIndex, reason) {
223
+ return failed("invalid-workspace-edit", reason, { operationIndex });
224
+ }
225
+ function invalidTextEdit(operationIndex, editIndex, reason) {
226
+ return failed("invalid-workspace-edit", reason, {
227
+ editIndex,
228
+ operationIndex
229
+ });
230
+ }
231
+ function invalidPosition(operationIndex, editIndex, reason) {
232
+ return failed("invalid-position", reason, {
233
+ editIndex,
234
+ operationIndex
235
+ });
236
+ }
237
+ function parsed(value) {
238
+ return {
239
+ ok: true,
240
+ value
241
+ };
242
+ }
243
+ function failed(code, reason, indices = {}) {
244
+ return {
245
+ error: Object.freeze({
246
+ code,
247
+ reason,
248
+ ...definedIndices(indices)
249
+ }),
250
+ ok: false
251
+ };
252
+ }
253
+ function definedIndices(indices) {
254
+ return {
255
+ ...indices.operationIndex === void 0 ? {} : { operationIndex: indices.operationIndex },
256
+ ...indices.editIndex === void 0 ? {} : { editIndex: indices.editIndex }
257
+ };
258
+ }
259
+ function isRecord(value) {
260
+ return typeof value === "object" && value !== null && !Array.isArray(value);
261
+ }
262
+ function hasOwn(value, key) {
263
+ return Object.prototype.hasOwnProperty.call(value, key);
264
+ }
265
+ function isNonNegativeInteger(value) {
266
+ return Number.isInteger(value) && Number(value) >= 0;
267
+ }
268
+ function compareCodeUnits(left, right) {
269
+ if (left < right) return -1;
270
+ if (left > right) return 1;
271
+ return 0;
272
+ }
273
+ //#endregion
274
+ export { parseWorkspaceEdit, prepareWorkspaceTextReplay };
275
+
276
+ //# sourceMappingURL=workspaceEdit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspaceEdit.js","names":[],"sources":["../src/workspaceEdit.ts"],"sourcesContent":["export type ParsedWorkspaceEdit = {\n readonly annotations: ReadonlyMap<string, WorkspaceEditAnnotation>\n readonly operations: readonly WorkspaceEditOperation[]\n}\n\nexport type WorkspaceEditAnnotation = {\n readonly description?: string\n readonly label: string\n readonly needsConfirmation: boolean\n}\n\nexport type ParsedWorkspacePosition = {\n readonly character: number\n readonly line: number\n}\n\nexport type ParsedWorkspaceTextEdit = {\n readonly annotationId?: string\n readonly newText: string\n readonly range: {\n readonly end: ParsedWorkspacePosition\n readonly start: ParsedWorkspacePosition\n }\n}\n\nexport type WorkspaceEditOperation =\n | {\n readonly annotationId?: string\n readonly edits: readonly ParsedWorkspaceTextEdit[]\n readonly kind: 'text-document'\n readonly uri: string\n readonly version: number | null\n }\n | {\n readonly annotationId?: string\n readonly ignoreIfExists: boolean\n readonly kind: 'create'\n readonly overwrite: boolean\n readonly uri: string\n }\n | {\n readonly annotationId?: string\n readonly ignoreIfExists: boolean\n readonly kind: 'rename'\n readonly newUri: string\n readonly oldUri: string\n readonly overwrite: boolean\n }\n | {\n readonly annotationId?: string\n readonly ignoreIfNotExists: boolean\n readonly kind: 'delete'\n readonly recursive: boolean\n readonly uri: string\n }\n\nexport type WorkspaceEditFailure = {\n readonly code: WorkspaceEditFailureCode\n readonly editIndex?: number\n readonly operationIndex?: number\n readonly reason: string\n}\n\nexport type WorkspaceEditFailureCode =\n | 'ambiguous-inserts'\n | 'invalid-annotation'\n | 'invalid-position'\n | 'invalid-workspace-edit'\n | 'overlapping-edits'\n | 'reversed-range'\n | 'snapshot-drift'\n | 'unsupported-snippet'\n | 'version-mismatch'\n\nexport type ParseWorkspaceEditResult = ParseResult<ParsedWorkspaceEdit>\n\ntype ParseResult<T> =\n | { readonly ok: true; readonly value: T }\n | { readonly error: WorkspaceEditFailure; readonly ok: false }\n\ntype UnknownRecord = Readonly<Record<string, unknown>>\n\nconst EMPTY_OPERATIONS: readonly WorkspaceEditOperation[] = Object.freeze([])\n\nexport function parseWorkspaceEdit(input: unknown): ParseWorkspaceEditResult {\n if (input === null || input === undefined) return emptyWorkspaceEdit()\n if (!isRecord(input)) return invalidWorkspaceEdit('WorkspaceEdit must be an object')\n\n const annotations = parseAnnotations(input)\n if (!annotations.ok) return annotations\n\n const hasChanges = hasOwn(input, 'changes')\n const hasDocumentChanges = hasOwn(input, 'documentChanges')\n if (hasChanges && hasDocumentChanges) {\n return invalidWorkspaceEdit('WorkspaceEdit cannot contain both changes and documentChanges')\n }\n if (hasDocumentChanges) return parseDocumentChanges(input.documentChanges, annotations.value)\n if (hasChanges) return parseLegacyChanges(input.changes, annotations.value)\n return workspaceEditResult(annotations.value, EMPTY_OPERATIONS)\n}\n\nfunction parseAnnotations(\n input: UnknownRecord,\n): ParseResult<ReadonlyMap<string, WorkspaceEditAnnotation>> {\n if (!hasOwn(input, 'changeAnnotations')) return parsed(new Map())\n if (!isRecord(input.changeAnnotations)) {\n return failed('invalid-annotation', 'changeAnnotations must be an object')\n }\n\n const annotations = new Map<string, WorkspaceEditAnnotation>()\n for (const [id, value] of Object.entries(input.changeAnnotations)) {\n const annotation = parseAnnotation(value)\n if (!annotation.ok) return annotation\n annotations.set(id, annotation.value)\n }\n return parsed(annotations)\n}\n\nfunction parseAnnotation(input: unknown): ParseResult<WorkspaceEditAnnotation> {\n if (!isRecord(input) || typeof input.label !== 'string') {\n return failed('invalid-annotation', 'Every change annotation must have a string label')\n }\n if (hasOwn(input, 'needsConfirmation') && typeof input.needsConfirmation !== 'boolean') {\n return failed('invalid-annotation', 'Annotation needsConfirmation must be a boolean')\n }\n if (hasOwn(input, 'description') && typeof input.description !== 'string') {\n return failed('invalid-annotation', 'Annotation description must be a string')\n }\n\n const annotation: WorkspaceEditAnnotation = Object.freeze({\n ...(typeof input.description === 'string' ? { description: input.description } : {}),\n label: input.label,\n needsConfirmation: input.needsConfirmation === true,\n })\n return parsed(annotation)\n}\n\nfunction parseDocumentChanges(\n input: unknown,\n annotations: ReadonlyMap<string, WorkspaceEditAnnotation>,\n): ParseWorkspaceEditResult {\n if (!Array.isArray(input)) return invalidWorkspaceEdit('documentChanges must be an array')\n\n const operations: WorkspaceEditOperation[] = []\n for (let operationIndex = 0; operationIndex < input.length; operationIndex += 1) {\n const operation = parseOperation(input[operationIndex], annotations, operationIndex)\n if (!operation.ok) return operation\n operations.push(operation.value)\n }\n return workspaceEditResult(annotations, Object.freeze(operations))\n}\n\nfunction parseLegacyChanges(\n input: unknown,\n annotations: ReadonlyMap<string, WorkspaceEditAnnotation>,\n): ParseWorkspaceEditResult {\n if (!isRecord(input)) return invalidWorkspaceEdit('changes must be an object')\n\n const operations: WorkspaceEditOperation[] = []\n const entries = Object.entries(input).sort(([left], [right]) => compareCodeUnits(left, right))\n for (let operationIndex = 0; operationIndex < entries.length; operationIndex += 1) {\n const [uri, value] = entries[operationIndex]!\n const edits = parseTextEdits(value, annotations, operationIndex)\n if (!edits.ok) return edits\n operations.push(\n Object.freeze({ edits: edits.value, kind: 'text-document', uri, version: null }),\n )\n }\n return workspaceEditResult(annotations, Object.freeze(operations))\n}\n\nfunction parseOperation(\n input: unknown,\n annotations: ReadonlyMap<string, WorkspaceEditAnnotation>,\n operationIndex: number,\n): ParseResult<WorkspaceEditOperation> {\n if (!isRecord(input)) {\n return invalidOperation(operationIndex, 'WorkspaceEdit operation must be an object')\n }\n if (!hasOwn(input, 'kind')) return parseTextDocumentOperation(input, annotations, operationIndex)\n if (input.kind === 'create') return parseCreateOperation(input, annotations, operationIndex)\n if (input.kind === 'rename') return parseRenameOperation(input, annotations, operationIndex)\n if (input.kind === 'delete') return parseDeleteOperation(input, annotations, operationIndex)\n return invalidOperation(operationIndex, 'WorkspaceEdit contains an unknown resource operation')\n}\n\nfunction parseTextDocumentOperation(\n input: UnknownRecord,\n annotations: ReadonlyMap<string, WorkspaceEditAnnotation>,\n operationIndex: number,\n): ParseResult<WorkspaceEditOperation> {\n if (!isRecord(input.textDocument) || typeof input.textDocument.uri !== 'string') {\n return invalidOperation(operationIndex, 'Text document operation must have a string URI')\n }\n\n const version = input.textDocument.version\n if (version !== null && !Number.isInteger(version)) {\n return invalidOperation(operationIndex, 'Text document version must be an integer or null')\n }\n\n const annotationId = parseAnnotationReference(input, annotations, operationIndex)\n if (!annotationId.ok) return annotationId\n const edits = parseTextEdits(input.edits, annotations, operationIndex)\n if (!edits.ok) return edits\n\n return parsed(\n Object.freeze({\n ...optionalAnnotationId(annotationId.value),\n edits: edits.value,\n kind: 'text-document' as const,\n uri: input.textDocument.uri,\n version: version as number | null,\n }),\n )\n}\n\nfunction parseCreateOperation(\n input: UnknownRecord,\n annotations: ReadonlyMap<string, WorkspaceEditAnnotation>,\n operationIndex: number,\n): ParseResult<WorkspaceEditOperation> {\n if (typeof input.uri !== 'string') {\n return invalidOperation(operationIndex, 'Create operation must have a string URI')\n }\n const annotationId = parseAnnotationReference(input, annotations, operationIndex)\n if (!annotationId.ok) return annotationId\n const options = parseResourceOptions(input.options, operationIndex)\n if (!options.ok) return options\n const overwrite = resourceBoolean(options.value, 'overwrite', operationIndex)\n if (!overwrite.ok) return overwrite\n const ignoreIfExists = resourceBoolean(options.value, 'ignoreIfExists', operationIndex)\n if (!ignoreIfExists.ok) return ignoreIfExists\n\n return parsed(\n Object.freeze({\n ...optionalAnnotationId(annotationId.value),\n ignoreIfExists: ignoreIfExists.value,\n kind: 'create' as const,\n overwrite: overwrite.value,\n uri: input.uri,\n }),\n )\n}\n\nfunction parseRenameOperation(\n input: UnknownRecord,\n annotations: ReadonlyMap<string, WorkspaceEditAnnotation>,\n operationIndex: number,\n): ParseResult<WorkspaceEditOperation> {\n if (typeof input.oldUri !== 'string' || typeof input.newUri !== 'string') {\n return invalidOperation(operationIndex, 'Rename operation must have string oldUri and newUri')\n }\n const annotationId = parseAnnotationReference(input, annotations, operationIndex)\n if (!annotationId.ok) return annotationId\n const options = parseResourceOptions(input.options, operationIndex)\n if (!options.ok) return options\n const overwrite = resourceBoolean(options.value, 'overwrite', operationIndex)\n if (!overwrite.ok) return overwrite\n const ignoreIfExists = resourceBoolean(options.value, 'ignoreIfExists', operationIndex)\n if (!ignoreIfExists.ok) return ignoreIfExists\n\n return parsed(\n Object.freeze({\n ...optionalAnnotationId(annotationId.value),\n ignoreIfExists: ignoreIfExists.value,\n kind: 'rename' as const,\n newUri: input.newUri,\n oldUri: input.oldUri,\n overwrite: overwrite.value,\n }),\n )\n}\n\nfunction parseDeleteOperation(\n input: UnknownRecord,\n annotations: ReadonlyMap<string, WorkspaceEditAnnotation>,\n operationIndex: number,\n): ParseResult<WorkspaceEditOperation> {\n if (typeof input.uri !== 'string') {\n return invalidOperation(operationIndex, 'Delete operation must have a string URI')\n }\n const annotationId = parseAnnotationReference(input, annotations, operationIndex)\n if (!annotationId.ok) return annotationId\n const options = parseResourceOptions(input.options, operationIndex)\n if (!options.ok) return options\n const recursive = resourceBoolean(options.value, 'recursive', operationIndex)\n if (!recursive.ok) return recursive\n const ignoreIfNotExists = resourceBoolean(options.value, 'ignoreIfNotExists', operationIndex)\n if (!ignoreIfNotExists.ok) return ignoreIfNotExists\n\n return parsed(\n Object.freeze({\n ...optionalAnnotationId(annotationId.value),\n ignoreIfNotExists: ignoreIfNotExists.value,\n kind: 'delete' as const,\n recursive: recursive.value,\n uri: input.uri,\n }),\n )\n}\n\nfunction parseResourceOptions(\n input: unknown,\n operationIndex: number,\n): ParseResult<UnknownRecord | undefined> {\n if (input === undefined) return parsed(undefined)\n if (isRecord(input)) return parsed(input)\n return invalidOperation(operationIndex, 'Resource operation options must be an object')\n}\n\nfunction resourceBoolean(\n options: UnknownRecord | undefined,\n key: string,\n operationIndex: number,\n): ParseResult<boolean> {\n if (!options || !hasOwn(options, key)) return parsed(false)\n if (typeof options[key] === 'boolean') return parsed(options[key])\n return invalidOperation(operationIndex, `Resource option ${key} must be a boolean`)\n}\n\nfunction parseTextEdits(\n input: unknown,\n annotations: ReadonlyMap<string, WorkspaceEditAnnotation>,\n operationIndex: number,\n): ParseResult<readonly ParsedWorkspaceTextEdit[]> {\n if (!Array.isArray(input)) {\n return invalidOperation(operationIndex, 'Text document edits must be an array')\n }\n\n const edits: ParsedWorkspaceTextEdit[] = []\n for (let editIndex = 0; editIndex < input.length; editIndex += 1) {\n const edit = parseTextEdit(input[editIndex], annotations, operationIndex, editIndex)\n if (!edit.ok) return edit\n edits.push(edit.value)\n }\n return parsed(Object.freeze(edits))\n}\n\nfunction parseTextEdit(\n input: unknown,\n annotations: ReadonlyMap<string, WorkspaceEditAnnotation>,\n operationIndex: number,\n editIndex: number,\n): ParseResult<ParsedWorkspaceTextEdit> {\n if (!isRecord(input)) {\n return invalidTextEdit(operationIndex, editIndex, 'Text edit must be an object')\n }\n if (hasOwn(input, 'snippet')) {\n return failed('unsupported-snippet', 'Snippet text edits are unsupported', {\n editIndex,\n operationIndex,\n })\n }\n if (typeof input.newText !== 'string') {\n return invalidTextEdit(operationIndex, editIndex, 'Text edit newText must be a string')\n }\n if (!isRecord(input.range)) {\n return invalidPosition(operationIndex, editIndex, 'Text edit range must be an object')\n }\n\n const start = parsePosition(input.range.start, operationIndex, editIndex)\n if (!start.ok) return start\n const end = parsePosition(input.range.end, operationIndex, editIndex)\n if (!end.ok) return end\n const annotationId = parseAnnotationReference(input, annotations, operationIndex, editIndex)\n if (!annotationId.ok) return annotationId\n\n return parsed(\n Object.freeze({\n ...optionalAnnotationId(annotationId.value),\n newText: input.newText,\n range: Object.freeze({ end: end.value, start: start.value }),\n }),\n )\n}\n\nfunction parsePosition(\n input: unknown,\n operationIndex: number,\n editIndex: number,\n): ParseResult<ParsedWorkspacePosition> {\n if (!isRecord(input)) {\n return invalidPosition(operationIndex, editIndex, 'Position must be an object')\n }\n if (!isNonNegativeInteger(input.line) || !isNonNegativeInteger(input.character)) {\n return invalidPosition(\n operationIndex,\n editIndex,\n 'Position line and character must be non-negative integers',\n )\n }\n return parsed(Object.freeze({ character: input.character, line: input.line }))\n}\n\nfunction parseAnnotationReference(\n input: UnknownRecord,\n annotations: ReadonlyMap<string, WorkspaceEditAnnotation>,\n operationIndex: number,\n editIndex?: number,\n): ParseResult<string | undefined> {\n if (!hasOwn(input, 'annotationId')) return parsed(undefined)\n if (typeof input.annotationId !== 'string') {\n return failed('invalid-annotation', 'annotationId must be a string', {\n editIndex,\n operationIndex,\n })\n }\n if (annotations.has(input.annotationId)) return parsed(input.annotationId)\n return failed('invalid-annotation', `Unknown change annotation ${input.annotationId}`, {\n editIndex,\n operationIndex,\n })\n}\n\nfunction optionalAnnotationId(annotationId: string | undefined): {\n readonly annotationId?: string\n} {\n if (annotationId === undefined) return {}\n return { annotationId }\n}\n\nfunction emptyWorkspaceEdit(): ParseWorkspaceEditResult {\n return workspaceEditResult(new Map(), EMPTY_OPERATIONS)\n}\n\nfunction workspaceEditResult(\n annotations: ReadonlyMap<string, WorkspaceEditAnnotation>,\n operations: readonly WorkspaceEditOperation[],\n): ParseWorkspaceEditResult {\n return parsed(Object.freeze({ annotations, operations }))\n}\n\nfunction invalidWorkspaceEdit(reason: string): ParseWorkspaceEditResult {\n return failed('invalid-workspace-edit', reason)\n}\n\nfunction invalidOperation(operationIndex: number, reason: string): ParseResult<never> {\n return failed('invalid-workspace-edit', reason, { operationIndex })\n}\n\nfunction invalidTextEdit(\n operationIndex: number,\n editIndex: number,\n reason: string,\n): ParseResult<never> {\n return failed('invalid-workspace-edit', reason, { editIndex, operationIndex })\n}\n\nfunction invalidPosition(\n operationIndex: number,\n editIndex: number,\n reason: string,\n): ParseResult<never> {\n return failed('invalid-position', reason, { editIndex, operationIndex })\n}\n\nfunction parsed<T>(value: T): ParseResult<T> {\n return { ok: true, value }\n}\n\nfunction failed(\n code: WorkspaceEditFailureCode,\n reason: string,\n indices: { readonly editIndex?: number; readonly operationIndex?: number } = {},\n): ParseResult<never> {\n return {\n error: Object.freeze({ code, reason, ...definedIndices(indices) }),\n ok: false,\n }\n}\n\nfunction definedIndices(indices: {\n readonly editIndex?: number\n readonly operationIndex?: number\n}): { readonly editIndex?: number; readonly operationIndex?: number } {\n return {\n ...(indices.operationIndex === undefined ? {} : { operationIndex: indices.operationIndex }),\n ...(indices.editIndex === undefined ? {} : { editIndex: indices.editIndex }),\n }\n}\n\nfunction isRecord(value: unknown): value is UnknownRecord {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction hasOwn(value: UnknownRecord, key: string): boolean {\n return Object.prototype.hasOwnProperty.call(value, key)\n}\n\nfunction isNonNegativeInteger(value: unknown): value is number {\n return Number.isInteger(value) && Number(value) >= 0\n}\n\nfunction compareCodeUnits(left: string, right: string): number {\n if (left < right) return -1\n if (left > right) return 1\n return 0\n}\n\nexport { prepareWorkspaceTextReplay } from './workspaceTextEdits'\nexport type {\n PreparedWorkspaceTextEdit,\n PreparedWorkspaceTextSegment,\n PreparedWorkspaceTextStep,\n PrepareWorkspaceTextReplayResult,\n WorkspaceTextDocumentProvenance,\n WorkspaceTextReplayInput,\n WorkspaceTextReplaySegmentInput,\n WorkspaceTextReplayTarget,\n} from './workspaceTextEdits'\n"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { ActiveDocument } from './pluginTypes';
2
+ import type { WorkspaceEditOriginGuard, WorkspaceTextDocumentProvenance } from './types';
3
+ import type { ParsedWorkspaceEdit } from './workspaceEdit';
4
+ export declare function currentWorkspaceEditOrigin(guard: WorkspaceEditOriginGuard, active: ActiveDocument, plan: ParsedWorkspaceEdit): WorkspaceTextDocumentProvenance | null;
5
+ //# sourceMappingURL=workspaceEditProvenance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspaceEditProvenance.d.ts","sourceRoot":"","sources":["../src/workspaceEditProvenance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,KAAK,EAAE,wBAAwB,EAAE,+BAA+B,EAAE,MAAM,SAAS,CAAA;AACxF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAE1D,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,wBAAwB,EAC/B,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,mBAAmB,GACxB,+BAA+B,GAAG,IAAI,CAexC"}
@@ -0,0 +1,16 @@
1
+ //#region src/workspaceEditProvenance.ts
2
+ function currentWorkspaceEditOrigin(guard, active, plan) {
3
+ const origin = guard.documents.find((document) => document.uri === active.uri);
4
+ if (!origin || origin.textSnapshot !== active.textSnapshot) return null;
5
+ if (!guard.isCurrent(active.uri)) return null;
6
+ const affectedUris = new Set(plan.operations.flatMap((operation) => operation.kind === "rename" ? [operation.oldUri, operation.newUri] : [operation.uri]));
7
+ for (const document of guard.documents) {
8
+ if (!affectedUris.has(document.uri)) continue;
9
+ if (!guard.isCurrent(document.uri)) return null;
10
+ }
11
+ return origin;
12
+ }
13
+ //#endregion
14
+ export { currentWorkspaceEditOrigin };
15
+
16
+ //# sourceMappingURL=workspaceEditProvenance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspaceEditProvenance.js","names":[],"sources":["../src/workspaceEditProvenance.ts"],"sourcesContent":["import type { ActiveDocument } from './pluginTypes'\nimport type { WorkspaceEditOriginGuard, WorkspaceTextDocumentProvenance } from './types'\nimport type { ParsedWorkspaceEdit } from './workspaceEdit'\n\nexport function currentWorkspaceEditOrigin(\n guard: WorkspaceEditOriginGuard,\n active: ActiveDocument,\n plan: ParsedWorkspaceEdit,\n): WorkspaceTextDocumentProvenance | null {\n const origin = guard.documents.find((document) => document.uri === active.uri)\n if (!origin || origin.textSnapshot !== active.textSnapshot) return null\n if (!guard.isCurrent(active.uri)) return null\n\n const affectedUris = new Set(\n plan.operations.flatMap((operation) =>\n operation.kind === 'rename' ? [operation.oldUri, operation.newUri] : [operation.uri],\n ),\n )\n for (const document of guard.documents) {\n if (!affectedUris.has(document.uri)) continue\n if (!guard.isCurrent(document.uri)) return null\n }\n return origin\n}\n"],"mappings":";AAIA,SAAgB,2BACd,OACA,QACA,MACwC;CACxC,MAAM,SAAS,MAAM,UAAU,MAAM,aAAa,SAAS,QAAQ,OAAO,GAAG;CAC7E,IAAI,CAAC,UAAU,OAAO,iBAAiB,OAAO,cAAc,OAAO;CACnE,IAAI,CAAC,MAAM,UAAU,OAAO,GAAG,GAAG,OAAO;CAEzC,MAAM,eAAe,IAAI,IACvB,KAAK,WAAW,SAAS,cACvB,UAAU,SAAS,WAAW,CAAC,UAAU,QAAQ,UAAU,MAAM,IAAI,CAAC,UAAU,GAAG,CACrF,CACF;CACA,KAAK,MAAM,YAAY,MAAM,WAAW;EACtC,IAAI,CAAC,aAAa,IAAI,SAAS,GAAG,GAAG;EACrC,IAAI,CAAC,MAAM,UAAU,SAAS,GAAG,GAAG,OAAO;CAC7C;CACA,OAAO;AACT"}
@@ -0,0 +1,60 @@
1
+ import type { DocumentLogicalRevisionScope, DocumentTextSnapshot, EditorTextBuffer, PieceTableSnapshot, PreparedDocumentTransactionSequence, TextEdit } from '@singapore-editor/core/document';
2
+ import type { LspTextSnapshot } from '@singapore-editor/lsp';
3
+ import type { WorkspaceEditFailure, WorkspaceEditOperation } from './workspaceEdit';
4
+ export type WorkspaceTextDocumentProvenance = {
5
+ readonly textSnapshot: LspTextSnapshot;
6
+ readonly uri: string;
7
+ readonly version: number;
8
+ };
9
+ export type WorkspaceTextReplaySegmentInput = {
10
+ readonly operations: readonly {
11
+ readonly operation: Extract<WorkspaceEditOperation, {
12
+ kind: 'text-document';
13
+ }>;
14
+ readonly operationIndex: number;
15
+ }[];
16
+ readonly segmentIndex: number;
17
+ readonly uri: string;
18
+ };
19
+ export type WorkspaceTextReplayTarget = {
20
+ readonly buffer: EditorTextBuffer;
21
+ readonly expectedRevision: number;
22
+ readonly initialSnapshot: DocumentTextSnapshot;
23
+ };
24
+ export type WorkspaceTextReplayInput = {
25
+ readonly logicalRevisionScope: DocumentLogicalRevisionScope;
26
+ readonly provenance: readonly WorkspaceTextDocumentProvenance[];
27
+ readonly segments: readonly WorkspaceTextReplaySegmentInput[];
28
+ readonly target: WorkspaceTextReplayTarget;
29
+ };
30
+ export type PreparedWorkspaceTextEdit = TextEdit & {
31
+ readonly annotationId?: string;
32
+ };
33
+ export type PreparedWorkspaceTextStep = {
34
+ readonly edits: readonly PreparedWorkspaceTextEdit[];
35
+ readonly operationIndex: number;
36
+ readonly snapshotAfter: PieceTableSnapshot;
37
+ readonly snapshotBefore: PieceTableSnapshot;
38
+ readonly uri: string;
39
+ };
40
+ export type PreparedWorkspaceTextSegment = {
41
+ readonly logicalRevisionCount: number;
42
+ readonly segmentIndex: number;
43
+ readonly sequenceSegmentIndex: number | null;
44
+ readonly simulatedVersionAfter: number | null;
45
+ readonly simulatedVersionBefore: number | null;
46
+ readonly snapshotAfter: PieceTableSnapshot;
47
+ readonly snapshotBefore: PieceTableSnapshot;
48
+ readonly steps: readonly PreparedWorkspaceTextStep[];
49
+ readonly uri: string;
50
+ };
51
+ export type PrepareWorkspaceTextReplayResult = {
52
+ readonly ok: true;
53
+ readonly segments: readonly PreparedWorkspaceTextSegment[];
54
+ readonly sequence: PreparedDocumentTransactionSequence | null;
55
+ } | {
56
+ readonly error: WorkspaceEditFailure;
57
+ readonly ok: false;
58
+ };
59
+ export declare function prepareWorkspaceTextReplay(input: WorkspaceTextReplayInput): PrepareWorkspaceTextReplayResult;
60
+ //# sourceMappingURL=workspaceTextEdits.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspaceTextEdits.d.ts","sourceRoot":"","sources":["../src/workspaceTextEdits.ts"],"names":[],"mappings":"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"}