vxrn 2.7.6 → 2.7.7

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.
@@ -0,0 +1,115 @@
1
+ import {
2
+ cpSync,
3
+ mkdirSync,
4
+ mkdtempSync,
5
+ readFileSync,
6
+ realpathSync,
7
+ rmSync,
8
+ writeFileSync,
9
+ } from 'node:fs'
10
+ import { createRequire } from 'node:module'
11
+ import { tmpdir } from 'node:os'
12
+ import { dirname, join, resolve } from 'node:path'
13
+ import { createServer } from 'vite'
14
+ import { expect, it } from 'vitest'
15
+ import { builtInDepPatches } from '../patches/builtInDepPatches'
16
+ import { getOptimizeDeps } from './getOptimizeDeps'
17
+
18
+ const require = createRequire(import.meta.url)
19
+
20
+ it.each([false, true])(
21
+ 'renders with shared React through patched entrypoints: %s',
22
+ async (patched) => {
23
+ const root = realpathSync(mkdtempSync(join(tmpdir(), 'vxrn-ssr-react-')))
24
+ const modules = join(root, 'node_modules')
25
+ mkdirSync(modules)
26
+ writeFileSync(join(root, 'package.json'), '{"private":true}')
27
+ for (const name of ['react', 'react-dom']) {
28
+ const target = join(modules, name)
29
+ cpSync(dirname(require.resolve(`${name}/package.json`)), target, {
30
+ recursive: true,
31
+ dereference: true,
32
+ })
33
+ if (patched) {
34
+ const patch = builtInDepPatches.find(({ module }) => module === name)!
35
+ // use the existing wrapper bytes and export conditions with real runtimes.
36
+ for (const [file, value] of Object.entries(patch.patchFiles)) {
37
+ if (file === 'version') continue
38
+ if (typeof value === 'string') writeFileSync(join(target, file), value)
39
+ }
40
+ const manifest = join(target, 'package.json')
41
+ const pkg = JSON.parse(readFileSync(manifest, 'utf8'))
42
+ pkg.version = '18.3.1'
43
+ const patchManifest = patch.patchFiles['package.json']
44
+ if (typeof patchManifest !== 'function')
45
+ throw new Error('missing React export patch')
46
+ writeFileSync(manifest, patchManifest(JSON.stringify(pkg)) as string)
47
+ }
48
+ }
49
+ const vendor = join(modules, '@vxrn/vendor')
50
+ mkdirSync(vendor, { recursive: true })
51
+ const source = resolve(import.meta.dirname, '../../../vendor')
52
+ cpSync(join(source, 'package.json'), join(vendor, 'package.json'))
53
+ for (const name of ['react', 'react-dom']) {
54
+ cpSync(join(source, name), join(vendor, name), { recursive: true })
55
+ }
56
+ writeFileSync(
57
+ join(root, 'entry.js'),
58
+ `import React, { useState } from 'react'
59
+ import { renderToString } from 'react-dom/server.browser'
60
+ function Page() {
61
+ const [text] = useState('ready')
62
+ return React.createElement('h1', null, text)
63
+ }
64
+ export const html = renderToString(React.createElement(Page))
65
+ `
66
+ )
67
+ const loadedVendor = new Set<string>()
68
+ const { optimizeDeps } = getOptimizeDeps('serve')
69
+ const include = optimizeDeps.include.filter((id) =>
70
+ /^(react(?:-dom)?(?:\/|$)|@vxrn\/vendor\/react)/.test(id)
71
+ )
72
+ const server = await createServer({
73
+ configFile: false,
74
+ root,
75
+ server: { middlewareMode: true },
76
+ optimizeDeps: { noDiscovery: true },
77
+ ssr: { noExternal: include },
78
+ environments: {
79
+ ssr: {
80
+ resolve: { conditions: ['vxrn-web'] },
81
+ optimizeDeps: {
82
+ ...optimizeDeps,
83
+ include: [...include, 'react-dom/server.browser'],
84
+ noDiscovery: true,
85
+ rolldownOptions: {
86
+ ...optimizeDeps.rolldownOptions,
87
+ plugins: [
88
+ {
89
+ name: 'record-vendored-react-loads',
90
+ load(id) {
91
+ if (id.startsWith(vendor)) loadedVendor.add(id)
92
+ },
93
+ },
94
+ ],
95
+ },
96
+ },
97
+ },
98
+ },
99
+ })
100
+ try {
101
+ expect(server.environments.ssr.depsOptimizer).toBeDefined()
102
+ await server.environments.ssr.listen(server)
103
+ const result = await server.ssrLoadModule(join(root, 'entry.js'))
104
+ expect(result.html).toBe('<h1>ready</h1>')
105
+ if (patched) {
106
+ expect(loadedVendor.size).toBeGreaterThan(0)
107
+ } else {
108
+ expect([...loadedVendor]).toEqual([])
109
+ }
110
+ } finally {
111
+ await server.close()
112
+ rmSync(root, { recursive: true, force: true })
113
+ }
114
+ }
115
+ )
@@ -1,5 +1,5 @@
1
1
  import { existsSync, realpathSync } from 'node:fs'
