@openrewrite/rewrite 8.70.0-20251219-180817 → 8.70.0-20251220-094504

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 (94) hide show
  1. package/dist/cli/cli-utils.d.ts +6 -6
  2. package/dist/cli/cli-utils.d.ts.map +1 -1
  3. package/dist/cli/cli-utils.js +50 -228
  4. package/dist/cli/cli-utils.js.map +1 -1
  5. package/dist/javascript/assertions.d.ts.map +1 -1
  6. package/dist/javascript/assertions.js +87 -12
  7. package/dist/javascript/assertions.js.map +1 -1
  8. package/dist/javascript/autodetect.d.ts +11 -11
  9. package/dist/javascript/autodetect.d.ts.map +1 -1
  10. package/dist/javascript/autodetect.js +18 -21
  11. package/dist/javascript/autodetect.js.map +1 -1
  12. package/dist/javascript/format/prettier-config-loader.d.ts.map +1 -1
  13. package/dist/javascript/format/prettier-config-loader.js +1 -1
  14. package/dist/javascript/format/prettier-config-loader.js.map +1 -1
  15. package/dist/javascript/index.d.ts +1 -0
  16. package/dist/javascript/index.d.ts.map +1 -1
  17. package/dist/javascript/index.js +1 -0
  18. package/dist/javascript/index.js.map +1 -1
  19. package/dist/javascript/markers.d.ts.map +1 -1
  20. package/dist/javascript/markers.js +140 -11
  21. package/dist/javascript/markers.js.map +1 -1
  22. package/dist/javascript/node-resolution-result.d.ts +4 -1
  23. package/dist/javascript/node-resolution-result.d.ts.map +1 -1
  24. package/dist/javascript/node-resolution-result.js +65 -40
  25. package/dist/javascript/node-resolution-result.js.map +1 -1
  26. package/dist/javascript/package-json-parser.d.ts +7 -0
  27. package/dist/javascript/package-json-parser.d.ts.map +1 -1
  28. package/dist/javascript/package-json-parser.js +19 -1
  29. package/dist/javascript/package-json-parser.js.map +1 -1
  30. package/dist/javascript/parser.d.ts.map +1 -1
  31. package/dist/javascript/parser.js +1 -13
  32. package/dist/javascript/parser.js.map +1 -1
  33. package/dist/javascript/preconditions.js +4 -4
  34. package/dist/javascript/preconditions.js.map +1 -1
  35. package/dist/javascript/project-parser.d.ts +137 -0
  36. package/dist/javascript/project-parser.d.ts.map +1 -0
  37. package/dist/javascript/project-parser.js +726 -0
  38. package/dist/javascript/project-parser.js.map +1 -0
  39. package/dist/javascript/style.d.ts +9 -26
  40. package/dist/javascript/style.d.ts.map +1 -1
  41. package/dist/javascript/style.js +18 -42
  42. package/dist/javascript/style.js.map +1 -1
  43. package/dist/json/parser.d.ts.map +1 -1
  44. package/dist/json/parser.js +1 -0
  45. package/dist/json/parser.js.map +1 -1
  46. package/dist/markers.d.ts +1 -1
  47. package/dist/markers.js +1 -1
  48. package/dist/markers.js.map +1 -1
  49. package/dist/parser.d.ts +1 -1
  50. package/dist/parser.d.ts.map +1 -1
  51. package/dist/rpc/index.d.ts +0 -1
  52. package/dist/rpc/index.d.ts.map +1 -1
  53. package/dist/rpc/index.js +4 -2
  54. package/dist/rpc/index.js.map +1 -1
  55. package/dist/rpc/request/index.d.ts +1 -0
  56. package/dist/rpc/request/index.d.ts.map +1 -1
  57. package/dist/rpc/request/index.js +1 -0
  58. package/dist/rpc/request/index.js.map +1 -1
  59. package/dist/rpc/request/parse-project.d.ts +25 -0
  60. package/dist/rpc/request/parse-project.d.ts.map +1 -0
  61. package/dist/rpc/request/parse-project.js +304 -0
  62. package/dist/rpc/request/parse-project.js.map +1 -0
  63. package/dist/rpc/rewrite-rpc.d.ts.map +1 -1
  64. package/dist/rpc/rewrite-rpc.js +1 -0
  65. package/dist/rpc/rewrite-rpc.js.map +1 -1
  66. package/dist/text/parser.d.ts.map +1 -1
  67. package/dist/text/parser.js +1 -0
  68. package/dist/text/parser.js.map +1 -1
  69. package/dist/version.txt +1 -1
  70. package/dist/yaml/parser.d.ts.map +1 -1
  71. package/dist/yaml/parser.js +52 -4
  72. package/dist/yaml/parser.js.map +1 -1
  73. package/package.json +1 -1
  74. package/src/cli/cli-utils.ts +46 -237
  75. package/src/javascript/assertions.ts +74 -10
  76. package/src/javascript/autodetect.ts +22 -15
  77. package/src/javascript/format/prettier-config-loader.ts +2 -2
  78. package/src/javascript/index.ts +1 -0
  79. package/src/javascript/markers.ts +163 -12
  80. package/src/javascript/node-resolution-result.ts +67 -48
  81. package/src/javascript/package-json-parser.ts +19 -1
  82. package/src/javascript/parser.ts +1 -16
  83. package/src/javascript/preconditions.ts +1 -1
  84. package/src/javascript/project-parser.ts +657 -0
  85. package/src/javascript/style.ts +43 -28
  86. package/src/json/parser.ts +3 -1
  87. package/src/markers.ts +1 -1
  88. package/src/parser.ts +1 -1
  89. package/src/rpc/index.ts +7 -5
  90. package/src/rpc/request/index.ts +1 -0
  91. package/src/rpc/request/parse-project.ts +283 -0
  92. package/src/rpc/rewrite-rpc.ts +2 -0
  93. package/src/text/parser.ts +3 -1
  94. package/src/yaml/parser.ts +53 -5
