vxrn 1.25.4 → 1.25.6
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/dist/plugins/reactNativeDevServer.mjs +45 -14
- package/dist/plugins/reactNativeDevServer.mjs.map +1 -1
- package/dist/plugins/reactNativeDevServer.native.js +45 -14
- package/dist/plugins/reactNativeDevServer.native.js.map +1 -1
- package/dist/utils/createNativeDevEngine.mjs +137 -72
- package/dist/utils/createNativeDevEngine.mjs.map +1 -1
- package/dist/utils/createNativeDevEngine.native.js +136 -68
- package/dist/utils/createNativeDevEngine.native.js.map +1 -1
- package/dist/utils/createNativeDevEngine.test.mjs +79 -3
- package/dist/utils/createNativeDevEngine.test.mjs.map +1 -1
- package/dist/utils/createNativeDevEngine.test.native.js +101 -4
- package/dist/utils/createNativeDevEngine.test.native.js.map +1 -1
- package/package.json +11 -11
- package/src/plugins/reactNativeDevServer.ts +57 -17
- package/src/utils/createNativeDevEngine.test.ts +95 -0
- package/src/utils/createNativeDevEngine.ts +156 -84
- package/types/plugins/reactNativeDevServer.d.ts.map +1 -1
- package/types/utils/createNativeDevEngine.d.ts +17 -6
- package/types/utils/createNativeDevEngine.d.ts.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["describe","expect","it","getHermesSWCIncludes","getNativeTransformConfig","hmrClientNoopPlugin","vxrnCompilerPlugin","wrapNativeBundleModuleScope","root","_loop","_i2","_iter2","_loop2","_i12","_iter12","dev","platform","define","toBe","JSON","stringify","envObject","parse","TAMAGUI_TARGET","TAMAGUI_ENVIRONMENT","_i1","_iter1","length","_i","_iter","RUNTIME_MARKER","out","openIdx","indexOf","toBeGreaterThan","toBeLessThan","Function","not","toThrow","input","CLASS_SET","toEqual","arrayContaining","toContain","plugin","resolveId","load","VIRTUAL_ID","each","source","importer","id","external","toBeUndefined","result","moduleType","method","code","previousNodeEnv","process","env","NODE_ENV","transform"],"sources":["createNativeDevEngine.test.native.js"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { getHermesSWCIncludes, getNativeTransformConfig, hmrClientNoopPlugin, vxrnCompilerPlugin, wrapNativeBundleModuleScope } from \"./createNativeDevEngine\";\n\nvar root = \"/tmp/vxrn-native-env-define-test-nonexistent\";\ndescribe(\"getNativeTransformConfig platform env defines\", function() {\n\tvar _loop = function(_i2, _iter2) {\n\t\tvar _loop2 = function(_i12, _iter12) {\n\t\t\tvar dev = _iter12[_i12];\n\t\t\tit(`injects TAMAGUI_TARGET=native for ${platform} (dev=${dev})`, function() {\n\t\t\t\tvar { define } = getNativeTransformConfig(platform, dev, root);\n\t\t\t\texpect(define[\"import.meta.env.TAMAGUI_TARGET\"]).toBe(\"\\\"native\\\"\");\n\t\t\t\texpect(define[\"process.env.TAMAGUI_TARGET\"]).toBe(\"\\\"native\\\"\");\n\t\t\t\texpect(define[\"import.meta.env.TAMAGUI_ENVIRONMENT\"]).toBe(JSON.stringify(platform));\n\t\t\t\texpect(define[\"import.meta.env.VITE_ENVIRONMENT\"]).toBe(JSON.stringify(platform));\n\t\t\t\texpect(define[\"import.meta.env.VITE_NATIVE\"]).toBe(\"\\\"1\\\"\");\n\t\t\t\texpect(define[\"import.meta.env.EXPO_OS\"]).toBe(JSON.stringify(platform));\n\t\t\t\tvar envObject = JSON.parse(define[\"import.meta.env\"]);\n\t\t\t\texpect(envObject.TAMAGUI_TARGET).toBe(\"native\");\n\t\t\t\texpect(envObject.TAMAGUI_ENVIRONMENT).toBe(platform);\n\t\t\t});\n\t\t};\n\t\tvar platform = _iter2[_i2];\n\t\tfor (var _i1 = 0, _iter1 = [true, false]; _i1 < _iter1.length; _i1++) _loop2(_i1, _iter1);\n\t};\n\tfor (var _i = 0, _iter = [\"ios\", \"android\"]; _i < _iter.length; _i++) _loop(_i, _iter);\n});\ndescribe(\"wrapNativeBundleModuleScope\", function() {\n\tvar RUNTIME_MARKER = \"//#region \\\\0rolldown/runtime.js\";\n\tit(\"wraps module code after the prelude so top-level vars do not leak to global\", function() {\n\t\tvar out = wrapNativeBundleModuleScope(`globalThis.global = globalThis;\nglobalThis.__DEV__ = true;\n${RUNTIME_MARKER}\nvar fetch_hot, fetch$1, Headers, Request, Response$1;\nglobalThis.__rolldown_runtime__ = {};\n`);\n\t\tvar openIdx = out.indexOf(\";(function() {\");\n\t\texpect(openIdx).toBeGreaterThan(-1);\n\t\texpect(out.indexOf(\"globalThis.__DEV__\")).toBeLessThan(openIdx);\n\t\texpect(out.indexOf(\"var fetch_hot\")).toBeGreaterThan(openIdx);\n\t\texpect(function() {\n\t\t\treturn new Function(out);\n\t\t}).not.toThrow();\n\t});\n\tit(\"is a no-op when the runtime marker is absent (e.g. prod bundle)\", function() {\n\t\tvar input = \"var x = 1;\\nconsole.log(x);\\n\";\n\t\texpect(wrapNativeBundleModuleScope(input)).toBe(input);\n\t});\n});\ndescribe(\"getHermesSWCIncludes\", function() {\n\tvar CLASS_SET = [\n\t\t\"transform-classes\",\n\t\t\"transform-class-properties\",\n\t\t\"transform-class-static-block\",\n\t\t\"transform-private-methods\",\n\t\t\"transform-private-property-in-object\"\n\t];\n\tit(\"always includes the full Hermes class-transform set (dev and prod)\", function() {\n\t\texpect(getHermesSWCIncludes(true)).toEqual(expect.arrayContaining(CLASS_SET));\n\t\texpect(getHermesSWCIncludes(false)).toEqual(expect.arrayContaining(CLASS_SET));\n\t});\n\tit(\"adds transform-async-to-generator only in production\", function() {\n\t\texpect(getHermesSWCIncludes(true)).not.toContain(\"transform-async-to-generator\");\n\t\texpect(getHermesSWCIncludes(false)).toContain(\"transform-async-to-generator\");\n\t});\n});\ndescribe(\"hmrClientNoopPlugin\", function() {\n\tvar plugin = hmrClientNoopPlugin();\n\tvar resolveId = plugin.resolveId;\n\tvar load = plugin.load;\n\tvar VIRTUAL_ID = \"\\0vxrn-hmr-client-noop\";\n\tit.each([\n\t\t[\"react-native/Libraries/Utilities/HMRClient\", void 0],\n\t\t[\"../Utilities/HMRClient\", \"/project/node_modules/react-native/Libraries/Core.js\"],\n\t\t[\"../../Utilities/HMRClient.js\", \"/project/react-native/Libraries/Core.js\"],\n\t\t[\"..\\\\Utilities\\\\HMRClient.js\", \"C:\\\\project\\\\react-native\\\\Libraries\\\\Core.js\"],\n\t\t[\"../Utilities/HMRClient.ts\", \"/project/node_modules/react-native/Core.js\"],\n\t\t[\"../Utilities/HMRClient.tsx\", \"/project/node_modules/react-native/Core.js\"],\n\t\t[\"../Utilities/HMRClient.cjs\", \"/project/node_modules/react-native/Core.js\"]\n\t])(\"aliases RN HMRClient specifier %j to the no-op virtual module\", function(source, importer) {\n\t\texpect(resolveId(source, importer)).toEqual({\n\t\t\tid: VIRTUAL_ID,\n\t\t\texternal: false\n\t\t});\n\t});\n\tit.each([\n\t\t\"react-native/Libraries/Utilities/HMRClientRegistry\",\n\t\t\"some/MyUtilities/HMRClient\",\n\t\t\"react-native/Libraries/Core/setUpDeveloperTools\",\n\t\t\"react\"\n\t])(\"does not touch unrelated specifier %j\", function(source) {\n\t\texpect(resolveId(source)).toBeUndefined();\n\t});\n\tit(\"does not alias an app-authored Utilities/HMRClient module\", function() {\n\t\texpect(resolveId(\"../Utilities/HMRClient\", \"/project/src/App.tsx\")).toBeUndefined();\n\t});\n\tit(\"loads a no-op module exposing every HMRClient method RN calls\", function() {\n\t\tvar result = load(VIRTUAL_ID);\n\t\texpect(result === null || result === void 0 ? void 0 : result.moduleType).toBe(\"js\");\n\t\tfor (var _i = 0, _iter = [\n\t\t\t\"setup\",\n\t\t\t\"enable\",\n\t\t\t\"disable\",\n\t\t\t\"registerBundle\",\n\t\t\t\"log\",\n\t\t\t\"isEnabled\"\n\t\t]; _i < _iter.length; _i++) {\n\t\t\tvar method = _iter[_i];\n\t\t\texpect(result.code).toContain(method);\n\t\t}\n\t\texpect(result.code).toContain(\"export default HMRClient\");\n\t});\n\tit(\"does not load unrelated ids\", function() {\n\t\texpect(load(\"\\0some-other-virtual\")).toBeUndefined();\n\t});\n});\ndescribe(\"vxrnCompilerPlugin React Refresh registration\", function() {\n\tit(\"keeps initial-bundle registrations visible to rolldown\", async function() {\n\t\tvar previousNodeEnv = process.env.NODE_ENV;\n\t\tprocess.env.NODE_ENV = \"test\";\n\t\ttry {\n\t\t\tvar transform = vxrnCompilerPlugin(\"ios\", true).transform;\n\t\t\tvar code = (await transform(\"export const marker = \\\"$RefreshReg$(\\\"; export function Probe() { return <div>probe</div> }\", \"/project/src/Probe.tsx\")).code;\n\t\t\texpect(code).toContain(\"var __vxrnRefreshReg = globalThis.$RefreshReg$\");\n\t\t\texpect(code).toContain(\"__vxrnRefreshReg(\");\n\t\t\texpect(code).toContain(\"\\\"$RefreshReg$(\\\"\");\n\t\t} finally {\n\t\t\tprocess.env.NODE_ENV = previousNodeEnv;\n\t\t}\n\t});\n});\n\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["mkdtemp","rm","writeFile","tmpdir","join","dev","describe","expect","it","getHermesSWCIncludes","getHmrRuntimeSource","getNativeTransformConfig","hmrClientNoopPlugin","vxrnCompilerPlugin","wrapNativeBundleModuleScope","_instanceof","left","right","Symbol","hasInstance","_type_of","obj","constructor","timeout","testRoot","entry","source","version","resolveInitialOutput","initialOutput","Promise","resolve","resolveHmrUpdate","hmrUpdate","engine","cwd","input","experimental","devMode","implement","format","onOutput","result2","onHmrUpdates","Error","changedFiles","length","_result_updates_find","run","initial","chunk","output","find","item","type","isEntry","toBeTruthy","globalThis","__rolldown_runtime__","Buffer","from","code","toString","runtime","clientId","toBe","registerClient","setTimeout","patch","race","_","reject","updates","update","applyHmrUpdate","changedIds","seq","__vxrnHmrBody","__vxrnHmrAccepted","close","recursive","force","root","_loop","_i2","_iter2","_loop2","_i12","_iter12","dev2","platform","define","JSON","stringify","envObject","parse","TAMAGUI_TARGET","TAMAGUI_ENVIRONMENT","_i1","_iter1","_i","_iter","RUNTIME_MARKER","out","openIdx","indexOf","toBeGreaterThan","toBeLessThan","Function","not","toThrow","CLASS_SET","toEqual","arrayContaining","toContain","plugin","resolveId","load","VIRTUAL_ID","each","importer","id","external","toBeUndefined","result","moduleType","method","previousNodeEnv","process","env","NODE_ENV","transform"],"sources":["createNativeDevEngine.test.native.js"],"sourcesContent":["import { mkdtemp, rm, writeFile } from \"fs/promises\";\nimport { tmpdir } from \"os\";\nimport { join } from \"path\";\nimport { dev } from \"rolldown/experimental\";\nimport { describe, expect, it } from \"vitest\";\nimport { getHermesSWCIncludes, getHmrRuntimeSource, getNativeTransformConfig, hmrClientNoopPlugin, vxrnCompilerPlugin, wrapNativeBundleModuleScope } from \"./createNativeDevEngine\";\n\nfunction _instanceof(left, right) {\n\tif (right != null && typeof Symbol !== \"undefined\" && right[Symbol.hasInstance]) return !!right[Symbol.hasInstance](left);\n\telse return left instanceof right;\n}\nfunction _type_of(obj) {\n\t\"@swc/helpers - typeof\";\n\treturn obj && typeof Symbol !== \"undefined\" && obj.constructor === Symbol ? \"symbol\" : typeof obj;\n}\ndescribe(\"native Rolldown HMR runtime\", function() {\n\tit(\"registers a Rolldown 1.2 client and applies a self-accepted patch\", { timeout: 3e4 }, async function() {\n\t\tvar testRoot = await mkdtemp(join(tmpdir(), \"vxrn-native-hmr-\"));\n\t\tvar entry = join(testRoot, \"entry.js\");\n\t\tvar source = function(version) {\n\t\t\treturn `\nglobalThis.__vxrnHmrBody = '${version}'\nexport const value = '${version}'\nif (import.meta.hot) {\n import.meta.hot.accept((next) => {\n globalThis.__vxrnHmrAccepted = next.value\n })\n}\n`;\n\t\t};\n\t\tawait writeFile(entry, source(\"v1\"));\n\t\tvar resolveInitialOutput;\n\t\tvar initialOutput = new Promise(function(resolve) {\n\t\t\tresolveInitialOutput = resolve;\n\t\t});\n\t\tvar resolveHmrUpdate;\n\t\tvar hmrUpdate = new Promise(function(resolve) {\n\t\t\tresolveHmrUpdate = resolve;\n\t\t});\n\t\tvar engine = await dev({\n\t\t\tcwd: testRoot,\n\t\t\tinput: entry,\n\t\t\texperimental: { devMode: { implement: getHmrRuntimeSource() } }\n\t\t}, { format: \"esm\" }, {\n\t\t\tonOutput(result2) {\n\t\t\t\tresolveInitialOutput(result2);\n\t\t\t},\n\t\t\tonHmrUpdates(result2) {\n\t\t\t\tif (!_instanceof(result2, Error) && result2.changedFiles.length) resolveHmrUpdate(result2);\n\t\t\t}\n\t\t});\n\t\ttry {\n\t\t\tvar _result_updates_find;\n\t\t\tawait engine.run();\n\t\t\tvar initial = await initialOutput;\n\t\t\tif (_instanceof(initial, Error)) throw initial;\n\t\t\tvar chunk = initial.output.find(function(item) {\n\t\t\t\treturn item.type === \"chunk\" && item.isEntry;\n\t\t\t});\n\t\t\texpect(chunk).toBeTruthy();\n\t\t\tdelete globalThis.__rolldown_runtime__;\n\t\t\tawait import(`data:text/javascript;base64,${Buffer.from(chunk.code).toString(\"base64\")}`);\n\t\t\tvar runtime = globalThis.__rolldown_runtime__;\n\t\t\texpect(_type_of(runtime.clientId)).toBe(\"string\");\n\t\t\tawait engine.registerClient(runtime.clientId);\n\t\t\tawait new Promise(function(resolve) {\n\t\t\t\treturn setTimeout(resolve, 100);\n\t\t\t});\n\t\t\tawait writeFile(entry, source(\"v2\"));\n\t\t\tvar patch = (_result_updates_find = (await Promise.race([hmrUpdate, new Promise(function(_, reject) {\n\t\t\t\treturn setTimeout(function() {\n\t\t\t\t\treturn reject(/* @__PURE__ */ new Error(\"timed out waiting for HMR patch\"));\n\t\t\t\t}, 1e4);\n\t\t\t})])).updates.find(function(item) {\n\t\t\t\treturn item.clientId === runtime.clientId && item.update.type === \"Patch\";\n\t\t\t})) === null || _result_updates_find === void 0 ? void 0 : _result_updates_find.update;\n\t\t\texpect(patch).toBeTruthy();\n\t\t\texpect(runtime.applyHmrUpdate(patch.code, patch.changedIds, patch.seq)).toBe(true);\n\t\t\texpect(globalThis.__vxrnHmrBody).toBe(\"v2\");\n\t\t\texpect(globalThis.__vxrnHmrAccepted).toBe(\"v2\");\n\t\t} finally {\n\t\t\tawait engine.close();\n\t\t\tawait rm(testRoot, {\n\t\t\t\trecursive: true,\n\t\t\t\tforce: true\n\t\t\t});\n\t\t\tdelete globalThis.__rolldown_runtime__;\n\t\t\tdelete globalThis.__vxrnHmrBody;\n\t\t\tdelete globalThis.__vxrnHmrAccepted;\n\t\t}\n\t});\n});\nvar root = \"/tmp/vxrn-native-env-define-test-nonexistent\";\ndescribe(\"getNativeTransformConfig platform env defines\", function() {\n\tvar _loop = function(_i2, _iter2) {\n\t\tvar _loop2 = function(_i12, _iter12) {\n\t\t\tvar dev2 = _iter12[_i12];\n\t\t\tit(`injects TAMAGUI_TARGET=native for ${platform} (dev=${dev2})`, function() {\n\t\t\t\tvar { define } = getNativeTransformConfig(platform, dev2, root);\n\t\t\t\texpect(define[\"import.meta.env.TAMAGUI_TARGET\"]).toBe(\"\\\"native\\\"\");\n\t\t\t\texpect(define[\"process.env.TAMAGUI_TARGET\"]).toBe(\"\\\"native\\\"\");\n\t\t\t\texpect(define[\"import.meta.env.TAMAGUI_ENVIRONMENT\"]).toBe(JSON.stringify(platform));\n\t\t\t\texpect(define[\"import.meta.env.VITE_ENVIRONMENT\"]).toBe(JSON.stringify(platform));\n\t\t\t\texpect(define[\"import.meta.env.VITE_NATIVE\"]).toBe(\"\\\"1\\\"\");\n\t\t\t\texpect(define[\"import.meta.env.EXPO_OS\"]).toBe(JSON.stringify(platform));\n\t\t\t\tvar envObject = JSON.parse(define[\"import.meta.env\"]);\n\t\t\t\texpect(envObject.TAMAGUI_TARGET).toBe(\"native\");\n\t\t\t\texpect(envObject.TAMAGUI_ENVIRONMENT).toBe(platform);\n\t\t\t});\n\t\t};\n\t\tvar platform = _iter2[_i2];\n\t\tfor (var _i1 = 0, _iter1 = [true, false]; _i1 < _iter1.length; _i1++) _loop2(_i1, _iter1);\n\t};\n\tfor (var _i = 0, _iter = [\"ios\", \"android\"]; _i < _iter.length; _i++) _loop(_i, _iter);\n});\ndescribe(\"wrapNativeBundleModuleScope\", function() {\n\tvar RUNTIME_MARKER = \"//#region \\\\0rolldown/runtime.js\";\n\tit(\"wraps module code after the prelude so top-level vars do not leak to global\", function() {\n\t\tvar out = wrapNativeBundleModuleScope(`globalThis.global = globalThis;\nglobalThis.__DEV__ = true;\n${RUNTIME_MARKER}\nvar fetch_hot, fetch$1, Headers, Request, Response$1;\nglobalThis.__rolldown_runtime__ = {};\n`);\n\t\tvar openIdx = out.indexOf(\";(function() {\");\n\t\texpect(openIdx).toBeGreaterThan(-1);\n\t\texpect(out.indexOf(\"globalThis.__DEV__\")).toBeLessThan(openIdx);\n\t\texpect(out.indexOf(\"var fetch_hot\")).toBeGreaterThan(openIdx);\n\t\texpect(function() {\n\t\t\treturn new Function(out);\n\t\t}).not.toThrow();\n\t});\n\tit(\"is a no-op when the runtime marker is absent (e.g. prod bundle)\", function() {\n\t\tvar input = \"var x = 1;\\nconsole.log(x);\\n\";\n\t\texpect(wrapNativeBundleModuleScope(input)).toBe(input);\n\t});\n});\ndescribe(\"getHermesSWCIncludes\", function() {\n\tvar CLASS_SET = [\n\t\t\"transform-classes\",\n\t\t\"transform-class-properties\",\n\t\t\"transform-class-static-block\",\n\t\t\"transform-private-methods\",\n\t\t\"transform-private-property-in-object\"\n\t];\n\tit(\"always includes the full Hermes class-transform set (dev and prod)\", function() {\n\t\texpect(getHermesSWCIncludes(true)).toEqual(expect.arrayContaining(CLASS_SET));\n\t\texpect(getHermesSWCIncludes(false)).toEqual(expect.arrayContaining(CLASS_SET));\n\t});\n\tit(\"adds transform-async-to-generator only in production\", function() {\n\t\texpect(getHermesSWCIncludes(true)).not.toContain(\"transform-async-to-generator\");\n\t\texpect(getHermesSWCIncludes(false)).toContain(\"transform-async-to-generator\");\n\t});\n});\ndescribe(\"hmrClientNoopPlugin\", function() {\n\tvar plugin = hmrClientNoopPlugin();\n\tvar resolveId = plugin.resolveId;\n\tvar load = plugin.load;\n\tvar VIRTUAL_ID = \"\\0vxrn-hmr-client-noop\";\n\tit.each([\n\t\t[\"react-native/Libraries/Utilities/HMRClient\", void 0],\n\t\t[\"../Utilities/HMRClient\", \"/project/node_modules/react-native/Libraries/Core.js\"],\n\t\t[\"../../Utilities/HMRClient.js\", \"/project/react-native/Libraries/Core.js\"],\n\t\t[\"..\\\\Utilities\\\\HMRClient.js\", \"C:\\\\project\\\\react-native\\\\Libraries\\\\Core.js\"],\n\t\t[\"../Utilities/HMRClient.ts\", \"/project/node_modules/react-native/Core.js\"],\n\t\t[\"../Utilities/HMRClient.tsx\", \"/project/node_modules/react-native/Core.js\"],\n\t\t[\"../Utilities/HMRClient.cjs\", \"/project/node_modules/react-native/Core.js\"]\n\t])(\"aliases RN HMRClient specifier %j to the no-op virtual module\", function(source, importer) {\n\t\texpect(resolveId(source, importer)).toEqual({\n\t\t\tid: VIRTUAL_ID,\n\t\t\texternal: false\n\t\t});\n\t});\n\tit.each([\n\t\t\"react-native/Libraries/Utilities/HMRClientRegistry\",\n\t\t\"some/MyUtilities/HMRClient\",\n\t\t\"react-native/Libraries/Core/setUpDeveloperTools\",\n\t\t\"react\"\n\t])(\"does not touch unrelated specifier %j\", function(source) {\n\t\texpect(resolveId(source)).toBeUndefined();\n\t});\n\tit(\"does not alias an app-authored Utilities/HMRClient module\", function() {\n\t\texpect(resolveId(\"../Utilities/HMRClient\", \"/project/src/App.tsx\")).toBeUndefined();\n\t});\n\tit(\"loads a no-op module exposing every HMRClient method RN calls\", function() {\n\t\tvar result = load(VIRTUAL_ID);\n\t\texpect(result === null || result === void 0 ? void 0 : result.moduleType).toBe(\"js\");\n\t\tfor (var _i = 0, _iter = [\n\t\t\t\"setup\",\n\t\t\t\"enable\",\n\t\t\t\"disable\",\n\t\t\t\"registerBundle\",\n\t\t\t\"log\",\n\t\t\t\"isEnabled\"\n\t\t]; _i < _iter.length; _i++) {\n\t\t\tvar method = _iter[_i];\n\t\t\texpect(result.code).toContain(method);\n\t\t}\n\t\texpect(result.code).toContain(\"export default HMRClient\");\n\t});\n\tit(\"does not load unrelated ids\", function() {\n\t\texpect(load(\"\\0some-other-virtual\")).toBeUndefined();\n\t});\n});\ndescribe(\"vxrnCompilerPlugin React Refresh registration\", function() {\n\tit(\"keeps initial-bundle registrations visible to rolldown\", async function() {\n\t\tvar previousNodeEnv = process.env.NODE_ENV;\n\t\tprocess.env.NODE_ENV = \"test\";\n\t\ttry {\n\t\t\tvar transform = vxrnCompilerPlugin(\"ios\", true).transform;\n\t\t\tvar code = (await transform(\"export const marker = \\\"$RefreshReg$(\\\"; export function Probe() { return <div>probe</div> }\", \"/project/src/Probe.tsx\")).code;\n\t\t\texpect(code).toContain(\"var __vxrnRefreshReg = globalThis.$RefreshReg$\");\n\t\t\texpect(code).toContain(\"__vxrnRefreshReg(\");\n\t\t\texpect(code).toContain(\"\\\"$RefreshReg$(\\\"\");\n\t\t} finally {\n\t\t\tprocess.env.NODE_ENV = previousNodeEnv;\n\t\t}\n\t});\n});\n\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vxrn",
|
|
3
|
-
"version": "1.25.
|
|
3
|
+
"version": "1.25.6",
|
|
4
4
|
"sideEffects": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -62,16 +62,16 @@
|
|
|
62
62
|
"@expo/config-plugins": "~57.0.6",
|
|
63
63
|
"@hono/node-server": "^1.19.14",
|
|
64
64
|
"@react-native/dev-middleware": "^0.86.2",
|
|
65
|
-
"@vxrn/compiler": "1.25.
|
|
66
|
-
"@vxrn/debug": "1.25.
|
|
67
|
-
"@vxrn/query-string": "1.25.
|
|
68
|
-
"@vxrn/resolve": "1.25.
|
|
69
|
-
"@vxrn/safe-area": "1.25.
|
|
70
|
-
"@vxrn/url-parse": "1.25.
|
|
71
|
-
"@vxrn/utils": "1.25.
|
|
72
|
-
"@vxrn/vendor": "1.25.
|
|
73
|
-
"@vxrn/vite-flow": "1.25.
|
|
74
|
-
"@vxrn/vite-plugin-metro": "1.25.
|
|
65
|
+
"@vxrn/compiler": "1.25.6",
|
|
66
|
+
"@vxrn/debug": "1.25.6",
|
|
67
|
+
"@vxrn/query-string": "1.25.6",
|
|
68
|
+
"@vxrn/resolve": "1.25.6",
|
|
69
|
+
"@vxrn/safe-area": "1.25.6",
|
|
70
|
+
"@vxrn/url-parse": "1.25.6",
|
|
71
|
+
"@vxrn/utils": "1.25.6",
|
|
72
|
+
"@vxrn/vendor": "1.25.6",
|
|
73
|
+
"@vxrn/vite-flow": "1.25.6",
|
|
74
|
+
"@vxrn/vite-plugin-metro": "1.25.6",
|
|
75
75
|
"citty": "^0.1.6",
|
|
76
76
|
"dotenv": "^17.2.1",
|
|
77
77
|
"dotenv-expand": "^12.0.2",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Connect, Plugin, ViteDevServer } from 'vite'
|
|
2
|
-
import { WebSocketServer } from 'ws'
|
|
2
|
+
import { WebSocketServer, type WebSocket } from 'ws'
|
|
3
3
|
import { createMessageSocket } from '@vxrn/utils'
|
|
4
4
|
import {
|
|
5
5
|
addConnectedNativeClient,
|
|
@@ -17,6 +17,11 @@ type ClientMessage = {
|
|
|
17
17
|
data: string[]
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
+
type NativeHmrSocket = WebSocket & {
|
|
21
|
+
vxrnClientId: string
|
|
22
|
+
vxrnPlatform: 'ios' | 'android'
|
|
23
|
+
}
|
|
24
|
+
|
|
20
25
|
export function createReactNativeDevServerPlugin(
|
|
21
26
|
options?: Partial<
|
|
22
27
|
Pick<VXRNOptionsFilled, 'cacheDir' | 'debugBundle' | 'debugBundlePaths' | 'entries'>
|
|
@@ -61,18 +66,17 @@ export function createReactNativeDevServerPlugin(
|
|
|
61
66
|
|
|
62
67
|
// rolldown HMR socket (used by rolldown dev() HMR client)
|
|
63
68
|
if (url.startsWith('/hot')) {
|
|
69
|
+
const hmrUrl = new URL(url, `http://${req.headers.host || 'localhost'}`)
|
|
70
|
+
const platform = validPlatforms[hmrUrl.searchParams.get('platform') || '']
|
|
71
|
+
const clientId = hmrUrl.searchParams.get('clientId')
|
|
72
|
+
if (!platform || !clientId) {
|
|
73
|
+
socket.destroy()
|
|
74
|
+
return
|
|
75
|
+
}
|
|
64
76
|
hmrWSS.handleUpgrade(req, socket, head, (ws) => {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
const msg = JSON.parse(data.toString())
|
|
69
|
-
if (msg.type === 'hmr:module-registered' && msg.modules) {
|
|
70
|
-
const currentEngine = devEngines['ios'] || devEngines['android']
|
|
71
|
-
if (currentEngine?.engine) {
|
|
72
|
-
await currentEngine.engine.registerModules('vxrn-dev', msg.modules)
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
} catch {}
|
|
77
|
+
Object.assign(ws, {
|
|
78
|
+
vxrnClientId: clientId,
|
|
79
|
+
vxrnPlatform: platform,
|
|
76
80
|
})
|
|
77
81
|
hmrWSS.emit('connection', ws, req)
|
|
78
82
|
})
|
|
@@ -95,17 +99,47 @@ export function createReactNativeDevServerPlugin(
|
|
|
95
99
|
}
|
|
96
100
|
})
|
|
97
101
|
|
|
98
|
-
hmrWSS.on('connection', (socket) => {
|
|
102
|
+
hmrWSS.on('connection', async (socket: NativeHmrSocket) => {
|
|
103
|
+
const currentEngine = devEngines[socket.vxrnPlatform]
|
|
104
|
+
if (!currentEngine) {
|
|
105
|
+
socket.close(1013, 'native dev engine unavailable')
|
|
106
|
+
return
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
try {
|
|
110
|
+
await currentEngine.engine.registerClient(socket.vxrnClientId)
|
|
111
|
+
} catch (error) {
|
|
112
|
+
console.error('[hmr] failed to register native client', error)
|
|
113
|
+
socket.close(1011, 'native HMR registration failed')
|
|
114
|
+
return
|
|
115
|
+
}
|
|
99
116
|
addConnectedNativeClient()
|
|
100
117
|
|
|
101
|
-
socket.on('message', (message) => {
|
|
102
|
-
|
|
118
|
+
socket.on('message', async (message) => {
|
|
119
|
+
const value = message.toString()
|
|
120
|
+
if (value === 'ping') {
|
|
103
121
|
socket.send('pong')
|
|
122
|
+
return
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
let update: { type?: string }
|
|
126
|
+
try {
|
|
127
|
+
update = JSON.parse(value)
|
|
128
|
+
} catch {
|
|
129
|
+
return
|
|
130
|
+
}
|
|
131
|
+
if (update.type === 'hmr:invalidate') {
|
|
132
|
+
currentEngine.engine.triggerFullBuild()
|
|
133
|
+
await currentEngine.engine.ensureLatestBuildOutput()
|
|
134
|
+
socket.send(JSON.stringify({ type: 'hmr:reload' }))
|
|
104
135
|
}
|
|
105
136
|
})
|
|
106
137
|
|
|
107
138
|
socket.on('close', () => {
|
|
108
139
|
removeConnectedNativeClient()
|
|
140
|
+
currentEngine.engine.removeClient(socket.vxrnClientId).catch((error) => {
|
|
141
|
+
console.error('[hmr] failed to remove native client', error)
|
|
142
|
+
})
|
|
109
143
|
})
|
|
110
144
|
|
|
111
145
|
socket.on('error', (error) => {
|
|
@@ -181,8 +215,14 @@ export function createReactNativeDevServerPlugin(
|
|
|
181
215
|
serverUrl: `http://${typeof host === 'string' && host !== '0.0.0.0' ? host : 'localhost'}:${getBoundPort(server)}`,
|
|
182
216
|
onHmrUpdate: (update) => {
|
|
183
217
|
const msg = JSON.stringify(update)
|
|
184
|
-
hmrWSS.clients.forEach((client
|
|
185
|
-
|
|
218
|
+
hmrWSS.clients.forEach((client) => {
|
|
219
|
+
const nativeClient = client as NativeHmrSocket
|
|
220
|
+
if (
|
|
221
|
+
nativeClient.readyState === 1 &&
|
|
222
|
+
nativeClient.vxrnPlatform === platform &&
|
|
223
|
+
(update.type === 'hmr:error' ||
|
|
224
|
+
nativeClient.vxrnClientId === update.clientId)
|
|
225
|
+
) {
|
|
186
226
|
client.send(msg)
|
|
187
227
|
}
|
|
188
228
|
})
|
|
@@ -1,12 +1,107 @@
|
|
|
1
|
+
import { mkdtemp, rm, writeFile } from 'node:fs/promises'
|
|
2
|
+
import { tmpdir } from 'node:os'
|
|
3
|
+
import { join } from 'node:path'
|
|
4
|
+
import { dev } from 'rolldown/experimental'
|
|
1
5
|
import { describe, expect, it } from 'vitest'
|
|
2
6
|
import {
|
|
3
7
|
getHermesSWCIncludes,
|
|
8
|
+
getHmrRuntimeSource,
|
|
4
9
|
getNativeTransformConfig,
|
|
5
10
|
hmrClientNoopPlugin,
|
|
6
11
|
vxrnCompilerPlugin,
|
|
7
12
|
wrapNativeBundleModuleScope,
|
|
8
13
|
} from './createNativeDevEngine'
|
|
9
14
|
|
|
15
|
+
describe('native Rolldown HMR runtime', () => {
|
|
16
|
+
it(
|
|
17
|
+
'registers a Rolldown 1.2 client and applies a self-accepted patch',
|
|
18
|
+
{ timeout: 30_000 },
|
|
19
|
+
async () => {
|
|
20
|
+
const testRoot = await mkdtemp(join(tmpdir(), 'vxrn-native-hmr-'))
|
|
21
|
+
const entry = join(testRoot, 'entry.js')
|
|
22
|
+
const source = (version: string) => `
|
|
23
|
+
globalThis.__vxrnHmrBody = '${version}'
|
|
24
|
+
export const value = '${version}'
|
|
25
|
+
if (import.meta.hot) {
|
|
26
|
+
import.meta.hot.accept((next) => {
|
|
27
|
+
globalThis.__vxrnHmrAccepted = next.value
|
|
28
|
+
})
|
|
29
|
+
}
|
|
30
|
+
`
|
|
31
|
+
await writeFile(entry, source('v1'))
|
|
32
|
+
|
|
33
|
+
let resolveInitialOutput!: (output: any) => void
|
|
34
|
+
const initialOutput = new Promise<any>((resolve) => {
|
|
35
|
+
resolveInitialOutput = resolve
|
|
36
|
+
})
|
|
37
|
+
let resolveHmrUpdate!: (output: any) => void
|
|
38
|
+
const hmrUpdate = new Promise<any>((resolve) => {
|
|
39
|
+
resolveHmrUpdate = resolve
|
|
40
|
+
})
|
|
41
|
+
const engine = await dev(
|
|
42
|
+
{
|
|
43
|
+
cwd: testRoot,
|
|
44
|
+
input: entry,
|
|
45
|
+
experimental: { devMode: { implement: getHmrRuntimeSource() } },
|
|
46
|
+
},
|
|
47
|
+
{ format: 'esm' },
|
|
48
|
+
{
|
|
49
|
+
onOutput(result) {
|
|
50
|
+
resolveInitialOutput(result)
|
|
51
|
+
},
|
|
52
|
+
onHmrUpdates(result) {
|
|
53
|
+
if (!(result instanceof Error) && result.changedFiles.length) {
|
|
54
|
+
resolveHmrUpdate(result)
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
}
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
try {
|
|
61
|
+
await engine.run()
|
|
62
|
+
const initial = await initialOutput
|
|
63
|
+
if (initial instanceof Error) throw initial
|
|
64
|
+
const chunk = initial.output.find(
|
|
65
|
+
(item: any) => item.type === 'chunk' && item.isEntry
|
|
66
|
+
)
|
|
67
|
+
expect(chunk).toBeTruthy()
|
|
68
|
+
|
|
69
|
+
delete (globalThis as any).__rolldown_runtime__
|
|
70
|
+
await import(
|
|
71
|
+
`data:text/javascript;base64,${Buffer.from(chunk.code).toString('base64')}`
|
|
72
|
+
)
|
|
73
|
+
const runtime = (globalThis as any).__rolldown_runtime__
|
|
74
|
+
expect(typeof runtime.clientId).toBe('string')
|
|
75
|
+
await engine.registerClient(runtime.clientId)
|
|
76
|
+
|
|
77
|
+
await new Promise((resolve) => setTimeout(resolve, 100))
|
|
78
|
+
await writeFile(entry, source('v2'))
|
|
79
|
+
const result = await Promise.race([
|
|
80
|
+
hmrUpdate,
|
|
81
|
+
new Promise((_, reject) =>
|
|
82
|
+
setTimeout(() => reject(new Error('timed out waiting for HMR patch')), 10_000)
|
|
83
|
+
),
|
|
84
|
+
])
|
|
85
|
+
const patch = result.updates.find(
|
|
86
|
+
(item: any) =>
|
|
87
|
+
item.clientId === runtime.clientId && item.update.type === 'Patch'
|
|
88
|
+
)?.update
|
|
89
|
+
expect(patch).toBeTruthy()
|
|
90
|
+
|
|
91
|
+
expect(runtime.applyHmrUpdate(patch.code, patch.changedIds, patch.seq)).toBe(true)
|
|
92
|
+
expect((globalThis as any).__vxrnHmrBody).toBe('v2')
|
|
93
|
+
expect((globalThis as any).__vxrnHmrAccepted).toBe('v2')
|
|
94
|
+
} finally {
|
|
95
|
+
await engine.close()
|
|
96
|
+
await rm(testRoot, { recursive: true, force: true })
|
|
97
|
+
delete (globalThis as any).__rolldown_runtime__
|
|
98
|
+
delete (globalThis as any).__vxrnHmrBody
|
|
99
|
+
delete (globalThis as any).__vxrnHmrAccepted
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
)
|
|
103
|
+
})
|
|
104
|
+
|
|
10
105
|
// use a root with no .env files so only the platform defines are present
|
|
11
106
|
const root = '/tmp/vxrn-native-env-define-test-nonexistent'
|
|
12
107
|
|