waku 1.0.0-beta.2 → 1.0.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/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 +6 -0
- 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/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 +3 -3
- package/dist/router/client.d.ts +22 -8
- package/dist/router/client.js +104 -85
- package/dist/router/client.js.map +1 -1
- package/dist/router/common.d.ts +1 -0
- package/dist/router/common.js +1 -0
- package/dist/router/common.js.map +1 -1
- package/dist/router/create-pages.d.ts +50 -2
- package/dist/router/create-pages.js +75 -60
- 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 +5 -2
|
@@ -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,6 +2,12 @@
|
|
|
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
|
+
export type PrefetchEntry = {
|
|
6
|
+
rscPath: string;
|
|
7
|
+
rscParams: unknown;
|
|
8
|
+
getElements: (store: never) => unknown;
|
|
9
|
+
expireAt: number;
|
|
10
|
+
};
|
|
5
11
|
/**
|
|
6
12
|
* Decode and cache a prefetch. `getStore` returns the entry's currently bound
|
|
7
13
|
* store: the prefetch's now, the navigation's after `consumePrefetchEntry`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/utils/prefetch-cache.ts"],"sourcesContent":["// Client-side cache of prefetched navigations: a prefetch decodes the route\n// eagerly so a later navigation reuses it without re-fetching. Each entry keeps\n// a mutable store so the decoded tree's server actions bind to the consuming\n// navigation's store, not the prefetch's. Bounded by a ttl and a max size.\n\n/** How long (ms) a prefetched entry stays usable before it is discarded. */\nexport const PREFETCH_TTL = 1000 * 60;\n\n/** Maximum number of prefetched entries kept at once. */\nexport const PREFETCH_LIMIT = 100;\n\
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/utils/prefetch-cache.ts"],"sourcesContent":["// Client-side cache of prefetched navigations: a prefetch decodes the route\n// eagerly so a later navigation reuses it without re-fetching. Each entry keeps\n// a mutable store so the decoded tree's server actions bind to the consuming\n// navigation's store, not the prefetch's. Bounded by a ttl and a max size.\n\n/** How long (ms) a prefetched entry stays usable before it is discarded. */\nexport const PREFETCH_TTL = 1000 * 60;\n\n/** Maximum number of prefetched entries kept at once. */\nexport const PREFETCH_LIMIT = 100;\n\n// This is exported only for global-types.ts. It is not a public API.\nexport type PrefetchEntry = {\n rscPath: string;\n rscParams: unknown;\n getElements: (store: never) => unknown;\n expireAt: number;\n};\n\nconst getCache = (): PrefetchEntry[] => (globalThis.__WAKU_PREFETCHED__ ||= []);\n\nconst findFreshIndex = (\n cache: PrefetchEntry[],\n rscPath: string,\n rscParams: unknown,\n now: number,\n) =>\n cache.findIndex(\n (entry) =>\n entry.expireAt > now &&\n entry.rscPath === rscPath &&\n // rscParams is intentionally compared by reference.\n entry.rscParams === rscParams,\n );\n\n/**\n * Decode and cache a prefetch. `getStore` returns the entry's currently bound\n * store: the prefetch's now, the navigation's after `consumePrefetchEntry`.\n */\nexport const addPrefetchEntry = <Store, Elements>(\n rscPath: string,\n rscParams: unknown,\n store: Store,\n decode: (getStore: () => Store) => Elements,\n): void => {\n const cache = getCache();\n const now = Date.now();\n let currentStore = store;\n const elements = decode(() => currentStore);\n // Mark as handled so a prefetch that is never consumed stays quiet.\n Promise.resolve(elements).catch(() => {});\n const getElements = (nextStore: Store): Elements => {\n currentStore = nextStore;\n return elements;\n };\n cache.push({ rscPath, rscParams, getElements, expireAt: now + PREFETCH_TTL });\n while (\n cache.length > 0 &&\n (cache.length > PREFETCH_LIMIT || cache[0]!.expireAt <= now)\n ) {\n cache.shift();\n }\n};\n\nexport const hasPrefetchEntry = (\n rscPath: string,\n rscParams: unknown,\n): boolean => {\n const cache = getCache();\n return findFreshIndex(cache, rscPath, rscParams, Date.now()) >= 0;\n};\n\n/**\n * Consume a fresh prefetch, rebinding its decoded tree to the consumer's store.\n */\nexport const consumePrefetchEntry = <Store, Elements>(\n rscPath: string,\n rscParams: unknown,\n store: Store,\n): Elements | undefined => {\n const cache = getCache();\n const index = findFreshIndex(cache, rscPath, rscParams, Date.now());\n if (index < 0) {\n return undefined;\n }\n const { getElements } = cache.splice(index, 1)[0]!;\n return (getElements as (s: Store) => Elements)(store);\n};\n"],"names":["PREFETCH_TTL","PREFETCH_LIMIT","getCache","globalThis","__WAKU_PREFETCHED__","findFreshIndex","cache","rscPath","rscParams","now","findIndex","entry","expireAt","addPrefetchEntry","store","decode","Date","currentStore","elements","Promise","resolve","catch","getElements","nextStore","push","length","shift","hasPrefetchEntry","consumePrefetchEntry","index","undefined","splice"],"mappings":"AAAA,4EAA4E;AAC5E,gFAAgF;AAChF,6EAA6E;AAC7E,2EAA2E;AAE3E,0EAA0E,GAC1E,OAAO,MAAMA,eAAe,OAAO,GAAG;AAEtC,uDAAuD,GACvD,OAAO,MAAMC,iBAAiB,IAAI;AAUlC,MAAMC,WAAW,IAAwBC,WAAWC,mBAAmB,KAAK,EAAE;AAE9E,MAAMC,iBAAiB,CACrBC,OACAC,SACAC,WACAC,MAEAH,MAAMI,SAAS,CACb,CAACC,QACCA,MAAMC,QAAQ,GAAGH,OACjBE,MAAMJ,OAAO,KAAKA,WAClB,oDAAoD;QACpDI,MAAMH,SAAS,KAAKA;AAG1B;;;CAGC,GACD,OAAO,MAAMK,mBAAmB,CAC9BN,SACAC,WACAM,OACAC;IAEA,MAAMT,QAAQJ;IACd,MAAMO,MAAMO,KAAKP,GAAG;IACpB,IAAIQ,eAAeH;IACnB,MAAMI,WAAWH,OAAO,IAAME;IAC9B,oEAAoE;IACpEE,QAAQC,OAAO,CAACF,UAAUG,KAAK,CAAC,KAAO;IACvC,MAAMC,cAAc,CAACC;QACnBN,eAAeM;QACf,OAAOL;IACT;IACAZ,MAAMkB,IAAI,CAAC;QAAEjB;QAASC;QAAWc;QAAaV,UAAUH,MAAMT;IAAa;IAC3E,MACEM,MAAMmB,MAAM,GAAG,KACdnB,CAAAA,MAAMmB,MAAM,GAAGxB,kBAAkBK,KAAK,CAAC,EAAE,CAAEM,QAAQ,IAAIH,GAAE,EAC1D;QACAH,MAAMoB,KAAK;IACb;AACF,EAAE;AAEF,OAAO,MAAMC,mBAAmB,CAC9BpB,SACAC;IAEA,MAAMF,QAAQJ;IACd,OAAOG,eAAeC,OAAOC,SAASC,WAAWQ,KAAKP,GAAG,OAAO;AAClE,EAAE;AAEF;;CAEC,GACD,OAAO,MAAMmB,uBAAuB,CAClCrB,SACAC,WACAM;IAEA,MAAMR,QAAQJ;IACd,MAAM2B,QAAQxB,eAAeC,OAAOC,SAASC,WAAWQ,KAAKP,GAAG;IAChE,IAAIoB,QAAQ,GAAG;QACb,OAAOC;IACT;IACA,MAAM,EAAER,WAAW,EAAE,GAAGhB,MAAMyB,MAAM,CAACF,OAAO,EAAE,CAAC,EAAE;IACjD,OAAO,AAACP,YAAuCR;AACjD,EAAE"}
|
|
@@ -1,15 +1,8 @@
|
|
|
1
1
|
// This file should not include Node specific code.
|
|
2
|
+
import { base64ToBytes, bytesToBase64 } from './base64-web.js';
|
|
2
3
|
export const DEBUG_ID_HEADER = 'X-Waku-Debug-Id';
|
|
3
4
|
export const DEBUG_CMD_EVENT = 'waku:debug-cmd';
|
|
4
5
|
export const DEBUG_DATA_EVENT = 'waku:debug-data';
|
|
5
|
-
const bytesToBase64 = (bytes)=>{
|
|
6
|
-
let binary = '';
|
|
7
|
-
for(let i = 0; i < bytes.length; i++){
|
|
8
|
-
binary += String.fromCharCode(bytes[i]);
|
|
9
|
-
}
|
|
10
|
-
return btoa(binary);
|
|
11
|
-
};
|
|
12
|
-
const base64ToBytes = (base64)=>Uint8Array.from(atob(base64), (char)=>char.charCodeAt(0));
|
|
13
6
|
export function assertIsDebugEventPayload(payload) {
|
|
14
7
|
if (!payload || typeof payload !== 'object' || typeof payload.i !== 'string' || 'b' in payload && typeof payload.b !== 'string' || 'd' in payload && payload.d !== true) {
|
|
15
8
|
throw new Error('Invalid debug event payload');
|