@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.
Files changed (68) hide show
  1. package/dist/cli/cli-utils.d.ts.map +1 -1
  2. package/dist/cli/cli-utils.js +3 -2
  3. package/dist/cli/cli-utils.js.map +1 -1
  4. package/dist/cli/rewrite.js +2 -1
  5. package/dist/cli/rewrite.js.map +1 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +3 -2
  8. package/dist/index.js.map +1 -1
  9. package/dist/javascript/add-import.d.ts.map +1 -1
  10. package/dist/javascript/add-import.js +99 -56
  11. package/dist/javascript/add-import.js.map +1 -1
  12. package/dist/javascript/parser.d.ts.map +1 -1
  13. package/dist/javascript/parser.js +48 -8
  14. package/dist/javascript/parser.js.map +1 -1
  15. package/dist/javascript/recipes/async-callback-in-sync-array-method.d.ts +40 -0
  16. package/dist/javascript/recipes/async-callback-in-sync-array-method.d.ts.map +1 -0
  17. package/dist/javascript/recipes/async-callback-in-sync-array-method.js +232 -0
  18. package/dist/javascript/recipes/async-callback-in-sync-array-method.js.map +1 -0
  19. package/dist/javascript/recipes/change-import.d.ts +51 -0
  20. package/dist/javascript/recipes/change-import.d.ts.map +1 -0
  21. package/dist/javascript/recipes/change-import.js +658 -0
  22. package/dist/javascript/recipes/change-import.js.map +1 -0
  23. package/dist/javascript/recipes/index.d.ts +3 -0
  24. package/dist/javascript/recipes/index.d.ts.map +1 -1
  25. package/dist/javascript/recipes/index.js +3 -0
  26. package/dist/javascript/recipes/index.js.map +1 -1
  27. package/dist/javascript/recipes/order-imports.d.ts +10 -0
  28. package/dist/javascript/recipes/order-imports.d.ts.map +1 -0
  29. package/dist/javascript/recipes/order-imports.js +240 -0
  30. package/dist/javascript/recipes/order-imports.js.map +1 -0
  31. package/dist/javascript/templating/index.d.ts +1 -1
  32. package/dist/javascript/templating/index.d.ts.map +1 -1
  33. package/dist/javascript/templating/index.js +2 -1
  34. package/dist/javascript/templating/index.js.map +1 -1
  35. package/dist/javascript/templating/rewrite.d.ts +36 -2
  36. package/dist/javascript/templating/rewrite.d.ts.map +1 -1
  37. package/dist/javascript/templating/rewrite.js +76 -0
  38. package/dist/javascript/templating/rewrite.js.map +1 -1
  39. package/dist/json/parser.js +78 -30
  40. package/dist/json/parser.js.map +1 -1
  41. package/dist/run.d.ts.map +1 -1
  42. package/dist/run.js +7 -4
  43. package/dist/run.js.map +1 -1
  44. package/dist/version.txt +1 -1
  45. package/package.json +1 -1
  46. package/src/cli/cli-utils.ts +3 -2
  47. package/src/cli/rewrite.ts +2 -1
  48. package/src/index.ts +3 -2
  49. package/src/javascript/add-import.ts +125 -69
  50. package/src/javascript/parser.ts +49 -8
  51. package/src/javascript/recipes/async-callback-in-sync-array-method.ts +237 -0
  52. package/src/javascript/recipes/change-import.ts +700 -0
  53. package/src/javascript/recipes/index.ts +3 -0
  54. package/src/javascript/recipes/order-imports.ts +242 -0
  55. package/src/javascript/templating/index.ts +2 -1
  56. package/src/javascript/templating/rewrite.ts +89 -4
  57. package/src/json/parser.ts +69 -24
  58. package/src/run.ts +5 -4
  59. package/dist/recipe/index.d.ts +0 -2
  60. package/dist/recipe/index.d.ts.map +0 -1
  61. package/dist/recipe/index.js +0 -21
  62. package/dist/recipe/index.js.map +0 -1
  63. package/dist/recipe/order-imports.d.ts +0 -10
  64. package/dist/recipe/order-imports.d.ts.map +0 -1
  65. package/dist/recipe/order-imports.js +0 -213
  66. package/dist/recipe/order-imports.js.map +0 -1
  67. package/src/recipe/index.ts +0 -17
  68. package/src/recipe/order-imports.ts +0 -195
@@ -89,42 +89,78 @@ class ParseJsonReader extends parser_1.ParserSourceReader {
89
89
  };
