From 2a4c3ddb3d7dc03589333a6be346a5bfae571e29 Mon Sep 17 00:00:00 2001 From: Doxa Maps Date: Tue, 29 Sep 2026 18:39:36 +0000 Subject: [PATCH] The full build also copies the maps into the sibling DX Life site, when it is there `bun run build` now ends with `sync-dropin --from-config --if-present`. It copies public/dx-maps into the ONE configured host path (vite.doxa-maps-build-config.json dropin.dest, default ../doxa-life/public, or DOXA_DROPIN_DEST). No site at that path: it prints "skipped" and exits 0. Nothing else on the filesystem is searched for repos or sites. DOXA_DROPIN=off skips it even when the site is there. Without --if-present, a missing host is still an error, as before. Tested: no host skips (exit 0); a host gets 1,209 files; DOXA_DROPIN=off copies nothing; the plain command still refuses a missing host. The container's /cdn build (build-cdn.sh) does not run this chain. On this box ../doxa-life does not exist beside the doxa-maps checkouts (DX Life lives in root-dx-life), so the step is a no-op for the fleet's builds. --- internal/sync-dropin.mjs | 9 ++++++++- package.json | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/internal/sync-dropin.mjs b/internal/sync-dropin.mjs index 424974e9f..a8d5030c1 100644 --- a/internal/sync-dropin.mjs +++ b/internal/sync-dropin.mjs @@ -39,7 +39,7 @@ * Refuses to CREATE : the drop-in folder is the host's decision, not this script's. * Gate: `node internal/public-hygiene-check.mjs --strict` must pass before a public push. * - * Usage: node internal/sync-dropin.mjs [--from public] [--tree doxa-maps] [--keep-staging] + * Usage: node internal/sync-dropin.mjs [--from public] [--tree doxa-maps] [--keep-staging] [--if-present] * [--only a,b | --from-config] [--prune] [--protect a.txt,other] [--dry-run] * e.g. bun run dropin (= --from-config, into dropin.dest: ../doxa-life/public) * Prints: copied · unchanged · deleted (stale inside the allowlist) · pruned (outside it) · @@ -96,6 +96,13 @@ if (PRUNE && basename(dest) === 'public') { console.error(`[sync-dropin] refusing --prune into ${dest}: it is a site's web-root, and --prune would delete every file of the site outside the drop-in. Sync without --prune (bun run dropin); stale files INSIDE the drop-in are still removed.`) process.exit(1) } +// --if-present (the full build's last step): the configured host is OPTIONAL. Its absence is a skip, not an error. +// Only the ONE configured path is checked (dropin.dest, or DOXA_DROPIN_DEST): nothing on the filesystem is searched +// for other repos or sites. DOXA_DROPIN=off skips it even when the host is there. +if (args.includes('--if-present')) { + if (process.env.DOXA_DROPIN === 'off') { console.log('[sync-dropin] skipped: DOXA_DROPIN=off'); process.exit(0) } + if (!existsSync(dest) || !statSync(dest).isDirectory()) { console.log(`[sync-dropin] skipped: no host at the configured path ${dest}`); process.exit(0) } +} if (!existsSync(dest) || !statSync(dest).isDirectory()) { console.error(`[sync-dropin] dest does not exist or is not a directory: ${dest} — create the drop-in folder in the host first`); process.exit(1) } if (!existsSync(FROM)) { console.error(`[sync-dropin] source missing: ${FROM} — run \`bun run build\` first`); process.exit(1) } diff --git a/package.json b/package.json index f091e9ded..dcc06cb56 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "build": "bash internal/build-lock.sh", "build:bundle": "bun x vite build", "build:bundles": "node internal/run-parallel.mjs --bundles", - "build:unlocked": "bun run gates:pre && bun run library-index && bun run check:library-index && bun run clean && bun run token && bun run build:bundles && bun run tree && bun run gates:post", + "build:unlocked": "bun run gates:pre && bun run library-index && bun run check:library-index && bun run clean && bun run token && bun run build:bundles && bun run tree && bun run gates:post && node internal/sync-dropin.mjs --from-config --if-present", "build:watch": "bun x vite build --watch", "cap:sync": "./node_modules/.bin/cap sync android", "cap:verify": "test -f deployment/capacitor/android/app/src/main/assets/public/index.html && echo \"OK webDir copied\" || (echo \"FAIL: empty assets/public -> blank white screen. Check webDir.\" && exit 1)",