2
- import { mkdir, mkdtemp, readFile, rm, symlink, writeFile } from 'node:fs/promises'
2
+ import { mkdir, mkdtemp, readFile, rename, rm, symlink, writeFile } from 'node:fs/promises'
3
3
  import { tmpdir } from 'node:os'
4
4
  import { join } from 'node:path'
5
5
  import { createContext, runInContext, runInNewContext } from 'node:vm'
@@ -28,6 +28,14 @@ import {
28
28
  type NativePluginContext,
29
29
  } from './createNativeDevEngine'
30
30
 
31
+ // an edit made while the engine watches, landing the way an editor's safe save
32
+ // does. writeFile truncates first, and a loaded runner can deliver that empty
33
+ // file to the watcher as an edit of its own before the content arrives
34
+ const saveFile = async (path: string, data: string) => {
35
+ await writeFile(`${path}.tmp`, data)
36
+ await rename(`${path}.tmp`, path)
37
+ }
38
+
31
39
  it.each(['edit', 'create', 'delete'] as const)(
32
40
  'loads routes and applies %s HMR through symlinked node_modules',
33
41
  async (change) => {
@@ -1025,7 +1033,7 @@ if (import.meta.hot) import.meta.hot.accept(() => {})
1025
1033
  // and the test immediately restores the file to component-v1 upon
1026
1034
  // seeing hmr-session-ready.
1027
1035
  sourceMapPromise = native.getSourceMap()
1028
- void writeFile(childPath, childSource('component-v1'))
1036
+ void saveFile(childPath, childSource('component-v1'))
1029
1037
  } else if (updates.length === 2) {
1030
1038
  resolveSecondUpdate(update)
1031
1039
  }
@@ -1056,7 +1064,7 @@ if (import.meta.hot) import.meta.hot.accept(() => {})
1056
1064
  runtime = context.__rolldown_runtime__
1057
1065
  await native.engine.registerClient(runtime.clientId)
1058
1066
 
1059
- await writeFile(childPath, childSource('hmr-session-ready'))
1067
+ await saveFile(childPath, childSource('hmr-session-ready'))
1060
1068
  const secondUpdate = await secondUpdateReceived
1061
1069
  expect(await sourceMapPromise).toBe(initial.map)
1062
1070
  expect(updates).toHaveLength(2)
@@ -2796,6 +2804,74 @@ globalThis.__vxrnConditionalExportProbe = helper()
2796
2804
  }
2797
2805
  )
2798
2806
 
