diff --git a/app/web/src/index.tsx b/app/web/src/index.tsx index d06e95fc..1263c66b 100644 --- a/app/web/src/index.tsx +++ b/app/web/src/index.tsx @@ -4,6 +4,23 @@ import { Root } from "./base/root"; import "./index.css"; import { createAPI, createDB, reloadDBAPI } from "./utils/script/init-api"; +const start = async () => { + registerServiceWorker(); + defineReact(); + await defineWindow(false); + const w = window as any; + const base = `${location.protocol}//${location.host}`; + + await reloadDBAPI(base); + w.api = createAPI(base); + w.db = createDB(base); + + const el = document.getElementById("root"); + if (el) { + createRoot(el).render(); + } +}; + const registerServiceWorker = async () => { if ("serviceWorker" in navigator) { try { @@ -20,21 +37,4 @@ const registerServiceWorker = async () => { } }; -registerServiceWorker(); - -const el = document.getElementById("root"); - -if (el) { - (async () => { - defineReact(); - await defineWindow(false); - const w = window as any; - const base = `${location.protocol}//${location.host}`; - - await reloadDBAPI(base); - w.api = createAPI(base); - w.db = createDB(base); - - createRoot(el).render(); - })(); -} +start(); diff --git a/pkgs/core/index.ts b/pkgs/core/index.ts index 86db4bdb..e33a621c 100644 --- a/pkgs/core/index.ts +++ b/pkgs/core/index.ts @@ -8,6 +8,9 @@ import { config } from "./utils/config"; import { g } from "./utils/global"; import { createLogger } from "./utils/logger"; import { parcelBuild } from "utils/parcel"; +import { prepareApiRoutes } from "./server/api-scan"; + +g.status = "init"; await createLogger(); g.port = parseInt(process.env.PORT || "4550"); @@ -30,4 +33,6 @@ if (g.db) { await createServer(); await parcelBuild(); await generateAPIFrm(); +await prepareApiRoutes(); await prepareAPITypes(); +g.status = "ready"; diff --git a/pkgs/core/server/api-scan.ts b/pkgs/core/server/api-scan.ts index 74772ad5..7a9833af 100644 --- a/pkgs/core/server/api-scan.ts +++ b/pkgs/core/server/api-scan.ts @@ -5,8 +5,7 @@ import { dir } from "../utils/dir"; import { g } from "../utils/global"; import { parseArgs } from "./parse-args"; -export const scanApi = async () => { - g.api = {}; +export const prepareApiRoutes = async () => { const scan = async (path: string, root?: string) => { const apis = await listAsync(path); if (apis) { diff --git a/pkgs/core/server/create.ts b/pkgs/core/server/create.ts index 4eb35904..243b0755 100644 --- a/pkgs/core/server/create.ts +++ b/pkgs/core/server/create.ts @@ -1,21 +1,24 @@ import { createRouter } from "radix3"; import { dir } from "../utils/dir"; import { g } from "../utils/global"; -import { scanApi } from "./api-scan"; import { serveAPI } from "./serve-api"; export const createServer = async () => { + g.api = {}; g.router = createRouter({ strictTrailingSlash: true }); - await scanApi(); - g.server = Bun.serve({ port: g.port, async fetch(req) { + if (g.status === "init") return new Response("initializing..."); const url = new URL(req.url); - const api = await serveAPI(url, req); - if (api) { - return api; + try { + const api = await serveAPI(url, req); + if (api) { + return api; + } + } catch (e) { + g.log.error(e); } try { @@ -23,8 +26,15 @@ export const createServer = async () => { if (file.type !== "application/octet-stream") { return new Response(file as any); } - } catch (e) {} - return new Response(Bun.file(dir(`app/static/index.html`)) as any); + } catch (e) { + g.log.error(e); + } + try { + return new Response(Bun.file(dir(`app/static/index.html`)) as any); + } catch (e) { + g.log.error(e); + return new Response("Loading..."); + } }, }); diff --git a/pkgs/core/server/prep-api-ts.ts b/pkgs/core/server/prep-api-ts.ts index f41bf389..63f68e89 100644 --- a/pkgs/core/server/prep-api-ts.ts +++ b/pkgs/core/server/prep-api-ts.ts @@ -1,4 +1,4 @@ -import { spawnSync } from "bun"; +import { spawn, spawnSync } from "bun"; import { readAsync } from "fs-jetpack"; import { dir } from "../utils/dir"; import { g } from "../utils/global"; @@ -19,7 +19,7 @@ export const ${name} = { await Bun.write(dir(`app/srv/exports.ts`), out.join(`\n`)); const targetFile = dir("app/srv/exports.d.ts"); - spawnSync( + const tsc = spawn( [ dir("node_modules/.bin/tsc"), dir("app/srv/exports.ts"), @@ -33,6 +33,8 @@ export const ${name} = { } ); + await tsc.exited; + let res = await readAsync(targetFile); if (res) { res = res.replace('export * from "@prisma/client";', ""); diff --git a/pkgs/core/utils/global.ts b/pkgs/core/utils/global.ts index 77948f11..c3f73f39 100644 --- a/pkgs/core/utils/global.ts +++ b/pkgs/core/utils/global.ts @@ -11,6 +11,7 @@ type SingleRoute = { }; export const g = global as unknown as { + status: "init" | "ready"; db: PrismaClient; dburl: string; mode: "dev" | "prod";