@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.
- package/dist/cli/cli-utils.d.ts +6 -6
- package/dist/cli/cli-utils.d.ts.map +1 -1
- package/dist/cli/cli-utils.js +50 -228
- package/dist/cli/cli-utils.js.map +1 -1
- package/dist/javascript/assertions.d.ts.map +1 -1
- package/dist/javascript/assertions.js +87 -12
- package/dist/javascript/assertions.js.map +1 -1
- package/dist/javascript/autodetect.d.ts +11 -11
- package/dist/javascript/autodetect.d.ts.map +1 -1
- package/dist/javascript/autodetect.js +18 -21
- package/dist/javascript/autodetect.js.map +1 -1
- package/dist/javascript/format/prettier-config-loader.d.ts.map +1 -1
- package/dist/javascript/format/prettier-config-loader.js +1 -1
- package/dist/javascript/format/prettier-config-loader.js.map +1 -1
- package/dist/javascript/index.d.ts +1 -0
- package/dist/javascript/index.d.ts.map +1 -1
- package/dist/javascript/index.js +1 -0
- package/dist/javascript/index.js.map +1 -1
- package/dist/javascript/markers.d.ts.map +1 -1
- package/dist/javascript/markers.js +140 -11
- package/dist/javascript/markers.js.map +1 -1
- package/dist/javascript/node-resolution-result.d.ts +4 -1
- package/dist/javascript/node-resolution-result.d.ts.map +1 -1
- package/dist/javascript/node-resolution-result.js +65 -40
- package/dist/javascript/node-resolution-result.js.map +1 -1
- package/dist/javascript/package-json-parser.d.ts +7 -0
- package/dist/javascript/package-json-parser.d.ts.map +1 -1
- package/dist/javascript/package-json-parser.js +19 -1
- package/dist/javascript/package-json-parser.js.map +1 -1
- package/dist/javascript/parser.d.ts.map +1 -1
- package/dist/javascript/parser.js +1 -13
- package/dist/javascript/parser.js.map +1 -1
- package/dist/javascript/preconditions.js +4 -4
- package/dist/javascript/preconditions.js.map +1 -1
- package/dist/javascript/project-parser.d.ts +137 -0
- package/dist/javascript/project-parser.d.ts.map +1 -0
- package/dist/javascript/project-parser.js +726 -0
- package/dist/javascript/project-parser.js.map +1 -0
- package/dist/javascript/style.d.ts +9 -26
- package/dist/javascript/style.d.ts.map +1 -1
- package/dist/javascript/style.js +18 -42
- package/dist/javascript/style.js.map +1 -1
- package/dist/json/parser.d.ts.map +1 -1
- package/dist/json/parser.js +1 -0
- package/dist/json/parser.js.map +1 -1
- package/dist/markers.d.ts +1 -1
- package/dist/markers.js +1 -1
- package/dist/markers.js.map +1 -1
- package/dist/parser.d.ts +1 -1
- package/dist/parser.d.ts.map +1 -1
- package/dist/rpc/index.d.ts +0 -1
- package/dist/rpc/index.d.ts.map +1 -1
- package/dist/rpc/index.js +4 -2
- package/dist/rpc/index.js.map +1 -1
- package/dist/rpc/request/index.d.ts +1 -0
- package/dist/rpc/request/index.d.ts.map +1 -1
- package/dist/rpc/request/index.js +1 -0
- package/dist/rpc/request/index.js.map +1 -1
- package/dist/rpc/request/parse-project.d.ts +25 -0
- package/dist/rpc/request/parse-project.d.ts.map +1 -0
- package/dist/rpc/request/parse-project.js +304 -0
- package/dist/rpc/request/parse-project.js.map +1 -0
- package/dist/rpc/rewrite-rpc.d.ts.map +1 -1
- package/dist/rpc/rewrite-rpc.js +1 -0
- package/dist/rpc/rewrite-rpc.js.map +1 -1
- package/dist/text/parser.d.ts.map +1 -1
- package/dist/text/parser.js +1 -0
- package/dist/text/parser.js.map +1 -1
- package/dist/version.txt +1 -1
- package/dist/yaml/parser.d.ts.map +1 -1
- package/dist/yaml/parser.js +52 -4
- package/dist/yaml/parser.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/cli-utils.ts +46 -237
- package/src/javascript/assertions.ts +74 -10
- package/src/javascript/autodetect.ts +22 -15
- package/src/javascript/format/prettier-config-loader.ts +2 -2
- package/src/javascript/index.ts +1 -0
- package/src/javascript/markers.ts +163 -12
- package/src/javascript/node-resolution-result.ts +67 -48
- package/src/javascript/package-json-parser.ts +19 -1
- package/src/javascript/parser.ts +1 -16
- package/src/javascript/preconditions.ts +1 -1
- package/src/javascript/project-parser.ts +657 -0
- package/src/javascript/style.ts +43 -28
- package/src/json/parser.ts +3 -1
- package/src/markers.ts +1 -1
- package/src/parser.ts +1 -1
- package/src/rpc/index.ts +7 -5
- package/src/rpc/request/index.ts +1 -0
- package/src/rpc/request/parse-project.ts +283 -0
- package/src/rpc/rewrite-rpc.ts +2 -0
- package/src/text/parser.ts +3 -1
- 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 {
|
|
21
|
-
|
|
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
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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
|
|
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
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
return
|
|
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
|
|
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
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
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
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
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
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
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
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
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
|
-
|
|
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
|
*/
|
package/src/javascript/parser.ts
CHANGED
|
@@ -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";
|