vxrn 1.25.8 → 1.25.9

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 (45) hide show
  1. package/dist/config/getViteServerConfig.mjs +6 -0
  2. package/dist/config/getViteServerConfig.mjs.map +1 -1
  3. package/dist/config/getViteServerConfig.native.js +6 -0
  4. package/dist/config/getViteServerConfig.native.js.map +1 -1
  5. package/dist/config/getViteServerConfig.test.mjs +26 -0
  6. package/dist/config/getViteServerConfig.test.mjs.map +1 -0
  7. package/dist/config/getViteServerConfig.test.native.js +26 -0
  8. package/dist/config/getViteServerConfig.test.native.js.map +1 -0
  9. package/dist/exports/dev.mjs +26 -1
  10. package/dist/exports/dev.mjs.map +1 -1
  11. package/dist/exports/dev.native.js +26 -1
  12. package/dist/exports/dev.native.js.map +1 -1
  13. package/dist/plugins/reactNativeDevServer.mjs +80 -7
  14. package/dist/plugins/reactNativeDevServer.mjs.map +1 -1
  15. package/dist/plugins/reactNativeDevServer.native.js +80 -7
  16. package/dist/plugins/reactNativeDevServer.native.js.map +1 -1
  17. package/dist/runtime/native-prelude.mjs +7 -0
  18. package/dist/runtime/native-prelude.mjs.map +1 -1
  19. package/dist/runtime/native-prelude.native.js +7 -0
  20. package/dist/runtime/native-prelude.native.js.map +1 -1
  21. package/dist/utils/createNativeDevEngine.mjs +302 -197
  22. package/dist/utils/createNativeDevEngine.mjs.map +1 -1
  23. package/dist/utils/createNativeDevEngine.native.js +410 -221
  24. package/dist/utils/createNativeDevEngine.native.js.map +1 -1
  25. package/dist/utils/createNativeDevEngine.test.mjs +536 -6
  26. package/dist/utils/createNativeDevEngine.test.mjs.map +1 -1
  27. package/dist/utils/createNativeDevEngine.test.native.js +559 -6
  28. package/dist/utils/createNativeDevEngine.test.native.js.map +1 -1
  29. package/package.json +11 -11
  30. package/src/config/getViteServerConfig.test.ts +29 -0
  31. package/src/config/getViteServerConfig.ts +11 -0
  32. package/src/exports/dev.ts +34 -3
  33. package/src/plugins/reactNativeDevServer.ts +89 -12
  34. package/src/runtime/native-prelude.ts +7 -0
  35. package/src/utils/createNativeDevEngine.test.ts +682 -5
  36. package/src/utils/createNativeDevEngine.ts +516 -229
  37. package/types/config/getViteServerConfig.d.ts.map +1 -1
  38. package/types/config/getViteServerConfig.test.d.ts +2 -0
  39. package/types/config/getViteServerConfig.test.d.ts.map +1 -0
  40. package/types/exports/dev.d.ts.map +1 -1
  41. package/types/plugins/reactNativeDevServer.d.ts +1 -0
  42. package/types/plugins/reactNativeDevServer.d.ts.map +1 -1
  43. package/types/runtime/native-prelude.d.ts.map +1 -1
  44. package/types/utils/createNativeDevEngine.d.ts +40 -2
  45. package/types/utils/createNativeDevEngine.d.ts.map +1 -1
@@ -1,17 +1,18 @@
1
+ import { createHash } from "crypto";
1
2
  import { basename, dirname, extname, join, relative, resolve } from "path";
2
- import { copyFileSync, existsSync, mkdirSync, readFileSync } from "fs";
3
+ import { copyFileSync, mkdirSync, readFileSync, readdirSync, realpathSync } from "fs";
3
4
  import { pathToFileURL } from "url";
4
- import { normalizePath } from "vite";
5
+ import { loadEnv, normalizePath } from "vite";
5
6
  import { DEFAULT_ASSET_EXTS } from "../constants/defaults.native.js";
6
7
  import { getNativePrelude } from "../runtime/native-prelude.native.js";
7
8
  function _instanceof(left, right) {
8
9
  if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) return !!right[Symbol.hasInstance](left);else return left instanceof right;
9
10
  }
10
11
  var FLOW_FILE_PATTERN = /node_modules[\\/](?:react-native|@react-native)[\\/].*\.js$/;
11
- var HERMES_CLASS_TRANSFORMS = ["transform-classes", "transform-parameters", "transform-class-properties", "transform-class-static-block", "transform-private-methods", "transform-private-property-in-object"];
12
- var HERMES_PROD_TRANSFORMS = ["transform-async-to-generator"];
12
+ var HERMES_CLASS_TRANSFORMS = ["transform-classes", "transform-parameters", "transform-block-scoping", "transform-class-properties", "transform-class-static-block", "transform-private-methods", "transform-private-property-in-object"];
13
+ var HERMES_ASYNC_TRANSFORMS = ["transform-async-to-generator"];
13
14
  function getHermesSWCIncludes(dev) {
14
- return [...HERMES_CLASS_TRANSFORMS, ...(dev ? [] : HERMES_PROD_TRANSFORMS)];
15
+ return [...HERMES_CLASS_TRANSFORMS, ...HERMES_ASYNC_TRANSFORMS];
15
16
  }
