@vxrn/compiler 2.0.0-beta.46.1 → 2.0.0-beta.51.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.51.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.51.1",
|
|
40
|
+
"@vxrn/vite-native-client": "2.0.0-beta.51.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",
|
|
@@ -65,6 +65,11 @@ describe('transformWorklets', () => {
|
|
|
65
65
|
expect(result.code).toContain('__initData')
|
|
66
66
|
expect(result.code).toContain('__closure')
|
|
67
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)
|
|
68
73
|
})
|
|
69
74
|
|
|
70
75
|
it('ignores calls whose callee name collides with Object.prototype', async () => {
|
|
@@ -137,7 +142,7 @@ describe('transformWorklets', () => {
|
|
|
137
142
|
`
|
|
138
143
|
const result = await transformWorklets('/app/handler.ts', code, false)
|
|
139
144
|
expect(result.code).toContain('__workletHash')
|
|
140
|
-
expect(result.code).toMatch(/code: "function _worklet\(e\)/)
|
|
145
|
+
expect(result.code).toMatch(/code: "\(function _worklet\(e\)/)
|
|
141
146
|
expect(result.code).toContain('var _worklet = function _worklet(e)')
|
|
142
147
|
})
|
|
143
148
|
|
|
@@ -163,7 +168,7 @@ describe('transformWorklets', () => {
|
|
|
163
168
|
const result = await transformWorklets('/app/setupLoop.ts', code, false)
|
|
164
169
|
|
|
165
170
|
expect(result.code).toMatch(/setupLoop\.__closure = \{\s*\}/)
|
|
166
|
-
const init = result.code.match(/code: "function setupLoop[^"]*"/)
|
|
171
|
+
const init = result.code.match(/code: "\(function setupLoop[^"]*"/)
|
|
167
172
|
expect(init, 'serialized worklet code').toBeTruthy()
|
|
168
173
|
expect(init![0]).not.toContain('this.__closure')
|
|
169
174
|
expect(init![0]).toContain('flushQueue')
|
|
@@ -191,7 +196,7 @@ describe('transformWorklets', () => {
|
|
|
191
196
|
`
|
|
192
197
|
const result = await transformWorklets('/app/installUnpacker.ts', code, false)
|
|
193
198
|
|
|
194
|
-
const outerInit = result.code.match(/code: "function installUnpacker[^"]*"/)
|
|
199
|
+
const outerInit = result.code.match(/code: "\(function installUnpacker[^"]*"/)
|
|
195
200
|
expect(outerInit, 'outer worklet serialized code').toBeTruthy()
|
|
196
201
|
// no unpacker line: nothing is read off `this` on the worklet runtime.
|
|
197
202
|
expect(outerInit![0]).not.toContain('this.__closure')
|
|
@@ -202,7 +207,7 @@ describe('transformWorklets', () => {
|
|
|
202
207
|
// the inner worklet's init data is declared inside the outer function body,
|
|
203
208
|
// not hoisted to module scope where the worklet runtime cannot see it.
|
|
204
209
|
const innerVar = result.code.match(
|
|
205
|
-
/var (_worklet_\d+_init_data) = \{\s*code: "function _worklet/
|
|
210
|
+
/var (_worklet_\d+_init_data) = \{\s*code: "\(function _worklet/
|
|
206
211
|
)
|
|
207
212
|
expect(innerVar, 'inner worklet init data').toBeTruthy()
|
|
208
213
|
// only look past the serialized string, which mentions the same name inside
|
|
@@ -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
|
/**
|