@openrewrite/rewrite 8.69.0-20251211-160325 → 8.69.0-20251212-112414

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 (80) hide show
  1. package/dist/cli/cli-utils.d.ts.map +1 -1
  2. package/dist/cli/cli-utils.js +110 -71
  3. package/dist/cli/cli-utils.js.map +1 -1
  4. package/dist/javascript/package-json-parser.d.ts +0 -5
  5. package/dist/javascript/package-json-parser.d.ts.map +1 -1
  6. package/dist/javascript/package-json-parser.js +2 -12
  7. package/dist/javascript/package-json-parser.js.map +1 -1
  8. package/dist/javascript/package-manager.d.ts +72 -1
  9. package/dist/javascript/package-manager.d.ts.map +1 -1
  10. package/dist/javascript/package-manager.js +173 -2
  11. package/dist/javascript/package-manager.js.map +1 -1
  12. package/dist/javascript/recipes/add-dependency.d.ts.map +1 -1
  13. package/dist/javascript/recipes/add-dependency.js +11 -8
  14. package/dist/javascript/recipes/add-dependency.js.map +1 -1
  15. package/dist/javascript/recipes/upgrade-dependency-version.d.ts.map +1 -1
  16. package/dist/javascript/recipes/upgrade-dependency-version.js +11 -8
  17. package/dist/javascript/recipes/upgrade-dependency-version.js.map +1 -1
  18. package/dist/javascript/recipes/upgrade-transitive-dependency-version.d.ts.map +1 -1
  19. package/dist/javascript/recipes/upgrade-transitive-dependency-version.js +11 -8
  20. package/dist/javascript/recipes/upgrade-transitive-dependency-version.js.map +1 -1
  21. package/dist/json/parser.d.ts.map +1 -1
  22. package/dist/json/parser.js +355 -123
  23. package/dist/json/parser.js.map +1 -1
  24. package/dist/json/tree.d.ts +5 -1
  25. package/dist/json/tree.d.ts.map +1 -1
  26. package/dist/json/tree.js +157 -7
  27. package/dist/json/tree.js.map +1 -1
  28. package/dist/print.d.ts.map +1 -1
  29. package/dist/print.js +5 -1
  30. package/dist/print.js.map +1 -1
  31. package/dist/rpc/request/get-languages.d.ts.map +1 -1
  32. package/dist/rpc/request/get-languages.js +1 -0
  33. package/dist/rpc/request/get-languages.js.map +1 -1
  34. package/dist/rpc/server.d.ts +1 -0
  35. package/dist/rpc/server.d.ts.map +1 -1
  36. package/dist/rpc/server.js +1 -0
  37. package/dist/rpc/server.js.map +1 -1
  38. package/dist/version.txt +1 -1
  39. package/dist/yaml/index.d.ts +6 -0
  40. package/dist/yaml/index.d.ts.map +1 -0
  41. package/dist/yaml/index.js +37 -0
  42. package/dist/yaml/index.js.map +1 -0
  43. package/dist/yaml/parser.d.ts +6 -0
  44. package/dist/yaml/parser.d.ts.map +1 -0
  45. package/dist/yaml/parser.js +803 -0
  46. package/dist/yaml/parser.js.map +1 -0
  47. package/dist/yaml/print.d.ts +2 -0
  48. package/dist/yaml/print.d.ts.map +1 -0
  49. package/dist/yaml/print.js +234 -0
  50. package/dist/yaml/print.js.map +1 -0
  51. package/dist/yaml/rpc.d.ts +2 -0
  52. package/dist/yaml/rpc.d.ts.map +1 -0
  53. package/dist/yaml/rpc.js +264 -0
  54. package/dist/yaml/rpc.js.map +1 -0
  55. package/dist/yaml/tree.d.ts +188 -0
  56. package/dist/yaml/tree.d.ts.map +1 -0
  57. package/dist/yaml/tree.js +117 -0
  58. package/dist/yaml/tree.js.map +1 -0
  59. package/dist/yaml/visitor.d.ts +19 -0
  60. package/dist/yaml/visitor.d.ts.map +1 -0
  61. package/dist/yaml/visitor.js +170 -0
  62. package/dist/yaml/visitor.js.map +1 -0
  63. package/package.json +6 -1
  64. package/src/cli/cli-utils.ts +112 -35
  65. package/src/javascript/package-json-parser.ts +2 -12
  66. package/src/javascript/package-manager.ts +179 -3
  67. package/src/javascript/recipes/add-dependency.ts +16 -10
  68. package/src/javascript/recipes/upgrade-dependency-version.ts +16 -10
  69. package/src/javascript/recipes/upgrade-transitive-dependency-version.ts +15 -9
  70. package/src/json/parser.ts +443 -146
  71. package/src/json/tree.ts +159 -7
  72. package/src/print.ts +6 -2
  73. package/src/rpc/request/get-languages.ts +1 -0
  74. package/src/rpc/server.ts +1 -0
  75. package/src/yaml/index.ts +21 -0
  76. package/src/yaml/parser.ts +850 -0
  77. package/src/yaml/print.ts +212 -0
  78. package/src/yaml/rpc.ts +248 -0
  79. package/src/yaml/tree.ts +281 -0
  80. package/src/yaml/visitor.ts +146 -0
