@openrewrite/rewrite 8.62.4 → 8.62.6

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 (110) hide show
  1. package/dist/java/tree.d.ts +12 -6
  2. package/dist/java/tree.d.ts.map +1 -1
  3. package/dist/java/tree.js +12 -5
  4. package/dist/java/tree.js.map +1 -1
  5. package/dist/java/type.d.ts +2 -0
  6. package/dist/java/type.d.ts.map +1 -1
  7. package/dist/java/type.js +12 -0
  8. package/dist/java/type.js.map +1 -1
  9. package/dist/java/visitor.d.ts +8 -0
  10. package/dist/java/visitor.d.ts.map +1 -1
  11. package/dist/java/visitor.js +23 -1
  12. package/dist/java/visitor.js.map +1 -1
  13. package/dist/javascript/index.d.ts +3 -0
  14. package/dist/javascript/index.d.ts.map +1 -1
  15. package/dist/javascript/index.js +3 -0
  16. package/dist/javascript/index.js.map +1 -1
  17. package/dist/javascript/method-matcher.d.ts +16 -0
  18. package/dist/javascript/method-matcher.d.ts.map +1 -0
  19. package/dist/javascript/method-matcher.js +222 -0
  20. package/dist/javascript/method-matcher.js.map +1 -0
  21. package/dist/javascript/parser.js +1 -1
  22. package/dist/javascript/parser.js.map +1 -1
  23. package/dist/javascript/preconditions.d.ts +6 -0
  24. package/dist/javascript/preconditions.d.ts.map +1 -0
  25. package/dist/javascript/preconditions.js +58 -0
  26. package/dist/javascript/preconditions.js.map +1 -0
  27. package/dist/javascript/remove-import.d.ts +56 -0
  28. package/dist/javascript/remove-import.d.ts.map +1 -0
  29. package/dist/javascript/remove-import.js +715 -0
  30. package/dist/javascript/remove-import.js.map +1 -0
  31. package/dist/javascript/rpc.js +2 -2
  32. package/dist/javascript/rpc.js.map +1 -1
  33. package/dist/javascript/search/index.d.ts +3 -0
  34. package/dist/javascript/search/index.d.ts.map +1 -0
  35. package/dist/javascript/search/index.js +19 -0
  36. package/dist/javascript/search/index.js.map +1 -0
  37. package/dist/javascript/search/uses-method.d.ts +8 -0
  38. package/dist/javascript/search/uses-method.d.ts.map +1 -0
  39. package/dist/javascript/search/uses-method.js +35 -0
  40. package/dist/javascript/search/uses-method.js.map +1 -0
  41. package/dist/javascript/search/uses-type.d.ts +8 -0
  42. package/dist/javascript/search/uses-type.d.ts.map +1 -0
  43. package/dist/javascript/search/uses-type.js +71 -0
  44. package/dist/javascript/search/uses-type.js.map +1 -0
  45. package/dist/javascript/templating.d.ts +1 -1
  46. package/dist/javascript/templating.d.ts.map +1 -1
  47. package/dist/javascript/templating.js +1 -1
  48. package/dist/javascript/templating.js.map +1 -1
  49. package/dist/javascript/tree.d.ts +3 -3
  50. package/dist/javascript/tree.d.ts.map +1 -1
  51. package/dist/javascript/tree.js +28 -0
  52. package/dist/javascript/tree.js.map +1 -1
  53. package/dist/javascript/type-mapping.d.ts +4 -0
  54. package/dist/javascript/type-mapping.d.ts.map +1 -1
  55. package/dist/javascript/type-mapping.js +92 -46
  56. package/dist/javascript/type-mapping.js.map +1 -1
  57. package/dist/javascript/visitor.js +1 -1
  58. package/dist/javascript/visitor.js.map +1 -1
  59. package/dist/print.d.ts +1 -0
  60. package/dist/print.d.ts.map +1 -1
  61. package/dist/print.js +6 -0
  62. package/dist/print.js.map +1 -1
  63. package/dist/rpc/rewrite-rpc.d.ts +1 -1
  64. package/dist/rpc/rewrite-rpc.d.ts.map +1 -1
  65. package/dist/rpc/rewrite-rpc.js +0 -3
  66. package/dist/rpc/rewrite-rpc.js.map +1 -1
  67. package/dist/search/index.d.ts +2 -0
  68. package/dist/search/index.d.ts.map +1 -0
  69. package/dist/search/index.js +18 -0
  70. package/dist/search/index.js.map +1 -0
  71. package/dist/search/is-source-file.d.ts +8 -0
  72. package/dist/search/is-source-file.d.ts.map +1 -0
  73. package/dist/search/is-source-file.js +70 -0
  74. package/dist/search/is-source-file.js.map +1 -0
  75. package/dist/test/rewrite-test.d.ts.map +1 -1
  76. package/dist/test/rewrite-test.js +3 -0
  77. package/dist/test/rewrite-test.js.map +1 -1
  78. package/dist/util.d.ts +1 -0
  79. package/dist/util.d.ts.map +1 -1
  80. package/dist/util.js +13 -0
  81. package/dist/util.js.map +1 -1
  82. package/dist/version.txt +1 -1
  83. package/dist/visitor.d.ts +1 -1
  84. package/dist/visitor.d.ts.map +1 -1
  85. package/dist/visitor.js +3 -2
  86. package/dist/visitor.js.map +1 -1
  87. package/package.json +3 -1
  88. package/src/java/tree.ts +19 -11
  89. package/src/java/type.ts +14 -0
  90. package/src/java/visitor.ts +28 -8
  91. package/src/javascript/index.ts +4 -0
  92. package/src/javascript/method-matcher.ts +250 -0
  93. package/src/javascript/parser.ts +1 -1
  94. package/src/javascript/preconditions.ts +40 -0
  95. package/src/javascript/remove-import.ts +780 -0
  96. package/src/javascript/rpc.ts +2 -2
  97. package/src/javascript/search/index.ts +2 -0
  98. package/src/javascript/search/uses-method.ts +21 -0
  99. package/src/javascript/search/uses-type.ts +27 -0
  100. package/src/javascript/templating.ts +4 -3
  101. package/src/javascript/tree.ts +47 -3
  102. package/src/javascript/type-mapping.ts +113 -50
  103. package/src/javascript/visitor.ts +125 -125
  104. package/src/print.ts +9 -3
  105. package/src/rpc/rewrite-rpc.ts +1 -4
  106. package/src/search/index.ts +1 -0
  107. package/src/search/is-source-file.ts +26 -0
  108. package/src/test/rewrite-test.ts +4 -1
  109. package/src/util.ts +19 -4
  110. package/src/visitor.ts +3 -3
