vxrn 2.9.0 → 2.9.2
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 +42 -7
- package/dist/plugins/reactNativeDevServer.mjs.map +1 -1
- package/dist/plugins/reactNativeDevServer.native.js +44 -7
- package/dist/plugins/reactNativeDevServer.native.js.map +1 -1
- package/dist/utils/createNativeDevEngine.mjs +10 -3
- package/dist/utils/createNativeDevEngine.mjs.map +1 -1
- package/dist/utils/createNativeDevEngine.native.js +8 -3
- package/dist/utils/createNativeDevEngine.native.js.map +1 -1
- package/package.json +14 -14
- package/src/plugins/reactNativeDevServer.test.ts +75 -1
- package/src/plugins/reactNativeDevServer.ts +44 -7
- package/src/utils/createNativeDevEngine.ts +10 -6
- package/types/plugins/reactNativeDevServer.d.ts.map +1 -1
- package/types/utils/createNativeDevEngine.d.ts.map +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vxrn",
|
|
3
|
-
"version": "2.9.
|
|
3
|
+
"version": "2.9.2",
|
|
4
4
|
"sideEffects": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -80,14 +80,14 @@
|
|
|
80
80
|
"@react-native-community/cli": "^20.2.0",
|
|
81
81
|
"@react-native-community/cli-config": "^20.2.0",
|
|
82
82
|
"@react-native/dev-middleware": "^0.88.0",
|
|
83
|
-
"@vxrn/compiler": "2.9.
|
|
84
|
-
"@vxrn/debug": "2.9.
|
|
85
|
-
"@vxrn/query-string": "2.9.
|
|
86
|
-
"@vxrn/resolve": "2.9.
|
|
87
|
-
"@vxrn/url-parse": "2.9.
|
|
88
|
-
"@vxrn/utils": "2.9.
|
|
89
|
-
"@vxrn/vendor": "2.9.
|
|
90
|
-
"@vxrn/vite-flow": "2.9.
|
|
83
|
+
"@vxrn/compiler": "2.9.2",
|
|
84
|
+
"@vxrn/debug": "2.9.2",
|
|
85
|
+
"@vxrn/query-string": "2.9.2",
|
|
86
|
+
"@vxrn/resolve": "2.9.2",
|
|
87
|
+
"@vxrn/url-parse": "2.9.2",
|
|
88
|
+
"@vxrn/utils": "2.9.2",
|
|
89
|
+
"@vxrn/vendor": "2.9.2",
|
|
90
|
+
"@vxrn/vite-flow": "2.9.2",
|
|
91
91
|
"citty": "^0.1.6",
|
|
92
92
|
"dotenv": "^17.2.1",
|
|
93
93
|
"dotenv-expand": "^12.0.2",
|
|
@@ -103,7 +103,7 @@
|
|
|
103
103
|
"find-node-modules": "^2.1.3",
|
|
104
104
|
"fs-extra": "^11.2.0",
|
|
105
105
|
"get-port-please": "^3.1.2",
|
|
106
|
-
"hono": "^4.
|
|
106
|
+
"hono": "^4.13.11",
|
|
107
107
|
"perfect-debounce": "^1.0.0",
|
|
108
108
|
"picocolors": "^1.0.0",
|
|
109
109
|
"pkg-types": "^1.0.3",
|
|
@@ -117,7 +117,7 @@
|
|
|
117
117
|
"devDependencies": {
|
|
118
118
|
"@biomejs/biome": "2.5.15",
|
|
119
119
|
"@jridgewell/gen-mapping": "^0.3.5",
|
|
120
|
-
"@tamagui/build": "3.
|
|
120
|
+
"@tamagui/build": "3.1.2",
|
|
121
121
|
"@types/find-node-modules": "^2.1.2",
|
|
122
122
|
"@types/node": "^24.10.0",
|
|
123
123
|
"@types/ws": "^8.18.1",
|
|
@@ -127,20 +127,20 @@
|
|
|
127
127
|
"react-native": "0.88.0",
|
|
128
128
|
"typescript": "7.0.2",
|
|
129
129
|
"vitest": "^4.1.0",
|
|
130
|
-
"@vxrn/vite-plugin-metro": "2.9.
|
|
130
|
+
"@vxrn/vite-plugin-metro": "2.9.2"
|
|
131
131
|
},
|
|
132
132
|
"publishConfig": {
|
|
133
133
|
"access": "public"
|
|
134
134
|
},
|
|
135
135
|
"peerDependencies": {
|
|
136
|
-
"@vxrn/vite-plugin-metro": "2.9.
|
|
136
|
+
"@vxrn/vite-plugin-metro": "2.9.2"
|
|
137
137
|
},
|
|
138
138
|
"peerDependenciesMeta": {
|
|
139
139
|
"@vxrn/vite-plugin-metro": {
|
|
140
140
|
"optional": true
|
|
141
141
|
}
|
|
142
142
|
},
|
|
143
|
-
"releaseSourceCommit": "
|
|
143
|
+
"releaseSourceCommit": "ce34ec2d7ee2bcbc559d7c3f110f5324dea3bff6",
|
|
144
144
|
"repository": {
|
|
145
145
|
"type": "git",
|
|
146
146
|
"url": "git+https://github.com/onejs/one.git",
|
|
@@ -2,7 +2,7 @@ import { mkdtemp, mkdir, rm, writeFile } from 'node:fs/promises'
|
|
|
2
2
|
import { tmpdir } from 'node:os'
|
|
3
3
|
import { join } from 'node:path'
|
|
4
4
|
import { createServer } from 'vite'
|
|
5
|
-
import { expect, it } from 'vitest'
|
|
5
|
+
import { expect, it, vi } from 'vitest'
|
|
6
6
|
import { createReactNativeDevServerPlugin } from './reactNativeDevServer'
|
|
7
7
|
|
|
8
8
|
it('serves native media with byte ranges and preview content types', async () => {
|
|
@@ -72,3 +72,77 @@ it('serves native media with byte ranges and preview content types', async () =>
|
|
|
72
72
|
await rm(root, { recursive: true, force: true })
|
|
73
73
|
}
|
|
74
74
|
})
|
|
75
|
+
|
|
76
|
+
it('starts the native multipart response before bundling finishes', async () => {
|
|
77
|
+
const root = await mkdtemp(join(tmpdir(), 'native-bundle-http-'))
|
|
78
|
+
let finishBuild!: () => void
|
|
79
|
+
const building = new Promise<void>((resolve) => {
|
|
80
|
+
finishBuild = resolve
|
|
81
|
+
})
|
|
82
|
+
vi.useFakeTimers({ toFake: ['setInterval', 'clearInterval'] })
|
|
83
|
+
let failBuild = false
|
|
84
|
+
const previousPlugins = globalThis.__vxrnAddNativePlugins
|
|
85
|
+
globalThis.__vxrnAddNativePlugins = () => [
|
|
86
|
+
{
|
|
87
|
+
name: 'blocked-native-bundle',
|
|
88
|
+
transform(_code, id) {
|
|
89
|
+
if (id.endsWith('/__virtual-native-entry.tsx'))
|
|
90
|
+
return 'globalThis.nativeBundleReady = true'
|
|
91
|
+
},
|
|
92
|
+
async renderChunk() {
|
|
93
|
+
await building
|
|
94
|
+
if (failBuild) throw new Error('native fixture failed')
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
]
|
|
98
|
+
const server = await createServer({
|
|
99
|
+
root,
|
|
100
|
+
configFile: false,
|
|
101
|
+
plugins: [createReactNativeDevServerPlugin()],
|
|
102
|
+
server: { host: '127.0.0.1', port: 0 },
|
|
103
|
+
})
|
|
104
|
+
try {
|
|
105
|
+
await server.listen()
|
|
106
|
+
const { port } = server.httpServer!.address() as { port: number }
|
|
107
|
+
const response = await fetch(`http://127.0.0.1:${port}/index.bundle?platform=ios`, {
|
|
108
|
+
headers: { accept: 'multipart/mixed' },
|
|
109
|
+
signal: AbortSignal.timeout(1_000),
|
|
110
|
+
})
|
|
111
|
+
expect(response.headers.get('content-type')).toMatch(
|
|
112
|
+
/multipart\/mixed; boundary="[^"]+"/
|
|
113
|
+
)
|
|
114
|
+
const reader = response.body!.getReader()
|
|
115
|
+
const preamble = await reader.read()
|
|
116
|
+
await vi.advanceTimersByTimeAsync(10_000)
|
|
117
|
+
const progress = await reader.read()
|
|
118
|
+
expect(new TextDecoder().decode(progress.value)).toContain('"status":"Bundling"')
|
|
119
|
+
finishBuild()
|
|
120
|
+
reader.releaseLock()
|
|
121
|
+
let body =
|
|
122
|
+
new TextDecoder().decode(preamble.value) + new TextDecoder().decode(progress.value)
|
|
123
|
+
for await (const chunk of response.body!) {
|
|
124
|
+
body += new TextDecoder().decode(chunk)
|
|
125
|
+
}
|
|
126
|
+
expect(body).toContain('X-Http-Status: 200')
|
|
127
|
+
expect(body).toContain('nativeBundleReady')
|
|
128
|
+
const boundary = response.headers.get('content-type')!.match(/boundary="([^"]+)"/)![1]
|
|
129
|
+
expect(body.endsWith(`\r\n--${boundary}--\r\n`)).toBe(true)
|
|
130
|
+
const plain = await fetch(`http://127.0.0.1:${port}/index.bundle?platform=ios`)
|
|
131
|
+
expect(plain.headers.get('content-type')).toBe('text/javascript')
|
|
132
|
+
expect(await plain.text()).toContain('nativeBundleReady')
|
|
133
|
+
|
|
134
|
+
failBuild = true
|
|
135
|
+
const failed = await fetch(`http://127.0.0.1:${port}/index.bundle?platform=android`, {
|
|
136
|
+
headers: { accept: 'multipart/mixed' },
|
|
137
|
+
})
|
|
138
|
+
const error = await failed.text()
|
|
139
|
+
expect(error).toContain('X-Http-Status: 500')
|
|
140
|
+
expect(error).toContain('native fixture failed')
|
|
141
|
+
} finally {
|
|
142
|
+
finishBuild()
|
|
143
|
+
await server.close()
|
|
144
|
+
globalThis.__vxrnAddNativePlugins = previousPlugins
|
|
145
|
+
vi.useRealTimers()
|
|
146
|
+
await rm(root, { recursive: true, force: true })
|
|
147
|
+
}
|
|
148
|
+
})
|
|
@@ -573,6 +573,42 @@ export function createReactNativeDevServerPlugin(
|
|
|
573
573
|
)
|
|
574
574
|
}
|
|
575
575
|
|
|
576
|
+
// react native's default URLSession times out while waiting for a
|
|
577
|
+
// silent rebuild. start its multipart stream before building, as metro
|
|
578
|
+
// does, so the native loader can wait for the bundle on that stream.
|
|
579
|
+
const boundary = String(req.headers.accept || '').includes('multipart/mixed')
|
|
580
|
+
? `vxrn-${randomUUID()}`
|
|
581
|
+
: undefined
|
|
582
|
+
let progressTimer: ReturnType<typeof setInterval> | undefined
|
|
583
|
+
if (boundary) {
|
|
584
|
+
res.writeHead(200, {
|
|
585
|
+
'Cache-Control': 'no-store',
|
|
586
|
+
'Content-Type': `multipart/mixed; boundary="${boundary}"`,
|
|
587
|
+
})
|
|
588
|
+
res.write('Bundling native code')
|
|
589
|
+
// URLSession also enforces an idle timeout after receiving headers.
|
|
590
|
+
// keep reporting the ongoing build until its final part is ready.
|
|
591
|
+
progressTimer = setInterval(() => {
|
|
592
|
+
res.write(
|
|
593
|
+
`\r\n--${boundary}\r\nContent-Type: application/json\r\n\r\n${JSON.stringify({ status: 'Bundling' })}`
|
|
594
|
+
)
|
|
595
|
+
}, 10_000)
|
|
596
|
+
progressTimer.unref()
|
|
597
|
+
res.once('close', () => clearInterval(progressTimer))
|
|
598
|
+
}
|
|
599
|
+
const sendBundle = (status: number, type: string, body: string | Buffer) => {
|
|
600
|
+
if (boundary) {
|
|
601
|
+
res.write(
|
|
602
|
+
`\r\n--${boundary}\r\nContent-Type: ${type}\r\nX-Http-Status: ${status}\r\n\r\n`
|
|
603
|
+
)
|
|
604
|
+
res.write(body)
|
|
605
|
+
res.end(`\r\n--${boundary}--\r\n`)
|
|
606
|
+
} else {
|
|
607
|
+
res.writeHead(status, { 'Cache-Control': 'no-store', 'Content-Type': type })
|
|
608
|
+
res.end(body)
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
|
|
576
612
|
try {
|
|
577
613
|
const bundle = await (await getDevEngine(platform)).getBundle()
|
|
578
614
|
let body: string | Buffer = bundle.code
|
|
@@ -591,19 +627,20 @@ export function createReactNativeDevServerPlugin(
|
|
|
591
627
|
// a DevSettings reload requests this exact URL again. native URL
|
|
592
628
|
// loading may otherwise reuse the first response and restart the app
|
|
593
629
|
// on a route map from before a file was added or removed.
|
|
594
|
-
|
|
595
|
-
'Cache-Control': 'no-store',
|
|
596
|
-
'Content-Type': 'text/javascript',
|
|
597
|
-
})
|
|
598
|
-
res.end(body)
|
|
630
|
+
sendBundle(200, 'text/javascript', body)
|
|
599
631
|
} catch (err) {
|
|
600
632
|
console.error(` Error building React Native bundle`)
|
|
601
633
|
console.error(err)
|
|
602
634
|
console.error(
|
|
603
635
|
`\n\n Note, some errors may happen due to a stale Vite cache, you may want to try re-running with the "--clean" flag`
|
|
604
636
|
)
|
|
605
|
-
|
|
606
|
-
|
|
637
|
+
sendBundle(
|
|
638
|
+
500,
|
|
639
|
+
'text/plain',
|
|
640
|
+
err instanceof Error ? err.stack || err.message : String(err)
|
|
641
|
+
)
|
|
642
|
+
} finally {
|
|
643
|
+
clearInterval(progressTimer)
|
|
607
644
|
}
|
|
608
645
|
}
|
|
609
646
|
|
|
@@ -366,9 +366,8 @@ export function normalizeNativeCommonJSInterop(code: string): string {
|
|
|
366
366
|
`[vxrn] cannot normalize native CommonJS interop: the bundle does not parse (${errors[0].message})`
|
|
367
367
|
)
|
|
368
368
|
}
|
|
369
|
-
//
|
|
370
|
-
//
|
|
371
|
-
// stays, so every line keeps the number the source map recorded for it.
|
|
369
|
+
// collect spans against the original bundle. copying the entire bundle for
|
|
370
|
+
// each interop call creates gigabytes of temporary strings during a reload.
|
|
372
371
|
const deletions: Array<[start: number, end: number]> = []
|
|
373
372
|
const stack: unknown[] = [program]
|
|
374
373
|
while (stack.length) {
|
|
@@ -388,11 +387,16 @@ export function normalizeNativeCommonJSInterop(code: string): string {
|
|
|
388
387
|
stack.push(node[key])
|
|
389
388
|
}
|
|
390
389
|
}
|
|
391
|
-
deletions.
|
|
390
|
+
if (!deletions.length) return code
|
|
391
|
+
deletions.sort((a, b) => a[0] - b[0])
|
|
392
|
+
const parts: string[] = []
|
|
393
|
+
let copied = 0
|
|
392
394
|
for (const [start, end] of deletions) {
|
|
393
|
-
code
|
|
395
|
+
parts.push(code.slice(copied, start))
|
|
396
|
+
copied = end
|
|
394
397
|
}
|
|
395
|
-
|
|
398
|
+
parts.push(code.slice(copied))
|
|
399
|
+
return parts.join('')
|
|
396
400
|
}
|
|
397
401
|
|
|
398
402
|
interface InteropSyntaxNode {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactNativeDevServer.d.ts","sourceRoot":"","sources":["../../src/plugins/reactNativeDevServer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,MAAM,EAAiB,MAAM,MAAM,CAAA;AAW1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AA2CnE,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAkC9D;AAED,wBAAgB,gCAAgC,CAC9C,OAAO,CAAC,EAAE,OAAO,CACf,IAAI,CAAC,iBAAiB,EAAE,UAAU,GAAG,aAAa,GAAG,kBAAkB,GAAG,SAAS,CAAC,CACrF,GACA,MAAM,
|
|
1
|
+
{"version":3,"file":"reactNativeDevServer.d.ts","sourceRoot":"","sources":["../../src/plugins/reactNativeDevServer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,MAAM,EAAiB,MAAM,MAAM,CAAA;AAW1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AA2CnE,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAkC9D;AAED,wBAAgB,gCAAgC,CAC9C,OAAO,CAAC,EAAE,OAAO,CACf,IAAI,CAAC,iBAAiB,EAAE,UAAU,GAAG,aAAa,GAAG,kBAAkB,GAAG,SAAS,CAAC,CACrF,GACA,MAAM,CA+lBR"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createNativeDevEngine.d.ts","sourceRoot":"","sources":["../../src/utils/createNativeDevEngine.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAmBH,OAAO,KAAK,EAA+B,MAAM,EAAkB,MAAM,UAAU,CAAA;AACnF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAiCtD,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;IAiCN,MAAM;QACJ,KAAK;;EAGV;AA6FD;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"createNativeDevEngine.d.ts","sourceRoot":"","sources":["../../src/utils/createNativeDevEngine.ts"],"names":[],"mappings":"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"}
|