edgespec
Version:
Write Winter-CG compatible routes with filesystem routing and tons of features
1 lines • 38 kB
Source Map (JSON)
{"version":3,"sources":["../../src/config/utils.ts","../../src/edge/transform-to-node.ts","../../src/helpers.ts","../../src/dev/headless/request-handler-controller.ts","../../src/dev/headless/start-server.ts","../../src/bundle/get-temp-path-in-app.ts","../../src/routes/create-route-map-from-directory.ts","../../src/bundle/construct-manifest.ts","../../src/bundle/watch.ts","../../src/lib/async-work-tracker.ts","../../src/dev/headless/start-bundler.ts","../../src/dev/dev-server.ts","../../src/dev/dev.ts"],"names":["path","fs","bundleRequire","primitives","buildToNodeHandler","EdgeRuntime","context","birpc","createBirpc","createServer","kleur","once","getMatchingFilePaths","isGitIgnored","Watcher","esbuild","EventEmitter","createBirpcGroup","build","formatMessages","MessageChannel"],"mappings":"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","file":"dev.cjs","sourcesContent":["import path from \"node:path\"\nimport fs from \"node:fs/promises\"\nimport { bundleRequire } from \"bundle-require\"\nimport { EdgeSpecConfig } from \"src/config/config.js\"\nimport { SetRequired } from \"type-fest\"\n\nconst cloneObjectAndDeleteUndefinedKeys = <T extends Record<string, any>>(\n obj: T\n) => {\n const clone = { ...obj }\n Object.keys(clone).forEach((key) => {\n if (clone[key] === undefined) {\n delete clone[key]\n }\n })\n return clone\n}\n\nconst resolvePossibleRelativePath = (\n possibleRelativePath: string,\n configDirectory: string\n) => {\n if (path.isAbsolute(possibleRelativePath)) {\n return possibleRelativePath\n }\n\n return path.resolve(configDirectory, possibleRelativePath)\n}\n\nexport interface ResolvedEdgeSpecConfig extends EdgeSpecConfig {\n rootDirectory: string\n tsconfigPath: string\n routesDirectory: string\n}\n\n/**\n * Resolves relative paths and sets defaults for any missing values.\n */\nexport const resolveConfig = (\n config: SetRequired<EdgeSpecConfig, \"rootDirectory\">\n): ResolvedEdgeSpecConfig => {\n const { rootDirectory, tsconfigPath, routesDirectory, ...rest } =\n cloneObjectAndDeleteUndefinedKeys(config)\n\n const resolvedRootDirectory = path.resolve(config.rootDirectory)\n\n return {\n rootDirectory: resolvedRootDirectory,\n tsconfigPath: resolvePossibleRelativePath(\n tsconfigPath ?? \"tsconfig.json\",\n resolvedRootDirectory\n ),\n routesDirectory: resolvePossibleRelativePath(\n routesDirectory ?? \"api\",\n resolvedRootDirectory\n ),\n platform: \"wintercg-minimal\",\n ...rest,\n }\n}\n\nconst validateConfig = async (config: ResolvedEdgeSpecConfig) => {\n try {\n await fs.stat(config.routesDirectory)\n } catch (error) {\n throw new Error(`Could not find routes directory ${config.routesDirectory}`)\n }\n\n try {\n await fs.stat(config.tsconfigPath)\n } catch (error) {\n throw new Error(`Could not find tsconfig.json at ${config.tsconfigPath}`)\n }\n\n return config\n}\n\nexport const loadConfig = async (\n rootDirectory: string,\n overrides?: Partial<EdgeSpecConfig>\n) => {\n let loadedConfig: EdgeSpecConfig = {}\n\n let configInRootExists = false\n const potentialConfigPath = path.join(rootDirectory, \"edgespec.config.ts\")\n try {\n await fs.stat(potentialConfigPath)\n configInRootExists = true\n } catch {}\n\n if (configInRootExists) {\n const {\n mod: { default: config },\n } = await bundleRequire({\n filepath: potentialConfigPath,\n })\n\n if (!config) {\n throw new Error(\n `Could not find a default export in ${potentialConfigPath}`\n )\n }\n\n loadedConfig = config\n }\n\n return await validateConfig(\n resolveConfig({\n rootDirectory,\n ...loadedConfig,\n ...cloneObjectAndDeleteUndefinedKeys(overrides ?? {}),\n })\n )\n}\n","import {\n buildToNodeHandler,\n type RequestOptions,\n} from \"@edge-runtime/node-utils\"\nimport primitives from \"@edge-runtime/primitives\"\n\nexport interface TransformToNodeOptions extends RequestOptions {}\n\nconst dependencies = {\n ...primitives,\n Uint8Array,\n}\n\nexport const transformToNodeBuilder = (options: TransformToNodeOptions) =>\n buildToNodeHandler(dependencies, options)\n","import { EdgeSpecRouteBundle } from \"./types/index.js\"\n\n/**\n * Loads a file created by `edgespec bundle` and returns the default export.\n * This is a very thin wrapper over `import()` that adds some types.\n */\nexport const loadBundle = async (\n bundlePath: string\n): Promise<EdgeSpecRouteBundle> => {\n const bundle = await import(bundlePath)\n // If the file is imported as CJS, the default export is nested.\n // Naming this with .mjs seems to break some on-the-fly transpiling tools downstream.\n return bundle.default.default ?? bundle.default\n}\n","import fs from \"node:fs/promises\"\nimport { EdgeRuntime } from \"edge-runtime\"\nimport type { BirpcReturn } from \"birpc\"\nimport { makeRequestAgainstEdgeSpec } from \"src/types/edge-spec.js\"\nimport { Middleware } from \"src/middleware/index.js\"\nimport { loadBundle } from \"src/helpers.js\"\nimport type { BundlerRpcFunctions } from \"./types.js\"\n\nconst BUILD_ERROR_MESSAGE =\n \"Could not build your app. Check your terminal for more information.\"\n\nexport class RequestHandlerController {\n private cachedWinterCGRuntime?: EdgeRuntime\n private cachedNodeHandler?: ReturnType<typeof makeRequestAgainstEdgeSpec>\n private buildLastUpdatedAt = 0\n\n constructor(\n private bundlerRpc: BirpcReturn<BundlerRpcFunctions, any>,\n private middleware: Middleware[]\n ) {}\n\n /**\n * You **should not** cache the result of this function. Call it every time you want to use the runtime.\n */\n async getWinterCGRuntime() {\n const { buildUpdatedAtMs, ...build } =\n await this.bundlerRpc.waitForAvailableBuild()\n\n if (\n this.buildLastUpdatedAt === buildUpdatedAtMs &&\n this.cachedWinterCGRuntime\n ) {\n return this.cachedWinterCGRuntime\n }\n\n if (build.type === \"failure\") {\n this.cachedWinterCGRuntime = new EdgeRuntime({\n initialCode: `\n addEventListener(\"fetch\", (event) => {\n event.respondWith(new Response(\"${BUILD_ERROR_MESSAGE}\", { status: 500 }))\n })\n `,\n })\n } else {\n const contents = await fs.readFile(build.bundlePath, \"utf-8\")\n const { middleware } = this\n this.cachedWinterCGRuntime = new EdgeRuntime({\n initialCode: contents,\n extend(context) {\n context._injectedEdgeSpecMiddleware = middleware\n return context\n },\n })\n }\n\n this.buildLastUpdatedAt = buildUpdatedAtMs\n return this.cachedWinterCGRuntime\n }\n\n /**\n * You **should not** cache the result of this function. Call it every time you want to use the handler.\n */\n async getNodeHandler(): Promise<\n ReturnType<typeof makeRequestAgainstEdgeSpec>\n > {\n const { buildUpdatedAtMs, ...build } =\n await this.bundlerRpc.waitForAvailableBuild()\n\n if (\n this.buildLastUpdatedAt === buildUpdatedAtMs &&\n this.cachedNodeHandler\n ) {\n return this.cachedNodeHandler\n }\n\n if (build.type === \"failure\") {\n this.cachedNodeHandler = async () =>\n new Response(BUILD_ERROR_MESSAGE, { status: 500 })\n } else {\n // We append the timestamp to the path to bust the cache\n const edgeSpecModule = await loadBundle(\n `file:${build.bundlePath}#${Date.now()}`\n )\n\n this.cachedNodeHandler = async (req) =>\n edgeSpecModule.makeRequest(req, {\n middleware: this.middleware,\n })\n }\n\n this.buildLastUpdatedAt = buildUpdatedAtMs\n return this.cachedNodeHandler\n }\n}\n","import { once } from \"node:events\"\nimport { createServer } from \"node:http\"\nimport kleur from \"kleur\"\nimport { transformToNodeBuilder } from \"src/edge/transform-to-node.js\"\nimport { ResolvedEdgeSpecConfig } from \"src/config/utils.js\"\nimport { RequestHandlerController } from \"./request-handler-controller.js\"\nimport { Middleware } from \"src/middleware/index.js\"\nimport { createBirpc, type ChannelOptions } from \"birpc\"\nimport { BundlerRpcFunctions, HttpServerRpcFunctions } from \"./types.js\"\n\nexport interface StartHeadlessDevServerOptions {\n port: number\n config: ResolvedEdgeSpecConfig\n rpcChannel: ChannelOptions\n middleware?: Middleware[]\n onListening?: (port: number) => void\n onBuildStart?: HttpServerRpcFunctions[\"onBuildStart\"]\n onBuildEnd?: HttpServerRpcFunctions[\"onBuildEnd\"]\n}\n\n/**\n * Start a headless EdgeSpec dev server. It receives a bundle from the headless dev bundler and serves it.\n *\n * This must be run within a native context (Node.js, Bun, or Deno).\n */\nexport const startHeadlessDevServer = async ({\n port,\n config,\n rpcChannel,\n middleware = [],\n onListening,\n onBuildStart,\n onBuildEnd,\n}: StartHeadlessDevServerOptions) => {\n const birpc = createBirpc<BundlerRpcFunctions, HttpServerRpcFunctions>(\n {\n onBuildStart: () => {\n onBuildStart?.()\n },\n onBuildEnd: (result) => {\n onBuildEnd?.(result)\n },\n },\n rpcChannel\n )\n const controller = new RequestHandlerController(birpc, middleware)\n\n const server = createServer(\n transformToNodeBuilder({\n defaultOrigin: `http://localhost:${port}`,\n })(async (req) => {\n try {\n if (config.platform === \"wintercg-minimal\") {\n const runtime = await controller.getWinterCGRuntime()\n const response = await runtime.dispatchFetch(req.url, req)\n await response.waitUntil()\n return response\n }\n\n const nodeHandler = await controller.getNodeHandler()\n return await nodeHandler(req)\n } catch (error) {\n if (error instanceof Error) {\n process.stderr.write(\n kleur.bgRed(\"\\nUnhandled exception:\\n\") +\n (error.stack ?? error.message) +\n \"\\n\"\n )\n } else {\n process.stderr.write(\n \"Unhandled exception:\\n\" +\n ((error as any).stack\n ? (error as any).stack\n : JSON.stringify(error)) +\n \"\\n\"\n )\n }\n\n return new Response(\"Internal server error\", {\n status: 500,\n })\n }\n })\n )\n\n const listeningPromise = once(server, \"listening\")\n server.listen(port)\n await listeningPromise\n onListening?.(port)\n\n return {\n server,\n stop: async () => {\n const closePromise = once(server, \"close\")\n server.close()\n await closePromise\n },\n getBuildResult: async () => {\n return birpc.waitForAvailableBuild()\n },\n }\n}\n","import path from \"node:path\"\nimport fs from \"node:fs/promises\"\n\nexport const getTempPathInApp = async (rootDirectory: string) => {\n const tempDir = path.resolve(path.join(rootDirectory, \".edgespec\"))\n await fs.mkdir(tempDir, { recursive: true })\n return tempDir\n}\n","import { getMatchingFilePaths } from \"make-vfs\"\n\nexport const createRouteMapFromDirectory = async (\n directoryPath: string\n): Promise<Record<string, { relativePath: string }>> => {\n const filePaths = await getMatchingFilePaths({\n dirPath: directoryPath,\n extensions: [\"ts\", \"tsx\"],\n })\n\n const routes: Record<string, { relativePath: string }> = {}\n for (let path of filePaths) {\n let routeWithSlash = path\n if (!path.startsWith(\"/\")) {\n routeWithSlash = `/${path}`\n }\n\n if (path.endsWith(\"index.ts\") || path.endsWith(\"index.tsx\")) {\n routes[`${routeWithSlash.replace(/\\/index\\.tsx*$/g, \"\")}`] = {\n relativePath: path,\n }\n } else {\n routes[`${routeWithSlash.replace(/\\.tsx*$/g, \"\")}`] = {\n relativePath: path,\n }\n }\n }\n\n // Fix root route\n if (routes[\"\"]) {\n routes[\"/\"] = routes[\"\"]\n delete routes[\"\"]\n }\n\n return routes\n}\n","import path from \"node:path\"\nimport { createRouteMapFromDirectory } from \"src/routes/create-route-map-from-directory.js\"\n\nconst alphabet = \"zyxwvutsrqponmlkjihgfedcba\"\n\nconst getRandomId = (length: number): string => {\n let str = \"\"\n let num = length\n while (num--) str += alphabet[(Math.random() * alphabet.length) | 0]\n return str\n}\n\ninterface ConstructManifestOptions {\n routesDirectory: string\n bundledAdapter?: \"wintercg-minimal\"\n}\n\nexport const constructManifest = async (options: ConstructManifestOptions) => {\n const routeMap = await createRouteMapFromDirectory(options.routesDirectory)\n\n const routes = Object.entries(routeMap).map(([route, { relativePath }]) => {\n return {\n route,\n relativePath,\n id: getRandomId(16),\n }\n })\n\n return `\nimport {getRouteMatcher} from \"next-route-matcher\"\nimport { makeRequestAgainstEdgeSpec } from \"edgespec\"\n\n${routes\n .map(\n ({ id, relativePath }) =>\n `import * as ${id} from \"${path.resolve(\n path.join(options.routesDirectory, relativePath)\n )}\"`\n )\n .join(\"\\n\")}\n\nconst routeMapWithHandlers = {\n ${routes.map(({ id, route }) => `\"${route}\": ${id}.default`).join(\",\")}\n}\n\nconst edgeSpec = {\n routeMatcher: getRouteMatcher(Object.keys(routeMapWithHandlers)),\n routeMapWithHandlers,\n makeRequest: async (req, options) => makeRequestAgainstEdgeSpec(edgeSpec, options)(req)\n}\n\n${\n options.bundledAdapter === \"wintercg-minimal\"\n ? `\nimport {addFetchListener} from \"edgespec/adapters/wintercg-minimal\"\naddFetchListener(edgeSpec)\n`\n : \"export default edgeSpec\"\n}\n `.trim()\n}\n","import Watcher from \"watcher\"\nimport * as esbuild from \"esbuild\"\nimport fs from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { constructManifest } from \"./construct-manifest.js\"\nimport { BundleOptions } from \"./types.js\"\nimport { getTempPathInApp } from \"./get-temp-path-in-app.js\"\nimport { isGitIgnored } from \"globby\"\n\n/**\n * This does not directly provide a way to retrieve the contents or path of the bundle. You should provide a plugin in the `esbuild` option to do so.\n */\nexport const bundleAndWatch = async (options: BundleOptions) => {\n const ignore = await isGitIgnored({\n cwd: options.rootDirectory,\n })\n\n const watcher = new Watcher(options.rootDirectory, {\n recursive: true,\n ignoreInitial: true,\n debounce: 0,\n ignore: (filePath: string) => {\n if (filePath.includes(\".edgespec\")) {\n return true\n }\n\n // globby breaks when the path being tested is not within the current working directory (cwd/rootDirectory)\n if (!path.relative(options.rootDirectory, filePath).startsWith(\"..\")) {\n return ignore(filePath)\n }\n\n return true\n },\n })\n\n const tempDir = await getTempPathInApp(options.rootDirectory)\n const manifestPath = path.join(tempDir, \"dev-manifest.ts\")\n\n const rebuildWithErrorHandling = async () => {\n try {\n await ctx?.rebuild()\n } catch {\n // Error is ignored here because it's assumed the caller handles it in the build.onEnd() callback\n }\n }\n\n const invalidateManifest = async () => {\n await fs.writeFile(manifestPath, await constructManifest(options), \"utf-8\")\n await rebuildWithErrorHandling()\n }\n\n const ctx = await esbuild.context({\n entryPoints: [manifestPath],\n bundle: true,\n format: \"esm\",\n write: false,\n sourcemap: \"inline\",\n logLevel: \"silent\",\n ...options.esbuild,\n })\n\n await invalidateManifest()\n\n watcher.on(\"change\", async () => {\n await rebuildWithErrorHandling()\n })\n\n watcher.on(\"add\", async () => {\n await invalidateManifest()\n })\n\n watcher.on(\"unlink\", async () => {\n await invalidateManifest()\n })\n\n watcher.on(\"unlinkDir\", async () => {\n await invalidateManifest()\n })\n\n return {\n stop: async () => {\n watcher.close()\n await ctx.dispose()\n },\n }\n}\n","import EventEmitter from \"node:events\"\n\n/**\n * This is effectively a Promise that can be resolved multiple times in different scopes without messily holding references to the resolve function.\n */\nexport class AsyncWorkTracker<Result> extends EventEmitter {\n private state: \"idle\" | \"pending\" | \"resolved\" = \"idle\"\n private lastResult: Result | undefined\n\n /**\n * If work is still pending, this waits for the next work result. If work is already resolved, it returns the last result.\n */\n async waitForResult(): Promise<Result> {\n if (this.state === \"pending\" || !this.lastResult) {\n return new Promise<Result>((resolve) => {\n this.once(\"result\", resolve)\n })\n }\n\n if (!this.lastResult) {\n throw new Error(\"No last result (this should never happen)\")\n }\n\n return this.lastResult\n }\n\n /**\n * Call this when you start async work.\n */\n beginAsyncWork() {\n this.state = \"pending\"\n }\n\n /**\n * Call this when the async work is done with the result.\n */\n finishAsyncWork(result: Result) {\n this.state = \"resolved\"\n this.emit(\"result\", result)\n this.lastResult = result\n }\n}\n","import path from \"path\"\nimport { getTempPathInApp } from \"src/bundle/get-temp-path-in-app.js\"\nimport { bundleAndWatch } from \"src/bundle/watch.js\"\nimport { ResolvedEdgeSpecConfig } from \"src/config/utils.js\"\nimport { ChannelOptions, createBirpcGroup } from \"birpc\"\nimport {\n HttpServerRpcFunctions,\n type BundlerRpcFunctions,\n BundlerBuildResult,\n} from \"./types.js\"\nimport { formatMessages } from \"esbuild\"\nimport { AsyncWorkTracker } from \"src/lib/async-work-tracker.js\"\n\nexport interface StartHeadlessDevBundlerOptions {\n config: ResolvedEdgeSpecConfig\n initialRpcChannels?: ChannelOptions[]\n}\n\n/**\n * Start a headless EdgeSpec dev bundler. It will continuously watch your code and rebuild on changes.\n * For this to be useful, you'll probably want to also start a headless dev server.\n * This must be run within a native context (Node.js, Bun, or Deno).\n */\nexport const startHeadlessDevBundler = async ({\n config,\n initialRpcChannels,\n}: StartHeadlessDevBundlerOptions) => {\n const tempDir = await getTempPathInApp(config.rootDirectory)\n const devBundlePath = path.join(tempDir, \"dev-bundle.js\")\n\n const buildTracker = new AsyncWorkTracker<BundlerBuildResult>()\n\n const rpcFunctions: BundlerRpcFunctions = {\n async waitForAvailableBuild() {\n return buildTracker.waitForResult()\n },\n }\n\n const birpc = createBirpcGroup<HttpServerRpcFunctions, BundlerRpcFunctions>(\n rpcFunctions,\n initialRpcChannels ?? [],\n { eventNames: [\"onBuildStart\", \"onBuildEnd\"] }\n )\n\n const { stop } = await bundleAndWatch({\n rootDirectory: config.rootDirectory,\n routesDirectory: config.routesDirectory,\n bundledAdapter:\n config.platform === \"wintercg-minimal\" ? \"wintercg-minimal\" : undefined,\n esbuild: {\n platform: config.platform === \"wintercg-minimal\" ? \"browser\" : \"node\",\n packages: config.platform === \"node\" ? \"external\" : undefined,\n format: config.platform === \"wintercg-minimal\" ? \"cjs\" : \"esm\",\n outfile: devBundlePath,\n write: true,\n plugins: [\n {\n name: \"watch\",\n setup(build) {\n build.onStart(async () => {\n buildTracker.beginAsyncWork()\n await birpc.broadcast.onBuildStart()\n })\n\n build.onEnd(async (result) => {\n let build: BundlerBuildResult\n if (result.errors.length === 0) {\n build = {\n type: \"success\",\n bundlePath: devBundlePath,\n buildUpdatedAtMs: Date.now(),\n }\n } else {\n build = {\n type: \"failure\",\n errorMessage: (\n await formatMessages(result.errors, {\n kind: \"error\",\n })\n ).join(\"\\n\"),\n buildUpdatedAtMs: Date.now(),\n }\n }\n\n buildTracker.finishAsyncWork(build)\n await birpc.broadcast.onBuildEnd(build)\n })\n },\n },\n ],\n },\n })\n\n return {\n stop,\n birpc,\n }\n}\n","import { MessageChannel } from \"node:worker_threads\"\nimport { AddressInfo } from \"node:net\"\nimport type { ChannelOptions } from \"birpc\"\nimport type { EdgeSpecConfig } from \"src/config/config.js\"\nimport { loadConfig } from \"src/config/utils.js\"\nimport {\n StartHeadlessDevServerOptions,\n startHeadlessDevServer,\n} from \"./headless/start-server.js\"\nimport { startHeadlessDevBundler } from \"./headless/start-bundler.js\"\n\nexport type StartDevServerOptions = {\n rootDirectory?: string\n config?: EdgeSpecConfig\n port?: number\n} & Pick<\n StartHeadlessDevServerOptions,\n \"middleware\" | \"onListening\" | \"onBuildStart\" | \"onBuildEnd\"\n>\n\n/**\n * Start an EdgeSpec dev server. It will continuously watch your code and rebuild on changes. (This is the same function called by `edgespec dev`.)\n *\n * This must be run within a native context (Node.js, Bun, or Deno).\n */\nexport const startDevServer = async (options: StartDevServerOptions) => {\n const config = await loadConfig(\n options.rootDirectory ?? process.cwd(),\n options.config\n )\n\n const messageChannel = new MessageChannel()\n\n const httpServerRpcChannel: ChannelOptions = {\n post: (data) => messageChannel.port2.postMessage(data),\n on: (data) => messageChannel.port2.on(\"message\", data),\n }\n\n const port = options.port ?? 3000\n const headlessServer = await startHeadlessDevServer({\n port,\n config,\n rpcChannel: httpServerRpcChannel,\n middleware: options.middleware,\n onListening: options.onListening,\n onBuildStart: options.onBuildStart,\n onBuildEnd: options.onBuildEnd,\n })\n\n const bundlerRpcChannel: ChannelOptions = {\n post: (data) => messageChannel.port1.postMessage(data),\n on: (data) => messageChannel.port1.on(\"message\", data),\n }\n\n const headlessBundler = await startHeadlessDevBundler({\n config,\n initialRpcChannels: [bundlerRpcChannel],\n })\n\n return {\n port: (headlessServer.server.address() as AddressInfo).port.toString(),\n stop: async () => {\n await Promise.all([headlessServer.stop(), headlessBundler.stop()])\n messageChannel.port1.close()\n messageChannel.port2.close()\n },\n }\n}\n","import { startDevServer } from \"./dev-server.js\"\nimport { startHeadlessDevBundler } from \"./headless/start-bundler.js\"\nimport { startHeadlessDevServer } from \"./headless/start-server.js\"\n\nexport const devServer = {\n startDevServer,\n headless: {\n startBundler: startHeadlessDevBundler,\n startServer: startHeadlessDevServer,\n },\n}\n"]}