@@ -17,8 +17,18 @@ import {Marker} from "../markers";
17
17
  import {J} from "../java";
18
18
  import {JS} from "./tree";
19
19
  import {RpcCodecs, RpcReceiveQueue, RpcSendQueue} from "../rpc";
20
- import {createDraft, finishDraft} from "immer";
21
- import {PrettierStyle, StyleKind} from "./style";
20
+ import {
21
+ prettierStyle,
22
+ PrettierStyle,
23
+ SpacesStyle,
24
+ SpacesStyleDetailKind,
25
+ StyleKind,
26
+ TabsAndIndentsStyle,
27
+ WrappingAndBracesStyle,
28
+ WrappingAndBracesStyleDetailKind
29
+ } from "./style";
30
+ import {Autodetect} from "./autodetect";
31
+ import {updateIfChanged} from "../util";
22
32
 
23
33
  declare module "./tree" {
24
34
  namespace JS {
@@ -86,10 +96,10 @@ function registerPrefixedMarkerCodec<M extends Marker & { prefix: J.Space }>(
86
96
  ) {
87
97
  RpcCodecs.registerCodec(kind, {
88
98
  async rpcReceive(before: M, q: RpcReceiveQueue): Promise<M> {
89
- const draft = createDraft(before);
90
- draft.id = await q.receive(before.id);
91
- draft.prefix = await q.receive(before.prefix);
92
- return finishDraft(draft) as M;
99
+ return updateIfChanged(before, {
100
+ id: await q.receive(before.id),
101
+ prefix: await q.receive(before.prefix)
102
+ } as Partial<M>);
93
103
  },
94
104
 
95
105
  async rpcSend(after: M, q: RpcSendQueue): Promise<void> {
@@ -107,19 +117,160 @@ registerPrefixedMarkerCodec<Spread>(JS.Markers.Spread);
107
117
  registerPrefixedMarkerCodec<FunctionDeclaration>(JS.Markers.FunctionDeclaration);
108
118
 
109
119
  // Register codec for PrettierStyle (a NamedStyles that contains Prettier configuration)
110
- // Only serialize the variable fields; constant fields are defined in the class
120
+ // Only serialize the variable fields; constant fields are defined in the interface
111
121
  RpcCodecs.registerCodec(StyleKind.PrettierStyle, {
112
122
  async rpcReceive(before: PrettierStyle, q: RpcReceiveQueue): Promise<PrettierStyle> {
113
- const draft = createDraft(before);
114
- (draft as any).id = await q.receive(before.id);
115
- (draft as any).config = await q.receive(before.config);
116
- (draft as any).prettierVersion = await q.receive(before.prettierVersion);
117
- return finishDraft(draft) as PrettierStyle;
123
+ const id = await q.receive(before.id);
124
+ const config = await q.receive(before.config);
125
+ const version = await q.receive(before.prettierVersion);
126
+ const ignored = await q.receive(before.ignored);
127
+ return prettierStyle(id, config, version, ignored);
118
128
  },
119
129
 
120
130
  async rpcSend(after: PrettierStyle, q: RpcSendQueue): Promise<void> {
121
131
  await q.getAndSend(after, a => a.id);
122
132
  await q.getAndSend(after, a => a.config);
123
133
  await q.getAndSend(after, a => a.prettierVersion);
134
+ await q.getAndSend(after, a => a.ignored);
135
+ }
136
+ });
137
+
138
+ // Register codec for Autodetect (auto-detected styles for JavaScript/TypeScript)
139
+ // Only serialize the variable fields (id, styles); constant fields are defined in the interface
140
+ RpcCodecs.registerCodec(StyleKind.Autodetect, {
141
+ async rpcReceive(before: Autodetect, q: RpcReceiveQueue): Promise<Autodetect> {
142
+ return updateIfChanged(before, {
143
+ id: await q.receive(before.id),
144
+ styles: (await q.receiveList(before.styles))!,
145
+ });
146
+ },
147
+
148
+ async rpcSend(after: Autodetect, q: RpcSendQueue): Promise<void> {
149
+ await q.getAndSend(after, a => a.id);
150
+ await q.getAndSendList(after, a => a.styles, s => s.kind);
151
+ }
152
+ });
153
+
154
+ // ============================================================================
155
+ // Style RPC Codecs
156
+ // ============================================================================
157
+
158
+ // Helper to create a simple codec for objects where all fields are primitives
159
+ function registerSimpleCodec<T extends { kind: string }>(
160
+ kind: T["kind"],
161
+ fields: (keyof T)[]
162
+ ) {
163
+ RpcCodecs.registerCodec(kind, {
164
+ async rpcReceive(before: T, q: RpcReceiveQueue): Promise<T> {
165
+ const updates: Partial<T> = {};
166
+ for (const field of fields) {
167
+ (updates as any)[field] = await q.receive((before as any)[field]);
168
+ }
169
+ return updateIfChanged(before, updates);
170
+ },
171
+
172
+ async rpcSend(after: T, q: RpcSendQueue): Promise<void> {
173
+ for (const field of fields) {
174
+ await q.getAndSend(after, a => (a as any)[field]);
175
+ }
176
+ }
177
+ });
178
+ }
179
+
180
+ // TabsAndIndentsStyle - simple style with primitive fields
181
+ registerSimpleCodec<TabsAndIndentsStyle>(StyleKind.TabsAndIndentsStyle, [
182
+ 'useTabCharacter', 'tabSize', 'indentSize', 'continuationIndent',
183
+ 'keepIndentsOnEmptyLines', 'indentChainedMethods', 'indentAllChainedCallsInAGroup'
184
+ ]);
185
+
186
+ // SpacesStyle and its nested types
187
+ registerSimpleCodec<SpacesStyle.BeforeParentheses>(SpacesStyleDetailKind.SpacesStyleBeforeParentheses, [
188
+ 'functionDeclarationParentheses', 'functionCallParentheses', 'ifParentheses',
189
+ 'forParentheses', 'whileParentheses', 'switchParentheses', 'catchParentheses',
190
+ 'inFunctionCallExpression', 'inAsyncArrowFunction'
191
+ ]);
192
+
193
+ registerSimpleCodec<SpacesStyle.AroundOperators>(SpacesStyleDetailKind.SpacesStyleAroundOperators, [
194
+ 'assignment', 'logical', 'equality', 'relational', 'bitwise', 'additive',
195
+ 'multiplicative', 'shift', 'unary', 'arrowFunction',
196
+ 'beforeUnaryNotAndNotNull', 'afterUnaryNotAndNotNull'
197
+ ]);
198
+
199
+ registerSimpleCodec<SpacesStyle.BeforeLeftBrace>(SpacesStyleDetailKind.SpacesStyleBeforeLeftBrace, [
200
+ 'functionLeftBrace', 'ifLeftBrace', 'elseLeftBrace', 'forLeftBrace',
201
+ 'whileLeftBrace', 'doLeftBrace', 'switchLeftBrace', 'tryLeftBrace',
202
+ 'catchLeftBrace', 'finallyLeftBrace', 'classInterfaceModuleLeftBrace'
203
+ ]);
204
+
205
+ registerSimpleCodec<SpacesStyle.BeforeKeywords>(SpacesStyleDetailKind.SpacesStyleBeforeKeywords, [
206
+ 'elseKeyword', 'whileKeyword', 'catchKeyword', 'finallyKeyword'
207
+ ]);
208
+
209
+ registerSimpleCodec<SpacesStyle.Within>(SpacesStyleDetailKind.SpacesStyleWithin, [
210
+ 'indexAccessBrackets', 'groupingParentheses', 'functionDeclarationParentheses',
211
+ 'functionCallParentheses', 'ifParentheses', 'forParentheses', 'whileParentheses',
212
+ 'switchParentheses', 'catchParentheses', 'objectLiteralBraces', 'es6ImportExportBraces',
213
+ 'arrayBrackets', 'interpolationExpressions', 'objectLiteralTypeBraces',
214
+ 'unionAndIntersectionTypes', 'typeAssertions'
215
+ ]);
216
+
217
+ registerSimpleCodec<SpacesStyle.TernaryOperator>(SpacesStyleDetailKind.SpacesStyleTernaryOperator, [
218
+ 'beforeQuestionMark', 'afterQuestionMark', 'beforeColon', 'afterColon'
219
+ ]);
220
+
221
+ registerSimpleCodec<SpacesStyle.Other>(SpacesStyleDetailKind.SpacesStyleOther, [
222
+ 'beforeComma', 'afterComma', 'beforeForSemicolon',
223
+ 'beforePropertyNameValueSeparator', 'afterPropertyNameValueSeparator',
224
+ 'afterVarArgInRestOrSpread', 'beforeAsteriskInGenerator', 'afterAsteriskInGenerator',
225
+ 'beforeTypeReferenceColon', 'afterTypeReferenceColon'
226
+ ]);
227
+
228
+ // SpacesStyle - has nested objects
229
+ RpcCodecs.registerCodec(StyleKind.SpacesStyle, {
230
+ async rpcReceive(before: SpacesStyle, q: RpcReceiveQueue): Promise<SpacesStyle> {
231
+ return updateIfChanged(before, {
232
+ beforeParentheses: await q.receive(before.beforeParentheses),
233
+ aroundOperators: await q.receive(before.aroundOperators),
234
+ beforeLeftBrace: await q.receive(before.beforeLeftBrace),
235
+ beforeKeywords: await q.receive(before.beforeKeywords),
236
+ within: await q.receive(before.within),
237
+ ternaryOperator: await q.receive(before.ternaryOperator),
238
+ other: await q.receive(before.other),
239
+ });
240
+ },
241
+
242
+ async rpcSend(after: SpacesStyle, q: RpcSendQueue): Promise<void> {
243
+ await q.getAndSend(after, a => a.beforeParentheses);
244
+ await q.getAndSend(after, a => a.aroundOperators);
245
+ await q.getAndSend(after, a => a.beforeLeftBrace);
246
+ await q.getAndSend(after, a => a.beforeKeywords);
247
+ await q.getAndSend(after, a => a.within);
248
+ await q.getAndSend(after, a => a.ternaryOperator);
249
+ await q.getAndSend(after, a => a.other);
250
+ }
251
+ });
252
+
253
+ // WrappingAndBracesStyle and its nested types
254
+ registerSimpleCodec<WrappingAndBracesStyle.IfStatement>(
255
+ WrappingAndBracesStyleDetailKind.WrappingAndBracesStyleIfStatement,
256
+ ['elseOnNewLine']
257
+ );
258
+
259
+ registerSimpleCodec<WrappingAndBracesStyle.KeepWhenReformatting>(
260
+ WrappingAndBracesStyleDetailKind.WrappingAndBracesStyleKeepWhenReformatting,
261
+ ['simpleBlocksInOneLine', 'simpleMethodsInOneLine']
262
+ );
263
+
264
+ RpcCodecs.registerCodec(StyleKind.WrappingAndBracesStyle, {
265
+ async rpcReceive(before: WrappingAndBracesStyle, q: RpcReceiveQueue): Promise<WrappingAndBracesStyle> {
266
+ return updateIfChanged(before, {
267
+ ifStatement: await q.receive(before.ifStatement),
268
+ keepWhenReformatting: await q.receive(before.keepWhenReformatting),
269
+ });
270
+ },
271
+
272
+ async rpcSend(after: WrappingAndBracesStyle, q: RpcSendQueue): Promise<void> {
273
+ await q.getAndSend(after, a => a.ifStatement);
274
+ await q.getAndSend(after, a => a.keepWhenReformatting);
124
275
  }
125
276
  });
@@ -17,7 +17,8 @@ import {findMarker, Marker, Markers} from "../markers";
17
17
  import {randomId, UUID} from "../uuid";
18
18
  import {asRef} from "../reference";
19
19
  import {RpcCodecs, RpcReceiveQueue, RpcSendQueue} from "../rpc";
20
- import {castDraft, createDraft, finishDraft} from "immer";
20
+ import {castDraft} from "immer";
21
+ import {updateIfChanged} from "../util";
21
22
  import * as semver from "semver";
22
23
  import * as fsp from "fs/promises";
23
24
  import * as path from "path";
@@ -50,7 +51,7 @@ export interface PackageLockEntry {
50
51
  readonly version?: string;
51
52
  readonly resolved?: string;
52
53
  readonly integrity?: string;
53
- readonly license?: string;
54
+ readonly license?: string | string[] | { type?: string; url?: string }; // Can be legacy formats
54
55
  readonly dependencies?: Record<string, string>;
55
56
  readonly devDependencies?: Record<string, string>;
56
57
  readonly peerDependencies?: Record<string, string>;
@@ -264,6 +265,27 @@ export function createNodeResolutionResultMarker(
264
265
  return engines;
265
266
  }
266
267
 
268
+ /**
269
+ * Normalizes the license field from package-lock.json.
270
+ * Older packages may have license in legacy formats:
271
+ * - Array: ["MIT", "Apache2"] -> "(MIT OR Apache2)"
272
+ * - Object: { type: "MIT", url: "..." } -> "MIT"
273
+ */
274
+ function normalizeLicense(license?: string | string[] | { type?: string; url?: string }): string | undefined {
275
+ if (!license) return undefined;
276
+ if (Array.isArray(license)) {
277
+ // Convert array format to SPDX OR expression
278
+ // e.g., ["MIT", "Apache2"] -> "(MIT OR Apache2)"
279
+ return license.length > 0 ? `(${license.join(' OR ')})` : undefined;
280
+ }
281
+ if (typeof license === 'object') {
282
+ // Extract type from object format
283
+ // e.g., { type: "MIT", url: "..." } -> "MIT"
284
+ return license.type || undefined;
285
+ }
286
+ return license;
287
+ }
288
+
267
289
  /**
268
290
  * Extracts package name and optionally version from a package-lock.json path.
269
291
  * e.g., "node_modules/@babel/core" -> { name: "@babel/core" }
@@ -324,7 +346,7 @@ export function createNodeResolutionResultMarker(
324
346
  peerDependencies: undefined,
325
347
  optionalDependencies: undefined,
326
348
  engines: normalizeEngines(pkgEntry?.engines),
327
- license: pkgEntry?.license,
349
+ license: normalizeLicense(pkgEntry?.license),
328
350
  });
329
351
  resolvedDependencyCache.set(key, resolved);
330
352
 
@@ -794,12 +816,11 @@ export namespace NodeResolutionResultQueries {
794
816
  */
795
817
  RpcCodecs.registerCodec(NpmrcKind, {
796
818
  async rpcReceive(before: Npmrc, q: RpcReceiveQueue): Promise<Npmrc> {
797
- const draft = createDraft(before);
798
- draft.kind = NpmrcKind;
799
- draft.scope = await q.receive(before.scope);
800
- draft.properties = await q.receive(before.properties);
801
-
802
- return finishDraft(draft) as Npmrc;
819
+ return updateIfChanged(before, {
820
+ kind: NpmrcKind,
821
+ scope: await q.receive(before.scope),
822
+ properties: await q.receive(before.properties),
823
+ });
803
824
  },
804
825
 
805
826
  async rpcSend(after: Npmrc, q: RpcSendQueue): Promise<void> {
@@ -813,13 +834,12 @@ RpcCodecs.registerCodec(NpmrcKind, {
813
834
  */
814
835
  RpcCodecs.registerCodec(DependencyKind, {
815
836
  async rpcReceive(before: Dependency, q: RpcReceiveQueue): Promise<Dependency> {
816
- const draft = createDraft(before);
817
- draft.kind = DependencyKind;
818
- draft.name = await q.receive(before.name);
819
- draft.versionConstraint = await q.receive(before.versionConstraint);
820
- draft.resolved = await q.receive(before.resolved);
821
-
822
- return finishDraft(draft) as Dependency;
837
+ return updateIfChanged(before, {
838
+ kind: DependencyKind,
839
+ name: await q.receive(before.name),
840
+ versionConstraint: await q.receive(before.versionConstraint),
841
+ resolved: await q.receive(before.resolved),
842
+ });
823
843
  },
824
844
 
825
845
  async rpcSend(after: Dependency, q: RpcSendQueue): Promise<void> {
@@ -834,18 +854,17 @@ RpcCodecs.registerCodec(DependencyKind, {
834
854
  */
835
855
  RpcCodecs.registerCodec(ResolvedDependencyKind, {
836
856
  async rpcReceive(before: ResolvedDependency, q: RpcReceiveQueue): Promise<ResolvedDependency> {
837
- const draft = createDraft(before);
838
- draft.kind = ResolvedDependencyKind;
839
- draft.name = await q.receive(before.name);
840
- draft.version = await q.receive(before.version);
841
- draft.dependencies = (await q.receiveList(before.dependencies)) || undefined;
842
- draft.devDependencies = (await q.receiveList(before.devDependencies)) || undefined;
843
- draft.peerDependencies = (await q.receiveList(before.peerDependencies)) || undefined;
844
- draft.optionalDependencies = (await q.receiveList(before.optionalDependencies)) || undefined;
845
- draft.engines = await q.receive(before.engines);
846
- draft.license = await q.receive(before.license);
847
-
848
- return finishDraft(draft) as ResolvedDependency;
857
+ return updateIfChanged(before, {
858
+ kind: ResolvedDependencyKind,
859
+ name: await q.receive(before.name),
860
+ version: await q.receive(before.version),
861
+ dependencies: (await q.receiveList(before.dependencies)) || undefined,
862
+ devDependencies: (await q.receiveList(before.devDependencies)) || undefined,
863
+ peerDependencies: (await q.receiveList(before.peerDependencies)) || undefined,
864
+ optionalDependencies: (await q.receiveList(before.optionalDependencies)) || undefined,
865
+ engines: await q.receive(before.engines),
866
+ license: await q.receive(before.license),
867
+ });
849
868
  },
850
869
 
851
870
  async rpcSend(after: ResolvedDependency, q: RpcSendQueue): Promise<void> {
@@ -867,29 +886,29 @@ RpcCodecs.registerCodec(ResolvedDependencyKind, {
867
886
  /**
868
887
  * Register RPC codec for NodeResolutionResult marker.
869
888
  * This handles serialization/deserialization for communication between JS and Java.
889
+ * Note: We avoid Immer here because the dependency graph can contain cycles
890
+ * (e.g., Dependency -> ResolvedDependency -> Dependency[]), and Immer's proxies
891
+ * don't handle cyclic structures correctly.
870
892
  */
871
893
  RpcCodecs.registerCodec(NodeResolutionResultKind, {
872
894
  async rpcReceive(before: NodeResolutionResult, q: RpcReceiveQueue): Promise<NodeResolutionResult> {
873
- const draft = createDraft(before);
874
- draft.id = await q.receive(before.id);
875
- draft.name = await q.receive(before.name);
876
- draft.version = await q.receive(before.version);
877
- draft.description = await q.receive(before.description);
878
- draft.path = await q.receive(before.path);
879
- draft.workspacePackagePaths = await q.receive(before.workspacePackagePaths);
880
-
881
- draft.dependencies = (await q.receiveList(before.dependencies)) || [];
882
- draft.devDependencies = (await q.receiveList(before.devDependencies)) || [];
883
- draft.peerDependencies = (await q.receiveList(before.peerDependencies)) || [];
884
- draft.optionalDependencies = (await q.receiveList(before.optionalDependencies)) || [];
885
- draft.bundledDependencies = (await q.receiveList(before.bundledDependencies)) || [];
886
- draft.resolvedDependencies = (await q.receiveList(before.resolvedDependencies)) || [];
887
-
888
- draft.packageManager = await q.receive(before.packageManager);
889
- draft.engines = await q.receive(before.engines);
890
- draft.npmrcConfigs = (await q.receiveList(before.npmrcConfigs)) || undefined;
891
-
892
- return finishDraft(draft) as NodeResolutionResult;
895
+ return updateIfChanged(before, {
896
+ id: await q.receive(before.id),
897
+ name: await q.receive(before.name),
898
+ version: await q.receive(before.version),
899
+ description: await q.receive(before.description),
900
+ path: await q.receive(before.path),
901
+ workspacePackagePaths: await q.receive(before.workspacePackagePaths),
902
+ dependencies: (await q.receiveList(before.dependencies)) || [],
903
+ devDependencies: (await q.receiveList(before.devDependencies)) || [],
904
+ peerDependencies: (await q.receiveList(before.peerDependencies)) || [],
905
+ optionalDependencies: (await q.receiveList(before.optionalDependencies)) || [],
906
+ bundledDependencies: (await q.receiveList(before.bundledDependencies)) || [],
907
+ resolvedDependencies: (await q.receiveList(before.resolvedDependencies)) || [],
908
+ packageManager: await q.receive(before.packageManager),
909
+ engines: await q.receive(before.engines),
910
+ npmrcConfigs: (await q.receiveList(before.npmrcConfigs)) || undefined,
911
+ });
893
912
  },
894
913
 
895
914
  async rpcSend(after: NodeResolutionResult, q: RpcSendQueue): Promise<void> {
@@ -107,12 +107,30 @@ export class PackageJsonParser extends Parser {
107
107
  entry.engines = pkgJson.engines;
108
108
  }
109
109
  if (pkgJson.license) {
110
- entry.license = pkgJson.license;
110
+ // Normalize legacy license formats to string
111
+ entry.license = PackageJsonParser.normalizeLicense(pkgJson.license);
111
112
  }
112
113
 
113
114
  return entry;
114
115
  }
115
116
 
117
+ /**
118
+ * Normalizes the license field from package.json.
119
+ * Older packages may have license in legacy formats:
120
+ * - Array: ["MIT", "Apache2"] -> "(MIT OR Apache2)"
121
+ * - Object: { type: "MIT", url: "..." } -> "MIT"
122
+ */
123
+ private static normalizeLicense(license: any): string | undefined {
124
+ if (!license) return undefined;
125
+ if (Array.isArray(license)) {
126
+ return license.length > 0 ? `(${license.join(' OR ')})` : undefined;
127
+ }
128
+ if (typeof license === 'object' && license.type) {
129
+ return license.type;
130
+ }
131
+ return typeof license === 'string' ? license : undefined;
132
+ }
133
+
116
134
  /**
117
135
  * Accepts package.json files.
118
136
  */
@@ -48,12 +48,9 @@ import {
48
48
  } from "./parser-utils";
49
49
  import {JavaScriptTypeMapping} from "./type-mapping";
50
50
  import {produce} from "immer";
51
- import {PrettierConfigLoader} from "./format/prettier-config-loader";
52
- import Kind = JS.Kind;
53
51
  import ComputedPropertyName = JS.ComputedPropertyName;
54
52
  import Attribute = JSX.Attribute;
55
53
  import SpreadAttribute = JSX.SpreadAttribute;
56
-
57
54
  export interface JavaScriptParserOptions extends ParserOptions {
58
55
  styles?: NamedStyles[],
59
56
  sourceFileCache?: Map<string, ts.SourceFile>,
@@ -330,12 +327,6 @@ export class JavaScriptParser extends Parser {
330
327
  // Update the oldProgram reference
331
328
  this.oldProgram = program;
332
329
 
333
- // Detect Prettier config for the project
334
- const prettierLoader = this.relativeTo ? new PrettierConfigLoader(this.relativeTo) : undefined;
335
- if (prettierLoader) {
336
- await prettierLoader.detectPrettier();
337
- }
338
-
339
330
  // Create a single JavaScriptTypeMapping instance to be shared across all files in this parse batch.
340
331
  // This ensures that TypeScript types with the same type.id map to the same Type instance,
341
332
  // preventing duplicate Type.Class, Type.Parameterized, etc. instances.
@@ -363,9 +354,6 @@ export class JavaScriptParser extends Parser {
363
354
  }
364
355
 
365
356
  try {
366
- // Get Prettier config marker for this file (if Prettier is available)
367
- const prettierConfigMarker = await prettierLoader?.getConfigMarker(filePath);
368
-
369
357
  yield produce(
370
358
  new JavaScriptParserVisitor(sourceFile, this.relativePath(input), typeMapping)
371
359
  .visit(sourceFile) as SourceFile,
@@ -373,9 +361,6 @@ export class JavaScriptParser extends Parser {
373
361
  if (this.styles) {
374
362
  draft.markers.markers = draft.markers.markers.concat(this.styles);
375
363
  }
376
- if (prettierConfigMarker) {
377
- draft.markers.markers = draft.markers.markers.concat([prettierConfigMarker]);
378
- }
379
364
  });
380
365
  } catch (error) {
381
366
  yield this.error(input, error instanceof Error ? error : new Error('Parser threw unknown error: ' + error));
@@ -1766,7 +1751,7 @@ export class JavaScriptParserVisitor {
1766
1751
  markers: emptyMarkers,
1767
1752
  typeParameter: this.rightPadded(
1768
1753
  {
1769
- kind: Kind.MappedTypeParameter,
1754
+ kind: JS.Kind.MappedTypeParameter,
1770
1755
  id: randomId(),
1771
1756
  prefix: this.prefix(node.typeParameter),
1772
1757
  markers: emptyMarkers,
@@ -13,7 +13,7 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import {RewriteRpc} from "../rpc";
16
+ import {RewriteRpc} from "../rpc/rewrite-rpc";
17
17
  import {UsesMethod, UsesType} from "./search";
18
18
  import {ExecutionContext} from "../execution";
19
19
  import {TreeVisitor} from "../visitor";