one 1.19.3 → 1.19.4
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/cjs/vite/plugins/fileSystemRouterPlugin.cjs +26 -0
- package/dist/cjs/vite/plugins/fileSystemRouterPlugin.native.js +26 -0
- package/dist/cjs/vite/plugins/fileSystemRouterPlugin.native.js.map +1 -1
- package/dist/cjs/vite/plugins/fileSystemRouterPlugin.test.cjs +125 -0
- package/dist/cjs/vite/plugins/fileSystemRouterPlugin.test.native.js +129 -0
- package/dist/cjs/vite/plugins/fileSystemRouterPlugin.test.native.js.map +1 -1
- package/dist/esm/vite/plugins/fileSystemRouterPlugin.mjs +26 -0
- package/dist/esm/vite/plugins/fileSystemRouterPlugin.mjs.map +1 -1
- package/dist/esm/vite/plugins/fileSystemRouterPlugin.native.js +26 -0
- package/dist/esm/vite/plugins/fileSystemRouterPlugin.native.js.map +1 -1
- package/dist/esm/vite/plugins/fileSystemRouterPlugin.test.mjs +125 -0
- package/dist/esm/vite/plugins/fileSystemRouterPlugin.test.mjs.map +1 -1
- package/dist/esm/vite/plugins/fileSystemRouterPlugin.test.native.js +129 -0
- package/dist/esm/vite/plugins/fileSystemRouterPlugin.test.native.js.map +1 -1
- package/package.json +9 -9
- package/src/vite/plugins/fileSystemRouterPlugin.test.ts +133 -0
- package/src/vite/plugins/fileSystemRouterPlugin.tsx +30 -1
- package/types/vite/plugins/fileSystemRouterPlugin.d.ts.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["mkdirSync","mkdtempSync","rmSync","writeFileSync","tmpdir","path","afterEach","beforeEach","describe","expect","it","vi","mock","actual","importActual","createServerModuleRunner","fn","clearCache","import","previousIsVxrnCli","process","env","IS_VXRN_CLI","previousVxrnPluginConfig","tempRoot","globalThis","__vxrnPluginConfig__","recursive","force","restoreAllMocks","join","appDir","web","defaultRenderMode","createFileSystemRouterPlugin","plugin","router","root","watcherListener","server","environments","ssr","watcher","addListener","event","listener","on","configureServer","toBeDefined","warn","spyOn","console","mockImplementation","Error","Promise","resolve","resolves","toBeUndefined","toHaveBeenCalledWith","stringContaining","any"],"sources":["../../../../src/vite/plugins/fileSystemRouterPlugin.test.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,SAAA,EAAWC,WAAA,EAAaC,MAAA,EAAQC,aAAA,QAAqB;AAC9D,SAASC,MAAA,QAAc;AACvB,OAAOC,IAAA,MAAU;AACjB,SAASC,SAAA,EAAWC,UAAA,EAAYC,QAAA,EAAUC,MAAA,EAAQC,EAAA,EAAIC,EAAA,QAAU;AAEhEA,EAAA,CAAGC,IAAA,CAAK,QAAQ,kBAAY;EAC1B,IAAAC,MAAM,SAASF,EAAM,CAAAG,YAAG,OAAoC;EAC5D,OAAO;IACL,GAAGD,MAAA;IACHE,wBAAA,EAA0BJ,EAAA,CAAGK,EAAA,CAAG,YAAO;MACrC;QACAC,UAAW,EAAGN,EAAA,CAAAK,EAAA;QACdE,MAAA,EAAAP,EAAA,CAAAK,EAAA;MACJ;IACD;
|
|
1
|
+
{"version":3,"names":["mkdirSync","mkdtempSync","rmSync","writeFileSync","tmpdir","path","afterEach","beforeEach","describe","expect","it","vi","mock","actual","importActual","createServerModuleRunner","fn","clearCache","import","previousIsVxrnCli","process","env","IS_VXRN_CLI","previousViteEnvironment","VITE_ENVIRONMENT","previousVxrnPluginConfig","tempRoot","globalThis","__vxrnPluginConfig__","recursive","force","restoreAllMocks","join","appDir","web","defaultRenderMode","createFileSystemRouterPlugin","plugin","router","root","watcherListener","server","environments","ssr","watcher","addListener","event","listener","on","configureServer","toBeDefined","warn","spyOn","console","mockImplementation","Error","Promise","resolve","resolves","toBeUndefined","toHaveBeenCalledWith","stringContaining","any","routeFile","virtualEntryId","renderCount","render","runner","id","default","_default","mocked","mockReturnValue","middlewareHandlers","watcherListeners","Map","hot","send","middlewares","use","handler","push","add","set","get","loggingEnabled","installMiddlewares","routeMiddleware","at","handleRouteRequest","request","pathname","chunks","req","originalUrl","url","headers","host","method","res","setHeader","appendHeader","writeHead","write","chunk","end","next","error","toHaveBeenCalled","toContain"],"sources":["../../../../src/vite/plugins/fileSystemRouterPlugin.test.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "one",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.4",
|
|
4
4
|
"license": "BSD-3-Clause",
|
|
5
5
|
"sideEffects": [
|
|
6
6
|
"setup.mjs",
|
|
@@ -186,18 +186,18 @@
|
|
|
186
186
|
"@cloudflare/vite-plugin": "^1.33.1",
|
|
187
187
|
"@swc/core": "^1.14.0",
|
|
188
188
|
"@ungap/structured-clone": "^1.2.0",
|
|
189
|
-
"@vxrn/color-scheme": "1.19.
|
|
190
|
-
"@vxrn/compiler": "1.19.
|
|
191
|
-
"@vxrn/resolve": "1.19.
|
|
192
|
-
"@vxrn/tslib-lite": "1.19.
|
|
193
|
-
"@vxrn/use-isomorphic-layout-effect": "1.19.
|
|
194
|
-
"@vxrn/vite-plugin-metro": "1.19.
|
|
189
|
+
"@vxrn/color-scheme": "1.19.4",
|
|
190
|
+
"@vxrn/compiler": "1.19.4",
|
|
191
|
+
"@vxrn/resolve": "1.19.4",
|
|
192
|
+
"@vxrn/tslib-lite": "1.19.4",
|
|
193
|
+
"@vxrn/use-isomorphic-layout-effect": "1.19.4",
|
|
194
|
+
"@vxrn/vite-plugin-metro": "1.19.4",
|
|
195
195
|
"babel-dead-code-elimination": "1.0.10",
|
|
196
196
|
"babel-plugin-module-resolver": "^5.0.2",
|
|
197
197
|
"babel-preset-expo": "~55.0.0",
|
|
198
198
|
"citty": "^0.1.6",
|
|
199
199
|
"core-js": "^3.38.1",
|
|
200
|
-
"create-vxrn": "1.19.
|
|
200
|
+
"create-vxrn": "1.19.4",
|
|
201
201
|
"escape-string-regexp": "^5.0.0",
|
|
202
202
|
"expo-linking": "~55.0.7",
|
|
203
203
|
"expo-modules-core": "~55.0.16",
|
|
@@ -217,7 +217,7 @@
|
|
|
217
217
|
"tsconfig-paths": "^4",
|
|
218
218
|
"use-latest-callback": "^0.2.3",
|
|
219
219
|
"vite": "^8.0.13",
|
|
220
|
-
"vxrn": "1.19.
|
|
220
|
+
"vxrn": "1.19.4",
|
|
221
221
|
"ws": "^8.21.0",
|
|
222
222
|
"xxhashjs": "^0.2.2"
|
|
223
223
|
},
|
|
@@ -14,8 +14,17 @@ vi.mock('vite', async () => {
|
|
|
14
14
|
}
|
|
15
15
|
})
|
|
16
16
|
|
|
17
|
+
type MiddlewareHandler = (
|
|
18
|
+
req: object,
|
|
19
|
+
res: object,
|
|
20
|
+
next: (error?: unknown) => void
|
|
21
|
+
) => void | Promise<void>
|
|
22
|
+
|
|
23
|
+
type WatcherListener = (...args: string[]) => void | Promise<void>
|
|
24
|
+
|
|
17
25
|
describe('createFileSystemRouterPlugin', () => {
|
|
18
26
|
const previousIsVxrnCli = process.env.IS_VXRN_CLI
|
|
27
|
+
const previousViteEnvironment = process.env.VITE_ENVIRONMENT
|
|
19
28
|
let previousVxrnPluginConfig: unknown
|
|
20
29
|
let tempRoot: string | undefined
|
|
21
30
|
|
|
@@ -34,6 +43,11 @@ describe('createFileSystemRouterPlugin', () => {
|
|
|
34
43
|
} else {
|
|
35
44
|
process.env.IS_VXRN_CLI = previousIsVxrnCli
|
|
36
45
|
}
|
|
46
|
+
if (previousViteEnvironment === undefined) {
|
|
47
|
+
delete process.env.VITE_ENVIRONMENT
|
|
48
|
+
} else {
|
|
49
|
+
process.env.VITE_ENVIRONMENT = previousViteEnvironment
|
|
50
|
+
}
|
|
37
51
|
|
|
38
52
|
if (previousVxrnPluginConfig === undefined) {
|
|
39
53
|
delete (globalThis as any).__vxrnPluginConfig__
|
|
@@ -103,4 +117,123 @@ describe('createFileSystemRouterPlugin', () => {
|
|
|
103
117
|
expect.any(Error)
|
|
104
118
|
)
|
|
105
119
|
})
|
|
120
|
+
|
|
121
|
+
it('caches dev ssg html until the module runner is invalidated', async () => {
|
|
122
|
+
process.env.VITE_ENVIRONMENT = 'ssr'
|
|
123
|
+
tempRoot = mkdtempSync(path.join(tmpdir(), 'one-router-ssg-cache-'))
|
|
124
|
+
const appDir = path.join(tempRoot, 'app')
|
|
125
|
+
const routeFile = path.join(appDir, 'index+ssg.tsx')
|
|
126
|
+
writeFileSync(path.join(tempRoot, 'package.json'), '{}\n')
|
|
127
|
+
mkdirSync(appDir)
|
|
128
|
+
writeFileSync(routeFile, 'export default function Index() { return null }\n')
|
|
129
|
+
|
|
130
|
+
const { createServerModuleRunner } = await import('vite')
|
|
131
|
+
const { createFileSystemRouterPlugin } = await import('./fileSystemRouterPlugin')
|
|
132
|
+
const { virtualEntryId } = await import('./virtualEntryConstants')
|
|
133
|
+
|
|
134
|
+
let renderCount = 0
|
|
135
|
+
const render = vi.fn(async () => `<html><body>${++renderCount}</body></html>`)
|
|
136
|
+
const runner = {
|
|
137
|
+
clearCache: vi.fn(),
|
|
138
|
+
import: vi.fn(async (id: string) => {
|
|
139
|
+
if (id === virtualEntryId) {
|
|
140
|
+
return { default: { render } }
|
|
141
|
+
}
|
|
142
|
+
if (id === routeFile) {
|
|
143
|
+
return { default: () => null }
|
|
144
|
+
}
|
|
145
|
+
return {}
|
|
146
|
+
}),
|
|
147
|
+
}
|
|
148
|
+
vi.mocked(createServerModuleRunner).mockReturnValue(runner as any)
|
|
149
|
+
|
|
150
|
+
const middlewareHandlers: MiddlewareHandler[] = []
|
|
151
|
+
const watcherListeners = new Map<string, WatcherListener[]>()
|
|
152
|
+
const server = {
|
|
153
|
+
environments: {
|
|
154
|
+
ssr: {},
|
|
155
|
+
},
|
|
156
|
+
hot: {
|
|
157
|
+
send: vi.fn(),
|
|
158
|
+
},
|
|
159
|
+
middlewares: {
|
|
160
|
+
use: vi.fn((handler: MiddlewareHandler) => {
|
|
161
|
+
middlewareHandlers.push(handler)
|
|
162
|
+
}),
|
|
163
|
+
},
|
|
164
|
+
watcher: {
|
|
165
|
+
add: vi.fn(),
|
|
166
|
+
addListener: vi.fn((event: string, listener: WatcherListener) => {
|
|
167
|
+
watcherListeners.set(event, [...(watcherListeners.get(event) || []), listener])
|
|
168
|
+
}),
|
|
169
|
+
on: vi.fn((event: string, listener: WatcherListener) => {
|
|
170
|
+
watcherListeners.set(event, [...(watcherListeners.get(event) || []), listener])
|
|
171
|
+
}),
|
|
172
|
+
},
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
const plugin = createFileSystemRouterPlugin({
|
|
176
|
+
router: {
|
|
177
|
+
root: appDir,
|
|
178
|
+
},
|
|
179
|
+
server: {
|
|
180
|
+
loggingEnabled: false,
|
|
181
|
+
},
|
|
182
|
+
})
|
|
183
|
+
|
|
184
|
+
const installMiddlewares = (plugin as any).configureServer(server)
|
|
185
|
+
installMiddlewares()
|
|
186
|
+
|
|
187
|
+
const routeMiddleware = middlewareHandlers.at(-1)
|
|
188
|
+
if (!routeMiddleware) {
|
|
189
|
+
throw new Error('Expected route middleware to be registered')
|
|
190
|
+
}
|
|
191
|
+
const handleRouteRequest = routeMiddleware
|
|
192
|
+
|
|
193
|
+
async function request(pathname: string) {
|
|
194
|
+
const chunks: string[] = []
|
|
195
|
+
const req = {
|
|
196
|
+
originalUrl: pathname,
|
|
197
|
+
url: pathname,
|
|
198
|
+
headers: {
|
|
199
|
+
host: 'localhost',
|
|
200
|
+
},
|
|
201
|
+
method: 'GET',
|
|
202
|
+
}
|
|
203
|
+
const res = {
|
|
204
|
+
setHeader: vi.fn(),
|
|
205
|
+
appendHeader: vi.fn(),
|
|
206
|
+
writeHead: vi.fn(),
|
|
207
|
+
write: vi.fn((chunk: string) => {
|
|
208
|
+
chunks.push(chunk)
|
|
209
|
+
}),
|
|
210
|
+
end: vi.fn(),
|
|
211
|
+
}
|
|
212
|
+
const next = vi.fn((error?: unknown) => {
|
|
213
|
+
if (error) {
|
|
214
|
+
throw error
|
|
215
|
+
}
|
|
216
|
+
throw new Error('Expected One router middleware to handle request')
|
|
217
|
+
})
|
|
218
|
+
|
|
219
|
+
await handleRouteRequest(req, res, next)
|
|
220
|
+
expect(res.end).toHaveBeenCalled()
|
|
221
|
+
return chunks.join('')
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
await expect(request('/')).resolves.toContain('<body>1</body>')
|
|
225
|
+
await expect(request('/')).resolves.toContain('<body>1</body>')
|
|
226
|
+
expect(render).toHaveBeenCalledTimes(1)
|
|
227
|
+
|
|
228
|
+
const allListeners = watcherListeners.get('all') || []
|
|
229
|
+
const invalidateRunner = allListeners[0]
|
|
230
|
+
if (!invalidateRunner) {
|
|
231
|
+
throw new Error('Expected runner invalidation listener to be registered')
|
|
232
|
+
}
|
|
233
|
+
invalidateRunner('change', routeFile)
|
|
234
|
+
|
|
235
|
+
await expect(request('/')).resolves.toContain('<body>2</body>')
|
|
236
|
+
expect(render).toHaveBeenCalledTimes(2)
|
|
237
|
+
expect(runner.clearCache).toHaveBeenCalledTimes(2)
|
|
238
|
+
})
|
|
106
239
|
})
|
|
@@ -17,7 +17,7 @@ import { promiseWithResolvers } from '../../utils/promiseWithResolvers'
|
|
|
17
17
|
import { isRouteFileWatchEvent } from '../../utils/routeFileWatch'
|
|
18
18
|
import { trackLoaderDependencies } from '../../utils/trackLoaderDependencies'
|
|
19
19
|
import { replaceLoader } from '../../vite/replaceLoader'
|
|
20
|
-
import type { One } from '../../vite/types'
|
|
20
|
+
import type { One, RouteInfo } from '../../vite/types'
|
|
21
21
|
import { setServerContext } from '../one-server-only'
|
|
22
22
|
import { virtalEntryIdClient, virtualEntryId } from './virtualEntryConstants'
|
|
23
23
|
|
|
@@ -74,6 +74,11 @@ export function createFileSystemRouterPlugin(options: One.PluginOptions): Plugin
|
|
|
74
74
|
let handleRequest = createRequestHandler()
|
|
75
75
|
// handle only one at a time in dev mode to avoid "Detected multiple renderers concurrently" errors
|
|
76
76
|
let renderPromise: Promise<void> | null = null
|
|
77
|
+
const ssgHtmlCache = new Map<string, string>()
|
|
78
|
+
|
|
79
|
+
function getSsgHtmlCacheKey(route: RouteInfo<string>, url: URL) {
|
|
80
|
+
return `${route.file}\n${url.pathname}\n${url.search}`
|
|
81
|
+
}
|
|
77
82
|
|
|
78
83
|
function createRequestHandler() {
|
|
79
84
|
const routerRoot = getRouterRootFromOneOptions(options)
|
|
@@ -108,6 +113,15 @@ export function createFileSystemRouterPlugin(options: One.PluginOptions): Plugin
|
|
|
108
113
|
return createHandleRequest(
|
|
109
114
|
{
|
|
110
115
|
async handlePage({ route, url, loaderProps }) {
|
|
116
|
+
const ssgCacheKey =
|
|
117
|
+
route.type === 'ssg' ? getSsgHtmlCacheKey(route, url) : null
|
|
118
|
+
if (ssgCacheKey && !needsCacheClear) {
|
|
119
|
+
const cachedHtml = ssgHtmlCache.get(ssgCacheKey)
|
|
120
|
+
if (cachedHtml) {
|
|
121
|
+
return cachedHtml
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
111
125
|
if (options.server?.loggingEnabled !== false) {
|
|
112
126
|
const colorType = routeTypeColors[route.type] || colors.white
|
|
113
127
|
const pathname =
|
|
@@ -143,6 +157,13 @@ export function createFileSystemRouterPlugin(options: One.PluginOptions): Plugin
|
|
|
143
157
|
await renderPromise
|
|
144
158
|
}
|
|
145
159
|
|
|
160
|
+
if (ssgCacheKey && !needsCacheClear) {
|
|
161
|
+
const cachedHtml = ssgHtmlCache.get(ssgCacheKey)
|
|
162
|
+
if (cachedHtml) {
|
|
163
|
+
return cachedHtml
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
146
167
|
const { promise, resolve: resolveRender } = promiseWithResolvers<void>()
|
|
147
168
|
renderPromise = promise
|
|
148
169
|
|
|
@@ -155,6 +176,7 @@ export function createFileSystemRouterPlugin(options: One.PluginOptions): Plugin
|
|
|
155
176
|
const routeFile = isGeneratedNotFound ? '' : path.join(routerRoot, route.file)
|
|
156
177
|
if (needsCacheClear) {
|
|
157
178
|
runner.clearCache()
|
|
179
|
+
ssgHtmlCache.clear()
|
|
158
180
|
needsCacheClear = false
|
|
159
181
|
}
|
|
160
182
|
|
|
@@ -377,6 +399,10 @@ export function createFileSystemRouterPlugin(options: One.PluginOptions): Plugin
|
|
|
377
399
|
})
|
|
378
400
|
}
|
|
379
401
|
|
|
402
|
+
if (ssgCacheKey) {
|
|
403
|
+
ssgHtmlCache.set(ssgCacheKey, html)
|
|
404
|
+
}
|
|
405
|
+
|
|
380
406
|
return html
|
|
381
407
|
} catch (err) {
|
|
382
408
|
// allow throwing a response in a loader (e.g. redirect)
|
|
@@ -547,6 +573,8 @@ export function createFileSystemRouterPlugin(options: One.PluginOptions): Plugin
|
|
|
547
573
|
function recreateRequestHandler(changedPath: string) {
|
|
548
574
|
try {
|
|
549
575
|
handleRequest = createRequestHandler()
|
|
576
|
+
ssgHtmlCache.clear()
|
|
577
|
+
needsCacheClear = true
|
|
550
578
|
} catch (error) {
|
|
551
579
|
console.warn(`[one] Failed to rebuild routes after ${changedPath} changed.`, error)
|
|
552
580
|
}
|
|
@@ -679,6 +707,7 @@ export function createFileSystemRouterPlugin(options: One.PluginOptions): Plugin
|
|
|
679
707
|
event: 'one:loader-data-update',
|
|
680
708
|
data: { routePaths: [...routePaths] },
|
|
681
709
|
})
|
|
710
|
+
ssgHtmlCache.clear()
|
|
682
711
|
}
|
|
683
712
|
}, 100)
|
|
684
713
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileSystemRouterPlugin.d.ts","sourceRoot":"","sources":["../../../src/vite/plugins/fileSystemRouterPlugin.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAW,MAAM,EAAiB,MAAM,MAAM,CAAA;AAe1D,OAAO,KAAK,EAAE,GAAG,
|
|
1
|
+
{"version":3,"file":"fileSystemRouterPlugin.d.ts","sourceRoot":"","sources":["../../../src/vite/plugins/fileSystemRouterPlugin.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAW,MAAM,EAAiB,MAAM,MAAM,CAAA;AAe1D,OAAO,KAAK,EAAE,GAAG,EAAa,MAAM,kBAAkB,CAAA;AAiBtD,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,GAAG,CAAC,aAAa,GAAG,MAAM,CAszB/E"}
|