90
90
  if (Array.isArray(parsed)) {
91
91
  this.cursor++; // skip '['
92
- const values = parsed.map((p, i) => {
93
- const element = this.json(p);
92
+ let values;
93
+ if (parsed.length === 0) {
94
+ // Empty array - capture whitespace in an Empty element
94
95
  const afterWhitespace = this.whitespace();
95
- // Check if there's a comma after this element
96
- const hasComma = this.source[this.cursor] === ',';
97
- if (hasComma) {
98
- this.cursor++; // skip ','
99
- }
100
- return {
101
- kind: tree_1.Json.Kind.RightPadded,
102
- element,
103
- after: (0, tree_1.space)(afterWhitespace),
104
- markers: markers_1.emptyMarkers
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
- const members = keys.map((key, i) => {
114
- const element = this.member(parsed, key);
131
+ let members;
132
+ if (keys.length === 0) {
133
+ // Empty object - capture whitespace in an Empty element
115
134
  const afterWhitespace = this.whitespace();
116
- // Check if there's a comma after this element
117
- const hasComma = this.source[this.cursor] === ',';
118
- if (hasComma) {
119
- this.cursor++; // skip ','
120
- }
121
- return {
122
- kind: tree_1.Json.Kind.RightPadded,
123
- element,
124
- after: (0, tree_1.space)(afterWhitespace),
125
- markers: markers_1.emptyMarkers
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
- this.cursor += parsed.toString().length;
153
- return Object.assign(Object.assign({ kind: tree_1.Json.Kind.Literal }, base), { source: parsed.toString(), value: parsed });
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";
@@ -1 +1 @@
1
- {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/json/parser.ts"],"names":[],"mappings":"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"}
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;AAsBD,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,CAqEzC"}
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
- return recipe instanceof recipe_1.ScanningRecipe || (yield recipe.recipeList()).some(hasScanningRecipe);
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":"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"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"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"}
package/dist/version.txt CHANGED
@@ -1 +1 @@
1
- 8.69.0-20251207-160255
1
+ 8.69.0-20251207-214914
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openrewrite/rewrite",
3
- "version": "8.69.0-20251207-160255",
3
+ "version": "8.69.0-20251207-214914",
4
4
  "license": "Moderne Source Available License",
5
5
  "description": "OpenRewrite JavaScript.",
6
6
  "homepage": "https://github.com/openrewrite/rewrite",
@@ -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
  }
@@ -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 ES6 named imports, check if we can merge into an existing import from the same module
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 && importStyle === ImportStyle.ES6Named && this.member !== undefined && this.member !== 'default' && this.member !== '*') {
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 || !importClause.namedBindings) {
442
+ if (!importClause) {
440
443
  continue;
441
444
  }
442
445
 
443
- // Only merge into NamedImports, not namespace imports
444
- if (importClause.namedBindings.kind !== JS.Kind.NamedImports) {
445
- continue;
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
- // We found a matching import with named bindings - merge into it
449
- return this.produceJavaScript(compilationUnit, p, async draft => {
450
- const namedImports = importClause.namedBindings as JS.NamedImports;
451
- const existingElements = namedImports.elements.elements;
452
-
453
- // Find the correct insertion position (alphabetical, case-insensitive)
454
- const newName = (this.alias || this.member!).toLowerCase();
455
- let insertIndex = existingElements.findIndex(elem => {
456
- if (elem.element?.kind === JS.Kind.ImportSpecifier) {
457
- const name = this.getImportAlias(elem.element) || this.getImportName(elem.element);
458
- return newName.localeCompare(name.toLowerCase()) < 0;
459
- }
460
- return false;
461
- });
462
- if (insertIndex === -1) insertIndex = existingElements.length;
463
-
464
- // Build the new elements array with proper spacing
465
- const updatedNamedImports: JS.NamedImports = await this.produceJavaScript(
466
- namedImports, p, async namedDraft => {
467
- const lastIndex = existingElements.length - 1;
468
- const trailingSpace = existingElements[lastIndex].after;
469
- const newSpecifier = this.createImportSpecifier();
470
-
471
- const newElements = existingElements.flatMap((elem, j) => {
472
- const results: J.RightPadded<JS.ImportSpecifier>[] = [];
473
- if (j === insertIndex) {
474
- // Insert new element here; first element gets no prefix, others get space
475
- const prefix = j === 0 ? emptySpace : singleSpace;
476
- results.push(rightPadded({...newSpecifier, prefix}, emptySpace));
477
- }
478
- // Adjust existing element: first after insertion gets space prefix
479
- let adjusted = elem;
480
- if (j === 0 && insertIndex === 0 && elem.element) {
481
- adjusted = {...elem, element: {...elem.element, prefix: singleSpace}};
482
- }
483
- // Last element before a new trailing element loses its trailing space
484
- if (j === lastIndex && insertIndex > lastIndex) {
485
- adjusted = {...adjusted, after: emptySpace};
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
- // Append at end if inserting after all existing elements
492
- if (insertIndex > lastIndex) {
493
- newElements.push(rightPadded({...newSpecifier, prefix: singleSpace}, trailingSpace));
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
- namedDraft.elements = {...namedImports.elements, elements: newElements};
497
- }
498
- );
499
-
500
- // Update the import with the new named imports
501
- const updatedImport: JS.Import = await this.produceJavaScript(
502
- jsImport, p, async importDraft => {
503
- importDraft.importClause = await this.produceJavaScript(
504
- importClause, p, async clauseDraft => {
505
- clauseDraft.namedBindings = updatedNamedImports;
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
- // Replace the statement in the compilation unit
512
- draft.statements = compilationUnit.statements.map((s, idx) =>
513
- idx === i ? {...s, element: updatedImport} : s
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
 
@@ -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
- // Include all whitespace after shebang (including blank lines) in the shebang's after space
374
- const afterShebang = newlineIndex === -1 ? '' : prefix.whitespace.slice(newlineIndex);
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: afterShebang, comments: []}, emptyMarkers);
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, ...this.semicolonPaddedStatementList(node.statements)]
400
- : this.semicolonPaddedStatementList(node.statements),
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
- node.expression ?
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
  };