2807
+ it.each([false, true])(
2808
+ 'preserves external native defaults and raw namespaces (minify=%s)',
2809
+ async (minify) => {
2810
+ const root = await mkdtemp(join(tmpdir(), 'vxrn-external-default-'))
2811
+ await writeFile(join(root, 'package.json'), JSON.stringify({ type: 'module' }))
2812
+ await writeFile(
2813
+ join(root, 'entry.js'),
2814
+ `
2815
+ import Component, { marker } from 'external-helper'
2816
+ import Scoped from '@external/helper/deep'
2817
+ import Plain from 'plain-helper'
2818
+ globalThis.externalDefaults = [Component, marker, Scoped, Plain, require('external-helper')]
2819
+ `
2820
+ )
2821
+ const component = () => 42
2822
+ const namespace = { default: component, marker: 42, __esModule: true }
2823
+ try {
2824
+ const result = await buildNativeBundle({
2825
+ root,
2826
+ platform: 'ios',
2827
+ entryFile: 'entry.js',
2828
+ minify,
2829
+ plugins: [
2830
+ {
2831
+ name: 'external-default-probe',
2832
+ resolveId(id) {
2833
+ if (
2834
+ ['external-helper', '@external/helper/deep', 'plain-helper'].includes(
2835
+ id
2836
+ )
2837
+ ) {
2838
+ return { id, external: true }
2839
+ }
2840
+ },
2841
+ outputOptions(options) {
2842
+ return { ...options, format: 'cjs', intro: '' }
2843
+ },
2844
+ },
2845
+ ],
2846
+ })
2847
+ const context = {
2848
+ module: { exports: {} },
2849
+ exports: {},
2850
+ console,
2851
+ require(id: string) {
2852
+ if (id === 'plain-helper') return component
2853
+ if (id === 'external-helper' || id === '@external/helper/deep')
2854
+ return namespace
2855
+ throw new Error(`unexpected external: ${id}`)
2856
+ },
2857
+ }
2858
+ runInNewContext(result.code, context)
2859
+ expect(Reflect.get(context, 'externalDefaults')).toEqual([
2860
+ component,
2861
+ 42,
2862
+ component,
2863
+ component,
2864
+ namespace,
2865
+ ])
2866
+ const values = Reflect.get(context, 'externalDefaults')
2867
+ if (!Array.isArray(values)) throw new Error('external probe did not execute')
2868
+ expect(values[4]).toBe(namespace)
2869
+ } finally {
2870
+ await rm(root, { recursive: true, force: true })
2871
+ }
2872
+ }
2873
+ )
2874
+
2799
2875
  it('unwraps the default export of Babel CommonJS modules in production output', async () => {
2800
2876
  const testRoot = await mkdtemp(join(tmpdir(), 'vxrn-native-prod-cjs-default-'))
2801
2877
  const packageRoot = join(testRoot, 'node_modules/default-export-helper')
@@ -3148,7 +3224,7 @@ describe('native zero-client edit recoverability', () => {
3148
3224
  expect(fullBuildCount).toBe(1)
3149
3225
 
3150
3226
  // no client is registered here: this is the app that never connected.
3151
- await writeFile(childPath, childSource('component-v2'))
3227
+ await saveFile(childPath, childSource('component-v2'))
3152
3228
  const staleDeadline = Date.now() + 10_000
3153
3229
  let stale = false
3154
3230
  while (Date.now() < staleDeadline) {
@@ -351,9 +351,9 @@ function getNativeOutputOptions(
351
351
  */
352
352
  export function normalizeNativeCommonJSInterop(code: string): string {
353
353
  // native packages expose Babel defaults through exports.default. apply the
354
- // same interop to bundled require helpers and HMR's runtime export lookups.
354
+ // same interop to external bindings, bundled helpers and HMR export lookups.
355
355
  return code.replace(
356
- /(\b__toESM(?:\$\d+)?\(\s*(?:require[\w$]*\(\)|__rolldown_runtime__\.loadExports\("(?:\\.|[^"\\])*"\))\s*),\s*1(\s*\))/g,
356
+ /(\b__toESM(?:\$\d+)?\(\s*(?:require[\w$]*\(\)|[\w$]+|__rolldown_runtime__\.loadExports\("(?:\\.|[^"\\])*"\))\s*),\s*1(\s*\))/g,
357
357
  '$1$2'
358
358
  )
359
359
  }
@@ -706,17 +706,38 @@ try {
706
706
  // triggered by the HMR message cannot land while the watcher is stopped.
707
707
  await engine?.ensureCurrentBuildFinish()
708
708
 
709
+ // adding or deleting a route changes a route map that was expanded when
710
+ // the entry transformed. only a full build re-expands it, and rolldown
711
+ // tells no client that happened, so the reload is sent from here. this
712
+ // comes first: a deleted route fails its own patch while the registry
713
+ // still imports it, and the registry update supersedes that failure.
714
+ if (await rebuildIfRouteGraphChanged()) return
715
+
709
716
  if (result instanceof Error) {
717
+ // an import of a route that an earlier registry listed and the current
718
+ // one dropped is a deleted route the registry was already rewritten for,
719
+ // and that rewrite builds and reports again.
720
+ const { removedFiles, registryId } = virtualEntry.routes
721
+ const errors: Array<{ code?: string; id?: string; exporter?: string }> =
722
+ (result as any).errors ?? []
723
+ if (
724
+ registryId &&
725
+ errors.length &&
726
+ errors.every((e) => {
727
+ if (e.code !== 'UNRESOLVED_IMPORT' || e.id !== registryId || !e.exporter) {
728
+ return false
729
+ }
730
+ const file = normalizePath(resolve(dirname(e.id), e.exporter))
731
+ return removedFiles.has(file)
732
+ })
733
+ ) {
734
+ return
735
+ }
710
736
  console.error('[vxrn] HMR error:', result.message)
711
737
  onHmrUpdate?.({ type: 'hmr:error' })
712
738
  return
713
739
  }
714
740
 
715
- // adding or deleting a route changes a route map that was expanded when
716
- // the entry transformed. only a full build re-expands it, and rolldown
717
- // tells no client that happened, so the reload is sent from here.
718
- if (await rebuildIfRouteGraphChanged()) return
719
-
720
741
  for (const { clientId, update } of result.updates) {
721
742
  if (update.type === 'Patch' && update.code) {
722
743
  await engine.notifyPayloadDelivered(update.filename)
@@ -1009,6 +1030,10 @@ interface NativeRouteRegistry {
1009
1030
  isRouteFile: (file: string) => boolean
1010
1031
  scanFiles: () => Set<string>
1011
1032
  updateFiles: (files: Set<string>) => void
1033
+ // the registry module's resolved id, as rolldown reports it in errors
1034
+ registryId?: string
1035
+ // routes an earlier registry listed that the current one does not
1036
+ removedFiles: Set<string>
1012
1037
  }
1013
1038
 
1014
1039
  function nativeVirtualEntryPlugin(
@@ -1139,15 +1164,19 @@ ${routeHmr}
1139
1164
  const routes: NativeRouteRegistry = {
1140
1165
  routeRoot,
1141
1166
  files: new Set(),
1167
+ removedFiles: new Set(),
1142
1168
  isRouteFile,
1143
1169
  scanFiles,
1144
1170
  updateFiles(files) {
1171
+ for (const file of routes.files) if (!files.has(file)) routes.removedFiles.add(file)
1172
+ for (const file of files) routes.removedFiles.delete(file)
1145
1173
  routes.files = files
1146
1174
  if (!useDynamicRouteRegistry) return
1147
1175
 
1148
1176
  mkdirSync(dirname(registryPath), { recursive: true })
1149
1177
  // rolldown resolves the registry through symlinked node_modules before its imports.
1150
1178
  const registryDir = realpathSync(dirname(registryPath))
1179
+ routes.registryId = join(registryDir, basename(registryPath))
1151
1180
  const source = `export const routes = {\n${[...files]
1152
1181
  .sort()
1153
1182
  .map((file) => {
@@ -1 +1 @@
1
- {"version":3,"file":"getOptimizeDeps.d.ts","sourceRoot":"","sources":["../../src/config/getOptimizeDeps.ts"],"names":[],"mappings":"AAKA,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO;;;;;;;;;;gBAwI7C,UAAU;;;gBAaV,MAAM;oBACJ,qBAAqB;;;;;;;;;;;EAiBhC"}
1
+ {"version":3,"file":"getOptimizeDeps.d.ts","sourceRoot":"","sources":["../../src/config/getOptimizeDeps.ts"],"names":[],"mappings":"AAKA,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO;;;;;;;;;;gBA0I7C,UAAU;;;gBAaV,MAAM;oBACJ,qBAAqB;;;;;;;;;;;EAiBhC"}
@@ -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":"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"}