@@ -72,10 +72,10 @@ export class JavaScriptVisitor<P> extends JavaVisitor<P> {
72
72
 
73
73
  protected async visitAlias(alias: JS.Alias, p: P): Promise<J | undefined> {
74
74
  const expression = await this.visitExpression(alias, p);
75
- if (!expression?.kind || expression.kind !== JS.Kind.Alias) {
76
- return expression;
77
- }
78
- alias = expression as JS.Alias;
75
+ if (!expression?.kind || expression.kind !== JS.Kind.Alias) {
76
+ return expression;
77
+ }
78
+ alias = expression as JS.Alias;
79
79
 
80
80
  return this.produceJavaScript<JS.Alias>(alias, p, async draft => {
81
81
  draft.propertyName = await this.visitRightPadded(alias.propertyName, p);
@@ -85,10 +85,10 @@ export class JavaScriptVisitor<P> extends JavaVisitor<P> {
85
85
 
86
86
  protected async visitArrowFunction(arrowFunction: JS.ArrowFunction, p: P): Promise<J | undefined> {
87
87
  const expression = await this.visitExpression(arrowFunction, p);
88
- if (!expression?.kind || expression.kind !== JS.Kind.ArrowFunction) {
89
- return expression;
90
- }
91
- arrowFunction = expression as JS.ArrowFunction;
88
+ if (!expression?.kind || expression.kind !== JS.Kind.ArrowFunction) {
89
+ return expression;
90
+ }
91
+ arrowFunction = expression as JS.ArrowFunction;
92
92
 
93
93
  const statement = await this.visitStatement(arrowFunction, p);
94
94
  if (!statement?.kind || statement.kind !== JS.Kind.ArrowFunction) {
@@ -115,10 +115,10 @@ export class JavaScriptVisitor<P> extends JavaVisitor<P> {
115
115
 
116
116
  protected async visitAwait(await_: JS.Await, p: P): Promise<J | undefined> {
117
117
  const expression = await this.visitExpression(await_, p);
118
- if (!expression?.kind || expression.kind !== JS.Kind.Await) {
119
- return expression;
120
- }
121
- await_ = expression as JS.Await;
118
+ if (!expression?.kind || expression.kind !== JS.Kind.Await) {
119
+ return expression;
120
+ }
121
+ await_ = expression as JS.Await;
122
122
 
123
123
  return this.produceJavaScript<JS.Await>(await_, p, async draft => {
124
124
  draft.expression = await this.visitDefined<Expression>(await_.expression, p);
@@ -175,10 +175,10 @@ export class JavaScriptVisitor<P> extends JavaVisitor<P> {
175
175
 
176
176
  protected async visitConditionalType(conditionalType: JS.ConditionalType, p: P): Promise<J | undefined> {
177
177
  const expression = await this.visitExpression(conditionalType, p);
178
- if (!expression?.kind || expression.kind !== JS.Kind.ConditionalType) {
179
- return expression;
180
- }
181
- conditionalType = expression as JS.ConditionalType;
178
+ if (!expression?.kind || expression.kind !== JS.Kind.ConditionalType) {
179
+ return expression;
180
+ }
181
+ conditionalType = expression as JS.ConditionalType;
182
182
 
183
183
  return this.produceJavaScript<JS.ConditionalType>(conditionalType, p, async draft => {
184
184
  draft.checkType = await this.visitDefined<Expression>(conditionalType.checkType, p);
@@ -189,10 +189,10 @@ export class JavaScriptVisitor<P> extends JavaVisitor<P> {
189
189
 
190
190
  protected async visitDelete(delete_: JS.Delete, p: P): Promise<J | undefined> {
191
191
  const expression = await this.visitExpression(delete_, p);
192
- if (!expression?.kind || expression.kind !== JS.Kind.Delete) {
193
- return expression;
194
- }
195
- delete_ = expression as JS.Delete;
192
+ if (!expression?.kind || expression.kind !== JS.Kind.Delete) {
193
+ return expression;
194
+ }
195
+ delete_ = expression as JS.Delete;
196
196
 
197
197
  const statement = await this.visitStatement(delete_, p);
198
198
  if (!statement?.kind || statement.kind !== JS.Kind.Delete) {
@@ -207,10 +207,10 @@ export class JavaScriptVisitor<P> extends JavaVisitor<P> {
207
207
 
208
208
  protected async visitExpressionStatement(expressionStatement: JS.ExpressionStatement, p: P): Promise<J | undefined> {
209
209
  const expression = await this.visitExpression(expressionStatement, p);
210
- if (!expression?.kind || expression.kind !== JS.Kind.ExpressionStatement) {
211
- return expression;
212
- }
213
- expressionStatement = expression as JS.ExpressionStatement;
210
+ if (!expression?.kind || expression.kind !== JS.Kind.ExpressionStatement) {
211
+ return expression;
212
+ }
213
+ expressionStatement = expression as JS.ExpressionStatement;
214
214
 
215
215
  const statement = await this.visitStatement(expressionStatement, p);
216
216
  if (!statement?.kind || statement.kind !== JS.Kind.ExpressionStatement) {
@@ -225,10 +225,10 @@ export class JavaScriptVisitor<P> extends JavaVisitor<P> {
225
225
 
226
226
  protected async visitExpressionWithTypeArguments(expressionWithTypeArguments: JS.ExpressionWithTypeArguments, p: P): Promise<J | undefined> {
227
227
  const expression = await this.visitExpression(expressionWithTypeArguments, p);
228
- if (!expression?.kind || expression.kind !== JS.Kind.ExpressionWithTypeArguments) {
229
- return expression;
230
- }
231
- expressionWithTypeArguments = expression as JS.ExpressionWithTypeArguments;
228
+ if (!expression?.kind || expression.kind !== JS.Kind.ExpressionWithTypeArguments) {
229
+ return expression;
230
+ }
231
+ expressionWithTypeArguments = expression as JS.ExpressionWithTypeArguments;
232
232
 
233
233
  return this.produceJavaScript<JS.ExpressionWithTypeArguments>(expressionWithTypeArguments, p, async draft => {
234
234
  draft.clazz = await this.visitDefined<J>(expressionWithTypeArguments.clazz, p);
@@ -254,16 +254,16 @@ export class JavaScriptVisitor<P> extends JavaVisitor<P> {
254
254
  draft.function = await this.visitOptionalRightPadded(functionCall.function, p);
255
255
  draft.typeParameters = await this.visitOptionalContainer(functionCall.typeParameters, p);
256
256
  draft.arguments = await this.visitContainer(functionCall.arguments, p);
257
- draft.functionType = await this.visitType(functionCall.functionType, p) as Type.Method | undefined;
257
+ draft.methodType = await this.visitType(functionCall.methodType, p) as Type.Method | undefined;
258
258
  });
259
259
  }
260
260
 
261
261
  protected async visitFunctionType(functionType: JS.FunctionType, p: P): Promise<J | undefined> {
262
262
  const expression = await this.visitExpression(functionType, p);
263
- if (!expression?.kind || expression.kind !== JS.Kind.FunctionType) {
264
- return expression;
265
- }
266
- functionType = expression as JS.FunctionType;
263
+ if (!expression?.kind || expression.kind !== JS.Kind.FunctionType) {
264
+ return expression;
265
+ }
266
+ functionType = expression as JS.FunctionType;
267
267
 
268
268
  return this.produceJavaScript<JS.FunctionType>(functionType, p, async draft => {
269
269
  draft.constructorType = await this.visitLeftPadded(functionType.constructorType, p);
@@ -275,10 +275,10 @@ export class JavaScriptVisitor<P> extends JavaVisitor<P> {
275
275
 
276
276
  protected async visitInferType(inferType: JS.InferType, p: P): Promise<J | undefined> {
277
277
  const expression = await this.visitExpression(inferType, p);
278
- if (!expression?.kind || expression.kind !== JS.Kind.InferType) {
279
- return expression;
280
- }
281
- inferType = expression as JS.InferType;
278
+ if (!expression?.kind || expression.kind !== JS.Kind.InferType) {
279
+ return expression;
280
+ }
281
+ inferType = expression as JS.InferType;
282
282
 
283
283
  return this.produceJavaScript<JS.InferType>(inferType, p, async draft => {
284
284
  draft.typeParameter = await this.visitLeftPadded(inferType.typeParameter, p);
@@ -288,10 +288,10 @@ export class JavaScriptVisitor<P> extends JavaVisitor<P> {
288
288
 
289
289
  protected async visitImportType(importType: JS.ImportType, p: P): Promise<J | undefined> {
290
290
  const expression = await this.visitExpression(importType, p);
291
- if (!expression?.kind || expression.kind !== JS.Kind.ImportType) {
292
- return expression;
293
- }
294
- importType = expression as JS.ImportType;
291
+ if (!expression?.kind || expression.kind !== JS.Kind.ImportType) {
292
+ return expression;
293
+ }
294
+ importType = expression as JS.ImportType;
295
295
 
296
296
  return this.produceJavaScript<JS.ImportType>(importType, p, async draft => {
297
297
  draft.hasTypeof = await this.visitRightPadded(importType.hasTypeof, p);
@@ -327,10 +327,10 @@ export class JavaScriptVisitor<P> extends JavaVisitor<P> {
327
327
 
328
328
  protected async visitNamedImports(namedImports: JS.NamedImports, p: P): Promise<J | undefined> {
329
329
  const expression = await this.visitExpression(namedImports, p);
330
- if (!expression?.kind || expression.kind !== JS.Kind.NamedImports) {
331
- return expression;
332
- }
333
- namedImports = expression as JS.NamedImports;
330
+ if (!expression?.kind || expression.kind !== JS.Kind.NamedImports) {
331
+ return expression;
332
+ }
333
+ namedImports = expression as JS.NamedImports;
334
334
 
335
335
  return this.produceJavaScript<JS.NamedImports>(namedImports, p, async draft => {
336
336
  draft.elements = await this.visitContainer(namedImports.elements, p);
@@ -340,10 +340,10 @@ export class JavaScriptVisitor<P> extends JavaVisitor<P> {
340
340
 
341
341
  protected async visitImportSpecifier(importSpecifier: JS.ImportSpecifier, p: P): Promise<J | undefined> {
342
342
  const expression = await this.visitExpression(importSpecifier, p);
343
- if (!expression?.kind || expression.kind !== JS.Kind.ImportSpecifier) {
344
- return expression;
345
- }
346
- importSpecifier = expression as JS.ImportSpecifier;
343
+ if (!expression?.kind || expression.kind !== JS.Kind.ImportSpecifier) {
344
+ return expression;
345
+ }
346
+ importSpecifier = expression as JS.ImportSpecifier;
347
347
 
348
348
  return this.produceJavaScript<JS.ImportSpecifier>(importSpecifier, p, async draft => {
349
349
  draft.importType = await this.visitLeftPadded(importSpecifier.importType, p);
@@ -390,10 +390,10 @@ export class JavaScriptVisitor<P> extends JavaVisitor<P> {
390
390
 
391
391
  protected async visitLiteralType(literalType: JS.LiteralType, p: P): Promise<J | undefined> {
392
392
  const expression = await this.visitExpression(literalType, p);
393
- if (!expression?.kind || expression.kind !== JS.Kind.LiteralType) {
394
- return expression;
395
- }
396
- literalType = expression as JS.LiteralType;
393
+ if (!expression?.kind || expression.kind !== JS.Kind.LiteralType) {
394
+ return expression;
395
+ }
396
+ literalType = expression as JS.LiteralType;
397
397
 
398
398
  return this.produceJavaScript<JS.LiteralType>(literalType, p, async draft => {
399
399
  draft.literal = await this.visitDefined<Expression>(literalType.literal, p);
@@ -403,10 +403,10 @@ export class JavaScriptVisitor<P> extends JavaVisitor<P> {
403
403
 
404
404
  protected async visitMappedType(mappedType: JS.MappedType, p: P): Promise<J | undefined> {
405
405
  const expression = await this.visitExpression(mappedType, p);
406
- if (!expression?.kind || expression.kind !== JS.Kind.MappedType) {
407
- return expression;
408
- }
409
- mappedType = expression as JS.MappedType;
406
+ if (!expression?.kind || expression.kind !== JS.Kind.MappedType) {
407
+ return expression;
408
+ }
409
+ mappedType = expression as JS.MappedType;
410
410
 
411
411
  return this.produceJavaScript<JS.MappedType>(mappedType, p, async draft => {
412
412
  draft.prefixToken = mappedType.prefixToken && await this.visitLeftPadded(mappedType.prefixToken, p);
@@ -435,10 +435,10 @@ export class JavaScriptVisitor<P> extends JavaVisitor<P> {
435
435
 
436
436
  protected async visitObjectBindingPattern(objectBindingPattern: JS.ObjectBindingPattern, p: P): Promise<J | undefined> {
437
437
  const expression = await this.visitExpression(objectBindingPattern, p);
438
- if (!expression?.kind || expression.kind !== JS.Kind.ObjectBindingPattern) {
439
- return expression;
440
- }
441
- objectBindingPattern = expression as JS.ObjectBindingPattern;
438
+ if (!expression?.kind || expression.kind !== JS.Kind.ObjectBindingPattern) {
439
+ return expression;
440
+ }
441
+ objectBindingPattern = expression as JS.ObjectBindingPattern;
442
442
 
443
443
  return this.produceJavaScript<JS.ObjectBindingPattern>(objectBindingPattern, p, async draft => {
444
444
  draft.leadingAnnotations = await mapAsync(objectBindingPattern.leadingAnnotations, item => this.visitDefined<J.Annotation>(item, p));
@@ -464,10 +464,10 @@ export class JavaScriptVisitor<P> extends JavaVisitor<P> {
464
464
 
465
465
  protected async visitSatisfiesExpression(satisfiesExpression: JS.SatisfiesExpression, p: P): Promise<J | undefined> {
466
466
  const expression = await this.visitExpression(satisfiesExpression, p);
467
- if (!expression?.kind || expression.kind !== JS.Kind.SatisfiesExpression) {
468
- return expression;
469
- }
470
- satisfiesExpression = expression as JS.SatisfiesExpression;
467
+ if (!expression?.kind || expression.kind !== JS.Kind.SatisfiesExpression) {
468
+ return expression;
469
+ }
470
+ satisfiesExpression = expression as JS.SatisfiesExpression;
471
471
 
472
472
  return this.produceJavaScript<JS.SatisfiesExpression>(satisfiesExpression, p, async draft => {
473
473
  draft.expression = await this.visitDefined<J>(satisfiesExpression.expression, p);
@@ -491,10 +491,10 @@ export class JavaScriptVisitor<P> extends JavaVisitor<P> {
491
491
 
492
492
  protected async visitStatementExpression(statementExpression: JS.StatementExpression, p: P): Promise<J | undefined> {
493
493
  const expression = await this.visitExpression(statementExpression, p);
494
- if (!expression?.kind || expression.kind !== JS.Kind.StatementExpression) {
495
- return expression;
496
- }
497
- statementExpression = expression as JS.StatementExpression;
494
+ if (!expression?.kind || expression.kind !== JS.Kind.StatementExpression) {
495
+ return expression;
496
+ }
497
+ statementExpression = expression as JS.StatementExpression;
498
498
 
499
499
  const statement = await this.visitStatement(statementExpression, p);
500
500
  if (!statement?.kind || statement.kind !== JS.Kind.StatementExpression) {
@@ -509,10 +509,10 @@ export class JavaScriptVisitor<P> extends JavaVisitor<P> {
509
509
 
510
510
  protected async visitTaggedTemplateExpression(taggedTemplateExpression: JS.TaggedTemplateExpression, p: P): Promise<J | undefined> {
511
511
  const expression = await this.visitExpression(taggedTemplateExpression, p);
512
- if (!expression?.kind || expression.kind !== JS.Kind.TaggedTemplateExpression) {
513
- return expression;
514
- }
515
- taggedTemplateExpression = expression as JS.TaggedTemplateExpression;
512
+ if (!expression?.kind || expression.kind !== JS.Kind.TaggedTemplateExpression) {
513
+ return expression;
514
+ }
515
+ taggedTemplateExpression = expression as JS.TaggedTemplateExpression;
516
516
 
517
517
  const statement = await this.visitStatement(taggedTemplateExpression, p);
518
518
  if (!statement?.kind || statement.kind !== JS.Kind.TaggedTemplateExpression) {
@@ -530,10 +530,10 @@ export class JavaScriptVisitor<P> extends JavaVisitor<P> {
530
530
 
531
531
  protected async visitTemplateExpression(templateExpression: JS.TemplateExpression, p: P): Promise<J | undefined> {
532
532
  const expression = await this.visitExpression(templateExpression, p);
533
- if (!expression?.kind || expression.kind !== JS.Kind.TemplateExpression) {
534
- return expression;
535
- }
536
- templateExpression = expression as JS.TemplateExpression;
533
+ if (!expression?.kind || expression.kind !== JS.Kind.TemplateExpression) {
534
+ return expression;
535
+ }
536
+ templateExpression = expression as JS.TemplateExpression;
537
537
 
538
538
  const statement = await this.visitStatement(templateExpression, p);
539
539
  if (!statement?.kind || statement.kind !== JS.Kind.TemplateExpression) {
@@ -557,10 +557,10 @@ export class JavaScriptVisitor<P> extends JavaVisitor<P> {
557
557
 
558
558
  protected async visitTuple(tuple: JS.Tuple, p: P): Promise<J | undefined> {
559
559
  const expression = await this.visitExpression(tuple, p);
560
- if (!expression?.kind || expression.kind !== JS.Kind.Tuple) {
561
- return expression;
562
- }
563
- tuple = expression as JS.Tuple;
560
+ if (!expression?.kind || expression.kind !== JS.Kind.Tuple) {
561
+ return expression;
562
+ }
563
+ tuple = expression as JS.Tuple;
564
564
 
565
565
  return this.produceJavaScript<JS.Tuple>(tuple, p, async draft => {
566
566
  draft.elements = await this.visitContainer(tuple.elements, p);
@@ -586,10 +586,10 @@ export class JavaScriptVisitor<P> extends JavaVisitor<P> {
586
586
 
587
587
  protected async visitTypeOf(typeOf: JS.TypeOf, p: P): Promise<J | undefined> {
588
588
  const expression = await this.visitExpression(typeOf, p);
589
- if (!expression?.kind || expression.kind !== JS.Kind.TypeOf) {
590
- return expression;
591
- }
592
- typeOf = expression as JS.TypeOf;
589
+ if (!expression?.kind || expression.kind !== JS.Kind.TypeOf) {
590
+ return expression;
591
+ }
592
+ typeOf = expression as JS.TypeOf;
593
593
 
594
594
  return this.produceJavaScript<JS.TypeOf>(typeOf, p, async draft => {
595
595
  draft.expression = await this.visitDefined<Expression>(typeOf.expression, p);
@@ -599,10 +599,10 @@ export class JavaScriptVisitor<P> extends JavaVisitor<P> {
599
599
 
600
600
  protected async visitTypeTreeExpression(typeTreeExpression: JS.TypeTreeExpression, p: P): Promise<J | undefined> {
601
601
  const expression = await this.visitExpression(typeTreeExpression, p);
602
- if (!expression?.kind || expression.kind !== JS.Kind.TypeTreeExpression) {
603
- return expression;
604
- }
605
- typeTreeExpression = expression as JS.TypeTreeExpression;
602
+ if (!expression?.kind || expression.kind !== JS.Kind.TypeTreeExpression) {
603
+ return expression;
604
+ }
605
+ typeTreeExpression = expression as JS.TypeTreeExpression;
606
606
 
607
607
  return this.produceJavaScript<JS.TypeTreeExpression>(typeTreeExpression, p, async draft => {
608
608
  draft.expression = await this.visitDefined<Expression>(typeTreeExpression.expression, p);
@@ -620,10 +620,10 @@ export class JavaScriptVisitor<P> extends JavaVisitor<P> {
620
620
 
621
621
  protected async visitIndexedAccessType(indexedAccessType: JS.IndexedAccessType, p: P): Promise<J | undefined> {
622
622
  const expression = await this.visitExpression(indexedAccessType, p);
623
- if (!expression?.kind || expression.kind !== JS.Kind.IndexedAccessType) {
624
- return expression;
625
- }
626
- indexedAccessType = expression as JS.IndexedAccessType;
623
+ if (!expression?.kind || expression.kind !== JS.Kind.IndexedAccessType) {
624
+ return expression;
625
+ }
626
+ indexedAccessType = expression as JS.IndexedAccessType;
627
627
 
628
628
  return this.produceJavaScript<JS.IndexedAccessType>(indexedAccessType, p, async draft => {
629
629
  draft.objectType = await this.visitDefined<TypedTree>(indexedAccessType.objectType, p);
@@ -641,10 +641,10 @@ export class JavaScriptVisitor<P> extends JavaVisitor<P> {
641
641
 
642
642
  protected async visitTypeQuery(typeQuery: JS.TypeQuery, p: P): Promise<J | undefined> {
643
643
  const expression = await this.visitExpression(typeQuery, p);
644
- if (!expression?.kind || expression.kind !== JS.Kind.TypeQuery) {
645
- return expression;
646
- }
647
- typeQuery = expression as JS.TypeQuery;
644
+ if (!expression?.kind || expression.kind !== JS.Kind.TypeQuery) {
645
+ return expression;
646
+ }
647
+ typeQuery = expression as JS.TypeQuery;
648
648
 
649
649
  return this.produceJavaScript<JS.TypeQuery>(typeQuery, p, async draft => {
650
650
  draft.typeExpression = await this.visitDefined<TypedTree>(typeQuery.typeExpression, p);
@@ -655,10 +655,10 @@ export class JavaScriptVisitor<P> extends JavaVisitor<P> {
655
655
 
656
656
  protected async visitTypeInfo(typeInfo: JS.TypeInfo, p: P): Promise<J | undefined> {
657
657
  const expression = await this.visitExpression(typeInfo, p);
658
- if (!expression?.kind || expression.kind !== JS.Kind.TypeInfo) {
659
- return expression;
660
- }
661
- typeInfo = expression as JS.TypeInfo;
658
+ if (!expression?.kind || expression.kind !== JS.Kind.TypeInfo) {
659
+ return expression;
660
+ }
661
+ typeInfo = expression as JS.TypeInfo;
662
662
 
663
663
  return this.produceJavaScript<JS.TypeInfo>(typeInfo, p, async draft => {
664
664
  draft.typeIdentifier = await this.visitDefined<TypedTree>(typeInfo.typeIdentifier, p);
@@ -667,10 +667,10 @@ export class JavaScriptVisitor<P> extends JavaVisitor<P> {
667
667
 
668
668
  protected async visitComputedPropertyName(computedPropertyName: JS.ComputedPropertyName, p: P): Promise<J | undefined> {
669
669
  const expression = await this.visitExpression(computedPropertyName, p);
670
- if (!expression?.kind || expression.kind !== JS.Kind.ComputedPropertyName) {
671
- return expression;
672
- }
673
- computedPropertyName = expression as JS.ComputedPropertyName;
670
+ if (!expression?.kind || expression.kind !== JS.Kind.ComputedPropertyName) {
671
+ return expression;
672
+ }
673
+ computedPropertyName = expression as JS.ComputedPropertyName;
674
674
 
675
675
  return this.produceJavaScript<JS.ComputedPropertyName>(computedPropertyName, p, async draft => {
676
676
  draft.expression = await this.visitRightPadded(computedPropertyName.expression, p);
@@ -679,10 +679,10 @@ export class JavaScriptVisitor<P> extends JavaVisitor<P> {
679
679
 
680
680
  protected async visitTypeOperator(typeOperator: JS.TypeOperator, p: P): Promise<J | undefined> {
681
681
  const expression = await this.visitExpression(typeOperator, p);
682
- if (!expression?.kind || expression.kind !== JS.Kind.TypeOperator) {
683
- return expression;
684
- }
685
- typeOperator = expression as JS.TypeOperator;
682
+ if (!expression?.kind || expression.kind !== JS.Kind.TypeOperator) {
683
+ return expression;
684
+ }
685
+ typeOperator = expression as JS.TypeOperator;
686
686
 
687
687
  return this.produceJavaScript<JS.TypeOperator>(typeOperator, p, async draft => {
688
688
  draft.expression = await this.visitLeftPadded(typeOperator.expression, p);
@@ -691,10 +691,10 @@ export class JavaScriptVisitor<P> extends JavaVisitor<P> {
691
691
 
692
692
  protected async visitTypePredicate(typePredicate: JS.TypePredicate, p: P): Promise<J | undefined> {
693
693
  const expression = await this.visitExpression(typePredicate, p);
694
- if (!expression?.kind || expression.kind !== JS.Kind.TypePredicate) {
695
- return expression;
696
- }
697
- typePredicate = expression as JS.TypePredicate;
694
+ if (!expression?.kind || expression.kind !== JS.Kind.TypePredicate) {
695
+ return expression;
696
+ }
697
+ typePredicate = expression as JS.TypePredicate;
698
698
 
699
699
  return this.produceJavaScript<JS.TypePredicate>(typePredicate, p, async draft => {
700
700
  draft.asserts = await this.visitLeftPadded(typePredicate.asserts, p);
@@ -706,10 +706,10 @@ export class JavaScriptVisitor<P> extends JavaVisitor<P> {
706
706
 
707
707
  protected async visitUnion(union: JS.Union, p: P): Promise<J | undefined> {
708
708
  const expression = await this.visitExpression(union, p);
709
- if (!expression?.kind || expression.kind !== JS.Kind.Union) {
710
- return expression;
711
- }
712
- union = expression as JS.Union;
709
+ if (!expression?.kind || expression.kind !== JS.Kind.Union) {
710
+ return expression;
711
+ }
712
+ union = expression as JS.Union;
713
713
 
714
714
  return this.produceJavaScript<JS.Union>(union, p, async draft => {
715
715
  draft.types = await mapAsync(union.types, item => this.visitRightPadded(item, p));
@@ -719,10 +719,10 @@ export class JavaScriptVisitor<P> extends JavaVisitor<P> {
719
719
 
720
720
  protected async visitIntersection(intersection: JS.Intersection, p: P): Promise<J | undefined> {
721
721
  const expression = await this.visitExpression(intersection, p);
722
- if (!expression?.kind || expression.kind !== JS.Kind.Intersection) {
723
- return expression;
724
- }
725
- intersection = expression as JS.Intersection;
722
+ if (!expression?.kind || expression.kind !== JS.Kind.Intersection) {
723
+ return expression;
724
+ }
725
+ intersection = expression as JS.Intersection;
726
726
 
727
727
  return this.produceJavaScript<JS.Intersection>(intersection, p, async draft => {
728
728
  draft.types = await mapAsync(intersection.types, item => this.visitRightPadded(item, p));
@@ -732,10 +732,10 @@ export class JavaScriptVisitor<P> extends JavaVisitor<P> {
732
732
 
733
733
  protected async visitVoid(void_: JS.Void, p: P): Promise<J | undefined> {
734
734
  const expression = await this.visitExpression(void_, p);
735
- if (!expression?.kind || expression.kind !== JS.Kind.Void) {
736
- return expression;
737
- }
738
- void_ = expression as JS.Void;
735
+ if (!expression?.kind || expression.kind !== JS.Kind.Void) {
736
+ return expression;
737
+ }
738
+ void_ = expression as JS.Void;
739
739
 
740
740
  return this.produceJavaScript<JS.Void>(void_, p, async draft => {
741
741
  draft.expression = await this.visitDefined<Expression>(void_.expression, p);
package/src/print.ts CHANGED
@@ -16,6 +16,7 @@
16
16
  import {Marker, MarkersKind, SearchResult} from "./markers";
17
17
  import {Cursor, isSourceFile, SourceFile, Tree} from "./tree";
18
18
  import {TreeVisitor} from "./visitor";
19
+ import {trimIndent} from "./util";
19
20
 
20
21
  type CommentWrapper = (input: string) => string;
21
22
 
@@ -134,7 +135,8 @@ export class TreePrinters {
134
135
  const p = out || new PrintOutputCapture();
135
136
  await printer().visit(tree, p);
136
137
  return p.out;
137
- }})
138
+ }
139
+ })
138
140
  }
139
141
 
140
142
  /**
@@ -147,8 +149,8 @@ export class TreePrinters {
147
149
  const sourceFileKind = typeof target === 'string' ?
148
150
  target :
149
151
  (isSourceFile(target) ?
150
- target as SourceFile :
151
- target.firstEnclosing(isSourceFile)
152
+ target as SourceFile :
153
+ target.firstEnclosing(isSourceFile)
152
154
  )!.kind
153
155
 
154
156
  if (!this._registry.has(sourceFileKind)) {
@@ -160,6 +162,10 @@ export class TreePrinters {
160
162
  static print(sourceFile: SourceFile): Promise<string> {
161
163
  return this.printer(sourceFile).print(sourceFile);
162
164
  }
165
+
166
+ static async printTrimmed(sourceFile: SourceFile): Promise<string> {
167
+ return trimIndent(await this.print(sourceFile));
168
+ }
163
169
  }
164
170
 
165
171
  export function printer(target: Cursor | SourceFile | string): TreePrinter {
@@ -92,10 +92,7 @@ export class RewriteRpc {
92
92
  this._global = value;
93
93
  }
94
94
 
95
- static get(): RewriteRpc {
96
- if (!this._global) {
97
- throw new Error("RewriteRpc not initialized");
98
- }
95
+ static get(): RewriteRpc | undefined {
99
96
  return this._global;
100
97
  }
101
98
 
@@ -0,0 +1 @@
1
+ export * from './is-source-file'
@@ -0,0 +1,26 @@
1
+ import {TreeVisitor} from "../visitor";
2
+ import {ExecutionContext} from "../execution";
3
+ import {isSourceFile} from "../tree";
4
+ import {foundSearchResult} from "../markers";
5
+ import * as picomatch from "picomatch";
6
+
7
+ export class IsSourceFile extends TreeVisitor<any, ExecutionContext> {
8
+ private readonly matcher: picomatch.Matcher;
9
+
10
+ constructor(filePattern: string) {
11
+ super();
12
+ // Create a picomatch matcher for the pattern
13
+ this.matcher = picomatch.default ? picomatch.default(filePattern) : (picomatch as any)(filePattern);
14
+ }
15
+
16
+ protected async preVisit(tree: any, _: ExecutionContext): Promise<any> {
17
+ this.stopAfterPreVisit();
18
+ if (isSourceFile(tree) && tree.sourcePath) {
19
+ const path = tree.sourcePath.replace(/\\/g, '/'); // Normalize to Unix separators
20
+ if (this.matcher(path)) {
21
+ return foundSearchResult(tree);
22
+ }
23
+ }
24
+ return tree;
25
+ }
26
+ }
@@ -22,7 +22,7 @@ import {SourceFile} from "../tree";
22
22
  import dedent from "dedent";
23
23
  import {Result, scheduleRun} from "../run";
24
24
  import {SnowflakeId} from "@akashrajpurohit/snowflake-id";
25
- import {mapAsync} from "../util";
25
+ import {mapAsync, trimIndent} from "../util";
26
26
  import {ParseErrorKind} from "../parse-error";
27
27
  import {MarkersKind, ParseExceptionResult} from "../markers";
28
28
  import {JavaScriptVisitor} from "../javascript";
@@ -158,6 +158,9 @@ export class RecipeSpec {
158
158
  }
159
159
 
160
160
  private async expectAfter(spec: SourceSpec<any>, after?: SourceFile) {
161
+ if (!after) {
162
+ throw new Error('Expected for recipe to have produced a change for file:\n' + trimIndent(spec.before))
163
+ }
161
164
  expect(after).toBeDefined();
162
165
  await new ValidateWhitespaceVisitor().visit(after!, this.executionContext);
163
166
  const actualAfter = await TreePrinters.print(after!);
package/src/util.ts CHANGED
@@ -15,15 +15,15 @@
15
15
  */
16
16
  export async function mapAsync<T, U>(arr: T[], fn: (t: T, i: number) => Promise<U | undefined>): Promise<U[]> {
17
17
  let results: U[] | undefined = undefined;
18
-
18
+
19
19
  for (let i = 0; i < arr.length; i++) {
20
20
  const result = await fn(arr[i], i);
21
-
21
+
22
22
  if (result !== arr[i]) {
23
23
  if (results === undefined) {
24
24
  results = arr.slice(0, i) as unknown[] as U[];
25
25
  }
26
-
26
+
27
27
  if (result !== undefined) {
28
28
  results.push(result);
29
29
  }
@@ -31,6 +31,21 @@ export async function mapAsync<T, U>(arr: T[], fn: (t: T, i: number) => Promise<
31
31
  results.push(result);
32
32
  }
33
33
  }
34
-
34
+
35
35
  return results === undefined ? arr as unknown[] as U[] : results;
36
36
  }
37
+
38
+ export function trimIndent(str: string | null | undefined): string {
39
+ if (!str) {
40
+ return "";
41
+ }
42
+ const lines = str.split("\n");
43
+ const nonEmpty = lines.filter(l => l.trim().length > 0);
44
+ const minIndent = Math.min(
45
+ ...nonEmpty.map(l => l.match(/^(\s*)/)![0].length)
46
+ );
47
+ return lines
48
+ .map(l => l.slice(minIndent))
49
+ .join("\n")
50
+ .trim();
51
+ }
package/src/visitor.ts CHANGED
@@ -40,7 +40,7 @@ const stopAfterPreVisit = Symbol("STOP_AFTER_PRE_VISIT")
40
40
  export abstract class TreeVisitor<T extends Tree, P> {
41
41
  protected cursor: Cursor = rootCursor();
42
42
  private visitCount: number = 0;
43
- private afterVisit?: TreeVisitor<any, P>[];
43
+ public afterVisit: TreeVisitor<any, P>[] = [];
44
44
 
45
45
  async visitDefined<R extends T>(tree: Tree, p: P, parent?: Cursor): Promise<R> {
46
46
  return (await this.visit<R>(tree, p, parent))!;
@@ -80,14 +80,14 @@ export abstract class TreeVisitor<T extends Tree, P> {
80
80
 
81
81
  if (topLevel) {
82
82
  if (this.afterVisit) {
83
- for (const v of this.afterVisit) {
83
+ while (this.afterVisit.length > 0) {
84
+ const v = this.afterVisit.shift()!;
84
85
  v.cursor = this.cursor;
85
86
  if (t !== undefined) {
86
87
  t = await v.visit(t, p);
87
88
  }
88
89
  }
89
90
  }
90
- this.afterVisit = undefined;
91
91
  this.visitCount = 0;
92
92
  }
93
93
  } catch (e) {