@reckona/mreact-router 0.0.137 → 0.0.139
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 +1 -1
- package/dist/actions.d.ts +1 -0
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +32 -12
- package/dist/actions.js.map +1 -1
- package/dist/adapters/static.js +10 -4
- package/dist/adapters/static.js.map +1 -1
- package/dist/build.d.ts.map +1 -1
- package/dist/build.js +28 -21
- package/dist/build.js.map +1 -1
- package/dist/cache.d.ts +2 -0
- package/dist/cache.d.ts.map +1 -1
- package/dist/cache.js +23 -1
- package/dist/cache.js.map +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +49 -12
- package/dist/client.js.map +1 -1
- package/dist/dev-server.d.ts +1 -0
- package/dist/dev-server.d.ts.map +1 -1
- package/dist/dev-server.js +6 -4
- package/dist/dev-server.js.map +1 -1
- package/dist/link.js +17 -3
- package/dist/link.js.map +1 -1
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +10 -7
- package/dist/middleware.js.map +1 -1
- package/dist/multipart.d.ts +5 -0
- package/dist/multipart.d.ts.map +1 -1
- package/dist/multipart.js +24 -1
- package/dist/multipart.js.map +1 -1
- package/dist/native-route-matcher.d.ts +9 -0
- package/dist/native-route-matcher.d.ts.map +1 -1
- package/dist/native-route-matcher.js +23 -11
- package/dist/native-route-matcher.js.map +1 -1
- package/dist/navigation.d.ts.map +1 -1
- package/dist/navigation.js +8 -1
- package/dist/navigation.js.map +1 -1
- package/dist/render.d.ts +5 -1
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +239 -95
- package/dist/render.js.map +1 -1
- package/dist/route-source.d.ts +3 -1
- package/dist/route-source.d.ts.map +1 -1
- package/dist/route-source.js +13 -11
- package/dist/route-source.js.map +1 -1
- package/dist/route-styles.d.ts +4 -0
- package/dist/route-styles.d.ts.map +1 -1
- package/dist/route-styles.js +15 -3
- package/dist/route-styles.js.map +1 -1
- package/dist/serve.d.ts.map +1 -1
- package/dist/serve.js +39 -9
- package/dist/serve.js.map +1 -1
- package/dist/server-action-inference.d.ts.map +1 -1
- package/dist/server-action-inference.js +57 -0
- package/dist/server-action-inference.js.map +1 -1
- package/dist/vite.d.ts.map +1 -1
- package/dist/vite.js +47 -11
- package/dist/vite.js.map +1 -1
- package/package.json +11 -11
- package/src/actions.ts +44 -10
- package/src/adapters/static.ts +11 -4
- package/src/build.ts +28 -17
- package/src/cache.ts +33 -1
- package/src/client.ts +49 -12
- package/src/dev-server.ts +11 -4
- package/src/link.ts +24 -3
- package/src/middleware.ts +12 -7
- package/src/multipart.ts +32 -1
- package/src/native-route-matcher.ts +34 -13
- package/src/navigation.ts +11 -2
- package/src/render.ts +321 -113
- package/src/route-source.ts +14 -10
- package/src/route-styles.ts +28 -3
- package/src/serve.ts +68 -15
- package/src/server-action-inference.ts +86 -0
- package/src/vite.ts +59 -12
package/dist/dev-server.d.ts
CHANGED
|
@@ -13,6 +13,7 @@ export interface StartDevServerOptions extends AppRouterProjectOptions {
|
|
|
13
13
|
logger?: AppRouterLogger | undefined;
|
|
14
14
|
routeCache?: AppRouterCache | undefined;
|
|
15
15
|
serverActions?: AppRouterServerActionOptions | undefined;
|
|
16
|
+
verboseErrors?: boolean | undefined;
|
|
16
17
|
viteConfig?: UserConfig | undefined;
|
|
17
18
|
onUpgrade?: HttpUpgradeHandler | undefined;
|
|
18
19
|
}
|
package/dist/dev-server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-server.d.ts","sourceRoot":"","sources":["../src/dev-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AAItD,OAAO,EAAoC,KAAK,UAAU,EAAsB,MAAM,MAAM,CAAC;AAC7F,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAA0B,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AACzE,OAAO,EAAkC,KAAK,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAC3F,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAMhE,OAAO,EAKL,KAAK,eAAe,EACrB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEvD,MAAM,WAAW,qBAAsB,SAAQ,uBAAuB;IACpE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;IACjD,MAAM,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IACrC,UAAU,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;IACxC,aAAa,CAAC,EAAE,4BAA4B,GAAG,SAAS,CAAC;IACzD,UAAU,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IACpC,SAAS,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC;CAC5C;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC;IAAE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAuHlE"}
|
|
1
|
+
{"version":3,"file":"dev-server.d.ts","sourceRoot":"","sources":["../src/dev-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AAItD,OAAO,EAAoC,KAAK,UAAU,EAAsB,MAAM,MAAM,CAAC;AAC7F,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAA0B,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AACzE,OAAO,EAAkC,KAAK,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAC3F,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAMhE,OAAO,EAKL,KAAK,eAAe,EACrB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEvD,MAAM,WAAW,qBAAsB,SAAQ,uBAAuB;IACpE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;IACjD,MAAM,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IACrC,UAAU,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;IACxC,aAAa,CAAC,EAAE,4BAA4B,GAAG,SAAS,CAAC;IACzD,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACpC,UAAU,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IACpC,SAAS,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC;CAC5C;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC;IAAE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAuHlE"}
|
package/dist/dev-server.js
CHANGED
|
@@ -55,7 +55,7 @@ export async function startDevServer(options) {
|
|
|
55
55
|
});
|
|
56
56
|
}
|
|
57
57
|
if (vite === undefined) {
|
|
58
|
-
sendDevServerError(outgoing, new Error("Vite dev server is not initialized."));
|
|
58
|
+
sendDevServerError(outgoing, new Error("Vite dev server is not initialized."), options);
|
|
59
59
|
return;
|
|
60
60
|
}
|
|
61
61
|
vite.middlewares(incoming, outgoing, (error) => {
|
|
@@ -63,7 +63,7 @@ export async function startDevServer(options) {
|
|
|
63
63
|
if (error instanceof Error) {
|
|
64
64
|
vite?.ssrFixStacktrace(error);
|
|
65
65
|
}
|
|
66
|
-
sendDevServerError(outgoing, error);
|
|
66
|
+
sendDevServerError(outgoing, error, options);
|
|
67
67
|
return;
|
|
68
68
|
}
|
|
69
69
|
outgoing.statusCode = 404;
|
|
@@ -198,9 +198,11 @@ function definedProjectOptions(options) {
|
|
|
198
198
|
...(options.routesDir === undefined ? {} : { routesDir: options.routesDir }),
|
|
199
199
|
};
|
|
200
200
|
}
|
|
201
|
-
function sendDevServerError(outgoing, error) {
|
|
201
|
+
function sendDevServerError(outgoing, error, options) {
|
|
202
202
|
outgoing.statusCode = 500;
|
|
203
203
|
outgoing.setHeader("content-type", "text/plain; charset=utf-8");
|
|
204
|
-
outgoing.end(
|
|
204
|
+
outgoing.end(options.verboseErrors === true
|
|
205
|
+
? error instanceof Error ? error.stack : String(error)
|
|
206
|
+
: "Internal Server Error");
|
|
205
207
|
}
|
|
206
208
|
//# sourceMappingURL=dev-server.js.map
|
package/dist/dev-server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-server.js","sourceRoot":"","sources":["../src/dev-server.ts"],"names":[],"mappings":"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","sourcesContent":["import { createServer, type Server } from \"node:http\";\nimport type { ServerResponse } from \"node:http\";\nimport { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { createServer as createViteServer, type UserConfig, type ViteDevServer } from \"vite\";\nimport type { AppRouterServerActionOptions } from \"./actions.js\";\nimport { createMemoryRouteCache, type AppRouterCache } from \"./cache.js\";\nimport { resolveAppRouterProjectOptions, type AppRouterProjectOptions } from \"./config.js\";\nimport type { AppRouterImportPolicy } from \"./import-policy.js\";\nimport { createAppRouterVitePlugin } from \"./vite.js\";\nimport {\n loadMreactRouterViteConfigDetails,\n type LoadedMreactRouterViteConfig,\n} from \"./vite-config.js\";\nimport {\n emitRouterLog,\n logDurationMs,\n logNow,\n nodeRequestPath,\n type AppRouterLogger,\n} from \"./logger.js\";\nimport type { HttpUpgradeHandler } from \"./upgrade.js\";\n\nexport interface StartDevServerOptions extends AppRouterProjectOptions {\n port?: number | undefined;\n hostname?: string;\n importPolicy?: AppRouterImportPolicy | undefined;\n logger?: AppRouterLogger | undefined;\n routeCache?: AppRouterCache | undefined;\n serverActions?: AppRouterServerActionOptions | undefined;\n viteConfig?: UserConfig | undefined;\n onUpgrade?: HttpUpgradeHandler | undefined;\n}\n\nexport async function startDevServer(\n options: StartDevServerOptions,\n): Promise<{ close(): Promise<void>; server: Server; url: string }> {\n const hostname = options.hostname ?? \"127.0.0.1\";\n const resolved = await resolveStartDevServerProject(options);\n const project = resolved.project;\n const userViteConfig = options.viteConfig ?? resolved.viteConfig ?? {};\n const userViteServerConfig =\n typeof userViteConfig.server === \"object\" ? userViteConfig.server : {};\n const userHmrConfig =\n typeof userViteServerConfig.hmr === \"object\" ? userViteServerConfig.hmr : {};\n const port = options.port ?? resolved.serverPort ?? 3001;\n const routeCache = options.routeCache ?? createMemoryRouteCache();\n const declaredPackages = await readDeclaredProjectPackages(project.projectRoot);\n const configImportPolicy = resolved.importPolicy;\n const importPolicy: AppRouterImportPolicy = {\n ...configImportPolicy,\n ...options.importPolicy,\n allowedPackages: [\n ...new Set([\n ...declaredPackages,\n ...(configImportPolicy?.allowedPackages ?? []),\n ...(options.importPolicy?.allowedPackages ?? []),\n ]),\n ],\n };\n let vite: ViteDevServer | undefined;\n const server = createServer((incoming, outgoing) => {\n const logger = options.logger;\n const startedAt = logger === undefined ? undefined : logNow();\n const logFields =\n logger === undefined\n ? undefined\n : {\n method: incoming.method ?? \"GET\",\n path: nodeRequestPath(incoming.url),\n runtime: \"node\" as const,\n };\n\n if (logger !== undefined && logFields !== undefined && startedAt !== undefined) {\n emitRouterLog(logger, \"info\", {\n ...logFields,\n type: \"router:request:start\",\n });\n outgoing.once(\"finish\", () => {\n emitRouterLog(logger, \"info\", {\n ...logFields,\n durationMs: logDurationMs(startedAt),\n status: outgoing.statusCode,\n type: \"router:request:end\",\n });\n });\n }\n\n if (vite === undefined) {\n sendDevServerError(outgoing, new Error(\"Vite dev server is not initialized.\"));\n return;\n }\n\n vite.middlewares(incoming, outgoing, (error?: unknown) => {\n if (error !== undefined) {\n if (error instanceof Error) {\n vite?.ssrFixStacktrace(error);\n }\n sendDevServerError(outgoing, error);\n return;\n }\n\n outgoing.statusCode = 404;\n outgoing.setHeader(\"content-type\", \"text/plain; charset=utf-8\");\n outgoing.end(\"Not Found\");\n });\n });\n\n if (options.onUpgrade !== undefined) {\n server.on(\"upgrade\", options.onUpgrade);\n }\n\n vite = await createViteServer({\n ...userViteConfig,\n appType: \"custom\",\n configFile: false,\n root: project.projectRoot,\n server: {\n ...userViteServerConfig,\n hmr: { ...userHmrConfig, server },\n middlewareMode: true,\n },\n plugins: [\n ...(userViteConfig.plugins ?? []),\n createAppRouterVitePlugin({\n allowedSourceDirs: project.allowedSourceDirs,\n projectRoot: project.projectRoot,\n publicDir: project.publicDir,\n routesDir: project.routesDir,\n importPolicy,\n routeCache,\n serverActions: options.serverActions,\n }),\n ],\n });\n\n try {\n await listenDevHttpServer(server, port, hostname);\n } catch (error) {\n await vite.close();\n throw error;\n }\n const address = server.address();\n const actualPort = typeof address === \"object\" && address !== null ? address.port : port;\n\n return {\n server,\n url: `http://${hostname}:${actualPort}`,\n close: async () => {\n await vite?.close();\n await new Promise<void>((resolve, reject) => {\n server.close((error) => (error ? reject(error) : resolve()));\n });\n },\n };\n}\n\nfunction listenDevHttpServer(server: Server, port: number, hostname: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const onError = (error: Error) => {\n server.off(\"listening\", onListening);\n reject(formatDevListenError(error, hostname, port));\n };\n const onListening = () => {\n server.off(\"error\", onError);\n resolve();\n };\n\n server.once(\"error\", onError);\n server.once(\"listening\", onListening);\n server.listen(port, hostname);\n });\n}\n\nfunction formatDevListenError(error: Error, hostname: string, port: number): Error {\n if (isNodeErrorCode(error, \"EADDRINUSE\")) {\n return new Error(\n `mreact dev server could not start because ${hostname}:${port} is already in use. Stop the process using that port or run with PORT=<free-port>.`,\n );\n }\n\n return error;\n}\n\nfunction isNodeErrorCode(error: unknown, code: string): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code?: unknown }).code === code\n );\n}\n\nasync function resolveStartDevServerProject(options: StartDevServerOptions): Promise<{\n project: ReturnType<typeof resolveAppRouterProjectOptions>;\n serverPort?: number | undefined;\n importPolicy?: LoadedMreactRouterViteConfig[\"importPolicy\"];\n viteConfig?: LoadedMreactRouterViteConfig[\"viteConfig\"];\n}> {\n if (options.appDir !== undefined || options.routesDir !== undefined) {\n return { project: resolveAppRouterProjectOptions(options) };\n }\n\n const config = await loadOptionalMreactRouterViteConfig(\n resolve(options.projectRoot ?? process.cwd()),\n );\n\n return {\n ...(config?.importPolicy === undefined ? {} : { importPolicy: config.importPolicy }),\n project: resolveAppRouterProjectOptions({\n ...config?.project,\n ...definedProjectOptions(options),\n }),\n serverPort: config?.serverPort,\n viteConfig: config?.viteConfig,\n };\n}\n\nasync function loadOptionalMreactRouterViteConfig(cwd: string) {\n try {\n return await loadMreactRouterViteConfigDetails({\n command: \"serve\",\n cwd,\n });\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"vite.config.ts is required\")) {\n return undefined;\n }\n\n throw error;\n }\n}\n\nasync function readDeclaredProjectPackages(projectRoot: string): Promise<string[]> {\n try {\n const json = JSON.parse(await readFile(resolve(projectRoot, \"package.json\"), \"utf8\")) as {\n dependencies?: Record<string, unknown> | undefined;\n devDependencies?: Record<string, unknown> | undefined;\n optionalDependencies?: Record<string, unknown> | undefined;\n peerDependencies?: Record<string, unknown> | undefined;\n };\n\n return [\n ...Object.keys(json.dependencies ?? {}),\n ...Object.keys(json.devDependencies ?? {}),\n ...Object.keys(json.optionalDependencies ?? {}),\n ...Object.keys(json.peerDependencies ?? {}),\n ];\n } catch {\n return [];\n }\n}\n\nfunction definedProjectOptions(options: StartDevServerOptions): AppRouterProjectOptions {\n return {\n ...(options.allowedSourceDirs === undefined\n ? {}\n : { allowedSourceDirs: options.allowedSourceDirs }),\n ...(options.appDir === undefined ? {} : { appDir: options.appDir }),\n ...(options.projectRoot === undefined ? {} : { projectRoot: options.projectRoot }),\n ...(options.publicDir === undefined ? {} : { publicDir: options.publicDir }),\n ...(options.routesDir === undefined ? {} : { routesDir: options.routesDir }),\n };\n}\n\nfunction sendDevServerError(outgoing: ServerResponse, error: unknown): void {\n outgoing.statusCode = 500;\n outgoing.setHeader(\"content-type\", \"text/plain; charset=utf-8\");\n outgoing.end(error instanceof Error ? error.stack : String(error));\n}\n"]}
|
|
1
|
+
{"version":3,"file":"dev-server.js","sourceRoot":"","sources":["../src/dev-server.ts"],"names":[],"mappings":"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","sourcesContent":["import { createServer, type Server } from \"node:http\";\nimport type { ServerResponse } from \"node:http\";\nimport { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { createServer as createViteServer, type UserConfig, type ViteDevServer } from \"vite\";\nimport type { AppRouterServerActionOptions } from \"./actions.js\";\nimport { createMemoryRouteCache, type AppRouterCache } from \"./cache.js\";\nimport { resolveAppRouterProjectOptions, type AppRouterProjectOptions } from \"./config.js\";\nimport type { AppRouterImportPolicy } from \"./import-policy.js\";\nimport { createAppRouterVitePlugin } from \"./vite.js\";\nimport {\n loadMreactRouterViteConfigDetails,\n type LoadedMreactRouterViteConfig,\n} from \"./vite-config.js\";\nimport {\n emitRouterLog,\n logDurationMs,\n logNow,\n nodeRequestPath,\n type AppRouterLogger,\n} from \"./logger.js\";\nimport type { HttpUpgradeHandler } from \"./upgrade.js\";\n\nexport interface StartDevServerOptions extends AppRouterProjectOptions {\n port?: number | undefined;\n hostname?: string;\n importPolicy?: AppRouterImportPolicy | undefined;\n logger?: AppRouterLogger | undefined;\n routeCache?: AppRouterCache | undefined;\n serverActions?: AppRouterServerActionOptions | undefined;\n verboseErrors?: boolean | undefined;\n viteConfig?: UserConfig | undefined;\n onUpgrade?: HttpUpgradeHandler | undefined;\n}\n\nexport async function startDevServer(\n options: StartDevServerOptions,\n): Promise<{ close(): Promise<void>; server: Server; url: string }> {\n const hostname = options.hostname ?? \"127.0.0.1\";\n const resolved = await resolveStartDevServerProject(options);\n const project = resolved.project;\n const userViteConfig = options.viteConfig ?? resolved.viteConfig ?? {};\n const userViteServerConfig =\n typeof userViteConfig.server === \"object\" ? userViteConfig.server : {};\n const userHmrConfig =\n typeof userViteServerConfig.hmr === \"object\" ? userViteServerConfig.hmr : {};\n const port = options.port ?? resolved.serverPort ?? 3001;\n const routeCache = options.routeCache ?? createMemoryRouteCache();\n const declaredPackages = await readDeclaredProjectPackages(project.projectRoot);\n const configImportPolicy = resolved.importPolicy;\n const importPolicy: AppRouterImportPolicy = {\n ...configImportPolicy,\n ...options.importPolicy,\n allowedPackages: [\n ...new Set([\n ...declaredPackages,\n ...(configImportPolicy?.allowedPackages ?? []),\n ...(options.importPolicy?.allowedPackages ?? []),\n ]),\n ],\n };\n let vite: ViteDevServer | undefined;\n const server = createServer((incoming, outgoing) => {\n const logger = options.logger;\n const startedAt = logger === undefined ? undefined : logNow();\n const logFields =\n logger === undefined\n ? undefined\n : {\n method: incoming.method ?? \"GET\",\n path: nodeRequestPath(incoming.url),\n runtime: \"node\" as const,\n };\n\n if (logger !== undefined && logFields !== undefined && startedAt !== undefined) {\n emitRouterLog(logger, \"info\", {\n ...logFields,\n type: \"router:request:start\",\n });\n outgoing.once(\"finish\", () => {\n emitRouterLog(logger, \"info\", {\n ...logFields,\n durationMs: logDurationMs(startedAt),\n status: outgoing.statusCode,\n type: \"router:request:end\",\n });\n });\n }\n\n if (vite === undefined) {\n sendDevServerError(outgoing, new Error(\"Vite dev server is not initialized.\"), options);\n return;\n }\n\n vite.middlewares(incoming, outgoing, (error?: unknown) => {\n if (error !== undefined) {\n if (error instanceof Error) {\n vite?.ssrFixStacktrace(error);\n }\n sendDevServerError(outgoing, error, options);\n return;\n }\n\n outgoing.statusCode = 404;\n outgoing.setHeader(\"content-type\", \"text/plain; charset=utf-8\");\n outgoing.end(\"Not Found\");\n });\n });\n\n if (options.onUpgrade !== undefined) {\n server.on(\"upgrade\", options.onUpgrade);\n }\n\n vite = await createViteServer({\n ...userViteConfig,\n appType: \"custom\",\n configFile: false,\n root: project.projectRoot,\n server: {\n ...userViteServerConfig,\n hmr: { ...userHmrConfig, server },\n middlewareMode: true,\n },\n plugins: [\n ...(userViteConfig.plugins ?? []),\n createAppRouterVitePlugin({\n allowedSourceDirs: project.allowedSourceDirs,\n projectRoot: project.projectRoot,\n publicDir: project.publicDir,\n routesDir: project.routesDir,\n importPolicy,\n routeCache,\n serverActions: options.serverActions,\n }),\n ],\n });\n\n try {\n await listenDevHttpServer(server, port, hostname);\n } catch (error) {\n await vite.close();\n throw error;\n }\n const address = server.address();\n const actualPort = typeof address === \"object\" && address !== null ? address.port : port;\n\n return {\n server,\n url: `http://${hostname}:${actualPort}`,\n close: async () => {\n await vite?.close();\n await new Promise<void>((resolve, reject) => {\n server.close((error) => (error ? reject(error) : resolve()));\n });\n },\n };\n}\n\nfunction listenDevHttpServer(server: Server, port: number, hostname: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const onError = (error: Error) => {\n server.off(\"listening\", onListening);\n reject(formatDevListenError(error, hostname, port));\n };\n const onListening = () => {\n server.off(\"error\", onError);\n resolve();\n };\n\n server.once(\"error\", onError);\n server.once(\"listening\", onListening);\n server.listen(port, hostname);\n });\n}\n\nfunction formatDevListenError(error: Error, hostname: string, port: number): Error {\n if (isNodeErrorCode(error, \"EADDRINUSE\")) {\n return new Error(\n `mreact dev server could not start because ${hostname}:${port} is already in use. Stop the process using that port or run with PORT=<free-port>.`,\n );\n }\n\n return error;\n}\n\nfunction isNodeErrorCode(error: unknown, code: string): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code?: unknown }).code === code\n );\n}\n\nasync function resolveStartDevServerProject(options: StartDevServerOptions): Promise<{\n project: ReturnType<typeof resolveAppRouterProjectOptions>;\n serverPort?: number | undefined;\n importPolicy?: LoadedMreactRouterViteConfig[\"importPolicy\"];\n viteConfig?: LoadedMreactRouterViteConfig[\"viteConfig\"];\n}> {\n if (options.appDir !== undefined || options.routesDir !== undefined) {\n return { project: resolveAppRouterProjectOptions(options) };\n }\n\n const config = await loadOptionalMreactRouterViteConfig(\n resolve(options.projectRoot ?? process.cwd()),\n );\n\n return {\n ...(config?.importPolicy === undefined ? {} : { importPolicy: config.importPolicy }),\n project: resolveAppRouterProjectOptions({\n ...config?.project,\n ...definedProjectOptions(options),\n }),\n serverPort: config?.serverPort,\n viteConfig: config?.viteConfig,\n };\n}\n\nasync function loadOptionalMreactRouterViteConfig(cwd: string) {\n try {\n return await loadMreactRouterViteConfigDetails({\n command: \"serve\",\n cwd,\n });\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"vite.config.ts is required\")) {\n return undefined;\n }\n\n throw error;\n }\n}\n\nasync function readDeclaredProjectPackages(projectRoot: string): Promise<string[]> {\n try {\n const json = JSON.parse(await readFile(resolve(projectRoot, \"package.json\"), \"utf8\")) as {\n dependencies?: Record<string, unknown> | undefined;\n devDependencies?: Record<string, unknown> | undefined;\n optionalDependencies?: Record<string, unknown> | undefined;\n peerDependencies?: Record<string, unknown> | undefined;\n };\n\n return [\n ...Object.keys(json.dependencies ?? {}),\n ...Object.keys(json.devDependencies ?? {}),\n ...Object.keys(json.optionalDependencies ?? {}),\n ...Object.keys(json.peerDependencies ?? {}),\n ];\n } catch {\n return [];\n }\n}\n\nfunction definedProjectOptions(options: StartDevServerOptions): AppRouterProjectOptions {\n return {\n ...(options.allowedSourceDirs === undefined\n ? {}\n : { allowedSourceDirs: options.allowedSourceDirs }),\n ...(options.appDir === undefined ? {} : { appDir: options.appDir }),\n ...(options.projectRoot === undefined ? {} : { projectRoot: options.projectRoot }),\n ...(options.publicDir === undefined ? {} : { publicDir: options.publicDir }),\n ...(options.routesDir === undefined ? {} : { routesDir: options.routesDir }),\n };\n}\n\nfunction sendDevServerError(\n outgoing: ServerResponse,\n error: unknown,\n options: Pick<StartDevServerOptions, \"verboseErrors\">,\n): void {\n outgoing.statusCode = 500;\n outgoing.setHeader(\"content-type\", \"text/plain; charset=utf-8\");\n outgoing.end(options.verboseErrors === true\n ? error instanceof Error ? error.stack : String(error)\n : \"Internal Server Error\");\n}\n"]}
|
package/dist/link.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { escapeHtmlAttribute } from "@reckona/mreact-shared/html-escape";
|
|
1
|
+
import { escapeHtmlAttribute, escapeHtmlText } from "@reckona/mreact-shared/html-escape";
|
|
2
2
|
import { safeUrlAttributeValue } from "@reckona/mreact-shared/url-safety";
|
|
3
3
|
export function linkProps(options) {
|
|
4
4
|
return {
|
|
@@ -50,7 +50,12 @@ function createAnchorElement(props) {
|
|
|
50
50
|
if (!shouldSetAttribute(name, value)) {
|
|
51
51
|
continue;
|
|
52
52
|
}
|
|
53
|
-
|
|
53
|
+
const attrName = attributeName(name);
|
|
54
|
+
const safeValue = safeUrlAttributeValue(attrName, String(value));
|
|
55
|
+
if (safeValue === undefined) {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
anchor.setAttribute(attrName, safeValue);
|
|
54
59
|
}
|
|
55
60
|
return anchor;
|
|
56
61
|
}
|
|
@@ -108,6 +113,15 @@ function renderChildren(child) {
|
|
|
108
113
|
if (Array.isArray(child)) {
|
|
109
114
|
return child.map(renderChildren).join("");
|
|
110
115
|
}
|
|
111
|
-
|
|
116
|
+
if (typeof child === "string" && isPreRenderedSafeHtmlChild(child)) {
|
|
117
|
+
return child;
|
|
118
|
+
}
|
|
119
|
+
return escapeHtmlText(child);
|
|
120
|
+
}
|
|
121
|
+
function isPreRenderedSafeHtmlChild(value) {
|
|
122
|
+
if (!/[<&]/.test(value)) {
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
return !/(?:<\s*\/?\s*(?:script|style|iframe|object|embed|link|meta|base)\b|\son[a-z]+\s*=|javascript\s*:)/iu.test(value);
|
|
112
126
|
}
|
|
113
127
|
//# sourceMappingURL=link.js.map
|
package/dist/link.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link.js","sourceRoot":"","sources":["../src/link.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAGzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAoB1E,MAAM,UAAU,SAAS,CAAC,OAAoB;IAC5C,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ;YACjE,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,sBAAsB,EAAE,OAAO,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACvF,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK;YAC1D,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,oBAAoB,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;QAC7C,GAAG,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS,IAAI,OAAO,CAAC,UAAU,KAAK,KAAK,IAAI,OAAO,CAAC,UAAU,KAAK,MAAM;YACnG,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,wBAAwB,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC;KACtD,CAAC;AACJ,CAAC;AAID,MAAM,UAAU,IAAI,CAClB,WAAiC,EACjC,UAAsB;IAEtB,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC5B,WAAwB,CAAC,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC;QAC/D,OAAO;IACT,CAAC;IAED,OAAO,UAAU,CAAC,WAAwB,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,UAAU,CAAC,KAAgB;IAClC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IACtE,MAAM,kBAAkB,GAAG;QACzB,GAAG,IAAI;QACP,GAAG,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;KAC7D,CAAC;IAEF,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,OAAO,QAAQ,CAAC,aAAa,KAAK,UAAU,EAAE,CAAC;QACpF,OAAO,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,kBAAkB,CAAC,kBAAkB,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAgB;IACxC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IAEtE,OAAO,kBAAkB,CAAC;QACxB,GAAG,IAAI;QACP,GAAG,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;KAC7D,CAAC,CAAC;AACL,CAAC;AAED,SAAS,mBAAmB,CAAC,KAA8B;IACzD,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAE3C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACxB,eAAe,CAAC,MAAM,EAAE,KAAkB,CAAC,CAAC;YAC5C,SAAS;QACX,CAAC;QAED,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;YACrC,SAAS;QACX,CAAC;QAED,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CAAC,MAAY,EAAE,KAAgB;IACrD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QACxE,OAAO;IACT,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;QAC1B,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,kBAAkB,CAAC,KAA8B;IACxD,OAAO,KAAK,sBAAsB,CAAC,KAAK,CAAC,IAAI,cAAc,CAAC,KAAK,CAAC,QAAqB,CAAC,MAAM,CAAC;AACjG,CAAC;AAED,SAAS,sBAAsB,CAAC,KAA8B;IAC5D,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,IAAI,IAAI,KAAK,UAAU,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;YAC5D,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,SAAS,GAAG,qBAAqB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAE7D,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,SAAS;QACX,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,QAAQ,CAAC,KAAK,mBAAmB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACrF,CAAC;IAED,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AACzD,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY,EAAE,KAAc;IACtD,OAAO,CACL,IAAI,KAAK,KAAK;QACd,IAAI,KAAK,KAAK;QACd,KAAK,KAAK,IAAI;QACd,KAAK,KAAK,SAAS;QACnB,KAAK,KAAK,KAAK;QACf,OAAO,KAAK,KAAK,UAAU;QAC3B,OAAO,KAAK,KAAK,QAAQ,CAC1B,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/C,CAAC;AAED,SAAS,cAAc,CAAC,KAAgB;IACtC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QACxE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC","sourcesContent":["import { escapeHtmlAttribute } from \"@reckona/mreact-shared/html-escape\";\nimport type { HtmlSink } from \"@reckona/mreact-shared/compiler-contract\";\nimport type { ReactCompatElement, ReactCompatNode } from \"@reckona/mreact-compat\";\nimport { safeUrlAttributeValue } from \"@reckona/mreact-shared/url-safety\";\n\nexport type LinkPrefetch = \"intent\" | \"viewport\" | \"none\" | false;\nexport type LinkScroll = \"top\" | \"preserve\";\nexport type LinkTransition = \"auto\" | \"none\" | false;\nexport type LinkChild = ReactCompatNode | Node | readonly LinkChild[];\n\nexport interface LinkOptions {\n href: string;\n prefetch?: LinkPrefetch | undefined;\n reload?: boolean | undefined;\n scroll?: LinkScroll | undefined;\n transition?: LinkTransition | undefined;\n}\n\nexport interface LinkProps extends LinkOptions {\n children?: LinkChild;\n [attribute: string]: unknown;\n}\n\nexport function linkProps(options: LinkOptions): Record<string, string> {\n return {\n href: options.href,\n ...(options.prefetch === undefined || options.prefetch === \"intent\"\n ? {}\n : { \"data-mreact-prefetch\": options.prefetch === false ? \"none\" : options.prefetch }),\n ...(options.reload === true ? { \"data-mreact-reload\": \"true\" } : {}),\n ...(options.scroll === undefined || options.scroll === \"top\"\n ? {}\n : { \"data-mreact-scroll\": options.scroll }),\n ...(options.transition === undefined || options.transition === false || options.transition === \"none\"\n ? {}\n : { \"data-mreact-transition\": options.transition }),\n };\n}\n\nexport function Link(props: LinkProps): ReactCompatElement;\nexport function Link(sink: HtmlSink, props: LinkProps): void;\nexport function Link(\n sinkOrProps: HtmlSink | LinkProps,\n maybeProps?: LinkProps,\n): ReactCompatElement | string | HTMLAnchorElement | void {\n if (maybeProps !== undefined) {\n (sinkOrProps as HtmlSink).append(renderLinkString(maybeProps));\n return;\n }\n\n return renderLink(sinkOrProps as LinkProps);\n}\n\nfunction renderLink(props: LinkProps): string | HTMLAnchorElement {\n const { href, prefetch, reload, scroll, transition, ...rest } = props;\n const propsWithLinkAttrs = {\n ...rest,\n ...linkProps({ href, prefetch, reload, scroll, transition }),\n };\n\n if (typeof document !== \"undefined\" && typeof document.createElement === \"function\") {\n return createAnchorElement(propsWithLinkAttrs);\n }\n\n return renderAnchorString(propsWithLinkAttrs);\n}\n\nfunction renderLinkString(props: LinkProps): string {\n const { href, prefetch, reload, scroll, transition, ...rest } = props;\n\n return renderAnchorString({\n ...rest,\n ...linkProps({ href, prefetch, reload, scroll, transition }),\n });\n}\n\nfunction createAnchorElement(props: Record<string, unknown>): HTMLAnchorElement {\n const anchor = document.createElement(\"a\");\n\n for (const [name, value] of Object.entries(props)) {\n if (name === \"children\") {\n appendLinkChild(anchor, value as LinkChild);\n continue;\n }\n\n if (!shouldSetAttribute(name, value)) {\n continue;\n }\n\n anchor.setAttribute(attributeName(name), String(value));\n }\n\n return anchor;\n}\n\nfunction appendLinkChild(parent: Node, child: LinkChild): void {\n if (child === null || child === undefined || typeof child === \"boolean\") {\n return;\n }\n\n if (Array.isArray(child)) {\n for (const item of child) {\n appendLinkChild(parent, item);\n }\n return;\n }\n\n if (child instanceof Node) {\n parent.appendChild(child);\n return;\n }\n\n parent.appendChild(document.createTextNode(String(child)));\n}\n\nfunction renderAnchorString(props: Record<string, unknown>): string {\n return `<a${renderAnchorAttributes(props)}>${renderChildren(props.children as LinkChild)}</a>`;\n}\n\nfunction renderAnchorAttributes(props: Record<string, unknown>): string {\n const attrs: string[] = [];\n\n for (const [name, value] of Object.entries(props)) {\n if (name === \"children\" || !shouldSetAttribute(name, value)) {\n continue;\n }\n\n const attrName = attributeName(name);\n const attrValue = String(value);\n const safeValue = safeUrlAttributeValue(attrName, attrValue);\n\n if (safeValue === undefined) {\n continue;\n }\n\n attrs.push(`${escapeHtmlAttribute(attrName)}=\"${escapeHtmlAttribute(safeValue)}\"`);\n }\n\n return attrs.length === 0 ? \"\" : ` ${attrs.join(\" \")}`;\n}\n\nfunction shouldSetAttribute(name: string, value: unknown): boolean {\n return (\n name !== \"key\" &&\n name !== \"ref\" &&\n value !== null &&\n value !== undefined &&\n value !== false &&\n typeof value !== \"function\" &&\n typeof value !== \"symbol\"\n );\n}\n\nfunction attributeName(name: string): string {\n return name === \"className\" ? \"class\" : name;\n}\n\nfunction renderChildren(child: LinkChild): string {\n if (child === null || child === undefined || typeof child === \"boolean\") {\n return \"\";\n }\n\n if (Array.isArray(child)) {\n return child.map(renderChildren).join(\"\");\n }\n\n return String(child);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"link.js","sourceRoot":"","sources":["../src/link.ts"],"names":[],"mappings":"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","sourcesContent":["import { escapeHtmlAttribute, escapeHtmlText } from \"@reckona/mreact-shared/html-escape\";\nimport type { HtmlSink } from \"@reckona/mreact-shared/compiler-contract\";\nimport type { ReactCompatElement, ReactCompatNode } from \"@reckona/mreact-compat\";\nimport { safeUrlAttributeValue } from \"@reckona/mreact-shared/url-safety\";\n\nexport type LinkPrefetch = \"intent\" | \"viewport\" | \"none\" | false;\nexport type LinkScroll = \"top\" | \"preserve\";\nexport type LinkTransition = \"auto\" | \"none\" | false;\nexport type LinkChild = ReactCompatNode | Node | readonly LinkChild[];\n\nexport interface LinkOptions {\n href: string;\n prefetch?: LinkPrefetch | undefined;\n reload?: boolean | undefined;\n scroll?: LinkScroll | undefined;\n transition?: LinkTransition | undefined;\n}\n\nexport interface LinkProps extends LinkOptions {\n children?: LinkChild;\n [attribute: string]: unknown;\n}\n\nexport function linkProps(options: LinkOptions): Record<string, string> {\n return {\n href: options.href,\n ...(options.prefetch === undefined || options.prefetch === \"intent\"\n ? {}\n : { \"data-mreact-prefetch\": options.prefetch === false ? \"none\" : options.prefetch }),\n ...(options.reload === true ? { \"data-mreact-reload\": \"true\" } : {}),\n ...(options.scroll === undefined || options.scroll === \"top\"\n ? {}\n : { \"data-mreact-scroll\": options.scroll }),\n ...(options.transition === undefined || options.transition === false || options.transition === \"none\"\n ? {}\n : { \"data-mreact-transition\": options.transition }),\n };\n}\n\nexport function Link(props: LinkProps): ReactCompatElement;\nexport function Link(sink: HtmlSink, props: LinkProps): void;\nexport function Link(\n sinkOrProps: HtmlSink | LinkProps,\n maybeProps?: LinkProps,\n): ReactCompatElement | string | HTMLAnchorElement | void {\n if (maybeProps !== undefined) {\n (sinkOrProps as HtmlSink).append(renderLinkString(maybeProps));\n return;\n }\n\n return renderLink(sinkOrProps as LinkProps);\n}\n\nfunction renderLink(props: LinkProps): string | HTMLAnchorElement {\n const { href, prefetch, reload, scroll, transition, ...rest } = props;\n const propsWithLinkAttrs = {\n ...rest,\n ...linkProps({ href, prefetch, reload, scroll, transition }),\n };\n\n if (typeof document !== \"undefined\" && typeof document.createElement === \"function\") {\n return createAnchorElement(propsWithLinkAttrs);\n }\n\n return renderAnchorString(propsWithLinkAttrs);\n}\n\nfunction renderLinkString(props: LinkProps): string {\n const { href, prefetch, reload, scroll, transition, ...rest } = props;\n\n return renderAnchorString({\n ...rest,\n ...linkProps({ href, prefetch, reload, scroll, transition }),\n });\n}\n\nfunction createAnchorElement(props: Record<string, unknown>): HTMLAnchorElement {\n const anchor = document.createElement(\"a\");\n\n for (const [name, value] of Object.entries(props)) {\n if (name === \"children\") {\n appendLinkChild(anchor, value as LinkChild);\n continue;\n }\n\n if (!shouldSetAttribute(name, value)) {\n continue;\n }\n\n const attrName = attributeName(name);\n const safeValue = safeUrlAttributeValue(attrName, String(value));\n\n if (safeValue === undefined) {\n continue;\n }\n\n anchor.setAttribute(attrName, safeValue);\n }\n\n return anchor;\n}\n\nfunction appendLinkChild(parent: Node, child: LinkChild): void {\n if (child === null || child === undefined || typeof child === \"boolean\") {\n return;\n }\n\n if (Array.isArray(child)) {\n for (const item of child) {\n appendLinkChild(parent, item);\n }\n return;\n }\n\n if (child instanceof Node) {\n parent.appendChild(child);\n return;\n }\n\n parent.appendChild(document.createTextNode(String(child)));\n}\n\nfunction renderAnchorString(props: Record<string, unknown>): string {\n return `<a${renderAnchorAttributes(props)}>${renderChildren(props.children as LinkChild)}</a>`;\n}\n\nfunction renderAnchorAttributes(props: Record<string, unknown>): string {\n const attrs: string[] = [];\n\n for (const [name, value] of Object.entries(props)) {\n if (name === \"children\" || !shouldSetAttribute(name, value)) {\n continue;\n }\n\n const attrName = attributeName(name);\n const attrValue = String(value);\n const safeValue = safeUrlAttributeValue(attrName, attrValue);\n\n if (safeValue === undefined) {\n continue;\n }\n\n attrs.push(`${escapeHtmlAttribute(attrName)}=\"${escapeHtmlAttribute(safeValue)}\"`);\n }\n\n return attrs.length === 0 ? \"\" : ` ${attrs.join(\" \")}`;\n}\n\nfunction shouldSetAttribute(name: string, value: unknown): boolean {\n return (\n name !== \"key\" &&\n name !== \"ref\" &&\n value !== null &&\n value !== undefined &&\n value !== false &&\n typeof value !== \"function\" &&\n typeof value !== \"symbol\"\n );\n}\n\nfunction attributeName(name: string): string {\n return name === \"className\" ? \"class\" : name;\n}\n\nfunction renderChildren(child: LinkChild): string {\n if (child === null || child === undefined || typeof child === \"boolean\") {\n return \"\";\n }\n\n if (Array.isArray(child)) {\n return child.map(renderChildren).join(\"\");\n }\n\n if (typeof child === \"string\" && isPreRenderedSafeHtmlChild(child)) {\n return child;\n }\n\n return escapeHtmlText(child);\n}\n\nfunction isPreRenderedSafeHtmlChild(value: string): boolean {\n if (!/[<&]/.test(value)) {\n return false;\n }\n\n return !/(?:<\\s*\\/?\\s*(?:script|style|iframe|object|embed|link|meta|base)\\b|\\son[a-z]+\\s*=|javascript\\s*:)/iu.test(\n value,\n );\n}\n"]}
|
package/dist/middleware.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,MAAM,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE;QACP,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACxB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;KAC3D,CAAC;IACF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,OAAO,CAAC;IACpB,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CAClD;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,SAAS,EACvE,OAAO,EAAE,sBAAsB,GAAG,SAAS,GAC1C,OAAO,CAUT;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,sBAAsB,CAqChF;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAgB/F;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,sBAAsB,GAAG,SAAS,CAqB5F;AAED,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,SAAS,CAAC,sBAAsB,GAAG,SAAS,CAAC,EAAE,GACxD,sBAAsB,GAAG,SAAS,CAgBpC"}
|
package/dist/middleware.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { normalizeRoutePath } from "./route-path.js";
|
|
1
2
|
export function shouldSkipMiddleware(config, control) {
|
|
2
3
|
if (control?.skip === true) {
|
|
3
4
|
return true;
|
|
@@ -78,16 +79,18 @@ export function mergeRouteMiddlewareControls(controls) {
|
|
|
78
79
|
return skippedIds.size === 0 ? undefined : { skip: [...skippedIds] };
|
|
79
80
|
}
|
|
80
81
|
function middlewarePatternMatches(pattern, pathname) {
|
|
81
|
-
|
|
82
|
+
const normalizedPattern = normalizeRoutePath(pattern);
|
|
83
|
+
const normalizedPathname = normalizeRoutePath(pathname);
|
|
84
|
+
if (normalizedPattern === normalizedPathname) {
|
|
82
85
|
return true;
|
|
83
86
|
}
|
|
84
|
-
if (
|
|
85
|
-
const prefix =
|
|
86
|
-
return
|
|
87
|
+
if (normalizedPattern.endsWith("/:path*")) {
|
|
88
|
+
const prefix = normalizedPattern.slice(0, -"/:path*".length);
|
|
89
|
+
return normalizedPathname === prefix || normalizedPathname.startsWith(`${prefix}/`);
|
|
87
90
|
}
|
|
88
|
-
if (
|
|
89
|
-
const prefix =
|
|
90
|
-
return
|
|
91
|
+
if (normalizedPattern.endsWith("*")) {
|
|
92
|
+
const prefix = normalizedPattern.slice(0, -1);
|
|
93
|
+
return normalizedPathname.startsWith(prefix);
|
|
91
94
|
}
|
|
92
95
|
return false;
|
|
93
96
|
}
|
package/dist/middleware.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"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","sourcesContent":["import { normalizeRoutePath } from \"./route-path.js\";\n\nexport interface RouteMiddlewareControl {\n skip?: boolean | readonly string[];\n}\n\nexport interface MiddlewareModule {\n config?: {\n id?: string | undefined;\n matcher?: string | RegExp | readonly string[] | undefined;\n };\n default?: unknown;\n middleware?: unknown;\n}\n\nexport interface StaticMiddlewareConfig {\n hasMatcher: boolean;\n id?: string | undefined;\n matcher?: string | readonly string[] | undefined;\n}\n\nexport function shouldSkipMiddleware(\n config: Pick<NonNullable<MiddlewareModule[\"config\"]>, \"id\"> | undefined,\n control: RouteMiddlewareControl | undefined,\n): boolean {\n if (control?.skip === true) {\n return true;\n }\n\n if (!Array.isArray(control?.skip)) {\n return false;\n }\n\n return typeof config?.id === \"string\" && control.skip.includes(config.id);\n}\n\nexport function parseStaticMiddlewareConfig(code: string): StaticMiddlewareConfig {\n const configBody = /\\bexport\\s+const\\s+config\\s*=\\s*\\{(?<body>[\\s\\S]*?)\\}\\s*;?/.exec(code)\n ?.groups?.body;\n\n if (configBody === undefined) {\n return { hasMatcher: false };\n }\n\n const id = /\\bid\\s*:\\s*[\"'](?<id>[^\"']+)[\"']/.exec(configBody)?.groups?.id;\n const stringMatcher = /\\bmatcher\\s*:\\s*[\"'](?<matcher>[^\"']+)[\"']/.exec(configBody)?.groups\n ?.matcher;\n\n if (stringMatcher !== undefined) {\n return {\n hasMatcher: true,\n ...(id === undefined ? {} : { id }),\n matcher: stringMatcher,\n };\n }\n\n const matcherArray = /\\bmatcher\\s*:\\s*\\[(?<items>[\\s\\S]*?)\\]/.exec(configBody)?.groups?.items;\n\n if (matcherArray !== undefined) {\n return {\n hasMatcher: true,\n ...(id === undefined ? {} : { id }),\n matcher: Array.from(\n matcherArray.matchAll(/[\"'](?<matcher>[^\"']+)[\"']/g),\n (match) => match.groups?.matcher,\n ).filter((matcher): matcher is string => matcher !== undefined),\n };\n }\n\n return {\n hasMatcher: /\\bmatcher\\s*:/.test(configBody),\n ...(id === undefined ? {} : { id }),\n };\n}\n\nexport function middlewareMatches(config: MiddlewareModule[\"config\"], pathname: string): boolean {\n const matcher = config?.matcher;\n\n if (matcher === undefined) {\n return true;\n }\n\n if (matcher instanceof RegExp) {\n return matcher.test(pathname);\n }\n\n if (Array.isArray(matcher)) {\n return matcher.some((item) => middlewarePatternMatches(item, pathname));\n }\n\n return typeof matcher === \"string\" && middlewarePatternMatches(matcher, pathname);\n}\n\nexport function parseRouteMiddlewareControl(code: string): RouteMiddlewareControl | undefined {\n if (!/\\bexport\\s+const\\s+middleware\\s*=/.test(code)) {\n return undefined;\n }\n\n if (/\\bmiddleware\\s*=\\s*\\{[\\s\\S]*?\\bskip\\s*:\\s*true\\b/.test(code)) {\n return { skip: true };\n }\n\n const skipArray = /\\bmiddleware\\s*=\\s*\\{[\\s\\S]*?\\bskip\\s*:\\s*\\[([\\s\\S]*?)\\]/.exec(code);\n\n if (skipArray === null) {\n return undefined;\n }\n\n const ids = Array.from(\n skipArray[1]?.matchAll(/[\"']([^\"']+)[\"']/g) ?? [],\n (match) => match[1],\n ).filter((id) => id !== undefined);\n\n return ids.length === 0 ? undefined : { skip: ids };\n}\n\nexport function mergeRouteMiddlewareControls(\n controls: readonly (RouteMiddlewareControl | undefined)[],\n): RouteMiddlewareControl | undefined {\n const skippedIds = new Set<string>();\n\n for (const control of controls) {\n if (control?.skip === true) {\n return { skip: true };\n }\n\n if (Array.isArray(control?.skip)) {\n for (const id of control.skip) {\n skippedIds.add(id);\n }\n }\n }\n\n return skippedIds.size === 0 ? undefined : { skip: [...skippedIds] };\n}\n\nfunction middlewarePatternMatches(pattern: string, pathname: string): boolean {\n const normalizedPattern = normalizeRoutePath(pattern);\n const normalizedPathname = normalizeRoutePath(pathname);\n\n if (normalizedPattern === normalizedPathname) {\n return true;\n }\n\n if (normalizedPattern.endsWith(\"/:path*\")) {\n const prefix = normalizedPattern.slice(0, -\"/:path*\".length);\n\n return normalizedPathname === prefix || normalizedPathname.startsWith(`${prefix}/`);\n }\n\n if (normalizedPattern.endsWith(\"*\")) {\n const prefix = normalizedPattern.slice(0, -1);\n\n return normalizedPathname.startsWith(prefix);\n }\n\n return false;\n}\n"]}
|
package/dist/multipart.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export interface MultipartStreamParseOptions {
|
|
2
2
|
fields?: Readonly<Record<string, MultipartStreamFieldOptions>>;
|
|
3
|
+
maxParts?: number;
|
|
3
4
|
maxBytes?: number;
|
|
4
5
|
}
|
|
5
6
|
export interface MultipartStreamFieldOptions {
|
|
@@ -9,6 +10,7 @@ export interface MultipartStreamFieldOptions {
|
|
|
9
10
|
export interface MultipartStreamPart {
|
|
10
11
|
name: string;
|
|
11
12
|
filename?: string;
|
|
13
|
+
safeFilename?: string;
|
|
12
14
|
contentType?: string;
|
|
13
15
|
headers: Headers;
|
|
14
16
|
body: ReadableStream<Uint8Array<ArrayBufferLike>>;
|
|
@@ -20,5 +22,8 @@ export interface MultipartFixedLengthStream {
|
|
|
20
22
|
readable: ReadableStream<Uint8Array<ArrayBufferLike>>;
|
|
21
23
|
done: Promise<void>;
|
|
22
24
|
}
|
|
25
|
+
export declare const defaultMultipartMaxBytes: number;
|
|
26
|
+
export declare const defaultMultipartMaxParts = 1000;
|
|
23
27
|
export declare function parseMultipartStream(request: Request, options?: MultipartStreamParseOptions): AsyncIterable<MultipartStreamPart>;
|
|
28
|
+
export declare function sanitizeMultipartFilename(filename: string): string;
|
|
24
29
|
//# sourceMappingURL=multipart.d.ts.map
|
package/dist/multipart.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multipart.d.ts","sourceRoot":"","sources":["../src/multipart.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,2BAA2B;IAC1C,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAAC,CAAC;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,2BAA2B;IAC1C,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC;IAClD,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACxB,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;IACpC,iBAAiB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,0BAA0B,CAAC;CACzE;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC;IACtD,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;CACrB;
|
|
1
|
+
{"version":3,"file":"multipart.d.ts","sourceRoot":"","sources":["../src/multipart.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,2BAA2B;IAC1C,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAAC,CAAC;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,2BAA2B;IAC1C,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC;IAClD,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACxB,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;IACpC,iBAAiB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,0BAA0B,CAAC;CACzE;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC;IACtD,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;CACrB;AAYD,eAAO,MAAM,wBAAwB,QAAmB,CAAC;AACzD,eAAO,MAAM,wBAAwB,OAAQ,CAAC;AAE9C,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,2BAAgC,GACxC,aAAa,CAAC,mBAAmB,CAAC,CAQpC;AAsSD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CASlE"}
|
package/dist/multipart.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
const crlf = "\r\n";
|
|
2
2
|
const headerSeparator = "\r\n\r\n";
|
|
3
3
|
const maxHeaderBytes = 64 * 1024;
|
|
4
|
+
export const defaultMultipartMaxBytes = 10 * 1024 * 1024;
|
|
5
|
+
export const defaultMultipartMaxParts = 1_000;
|
|
4
6
|
export function parseMultipartStream(request, options = {}) {
|
|
5
7
|
return {
|
|
6
8
|
[Symbol.asyncIterator]() {
|
|
@@ -28,6 +30,7 @@ async function parseMultipartRequest(request, options, queue) {
|
|
|
28
30
|
const keepTailBytes = delimiter.length + 4;
|
|
29
31
|
let buffer = new Uint8Array();
|
|
30
32
|
let totalBytes = 0;
|
|
33
|
+
let totalParts = 0;
|
|
31
34
|
let started = false;
|
|
32
35
|
let currentPart;
|
|
33
36
|
queue.setCancel(() => {
|
|
@@ -39,7 +42,7 @@ async function parseMultipartRequest(request, options, queue) {
|
|
|
39
42
|
const next = await reader.read();
|
|
40
43
|
if (!next.done) {
|
|
41
44
|
totalBytes += next.value.byteLength;
|
|
42
|
-
enforceByteLimit("multipart request", totalBytes, options.maxBytes);
|
|
45
|
+
enforceByteLimit("multipart request", totalBytes, options.maxBytes ?? defaultMultipartMaxBytes);
|
|
43
46
|
buffer = concatBytes(buffer, next.value);
|
|
44
47
|
}
|
|
45
48
|
while (true) {
|
|
@@ -77,6 +80,8 @@ async function parseMultipartRequest(request, options, queue) {
|
|
|
77
80
|
}
|
|
78
81
|
break;
|
|
79
82
|
}
|
|
83
|
+
totalParts += 1;
|
|
84
|
+
enforcePartLimit(totalParts, options.maxParts ?? defaultMultipartMaxParts);
|
|
80
85
|
currentPart = createPartWriter(decodeAscii(buffer.slice(0, headerEnd)), options, queue);
|
|
81
86
|
buffer = buffer.slice(headerEnd + headerSeparator.length);
|
|
82
87
|
}
|
|
@@ -174,6 +179,7 @@ function createPart(options) {
|
|
|
174
179
|
};
|
|
175
180
|
if (options.filename !== undefined) {
|
|
176
181
|
part.filename = options.filename;
|
|
182
|
+
part.safeFilename = sanitizeMultipartFilename(options.filename);
|
|
177
183
|
}
|
|
178
184
|
const contentType = options.headers.get("content-type");
|
|
179
185
|
if (contentType !== null) {
|
|
@@ -212,6 +218,23 @@ function enforceByteLimit(label, bytes, maxBytes) {
|
|
|
212
218
|
throw new Error(`${label} exceeded ${maxBytes} bytes.`);
|
|
213
219
|
}
|
|
214
220
|
}
|
|
221
|
+
function enforcePartLimit(parts, maxParts) {
|
|
222
|
+
if (maxParts !== undefined && parts > maxParts) {
|
|
223
|
+
throw new Error(`multipart request exceeded ${maxParts} parts.`);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
export function sanitizeMultipartFilename(filename) {
|
|
227
|
+
const leaf = filename.split(/[\\/]/u).at(-1) ?? "";
|
|
228
|
+
let sanitized = "";
|
|
229
|
+
for (const char of leaf) {
|
|
230
|
+
sanitized += isControlCharacter(char) ? "_" : char;
|
|
231
|
+
}
|
|
232
|
+
return sanitized === "" || sanitized === "." || sanitized === ".." ? "upload.bin" : sanitized;
|
|
233
|
+
}
|
|
234
|
+
function isControlCharacter(char) {
|
|
235
|
+
const code = char.charCodeAt(0);
|
|
236
|
+
return code < 0x20 || code === 0x7f;
|
|
237
|
+
}
|
|
215
238
|
function parseMultipartBoundary(contentType) {
|
|
216
239
|
if (contentType === null) {
|
|
217
240
|
return undefined;
|
package/dist/multipart.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multipart.js","sourceRoot":"","sources":["../src/multipart.ts"],"names":[],"mappings":"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","sourcesContent":["export interface MultipartStreamParseOptions {\n fields?: Readonly<Record<string, MultipartStreamFieldOptions>>;\n maxBytes?: number;\n}\n\nexport interface MultipartStreamFieldOptions {\n type?: \"stream\" | \"text\";\n maxBytes?: number;\n}\n\nexport interface MultipartStreamPart {\n name: string;\n filename?: string;\n contentType?: string;\n headers: Headers;\n body: ReadableStream<Uint8Array<ArrayBufferLike>>;\n text(): Promise<string>;\n arrayBuffer(): Promise<ArrayBuffer>;\n fixedLengthStream(length?: number | bigint): MultipartFixedLengthStream;\n}\n\nexport interface MultipartFixedLengthStream {\n readable: ReadableStream<Uint8Array<ArrayBufferLike>>;\n done: Promise<void>;\n}\n\ninterface PartWriter {\n name: string;\n maxBytes: number | undefined;\n bytes: number;\n writer: WritableStreamDefaultWriter<Uint8Array<ArrayBufferLike>>;\n}\n\nconst crlf = \"\\r\\n\";\nconst headerSeparator = \"\\r\\n\\r\\n\";\nconst maxHeaderBytes = 64 * 1024;\n\nexport function parseMultipartStream(\n request: Request,\n options: MultipartStreamParseOptions = {},\n): AsyncIterable<MultipartStreamPart> {\n return {\n [Symbol.asyncIterator]() {\n const queue = new AsyncQueue<MultipartStreamPart>();\n void parseMultipartRequest(request, options, queue);\n return queue;\n },\n };\n}\n\nasync function parseMultipartRequest(\n request: Request,\n options: MultipartStreamParseOptions,\n queue: AsyncQueue<MultipartStreamPart>,\n): Promise<void> {\n const boundary = parseMultipartBoundary(request.headers.get(\"content-type\"));\n\n if (boundary === undefined) {\n queue.fail(new Error(\"Multipart request content-type must include a boundary.\"));\n return;\n }\n\n if (request.body === null) {\n queue.fail(new Error(\"Multipart request body is not readable.\"));\n return;\n }\n\n const reader = request.body.getReader();\n const delimiter = encodeAscii(`${crlf}--${boundary}`);\n const firstBoundary = encodeAscii(`--${boundary}`);\n const closeSuffix = encodeAscii(\"--\");\n const lineSuffix = encodeAscii(crlf);\n const keepTailBytes = delimiter.length + 4;\n let buffer: Uint8Array<ArrayBufferLike> = new Uint8Array();\n let totalBytes = 0;\n let started = false;\n let currentPart: PartWriter | undefined;\n\n queue.setCancel(() => {\n void currentPart?.writer.abort(new Error(\"Multipart stream iteration was cancelled.\"));\n void reader.cancel();\n });\n\n try {\n while (true) {\n const next = await reader.read();\n\n if (!next.done) {\n totalBytes += next.value.byteLength;\n enforceByteLimit(\"multipart request\", totalBytes, options.maxBytes);\n buffer = concatBytes(buffer, next.value);\n }\n\n while (true) {\n if (!started) {\n const firstBoundaryIndex = indexOfBytes(buffer, firstBoundary);\n\n if (firstBoundaryIndex < 0) {\n if (next.done) {\n throw new Error(\"Multipart request body does not contain the opening boundary.\");\n }\n\n trimBufferToTail(0);\n break;\n }\n\n buffer = buffer.slice(firstBoundaryIndex + firstBoundary.length);\n\n if (startsWithBytes(buffer, closeSuffix)) {\n queue.close();\n return;\n }\n\n if (!startsWithBytes(buffer, lineSuffix)) {\n if (next.done) {\n throw new Error(\"Malformed multipart opening boundary.\");\n }\n break;\n }\n\n buffer = buffer.slice(lineSuffix.length);\n started = true;\n }\n\n if (currentPart === undefined) {\n const headerEnd = indexOfAscii(buffer, headerSeparator);\n\n if (headerEnd < 0) {\n if (next.done) {\n throw new Error(\"Multipart part ended before headers completed.\");\n }\n\n if (buffer.length > maxHeaderBytes) {\n throw new Error(`Multipart part headers exceeded ${maxHeaderBytes} bytes.`);\n }\n break;\n }\n\n currentPart = createPartWriter(\n decodeAscii(buffer.slice(0, headerEnd)),\n options,\n queue,\n );\n buffer = buffer.slice(headerEnd + headerSeparator.length);\n }\n\n const delimiterIndex = indexOfBytes(buffer, delimiter);\n\n if (delimiterIndex < 0) {\n if (next.done) {\n throw new Error(`Multipart part \"${currentPart.name}\" ended before the closing boundary.`);\n }\n\n const writableLength = Math.max(0, buffer.length - keepTailBytes);\n\n if (writableLength === 0) {\n break;\n }\n\n await writePartChunk(currentPart, buffer.slice(0, writableLength));\n buffer = buffer.slice(writableLength);\n continue;\n }\n\n await writePartChunk(currentPart, buffer.slice(0, delimiterIndex));\n await currentPart.writer.close();\n buffer = buffer.slice(delimiterIndex + delimiter.length);\n currentPart = undefined;\n\n if (startsWithBytes(buffer, closeSuffix)) {\n queue.close();\n return;\n }\n\n if (startsWithBytes(buffer, lineSuffix)) {\n buffer = buffer.slice(lineSuffix.length);\n continue;\n }\n\n if (next.done) {\n throw new Error(\"Malformed multipart boundary delimiter.\");\n }\n\n break;\n }\n\n if (next.done) {\n break;\n }\n }\n\n queue.close();\n } catch (error) {\n await currentPart?.writer.abort(error);\n queue.fail(error);\n } finally {\n queue.setCancel(undefined);\n reader.releaseLock();\n }\n\n function trimBufferToTail(prefixLength: number): void {\n if (buffer.length <= keepTailBytes + prefixLength) {\n return;\n }\n\n buffer = buffer.slice(buffer.length - keepTailBytes - prefixLength);\n }\n}\n\nfunction createPartWriter(\n rawHeaders: string,\n options: MultipartStreamParseOptions,\n queue: AsyncQueue<MultipartStreamPart>,\n): PartWriter {\n const headers = parsePartHeaders(rawHeaders);\n const disposition = parseContentDisposition(headers.get(\"content-disposition\"));\n\n if (disposition.name === undefined) {\n throw new Error(\"Multipart part is missing a form-data name.\");\n }\n\n const stream = new TransformStream<Uint8Array, Uint8Array>();\n const part = createPart({\n name: disposition.name,\n filename: disposition.filename,\n headers,\n body: stream.readable,\n });\n\n queue.push(part);\n\n return {\n name: disposition.name,\n maxBytes: options.fields?.[disposition.name]?.maxBytes,\n bytes: 0,\n writer: stream.writable.getWriter(),\n };\n}\n\nfunction createPart(options: {\n name: string;\n filename: string | undefined;\n headers: Headers;\n body: ReadableStream<Uint8Array>;\n}): MultipartStreamPart {\n const part: MultipartStreamPart = {\n name: options.name,\n headers: options.headers,\n body: options.body,\n text() {\n return new Response(options.body).text();\n },\n arrayBuffer() {\n return new Response(options.body).arrayBuffer();\n },\n fixedLengthStream(length) {\n const expectedLength = length ?? contentLengthFromHeaders(options.headers);\n const stream = createFixedLengthStream(expectedLength);\n\n return {\n readable: stream.readable,\n done: options.body.pipeTo(stream.writable),\n };\n },\n };\n\n if (options.filename !== undefined) {\n part.filename = options.filename;\n }\n\n const contentType = options.headers.get(\"content-type\");\n\n if (contentType !== null) {\n part.contentType = contentType;\n }\n\n return part;\n}\n\nfunction contentLengthFromHeaders(headers: Headers): number | bigint {\n const raw = headers.get(\"content-length\");\n\n if (raw === null || raw.trim() === \"\") {\n throw new Error(\n \"Multipart part fixedLengthStream() requires a byte length. Pass an explicit length or include a Content-Length part header.\",\n );\n }\n\n const parsed = Number(raw);\n\n if (!Number.isSafeInteger(parsed) || parsed < 0) {\n throw new Error(`Multipart part Content-Length must be a non-negative safe integer. Received ${JSON.stringify(raw)}.`);\n }\n\n return parsed;\n}\n\nfunction createFixedLengthStream(length: number | bigint): TransformStream<Uint8Array<ArrayBufferLike>, Uint8Array<ArrayBufferLike>> {\n const FixedLengthStream = (globalThis as {\n FixedLengthStream?: new (\n length: number | bigint,\n ) => TransformStream<Uint8Array<ArrayBufferLike>, Uint8Array<ArrayBufferLike>>;\n }).FixedLengthStream;\n\n if (FixedLengthStream === undefined) {\n throw new Error(\n \"FixedLengthStream is not available in this runtime. Use arrayBuffer() or pass the part body to a destination that accepts unknown-length streams.\",\n );\n }\n\n return new FixedLengthStream(length);\n}\n\nasync function writePartChunk(\n part: PartWriter,\n chunk: Uint8Array<ArrayBufferLike>,\n): Promise<void> {\n if (chunk.byteLength === 0) {\n return;\n }\n\n part.bytes += chunk.byteLength;\n enforceByteLimit(`multipart field \"${part.name}\"`, part.bytes, part.maxBytes);\n await part.writer.write(chunk);\n}\n\nfunction enforceByteLimit(label: string, bytes: number, maxBytes: number | undefined): void {\n if (maxBytes !== undefined && bytes > maxBytes) {\n throw new Error(`${label} exceeded ${maxBytes} bytes.`);\n }\n}\n\nfunction parseMultipartBoundary(contentType: string | null): string | undefined {\n if (contentType === null) {\n return undefined;\n }\n\n const [mediaType, ...parameters] = contentType.split(\";\").map((part) => part.trim());\n\n if (mediaType?.toLowerCase() !== \"multipart/form-data\") {\n return undefined;\n }\n\n for (const parameter of parameters) {\n const [rawName, ...rawValue] = parameter.split(\"=\");\n\n if (rawName?.trim().toLowerCase() !== \"boundary\") {\n continue;\n }\n\n const value = rawValue.join(\"=\").trim();\n const unquoted = value.startsWith(\"\\\"\") && value.endsWith(\"\\\"\")\n ? value.slice(1, -1)\n : value;\n\n return unquoted === \"\" ? undefined : unquoted;\n }\n\n return undefined;\n}\n\nfunction parsePartHeaders(rawHeaders: string): Headers {\n const headers = new Headers();\n\n for (const line of rawHeaders.split(crlf)) {\n if (line.trim() === \"\") {\n continue;\n }\n\n const separator = line.indexOf(\":\");\n\n if (separator < 0) {\n throw new Error(`Malformed multipart header: ${line}`);\n }\n\n headers.append(\n line.slice(0, separator).trim().toLowerCase(),\n line.slice(separator + 1).trim(),\n );\n }\n\n return headers;\n}\n\nfunction parseContentDisposition(value: string | null): {\n name: string | undefined;\n filename: string | undefined;\n} {\n if (value === null) {\n return { name: undefined, filename: undefined };\n }\n\n const parameters = value.split(\";\").map((part) => part.trim());\n const disposition = parameters.shift()?.toLowerCase();\n\n if (disposition !== \"form-data\") {\n return { name: undefined, filename: undefined };\n }\n\n let name: string | undefined;\n let filename: string | undefined;\n\n for (const parameter of parameters) {\n const separator = parameter.indexOf(\"=\");\n\n if (separator < 0) {\n continue;\n }\n\n const key = parameter.slice(0, separator).trim().toLowerCase();\n const value = unquoteHeaderParameter(parameter.slice(separator + 1).trim());\n\n if (key === \"name\") {\n name = value;\n } else if (key === \"filename\") {\n filename = value;\n }\n }\n\n return { name, filename };\n}\n\nfunction unquoteHeaderParameter(value: string): string {\n if (!value.startsWith(\"\\\"\") || !value.endsWith(\"\\\"\")) {\n return value;\n }\n\n return value.slice(1, -1).replaceAll(/\\\\\"/g, \"\\\"\").replaceAll(/\\\\\\\\/g, \"\\\\\");\n}\n\nfunction concatBytes(\n left: Uint8Array<ArrayBufferLike>,\n right: Uint8Array<ArrayBufferLike>,\n): Uint8Array<ArrayBufferLike> {\n if (left.length === 0) {\n return right;\n }\n\n const next = new Uint8Array(left.length + right.length);\n next.set(left);\n next.set(right, left.length);\n return next;\n}\n\nfunction indexOfAscii(bytes: Uint8Array<ArrayBufferLike>, needle: string): number {\n return indexOfBytes(bytes, encodeAscii(needle));\n}\n\nfunction indexOfBytes(\n bytes: Uint8Array<ArrayBufferLike>,\n needle: Uint8Array<ArrayBufferLike>,\n): number {\n if (needle.length === 0 || bytes.length < needle.length) {\n return -1;\n }\n\n const first = needle[0];\n\n for (let index = 0; index <= bytes.length - needle.length; index += 1) {\n if (bytes[index] !== first) {\n continue;\n }\n\n let matched = true;\n\n for (let offset = 1; offset < needle.length; offset += 1) {\n if (bytes[index + offset] !== needle[offset]) {\n matched = false;\n break;\n }\n }\n\n if (matched) {\n return index;\n }\n }\n\n return -1;\n}\n\nfunction startsWithBytes(\n bytes: Uint8Array<ArrayBufferLike>,\n prefix: Uint8Array<ArrayBufferLike>,\n): boolean {\n if (bytes.length < prefix.length) {\n return false;\n }\n\n for (let index = 0; index < prefix.length; index += 1) {\n if (bytes[index] !== prefix[index]) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction encodeAscii(value: string): Uint8Array<ArrayBufferLike> {\n return new TextEncoder().encode(value);\n}\n\nfunction decodeAscii(value: Uint8Array<ArrayBufferLike>): string {\n return new TextDecoder(\"utf-8\", { fatal: false }).decode(value);\n}\n\nclass AsyncQueue<T> implements AsyncIterator<T> {\n private readonly values: T[] = [];\n private readonly waits: Array<{\n resolve(result: IteratorResult<T>): void;\n reject(error: unknown): void;\n }> = [];\n private done = false;\n private error: unknown;\n private onCancel: (() => void) | undefined;\n\n setCancel(onCancel: (() => void) | undefined): void {\n this.onCancel = onCancel;\n }\n\n push(value: T): void {\n const wait = this.waits.shift();\n\n if (wait !== undefined) {\n wait.resolve({ done: false, value });\n return;\n }\n\n this.values.push(value);\n }\n\n close(): void {\n this.done = true;\n\n for (const wait of this.waits.splice(0)) {\n wait.resolve({ done: true, value: undefined });\n }\n }\n\n fail(error: unknown): void {\n this.error = error;\n this.done = true;\n\n for (const wait of this.waits.splice(0)) {\n wait.reject(error);\n }\n }\n\n next(): Promise<IteratorResult<T>> {\n if (this.values.length > 0) {\n return Promise.resolve({ done: false, value: this.values.shift() as T });\n }\n\n if (this.error !== undefined) {\n return Promise.reject(this.error);\n }\n\n if (this.done) {\n return Promise.resolve({ done: true, value: undefined });\n }\n\n return new Promise((resolve, reject) => {\n this.waits.push({ resolve, reject });\n });\n }\n\n return(): Promise<IteratorResult<T>> {\n this.done = true;\n this.values.splice(0);\n this.onCancel?.();\n\n for (const wait of this.waits.splice(0)) {\n wait.resolve({ done: true, value: undefined });\n }\n\n return Promise.resolve({ done: true, value: undefined });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"multipart.js","sourceRoot":"","sources":["../src/multipart.ts"],"names":[],"mappings":"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","sourcesContent":["export interface MultipartStreamParseOptions {\n fields?: Readonly<Record<string, MultipartStreamFieldOptions>>;\n maxParts?: number;\n maxBytes?: number;\n}\n\nexport interface MultipartStreamFieldOptions {\n type?: \"stream\" | \"text\";\n maxBytes?: number;\n}\n\nexport interface MultipartStreamPart {\n name: string;\n filename?: string;\n safeFilename?: string;\n contentType?: string;\n headers: Headers;\n body: ReadableStream<Uint8Array<ArrayBufferLike>>;\n text(): Promise<string>;\n arrayBuffer(): Promise<ArrayBuffer>;\n fixedLengthStream(length?: number | bigint): MultipartFixedLengthStream;\n}\n\nexport interface MultipartFixedLengthStream {\n readable: ReadableStream<Uint8Array<ArrayBufferLike>>;\n done: Promise<void>;\n}\n\ninterface PartWriter {\n name: string;\n maxBytes: number | undefined;\n bytes: number;\n writer: WritableStreamDefaultWriter<Uint8Array<ArrayBufferLike>>;\n}\n\nconst crlf = \"\\r\\n\";\nconst headerSeparator = \"\\r\\n\\r\\n\";\nconst maxHeaderBytes = 64 * 1024;\nexport const defaultMultipartMaxBytes = 10 * 1024 * 1024;\nexport const defaultMultipartMaxParts = 1_000;\n\nexport function parseMultipartStream(\n request: Request,\n options: MultipartStreamParseOptions = {},\n): AsyncIterable<MultipartStreamPart> {\n return {\n [Symbol.asyncIterator]() {\n const queue = new AsyncQueue<MultipartStreamPart>();\n void parseMultipartRequest(request, options, queue);\n return queue;\n },\n };\n}\n\nasync function parseMultipartRequest(\n request: Request,\n options: MultipartStreamParseOptions,\n queue: AsyncQueue<MultipartStreamPart>,\n): Promise<void> {\n const boundary = parseMultipartBoundary(request.headers.get(\"content-type\"));\n\n if (boundary === undefined) {\n queue.fail(new Error(\"Multipart request content-type must include a boundary.\"));\n return;\n }\n\n if (request.body === null) {\n queue.fail(new Error(\"Multipart request body is not readable.\"));\n return;\n }\n\n const reader = request.body.getReader();\n const delimiter = encodeAscii(`${crlf}--${boundary}`);\n const firstBoundary = encodeAscii(`--${boundary}`);\n const closeSuffix = encodeAscii(\"--\");\n const lineSuffix = encodeAscii(crlf);\n const keepTailBytes = delimiter.length + 4;\n let buffer: Uint8Array<ArrayBufferLike> = new Uint8Array();\n let totalBytes = 0;\n let totalParts = 0;\n let started = false;\n let currentPart: PartWriter | undefined;\n\n queue.setCancel(() => {\n void currentPart?.writer.abort(new Error(\"Multipart stream iteration was cancelled.\"));\n void reader.cancel();\n });\n\n try {\n while (true) {\n const next = await reader.read();\n\n if (!next.done) {\n totalBytes += next.value.byteLength;\n enforceByteLimit(\"multipart request\", totalBytes, options.maxBytes ?? defaultMultipartMaxBytes);\n buffer = concatBytes(buffer, next.value);\n }\n\n while (true) {\n if (!started) {\n const firstBoundaryIndex = indexOfBytes(buffer, firstBoundary);\n\n if (firstBoundaryIndex < 0) {\n if (next.done) {\n throw new Error(\"Multipart request body does not contain the opening boundary.\");\n }\n\n trimBufferToTail(0);\n break;\n }\n\n buffer = buffer.slice(firstBoundaryIndex + firstBoundary.length);\n\n if (startsWithBytes(buffer, closeSuffix)) {\n queue.close();\n return;\n }\n\n if (!startsWithBytes(buffer, lineSuffix)) {\n if (next.done) {\n throw new Error(\"Malformed multipart opening boundary.\");\n }\n break;\n }\n\n buffer = buffer.slice(lineSuffix.length);\n started = true;\n }\n\n if (currentPart === undefined) {\n const headerEnd = indexOfAscii(buffer, headerSeparator);\n\n if (headerEnd < 0) {\n if (next.done) {\n throw new Error(\"Multipart part ended before headers completed.\");\n }\n\n if (buffer.length > maxHeaderBytes) {\n throw new Error(`Multipart part headers exceeded ${maxHeaderBytes} bytes.`);\n }\n break;\n }\n\n totalParts += 1;\n enforcePartLimit(totalParts, options.maxParts ?? defaultMultipartMaxParts);\n currentPart = createPartWriter(\n decodeAscii(buffer.slice(0, headerEnd)),\n options,\n queue,\n );\n buffer = buffer.slice(headerEnd + headerSeparator.length);\n }\n\n const delimiterIndex = indexOfBytes(buffer, delimiter);\n\n if (delimiterIndex < 0) {\n if (next.done) {\n throw new Error(`Multipart part \"${currentPart.name}\" ended before the closing boundary.`);\n }\n\n const writableLength = Math.max(0, buffer.length - keepTailBytes);\n\n if (writableLength === 0) {\n break;\n }\n\n await writePartChunk(currentPart, buffer.slice(0, writableLength));\n buffer = buffer.slice(writableLength);\n continue;\n }\n\n await writePartChunk(currentPart, buffer.slice(0, delimiterIndex));\n await currentPart.writer.close();\n buffer = buffer.slice(delimiterIndex + delimiter.length);\n currentPart = undefined;\n\n if (startsWithBytes(buffer, closeSuffix)) {\n queue.close();\n return;\n }\n\n if (startsWithBytes(buffer, lineSuffix)) {\n buffer = buffer.slice(lineSuffix.length);\n continue;\n }\n\n if (next.done) {\n throw new Error(\"Malformed multipart boundary delimiter.\");\n }\n\n break;\n }\n\n if (next.done) {\n break;\n }\n }\n\n queue.close();\n } catch (error) {\n await currentPart?.writer.abort(error);\n queue.fail(error);\n } finally {\n queue.setCancel(undefined);\n reader.releaseLock();\n }\n\n function trimBufferToTail(prefixLength: number): void {\n if (buffer.length <= keepTailBytes + prefixLength) {\n return;\n }\n\n buffer = buffer.slice(buffer.length - keepTailBytes - prefixLength);\n }\n}\n\nfunction createPartWriter(\n rawHeaders: string,\n options: MultipartStreamParseOptions,\n queue: AsyncQueue<MultipartStreamPart>,\n): PartWriter {\n const headers = parsePartHeaders(rawHeaders);\n const disposition = parseContentDisposition(headers.get(\"content-disposition\"));\n\n if (disposition.name === undefined) {\n throw new Error(\"Multipart part is missing a form-data name.\");\n }\n\n const stream = new TransformStream<Uint8Array, Uint8Array>();\n const part = createPart({\n name: disposition.name,\n filename: disposition.filename,\n headers,\n body: stream.readable,\n });\n\n queue.push(part);\n\n return {\n name: disposition.name,\n maxBytes: options.fields?.[disposition.name]?.maxBytes,\n bytes: 0,\n writer: stream.writable.getWriter(),\n };\n}\n\nfunction createPart(options: {\n name: string;\n filename: string | undefined;\n headers: Headers;\n body: ReadableStream<Uint8Array>;\n}): MultipartStreamPart {\n const part: MultipartStreamPart = {\n name: options.name,\n headers: options.headers,\n body: options.body,\n text() {\n return new Response(options.body).text();\n },\n arrayBuffer() {\n return new Response(options.body).arrayBuffer();\n },\n fixedLengthStream(length) {\n const expectedLength = length ?? contentLengthFromHeaders(options.headers);\n const stream = createFixedLengthStream(expectedLength);\n\n return {\n readable: stream.readable,\n done: options.body.pipeTo(stream.writable),\n };\n },\n };\n\n if (options.filename !== undefined) {\n part.filename = options.filename;\n part.safeFilename = sanitizeMultipartFilename(options.filename);\n }\n\n const contentType = options.headers.get(\"content-type\");\n\n if (contentType !== null) {\n part.contentType = contentType;\n }\n\n return part;\n}\n\nfunction contentLengthFromHeaders(headers: Headers): number | bigint {\n const raw = headers.get(\"content-length\");\n\n if (raw === null || raw.trim() === \"\") {\n throw new Error(\n \"Multipart part fixedLengthStream() requires a byte length. Pass an explicit length or include a Content-Length part header.\",\n );\n }\n\n const parsed = Number(raw);\n\n if (!Number.isSafeInteger(parsed) || parsed < 0) {\n throw new Error(`Multipart part Content-Length must be a non-negative safe integer. Received ${JSON.stringify(raw)}.`);\n }\n\n return parsed;\n}\n\nfunction createFixedLengthStream(length: number | bigint): TransformStream<Uint8Array<ArrayBufferLike>, Uint8Array<ArrayBufferLike>> {\n const FixedLengthStream = (globalThis as {\n FixedLengthStream?: new (\n length: number | bigint,\n ) => TransformStream<Uint8Array<ArrayBufferLike>, Uint8Array<ArrayBufferLike>>;\n }).FixedLengthStream;\n\n if (FixedLengthStream === undefined) {\n throw new Error(\n \"FixedLengthStream is not available in this runtime. Use arrayBuffer() or pass the part body to a destination that accepts unknown-length streams.\",\n );\n }\n\n return new FixedLengthStream(length);\n}\n\nasync function writePartChunk(\n part: PartWriter,\n chunk: Uint8Array<ArrayBufferLike>,\n): Promise<void> {\n if (chunk.byteLength === 0) {\n return;\n }\n\n part.bytes += chunk.byteLength;\n enforceByteLimit(`multipart field \"${part.name}\"`, part.bytes, part.maxBytes);\n await part.writer.write(chunk);\n}\n\nfunction enforceByteLimit(label: string, bytes: number, maxBytes: number | undefined): void {\n if (maxBytes !== undefined && bytes > maxBytes) {\n throw new Error(`${label} exceeded ${maxBytes} bytes.`);\n }\n}\n\nfunction enforcePartLimit(parts: number, maxParts: number | undefined): void {\n if (maxParts !== undefined && parts > maxParts) {\n throw new Error(`multipart request exceeded ${maxParts} parts.`);\n }\n}\n\nexport function sanitizeMultipartFilename(filename: string): string {\n const leaf = filename.split(/[\\\\/]/u).at(-1) ?? \"\";\n let sanitized = \"\";\n\n for (const char of leaf) {\n sanitized += isControlCharacter(char) ? \"_\" : char;\n }\n\n return sanitized === \"\" || sanitized === \".\" || sanitized === \"..\" ? \"upload.bin\" : sanitized;\n}\n\nfunction isControlCharacter(char: string): boolean {\n const code = char.charCodeAt(0);\n\n return code < 0x20 || code === 0x7f;\n}\n\nfunction parseMultipartBoundary(contentType: string | null): string | undefined {\n if (contentType === null) {\n return undefined;\n }\n\n const [mediaType, ...parameters] = contentType.split(\";\").map((part) => part.trim());\n\n if (mediaType?.toLowerCase() !== \"multipart/form-data\") {\n return undefined;\n }\n\n for (const parameter of parameters) {\n const [rawName, ...rawValue] = parameter.split(\"=\");\n\n if (rawName?.trim().toLowerCase() !== \"boundary\") {\n continue;\n }\n\n const value = rawValue.join(\"=\").trim();\n const unquoted = value.startsWith(\"\\\"\") && value.endsWith(\"\\\"\")\n ? value.slice(1, -1)\n : value;\n\n return unquoted === \"\" ? undefined : unquoted;\n }\n\n return undefined;\n}\n\nfunction parsePartHeaders(rawHeaders: string): Headers {\n const headers = new Headers();\n\n for (const line of rawHeaders.split(crlf)) {\n if (line.trim() === \"\") {\n continue;\n }\n\n const separator = line.indexOf(\":\");\n\n if (separator < 0) {\n throw new Error(`Malformed multipart header: ${line}`);\n }\n\n headers.append(\n line.slice(0, separator).trim().toLowerCase(),\n line.slice(separator + 1).trim(),\n );\n }\n\n return headers;\n}\n\nfunction parseContentDisposition(value: string | null): {\n name: string | undefined;\n filename: string | undefined;\n} {\n if (value === null) {\n return { name: undefined, filename: undefined };\n }\n\n const parameters = value.split(\";\").map((part) => part.trim());\n const disposition = parameters.shift()?.toLowerCase();\n\n if (disposition !== \"form-data\") {\n return { name: undefined, filename: undefined };\n }\n\n let name: string | undefined;\n let filename: string | undefined;\n\n for (const parameter of parameters) {\n const separator = parameter.indexOf(\"=\");\n\n if (separator < 0) {\n continue;\n }\n\n const key = parameter.slice(0, separator).trim().toLowerCase();\n const value = unquoteHeaderParameter(parameter.slice(separator + 1).trim());\n\n if (key === \"name\") {\n name = value;\n } else if (key === \"filename\") {\n filename = value;\n }\n }\n\n return { name, filename };\n}\n\nfunction unquoteHeaderParameter(value: string): string {\n if (!value.startsWith(\"\\\"\") || !value.endsWith(\"\\\"\")) {\n return value;\n }\n\n return value.slice(1, -1).replaceAll(/\\\\\"/g, \"\\\"\").replaceAll(/\\\\\\\\/g, \"\\\\\");\n}\n\nfunction concatBytes(\n left: Uint8Array<ArrayBufferLike>,\n right: Uint8Array<ArrayBufferLike>,\n): Uint8Array<ArrayBufferLike> {\n if (left.length === 0) {\n return right;\n }\n\n const next = new Uint8Array(left.length + right.length);\n next.set(left);\n next.set(right, left.length);\n return next;\n}\n\nfunction indexOfAscii(bytes: Uint8Array<ArrayBufferLike>, needle: string): number {\n return indexOfBytes(bytes, encodeAscii(needle));\n}\n\nfunction indexOfBytes(\n bytes: Uint8Array<ArrayBufferLike>,\n needle: Uint8Array<ArrayBufferLike>,\n): number {\n if (needle.length === 0 || bytes.length < needle.length) {\n return -1;\n }\n\n const first = needle[0];\n\n for (let index = 0; index <= bytes.length - needle.length; index += 1) {\n if (bytes[index] !== first) {\n continue;\n }\n\n let matched = true;\n\n for (let offset = 1; offset < needle.length; offset += 1) {\n if (bytes[index + offset] !== needle[offset]) {\n matched = false;\n break;\n }\n }\n\n if (matched) {\n return index;\n }\n }\n\n return -1;\n}\n\nfunction startsWithBytes(\n bytes: Uint8Array<ArrayBufferLike>,\n prefix: Uint8Array<ArrayBufferLike>,\n): boolean {\n if (bytes.length < prefix.length) {\n return false;\n }\n\n for (let index = 0; index < prefix.length; index += 1) {\n if (bytes[index] !== prefix[index]) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction encodeAscii(value: string): Uint8Array<ArrayBufferLike> {\n return new TextEncoder().encode(value);\n}\n\nfunction decodeAscii(value: Uint8Array<ArrayBufferLike>): string {\n return new TextDecoder(\"utf-8\", { fatal: false }).decode(value);\n}\n\nclass AsyncQueue<T> implements AsyncIterator<T> {\n private readonly values: T[] = [];\n private readonly waits: Array<{\n resolve(result: IteratorResult<T>): void;\n reject(error: unknown): void;\n }> = [];\n private done = false;\n private error: unknown;\n private onCancel: (() => void) | undefined;\n\n setCancel(onCancel: (() => void) | undefined): void {\n this.onCancel = onCancel;\n }\n\n push(value: T): void {\n const wait = this.waits.shift();\n\n if (wait !== undefined) {\n wait.resolve({ done: false, value });\n return;\n }\n\n this.values.push(value);\n }\n\n close(): void {\n this.done = true;\n\n for (const wait of this.waits.splice(0)) {\n wait.resolve({ done: true, value: undefined });\n }\n }\n\n fail(error: unknown): void {\n this.error = error;\n this.done = true;\n\n for (const wait of this.waits.splice(0)) {\n wait.reject(error);\n }\n }\n\n next(): Promise<IteratorResult<T>> {\n if (this.values.length > 0) {\n return Promise.resolve({ done: false, value: this.values.shift() as T });\n }\n\n if (this.error !== undefined) {\n return Promise.reject(this.error);\n }\n\n if (this.done) {\n return Promise.resolve({ done: true, value: undefined });\n }\n\n return new Promise((resolve, reject) => {\n this.waits.push({ resolve, reject });\n });\n }\n\n return(): Promise<IteratorResult<T>> {\n this.done = true;\n this.values.splice(0);\n this.onCancel?.();\n\n for (const wait of this.waits.splice(0)) {\n wait.resolve({ done: true, value: undefined });\n }\n\n return Promise.resolve({ done: true, value: undefined });\n }\n}\n"]}
|
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
import type { AppRoute, MatchedRoute, RouteMatcher } from "./routes.js";
|
|
2
|
+
interface NativeRouteMatcherInstance {
|
|
3
|
+
matchRoute(pathname: string): NativeMatchOutput | null | undefined;
|
|
4
|
+
}
|
|
5
|
+
interface NativeMatchOutput {
|
|
6
|
+
index: number;
|
|
7
|
+
params: Record<string, string>;
|
|
8
|
+
}
|
|
2
9
|
export declare function createNativeRouteMatcher(sortedRoutes: readonly AppRoute[]): RouteMatcher | undefined;
|
|
10
|
+
export declare function __matchNativeRouteForTesting(matcher: NativeRouteMatcherInstance, sortedRoutes: readonly AppRoute[], pathname: string): MatchedRoute | undefined;
|
|
3
11
|
export declare function normalizeNativeParams(route: AppRoute, params: Record<string, string>): MatchedRoute["params"];
|
|
4
12
|
export declare function shouldUseNativeRouteMatcher(routeCount: number, mode: string | undefined): boolean;
|
|
5
13
|
export declare function nativeModulePackageCandidates(platform: NodeJS.Platform, arch: string): string[];
|
|
14
|
+
export {};
|
|
6
15
|
//# sourceMappingURL=native-route-matcher.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native-route-matcher.d.ts","sourceRoot":"","sources":["../src/native-route-matcher.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"native-route-matcher.d.ts","sourceRoot":"","sources":["../src/native-route-matcher.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAExE,UAAU,0BAA0B;IAClC,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,GAAG,SAAS,CAAC;CACpE;AAUD,UAAU,iBAAiB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAKD,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,SAAS,QAAQ,EAAE,GAChC,YAAY,GAAG,SAAS,CA8B1B;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,0BAA0B,EACnC,YAAY,EAAE,SAAS,QAAQ,EAAE,EACjC,QAAQ,EAAE,MAAM,GACf,YAAY,GAAG,SAAS,CAE1B;AA4BD,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,QAAQ,EACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,YAAY,CAAC,QAAQ,CAAC,CAiBxB;AAUD,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,GAAG,SAAS,GACvB,OAAO,CAUT;AA6CD,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAO/F"}
|