{"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"]}