/** * Static-site build-output vocabulary and the emptiness probe over it. * * Node-only, and deliberately NOT under `patterns/`: that directory is the * browser-safe subpath (`@fjall/util/patterns`), and neither it nor the root * barrel may reach a module carrying a static `node:*` import — a named * builtin import binds to the bundler's throwing stub at evaluation time and * kills webapp hydration on every page, while prod tree-shaking hides it from * CI. Reachable only via the `@fjall/util/staticSiteOutput` subpath, whose * two consumers (the `StaticSite` construct, `staticSiteBuilder`) are both * Node-only. * * `barrelBrowserSafety.test.ts` walks the ROOT barrel's import graph for * exactly this edge, so re-exporting this module from `index.ts` fails the * util suite rather than the webapp dev server. It does NOT walk * `patterns/index.ts` — the root barrel imports that directory's leaf modules * directly and never the barrel itself — which is the second reason this * module lives at the src root: under `patterns/` its `node:fs` import would * be guarded by nothing. */ /** * Entries that do not make a static-site build output non-empty. * * The emptiness gate exists to stop a pruning upload wiping a live site, and * counting raw directory entries defeats it for the two cases that actually * occur: an OS file browser leaves `.DS_Store`/`Thumbs.db` in an empty output * directory, and a repo that tracks `dist/` commits a `.gitkeep` to keep it. * Either one makes a failed build look like a successful one, and the upload * then deletes every object already in the bucket. * * Deliberately narrow: `.well-known/` and other dot-entries are real site * content, so this is a fixed noise set, not a "skip dotfiles" rule. */ export declare const BUILD_OUTPUT_NOISE: ReadonlySet; /** * Whether a build output directory holds anything worth uploading. * * Shared by the two gates that must agree about it — `staticSiteBuilder` * during `fjall deploy` and the `StaticSite` construct at synth. They run in * different packages and at different times, so a private copy in either one * drifts silently: the deploy-time gate would refuse what the construct * permits, or permit what the construct refuses, and only one of them prints * the remedy the user is told to follow. * * Throws whatever `readdirSync` throws — a missing or unreadable directory is * a different failure with a different message, and each caller checks for it * first. */ export declare function hasDeployableContent(directory: string): boolean;