prasi-bun/pkgs/core/utils/dev-watcher.ts

83 lines
2.0 KiB
TypeScript

import { file } from "bun";
import { watch } from "fs";
import { dirAsync, inspectTreeAsync, readAsync, writeAsync } from "fs-jetpack";
import { dirname } from "path";
import { dir } from "./dir";
const pagedir = dir.path(`app/web/src/base/page`);
export const startDevWatcher = async () => {
await dirAsync(dir.path(`app/srv/api`));
watch(dir.path(`app/srv/api`), async (event, filename) => {
const s = file(dir.path(`app/srv/api/${filename}`));
if (s.size === 0) {
await Bun.write(
`app/srv/api/${filename}`,
`\
import { apiContext } from "service-srv";
export const _ = {
url: "/${filename?.substring(0, filename.length - 3)})}",
async api() {
const { req, res } = apiContext(this);
return "This is ${filename}";
}
}`
);
}
});
await dirAsync(pagedir);
await genPages();
watch(pagedir, async (event, filename) => {
const s = file(dir.path(`${pagedir}/${filename}`));
if (s.size > 0) {
// await Bun.write(
// `app/srv/api/${filename}`,
// `\
// export const all = {
// url: "*",
// page: () => import("./page/all"),
// };
// `
// );
}
});
};
const genPages = async () => {
const res: string[] = [];
const walk = async (arg: any) => {
const pathname = arg.relativePath
.substring(0, arg.relativePath.length - 4)
.substring(2);
if (pathname) {
const src = await readAsync(`${pagedir}/${pathname}.tsx`);
if (src) {
const url = src.split("url:")[1].split(",").shift();
if (url) {
res.push(
`\
export const ${pathname.replace(/\W/gi, "_")} = {
url: ${url},
page: () => import("./page/${pathname}"),
};`
);
}
}
}
if (arg.children) {
for (const c of arg.children) {
await walk(c);
}
}
};
await walk(
await inspectTreeAsync(pagedir, {
relativePath: true,
})
);
await writeAsync(dirname(pagedir) + "/pages.ts", `${res.join("\n")}\n`);
};