website-htmx-rustelo-code/scripts/build/assemble-htmx-templates.nu

69 lines
3.1 KiB
Text
Raw Normal View History

2026-07-10 03:44:13 +01:00
#!/usr/bin/env nu
# Materialise the htmx-ssr Minijinja templates into a single deploy directory so
# the running server reads ONE path and never touches crate source trees
# (crates/pages_htmx/templates) or the sibling rustelo checkout. This mirrors how
# cargo-leptos stages target/site/pkg for the leptos-hydration profile.
#
# The output is the framework defaults (rustelo_pages_htmx/templates) overlaid
# with this project's overrides (crates/pages_htmx/templates): project files win,
# framework-only partials (content_header, content/*, nav/*, overlays/*,
# not_found) remain. The project→framework cascade is therefore resolved here, at
# build time — the runtime loader needs no fallback logic.
#
# Symlinks are dereferenced (-L): the project templates may live behind links and
# the tarball must be self-contained.
#
# Flow (symmetric with Leptos pkg):
# assemble → target/site/htmx-templates → distro image_only[htmx-ssr]
# → site/htmx-templates → /var/www/site/htmx-templates (HTMX_TEMPLATE_PATH)
#
# Usage:
# nu scripts/build/assemble-htmx-templates.nu
# nu scripts/build/assemble-htmx-templates.nu --out target/site/htmx-templates
def main [
--project-root: string = "" # repo root; auto-derived from script location if empty
--out: string = "target/site/htmx-templates" # output dir (relative paths resolved under project-root)
--project-templates: string = "crates/pages_htmx/templates"
--framework-templates: string = "" # rustelo htmx templates; auto-derived from DEV_ROOT if empty
]: nothing -> nothing {
let root = if ($project_root | is-not-empty) {
$project_root
} else {
$env.FILE_PWD | path dirname | path dirname # scripts/build → root
}
let dev_root = ($env.DEV_ROOT? | default "/Users/Akasha/Development")
let framework = if ($framework_templates | is-not-empty) {
$framework_templates
} else {
$"($dev_root)/rustelo/code/crates/foundation/crates/rustelo_pages_htmx/templates"
}
let project = if ($project_templates | str starts-with "/") {
$project_templates
} else {
$root | path join $project_templates
}
let out_dir = if ($out | str starts-with "/") { $out } else { $root | path join $out }
if not ($framework | path exists) {
error make { msg: $"framework templates not found: ($framework) — set --framework-templates or DEV_ROOT" }
}
if not ($project | path exists) {
error make { msg: $"project templates not found: ($project)" }
}
# Idempotent: rebuild from scratch so deleted templates never linger.
if ($out_dir | path exists) { ^rm -rf $out_dir }
mkdir $out_dir
# Framework defaults first (base layer), then project overrides on top.
# `src/.` copies directory CONTENTS; -L dereferences symlinks; BSD/GNU cp both
# merge directories and overwrite colliding files, giving the overlay semantics.
^cp -RL $"($framework)/." $out_dir
^cp -RL $"($project)/." $out_dir
let count = (^find -L $out_dir -type f | lines | where { |l| $l | is-not-empty } | length)
print $"(ansi green)✅(ansi reset) htmx templates → ($out_dir) — ($count) files"
}