@openrewrite/rewrite 8.69.0-20251207-160255 → 8.69.0-20251207-214914
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.map +1 -1
- package/dist/cli/cli-utils.js +3 -2
- package/dist/cli/cli-utils.js.map +1 -1
- package/dist/cli/rewrite.js +2 -1
- package/dist/cli/rewrite.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/javascript/add-import.d.ts.map +1 -1
- package/dist/javascript/add-import.js +99 -56
- package/dist/javascript/add-import.js.map +1 -1
- package/dist/javascript/parser.d.ts.map +1 -1
- package/dist/javascript/parser.js +48 -8
- package/dist/javascript/parser.js.map +1 -1
- package/dist/javascript/recipes/async-callback-in-sync-array-method.d.ts +40 -0
- package/dist/javascript/recipes/async-callback-in-sync-array-method.d.ts.map +1 -0
- package/dist/javascript/recipes/async-callback-in-sync-array-method.js +232 -0
- package/dist/javascript/recipes/async-callback-in-sync-array-method.js.map +1 -0
- package/dist/javascript/recipes/change-import.d.ts +51 -0
- package/dist/javascript/recipes/change-import.d.ts.map +1 -0
- package/dist/javascript/recipes/change-import.js +658 -0
- package/dist/javascript/recipes/change-import.js.map +1 -0
- package/dist/javascript/recipes/index.d.ts +3 -0
- package/dist/javascript/recipes/index.d.ts.map +1 -1
- package/dist/javascript/recipes/index.js +3 -0
- package/dist/javascript/recipes/index.js.map +1 -1
- package/dist/javascript/recipes/order-imports.d.ts +10 -0
- package/dist/javascript/recipes/order-imports.d.ts.map +1 -0
- package/dist/javascript/recipes/order-imports.js +240 -0
- package/dist/javascript/recipes/order-imports.js.map +1 -0
- package/dist/javascript/templating/index.d.ts +1 -1
- package/dist/javascript/templating/index.d.ts.map +1 -1
- package/dist/javascript/templating/index.js +2 -1
- package/dist/javascript/templating/index.js.map +1 -1
- package/dist/javascript/templating/rewrite.d.ts +36 -2
- package/dist/javascript/templating/rewrite.d.ts.map +1 -1
- package/dist/javascript/templating/rewrite.js +76 -0
- package/dist/javascript/templating/rewrite.js.map +1 -1
- package/dist/json/parser.js +78 -30
- package/dist/json/parser.js.map +1 -1
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +7 -4
- package/dist/run.js.map +1 -1
- package/dist/version.txt +1 -1
- package/package.json +1 -1
- package/src/cli/cli-utils.ts +3 -2
- package/src/cli/rewrite.ts +2 -1
- package/src/index.ts +3 -2
- package/src/javascript/add-import.ts +125 -69
- package/src/javascript/parser.ts +49 -8
- package/src/javascript/recipes/async-callback-in-sync-array-method.ts +237 -0
- package/src/javascript/recipes/change-import.ts +700 -0
- package/src/javascript/recipes/index.ts +3 -0
- package/src/javascript/recipes/order-imports.ts +242 -0
- package/src/javascript/templating/index.ts +2 -1
- package/src/javascript/templating/rewrite.ts +89 -4
- package/src/json/parser.ts +69 -24
- package/src/run.ts +5 -4
- package/dist/recipe/index.d.ts +0 -2
- package/dist/recipe/index.d.ts.map +0 -1
- package/dist/recipe/index.js +0 -21
- package/dist/recipe/index.js.map +0 -1
- package/dist/recipe/order-imports.d.ts +0 -10
- package/dist/recipe/order-imports.d.ts.map +0 -1
- package/dist/recipe/order-imports.js +0 -213
- package/dist/recipe/order-imports.js.map +0 -1
- package/src/recipe/index.ts +0 -17
- package/src/recipe/order-imports.ts +0 -195
package/dist/json/parser.js
CHANGED
|
@@ -89,42 +89,78 @@ class ParseJsonReader extends parser_1.ParserSourceReader {
|
|
|
89
89
|
};
|
|
90
90
|
if (Array.isArray(parsed)) {
|
|
91
91
|
this.cursor++; // skip '['
|
|
92
|
-
|
|
93
|
-
|
|
92
|
+
let values;
|
|
93
|
+
if (parsed.length === 0) {
|
|
94
|
+
// Empty array - capture whitespace in an Empty element
|
|
94
95
|
const afterWhitespace = this.whitespace();
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
}
|
|
96
|
+
values = [{
|
|
97
|
+
kind: tree_1.Json.Kind.RightPadded,
|
|
98
|
+
element: {
|
|
99
|
+
kind: tree_1.Json.Kind.Empty,
|
|
100
|
+
id: (0, uuid_1.randomId)(),
|
|
101
|
+
prefix: tree_1.emptySpace,
|
|
102
|
+
markers: markers_1.emptyMarkers
|
|
103
|
+
},
|
|
104
|
+
after: (0, tree_1.space)(afterWhitespace),
|
|
105
|
+
markers: markers_1.emptyMarkers
|
|
106
|
+
}];
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
values = parsed.map((p, i) => {
|
|
110
|
+
const element = this.json(p);
|
|
111
|
+
const afterWhitespace = this.whitespace();
|
|
112
|
+
// Check if there's a comma after this element
|
|
113
|
+
const hasComma = this.source[this.cursor] === ',';
|
|
114
|
+
if (hasComma) {
|
|
115
|
+
this.cursor++; // skip ','
|
|
116
|
+
}
|
|
117
|
+
return {
|
|
118
|
+
kind: tree_1.Json.Kind.RightPadded,
|
|
119
|
+
element,
|
|
120
|
+
after: (0, tree_1.space)(afterWhitespace),
|
|
121
|
+
markers: markers_1.emptyMarkers
|
|
122
|
+
};
|
|
123
|
+
});
|
|
124
|
+
}
|
|
107
125
|
this.cursor++; // skip ']'
|
|
108
126
|
return Object.assign(Object.assign({ kind: tree_1.Json.Kind.Array }, base), { values });
|
|
109
127
|
}
|
|
110
128
|
else if (parsed !== null && typeof parsed === "object") {
|
|
111
129
|
this.cursor++; // skip '{'
|
|
112
130
|
const keys = Object.keys(parsed);
|
|
113
|
-
|
|
114
|
-
|
|
131
|
+
let members;
|
|
132
|
+
if (keys.length === 0) {
|
|
133
|
+
// Empty object - capture whitespace in an Empty element
|
|
115
134
|
const afterWhitespace = this.whitespace();
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
}
|
|
135
|
+
members = [{
|
|
136
|
+
kind: tree_1.Json.Kind.RightPadded,
|
|
137
|
+
element: {
|
|
138
|
+
kind: tree_1.Json.Kind.Empty,
|
|
139
|
+
id: (0, uuid_1.randomId)(),
|
|
140
|
+
prefix: tree_1.emptySpace,
|
|
141
|
+
markers: markers_1.emptyMarkers
|
|
142
|
+
},
|
|
143
|
+
after: (0, tree_1.space)(afterWhitespace),
|
|
144
|
+
markers: markers_1.emptyMarkers
|
|
145
|
+
}];
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
members = keys.map((key, i) => {
|
|
149
|
+
const element = this.member(parsed, key);
|
|
150
|
+
const afterWhitespace = this.whitespace();
|
|
151
|
+
// Check if there's a comma after this element
|
|
152
|
+
const hasComma = this.source[this.cursor] === ',';
|
|
153
|
+
if (hasComma) {
|
|
154
|
+
this.cursor++; // skip ','
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
kind: tree_1.Json.Kind.RightPadded,
|
|
158
|
+
element,
|
|
159
|
+
after: (0, tree_1.space)(afterWhitespace),
|
|
160
|
+
markers: markers_1.emptyMarkers
|
|
161
|
+
};
|
|
162
|
+
});
|
|
163
|
+
}
|
|
128
164
|
this.cursor++; // skip '}'
|
|
129
165
|
return Object.assign(Object.assign({ kind: tree_1.Json.Kind.Object }, base), { members });
|
|
130
166
|
}
|
|
@@ -149,8 +185,20 @@ class ParseJsonReader extends parser_1.ParserSourceReader {
|
|
|
149
185
|
return Object.assign(Object.assign({ kind: tree_1.Json.Kind.Literal }, base), { source, value: parsed });
|
|
150
186
|
}
|
|
151
187
|
else if (typeof parsed === "number") {
|
|
152
|
-
|
|
153
|
-
|
|
188
|
+
// Extract original source to preserve precision for large numbers
|
|
189
|
+
const sourceStart = this.cursor;
|
|
190
|
+
// Numbers can have optional sign, digits, decimal point, and exponent
|
|
191
|
+
while (this.cursor < this.source.length) {
|
|
192
|
+
const char = this.source[this.cursor];
|
|
193
|
+
if (/[\d.eE+\-]/.test(char)) {
|
|
194
|
+
this.cursor++;
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
const source = this.source.slice(sourceStart, this.cursor);
|
|
201
|
+
return Object.assign(Object.assign({ kind: tree_1.Json.Kind.Literal }, base), { source, value: parsed });
|
|
154
202
|
}
|
|
155
203
|
else if (typeof parsed === "boolean") {
|
|
156
204
|
const source = parsed ? "true" : "false";
|
package/dist/json/parser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/json/parser.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;;;GAcG;AACH,wCAAoF;AACpF,sCAAmF;AACnF,kCAAiC;AAEjC,iCAA+C;AAC/C,gDAA0D;AAE1D,MAAa,UAAW,SAAQ,eAAM;IAE3B,KAAK,CAAC,GAAG,WAA0B;;YACtC,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;gBACnC,IAAI,CAAC;oBACD,oDACO,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,KAC1C,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAC5C,CAAC;gBACN,CAAC;gBAAC,OAAO,CAAM,EAAE,CAAC;oBACd,iFAAiF;oBACjF,MAAM,IAAI,GAAG,IAAA,wBAAe,EAAC,UAAU,CAAC,CAAC;oBACzC,MAAM,UAAU,GAAe;wBAC3B,IAAI,EAAE,4BAAc;wBACpB,EAAE,EAAE,IAAA,eAAQ,GAAE;wBACd,OAAO,EAAE,IAAA,iBAAO,EAAC;4BACb,IAAI,EAAE,qBAAW,CAAC,oBAAoB;4BACtC,EAAE,EAAE,IAAA,eAAQ,GAAE;4BACd,UAAU,EAAE,YAAY;4BACxB,aAAa,EAAE,CAAC,CAAC,IAAI,IAAI,OAAO;4BAChC,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,qBAAqB;yBACS,CAAC;wBACzD,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC;wBACzC,IAAI;qBACP,CAAC;oBACF,oBAAM,UAAU,CAAA,CAAC;gBACrB,CAAC;YACL,CAAC;QACL,CAAC;KAAA;CACJ;AA7BD,gCA6BC;AAED,MAAM,eAAgB,SAAQ,2BAAkB;IAC5C,YAAY,UAAuB;QAC/B,KAAK,CAAC,UAAU,CAAC,CAAC;IACtB,CAAC;IAEO,MAAM;QACV,OAAO,IAAA,YAAK,EAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,KAAK;QACD,OAAO;YACH,IAAI,EAAE,WAAI,CAAC,IAAI,CAAC,QAAQ;YACxB,EAAE,EAAE,IAAA,eAAQ,GAAE;YACd,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;YACrB,OAAO,EAAE,sBAAY;YACrB,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAe;YACvD,GAAG,EAAE,IAAA,YAAK,EAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SAC7C,CAAA;IACL,CAAC;IAEO,IAAI,CAAC,MAAW;QACpB,MAAM,IAAI,GAAG;YACT,EAAE,EAAE,IAAA,eAAQ,GAAE;YACd,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;YACrB,OAAO,EAAE,sBAAY;SACxB,CAAA;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,WAAW;YAC1B,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/json/parser.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;;;GAcG;AACH,wCAAoF;AACpF,sCAAmF;AACnF,kCAAiC;AAEjC,iCAA+C;AAC/C,gDAA0D;AAE1D,MAAa,UAAW,SAAQ,eAAM;IAE3B,KAAK,CAAC,GAAG,WAA0B;;YACtC,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;gBACnC,IAAI,CAAC;oBACD,oDACO,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,KAC1C,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAC5C,CAAC;gBACN,CAAC;gBAAC,OAAO,CAAM,EAAE,CAAC;oBACd,iFAAiF;oBACjF,MAAM,IAAI,GAAG,IAAA,wBAAe,EAAC,UAAU,CAAC,CAAC;oBACzC,MAAM,UAAU,GAAe;wBAC3B,IAAI,EAAE,4BAAc;wBACpB,EAAE,EAAE,IAAA,eAAQ,GAAE;wBACd,OAAO,EAAE,IAAA,iBAAO,EAAC;4BACb,IAAI,EAAE,qBAAW,CAAC,oBAAoB;4BACtC,EAAE,EAAE,IAAA,eAAQ,GAAE;4BACd,UAAU,EAAE,YAAY;4BACxB,aAAa,EAAE,CAAC,CAAC,IAAI,IAAI,OAAO;4BAChC,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,qBAAqB;yBACS,CAAC;wBACzD,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC;wBACzC,IAAI;qBACP,CAAC;oBACF,oBAAM,UAAU,CAAA,CAAC;gBACrB,CAAC;YACL,CAAC;QACL,CAAC;KAAA;CACJ;AA7BD,gCA6BC;AAED,MAAM,eAAgB,SAAQ,2BAAkB;IAC5C,YAAY,UAAuB;QAC/B,KAAK,CAAC,UAAU,CAAC,CAAC;IACtB,CAAC;IAEO,MAAM;QACV,OAAO,IAAA,YAAK,EAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,KAAK;QACD,OAAO;YACH,IAAI,EAAE,WAAI,CAAC,IAAI,CAAC,QAAQ;YACxB,EAAE,EAAE,IAAA,eAAQ,GAAE;YACd,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;YACrB,OAAO,EAAE,sBAAY;YACrB,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAe;YACvD,GAAG,EAAE,IAAA,YAAK,EAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SAC7C,CAAA;IACL,CAAC;IAEO,IAAI,CAAC,MAAW;QACpB,MAAM,IAAI,GAAG;YACT,EAAE,EAAE,IAAA,eAAQ,GAAE;YACd,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;YACrB,OAAO,EAAE,sBAAY;SACxB,CAAA;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,WAAW;YAC1B,IAAI,MAAsC,CAAC;YAC3C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,uDAAuD;gBACvD,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;gBAC1C,MAAM,GAAG,CAAC;wBACN,IAAI,EAAE,WAAI,CAAC,IAAI,CAAC,WAAW;wBAC3B,OAAO,EAAE;4BACL,IAAI,EAAE,WAAI,CAAC,IAAI,CAAC,KAAK;4BACrB,EAAE,EAAE,IAAA,eAAQ,GAAE;4BACd,MAAM,EAAE,iBAAU;4BAClB,OAAO,EAAE,sBAAY;yBACW;wBACpC,KAAK,EAAE,IAAA,YAAK,EAAC,eAAe,CAAC;wBAC7B,OAAO,EAAE,sBAAY;qBAC+C,CAAC,CAAC;YAC9E,CAAC;iBAAM,CAAC;gBACJ,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;oBACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAe,CAAC;oBAC3C,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;oBAC1C,8CAA8C;oBAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC;oBAClD,IAAI,QAAQ,EAAE,CAAC;wBACX,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,WAAW;oBAC9B,CAAC;oBACD,OAAO;wBACH,IAAI,EAAE,WAAI,CAAC,IAAI,CAAC,WAAW;wBAC3B,OAAO;wBACP,KAAK,EAAE,IAAA,YAAK,EAAC,eAAe,CAAC;wBAC7B,OAAO,EAAE,sBAAY;qBAC+C,CAAC;gBAC7E,CAAC,CAAC,CAAC;YACP,CAAC;YACD,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,WAAW;YAC1B,OAAO,8BACH,IAAI,EAAE,WAAI,CAAC,IAAI,CAAC,KAAK,IAClB,IAAI,KACP,MAAM,GAC0B,CAAC;QACzC,CAAC;aAAM,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YACvD,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,WAAW;YAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACjC,IAAI,OAAwC,CAAC;YAC7C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACpB,wDAAwD;gBACxD,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;gBAC1C,OAAO,GAAG,CAAC;wBACP,IAAI,EAAE,WAAI,CAAC,IAAI,CAAC,WAAW;wBAC3B,OAAO,EAAE;4BACL,IAAI,EAAE,WAAI,CAAC,IAAI,CAAC,KAAK;4BACrB,EAAE,EAAE,IAAA,eAAQ,GAAE;4BACd,MAAM,EAAE,iBAAU;4BAClB,OAAO,EAAE,sBAAY;yBACqC;wBAC9D,KAAK,EAAE,IAAA,YAAK,EAAC,eAAe,CAAC;wBAC7B,OAAO,EAAE,sBAAY;qBACiD,CAAC,CAAC;YAChF,CAAC;iBAAM,CAAC;gBACJ,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;oBAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;oBACzC,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;oBAC1C,8CAA8C;oBAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC;oBAClD,IAAI,QAAQ,EAAE,CAAC;wBACX,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,WAAW;oBAC9B,CAAC;oBACD,OAAO;wBACH,IAAI,EAAE,WAAI,CAAC,IAAI,CAAC,WAAW;wBAC3B,OAAO;wBACP,KAAK,EAAE,IAAA,YAAK,EAAC,eAAe,CAAC;wBAC7B,OAAO,EAAE,sBAAY;qBACiD,CAAC;gBAC/E,CAAC,CAAC,CAAC;YACP,CAAC;YACD,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,WAAW;YAC1B,OAAO,8BACH,IAAI,EAAE,WAAI,CAAC,IAAI,CAAC,MAAM,IACnB,IAAI,KACP,OAAO,GAC2B,CAAC;QAC3C,CAAC;aAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YACpC,uDAAuD;YACvD,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC;YAChC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,qBAAqB;YACpC,OAAO,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACtC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACtC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;oBAChB,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,uBAAuB;gBAC7C,CAAC;qBAAM,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;oBACtB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,qBAAqB;oBACpC,MAAM;gBACV,CAAC;qBAAM,CAAC;oBACJ,IAAI,CAAC,MAAM,EAAE,CAAC;gBAClB,CAAC;YACL,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3D,OAAO,8BACH,IAAI,EAAE,WAAI,CAAC,IAAI,CAAC,OAAO,IACpB,IAAI,KACP,MAAM,EACN,KAAK,EAAE,MAAM,GACuB,CAAC;QAC7C,CAAC;aAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YACpC,kEAAkE;YAClE,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC;YAChC,sEAAsE;YACtE,OAAO,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACtC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACtC,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC1B,IAAI,CAAC,MAAM,EAAE,CAAC;gBAClB,CAAC;qBAAM,CAAC;oBACJ,MAAM;gBACV,CAAC;YACL,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3D,OAAO,8BACH,IAAI,EAAE,WAAI,CAAC,IAAI,CAAC,OAAO,IACpB,IAAI,KACP,MAAM,EACN,KAAK,EAAE,MAAM,GACuB,CAAC;QAC7C,CAAC;aAAM,IAAI,OAAO,MAAM,KAAK,SAAS,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;YACzC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC;YAC7B,OAAO,8BACH,IAAI,EAAE,WAAI,CAAC,IAAI,CAAC,OAAO,IACpB,IAAI,KACP,MAAM,EACN,KAAK,EAAE,MAAM,GACuB,CAAC;QAC7C,CAAC;aAAM,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACzB,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,gBAAgB;YAClC,OAAO,8BACH,IAAI,EAAE,WAAI,CAAC,IAAI,CAAC,OAAO,IACpB,IAAI,KACP,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,IAAI,GACyB,CAAC;QAC7C,CAAC;aAAM,CAAC;YACJ,MAAM,IAAI,KAAK,CAAC,0BAA0B,OAAO,MAAM,EAAE,CAAC,CAAC;QAC/D,CAAC;IACL,CAAC;IAEO,MAAM,CAAC,MAAW,EAAE,GAAW;QACnC,OAAO;YACH,IAAI,EAAE,WAAI,CAAC,IAAI,CAAC,MAAM;YACtB,EAAE,EAAE,IAAA,eAAQ,GAAE;YACd,MAAM,EAAE,iBAAU;YAClB,OAAO,EAAE,sBAAY;YACrB,GAAG,EAAE;gBACD,IAAI,EAAE,WAAI,CAAC,IAAI,CAAC,WAAW;gBAC3B,OAAO,EAAE,sBAAY;gBACrB,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAa;gBACnC,KAAK,EAAE,IAAA,YAAK,EAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;aAC4B;YACpE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAe;SACT,CAAC;IAC3C,CAAC;CACJ"}
|
package/dist/run.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAeA,OAAO,EAAC,gBAAgB,EAAC,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAa,UAAU,EAAC,MAAM,QAAQ,CAAC;AAG9C,OAAO,EAAC,MAAM,EAAiB,MAAM,UAAU,CAAC;AAEhD,MAAM,WAAW,SAAS;IACtB,SAAS,EAAE,MAAM,EAAE,CAAA;CACtB;AAED,qBAAa,MAAM;aACa,MAAM,CAAC,EAAE,UAAU;aAAkB,KAAK,CAAC,EAAE,UAAU;gBAAvD,MAAM,CAAC,EAAE,UAAU,YAAA,EAAkB,KAAK,CAAC,EAAE,UAAU,YAAA;IAG7E,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;CAWhC;
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAeA,OAAO,EAAC,gBAAgB,EAAC,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAa,UAAU,EAAC,MAAM,QAAQ,CAAC;AAG9C,OAAO,EAAC,MAAM,EAAiB,MAAM,UAAU,CAAC;AAEhD,MAAM,WAAW,SAAS;IACtB,SAAS,EAAE,MAAM,EAAE,CAAA;CACtB;AAED,qBAAa,MAAM;aACa,MAAM,CAAC,EAAE,UAAU;aAAkB,KAAK,CAAC,EAAE,UAAU;gBAAvD,MAAM,CAAC,EAAE,UAAU,YAAA,EAAkB,KAAK,CAAC,EAAE,UAAU,YAAA;IAG7E,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;CAWhC;AA0BD,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,SAAS,CAAC,CAMjH;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,SAAS,GAAG,UAAU,GAAG,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;AAE1I;;;;;;;;;;;GAWG;AACH,wBAAuB,oBAAoB,CACvC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,UAAU,EAAE,GAAG,aAAa,CAAC,UAAU,CAAC,EAChD,GAAG,EAAE,gBAAgB,EACrB,UAAU,CAAC,EAAE,gBAAgB,GAC9B,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,CAkEzC"}
|
package/dist/run.js
CHANGED
|
@@ -51,7 +51,13 @@ class Result {
|
|
|
51
51
|
exports.Result = Result;
|
|
52
52
|
function hasScanningRecipe(recipe) {
|
|
53
53
|
return __awaiter(this, void 0, void 0, function* () {
|
|
54
|
-
|
|
54
|
+
if (recipe instanceof recipe_1.ScanningRecipe)
|
|
55
|
+
return true;
|
|
56
|
+
for (const item of (yield recipe.recipeList())) {
|
|
57
|
+
if (yield hasScanningRecipe(item))
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
return false;
|
|
55
61
|
});
|
|
56
62
|
}
|
|
57
63
|
function recurseRecipeList(recipe, initial, fn) {
|
|
@@ -173,14 +179,11 @@ function scheduleRunStreaming(recipe, before, ctx, onProgress) {
|
|
|
173
179
|
else {
|
|
174
180
|
// For non-scanning recipes, process files immediately as they come in
|
|
175
181
|
const iterable = Array.isArray(before) ? before : before;
|
|
176
|
-
let processCount = 0;
|
|
177
182
|
try {
|
|
178
183
|
for (var _h = true, iterable_1 = __asyncValues(iterable), iterable_1_1; iterable_1_1 = yield __await(iterable_1.next()), _d = iterable_1_1.done, !_d; _h = true) {
|
|
179
184
|
_f = iterable_1_1.value;
|
|
180
185
|
_h = false;
|
|
181
186
|
const b = _f;
|
|
182
|
-
processCount++;
|
|
183
|
-
onProgress === null || onProgress === void 0 ? void 0 : onProgress('processing', processCount, -1, b.sourcePath);
|
|
184
187
|
const editedB = yield __await(recurseRecipeList(recipe, b, (recipe, b2) => __awaiter(this, void 0, void 0, function* () { return (yield recipe.editor()).visit(b2, ctx, cursor); })));
|
|
185
188
|
// Always yield a result so the caller knows when each file is processed
|
|
186
189
|
yield yield __await(new Result(b, editedB !== b ? editedB : b));
|
package/dist/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkEA,kCAMC;AAgBD,oDAuEC;AA/ID,iCAA8C;AAC9C,+BAAyC;AACzC,mCAAqC;AACrC,qCAAgD;AAMhD,MAAa,MAAM;IACf,YAA4B,MAAmB,EAAkB,KAAkB;QAAvD,WAAM,GAAN,MAAM,CAAa;QAAkB,UAAK,GAAL,KAAK,CAAa;IACnF,CAAC;IAEK,IAAI;;;YACN,OAAO,IAAA,0BAAmB,EACtB,MAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,UAAU,mCAAI,EAAE,EAC7B,MAAA,MAAA,IAAI,CAAC,KAAK,0CAAE,UAAU,mCAAI,EAAE,EAC5B,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,oBAAY,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,EACxD,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,oBAAY,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EACtD,EAAE,EACF,EAAE,EACF,EAAC,OAAO,EAAE,CAAC,EAAC,CACf,CAAC;QACN,CAAC;KAAA;CACJ;AAfD,wBAeC;AAED,SAAe,iBAAiB,CAAC,MAAc;;QAC3C,IAAI,MAAM,YAAY,uBAAc;YAAE,OAAO,IAAI,CAAC;QAClD,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC;YAC7C,IAAI,MAAM,iBAAiB,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;QACnD,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;CAAA;AAED,SAAe,iBAAiB,CAAI,MAAc,EAAE,OAAU,EAAE,EAAoD;;QAChH,IAAI,CAAC,GAAkB,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACjD,KAAK,MAAM,SAAS,IAAI,MAAM,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;YAChD,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;gBAClB,OAAO,SAAS,CAAC;YACrB,CAAC;YACD,CAAC,GAAG,MAAM,iBAAiB,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,CAAC,CAAC;IACb,CAAC;CAAA;AAED,SAAe,mBAAmB,CAAC,MAAc,EAAE,GAAqB;;QACpE,MAAM,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC1E,CAAC;CAAA;AAED,SAAsB,WAAW,CAAC,MAAc,EAAE,MAAoB,EAAE,GAAqB;;;QACzF,MAAM,SAAS,GAAa,EAAE,CAAC;;YAC/B,KAA2B,eAAA,KAAA,cAAA,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,CAAA,IAAA,sDAAE,CAAC;gBAA5C,cAAyC;gBAAzC,WAAyC;gBAAzD,MAAM,MAAM,KAAA,CAAA;gBACnB,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3B,CAAC;;;;;;;;;QACD,OAAO,EAAE,SAAS,EAAE,CAAC;IACzB,CAAC;CAAA;AAID;;;;;;;;;;;GAWG;AACH,SAAuB,oBAAoB,CACvC,MAAc,EACd,MAAgD,EAChD,GAAqB,EACrB,UAA6B;;;QAE7B,MAAM,MAAM,GAAG,IAAA,iBAAU,GAAE,CAAC;QAC5B,MAAM,UAAU,GAAG,cAAM,iBAAiB,CAAC,MAAM,CAAC,CAAA,CAAC;QAEnD,IAAI,UAAU,EAAE,CAAC;YACb,8EAA8E;YAC9E,MAAM,KAAK,GAAiB,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzB,IAAI,UAAU,GAAG,CAAC,CAAC;;oBACnB,KAAuB,eAAA,WAAA,cAAA,MAAM,CAAA,YAAA,qFAAE,CAAC;wBAAT,sBAAM;wBAAN,WAAM;wBAAlB,MAAM,EAAE,KAAA,CAAA;wBACf,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;wBACf,UAAU,EAAE,CAAC;wBACb,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAG,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,qBAAqB;oBACjF,CAAC;;;;;;;;;YACL,CAAC;YAED,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;YAEhC,qCAAqC;YACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACnB,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAG,UAAU,EAAE,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;gBAC1D,cAAM,iBAAiB,CAAC,MAAM,EAAE,CAAC,EAAE,CAAO,MAAM,EAAE,EAAE,EAAE,EAAE;oBACpD,IAAI,MAAM,YAAY,uBAAc,EAAE,CAAC;wBACnC,OAAO,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,CAAA;oBACzF,CAAC;gBACL,CAAC,CAAA,CAAC,CAAA,CAAC;YACP,CAAC;YAED,mCAAmC;YACnC,MAAM,SAAS,GAAG,CAAC,cAAM,iBAAiB,CAAC,MAAM,EAAE,EAAkB,EAAE,CAAO,MAAM,EAAE,SAAS,EAAE,EAAE;gBAC/F,IAAI,MAAM,YAAY,uBAAc,EAAE,CAAC;oBACnC,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;gBACnF,CAAC;gBACD,OAAO,SAAS,CAAC;YACrB,CAAC,CAAA,CAAC,CAAA,CAAE,CAAC;YAEL,6DAA6D;YAC7D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACnB,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAG,YAAY,EAAE,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;gBAC5D,MAAM,OAAO,GAAG,cAAM,iBAAiB,CAAC,MAAM,EAAE,CAAC,EAAE,CAAO,MAAM,EAAE,EAAE,EAAE,EAAE,gDAAC,OAAA,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,CAAA,GAAA,CAAC,CAAA,CAAC;gBACzH,wEAAwE;gBACxE,oBAAM,IAAI,MAAM,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,CAAC;gBACjD,6DAA6D;gBAC5D,KAAa,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;YAC7B,CAAC;YAED,kDAAkD;YAClD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;gBACxB,MAAM,OAAO,GAAG,cAAM,iBAAiB,CAAC,MAAM,EAAE,CAAC,EAAE,CAAO,MAAM,EAAE,EAAE,EAAE,EAAE,gDAAC,OAAA,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,CAAA,GAAA,CAAC,CAAA,CAAC;gBACzH,IAAI,OAAO,EAAE,CAAC;oBACV,oBAAM,IAAI,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA,CAAC;gBACzC,CAAC;YACL,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,sEAAsE;YACtE,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;;gBACzD,KAAsB,eAAA,aAAA,cAAA,QAAQ,CAAA,cAAA,2FAAE,CAAC;oBAAX,wBAAQ;oBAAR,WAAQ;oBAAnB,MAAM,CAAC,KAAA,CAAA;oBACd,MAAM,OAAO,GAAG,cAAM,iBAAiB,CAAC,MAAM,EAAE,CAAC,EAAE,CAAO,MAAM,EAAE,EAAE,EAAE,EAAE,gDAAC,OAAA,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,CAAA,GAAA,CAAC,CAAA,CAAC;oBACzH,wEAAwE;oBACxE,oBAAM,IAAI,MAAM,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,CAAC;gBACrD,CAAC;;;;;;;;;QACL,CAAC;QAED,cAAM,mBAAmB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA,CAAC;IAC3C,CAAC;CAAA"}
|
package/dist/version.txt
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
8.69.0-20251207-
|
|
1
|
+
8.69.0-20251207-214914
|
package/package.json
CHANGED
package/src/cli/cli-utils.ts
CHANGED
|
@@ -391,9 +391,10 @@ export async function discoverFiles(projectRoot: string, verbose: boolean = fals
|
|
|
391
391
|
return files.filter(isAcceptedFile);
|
|
392
392
|
}
|
|
393
393
|
|
|
394
|
-
// Filter to accepted file types
|
|
394
|
+
// Filter to accepted file types that exist on disk
|
|
395
|
+
// (git ls-files returns deleted files that are still tracked)
|
|
395
396
|
for (const file of trackedFiles) {
|
|
396
|
-
if (!ignoredFiles.has(file) && isAcceptedFile(file)) {
|
|
397
|
+
if (!ignoredFiles.has(file) && isAcceptedFile(file) && fs.existsSync(file)) {
|
|
397
398
|
files.push(file);
|
|
398
399
|
}
|
|
399
400
|
}
|
package/src/cli/rewrite.ts
CHANGED
|
@@ -176,7 +176,7 @@ async function main() {
|
|
|
176
176
|
program
|
|
177
177
|
.name('rewrite')
|
|
178
178
|
.description('Run OpenRewrite recipes on your codebase')
|
|
179
|
-
.argument('<recipe>', 'Recipe to run in format "package:recipe" (e.g., "@openrewrite/recipes-nodejs:replace-deprecated-slice")')
|
|
179
|
+
.argument('<recipe>', 'Recipe to run in format "package:recipe" or "path:recipe" (e.g., "@openrewrite/recipes-nodejs:replace-deprecated-slice" or "./dist:my-recipe")')
|
|
180
180
|
.argument('[paths...]', 'Files or directories to process (defaults to project root)')
|
|
181
181
|
.option('--apply', 'Apply changes to files (default is dry-run showing diffs)', false)
|
|
182
182
|
.option('-l, --list', 'Only list paths of files that would be changed', false)
|
|
@@ -212,6 +212,7 @@ async function main() {
|
|
|
212
212
|
if (!recipeSpec) {
|
|
213
213
|
console.error(`Invalid recipe format: ${recipeArg}`);
|
|
214
214
|
console.error('Expected format: "package:recipe" (e.g., "@openrewrite/recipes-nodejs:replace-deprecated-slice")');
|
|
215
|
+
console.error('The package can also be a path to a local directory (e.g., "./dist:my-recipe" or "/path/to/recipes:my-recipe")');
|
|
215
216
|
console.error('Or use "builtin:recipe" for built-in recipes (e.g., "builtin:prefer-optional-chain")');
|
|
216
217
|
console.error('Or use "validate-parsing" to check for parse errors and idempotence.');
|
|
217
218
|
process.exit(1);
|
package/src/index.ts
CHANGED
|
@@ -35,22 +35,23 @@ export * from "./run";
|
|
|
35
35
|
|
|
36
36
|
// register all recipes in this package
|
|
37
37
|
export async function activate(registry: RecipeRegistry): Promise<void> {
|
|
38
|
-
const {OrderImports} = await import("./recipe/index.js");
|
|
39
38
|
const {ModernizeOctalEscapeSequences, ModernizeOctalLiterals, RemoveDuplicateObjectKeys} = await import("./javascript/migrate/es6/index.js");
|
|
40
39
|
const {ExportAssignmentToExportDefault} = await import("./javascript/migrate/typescript/index.js");
|
|
41
40
|
const {UseObjectPropertyShorthand, PreferOptionalChain, AddParseIntRadix} = await import("./javascript/cleanup/index.js");
|
|
42
|
-
const {UpgradeDependencyVersion} = await import("./javascript/recipes/index.js");
|
|
41
|
+
const {AsyncCallbackInSyncArrayMethod, UpgradeDependencyVersion, OrderImports, ChangeImport} = await import("./javascript/recipes/index.js");
|
|
43
42
|
const {FindDependency} = await import("./javascript/search/index.js");
|
|
44
43
|
|
|
45
44
|
registry.register(ExportAssignmentToExportDefault);
|
|
46
45
|
registry.register(FindDependency);
|
|
47
46
|
registry.register(OrderImports);
|
|
47
|
+
registry.register(ChangeImport);
|
|
48
48
|
registry.register(ModernizeOctalEscapeSequences);
|
|
49
49
|
registry.register(ModernizeOctalLiterals);
|
|
50
50
|
registry.register(RemoveDuplicateObjectKeys);
|
|
51
51
|
registry.register(UseObjectPropertyShorthand);
|
|
52
52
|
registry.register(PreferOptionalChain);
|
|
53
53
|
registry.register(AddParseIntRadix);
|
|
54
|
+
registry.register(AsyncCallbackInSyncArrayMethod);
|
|
54
55
|
registry.register(UpgradeDependencyVersion);
|
|
55
56
|
}
|
|
56
57
|
|
|
@@ -331,9 +331,12 @@ export class AddImport<P> extends JavaScriptVisitor<P> {
|
|
|
331
331
|
// Determine the appropriate import style
|
|
332
332
|
const importStyle = this.determineImportStyle(compilationUnit);
|
|
333
333
|
|
|
334
|
-
// For
|
|
334
|
+
// For named imports, check if we can merge into an existing import from the same module
|
|
335
|
+
// This handles both:
|
|
336
|
+
// - Case 1: Existing import has named bindings - merge into them
|
|
337
|
+
// - Case 2: Default import without named bindings - add named bindings
|
|
335
338
|
// Don't try to merge default imports (member === 'default'), side-effect imports, or namespace imports (member === '*')
|
|
336
|
-
if (!this.sideEffectOnly &&
|
|
339
|
+
if (!this.sideEffectOnly && this.member !== undefined && this.member !== 'default' && this.member !== '*') {
|
|
337
340
|
const mergedCu = await this.tryMergeIntoExistingImport(compilationUnit, p);
|
|
338
341
|
if (mergedCu !== compilationUnit) {
|
|
339
342
|
return mergedCu;
|
|
@@ -436,83 +439,136 @@ export class AddImport<P> extends JavaScriptVisitor<P> {
|
|
|
436
439
|
}
|
|
437
440
|
|
|
438
441
|
const importClause = jsImport.importClause;
|
|
439
|
-
if (!importClause
|
|
442
|
+
if (!importClause) {
|
|
440
443
|
continue;
|
|
441
444
|
}
|
|
442
445
|
|
|
443
|
-
//
|
|
444
|
-
if (importClause.namedBindings
|
|
445
|
-
|
|
446
|
-
|
|
446
|
+
// Case 1: Existing import has named bindings - merge into them
|
|
447
|
+
if (importClause.namedBindings) {
|
|
448
|
+
// Only merge into NamedImports, not namespace imports
|
|
449
|
+
if (importClause.namedBindings.kind !== JS.Kind.NamedImports) {
|
|
450
|
+
continue;
|
|
451
|
+
}
|
|
447
452
|
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
453
|
+
// We found a matching import with named bindings - merge into it
|
|
454
|
+
return this.produceJavaScript(compilationUnit, p, async draft => {
|
|
455
|
+
const namedImports = importClause.namedBindings as JS.NamedImports;
|
|
456
|
+
const existingElements = namedImports.elements.elements;
|
|
457
|
+
|
|
458
|
+
// Find the correct insertion position (alphabetical, case-insensitive)
|
|
459
|
+
const newName = (this.alias || this.member!).toLowerCase();
|
|
460
|
+
let insertIndex = existingElements.findIndex(elem => {
|
|
461
|
+
if (elem.element?.kind === JS.Kind.ImportSpecifier) {
|
|
462
|
+
const name = this.getImportAlias(elem.element) || this.getImportName(elem.element);
|
|
463
|
+
return newName.localeCompare(name.toLowerCase()) < 0;
|
|
464
|
+
}
|
|
465
|
+
return false;
|
|
466
|
+
});
|
|
467
|
+
if (insertIndex === -1) insertIndex = existingElements.length;
|
|
468
|
+
|
|
469
|
+
// Build the new elements array with proper spacing
|
|
470
|
+
const updatedNamedImports: JS.NamedImports = await this.produceJavaScript(
|
|
471
|
+
namedImports, p, async namedDraft => {
|
|
472
|
+
const lastIndex = existingElements.length - 1;
|
|
473
|
+
const trailingSpace = existingElements[lastIndex].after;
|
|
474
|
+
const newSpecifier = this.createImportSpecifier();
|
|
475
|
+
|
|
476
|
+
const newElements = existingElements.flatMap((elem, j) => {
|
|
477
|
+
const results: J.RightPadded<JS.ImportSpecifier>[] = [];
|
|
478
|
+
if (j === insertIndex) {
|
|
479
|
+
// Insert new element here; first element gets no prefix, others get space
|
|
480
|
+
const prefix = j === 0 ? emptySpace : singleSpace;
|
|
481
|
+
results.push(rightPadded({...newSpecifier, prefix}, emptySpace));
|
|
482
|
+
}
|
|
483
|
+
// Adjust existing element: first after insertion gets space prefix
|
|
484
|
+
let adjusted = elem;
|
|
485
|
+
if (j === 0 && insertIndex === 0 && elem.element) {
|
|
486
|
+
adjusted = {...elem, element: {...elem.element, prefix: singleSpace}};
|
|
487
|
+
}
|
|
488
|
+
// Last element before a new trailing element loses its trailing space
|
|
489
|
+
if (j === lastIndex && insertIndex > lastIndex) {
|
|
490
|
+
adjusted = {...adjusted, after: emptySpace};
|
|
491
|
+
}
|
|
492
|
+
results.push(adjusted);
|
|
493
|
+
return results;
|
|
494
|
+
});
|
|
495
|
+
|
|
496
|
+
// Append at end if inserting after all existing elements
|
|
497
|
+
if (insertIndex > lastIndex) {
|
|
498
|
+
newElements.push(rightPadded({...newSpecifier, prefix: singleSpace}, trailingSpace));
|
|
486
499
|
}
|
|
487
|
-
results.push(adjusted);
|
|
488
|
-
return results;
|
|
489
|
-
});
|
|
490
500
|
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
501
|
+
namedDraft.elements = {...namedImports.elements, elements: newElements};
|
|
502
|
+
}
|
|
503
|
+
);
|
|
504
|
+
|
|
505
|
+
// Update the import with the new named imports
|
|
506
|
+
const updatedImport: JS.Import = await this.produceJavaScript(
|
|
507
|
+
jsImport, p, async importDraft => {
|
|
508
|
+
importDraft.importClause = await this.produceJavaScript(
|
|
509
|
+
importClause, p, async clauseDraft => {
|
|
510
|
+
clauseDraft.namedBindings = updatedNamedImports;
|
|
511
|
+
}
|
|
512
|
+
);
|
|
494
513
|
}
|
|
514
|
+
);
|
|
495
515
|
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
516
|
+
// Replace the statement in the compilation unit
|
|
517
|
+
draft.statements = compilationUnit.statements.map((s, idx) =>
|
|
518
|
+
idx === i ? {...s, element: updatedImport} : s
|
|
519
|
+
);
|
|
520
|
+
});
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
// Case 2: Default import without named bindings - add named bindings
|
|
524
|
+
// Transform: import React from 'react' -> import React, { useState } from 'react'
|
|
525
|
+
if (importClause.name && !importClause.namedBindings) {
|
|
526
|
+
return this.produceJavaScript(compilationUnit, p, async draft => {
|
|
527
|
+
const newSpecifier = this.createImportSpecifier();
|
|
528
|
+
|
|
529
|
+
// Create new NamedImports with a single element
|
|
530
|
+
const namedImports: JS.NamedImports = {
|
|
531
|
+
id: randomId(),
|
|
532
|
+
kind: JS.Kind.NamedImports,
|
|
533
|
+
prefix: singleSpace,
|
|
534
|
+
markers: emptyMarkers,
|
|
535
|
+
elements: {
|
|
536
|
+
kind: J.Kind.Container,
|
|
537
|
+
before: emptySpace,
|
|
538
|
+
elements: [rightPadded(newSpecifier, emptySpace)],
|
|
539
|
+
markers: emptyMarkers
|
|
540
|
+
}
|
|
541
|
+
};
|
|
542
|
+
|
|
543
|
+
// Update the import clause to include named bindings
|
|
544
|
+
// Also update name.after to emptySpace since the comma goes right after the name
|
|
545
|
+
const updatedImport: JS.Import = await this.produceJavaScript(
|
|
546
|
+
jsImport, p, async importDraft => {
|
|
547
|
+
importDraft.importClause = await this.produceJavaScript(
|
|
548
|
+
importClause, p, async clauseDraft => {
|
|
549
|
+
// Remove space after default name (comma goes right after)
|
|
550
|
+
if (clauseDraft.name) {
|
|
551
|
+
clauseDraft.name = {...clauseDraft.name, after: emptySpace};
|
|
552
|
+
}
|
|
553
|
+
clauseDraft.namedBindings = namedImports;
|
|
554
|
+
}
|
|
555
|
+
);
|
|
556
|
+
// Ensure moduleSpecifier has proper space before 'from'
|
|
557
|
+
if (importDraft.moduleSpecifier) {
|
|
558
|
+
importDraft.moduleSpecifier = {
|
|
559
|
+
...importDraft.moduleSpecifier,
|
|
560
|
+
before: singleSpace
|
|
561
|
+
};
|
|
506
562
|
}
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
);
|
|
563
|
+
}
|
|
564
|
+
);
|
|
510
565
|
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
566
|
+
// Replace the statement in the compilation unit
|
|
567
|
+
draft.statements = compilationUnit.statements.map((s, idx) =>
|
|
568
|
+
idx === i ? {...s, element: updatedImport} : s
|
|
569
|
+
);
|
|
570
|
+
});
|
|
571
|
+
}
|
|
516
572
|
}
|
|
517
573
|
}
|
|
518
574
|
|
package/src/javascript/parser.ts
CHANGED
|
@@ -367,11 +367,14 @@ export class JavaScriptParserVisitor {
|
|
|
367
367
|
}
|
|
368
368
|
|
|
369
369
|
let shebangStatement: J.RightPadded<JS.Shebang> | undefined;
|
|
370
|
+
let shebangTrailingSpace: J.Space | undefined;
|
|
370
371
|
if (prefix.whitespace?.startsWith('#!')) {
|
|
371
372
|
const newlineIndex = prefix.whitespace.indexOf('\n');
|
|
372
373
|
const shebangText = newlineIndex === -1 ? prefix.whitespace : prefix.whitespace.slice(0, newlineIndex);
|
|
373
|
-
//
|
|
374
|
-
|
|
374
|
+
// Shebang's after only contains the newline that terminates the shebang line
|
|
375
|
+
// The remaining whitespace and comments go into the first statement's prefix
|
|
376
|
+
const afterShebangNewline = newlineIndex === -1 ? '' : '\n';
|
|
377
|
+
const remainingWhitespace = newlineIndex === -1 ? '' : prefix.whitespace.slice(newlineIndex + 1);
|
|
375
378
|
|
|
376
379
|
shebangStatement = this.rightPadded<JS.Shebang>({
|
|
377
380
|
kind: JS.Kind.Shebang,
|
|
@@ -379,14 +382,38 @@ export class JavaScriptParserVisitor {
|
|
|
379
382
|
prefix: emptySpace,
|
|
380
383
|
markers: emptyMarkers,
|
|
381
384
|
text: shebangText
|
|
382
|
-
}, {kind: J.Kind.Space, whitespace:
|
|
385
|
+
}, {kind: J.Kind.Space, whitespace: afterShebangNewline, comments: []}, emptyMarkers);
|
|
386
|
+
|
|
387
|
+
// Store the trailing whitespace and comments to prepend to first statement
|
|
388
|
+
if (remainingWhitespace || prefix.comments.length > 0) {
|
|
389
|
+
shebangTrailingSpace = {kind: J.Kind.Space, whitespace: remainingWhitespace, comments: prefix.comments};
|
|
390
|
+
}
|
|
383
391
|
|
|
384
392
|
// CU prefix should be empty when there's a shebang
|
|
385
393
|
prefix = produce(prefix, draft => {
|
|
386
394
|
draft.whitespace = '';
|
|
395
|
+
draft.comments = [];
|
|
387
396
|
});
|
|
388
397
|
}
|
|
389
398
|
|
|
399
|
+
let statements = this.semicolonPaddedStatementList(node.statements);
|
|
400
|
+
|
|
401
|
+
// If there's trailing whitespace/comments after the shebang, prepend to first statement's prefix
|
|
402
|
+
if (shebangTrailingSpace && statements.length > 0) {
|
|
403
|
+
const firstStmt = statements[0];
|
|
404
|
+
statements = [
|
|
405
|
+
produce(firstStmt, draft => {
|
|
406
|
+
const existingPrefix = draft.element.prefix;
|
|
407
|
+
draft.element.prefix = {
|
|
408
|
+
kind: J.Kind.Space,
|
|
409
|
+
whitespace: shebangTrailingSpace!.whitespace + existingPrefix.whitespace,
|
|
410
|
+
comments: [...shebangTrailingSpace!.comments, ...existingPrefix.comments]
|
|
411
|
+
};
|
|
412
|
+
}),
|
|
413
|
+
...statements.slice(1)
|
|
414
|
+
];
|
|
415
|
+
}
|
|
416
|
+
|
|
390
417
|
return {
|
|
391
418
|
kind: JS.Kind.CompilationUnit,
|
|
392
419
|
id: randomId(),
|
|
@@ -396,8 +423,8 @@ export class JavaScriptParserVisitor {
|
|
|
396
423
|
charsetName: bomAndTextEncoding.encoding,
|
|
397
424
|
charsetBomMarked: bomAndTextEncoding.hasBom,
|
|
398
425
|
statements: shebangStatement
|
|
399
|
-
? [shebangStatement, ...
|
|
400
|
-
:
|
|
426
|
+
? [shebangStatement, ...statements]
|
|
427
|
+
: statements,
|
|
401
428
|
eof: this.prefix(node.endOfFileToken)
|
|
402
429
|
};
|
|
403
430
|
}
|
|
@@ -3788,15 +3815,29 @@ export class JavaScriptParserVisitor {
|
|
|
3788
3815
|
}
|
|
3789
3816
|
|
|
3790
3817
|
visitJsxExpression(node: ts.JsxExpression): JSX.EmbeddedExpression {
|
|
3818
|
+
let expr: Expression;
|
|
3819
|
+
if (node.expression) {
|
|
3820
|
+
if (node.dotDotDotToken) {
|
|
3821
|
+
expr = produce(this.convert<Expression>(node.expression), draft => {
|
|
3822
|
+
draft.markers.markers.push({
|
|
3823
|
+
kind: JS.Markers.Spread,
|
|
3824
|
+
id: randomId(),
|
|
3825
|
+
prefix: this.prefix(node.dotDotDotToken!)
|
|
3826
|
+
} satisfies Spread as Spread);
|
|
3827
|
+
});
|
|
3828
|
+
} else {
|
|
3829
|
+
expr = this.convert<Expression>(node.expression);
|
|
3830
|
+
}
|
|
3831
|
+
} else {
|
|
3832
|
+
expr = this.newEmpty();
|
|
3833
|
+
}
|
|
3791
3834
|
return {
|
|
3792
3835
|
kind: JS.Kind.JsxEmbeddedExpression,
|
|
3793
3836
|
id: randomId(),
|
|
3794
3837
|
prefix: this.prefix(node),
|
|
3795
3838
|
markers: emptyMarkers,
|
|
3796
3839
|
expression: this.rightPadded(
|
|
3797
|
-
|
|
3798
|
-
this.convert<Expression>(node.expression) :
|
|
3799
|
-
this.newEmpty(),
|
|
3840
|
+
expr,
|
|
3800
3841
|
this.prefix(this.findChildNode(node, ts.SyntaxKind.CloseBraceToken)!)
|
|
3801
3842
|
)
|
|
3802
3843
|
};
|