@vxrn/compiler 2.0.0-beta.33.1 → 2.0.0-beta.45.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.
Files changed (94) hide show
  1. package/dist/cjs/cache.cjs +112 -109
  2. package/dist/cjs/configure.cjs +26 -28
  3. package/dist/cjs/constants.cjs +56 -60
  4. package/dist/cjs/index.cjs +420 -438
  5. package/dist/cjs/reactNativeCodegen.cjs +105 -114
  6. package/dist/cjs/reactNativeViewConfig.cjs +362 -381
  7. package/dist/cjs/refresh-runtime.cjs +390 -397
  8. package/dist/cjs/transformBabel.cjs +278 -218
  9. package/dist/cjs/transformHermesAsync.cjs +36 -47
  10. package/dist/cjs/transformHermesLoops.cjs +279 -281
  11. package/dist/cjs/transformSWC.cjs +183 -200
  12. package/dist/cjs/transformWorklets.cjs +107 -95
  13. package/dist/cjs/types.cjs +9 -11
  14. package/dist/cjs/worklets/autoworklet.cjs +277 -222
  15. package/dist/cjs/worklets/globals.cjs +124 -60
  16. package/dist/cjs/worklets/hash.cjs +23 -27
  17. package/dist/cjs/worklets/scope.cjs +338 -359
  18. package/dist/cjs/worklets/serialize.cjs +73 -75
  19. package/dist/cjs/worklets/transform.cjs +217 -222
  20. package/dist/cjs/worklets/types.cjs +9 -11
  21. package/dist/esm/cache.mjs +96 -89
  22. package/dist/esm/cache.mjs.map +1 -1
  23. package/dist/esm/configure.mjs +11 -10
  24. package/dist/esm/configure.mjs.map +1 -1
  25. package/dist/esm/constants.mjs +41 -41
  26. package/dist/esm/constants.mjs.map +1 -1
  27. package/dist/esm/index.js +417 -420
  28. package/dist/esm/index.js.map +1 -1
  29. package/dist/esm/index.mjs +417 -420
  30. package/dist/esm/index.mjs.map +1 -1
  31. package/dist/esm/reactNativeCodegen.mjs +90 -88
  32. package/dist/esm/reactNativeCodegen.mjs.map +1 -1
  33. package/dist/esm/reactNativeViewConfig.mjs +347 -362
  34. package/dist/esm/reactNativeViewConfig.mjs.map +1 -1
  35. package/dist/esm/refresh-runtime.mjs +372 -376
  36. package/dist/esm/refresh-runtime.mjs.map +1 -1
  37. package/dist/esm/transformBabel.mjs +261 -194
  38. package/dist/esm/transformBabel.mjs.map +1 -1
  39. package/dist/esm/transformHermesAsync.mjs +20 -21
  40. package/dist/esm/transformHermesAsync.mjs.map +1 -1
  41. package/dist/esm/transformHermesLoops.mjs +264 -255
  42. package/dist/esm/transformHermesLoops.mjs.map +1 -1
  43. package/dist/esm/transformSWC.mjs +163 -171
  44. package/dist/esm/transformSWC.mjs.map +1 -1
  45. package/dist/esm/transformWorklets.mjs +89 -69
  46. package/dist/esm/transformWorklets.mjs.map +1 -1
  47. package/dist/esm/types.mjs +0 -2
  48. package/dist/esm/worklets/autoworklet.mjs +258 -200
  49. package/dist/esm/worklets/autoworklet.mjs.map +1 -1
  50. package/dist/esm/worklets/globals.mjs +109 -42
  51. package/dist/esm/worklets/globals.mjs.map +1 -1
  52. package/dist/esm/worklets/hash.mjs +10 -9
  53. package/dist/esm/worklets/hash.mjs.map +1 -1
  54. package/dist/esm/worklets/scope.mjs +325 -341
  55. package/dist/esm/worklets/scope.mjs.map +1 -1
  56. package/dist/esm/worklets/serialize.mjs +60 -58
  57. package/dist/esm/worklets/serialize.mjs.map +1 -1
  58. package/dist/esm/worklets/transform.mjs +201 -197
  59. package/dist/esm/worklets/transform.mjs.map +1 -1
  60. package/dist/esm/worklets/types.mjs +0 -2
  61. package/package.json +7 -6
  62. package/src/cache.ts +37 -7
  63. package/src/index.ts +33 -18
  64. package/src/transformBabel.test.ts +311 -1
  65. package/src/transformBabel.ts +110 -13
  66. package/types/cache.d.ts +2 -2
  67. package/types/cache.d.ts.map +1 -1
  68. package/types/index.d.ts.map +1 -1
  69. package/types/transformBabel.d.ts +16 -1
  70. package/types/transformBabel.d.ts.map +1 -1
  71. package/types/transformSWC.d.ts +1 -4
  72. package/types/transformSWC.d.ts.map +1 -1
  73. package/dist/cjs/transformBabel.test.cjs +0 -360
  74. package/dist/cjs/transformHermesLoops.test.cjs +0 -257
  75. package/dist/cjs/transformSWC.test.cjs +0 -117
  76. package/dist/cjs/transformWorklets.test.cjs +0 -604
  77. package/dist/esm/transformBabel.test.mjs +0 -337
  78. package/dist/esm/transformBabel.test.mjs.map +0 -1
  79. package/dist/esm/transformHermesLoops.test.mjs +0 -234
  80. package/dist/esm/transformHermesLoops.test.mjs.map +0 -1
  81. package/dist/esm/transformSWC.test.mjs +0 -118
  82. package/dist/esm/transformSWC.test.mjs.map +0 -1
  83. package/dist/esm/transformWorklets.test.mjs +0 -581
  84. package/dist/esm/transformWorklets.test.mjs.map +0 -1
  85. package/dist/esm/types.mjs.map +0 -1
  86. package/dist/esm/worklets/types.mjs.map +0 -1
  87. package/types/transformBabel.test.d.ts +0 -2
  88. package/types/transformBabel.test.d.ts.map +0 -1
  89. package/types/transformHermesLoops.test.d.ts +0 -2
  90. package/types/transformHermesLoops.test.d.ts.map +0 -1
  91. package/types/transformSWC.test.d.ts +0 -2
  92. package/types/transformSWC.test.d.ts.map +0 -1
  93. package/types/transformWorklets.test.d.ts +0 -2
  94. package/types/transformWorklets.test.d.ts.map +0 -1
