Page MenuHomeSealhub

builder.ts
No OneTemporary

builder.ts

import { build, BuildContext, context } from "esbuild";
import glob from "tiny-glob";
import { embeddable_file_extensions } from "./embeddable-file-extensions.js";
import { load_assets_plugin } from "./esbuild-plugins/load-assets.js";
import { rewrite_asset_imports_plugin } from "./esbuild-plugins/rewrite-asset-imports.js";
import { generate_css_includes } from "./find-css-includes.js";
import { generateCollections } from "./generate-collections.js";
import { generateComponents } from "./generate-components.js";
import { generateRoutes } from "./generate-routes.js";
import { generateStimulusControllers } from "./generate-stimulus.js";
import { FONTS_CONFIG_PATH, getFonts } from "./get-fonts.js";
export abstract class Builder {
abstract ownsFile(file_path: string): boolean;
abstract getName(): string;
abstract _build(): Promise<void>;
abstract dispose(): Promise<void>;
public ongoing_build: Promise<void> | null = null;
public build(notifier?: (message: string) => void) {
if (!this.ongoing_build) {
const build = this._build()
.catch((err) => {
console.error(err);
})
.then(() => {
notifier?.(this.getName());
this.ongoing_build = null;
});
this.ongoing_build = build;
}
return this.ongoing_build;
}
}
export class CSSBuilder extends Builder {
getName(): string {
return "css";
}
private context_promise: Promise<BuildContext> | null;
ownsFile(file_path: string) {
return (
file_path.endsWith(".css") && !file_path.endsWith("/includes.css")
);
}
async dispose(): Promise<void> {
return (await this.getBuildContext()).dispose();
}
async getBuildContext(): Promise<BuildContext> {
if (!this.context_promise) {
const loader = Object.fromEntries(
(<const>["png", "svg", "jpg", "gif", "jpeg", "otf", "ttf"]).map(
(ext) => <const>["." + ext, "file"]
)
);
const context_promise = context({
entryPoints: ["./src/main.css"],
sourcemap: true,
bundle: true,
outdir: "./public/dist",
logLevel: "info",
// plugins: [sassPlugin()],
loader,
});
this.context_promise = context_promise;
return context_promise;
} else {
return this.context_promise;
}
}
async _build() {
const context = await this.getBuildContext();
await generate_css_includes();
await context.rebuild();
}
}
export class FontsBuilder extends Builder {
getName(): string {
return "fonts";
}
ownsFile(file_path: string) {
return file_path == FONTS_CONFIG_PATH;
}
// eslint-disable-next-line @typescript-eslint/no-empty-function
async dispose(): Promise<void> {}
async _build() {
return getFonts();
}
}
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")
);
}
// eslint-disable-next-line @typescript-eslint/no-empty-function
async dispose(): Promise<void> {}
async _build(): Promise<void> {
await Promise.all([
generateCollections(),
generateRoutes(),
generateComponents(),
]);
const entryPoints = (
await glob(
`./src/back/**/*.{ts,tsx,${embeddable_file_extensions.join(
","
)}}`
)
).filter((path) => !path.includes(".#"));
await build({
entryPoints,
sourcemap: true,
bundle: false,
jsxFactory: "TempstreamJSX.createElement",
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, load_assets_plugin],
});
}
}
export class FrontendTSBuilder extends Builder {
getName(): string {
return "frontend-ts";
}
ownsFile(file_path: string) {
return (
file_path.startsWith("src/front") ||
file_path.endsWith(".stimulus.ts")
);
}
// eslint-disable-next-line @typescript-eslint/no-empty-function
async dispose(): Promise<void> {}
async _build(): Promise<void> {
await generateStimulusControllers();
await build({
entryPoints: ["./src/front/index.ts"],
sourcemap: true,
outfile: "./public/dist/bundle.js",
logLevel: "info",
bundle: true,
minify: true,
});
}
}

File Metadata

Mime Type
text/x-java
Expires
Wed, May 7, 19:36 (1 d, 18 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
625242
Default Alt Text
builder.ts (4 KB)

Event Timeline