mirror of
https://github.com/anomalyco/opencode.git
synced 2026-11-15 12:41:37 +03:00
74 lines
3.0 KiB
TypeScript
74 lines
3.0 KiB
TypeScript
import { describe, expect, test } from "bun:test"
|
|
import { quietPreloads } from "~/lib/route-preloads"
|
|
|
|
// A file route as SolidStart builds it: a lazy component whose preload is the reloading loader, and
|
|
// the route's own import of its code.
|
|
function route(code: () => Promise<unknown>) {
|
|
const calls = { preload: 0, import: 0 }
|
|
return {
|
|
calls,
|
|
route: {
|
|
component: { preload: () => void calls.preload++ },
|
|
$component: {
|
|
import: () => {
|
|
calls.import++
|
|
return code()
|
|
},
|
|
},
|
|
},
|
|
}
|
|
}
|
|
|
|
describe("quietPreloads", () => {
|
|
test("hands a route its code once the code has loaded", async () => {
|
|
const page = route(() => Promise.resolve({}))
|
|
quietPreloads([page.route])
|
|
|
|
await page.route.component.preload()
|
|
|
|
expect(page.calls).toEqual({ preload: 1, import: 1 })
|
|
})
|
|
|
|
test("leaves the route as it was when its code fails to load", async () => {
|
|
const page = route(() => Promise.reject(new TypeError("Failed to fetch dynamically imported module")))
|
|
quietPreloads([page.route])
|
|
|
|
expect(await page.route.component.preload()).toBeUndefined()
|
|
expect(page.calls).toEqual({ preload: 0, import: 1 })
|
|
})
|
|
|
|
// quietPreloads relies on the shape SolidStart gives each file route, and skips any route without
|
|
// it, so a SolidStart or Solid upgrade that changes it would turn the fix off without a sound. If
|
|
// one of these fails, check that preloads still can't reload the page (src/lib/route-preloads.ts),
|
|
// then update the expectations.
|
|
test("SolidStart's file routes still have the shape it relies on", async () => {
|
|
const start = (file: string) =>
|
|
Bun.file(new URL(`../node_modules/@solidjs/start/dist/${file}`, import.meta.url)).text()
|
|
// The route's own import of its code, unwrapped: `$component: { src, build, import }`.
|
|
expect(await start("config/fs-routes/index.js")).toContain("import: `_$() => import('${buildId}')$_`")
|
|
const router = await start("router.jsx")
|
|
// Each route keeps its `$component`, and its component is a lazy one over the reloading loader.
|
|
expect(router).toContain("...route,")
|
|
expect(router).toContain("lazy(loadComponent(route))")
|
|
expect(router).toContain("withRouteChunkReload(route.$component.import)")
|
|
// The router preloads a route through its component's `preload`, which a lazy component has.
|
|
expect(await Bun.file(new URL("../node_modules/@solidjs/router/dist/index.js", import.meta.url)).text()).toContain(
|
|
"route.component && route.component.preload && route.component.preload()",
|
|
)
|
|
expect(await Bun.file(new URL("../node_modules/solid-js/dist/solid.js", import.meta.url)).text()).toContain(
|
|
"wrap.preload = () =>",
|
|
)
|
|
})
|
|
|
|
test("reaches nested routes and wraps each preload once", async () => {
|
|
const page = route(() => Promise.resolve({}))
|
|
const routes = [{ children: [page.route] }]
|
|
quietPreloads(routes)
|
|
quietPreloads(routes)
|
|
|
|
await page.route.component.preload()
|
|
|
|
expect(page.calls).toEqual({ preload: 1, import: 1 })
|
|
})
|
|
})
|