@@ -1,337 +0,0 @@
1
- import fs from "node:fs";
2
- import os from "node:os";
3
- import path from "node:path";
4
- import { afterEach, describe, expect, it } from "vitest";
5
- import { configureVXRNCompilerPlugin } from "./configure.mjs";
6
- import { getBabelOptions, transformBabel, transformOxcReactCompiler } from "./transformBabel.mjs";
7
- afterEach(() => {
8
- configureVXRNCompilerPlugin({
9
- enableReanimated: false
10
- });
11
- });
12
- describe("getBabelOptions Worklets resolution", () => {
13
- it("uses the app-installed Worklets Babel plugin", () => {
14
- const projectRoot = fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), "vxrn-worklets-")));
15
- const packageRoot = path.join(projectRoot, "node_modules", "react-native-worklets");
16
- const pluginPath = path.join(packageRoot, "plugin.js");
17
- fs.mkdirSync(packageRoot, {
18
- recursive: true
19
- });
20
- fs.writeFileSync(path.join(packageRoot, "package.json"), JSON.stringify({
21
- name: "react-native-worklets",
22
- version: "99.0.0"
23
- }));
24
- fs.writeFileSync(pluginPath, "module.exports = () => ({ visitor: {} })");
25
- try {
26
- configureVXRNCompilerPlugin({
27
- enableReanimated: true
28
- });
29
- const options = getBabelOptions({
30
- id: path.join(projectRoot, "input.ts"),
31
- code: `export const worklet = () => {
32
- 'worklet'
33
- }`,
34
- development: true,
35
- environment: "ios",
36
- reactForRNVersion: "19",
37
- projectRoot
38
- });
39
- expect(options?.plugins).toContain(pluginPath);
40
- } finally {
41
- fs.rmSync(projectRoot, {
42
- recursive: true,
43
- force: true
44
- });
45
- }
46
- });
47
- });
48
- describe("transformBabel Flow parsing", () => {
49
- it("parses and strips React Native Flow as-casts", async () => {
50
- const result = await transformBabel("/project/VirtualViewNativeComponent.js", `
51
- // @flow strict-local
52
- import type { HostComponent } from './HostComponent'
53
- import codegenNativeComponent from './codegenNativeComponent'
54
-
55
- type Props = $ReadOnly<{ enabled?: boolean }>
56
-
57
- export default codegenNativeComponent<Props>('VirtualView') as HostComponent<Props>
58
- `, {
59
- plugins: []
60
- });
61
- expect(result?.code).toContain("codegenNativeComponent('VirtualView')");
62
- expect(result?.code).not.toContain("HostComponent");
63
- });
64
- it("rejects a required transform error instead of returning untransformed source", async () => {
65
- const negativeControl = () => ({
66
- visitor: {
67
- Program() {
68
- throw new Error("NATIVE_TRANSFORM_NEGATIVE_CONTROL");
69
- }
70
- }
71
- });
72
- await expect(transformBabel("/project/TransformProbe.ts", "export const marker = 1", {
73
- plugins: [negativeControl]
74
- })).rejects.toThrow("NATIVE_TRANSFORM_NEGATIVE_CONTROL");
75
- });
76
- });
77
- describe("transformOxcReactCompiler", () => {
78
- const componentCode = `
79
- import { useState } from 'react'
80
-
81
- export function Counter() {
82
- const [count, setCount] = useState(0)
83
- return <button onClick={() => setCount(count + 1)}>{count}</button>
84
- }
85
- `;
86
- it("compiles and memoizes React components with Rust React Compiler", async () => {
87
- const result = await transformOxcReactCompiler("/project/Counter.tsx", componentCode, "19", false);
88
- expect(result.code).toContain("_c(");
89
- expect(result.code).toContain("react/compiler-runtime");
90
- expect(result.map).toBeUndefined();
91
- });
92
- it("generates source maps when requested", async () => {
93
- const result = await transformOxcReactCompiler("/project/Counter.tsx", componentCode, "19", true);
94
- expect(result.code).toContain("_c(");
95
- expect(result.map).toBeDefined();
96
- expect(result.map?.mappings).toBeDefined();
97
- });
98
- it("supports target 18", async () => {
99
- const result = await transformOxcReactCompiler("/project/Counter.tsx", componentCode, "18", false);
100
- expect(result.code).toContain("_c(");
101
- });
102
- });
103
- describe("compiler plugin multi-stage source map composition", () => {
104
- it("composes earlier compiler maps when Babel also runs", async () => {
105
- const {
106
- createVXRNCompilerPlugin
107
- } = await import("./index.mjs");
108
- const {
109
- TraceMap,
110
- originalPositionFor
111
- } = await import("@jridgewell/trace-mapping");
112
- const origSourceMap = process.env.VXRN_ENABLE_SOURCE_MAP;
113
- const origBabelGen = process.env.VXRN_USE_BABEL_FOR_GENERATORS;
114
- process.env.VXRN_ENABLE_SOURCE_MAP = "1";
115
- process.env.VXRN_USE_BABEL_FOR_GENERATORS = "1";
116
- configureVXRNCompilerPlugin({
117
- enableCompiler: true
118
- });
119
- const tempFile = path.join(os.tmpdir(), `Counter-${Date.now()}.tsx`);
120
- fs.writeFileSync(tempFile, `import { useState } from 'react'
121
-
122
- export function Counter() {
123
- const [count, setCount] = useState(0)
124
- return <button onClick={() => setCount(count + 1)}>{count}</button>
125
- }
126
-
127
- export async function* generatorProbe() {
128
- throw new Error("MARKER")
129
- }
130
- `);
131
- try {
132
- const plugins = await createVXRNCompilerPlugin();
133
- const plugin = plugins.find(p => p.name === "one:compiler");
134
- await plugin.configResolved({
135
- root: os.tmpdir(),
136
- build: {}
137
- });
138
- const hook = plugin.transform.handler || plugin.transform;
139
- const code = fs.readFileSync(tempFile, "utf8");
140
- const context = {
141
- environment: {
142
- name: "client"
143
- }
144
- };
145
- const result = await hook.call(context, code, tempFile);
146
- expect(result).toBeDefined();
147
- expect(result.map).toBeDefined();
148
- const tracer = new TraceMap(result.map);
149
- const lines = result.code.split("\n");
150
- const markerLineIndex = lines.findIndex(l => l.includes("MARKER"));
151
- expect(markerLineIndex).toBeGreaterThan(0);
152
- const markerCol = lines[markerLineIndex].indexOf("throw");
153
- const pos = originalPositionFor(tracer, {
154
- line: markerLineIndex + 1,
155
- column: markerCol
156
- });
157
- expect(pos.source).toBe(tempFile);
158
- expect(pos.line).toBe(9);
159
- } finally {
160
- if (origSourceMap !== void 0) {
161
- process.env.VXRN_ENABLE_SOURCE_MAP = origSourceMap;
162
- } else {
163
- delete process.env.VXRN_ENABLE_SOURCE_MAP;
164
- }
165
- if (origBabelGen !== void 0) {
166
- process.env.VXRN_USE_BABEL_FOR_GENERATORS = origBabelGen;
167
- } else {
168
- delete process.env.VXRN_USE_BABEL_FOR_GENERATORS;
169
- }
170
- configureVXRNCompilerPlugin({
171
- enableCompiler: false
172
- });
173
- fs.rmSync(tempFile, {
174
- force: true
175
- });
176
- }
177
- });
178
- });
179
- describe("shared compiler worklets backend selection", () => {
180
- it("retains Babel for worklets by default when enableNativeWorklets is false", async () => {
181
- const {
182
- vi
183
- } = await import("vitest");
184
- const {
185
- createVXRNCompilerPlugin
186
- } = await import("./index.mjs");
187
- const workletsModule = await import("./transformWorklets.mjs");
188
- const workletSpy = vi.spyOn(workletsModule, "transformWorklets");
189
- configureVXRNCompilerPlugin({
190
- enableReanimated: true,
191
- enableNativeWorklets: false
192
- });
193
- const tempFile = path.join(process.cwd(), `test-default-worklet-${Date.now()}.tsx`);
194
- const inputCode = `export function fn() { 'worklet'; return 1 }`;
195
- fs.writeFileSync(tempFile, inputCode);
196
- try {
197
- const plugins = await createVXRNCompilerPlugin();
198
- const plugin = plugins.find(p => p.name === "one:compiler");
199
- await plugin.configResolved({
200
- root: process.cwd(),
201
- build: {}
202
- });
203
- const hook = plugin.transform.handler || plugin.transform;
204
- const context = {
205
- environment: {
206
- name: "ios"
207
- }
208
- };
209
- const result = await hook.call(context, inputCode, tempFile);
210
- expect(result).toBeDefined();
211
- expect(workletSpy).not.toHaveBeenCalled();
212
- } finally {
213
- workletSpy.mockRestore();
214
- configureVXRNCompilerPlugin({
215
- enableReanimated: false,
216
- enableNativeWorklets: false
217
- });
218
- fs.rmSync(tempFile, {
219
- force: true
220
- });
221
- }
222
- });
223
- it("uses native SWC for worklets when enableNativeWorklets is true", async () => {
224
- const compiler = await import("./index.mjs");
225
- const {
226
- vi
227
- } = await import("vitest");
228
- const workletsModule = await import("./transformWorklets.mjs");
229
- const workletSpy = vi.spyOn(workletsModule, "transformWorklets");
230
- configureVXRNCompilerPlugin({
231
- enableReanimated: true,
232
- enableNativeWorklets: true
233
- });
234
- const tempFile = path.join(process.cwd(), `test-native-worklet-${Date.now()}.tsx`);
235
- const inputCode = `export function fn() { 'worklet'; return 1 }`;
236
- fs.writeFileSync(tempFile, inputCode);
237
- try {
238
- const plugins = await compiler.createVXRNCompilerPlugin();
239
- const plugin = plugins.find(p => p.name === "one:compiler");
240
- await plugin.configResolved({
241
- root: process.cwd(),
242
- build: {}
243
- });
244
- const hook = plugin.transform.handler || plugin.transform;
245
- const context = {
246
- environment: {
247
- name: "ios"
248
- }
249
- };
250
- const result = await hook.call(context, inputCode, tempFile);
251
- expect(result).toBeDefined();
252
- expect(workletSpy).toHaveBeenCalled();
253
- } finally {
254
- workletSpy.mockRestore();
255
- configureVXRNCompilerPlugin({
256
- enableReanimated: false,
257
- enableNativeWorklets: false
258
- });
259
- fs.rmSync(tempFile, {
260
- force: true
261
- });
262
- }
263
- });
264
- it("invalidates cache when toggling worklets backend on the same unchanged file", async () => {
265
- const compiler = await import("./index.mjs");
266
- const {
267
- vi
268
- } = await import("vitest");
269
- const workletsModule = await import("./transformWorklets.mjs");
270
- const workletSpy = vi.spyOn(workletsModule, "transformWorklets");
271
- const tempFile = path.join(process.cwd(), `test-cache-toggle-${Date.now()}.tsx`);
272
- const inputCode = `export function fn() { 'worklet'; return 1 }`;
273
- fs.writeFileSync(tempFile, inputCode);
274
- try {
275
- configureVXRNCompilerPlugin({
276
- enableReanimated: true,
277
- enableNativeWorklets: false
278
- });
279
- const plugins1 = await compiler.createVXRNCompilerPlugin();
280
- const plugin1 = plugins1.find(p => p.name === "one:compiler");
281
- await plugin1.configResolved({
282
- root: process.cwd(),
283
- build: {}
284
- });
285
- const hook1 = plugin1.transform.handler || plugin1.transform;
286
- const context = {
287
- environment: {
288
- name: "ios"
289
- }
290
- };
291
- const res1 = await hook1.call(context, inputCode, tempFile);
292
- expect(res1).toBeDefined();
293
- expect(workletSpy).toHaveBeenCalledTimes(0);
294
- configureVXRNCompilerPlugin({
295
- enableReanimated: true,
296
- enableNativeWorklets: true
297
- });
298
- const plugins2 = await compiler.createVXRNCompilerPlugin();
299
- const plugin2 = plugins2.find(p => p.name === "one:compiler");
300
- await plugin2.configResolved({
301
- root: process.cwd(),
302
- build: {}
303
- });
304
- const hook2 = plugin2.transform.handler || plugin2.transform;
305
- const res2 = await hook2.call(context, inputCode, tempFile);
306
- expect(res2).toBeDefined();
307
- expect(workletSpy).toHaveBeenCalledTimes(1);
308
- const res3 = await hook2.call(context, inputCode, tempFile);
309
- expect(res3).toBeDefined();
310
- expect(workletSpy).toHaveBeenCalledTimes(1);
311
- configureVXRNCompilerPlugin({
312
- enableReanimated: true,
313
- enableNativeWorklets: false
314
- });
315
- const plugins3 = await compiler.createVXRNCompilerPlugin();
316
- const plugin3 = plugins3.find(p => p.name === "one:compiler");
317
- await plugin3.configResolved({
318
- root: process.cwd(),
319
- build: {}
320
- });
321
- const hook3 = plugin3.transform.handler || plugin3.transform;
322
- const res4 = await hook3.call(context, inputCode, tempFile);
323
- expect(res4).toBeDefined();
324
- expect(workletSpy).toHaveBeenCalledTimes(1);
325
- } finally {
326
- workletSpy.mockRestore();
327
- configureVXRNCompilerPlugin({
328
- enableReanimated: false,
329
- enableNativeWorklets: false
330
- });
331
- fs.rmSync(tempFile, {
332
- force: true
333
- });
334
- }
335
- });
336
- });
337
- //# sourceMappingURL=transformBabel.test.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["fs","os","path","afterEach","describe","expect","it","configureVXRNCompilerPlugin","getBabelOptions","transformBabel","transformOxcReactCompiler","enableReanimated","projectRoot","realpathSync","mkdtempSync","join","tmpdir","packageRoot","pluginPath","mkdirSync","recursive","writeFileSync","JSON","stringify","name","version","options","id","code","development","environment","reactForRNVersion","plugins","toContain","rmSync","force","result","not","negativeControl","visitor","Program","Error","rejects","toThrow","componentCode","map","toBeUndefined","toBeDefined","mappings","createVXRNCompilerPlugin","TraceMap","originalPositionFor","origSourceMap","process","env","VXRN_ENABLE_SOURCE_MAP","origBabelGen","VXRN_USE_BABEL_FOR_GENERATORS","enableCompiler","tempFile","Date","now","plugin","find","p","configResolved","root","build","hook","transform","handler","readFileSync","context","call","tracer","lines","split","markerLineIndex","findIndex","l","includes","toBeGreaterThan","markerCol","indexOf","pos","line","column","source","toBe","vi","workletsModule","workletSpy","spyOn","enableNativeWorklets","cwd","inputCode","toHaveBeenCalled","mockRestore","compiler","plugins1","plugin1","hook1","res1","toHaveBeenCalledTimes","plugins2","plugin2","hook2","res2","res3","plugins3","plugin3","hook3","res4"],"sources":["../../src/transformBabel.test.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -1,234 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import * as vm from "node:vm";
3
- import { transformHermesLoops } from "./transformHermesLoops.mjs";
4
- function runAsHermes(code) {
5
- const asHermesWouldSeeIt = code.replace(/\b(?:let|const)\b/g, "var");
6
- const sandbox = {
7
- result: void 0,
8
- console
9
- };
10
- vm.runInNewContext(asHermesWouldSeeIt, sandbox);
11
- return sandbox.result;
12
- }
13
- function run(source) {
14
- const out = transformHermesLoops(source, "test.js");
15
- return runAsHermes(out ? out.code : source);
16
- }
17
- describe("transformHermesLoops", () => {
18
- it.each([["if (false)", []], ["if (true)", [1, 2]], ["for (var pass = 0; pass < 2; pass++)", [1, 2, 1, 2]], ["while (passes++ < 2)", [1, 2, 1, 2]]])("keeps a captured loop inside a single-statement %s body", (parent, expected) => {
19
- expect(run(`
20
- var fns = []
21
- var passes = 0
22
- ${parent} for (const n of [1, 2]) fns.push(() => n)
23
- result = fns.map((f) => f())
24
- `)).toEqual(expected);
25
- });
26
- it.each([true, false])("preserves if/else selection when the condition is %s", condition => {
27
- expect(run(`
28
- var fns = []
29
- if (${condition}) for (const n of [1, 2]) fns.push(() => n)
30
- else for (const n of [3, 4]) fns.push(() => n)
31
- result = fns.map((f) => f())
32
- `)).toEqual(condition ? [1, 2] : [3, 4]);
33
- });
34
- it("preserves a do/while with a single-statement loop body", () => {
35
- expect(run(`
36
- var fns = []
37
- var passes = 0
38
- do for (const n of [1, 2]) fns.push(() => n)
39
- while (passes++ < 1)
40
- result = fns.map((f) => f())
41
- `)).toEqual([1, 2, 1, 2]);
42
- });
43
- it("guards optional Zero query patches through nested loop transforms", () => {
44
- expect(run(`
45
- var fns = []
46
- var parts = [{}, { desiredQueriesPatches: { a: ['x', 'y'], b: ['z'] } }]
47
- for (const part of parts) {
48
- if (part.desiredQueriesPatches)
49
- for (const [clientID, queriesPatch] of Object.entries(part.desiredQueriesPatches))
50
- for (const op of queriesPatch) fns.push(() => clientID + ':' + op)
51
- }
52
- result = fns.map((f) => f())
53
- `)).toEqual(["a:x", "a:y", "b:z"]);
54
- });
55
- it("gives a C-style loop a per-iteration binding", () => {
56
- expect(run(`
57
- var fns = []
58
- for (let i = 0; i < 3; i++) fns.push(() => i)
59
- result = fns.map((f) => f())
60
- `)).toEqual([0, 1, 2]);
61
- });
62
- it("gives for-of and for-in per-iteration bindings", () => {
63
- expect(run(`
64
- var fns = []
65
- for (const label of ['a', 'b']) fns.push(() => label)
66
- for (const key in { x: 1, y: 2 }) fns.push(() => key)
67
- result = fns.map((f) => f())
68
- `)).toEqual(["a", "b", "x", "y"]);
69
- });
70
- it("preserves break", () => {
71
- expect(run(`
72
- var fns = []
73
- for (let i = 0; i < 10; i++) {
74
- if (i === 3) break
75
- fns.push(() => i)
76
- }
77
- result = fns.map((f) => f())
78
- `)).toEqual([0, 1, 2]);
79
- });
80
- it("preserves continue", () => {
81
- expect(run(`
82
- var fns = []
83
- for (let i = 0; i < 5; i++) {
84
- if (i % 2 === 0) continue
85
- fns.push(() => i)
86
- }
87
- result = fns.map((f) => f())
88
- `)).toEqual([1, 3]);
89
- });
90
- it("preserves return out of the enclosing function", () => {
91
- expect(run(`
92
- function find() {
93
- for (const n of [1, 2, 3]) {
94
- const get = () => n
95
- if (n === 2) return get()
96
- }
97
- return 'none'
98
- }
99
- result = find()
100
- `)).toBe(2);
101
- });
102
- it("preserves a bare return", () => {
103
- expect(run(`
104
- var fns = []
105
- function go() {
106
- for (let i = 0; i < 5; i++) {
107
- if (i === 2) return
108
- fns.push(() => i)
109
- }
110
- }
111
- go()
112
- result = fns.map((f) => f())
113
- `)).toEqual([0, 1]);
114
- });
115
- it("leaves break and continue belonging to a nested loop alone", () => {
116
- expect(run(`
117
- var fns = []
118
- for (let i = 0; i < 2; i++) {
119
- for (var j = 0; j < 5; j++) {
120
- if (j > 0) break
121
- }
122
- fns.push(() => i)
123
- }
124
- result = fns.map((f) => f())
125
- `)).toEqual([0, 1]);
126
- });
127
- it("handles nested capturing loops", () => {
128
- expect(run(`
129
- var fns = []
130
- for (let i = 0; i < 2; i++) {
131
- for (let j = 0; j < 2; j++) {
132
- fns.push(() => i + ':' + j)
133
- }
134
- }
135
- result = fns.map((f) => f())
136
- `)).toEqual(["0:0", "0:1", "1:0", "1:1"]);
137
- });
138
- it("handles await in the loop body", async () => {
139
- const out = transformHermesLoops(`
140
- var fns = []
141
- async function go() {
142
- for (const n of [1, 2]) {
143
- await Promise.resolve()
144
- fns.push(() => n)
145
- }
146
- return fns.map((f) => f())
147
- }
148
- result = go()
149
- `, "test.js");
150
- expect(out).not.toBeNull();
151
- await expect(runAsHermes(out.code)).resolves.toEqual([1, 2]);
152
- });
153
- it("destructures a for-of binding per iteration", () => {
154
- expect(run(`
155
- var fns = []
156
- for (const { id } of [{ id: 'a' }, { id: 'b' }]) fns.push(() => id)
157
- result = fns.map((f) => f())
158
- `)).toEqual(["a", "b"]);
159
- });
160
- it("rewrites the esbuild interop helper that broke every multi-export module", () => {
161
- expect(run(`
162
- var __defProp = Object.defineProperty
163
- var __getOwnPropNames = Object.getOwnPropertyNames
164
- var from = { a: 1, b: 2 }
165
- var to = {}
166
- for (let key of __getOwnPropNames(from)) {
167
- __defProp(to, key, { get: () => from[key], enumerable: true })
168
- }
169
- result = [to.a, to.b]
170
- `)).toEqual([1, 2]);
171
- });
172
- it("leaves loops that never capture their binding untouched", () => {
173
- expect(transformHermesLoops("for (let i = 0; i < 3; i++) sum += i", "test.js")).toBeNull();
174
- });
175
- it("gives a binding declared in the loop body a per-iteration copy", () => {
176
- expect(run(`
177
- var names = ['createAnimatedNode', 'addListener', 'removeListener']
178
- var wrappers = {}
179
- for (var ii = 0; ii < names.length; ii++) {
180
- const methodName = names[ii]
181
- wrappers[methodName] = () => methodName
182
- }
183
- result = names.map((n) => wrappers[n]())
184
- `)).toEqual(["createAnimatedNode", "addListener", "removeListener"]);
185
- });
186
- it("gives a binding declared in a nested block of the loop body a per-iteration copy", () => {
187
- expect(run(`
188
- var fns = []
189
- for (var i = 0; i < 3; i++) {
190
- if (i >= 0) {
191
- const doubled = i * 2
192
- fns.push(() => doubled)
193
- }
194
- }
195
- result = fns.map((f) => f())
196
- `)).toEqual([0, 2, 4]);
197
- });
198
- it("keeps `this` and `arguments` meaning what they meant outside the loop", () => {
199
- expect(run(`
200
- class PropsFilter {
201
- constructor() { this._map = { a: 'A', b: 'B' } }
202
- filter(props) {
203
- var out = []
204
- for (const key in props) {
205
- const label = key
206
- out.push(() => this._map[label] + arguments.length)
207
- }
208
- return out
209
- }
210
- }
211
- result = new PropsFilter().filter({ a: 1, b: 2 }).map((f) => f())
212
- `)).toEqual(["A1", "B1"]);
213
- });
214
- it("leaves a loop with no lexical binding untouched", () => {
215
- expect(transformHermesLoops("for (var i = 0; i < 3; i++) fns.push(() => i)", "test.js")).toBeNull();
216
- });
217
- it("leaves the head declaration alone so it cannot collide with a sibling", () => {
218
- const out = transformHermesLoops(`function build(gestures) {
219
- var handlers = []
220
- for (const gesture of gestures) { handlers.push(() => gesture) }
221
- const gesture = gestures[0]
222
- return gesture
223
- }`, "Pressable.js");
224
- expect(() => new vm.Script(out.code)).not.toThrow();
225
- });
226
- it("rewrites a loop in a .js file that still contains jsx", () => {
227
- const out = transformHermesLoops("for (const c of items) rows.push(() => <Row key={c} />)", "Rows.js");
228
- expect(out?.code).toContain("_hermesLoop0");
229
- });
230
- it("does not rewrite a loop that reassigns its own binding", () => {
231
- expect(transformHermesLoops("for (let i = 0; i < 3; i++) { i += 1; fns.push(() => i) }", "test.js")).toBeNull();
232
- });
233
- });
234
- //# sourceMappingURL=transformHermesLoops.test.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["describe","expect","it","vm","transformHermesLoops","runAsHermes","code","asHermesWouldSeeIt","replace","sandbox","result","console","runInNewContext","run","source","out","each","parent","expected","toEqual","condition","toBe","not","toBeNull","resolves","Script","toThrow","toContain"],"sources":["../../src/transformHermesLoops.test.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}