ziex/site/build.zig
2026-06-21 22:20:07 +06:00

268 lines
11 KiB
Zig

const std = @import("std");
const ziex = @import("ziex");
const build_zon = @import("build.zig.zon");
pub fn build(b: *std.Build) !void {
// --- Target and Optimize from `zig build` arguments ---
const target = b.standardTargetOptions(.{});
const optimize = b.standardOptimizeOption(.{});
// --- Deps --- //
const ziex_dep = b.dependency("ziex", .{ .optimize = optimize, .target = target });
const tree_sitter_dep = ziex_dep.builder.dependency("tree_sitter", .{ .optimize = optimize, .target = target });
const tree_sitter_zx_dep = ziex_dep.builder.dependency("tree_sitter_zx", .{ .optimize = optimize, .target = target, .@"build-shared" = false });
// const tree_sitter_mdzx_dep = ziex_dep.builder.dependency("tree_sitter_mdzx", .{ .optimize = optimize, .target = target, .@"build-shared" = false });
// --- Playground Assets --- //
const wasm_target = b.resolveTargetQuery(.{ .cpu_arch = .wasm32, .os_tag = .wasi });
const wasm_optimize: std.builtin.OptimizeMode = .ReleaseSmall;
// const playground_dep = b.dependency("playground", .{});
// const zls_dep = playground_dep.builder.dependency("zls", .{ .target = wasm_target, .optimize = wasm_optimize });
const zx_wasm_dep = b.dependency("ziex", .{ .target = wasm_target, .optimize = wasm_optimize });
const zig_dep = b.dependency("zig", .{
.target = wasm_target,
.optimize = wasm_optimize,
.@"version-string" = @as([]const u8, "0.16.0"),
.@"no-lib" = true,
.dev = "wasm",
});
const compiler_rt_step = b.step("zig_compiler_rt", "compile and install compiler_rt");
const lib_compiler_rt = b.addLibrary(.{
.linkage = .static,
.name = "compiler_rt",
.root_module = b.createModule(.{
.root_source_file = zig_dep.path("lib/compiler_rt.zig"),
.target = wasm_target,
.optimize = wasm_optimize,
}),
});
compiler_rt_step.dependOn(&b.addInstallArtifact(lib_compiler_rt, .{ .dest_dir = .{ .override = .prefix } }).step);
const zx_exe = zx_wasm_dep.artifact("zx");
// const zls_exe = b.addExecutable(.{
// .name = "zls",
// .root_module = b.createModule(.{
// .root_source_file = playground_dep.path("src/zls.zig"),
// .target = wasm_target,
// .optimize = wasm_optimize,
// .imports = &.{
// .{ .name = "zls", .module = zls_dep.module("zls") },
// },
// }),
// });
// zls_exe.entry = .disabled;
// zls_exe.rdynamic = true;
const zig_exe = zig_dep.artifact("zig");
// -- zig.tar.gz
const run_tar = b.addSystemCommand(&.{ "tar", "-czf" });
const zig_tar_gz = run_tar.addOutputFileArg("zig.tar.gz");
run_tar.addArg("-C");
run_tar.addDirectoryArg(zig_dep.path("."));
run_tar.addArg("lib/std");
// -- zx.tar.gz (only include files needed for playground compilation)
const run_zx_tar = b.addSystemCommand(&.{ "tar", "-czf" });
run_zx_tar.has_side_effects = true;
const zx_tar_gz = run_zx_tar.addOutputFileArg("zx.tar.gz");
run_zx_tar.addArgs(&.{
"--exclude", "src/cli",
"--exclude", "src/lsp",
"--exclude", "src/tui",
"--exclude", "src/build",
"--exclude", "src/main.zig",
});
run_zx_tar.addArg("-C");
run_zx_tar.addDirectoryArg(zx_wasm_dep.path("."));
run_zx_tar.addArg("src");
const playground_assets = b.addNamedWriteFiles("playground_assets");
// _ = playground_assets.addCopyFile(zls_exe.getEmittedBin(), "zls.wasm");
_ = playground_assets.addCopyFile(zig_exe.getEmittedBin(), b.fmt("zig-{s}.wasm", .{ziex.info.minimum_zig_version}));
_ = playground_assets.addCopyFile(zx_exe.getEmittedBin(), b.fmt("zx-{s}.wasm", .{ziex.info.version}));
_ = playground_assets.addCopyFile(lib_compiler_rt.getEmittedBin(), "libcompiler_rt.a");
_ = playground_assets.addCopyFile(zig_tar_gz, b.fmt("zig-{s}.tar.gz", .{ziex.info.minimum_zig_version}));
_ = playground_assets.addCopyFile(zx_tar_gz, b.fmt("zx-{s}.tar.gz", .{ziex.info.version}));
const install_pg = b.addInstallDirectory(.{
.source_dir = playground_assets.getDirectory(),
.install_dir = .prefix,
.install_subdir = "static/assets/playground",
});
// b.getInstallStep().dependOn(compiler_rt_step);
// -- Steps: pg - installs playground assets --- //
const pg_step = b.step("pg", "Install playground assets");
pg_step.dependOn(&install_pg.step);
// --- ZX App Executable --- //
const app_exe = b.addExecutable(.{
.name = "ziex_dev",
.root_module = b.createModule(.{
.root_source_file = b.path("app/main.zig"),
.target = target,
.optimize = optimize,
}),
});
app_exe.root_module.addImport("tree_sitter", tree_sitter_dep.module("tree_sitter"));
app_exe.root_module.addImport("tree_sitter_zx", tree_sitter_zx_dep.module("tree_sitter_zx"));
app_exe.step.dependOn(&install_pg.step); // Playground disabled
// --- ZX setup: wires dependencies and adds `zx`/`dev` build steps --- //
var zx = try ziex.init(b, app_exe, .{
.app = .{
// .path = b.path("app"),
// .base_path = "/test",
// .copy_embedded_sources = true,
.features = .{
.sqlite = .enabled,
.kv = .enabled,
.cache = .enabled,
},
},
.client = .{
.jsglue_href = "/assets/_/main.js",
.jsglue_install_subdir = "pkg/ziex",
},
.cli = .{ .optimize = optimize },
});
// --- ZX Components --- //
{
// Single File
const icons_mod = zx.addComponent(.{ .root_source_file = b.path("component/icon.zx") });
zx.app.module.addImport("icon", icons_mod);
// multifile
zx.addComponentImport("component", .{ .root_source_file = b.path("component/main.zx") });
// from deps
const ui_dep = b.dependency("ui", .{});
const ui_mod = ui_dep.module("ui");
ui_mod.addImport("zx", zx.zx_module);
zx.addImport("ui", ui_mod);
const template_path = b.path("../templates/_base/app");
// Layout
const template_layout_mod = zx.addComponent(.{
.root_source_file = template_path.path(b, "pages/layout.zx"),
});
zx.addImport("tmpl_layout", template_layout_mod);
// Home page
const template_ui_root_mod = zx.addComponent(.{
.root_source_file = template_path.path(b, "pages/page.zx"),
});
zx.addImport("tmpl_home", template_ui_root_mod);
// /form page
const template_form_root_mod = zx.addComponent(.{
.root_source_file = template_path.path(b, "pages/form/page.zx"),
});
zx.addImport("tmpl_form", template_form_root_mod);
// /actions
const template_actions_root_mod = zx.addComponent(.{
.root_source_file = template_path.path(b, "pages/actions/page.zx"),
});
zx.addImport("tmpl_actions", template_actions_root_mod);
// /actions/client
const template_actions_client_mod = zx.addComponent(.{
.root_source_file = template_path.path(b, "pages/actions/client/page.zx"),
});
zx.addImport("tmpl_actions_client", template_actions_client_mod);
// /actions/server
const template_actions_server_mod = zx.addComponent(.{
.root_source_file = template_path.path(b, "pages/actions/server/page.zx"),
});
zx.addImport("tmpl_actions_server", template_actions_server_mod);
}
const tailwindcss_b = tailwindcss.addBuild(b, .{
.config = .{
.input = b.path("app/styles/tailwind.css"),
// .minify = true,
// .optimize = true,
// .map = false,
},
});
const css_install = b.addInstallFile(tailwindcss_b.file, "static/assets/_/tailwind.css");
b.default_step.dependOn(&css_install.step);
const is_release = optimize != .Debug;
const site_scripts = esbuild.addBuild(b, .{
.name = "site_scripts",
.config = .{
.entrypoints = &.{
b.path("app/scripts/client.ts"),
b.path("app/scripts/docs.ts"),
b.path("app/scripts/home.ts"),
},
.platform = .browser,
.minify = is_release,
.sourcemap = if (is_release) .none else .@"inline",
.define = &.{
.{ .key = "__DEV__", .value = if (is_release) "false" else "true" },
.{ .key = "process.env.NODE_ENV", .value = if (is_release) "\"production\"" else "\"development\"" },
},
},
});
const install_main_js = b.addInstallFile(site_scripts.dir.path(b, "client.js"), "static/assets/_/main.js");
const install_docs_js = b.addInstallFile(site_scripts.dir.path(b, "docs.js"), "static/assets/docs.js");
const install_home_js = b.addInstallFile(site_scripts.dir.path(b, "home.js"), "static/assets/home.js");
b.default_step.dependOn(&install_main_js.step);
b.default_step.dependOn(&install_docs_js.step);
b.default_step.dependOn(&install_home_js.step);
const playground_scripts = esbuild.addBuild(b, .{
.name = "playground_scripts",
.config = .{
.entrypoints = &.{
b.path("app/pages/playground/scripts/editor.ts"),
b.path("app/pages/playground/scripts/workers/runner.ts"),
b.path("app/pages/playground/scripts/workers/zig.ts"),
b.path("app/pages/playground/scripts/workers/zx.ts"),
b.path("app/pages/playground/scripts/workers/zls.ts"),
},
.format = .esm,
.splitting = false,
.platform = .browser,
.minify = optimize != .Debug,
.define = &.{
.{
.key = "VERSION",
.value = b.fmt("\"{s}\"", .{ziex.info.version}),
},
.{
.key = "ZIG_VERSION",
.value = b.fmt("\"{s}\"", .{ziex.info.minimum_zig_version}),
},
},
},
});
const install_playground_scripts = b.addInstallDirectory(.{
.source_dir = playground_scripts.dir,
.install_dir = .prefix,
.install_subdir = "static/assets/playground",
});
b.default_step.dependOn(&install_playground_scripts.step);
const branding_dep = b.dependency("branding", .{});
const install_branding = b.addInstallDirectory(.{
.source_dir = branding_dep.path("."),
.install_dir = .prefix,
.install_subdir = "static/assets/branding",
.include_extensions = &.{ "webp", "svg", "png", "gif" },
});
b.default_step.dependOn(&install_branding.step);
}
const bunjs = @import("bunjs");
const esbuild = @import("esbuild");
const tailwindcss = @import("tailwindcss");