@openrewrite/rewrite 8.70.0-20251222-160244 → 8.70.0-20251222-222208

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 (154) hide show
  1. package/dist/execution.d.ts.map +1 -1
  2. package/dist/execution.js +5 -2
  3. package/dist/execution.js.map +1 -1
  4. package/dist/index.js +8 -8
  5. package/dist/index.js.map +1 -1
  6. package/dist/java/formatting-utils.d.ts +1 -1
  7. package/dist/java/formatting-utils.js +4 -4
  8. package/dist/java/formatting-utils.js.map +1 -1
  9. package/dist/java/markers.js +8 -8
  10. package/dist/java/markers.js.map +1 -1
  11. package/dist/java/type-visitor.d.ts +0 -3
  12. package/dist/java/type-visitor.d.ts.map +1 -1
  13. package/dist/java/type-visitor.js +67 -68
  14. package/dist/java/type-visitor.js.map +1 -1
  15. package/dist/java/visitor.d.ts +3 -3
  16. package/dist/java/visitor.d.ts.map +1 -1
  17. package/dist/java/visitor.js +5 -5
  18. package/dist/java/visitor.js.map +1 -1
  19. package/dist/javascript/assertions.js +4 -3
  20. package/dist/javascript/assertions.js.map +1 -1
  21. package/dist/javascript/cleanup/use-object-property-shorthand.js +3 -3
  22. package/dist/javascript/cleanup/use-object-property-shorthand.js.map +1 -1
  23. package/dist/javascript/format/format.d.ts +28 -7
  24. package/dist/javascript/format/format.d.ts.map +1 -1
  25. package/dist/javascript/format/format.js +149 -158
  26. package/dist/javascript/format/format.js.map +1 -1
  27. package/dist/javascript/format/minimum-viable-spacing-visitor.js +23 -23
  28. package/dist/javascript/format/minimum-viable-spacing-visitor.js.map +1 -1
  29. package/dist/javascript/format/prettier-format.d.ts.map +1 -1
  30. package/dist/javascript/format/prettier-format.js +8 -11
  31. package/dist/javascript/format/prettier-format.js.map +1 -1
  32. package/dist/javascript/format/tabs-and-indents-visitor.js +7 -7
  33. package/dist/javascript/format/tabs-and-indents-visitor.js.map +1 -1
  34. package/dist/javascript/format/whitespace-reconciler.d.ts.map +1 -1
  35. package/dist/javascript/format/whitespace-reconciler.js +12 -11
  36. package/dist/javascript/format/whitespace-reconciler.js.map +1 -1
  37. package/dist/javascript/markers.d.ts.map +1 -1
  38. package/dist/javascript/markers.js +6 -5
  39. package/dist/javascript/markers.js.map +1 -1
  40. package/dist/javascript/migrate/es6/modernize-octal-escape-sequences.js +2 -2
  41. package/dist/javascript/migrate/es6/modernize-octal-escape-sequences.js.map +1 -1
  42. package/dist/javascript/migrate/es6/modernize-octal-literals.js +2 -2
  43. package/dist/javascript/migrate/es6/modernize-octal-literals.js.map +1 -1
  44. package/dist/javascript/migrate/es6/remove-duplicate-object-keys.js +2 -2
  45. package/dist/javascript/migrate/es6/remove-duplicate-object-keys.js.map +1 -1
  46. package/dist/javascript/migrate/typescript/export-assignment-to-export-default.js +2 -2
  47. package/dist/javascript/migrate/typescript/export-assignment-to-export-default.js.map +1 -1
  48. package/dist/javascript/node-resolution-result.js +3 -9
  49. package/dist/javascript/node-resolution-result.js.map +1 -1
  50. package/dist/javascript/parser.d.ts.map +1 -1
  51. package/dist/javascript/parser.js +35 -35
  52. package/dist/javascript/parser.js.map +1 -1
  53. package/dist/javascript/project-parser.d.ts.map +1 -1
  54. package/dist/javascript/project-parser.js +6 -5
  55. package/dist/javascript/project-parser.js.map +1 -1
  56. package/dist/javascript/recipes/auto-format.d.ts +7 -23
  57. package/dist/javascript/recipes/auto-format.d.ts.map +1 -1
  58. package/dist/javascript/recipes/auto-format.js +8 -54
  59. package/dist/javascript/recipes/auto-format.js.map +1 -1
  60. package/dist/javascript/recipes/change-import.js +8 -8
  61. package/dist/javascript/recipes/change-import.js.map +1 -1
  62. package/dist/javascript/recipes/order-imports.js +4 -4
  63. package/dist/javascript/recipes/order-imports.js.map +1 -1
  64. package/dist/javascript/templating/engine.js +2 -2
  65. package/dist/javascript/templating/engine.js.map +1 -1
  66. package/dist/javascript/templating/index.d.ts +1 -0
  67. package/dist/javascript/templating/index.d.ts.map +1 -1
  68. package/dist/javascript/templating/index.js +4 -1
  69. package/dist/javascript/templating/index.js.map +1 -1
  70. package/dist/javascript/templating/placeholder-replacement.js +16 -16
  71. package/dist/javascript/templating/placeholder-replacement.js.map +1 -1
  72. package/dist/javascript/type-mapping.d.ts.map +1 -1
  73. package/dist/javascript/type-mapping.js +49 -58
  74. package/dist/javascript/type-mapping.js.map +1 -1
  75. package/dist/javascript/visitor.d.ts +3 -3
  76. package/dist/javascript/visitor.d.ts.map +1 -1
  77. package/dist/javascript/visitor.js +3 -3
  78. package/dist/javascript/visitor.js.map +1 -1
  79. package/dist/json/rpc.js +48 -49
  80. package/dist/json/rpc.js.map +1 -1
  81. package/dist/json/visitor.d.ts +3 -3
  82. package/dist/json/visitor.d.ts.map +1 -1
  83. package/dist/json/visitor.js +3 -3
  84. package/dist/json/visitor.js.map +1 -1
  85. package/dist/parse-error.js +11 -11
  86. package/dist/parse-error.js.map +1 -1
  87. package/dist/reference.d.ts.map +1 -1
  88. package/dist/reference.js +0 -3
  89. package/dist/reference.js.map +1 -1
  90. package/dist/rpc/index.js +42 -42
  91. package/dist/rpc/index.js.map +1 -1
  92. package/dist/rpc/queue.d.ts +7 -0
  93. package/dist/rpc/queue.d.ts.map +1 -1
  94. package/dist/rpc/queue.js +10 -8
  95. package/dist/rpc/queue.js.map +1 -1
  96. package/dist/rpc/request/install-recipes.js +1 -1
  97. package/dist/rpc/request/install-recipes.js.map +1 -1
  98. package/dist/rpc/request/parse-project.d.ts.map +1 -1
  99. package/dist/rpc/request/parse-project.js +12 -32
  100. package/dist/rpc/request/parse-project.js.map +1 -1
  101. package/dist/rpc/request/parse.d.ts.map +1 -1
  102. package/dist/rpc/request/parse.js +1 -4
  103. package/dist/rpc/request/parse.js.map +1 -1
  104. package/dist/text/rpc.js +18 -18
  105. package/dist/text/rpc.js.map +1 -1
  106. package/dist/version.txt +1 -1
  107. package/dist/visitor.d.ts +6 -4
  108. package/dist/visitor.d.ts.map +1 -1
  109. package/dist/visitor.js +19 -17
  110. package/dist/visitor.js.map +1 -1
  111. package/dist/yaml/rpc.js +65 -65
  112. package/dist/yaml/rpc.js.map +1 -1
  113. package/package.json +2 -2
  114. package/src/execution.ts +6 -2
  115. package/src/index.ts +8 -8
  116. package/src/java/formatting-utils.ts +2 -2
  117. package/src/java/markers.ts +8 -8
  118. package/src/java/type-visitor.ts +59 -68
  119. package/src/java/visitor.ts +8 -8
  120. package/src/javascript/assertions.ts +3 -3
  121. package/src/javascript/cleanup/use-object-property-shorthand.ts +1 -1
  122. package/src/javascript/format/format.ts +109 -107
  123. package/src/javascript/format/minimum-viable-spacing-visitor.ts +1 -1
  124. package/src/javascript/format/prettier-format.ts +9 -12
  125. package/src/javascript/format/tabs-and-indents-visitor.ts +1 -1
  126. package/src/javascript/format/whitespace-reconciler.ts +12 -11
  127. package/src/javascript/markers.ts +6 -6
  128. package/src/javascript/migrate/es6/modernize-octal-escape-sequences.ts +1 -1
  129. package/src/javascript/migrate/es6/modernize-octal-literals.ts +1 -1
  130. package/src/javascript/migrate/es6/remove-duplicate-object-keys.ts +1 -1
  131. package/src/javascript/migrate/typescript/export-assignment-to-export-default.ts +1 -1
  132. package/src/javascript/node-resolution-result.ts +8 -14
  133. package/src/javascript/parser.ts +5 -4
  134. package/src/javascript/project-parser.ts +4 -4
  135. package/src/javascript/recipes/auto-format.ts +9 -71
  136. package/src/javascript/recipes/change-import.ts +4 -4
  137. package/src/javascript/recipes/order-imports.ts +1 -1
  138. package/src/javascript/templating/engine.ts +1 -1
  139. package/src/javascript/templating/index.ts +5 -0
  140. package/src/javascript/templating/placeholder-replacement.ts +2 -2
  141. package/src/javascript/type-mapping.ts +28 -34
  142. package/src/javascript/visitor.ts +6 -6
  143. package/src/json/rpc.ts +51 -52
  144. package/src/json/visitor.ts +6 -6
  145. package/src/parse-error.ts +11 -11
  146. package/src/reference.ts +0 -5
  147. package/src/rpc/index.ts +43 -43
  148. package/src/rpc/queue.ts +18 -8
  149. package/src/rpc/request/install-recipes.ts +1 -1
  150. package/src/rpc/request/parse-project.ts +20 -32
  151. package/src/rpc/request/parse.ts +1 -4
  152. package/src/text/rpc.ts +18 -18
  153. package/src/visitor.ts +29 -30
  154. package/src/yaml/rpc.ts +80 -81
