import { ULTRA_COMPILER_PATH } from "./constants.ts";import { assert, dotenv, Hono, resolve, toFileUrl } from "./deps.ts";import { ensureMinDenoVersion } from "./dev/ensureMinDenoVersion.ts";import { log } from "./logger.ts";import { serveStatic } from "./middleware/serveStatic.ts";import { CreateServerOptions, Env, Mode } from "./types.ts";import { UltraServer } from "./ultra.ts";import { resolveImportMapPath } from "./utils/import-map.ts";
await dotenv({ export: true });
const modeFromEnv = Deno.env.get("ULTRA_MODE") || (Deno.env.get("DENO_DEPLOYMENT_ID") !== undefined ? "production" : undefined);
const defaultOptions = { mode: (modeFromEnv || "development") as Mode, enableEsModuleShims: true, esModuleShimsPath: "https://ga.jspm.io/npm:es-module-shims@1.8.0/dist/es-module-shims.js",};
export async function createServer< E extends Env = any, S = {}, BasePath extends string = "/",>( options: CreateServerOptions = {},) { const resolvedOptions = { ...defaultOptions, ...options, };
assertServerOptions(resolvedOptions);
const { mode = "development", browserEntrypoint, enableEsModuleShims, esModuleShimsPath, } = resolvedOptions;
const root = Deno.cwd(); const assetManifestPath = toFileUrl(resolve(root, "asset-manifest.json"));
const server = new UltraServer<E, S, BasePath>(root, { mode, entrypoint: browserEntrypoint, importMapPath: options.importMapPath ? resolveImportMapPath(mode, root, options.importMapPath) : undefined, assetManifestPath: String(assetManifestPath), enableEsModuleShims, esModuleShimsPath, });
await server.init();
server.get("*", serveStatic({ root: resolve(root, "./public"), cache: mode !== "development", }));
server.get("/ultra/*", (context, next) => { const path = new URL(context.req.url).pathname.slice(`/ultra`.length) return serveStatic({ root: server.ultraDir, path: path, cache: mode !== "development", })(context, next); });
server.get("*", serveStatic({ root: resolve(root, "./"), cache: mode !== "development", }));
if (mode === "development") { log.info("Loading compiler"); const { compiler } = await import("./middleware/compiler.ts");
server.get(`${ULTRA_COMPILER_PATH}/*`, compiler({ root, ...options.compilerOptions, })); }
return server;}
export function createRouter< E extends Env = any, S = {}, BasePath extends string = "/",>() { return new Hono<E, S, BasePath>();}
export function assertServerOptions( options: CreateServerOptions,): options is Required<CreateServerOptions> { try { options.mode === "development" && ensureMinDenoVersion();
assert( ["development", "production"].includes(options.mode!), `Invalid value supplied for "mode", expected either "production" or "development" received "${options.mode}"`, );
if (options.browserEntrypoint) { assert( options.importMapPath, "No importMapPath was supplied, yet a browserEntrypoint has been set.", ); }
return true; } catch (error) { throw new Error(error.message); }}