@vxrn/compiler 2.0.0-beta.45.1 → 2.0.0-beta.50.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.
|
@@ -60,7 +60,7 @@ ${unpacker}${rawBody}
|
|
|
60
60
|
}`;
|
|
61
61
|
const transformed = (0, import_oxc_transform.transformSync)("worklet.ts", fullFn);
|
|
62
62
|
assertTransformed(transformed, name, "serialized");
|
|
63
|
-
return transformed.code.trim()
|
|
63
|
+
return `(${transformed.code.trim().replace(/;$/, "")})`;
|
|
64
64
|
}
|
|
65
65
|
function buildLocalFunction(fnNode, code, name) {
|
|
66
66
|
let rawParams = "";
|
|
@@ -35,7 +35,7 @@ ${unpacker}${rawBody}
|
|
|
35
35
|
}`;
|
|
36
36
|
const transformed = transformSync("worklet.ts", fullFn);
|
|
37
37
|
assertTransformed(transformed, name, "serialized");
|
|
38
|
-
return transformed.code.trim()
|
|
38
|
+
return `(${transformed.code.trim().replace(/;$/, "")})`;
|
|
39
39
|
}
|
|
40
40
|
function buildLocalFunction(fnNode, code, name) {
|
|
41
41
|
let rawParams = "";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serialize.js","names":[],"sources":["esm/worklets/serialize.js"],"sourcesContent":["import { transformSync } from \"oxc-transform\";\nimport { bodyStartAfterDirectives } from \"./autoworklet\";\nfunction assertTransformed(transformed, name, what) {\n const error = transformed.errors?.[0];\n if (error) {\n throw new Error(\n `[worklets] failed to build ${what} code for ${name || \"anonymous worklet\"}: ${error.message || error}`\n );\n }\n if (!transformed.code.trim()) {\n throw new Error(\n `[worklets] built empty ${what} code for ${name || \"anonymous worklet\"}`\n );\n }\n}\nfunction serializeWorkletForUI(fnNode, code, name, closureVars) {\n let rawParams = \"\";\n if (fnNode.params && fnNode.params.length > 0) {\n const pStart = fnNode.params[0].start;\n const pEnd = fnNode.params[fnNode.params.length - 1].end;\n rawParams = code.slice(pStart, pEnd);\n }\n let rawBody = \"\";\n if (fnNode.body.type === \"BlockStatement\") {\n const bodyStart = bodyStartAfterDirectives(fnNode, code);\n const bodyEnd = fnNode.body.end - 1;\n rawBody = code.slice(bodyStart, bodyEnd);\n } else {\n rawBody = `return ${code.slice(fnNode.body.start, fnNode.body.end)};`;\n }\n const unpacker = closureVars.length > 0 ? `const { ${closureVars.join(\", \")} } = this.__closure ?? this._closure;\n` : \"\";\n const asyncPrefix = fnNode.async ? \"async \" : \"\";\n const genPrefix = fnNode.generator ? \"*\" : \"\";\n const fnName = name || \"_worklet\";\n const fullFn = `${asyncPrefix}function${genPrefix} ${fnName}(${rawParams}) {\n${unpacker}${rawBody}\n}`;\n const transformed = transformSync(\"worklet.ts\", fullFn);\n assertTransformed(transformed, name, \"serialized\");\n return transformed.code.trim()
|
|
1
|
+
{"version":3,"file":"serialize.js","names":[],"sources":["esm/worklets/serialize.js"],"sourcesContent":["import { transformSync } from \"oxc-transform\";\nimport { bodyStartAfterDirectives } from \"./autoworklet\";\nfunction assertTransformed(transformed, name, what) {\n const error = transformed.errors?.[0];\n if (error) {\n throw new Error(\n `[worklets] failed to build ${what} code for ${name || \"anonymous worklet\"}: ${error.message || error}`\n );\n }\n if (!transformed.code.trim()) {\n throw new Error(\n `[worklets] built empty ${what} code for ${name || \"anonymous worklet\"}`\n );\n }\n}\nfunction serializeWorkletForUI(fnNode, code, name, closureVars) {\n let rawParams = \"\";\n if (fnNode.params && fnNode.params.length > 0) {\n const pStart = fnNode.params[0].start;\n const pEnd = fnNode.params[fnNode.params.length - 1].end;\n rawParams = code.slice(pStart, pEnd);\n }\n let rawBody = \"\";\n if (fnNode.body.type === \"BlockStatement\") {\n const bodyStart = bodyStartAfterDirectives(fnNode, code);\n const bodyEnd = fnNode.body.end - 1;\n rawBody = code.slice(bodyStart, bodyEnd);\n } else {\n rawBody = `return ${code.slice(fnNode.body.start, fnNode.body.end)};`;\n }\n const unpacker = closureVars.length > 0 ? `const { ${closureVars.join(\", \")} } = this.__closure ?? this._closure;\n` : \"\";\n const asyncPrefix = fnNode.async ? \"async \" : \"\";\n const genPrefix = fnNode.generator ? \"*\" : \"\";\n const fnName = name || \"_worklet\";\n const fullFn = `${asyncPrefix}function${genPrefix} ${fnName}(${rawParams}) {\n${unpacker}${rawBody}\n}`;\n const transformed = transformSync(\"worklet.ts\", fullFn);\n assertTransformed(transformed, name, \"serialized\");\n return `(${transformed.code.trim().replace(/;$/, \"\")})`;\n}\nfunction buildLocalFunction(fnNode, code, name) {\n let rawParams = \"\";\n if (fnNode.params && fnNode.params.length > 0) {\n const pStart = fnNode.params[0].start;\n const pEnd = fnNode.params[fnNode.params.length - 1].end;\n rawParams = code.slice(pStart, pEnd);\n }\n let rawBody = \"\";\n if (fnNode.body.type === \"BlockStatement\") {\n const bodyStart = bodyStartAfterDirectives(fnNode, code);\n const bodyEnd = fnNode.body.end - 1;\n rawBody = code.slice(bodyStart, bodyEnd);\n } else {\n rawBody = code.slice(fnNode.body.start, fnNode.body.end);\n }\n let rawFn = \"\";\n const asyncPrefix = fnNode.async ? \"async \" : \"\";\n const genPrefix = fnNode.generator ? \"*\" : \"\";\n if (fnNode.type === \"ArrowFunctionExpression\") {\n if (fnNode.body.type === \"BlockStatement\") {\n rawFn = `${asyncPrefix}(${rawParams}) => {\n${rawBody}\n}`;\n } else {\n rawFn = `${asyncPrefix}(${rawParams}) => (${rawBody})`;\n }\n } else {\n rawFn = `${asyncPrefix}function${genPrefix} ${name || \"_worklet\"}(${rawParams}) {\n${rawBody}\n}`;\n }\n const transformed = transformSync(\"local.ts\", rawFn);\n assertTransformed(transformed, name, \"local\");\n return transformed.code.trim().replace(/;$/, \"\");\n}\nexport {\n buildLocalFunction,\n serializeWorkletForUI\n};\n//# sourceMappingURL=serialize.js.map\n"],"mappings":";;;;AAEA,SAAS,kBAAkB,aAAa,MAAM,MAAM;CAClD,MAAM,QAAQ,YAAY,SAAS;CACnC,IAAI,OAAO;EACT,MAAM,IAAI,MACR,8BAA8B,KAAK,YAAY,QAAQ,oBAAoB,IAAI,MAAM,WAAW,OAClG;CACF;CACA,IAAI,CAAC,YAAY,KAAK,KAAK,GAAG;EAC5B,MAAM,IAAI,MACR,0BAA0B,KAAK,YAAY,QAAQ,qBACrD;CACF;AACF;AACA,SAAS,sBAAsB,QAAQ,MAAM,MAAM,aAAa;CAC9D,IAAI,YAAY;CAChB,IAAI,OAAO,UAAU,OAAO,OAAO,SAAS,GAAG;EAC7C,MAAM,SAAS,OAAO,OAAO,EAAE,CAAC;EAChC,MAAM,OAAO,OAAO,OAAO,OAAO,OAAO,SAAS,EAAE,CAAC;EACrD,YAAY,KAAK,MAAM,QAAQ,IAAI;CACrC;CACA,IAAI,UAAU;CACd,IAAI,OAAO,KAAK,SAAS,kBAAkB;EACzC,MAAM,YAAY,yBAAyB,QAAQ,IAAI;EACvD,MAAM,UAAU,OAAO,KAAK,MAAM;EAClC,UAAU,KAAK,MAAM,WAAW,OAAO;CACzC,OAAO;EACL,UAAU,UAAU,KAAK,MAAM,OAAO,KAAK,OAAO,OAAO,KAAK,GAAG,EAAE;CACrE;CACA,MAAM,WAAW,YAAY,SAAS,IAAI,WAAW,YAAY,KAAK,IAAI,EAAE;IAC1E;CACF,MAAM,cAAc,OAAO,QAAQ,WAAW;CAC9C,MAAM,YAAY,OAAO,YAAY,MAAM;CAC3C,MAAM,SAAS,QAAQ;CACvB,MAAM,SAAS,GAAG,YAAY,UAAU,UAAU,GAAG,OAAO,GAAG,UAAU;EACzE,WAAW,QAAQ;;CAEnB,MAAM,cAAc,cAAc,cAAc,MAAM;CACtD,kBAAkB,aAAa,MAAM,YAAY;CACjD,OAAO,IAAI,YAAY,KAAK,KAAK,CAAC,CAAC,QAAQ,MAAM,EAAE,EAAE;AACvD;AACA,SAAS,mBAAmB,QAAQ,MAAM,MAAM;CAC9C,IAAI,YAAY;CAChB,IAAI,OAAO,UAAU,OAAO,OAAO,SAAS,GAAG;EAC7C,MAAM,SAAS,OAAO,OAAO,EAAE,CAAC;EAChC,MAAM,OAAO,OAAO,OAAO,OAAO,OAAO,SAAS,EAAE,CAAC;EACrD,YAAY,KAAK,MAAM,QAAQ,IAAI;CACrC;CACA,IAAI,UAAU;CACd,IAAI,OAAO,KAAK,SAAS,kBAAkB;EACzC,MAAM,YAAY,yBAAyB,QAAQ,IAAI;EACvD,MAAM,UAAU,OAAO,KAAK,MAAM;EAClC,UAAU,KAAK,MAAM,WAAW,OAAO;CACzC,OAAO;EACL,UAAU,KAAK,MAAM,OAAO,KAAK,OAAO,OAAO,KAAK,GAAG;CACzD;CACA,IAAI,QAAQ;CACZ,MAAM,cAAc,OAAO,QAAQ,WAAW;CAC9C,MAAM,YAAY,OAAO,YAAY,MAAM;CAC3C,IAAI,OAAO,SAAS,2BAA2B;EAC7C,IAAI,OAAO,KAAK,SAAS,kBAAkB;GACzC,QAAQ,GAAG,YAAY,GAAG,UAAU;EACxC,QAAQ;;EAEN,OAAO;GACL,QAAQ,GAAG,YAAY,GAAG,UAAU,QAAQ,QAAQ;EACtD;CACF,OAAO;EACL,QAAQ,GAAG,YAAY,UAAU,UAAU,GAAG,QAAQ,WAAW,GAAG,UAAU;EAChF,QAAQ;;CAER;CACA,MAAM,cAAc,cAAc,YAAY,KAAK;CACnD,kBAAkB,aAAa,MAAM,OAAO;CAC5C,OAAO,YAAY,KAAK,KAAK,CAAC,CAAC,QAAQ,MAAM,EAAE;AACjD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vxrn/compiler",
|
|
3
|
-
"version": "2.0.0-beta.
|
|
3
|
+
"version": "2.0.0-beta.50.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
"./package.json": "./package.json",
|
|
@@ -36,8 +36,8 @@
|
|
|
36
36
|
"@babel/plugin-transform-react-jsx": "^7.27.1",
|
|
37
37
|
"@babel/plugin-transform-regenerator": "^7.28.4",
|
|
38
38
|
"@jridgewell/remapping": "^2.3.0",
|
|
39
|
-
"@vxrn/utils": "2.0.0-beta.
|
|
40
|
-
"@vxrn/vite-native-client": "2.0.0-beta.
|
|
39
|
+
"@vxrn/utils": "2.0.0-beta.50.1",
|
|
40
|
+
"@vxrn/vite-native-client": "2.0.0-beta.50.1",
|
|
41
41
|
"babel-plugin-react-compiler": "^1.0.0",
|
|
42
42
|
"babel-plugin-syntax-hermes-parser": "^0.36.1",
|
|
43
43
|
"babel-plugin-transform-flow-enums": "^0.0.2",
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import fs from 'node:fs'
|
|
2
2
|
import os from 'node:os'
|
|
3
|
+
import { createRequire } from 'node:module'
|
|
3
4
|
import path from 'node:path'
|
|
4
5
|
import { afterEach, describe, expect, it } from 'vitest'
|
|
5
6
|
import { configureVXRNCompilerPlugin } from './configure'
|
|
@@ -64,6 +65,11 @@ describe('transformWorklets', () => {
|
|
|
64
65
|
expect(result.code).toContain('__initData')
|
|
65
66
|
expect(result.code).toContain('__closure')
|
|
66
67
|
expect(result.map).toBeUndefined()
|
|
68
|
+
const serialized = result.code.match(/code: ("(?:\\.|[^"\\])*")/)?.[1]
|
|
69
|
+
expect(serialized, 'serialized worklet code').toBeTruthy()
|
|
70
|
+
const worklet = (0, eval)(JSON.parse(serialized!))
|
|
71
|
+
expect(worklet).toBeTypeOf('function')
|
|
72
|
+
expect(worklet()).toBe(42)
|
|
67
73
|
})
|
|
68
74
|
|
|
69
75
|
it('ignores calls whose callee name collides with Object.prototype', async () => {
|
|
@@ -136,7 +142,7 @@ describe('transformWorklets', () => {
|
|
|
136
142
|
`
|
|
137
143
|
const result = await transformWorklets('/app/handler.ts', code, false)
|
|
138
144
|
expect(result.code).toContain('__workletHash')
|
|
139
|
-
expect(result.code).toMatch(/code: "function _worklet\(e\)/)
|
|
145
|
+
expect(result.code).toMatch(/code: "\(function _worklet\(e\)/)
|
|
140
146
|
expect(result.code).toContain('var _worklet = function _worklet(e)')
|
|
141
147
|
})
|
|
142
148
|
|
|
@@ -162,7 +168,7 @@ describe('transformWorklets', () => {
|
|
|
162
168
|
const result = await transformWorklets('/app/setupLoop.ts', code, false)
|
|
163
169
|
|
|
164
170
|
expect(result.code).toMatch(/setupLoop\.__closure = \{\s*\}/)
|
|
165
|
-
const init = result.code.match(/code: "function setupLoop[^"]*"/)
|
|
171
|
+
const init = result.code.match(/code: "\(function setupLoop[^"]*"/)
|
|
166
172
|
expect(init, 'serialized worklet code').toBeTruthy()
|
|
167
173
|
expect(init![0]).not.toContain('this.__closure')
|
|
168
174
|
expect(init![0]).toContain('flushQueue')
|
|
@@ -190,7 +196,7 @@ describe('transformWorklets', () => {
|
|
|
190
196
|
`
|
|
191
197
|
const result = await transformWorklets('/app/installUnpacker.ts', code, false)
|
|
192
198
|
|
|
193
|
-
const outerInit = result.code.match(/code: "function installUnpacker[^"]*"/)
|
|
199
|
+
const outerInit = result.code.match(/code: "\(function installUnpacker[^"]*"/)
|
|
194
200
|
expect(outerInit, 'outer worklet serialized code').toBeTruthy()
|
|
195
201
|
// no unpacker line: nothing is read off `this` on the worklet runtime.
|
|
196
202
|
expect(outerInit![0]).not.toContain('this.__closure')
|
|
@@ -201,7 +207,7 @@ describe('transformWorklets', () => {
|
|
|
201
207
|
// the inner worklet's init data is declared inside the outer function body,
|
|
202
208
|
// not hoisted to module scope where the worklet runtime cannot see it.
|
|
203
209
|
const innerVar = result.code.match(
|
|
204
|
-
/var (_worklet_\d+_init_data) = \{\s*code: "function _worklet/
|
|
210
|
+
/var (_worklet_\d+_init_data) = \{\s*code: "\(function _worklet/
|
|
205
211
|
)
|
|
206
212
|
expect(innerVar, 'inner worklet init data').toBeTruthy()
|
|
207
213
|
// only look past the serialized string, which mentions the same name inside
|
|
@@ -381,7 +387,12 @@ describe('transformWorklets', () => {
|
|
|
381
387
|
expect(typeof scaleFn).toBe('function')
|
|
382
388
|
expect(scaleFn.__workletHash).toBeDefined()
|
|
383
389
|
expect(typeof scaleFn.__workletHash).toBe('number')
|
|
384
|
-
|
|
390
|
+
// /app has no package.json, so the stamp comes from the worklets runtime
|
|
391
|
+
// this workspace actually installs
|
|
392
|
+
const installedWorklets = createRequire(path.resolve(process.cwd(), 'package.json'))(
|
|
393
|
+
'react-native-worklets/package.json'
|
|
394
|
+
).version
|
|
395
|
+
expect(scaleFn.__pluginVersion).toBe(installedWorklets)
|
|
385
396
|
expect(scaleFn.__closure).toEqual({ multiplier: 5 })
|
|
386
397
|
expect(scaleFn.__initData).toBeDefined()
|
|
387
398
|
expect(scaleFn.__initData.code).toContain('__closure')
|
|
@@ -64,7 +64,7 @@ export function serializeWorkletForUI(
|
|
|
64
64
|
|
|
65
65
|
const transformed = transformSync('worklet.ts', fullFn)
|
|
66
66
|
assertTransformed(transformed, name, 'serialized')
|
|
67
|
-
return transformed.code.trim()
|
|
67
|
+
return `(${transformed.code.trim().replace(/;$/, '')})`
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
/**
|