waku 1.0.0-beta.2 → 1.0.0-beta.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/README.md +3 -3
- package/dist/adapters/aws-lambda.js.map +1 -1
- package/dist/adapters/cloudflare.js +5 -1
- package/dist/adapters/cloudflare.js.map +1 -1
- package/dist/adapters/deno.js.map +1 -1
- package/dist/adapters/vercel.js +1 -1
- package/dist/adapters/vercel.js.map +1 -1
- package/dist/lib/env.d.ts +1 -1
- package/dist/lib/env.js +7 -1
- package/dist/lib/env.js.map +1 -1
- package/dist/lib/global-types.d.ts +14 -0
- package/dist/lib/types.d.ts +1 -1
- package/dist/lib/types.js.map +1 -1
- package/dist/lib/utils/base64-node.d.ts +2 -0
- package/dist/lib/utils/base64-node.js +4 -0
- package/dist/lib/utils/base64-node.js.map +1 -0
- package/dist/lib/utils/base64-web.d.ts +2 -0
- package/dist/lib/utils/base64-web.js +11 -0
- package/dist/lib/utils/base64-web.js.map +1 -0
- package/dist/lib/utils/custom-errors.js.map +1 -1
- package/dist/lib/utils/initial-rsc.d.ts +1 -2
- package/dist/lib/utils/initial-rsc.js +2 -1
- package/dist/lib/utils/initial-rsc.js.map +1 -1
- package/dist/lib/utils/path.js +33 -55
- package/dist/lib/utils/path.js.map +1 -1
- package/dist/lib/utils/prefetch-cache.d.ts +10 -9
- package/dist/lib/utils/prefetch-cache.js +6 -19
- package/dist/lib/utils/prefetch-cache.js.map +1 -1
- package/dist/lib/utils/react-debug-channel.js +1 -8
- package/dist/lib/utils/react-debug-channel.js.map +1 -1
- package/dist/lib/utils/request.js.map +1 -1
- package/dist/lib/utils/rsc-path.js +1 -3
- package/dist/lib/utils/rsc-path.js.map +1 -1
- package/dist/lib/utils/rsc-stream.js +1 -1
- package/dist/lib/utils/rsc-stream.js.map +1 -1
- package/dist/lib/utils/stream.d.ts +0 -2
- package/dist/lib/utils/stream.js +0 -8
- package/dist/lib/utils/stream.js.map +1 -1
- package/dist/lib/vite-entries/entry.build.js.map +1 -1
- package/dist/lib/vite-entries/entry.server.d.ts +1 -1
- package/dist/lib/vite-entries/entry.server.js.map +1 -1
- package/dist/lib/vite-plugins/environments.js.map +1 -1
- package/dist/lib/vite-plugins/private-dir.js +2 -1
- package/dist/lib/vite-plugins/private-dir.js.map +1 -1
- package/dist/lib/vite-plugins/rsc-devtools.js +1 -2
- package/dist/lib/vite-plugins/rsc-devtools.js.map +1 -1
- package/dist/lib/vite-rsc/cmd-build.js +3 -2
- package/dist/lib/vite-rsc/cmd-build.js.map +1 -1
- package/dist/lib/vite-rsc/cmd-dev.js +3 -2
- package/dist/lib/vite-rsc/cmd-dev.js.map +1 -1
- package/dist/lib/vite-rsc/cmd-start.js +3 -2
- package/dist/lib/vite-rsc/cmd-start.js.map +1 -1
- package/dist/lib/vite-rsc/handler.js +9 -2
- package/dist/lib/vite-rsc/handler.js.map +1 -1
- package/dist/lib/vite-rsc/loader.d.ts +0 -1
- package/dist/lib/vite-rsc/loader.js +0 -7
- package/dist/lib/vite-rsc/loader.js.map +1 -1
- package/dist/minimal/client.d.ts +55 -22
- package/dist/minimal/client.js +135 -107
- package/dist/minimal/client.js.map +1 -1
- package/dist/router/client-utils/build-route-href.d.ts +26 -0
- package/dist/router/client-utils/build-route-href.js +61 -0
- package/dist/router/client-utils/build-route-href.js.map +1 -0
- package/dist/router/client-utils/match-route-params.d.ts +14 -0
- package/dist/router/client-utils/match-route-params.js +49 -0
- package/dist/router/client-utils/match-route-params.js.map +1 -0
- package/dist/router/client.d.ts +54 -33
- package/dist/router/client.js +132 -102
- package/dist/router/client.js.map +1 -1
- package/dist/router/{common.d.ts → common-utils/route-path.d.ts} +1 -0
- package/dist/router/{common.js → common-utils/route-path.js} +2 -3
- package/dist/router/common-utils/route-path.js.map +1 -0
- package/dist/router/create-pages-utils/inferred-path-types.d.ts +5 -5
- package/dist/router/create-pages-utils/inferred-path-types.js.map +1 -1
- package/dist/router/create-pages-utils/util-types.js.map +1 -0
- package/dist/router/create-pages.d.ts +50 -2
- package/dist/router/create-pages.js +76 -61
- package/dist/router/create-pages.js.map +1 -1
- package/dist/router/define-router.d.ts +6 -0
- package/dist/router/define-router.js +154 -133
- package/dist/router/define-router.js.map +1 -1
- package/dist/router/fs-router.d.ts +13 -0
- package/dist/router/fs-router.js.map +1 -1
- package/package.json +6 -3
- package/dist/router/common.js.map +0 -1
- package/dist/router/util-types.js.map +0 -1
- /package/dist/router/{util-types.d.ts → create-pages-utils/util-types.d.ts} +0 -0
- /package/dist/router/{util-types.js → create-pages-utils/util-types.js} +0 -0
package/README.md
CHANGED
|
@@ -17,7 +17,7 @@ visit [waku.gg](https://waku.gg) or `npm create waku@latest`
|
|
|
17
17
|
|
|
18
18
|
## Getting started
|
|
19
19
|
|
|
20
|
-
Start a new Waku project with the `create` command for your preferred package manager. It will scaffold a new project with our default [Waku starter](https://github.com/wakujs/waku/tree/main/
|
|
20
|
+
Start a new Waku project with the `create` command for your preferred package manager. It will scaffold a new project with our default [Waku starter](https://github.com/wakujs/waku-examples/tree/main/fs-router/basic).
|
|
21
21
|
|
|
22
22
|
```sh
|
|
23
23
|
npm create waku@latest
|
|
@@ -804,11 +804,11 @@ export const Component = () => {
|
|
|
804
804
|
|
|
805
805
|
The `router` object also contains several methods for programmatic navigation:
|
|
806
806
|
|
|
807
|
-
- `router.push(to
|
|
807
|
+
- `router.push(to)` - navigate to the provided route. `to` is a route string, or a structured `{ to, params, search, hash }` target for typed navigation to dynamic routes (see [Typed Routes](https://github.com/wakujs/waku/blob/main/docs/guides/typed-routes.mdx))
|
|
808
808
|
|
|
809
809
|
- `router.prefetch(to: string)` - prefetch the provided route
|
|
810
810
|
|
|
811
|
-
- `router.replace(to
|
|
811
|
+
- `router.replace(to)` - replace the current history entry (same argument as `push`)
|
|
812
812
|
|
|
813
813
|
- `router.reload()` - reload the current route
|
|
814
814
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/adapters/aws-lambda.ts"],"sourcesContent":["import path from 'node:path';\nimport { serveStatic } from '@hono/node-server/serve-static';\nimport type { MiddlewareHandler } from 'hono';\nimport * as honoAwsLambda from 'hono/aws-lambda';\nimport { bodyLimit } from 'hono/body-limit';\nimport { Hono } from 'hono/tiny';\nimport { unstable_createServerEntryAdapter as createServerEntryAdapter } from 'waku/adapter-builders';\nimport {\n unstable_constants as constants,\n unstable_honoMiddleware as honoMiddleware,\n} from 'waku/internals';\nimport type { BuildOptions } from './aws-lambda-build-enhancer.js';\n\nconst { DIST_PUBLIC } = constants;\nconst { rscMiddleware, middlewareRunner } = honoMiddleware;\n\nconst DEFAULT_BODY_LIMIT_MAX_SIZE = 100 * 1024 * 1024;\n\nexport default createServerEntryAdapter(\n (\n { processRequest, processBuild, config, isBuild, notFoundHtml },\n options?: {\n streaming?: boolean;\n bodyLimit?: Parameters<typeof bodyLimit>[0] | false;\n middlewareFns?: ((opts: { app: Hono }) => MiddlewareHandler)[];\n middlewareModules?: Record<string, () => Promise<unknown>>;\n },\n ) => {\n const {\n bodyLimit: bodyLimitOptions,\n middlewareFns = [],\n middlewareModules = {},\n } = options || {};\n const app = new Hono();\n app.notFound((c) => {\n if (notFoundHtml) {\n return c.html(notFoundHtml, 404);\n }\n return c.text('404 Not Found', 404);\n });\n if (isBuild) {\n app.use(serveStatic({ root: path.join(config.distDir, DIST_PUBLIC) }));\n }\n if (bodyLimitOptions !== false) {\n app.use(\n bodyLimit(bodyLimitOptions ?? { maxSize: DEFAULT_BODY_LIMIT_MAX_SIZE }),\n );\n }\n for (const middlewareFn of middlewareFns) {\n app.use(middlewareFn({ app }));\n }\n app.use(middlewareRunner(middlewareModules as never, { app }));\n app.use(rscMiddleware({ processRequest }));\n const buildOptions: BuildOptions = {\n distDir: config.distDir,\n };\n
|
|
1
|
+
{"version":3,"sources":["../../src/adapters/aws-lambda.ts"],"sourcesContent":["import path from 'node:path';\nimport { serveStatic } from '@hono/node-server/serve-static';\nimport type { MiddlewareHandler } from 'hono';\nimport * as honoAwsLambda from 'hono/aws-lambda';\nimport { bodyLimit } from 'hono/body-limit';\nimport { Hono } from 'hono/tiny';\nimport { unstable_createServerEntryAdapter as createServerEntryAdapter } from 'waku/adapter-builders';\nimport {\n unstable_constants as constants,\n unstable_honoMiddleware as honoMiddleware,\n} from 'waku/internals';\nimport type { BuildOptions } from './aws-lambda-build-enhancer.js';\n\nconst { DIST_PUBLIC } = constants;\nconst { rscMiddleware, middlewareRunner } = honoMiddleware;\n\nconst DEFAULT_BODY_LIMIT_MAX_SIZE = 100 * 1024 * 1024;\n\nexport default createServerEntryAdapter(\n (\n { processRequest, processBuild, config, isBuild, notFoundHtml },\n options?: {\n streaming?: boolean;\n bodyLimit?: Parameters<typeof bodyLimit>[0] | false;\n middlewareFns?: ((opts: { app: Hono }) => MiddlewareHandler)[];\n middlewareModules?: Record<string, () => Promise<unknown>>;\n },\n ) => {\n const {\n bodyLimit: bodyLimitOptions,\n middlewareFns = [],\n middlewareModules = {},\n } = options || {};\n const app = new Hono();\n app.notFound((c) => {\n if (notFoundHtml) {\n return c.html(notFoundHtml, 404);\n }\n return c.text('404 Not Found', 404);\n });\n if (isBuild) {\n app.use(serveStatic({ root: path.join(config.distDir, DIST_PUBLIC) }));\n }\n if (bodyLimitOptions !== false) {\n app.use(\n bodyLimit(bodyLimitOptions ?? { maxSize: DEFAULT_BODY_LIMIT_MAX_SIZE }),\n );\n }\n for (const middlewareFn of middlewareFns) {\n app.use(middlewareFn({ app }));\n }\n app.use(middlewareRunner(middlewareModules as never, { app }));\n app.use(rscMiddleware({ processRequest }));\n const buildOptions: BuildOptions = {\n distDir: config.distDir,\n };\n globalThis.__WAKU_AWS_LAMBDA_HANDLE__ = options?.streaming\n ? honoAwsLambda.streamHandle\n : honoAwsLambda.handle;\n return {\n fetch: app.fetch,\n build: processBuild,\n buildOptions,\n buildEnhancers: ['waku/adapters/aws-lambda-build-enhancer'],\n };\n },\n);\n"],"names":["path","serveStatic","honoAwsLambda","bodyLimit","Hono","unstable_createServerEntryAdapter","createServerEntryAdapter","unstable_constants","constants","unstable_honoMiddleware","honoMiddleware","DIST_PUBLIC","rscMiddleware","middlewareRunner","DEFAULT_BODY_LIMIT_MAX_SIZE","processRequest","processBuild","config","isBuild","notFoundHtml","options","bodyLimitOptions","middlewareFns","middlewareModules","app","notFound","c","html","text","use","root","join","distDir","maxSize","middlewareFn","buildOptions","globalThis","__WAKU_AWS_LAMBDA_HANDLE__","streaming","streamHandle","handle","fetch","build","buildEnhancers"],"mappings":"AAAA,OAAOA,UAAU,YAAY;AAC7B,SAASC,WAAW,QAAQ,iCAAiC;AAE7D,YAAYC,mBAAmB,kBAAkB;AACjD,SAASC,SAAS,QAAQ,kBAAkB;AAC5C,SAASC,IAAI,QAAQ,YAAY;AACjC,SAASC,qCAAqCC,wBAAwB,QAAQ,wBAAwB;AACtG,SACEC,sBAAsBC,SAAS,EAC/BC,2BAA2BC,cAAc,QACpC,iBAAiB;AAGxB,MAAM,EAAEC,WAAW,EAAE,GAAGH;AACxB,MAAM,EAAEI,aAAa,EAAEC,gBAAgB,EAAE,GAAGH;AAE5C,MAAMI,8BAA8B,MAAM,OAAO;AAEjD,eAAeR,yBACb,CACE,EAAES,cAAc,EAAEC,YAAY,EAAEC,MAAM,EAAEC,OAAO,EAAEC,YAAY,EAAE,EAC/DC;IAOA,MAAM,EACJjB,WAAWkB,gBAAgB,EAC3BC,gBAAgB,EAAE,EAClBC,oBAAoB,CAAC,CAAC,EACvB,GAAGH,WAAW,CAAC;IAChB,MAAMI,MAAM,IAAIpB;IAChBoB,IAAIC,QAAQ,CAAC,CAACC;QACZ,IAAIP,cAAc;YAChB,OAAOO,EAAEC,IAAI,CAACR,cAAc;QAC9B;QACA,OAAOO,EAAEE,IAAI,CAAC,iBAAiB;IACjC;IACA,IAAIV,SAAS;QACXM,IAAIK,GAAG,CAAC5B,YAAY;YAAE6B,MAAM9B,KAAK+B,IAAI,CAACd,OAAOe,OAAO,EAAErB;QAAa;IACrE;IACA,IAAIU,qBAAqB,OAAO;QAC9BG,IAAIK,GAAG,CACL1B,UAAUkB,oBAAoB;YAAEY,SAASnB;QAA4B;IAEzE;IACA,KAAK,MAAMoB,gBAAgBZ,cAAe;QACxCE,IAAIK,GAAG,CAACK,aAAa;YAAEV;QAAI;IAC7B;IACAA,IAAIK,GAAG,CAAChB,iBAAiBU,mBAA4B;QAAEC;IAAI;IAC3DA,IAAIK,GAAG,CAACjB,cAAc;QAAEG;IAAe;IACvC,MAAMoB,eAA6B;QACjCH,SAASf,OAAOe,OAAO;IACzB;IACAI,WAAWC,0BAA0B,GAAGjB,SAASkB,YAC7CpC,cAAcqC,YAAY,GAC1BrC,cAAcsC,MAAM;IACxB,OAAO;QACLC,OAAOjB,IAAIiB,KAAK;QAChBC,OAAO1B;QACPmB;QACAQ,gBAAgB;YAAC;SAA0C;IAC7D;AACF,GACA"}
|
|
@@ -16,6 +16,10 @@ function isProductionWorker(req) {
|
|
|
16
16
|
// This header seems to only be set for production cloudflare workers
|
|
17
17
|
return !!req.headers.get('cf-visitor');
|
|
18
18
|
}
|
|
19
|
+
function isLoopbackRequest(req) {
|
|
20
|
+
const { hostname } = new URL(req.url);
|
|
21
|
+
return hostname === 'localhost' || hostname === '127.0.0.1' || hostname === '::1' || hostname === '[::1]';
|
|
22
|
+
}
|
|
19
23
|
function removeGzipEncoding(res) {
|
|
20
24
|
const contentType = res.headers.get('content-type');
|
|
21
25
|
if (!contentType || contentType.includes('text/html') || contentType.includes('text/plain')) {
|
|
@@ -67,7 +71,7 @@ export default createServerEntryAdapter(({ processRequest, processBuild, setAllE
|
|
|
67
71
|
});
|
|
68
72
|
});
|
|
69
73
|
const fetchFn = async (req)=>{
|
|
70
|
-
if (new URL(req.url).pathname === `/${internalPathToBuildStaticFiles}` && !isProductionWorker(req)) {
|
|
74
|
+
if (new URL(req.url).pathname === `/${internalPathToBuildStaticFiles}` && isLoopbackRequest(req) && !isProductionWorker(req)) {
|
|
71
75
|
return new Response(buildBody());
|
|
72
76
|
}
|
|
73
77
|
let cloudflareContext;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/adapters/cloudflare.ts"],"sourcesContent":["import type { MiddlewareHandler } from 'hono';\nimport { bodyLimit } from 'hono/body-limit';\nimport { Hono } from 'hono/tiny';\nimport {\n unstable_createServerEntryAdapter as createServerEntryAdapter,\n unstable_startPreviewServer as startPreviewServer,\n} from 'waku/adapter-builders';\nimport {\n unstable_constants as constants,\n unstable_consumeMultiplexedStream as consumeMultiplexedStream,\n unstable_honoMiddleware as honoMiddleware,\n unstable_produceMultiplexedStream as produceMultiplexedStream,\n} from 'waku/internals';\nimport type { BuildOptions } from './cloudflare-build-enhancer.js';\n\nconst { DIST_PUBLIC } = constants;\nconst { rscMiddleware, middlewareRunner } = honoMiddleware;\n\nconst DEFAULT_BODY_LIMIT_MAX_SIZE = 100 * 1024 * 1024;\n\nconst DO_NOT_BUNDLE = '';\n\nconst PRUNABLE_KEY_PREFIX = '\\0__prunable__/';\n\nconst emptyStream = () =>\n new ReadableStream<Uint8Array>({\n start(controller) {\n controller.close();\n },\n });\n\nfunction isProductionWorker(req: Request): boolean {\n // This header seems to only be set for production cloudflare workers\n return !!req.headers.get('cf-visitor');\n}\n\nfunction removeGzipEncoding(res: Response): Response {\n const contentType = res.headers.get('content-type');\n if (\n !contentType ||\n contentType.includes('text/html') ||\n contentType.includes('text/plain')\n ) {\n const headers = new Headers(res.headers);\n headers.set('content-encoding', 'Identity');\n return new Response(res.body, {\n status: res.status,\n statusText: res.statusText,\n headers,\n });\n }\n return res;\n}\n\nexport default createServerEntryAdapter(\n (\n { processRequest, processBuild, setAllEnv, config, notFoundHtml },\n options?: {\n static?: boolean;\n handlers?: Record<string, unknown>;\n assetsDir?: string;\n bodyLimit?: Parameters<typeof bodyLimit>[0] | false;\n middlewareFns?: ((opts: { app: Hono }) => MiddlewareHandler)[];\n middlewareModules?: Record<string, () => Promise<unknown>>;\n internalPathToBuildStaticFiles?: string;\n },\n ) => {\n const {\n bodyLimit: bodyLimitOptions,\n middlewareFns = [],\n middlewareModules = {},\n internalPathToBuildStaticFiles = '__waku_internal_build_static_files',\n } = options || {};\n const app = new Hono();\n app.notFound((c) => {\n if (notFoundHtml) {\n return c.html(notFoundHtml, 404);\n }\n return c.text('404 Not Found', 404);\n });\n if (bodyLimitOptions !== false) {\n app.use(\n bodyLimit(bodyLimitOptions ?? { maxSize: DEFAULT_BODY_LIMIT_MAX_SIZE }),\n );\n }\n for (const middlewareFn of middlewareFns) {\n app.use(middlewareFn({ app }));\n }\n app.use(middlewareRunner(middlewareModules as never, { app }));\n app.use(rscMiddleware({ processRequest }));\n const buildOptions: BuildOptions = {\n srcDir: config.srcDir,\n distDir: config.distDir,\n DIST_PUBLIC,\n serverless: !options?.static,\n };\n\n const buildBody = () =>\n produceMultiplexedStream(async (emitFile) => {\n await processBuild({\n emitFile,\n unstable_registerPrunableFile: (srcPath) =>\n emitFile(PRUNABLE_KEY_PREFIX + srcPath, emptyStream()),\n });\n });\n\n const fetchFn = async (req: Request) => {\n if (\n new URL(req.url).pathname === `/${internalPathToBuildStaticFiles}` &&\n !isProductionWorker(req)\n ) {\n return new Response(buildBody());\n }\n let cloudflareContext;\n try {\n cloudflareContext = await import(\n /* @vite-ignore */ DO_NOT_BUNDLE + 'cloudflare:workers'\n );\n } catch {\n // Not in a Cloudflare environment\n }\n let res: Response | Promise<Response>;\n if (cloudflareContext) {\n const { env, waitUntil, passThroughOnException } = cloudflareContext;\n res = app.fetch(req, env, {\n waitUntil,\n passThroughOnException,\n props: undefined,\n });\n } else {\n res = app.fetch(req);\n }\n // Workaround https://github.com/cloudflare/workers-sdk/issues/6577\n if (import.meta.env?.PROD && !isProductionWorker(req)) {\n if ('then' in res) {\n res = res.then((res) => removeGzipEncoding(res));\n } else {\n res = removeGzipEncoding(res);\n }\n }\n return res;\n };\n\n return {\n fetch: fetchFn,\n build: async (utils) => {\n const server = await startPreviewServer();\n // Fallback middleware for the case without @cloudflare/vite-plugin\n server.middlewares.use(async (_req, res, next) => {\n try {\n const { Readable } = await import(\n /* @vite-ignore */ DO_NOT_BUNDLE + 'node:stream'\n );\n Readable.fromWeb(buildBody() as never).pipe(res);\n } catch (err) {\n next(err);\n }\n });\n const response = await fetch(\n server.baseUrl + internalPathToBuildStaticFiles,\n { headers: { connection: 'close' } },\n );\n await consumeMultiplexedStream(response.body!, async (key, stream) => {\n if (key.startsWith(PRUNABLE_KEY_PREFIX)) {\n utils.unstable_registerPrunableFile(\n key.slice(PRUNABLE_KEY_PREFIX.length),\n );\n return;\n }\n await utils.emitFile(key, stream);\n });\n // https://github.com/nodejs/node/issues/56645\n await new Promise((resolve) => setTimeout(resolve, 100));\n await server.close();\n },\n buildOptions,\n buildEnhancers: ['waku/adapters/cloudflare-build-enhancer'],\n defaultExport: {\n ...options?.handlers,\n fetch(req: Request, env: Record<string, string>) {\n setAllEnv(env);\n return fetchFn(req);\n },\n },\n };\n },\n);\n"],"names":["bodyLimit","Hono","unstable_createServerEntryAdapter","createServerEntryAdapter","unstable_startPreviewServer","startPreviewServer","unstable_constants","constants","unstable_consumeMultiplexedStream","consumeMultiplexedStream","unstable_honoMiddleware","honoMiddleware","unstable_produceMultiplexedStream","produceMultiplexedStream","DIST_PUBLIC","rscMiddleware","middlewareRunner","DEFAULT_BODY_LIMIT_MAX_SIZE","DO_NOT_BUNDLE","PRUNABLE_KEY_PREFIX","emptyStream","ReadableStream","start","controller","close","isProductionWorker","req","headers","get","removeGzipEncoding","res","contentType","includes","Headers","set","Response","body","status","statusText","processRequest","processBuild","setAllEnv","config","notFoundHtml","options","bodyLimitOptions","middlewareFns","middlewareModules","internalPathToBuildStaticFiles","app","notFound","c","html","text","use","maxSize","middlewareFn","buildOptions","srcDir","distDir","serverless","static","buildBody","emitFile","unstable_registerPrunableFile","srcPath","fetchFn","URL","url","pathname","cloudflareContext","env","waitUntil","passThroughOnException","fetch","props","undefined","PROD","then","build","utils","server","middlewares","_req","next","Readable","fromWeb","pipe","err","response","baseUrl","connection","key","stream","startsWith","slice","length","Promise","resolve","setTimeout","buildEnhancers","defaultExport","handlers"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/adapters/cloudflare.ts"],"sourcesContent":["import type { MiddlewareHandler } from 'hono';\nimport { bodyLimit } from 'hono/body-limit';\nimport { Hono } from 'hono/tiny';\nimport {\n unstable_createServerEntryAdapter as createServerEntryAdapter,\n unstable_startPreviewServer as startPreviewServer,\n} from 'waku/adapter-builders';\nimport {\n unstable_constants as constants,\n unstable_consumeMultiplexedStream as consumeMultiplexedStream,\n unstable_honoMiddleware as honoMiddleware,\n unstable_produceMultiplexedStream as produceMultiplexedStream,\n} from 'waku/internals';\nimport type { BuildOptions } from './cloudflare-build-enhancer.js';\n\nconst { DIST_PUBLIC } = constants;\nconst { rscMiddleware, middlewareRunner } = honoMiddleware;\n\nconst DEFAULT_BODY_LIMIT_MAX_SIZE = 100 * 1024 * 1024;\n\nconst DO_NOT_BUNDLE = '';\n\nconst PRUNABLE_KEY_PREFIX = '\\0__prunable__/';\n\nconst emptyStream = () =>\n new ReadableStream<Uint8Array>({\n start(controller) {\n controller.close();\n },\n });\n\nfunction isProductionWorker(req: Request): boolean {\n // This header seems to only be set for production cloudflare workers\n return !!req.headers.get('cf-visitor');\n}\n\nfunction isLoopbackRequest(req: Request): boolean {\n const { hostname } = new URL(req.url);\n return (\n hostname === 'localhost' ||\n hostname === '127.0.0.1' ||\n hostname === '::1' ||\n hostname === '[::1]'\n );\n}\n\nfunction removeGzipEncoding(res: Response): Response {\n const contentType = res.headers.get('content-type');\n if (\n !contentType ||\n contentType.includes('text/html') ||\n contentType.includes('text/plain')\n ) {\n const headers = new Headers(res.headers);\n headers.set('content-encoding', 'Identity');\n return new Response(res.body, {\n status: res.status,\n statusText: res.statusText,\n headers,\n });\n }\n return res;\n}\n\nexport default createServerEntryAdapter(\n (\n { processRequest, processBuild, setAllEnv, config, notFoundHtml },\n options?: {\n static?: boolean;\n handlers?: Record<string, unknown>;\n assetsDir?: string;\n bodyLimit?: Parameters<typeof bodyLimit>[0] | false;\n middlewareFns?: ((opts: { app: Hono }) => MiddlewareHandler)[];\n middlewareModules?: Record<string, () => Promise<unknown>>;\n internalPathToBuildStaticFiles?: string;\n },\n ) => {\n const {\n bodyLimit: bodyLimitOptions,\n middlewareFns = [],\n middlewareModules = {},\n internalPathToBuildStaticFiles = '__waku_internal_build_static_files',\n } = options || {};\n const app = new Hono();\n app.notFound((c) => {\n if (notFoundHtml) {\n return c.html(notFoundHtml, 404);\n }\n return c.text('404 Not Found', 404);\n });\n if (bodyLimitOptions !== false) {\n app.use(\n bodyLimit(bodyLimitOptions ?? { maxSize: DEFAULT_BODY_LIMIT_MAX_SIZE }),\n );\n }\n for (const middlewareFn of middlewareFns) {\n app.use(middlewareFn({ app }));\n }\n app.use(middlewareRunner(middlewareModules as never, { app }));\n app.use(rscMiddleware({ processRequest }));\n const buildOptions: BuildOptions = {\n srcDir: config.srcDir,\n distDir: config.distDir,\n DIST_PUBLIC,\n serverless: !options?.static,\n };\n\n const buildBody = () =>\n produceMultiplexedStream(async (emitFile) => {\n await processBuild({\n emitFile,\n unstable_registerPrunableFile: (srcPath) =>\n emitFile(PRUNABLE_KEY_PREFIX + srcPath, emptyStream()),\n });\n });\n\n const fetchFn = async (req: Request) => {\n if (\n new URL(req.url).pathname === `/${internalPathToBuildStaticFiles}` &&\n isLoopbackRequest(req) &&\n !isProductionWorker(req)\n ) {\n return new Response(buildBody());\n }\n let cloudflareContext;\n try {\n cloudflareContext = await import(\n /* @vite-ignore */ DO_NOT_BUNDLE + 'cloudflare:workers'\n );\n } catch {\n // Not in a Cloudflare environment\n }\n let res: Response | Promise<Response>;\n if (cloudflareContext) {\n const { env, waitUntil, passThroughOnException } = cloudflareContext;\n res = app.fetch(req, env, {\n waitUntil,\n passThroughOnException,\n props: undefined,\n });\n } else {\n res = app.fetch(req);\n }\n // Workaround https://github.com/cloudflare/workers-sdk/issues/6577\n if (import.meta.env?.PROD && !isProductionWorker(req)) {\n if ('then' in res) {\n res = res.then((res) => removeGzipEncoding(res));\n } else {\n res = removeGzipEncoding(res);\n }\n }\n return res;\n };\n\n return {\n fetch: fetchFn,\n build: async (utils) => {\n const server = await startPreviewServer();\n // Fallback middleware for the case without @cloudflare/vite-plugin\n server.middlewares.use(async (_req, res, next) => {\n try {\n const { Readable } = await import(\n /* @vite-ignore */ DO_NOT_BUNDLE + 'node:stream'\n );\n Readable.fromWeb(buildBody() as never).pipe(res);\n } catch (err) {\n next(err);\n }\n });\n const response = await fetch(\n server.baseUrl + internalPathToBuildStaticFiles,\n { headers: { connection: 'close' } },\n );\n await consumeMultiplexedStream(response.body!, async (key, stream) => {\n if (key.startsWith(PRUNABLE_KEY_PREFIX)) {\n utils.unstable_registerPrunableFile(\n key.slice(PRUNABLE_KEY_PREFIX.length),\n );\n return;\n }\n await utils.emitFile(key, stream);\n });\n // https://github.com/nodejs/node/issues/56645\n await new Promise((resolve) => setTimeout(resolve, 100));\n await server.close();\n },\n buildOptions,\n buildEnhancers: ['waku/adapters/cloudflare-build-enhancer'],\n defaultExport: {\n ...options?.handlers,\n fetch(req: Request, env: Record<string, unknown>) {\n setAllEnv(env);\n return fetchFn(req);\n },\n },\n };\n },\n);\n"],"names":["bodyLimit","Hono","unstable_createServerEntryAdapter","createServerEntryAdapter","unstable_startPreviewServer","startPreviewServer","unstable_constants","constants","unstable_consumeMultiplexedStream","consumeMultiplexedStream","unstable_honoMiddleware","honoMiddleware","unstable_produceMultiplexedStream","produceMultiplexedStream","DIST_PUBLIC","rscMiddleware","middlewareRunner","DEFAULT_BODY_LIMIT_MAX_SIZE","DO_NOT_BUNDLE","PRUNABLE_KEY_PREFIX","emptyStream","ReadableStream","start","controller","close","isProductionWorker","req","headers","get","isLoopbackRequest","hostname","URL","url","removeGzipEncoding","res","contentType","includes","Headers","set","Response","body","status","statusText","processRequest","processBuild","setAllEnv","config","notFoundHtml","options","bodyLimitOptions","middlewareFns","middlewareModules","internalPathToBuildStaticFiles","app","notFound","c","html","text","use","maxSize","middlewareFn","buildOptions","srcDir","distDir","serverless","static","buildBody","emitFile","unstable_registerPrunableFile","srcPath","fetchFn","pathname","cloudflareContext","env","waitUntil","passThroughOnException","fetch","props","undefined","PROD","then","build","utils","server","middlewares","_req","next","Readable","fromWeb","pipe","err","response","baseUrl","connection","key","stream","startsWith","slice","length","Promise","resolve","setTimeout","buildEnhancers","defaultExport","handlers"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/adapters/deno.ts"],"sourcesContent":["import path from 'node:path';\nimport type { MiddlewareHandler } from 'hono';\nimport { bodyLimit } from 'hono/body-limit';\n// FIXME hopefully we should avoid bundling this\nimport { Hono as HonoForDevAndBuild } from 'hono/tiny';\nimport { unstable_createServerEntryAdapter as createServerEntryAdapter } from 'waku/adapter-builders';\nimport {\n unstable_constants as constants,\n unstable_honoMiddleware as honoMiddleware,\n} from 'waku/internals';\nimport type { BuildOptions } from './deno-build-enhancer.js';\n\nconst { DIST_PUBLIC } = constants;\nconst { rscMiddleware, middlewareRunner } = honoMiddleware;\n\nconst DEFAULT_BODY_LIMIT_MAX_SIZE = 100 * 1024 * 1024;\n\nexport default createServerEntryAdapter(\n (\n { processRequest, processBuild, config, notFoundHtml },\n options?: {\n bodyLimit?: Parameters<typeof bodyLimit>[0] | false;\n middlewareFns?: ((opts: {\n app: HonoForDevAndBuild;\n }) => MiddlewareHandler)[];\n middlewareModules?: Record<string, () => Promise<unknown>>;\n },\n ) => {\n const {\n bodyLimit: bodyLimitOptions,\n middlewareFns = [],\n middlewareModules = {},\n } = options || {};\n const {\n __WAKU_DENO_ADAPTER_HONO__: Hono = HonoForDevAndBuild,\n __WAKU_DENO_ADAPTER_SERVE_STATIC__: serveStatic,\n } = globalThis
|
|
1
|
+
{"version":3,"sources":["../../src/adapters/deno.ts"],"sourcesContent":["import path from 'node:path';\nimport type { MiddlewareHandler } from 'hono';\nimport { bodyLimit } from 'hono/body-limit';\n// FIXME hopefully we should avoid bundling this\nimport { Hono as HonoForDevAndBuild } from 'hono/tiny';\nimport { unstable_createServerEntryAdapter as createServerEntryAdapter } from 'waku/adapter-builders';\nimport {\n unstable_constants as constants,\n unstable_honoMiddleware as honoMiddleware,\n} from 'waku/internals';\nimport type { BuildOptions } from './deno-build-enhancer.js';\n\nconst { DIST_PUBLIC } = constants;\nconst { rscMiddleware, middlewareRunner } = honoMiddleware;\n\nconst DEFAULT_BODY_LIMIT_MAX_SIZE = 100 * 1024 * 1024;\n\nexport default createServerEntryAdapter(\n (\n { processRequest, processBuild, config, notFoundHtml },\n options?: {\n bodyLimit?: Parameters<typeof bodyLimit>[0] | false;\n middlewareFns?: ((opts: {\n app: HonoForDevAndBuild;\n }) => MiddlewareHandler)[];\n middlewareModules?: Record<string, () => Promise<unknown>>;\n },\n ) => {\n const {\n bodyLimit: bodyLimitOptions,\n middlewareFns = [],\n middlewareModules = {},\n } = options || {};\n const {\n __WAKU_DENO_ADAPTER_HONO__: Hono = HonoForDevAndBuild,\n __WAKU_DENO_ADAPTER_SERVE_STATIC__: serveStatic,\n } = globalThis;\n const app = new Hono();\n app.notFound((c) => {\n if (notFoundHtml) {\n return c.html(notFoundHtml, 404);\n }\n return c.text('404 Not Found', 404);\n });\n if (serveStatic) {\n app.use(serveStatic({ root: path.join(config.distDir, DIST_PUBLIC) }));\n }\n if (bodyLimitOptions !== false) {\n app.use(\n bodyLimit(bodyLimitOptions ?? { maxSize: DEFAULT_BODY_LIMIT_MAX_SIZE }),\n );\n }\n for (const middlewareFn of middlewareFns) {\n app.use(middlewareFn({ app }));\n }\n app.use(middlewareRunner(middlewareModules as never, { app }));\n app.use(rscMiddleware({ processRequest }));\n const buildOptions: BuildOptions = {\n distDir: config.distDir,\n };\n return {\n fetch: app.fetch,\n build: processBuild,\n buildOptions,\n buildEnhancers: ['waku/adapters/deno-build-enhancer'],\n };\n },\n);\n"],"names":["path","bodyLimit","Hono","HonoForDevAndBuild","unstable_createServerEntryAdapter","createServerEntryAdapter","unstable_constants","constants","unstable_honoMiddleware","honoMiddleware","DIST_PUBLIC","rscMiddleware","middlewareRunner","DEFAULT_BODY_LIMIT_MAX_SIZE","processRequest","processBuild","config","notFoundHtml","options","bodyLimitOptions","middlewareFns","middlewareModules","__WAKU_DENO_ADAPTER_HONO__","__WAKU_DENO_ADAPTER_SERVE_STATIC__","serveStatic","globalThis","app","notFound","c","html","text","use","root","join","distDir","maxSize","middlewareFn","buildOptions","fetch","build","buildEnhancers"],"mappings":"AAAA,OAAOA,UAAU,YAAY;AAE7B,SAASC,SAAS,QAAQ,kBAAkB;AAC5C,gDAAgD;AAChD,SAASC,QAAQC,kBAAkB,QAAQ,YAAY;AACvD,SAASC,qCAAqCC,wBAAwB,QAAQ,wBAAwB;AACtG,SACEC,sBAAsBC,SAAS,EAC/BC,2BAA2BC,cAAc,QACpC,iBAAiB;AAGxB,MAAM,EAAEC,WAAW,EAAE,GAAGH;AACxB,MAAM,EAAEI,aAAa,EAAEC,gBAAgB,EAAE,GAAGH;AAE5C,MAAMI,8BAA8B,MAAM,OAAO;AAEjD,eAAeR,yBACb,CACE,EAAES,cAAc,EAAEC,YAAY,EAAEC,MAAM,EAAEC,YAAY,EAAE,EACtDC;IAQA,MAAM,EACJjB,WAAWkB,gBAAgB,EAC3BC,gBAAgB,EAAE,EAClBC,oBAAoB,CAAC,CAAC,EACvB,GAAGH,WAAW,CAAC;IAChB,MAAM,EACJI,4BAA4BpB,OAAOC,kBAAkB,EACrDoB,oCAAoCC,WAAW,EAChD,GAAGC;IACJ,MAAMC,MAAM,IAAIxB;IAChBwB,IAAIC,QAAQ,CAAC,CAACC;QACZ,IAAIX,cAAc;YAChB,OAAOW,EAAEC,IAAI,CAACZ,cAAc;QAC9B;QACA,OAAOW,EAAEE,IAAI,CAAC,iBAAiB;IACjC;IACA,IAAIN,aAAa;QACfE,IAAIK,GAAG,CAACP,YAAY;YAAEQ,MAAMhC,KAAKiC,IAAI,CAACjB,OAAOkB,OAAO,EAAExB;QAAa;IACrE;IACA,IAAIS,qBAAqB,OAAO;QAC9BO,IAAIK,GAAG,CACL9B,UAAUkB,oBAAoB;YAAEgB,SAAStB;QAA4B;IAEzE;IACA,KAAK,MAAMuB,gBAAgBhB,cAAe;QACxCM,IAAIK,GAAG,CAACK,aAAa;YAAEV;QAAI;IAC7B;IACAA,IAAIK,GAAG,CAACnB,iBAAiBS,mBAA4B;QAAEK;IAAI;IAC3DA,IAAIK,GAAG,CAACpB,cAAc;QAAEG;IAAe;IACvC,MAAMuB,eAA6B;QACjCH,SAASlB,OAAOkB,OAAO;IACzB;IACA,OAAO;QACLI,OAAOZ,IAAIY,KAAK;QAChBC,OAAOxB;QACPsB;QACAG,gBAAgB;YAAC;SAAoC;IACvD;AACF,GACA"}
|
package/dist/adapters/vercel.js
CHANGED
|
@@ -6,7 +6,7 @@ import { unstable_constants as constants, unstable_honoMiddleware as honoMiddlew
|
|
|
6
6
|
const { DIST_PUBLIC } = constants;
|
|
7
7
|
const { rscMiddleware, middlewareRunner } = honoMiddleware;
|
|
8
8
|
const DEFAULT_BODY_LIMIT_MAX_SIZE = 100 * 1024 * 1024;
|
|
9
|
-
|
|
9
|
+
globalThis.__WAKU_HONO_NODE_SERVER_GET_REQUEST_LISTENER__ = getRequestListener;
|
|
10
10
|
export default createServerEntryAdapter(({ processRequest, processBuild, config, notFoundHtml }, options)=>{
|
|
11
11
|
const { bodyLimit: bodyLimitOptions, middlewareFns = [], middlewareModules = {} } = options || {};
|
|
12
12
|
const app = new Hono();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/adapters/vercel.ts"],"sourcesContent":["import { getRequestListener } from '@hono/node-server';\nimport type { MiddlewareHandler } from 'hono';\nimport { bodyLimit } from 'hono/body-limit';\nimport { Hono } from 'hono/tiny';\nimport { unstable_createServerEntryAdapter as createServerEntryAdapter } from 'waku/adapter-builders';\nimport {\n unstable_constants as constants,\n unstable_honoMiddleware as honoMiddleware,\n} from 'waku/internals';\nimport type { BuildOptions } from './vercel-build-enhancer.js';\n\nconst { DIST_PUBLIC } = constants;\nconst { rscMiddleware, middlewareRunner } = honoMiddleware;\n\nconst DEFAULT_BODY_LIMIT_MAX_SIZE = 100 * 1024 * 1024;\
|
|
1
|
+
{"version":3,"sources":["../../src/adapters/vercel.ts"],"sourcesContent":["import { getRequestListener } from '@hono/node-server';\nimport type { MiddlewareHandler } from 'hono';\nimport { bodyLimit } from 'hono/body-limit';\nimport { Hono } from 'hono/tiny';\nimport { unstable_createServerEntryAdapter as createServerEntryAdapter } from 'waku/adapter-builders';\nimport {\n unstable_constants as constants,\n unstable_honoMiddleware as honoMiddleware,\n} from 'waku/internals';\nimport type { BuildOptions } from './vercel-build-enhancer.js';\n\nconst { DIST_PUBLIC } = constants;\nconst { rscMiddleware, middlewareRunner } = honoMiddleware;\n\nconst DEFAULT_BODY_LIMIT_MAX_SIZE = 100 * 1024 * 1024;\nglobalThis.__WAKU_HONO_NODE_SERVER_GET_REQUEST_LISTENER__ = getRequestListener;\n\nexport default createServerEntryAdapter(\n (\n { processRequest, processBuild, config, notFoundHtml },\n options?: {\n static?: boolean;\n assetsDir?: string;\n bodyLimit?: Parameters<typeof bodyLimit>[0] | false;\n middlewareFns?: ((opts: { app: Hono }) => MiddlewareHandler)[];\n middlewareModules?: Record<string, () => Promise<unknown>>;\n },\n ) => {\n const {\n bodyLimit: bodyLimitOptions,\n middlewareFns = [],\n middlewareModules = {},\n } = options || {};\n const app = new Hono();\n app.notFound((c) => {\n if (notFoundHtml) {\n return c.html(notFoundHtml, 404);\n }\n return c.text('404 Not Found', 404);\n });\n if (bodyLimitOptions !== false) {\n app.use(\n bodyLimit(bodyLimitOptions ?? { maxSize: DEFAULT_BODY_LIMIT_MAX_SIZE }),\n );\n }\n for (const middlewareFn of middlewareFns) {\n app.use(middlewareFn({ app }));\n }\n app.use(middlewareRunner(middlewareModules as never, { app }));\n app.use(rscMiddleware({ processRequest }));\n const buildOptions: BuildOptions = {\n assetsDir: options?.assetsDir || 'assets',\n distDir: config.distDir,\n rscBase: config.rscBase,\n privateDir: config.privateDir,\n basePath: config.basePath,\n DIST_PUBLIC,\n serverless: !options?.static,\n };\n return {\n fetch: app.fetch,\n build: processBuild,\n buildOptions,\n buildEnhancers: ['waku/adapters/vercel-build-enhancer'],\n };\n },\n);\n"],"names":["getRequestListener","bodyLimit","Hono","unstable_createServerEntryAdapter","createServerEntryAdapter","unstable_constants","constants","unstable_honoMiddleware","honoMiddleware","DIST_PUBLIC","rscMiddleware","middlewareRunner","DEFAULT_BODY_LIMIT_MAX_SIZE","globalThis","__WAKU_HONO_NODE_SERVER_GET_REQUEST_LISTENER__","processRequest","processBuild","config","notFoundHtml","options","bodyLimitOptions","middlewareFns","middlewareModules","app","notFound","c","html","text","use","maxSize","middlewareFn","buildOptions","assetsDir","distDir","rscBase","privateDir","basePath","serverless","static","fetch","build","buildEnhancers"],"mappings":"AAAA,SAASA,kBAAkB,QAAQ,oBAAoB;AAEvD,SAASC,SAAS,QAAQ,kBAAkB;AAC5C,SAASC,IAAI,QAAQ,YAAY;AACjC,SAASC,qCAAqCC,wBAAwB,QAAQ,wBAAwB;AACtG,SACEC,sBAAsBC,SAAS,EAC/BC,2BAA2BC,cAAc,QACpC,iBAAiB;AAGxB,MAAM,EAAEC,WAAW,EAAE,GAAGH;AACxB,MAAM,EAAEI,aAAa,EAAEC,gBAAgB,EAAE,GAAGH;AAE5C,MAAMI,8BAA8B,MAAM,OAAO;AACjDC,WAAWC,8CAA8C,GAAGd;AAE5D,eAAeI,yBACb,CACE,EAAEW,cAAc,EAAEC,YAAY,EAAEC,MAAM,EAAEC,YAAY,EAAE,EACtDC;IAQA,MAAM,EACJlB,WAAWmB,gBAAgB,EAC3BC,gBAAgB,EAAE,EAClBC,oBAAoB,CAAC,CAAC,EACvB,GAAGH,WAAW,CAAC;IAChB,MAAMI,MAAM,IAAIrB;IAChBqB,IAAIC,QAAQ,CAAC,CAACC;QACZ,IAAIP,cAAc;YAChB,OAAOO,EAAEC,IAAI,CAACR,cAAc;QAC9B;QACA,OAAOO,EAAEE,IAAI,CAAC,iBAAiB;IACjC;IACA,IAAIP,qBAAqB,OAAO;QAC9BG,IAAIK,GAAG,CACL3B,UAAUmB,oBAAoB;YAAES,SAASjB;QAA4B;IAEzE;IACA,KAAK,MAAMkB,gBAAgBT,cAAe;QACxCE,IAAIK,GAAG,CAACE,aAAa;YAAEP;QAAI;IAC7B;IACAA,IAAIK,GAAG,CAACjB,iBAAiBW,mBAA4B;QAAEC;IAAI;IAC3DA,IAAIK,GAAG,CAAClB,cAAc;QAAEK;IAAe;IACvC,MAAMgB,eAA6B;QACjCC,WAAWb,SAASa,aAAa;QACjCC,SAAShB,OAAOgB,OAAO;QACvBC,SAASjB,OAAOiB,OAAO;QACvBC,YAAYlB,OAAOkB,UAAU;QAC7BC,UAAUnB,OAAOmB,QAAQ;QACzB3B;QACA4B,YAAY,CAAClB,SAASmB;IACxB;IACA,OAAO;QACLC,OAAOhB,IAAIgB,KAAK;QAChBC,OAAOxB;QACPe;QACAU,gBAAgB;YAAC;SAAsC;IACzD;AACF,GACA"}
|
package/dist/lib/env.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* This is an internal function and not for public use.
|
|
3
3
|
*/
|
|
4
|
-
export declare function setAllEnv(newEnv: Readonly<Record<string,
|
|
4
|
+
export declare function setAllEnv(newEnv: Readonly<Record<string, unknown>>): void;
|
|
5
5
|
export declare function getEnv(key: string): string | undefined;
|
package/dist/lib/env.js
CHANGED
|
@@ -3,7 +3,13 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* This is an internal function and not for public use.
|
|
5
5
|
*/ export function setAllEnv(newEnv) {
|
|
6
|
-
|
|
6
|
+
const env = {};
|
|
7
|
+
for (const [key, value] of Object.entries(newEnv)){
|
|
8
|
+
if (typeof value === 'string') {
|
|
9
|
+
env[key] = value;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
globalThis.__WAKU_SERVER_ENV__ = env;
|
|
7
13
|
}
|
|
8
14
|
export function getEnv(key) {
|
|
9
15
|
return globalThis.__WAKU_SERVER_ENV__?.[key];
|
package/dist/lib/env.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/env.ts"],"sourcesContent":["// The use of `globalThis` in this file is more or less a hack.\n// It should be revisited with a better solution.\n\n/**\n * This is an internal function and not for public use.\n */\nexport function setAllEnv(newEnv: Readonly<Record<string,
|
|
1
|
+
{"version":3,"sources":["../../src/lib/env.ts"],"sourcesContent":["// The use of `globalThis` in this file is more or less a hack.\n// It should be revisited with a better solution.\n\n/**\n * This is an internal function and not for public use.\n */\nexport function setAllEnv(newEnv: Readonly<Record<string, unknown>>) {\n const env: Record<string, string> = {};\n for (const [key, value] of Object.entries(newEnv)) {\n if (typeof value === 'string') {\n env[key] = value;\n }\n }\n globalThis.__WAKU_SERVER_ENV__ = env;\n}\n\nexport function getEnv(key: string): string | undefined {\n return globalThis.__WAKU_SERVER_ENV__?.[key];\n}\n"],"names":["setAllEnv","newEnv","env","key","value","Object","entries","globalThis","__WAKU_SERVER_ENV__","getEnv"],"mappings":"AAAA,+DAA+D;AAC/D,iDAAiD;AAEjD;;CAEC,GACD,OAAO,SAASA,UAAUC,MAAyC;IACjE,MAAMC,MAA8B,CAAC;IACrC,KAAK,MAAM,CAACC,KAAKC,MAAM,IAAIC,OAAOC,OAAO,CAACL,QAAS;QACjD,IAAI,OAAOG,UAAU,UAAU;YAC7BF,GAAG,CAACC,IAAI,GAAGC;QACb;IACF;IACAG,WAAWC,mBAAmB,GAAGN;AACnC;AAEA,OAAO,SAASO,OAAON,GAAW;IAChC,OAAOI,WAAWC,mBAAmB,EAAE,CAACL,IAAI;AAC9C"}
|
|
@@ -3,5 +3,19 @@ declare global {
|
|
|
3
3
|
var __WAKU_REFETCH_RSC__: (() => void) | undefined;
|
|
4
4
|
var __WAKU_REFETCH_ROUTE__: (() => void) | undefined;
|
|
5
5
|
var __WAKU_START_PREVIEW_SERVER__: (() => Promise<import('./vite-rsc/preview.js').PreviewServer>) | undefined;
|
|
6
|
+
var __WAKU_SERVER_ENV__: Readonly<Record<string, string>> | undefined;
|
|
7
|
+
var __WAKU_PREFETCHED__: import('./utils/prefetch-cache.js').PrefetchEntry[] | undefined;
|
|
8
|
+
var __WAKU_INITIAL_RSC__: import('./utils/initial-rsc.js').InitialRscEntry | undefined;
|
|
9
|
+
var __WAKU_DEBUG_CHANNELS__: Map<string, {
|
|
10
|
+
readable: ReadableStream;
|
|
11
|
+
writable: WritableStream;
|
|
12
|
+
}> | undefined;
|
|
13
|
+
var __WAKU_ROUTER_PREFETCH__: ((path: string, callback: (id: string) => void) => void) | undefined;
|
|
14
|
+
var __WAKU_HONO_NODE_SERVER_GET_REQUEST_LISTENER__: (typeof import('@hono/node-server'))['getRequestListener'] | undefined;
|
|
15
|
+
var __WAKU_DENO_ADAPTER_HONO__: (typeof import('hono/tiny'))['Hono'] | undefined;
|
|
16
|
+
var __WAKU_DENO_ADAPTER_SERVE_STATIC__: ((options: {
|
|
17
|
+
root: string;
|
|
18
|
+
}) => import('hono').MiddlewareHandler) | undefined;
|
|
19
|
+
var __WAKU_AWS_LAMBDA_HANDLE__: (typeof import('hono/aws-lambda'))['handle'] | (typeof import('hono/aws-lambda'))['streamHandle'] | undefined;
|
|
6
20
|
}
|
|
7
21
|
export {};
|
package/dist/lib/types.d.ts
CHANGED
|
@@ -68,7 +68,7 @@ export type Unstable_CreateServerEntryAdapter = <Options>(fn: (args: {
|
|
|
68
68
|
handlers: Unstable_Handlers;
|
|
69
69
|
processRequest: Unstable_ProcessRequest;
|
|
70
70
|
processBuild: Unstable_ProcessBuild;
|
|
71
|
-
setAllEnv: (newEnv: Readonly<Record<string,
|
|
71
|
+
setAllEnv: (newEnv: Readonly<Record<string, unknown>>) => void;
|
|
72
72
|
config: Omit<Required<Config>, 'vite'>;
|
|
73
73
|
isBuild: boolean;
|
|
74
74
|
notFoundHtml: string;
|
package/dist/lib/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/types.ts"],"sourcesContent":["import type { ReactNode } from 'react';\nimport type { Config } from '../config.js';\n\ntype Elements = Record<string, unknown>;\n\nexport type Unstable_RenderRsc = (\n elements: Elements,\n options?: {\n value?: unknown;\n unstable_clientModuleCallback?: (ids: string[]) => void;\n },\n) => Promise<ReadableStream>;\n\nexport type Unstable_ParseRsc = (\n rscStream: ReadableStream,\n) => Promise<Elements>;\n\nexport type Unstable_RenderHtml = (\n elementsStream: ReadableStream,\n html: ReactNode,\n options: {\n rscPath: string;\n formState?: unknown;\n status?: number;\n nonce?: string;\n unstable_extraScriptContent?: string;\n },\n) => Promise<Response>;\n\nexport type Unstable_EmitFile = (\n filePath: string,\n body: ReadableStream,\n) => Promise<void>;\n\nexport type Unstable_HandleRequest = (\n input: (\n | { type: 'component'; rscPath: string; rscParams: unknown }\n | {\n type: 'function';\n fn: (...args: unknown[]) => Promise<unknown>;\n args: unknown[];\n }\n | {\n type: 'action';\n fn: () => Promise<unknown>;\n }\n | { type: 'custom' }\n ) & {\n pathname: string;\n req: Request;\n },\n utils: {\n renderRsc: Unstable_RenderRsc;\n parseRsc: Unstable_ParseRsc;\n renderHtml: Unstable_RenderHtml;\n loadBuildMetadata: (key: string) => Promise<string | undefined>;\n },\n) => Promise<ReadableStream | Response | 'fallback' | null | undefined>;\n\nexport type Unstable_HandleBuild = (utils: {\n renderRsc: Unstable_RenderRsc;\n parseRsc: Unstable_ParseRsc;\n renderHtml: Unstable_RenderHtml;\n rscPath2pathname: (rscPath: string) => string;\n saveBuildMetadata: (key: string, value: string) => Promise<void>;\n generateFile: (\n fileName: string,\n body: ReadableStream | string,\n ) => Promise<void>;\n generateDefaultHtml: (fileName: string) => Promise<void>;\n unstable_registerPrunableFile: (srcPath: string) => void;\n}) => Promise<void>;\n\nexport type Unstable_Handlers = {\n handleRequest: Unstable_HandleRequest;\n handleBuild: Unstable_HandleBuild;\n [someOtherProperty: string]: unknown;\n};\n\nexport type Unstable_ServerEntry = {\n fetch: (req: Request, ...args: any[]) => Response | Promise<Response>;\n build: (\n utils: {\n emitFile: Unstable_EmitFile;\n unstable_registerPrunableFile: (srcPath: string) => void;\n },\n ...args: any[]\n ) => Promise<void>;\n buildOptions?: Record<string, unknown>;\n buildEnhancers?: string[]; // enhancer module ids\n defaultExport?: unknown;\n [someOtherProperty: string]: unknown;\n};\n\nexport type Unstable_ProcessRequest = (\n arg: Parameters<Unstable_ServerEntry['fetch']>[0],\n) => Promise<Response | null>;\n\nexport type Unstable_ProcessBuild = (\n arg: Parameters<Unstable_ServerEntry['build']>[0],\n) => Promise<void>;\n\nexport type Unstable_CreateServerEntryAdapter = <Options>(\n fn: (\n args: {\n handlers: Unstable_Handlers;\n processRequest: Unstable_ProcessRequest;\n processBuild: Unstable_ProcessBuild;\n setAllEnv: (newEnv: Readonly<Record<string,
|
|
1
|
+
{"version":3,"sources":["../../src/lib/types.ts"],"sourcesContent":["import type { ReactNode } from 'react';\nimport type { Config } from '../config.js';\n\ntype Elements = Record<string, unknown>;\n\nexport type Unstable_RenderRsc = (\n elements: Elements,\n options?: {\n value?: unknown;\n unstable_clientModuleCallback?: (ids: string[]) => void;\n },\n) => Promise<ReadableStream>;\n\nexport type Unstable_ParseRsc = (\n rscStream: ReadableStream,\n) => Promise<Elements>;\n\nexport type Unstable_RenderHtml = (\n elementsStream: ReadableStream,\n html: ReactNode,\n options: {\n rscPath: string;\n formState?: unknown;\n status?: number;\n nonce?: string;\n unstable_extraScriptContent?: string;\n },\n) => Promise<Response>;\n\nexport type Unstable_EmitFile = (\n filePath: string,\n body: ReadableStream,\n) => Promise<void>;\n\nexport type Unstable_HandleRequest = (\n input: (\n | { type: 'component'; rscPath: string; rscParams: unknown }\n | {\n type: 'function';\n fn: (...args: unknown[]) => Promise<unknown>;\n args: unknown[];\n }\n | {\n type: 'action';\n fn: () => Promise<unknown>;\n }\n | { type: 'custom' }\n ) & {\n pathname: string;\n req: Request;\n },\n utils: {\n renderRsc: Unstable_RenderRsc;\n parseRsc: Unstable_ParseRsc;\n renderHtml: Unstable_RenderHtml;\n loadBuildMetadata: (key: string) => Promise<string | undefined>;\n },\n) => Promise<ReadableStream | Response | 'fallback' | null | undefined>;\n\nexport type Unstable_HandleBuild = (utils: {\n renderRsc: Unstable_RenderRsc;\n parseRsc: Unstable_ParseRsc;\n renderHtml: Unstable_RenderHtml;\n rscPath2pathname: (rscPath: string) => string;\n saveBuildMetadata: (key: string, value: string) => Promise<void>;\n generateFile: (\n fileName: string,\n body: ReadableStream | string,\n ) => Promise<void>;\n generateDefaultHtml: (fileName: string) => Promise<void>;\n unstable_registerPrunableFile: (srcPath: string) => void;\n}) => Promise<void>;\n\nexport type Unstable_Handlers = {\n handleRequest: Unstable_HandleRequest;\n handleBuild: Unstable_HandleBuild;\n [someOtherProperty: string]: unknown;\n};\n\nexport type Unstable_ServerEntry = {\n fetch: (req: Request, ...args: any[]) => Response | Promise<Response>;\n build: (\n utils: {\n emitFile: Unstable_EmitFile;\n unstable_registerPrunableFile: (srcPath: string) => void;\n },\n ...args: any[]\n ) => Promise<void>;\n buildOptions?: Record<string, unknown>;\n buildEnhancers?: string[]; // enhancer module ids\n defaultExport?: unknown;\n [someOtherProperty: string]: unknown;\n};\n\nexport type Unstable_ProcessRequest = (\n arg: Parameters<Unstable_ServerEntry['fetch']>[0],\n) => Promise<Response | null>;\n\nexport type Unstable_ProcessBuild = (\n arg: Parameters<Unstable_ServerEntry['build']>[0],\n) => Promise<void>;\n\nexport type Unstable_CreateServerEntryAdapter = <Options>(\n fn: (\n args: {\n handlers: Unstable_Handlers;\n processRequest: Unstable_ProcessRequest;\n processBuild: Unstable_ProcessBuild;\n setAllEnv: (newEnv: Readonly<Record<string, unknown>>) => void;\n config: Omit<Required<Config>, 'vite'>;\n isBuild: boolean;\n notFoundHtml: string;\n },\n options?: Options,\n ) => Unstable_ServerEntry,\n) => (handlers: Unstable_Handlers, options?: Options) => Unstable_ServerEntry;\n"],"names":[],"mappings":"AAsGA,WAa8E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/utils/base64-node.ts"],"sourcesContent":["export const bytesToBase64 = (bytes: Uint8Array): string =>\n Buffer.from(bytes).toString('base64');\n\nexport const base64ToBytes = (base64: string): Uint8Array =>\n new Uint8Array(Buffer.from(base64, 'base64'));\n"],"names":["bytesToBase64","bytes","Buffer","from","toString","base64ToBytes","base64","Uint8Array"],"mappings":"AAAA,OAAO,MAAMA,gBAAgB,CAACC,QAC5BC,OAAOC,IAAI,CAACF,OAAOG,QAAQ,CAAC,UAAU;AAExC,OAAO,MAAMC,gBAAgB,CAACC,SAC5B,IAAIC,WAAWL,OAAOC,IAAI,CAACG,QAAQ,WAAW"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// This file should not include Node specific code.
|
|
2
|
+
export const bytesToBase64 = (bytes)=>{
|
|
3
|
+
let binary = '';
|
|
4
|
+
for(let i = 0; i < bytes.length; i++){
|
|
5
|
+
binary += String.fromCharCode(bytes[i]);
|
|
6
|
+
}
|
|
7
|
+
return btoa(binary);
|
|
8
|
+
};
|
|
9
|
+
export const base64ToBytes = (base64)=>Uint8Array.from(atob(base64), (char)=>char.charCodeAt(0));
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=base64-web.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/utils/base64-web.ts"],"sourcesContent":["// This file should not include Node specific code.\n\nexport const bytesToBase64 = (bytes: Uint8Array): string => {\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]!);\n }\n return btoa(binary);\n};\n\nexport const base64ToBytes = (base64: string): Uint8Array =>\n Uint8Array.from(atob(base64), (char) => char.charCodeAt(0));\n"],"names":["bytesToBase64","bytes","binary","i","length","String","fromCharCode","btoa","base64ToBytes","base64","Uint8Array","from","atob","char","charCodeAt"],"mappings":"AAAA,mDAAmD;AAEnD,OAAO,MAAMA,gBAAgB,CAACC;IAC5B,IAAIC,SAAS;IACb,IAAK,IAAIC,IAAI,GAAGA,IAAIF,MAAMG,MAAM,EAAED,IAAK;QACrCD,UAAUG,OAAOC,YAAY,CAACL,KAAK,CAACE,EAAE;IACxC;IACA,OAAOI,KAAKL;AACd,EAAE;AAEF,OAAO,MAAMM,gBAAgB,CAACC,SAC5BC,WAAWC,IAAI,CAACC,KAAKH,SAAS,CAACI,OAASA,KAAKC,UAAU,CAAC,IAAI"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/utils/custom-errors.ts"],"sourcesContent":["type ErrorInfo = {\n status?: number;\n location?: string;\n};\n\nconst isErrorInfo = (x: unknown): x is ErrorInfo => {\n if (typeof x !== 'object' || x === null) {\n return false;\n }\n if ('status' in x && typeof (x as ErrorInfo).status !== 'number') {\n return false;\n }\n if ('location' in x && typeof (x as ErrorInfo).location !== 'string') {\n return false;\n }\n return true;\n};\n\nconst prefix = '__WAKU_CUSTOM_ERROR__;';\n\n// This is an internal API and not for public use\nexport const createCustomError = (message: string, errorInfo: ErrorInfo) => {\n const err = new Error(message);\n (err as
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/utils/custom-errors.ts"],"sourcesContent":["type ErrorInfo = {\n status?: number;\n location?: string;\n};\n\nconst isErrorInfo = (x: unknown): x is ErrorInfo => {\n if (typeof x !== 'object' || x === null) {\n return false;\n }\n if ('status' in x && typeof (x as ErrorInfo).status !== 'number') {\n return false;\n }\n if ('location' in x && typeof (x as ErrorInfo).location !== 'string') {\n return false;\n }\n return true;\n};\n\nconst prefix = '__WAKU_CUSTOM_ERROR__;';\n\n// This is an internal API and not for public use\nexport const createCustomError = (message: string, errorInfo: ErrorInfo) => {\n const err = new Error(message);\n (err as { digest?: string }).digest = prefix + JSON.stringify(errorInfo);\n return err;\n};\n\nexport const getErrorInfo = (err: unknown) => {\n const digest = (err as { digest?: string } | undefined)?.digest;\n if (typeof digest !== 'string' || !digest.startsWith(prefix)) {\n return null;\n }\n try {\n const info = JSON.parse(digest.slice(prefix.length));\n if (isErrorInfo(info)) {\n return info;\n }\n } catch {\n // ignore\n }\n return null;\n};\n"],"names":["isErrorInfo","x","status","location","prefix","createCustomError","message","errorInfo","err","Error","digest","JSON","stringify","getErrorInfo","startsWith","info","parse","slice","length"],"mappings":"AAKA,MAAMA,cAAc,CAACC;IACnB,IAAI,OAAOA,MAAM,YAAYA,MAAM,MAAM;QACvC,OAAO;IACT;IACA,IAAI,YAAYA,KAAK,OAAO,AAACA,EAAgBC,MAAM,KAAK,UAAU;QAChE,OAAO;IACT;IACA,IAAI,cAAcD,KAAK,OAAO,AAACA,EAAgBE,QAAQ,KAAK,UAAU;QACpE,OAAO;IACT;IACA,OAAO;AACT;AAEA,MAAMC,SAAS;AAEf,iDAAiD;AACjD,OAAO,MAAMC,oBAAoB,CAACC,SAAiBC;IACjD,MAAMC,MAAM,IAAIC,MAAMH;IACrBE,IAA4BE,MAAM,GAAGN,SAASO,KAAKC,SAAS,CAACL;IAC9D,OAAOC;AACT,EAAE;AAEF,OAAO,MAAMK,eAAe,CAACL;IAC3B,MAAME,SAAUF,KAAyCE;IACzD,IAAI,OAAOA,WAAW,YAAY,CAACA,OAAOI,UAAU,CAACV,SAAS;QAC5D,OAAO;IACT;IACA,IAAI;QACF,MAAMW,OAAOJ,KAAKK,KAAK,CAACN,OAAOO,KAAK,CAACb,OAAOc,MAAM;QAClD,IAAIlB,YAAYe,OAAO;YACrB,OAAOA;QACT;IACF,EAAE,OAAM;IACN,SAAS;IACX;IACA,OAAO;AACT,EAAE"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
type InitialRscEntry = {
|
|
1
|
+
export type InitialRscEntry = {
|
|
2
2
|
response: Promise<Response>;
|
|
3
3
|
close: () => void;
|
|
4
4
|
debugId?: string;
|
|
5
5
|
};
|
|
6
6
|
export declare const consumeInitialRscEntry: () => InitialRscEntry | undefined;
|
|
7
7
|
export declare const createInitialRscEntryCode: (debugId: string | undefined) => string;
|
|
8
|
-
export {};
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
// The initial RSC entry is emitted as an inline script during SSR. It carries
|
|
2
2
|
// the streamed RSC payload of the first render as a `Response`, so the client
|
|
3
3
|
// can hydrate without an extra round trip. It is consumed exactly once.
|
|
4
|
+
// This is exported only for global-types.ts. It is not a public API.
|
|
4
5
|
export const consumeInitialRscEntry = ()=>{
|
|
5
6
|
const entry = globalThis.__WAKU_INITIAL_RSC__;
|
|
6
7
|
if (entry) {
|
|
7
|
-
|
|
8
|
+
globalThis.__WAKU_INITIAL_RSC__ = undefined;
|
|
8
9
|
}
|
|
9
10
|
return entry;
|
|
10
11
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/utils/initial-rsc.ts"],"sourcesContent":["// The initial RSC entry is emitted as an inline script during SSR. It carries\n// the streamed RSC payload of the first render as a `Response`, so the client\n// can hydrate without an extra round trip. It is consumed exactly once.\n\
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/utils/initial-rsc.ts"],"sourcesContent":["// The initial RSC entry is emitted as an inline script during SSR. It carries\n// the streamed RSC payload of the first render as a `Response`, so the client\n// can hydrate without an extra round trip. It is consumed exactly once.\n\n// This is exported only for global-types.ts. It is not a public API.\nexport type InitialRscEntry = {\n response: Promise<Response>;\n close: () => void;\n debugId?: string;\n};\n\nexport const consumeInitialRscEntry = (): InitialRscEntry | undefined => {\n const entry = globalThis.__WAKU_INITIAL_RSC__;\n if (entry) {\n globalThis.__WAKU_INITIAL_RSC__ = undefined;\n }\n return entry;\n};\n\nexport const createInitialRscEntryCode = (debugId: string | undefined) =>\n `\n (() => {\n const e = {};\n e.response = Promise.resolve(new Response(new ReadableStream({\n start(c) {\n const d = (window.__FLIGHT_DATA ||= []);\n const t = new TextEncoder();\n const f = (s) => c.enqueue(typeof s === 'string' ? t.encode(s) : s);\n d.forEach(f);\n d.length = 0;\n d.push = f;\n e.close = () => {\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => c.close());\n } else {\n c.close();\n }\n };\n }\n })));\n ${debugId ? `e.debugId = ${JSON.stringify(debugId)};` : ''}\n return e;\n })()\n`\n .split('\\n')\n .map((line) => line.trim())\n .join('');\n"],"names":["consumeInitialRscEntry","entry","globalThis","__WAKU_INITIAL_RSC__","undefined","createInitialRscEntryCode","debugId","JSON","stringify","split","map","line","trim","join"],"mappings":"AAAA,8EAA8E;AAC9E,8EAA8E;AAC9E,wEAAwE;AAExE,qEAAqE;AAOrE,OAAO,MAAMA,yBAAyB;IACpC,MAAMC,QAAQC,WAAWC,oBAAoB;IAC7C,IAAIF,OAAO;QACTC,WAAWC,oBAAoB,GAAGC;IACpC;IACA,OAAOH;AACT,EAAE;AAEF,OAAO,MAAMI,4BAA4B,CAACC,UACxC,CAAC;;;;;;;;;;;;;;;;;;;;IAoBC,EAAEA,UAAU,CAAC,YAAY,EAAEC,KAAKC,SAAS,CAACF,SAAS,CAAC,CAAC,GAAG,GAAG;;;AAG/D,CAAC,CACIG,KAAK,CAAC,MACNC,GAAG,CAAC,CAACC,OAASA,KAAKC,IAAI,IACvBC,IAAI,CAAC,IAAI"}
|
package/dist/lib/utils/path.js
CHANGED
|
@@ -120,6 +120,31 @@ const escapeRegExp = (s)=>s.replace(/[\\^$.*+?()[\]{}|]/g, '\\$&');
|
|
|
120
120
|
}
|
|
121
121
|
}).join('/');
|
|
122
122
|
};
|
|
123
|
+
const matchSpecSegment = (spec, segment, mapping)=>{
|
|
124
|
+
if (spec.type === 'literal') {
|
|
125
|
+
return spec.name === segment;
|
|
126
|
+
}
|
|
127
|
+
if (segment === undefined) {
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
const prefix = spec.prefix ?? '';
|
|
131
|
+
const suffix = spec.suffix ?? '';
|
|
132
|
+
if (prefix || suffix) {
|
|
133
|
+
if (!segment.startsWith(prefix) || !segment.endsWith(suffix)) {
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
const value = segment.slice(prefix.length, suffix ? -suffix.length : undefined);
|
|
137
|
+
if (!value) {
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
if (spec.name) {
|
|
141
|
+
mapping[spec.name] = value;
|
|
142
|
+
}
|
|
143
|
+
} else if (spec.name) {
|
|
144
|
+
mapping[spec.name] = segment;
|
|
145
|
+
}
|
|
146
|
+
return true;
|
|
147
|
+
};
|
|
123
148
|
/**
|
|
124
149
|
* Helper function to get the path mapping from the path spec and the pathname.
|
|
125
150
|
*
|
|
@@ -158,34 +183,12 @@ const escapeRegExp = (s)=>s.replace(/[\\^$.*+?()[\]{}|]/g, '\\$&');
|
|
|
158
183
|
let wildcardStartIndex = -1;
|
|
159
184
|
for(let i = 0; i < pathSpec.length; i++){
|
|
160
185
|
const spec = pathSpec[i];
|
|
161
|
-
if (spec.type === '
|
|
162
|
-
if (spec.name !== actual[i]) {
|
|
163
|
-
return null;
|
|
164
|
-
}
|
|
165
|
-
} else if (spec.type === 'wildcard') {
|
|
186
|
+
if (spec.type === 'wildcard') {
|
|
166
187
|
wildcardStartIndex = i;
|
|
167
188
|
break;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
return null;
|
|
172
|
-
}
|
|
173
|
-
const prefix = spec.prefix ?? '';
|
|
174
|
-
const suffix = spec.suffix ?? '';
|
|
175
|
-
if (prefix || suffix) {
|
|
176
|
-
if (!segment.startsWith(prefix) || !segment.endsWith(suffix || '')) {
|
|
177
|
-
return null;
|
|
178
|
-
}
|
|
179
|
-
const value = segment.slice(prefix.length, suffix ? -suffix.length : undefined);
|
|
180
|
-
if (!value) {
|
|
181
|
-
return null;
|
|
182
|
-
}
|
|
183
|
-
if (spec.name) {
|
|
184
|
-
mapping[spec.name] = value;
|
|
185
|
-
}
|
|
186
|
-
} else if (spec.name) {
|
|
187
|
-
mapping[spec.name] = segment;
|
|
188
|
-
}
|
|
189
|
+
}
|
|
190
|
+
if (!matchSpecSegment(spec, actual[i], mapping)) {
|
|
191
|
+
return null;
|
|
189
192
|
}
|
|
190
193
|
}
|
|
191
194
|
if (wildcardStartIndex === -1) {
|
|
@@ -204,38 +207,13 @@ const escapeRegExp = (s)=>s.replace(/[\\^$.*+?()[\]{}|]/g, '\\$&');
|
|
|
204
207
|
let wildcardEndIndex = -1;
|
|
205
208
|
for(let i = 0; i < pathSpec.length; i++){
|
|
206
209
|
const spec = pathSpec[pathSpec.length - i - 1];
|
|
207
|
-
if (spec.type === '
|
|
208
|
-
if (spec.name !== actual[actual.length - i - 1]) {
|
|
209
|
-
return null;
|
|
210
|
-
}
|
|
211
|
-
} else if (spec.type === 'wildcard') {
|
|
210
|
+
if (spec.type === 'wildcard') {
|
|
212
211
|
wildcardEndIndex = actual.length - i - 1;
|
|
213
212
|
break;
|
|
214
|
-
} else {
|
|
215
|
-
const segment = actual[actual.length - i - 1];
|
|
216
|
-
if (segment === undefined) {
|
|
217
|
-
return null;
|
|
218
|
-
}
|
|
219
|
-
const prefix = spec.prefix ?? '';
|
|
220
|
-
const suffix = spec.suffix ?? '';
|
|
221
|
-
if (prefix || suffix) {
|
|
222
|
-
if (!segment.startsWith(prefix) || !segment.endsWith(suffix || '')) {
|
|
223
|
-
return null;
|
|
224
|
-
}
|
|
225
|
-
const value = segment.slice(prefix.length, suffix ? -suffix.length : undefined);
|
|
226
|
-
if (!value) {
|
|
227
|
-
return null;
|
|
228
|
-
}
|
|
229
|
-
if (spec.name) {
|
|
230
|
-
mapping[spec.name] = value;
|
|
231
|
-
}
|
|
232
|
-
} else if (spec.name) {
|
|
233
|
-
mapping[spec.name] = segment;
|
|
234
|
-
}
|
|
235
213
|
}
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
214
|
+
if (!matchSpecSegment(spec, actual[actual.length - i - 1], mapping)) {
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
239
217
|
}
|
|
240
218
|
const wildcardName = pathSpec[wildcardStartIndex].name;
|
|
241
219
|
if (wildcardName) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/utils/path.ts"],"sourcesContent":["// Terminology:\n// - filePath: posix-like file path, e.g. `/foo/bar.js` or `c:/foo/bar.js`\n// This is used by Vite.\n// - fileURL: file URL, e.g. `file:///foo/bar.js` or `file:///c:/foo/bar.js`\n// This is used by import().\n// - osPath: os dependent path, e.g. `/foo/bar.js` or `c:\\foo\\bar.js`\n// This is used by node:fs.\n\nconst ABSOLUTE_WIN32_PATH_REGEXP = /^\\/[a-zA-Z]:\\//;\n\nexport const encodeFilePathToAbsolute = (filePath: string) => {\n if (ABSOLUTE_WIN32_PATH_REGEXP.test(filePath)) {\n throw new Error('Unsupported absolute file path: ' + filePath);\n }\n if (filePath.startsWith('/')) {\n return filePath;\n }\n return '/' + filePath;\n};\n\nexport const decodeFilePathFromAbsolute = (filePath: string) => {\n if (ABSOLUTE_WIN32_PATH_REGEXP.test(filePath)) {\n return filePath.slice(1);\n }\n return filePath;\n};\n\nexport const filePathToFileURL = (filePath: string) =>\n 'file://' + encodeURI(filePath);\n\nexport const fileURLToFilePath = (fileURL: string) => {\n if (!fileURL.startsWith('file://')) {\n throw new Error('Not a file URL');\n }\n return decodeURI(fileURL.slice('file://'.length));\n};\n\n// for filePath\nexport const joinPath = (...paths: string[]) => {\n const isAbsolute = paths[0]?.startsWith('/');\n const items = ([] as string[]).concat(\n ...paths.map((path) => path.split('/')),\n );\n const stack: string[] = [];\n for (const item of items) {\n if (item === '..') {\n if (stack.length && stack[stack.length - 1] !== '..') {\n stack.pop();\n } else if (!isAbsolute) {\n stack.push('..');\n }\n } else if (item && item !== '.') {\n stack.push(item);\n }\n }\n return (isAbsolute ? '/' : '') + stack.join('/') || '.';\n};\n\nexport const extname = (filePath: string) => {\n const index = filePath.lastIndexOf('.');\n if (index <= 0) {\n return '';\n }\n if (['/', '.'].includes(filePath[index - 1]!)) {\n return '';\n }\n return filePath.slice(index);\n};\n\nexport type PathSpecItem =\n | { type: 'literal'; name: string }\n | { type: 'group'; name?: string; prefix?: string; suffix?: string }\n | { type: 'wildcard'; name?: string };\nexport type PathSpec = readonly PathSpecItem[];\n\nconst SLUG_PATTERN = /^(.*?)\\[([^\\]]+)\\](.*)$/;\n\nexport const parsePathWithSlug = (path: string): PathSpec =>\n path\n .split('/')\n .filter(Boolean)\n .map((name) => {\n const match = SLUG_PATTERN.exec(name);\n if (!match) {\n return { type: 'literal' as const, name };\n }\n const [, prefix, inner, suffix] = match;\n if (inner!.startsWith('...')) {\n return {\n type: 'wildcard' as const,\n name: inner!.slice(3),\n };\n }\n return {\n type: 'group' as const,\n name: inner!,\n ...(prefix ? { prefix } : {}),\n ...(suffix ? { suffix } : {}),\n };\n });\n\nexport const parseExactPath = (path: string): PathSpec =>\n path\n .split('/')\n .filter(Boolean)\n .map((name) => ({ type: 'literal', name }));\n\nconst escapeRegExp = (s: string) => s.replace(/[\\\\^$.*+?()[\\]{}|]/g, '\\\\$&');\n\n/**\n * Transform a path spec to a regular expression.\n */\nexport const path2regexp = (path: PathSpec) => {\n const parts = path.map((item) => {\n if (item.type === 'literal') {\n return escapeRegExp(item.name);\n } else if (item.type === 'group') {\n const prefix = escapeRegExp(item.prefix ?? '');\n const suffix = escapeRegExp(item.suffix ?? '');\n return `${prefix}([^/]+)${suffix}`;\n } else {\n return `(.*)`;\n }\n });\n return `^/${parts.join('/')}$`;\n};\n\n/** Convert a path spec to a string for the path */\nexport const pathSpecAsString = (path: PathSpec) => {\n return (\n '/' +\n path\n .map((item) => {\n if (item.type === 'literal') {\n return item.name;\n } else if (item.type === 'group') {\n const prefix = item.prefix ?? '';\n const suffix = item.suffix ?? '';\n return `${prefix}[${item.name}]${suffix}`;\n } else {\n return `[...${item.name}]`;\n }\n })\n .join('/')\n );\n};\n\n/**\n * Helper function to get the path mapping from the path spec and the pathname.\n *\n * @param pathSpec\n * @param pathname - route as a string\n * @example\n * getPathMapping(\n * [\n * { type: 'literal', name: 'foo' },\n * { type: 'group', name: 'a' },\n * ],\n * '/foo/bar',\n * );\n * // => { a: 'bar' }\n */\nexport const getPathMapping = (\n pathSpec: PathSpec,\n pathname: string,\n): Record<string, string | string[]> | null => {\n const actual = pathname.split('/').filter(Boolean);\n if (pathSpec.length > actual.length) {\n const wildcardIndex = pathSpec.findIndex(\n (spec) => spec.type === 'wildcard',\n );\n if (wildcardIndex === -1) {\n return null;\n }\n const isTerminalWildcard = wildcardIndex === pathSpec.length - 1;\n if (isTerminalWildcard) {\n // Terminal wildcards only pass through with zero actual segments\n // (handled by the root-wildcard special case below)\n if (actual.length > 0) {\n return null;\n }\n } else if (actual.length < pathSpec.length - 1) {\n // Non-terminal wildcards can match zero segments; just need enough\n // actual segments for every non-wildcard spec in the pathSpec\n return null;\n }\n }\n const mapping: Record<string, string | string[]> = {};\n let wildcardStartIndex = -1;\n for (let i = 0; i < pathSpec.length; i++) {\n const spec = pathSpec[i]!;\n if (spec.type === 'literal') {\n if (spec.name !== actual[i]) {\n return null;\n }\n } else if (spec.type === 'wildcard') {\n wildcardStartIndex = i;\n break;\n } else {\n const segment = actual[i];\n if (segment === undefined) {\n return null;\n }\n const prefix = spec.prefix ?? '';\n const suffix = spec.suffix ?? '';\n if (prefix || suffix) {\n if (!segment.startsWith(prefix) || !segment.endsWith(suffix || '')) {\n return null;\n }\n const value = segment.slice(\n prefix.length,\n suffix ? -suffix.length : undefined,\n );\n if (!value) {\n return null;\n }\n if (spec.name) {\n mapping[spec.name] = value;\n }\n } else if (spec.name) {\n mapping[spec.name] = segment;\n }\n }\n }\n if (wildcardStartIndex === -1) {\n if (pathSpec.length !== actual.length) {\n return null;\n }\n return mapping;\n }\n\n if (wildcardStartIndex === 0 && actual.length === 0) {\n const wildcardName = pathSpec[wildcardStartIndex]!.name;\n if (wildcardName) {\n mapping[wildcardName] = [];\n }\n return mapping;\n }\n\n let wildcardEndIndex = -1;\n for (let i = 0; i < pathSpec.length; i++) {\n const spec = pathSpec[pathSpec.length - i - 1]!;\n if (spec.type === 'literal') {\n if (spec.name !== actual[actual.length - i - 1]) {\n return null;\n }\n } else if (spec.type === 'wildcard') {\n wildcardEndIndex = actual.length - i - 1;\n break;\n } else {\n const segment = actual[actual.length - i - 1];\n if (segment === undefined) {\n return null;\n }\n const prefix = spec.prefix ?? '';\n const suffix = spec.suffix ?? '';\n if (prefix || suffix) {\n if (!segment.startsWith(prefix) || !segment.endsWith(suffix || '')) {\n return null;\n }\n const value = segment.slice(\n prefix.length,\n suffix ? -suffix.length : undefined,\n );\n if (!value) {\n return null;\n }\n if (spec.name) {\n mapping[spec.name] = value;\n }\n } else if (spec.name) {\n mapping[spec.name] = segment;\n }\n }\n }\n if (wildcardStartIndex === -1) {\n throw new Error('Invalid wildcard path');\n }\n const wildcardName = pathSpec[wildcardStartIndex]!.name;\n if (wildcardName) {\n mapping[wildcardName] = actual.slice(\n wildcardStartIndex,\n wildcardEndIndex + 1,\n );\n }\n return mapping;\n};\n\n// basePath config is ensured to have trailing slash (see plugin)\nexport function removeBase(url: string, base: string) {\n if (base !== '/') {\n if (!url.startsWith(base)) {\n throw new Error('pathname must start with basePath: ' + url);\n }\n return url.slice(base.length - 1);\n }\n return url;\n}\n\nexport function addBase(url: string, base: string) {\n if (base !== '/' && url.startsWith('/')) {\n return base.slice(0, -1) + url;\n }\n return url;\n}\n\nexport function countSlugsAndWildcards(pathSpec: PathSpec) {\n let numSlugs = 0;\n let numWildcards = 0;\n for (const slug of pathSpec) {\n if (slug.type !== 'literal') {\n numSlugs++;\n }\n if (slug.type === 'wildcard') {\n numWildcards++;\n }\n }\n return { numSlugs, numWildcards };\n}\n"],"names":["ABSOLUTE_WIN32_PATH_REGEXP","encodeFilePathToAbsolute","filePath","test","Error","startsWith","decodeFilePathFromAbsolute","slice","filePathToFileURL","encodeURI","fileURLToFilePath","fileURL","decodeURI","length","joinPath","paths","isAbsolute","items","concat","map","path","split","stack","item","pop","push","join","extname","index","lastIndexOf","includes","SLUG_PATTERN","parsePathWithSlug","filter","Boolean","name","match","exec","type","prefix","inner","suffix","parseExactPath","escapeRegExp","s","replace","path2regexp","parts","pathSpecAsString","getPathMapping","pathSpec","pathname","actual","wildcardIndex","findIndex","spec","isTerminalWildcard","mapping","wildcardStartIndex","i","segment","undefined","endsWith","value","wildcardName","wildcardEndIndex","removeBase","url","base","addBase","countSlugsAndWildcards","numSlugs","numWildcards","slug"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/utils/path.ts"],"sourcesContent":["// Terminology:\n// - filePath: posix-like file path, e.g. `/foo/bar.js` or `c:/foo/bar.js`\n// This is used by Vite.\n// - fileURL: file URL, e.g. `file:///foo/bar.js` or `file:///c:/foo/bar.js`\n// This is used by import().\n// - osPath: os dependent path, e.g. `/foo/bar.js` or `c:\\foo\\bar.js`\n// This is used by node:fs.\n\nconst ABSOLUTE_WIN32_PATH_REGEXP = /^\\/[a-zA-Z]:\\//;\n\nexport const encodeFilePathToAbsolute = (filePath: string) => {\n if (ABSOLUTE_WIN32_PATH_REGEXP.test(filePath)) {\n throw new Error('Unsupported absolute file path: ' + filePath);\n }\n if (filePath.startsWith('/')) {\n return filePath;\n }\n return '/' + filePath;\n};\n\nexport const decodeFilePathFromAbsolute = (filePath: string) => {\n if (ABSOLUTE_WIN32_PATH_REGEXP.test(filePath)) {\n return filePath.slice(1);\n }\n return filePath;\n};\n\nexport const filePathToFileURL = (filePath: string) =>\n 'file://' + encodeURI(filePath);\n\nexport const fileURLToFilePath = (fileURL: string) => {\n if (!fileURL.startsWith('file://')) {\n throw new Error('Not a file URL');\n }\n return decodeURI(fileURL.slice('file://'.length));\n};\n\n// for filePath\nexport const joinPath = (...paths: string[]) => {\n const isAbsolute = paths[0]?.startsWith('/');\n const items = ([] as string[]).concat(\n ...paths.map((path) => path.split('/')),\n );\n const stack: string[] = [];\n for (const item of items) {\n if (item === '..') {\n if (stack.length && stack[stack.length - 1] !== '..') {\n stack.pop();\n } else if (!isAbsolute) {\n stack.push('..');\n }\n } else if (item && item !== '.') {\n stack.push(item);\n }\n }\n return (isAbsolute ? '/' : '') + stack.join('/') || '.';\n};\n\nexport const extname = (filePath: string) => {\n const index = filePath.lastIndexOf('.');\n if (index <= 0) {\n return '';\n }\n if (['/', '.'].includes(filePath[index - 1]!)) {\n return '';\n }\n return filePath.slice(index);\n};\n\nexport type PathSpecItem =\n | { type: 'literal'; name: string }\n | { type: 'group'; name?: string; prefix?: string; suffix?: string }\n | { type: 'wildcard'; name?: string };\nexport type PathSpec = readonly PathSpecItem[];\n\nconst SLUG_PATTERN = /^(.*?)\\[([^\\]]+)\\](.*)$/;\n\nexport const parsePathWithSlug = (path: string): PathSpec =>\n path\n .split('/')\n .filter(Boolean)\n .map((name) => {\n const match = SLUG_PATTERN.exec(name);\n if (!match) {\n return { type: 'literal' as const, name };\n }\n const [, prefix, inner, suffix] = match;\n if (inner!.startsWith('...')) {\n return {\n type: 'wildcard' as const,\n name: inner!.slice(3),\n };\n }\n return {\n type: 'group' as const,\n name: inner!,\n ...(prefix ? { prefix } : {}),\n ...(suffix ? { suffix } : {}),\n };\n });\n\nexport const parseExactPath = (path: string): PathSpec =>\n path\n .split('/')\n .filter(Boolean)\n .map((name) => ({ type: 'literal', name }));\n\nconst escapeRegExp = (s: string) => s.replace(/[\\\\^$.*+?()[\\]{}|]/g, '\\\\$&');\n\n/**\n * Transform a path spec to a regular expression.\n */\nexport const path2regexp = (path: PathSpec) => {\n const parts = path.map((item) => {\n if (item.type === 'literal') {\n return escapeRegExp(item.name);\n } else if (item.type === 'group') {\n const prefix = escapeRegExp(item.prefix ?? '');\n const suffix = escapeRegExp(item.suffix ?? '');\n return `${prefix}([^/]+)${suffix}`;\n } else {\n return `(.*)`;\n }\n });\n return `^/${parts.join('/')}$`;\n};\n\n/** Convert a path spec to a string for the path */\nexport const pathSpecAsString = (path: PathSpec) => {\n return (\n '/' +\n path\n .map((item) => {\n if (item.type === 'literal') {\n return item.name;\n } else if (item.type === 'group') {\n const prefix = item.prefix ?? '';\n const suffix = item.suffix ?? '';\n return `${prefix}[${item.name}]${suffix}`;\n } else {\n return `[...${item.name}]`;\n }\n })\n .join('/')\n );\n};\n\nconst matchSpecSegment = (\n spec: Exclude<PathSpecItem, { type: 'wildcard' }>,\n segment: string | undefined,\n mapping: Record<string, string | string[]>,\n): boolean => {\n if (spec.type === 'literal') {\n return spec.name === segment;\n }\n if (segment === undefined) {\n return false;\n }\n const prefix = spec.prefix ?? '';\n const suffix = spec.suffix ?? '';\n if (prefix || suffix) {\n if (!segment.startsWith(prefix) || !segment.endsWith(suffix)) {\n return false;\n }\n const value = segment.slice(\n prefix.length,\n suffix ? -suffix.length : undefined,\n );\n if (!value) {\n return false;\n }\n if (spec.name) {\n mapping[spec.name] = value;\n }\n } else if (spec.name) {\n mapping[spec.name] = segment;\n }\n return true;\n};\n\n/**\n * Helper function to get the path mapping from the path spec and the pathname.\n *\n * @param pathSpec\n * @param pathname - route as a string\n * @example\n * getPathMapping(\n * [\n * { type: 'literal', name: 'foo' },\n * { type: 'group', name: 'a' },\n * ],\n * '/foo/bar',\n * );\n * // => { a: 'bar' }\n */\nexport const getPathMapping = (\n pathSpec: PathSpec,\n pathname: string,\n): Record<string, string | string[]> | null => {\n const actual = pathname.split('/').filter(Boolean);\n if (pathSpec.length > actual.length) {\n const wildcardIndex = pathSpec.findIndex(\n (spec) => spec.type === 'wildcard',\n );\n if (wildcardIndex === -1) {\n return null;\n }\n const isTerminalWildcard = wildcardIndex === pathSpec.length - 1;\n if (isTerminalWildcard) {\n // Terminal wildcards only pass through with zero actual segments\n // (handled by the root-wildcard special case below)\n if (actual.length > 0) {\n return null;\n }\n } else if (actual.length < pathSpec.length - 1) {\n // Non-terminal wildcards can match zero segments; just need enough\n // actual segments for every non-wildcard spec in the pathSpec\n return null;\n }\n }\n const mapping: Record<string, string | string[]> = {};\n let wildcardStartIndex = -1;\n for (let i = 0; i < pathSpec.length; i++) {\n const spec = pathSpec[i]!;\n if (spec.type === 'wildcard') {\n wildcardStartIndex = i;\n break;\n }\n if (!matchSpecSegment(spec, actual[i], mapping)) {\n return null;\n }\n }\n if (wildcardStartIndex === -1) {\n if (pathSpec.length !== actual.length) {\n return null;\n }\n return mapping;\n }\n\n if (wildcardStartIndex === 0 && actual.length === 0) {\n const wildcardName = pathSpec[wildcardStartIndex]!.name;\n if (wildcardName) {\n mapping[wildcardName] = [];\n }\n return mapping;\n }\n\n let wildcardEndIndex = -1;\n for (let i = 0; i < pathSpec.length; i++) {\n const spec = pathSpec[pathSpec.length - i - 1]!;\n if (spec.type === 'wildcard') {\n wildcardEndIndex = actual.length - i - 1;\n break;\n }\n if (!matchSpecSegment(spec, actual[actual.length - i - 1], mapping)) {\n return null;\n }\n }\n const wildcardName = pathSpec[wildcardStartIndex]!.name;\n if (wildcardName) {\n mapping[wildcardName] = actual.slice(\n wildcardStartIndex,\n wildcardEndIndex + 1,\n );\n }\n return mapping;\n};\n\n// basePath config is ensured to have trailing slash (see plugin)\nexport function removeBase(url: string, base: string) {\n if (base !== '/') {\n if (!url.startsWith(base)) {\n throw new Error('pathname must start with basePath: ' + url);\n }\n return url.slice(base.length - 1);\n }\n return url;\n}\n\nexport function addBase(url: string, base: string) {\n if (base !== '/' && url.startsWith('/')) {\n return base.slice(0, -1) + url;\n }\n return url;\n}\n\nexport function countSlugsAndWildcards(pathSpec: PathSpec) {\n let numSlugs = 0;\n let numWildcards = 0;\n for (const slug of pathSpec) {\n if (slug.type !== 'literal') {\n numSlugs++;\n }\n if (slug.type === 'wildcard') {\n numWildcards++;\n }\n }\n return { numSlugs, numWildcards };\n}\n"],"names":["ABSOLUTE_WIN32_PATH_REGEXP","encodeFilePathToAbsolute","filePath","test","Error","startsWith","decodeFilePathFromAbsolute","slice","filePathToFileURL","encodeURI","fileURLToFilePath","fileURL","decodeURI","length","joinPath","paths","isAbsolute","items","concat","map","path","split","stack","item","pop","push","join","extname","index","lastIndexOf","includes","SLUG_PATTERN","parsePathWithSlug","filter","Boolean","name","match","exec","type","prefix","inner","suffix","parseExactPath","escapeRegExp","s","replace","path2regexp","parts","pathSpecAsString","matchSpecSegment","spec","segment","mapping","undefined","endsWith","value","getPathMapping","pathSpec","pathname","actual","wildcardIndex","findIndex","isTerminalWildcard","wildcardStartIndex","i","wildcardName","wildcardEndIndex","removeBase","url","base","addBase","countSlugsAndWildcards","numSlugs","numWildcards","slug"],"mappings":"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"}
|
|
@@ -2,13 +2,14 @@
|
|
|
2
2
|
export declare const PREFETCH_TTL: number;
|
|
3
3
|
/** Maximum number of prefetched entries kept at once. */
|
|
4
4
|
export declare const PREFETCH_LIMIT = 100;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
export type PrefetchEntry = {
|
|
6
|
+
rscPath: string;
|
|
7
|
+
rscParams: unknown;
|
|
8
|
+
elements: unknown;
|
|
9
|
+
expireAt: number;
|
|
10
|
+
};
|
|
11
|
+
/** Decode and cache a prefetch so a later navigation can reuse the tree. */
|
|
12
|
+
export declare const addPrefetchEntry: <Elements>(rscPath: string, rscParams: unknown, elements: Elements) => void;
|
|
10
13
|
export declare const hasPrefetchEntry: (rscPath: string, rscParams: unknown) => boolean;
|
|
11
|
-
/**
|
|
12
|
-
|
|
13
|
-
*/
|
|
14
|
-
export declare const consumePrefetchEntry: <Store, Elements>(rscPath: string, rscParams: unknown, store: Store) => Elements | undefined;
|
|
14
|
+
/** Consume a fresh prefetch, returning its eagerly decoded tree. */
|
|
15
|
+
export declare const consumePrefetchEntry: <Elements>(rscPath: string, rscParams: unknown) => Elements | undefined;
|