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.
@@ -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":"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","ignoreList":[]}
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",
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.3",
190
- "@vxrn/compiler": "1.19.3",
191
- "@vxrn/resolve": "1.19.3",
192
- "@vxrn/tslib-lite": "1.19.3",
193
- "@vxrn/use-isomorphic-layout-effect": "1.19.3",
194
- "@vxrn/vite-plugin-metro": "1.19.3",
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.3",
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.3",
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,EAAE,MAAM,kBAAkB,CAAA;AAiB3C,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,GAAG,CAAC,aAAa,GAAG,MAAM,CAyxB/E"}
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"}