From 9b9e43baaf3a5caa391437c0325b4519d54ecb65 Mon Sep 17 00:00:00 2001 From: Rizky Date: Wed, 7 Feb 2024 10:11:58 +0700 Subject: [PATCH] wip fix --- app/srv/api/deploy.ts | 10 ++++++++++ pkgs/core/index.ts | 7 ++++++- pkgs/core/server/api/api-watch.ts | 28 ++++++++++++++++++++++++++++ pkgs/core/server/api/parse-args.ts | 1 - pkgs/core/server/serve-api.ts | 4 +++- pkgs/core/utils/build-deploy.ts | 20 ++++++++++++++++++++ 6 files changed, 67 insertions(+), 3 deletions(-) create mode 100644 app/srv/api/deploy.ts create mode 100644 pkgs/core/server/api/api-watch.ts create mode 100644 pkgs/core/utils/build-deploy.ts diff --git a/app/srv/api/deploy.ts b/app/srv/api/deploy.ts new file mode 100644 index 00000000..87ead5d9 --- /dev/null +++ b/app/srv/api/deploy.ts @@ -0,0 +1,10 @@ +import { apiContext } from "service-srv"; + +export const _ = { + url: "/deploy/**", + async api() { + const { req, res } = apiContext(this); + return "rukausfb"; + }, +}; + \ No newline at end of file diff --git a/pkgs/core/index.ts b/pkgs/core/index.ts index b84b8048..9724fc35 100644 --- a/pkgs/core/index.ts +++ b/pkgs/core/index.ts @@ -13,6 +13,7 @@ import { createId } from "@paralleldrive/cuid2"; import { prepareApiRoutes } from "./server/api/api-scan"; import { writeAsync } from "fs-jetpack"; import { dir } from "dir"; +import { watchApiRoutes } from "./server/api/api-watch"; // import "../docker-prep"; g.status = "init"; @@ -57,15 +58,19 @@ if (!db) { }); } } +await prepareApiRoutes(); if (!g.apiPrepared) { await initSrv(); await syncActionDefinition(); g.log.info("WS Action defined"); - await prepareApiRoutes(); await prepareAPITypes(); g.log.info("API Prepared"); g.apiPrepared = true; + + if (g.mode === "dev") { + watchApiRoutes(); + } } if (!g.parcel) { diff --git a/pkgs/core/server/api/api-watch.ts b/pkgs/core/server/api/api-watch.ts new file mode 100644 index 00000000..409a241f --- /dev/null +++ b/pkgs/core/server/api/api-watch.ts @@ -0,0 +1,28 @@ +import { dir } from "dir"; +import { watch } from "fs"; +import { parseArgs } from "./parse-args"; +import { g } from "utils/global"; +export const watchApiRoutes = () => { + const root = dir.path(`app/srv/api`); + watch(root, { recursive: true }, async (e, filename) => { + if (filename && filename.endsWith(".ts")) { + const oldroute = g._api[filename]; + if (oldroute) { + g.router.remove(oldroute.url); + } + + const importPath = dir.path(`app/srv/api/${filename}`); + delete require.cache[importPath]; + const api = require(importPath); + let args: string[] = await parseArgs(importPath); + const route = { + url: api._.url, + args, + fn: api._.api, + path: importPath.substring(root.length + 1), + }; + g._api[filename] = route; + g.router.insert(route.url.replace(/\*/gi, "**"), route); + } + }); +}; diff --git a/pkgs/core/server/api/parse-args.ts b/pkgs/core/server/api/parse-args.ts index 7f0460d1..31f97c1f 100644 --- a/pkgs/core/server/api/parse-args.ts +++ b/pkgs/core/server/api/parse-args.ts @@ -1,5 +1,4 @@ import { parseFile } from "@swc/core"; -import { readAsync } from "fs-jetpack"; export const parseArgs = async (path: string) => { const res = await parseFile(path, { syntax: "typescript" }); diff --git a/pkgs/core/server/serve-api.ts b/pkgs/core/server/serve-api.ts index f139327c..0f0542a7 100644 --- a/pkgs/core/server/serve-api.ts +++ b/pkgs/core/server/serve-api.ts @@ -33,6 +33,8 @@ export const serveAPI = { found = null; } } + console.log(found?.fn.toString()); + if (found) { const params = { ...found.params }; @@ -99,7 +101,7 @@ export const serveAPI = { return finalResponse; } - + if (finalResponse) { return createResponse(current.res, finalResponse); } diff --git a/pkgs/core/utils/build-deploy.ts b/pkgs/core/utils/build-deploy.ts new file mode 100644 index 00000000..c02925e5 --- /dev/null +++ b/pkgs/core/utils/build-deploy.ts @@ -0,0 +1,20 @@ +import { dir } from "dir"; +import { context } from "esbuild"; + +const ctx = await context({ + bundle: true, + absWorkingDir: dir.path(""), + entryPoints: [dir.path("app/web/src/nova/deploy/main.tsx")], + outdir: dir.path("app/static/deploy"), + splitting: true, + format: "esm", + jsx: "transform", + minify: true, + sourcemap: true, + logLevel: "error", + define: { + "process.env.NODE_ENV": `"production"`, + }, +}); + +ctx.watch();