esupgrade 2025.3.0 → 2025.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/widelyAvailable.js +30 -70
- package/tests/cli.test.js +150 -110
- package/tests/index.test.js +230 -213
- package/tests/newlyAvailable.test.js +325 -167
- package/tests/widelyAvailable.test.js +1073 -1400
|
@@ -1,221 +1,379 @@
|
|
|
1
1
|
import { describe, test } from "node:test"
|
|
2
|
-
import assert from "node:assert"
|
|
2
|
+
import assert from "node:assert/strict"
|
|
3
3
|
import { transform } from "../src/index.js"
|
|
4
4
|
|
|
5
5
|
describe("newly-available", () => {
|
|
6
6
|
describe("Promise.try", () => {
|
|
7
|
-
test("
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
7
|
+
test("transforms resolve call with argument", () => {
|
|
8
|
+
assert(
|
|
9
|
+
transform(
|
|
10
|
+
`const p = new Promise((resolve) => resolve(getData()));`,
|
|
11
|
+
"newly-available",
|
|
12
|
+
).modified,
|
|
13
|
+
"transform Promise constructor to Promise.try",
|
|
14
|
+
)
|
|
15
|
+
assert.match(
|
|
16
|
+
transform(
|
|
17
|
+
`const p = new Promise((resolve) => resolve(getData()));`,
|
|
18
|
+
"newly-available",
|
|
19
|
+
).code,
|
|
20
|
+
/Promise\.try/,
|
|
21
|
+
)
|
|
14
22
|
})
|
|
15
23
|
|
|
16
|
-
test("
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
24
|
+
test("not available in widely-available baseline", () => {
|
|
25
|
+
assert.doesNotMatch(
|
|
26
|
+
transform(
|
|
27
|
+
`const p = new Promise((resolve) => resolve(getData()));`,
|
|
28
|
+
"widely-available",
|
|
29
|
+
).code,
|
|
30
|
+
/Promise\.try/,
|
|
31
|
+
"do not transform with widely-available baseline",
|
|
32
|
+
)
|
|
23
33
|
})
|
|
24
34
|
|
|
25
|
-
test("
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
assert.match(
|
|
33
|
-
|
|
35
|
+
test("transforms function passed to resolve", () => {
|
|
36
|
+
assert(
|
|
37
|
+
transform(
|
|
38
|
+
`const p = new Promise((resolve) => setTimeout(resolve));`,
|
|
39
|
+
"newly-available",
|
|
40
|
+
).modified,
|
|
41
|
+
)
|
|
42
|
+
assert.match(
|
|
43
|
+
transform(
|
|
44
|
+
`const p = new Promise((resolve) => setTimeout(resolve));`,
|
|
45
|
+
"newly-available",
|
|
46
|
+
).code,
|
|
47
|
+
/Promise\.try\(setTimeout\)/,
|
|
48
|
+
"transform to Promise.try(setTimeout) not Promise.try(() => setTimeout(resolve))",
|
|
49
|
+
)
|
|
50
|
+
assert.doesNotMatch(
|
|
51
|
+
transform(
|
|
52
|
+
`const p = new Promise((resolve) => setTimeout(resolve));`,
|
|
53
|
+
"newly-available",
|
|
54
|
+
).code,
|
|
55
|
+
/resolve/,
|
|
56
|
+
)
|
|
34
57
|
})
|
|
35
58
|
|
|
36
|
-
test("
|
|
37
|
-
|
|
59
|
+
test("skip when awaited", () => {
|
|
60
|
+
assert(
|
|
61
|
+
!transform(
|
|
62
|
+
`async function foo() {
|
|
38
63
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
assert.
|
|
45
|
-
|
|
46
|
-
|
|
64
|
+
}`,
|
|
65
|
+
"newly-available",
|
|
66
|
+
).modified,
|
|
67
|
+
"do not transform awaited Promises",
|
|
68
|
+
)
|
|
69
|
+
assert.match(
|
|
70
|
+
transform(
|
|
71
|
+
`async function foo() {
|
|
72
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
73
|
+
}`,
|
|
74
|
+
"newly-available",
|
|
75
|
+
).code,
|
|
76
|
+
/await new Promise/,
|
|
77
|
+
)
|
|
78
|
+
assert.doesNotMatch(
|
|
79
|
+
transform(
|
|
80
|
+
`async function foo() {
|
|
81
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
82
|
+
}`,
|
|
83
|
+
"newly-available",
|
|
84
|
+
).code,
|
|
85
|
+
/Promise\.try/,
|
|
86
|
+
)
|
|
47
87
|
})
|
|
48
88
|
|
|
49
|
-
test("
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
89
|
+
test("skip non-Promise constructors", () => {
|
|
90
|
+
assert(
|
|
91
|
+
!transform(
|
|
92
|
+
`const p = new MyPromise((resolve) => resolve(getData()));`,
|
|
93
|
+
"newly-available",
|
|
94
|
+
).modified,
|
|
95
|
+
)
|
|
96
|
+
assert.match(
|
|
97
|
+
transform(
|
|
98
|
+
`const p = new MyPromise((resolve) => resolve(getData()));`,
|
|
99
|
+
"newly-available",
|
|
100
|
+
).code,
|
|
101
|
+
/new MyPromise/,
|
|
102
|
+
)
|
|
56
103
|
})
|
|
57
104
|
|
|
58
|
-
test("
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
assert.match(result.code, /new Promise\(\)/)
|
|
105
|
+
test("skip with 0 arguments", () => {
|
|
106
|
+
assert(!transform(`const p = new Promise();`, "newly-available").modified)
|
|
107
|
+
assert.match(
|
|
108
|
+
transform(`const p = new Promise();`, "newly-available").code,
|
|
109
|
+
/new Promise\(\)/,
|
|
110
|
+
)
|
|
65
111
|
})
|
|
66
112
|
|
|
67
|
-
test("
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
113
|
+
test("skip with multiple arguments", () => {
|
|
114
|
+
assert(
|
|
115
|
+
!transform(
|
|
116
|
+
`const p = new Promise((resolve) => resolve(1), extraArg);`,
|
|
117
|
+
"newly-available",
|
|
118
|
+
).modified,
|
|
119
|
+
)
|
|
120
|
+
assert.match(
|
|
121
|
+
transform(
|
|
122
|
+
`const p = new Promise((resolve) => resolve(1), extraArg);`,
|
|
123
|
+
"newly-available",
|
|
124
|
+
).code,
|
|
125
|
+
/new Promise/,
|
|
126
|
+
)
|
|
74
127
|
})
|
|
75
128
|
|
|
76
|
-
test("
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
assert.match(result.code, /new Promise\(executor\)/)
|
|
129
|
+
test("skip with non-function argument", () => {
|
|
130
|
+
assert(!transform(`const p = new Promise(executor);`, "newly-available").modified)
|
|
131
|
+
assert.match(
|
|
132
|
+
transform(`const p = new Promise(executor);`, "newly-available").code,
|
|
133
|
+
/new Promise\(executor\)/,
|
|
134
|
+
)
|
|
83
135
|
})
|
|
84
136
|
|
|
85
|
-
test("
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
137
|
+
test("skip with 0 params", () => {
|
|
138
|
+
assert(
|
|
139
|
+
!transform(
|
|
140
|
+
`const p = new Promise(() => console.log('test'));`,
|
|
141
|
+
"newly-available",
|
|
142
|
+
).modified,
|
|
143
|
+
)
|
|
144
|
+
assert.match(
|
|
145
|
+
transform(
|
|
146
|
+
`const p = new Promise(() => console.log('test'));`,
|
|
147
|
+
"newly-available",
|
|
148
|
+
).code,
|
|
149
|
+
/new Promise/,
|
|
150
|
+
)
|
|
92
151
|
})
|
|
93
152
|
|
|
94
|
-
test("
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
153
|
+
test("skip with more than 2 params", () => {
|
|
154
|
+
assert(
|
|
155
|
+
!transform(
|
|
156
|
+
`const p = new Promise((resolve, reject, extra) => resolve(1));`,
|
|
157
|
+
"newly-available",
|
|
158
|
+
).modified,
|
|
159
|
+
)
|
|
160
|
+
assert.match(
|
|
161
|
+
transform(
|
|
162
|
+
`const p = new Promise((resolve, reject, extra) => resolve(1));`,
|
|
163
|
+
"newly-available",
|
|
164
|
+
).code,
|
|
165
|
+
/new Promise/,
|
|
166
|
+
)
|
|
101
167
|
})
|
|
102
168
|
|
|
103
|
-
test("
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
169
|
+
test("transforms block statement with resolve call", () => {
|
|
170
|
+
assert(
|
|
171
|
+
transform(
|
|
172
|
+
`const p = new Promise((resolve) => { resolve(getData()); });`,
|
|
173
|
+
"newly-available",
|
|
174
|
+
).modified,
|
|
175
|
+
)
|
|
176
|
+
assert.match(
|
|
177
|
+
transform(
|
|
178
|
+
`const p = new Promise((resolve) => { resolve(getData()); });`,
|
|
179
|
+
"newly-available",
|
|
180
|
+
).code,
|
|
181
|
+
/Promise\.try/,
|
|
182
|
+
)
|
|
110
183
|
})
|
|
111
184
|
|
|
112
|
-
test("
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
185
|
+
test("skip with arrow function expression body as function call", () => {
|
|
186
|
+
assert(
|
|
187
|
+
!transform(
|
|
188
|
+
`const p = new Promise((resolve) => computeValue());`,
|
|
189
|
+
"newly-available",
|
|
190
|
+
).modified,
|
|
191
|
+
"do not transform because computeValue() is not calling resolve",
|
|
192
|
+
)
|
|
193
|
+
assert.match(
|
|
194
|
+
transform(
|
|
195
|
+
`const p = new Promise((resolve) => computeValue());`,
|
|
196
|
+
"newly-available",
|
|
197
|
+
).code,
|
|
198
|
+
/new Promise/,
|
|
199
|
+
)
|
|
120
200
|
})
|
|
121
201
|
|
|
122
|
-
test("
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
202
|
+
test("skip with arrow function returning a value directly", () => {
|
|
203
|
+
assert(
|
|
204
|
+
!transform(
|
|
205
|
+
`const p = new Promise((resolve) => someFunction(arg1, arg2));`,
|
|
206
|
+
"newly-available",
|
|
207
|
+
).modified,
|
|
208
|
+
"do not transform function call that doesn't involve resolve",
|
|
209
|
+
)
|
|
210
|
+
assert.match(
|
|
211
|
+
transform(
|
|
212
|
+
`const p = new Promise((resolve) => someFunction(arg1, arg2));`,
|
|
213
|
+
"newly-available",
|
|
214
|
+
).code,
|
|
215
|
+
/new Promise/,
|
|
216
|
+
)
|
|
130
217
|
})
|
|
131
218
|
|
|
132
|
-
test("
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
assert.
|
|
138
|
-
|
|
219
|
+
test("skip with non-call expression body", () => {
|
|
220
|
+
assert(
|
|
221
|
+
!transform(`const p = new Promise((resolve) => someValue);`, "newly-available")
|
|
222
|
+
.modified,
|
|
223
|
+
)
|
|
224
|
+
assert.match(
|
|
225
|
+
transform(`const p = new Promise((resolve) => someValue);`, "newly-available")
|
|
226
|
+
.code,
|
|
227
|
+
/new Promise/,
|
|
228
|
+
)
|
|
139
229
|
})
|
|
140
230
|
|
|
141
|
-
test("
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
231
|
+
test("skip with wrong number of arguments to resolve", () => {
|
|
232
|
+
assert(
|
|
233
|
+
!transform(
|
|
234
|
+
`const p = new Promise((resolve) => func(resolve, extra));`,
|
|
235
|
+
"newly-available",
|
|
236
|
+
).modified,
|
|
237
|
+
)
|
|
238
|
+
assert.match(
|
|
239
|
+
transform(
|
|
240
|
+
`const p = new Promise((resolve) => func(resolve, extra));`,
|
|
241
|
+
"newly-available",
|
|
242
|
+
).code,
|
|
243
|
+
/new Promise/,
|
|
244
|
+
)
|
|
148
245
|
})
|
|
149
246
|
|
|
150
|
-
test("
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
assert.
|
|
156
|
-
|
|
247
|
+
test("skip with non-identifier resolve", () => {
|
|
248
|
+
assert(
|
|
249
|
+
!transform(`const p = new Promise((resolve) => func(123));`, "newly-available")
|
|
250
|
+
.modified,
|
|
251
|
+
)
|
|
252
|
+
assert.match(
|
|
253
|
+
transform(`const p = new Promise((resolve) => func(123));`, "newly-available")
|
|
254
|
+
.code,
|
|
255
|
+
/new Promise/,
|
|
256
|
+
)
|
|
157
257
|
})
|
|
158
258
|
|
|
159
|
-
test("
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
assert.
|
|
165
|
-
|
|
259
|
+
test("skip with resolve call with 0 arguments", () => {
|
|
260
|
+
assert(
|
|
261
|
+
!transform(`const p = new Promise((resolve) => resolve());`, "newly-available")
|
|
262
|
+
.modified,
|
|
263
|
+
)
|
|
264
|
+
assert.match(
|
|
265
|
+
transform(`const p = new Promise((resolve) => resolve());`, "newly-available")
|
|
266
|
+
.code,
|
|
267
|
+
/new Promise/,
|
|
268
|
+
)
|
|
166
269
|
})
|
|
167
270
|
|
|
168
|
-
test("
|
|
169
|
-
|
|
271
|
+
test("skip with block with multiple statements", () => {
|
|
272
|
+
assert(
|
|
273
|
+
!transform(
|
|
274
|
+
`const p = new Promise((resolve) => {
|
|
170
275
|
const data = getData();
|
|
171
276
|
resolve(data);
|
|
172
|
-
})
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
assert.
|
|
177
|
-
|
|
277
|
+
});`,
|
|
278
|
+
"newly-available",
|
|
279
|
+
).modified,
|
|
280
|
+
)
|
|
281
|
+
assert.match(
|
|
282
|
+
transform(
|
|
283
|
+
`const p = new Promise((resolve) => {
|
|
284
|
+
const data = getData();
|
|
285
|
+
resolve(data);
|
|
286
|
+
});`,
|
|
287
|
+
"newly-available",
|
|
288
|
+
).code,
|
|
289
|
+
/new Promise/,
|
|
290
|
+
)
|
|
178
291
|
})
|
|
179
292
|
|
|
180
|
-
test("
|
|
181
|
-
|
|
293
|
+
test("skip with block with non-expression statement", () => {
|
|
294
|
+
assert(
|
|
295
|
+
!transform(
|
|
296
|
+
`const p = new Promise((resolve) => {
|
|
182
297
|
if (true) resolve(1);
|
|
183
|
-
})
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
assert.
|
|
188
|
-
|
|
298
|
+
});`,
|
|
299
|
+
"newly-available",
|
|
300
|
+
).modified,
|
|
301
|
+
)
|
|
302
|
+
assert.match(
|
|
303
|
+
transform(
|
|
304
|
+
`const p = new Promise((resolve) => {
|
|
305
|
+
if (true) resolve(1);
|
|
306
|
+
});`,
|
|
307
|
+
"newly-available",
|
|
308
|
+
).code,
|
|
309
|
+
/new Promise/,
|
|
310
|
+
)
|
|
189
311
|
})
|
|
190
312
|
|
|
191
|
-
test("
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
313
|
+
test("transforms function expression", () => {
|
|
314
|
+
assert(
|
|
315
|
+
transform(
|
|
316
|
+
`const p = new Promise(function(resolve) { resolve(getData()); });`,
|
|
317
|
+
"newly-available",
|
|
318
|
+
).modified,
|
|
319
|
+
)
|
|
320
|
+
assert.match(
|
|
321
|
+
transform(
|
|
322
|
+
`const p = new Promise(function(resolve) { resolve(getData()); });`,
|
|
323
|
+
"newly-available",
|
|
324
|
+
).code,
|
|
325
|
+
/Promise\.try/,
|
|
326
|
+
)
|
|
198
327
|
})
|
|
199
328
|
|
|
200
|
-
test("
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
329
|
+
test("transforms with both resolve and reject params", () => {
|
|
330
|
+
assert(
|
|
331
|
+
transform(
|
|
332
|
+
`const p = new Promise((resolve, reject) => resolve(getData()));`,
|
|
333
|
+
"newly-available",
|
|
334
|
+
).modified,
|
|
335
|
+
)
|
|
336
|
+
assert.match(
|
|
337
|
+
transform(
|
|
338
|
+
`const p = new Promise((resolve, reject) => resolve(getData()));`,
|
|
339
|
+
"newly-available",
|
|
340
|
+
).code,
|
|
341
|
+
/Promise\.try/,
|
|
342
|
+
)
|
|
207
343
|
})
|
|
208
344
|
|
|
209
|
-
test("
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
assert.
|
|
218
|
-
|
|
345
|
+
test("tracks line numbers correctly", () => {
|
|
346
|
+
assert(
|
|
347
|
+
transform(
|
|
348
|
+
`// Line 1
|
|
349
|
+
const p = new Promise((resolve) => resolve(getData()));`,
|
|
350
|
+
"newly-available",
|
|
351
|
+
).modified,
|
|
352
|
+
)
|
|
353
|
+
assert.equal(
|
|
354
|
+
transform(
|
|
355
|
+
`// Line 1
|
|
356
|
+
const p = new Promise((resolve) => resolve(getData()));`,
|
|
357
|
+
"newly-available",
|
|
358
|
+
).changes.length,
|
|
359
|
+
1,
|
|
360
|
+
)
|
|
361
|
+
assert.equal(
|
|
362
|
+
transform(
|
|
363
|
+
`// Line 1
|
|
364
|
+
const p = new Promise((resolve) => resolve(getData()));`,
|
|
365
|
+
"newly-available",
|
|
366
|
+
).changes[0].type,
|
|
367
|
+
"promiseTry",
|
|
368
|
+
)
|
|
369
|
+
assert.equal(
|
|
370
|
+
transform(
|
|
371
|
+
`// Line 1
|
|
372
|
+
const p = new Promise((resolve) => resolve(getData()));`,
|
|
373
|
+
"newly-available",
|
|
374
|
+
).changes[0].line,
|
|
375
|
+
2,
|
|
376
|
+
)
|
|
219
377
|
})
|
|
220
378
|
})
|
|
221
379
|
})
|