import glob from "tiny-glob"; import { build } from "esbuild"; import { promises as fs } from "fs"; import { relative } from "node:path"; import { embeddable_file_extensions } from "../embeddable-file-extensions.js"; import { generateCollections } from "../generate-collections.js"; import { generateComponents } from "../generate-components.js"; import { generateRoutes } from "../generate-routes.js"; import { Builder } from "./builder.js"; import { rewrite_asset_imports_plugin } from "../esbuild-plugins/rewrite-asset-imports.js"; import { load_assets_plugin } from "../esbuild-plugins/load-assets.js"; export class BackendTSBuilder extends Builder { getName(): string { return "backend-ts"; } ownsFile(file_path: string) { return ( (file_path.endsWith(".ts") || file_path.endsWith(".tsx")) && !file_path.endsWith("src/back/collections/collections.ts") && !file_path.endsWith("src/back/routes/routes.ts") && !file_path.endsWith("src/back/routes/urls.ts") && !file_path.endsWith("stimulus.ts") && !file_path.startsWith("src/front") ); } async dispose(): Promise {} async _build(): Promise { await Promise.all([ generateCollections(), generateRoutes(), generateComponents(), ]); const entryPoints = ( await glob( `./src/back/**/*.{ts,tsx,${embeddable_file_extensions.join( "," )}}` ) ).filter((path) => !path.includes(".#")); const { metafile } = await build({ entryPoints, sourcemap: true, bundle: false, jsxFactory: "TempstreamJSX.createElement", jsxFragment: "TempstreamJSX.Fragment", outdir: "./dist/back", logLevel: "info", platform: "node", target: "es2022", format: "esm", loader: Object.fromEntries( embeddable_file_extensions.map((ext) => ["." + ext, "js"]) ), plugins: [ rewrite_asset_imports_plugin(this.project_dir), load_assets_plugin, ], metafile: true, }); await fs.writeFile( relative(this.project_dir, "dist") + "/" + "back" + ".meta.json", JSON.stringify(metafile) ); } }