16
17
  function getResolveExtensions(platform) {
17
18
  var platformExts = platform === "ios" ? [".ios.tsx", ".ios.ts", ".ios.jsx", ".ios.js"] : [".android.tsx", ".android.ts", ".android.jsx", ".android.js"];
@@ -22,7 +23,7 @@ function getResolveExtensions(platform) {
22
23
  function getNativeResolveConfig(platform) {
23
24
  return {
24
25
  extensions: getResolveExtensions(platform),
25
- conditionNames: ["react-native", "import", "require", "default"],
26
+ conditionNames: ["react-native"],
26
27
  mainFields: ["react-native", "module", "main"]
27
28
  };
28
29
  }
@@ -57,43 +58,28 @@ function getNativeTransformConfig(platform, dev, root) {
57
58
  })
58
59
  };
59
60
  }();
60
- var envDefines = function () {
61
- var defines = {};
62
- try {
63
- var mode2 = dev ? "development" : "production";
64
- for (var _i = 0, _iter = [".env", ".env.local", `.env.${mode2}`, `.env.${mode2}.local`]; _i < _iter.length; _i++) {
65
- var envFile = _iter[_i];
66
- var envPath = join(root, envFile);
67
- if (!existsSync(envPath)) continue;
68
- var content = readFileSync(envPath, "utf8");
69
- var _iteratorNormalCompletion2 = true,
70
- _didIteratorError2 = false,
71
- _iteratorError2 = void 0;
72
- try {
73
- for (var _iterator2 = content.split("\n")[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
74
- var match2 = _step2.value.match(/^\s*(VITE_\w+)\s*=\s*(.*)$/);
75
- if (match2) {
76
- var [, key2, rawVal] = match2;
77
- var val2 = rawVal.replace(/^['"]|['"]$/g, "").trim();
78
- defines[`import.meta.env.${key2}`] = JSON.stringify(val2);
79
- defines[`process.env.${key2}`] = JSON.stringify(val2);
80
- }
81
- }
82
- } catch (err) {
83
- _didIteratorError2 = true;
84
- _iteratorError2 = err;
85
- } finally {
86
- try {
87
- if (!_iteratorNormalCompletion2 && _iterator2.return != null) _iterator2.return();
88
- } finally {
89
- if (_didIteratorError2) throw _iteratorError2;
90
- }
91
- }
92
- }
93
- } catch (unused) {}
94
- return defines;
95
- }();
96
61
  var mode = dev ? "development" : "production";
62
+ var publicEnv = loadEnv(mode, root, ["VITE_", "EXPO_PUBLIC_"]);
63
+ var envDefines = {};
64
+ var _iteratorNormalCompletion = true,
65
+ _didIteratorError = false,
66
+ _iteratorError = void 0;
67
+ try {
68
+ for (var _iterator = Object.entries(publicEnv)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
69
+ var [key, value] = _step.value;
70
+ envDefines[`import.meta.env.${key}`] = JSON.stringify(value);
71
+ envDefines[`process.env.${key}`] = JSON.stringify(value);
72
+ }
73
+ } catch (err) {
74
+ _didIteratorError = true;
75
+ _iteratorError = err;
76
+ } finally {
77
+ try {
78
+ if (!_iteratorNormalCompletion && _iterator.return != null) _iterator.return();
79
+ } finally {
80
+ if (_didIteratorError) throw _iteratorError;
81
+ }
82
+ }
97
83
  var envObject = {
98
84
  MODE: mode,
99
85
  DEV: dev,
@@ -105,13 +91,13 @@ function getNativeTransformConfig(platform, dev, root) {
105
91
  TAMAGUI_TARGET: "native",
106
92
  TAMAGUI_ENVIRONMENT: platform
107
93
  };
108
- var _iteratorNormalCompletion = true,
109
- _didIteratorError = false,
110
- _iteratorError = void 0;
94
+ var _iteratorNormalCompletion1 = true,
95
+ _didIteratorError1 = false,
96
+ _iteratorError1 = void 0;
111
97
  try {
112
- for (var _iterator = Object.entries(envDefines)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
113
- var [key, val] = _step.value;
114
- var match = key.match(/^import\.meta\.env\.(.+)$/);
98
+ for (var _iterator1 = Object.entries(envDefines)[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true) {
99
+ var [key1, val] = _step1.value;
100
+ var match = key1.match(/^import\.meta\.env\.(.+)$/);
115
101
  if (match) try {
116
102
  envObject[match[1]] = JSON.parse(val);
117
103
  } catch (unused) {
@@ -119,13 +105,13 @@ function getNativeTransformConfig(platform, dev, root) {
119
105
  }
120
106
  }
121
107
  } catch (err) {
122
- _didIteratorError = true;
123
- _iteratorError = err;
108
+ _didIteratorError1 = true;
109
+ _iteratorError1 = err;
124
110
  } finally {
125
111
  try {
126
- if (!_iteratorNormalCompletion && _iterator.return != null) _iterator.return();
112
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) _iterator1.return();
127
113
  } finally {
128
- if (_didIteratorError) throw _iteratorError;
114
+ if (_didIteratorError1) throw _iteratorError1;
129
115
  }
130
116
  }
131
117
  return {
@@ -159,14 +145,16 @@ function getNativeTransformConfig(platform, dev, root) {
159
145
  }
160
146
  };
161
147
  }
162
- function getNativePlugins(root, platform, viteImportGlobPlugin, dev, assetsDest) {
148
+ function getNativePlugins(root, platform, viteImportGlobPlugin, dev, assetsDest, onAsset) {
149
+ var sourceMaps = arguments.length > 6 && arguments[6] !== void 0 ? arguments[6] : false;
163
150
  return [...(globalThis.__vxrnAddNativePlugins || []), serverFileExclusionPlugin(), environmentGuardPlugin(), hmrClientNoopPlugin(), cssStubPlugin(), viteImportGlobPlugin({
164
151
  root
165
- }), vxrnCompilerPlugin(platform, dev, root), flowStripPlugin(), nativeAnimatedGuardPlugin(), assetPlugin({
152
+ }), vxrnCompilerPlugin(platform, dev, root, sourceMaps), flowStripPlugin(), nativeAnimatedGuardPlugin(), assetPlugin({
166
153
  root,
167
154
  platform,
168
- assetsDest
169
- }), hermesCompatSWCPlugin(dev)];
155
+ assetsDest,
156
+ onAsset
157
+ }), hermesCompatSWCPlugin(dev, sourceMaps)];
170
158
  }
171
159
  function getNativeOutputOptions(prelude, sourcemap) {
172
160
  return {
@@ -177,7 +165,12 @@ function getNativeOutputOptions(prelude, sourcemap) {
177
165
  strictExecutionOrder: true
178
166
  };
179
167
  }
168
+ function normalizeNativeCommonJSInterop(code) {
169
+ return code.replace(/(\b__toESM(?:\$\d+)?\(\s*require[\w$]*\(\)\s*),\s*1(\s*\))/g, "$1$2");
170
+ }
180
171
  function postProcessNativeBundle(code) {
172
+ code = normalizeNativeCommonJSInterop(code);
173
+ code = code.replace(/\btypeof\s+import\.meta\b/g, "\"object\"");
181
174
  code = code.replace(/^\s*export\s*\{[^}]*\}\s*;?\s*$/gm, "");
182
175
  code = code.replace(/^\s*export\s+default\s+([^;\n]+);?\s*$/gm, "$1;");
183
176
  code = code.replace(/^if \(import\.meta\.hot\).*$/gm, "");
@@ -204,6 +197,8 @@ function wrapNativeBundleModuleScope(code) {
204
197
  return code.slice(0, idx) + ";(function() {\n" + code.slice(idx) + "\n})();\n";
205
198
  }
206
199
  async function downlevelClassFieldsInBundle(code) {
200
+ var _ref, _ref1;
201
+ var _runtimeSection_match, _transformed_match;
207
202
  var startMarker = "//#region \\0rolldown/runtime.js";
208
203
  var endMarker = "//#endregion";
209
204
  var startIdx = code.indexOf(startMarker);
@@ -212,41 +207,43 @@ async function downlevelClassFieldsInBundle(code) {
212
207
  if (endIdx === -1) return code;
213
208
  var runtimeEnd = endIdx + endMarker.length;
214
209
  var runtimeSection = code.slice(startIdx, runtimeEnd);
215
- try {
216
- var result = await (await import("@swc/core")).transform(runtimeSection, {
217
- filename: "rolldown-runtime.js",
218
- configFile: false,
219
- swcrc: false,
220
- sourceMaps: false,
221
- inputSourceMap: false,
222
- isModule: false,
223
- env: {
224
- targets: {
225
- node: 9999
226
- },
227
- include: [...HERMES_CLASS_TRANSFORMS]
210
+ var originalNewlines = (_ref = (_runtimeSection_match = runtimeSection.match(/\n/g)) === null || _runtimeSection_match === void 0 ? void 0 : _runtimeSection_match.length) !== null && _ref !== void 0 ? _ref : 0;
211
+ var transformedCode = (await (await import("@swc/core")).transform(runtimeSection, {
212
+ filename: "rolldown-runtime.js",
213
+ configFile: false,
214
+ swcrc: false,
215
+ sourceMaps: false,
216
+ inputSourceMap: false,
217
+ isModule: false,
218
+ minify: true,
219
+ env: {
220
+ targets: {
221
+ node: 9999
228
222
  },
229
- jsc: {
230
- parser: {
231
- syntax: "ecmascript"
232
- },
233
- transform: {
234
- react: {
235
- runtime: "preserve"
236
- }
237
- },
238
- externalHelpers: false,
239
- assumptions: {
240
- setPublicClassFields: true,
241
- privateFieldsAsProperties: true
223
+ include: [...HERMES_CLASS_TRANSFORMS]
224
+ },
225
+ jsc: {
226
+ parser: {
227
+ syntax: "ecmascript"
228
+ },
229
+ transform: {
230
+ react: {
231
+ runtime: "preserve"
242
232
  }
233
+ },
234
+ externalHelpers: false,
235
+ assumptions: {
236
+ setPublicClassFields: true,
237
+ privateFieldsAsProperties: true
243
238
  }
244
- });
245
- return code.slice(0, startIdx) + result.code + code.slice(runtimeEnd);
246
- } catch (err) {
247
- console.warn("[vxrn] downlevelClassFieldsInBundle failed, returning original:", err);
248
- return code;
249
- }
239
+ }
240
+ })).code.trimEnd();
241
+ var transformed = transformedCode.includes(startMarker) ? transformedCode : `${startMarker}
242
+ ${transformedCode}`;
243
+ var transformedNewlines = (_ref1 = (_transformed_match = transformed.match(/\n/g)) === null || _transformed_match === void 0 ? void 0 : _transformed_match.length) !== null && _ref1 !== void 0 ? _ref1 : 0;
244
+ if (transformedNewlines > originalNewlines) throw new Error("[vxrn] Hermes runtime transform added lines and would invalidate the production source map");
245
+ var linePreservingRuntime = transformed + "\n".repeat(originalNewlines - transformedNewlines);
246
+ return code.slice(0, startIdx) + linePreservingRuntime + code.slice(runtimeEnd);
250
247
  }
251
248
  async function createNativeDevEngine(options) {
252
249
  var {
@@ -268,6 +265,7 @@ async function createNativeDevEngine(options) {
268
265
  platform,
269
266
  serverUrl: serverUrl || `http://${host}:${port}`
270
267
  });
268
+ var assetRegistry = createNativeDevAssetRegistry();
271
269
  var currentBundle = null;
272
270
  var firstBuildError = null;
273
271
  var bundleResolve = null;
@@ -296,7 +294,7 @@ async function createNativeDevEngine(options) {
296
294
  },
297
295
  plugins: [nativeVirtualEntryPlugin(root, {
298
296
  dev: true
299
- }), ...getNativePlugins(root, platform, viteImportGlobPlugin, true), ...userPlugins]
297
+ }), ...getNativePlugins(root, platform, viteImportGlobPlugin, true, void 0, assetRegistry.register, false), ...userPlugins]
300
298
  }, {
301
299
  ...getNativeOutputOptions(prelude, false),
302
300
  outro: `
@@ -434,6 +432,9 @@ try {
434
432
  }
435
433
  return bundlePromise;
436
434
  },
435
+ getAsset(pathname, hash) {
436
+ return assetRegistry.resolve(pathname, hash);
437
+ },
437
438
  async close() {
438
439
  await engine.close();
439
440
  }
@@ -478,7 +479,7 @@ async function buildNativeBundle(options) {
478
479
  },
479
480
  plugins: [...(entryFile ? [] : [nativeVirtualEntryPlugin(root, {
480
481
  dev
481
- })]), ...getNativePlugins(root, platform, viteImportGlobPlugin, dev, assetsDest), ...userPlugins],
482
+ })]), ...getNativePlugins(root, platform, viteImportGlobPlugin, dev, assetsDest, void 0, sourcemap), ...userPlugins],
482
483
  output: getNativeOutputOptions(prelude, sourcemap)
483
484
  })).output.find(function (o) {
484
485
  return o.type === "chunk" && o.isEntry;
@@ -562,8 +563,16 @@ function nativeAnimatedGuardPlugin() {
562
563
  var target = "const method = nullthrows(NativeAnimatedModule)[methodName];";
563
564
  if (!code.includes(target)) return;
564
565
  return {
565
- code: code.replace(target, `const method = nullthrows(NativeAnimatedModule)[methodName];
566
- if (typeof method !== 'function') return;`)
566
+ code: code.replace(target, `${target} if (typeof method !== 'function') return;`),
567
+ map: {
568
+ version: 3,
569
+ sources: [id],
570
+ sourcesContent: [code],
571
+ names: [],
572
+ mappings: code.split("\n").map(function (_, index) {
573
+ return index === 0 ? "AAAA" : "AACA";
574
+ }).join(";")
575
+ }
567
576
  };
568
577
  }
569
578
  };
@@ -643,7 +652,8 @@ function cssStubPlugin() {
643
652
  };
644
653
  }
645
654
  function vxrnCompilerPlugin(platform, dev) {
646
- var projectRoot = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : process.cwd();
655
+ var projectRoot = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : process.cwd(),
656
+ sourceMaps = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : false;
647
657
  var compiler = null;
648
658
  var isRefreshCandidate = function (id) {
649
659
  return dev && !id.includes("node_modules") && !id.includes("__virtual-native-entry") && /\.[tj]sx?$/.test(id);
@@ -654,33 +664,37 @@ function vxrnCompilerPlugin(platform, dev) {
654
664
  if (!/\.[cm]?[jt]sx?$/.test(id)) return;
655
665
  if (id.includes("\0") || id.includes("virtual:")) return;
656
666
  var needsRefresh = isRefreshCandidate(id);
657
- try {
658
- if (!compiler) compiler = await import("@vxrn/compiler");
659
- var props = {
660
- id,
661
- code,
662
- projectRoot,
663
- development: dev,
664
- environment: platform,
665
- reactForRNVersion: "19"
667
+ if (!compiler) compiler = await import("@vxrn/compiler");
668
+ var props = {
669
+ id,
670
+ code,
671
+ projectRoot,
672
+ development: dev,
673
+ environment: platform,
674
+ reactForRNVersion: "19"
675
+ };
676
+ var babelOptions = compiler.getBabelOptions(props);
677
+ if (needsRefresh) {
678
+ var existingPlugins = (babelOptions === null || babelOptions === void 0 ? void 0 : babelOptions.plugins) || [];
679
+ babelOptions = {
680
+ ...babelOptions,
681
+ plugins: [...existingPlugins, ["react-refresh/babel", {
682
+ skipEnvCheck: true,
683
+ refreshReg: "__vxrnRefreshReg",
684
+ refreshSig: "__vxrnRefreshSig"
685
+ }]]
666
686
  };
667
- var babelOptions = compiler.getBabelOptions(props);
668
- if (needsRefresh) {
669
- var existingPlugins = (babelOptions === null || babelOptions === void 0 ? void 0 : babelOptions.plugins) || [];
670
- babelOptions = {
671
- ...babelOptions,
672
- plugins: [...existingPlugins, ["react-refresh/babel", {
673
- skipEnvCheck: true,
674
- refreshReg: "__vxrnRefreshReg",
675
- refreshSig: "__vxrnRefreshSig"
676
- }]]
677
- };
678
- }
679
- if (!babelOptions) return;
680
- var result = await compiler.transformBabel(id, code, babelOptions);
681
- if (result === null || result === void 0 ? void 0 : result.code) {
682
- var out = result.code;
683
- if (needsRefresh) out = `
687
+ }
688
+ if (!babelOptions) return;
689
+ if (sourceMaps) babelOptions = {
690
+ ...babelOptions,
691
+ sourceMaps: true,
692
+ sourceFileName: id
693
+ };
694
+ var result = await compiler.transformBabel(id, code, babelOptions);
695
+ if (result === null || result === void 0 ? void 0 : result.code) {
696
+ var out = result.code;
697
+ if (needsRefresh) out = `
684
698
  var __prevRefreshReg = globalThis.$RefreshReg$;
685
699
  var __prevRefreshSig = globalThis.$RefreshSig$;
686
700
  if (globalThis.__ReactRefresh) {
@@ -698,23 +712,16 @@ ${out}
698
712
  globalThis.$RefreshReg$ = __prevRefreshReg;
699
713
  globalThis.$RefreshSig$ = __prevRefreshSig;
700
714
  if (import.meta.hot) {
701
- import.meta.hot.accept(function() {
715
+ import.meta.hot.acceptReactRefresh(function() {
702
716
  if (globalThis.__ReactRefresh) {
703
717
  setTimeout(function() { globalThis.__ReactRefresh.performReactRefresh(); }, 30);
704
718
  }
705
719
  });
706
720
  }
707
721
  `;
708
- return {
709
- code: out
710
- };
711
- }
712
- } catch (err) {
713
- if (dev) console.warn(`[vxrn:compiler] ${id}: ${err.message || err}`);
714
- if (needsRefresh) return {
715
- code: code + `
716
- if (import.meta.hot) { import.meta.hot.accept(); }
717
- `
722
+ return {
723
+ code: out,
724
+ map: sourceMaps ? result.map : void 0
718
725
  };
719
726
  }
720
727
  }
@@ -726,21 +733,17 @@ function flowStripPlugin() {
726
733
  transform: {
727
734
  async handler(code, id) {
728
735
  if (!FLOW_FILE_PATTERN.test(id)) return;
729
- try {
730
- var result = await (await import("fast-flow-transform")).default({
731
- filename: id,
732
- source: code,
733
- sourcemap: true,
734
- dialect: "flow",
735
- format: "pretty"
736
- });
737
- return {
738
- code: result.code,
739
- map: result.map
740
- };
741
- } catch (err) {
742
- console.warn(`[vxrn:flow-strip] ${id}: ${err.message}`);
743
- }
736
+ var result = await (await import("fast-flow-transform")).default({
737
+ filename: id,
738
+ source: code,
739
+ sourcemap: true,
740
+ dialect: "flow",
741
+ format: "pretty"
742
+ });
743
+ return {
744
+ code: result.code,
745
+ map: result.map
746
+ };
744
747
  }
745
748
  }
746
749
  };
@@ -751,38 +754,11 @@ function assetPlugin(opts) {
751
754
  name: "vxrn:asset",
752
755
  load: {
753
756
  async handler(id) {
757
+ var _opts_onAsset;
754
758
  if (!assetRegex.test(id)) return;
755
- var ext = extname(id).slice(1);
756
- var name = basename(id, `.${ext}`);
757
- var dir = dirname(id);
758
- var relativePath = relative(opts.root, id);
759
- var assetData = {
760
- __packager_asset: true,
761
- name,
762
- type: ext,
763
- scales: [1],
764
- httpServerLocation: "/assets/" + dirname(relativePath).replace(/\\/g, "/"),
765
- fileSystemLocation: dir,
766
- hash: "",
767
- width: void 0,
768
- height: void 0
769
- };
770
- if (["png", "jpg", "jpeg", "gif", "webp", "bmp"].includes(ext)) try {
771
- var {
772
- imageSize
773
- } = await import("image-size");
774
- var dims = imageSize(id);
775
- assetData.width = dims.width;
776
- assetData.height = dims.height;
777
- } catch (unused) {}
778
- if (opts.assetsDest) {
779
- var relativeAssetDir = dirname(relativePath).replace(/\\/g, "/");
780
- var assetDestDir = join(opts.assetsDest, "assets", relativeAssetDir);
781
- mkdirSync(assetDestDir, {
782
- recursive: true
783
- });
784
- copyFileSync(id, join(assetDestDir, `${name}.${ext}`));
785
- }
759
+ var assetData = await getNativeAssetData(id, opts.root, opts.platform);
760
+ (_opts_onAsset = opts.onAsset) === null || _opts_onAsset === void 0 || _opts_onAsset.call(opts, assetData);
761
+ if (opts.assetsDest) copyNativeAssetFiles(assetData, opts.assetsDest, opts.platform);
786
762
  return {
787
763
  code: `module.exports = require('react-native/Libraries/Image/AssetRegistry').registerAsset(${JSON.stringify(assetData)});`,
788
764
  moduleType: "js"
@@ -791,7 +767,193 @@ function assetPlugin(opts) {
791
767
  }
792
768
  };
793
769
  }
770
+ function createNativeDevAssetRegistry() {
771
+ var assets = /* @__PURE__ */new Map();
772
+ return {
773
+ register(asset) {
774
+ var _iteratorNormalCompletion = true,
775
+ _didIteratorError = false,
776
+ _iteratorError = void 0;
777
+ try {
778
+ for (var _iterator = asset.scales.entries()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
779
+ var [index, scale] = _step.value;
780
+ var filePath = asset.files[index];
781
+ if (!filePath) continue;
782
+ var fileName = `${asset.name}${scale === 1 ? "" : `@${scale}x`}.${asset.type}`;
783
+ assets.set(`${asset.httpServerLocation}/${fileName}`, {
784
+ filePath,
785
+ hash: asset.hash,
786
+ type: asset.type
787
+ });
788
+ }
789
+ } catch (err) {
790
+ _didIteratorError = true;
791
+ _iteratorError = err;
792
+ } finally {
793
+ try {
794
+ if (!_iteratorNormalCompletion && _iterator.return != null) _iterator.return();
795
+ } finally {
796
+ if (_didIteratorError) throw _iteratorError;
797
+ }
798
+ }
799
+ },
800
+ resolve(pathname, hash) {
801
+ var asset = assets.get(pathname);
802
+ if (!asset || hash !== void 0 && hash !== asset.hash) return;
803
+ return asset;
804
+ }
805
+ };
806
+ }
807
+ var NATIVE_IMAGE_EXTS = /* @__PURE__ */new Set(["png", "jpg", "jpeg", "gif", "webp", "bmp", "psd", "svg", "tiff", "ktx"]);
808
+ function parseNativeAssetName(filePath) {
809
+ var _ref;
810
+ var type = extname(filePath).slice(1);
811
+ if (!type) return;
812
+ var stem = basename(filePath, `.${type}`);
813
+ var platformMatch = stem.match(/^(.*)\.(ios|android)$/);
814
+ var platform = platformMatch === null || platformMatch === void 0 ? void 0 : platformMatch[2];
815
+ var scaleMatch = ((_ref = platformMatch === null || platformMatch === void 0 ? void 0 : platformMatch[1]) !== null && _ref !== void 0 ? _ref : stem).match(/^(.+?)(?:@([\d.]+)x)?$/);
816
+ if (!scaleMatch) return;
817
+ var scale = scaleMatch[2] === void 0 ? 1 : Number.parseFloat(scaleMatch[2]);
818
+ if (!Number.isFinite(scale) || scale <= 0) return;
819
+ return {
820
+ name: scaleMatch[1],
821
+ scale,
822
+ platform,
823
+ type
824
+ };
825
+ }
826
+ function getNativeAssetUrlDirectory(root, assetDirectory) {
827
+ var safeDirectory = relative(realpathSync(root), realpathSync(assetDirectory)).replace(/\\/g, "/").split("/").filter(function (segment) {
828
+ return segment && segment !== ".";
829
+ }).map(function (segment) {
830
+ return segment === ".." ? "_" : segment;
831
+ }).join("/");
832
+ return safeDirectory ? `/assets/${safeDirectory}` : "/assets";
833
+ }
834
+ async function getNativeAssetData(id, root, platform) {
835
+ var requested = parseNativeAssetName(id);
836
+ if (!requested) throw new Error(`[vxrn] invalid native asset path: ${id}`);
837
+ var assetDirectory = dirname(id);
838
+ var filesByScale = /* @__PURE__ */new Map();
839
+ var _iteratorNormalCompletion = true,
840
+ _didIteratorError = false,
841
+ _iteratorError = void 0;
842
+ try {
843
+ for (var _iterator = readdirSync(assetDirectory)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
844
+ var fileName = _step.value;
845
+ var candidate = parseNativeAssetName(fileName);
846
+ if (!candidate || candidate.name !== requested.name || candidate.type !== requested.type || candidate.platform !== void 0 && candidate.platform !== platform) continue;
847
+ var platformSpecific = candidate.platform === platform;
848
+ var existing = filesByScale.get(candidate.scale);
849
+ if (!existing || platformSpecific && !existing.platformSpecific) filesByScale.set(candidate.scale, {
850
+ file: join(assetDirectory, fileName),
851
+ platformSpecific
852
+ });
853
+ }
854
+ } catch (err) {
855
+ _didIteratorError = true;
856
+ _iteratorError = err;
857
+ } finally {
858
+ try {
859
+ if (!_iteratorNormalCompletion && _iterator.return != null) _iterator.return();
860
+ } finally {
861
+ if (_didIteratorError) throw _iteratorError;
862
+ }
863
+ }
864
+ var scales = [...filesByScale.keys()].sort(function (a, b) {
865
+ return a - b;
866
+ });
867
+ var files = scales.map(function (scale) {
868
+ return filesByScale.get(scale).file;
869
+ });
870
+ if (files.length === 0) throw new Error(`[vxrn] native asset has no files for ${platform}: ${id}`);
871
+ var hash = createHash("md5");
872
+ var _iteratorNormalCompletion1 = true,
873
+ _didIteratorError1 = false,
874
+ _iteratorError1 = void 0;
875
+ try {
876
+ for (var _iterator1 = files[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true) {
877
+ var file = _step1.value;
878
+ hash.update(readFileSync(file));
879
+ }
880
+ } catch (err) {
881
+ _didIteratorError1 = true;
882
+ _iteratorError1 = err;
883
+ } finally {
884
+ try {
885
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) _iterator1.return();
886
+ } finally {
887
+ if (_didIteratorError1) throw _iteratorError1;
888
+ }
889
+ }
890
+ var assetData = {
891
+ __packager_asset: true,
892
+ name: requested.name,
893
+ type: requested.type,
894
+ scales,
895
+ files,
896
+ httpServerLocation: getNativeAssetUrlDirectory(root, assetDirectory),
897
+ fileSystemLocation: assetDirectory,
898
+ hash: hash.digest("hex")
899
+ };
900
+ if (NATIVE_IMAGE_EXTS.has(requested.type)) try {
901
+ var {
902
+ imageSize
903
+ } = await import("image-size");
904
+ var dims = imageSize(files[0]);
905
+ assetData.width = dims.width === void 0 ? void 0 : dims.width / scales[0];
906
+ assetData.height = dims.height === void 0 ? void 0 : dims.height / scales[0];
907
+ } catch (unused) {}
908
+ return assetData;
909
+ }
910
+ function getIOSAssetScales(scales) {
911
+ var _scales_find;
912
+ var supported = scales.filter(function (scale) {
913
+ return scale === 1 || scale === 2 || scale === 3;
914
+ });
915
+ if (supported.length > 0 || scales.length === 0) return supported;
916
+ return [(_scales_find = scales.find(function (scale) {
917
+ return scale > 3;
918
+ })) !== null && _scales_find !== void 0 ? _scales_find : scales[scales.length - 1]];
919
+ }
920
+ function getAndroidAssetDirectory(type, scale) {
921
+ if (!(/* @__PURE__ */new Set(["gif", "heic", "heif", "jpeg", "jpg", "ktx", "png", "webp", "xml"])).has(type)) return "raw";
922
+ var density = (/* @__PURE__ */new Map([[.75, "ldpi"], [1, "mdpi"], [1.5, "hdpi"], [2, "xhdpi"], [3, "xxhdpi"], [4, "xxxhdpi"]])).get(scale);
923
+ if (density) return `drawable-${density}`;
924
+ return `drawable-${Math.round(scale * 160)}dpi`;
925
+ }
926
+ function getAndroidAssetName(asset) {
927
+ return `${asset.httpServerLocation}/${asset.name}`.toLowerCase().replace(/^\//, "").replace(/\//g, "_").replace(/([^a-z0-9_])/g, "").replace(/^assets_/, "");
928
+ }
929
+ function copyNativeAssetFiles(asset, assetsDest, platform) {
930
+ var validIOSScales = new Set(getIOSAssetScales(asset.scales));
931
+ var _iteratorNormalCompletion = true,
932
+ _didIteratorError = false,
933
+ _iteratorError = void 0;
934
+ try {
935
+ for (var _iterator = asset.scales.entries()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
936
+ var [index, scale] = _step.value;
937
+ if (platform === "ios" && !validIOSScales.has(scale)) continue;
938
+ var destination = platform === "android" ? join(assetsDest, getAndroidAssetDirectory(asset.type, scale), `${getAndroidAssetName(asset)}.${asset.type}`) : join(assetsDest, asset.httpServerLocation.slice(1), `${asset.name}${scale === 1 ? "" : `@${scale}x`}.${asset.type}`);
939
+ mkdirSync(dirname(destination), {
940
+ recursive: true
941
+ });
942
+ copyFileSync(asset.files[index], destination);
943
+ }
944
+ } catch (err) {
945
+ _didIteratorError = true;
946
+ _iteratorError = err;
947
+ } finally {
948
+ try {
949
+ if (!_iteratorNormalCompletion && _iterator.return != null) _iterator.return();
950
+ } finally {
951
+ if (_didIteratorError) throw _iteratorError;
952
+ }
953
+ }
954
+ }
794
955
  function hermesCompatSWCPlugin(dev) {
956
+ var sourceMaps = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
795
957
  var swc = null;
796
958
  return {
797
959
  name: "vxrn:hermes-compat",
@@ -799,45 +961,47 @@ function hermesCompatSWCPlugin(dev) {
799
961
  if (!/\.[cm]?[jt]sx?$/.test(id)) return;
800
962
  if (id.includes("\0") || id.includes("virtual:")) return;
801
963
  var hasClass = code.includes("class ") || code.includes("class{");
802
- var hasAsync = !dev && code.includes("async ");
803
- if (!hasClass && !hasAsync) return;
964
+ var hasAsync = code.includes("async ");
965
+ var hasBlockScopedLoop = /\bfor\s*\(\s*(?:const|let)\b/.test(code);
966
+ if (!hasClass && !hasAsync && !hasBlockScopedLoop) return;
804
967
  if (code.length > 5e5) return;
805
- try {
806
- if (!swc) swc = await import("@swc/core");
807
- var envIncludes = getHermesSWCIncludes(dev);
808
- return {
809
- code: (await swc.transform(code, {
810
- filename: id,
811
- configFile: false,
812
- swcrc: false,
813
- sourceMaps: false,
814
- inputSourceMap: false,
815
- env: {
816
- targets: {
817
- node: 9999
818
- },
819
- include: envIncludes
820
- },
821
- jsc: {
822
- parser: {
823
- syntax: "typescript",
824
- tsx: true
825
- },
826
- transform: {
827
- react: {
828
- runtime: "preserve"
829
- }
830
- },
831
- externalHelpers: false,
832
- assumptions: {
833
- setPublicClassFields: true,
834
- privateFieldsAsProperties: true
835
- }
836
- },
837
- isModule: !id.endsWith(".cjs")
838
- })).code
839
- };
840
- } catch (err) {}
968
+ if (!swc) swc = await import("@swc/core");
969
+ var envIncludes = getHermesSWCIncludes(dev);
970
+ var result = await swc.transform(code, {
971
+ filename: id,
972
+ configFile: false,
973
+ swcrc: false,
974
+ sourceMaps,
975
+ sourceFileName: sourceMaps ? id : void 0,
976
+ inputSourceMap: false,
977
+ env: {
978
+ targets: {
979
+ node: 9999
980
+ },
981
+ include: envIncludes
982
+ },
983
+ jsc: {
984
+ parser: {
985
+ syntax: "typescript",
986
+ tsx: true
987
+ },
988
+ transform: {
989
+ react: {
990
+ runtime: "preserve"
991
+ }
992
+ },
993
+ externalHelpers: false,
994
+ assumptions: {
995
+ setPublicClassFields: true,
996
+ privateFieldsAsProperties: true
997
+ }
998
+ },
999
+ isModule: !id.endsWith(".cjs")
1000
+ });
1001
+ return {
1002
+ code: result.code,
1003
+ map: sourceMaps ? result.map : void 0
1004
+ };
841
1005
  }
842
1006
  };
843
1007
  }
@@ -859,6 +1023,7 @@ class ReactNativeDevRuntime extends BaseDevRuntime {
859
1023
  var runtime = this;
860
1024
  var ctx = {
861
1025
  acceptCallbacks: [],
1026
+ reactRefreshAcceptCallback: null,
862
1027
  accept: function(deps, callback) {
863
1028
  if (typeof deps === 'function' || !deps) {
864
1029
  ctx.acceptCallbacks.push({
@@ -874,6 +1039,9 @@ class ReactNativeDevRuntime extends BaseDevRuntime {
874
1039
  ctx.acceptCallbacks.push({ deps: deps, fn: callback || function() {} });
875
1040
  }
876
1041
  },
1042
+ acceptReactRefresh: function(callback) {
1043
+ ctx.reactRefreshAcceptCallback = callback;
1044
+ },
877
1045
  invalidate: function() { runtime.requestReload('module invalidated: ' + moduleId); },
878
1046
  on: function() {},
879
1047
  off: function() {},
@@ -907,9 +1075,18 @@ class ReactNativeDevRuntime extends BaseDevRuntime {
907
1075
 
908
1076
  isSelfAccepted(moduleId) {
909
1077
  var ctx = this.moduleHotContexts[moduleId];
910
- return !!(ctx && ctx.acceptCallbacks.some(function(callback) {
1078
+ var explicitlyAccepted = !!(ctx && ctx.acceptCallbacks.some(function(callback) {
911
1079
  return callback.deps.indexOf(moduleId) !== -1;
912
1080
  }));
1081
+ if (explicitlyAccepted) return { accepted: true, reactRefresh: false };
1082
+ if (!ctx || !ctx.reactRefreshAcceptCallback || !globalThis.__ReactRefresh) {
1083
+ return { accepted: false, reactRefresh: false };
1084
+ }
1085
+ var exports = this.loadExports(moduleId);
1086
+ return {
1087
+ accepted: ctx.refreshUtils.isReactRefreshBoundary(exports),
1088
+ reactRefresh: true
1089
+ };
913
1090
  }
914
1091
 
915
1092
  acceptsDependency(parentId, moduleId) {
@@ -924,8 +1101,13 @@ class ReactNativeDevRuntime extends BaseDevRuntime {
924
1101
  traversed.add(moduleId);
925
1102
  updateSet.add(moduleId);
926
1103
 
927
- if (this.isSelfAccepted(moduleId)) {
928
- boundaries.push({ boundary: moduleId, acceptedVia: moduleId });
1104
+ var selfAcceptance = this.isSelfAccepted(moduleId);
1105
+ if (selfAcceptance.accepted) {
1106
+ boundaries.push({
1107
+ boundary: moduleId,
1108
+ acceptedVia: moduleId,
1109
+ reactRefresh: selfAcceptance.reactRefresh
1110
+ });
929
1111
  return true;
930
1112
  }
931
1113
 
@@ -961,12 +1143,19 @@ class ReactNativeDevRuntime extends BaseDevRuntime {
961
1143
 
962
1144
  var callbacks = boundaries.map(function(item) {
963
1145
  var ctx = this.moduleHotContexts[item.boundary];
1146
+ var selectedCallbacks = ctx ? ctx.acceptCallbacks.filter(function(callback) {
1147
+ return callback.deps.indexOf(item.acceptedVia) !== -1;
1148
+ }) : [];
1149
+ if (item.reactRefresh && ctx && ctx.reactRefreshAcceptCallback) {
1150
+ selectedCallbacks.push({
1151
+ deps: [item.acceptedVia],
1152
+ fn: function() { ctx.reactRefreshAcceptCallback(); }
1153
+ });
1154
+ }
964
1155
  return {
965
1156
  boundary: item.boundary,
966
1157
  acceptedVia: item.acceptedVia,
967
- callbacks: ctx ? ctx.acceptCallbacks.filter(function(callback) {
968
- return callback.deps.indexOf(item.acceptedVia) !== -1;
969
- }) : []
1158
+ callbacks: selectedCallbacks
970
1159
  };
971
1160
  }, this);
972
1161
 
@@ -1017,5 +1206,5 @@ class ReactNativeDevRuntime extends BaseDevRuntime {
1017
1206
  globalThis.__rolldown_runtime__ = new ReactNativeDevRuntime();
1018
1207
  `;
1019
1208
  }
1020
- export { buildNativeBundle, createNativeDevEngine, getHermesSWCIncludes, getHmrRuntimeSource, getNativeTransformConfig, hermesCompatSWCPlugin, hmrClientNoopPlugin, vxrnCompilerPlugin, wrapNativeBundleModuleScope };
1209
+ export { buildNativeBundle, createNativeDevAssetRegistry, createNativeDevEngine, getHermesSWCIncludes, getHmrRuntimeSource, getNativeAssetData, getNativeTransformConfig, hermesCompatSWCPlugin, hmrClientNoopPlugin, nativeAnimatedGuardPlugin, normalizeNativeCommonJSInterop, vxrnCompilerPlugin, wrapNativeBundleModuleScope };
1021
1210
  //# sourceMappingURL=createNativeDevEngine.native.js.map