vxrn 2.6.21 → 2.7.0

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.
@@ -34,13 +34,28 @@ function glbFixture() {
34
34
  }
35
35
 
36
36
  it('imports GLB as a web URL and preserves emitted binary bytes', async () => {
37
- const root = await mkdtemp(join(import.meta.dirname, '.glb-web-'))
37
+ const root = await mkdtemp(join(tmpdir(), 'vxrn-glb-web-'))
38
38
  const bytes = glbFixture()
39
39
  await writeFile(join(root, 'sofa.glb'), bytes)
40
40
  await writeFile(
41
41
  join(root, 'entry.js'),
42
42
  "import model from './sofa.glb'; globalThis.model = model"
43
43
  )
44
+ // stub the workspace packages getBaseViteConfig resolves from root; the
45
+ // fixture entry itself imports no packages.
46
+ await mkdir(join(root, 'node_modules/react-native'), { recursive: true })
47
+ await writeFile(
48
+ join(root, 'node_modules/react-native/package.json'),
49
+ JSON.stringify({ name: 'react-native', version: '0.87.1' })
50
+ )
51
+ for (const name of ['query-string', 'url-parse']) {
52
+ await mkdir(join(root, `node_modules/@vxrn/${name}`), { recursive: true })
53
+ await writeFile(
54
+ join(root, `node_modules/@vxrn/${name}/package.json`),
55
+ JSON.stringify({ name: `@vxrn/${name}`, version: '0.0.0', main: 'index.js' })
56
+ )
57
+ await writeFile(join(root, `node_modules/@vxrn/${name}/index.js`), 'export default {}')
58
+ }
44
59
  const config = await getBaseViteConfig({ root, mode: 'development' })
45
60
  const server = await createServer({
46
61
  ...config,
@@ -181,13 +196,13 @@ it.each(['ios', 'android'] as const)(
181
196
  )
182
197
 
183
198
  it('serves legacy native dev GLB bytes with their content type', async () => {
184
- const root = await mkdtemp(join(import.meta.dirname, '.glb-dev-'))
199
+ const root = await mkdtemp(join(tmpdir(), 'vxrn-glb-dev-'))
185
200
  const file = join(root, 'sofa.glb')
186
201
  const bytes = glbFixture()
187
202
  await writeFile(file, bytes)
188
203
  const plugin = reactNativeDevAssetPlugin({ assetExts: DEFAULT_ASSET_EXTS, mode: 'dev' })
189
204
  let middleware: Function
190
- ;(plugin.configResolved as Function)({ root: process.cwd() })
205
+ ;(plugin.configResolved as Function)({ root })
191
206
  ;(plugin.configureServer as Function)({
192
207
  config: {
193
208
  logger: {
@@ -204,9 +219,14 @@ it('serves legacy native dev GLB bytes with their content type', async () => {
204
219
  })
205
220
  const headers: Record<string, string> = {}
206
221
  let served: Buffer | undefined
222
+ // the dev middleware reads the request path relative to the server cwd,
223
+ // which matches the project root on a real server; run it from the fixture
224
+ // root so the relative request keeps serving semantics with no path escape.
225
+ const previousCwd = process.cwd()
226
+ process.chdir(root)
207
227
  try {
208
228
  await middleware!(
209
- { url: `/__vxrn_dev_native_assets/${relative(process.cwd(), file)}` },
229
+ { url: `/__vxrn_dev_native_assets/${relative(root, file)}` },
210
230
  {
211
231
  setHeader: (name: string, value: string) => {
212
232
  headers[name] = value
@@ -223,6 +243,7 @@ it('serves legacy native dev GLB bytes with their content type', async () => {
223
243
  expect(served).toEqual(bytes)
224
244
  expect(headers['content-type']).toBe('model/gltf-binary')
225
245
  } finally {
246
+ process.chdir(previousCwd)
226
247
  await rm(root, { recursive: true, force: true })
227
248
  }
228
249
  })
@@ -629,9 +629,9 @@ export function createReactNativeDevServerPlugin(
629
629
  )
630
630
  }
631
631
 
632
- const bundle = await (await getDevEngine(platform)).getBundle()
632
+ const map = await (await getDevEngine(platform)).getSourceMap()
633
633
  res.writeHead(200, { 'Content-Type': 'application/json' })
634
- res.end(JSON.stringify(symbolicateNativeStack(stack, bundle.map)))
634
+ res.end(JSON.stringify(symbolicateNativeStack(stack, map)))
635
635
  } catch (err) {
636
636
  console.error(`[vxrn] symbolicate failed`, err)
637
637
  res.writeHead(500, { 'Content-Type': 'application/json' })
@@ -962,6 +962,119 @@ if (import.meta.hot) import.meta.hot.accept(() => {})
962
962
  }
963
963
  )
964
964
 
965
+ it(
966
+ 'applies an immediate follow-up HMR restore and serves getSourceMap() without triggering a full bundle rebuild',
967
+ { timeout: 30_000 },
968
+ async () => {
969
+ const root = realpathSync(await mkdtemp(join(tmpdir(), 'vxrn-native-hmr-restore-')))
970
+ await mkdir(join(root, 'app'), { recursive: true })
971
+ await mkdir(join(root, 'features/hmr'), { recursive: true })
972
+ const childPath = join(root, 'features/hmr/HmrProbeChild.tsx')
973
+ const routePath = join(root, 'app/hmr-probe.tsx')
974
+ const childSource = (version: string) =>
975
+ `export function HmrProbeChild() { return ${JSON.stringify(version)} }\nglobalThis.childVersion = HmrProbeChild()\n`
976
+
977
+ await writeFile(childPath, childSource('component-v1'))
978
+ await writeFile(
979
+ routePath,
980
+ `import { HmrProbeChild } from '../features/hmr/HmrProbeChild.tsx'\nglobalThis.routeEvaluations = (globalThis.routeEvaluations || 0) + 1\nexport default function HmrProbe() { return HmrProbeChild() }\n`
981
+ )
982
+
983
+ let fullBuildCount = 0
984
+ const updates: Array<Extract<any, { type: 'hmr:update' }>> = []
985
+ let resolveSecondUpdate!: (update: any) => void
986
+ const secondUpdateReceived = new Promise<any>((resolve) => {
987
+ resolveSecondUpdate = resolve
988
+ })
989
+ let runtime: any
990
+ let context: any
991
+ let sourceMapPromise: Promise<string> | undefined
992
+
993
+ const native = await createNativeDevEngine({
994
+ root,
995
+ port: 0,
996
+ platform: 'ios',
997
+ plugins: [
998
+ {
999
+ name: 'native-hmr-restore-entry',
1000
+ transform(code, id) {
1001
+ if (id.endsWith('/__virtual-native-entry.tsx')) {
1002
+ const registryImport =
1003
+ code.match(/import \{ routes \} from [^;]+;/)?.[0] ?? ''
1004
+ const accept = code.slice(code.lastIndexOf('if (import.meta.hot)'))
1005
+ return `${registryImport}\nglobalThis.routeMap = routes\n${accept}`
1006
+ }
1007
+ },
1008
+ async renderChunk() {
1009
+ fullBuildCount++
1010
+ if (fullBuildCount > 1) {
1011
+ await new Promise((resolve) => setTimeout(resolve, 1500))
1012
+ }
1013
+ return null
1014
+ },
1015
+ },
1016
+ ],
1017
+ onHmrUpdate(update) {
1018
+ if (update.type !== 'hmr:update') return
1019
+ updates.push(update)
1020
+ expect(runtime.applyHmrUpdate(update.code, update.changedIds, update.seq)).toBe(
1021
+ true
1022
+ )
1023
+ if (updates.length === 1) {
1024
+ // /symbolicate requests the source map while the device is running,
1025
+ // and the test immediately restores the file to component-v1 upon
1026
+ // seeing hmr-session-ready.
1027
+ sourceMapPromise = native.getSourceMap()
1028
+ void writeFile(childPath, childSource('component-v1'))
1029
+ } else if (updates.length === 2) {
1030
+ resolveSecondUpdate(update)
1031
+ }
1032
+ },
1033
+ })
1034
+
1035
+ try {
1036
+ const initial = await native.getBundle()
1037
+ context = {
1038
+ console: { ...console, error() {} },
1039
+ setTimeout,
1040
+ clearTimeout,
1041
+ __ReactRefresh: {
1042
+ register: () => {},
1043
+ createSignatureFunctionForTransform: () => (type: unknown) => type,
1044
+ isLikelyComponentType: (value: unknown) => typeof value === 'function',
1045
+ performReactRefresh: () => {},
1046
+ },
1047
+ $RefreshReg$: () => {},
1048
+ $RefreshSig$: () => (type: unknown) => type,
1049
+ }
1050
+ runInNewContext(initial.code, context)
1051
+ await context.routeMap['/app/hmr-probe.tsx']()
1052
+ expect(context.childVersion).toBe('component-v1')
1053
+ expect(context.routeEvaluations).toBe(1)
1054
+ expect(fullBuildCount).toBe(1)
1055
+
1056
+ runtime = context.__rolldown_runtime__
1057
+ await native.engine.registerClient(runtime.clientId)
1058
+
1059
+ await writeFile(childPath, childSource('hmr-session-ready'))
1060
+ const secondUpdate = await secondUpdateReceived
1061
+ expect(await sourceMapPromise).toBe(initial.map)
1062
+ expect(updates).toHaveLength(2)
1063
+ expect(context.childVersion).toBe('component-v1')
1064
+ expect(context.routeEvaluations).toBe(1)
1065
+ expect(fullBuildCount).toBe(1)
1066
+ // notifyPayloadDelivered records the first patch's ancestor factories as
1067
+ // shipped, so the restore patch only carries the leaf module itself.
1068
+ expect(secondUpdate.code.match(/registerFactory\("[^"]+"/g)).toEqual([
1069
+ 'registerFactory("features/hmr/HmrProbeChild.tsx"',
1070
+ ])
1071
+ } finally {
1072
+ await native.close()
1073
+ await rm(root, { recursive: true, force: true })
1074
+ }
1075
+ }
1076
+ )
1077
+
965
1078
  it(
966
1079
  'registers a Rolldown 1.2 client and applies a self-accepted patch',
967
1080
  { timeout: 30_000 },
@@ -102,6 +102,7 @@ export interface NativeDevBundle {
102
102
  interface NativeDevEngineResult {
103
103
  engine: DevEngine
104
104
  getBundle: () => Promise<NativeDevBundle>
105
+ getSourceMap: () => Promise<string>
105
106
  getAsset: (pathname: string, hash?: string) => NativeDevAsset | undefined
106
107
  close: () => Promise<void>
107
108
  }
@@ -699,6 +700,12 @@ try {
699
700
  },
700
701
 
701
702
  onHmrUpdates: async (result) => {
703
+ // wait for rolldown's BundleCompleted handler (which tears down and
704
+ // recreates the macOS fsevent stream on path updates) to finish before
705
+ // touching the route file or notifying clients, so a follow-up edit
706
+ // triggered by the HMR message cannot land while the watcher is stopped.
707
+ await engine?.ensureCurrentBuildFinish()
708
+
702
709
  if (result instanceof Error) {
703
710
  console.error('[vxrn] HMR error:', result.message)
704
711
  onHmrUpdate?.({ type: 'hmr:error' })
@@ -712,6 +719,7 @@ try {
712
719
 
713
720
  for (const { clientId, update } of result.updates) {
714
721
  if (update.type === 'Patch' && update.code) {
722
+ await engine.notifyPayloadDelivered(update.filename)
715
723
  onHmrUpdate?.({
716
724
  type: 'hmr:update',
717
725
  clientId,
@@ -728,7 +736,9 @@ try {
728
736
  // patches update the registered client runtime directly. a full bundle rebuild
729
737
  // is only needed when the runtime requests a reload.
730
738
  rebuildStrategy: 'never',
731
- watch: {},
739
+ watch: {
740
+ exclude: ['**/node_modules/.test/**', '**/.git/**'],
741
+ },
732
742
  })
733
743
 
734
744
  async function handleOutput(result: RolldownOutput | Error) {
@@ -823,38 +833,51 @@ try {
823
833
  })
824
834
  await rebuildIfRouteGraphChanged()
825
835
 
836
+ const getBundle = async (): Promise<NativeDevBundle> => {
837
+ // a runtime invalidation marks the full output stale before reloading. pull
838
+ // that output before serving the cached bundle to the restarted app.
839
+ await queueEngineWork(async () => {
840
+ await engine.ensureLatestBuildOutput()
841
+ await outputProcessed
842
+ })
843
+ if (currentBundle) return currentBundle
844
+ if (firstBuildError) throw firstBuildError
845
+ if (!bundlePromise) {
846
+ let timeoutId: ReturnType<typeof setTimeout>
847
+ bundlePromise = new Promise((resolve, reject) => {
848
+ bundleResolve = (value) => {
849
+ clearTimeout(timeoutId)
850
+ resolve(value)
851
+ }
852
+ bundleReject = (error) => {
853
+ clearTimeout(timeoutId)
854
+ reject(error)
855
+ }
856
+ timeoutId = setTimeout(() => {
857
+ bundleResolve = null
858
+ bundleReject = null
859
+ bundlePromise = null
860
+ reject(new Error('[vxrn] bundle build timed out after 120s'))
861
+ }, 120_000)
862
+ })
863
+ }
864
+ return bundlePromise
865
+ }
866
+
826
867
  return {
827
868
  engine,
828
869
 
829
- async getBundle() {
830
- // a runtime invalidation marks the full output stale before reloading. pull
831
- // that output before serving the cached bundle to the restarted app.
832
- await queueEngineWork(async () => {
833
- await engine.ensureLatestBuildOutput()
834
- await outputProcessed
835
- })
836
- if (currentBundle) return currentBundle
837
- if (firstBuildError) throw firstBuildError
838
- if (!bundlePromise) {
839
- let timeoutId: ReturnType<typeof setTimeout>
840
- bundlePromise = new Promise((resolve, reject) => {
841
- bundleResolve = (value) => {
842
- clearTimeout(timeoutId)
843
- resolve(value)
844
- }
845
- bundleReject = (error) => {
846
- clearTimeout(timeoutId)
847
- reject(error)
848
- }
849
- timeoutId = setTimeout(() => {
850
- bundleResolve = null
851
- bundleReject = null
852
- bundlePromise = null
853
- reject(new Error('[vxrn] bundle build timed out after 120s'))
854
- }, 120_000)
855
- })
856
- }
857
- return bundlePromise
870
+ getBundle,
871
+
872
+ async getSourceMap() {
873
+ // resolve frames against the map of the bundle currently running on the
874
+ // device. every Fast Refresh patch marks rolldown's full output stale, so
875
+ // calling ensureLatestBuildOutput() here would kick off a full bundle
876
+ // rebuild that blocks WatchEvent HMR tasks and replaces the map before
877
+ // the device has reloaded.
878
+ await outputProcessed
879
+ if (currentBundle) return currentBundle.map
880
+ return (await getBundle()).map
858
881
  },
859
882
 
860
883
  getAsset(pathname, hash) {
@@ -47,6 +47,7 @@ export interface NativeDevBundle {
47
47
  interface NativeDevEngineResult {
48
48
  engine: DevEngine;
49
49
  getBundle: () => Promise<NativeDevBundle>;
50
+ getSourceMap: () => Promise<string>;
50
51
  getAsset: (pathname: string, hash?: string) => NativeDevAsset | undefined;
51
52
  close: () => Promise<void>;
52
53
  }
@@ -1 +1 @@
1
- {"version":3,"file":"createNativeDevEngine.d.ts","sourceRoot":"","sources":["../../src/utils/createNativeDevEngine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"createNativeDevEngine.d.ts","sourceRoot":"","sources":["../../src/utils/createNativeDevEngine.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAkBH,OAAO,KAAK,EAA+B,MAAM,EAAkB,MAAM,UAAU,CAAA;AACnF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAgCtD,yFAAyF;AACzF,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,EAAE,CAE3D;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,KAAK,GAAG,SAAS,CAAA;IAC3B,GAAG,EAAE,OAAO,CAAA;CACb;AAED,UAAU,sBAAsB;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,KAAK,GAAG,SAAS,CAAA;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAA;CAChD;AAED,MAAM,MAAM,eAAe,GACvB;IACE,IAAI,EAAE,YAAY,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,GAAG,EAAE,MAAM,CAAA;CACZ,GAGD;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,CAAA;AAEzB;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,UAAU,qBAAqB;IAC7B,MAAM,EAAE,SAAS,CAAA;IACjB,SAAS,EAAE,MAAM,OAAO,CAAC,eAAe,CAAC,CAAA;IACzC,YAAY,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;IACnC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,cAAc,GAAG,SAAS,CAAA;IACzE,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3B;AA8BD,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,KAAK,GAAG,SAAS,EAC3B,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,MAAM;IAsEV,GAAG;QAGD,OAAO,EAAE,SAAS;;IAEpB,MAAM;IAgCN,MAAM;QACJ,KAAK;;EAGV;AA8FD;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOnE;AAmCD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAkD5D;AAED;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAUhE;AA4ED,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,qBAAqB,CAAC,CA6VhC;AAID,UAAU,kBAAkB;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,KAAK,GAAG,SAAS,CAAA;IAC3B,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,yFAAyF;IACzF,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAiFzC;AAiND;;;;;;GAMG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CA6BlD;AA+ED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAuB5C;AAgQD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,OAAO,EACZ,WAAW,SAAgB,EAC3B,UAAU,UAAQ,GACjB,MAAM,CA6PR;AA2DD,KAAK,eAAe,GAAG;IACrB,gBAAgB,EAAE,IAAI,CAAA;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,kBAAkB,EAAE,MAAM,CAAA;IAC1B,kBAAkB,EAAE,MAAM,CAAA;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,wBAAgB,4BAA4B,IAAI;IAC9C,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAA;IAC1C,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,cAAc,GAAG,SAAS,CAAA;CACzE,CAuBA;AAyDD,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,eAAe,CAAC,CA4D1B;AAiED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,UAAQ,GAAG,MAAM,CAwD9E;AAED,eAAO,MAAM,kBAAkB,8BAAwB,CAAA;AAEvD;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,UAAQ,GAAG,MAAM,CAuB5D;AAID,wBAAgB,mBAAmB,IAAI,MAAM,CA6O5C"}