@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
@@ -1,213 +0,0 @@
1
- "use strict";
2
- /*
3
- * Copyright 2025 the original author or authors.
4
- * <p>
5
- * Licensed under the Moderne Source Available License (the "License");
6
- * you may not use this file except in compliance with the License.
7
- * You may obtain a copy of the License at
8
- * <p>
9
- * https://docs.moderne.io/licensing/moderne-source-available-license
10
- * <p>
11
- * Unless required by applicable law or agreed to in writing, software
12
- * distributed under the License is distributed on an "AS IS" BASIS,
13
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- * See the License for the specific language governing permissions and
15
- * limitations under the License.
16
- */
17
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
18
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
19
- return new (P || (P = Promise))(function (resolve, reject) {
20
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
21
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
22
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
23
- step((generator = generator.apply(thisArg, _arguments || [])).next());
24
- });
25
- };
26
- Object.defineProperty(exports, "__esModule", { value: true });
27
- exports.OrderImports = void 0;
28
- const recipe_1 = require("../recipe");
29
- const visitor_1 = require("../visitor");
30
- const javascript_1 = require("../javascript");
31
- const java_1 = require("../java");
32
- const immer_1 = require("immer");
33
- const format_1 = require("../javascript/format");
34
- class OrderImports extends recipe_1.Recipe {
35
- constructor() {
36
- super(...arguments);
37
- this.name = "org.openrewrite.OrderImports";
38
- this.displayName = "Order imports";
39
- this.description = "Sort top-level imports alphabetically within groups: no qualifier, asterisk, multiple, single.";
40
- }
41
- editor() {
42
- return __awaiter(this, void 0, void 0, function* () {
43
- return new class extends javascript_1.JavaScriptVisitor {
44
- visitJsCompilationUnit(cu, p) {
45
- return __awaiter(this, void 0, void 0, function* () {
46
- const importCount = this.countImports(cu);
47
- const imports = cu.statements.slice(0, importCount);
48
- const originalImportPosition = Object.fromEntries(imports.map((item, i) => [item.element.id, i]));
49
- const restStatements = cu.statements.slice(importCount);
50
- const sortedImports = yield this.sortNamesWithinEachLine(imports);
51
- sortedImports.sort((aPadded, bPadded) => {
52
- const a = aPadded.element;
53
- const b = bPadded.element;
54
- const noSpecifier = (a.importClause == undefined ? 1 : 0) - (b.importClause == undefined ? 1 : 0);
55
- if (noSpecifier != 0) {
56
- return -noSpecifier;
57
- }
58
- const asterisk = this.isAsteriskImport(a) - this.isAsteriskImport(b);
59
- if (asterisk != 0) {
60
- return -asterisk;
61
- }
62
- const multipleImport = this.isMultipleImport(a) - this.isMultipleImport(b);
63
- if (multipleImport != 0) {
64
- return -multipleImport;
65
- }
66
- const comparedSpecifiers = this.compareStringArrays(this.extractImportSpecifierNames(a), this.extractImportSpecifierNames(b));
67
- if (comparedSpecifiers != 0) {
68
- return comparedSpecifiers;
69
- }
70
- // Tiebreaker, keep the sort stable
71
- return originalImportPosition[aPadded.element.id] - originalImportPosition[bPadded.element.id];
72
- });
73
- const cuWithImportsSorted = yield (0, visitor_1.produceAsync)(cu, (draft) => __awaiter(this, void 0, void 0, function* () {
74
- draft.statements = [...sortedImports, ...restStatements];
75
- }));
76
- return (0, immer_1.produce)(cuWithImportsSorted, draft => {
77
- for (let i = 0; i < importCount; i++) {
78
- draft.statements[i].element.prefix.whitespace = i > 0 ? "\n" : "";
79
- }
80
- // TODO deal with comments in the whitespace around imports
81
- });
82
- });
83
- }
84
- isAsteriskImport(import_) {
85
- if (import_.importClause != undefined) {
86
- if (import_.importClause.namedBindings != undefined) {
87
- if (import_.importClause.namedBindings.kind == javascript_1.JS.Kind.Alias) {
88
- return import_.importClause.namedBindings.propertyName.element.simpleName == "*" ? 1 : 0;
89
- }
90
- }
91
- }
92
- return 0;
93
- }
94
- isMultipleImport(import_) {
95
- if (import_.importClause != undefined) {
96
- if (import_.importClause.namedBindings != undefined) {
97
- if (import_.importClause.namedBindings.kind == javascript_1.JS.Kind.NamedImports) {
98
- const namedImports = import_.importClause.namedBindings;
99
- if (namedImports.elements.kind == java_1.J.Kind.Container) {
100
- return namedImports.elements.elements.length > 1 ? 1 : 0;
101
- }
102
- }
103
- }
104
- }
105
- return 0;
106
- }
107
- extractImportSpecifierNames(import_) {
108
- const names = [];
109
- if (import_.importClause != undefined) {
110
- if (import_.importClause.namedBindings != undefined) {
111
- if (import_.importClause.namedBindings.kind == javascript_1.JS.Kind.NamedImports) {
112
- const namedImports = import_.importClause.namedBindings;
113
- if (namedImports.elements.kind == java_1.J.Kind.Container) {
114
- const elements = namedImports.elements.elements;
115
- for (let i = 0; i < elements.length; i++) {
116
- const importSpecifier = elements[i].element;
117
- if (importSpecifier.specifier.kind == java_1.J.Kind.Identifier) {
118
- names.push(importSpecifier.specifier.simpleName);
119
- }
120
- else if (importSpecifier.specifier.kind == javascript_1.JS.Kind.Alias) {
121
- names.push(importSpecifier.specifier.propertyName.element.simpleName);
122
- }
123
- else {
124
- throw new Error("Unknown kind " + elements[i].kind);
125
- }
126
- }
127
- }
128
- }
129
- else if (import_.importClause.namedBindings.kind == javascript_1.JS.Kind.Alias) {
130
- const alias = import_.importClause.namedBindings;
131
- names.push(alias.propertyName.element.simpleName);
132
- if (alias.alias.kind == java_1.J.Kind.Identifier) {
133
- names.push(alias.alias.simpleName);
134
- }
135
- }
136
- }
137
- }
138
- return names;
139
- }
140
- compareStringArrays(a, b) {
141
- let i = 0;
142
- while (i < a.length && i < b.length) {
143
- const comparison = a[i].localeCompare(b[i]);
144
- if (comparison !== 0) {
145
- return comparison;
146
- }
147
- i++;
148
- }
149
- if (i < a.length) {
150
- return 1;
151
- }
152
- else if (i < b.length) {
153
- return -1;
154
- }
155
- return 0;
156
- }
157
- countImports(cu) {
158
- let i = 0;
159
- while ((i < cu.statements.length) && (cu.statements[i].element.kind === javascript_1.JS.Kind.Import)) {
160
- i++;
161
- }
162
- return i;
163
- }
164
- sortNamesWithinEachLine(imports) {
165
- return __awaiter(this, void 0, void 0, function* () {
166
- const ret = [];
167
- for (const importPadded of imports) {
168
- const import_ = importPadded.element;
169
- if (this.isMultipleImport(import_) == 1) {
170
- const importSorted = (0, immer_1.produce)(import_, draft => {
171
- var _a;
172
- let elements = draft.importClause.namedBindings.elements.elements;
173
- const trailingComma = elements.length > 0 && ((_a = elements[elements.length - 1].markers) === null || _a === void 0 ? void 0 : _a.markers.find(m => m.kind === java_1.J.Markers.TrailingComma));
174
- if (trailingComma) {
175
- elements[elements.length - 1].markers.markers = elements[elements.length - 1].markers.markers.filter(m => m.kind !== java_1.J.Markers.TrailingComma);
176
- }
177
- elements.sort((a, b) => {
178
- const namesExtracted = [a.element, b.element].map(expr => {
179
- const is = expr;
180
- if (is.specifier.kind == javascript_1.JS.Kind.Alias) {
181
- return is.specifier.propertyName.element.simpleName;
182
- }
183
- else if (is.specifier.kind == java_1.J.Kind.Identifier) {
184
- return is.specifier.simpleName;
185
- }
186
- else {
187
- throw new Error("Unsupported kind " + expr.kind);
188
- }
189
- });
190
- return namesExtracted[0].localeCompare(namesExtracted[1]);
191
- });
192
- if (trailingComma && elements.length > 0 && !elements[elements.length - 1].markers.markers.find(m => m.kind === java_1.J.Markers.TrailingComma)) {
193
- elements[elements.length - 1].markers.markers.push(trailingComma);
194
- }
195
- });
196
- const formatted = yield new format_1.AutoformatVisitor().visit(importSorted, {});
197
- ret.push((0, immer_1.produce)(importPadded, draft => {
198
- draft.element = formatted;
199
- }));
200
- }
201
- else {
202
- ret.push(importPadded);
203
- }
204
- }
205
- return ret;
206
- });
207
- }
208
- };
209
- });
210
- }
211
- }
212
- exports.OrderImports = OrderImports;
213
- //# sourceMappingURL=order-imports.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"order-imports.js","sourceRoot":"","sources":["../../src/recipe/order-imports.ts"],"names":[],"mappings":"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"}
@@ -1,17 +0,0 @@
1
- /*
2
- * Copyright 2025 the original author or authors.
3
- * <p>
4
- * Licensed under the Moderne Source Available License (the "License");
5
- * you may not use this file except in compliance with the License.
6
- * You may obtain a copy of the License at
7
- * <p>
8
- * https://docs.moderne.io/licensing/moderne-source-available-license
9
- * <p>
10
- * Unless required by applicable law or agreed to in writing, software
11
- * distributed under the License is distributed on an "AS IS" BASIS,
12
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- * See the License for the specific language governing permissions and
14
- * limitations under the License.
15
- */
16
-
17
- export {OrderImports} from "./order-imports";
@@ -1,195 +0,0 @@
1
- /*
2
- * Copyright 2025 the original author or authors.
3
- * <p>
4
- * Licensed under the Moderne Source Available License (the "License");
5
- * you may not use this file except in compliance with the License.
6
- * You may obtain a copy of the License at
7
- * <p>
8
- * https://docs.moderne.io/licensing/moderne-source-available-license
9
- * <p>
10
- * Unless required by applicable law or agreed to in writing, software
11
- * distributed under the License is distributed on an "AS IS" BASIS,
12
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- * See the License for the specific language governing permissions and
14
- * limitations under the License.
15
- */
16
-
17
- import {Recipe} from "../recipe";
18
- import {produceAsync, TreeVisitor} from "../visitor";
19
- import {ExecutionContext} from "../execution";
20
- import {JavaScriptVisitor, JS} from "../javascript";
21
- import {J} from "../java";
22
- import {Draft, produce} from "immer";
23
- import {AutoformatVisitor} from "../javascript/format";
24
-
25
- export class OrderImports extends Recipe {
26
- name = "org.openrewrite.OrderImports";
27
- displayName = "Order imports";
28
- description = "Sort top-level imports alphabetically within groups: no qualifier, asterisk, multiple, single.";
29
-
30
-
31
- async editor(): Promise<TreeVisitor<any, ExecutionContext>> {
32
- return new class extends JavaScriptVisitor<ExecutionContext> {
33
-
34
- protected async visitJsCompilationUnit(cu: JS.CompilationUnit, p: ExecutionContext): Promise<J | undefined> {
35
- const importCount = this.countImports(cu);
36
- const imports = cu.statements.slice(0, importCount) as J.RightPadded<JS.Import>[];
37
- const originalImportPosition = Object.fromEntries(imports.map((item, i) => [item.element.id, i]));
38
- const restStatements = cu.statements.slice(importCount);
39
- const sortedImports = await this.sortNamesWithinEachLine(imports);
40
- sortedImports.sort((aPadded, bPadded) => {
41
- const a = aPadded.element;
42
- const b = bPadded.element;
43
-
44
- const noSpecifier = (a.importClause == undefined ? 1 : 0) - (b.importClause == undefined ? 1 : 0);
45
- if (noSpecifier != 0) {
46
- return -noSpecifier;
47
- }
48
- const asterisk = this.isAsteriskImport(a) - this.isAsteriskImport(b);
49
- if (asterisk != 0) {
50
- return -asterisk;
51
- }
52
- const multipleImport = this.isMultipleImport(a) - this.isMultipleImport(b);
53
- if (multipleImport != 0) {
54
- return -multipleImport;
55
- }
56
- const comparedSpecifiers = this.compareStringArrays(this.extractImportSpecifierNames(a), this.extractImportSpecifierNames(b));
57
- if (comparedSpecifiers != 0) {
58
- return comparedSpecifiers;
59
- }
60
- // Tiebreaker, keep the sort stable
61
- return originalImportPosition[aPadded.element.id] - originalImportPosition[bPadded.element.id];
62
- });
63
- const cuWithImportsSorted = await produceAsync(cu, async draft => {
64
- draft.statements = [...sortedImports, ...restStatements];
65
- });
66
- return produce(cuWithImportsSorted!, draft => {
67
- for (let i = 0; i < importCount; i++) {
68
- draft.statements[i].element.prefix.whitespace = i > 0 ? "\n" : "";
69
- }
70
- // TODO deal with comments in the whitespace around imports
71
- });
72
- }
73
-
74
- private isAsteriskImport(import_: JS.Import): 0 | 1 {
75
- if (import_.importClause != undefined) {
76
- if (import_.importClause.namedBindings != undefined) {
77
- if (import_.importClause.namedBindings.kind == JS.Kind.Alias) {
78
- return (import_.importClause.namedBindings as JS.Alias).propertyName.element.simpleName == "*" ? 1 : 0;
79
- }
80
- }
81
- }
82
- return 0;
83
- }
84
-
85
- private isMultipleImport(import_: JS.Import): 0 | 1 {
86
- if (import_.importClause != undefined) {
87
- if (import_.importClause.namedBindings != undefined) {
88
- if (import_.importClause.namedBindings.kind == JS.Kind.NamedImports) {
89
- const namedImports = import_.importClause.namedBindings as JS.NamedImports;
90
- if (namedImports.elements.kind == J.Kind.Container) {
91
- return namedImports.elements.elements.length > 1 ? 1 : 0;
92
- }
93
- }
94
- }
95
- }
96
- return 0;
97
- }
98
-
99
- private extractImportSpecifierNames(import_: JS.Import): string[] {
100
- const names: string[] = [];
101
- if (import_.importClause != undefined) {
102
- if (import_.importClause.namedBindings != undefined) {
103
- if (import_.importClause.namedBindings.kind == JS.Kind.NamedImports) {
104
- const namedImports = import_.importClause.namedBindings as JS.NamedImports;
105
- if (namedImports.elements.kind == J.Kind.Container) {
106
- const elements = namedImports.elements.elements;
107
- for (let i = 0; i < elements.length; i++) {
108
- const importSpecifier = elements[i].element as JS.ImportSpecifier;
109
- if (importSpecifier.specifier.kind == J.Kind.Identifier) {
110
- names.push((importSpecifier.specifier as J.Identifier).simpleName);
111
- } else if (importSpecifier.specifier.kind == JS.Kind.Alias) {
112
- names.push((importSpecifier.specifier as JS.Alias).propertyName.element.simpleName);
113
- } else {
114
- throw new Error("Unknown kind " + elements[i].kind);
115
- }
116
- }
117
- }
118
- } else if (import_.importClause.namedBindings.kind == JS.Kind.Alias) {
119
- const alias = import_.importClause.namedBindings as JS.Alias;
120
- names.push(alias.propertyName.element.simpleName);
121
- if (alias.alias.kind == J.Kind.Identifier) {
122
- names.push((alias.alias as J.Identifier).simpleName)
123
- }
124
- }
125
- }
126
- }
127
- return names;
128
- }
129
-
130
- private compareStringArrays(a: string[], b: string[]): number {
131
- let i = 0;
132
- while (i < a.length && i < b.length) {
133
- const comparison = a[i].localeCompare(b[i]);
134
- if (comparison !== 0) {
135
- return comparison;
136
- }
137
- i++;
138
- }
139
- if (i < a.length) {
140
- return 1;
141
- } else if (i < b.length) {
142
- return -1;
143
- }
144
- return 0;
145
- }
146
-
147
- private countImports(cu: JS.CompilationUnit): number {
148
- let i = 0;
149
- while ((i < cu.statements.length) && (cu.statements[i].element.kind === JS.Kind.Import)) {
150
- i++;
151
- }
152
- return i;
153
- }
154
-
155
- private async sortNamesWithinEachLine(imports: J.RightPadded<JS.Import>[]): Promise<J.RightPadded<JS.Import>[]> {
156
- const ret = [];
157
- for (const importPadded of imports) {
158
- const import_ = importPadded.element;
159
- if (this.isMultipleImport(import_) == 1) {
160
- const importSorted = produce(import_, draft => {
161
- let elements = (draft.importClause!.namedBindings as Draft<JS.NamedImports>).elements.elements;
162
- const trailingComma = elements.length > 0 && elements[elements.length - 1].markers?.markers.find(m => m.kind === J.Markers.TrailingComma);
163
- if (trailingComma) {
164
- elements[elements.length - 1].markers.markers = elements[elements.length - 1].markers.markers.filter(m => m.kind !== J.Markers.TrailingComma);
165
- }
166
- elements.sort((a, b) => {
167
- const namesExtracted: string[] = [a.element, b.element].map(expr => {
168
- const is = expr as JS.ImportSpecifier;
169
- if (is.specifier.kind == JS.Kind.Alias) {
170
- return (is.specifier as JS.Alias).propertyName.element.simpleName;
171
- } else if (is.specifier.kind == J.Kind.Identifier) {
172
- return (is.specifier as J.Identifier).simpleName;
173
- } else {
174
- throw new Error("Unsupported kind " + expr.kind);
175
- }
176
- });
177
- return namesExtracted[0].localeCompare(namesExtracted[1]);
178
- });
179
- if (trailingComma && elements.length > 0 && !elements[elements.length - 1].markers.markers.find(m => m.kind === J.Markers.TrailingComma)) {
180
- elements[elements.length - 1].markers.markers.push(trailingComma);
181
- }
182
- });
183
- const formatted = await new AutoformatVisitor().visit(importSorted, {}) as JS.Import;
184
- ret.push(produce(importPadded, draft => {
185
- draft.element = formatted;
186
- }));
187
- } else {
188
- ret.push(importPadded);
189
- }
190
- }
191
- return ret;
192
- }
193
- }
194
- }
195
- }