@@ -0,0 +1,212 @@
1
+ /*
2
+ * Copyright 2025 the original author or authors.
3
+ * <p>
4
+ * Licensed under the Moderne Source Available License (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ * <p>
8
+ * https://docs.moderne.io/licensing/moderne-source-available-license
9
+ * <p>
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import {PrintOutputCapture, TreePrinters} from "../print";
17
+ import {YamlVisitor} from "./visitor";
18
+ import {printTag, Yaml} from "./tree";
19
+ import {Cursor} from "../tree";
20
+ import {Markers} from "../markers";
21
+
22
+ class YamlPrinter extends YamlVisitor<PrintOutputCapture> {
23
+
24
+ protected async visitDocuments(documents: Yaml.Documents, p: PrintOutputCapture): Promise<Yaml | undefined> {
25
+ await this.visitMarkers(documents.markers, p);
26
+ for (const document of documents.documents) {
27
+ await this.visit(document, p);
28
+ }
29
+ if (documents.suffix) {
30
+ p.append(documents.suffix);
31
+ }
32
+ this.afterSyntax(documents, p);
33
+ return documents;
34
+ }
35
+
36
+ protected async visitDocument(document: Yaml.Document, p: PrintOutputCapture): Promise<Yaml | undefined> {
37
+ await this.beforeSyntax(document, p);
38
+ if (document.explicit) {
39
+ p.append("---");
40
+ }
41
+ await this.visit(document.block, p);
42
+ await this.visit(document.end, p);
43
+ this.afterSyntax(document, p);
44
+ return document;
45
+ }
46
+
47
+ protected async visitDocumentEnd(end: Yaml.DocumentEnd, p: PrintOutputCapture): Promise<Yaml | undefined> {
48
+ await this.beforeSyntax(end, p);
49
+ if (end.explicit) {
50
+ p.append("...");
51
+ }
52
+ return end;
53
+ }
54
+
55
+ protected async visitMapping(mapping: Yaml.Mapping, p: PrintOutputCapture): Promise<Yaml | undefined> {
56
+ await this.beforeSyntax(mapping, p);
57
+ if (mapping.anchor) {
58
+ await this.visit(mapping.anchor, p);
59
+ }
60
+ if (mapping.openingBracePrefix !== undefined) {
61
+ p.append(mapping.openingBracePrefix);
62
+ p.append('{');
63
+ }
64
+ for (const entry of mapping.entries) {
65
+ await this.visit(entry, p);
66
+ }
67
+ if (mapping.closingBracePrefix !== undefined) {
68
+ p.append(mapping.closingBracePrefix);
69
+ p.append('}');
70
+ }
71
+ this.afterSyntax(mapping, p);
72
+ return mapping;
73
+ }
74
+
75
+ protected async visitMappingEntry(entry: Yaml.MappingEntry, p: PrintOutputCapture): Promise<Yaml | undefined> {
76
+ await this.beforeSyntax(entry, p);
77
+ await this.visit(entry.key, p);
78
+ p.append(entry.beforeMappingValueIndicator);
79
+ p.append(':');
80
+ await this.visit(entry.value, p);
81
+ this.afterSyntax(entry, p);
82
+ return entry;
83
+ }
84
+
85
+ protected async visitScalar(scalar: Yaml.Scalar, p: PrintOutputCapture): Promise<Yaml | undefined> {
86
+ await this.beforeSyntax(scalar, p);
87
+ if (scalar.tag) {
88
+ await this.visit(scalar.tag, p);
89
+ }
90
+ if (scalar.anchor) {
91
+ await this.visit(scalar.anchor, p);
92
+ }
93
+ switch (scalar.style) {
94
+ case Yaml.ScalarStyle.DOUBLE_QUOTED:
95
+ p.append('"');
96
+ p.append(scalar.value);
97
+ p.append('"');
98
+ break;
99
+ case Yaml.ScalarStyle.SINGLE_QUOTED:
100
+ p.append("'");
101
+ p.append(scalar.value);
102
+ p.append("'");
103
+ break;
104
+ case Yaml.ScalarStyle.LITERAL:
105
+ p.append('|');
106
+ p.append(scalar.value);
107
+ break;
108
+ case Yaml.ScalarStyle.FOLDED:
109
+ p.append('>');
110
+ p.append(scalar.value);
111
+ break;
112
+ case Yaml.ScalarStyle.PLAIN:
113
+ default:
114
+ p.append(scalar.value);
115
+ break;
116
+ }
117
+ this.afterSyntax(scalar, p);
118
+ return scalar;
119
+ }
120
+
121
+ protected async visitSequence(sequence: Yaml.Sequence, p: PrintOutputCapture): Promise<Yaml | undefined> {
122
+ await this.beforeSyntax(sequence, p);
123
+ if (sequence.anchor) {
124
+ await this.visit(sequence.anchor, p);
125
+ }
126
+ if (sequence.openingBracketPrefix !== undefined) {
127
+ p.append(sequence.openingBracketPrefix);
128
+ p.append('[');
129
+ }
130
+ for (const entry of sequence.entries) {
131
+ await this.visit(entry, p);
132
+ }
133
+ if (sequence.closingBracketPrefix !== undefined) {
134
+ p.append(sequence.closingBracketPrefix);
135
+ p.append(']');
136
+ }
137
+ this.afterSyntax(sequence, p);
138
+ return sequence;
139
+ }
140
+
141
+ protected async visitSequenceEntry(entry: Yaml.SequenceEntry, p: PrintOutputCapture): Promise<Yaml | undefined> {
142
+ p.append(entry.prefix);
143
+ if (entry.dash) {
144
+ p.append('-');
145
+ }
146
+ await this.visit(entry.block, p);
147
+ if (entry.trailingCommaPrefix !== undefined) {
148
+ p.append(entry.trailingCommaPrefix);
149
+ p.append(',');
150
+ }
151
+ this.afterSyntax(entry, p);
152
+ return entry;
153
+ }
154
+
155
+ protected async visitAnchor(anchor: Yaml.Anchor, p: PrintOutputCapture): Promise<Yaml | undefined> {
156
+ await this.visitMarkers(anchor.markers, p);
157
+ p.append(anchor.prefix);
158
+ p.append('&');
159
+ p.append(anchor.key);
160
+ p.append(anchor.postfix);
161
+ this.afterSyntax(anchor, p);
162
+ return anchor;
163
+ }
164
+
165
+ protected async visitAlias(alias: Yaml.Alias, p: PrintOutputCapture): Promise<Yaml | undefined> {
166
+ await this.beforeSyntax(alias, p);
167
+ p.append('*');
168
+ if (alias.anchor) {
169
+ p.append(alias.anchor.key);
170
+ }
171
+ this.afterSyntax(alias, p);
172
+ return alias;
173
+ }
174
+
175
+ protected async visitTag(tag: Yaml.Tag, p: PrintOutputCapture): Promise<Yaml | undefined> {
176
+ await this.visitMarkers(tag.markers, p);
177
+ p.append(tag.prefix);
178
+ p.append(printTag(tag));
179
+ p.append(tag.suffix);
180
+ this.afterSyntax(tag, p);
181
+ return tag;
182
+ }
183
+
184
+ private yamlMarkerWrapper = (out: string): string => `~~${out}${out ? "~~" : ""}>`;
185
+
186
+ private async beforeSyntax(yaml: Yaml, p: PrintOutputCapture): Promise<void> {
187
+ await this.beforeSyntaxWithMarkers(yaml.prefix, yaml.markers, p);
188
+ }
189
+
190
+ private async beforeSyntaxWithMarkers(prefix: string, markers: Markers, p: PrintOutputCapture): Promise<void> {
191
+ for (const marker of markers.markers) {
192
+ p.append(p.markerPrinter.beforePrefix(marker, new Cursor(marker, this.cursor), this.yamlMarkerWrapper));
193
+ }
194
+ p.append(prefix);
195
+ await this.visitMarkers(markers, p);
196
+ for (const marker of markers.markers) {
197
+ p.append(p.markerPrinter.beforeSyntax(marker, new Cursor(marker, this.cursor), this.yamlMarkerWrapper));
198
+ }
199
+ }
200
+
201
+ private afterSyntax(yaml: Yaml, p: PrintOutputCapture): void {
202
+ this.afterSyntaxWithMarkers(yaml.markers, p);
203
+ }
204
+
205
+ private afterSyntaxWithMarkers(markers: Markers, p: PrintOutputCapture): void {
206
+ for (const marker of markers.markers) {
207
+ p.append(p.markerPrinter.afterSyntax(marker, new Cursor(marker, this.cursor), this.yamlMarkerWrapper));
208
+ }
209
+ }
210
+ }
211
+
212
+ TreePrinters.register(Yaml.Kind.Documents, () => new YamlPrinter());
@@ -0,0 +1,248 @@
1
+ /*
2
+ * Copyright 2025 the original author or authors.
3
+ * <p>
4
+ * Licensed under the Moderne Source Available License (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ * <p>
8
+ * https://docs.moderne.io/licensing/moderne-source-available-license
9
+ * <p>
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import {YamlVisitor} from "./visitor";
17
+ import {RpcCodecs, RpcReceiveQueue, RpcSendQueue} from "../rpc";
18
+ import {Yaml} from "./tree";
19
+ import {produceAsync} from "../visitor";
20
+ import {createDraft, finishDraft} from "immer";
21
+
22
+ class YamlSender extends YamlVisitor<RpcSendQueue> {
23
+
24
+ protected async preVisit(y: Yaml, q: RpcSendQueue): Promise<Yaml | undefined> {
25
+ await q.getAndSend(y, y2 => y2.id);
26
+ await q.getAndSend(y, y2 => y2.prefix);
27
+ await q.getAndSend(y, y2 => y2.markers);
28
+ return y;
29
+ }
30
+
31
+ protected async visitDocuments(documents: Yaml.Documents, q: RpcSendQueue): Promise<Yaml | undefined> {
32
+ await q.getAndSend(documents, d => d.sourcePath);
33
+ await q.getAndSend(documents, d => d.charsetName);
34
+ await q.getAndSend(documents, d => d.charsetBomMarked);
35
+ await q.getAndSend(documents, d => d.checksum);
36
+ await q.getAndSend(documents, d => d.fileAttributes);
37
+ await q.getAndSendList(documents, d => d.documents, doc => doc.id,
38
+ async doc => await this.visit(doc, q));
39
+ await q.getAndSend(documents, d => d.suffix);
40
+ return documents;
41
+ }
42
+
43
+ protected async visitDocument(document: Yaml.Document, q: RpcSendQueue): Promise<Yaml | undefined> {
44
+ await q.getAndSend(document, d => d.explicit);
45
+ await q.getAndSend(document, d => d.block, async b => await this.visit(b, q));
46
+ await q.getAndSend(document, d => d.end, async e => await this.visit(e, q));
47
+ return document;
48
+ }
49
+
50
+ protected async visitDocumentEnd(end: Yaml.DocumentEnd, q: RpcSendQueue): Promise<Yaml | undefined> {
51
+ await q.getAndSend(end, e => e.explicit);
52
+ return end;
53
+ }
54
+
55
+ protected async visitMapping(mapping: Yaml.Mapping, q: RpcSendQueue): Promise<Yaml | undefined> {
56
+ await q.getAndSend(mapping, m => m.openingBracePrefix);
57
+ await q.getAndSendList(mapping, m => m.entries, e => e.id,
58
+ async e => await this.visit(e, q));
59
+ await q.getAndSend(mapping, m => m.closingBracePrefix);
60
+ await q.getAndSend(mapping, m => m.anchor, async a => a ? await this.visit(a, q) : undefined);
61
+ await q.getAndSend(mapping, m => m.tag, async t => t ? await this.visit(t, q) : undefined);
62
+ return mapping;
63
+ }
64
+
65
+ protected async visitMappingEntry(entry: Yaml.MappingEntry, q: RpcSendQueue): Promise<Yaml | undefined> {
66
+ await q.getAndSend(entry, e => e.key, async k => await this.visit(k, q));
67
+ await q.getAndSend(entry, e => e.beforeMappingValueIndicator);
68
+ await q.getAndSend(entry, e => e.value, async v => await this.visit(v, q));
69
+ return entry;
70
+ }
71
+
72
+ protected async visitScalar(scalar: Yaml.Scalar, q: RpcSendQueue): Promise<Yaml | undefined> {
73
+ await q.getAndSend(scalar, s => s.style);
74
+ await q.getAndSend(scalar, s => s.anchor, async a => a ? await this.visit(a, q) : undefined);
75
+ await q.getAndSend(scalar, s => s.tag, async t => t ? await this.visit(t, q) : undefined);
76
+ await q.getAndSend(scalar, s => s.value);
77
+ return scalar;
78
+ }
79
+
80
+ protected async visitSequence(sequence: Yaml.Sequence, q: RpcSendQueue): Promise<Yaml | undefined> {
81
+ await q.getAndSend(sequence, s => s.openingBracketPrefix);
82
+ await q.getAndSendList(sequence, s => s.entries, e => e.id,
83
+ async e => await this.visit(e, q));
84
+ await q.getAndSend(sequence, s => s.closingBracketPrefix);
85
+ await q.getAndSend(sequence, s => s.anchor, async a => a ? await this.visit(a, q) : undefined);
86
+ await q.getAndSend(sequence, s => s.tag, async t => t ? await this.visit(t, q) : undefined);
87
+ return sequence;
88
+ }
89
+
90
+ protected async visitSequenceEntry(entry: Yaml.SequenceEntry, q: RpcSendQueue): Promise<Yaml | undefined> {
91
+ await q.getAndSend(entry, e => e.block, async b => await this.visit(b, q));
92
+ await q.getAndSend(entry, e => e.dash);
93
+ await q.getAndSend(entry, e => e.trailingCommaPrefix);
94
+ return entry;
95
+ }
96
+
97
+ protected async visitAnchor(anchor: Yaml.Anchor, q: RpcSendQueue): Promise<Yaml | undefined> {
98
+ await q.getAndSend(anchor, a => a.postfix);
99
+ await q.getAndSend(anchor, a => a.key);
100
+ return anchor;
101
+ }
102
+
103
+ protected async visitAlias(alias: Yaml.Alias, q: RpcSendQueue): Promise<Yaml | undefined> {
104
+ await q.getAndSend(alias, a => a.anchor, async a => await this.visit(a, q));
105
+ return alias;
106
+ }
107
+
108
+ protected async visitTag(tag: Yaml.Tag, q: RpcSendQueue): Promise<Yaml | undefined> {
109
+ await q.getAndSend(tag, t => t.name);
110
+ await q.getAndSend(tag, t => t.suffix);
111
+ await q.getAndSend(tag, t => t.tagKind);
112
+ return tag;
113
+ }
114
+ }
115
+
116
+ class YamlReceiver extends YamlVisitor<RpcReceiveQueue> {
117
+
118
+ protected async preVisit(y: Yaml, q: RpcReceiveQueue): Promise<Yaml | undefined> {
119
+ const draft = createDraft(y);
120
+ draft.id = await q.receive(y.id);
121
+ draft.prefix = await q.receive(y.prefix);
122
+ draft.markers = await q.receive(y.markers);
123
+ return finishDraft(draft);
124
+ }
125
+
126
+ protected async visitDocuments(documents: Yaml.Documents, q: RpcReceiveQueue): Promise<Yaml | undefined> {
127
+ const draft = createDraft(documents);
128
+ draft.sourcePath = await q.receive(documents.sourcePath);
129
+ draft.charsetName = await q.receive(documents.charsetName);
130
+ draft.charsetBomMarked = await q.receive(documents.charsetBomMarked);
131
+ draft.checksum = await q.receive(documents.checksum);
132
+ draft.fileAttributes = await q.receive(documents.fileAttributes);
133
+ draft.documents = await q.receiveListDefined(documents.documents,
134
+ async doc => await this.visit(doc, q) as Yaml.Document);
135
+ draft.suffix = await q.receive(documents.suffix);
136
+ return finishDraft(draft);
137
+ }
138
+
139
+ protected async visitDocument(document: Yaml.Document, q: RpcReceiveQueue): Promise<Yaml | undefined> {
140
+ const draft = createDraft(document);
141
+ draft.explicit = await q.receive(document.explicit);
142
+ draft.block = await q.receive(document.block,
143
+ async b => await this.visit(b, q) as Yaml.Block);
144
+ draft.end = await q.receive(document.end,
145
+ async e => await this.visit(e, q) as Yaml.DocumentEnd);
146
+ return finishDraft(draft);
147
+ }
148
+
149
+ protected async visitDocumentEnd(end: Yaml.DocumentEnd, q: RpcReceiveQueue): Promise<Yaml | undefined> {
150
+ const draft = createDraft(end);
151
+ draft.explicit = await q.receive(end.explicit);
152
+ return finishDraft(draft);
153
+ }
154
+
155
+ protected async visitMapping(mapping: Yaml.Mapping, q: RpcReceiveQueue): Promise<Yaml | undefined> {
156
+ const draft = createDraft(mapping);
157
+ draft.openingBracePrefix = await q.receive(mapping.openingBracePrefix);
158
+ draft.entries = await q.receiveListDefined(mapping.entries,
159
+ async e => await this.visit(e, q) as Yaml.MappingEntry);
160
+ draft.closingBracePrefix = await q.receive(mapping.closingBracePrefix);
161
+ draft.anchor = await q.receive(mapping.anchor,
162
+ async a => a ? await this.visit(a, q) as Yaml.Anchor : undefined);
163
+ draft.tag = await q.receive(mapping.tag,
164
+ async t => t ? await this.visit(t, q) as Yaml.Tag : undefined);
165
+ return finishDraft(draft);
166
+ }
167
+
168
+ protected async visitMappingEntry(entry: Yaml.MappingEntry, q: RpcReceiveQueue): Promise<Yaml | undefined> {
169
+ const draft = createDraft(entry);
170
+ draft.key = await q.receive(entry.key,
171
+ async k => await this.visit(k, q) as Yaml.YamlKey);
172
+ draft.beforeMappingValueIndicator = await q.receive(entry.beforeMappingValueIndicator);
173
+ draft.value = await q.receive(entry.value,
174
+ async v => await this.visit(v, q) as Yaml.Block);
175
+ return finishDraft(draft);
176
+ }
177
+
178
+ protected async visitScalar(scalar: Yaml.Scalar, q: RpcReceiveQueue): Promise<Yaml | undefined> {
179
+ const draft = createDraft(scalar);
180
+ draft.style = await q.receive(scalar.style);
181
+ draft.anchor = await q.receive(scalar.anchor,
182
+ async a => a ? await this.visit(a, q) as Yaml.Anchor : undefined);
183
+ draft.tag = await q.receive(scalar.tag,
184
+ async t => t ? await this.visit(t, q) as Yaml.Tag : undefined);
185
+ draft.value = await q.receive(scalar.value);
186
+ return finishDraft(draft);
187
+ }
188
+
189
+ protected async visitSequence(sequence: Yaml.Sequence, q: RpcReceiveQueue): Promise<Yaml | undefined> {
190
+ const draft = createDraft(sequence);
191
+ draft.openingBracketPrefix = await q.receive(sequence.openingBracketPrefix);
192
+ draft.entries = await q.receiveListDefined(sequence.entries,
193
+ async e => await this.visit(e, q) as Yaml.SequenceEntry);
194
+ draft.closingBracketPrefix = await q.receive(sequence.closingBracketPrefix);
195
+ draft.anchor = await q.receive(sequence.anchor,
196
+ async a => a ? await this.visit(a, q) as Yaml.Anchor : undefined);
197
+ draft.tag = await q.receive(sequence.tag,
198
+ async t => t ? await this.visit(t, q) as Yaml.Tag : undefined);
199
+ return finishDraft(draft);
200
+ }
201
+
202
+ protected async visitSequenceEntry(entry: Yaml.SequenceEntry, q: RpcReceiveQueue): Promise<Yaml | undefined> {
203
+ const draft = createDraft(entry);
204
+ draft.block = await q.receive(entry.block,
205
+ async b => await this.visit(b, q) as Yaml.Block);
206
+ draft.dash = await q.receive(entry.dash);
207
+ draft.trailingCommaPrefix = await q.receive(entry.trailingCommaPrefix);
208
+ return finishDraft(draft);
209
+ }
210
+
211
+ protected async visitAnchor(anchor: Yaml.Anchor, q: RpcReceiveQueue): Promise<Yaml | undefined> {
212
+ const draft = createDraft(anchor);
213
+ draft.postfix = await q.receive(anchor.postfix);
214
+ draft.key = await q.receive(anchor.key);
215
+ return finishDraft(draft);
216
+ }
217
+
218
+ protected async visitAlias(alias: Yaml.Alias, q: RpcReceiveQueue): Promise<Yaml | undefined> {
219
+ const draft = createDraft(alias);
220
+ draft.anchor = await q.receive(alias.anchor,
221
+ async a => await this.visit(a, q) as Yaml.Anchor);
222
+ return finishDraft(draft);
223
+ }
224
+
225
+ protected async visitTag(tag: Yaml.Tag, q: RpcReceiveQueue): Promise<Yaml | undefined> {
226
+ const draft = createDraft(tag);
227
+ draft.name = await q.receive(tag.name);
228
+ draft.suffix = await q.receive(tag.suffix);
229
+ draft.tagKind = await q.receive(tag.tagKind);
230
+ return finishDraft(draft);
231
+ }
232
+ }
233
+
234
+ const receiver = new YamlReceiver();
235
+ const sender = new YamlSender();
236
+
237
+ // Register codec for all YAML AST node types
238
+ for (const kind of Object.values(Yaml.Kind)) {
239
+ RpcCodecs.registerCodec(kind as string, {
240
+ async rpcReceive(before: Yaml, q: RpcReceiveQueue): Promise<Yaml> {
241
+ return (await receiver.visit(before, q))!;
242
+ },
243
+
244
+ async rpcSend(after: Yaml, q: RpcSendQueue): Promise<void> {
245
+ await sender.visit(after, q);
246
+ }
247
+ }, Yaml.Kind.Documents);
248
+ }