vantris 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shared/constants.ts","../src/shared/errors.ts","../src/utils/fs.ts","../src/utils/paths.ts","../src/config/load.ts","../src/config/resolve.ts","../src/html/parse.ts","../src/html/detect.ts","../src/html/client.ts","../src/server/websocket.ts","../src/server/mime.ts","../src/server/transform.ts","../src/server/static.ts","../src/server/index.ts","../src/build/assets.ts","../src/build/css.ts","../src/build/bundle.ts","../src/build/html.ts","../src/build/output.ts","../src/build/index.ts","../src/shared/logger.ts","../src/shared/context.ts","../src/shared/watcher.ts","../src/commands/support.ts","../src/commands/dev.ts","../src/commands/build.ts","../src/preview/index.ts","../src/commands/preview.ts","../src/commands/index.ts","../src/cli/help.ts","../src/cli/run.ts"],"names":["dev","build","extname","resolve","relative","readFile","join","mkdir","css","dirname","basename","sep","bundle","writeFile","rel"],"mappings":"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","file":"chunk-LRSN7SF4.js","sourcesContent":["/** Product name, used in CLI banners and logs. */\nexport const APP_NAME = \"vantris\";\n\n/** Current Vantris version. Kept in sync with package.json at release time. */\nexport const VERSION = \"0.3.0\";\n\n/** The HTML entry filename Vantris looks for at the project root. */\nexport const HTML_ENTRY_FILENAME = \"index.html\";\n\n/** Default directory values, relative to the project root. */\nexport const DEFAULTS = {\n root: \".\",\n rootDir: \"./src\",\n publicDir: \"./public\",\n outDir: \"./dist\",\n} as const;\n\n/** Default dev-server options. */\nexport const DEV_DEFAULTS = {\n port: 3000,\n host: \"localhost\",\n} as const;\n\n/** Default production-build options. */\nexport const BUILD_DEFAULTS = {\n minify: true,\n sourcemap: false,\n assetsDir: \"assets\",\n} as const;\n\n/**\n * File extensions the build treats as bundler assets — imported in JS they are\n * emitted as hashed files and the import resolves to their URL. Extend this\n * list to support more resource types (images, fonts, media, …).\n */\nexport const ASSET_EXTENSIONS = [\n // images\n \".svg\", \".png\", \".jpg\", \".jpeg\", \".gif\", \".webp\", \".avif\", \".ico\", \".bmp\",\n // fonts\n \".woff\", \".woff2\", \".ttf\", \".otf\", \".eot\",\n // media\n \".mp4\", \".webm\", \".ogg\", \".mp3\", \".wav\", \".flac\", \".aac\",\n] as const;\n\n/**\n * Message the dev server pushes over the WebSocket to ask the client to\n * reload. A typed string (rather than an empty frame) keeps room for richer\n * HMR messages in v1.x without breaking the v0.2 client.\n */\nexport const RELOAD_MESSAGE = \"reload\";\n\n/** Config filenames Vantris will look for, in priority order. */\nexport const CONFIG_FILENAMES = [\n \"vantris.config.ts\",\n \"vantris.config.js\",\n \"vantris.config.mjs\",\n] as const;\n","/**\n * Base class for all errors thrown intentionally by Vantris. The CLI layer can\n * recognise these and render them cleanly (without a stack trace), while\n * unexpected errors keep their full trace.\n */\nexport class VantrisError extends Error {\n override readonly name: string = \"VantrisError\";\n\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n }\n}\n\n/** Thrown when configuration is missing, malformed, or fails to load. */\nexport class ConfigError extends VantrisError {\n override readonly name = \"ConfigError\";\n}\n\n/** Thrown when the project's HTML entry cannot be found. */\nexport class HtmlEntryError extends VantrisError {\n override readonly name = \"HtmlEntryError\";\n}\n\n/** Thrown when the production build fails (bundling, HTML, asset copy, …). */\nexport class BuildError extends VantrisError {\n override readonly name = \"BuildError\";\n}\n\n/** Thrown for functionality declared but not yet implemented in this version. */\nexport class NotImplementedError extends VantrisError {\n override readonly name = \"NotImplementedError\";\n}\n\n/** Narrowing helper. */\nexport function isVantrisError(error: unknown): error is VantrisError {\n return error instanceof VantrisError;\n}\n","import { mkdir, readFile, stat } from \"node:fs/promises\";\n\n/** Returns `true` if `path` exists and is a regular file. */\nexport async function isFile(path: string): Promise<boolean> {\n try {\n return (await stat(path)).isFile();\n } catch {\n return false;\n }\n}\n\n/** Returns `true` if `path` exists and is a directory. */\nexport async function isDirectory(path: string): Promise<boolean> {\n try {\n return (await stat(path)).isDirectory();\n } catch {\n return false;\n }\n}\n\n/** Reads a UTF-8 text file. */\nexport function readTextFile(path: string): Promise<string> {\n return readFile(path, \"utf8\");\n}\n\n/** Creates a directory (and any missing parents) if it does not exist. */\nexport async function ensureDir(path: string): Promise<void> {\n await mkdir(path, { recursive: true });\n}\n","import { isAbsolute, resolve } from \"node:path\";\n\n/**\n * Resolves `target` against `base`, returning an absolute path.\n * Absolute targets are returned untouched.\n */\nexport function resolveFrom(base: string, target: string): string {\n return isAbsolute(target) ? target : resolve(base, target);\n}\n","import { pathToFileURL } from \"node:url\";\nimport type { Config, ConfigInput } from \"../types/config.js\";\nimport type { Logger } from \"../types/logger.js\";\nimport { CONFIG_FILENAMES } from \"../shared/constants.js\";\nimport { ConfigError } from \"../shared/errors.js\";\nimport { isFile } from \"../utils/fs.js\";\nimport { resolveFrom } from \"../utils/paths.js\";\n\nexport interface LoadConfigOptions {\n /** Directory to search for a config file. */\n cwd: string;\n /** Logger for diagnostics. */\n logger: Logger;\n /** Explicit config file path; bypasses filename discovery. */\n configFile?: string;\n}\n\nexport interface LoadedConfig {\n /** Parsed configuration. Empty object when no config file is present. */\n config: Config;\n /** Absolute path of the file that was loaded, or `null` when none. */\n file: string | null;\n}\n\n/**\n * Locates and loads a `vantris.config.*` file from `cwd`.\n *\n * The actual module evaluation is isolated here so the loading strategy\n * (native TS stripping today; a bundled loader such as esbuild/jiti later)\n * can change without affecting any caller. A missing config is not an error —\n * defaults take over downstream.\n */\nexport async function loadConfig(\n options: LoadConfigOptions,\n): Promise<LoadedConfig> {\n const { cwd, logger } = options;\n\n const file = options.configFile\n ? resolveFrom(cwd, options.configFile)\n : await findConfigFile(cwd);\n\n if (!file) {\n logger.debug(\"No config file found; using defaults.\");\n return { config: {}, file: null };\n }\n\n logger.debug(`Loading config from ${file}`);\n const config = await importConfig(file);\n return { config, file };\n}\n\n/** Returns the first existing config file in {@link CONFIG_FILENAMES}. */\nasync function findConfigFile(cwd: string): Promise<string | null> {\n for (const name of CONFIG_FILENAMES) {\n const candidate = resolveFrom(cwd, name);\n if (await isFile(candidate)) return candidate;\n }\n return null;\n}\n\n/**\n * Imports a config module and normalises its export to a {@link Config}.\n * Relies on the Node runtime's native TypeScript support for `.ts` files.\n */\nasync function importConfig(file: string): Promise<Config> {\n let mod: { default?: unknown };\n try {\n // Cache-bust so repeated loads (e.g. a future config-watch mode) re-read.\n const url = `${pathToFileURL(file).href}?t=${Date.now()}`;\n mod = (await import(url)) as { default?: unknown };\n } catch (cause) {\n throw new ConfigError(`Failed to load config file: ${file}`, { cause });\n }\n\n const exported = mod.default;\n if (exported === undefined) {\n throw new ConfigError(\n `Config file \"${file}\" has no default export. ` +\n `Export your config with \\`export default defineConfig({ ... })\\`.`,\n );\n }\n\n return normalise(exported as ConfigInput, file);\n}\n\n/** Resolves a {@link ConfigInput} (object or factory) into a {@link Config}. */\nasync function normalise(\n input: ConfigInput,\n file: string,\n): Promise<Config> {\n const value = typeof input === \"function\" ? await input() : input;\n\n if (value === null || typeof value !== \"object\") {\n throw new ConfigError(\n `Config file \"${file}\" must export an object (or a function returning one).`,\n );\n }\n\n return value;\n}\n","import type { Config } from \"../types/config.js\";\nimport type {\n ResolvedBuildConfig,\n ResolvedConfig,\n ResolvedDevConfig,\n} from \"../types/config-resolved.js\";\nimport type { ResolvedPaths } from \"../types/paths.js\";\nimport { BUILD_DEFAULTS, DEFAULTS, DEV_DEFAULTS } from \"../shared/constants.js\";\nimport { resolveFrom } from \"../utils/paths.js\";\n\n/**\n * Applies defaults to a raw {@link Config} and resolves every directory to an\n * absolute path. This is the single source of truth for default values and\n * path resolution — no other module should re-derive these.\n *\n * @param raw User configuration (after loading; may be empty).\n * @param cwd Working directory the invocation started from.\n * @param configFile Absolute path of the loaded config file, or `null`.\n */\nexport function resolveConfig(\n raw: Config,\n cwd: string,\n configFile: string | null = null,\n): ResolvedConfig {\n const root = resolveFrom(cwd, raw.root ?? DEFAULTS.root);\n\n const paths: ResolvedPaths = {\n root,\n rootDir: resolveFrom(root, raw.rootDir ?? DEFAULTS.rootDir),\n publicDir: resolveFrom(root, raw.publicDir ?? DEFAULTS.publicDir),\n outDir: resolveFrom(root, raw.outDir ?? DEFAULTS.outDir),\n };\n\n const base = normalizeBase(raw.base ?? \"/\");\n\n const dev: ResolvedDevConfig = {\n port: raw.dev?.port ?? DEV_DEFAULTS.port,\n host: raw.dev?.host ?? DEV_DEFAULTS.host,\n };\n\n const assetsDir = raw.build?.assetsDir ?? BUILD_DEFAULTS.assetsDir;\n const build: ResolvedBuildConfig = {\n minify: raw.build?.minify ?? BUILD_DEFAULTS.minify,\n sourcemap: raw.build?.sourcemap ?? BUILD_DEFAULTS.sourcemap,\n assetsDir,\n // File-name patterns default off `assetsDir`; explicit values win.\n entryFileNames: raw.build?.entryFileNames ?? `${assetsDir}/[name]-[hash].js`,\n chunkFileNames: raw.build?.chunkFileNames ?? `${assetsDir}/[name]-[hash].js`,\n assetFileNames:\n raw.build?.assetFileNames ?? `${assetsDir}/[name]-[hash][extname]`,\n };\n\n return { raw, paths, base, dev, build, configFile };\n}\n\n/** Ensures the base path starts and ends with `/` (leaving absolute URLs intact). */\nfunction normalizeBase(base: string): string {\n let value = base.trim() || \"/\";\n if (!/^https?:\\/\\//.test(value) && !value.startsWith(\"/\")) {\n value = `/${value}`;\n }\n if (!value.endsWith(\"/\")) value = `${value}/`;\n return value;\n}\n","import type { HtmlEntry, HtmlModuleScript } from \"../types/html.js\";\n\n/** Matches `<script ... type=\"module\" ... src=\"...\">` tags (any attr order). */\nconst SCRIPT_TAG = /<script\\b[^>]*>/gi;\nconst TYPE_MODULE = /\\btype\\s*=\\s*[\"']module[\"']/i;\nconst SRC_ATTR = /\\bsrc\\s*=\\s*[\"']([^\"']+)[\"']/i;\n\n/**\n * Parses raw HTML into an {@link HtmlEntry}, extracting `<script type=\"module\">`\n * `src` references.\n *\n * The analysis is intentionally regex-light rather than a full DOM parse: in\n * dev we only need to know the module entry points. This module is the single,\n * isolated home for HTML analysis, so it can grow toward a real parser (for\n * HMR boundaries, plugin transforms, virtual modules) without touching callers.\n */\nexport function parseHtml(file: string, html: string): HtmlEntry {\n const scripts: HtmlModuleScript[] = [];\n\n for (const [tag] of html.matchAll(SCRIPT_TAG)) {\n if (!TYPE_MODULE.test(tag)) continue;\n const src = SRC_ATTR.exec(tag)?.[1];\n if (src) scripts.push({ src });\n }\n\n return { file, html, scripts };\n}\n","import type { HtmlEntry } from \"../types/html.js\";\nimport { HTML_ENTRY_FILENAME } from \"../shared/constants.js\";\nimport { isFile, readTextFile } from \"../utils/fs.js\";\nimport { resolveFrom } from \"../utils/paths.js\";\nimport { parseHtml } from \"./parse.js\";\n\n/**\n * Locates the project's `index.html` entry at `root`.\n *\n * @returns The parsed {@link HtmlEntry}, or `null` if no entry exists.\n */\nexport async function detectHtmlEntry(root: string): Promise<HtmlEntry | null> {\n const file = resolveFrom(root, HTML_ENTRY_FILENAME);\n if (!(await isFile(file))) return null;\n\n const html = await readTextFile(file);\n return parseHtml(file, html);\n}\n","/**\n * The dev-only live-reload client, injected into the served HTML.\n *\n * v0.2.0 does a full page reload on any change. The WebSocket URL is derived\n * from `location.host` so it works regardless of how the host is addressed\n * (`localhost`, `127.0.0.1`, LAN IP). The message payload is ignored for now;\n * v1.x will branch on it to drive HMR instead of a full reload.\n */\nexport const DEV_CLIENT_SCRIPT = `<script type=\"module\">\n // Injected by Vantris dev server — live reload (full page).\n const connect = () => {\n const ws = new WebSocket(\"ws://\" + location.host);\n ws.addEventListener(\"message\", () => location.reload());\n // Reconnect if the dev server restarts.\n ws.addEventListener(\"close\", () => setTimeout(connect, 1000));\n };\n connect();\n</script>`;\n\n/**\n * Injects {@link DEV_CLIENT_SCRIPT} into an HTML document.\n *\n * The script is placed just before `</head>` when present, otherwise before\n * `</body>`, otherwise appended — so it loads before user modules without\n * requiring a well-formed document.\n */\nexport function injectDevClient(html: string): string {\n if (html.includes(\"</head>\")) {\n return html.replace(\"</head>\", `${DEV_CLIENT_SCRIPT}\\n</head>`);\n }\n if (html.includes(\"</body>\")) {\n return html.replace(\"</body>\", `${DEV_CLIENT_SCRIPT}\\n</body>`);\n }\n return `${html}\\n${DEV_CLIENT_SCRIPT}`;\n}\n","import type { Server as HttpServer } from \"node:http\";\nimport { WebSocket, WebSocketServer } from \"ws\";\nimport type { Logger } from \"../types/logger.js\";\nimport { RELOAD_MESSAGE } from \"../shared/constants.js\";\n\n/** Handle over the live-reload WebSocket channel. */\nexport interface ReloadSocket {\n /** Pushes a reload signal to every connected client. */\n broadcastReload(): void;\n /** Number of currently connected clients. */\n readonly clientCount: number;\n /** Closes the WebSocket server and all connections. */\n close(): Promise<void>;\n}\n\nexport interface ReloadSocketOptions {\n /** The HTTP server to share the port with (handles the WS upgrade). */\n server: HttpServer;\n logger: Logger;\n}\n\n/**\n * Attaches a live-reload WebSocket server to an existing HTTP server so the\n * client (injected into the HTML) and the server share a single port.\n *\n * The protocol is intentionally one-way and trivial in v0.2.0: the server\n * pushes {@link RELOAD_MESSAGE} and the client does a full page reload. v1.x\n * will replace this with a richer, bidirectional HMR channel — only this\n * module changes.\n */\nexport function createReloadSocket(options: ReloadSocketOptions): ReloadSocket {\n const { server, logger } = options;\n const wss = new WebSocketServer({ server });\n const clients = new Set<WebSocket>();\n\n wss.on(\"connection\", (socket) => {\n clients.add(socket);\n socket.on(\"close\", () => clients.delete(socket));\n socket.on(\"error\", () => clients.delete(socket));\n });\n\n wss.on(\"error\", (error) => {\n logger.error(`websocket error: ${error.message}`);\n });\n\n return {\n broadcastReload() {\n for (const socket of clients) {\n if (socket.readyState === WebSocket.OPEN) {\n socket.send(RELOAD_MESSAGE);\n }\n }\n },\n get clientCount() {\n return clients.size;\n },\n close() {\n return new Promise((resolveClose) => {\n for (const socket of clients) socket.terminate();\n clients.clear();\n wss.close(() => resolveClose());\n });\n },\n };\n}\n","import { extname } from \"node:path\";\n\n/**\n * Minimal extension → MIME type map for the dev server. Transpiled `.ts`/`.tsx`\n * files are served as JavaScript (see {@link contentTypeFor}). This stays small\n * on purpose; a full asset pipeline is out of scope for v0.2.0.\n */\nconst MIME_TYPES: Record<string, string> = {\n \".html\": \"text/html; charset=utf-8\",\n \".js\": \"text/javascript; charset=utf-8\",\n \".mjs\": \"text/javascript; charset=utf-8\",\n \".css\": \"text/css; charset=utf-8\",\n \".json\": \"application/json; charset=utf-8\",\n \".svg\": \"image/svg+xml\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".ico\": \"image/x-icon\",\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n \".txt\": \"text/plain; charset=utf-8\",\n \".map\": \"application/json; charset=utf-8\",\n};\n\nconst JAVASCRIPT = \"text/javascript; charset=utf-8\";\n\n/**\n * Resolves the `Content-Type` for a file path.\n *\n * @param file Absolute or relative file path.\n * @param transpiled When `true`, the file is served as JavaScript regardless\n * of its source extension (e.g. a transpiled `.ts`).\n */\nexport function contentTypeFor(file: string, transpiled = false): string {\n if (transpiled) return JAVASCRIPT;\n return MIME_TYPES[extname(file).toLowerCase()] ?? \"application/octet-stream\";\n}\n","import { extname } from \"node:path\";\nimport { transform, type Loader } from \"esbuild\";\n\n/** Extensions handled by the on-the-fly TypeScript/JSX transpiler. */\nconst TRANSPILE_EXTENSIONS = new Set([\".ts\", \".tsx\", \".mts\", \".cts\", \".jsx\"]);\n\n/** Whether a file path should be transpiled before being served. */\nexport function shouldTranspile(file: string): boolean {\n return TRANSPILE_EXTENSIONS.has(extname(file).toLowerCase());\n}\n\n/** Maps a file extension to the matching esbuild loader. */\nfunction loaderFor(file: string): Loader {\n switch (extname(file).toLowerCase()) {\n case \".tsx\":\n return \"tsx\";\n case \".jsx\":\n return \"jsx\";\n default:\n return \"ts\";\n }\n}\n\n/**\n * Transpiles a single TypeScript/JSX module to browser-ready ESM using esbuild.\n *\n * This is a **transform only** — no bundling, no resolution, no production\n * optimisation (those belong to the build system in a later version). Import\n * specifiers are left untouched; the dev server resolves them per request.\n * An inline source map is emitted so the browser maps back to the original.\n */\nexport async function transpile(code: string, file: string): Promise<string> {\n const result = await transform(code, {\n loader: loaderFor(file),\n format: \"esm\",\n target: \"es2022\",\n sourcemap: \"inline\",\n sourcefile: file,\n });\n return result.code;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { extname, join, resolve, sep } from \"node:path\";\nimport { isFile } from \"../utils/fs.js\";\nimport { contentTypeFor } from \"./mime.js\";\nimport { shouldTranspile, transpile } from \"./transform.js\";\n\n/** Extensions tried when a request has no extension (bare module imports). */\nconst RESOLVE_EXTENSIONS = [\".ts\", \".tsx\", \".mts\", \".js\", \".mjs\", \".jsx\"];\n\n/** A resolved, ready-to-serve asset. */\nexport interface LoadedAsset {\n /** Response body — text for transpiled/HTML, bytes for binary assets. */\n body: string | Uint8Array;\n /** Resolved `Content-Type`. */\n contentType: string;\n /** `true` when the asset is an HTML document. */\n isHtml: boolean;\n}\n\nexport interface StaticLoaderOptions {\n /** Project root — base for resolving root-relative request paths. */\n root: string;\n /**\n * Source directory. Only files **inside** this directory are reachable via\n * root-relative paths (e.g. `/src/main.ts`). This is what keeps\n * `node_modules`, `package.json`, lockfiles, and config files unreachable.\n */\n rootDir: string;\n /** Public directory whose contents are served at `/` (Vite-style). */\n publicDir: string;\n}\n\n/**\n * Creates a per-request asset loader for the dev server.\n *\n * The serveable surface is an **allowlist** — only the source tree (`rootDir`)\n * and the public directory are exposed; nothing else under the project root is\n * reachable. Files are read fresh on every call so edits show up on reload, and\n * TypeScript/JSX is transpiled on the fly.\n *\n * @returns A function resolving a pathname to a {@link LoadedAsset}, or `null`\n * when nothing matches (or the path is outside the allowlist).\n */\nexport function createStaticLoader(options: StaticLoaderOptions) {\n const root = resolve(options.root);\n const rootDir = resolve(options.rootDir);\n const publicDir = resolve(options.publicDir);\n\n return async function loadAsset(\n pathname: string,\n ): Promise<LoadedAsset | null> {\n const relative = decodeURIComponent(pathname).replace(/^\\/+/, \"\");\n if (!relative) return null;\n\n // 1. Source files: resolved against the root but confined to `rootDir`,\n // so only the source subtree (e.g. `/src/*`) is ever served.\n const source = await resolveConfined(root, rootDir, relative);\n if (source) return readAsset(source);\n\n // 2. Public assets: served at `/` (e.g. `/favicon.svg`).\n const asset = await resolveConfined(publicDir, publicDir, relative);\n if (asset) return readAsset(asset);\n\n return null;\n };\n}\n\n/**\n * Resolves `relative` against `base`, trying extension candidates, and returns\n * the file only if it lands inside `confine` (the allowlist boundary). This\n * single check rejects both path traversal (`..`) and anything outside the\n * permitted directories.\n */\nasync function resolveConfined(\n base: string,\n confine: string,\n relative: string,\n): Promise<string | null> {\n const target = resolve(join(base, relative));\n if (target !== confine && !target.startsWith(confine + sep)) {\n return null;\n }\n\n if (await isFile(target)) return target;\n\n if (!extname(target)) {\n for (const ext of RESOLVE_EXTENSIONS) {\n const candidate = `${target}${ext}`;\n if (await isFile(candidate)) return candidate;\n }\n }\n return null;\n}\n\n/** Reads a file, transpiling it when needed, and resolves its content type. */\nasync function readAsset(file: string): Promise<LoadedAsset> {\n const ext = extname(file).toLowerCase();\n const isHtml = ext === \".html\";\n\n if (shouldTranspile(file)) {\n const source = await readFile(file, \"utf8\");\n return {\n body: await transpile(source, file),\n contentType: contentTypeFor(file, true),\n isHtml: false,\n };\n }\n\n if (isHtml) {\n return {\n body: await readFile(file, \"utf8\"),\n contentType: contentTypeFor(file),\n isHtml: true,\n };\n }\n\n return {\n body: await readFile(file),\n contentType: contentTypeFor(file),\n isHtml: false,\n };\n}\n","import { createServer, type Server as HttpServer } from \"node:http\";\nimport { readFile } from \"node:fs/promises\";\nimport { H3, getRequestURL, toNodeHandler } from \"h3\";\nimport type { H3Event } from \"h3\";\nimport type { Context } from \"../types/context.js\";\nimport type { HtmlEntry } from \"../types/html.js\";\nimport { injectDevClient } from \"../html/index.js\";\nimport { createReloadSocket, type ReloadSocket } from \"./websocket.js\";\nimport { createStaticLoader } from \"./static.js\";\n\n/** Options for {@link startDevServer}. */\nexport interface DevServerOptions {\n ctx: Context;\n /** The detected HTML entry, when present. */\n entry: HtmlEntry | null;\n}\n\n/** A running dev server. */\nexport interface DevServerHandle {\n /** Address the server is listening on, e.g. `http://localhost:3000/`. */\n readonly url: string;\n readonly host: string;\n readonly port: number;\n /** Pushes a full-page reload to every connected browser. */\n broadcastReload(): void;\n /** Stops the HTTP and WebSocket servers. */\n close(): Promise<void>;\n}\n\nconst HTML_HEADERS = {\n \"content-type\": \"text/html; charset=utf-8\",\n \"cache-control\": \"no-cache\",\n} as const;\n\n/**\n * Starts the H3-based development server.\n *\n * Responsibilities are split across the `server` module: this file owns the\n * HTTP routing (H3) and lifecycle, {@link createStaticLoader} owns file\n * resolution + transpilation, and {@link createReloadSocket} owns live reload.\n * The HTTP and WebSocket servers share a single port.\n */\nexport async function startDevServer(\n options: DevServerOptions,\n): Promise<DevServerHandle> {\n const { ctx, entry } = options;\n const { paths, dev } = ctx.config;\n\n const loadAsset = createStaticLoader({\n root: paths.root,\n rootDir: paths.rootDir,\n publicDir: paths.publicDir,\n });\n const entryFile = entry?.file ?? null;\n\n const app = new H3();\n const handler = async (event: H3Event) => {\n const { pathname } = getRequestURL(event);\n\n // 1. A real file on disk (transpiled if it's TypeScript/JSX).\n const asset = await loadAsset(pathname);\n if (asset) {\n if (asset.isHtml) {\n return new Response(injectDevClient(asset.body as string), {\n headers: HTML_HEADERS,\n });\n }\n return new Response(asset.body, {\n headers: { \"content-type\": asset.contentType, \"cache-control\": \"no-cache\" },\n });\n }\n\n // 2. Anything else falls back to the HTML entry. Root files\n // (package.json, configs, node_modules, …) are never read — they are\n // outside the served allowlist — so the client only ever gets index.html.\n if (entryFile) {\n const html = await readFile(entryFile, \"utf8\");\n return new Response(injectDevClient(html), { headers: HTML_HEADERS });\n }\n\n // 3. No HTML entry exists yet.\n return new Response(`404 Not Found: ${pathname}`, {\n status: 404,\n headers: { \"content-type\": \"text/plain; charset=utf-8\" },\n });\n };\n\n app.all(\"/\", handler);\n app.all(\"/**\", handler);\n\n const server: HttpServer = createServer(toNodeHandler(app));\n const reload: ReloadSocket = createReloadSocket({ server, logger: ctx.logger });\n\n // The actual bound port — important when `port` is 0 (OS-assigned).\n const port = await listen(server, dev.port, dev.host);\n\n const url = `http://${dev.host}:${port}/`;\n\n return {\n url,\n host: dev.host,\n port,\n broadcastReload: () => reload.broadcastReload(),\n async close() {\n await reload.close();\n await new Promise<void>((resolveClose, reject) => {\n server.close((err) => (err ? reject(err) : resolveClose()));\n });\n },\n };\n}\n\n/** Promisified `server.listen`; resolves with the actual bound port. */\nfunction listen(server: HttpServer, port: number, host: string): Promise<number> {\n return new Promise((resolveListen, reject) => {\n const onError = (err: NodeJS.ErrnoException) => {\n server.removeListener(\"error\", onError);\n reject(\n err.code === \"EADDRINUSE\"\n ? new Error(`Port ${port} is already in use.`)\n : err,\n );\n };\n server.once(\"error\", onError);\n server.listen(port, host, () => {\n server.removeListener(\"error\", onError);\n const address = server.address();\n resolveListen(\n typeof address === \"object\" && address ? address.port : port,\n );\n });\n });\n}\n","import { createHash } from \"node:crypto\";\nimport { cp, mkdir, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, extname, join } from \"node:path\";\nimport { isDirectory } from \"../utils/fs.js\";\nimport { BuildError } from \"../shared/errors.js\";\n\n/** A short, content-derived hash (matches the bundler's `[hash]` style). */\nexport function contentHash(content: string | Uint8Array): string {\n return createHash(\"sha256\").update(content).digest(\"base64url\").slice(0, 8);\n}\n\n/**\n * Writes `content` to `${outDir}/${assetsDir}/${name}-${hash}${ext}`, deriving\n * the name and extension from `sourceName`.\n *\n * @returns The emitted file name relative to `outDir` (e.g. `assets/logo-AbC1.svg`).\n */\nexport async function emitHashedAsset(\n outDir: string,\n assetsDir: string,\n sourceName: string,\n content: string | Uint8Array,\n): Promise<string> {\n const ext = extname(sourceName);\n const name = basename(sourceName, ext) || \"asset\";\n const fileName = `${assetsDir}/${name}-${contentHash(content)}${ext}`;\n const target = join(outDir, fileName);\n await mkdir(dirname(target), { recursive: true });\n await writeFile(target, content);\n return fileName;\n}\n\n/**\n * Copies the public directory verbatim into the output directory.\n *\n * Files under `publicDir` are emitted as-is, with no transformation — exactly\n * Vite's `public/` semantics. This is the seam where richer asset handling\n * (hashing, manifests) can later hook in without changing callers.\n *\n * @returns `true` when a public directory existed and was copied.\n * @throws {BuildError} when copying fails.\n */\nexport async function copyPublicDir(\n publicDir: string,\n outDir: string,\n): Promise<boolean> {\n if (!(await isDirectory(publicDir))) return false;\n\n try {\n await cp(publicDir, outDir, { recursive: true });\n return true;\n } catch (cause) {\n throw new BuildError(\n `Failed to copy public assets from ${publicDir}: ${\n cause instanceof Error ? cause.message : String(cause)\n }`,\n { cause },\n );\n }\n}\n","import { readFile, realpath } from \"node:fs/promises\";\nimport { basename, dirname, extname, resolve, sep } from \"node:path\";\nimport { bundleAsync } from \"lightningcss\";\nimport type { Plugin } from \"rolldown\";\nimport type { ResolvedPaths } from \"../types/paths.js\";\nimport { BuildError } from \"../shared/errors.js\";\nimport { emitHashedAsset } from \"./assets.js\";\n\nconst STYLE_RE = /\\.(css|scss|sass|less)$/i;\nconst MODULE_RE = /\\.module\\.[^.]+$/i;\n\nfunction stripQuery(path: string): string {\n return path.split(\"?\", 1)[0] ?? path;\n}\n\n/** Whether a path is a stylesheet (CSS or a supported preprocessor). */\nexport function isStyle(path: string): boolean {\n return STYLE_RE.test(stripQuery(path));\n}\n\n/** Whether a path is a CSS module (`*.module.*`). */\nexport function isCssModule(path: string): boolean {\n return MODULE_RE.test(stripQuery(path));\n}\n\n/** Runs CSS through a project's PostCSS config (e.g. Tailwind, autoprefixer). */\nexport type PostcssRunner = (css: string, from: string) => Promise<string>;\n\n/** Options shared by every style transform. */\nexport interface StyleOptions {\n paths: ResolvedPaths;\n outDir: string;\n assetsDir: string;\n base: string;\n minify: boolean;\n /** PostCSS runner, when the project has a PostCSS config. */\n postcss?: PostcssRunner | null;\n}\n\n/**\n * Loads the project's PostCSS config (if any) into a runner.\n *\n * Returns `null` when there is no config or PostCSS is not installed — PostCSS\n * is entirely opt-in, exactly like Vite. The loader is dynamic so projects that\n * don't use PostCSS never pay for it.\n */\nexport async function loadPostcss(root: string): Promise<PostcssRunner | null> {\n const { default: load } = await import(\"postcss-load-config\");\n let config: Awaited<ReturnType<typeof load>>;\n try {\n config = await load({}, root);\n } catch (error) {\n const message = error instanceof Error ? error.message : \"\";\n if (/No PostCSS Config found|Cannot find (module|package)/i.test(message)) {\n return null;\n }\n throw new BuildError(`Failed to load PostCSS config: ${message}`, {\n cause: error,\n });\n }\n\n const { default: postcss } = await import(\"postcss\");\n const processor = postcss(config.plugins);\n return async (css, from) => {\n const result = await processor.process(css, { ...config.options, from });\n return result.css;\n };\n}\n\n/** The result of processing one stylesheet. */\nexport interface ProcessedStyle {\n /** Final CSS (preprocessed, transformed, url()s rewritten, minified). */\n css: string;\n /** CSS-module class map (`original → scoped`), when the file is a module. */\n exports?: Record<string, string>;\n}\n\n/** Lazily imports an optional preprocessor, with a helpful error if missing. */\nasync function importOptional(name: string, forExt: string): Promise<unknown> {\n try {\n return await import(name);\n } catch {\n throw new BuildError(\n `\"${name}\" is required to compile ${forExt} files. Install it (e.g. \\`pnpm add -D ${name}\\`).`,\n );\n }\n}\n\n/** Compiles a preprocessor file (or reads plain CSS) to a CSS string. */\nasync function preprocess(file: string, ext: string): Promise<string> {\n if (ext === \".scss\" || ext === \".sass\") {\n const sass = (await importOptional(\"sass\", \".scss/.sass\")) as {\n compile(file: string, options?: unknown): { css: string };\n };\n return sass.compile(file, { style: \"expanded\" }).css;\n }\n if (ext === \".less\") {\n const less = (\n (await importOptional(\"less\", \".less\")) as {\n default: { render(input: string, options?: unknown): Promise<{ css: string }> };\n }\n ).default;\n const out = await less.render(await readFile(file, \"utf8\"), { filename: file });\n return out.css;\n }\n return readFile(file, \"utf8\");\n}\n\n/**\n * Processes one stylesheet end-to-end: preprocess → lightningcss (CSS modules,\n * `url()` analysis, minification, nesting) → emit + rewrite `url()` assets that\n * live under `rootDir`. External and public `url()`s are left untouched.\n */\nexport async function processStyle(\n file: string,\n options: StyleOptions,\n): Promise<ProcessedStyle> {\n const clean = stripQuery(file);\n\n // `bundleAsync` inlines `@import`; every file in the graph (entry and\n // imported) is read through the resolver so it goes through the preprocessor\n // and PostCSS first.\n let result;\n try {\n result = await bundleAsync({\n filename: clean,\n minify: options.minify,\n analyzeDependencies: true,\n cssModules: isCssModule(clean),\n resolver: {\n read: async (filePath) => {\n let css = await preprocess(filePath, extname(filePath).toLowerCase());\n if (options.postcss) css = await options.postcss(css, filePath);\n return css;\n },\n resolve: (specifier, from) => resolve(dirname(from), specifier),\n },\n });\n } catch (error) {\n throw new BuildError(\n `Failed to process ${basename(clean)}: ${error instanceof Error ? error.message : String(error)}`,\n { cause: error },\n );\n }\n\n let css = result.code.toString();\n for (const dep of result.dependencies ?? []) {\n if (dep.type === \"url\") {\n // Resolve relative to the file the url() actually appears in.\n const fromDir = dirname(dep.loc.filePath);\n const target = await resolveStyleUrl(dep.url, fromDir, options.paths);\n if (target) {\n const fileName = await emitHashedAsset(\n options.outDir,\n options.assetsDir,\n basename(target),\n await readFile(target),\n );\n css = css.replaceAll(dep.placeholder, `${options.base}${fileName}`);\n } else {\n css = css.replaceAll(dep.placeholder, dep.url);\n }\n } else if (dep.type === \"import\") {\n // `@import` of an unresolved/external sheet: keep the original URL.\n css = css.replaceAll(dep.placeholder, dep.url);\n }\n }\n\n const exports = result.exports\n ? Object.fromEntries(\n Object.entries(result.exports).map(([key, value]) => [key, value.name]),\n )\n : undefined;\n\n return exports ? { css, exports } : { css };\n}\n\n/**\n * Resolves a `url()` to an existing source file under `rootDir`, else `null`\n * (leaving the URL untouched). Comparison goes through `realpath` so it is\n * robust to symlinked temp/roots (e.g. macOS `/var` → `/private/var`).\n */\nasync function resolveStyleUrl(\n url: string,\n fromDir: string,\n paths: ResolvedPaths,\n): Promise<string | null> {\n if (/^(?:[a-z]+:)?\\/\\//i.test(url) || /^(?:data:|#)/i.test(url) || url.startsWith(\"/\")) {\n return null;\n }\n const candidate = resolve(fromDir, url.split(/[?#]/, 1)[0] ?? url);\n const real = await realpath(candidate).catch(() => null);\n if (!real) return null;\n const root = await realpath(paths.rootDir).catch(() => paths.rootDir);\n return real === root || real.startsWith(root + sep) ? real : null;\n}\n\n/** A tiny runtime snippet that injects a stylesheet `<link>` once. */\nfunction cssLoaderSnippet(href: string): string {\n const h = JSON.stringify(href);\n return (\n `(function(){try{var d=document;if(!d.querySelector('link[href='+JSON.stringify(${h})+']')){` +\n `var l=d.createElement(\"link\");l.rel=\"stylesheet\";l.href=${h};d.head.appendChild(l);}}catch(e){}})();`\n );\n}\n\n/**\n * Internal bundler plugin implementing the CSS pipeline.\n *\n * `load` runs {@link processStyle} on every stylesheet (returning the class map\n * for CSS modules, or an inert module otherwise) and keeps the CSS per module.\n * `generateBundle` concatenates each chunk's CSS in execution order, emits a\n * hashed `.css`, and either records it for the HTML (entry chunks) or injects a\n * loader so the CSS arrives with its async chunk (code-split chunks).\n */\nexport function cssPlugin(\n options: StyleOptions,\n cssByEntry: Map<string, string>,\n): Plugin {\n const cssByModule = new Map<string, string>();\n\n return {\n name: \"vantris:css\",\n async load(id) {\n const file = stripQuery(id);\n if (!isStyle(file)) return null;\n\n const { css, exports } = await processStyle(file, options);\n cssByModule.set(id, css);\n\n const code = exports\n ? `export default ${JSON.stringify(exports)};`\n : \"export default {};\";\n return { code, moduleType: \"js\", moduleSideEffects: \"no-treeshake\" };\n },\n async generateBundle(_outputOptions, bundle) {\n for (const fileName of Object.keys(bundle)) {\n const chunk = bundle[fileName];\n if (!chunk || chunk.type !== \"chunk\") continue;\n\n const css = chunk.moduleIds\n .filter((moduleId) => cssByModule.has(moduleId))\n .map((moduleId) => cssByModule.get(moduleId)!)\n .join(\"\\n\");\n if (!css) continue;\n\n const cssFile = await emitHashedAsset(\n options.outDir,\n options.assetsDir,\n `${chunk.name}.css`,\n css,\n );\n\n if (chunk.isEntry) {\n cssByEntry.set(chunk.name, cssFile);\n } else {\n // Code-split chunk: load its CSS when the chunk executes.\n chunk.code = cssLoaderSnippet(`${options.base}${cssFile}`) + chunk.code;\n }\n }\n },\n };\n}\n","import { readFile } from \"node:fs/promises\";\nimport { basename, extname } from \"node:path\";\nimport MagicString from \"magic-string\";\nimport { rolldown } from \"rolldown\";\nimport type {\n InputOptions,\n OutputOptions,\n Plugin,\n PreRenderedAsset,\n PreRenderedChunk,\n RolldownOutput,\n} from \"rolldown\";\nimport type { ResolvedConfig } from \"../types/config-resolved.js\";\nimport type { AssetFileNames, ChunkFileNames } from \"../types/config.js\";\nimport { ASSET_EXTENSIONS } from \"../shared/constants.js\";\nimport { BuildError } from \"../shared/errors.js\";\nimport { cssPlugin, type PostcssRunner } from \"./css.js\";\n\nconst ASSET_EXTENSION_SET = new Set<string>(ASSET_EXTENSIONS);\n\n/** Bundler output items (chunks + assets). */\nexport type BundleOutput = RolldownOutput[\"output\"];\n\nexport interface BundleInput {\n /** Bundler inputs: unique entry name → absolute entry-module path. */\n entries: Record<string, string>;\n /** Resolved Vantris configuration. */\n config: ResolvedConfig;\n /** PostCSS runner for the project, when configured. */\n postcss?: PostcssRunner | null;\n}\n\nexport interface BundleResult {\n /** All emitted chunks and assets. */\n output: BundleOutput;\n /** Emitted entry-CSS file name (relative to `outDir`), keyed by entry name. */\n cssByEntry: Map<string, string>;\n}\n\n/**\n * Bundles the application with Rolldown.\n *\n * This is the **only** module aware of Rolldown: it translates Vantris's\n * resolved configuration into Rolldown's input/output options and hides the\n * bundler entirely from the rest of the system. Rolldown handles bundling,\n * tree shaking, minification, and code splitting.\n *\n * @throws {BuildError} when bundling fails or no entry chunk is produced.\n */\nexport async function bundle(input: BundleInput): Promise<BundleResult> {\n const { entries, config } = input;\n const { paths, build } = config;\n\n const cssByEntry = new Map<string, string>();\n const styleOptions = {\n paths,\n outDir: paths.outDir,\n assetsDir: build.assetsDir,\n base: config.base,\n minify: build.minify,\n postcss: input.postcss ?? null,\n };\n const inputOptions: InputOptions = {\n input: entries,\n cwd: paths.root,\n platform: \"browser\",\n // Images/fonts/media imported from JS become hashed assets with absolute\n // URLs from `base`; the CSS plugin handles styles (modules, url(), lazy).\n plugins: [assetUrlPlugin(config.base), cssPlugin(styleOptions, cssByEntry)],\n // Tree shaking is enabled by default.\n };\n\n const outputOptions: OutputOptions = {\n dir: paths.outDir,\n format: \"es\",\n minify: build.minify,\n sourcemap: build.sourcemap,\n entryFileNames: toChunkNames(build.entryFileNames),\n chunkFileNames: toChunkNames(build.chunkFileNames),\n assetFileNames: toAssetNames(build.assetFileNames),\n };\n\n let result: RolldownOutput;\n try {\n const bundler = await rolldown(inputOptions);\n try {\n result = await bundler.write(outputOptions);\n } finally {\n await bundler.close();\n }\n } catch (cause) {\n throw new BuildError(\n `Bundling failed: ${cause instanceof Error ? cause.message : String(cause)}`,\n { cause },\n );\n }\n\n const hasEntry = result.output.some(\n (item) => item.type === \"chunk\" && item.isEntry,\n );\n if (!hasEntry) {\n throw new BuildError(\"Bundler produced no entry chunk.\");\n }\n\n return { output: result.output, cssByEntry };\n}\n\n/**\n * Finds the emitted file name of the entry chunk named `name`.\n *\n * @throws {BuildError} when no entry chunk matches.\n */\nexport function entryFileName(output: BundleOutput, name: string): string {\n const chunk = output.find(\n (item) => item.type === \"chunk\" && item.isEntry && item.name === name,\n );\n if (!chunk) {\n throw new BuildError(`No output chunk produced for entry \"${name}\".`);\n }\n return chunk.fileName;\n}\n\n/**\n * Adapts a Vantris {@link ChunkFileNames} (string or function over\n * {@link ChunkInfo}) into the bundler's option. When a function is given, the\n * bundler's pre-render data is mapped to Vantris's own info shape so user code\n * never sees a Rolldown type.\n */\nfunction toChunkNames(\n value: ChunkFileNames,\n): string | ((chunk: PreRenderedChunk) => string) {\n if (typeof value === \"string\") return value;\n return (chunk) =>\n value({\n name: chunk.name,\n isEntry: chunk.isEntry,\n isDynamicEntry: chunk.isDynamicEntry,\n facadeModuleId: chunk.facadeModuleId ?? null,\n moduleIds: chunk.moduleIds,\n exports: chunk.exports,\n });\n}\n\n/** Adapts a Vantris {@link AssetFileNames} into the bundler's option. */\nfunction toAssetNames(\n value: AssetFileNames,\n): string | ((asset: PreRenderedAsset) => string) {\n if (typeof value === \"string\") return value;\n return (asset) =>\n value({\n names: asset.names,\n originalFileNames: asset.originalFileNames,\n });\n}\n\n/**\n * Internal bundler plugin that turns asset imports (`import url from \"./x.svg\"`)\n * into **absolute** URLs prefixed with `base`, so they resolve from any page\n * regardless of where the importing chunk lives.\n *\n * The asset is emitted (and content-hashed) by the bundler; the import returns\n * a placeholder that is swapped for the final `${base}${fileName}` in\n * `renderChunk`, once the hashed name is known. This plugin is entirely\n * internal — it is never part of the public plugin surface.\n */\nfunction assetUrlPlugin(base: string): Plugin {\n const tokens = new Map<string, string>(); // placeholder → referenceId\n\n return {\n name: \"vantris:asset-urls\",\n async load(id) {\n const file = id.split(\"?\", 1)[0] ?? id;\n if (!ASSET_EXTENSION_SET.has(extname(file).toLowerCase())) return null;\n\n const referenceId = this.emitFile({\n type: \"asset\",\n name: basename(file),\n originalFileName: file,\n source: await readFile(file),\n });\n const token = `__VANTRIS_ASSET_${referenceId}__`;\n tokens.set(token, referenceId);\n return `export default ${JSON.stringify(token)};`;\n },\n renderChunk(code) {\n const magic = new MagicString(code);\n let changed = false;\n for (const [token, referenceId] of tokens) {\n const url = `${base}${this.getFileName(referenceId)}`;\n for (\n let index = code.indexOf(token);\n index !== -1;\n index = code.indexOf(token, index + token.length)\n ) {\n magic.update(index, index + token.length, url);\n changed = true;\n }\n }\n // A real source map keeps debugging accurate even when assets are present.\n return changed\n ? { code: magic.toString(), map: magic.generateMap({ hires: true }) }\n : null;\n },\n };\n}\n","import { resolve, sep } from \"node:path\";\nimport { basename } from \"node:path\";\nimport type { HtmlEntry } from \"../types/html.js\";\nimport type { ResolvedPaths } from \"../types/paths.js\";\nimport { BuildError } from \"../shared/errors.js\";\n\n/** A bundler entry derived from the HTML, plus how to rewrite the HTML. */\nexport interface HtmlBuildEntry {\n /** Unique bundler input name (drives the `[name]` in output file names). */\n name: string;\n /** Absolute path of the entry module fed to the bundler. */\n entryFile: string;\n /** The original `src` value to replace in the output HTML. */\n entrySrc: string;\n}\n\n/** A single output-HTML substitution. */\nexport interface HtmlReplacement {\n from: string;\n to: string;\n}\n\n/**\n * Resolves every `<script type=\"module\" src=\"...\">` in the HTML into a bundler\n * entry. Each `src` (e.g. `/src/main.ts`) is resolved against the project root,\n * and given a unique, stable name derived from its file name.\n *\n * @throws {BuildError} when the HTML has no module script.\n */\nexport function resolveHtmlEntries(\n entry: HtmlEntry,\n paths: ResolvedPaths,\n): HtmlBuildEntry[] {\n if (entry.scripts.length === 0) {\n throw new BuildError(\n `No <script type=\"module\" src=\"...\"> found in ${entry.file}.`,\n );\n }\n\n const used = new Set<string>();\n return entry.scripts.map((script) => {\n const entryFile = resolve(paths.root, script.src.replace(/^\\/+/, \"\"));\n const base = basename(script.src).replace(/\\.[^.]+$/, \"\") || \"entry\";\n\n let name = base;\n for (let i = 1; used.has(name); i++) name = `${base}${i}`;\n used.add(name);\n\n return { name, entryFile, entrySrc: script.src };\n });\n}\n\n/**\n * Produces the production HTML by applying every `src`/`href` substitution.\n *\n * This is the single place where output HTML is shaped, ready to grow toward\n * preload hints and plugin-emitted tags.\n */\nexport function renderProductionHtml(\n html: string,\n replacements: readonly HtmlReplacement[],\n): string {\n let out = html;\n for (const { from, to } of replacements) out = out.replaceAll(from, to);\n return out;\n}\n\n/** A URL referenced by `src`/`href` in the HTML. */\nconst HTML_URL_REF =\n /<(?:link|img|script|source|use)\\b[^>]*?\\b(?:href|src|xlink:href)\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)')/gi;\n\n/** Collects the distinct `src`/`href` URLs referenced in the HTML. */\nexport function collectAssetRefs(html: string): string[] {\n const urls = new Set<string>();\n for (const match of html.matchAll(HTML_URL_REF)) {\n const url = match[1] ?? match[2];\n if (url) urls.add(url);\n }\n return [...urls];\n}\n\n/**\n * Resolves an HTML URL to a source file **only** when it lives under `rootDir`.\n *\n * External (`http:`, `//`, `data:`), in-page (`#…`), and public/other URLs\n * return `null` and are left untouched — exactly the requested behaviour:\n * rewrite only what comes from the source tree.\n */\nexport function resolveSourceRef(\n url: string,\n paths: ResolvedPaths,\n): string | null {\n if (/^(?:[a-z]+:)?\\/\\//i.test(url) || /^(?:data:|#|mailto:)/i.test(url)) {\n return null;\n }\n const file = resolve(paths.root, url.replace(/^\\/+/, \"\"));\n const withinRoot =\n file === paths.rootDir || file.startsWith(paths.rootDir + sep);\n return withinRoot ? file : null;\n}\n\n/** Injects `<link rel=\"stylesheet\">` tags into the document head. */\nexport function injectStylesheets(html: string, hrefs: readonly string[]): string {\n if (hrefs.length === 0) return html;\n const links = hrefs\n .map((href) => `<link rel=\"stylesheet\" href=\"${href}\">`)\n .join(\"\\n\");\n if (html.includes(\"</head>\")) {\n return html.replace(\"</head>\", `${links}\\n</head>`);\n }\n const bodyOpen = /<body[^>]*>/.exec(html);\n if (bodyOpen) {\n return html.replace(bodyOpen[0], `${bodyOpen[0]}\\n${links}`);\n }\n return `${links}\\n${html}`;\n}\n","import { mkdir, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { HTML_ENTRY_FILENAME } from \"../shared/constants.js\";\n\n/**\n * Removes the output directory and recreates it empty.\n *\n * Bundler chunks are written by Rolldown; this guarantees a clean slate so\n * stale files from a previous build never linger.\n */\nexport async function cleanOutDir(outDir: string): Promise<void> {\n await rm(outDir, { recursive: true, force: true });\n await mkdir(outDir, { recursive: true });\n}\n\n/**\n * Writes the production `index.html` into the output directory.\n *\n * @returns The absolute path of the written file.\n */\nexport async function writeHtml(outDir: string, html: string): Promise<string> {\n const file = join(outDir, HTML_ENTRY_FILENAME);\n await writeFile(file, html, \"utf8\");\n return file;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { basename, join, relative, sep } from \"node:path\";\nimport type { Context } from \"../types/context.js\";\nimport type { HtmlEntry } from \"../types/html.js\";\nimport { HTML_ENTRY_FILENAME } from \"../shared/constants.js\";\nimport { BuildError, HtmlEntryError } from \"../shared/errors.js\";\nimport { isFile } from \"../utils/fs.js\";\nimport { bundle, entryFileName } from \"./bundle.js\";\nimport {\n collectAssetRefs,\n injectStylesheets,\n resolveHtmlEntries,\n resolveSourceRef,\n renderProductionHtml,\n type HtmlReplacement,\n} from \"./html.js\";\nimport { copyPublicDir, emitHashedAsset } from \"./assets.js\";\nimport { isStyle, loadPostcss, processStyle } from \"./css.js\";\nimport { cleanOutDir, writeHtml } from \"./output.js\";\n\n/** Options handed to the build pipeline. */\nexport interface BuildOptions {\n ctx: Context;\n /** The detected HTML entry; required for a build. */\n entry: HtmlEntry | null;\n}\n\n/** Summary of a completed build. */\nexport interface BuildResult {\n /** Absolute output directory. */\n outDir: string;\n /** Entry points: original HTML `src` → emitted file name. */\n entries: ReadonlyArray<{ src: string; fileName: string }>;\n /** Total build duration in milliseconds. */\n durationMs: number;\n /** Number of files emitted by the bundler (chunks + assets), plus HTML. */\n fileCount: number;\n}\n\n/**\n * Produces an optimised production build into `outDir`.\n *\n * The pipeline is split across the `build` module by responsibility — entry\n * resolution + HTML ({@link resolveHtmlEntry}/{@link renderProductionHtml}),\n * bundling ({@link bundle}), assets ({@link copyPublicDir}), and filesystem\n * output ({@link cleanOutDir}/{@link writeHtml}). This file only orchestrates\n * and logs, which keeps each stage independently testable and leaves room for\n * future build hooks/plugins to slot between stages.\n *\n * @throws {HtmlEntryError | BuildError} with an explicit message on failure.\n */\nexport async function runBuild(options: BuildOptions): Promise<BuildResult> {\n const { ctx, entry } = options;\n const { paths, build } = ctx.config;\n const log = ctx.logger;\n const started = Date.now();\n const rel = (p: string) => relative(paths.root, p) || \".\";\n\n log.info(\"building for production…\");\n\n if (!entry) {\n throw new HtmlEntryError(\n `No index.html found at ${paths.root}; nothing to build.`,\n );\n }\n\n // Resolve every module entry from the HTML before touching the filesystem.\n const htmlEntries = resolveHtmlEntries(entry, paths);\n for (const { entryFile, entrySrc } of htmlEntries) {\n if (!(await isFile(entryFile))) {\n throw new BuildError(\n `Entry module \"${entrySrc}\" resolves to a missing file: ${entryFile}`,\n );\n }\n }\n\n // Refuse to wipe anything that would destroy the project.\n assertSafeOutDir(paths.outDir, paths.root, paths.rootDir, paths.publicDir);\n\n log.info(`cleaning ${rel(paths.outDir)}${sep}`);\n await cleanOutDir(paths.outDir);\n\n const inputs = Object.fromEntries(\n htmlEntries.map((e) => [e.name, e.entryFile]),\n );\n const postcss = await loadPostcss(paths.root);\n log.info(\n `bundling ${htmlEntries.length} entr${htmlEntries.length === 1 ? \"y\" : \"ies\"} with Rolldown…`,\n );\n const { output, cssByEntry } = await bundle({\n entries: inputs,\n config: ctx.config,\n postcss,\n });\n log.info(\n `bundled ${output.length} file(s)` +\n (build.minify ? \" (minified)\" : \"\") +\n (build.sourcemap ? \" + sourcemaps\" : \"\"),\n );\n\n // Copy public assets first, then write the generated HTML last so it always\n // wins over a `public/index.html` (which would otherwise shadow the entry).\n if (await copyPublicDir(paths.publicDir, paths.outDir)) {\n log.info(`copied ${rel(paths.publicDir)}${sep} → ${rel(paths.outDir)}${sep}`);\n if (await isFile(join(paths.publicDir, HTML_ENTRY_FILENAME))) {\n log.warn(\n `public/${HTML_ENTRY_FILENAME} is ignored — the generated entry HTML takes precedence.`,\n );\n }\n }\n\n const base = ctx.config.base;\n const url = (fileName: string) => `${base}${fileName}`;\n const replacements: HtmlReplacement[] = [];\n const entrySrcs = new Set(htmlEntries.map((e) => e.entrySrc));\n\n // 1. Entry scripts → hashed JS.\n const entries = htmlEntries.map((e) => {\n const fileName = entryFileName(output, e.name);\n replacements.push({ from: e.entrySrc, to: url(fileName) });\n return { src: e.entrySrc, fileName };\n });\n\n // 2. CSS imported from JS → already emitted per entry by the bundler.\n const stylesheets: string[] = [];\n for (const e of htmlEntries) {\n const cssFile = cssByEntry.get(e.name);\n if (cssFile) stylesheets.push(url(cssFile));\n }\n\n // 3. HTML `src`/`href` that point into `rootDir` → hashed + rewritten.\n // Stylesheets go through the full CSS pipeline; public and external\n // references are left untouched.\n const styleOptions = {\n paths,\n outDir: paths.outDir,\n assetsDir: build.assetsDir,\n base,\n minify: build.minify,\n postcss,\n };\n let assetCount = 0;\n for (const ref of collectAssetRefs(entry.html)) {\n if (entrySrcs.has(ref)) continue;\n const file = resolveSourceRef(ref, paths);\n if (!file || !(await isFile(file))) continue;\n\n let fileName: string;\n if (isStyle(file)) {\n const { css } = await processStyle(file, styleOptions);\n const name = basename(file).replace(/\\.(scss|sass|less|styl|stylus)$/i, \".css\");\n fileName = await emitHashedAsset(paths.outDir, build.assetsDir, name, css);\n } else {\n fileName = await emitHashedAsset(\n paths.outDir,\n build.assetsDir,\n basename(file),\n await readFile(file),\n );\n }\n replacements.push({ from: ref, to: url(fileName) });\n assetCount += 1;\n }\n\n let html = renderProductionHtml(entry.html, replacements);\n html = injectStylesheets(html, stylesheets);\n await writeHtml(paths.outDir, html);\n\n if (stylesheets.length > 0) log.info(`css: ${stylesheets.length} stylesheet(s)`);\n if (assetCount > 0) log.info(`html assets: ${assetCount} rewritten from rootDir`);\n\n const durationMs = Date.now() - started;\n const fileCount = output.length + 1 + stylesheets.length + assetCount;\n log.info(`build complete in ${durationMs}ms — ${fileCount} files in ${rel(paths.outDir)}${sep}`);\n\n return { outDir: paths.outDir, entries, durationMs, fileCount };\n}\n\n/** Guards against an `outDir` that overlaps the project's source/root. */\nfunction assertSafeOutDir(\n outDir: string,\n root: string,\n rootDir: string,\n publicDir: string,\n): void {\n const clashes = outDir === root || outDir === rootDir || outDir === publicDir;\n const isAncestorOfRoot = root === outDir || root.startsWith(outDir + sep);\n if (clashes || isAncestorOfRoot) {\n throw new BuildError(\n `Refusing to clean outDir \"${outDir}\": it overlaps the project root or source directories.`,\n );\n }\n}\n","import type { Logger } from \"../types/logger.js\";\nimport { APP_NAME } from \"./constants.js\";\n\nexport interface LoggerOptions {\n /** When `false`, `debug` calls are dropped. @default false */\n verbose?: boolean;\n /** Sink for output. Defaults to the console; overridable for tests. */\n sink?: Pick<Console, \"log\" | \"warn\" | \"error\">;\n}\n\nconst prefix = `[${APP_NAME}]`;\n\n/**\n * Creates the default console-backed {@link Logger}.\n *\n * The sink is injectable so tests can capture output, and verbosity is a\n * construction-time concern rather than a global flag.\n */\nexport function createLogger(options: LoggerOptions = {}): Logger {\n const { verbose = false, sink = console } = options;\n\n return {\n info(message) {\n sink.log(`${prefix} ${message}`);\n },\n warn(message) {\n sink.warn(`${prefix} ${message}`);\n },\n error(message) {\n sink.error(`${prefix} ${message}`);\n },\n debug(message) {\n if (verbose) sink.log(`${prefix} ${message}`);\n },\n };\n}\n","import type { Context } from \"../types/context.js\";\nimport type { Logger } from \"../types/logger.js\";\nimport { loadConfig } from \"../config/load.js\";\nimport { resolveConfig } from \"../config/resolve.js\";\n\nexport interface CreateContextOptions {\n /** Working directory the command was invoked from. */\n cwd: string;\n /** Injected logger. */\n logger: Logger;\n /** Optional explicit config file path. */\n configFile?: string;\n}\n\n/**\n * Builds the {@link Context} shared by every command: it loads the user config,\n * applies defaults, resolves paths, and bundles the injected services.\n *\n * Centralising construction here means commands never reach for global state —\n * everything they need arrives through the returned context.\n */\nexport async function createContext(\n options: CreateContextOptions,\n): Promise<Context> {\n const { cwd, logger } = options;\n\n const loaded = await loadConfig({\n cwd,\n logger,\n ...(options.configFile !== undefined\n ? { configFile: options.configFile }\n : {}),\n });\n\n const config = resolveConfig(loaded.config, cwd, loaded.file);\n\n return { cwd, config, logger };\n}\n","import { watch, type FSWatcher } from \"chokidar\";\nimport type { Logger } from \"../types/logger.js\";\n\n/** A change reported by the {@link Watcher}. */\nexport interface WatchEvent {\n /** What happened to the file. */\n kind: \"add\" | \"change\" | \"unlink\";\n /** Absolute path of the affected file. */\n file: string;\n}\n\nexport interface WatcherOptions {\n /** Directory tree to watch (typically `rootDir`). */\n dir: string;\n logger: Logger;\n /** Called on every relevant filesystem change. */\n onChange: (event: WatchEvent) => void;\n}\n\n/** A running filesystem watcher. */\nexport interface Watcher {\n /** Stops watching and releases OS resources. */\n close(): Promise<void>;\n}\n\n/**\n * Watches a directory tree and reports file changes.\n *\n * This is the single home for filesystem watching — the dev server depends on\n * the {@link Watcher} interface, not on chokidar, so the backing implementation\n * can change (or gain HMR-oriented metadata) without rippling outward.\n */\nexport function createWatcher(options: WatcherOptions): Watcher {\n const { dir, logger, onChange } = options;\n\n const watcher: FSWatcher = watch(dir, {\n ignoreInitial: true,\n persistent: true,\n ignored: (path) =>\n path.includes(\"node_modules\") || /(^|[/\\\\])\\.[^/\\\\]/.test(path),\n });\n\n const emit = (kind: WatchEvent[\"kind\"]) => (file: string) => {\n logger.debug(`watch ${kind}: ${file}`);\n onChange({ kind, file });\n };\n\n watcher\n .on(\"add\", emit(\"add\"))\n .on(\"change\", emit(\"change\"))\n .on(\"unlink\", emit(\"unlink\"))\n .on(\"error\", (error) =>\n logger.error(`watcher error: ${(error as Error).message}`),\n );\n\n return {\n close: () => watcher.close(),\n };\n}\n","import { relative } from \"node:path\";\nimport type { Context } from \"../types/context.js\";\nimport type { HtmlEntry } from \"../types/html.js\";\nimport { detectHtmlEntry } from \"../html/index.js\";\nimport { ensureDir } from \"../utils/fs.js\";\n\n/** Renders a path relative to the project root for tidy log output. */\nfunction rel(ctx: Context, target: string): string {\n return relative(ctx.config.paths.root, target) || \".\";\n}\n\n/**\n * Logs the resolved configuration and detects the HTML entry — the shared\n * preamble every command runs before delegating to its (future) engine.\n *\n * @returns The detected HTML entry, or `null` when none exists.\n */\nexport async function inspectProject(ctx: Context): Promise<HtmlEntry | null> {\n const { paths, configFile } = ctx.config;\n\n ctx.logger.info(\n `config: ${configFile ? rel(ctx, configFile) : \"defaults (no config file)\"}`,\n );\n ctx.logger.info(`rootDir: ${rel(ctx, paths.rootDir)}`);\n ctx.logger.info(`publicDir: ${rel(ctx, paths.publicDir)}`);\n ctx.logger.info(`outDir: ${rel(ctx, paths.outDir)}`);\n\n const entry = await detectHtmlEntry(paths.root);\n if (entry) {\n ctx.logger.info(`html entry: ${rel(ctx, entry.file)}`);\n } else {\n ctx.logger.warn(\n \"no index.html found at the project root; nothing to serve yet.\",\n );\n }\n\n return entry;\n}\n\n/** Ensures the given directories exist, creating them as needed. */\nexport async function prepareDirectories(\n ctx: Context,\n dirs: readonly string[],\n): Promise<void> {\n for (const dir of dirs) {\n await ensureDir(dir);\n ctx.logger.debug(`prepared directory: ${dir}`);\n }\n}\n","import { relative } from \"node:path\";\nimport type { Command } from \"../types/command.js\";\nimport { startDevServer } from \"../server/index.js\";\nimport { createWatcher } from \"../shared/watcher.js\";\nimport { inspectProject, prepareDirectories } from \"./support.js\";\n\n/** Coalesce a burst of filesystem events into a single reload. */\nconst RELOAD_DEBOUNCE_MS = 50;\n\n/**\n * `vantris dev` — start the development server.\n *\n * Runtime flow: load config (via context) → inspect project → init dev server\n * (HTTP + WebSocket) → start the file watcher → trigger live reload on change.\n * Runs until interrupted (Ctrl-C), then shuts everything down cleanly.\n */\nexport const dev: Command = {\n name: \"dev\",\n description: \"Start the development server\",\n async run(ctx) {\n const { root, rootDir, publicDir } = ctx.config.paths;\n await prepareDirectories(ctx, [rootDir, publicDir]);\n\n const entry = await inspectProject(ctx);\n\n const server = await startDevServer({ ctx, entry });\n ctx.logger.info(`ready — dev server running at ${server.url}`);\n\n let timer: NodeJS.Timeout | undefined;\n const watcher = createWatcher({\n dir: rootDir,\n logger: ctx.logger,\n onChange: ({ kind, file }) => {\n ctx.logger.info(`${kind}: ${relative(root, file)} — reloading`);\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => server.broadcastReload(), RELOAD_DEBOUNCE_MS);\n },\n });\n\n await waitForShutdown();\n\n ctx.logger.info(\"shutting down…\");\n if (timer) clearTimeout(timer);\n await watcher.close();\n await server.close();\n },\n};\n\n/** Resolves when the process receives an interrupt/terminate signal. */\nfunction waitForShutdown(): Promise<void> {\n return new Promise((resolve) => {\n const onSignal = () => {\n process.removeListener(\"SIGINT\", onSignal);\n process.removeListener(\"SIGTERM\", onSignal);\n resolve();\n };\n process.once(\"SIGINT\", onSignal);\n process.once(\"SIGTERM\", onSignal);\n });\n}\n","import type { Command } from \"../types/command.js\";\nimport { runBuild } from \"../build/index.js\";\nimport { inspectProject } from \"./support.js\";\n\n/** `vantris build` — produce an optimised production build into `outDir`. */\nexport const build: Command = {\n name: \"build\",\n description: \"Build the project for production\",\n async run(ctx) {\n const entry = await inspectProject(ctx);\n await runBuild({ ctx, entry });\n },\n};\n","import type { Context } from \"../types/context.js\";\n\n/** Options handed to the preview server. */\nexport interface PreviewOptions {\n ctx: Context;\n}\n\n/**\n * Serves a previously produced production build from `outDir`.\n *\n * Reserved for a future version (planned: a static server over the build\n * output). The seam exists now so `commands/preview` can already delegate\n * here; only this file changes when the engine is implemented.\n */\nexport async function runPreview(options: PreviewOptions): Promise<void> {\n const { ctx } = options;\n ctx.logger.info(\n \"preview is not implemented in v0.1.0 (planned: static server over outDir).\",\n );\n}\n","import type { Command } from \"../types/command.js\";\nimport { runPreview } from \"../preview/index.js\";\nimport { inspectProject, prepareDirectories } from \"./support.js\";\n\n/** `vantris preview` — serve a production build locally. */\nexport const preview: Command = {\n name: \"preview\",\n description: \"Locally preview a production build\",\n async run(ctx) {\n await prepareDirectories(ctx, [ctx.config.paths.outDir]);\n\n await inspectProject(ctx);\n await runPreview({ ctx });\n },\n};\n","import type { Command } from \"../types/command.js\";\nimport { dev } from \"./dev.js\";\nimport { build } from \"./build.js\";\nimport { preview } from \"./preview.js\";\n\n/**\n * The command registry. The CLI routes purely against this map, so adding a\n * command is a one-line registration here plus its module — no CLI changes.\n */\nexport const commands: Readonly<Record<string, Command>> = {\n [dev.name]: dev,\n [build.name]: build,\n [preview.name]: preview,\n};\n\nexport type CommandName = keyof typeof commands;\n\nexport { dev, build, preview };\n","import { commands } from \"../commands/index.js\";\nimport { APP_NAME, VERSION } from \"../shared/constants.js\";\n\n/** Builds the help text listing every registered command. */\nexport function helpText(): string {\n const lines = [\n `${APP_NAME} v${VERSION} — a modern bundler for JavaScript/TypeScript`,\n \"\",\n \"Usage:\",\n ` ${APP_NAME} <command> [options]`,\n \"\",\n \"Commands:\",\n ];\n\n const width = Math.max(...Object.keys(commands).map((n) => n.length));\n for (const command of Object.values(commands)) {\n lines.push(` ${command.name.padEnd(width)} ${command.description}`);\n }\n\n lines.push(\n \"\",\n \"Options:\",\n \" -h, --help Show this help\",\n \" -v, --version Show the version number\",\n );\n\n return lines.join(\"\\n\");\n}\n\n/** Builds the version line. */\nexport function versionText(): string {\n return `${APP_NAME} v${VERSION}`;\n}\n","import type { Logger } from \"../types/logger.js\";\nimport { commands } from \"../commands/index.js\";\nimport { createContext } from \"../shared/context.js\";\nimport { createLogger } from \"../shared/logger.js\";\nimport { helpText, versionText } from \"./help.js\";\n\nexport interface RunOptions {\n /** Working directory; defaults to `process.cwd()`. */\n cwd?: string;\n /** Logger override, primarily for tests. */\n logger?: Logger;\n}\n\n/** Process exit codes used by the CLI. */\nexport const enum ExitCode {\n Ok = 0,\n Error = 1,\n}\n\n/**\n * Parses arguments and routes to a command. This is the entire CLI surface:\n * it owns argument handling and dispatch only — never command behaviour, which\n * lives behind the {@link commands} registry.\n *\n * @returns A process exit code.\n */\nexport async function run(\n argv: readonly string[],\n options: RunOptions = {},\n): Promise<ExitCode> {\n const verbose = argv.includes(\"--verbose\") || argv.includes(\"--debug\");\n const logger = options.logger ?? createLogger({ verbose });\n const cwd = options.cwd ?? process.cwd();\n\n const [first, ...rest] = argv.filter((arg) => !isGlobalFlag(arg));\n\n if (!first || first === \"--help\" || first === \"-h\" || first === \"help\") {\n logger.info(helpText());\n return ExitCode.Ok;\n }\n\n if (first === \"--version\" || first === \"-v\") {\n logger.info(versionText());\n return ExitCode.Ok;\n }\n\n const command = commands[first];\n if (!command) {\n logger.error(`Unknown command: \"${first}\"`);\n logger.info(helpText());\n return ExitCode.Error;\n }\n\n const ctx = await createContext({ cwd, logger });\n await command.run(ctx, rest);\n return ExitCode.Ok;\n}\n\n/** Flags handled by the runner itself rather than passed to commands. */\nfunction isGlobalFlag(arg: string): boolean {\n return arg === \"--verbose\" || arg === \"--debug\";\n}\n"]}
package/dist/cli/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { run, createLogger, isVantrisError } from '../chunk-PSXNP5S5.js';
2
+ import { run, createLogger, isVantrisError } from '../chunk-LRSN7SF4.js';
3
3
 
4
4
  // src/cli/index.ts
5
5
  async function main() {