package/src/json/rpc.ts CHANGED
@@ -16,8 +16,7 @@
16
16
  import {JsonVisitor} from "./visitor";
17
17
  import {asRef, RpcCodecs, RpcReceiveQueue, RpcSendQueue} from "../rpc";
18
18
  import {Json} from "./tree";
19
- import {produceAsync} from "../visitor";
20
- import {createDraft, Draft, finishDraft} from "immer";
19
+ import {updateIfChanged} from "../util";
21
20
 
22
21
  class JsonSender extends JsonVisitor<RpcSendQueue> {
23
22
 
@@ -98,30 +97,30 @@ class JsonSender extends JsonVisitor<RpcSendQueue> {
98
97
  class JsonReceiver extends JsonVisitor<RpcReceiveQueue> {
99
98
 
100
99
  protected async preVisit(j: Json, q: RpcReceiveQueue): Promise<Json | undefined> {
101
- const draft = createDraft(j)
102
- draft.id = await q.receive(j.id);
103
- draft.prefix = await q.receive(j.prefix, async space => await this.visitSpace(space, q));
104
- draft.markers = await q.receive(j.markers);
105
- return finishDraft(draft);
100
+ return updateIfChanged(j, {
101
+ id: await q.receive(j.id),
102
+ prefix: await q.receive(j.prefix, async space => await this.visitSpace(space, q)),
103
+ markers: await q.receive(j.markers),
104
+ });
106
105
  }
107
106
 
108
107
  protected async visitDocument(document: Json.Document, q: RpcReceiveQueue): Promise<Json | undefined> {
109
- const draft = createDraft(document);
110
- draft.sourcePath = await q.receive(document.sourcePath);
111
- draft.charsetName = await q.receive(document.charsetName);
112
- draft.charsetBomMarked = await q.receive(document.charsetBomMarked);
113
- draft.checksum = await q.receive(document.checksum);
114
- draft.fileAttributes = await q.receive(document.fileAttributes);
115
- draft.value = await q.receive<Json.Value>(document.value, async j => await this.visit(j, q)!);
116
- draft.eof = await q.receive(document.eof, async space => await this.visitSpace(space, q));
117
- return finishDraft(draft);
108
+ return updateIfChanged(document, {
109
+ sourcePath: await q.receive(document.sourcePath),
110
+ charsetName: await q.receive(document.charsetName),
111
+ charsetBomMarked: await q.receive(document.charsetBomMarked),
112
+ checksum: await q.receive(document.checksum),
113
+ fileAttributes: await q.receive(document.fileAttributes),
114
+ value: await q.receive<Json.Value>(document.value, async j => await this.visit(j, q)!),
115
+ eof: await q.receive(document.eof, async space => await this.visitSpace(space, q)),
116
+ });
118
117
  }
119
118
 
120
119
  protected async visitArray(array: Json.Array, q: RpcReceiveQueue): Promise<Json | undefined> {
121
- const draft = createDraft(array);
122
- draft.values = await q.receiveListDefined(array.values,
123
- async j => await this.visitRightPadded(j, q)!)!;
124
- return finishDraft(draft);
120
+ return updateIfChanged(array, {
121
+ values: await q.receiveListDefined(array.values,
122
+ async j => await this.visitRightPadded(j, q)!)!,
123
+ });
125
124
  }
126
125
 
127
126
  protected async visitEmpty(empty: Json.Empty): Promise<Json | undefined> {
@@ -129,56 +128,56 @@ class JsonReceiver extends JsonVisitor<RpcReceiveQueue> {
129
128
  }
130
129
 
131
130
  protected async visitIdentifier(identifier: Json.Identifier, q: RpcReceiveQueue): Promise<Json | undefined> {
132
- const draft = createDraft(identifier);
133
- draft.name = await q.receive(identifier.name);
134
- return finishDraft(draft);
131
+ return updateIfChanged(identifier, {
132
+ name: await q.receive(identifier.name),
133
+ });
135
134
  }
136
135
 
137
136
  protected async visitLiteral(literal: Json.Literal, q: RpcReceiveQueue): Promise<Json | undefined> {
138
- const draft = createDraft(literal);
139
- draft.source = await q.receive(literal.source);
140
- draft.value = await q.receive(literal.value);
141
- return finishDraft(draft);
137
+ return updateIfChanged(literal, {
138
+ source: await q.receive(literal.source),
139
+ value: await q.receive(literal.value),
140
+ });
142
141
  }
143
142
 
144
143
  protected async visitMember(member: Json.Member, q: RpcReceiveQueue): Promise<Json | undefined> {
145
- const draft = createDraft(member);
146
- draft.key = await q.receive(member.key,
147
- async j => await this.visitRightPadded(j, q)!)!;
148
- draft.value = await q.receive<Json.Value>(member.value,
149
- async j => await this.visit(j, q)!);
150
- return finishDraft(draft);
144
+ return updateIfChanged(member, {
145
+ key: await q.receive(member.key,
146
+ async j => await this.visitRightPadded(j, q)!)!,
147
+ value: await q.receive<Json.Value>(member.value,
148
+ async j => await this.visit(j, q)!),
149
+ });
151
150
  }
152
151
 
153
152
  protected async visitObject(obj: Json.Object, q: RpcReceiveQueue): Promise<Json | undefined> {
154
- const draft = createDraft(obj);
155
- draft.members = await q.receiveListDefined(obj.members,
156
- async j => await this.visitRightPadded(j, q));
157
- return finishDraft(draft);
153
+ return updateIfChanged(obj, {
154
+ members: await q.receiveListDefined(obj.members,
155
+ async j => await this.visitRightPadded(j, q)),
156
+ });
158
157
  }
159
158
 
160
159
  public async visitSpace(space: Json.Space, q: RpcReceiveQueue): Promise<Json.Space> {
161
- return (await produceAsync<Json.Space>(space, async draft => {
162
- draft.comments = await q.receiveListDefined(space.comments, async c => {
163
- return await produceAsync(c, async draft => {
164
- draft.multiline = await q.receive(c.multiline);
165
- draft.text = await q.receive(c.text);
166
- draft.suffix = await q.receive(c.suffix);
167
- draft.markers = await q.receive(c.markers);
168
- })
169
- });
170
- draft.whitespace = await q.receive(space.whitespace);
171
- }))!;
160
+ return updateIfChanged(space, {
161
+ comments: await q.receiveListDefined(space.comments, async c => {
162
+ return updateIfChanged(c, {
163
+ multiline: await q.receive(c.multiline),
164
+ text: await q.receive(c.text),
165
+ suffix: await q.receive(c.suffix),
166
+ markers: await q.receive(c.markers),
167
+ });
168
+ }),
169
+ whitespace: await q.receive(space.whitespace),
170
+ });
172
171
  }
173
172
 
174
173
  public async visitRightPadded<T extends Json>(right: Json.RightPadded<T>, p: RpcReceiveQueue): Promise<Json.RightPadded<T> | undefined> {
175
174
  if (!right) {
176
175
  throw new Error("TreeDataReceiveQueue should have instantiated an empty padding")
177
176
  }
178
- return produceAsync<Json.RightPadded<T>>(right, async draft => {
179
- draft.element = await p.receive(right.element, async j => await this.visit(j, p)!) as Draft<T>;
180
- draft.after = await p.receive(right.after, async space => await this.visitSpace(space, p));
181
- draft.markers = await p.receiveMarkers(right.markers);
177
+ return updateIfChanged(right, {
178
+ element: await p.receive(right.element, async j => await this.visit(j, p)!) as T,
179
+ after: await p.receive(right.after, async space => await this.visitSpace(space, p)),
180
+ markers: await p.receiveMarkers(right.markers),
182
181
  });
183
182
  }
184
183
  }
@@ -14,10 +14,10 @@
14
14
  * limitations under the License.
15
15
  */
16
16
  import {mapAsync, updateIfChanged} from "../util";
17
- import {produceAsync, TreeVisitor, ValidImmerRecipeReturnType} from "../visitor";
17
+ import {TreeVisitor, ValidRecipeReturnType} from "../visitor";
18
18
  import {SourceFile} from "../tree";
19
19
  import {isJson, Json} from "./tree";
20
- import {createDraft, Draft, finishDraft} from "immer";
20
+ import {create, Draft} from "mutative";
21
21
 
22
22
  export class JsonVisitor<P> extends TreeVisitor<Json, P> {
23
23
  async isAcceptable(sourceFile: SourceFile): Promise<boolean> {
@@ -103,19 +103,19 @@ export class JsonVisitor<P> extends TreeVisitor<Json, P> {
103
103
  before: Json | undefined,
104
104
  p: P,
105
105
  recipe?: (draft: Draft<J>) =>
106
- ValidImmerRecipeReturnType<Draft<J>> |
107
- PromiseLike<ValidImmerRecipeReturnType<Draft<J>>>
106
+ ValidRecipeReturnType<Draft<J>> |
107
+ PromiseLike<ValidRecipeReturnType<Draft<J>>>
108
108
  ): Promise<J | undefined> {
109
109
  if (before === undefined) {
110
110
  return undefined;
111
111
  }
112
- const draft: Draft<J> = createDraft(before as J);
112
+ const [draft, finishDraft] = create(before as J);
113
113
  (draft as Draft<Json>).prefix = await this.visitSpace(before!.prefix, p);
114
114
  (draft as Draft<Json>).markers = await this.visitMarkers(before!.markers, p);
115
115
  if (recipe) {
116
116
  await recipe(draft);
117
117
  }
118
- return finishDraft(draft) as J;
118
+ return finishDraft() as J;
119
119
  }
120
120
 
121
121
  protected accept(t: Json, p: P): Promise<Json | undefined> {
@@ -17,7 +17,7 @@ import {Cursor, SourceFile, Tree} from "./tree";
17
17
  import {TreeVisitor} from "./visitor";
18
18
  import {PrintOutputCapture, TreePrinters} from "./print";
19
19
  import {RpcCodecs, RpcReceiveQueue, RpcSendQueue} from "./rpc";
20
- import {createDraft, Draft, finishDraft} from "immer";
20
+ import {updateIfChanged} from "./util";
21
21
 
22
22
  export const ParseErrorKind = "org.openrewrite.tree.ParseError";
23
23
 
@@ -67,16 +67,16 @@ TreePrinters.register(ParseErrorKind, () => new class extends ParseErrorVisitor<
67
67
 
68
68
  RpcCodecs.registerCodec(ParseErrorKind, {
69
69
  async rpcReceive(before: ParseError, q: RpcReceiveQueue): Promise<ParseError> {
70
- const draft: Draft<ParseError> = createDraft(before);
71
- draft.id = await q.receive(before.id);
72
- draft.markers = await q.receive(before.markers);
73
- draft.sourcePath = await q.receive(before.sourcePath);
74
- draft.charsetName = await q.receive(before.charsetName);
75
- draft.charsetBomMarked = await q.receive(before.charsetBomMarked);
76
- draft.checksum = await q.receive(before.checksum);
77
- draft.fileAttributes = await q.receive(before.fileAttributes);
78
- draft.text = await q.receive(before.text);
79
- return finishDraft(draft);
70
+ return updateIfChanged(before, {
71
+ id: await q.receive(before.id),
72
+ markers: await q.receive(before.markers),
73
+ sourcePath: await q.receive(before.sourcePath),
74
+ charsetName: await q.receive(before.charsetName),
75
+ charsetBomMarked: await q.receive(before.charsetBomMarked),
76
+ checksum: await q.receive(before.checksum),
77
+ fileAttributes: await q.receive(before.fileAttributes),
78
+ text: await q.receive(before.text),
79
+ });
80
80
  },
81
81
 
82
82
  async rpcSend(after: ParseError, q: RpcSendQueue): Promise<void> {
package/src/reference.ts CHANGED
@@ -13,11 +13,6 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import {setAutoFreeze} from "immer";
17
-
18
- // this is required because otherwise `asRef()` won't work for objects created using immer
19
- setAutoFreeze(false);
20
-
21
16
  const REFERENCE_KEY = Symbol.for("org.openrewrite.rpc.Reference");
22
17
 
23
18
  export interface Reference {
package/src/rpc/index.ts CHANGED
@@ -15,9 +15,9 @@
15
15
  */
16
16
  import {Checksum, FileAttributes, TreeKind} from "../tree";
17
17
  import {RpcCodecs, RpcReceiveQueue, RpcSendQueue} from "./queue";
18
- import {createDraft, finishDraft} from "immer";
19
18
  import {Markers, MarkersKind, MarkupDebug, MarkupError, MarkupInfo, MarkupWarn, SearchResult} from "../markers";
20
19
  import {asRef} from "../reference";
20
+ import {updateIfChanged} from "../util";
21
21
 
22
22
  export * from "./queue";
23
23
  export * from "../reference";
@@ -26,10 +26,10 @@ export * from "../reference";
26
26
 
27
27
  RpcCodecs.registerCodec(TreeKind.Checksum, {
28
28
  async rpcReceive(before: Checksum, q: RpcReceiveQueue): Promise<Checksum> {
29
- const draft = createDraft(before);
30
- draft.algorithm = await q.receive(before.algorithm);
31
- draft.value = await q.receive(before.value);
32
- return finishDraft(draft) as Checksum;
29
+ return updateIfChanged(before, {
30
+ algorithm: await q.receive(before.algorithm),
31
+ value: await q.receive(before.value),
32
+ });
33
33
  },
34
34
 
35
35
  async rpcSend(after: Checksum, q: RpcSendQueue): Promise<void> {
@@ -40,15 +40,15 @@ RpcCodecs.registerCodec(TreeKind.Checksum, {
40
40
 
41
41
  RpcCodecs.registerCodec(TreeKind.FileAttributes, {
42
42
  async rpcReceive(before: FileAttributes, q: RpcReceiveQueue): Promise<FileAttributes> {
43
- const draft = createDraft(before);
44
- draft.creationDate = await q.receive(before.creationDate);
45
- draft.lastModifiedTime = await q.receive(before.lastModifiedTime);
46
- draft.lastAccessTime = await q.receive(before.lastAccessTime);
47
- draft.isReadable = await q.receive(before.isReadable);
48
- draft.isWritable = await q.receive(before.isWritable);
49
- draft.isExecutable = await q.receive(before.isExecutable);
50
- draft.size = await q.receive(before.size);
51
- return finishDraft(draft) as FileAttributes;
43
+ return updateIfChanged(before, {
44
+ creationDate: await q.receive(before.creationDate),
45
+ lastModifiedTime: await q.receive(before.lastModifiedTime),
46
+ lastAccessTime: await q.receive(before.lastAccessTime),
47
+ isReadable: await q.receive(before.isReadable),
48
+ isWritable: await q.receive(before.isWritable),
49
+ isExecutable: await q.receive(before.isExecutable),
50
+ size: await q.receive(before.size),
51
+ });
52
52
  },
53
53
 
54
54
  async rpcSend(after: FileAttributes, q: RpcSendQueue): Promise<void> {
@@ -63,11 +63,11 @@ RpcCodecs.registerCodec(TreeKind.FileAttributes, {
63
63
  });
64
64
 
65
65
  RpcCodecs.registerCodec(MarkersKind.Markers, {
66
- async rpcReceive(before: Markers, q: RpcReceiveQueue): Promise<any> {
67
- const draft = createDraft(before);
68
- draft.id = await q.receive(before.id);
69
- draft.markers = (await q.receiveList(before.markers))!;
70
- return finishDraft(draft);
66
+ async rpcReceive(before: Markers, q: RpcReceiveQueue): Promise<Markers> {
67
+ return updateIfChanged(before, {
68
+ id: await q.receive(before.id),
69
+ markers: (await q.receiveList(before.markers))!,
70
+ });
71
71
  },
72
72
 
73
73
  async rpcSend(after: Markers, q: RpcSendQueue): Promise<void> {
@@ -79,10 +79,10 @@ RpcCodecs.registerCodec(MarkersKind.Markers, {
79
79
  // Register codecs for all Java markers with additional properties
80
80
  RpcCodecs.registerCodec(MarkersKind.SearchResult, {
81
81
  async rpcReceive(before: SearchResult, q: RpcReceiveQueue): Promise<SearchResult> {
82
- const draft = createDraft(before);
83
- draft.id = await q.receive(before.id);
84
- draft.description = await q.receive(before.description)
85
- return finishDraft(draft);
82
+ return updateIfChanged(before, {
83
+ id: await q.receive(before.id),
84
+ description: await q.receive(before.description),
85
+ });
86
86
  },
87
87
 
88
88
  async rpcSend(after: SearchResult, q: RpcSendQueue): Promise<void> {
@@ -93,11 +93,11 @@ RpcCodecs.registerCodec(MarkersKind.SearchResult, {
93
93
 
94
94
  RpcCodecs.registerCodec(MarkersKind.MarkupError, {
95
95
  async rpcReceive(before: MarkupError, q: RpcReceiveQueue): Promise<MarkupError> {
96
- const draft = createDraft(before);
97
- draft.id = await q.receive(before.id);
98
- draft.message = await q.receive(before.message);
99
- draft.detail = await q.receive(before.detail);
100
- return finishDraft(draft);
96
+ return updateIfChanged(before, {
97
+ id: await q.receive(before.id),
98
+ message: await q.receive(before.message),
99
+ detail: await q.receive(before.detail),
100
+ });
101
101
  },
102
102
 
103
103
  async rpcSend(after: MarkupError, q: RpcSendQueue): Promise<void> {
@@ -109,11 +109,11 @@ RpcCodecs.registerCodec(MarkersKind.MarkupError, {
109
109
 
110
110
  RpcCodecs.registerCodec(MarkersKind.MarkupWarn, {
111
111
  async rpcReceive(before: MarkupWarn, q: RpcReceiveQueue): Promise<MarkupWarn> {
112
- const draft = createDraft(before);
113
- draft.id = await q.receive(before.id);
114
- draft.message = await q.receive(before.message);
115
- draft.detail = await q.receive(before.detail);
116
- return finishDraft(draft);
112
+ return updateIfChanged(before, {
113
+ id: await q.receive(before.id),
114
+ message: await q.receive(before.message),
115
+ detail: await q.receive(before.detail),
116
+ });
117
117
  },
118
118
 
119
119
  async rpcSend(after: MarkupWarn, q: RpcSendQueue): Promise<void> {
@@ -125,11 +125,11 @@ RpcCodecs.registerCodec(MarkersKind.MarkupWarn, {
125
125
 
126
126
  RpcCodecs.registerCodec(MarkersKind.MarkupInfo, {
127
127
  async rpcReceive(before: MarkupInfo, q: RpcReceiveQueue): Promise<MarkupInfo> {
128
- const draft = createDraft(before);
129
- draft.id = await q.receive(before.id);
130
- draft.message = await q.receive(before.message);
131
- draft.detail = await q.receive(before.detail);
132
- return finishDraft(draft);
128
+ return updateIfChanged(before, {
129
+ id: await q.receive(before.id),
130
+ message: await q.receive(before.message),
131
+ detail: await q.receive(before.detail),
132
+ });
133
133
  },
134
134
 
135
135
  async rpcSend(after: MarkupInfo, q: RpcSendQueue): Promise<void> {
@@ -141,11 +141,11 @@ RpcCodecs.registerCodec(MarkersKind.MarkupInfo, {
141
141
 
142
142
  RpcCodecs.registerCodec(MarkersKind.MarkupDebug, {
143
143
  async rpcReceive(before: MarkupDebug, q: RpcReceiveQueue): Promise<MarkupDebug> {
144
- const draft = createDraft(before);
145
- draft.id = await q.receive(before.id);
146
- draft.message = await q.receive(before.message);
147
- draft.detail = await q.receive(before.detail);
148
- return finishDraft(draft);
144
+ return updateIfChanged(before, {
145
+ id: await q.receive(before.id),
146
+ message: await q.receive(before.message),
147
+ detail: await q.receive(before.detail),
148
+ });
149
149
  },
150
150
 
151
151
  async rpcSend(after: MarkupDebug, q: RpcSendQueue): Promise<void> {
package/src/rpc/queue.ts CHANGED
@@ -16,7 +16,7 @@
16
16
  import * as rpc from "vscode-jsonrpc/node";
17
17
  import {emptyMarkers, Markers} from "../markers";
18
18
  import {saveTrace, trace} from "./trace";
19
- import {createDraft, finishDraft} from "immer";
19
+ import {updateIfChanged} from "../util";
20
20
  import {isRef, ReferenceMap} from "../reference";
21
21
 
22
22
  /**
@@ -24,6 +24,14 @@ import {isRef, ReferenceMap} from "../reference";
24
24
  * for sending and receiving objects in an RPC communication.
25
25
  */
26
26
  export interface RpcCodec<T> {
27
+ /**
28
+ * Creates a new instance of the object type with proper constructor defaults.
29
+ * If not provided, a plain object `{kind: type}` will be created.
30
+ *
31
+ * @returns A new instance of the object type.
32
+ */
33
+ rpcNew?(): T;
34
+
27
35
  /**
28
36
  * Serializes and sends an object over an RPC send queue.
29
37
  *
@@ -288,10 +296,10 @@ export class RpcReceiveQueue {
288
296
  }
289
297
  return this.receive(markers, async m => {
290
298
  return saveTrace(this.trace, async () => {
291
- const draft = createDraft(markers!);
292
- draft.id = await this.receive(m.id);
293
- draft.markers = (await this.receiveList(m.markers))!;
294
- return finishDraft(draft);
299
+ return updateIfChanged(markers!, {
300
+ id: await this.receive(m.id),
301
+ markers: (await this.receiveList(m.markers))!,
302
+ });
295
303
  })
296
304
  })
297
305
  }
@@ -397,9 +405,11 @@ export class RpcReceiveQueue {
397
405
  }
398
406
 
399
407
  private newObj<T>(type: string): T {
400
- return {
401
- kind: type
402
- } as T;
408
+ const codec = RpcCodecs.forType(type, this.sourceFileType);
409
+ if (codec?.rpcNew) {
410
+ return codec.rpcNew();
411
+ }
412
+ return {kind: type} as T;
403
413
  }
404
414
  }
405
415
 
@@ -182,7 +182,7 @@ function preloadCoreModules(logger?: rpc.Logger) {
182
182
  * same package is installed in multiple node_modules directories.
183
183
  */
184
184
  function setupSharedDependencies(targetModulePath: string, logger?: rpc.Logger) {
185
- const sharedDeps = ['@openrewrite/rewrite', 'vscode-jsonrpc'];
185
+ const sharedDeps = ['@openrewrite/rewrite', 'vscode-jsonrpc', 'mutative'];
186
186
  const targetDir = path.dirname(targetModulePath);
187
187
 
188
188
  sharedDeps.forEach(depName => {
@@ -17,11 +17,11 @@ import * as rpc from "vscode-jsonrpc/node";
17
17
  import * as path from "path";
18
18
  import {ExecutionContext} from "../../execution";
19
19
  import {randomId, UUID} from "../../uuid";
20
- import {produce} from "immer";
21
20
  import {SourceFile} from "../../tree";
22
21
  import {Parsers} from "../../parser";
23
22
  import {withMetrics} from "./metrics";
24
23
  import {DEFAULT_EXCLUSIONS, ProjectParser} from "../../javascript";
24
+ import {replaceMarkerByKind} from "../../markers";
25
25
 
26
26
  /**
27
27
  * Response item with object ID and source file type for proper deserialization.
@@ -82,9 +82,7 @@ export class ParseProject {
82
82
  const id = randomId();
83
83
  localObjects.set(id, async (id: string) => {
84
84
  const sourceFile: SourceFile = (await generator.next()).value;
85
- return produce(sourceFile, (draft) => {
86
- draft.id = id;
87
- });
85
+ return { ...sourceFile, id };
88
86
  });
89
87
  resultItems.push({
90
88
  id,
@@ -102,9 +100,7 @@ export class ParseProject {
102
100
  const id = randomId();
103
101
  localObjects.set(id, async (id: string) => {
104
102
  const sourceFile: SourceFile = (await generator.next()).value;
105
- return produce(sourceFile, (draft) => {
106
- draft.id = id;
107
- });
103
+ return { ...sourceFile, id };
108
104
  });
109
105
  resultItems.push({
110
106
  id,
@@ -122,9 +118,7 @@ export class ParseProject {
122
118
  const id = randomId();
123
119
  localObjects.set(id, async (id: string) => {
124
120
  const sourceFile: SourceFile = (await generator.next()).value;
125
- return produce(sourceFile, (draft) => {
126
- draft.id = id;
127
- });
121
+ return { ...sourceFile, id };
128
122
  });
129
123
  resultItems.push({
130
124
  id,
@@ -142,9 +136,7 @@ export class ParseProject {
142
136
  const id = randomId();
143
137
  localObjects.set(id, async (id: string) => {
144
138
  const sourceFile: SourceFile = (await generator.next()).value;
145
- return produce(sourceFile, (draft) => {
146
- draft.id = id;
147
- });
139
+ return { ...sourceFile, id };
148
140
  });
149
141
  resultItems.push({
150
142
  id,
@@ -173,12 +165,13 @@ export class ParseProject {
173
165
  const sourceFile: SourceFile = (await generator.next()).value;
174
166
  // Add PrettierStyle marker if Prettier is available
175
167
  const prettierMarker = await prettierLoader.getConfigMarker(filePath);
176
- return produce(sourceFile, (draft) => {
177
- draft.id = id;
178
- if (prettierMarker) {
179
- draft.markers.markers = draft.markers.markers.concat([prettierMarker]);
180
- }
181
- });
168
+ return {
169
+ ...sourceFile,
170
+ id,
171
+ markers: prettierMarker
172
+ ? replaceMarkerByKind(sourceFile.markers, prettierMarker)
173
+ : sourceFile.markers
174
+ };
182
175
  });
183
176
  resultItems.push({
184
177
  id,
@@ -202,10 +195,11 @@ export class ParseProject {
202
195
  // Store thunks that add the Autodetect marker
203
196
  for (const {id, sourceFile} of parsedFiles) {
204
197
  localObjects.set(id, async (newId: string) => {
205
- return produce(sourceFile, (draft) => {
206
- draft.id = newId;
207
- draft.markers.markers = draft.markers.markers.concat([autodetectMarker]);
208
- });
198
+ return {
199
+ ...sourceFile,
200
+ id: newId,
201
+ markers: replaceMarkerByKind(sourceFile.markers, autodetectMarker)
202
+ };
209
203
  });
210
204
  resultItems.push({
211
205
  id,
@@ -224,9 +218,7 @@ export class ParseProject {
224
218
  const id = randomId();
225
219
  localObjects.set(id, async (id: string) => {
226
220
  const sourceFile: SourceFile = (await generator.next()).value;
227
- return produce(sourceFile, (draft) => {
228
- draft.id = id;
229
- });
221
+ return { ...sourceFile, id };
230
222
  });
231
223
  resultItems.push({
232
224
  id,
@@ -244,9 +236,7 @@ export class ParseProject {
244
236
  const id = randomId();
245
237
  localObjects.set(id, async (id: string) => {
246
238
  const sourceFile: SourceFile = (await generator.next()).value;
247
- return produce(sourceFile, (draft) => {
248
- draft.id = id;
249
- });
239
+ return { ...sourceFile, id };
250
240
  });
251
241
  resultItems.push({
252
242
  id,
@@ -264,9 +254,7 @@ export class ParseProject {
264
254
  const id = randomId();
265
255
  localObjects.set(id, async (id: string) => {
266
256
  const sourceFile: SourceFile = (await generator.next()).value;
267
- return produce(sourceFile, (draft) => {
268
- draft.id = id;
269
- });
257
+ return { ...sourceFile, id };
270
258
  });
271
259
  resultItems.push({
272
260
  id,
@@ -17,7 +17,6 @@ import * as rpc from "vscode-jsonrpc/node";
17
17
  import {ExecutionContext} from "../../execution";
18
18
  import {ParserInput, parserInputFile, Parsers, ParserType} from "../../parser";
19
19
  import {randomId, UUID} from "../../uuid";
20
- import {produce} from "immer";
21
20
  import {SourceFile} from "../../tree";
22
21
  import {withMetrics} from "./metrics";
23
22
  import * as path from "path";
@@ -70,9 +69,7 @@ export class Parse {
70
69
  const id = randomId();
71
70
  localObjects.set(id, async (id: string) => {
72
71
  const sourceFile: SourceFile = (await generator.next()).value;
73
- return produce(sourceFile, (draft) => {
74
- draft.id = id;
75
- });
72
+ return { ...sourceFile, id };
76
73
  });
77
74
  resultIds.push(id);
78
75
  }