@mongez/pkgist 1.0.1 → 1.0.3
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.
- package/README.md +25 -13
- package/dist/cli.js +18 -1
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +1 -10
- package/dist/index.js +18 -1
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
- package/src/config/load-config.ts +28 -10
package/README.md
CHANGED
|
@@ -13,33 +13,45 @@ A build, version, and publish tool for TypeScript/React npm packages. Powered by
|
|
|
13
13
|
- **npm publish** — publishes from the build directory, not the source
|
|
14
14
|
- **Dry-run mode** — prints every step without touching disk, git, or npm
|
|
15
15
|
- **Concurrency** — builds multiple packages in parallel
|
|
16
|
-
- **TypeScript config** — `
|
|
16
|
+
- **TypeScript config** — `pkgist.config.ts` with full type safety via `defineConfig`
|
|
17
17
|
|
|
18
18
|
---
|
|
19
19
|
|
|
20
20
|
## Installation
|
|
21
21
|
|
|
22
22
|
```sh
|
|
23
|
-
|
|
24
|
-
npm install
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
# Global — use the CLI anywhere
|
|
24
|
+
npm install -g @mongez/pkgist
|
|
25
|
+
|
|
26
|
+
# Or as a dev dependency in your monorepo root
|
|
27
|
+
npm install -D @mongez/pkgist
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Add a script to your root `package.json` for convenience:
|
|
31
|
+
|
|
32
|
+
```json
|
|
33
|
+
{
|
|
34
|
+
"scripts": {
|
|
35
|
+
"release": "pkgist build:all",
|
|
36
|
+
"release:dry": "pkgist build:all --dry-run"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
27
39
|
```
|
|
28
40
|
|
|
29
41
|
---
|
|
30
42
|
|
|
31
43
|
## Configuration
|
|
32
44
|
|
|
33
|
-
Create a `
|
|
45
|
+
Create a `pkgist.config.ts` in your project root (auto-discovered; `builder.ts` also works):
|
|
34
46
|
|
|
35
47
|
```ts
|
|
36
48
|
import { defineConfig } from "@mongez/pkgist";
|
|
37
49
|
|
|
38
50
|
export default defineConfig({
|
|
39
51
|
settings: {
|
|
40
|
-
concurrency: 8,
|
|
41
|
-
buildDir: "../builds",
|
|
42
|
-
sourcesDir: "../sources", // where source snapshots are archived
|
|
52
|
+
concurrency: 8, // parallel build limit (default: 4)
|
|
53
|
+
buildDir: "../builds", // where compiled packages are written
|
|
54
|
+
sourcesDir: "../sources", // optional: where source snapshots are archived
|
|
43
55
|
},
|
|
44
56
|
|
|
45
57
|
// Standalone: each package versions independently
|
|
@@ -75,7 +87,7 @@ Every entry in `standalone[]` and `families[].packages[]` accepts:
|
|
|
75
87
|
| Option | Type | Default | Description |
|
|
76
88
|
|---|---|---|---|
|
|
77
89
|
| `name` | `string` | **required** | npm package name |
|
|
78
|
-
| `root` | `string` | **required** | Path to package root, relative to `
|
|
90
|
+
| `root` | `string` | **required** | Path to package root, relative to `pkgist.config.ts` |
|
|
79
91
|
| `type` | `"typescript" \| "react"` | `"typescript"` | React packages get JSX support |
|
|
80
92
|
| `formats` | `("esm" \| "cjs")[]` | `["esm", "cjs"]` | Output formats |
|
|
81
93
|
| `mainType` | `"cjs" \| "esm"` | `"cjs"` | Primary format (affects `main` field in package.json) |
|
|
@@ -95,13 +107,13 @@ Every entry in `standalone[]` and `families[].packages[]` accepts:
|
|
|
95
107
|
|
|
96
108
|
| Option | Type | Default | Description |
|
|
97
109
|
|---|---|---|---|
|
|
98
|
-
| `version` | `"auto" \| string` | `"auto"` | `"auto"`
|
|
110
|
+
| `version` | `"auto" \| "patch" \| "minor" \| "major" \| string` | `"auto"` | `"auto"`/`"patch"` bumps the patch digit; `"minor"` bumps minor; `"major"` bumps major; any semver string uses that version exactly |
|
|
99
111
|
|
|
100
112
|
### Family-level options
|
|
101
113
|
|
|
102
114
|
| Option | Type | Default | Description |
|
|
103
115
|
|---|---|---|---|
|
|
104
|
-
| `version` | `"auto" \| string` | `"auto"` |
|
|
116
|
+
| `version` | `"auto" \| "patch" \| "minor" \| "major" \| string` | `"auto"` | Same strategies as standalone; applied to the highest current version across all family members |
|
|
105
117
|
| `commit` | `string` | — | Commit message applied to all packages (overrides per-package) |
|
|
106
118
|
|
|
107
119
|
---
|
|
@@ -200,7 +212,7 @@ Available on all `build` commands:
|
|
|
200
212
|
| `--no-publish` | Skip `npm publish` |
|
|
201
213
|
| `--no-git` | Skip git add / commit / push / tag |
|
|
202
214
|
| `--concurrency <n>` | Override the parallel build limit |
|
|
203
|
-
| `--config <path>` | Path to config file (default: `builder.ts` in cwd) |
|
|
215
|
+
| `--config <path>` | Path to config file (default: auto-discovers `pkgist.config.ts` / `builder.ts` in cwd) |
|
|
204
216
|
| `--verbose` | Show debug-level log lines |
|
|
205
217
|
|
|
206
218
|
---
|
package/dist/cli.js
CHANGED
|
@@ -57,6 +57,20 @@ function wrapError(step, packageName, error) {
|
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
// src/config/load-config.ts
|
|
60
|
+
async function ensureTsxRegistered() {
|
|
61
|
+
try {
|
|
62
|
+
const { register } = await import("module");
|
|
63
|
+
let tsxUrl = null;
|
|
64
|
+
try {
|
|
65
|
+
tsxUrl = import.meta.resolve("tsx/esm");
|
|
66
|
+
} catch {
|
|
67
|
+
}
|
|
68
|
+
if (register && tsxUrl) {
|
|
69
|
+
register(tsxUrl, import.meta.url);
|
|
70
|
+
}
|
|
71
|
+
} catch {
|
|
72
|
+
}
|
|
73
|
+
}
|
|
60
74
|
async function loadConfig(configFilePath) {
|
|
61
75
|
const absolute = resolvePath(configFilePath);
|
|
62
76
|
if (!fs.existsSync(absolute)) {
|
|
@@ -64,6 +78,9 @@ async function loadConfig(configFilePath) {
|
|
|
64
78
|
}
|
|
65
79
|
let mod;
|
|
66
80
|
try {
|
|
81
|
+
if (absolute.endsWith(".ts")) {
|
|
82
|
+
await ensureTsxRegistered();
|
|
83
|
+
}
|
|
67
84
|
const fileUrl = pathToFileURL(absolute).href;
|
|
68
85
|
mod = await import(fileUrl);
|
|
69
86
|
} catch (err) {
|
|
@@ -107,7 +124,7 @@ function validateConfig(config, filePath) {
|
|
|
107
124
|
}
|
|
108
125
|
}
|
|
109
126
|
function findDefaultConfigPath(cwd) {
|
|
110
|
-
const candidates = ["builder.ts", "builder.js", "mongez.ts", "mongez.js"];
|
|
127
|
+
const candidates = ["pkgist.config.ts", "pkgist.config.js", "builder.ts", "builder.js", "mongez.ts", "mongez.js"];
|
|
111
128
|
for (const candidate of candidates) {
|
|
112
129
|
const full = path2.join(cwd, candidate);
|
|
113
130
|
if (fs.existsSync(full)) return full;
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/config/load-config.ts","../src/utils/paths.ts","../src/utils/errors.ts","../src/files/file-manager.ts","../src/files/package-json.ts","../src/files/clone-files.ts","../src/utils/logger.ts","../src/compile/tsdown-compiler.ts","../src/version/increment.ts","../src/git/operations.ts","../src/utils/exec.ts","../src/publish/npm-publisher.ts","../src/build/package-builder.ts","../src/build/parallel-builder.ts","../src/commands/build.ts","../src/build/family-builder.ts","../src/commands/build-family.ts","../src/commands/build-all.ts","../src/commands/list.ts","../src/commands/validate.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from \"commander\";\nimport { readFileSync } from \"fs\";\nimport { fileURLToPath } from \"url\";\nimport path from \"path\";\nimport {\n registerBuildCommand,\n registerBuildFamilyCommand,\n registerBuildAllCommand,\n registerListCommand,\n registerValidateCommand,\n} from \"./commands/index.js\";\nimport { setVerbose } from \"./utils/logger.js\";\n\n// Resolve package.json version without importing it (works with ESM)\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nlet cliVersion = \"1.0.0\";\ntry {\n const pkgPath = path.resolve(__dirname, \"../package.json\");\n const raw = readFileSync(pkgPath, \"utf-8\");\n const pkg = JSON.parse(raw) as { version?: string };\n cliVersion = pkg.version ?? \"1.0.0\";\n} catch {\n // fallback to hardcoded version\n}\n\nconst program = new Command();\n\nprogram\n .name(\"pkgist\")\n .description(\"Build, version, and publish TypeScript npm packages using tsdown.\")\n .version(cliVersion)\n .option(\"--verbose\", \"Enable verbose debug logging\", false)\n .hook(\"preAction\", (thisCommand) => {\n const opts = thisCommand.opts() as { verbose?: boolean };\n if (opts.verbose) {\n setVerbose(true);\n }\n });\n\n// Register all subcommands\nregisterBuildCommand(program);\nregisterBuildFamilyCommand(program);\nregisterBuildAllCommand(program);\nregisterListCommand(program);\nregisterValidateCommand(program);\n\nprogram.parseAsync(process.argv).catch((err: unknown) => {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n});\n","import path from \"path\";\nimport { createRequire } from \"module\";\nimport { pathToFileURL } from \"url\";\nimport fs from \"fs\";\nimport type { BundlerConfig } from \"../types/index.js\";\nimport { resolvePath } from \"../utils/paths.js\";\nimport { wrapError } from \"../utils/errors.js\";\n\nexport interface LoadedConfig {\n config: BundlerConfig;\n /** Absolute, forward-slash normalised path to the config file */\n configPath: string;\n /** Directory containing the config file — used to resolve relative roots */\n configDir: string;\n}\n\n/**\n * Load and validate a builder config file.\n *\n * The file must be a TypeScript or JavaScript module with a default export\n * produced by `defineConfig(...)`.\n *\n * When the file is TypeScript (`.ts`), we use `tsx` via Node's `--import` flag\n * (which is already set up when the CLI is invoked via the compiled entry), or\n * we fall back to requiring `tsx/esm` at runtime if available.\n */\nexport async function loadConfig(configFilePath: string): Promise<LoadedConfig> {\n const absolute = resolvePath(configFilePath);\n\n if (!fs.existsSync(absolute)) {\n throw new Error(`Config file not found: ${absolute}`);\n }\n\n let mod: { default?: BundlerConfig };\n\n try {\n // Convert to a file:// URL so dynamic import works correctly on Windows.\n const fileUrl = pathToFileURL(absolute).href;\n mod = await import(fileUrl);\n } catch (err) {\n throw wrapError(\"load-config\", absolute, err);\n }\n\n const config = mod.default;\n\n if (!config || typeof config !== \"object\") {\n throw new Error(\n `Config file ${absolute} must export a default object from defineConfig(). Got: ${typeof config}`,\n );\n }\n\n validateConfig(config, absolute);\n\n return {\n config,\n configPath: absolute,\n configDir: resolvePath(path.dirname(absolute)),\n };\n}\n\nfunction validateConfig(config: BundlerConfig, filePath: string): void {\n if (!config.settings) {\n throw new Error(`Config \"${filePath}\" must have a \"settings\" object.`);\n }\n if (!config.settings.buildDir) {\n throw new Error(`Config \"${filePath}\" settings.buildDir is required.`);\n }\n\n const names = new Set<string>();\n\n for (const pkg of config.standalone ?? []) {\n if (!pkg.name) throw new Error(`Standalone package is missing \"name\" in ${filePath}`);\n if (!pkg.root) throw new Error(`Standalone package \"${pkg.name}\" is missing \"root\"`);\n if (names.has(pkg.name)) throw new Error(`Duplicate package name: \"${pkg.name}\"`);\n names.add(pkg.name);\n }\n\n for (const family of config.families ?? []) {\n if (!family.name) throw new Error(`A family is missing \"name\" in ${filePath}`);\n for (const pkg of family.packages) {\n if (!pkg.name) throw new Error(`Package inside family \"${family.name}\" is missing \"name\"`);\n if (!pkg.root) throw new Error(`Package \"${pkg.name}\" in family \"${family.name}\" is missing \"root\"`);\n if (names.has(pkg.name)) throw new Error(`Duplicate package name: \"${pkg.name}\"`);\n names.add(pkg.name);\n }\n }\n}\n\n/**\n * Attempt to find the default config file in the working directory.\n * Tries: builder.ts, builder.js, mongez.ts, mongez.js\n */\nexport function findDefaultConfigPath(cwd: string): string {\n const candidates = [\"builder.ts\", \"builder.js\", \"mongez.ts\", \"mongez.js\"];\n for (const candidate of candidates) {\n const full = path.join(cwd, candidate);\n if (fs.existsSync(full)) return full;\n }\n throw new Error(\n `No config file found in ${cwd}. Tried: ${candidates.join(\", \")}. ` +\n `Use --config <path> to specify a custom location.`,\n );\n}\n","import path from \"path\";\n\n/** Normalise any path to forward-slash form (Windows-safe). */\nexport function toForwardSlash(p: string): string {\n return p.replace(/\\\\/g, \"/\");\n}\n\n/** Join path segments and normalise the result to forward slashes. */\nexport function joinPath(...segments: string[]): string {\n return toForwardSlash(path.join(...segments));\n}\n\n/** Resolve an absolute path from segments and normalise to forward slashes. */\nexport function resolvePath(...segments: string[]): string {\n return toForwardSlash(path.resolve(...segments));\n}\n\n/**\n * Given a package name like \"@mongez/reinforcements\",\n * return just the scoped part without the scope prefix: \"reinforcements\".\n */\nexport function scopelessName(packageName: string): string {\n const slash = packageName.indexOf(\"/\");\n return slash === -1 ? packageName : packageName.slice(slash + 1);\n}\n\n/**\n * Build the versioned build output path:\n * <buildDir>/<scopeless-name>/<version>/\n */\nexport function buildOutputPath(\n buildDir: string,\n packageName: string,\n version: string,\n): string {\n return joinPath(buildDir, scopelessName(packageName), version);\n}\n\n/**\n * Build the sources snapshot path:\n * <sourcesDir>/<scopeless-name>/\n */\nexport function sourceSnapshotPath(\n sourcesDir: string,\n packageName: string,\n): string {\n return joinPath(sourcesDir, scopelessName(packageName));\n}\n","/** Base error class for all bundler errors. Carries a step name for structured logging. */\nexport class BundlerError extends Error {\n constructor(\n public readonly step: string,\n public readonly packageName: string,\n message: string,\n public readonly cause?: unknown,\n ) {\n super(message);\n this.name = \"BundlerError\";\n if (cause instanceof Error && cause.stack) {\n this.stack = `${this.stack}\\nCaused by: ${cause.stack}`;\n }\n }\n}\n\n/** Wrap any thrown value into a BundlerError with context. */\nexport function wrapError(\n step: string,\n packageName: string,\n error: unknown,\n): BundlerError {\n if (error instanceof BundlerError) return error;\n const msg =\n error instanceof Error\n ? error.message\n : typeof error === \"string\"\n ? error\n : JSON.stringify(error);\n return new BundlerError(step, packageName, `[${step}] ${packageName}: ${msg}`, error);\n}\n\n/** Throw a wrapped error immediately. */\nexport function failWith(\n step: string,\n packageName: string,\n error: unknown,\n): never {\n throw wrapError(step, packageName, error);\n}\n","import fs from \"fs\";\nimport path from \"path\";\nimport { resolvePath, joinPath } from \"../utils/paths.js\";\nimport { wrapError } from \"../utils/errors.js\";\n\n/**\n * Ensure a directory exists, creating all intermediate directories as needed.\n */\nexport function ensureDir(dir: string): void {\n try {\n fs.mkdirSync(dir, { recursive: true });\n } catch (err) {\n throw wrapError(\"ensure-dir\", dir, err);\n }\n}\n\n/**\n * Copy a single file from src to dest.\n * Creates the destination directory if it does not exist.\n */\nexport function copyFile(src: string, dest: string): void {\n ensureDir(path.dirname(dest));\n try {\n fs.copyFileSync(src, dest);\n } catch (err) {\n throw wrapError(\"copy-file\", src, err);\n }\n}\n\n/** Directories that are never copied in any directory tree operation. */\nconst COPY_EXCLUDES = new Set([\".git\", \"node_modules\", \"dist\", \".turbo\", \".cache\"]);\n\n/**\n * Copy an entire directory tree recursively, skipping .git and node_modules.\n */\nexport function copyDir(src: string, dest: string): void {\n ensureDir(dest);\n const entries = fs.readdirSync(src, { withFileTypes: true });\n for (const entry of entries) {\n if (COPY_EXCLUDES.has(entry.name)) continue;\n const srcPath = joinPath(src, entry.name);\n const destPath = joinPath(dest, entry.name);\n if (entry.isDirectory()) {\n copyDir(srcPath, destPath);\n } else {\n copyFile(srcPath, destPath);\n }\n }\n}\n\n/**\n * Read a file as a UTF-8 string, or throw a BundlerError with context.\n */\nexport function readFile(filePath: string, packageName = filePath): string {\n try {\n return fs.readFileSync(filePath, \"utf-8\");\n } catch (err) {\n throw wrapError(\"read-file\", packageName, err);\n }\n}\n\n/**\n * Write a UTF-8 string to a file, creating intermediate directories.\n */\nexport function writeFile(filePath: string, content: string, packageName = filePath): void {\n ensureDir(path.dirname(filePath));\n try {\n fs.writeFileSync(filePath, content, \"utf-8\");\n } catch (err) {\n throw wrapError(\"write-file\", packageName, err);\n }\n}\n\n/**\n * Move all files matching a glob-like condition.\n * Actually does a rename — works only within the same filesystem volume.\n */\nexport function moveFile(src: string, dest: string, packageName = src): void {\n ensureDir(path.dirname(dest));\n try {\n fs.renameSync(src, dest);\n } catch (err) {\n // rename across devices fails — fall back to copy+unlink\n try {\n fs.copyFileSync(src, dest);\n fs.unlinkSync(src);\n } catch (fallbackErr) {\n throw wrapError(\"move-file\", packageName, fallbackErr);\n }\n }\n}\n\n/**\n * Check whether a path exists on the filesystem.\n */\nexport function pathExists(p: string): boolean {\n return fs.existsSync(p);\n}\n\n/**\n * List all file paths inside a directory (non-recursive).\n */\nexport function listFiles(dir: string): string[] {\n if (!fs.existsSync(dir)) return [];\n return fs\n .readdirSync(dir, { withFileTypes: true })\n .filter((e) => e.isFile())\n .map((e) => joinPath(dir, e.name));\n}\n","import path from \"path\";\nimport { readFile, writeFile } from \"./file-manager.js\";\nimport { joinPath } from \"../utils/paths.js\";\nimport { wrapError } from \"../utils/errors.js\";\nimport type { PackageBase } from \"../types/index.js\";\n\n// Fields kept verbatim from the source package.json into the build package.json.\nconst KEPT_FIELDS = [\n \"name\",\n \"description\",\n \"keywords\",\n \"author\",\n \"license\",\n \"repository\",\n \"homepage\",\n \"bugs\",\n \"dependencies\",\n \"peerDependencies\",\n \"sideEffects\",\n \"bin\",\n \"engines\",\n] as const;\n\nexport type SourcePackageJson = Record<string, unknown> & {\n version: string;\n dependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n};\n\n/**\n * Read and parse the package.json at <packageRoot>/package.json.\n * Throws a BundlerError if the file is missing or malformed.\n */\nexport function readSourcePackageJson(\n packageRoot: string,\n packageName: string,\n): SourcePackageJson {\n const pkgPath = joinPath(packageRoot, \"package.json\");\n let raw: string;\n try {\n raw = readFile(pkgPath, packageName);\n } catch {\n throw wrapError(\n \"read-package-json\",\n packageName,\n new Error(`package.json not found at ${pkgPath}`),\n );\n }\n\n try {\n const parsed = JSON.parse(raw) as SourcePackageJson;\n if (!parsed.version) {\n throw new Error(`package.json at ${pkgPath} is missing \"version\" field`);\n }\n return parsed;\n } catch (err) {\n throw wrapError(\"parse-package-json\", packageName, err);\n }\n}\n\n/**\n * Write the new version back into the source package.json.\n */\nexport function writeSourceVersion(\n packageRoot: string,\n packageName: string,\n newVersion: string,\n): void {\n const pkgPath = joinPath(packageRoot, \"package.json\");\n const raw = readFile(pkgPath, packageName);\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n parsed.version = newVersion;\n writeFile(pkgPath, JSON.stringify(parsed, null, 2) + \"\\n\", packageName);\n}\n\n/**\n * Build and write the clean package.json for the build output directory.\n */\nexport function writeBuildPackageJson(\n pkg: PackageBase,\n sourceJson: SourcePackageJson,\n buildPath: string,\n newVersion: string,\n): void {\n const formats = pkg.formats ?? [\"esm\", \"cjs\"];\n const hasEsm = formats.includes(\"esm\");\n const hasCjs = formats.includes(\"cjs\");\n const esmOnly = hasEsm && !hasCjs;\n\n // When preserveModules is on (the default), tsdown keeps one file per source\n // module and uses native extensions (.mjs/.cjs) so internal cross-file imports\n // resolve correctly. When bundling, everything is renamed to .js for simplicity.\n const preserve = pkg.preserveModules !== false;\n const esmExt = preserve ? \".mjs\" : \".js\";\n const cjsExt = preserve ? \".cjs\" : \".js\";\n const esmDts = preserve ? \".d.mts\" : \".d.ts\";\n const cjsDts = preserve ? \".d.cts\" : \".d.ts\";\n\n // Determine entry base names from entries config\n const rawEntries = pkg.entries ?? [\"index.ts\"];\n const entryList = Array.isArray(rawEntries) ? rawEntries : [rawEntries];\n\n /**\n * Convert an entry path (relative to srcDir) into:\n * basePath — path without extension, used to build file paths (e.g. \"cli/index\")\n * exportPath — the key in the exports map (e.g. \"./cli\")\n *\n * When the basename is \"index\" the directory becomes the export path so that\n * `cli/index.ts` maps to `\"./cli\"` and `index.ts` maps to `\".\"`.\n */\n function entryPaths(entry: string): { basePath: string; exportPath: string } {\n const basePath = entry.replace(/\\.tsx?$/, \"\");\n const parts = basePath.split(\"/\");\n const last = parts[parts.length - 1];\n let exportPath: string;\n if (last === \"index\") {\n const dir = parts.slice(0, -1).join(\"/\");\n exportPath = dir ? `./${dir}` : \".\";\n } else {\n exportPath = `./${basePath}`;\n }\n return { basePath, exportPath };\n }\n\n // Primary entry drives `main` / `module` / `types` fields.\n const { basePath: primaryBase } = entryPaths(entryList[0]!);\n\n // Build the full exports map — one condition block per entry.\n const exportsMap: Record<string, unknown> = {};\n\n for (const entry of entryList) {\n const { basePath, exportPath } = entryPaths(entry);\n const conditions: Record<string, unknown> = {};\n\n if (hasEsm) {\n conditions[\"import\"] = {\n types: `./esm/${basePath}${esmDts}`,\n default: `./esm/${basePath}${esmExt}`,\n };\n }\n if (hasCjs) {\n // When preserveModules is on, CJS is built without DTS to avoid a rolldown bug.\n // TypeScript resolves types correctly from the ESM declarations via the exports map.\n const cjsTypes = preserve && hasEsm\n ? `./esm/${basePath}${esmDts}`\n : `./cjs/${basePath}${cjsDts}`;\n conditions[\"require\"] = {\n types: cjsTypes,\n default: `./cjs/${basePath}${cjsExt}`,\n };\n }\n\n exportsMap[exportPath] = conditions;\n }\n\n const output: Record<string, unknown> = {};\n\n // Copy allowed fields from source\n for (const field of KEPT_FIELDS) {\n if (field in sourceJson && sourceJson[field] !== undefined) {\n output[field] = sourceJson[field];\n }\n }\n\n // Override name / version\n output[\"name\"] = pkg.name;\n output[\"version\"] = newVersion;\n\n if (esmOnly) {\n output[\"type\"] = \"module\";\n }\n\n // Entry points\n const mainType = pkg.mainType ?? \"cjs\";\n if (mainType === \"esm\" || esmOnly) {\n output[\"main\"] = `./esm/${primaryBase}${esmExt}`;\n } else {\n output[\"main\"] = `./cjs/${primaryBase}${cjsExt}`;\n }\n\n if (hasEsm) {\n output[\"module\"] = `./esm/${primaryBase}${esmExt}`;\n }\n\n output[\"types\"] = `./esm/${primaryBase}${esmDts}`;\n\n output[\"exports\"] = exportsMap;\n\n const pkgPath = joinPath(buildPath, \"package.json\");\n writeFile(pkgPath, JSON.stringify(output, null, 2) + \"\\n\", pkg.name);\n}\n","import fs from \"fs\";\nimport { copyFile, copyDir, pathExists } from \"./file-manager.js\";\nimport { joinPath } from \"../utils/paths.js\";\nimport { logger } from \"../utils/logger.js\";\n\n/**\n * Clone extra files (README, license, etc.) from the package root into the build directory.\n *\n * Each entry in the `clone` array can be:\n * - a plain string: copied from `<packageRoot>/<str>` to `<buildDir>/<str>`\n * - a tuple [src, dest]: copied from `<packageRoot>/<src>` to `<buildDir>/<dest>`\n */\nexport function cloneFiles(\n packageRoot: string,\n buildDir: string,\n cloneList: (string | [string, string])[],\n packageName: string,\n dryRun: boolean,\n): void {\n for (const entry of cloneList) {\n const [srcRel, destRel] =\n typeof entry === \"string\" ? [entry, entry] : entry;\n\n const src = joinPath(packageRoot, srcRel);\n const dest = joinPath(buildDir, destRel);\n\n if (!pathExists(src)) {\n logger.warn(`[clone-files] ${packageName}: source file not found, skipping — ${src}`);\n continue;\n }\n\n if (dryRun) {\n logger.info(`[dry-run] clone ${src} → ${dest}`);\n continue;\n }\n\n const stat = fs.statSync(src);\n if (stat.isDirectory()) {\n copyDir(src, dest);\n } else {\n copyFile(src, dest);\n }\n logger.debug(`Cloned ${src} → ${dest}`);\n }\n}\n","import chalk from \"chalk\";\n\nexport type LogLevel = \"info\" | \"success\" | \"warn\" | \"error\" | \"debug\" | \"step\";\n\nlet _verbose = false;\n\nexport function setVerbose(v: boolean): void {\n _verbose = v;\n}\n\nexport function log(level: LogLevel, message: string): void {\n const ts = new Date().toISOString().replace(\"T\", \" \").replace(\"Z\", \"\");\n switch (level) {\n case \"info\":\n console.log(chalk.cyan(`[${ts}] INFO ${message}`));\n break;\n case \"success\":\n console.log(chalk.green(`[${ts}] OK ${message}`));\n break;\n case \"warn\":\n console.warn(chalk.yellow(`[${ts}] WARN ${message}`));\n break;\n case \"error\":\n console.error(chalk.red(`[${ts}] ERROR ${message}`));\n break;\n case \"step\":\n console.log(chalk.blueBright(`[${ts}] STEP ${message}`));\n break;\n case \"debug\":\n if (_verbose) {\n console.log(chalk.gray(`[${ts}] DEBUG ${message}`));\n }\n break;\n }\n}\n\nexport const logger = {\n info: (msg: string) => log(\"info\", msg),\n success: (msg: string) => log(\"success\", msg),\n warn: (msg: string) => log(\"warn\", msg),\n error: (msg: string) => log(\"error\", msg),\n step: (msg: string) => log(\"step\", msg),\n debug: (msg: string) => log(\"debug\", msg),\n};\n","import path from \"path\";\nimport fs from \"fs\";\nimport { build } from \"tsdown\";\nimport type { InputOptions } from \"rolldown\";\nimport type { PackageBase } from \"../types/index.js\";\nimport { joinPath, toForwardSlash, resolvePath } from \"../utils/paths.js\";\nimport { ensureDir, moveFile, listFiles, pathExists } from \"../files/file-manager.js\";\nimport { wrapError } from \"../utils/errors.js\";\nimport { logger } from \"../utils/logger.js\";\n\n// ─── Helpers ───────────────────────────────────────────────────────────────\n\n/**\n * Collect all dependency names that should be treated as external.\n * Both `dependencies` and `peerDependencies` must never be bundled.\n */\nfunction collectExternals(sourceJson: Record<string, unknown>): string[] {\n const deps = Object.keys((sourceJson[\"dependencies\"] as Record<string, string> | undefined) ?? {});\n const peers = Object.keys((sourceJson[\"peerDependencies\"] as Record<string, string> | undefined) ?? {});\n return [...new Set([...deps, ...peers])];\n}\n\n/**\n * Resolve entry file paths to absolute forward-slash paths.\n */\nfunction resolveEntries(pkg: PackageBase, packageRoot: string): string[] {\n const srcDir = pkg.srcDir ?? \"src\";\n const rawEntries = pkg.entries ?? [\"index.ts\"];\n const entryList = Array.isArray(rawEntries) ? rawEntries : [rawEntries];\n return entryList.map((e) => toForwardSlash(resolvePath(packageRoot, srcDir, e)));\n}\n\n/**\n * Return the path to the tsconfig.json inside the package root, if it exists.\n */\nfunction findTsconfig(packageRoot: string): string | undefined {\n const local = joinPath(packageRoot, \"tsconfig.json\");\n return pathExists(local) ? local : undefined;\n}\n\n// ─── Main compiler ──────────────────────────────────────────────────────────\n\n/**\n * Compile a single package using tsdown.\n *\n * When `preserveModules` is on (the default), we run two separate tsdown builds\n * in parallel so that each format's output options are fully independent:\n *\n * ESM build — preserveModules: true, dts: true → _tmp_esm/ → esm/*.mjs + *.d.mts\n * CJS build — preserveModules: false, dts: false → _tmp_cjs/ → cjs/*.cjs\n *\n * CJS skips DTS because rolldown has a bug in CJS preserveModules mode where\n * `export { default as X }` assigns the whole module object to exports.X instead\n * of unwrapping .default. Bundled CJS has no such issue. Types are shared from\n * the ESM declarations (TypeScript resolves them correctly via the exports map).\n *\n * When `preserveModules` is false, a single combined build is used.\n */\nexport async function compilePackage(\n pkg: PackageBase,\n packageRoot: string,\n buildPath: string,\n sourceJson: Record<string, unknown>,\n dryRun: boolean,\n): Promise<void> {\n if (dryRun) {\n logger.info(`[dry-run] compile ${pkg.name} → ${buildPath}`);\n return;\n }\n\n const entries = resolveEntries(pkg, packageRoot);\n const formats = pkg.formats ?? [\"esm\", \"cjs\"];\n const externals = collectExternals(sourceJson);\n const tsconfig = findTsconfig(packageRoot);\n const shouldPreserveModules = pkg.preserveModules !== false;\n const srcDir = toForwardSlash(resolvePath(packageRoot, pkg.srcDir ?? \"src\"));\n\n logger.step(`Compiling ${pkg.name} (${formats.join(\", \")}) → ${buildPath}`);\n logger.debug(` entries: ${entries.join(\", \")}`);\n logger.debug(` externals: ${externals.slice(0, 8).join(\", \")}${externals.length > 8 ? \"…\" : \"\"}`);\n\n // Wipe any previous esm/ and cjs/ output so re-runs of the same version don't\n // leave stale files from a different build mode.\n for (const subDir of [\"esm\", \"cjs\"]) {\n const dir = resolvePath(buildPath, subDir);\n if (fs.existsSync(dir)) {\n fs.rmSync(dir, { recursive: true, force: true });\n }\n }\n\n // Build inputOptions for rolldown — used to set the JSX transform for React packages.\n const rolldownInputOptions: InputOptions | undefined =\n pkg.type === \"react\"\n ? {\n transform: {\n jsx: \"react-jsx\", // automatic runtime — works with React 17+\n },\n }\n : undefined;\n\n // Common options shared across all tsdown invocations.\n const sharedOptions = {\n entry: entries,\n deps: { neverBundle: externals },\n sourcemap: pkg.sourcemap !== false,\n clean: true,\n minify: pkg.minify ?? false,\n tsconfig: tsconfig ?? true,\n ...(rolldownInputOptions ? { inputOptions: rolldownInputOptions } : {}),\n } as const;\n\n try {\n if (shouldPreserveModules && formats.includes(\"esm\") && formats.includes(\"cjs\")) {\n // Two parallel builds: ESM with preserveModules + DTS, CJS bundled without DTS.\n const tmpEsm = toForwardSlash(resolvePath(buildPath, \"_tmp_esm\"));\n const tmpCjs = toForwardSlash(resolvePath(buildPath, \"_tmp_cjs\"));\n ensureDir(tmpEsm);\n ensureDir(tmpCjs);\n\n await Promise.all([\n build({\n ...sharedOptions,\n format: [\"esm\"],\n dts: pkg.dts !== false,\n outDir: tmpEsm,\n outputOptions: {\n preserveModules: true,\n preserveModulesRoot: srcDir,\n },\n }),\n build({\n ...sharedOptions,\n format: [\"cjs\"],\n // CJS skips DTS — types are served from ESM declarations (see package-json.ts).\n dts: false,\n outDir: tmpCjs,\n }),\n ]);\n\n reorganiseOutput(tmpEsm, buildPath, [\"esm\"], pkg, true);\n // keepNativeExtension=true: CJS files come out as .cjs from tsdown; we keep that\n // extension so the exports map (./cjs/index.cjs) resolves correctly.\n reorganiseOutput(tmpCjs, buildPath, [\"cjs\"], pkg, false, true);\n rmTmp(tmpEsm);\n rmTmp(tmpCjs);\n } else {\n // Single build: either one format only, or preserveModules disabled.\n const tmpDir = toForwardSlash(resolvePath(buildPath, \"_tmp\"));\n ensureDir(tmpDir);\n\n await build({\n ...sharedOptions,\n format: formats as (\"esm\" | \"cjs\")[],\n dts: pkg.dts !== false,\n outDir: tmpDir,\n ...(shouldPreserveModules && formats.includes(\"esm\")\n ? { outputOptions: { preserveModules: true, preserveModulesRoot: srcDir } }\n : {}),\n });\n\n reorganiseOutput(tmpDir, buildPath, formats as (\"esm\" | \"cjs\")[], pkg, shouldPreserveModules);\n rmTmp(tmpDir);\n }\n } catch (err) {\n throw wrapError(\"tsdown-build\", pkg.name, err);\n }\n\n logger.success(`Compiled ${pkg.name}`);\n}\n\nfunction rmTmp(dir: string): void {\n try {\n fs.rmSync(dir, { recursive: true, force: true });\n } catch {\n // non-fatal — stale tmp is harmless\n }\n}\n\n// ─── Output reorganisation ──────────────────────────────────────────────────\n\n/**\n * Move the flat tsdown output (in tmpDir) into `esm/` and `cjs/` subdirectories\n * under buildPath. Renames .mjs → .js and .cjs → .js so that relative imports\n * inside each format directory resolve correctly.\n */\nfunction reorganiseOutput(\n tmpDir: string,\n buildPath: string,\n formats: (\"esm\" | \"cjs\")[],\n pkg: PackageBase,\n preserveModules: boolean,\n keepNativeExtension = false,\n): void {\n const esmDir = joinPath(buildPath, \"esm\");\n const cjsDir = joinPath(buildPath, \"cjs\");\n\n if (formats.includes(\"esm\")) ensureDir(esmDir);\n if (formats.includes(\"cjs\")) ensureDir(cjsDir);\n\n const mainType = pkg.mainType ?? (formats.includes(\"cjs\") ? \"cjs\" : \"esm\");\n\n processDirectory(tmpDir, { esmDir, cjsDir, formats, mainType, pkg, tmpDir, preserveModules, keepNativeExtension });\n}\n\ninterface ReorgContext {\n esmDir: string;\n cjsDir: string;\n formats: (\"esm\" | \"cjs\")[];\n mainType: \"esm\" | \"cjs\";\n pkg: PackageBase;\n /** Absolute path to the flat _tmp/ directory — used to compute relative paths when preserveModules is on. */\n tmpDir: string;\n preserveModules: boolean;\n /**\n * When true, keep the native .mjs/.cjs extensions instead of normalising to .js.\n * Used in the CJS-only leg of the two-build path so the final file stays .cjs.\n */\n keepNativeExtension: boolean;\n}\n\nfunction processDirectory(dir: string, ctx: ReorgContext): void {\n if (!fs.existsSync(dir)) return;\n\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = joinPath(dir, entry.name);\n if (entry.isDirectory()) {\n // Recursively handle subdirectories (chunk splits, etc.)\n processDirectory(fullPath, ctx);\n } else {\n processFile(fullPath, entry.name, ctx);\n }\n }\n}\n\nfunction processFile(filePath: string, name: string, ctx: ReorgContext): void {\n const { esmDir, cjsDir, formats, mainType, pkg, tmpDir, preserveModules } = ctx;\n\n // Relative subdirectory from the tmp root — preserves folder structure for both\n // preserveModules output and multi-entry single-bundle output (where each entry\n // lands in its own subdirectory, e.g. cli/index.cjs).\n // path.relative may return backslashes on Windows — normalise to forward slashes.\n const relDir = toForwardSlash(path.relative(tmpDir, path.dirname(filePath)));\n\n if (preserveModules) {\n if (isEsmFile(name)) {\n if (formats.includes(\"esm\")) {\n moveFile(filePath, joinPath(esmDir, relDir, name), pkg.name);\n }\n } else if (isCjsFile(name)) {\n if (formats.includes(\"cjs\")) {\n moveFile(filePath, joinPath(cjsDir, relDir, name), pkg.name);\n }\n } else if (isDtsFile(name)) {\n const targetDir = formats.includes(\"esm\") ? esmDir : cjsDir;\n moveFile(filePath, joinPath(targetDir, relDir, name), pkg.name);\n }\n // Unknown extensions silently ignored.\n return;\n }\n\n // ── Single-bundle mode ──────────────────────────────────────────────────────\n const { keepNativeExtension } = ctx;\n\n if (isEsmFile(name)) {\n if (formats.includes(\"esm\")) {\n const destName = keepNativeExtension ? name : normaliseEsmName(name);\n moveFile(filePath, joinPath(esmDir, relDir, destName), pkg.name);\n }\n } else if (isCjsFile(name)) {\n if (formats.includes(\"cjs\")) {\n const destName = keepNativeExtension ? name : normaliseCjsName(name);\n moveFile(filePath, joinPath(cjsDir, relDir, destName), pkg.name);\n }\n } else if (isDtsFile(name)) {\n const targetDir = formats.includes(\"esm\") ? esmDir : cjsDir;\n moveFile(filePath, joinPath(targetDir, relDir, name), pkg.name);\n } else if (isJsFile(name)) {\n // Plain .js / .js.map — emitted when the format array contains only one format\n // (tsdown uses .js instead of .mjs/.cjs when there's no other format to differentiate from).\n const targetDir = mainType === \"esm\" ? esmDir : cjsDir;\n if (formats.includes(mainType)) {\n // Files landing in cjsDir should use the .cjs extension for consistency.\n const destName =\n targetDir === cjsDir\n ? name.replace(/\\.js\\.map$/, \".cjs.map\").replace(/\\.js$/, \".cjs\")\n : name;\n moveFile(filePath, joinPath(targetDir, relDir, destName), pkg.name);\n }\n }\n // Unknown extensions are silently ignored.\n}\n\n// ─── Extension predicates ───────────────────────────────────────────────────\n\nfunction isEsmFile(name: string): boolean {\n return (\n name.endsWith(\".mjs\") ||\n name.endsWith(\".mjs.map\") ||\n name.endsWith(\".d.mts\") ||\n name.endsWith(\".d.mts.map\")\n );\n}\n\nfunction isCjsFile(name: string): boolean {\n return (\n name.endsWith(\".cjs\") ||\n name.endsWith(\".cjs.map\") ||\n name.endsWith(\".d.cts\") ||\n name.endsWith(\".d.cts.map\")\n );\n}\n\nfunction isDtsFile(name: string): boolean {\n return name.endsWith(\".d.ts\") || name.endsWith(\".d.ts.map\");\n}\n\nfunction isJsFile(name: string): boolean {\n return (\n (name.endsWith(\".js\") || name.endsWith(\".js.map\")) &&\n !name.endsWith(\".d.ts\") &&\n !name.endsWith(\".d.ts.map\")\n );\n}\n\n// ─── Name normalisation ─────────────────────────────────────────────────────\n\n/** Rename .mjs / .d.mts → .js / .d.ts for the esm/ directory. */\nfunction normaliseEsmName(name: string): string {\n return name\n .replace(/\\.mjs\\.map$/, \".js.map\")\n .replace(/\\.mjs$/, \".js\")\n .replace(/\\.d\\.mts\\.map$/, \".d.ts.map\")\n .replace(/\\.d\\.mts$/, \".d.ts\");\n}\n\n/** Rename .cjs / .d.cts → .js / .d.ts for the cjs/ directory. */\nfunction normaliseCjsName(name: string): string {\n return name\n .replace(/\\.cjs\\.map$/, \".js.map\")\n .replace(/\\.cjs$/, \".js\")\n .replace(/\\.d\\.cts\\.map$/, \".d.ts.map\")\n .replace(/\\.d\\.cts$/, \".d.ts\");\n}\n","import semver from \"semver\";\nimport { wrapError } from \"../utils/errors.js\";\n\n/**\n * Given the current version string and a version strategy, return the new version.\n *\n * @param currentVersion semver string from source package.json, e.g. \"1.2.3\"\n * @param strategy \"auto\" / \"patch\" → patch bump\n * \"minor\" → minor bump\n * \"major\" → major bump\n * any valid semver string → use as-is\n * @param packageName used in error messages only\n */\nexport function resolveVersion(\n currentVersion: string,\n strategy: \"auto\" | \"patch\" | \"minor\" | \"major\" | string = \"auto\",\n packageName: string,\n): string {\n const bumpType =\n strategy === \"auto\" || strategy === \"patch\" ? \"patch\"\n : strategy === \"minor\" ? \"minor\"\n : strategy === \"major\" ? \"major\"\n : null;\n\n if (bumpType) {\n const bumped = semver.inc(currentVersion, bumpType);\n if (!bumped) {\n throw wrapError(\n \"version-increment\",\n packageName,\n new Error(\n `Cannot ${bumpType}-bump invalid semver version \"${currentVersion}\" for package \"${packageName}\"`,\n ),\n );\n }\n return bumped;\n }\n\n // Explicit version string — validate it\n const cleaned = semver.valid(semver.coerce(strategy) ?? strategy);\n if (!cleaned) {\n throw wrapError(\n \"version-increment\",\n packageName,\n new Error(\n `Explicit version \"${strategy}\" is not a valid semver string for package \"${packageName}\"`,\n ),\n );\n }\n return cleaned;\n}\n","import simpleGit, { SimpleGit } from \"simple-git\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { joinPath } from \"../utils/paths.js\";\nimport { wrapError } from \"../utils/errors.js\";\nimport { logger } from \"../utils/logger.js\";\n\n/**\n * Returns true if the given directory is inside a git repository.\n */\nexport async function isGitRepo(dir: string): Promise<boolean> {\n try {\n const git: SimpleGit = simpleGit(dir);\n const result = await git.checkIsRepo();\n return result;\n } catch {\n return false;\n }\n}\n\n/**\n * Perform git operations for a package after a successful build:\n * 1. git add -A (in the package root)\n * 2. git commit -m <message>\n * 3. git push origin <branch>\n * 4. git tag v<version>\n * 5. git push origin <tag>\n */\nexport async function gitCommitTagPush(\n packageRoot: string,\n packageName: string,\n version: string,\n commitMessage: string,\n branch: string,\n dryRun: boolean,\n): Promise<void> {\n const isRepo = await isGitRepo(packageRoot);\n if (!isRepo) {\n logger.warn(`[git] ${packageName}: directory is not a git repo — skipping git operations`);\n return;\n }\n\n const tag = `v${version}`;\n logger.step(`[git] ${packageName}: commit \"${commitMessage}\", tag ${tag}, push to ${branch}`);\n\n if (dryRun) {\n logger.info(`[dry-run] git add + commit \"${commitMessage}\" + tag ${tag} + push`);\n return;\n }\n\n const git: SimpleGit = simpleGit(packageRoot);\n\n try {\n // Stage all changes\n await git.add(\"-A\");\n\n // Commit\n await git.commit(commitMessage);\n\n // Push to remote\n await git.push(\"origin\", branch);\n\n // Tag\n await git.addTag(tag);\n\n // Push tags\n await git.pushTags(\"origin\");\n\n logger.success(`[git] ${packageName}: pushed ${branch}, tagged ${tag}`);\n } catch (err) {\n throw wrapError(\"git-operations\", packageName, err);\n }\n}\n\n/**\n * Resolve the current branch name in the given directory.\n * Falls back to \"main\" if the directory is not a git repo.\n */\nexport async function currentBranch(dir: string): Promise<string> {\n try {\n const git: SimpleGit = simpleGit(dir);\n const branch = await git.revparse([\"--abbrev-ref\", \"HEAD\"]);\n return branch.trim() || \"main\";\n } catch {\n return \"main\";\n }\n}\n","import { execa } from \"execa\";\nimport { wrapError } from \"./errors.js\";\n\nexport interface ExecResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\n/**\n * Run a shell command and return stdout/stderr.\n * Throws a BundlerError on non-zero exit.\n */\nexport async function exec(\n step: string,\n packageName: string,\n command: string,\n args: string[],\n cwd?: string,\n): Promise<ExecResult> {\n try {\n const result = await execa(command, args, {\n cwd,\n all: true,\n reject: false,\n });\n if (result.exitCode !== 0) {\n const combined = result.all ?? result.stderr ?? \"\";\n throw new Error(\n `Command \"${command} ${args.join(\" \")}\" exited with code ${result.exitCode}.\\n${combined}`,\n );\n }\n return {\n stdout: result.stdout ?? \"\",\n stderr: result.stderr ?? \"\",\n exitCode: result.exitCode,\n };\n } catch (err) {\n throw wrapError(step, packageName, err);\n }\n}\n\n/**\n * Run a command and ignore its output. Does NOT throw on non-zero exit.\n * Useful for optional operations (e.g. `git tag -d`).\n */\nexport async function execSilent(\n command: string,\n args: string[],\n cwd?: string,\n): Promise<number> {\n try {\n const result = await execa(command, args, { cwd, reject: false });\n return result.exitCode ?? 0;\n } catch {\n return 1;\n }\n}\n","import { exec } from \"../utils/exec.js\";\nimport { logger } from \"../utils/logger.js\";\nimport type { PackageBase } from \"../types/index.js\";\n\n/**\n * Run `npm publish` from the build output directory.\n */\nexport async function publishPackage(\n pkg: PackageBase,\n buildPath: string,\n dryRun: boolean,\n): Promise<void> {\n if (pkg.publish === false) {\n logger.info(`[publish] ${pkg.name}: publish=false, skipping`);\n return;\n }\n\n const access = pkg.access ?? \"public\";\n\n if (dryRun) {\n logger.info(`[dry-run] npm publish --access ${access} from ${buildPath}`);\n return;\n }\n\n logger.step(`Publishing ${pkg.name}@... to npm (access: ${access})`);\n\n await exec(\n \"npm-publish\",\n pkg.name,\n \"npm\",\n [\"publish\", \"--access\", access],\n buildPath,\n );\n\n logger.success(`Published ${pkg.name}`);\n}\n","import path from \"path\";\nimport { copyDir, ensureDir } from \"../files/file-manager.js\";\nimport {\n readSourcePackageJson,\n writeSourceVersion,\n writeBuildPackageJson,\n} from \"../files/package-json.js\";\nimport { cloneFiles } from \"../files/clone-files.js\";\nimport { compilePackage } from \"../compile/tsdown-compiler.js\";\nimport { resolveVersion } from \"../version/increment.js\";\nimport { gitCommitTagPush, currentBranch } from \"../git/operations.js\";\nimport { publishPackage } from \"../publish/npm-publisher.js\";\nimport { buildOutputPath, sourceSnapshotPath, resolvePath } from \"../utils/paths.js\";\nimport { wrapError } from \"../utils/errors.js\";\nimport { logger } from \"../utils/logger.js\";\nimport type { PackageBase, BuildOptions, BuilderSettings } from \"../types/index.js\";\n\nexport interface BuildResult {\n packageName: string;\n version: string;\n buildPath: string;\n success: boolean;\n error?: Error;\n}\n\n/**\n * Execute the full build pipeline for a single package.\n *\n * Steps:\n * 1. Resolve package root\n * 2. Read source package.json → current version\n * 3. Compute new version\n * 4. Create build output directory\n * 5. Source snapshot (optional)\n * 6. tsdown compile\n * 7. Clone extra files\n * 8. Write build package.json\n * 9. Update source package.json version\n * 10. Git: add, commit, push, tag\n * 11. npm publish\n */\nexport async function buildPackage(\n pkg: PackageBase,\n versionStrategy: \"auto\" | string = \"auto\",\n settings: BuilderSettings,\n options: BuildOptions,\n configDir: string,\n /**\n * Override commit message (used by family builder to apply a shared message).\n * If undefined, uses pkg.commit.\n */\n overrideCommit?: string,\n /**\n * Pre-resolved version — used when a family has already determined the version\n * and needs all member packages to use the same one.\n */\n forcedVersion?: string,\n): Promise<BuildResult> {\n const step = \"package-builder\";\n\n try {\n // 1. Resolve absolute package root\n const packageRoot = resolvePath(configDir, pkg.root);\n\n // 2. Read source package.json\n const sourceJson = readSourcePackageJson(packageRoot, pkg.name);\n const currentVersion = sourceJson.version;\n\n // 3. Determine new version\n const newVersion =\n forcedVersion ?? resolveVersion(currentVersion, versionStrategy, pkg.name);\n\n logger.info(`Building ${pkg.name}: ${currentVersion} → ${newVersion}`);\n\n // 4. Build output directory\n const absoluteBuildDir = resolvePath(configDir, settings.buildDir);\n const buildPath = buildOutputPath(absoluteBuildDir, pkg.name, newVersion);\n\n if (!options.dryRun) {\n ensureDir(buildPath);\n }\n\n // 5. Source snapshot\n if (settings.sourcesDir) {\n const absoluteSourcesDir = resolvePath(configDir, settings.sourcesDir);\n const snapshotPath = sourceSnapshotPath(absoluteSourcesDir, pkg.name);\n if (options.dryRun) {\n logger.info(`[dry-run] snapshot ${packageRoot} → ${snapshotPath}`);\n } else {\n ensureDir(snapshotPath);\n copyDir(packageRoot, snapshotPath);\n logger.debug(`Snapshot: ${packageRoot} → ${snapshotPath}`);\n }\n }\n\n // 6. Compile with tsdown\n await compilePackage(pkg, packageRoot, buildPath, sourceJson as Record<string, unknown>, options.dryRun);\n\n // 7. Clone extra files\n if (pkg.clone && pkg.clone.length > 0) {\n cloneFiles(packageRoot, buildPath, pkg.clone, pkg.name, options.dryRun);\n }\n\n // 8. Write build package.json\n if (!options.dryRun) {\n writeBuildPackageJson(pkg, sourceJson, buildPath, newVersion);\n logger.debug(`Wrote build package.json for ${pkg.name}@${newVersion}`);\n } else {\n logger.info(`[dry-run] write build package.json for ${pkg.name}@${newVersion}`);\n }\n\n // 9. Update source package.json version\n if (!options.dryRun) {\n writeSourceVersion(packageRoot, pkg.name, newVersion);\n logger.debug(`Updated source version ${pkg.name} → ${newVersion}`);\n } else {\n logger.info(`[dry-run] update source package.json version → ${newVersion}`);\n }\n\n // 10. Git operations (only if commit message is set and --no-git is not passed)\n const commitMessage = overrideCommit ?? pkg.commit;\n if (commitMessage && !options.noGit) {\n const branch = pkg.branch ?? (await currentBranch(packageRoot));\n await gitCommitTagPush(\n packageRoot,\n pkg.name,\n newVersion,\n commitMessage,\n branch,\n options.dryRun,\n );\n } else if (!commitMessage) {\n logger.debug(`[git] ${pkg.name}: no commit message set — skipping git`);\n }\n\n // 11. npm publish\n if (!options.noPublish) {\n await publishPackage(pkg, buildPath, options.dryRun);\n } else {\n logger.info(`[publish] ${pkg.name}: --no-publish, skipping`);\n }\n\n return { packageName: pkg.name, version: newVersion, buildPath, success: true };\n } catch (err) {\n const wrapped = wrapError(step, pkg.name, err);\n logger.error(`Failed to build ${pkg.name}: ${wrapped.message}`);\n return {\n packageName: pkg.name,\n version: \"\",\n buildPath: \"\",\n success: false,\n error: wrapped,\n };\n }\n}\n","import pLimit from \"p-limit\";\nimport type { BuildResult } from \"./package-builder.js\";\nimport { logger } from \"../utils/logger.js\";\n\n/**\n * Run an array of async build tasks with a concurrency cap.\n * Each task is a zero-argument function that returns a Promise<BuildResult>.\n */\nexport async function runParallel(\n tasks: (() => Promise<BuildResult>)[],\n concurrency: number,\n): Promise<BuildResult[]> {\n if (tasks.length === 0) return [];\n\n const limit = pLimit(Math.max(1, concurrency));\n\n logger.info(`Running ${tasks.length} task(s) with concurrency=${concurrency}`);\n\n const results = await Promise.all(\n tasks.map((task) => limit(task)),\n );\n\n const succeeded = results.filter((r) => r.success).length;\n const failed = results.filter((r) => !r.success).length;\n\n if (failed > 0) {\n logger.warn(`${succeeded} succeeded, ${failed} failed`);\n for (const r of results.filter((r) => !r.success)) {\n logger.error(` FAILED: ${r.packageName} — ${r.error?.message ?? \"unknown error\"}`);\n }\n } else {\n logger.success(`All ${succeeded} package(s) built successfully`);\n }\n\n return results;\n}\n","import type { Command } from \"commander\";\nimport { loadConfig, findDefaultConfigPath } from \"../config/index.js\";\nimport { buildPackage } from \"../build/package-builder.js\";\nimport { runParallel } from \"../build/parallel-builder.js\";\nimport { logger } from \"../utils/logger.js\";\nimport type { BuildOptions } from \"../types/index.js\";\n\ninterface BuildCommandOptions {\n all?: boolean;\n dryRun?: boolean;\n noPublish?: boolean;\n noGit?: boolean;\n config?: string;\n concurrency?: string;\n}\n\nexport function registerBuildCommand(program: Command): void {\n program\n .command(\"build [packages...]\")\n .description(\"Build standalone packages by name. Use --all to build all standalone packages.\")\n .option(\"--all\", \"Build all standalone packages\")\n .option(\"--dry-run\", \"Print what would happen without making any changes\")\n .option(\"--no-publish\", \"Skip npm publish\")\n .option(\"--no-git\", \"Skip git operations\")\n .option(\"--config <path>\", \"Path to config file\")\n .option(\"--concurrency <n>\", \"Override concurrency\")\n .action(async (packageNames: string[], opts: BuildCommandOptions) => {\n const configPath =\n opts.config ?? findDefaultConfigPath(process.cwd());\n\n const { config, configDir } = await loadConfig(configPath);\n\n const buildOptions: BuildOptions = {\n dryRun: opts.dryRun ?? false,\n noPublish: !opts.noPublish, // commander flips --no-publish to noPublish=false\n noGit: opts.noGit ?? false,\n concurrency: opts.concurrency ? parseInt(opts.concurrency, 10) : undefined,\n configPath,\n };\n\n // Fix: commander's --no-publish sets opts.publish = false (not opts.noPublish)\n // We need to check for the raw value\n const rawOpts = opts as Record<string, unknown>;\n const shouldPublish = rawOpts[\"publish\"] !== false;\n buildOptions.noPublish = !shouldPublish;\n\n const standalone = config.standalone ?? [];\n\n let targets = standalone;\n\n if (!opts.all && packageNames.length > 0) {\n targets = standalone.filter((p) => packageNames.includes(p.name));\n const missing = packageNames.filter(\n (n) => !standalone.some((p) => p.name === n),\n );\n if (missing.length > 0) {\n logger.warn(`Unknown package names: ${missing.join(\", \")}`);\n }\n }\n\n if (targets.length === 0) {\n logger.warn(\"No standalone packages matched. Use --all or specify package names.\");\n process.exit(0);\n }\n\n const concurrency =\n buildOptions.concurrency ?? config.settings.concurrency ?? 4;\n\n const tasks = targets.map(\n (pkg) => () =>\n buildPackage(\n pkg,\n pkg.version ?? \"auto\",\n config.settings,\n buildOptions,\n configDir,\n ),\n );\n\n const results = await runParallel(tasks, concurrency);\n const anyFailed = results.some((r) => !r.success);\n process.exit(anyFailed ? 1 : 0);\n });\n}\n","import semver from \"semver\";\nimport { readSourcePackageJson } from \"../files/package-json.js\";\nimport { resolveVersion } from \"../version/increment.js\";\nimport { resolvePath } from \"../utils/paths.js\";\nimport { buildPackage } from \"./package-builder.js\";\nimport { runParallel } from \"./parallel-builder.js\";\nimport { wrapError } from \"../utils/errors.js\";\nimport { logger } from \"../utils/logger.js\";\nimport type { Family, BuildOptions, BuilderSettings } from \"../types/index.js\";\nimport type { BuildResult } from \"./package-builder.js\";\n\n/**\n * Build all packages in a family using a single shared version.\n *\n * The shared version is determined by taking the HIGHEST current version\n * across all family members and bumping it. This prevents a lower-versioned\n * member (e.g. atomic-query@0.1.0) from pulling down a higher-versioned one\n * (e.g. react-atom@5.1.3) when they are first unified.\n */\nexport async function buildFamily(\n family: Family,\n settings: BuilderSettings,\n options: BuildOptions,\n configDir: string,\n): Promise<BuildResult[]> {\n if (family.packages.length === 0) {\n logger.warn(`Family \"${family.name}\" has no packages — nothing to build`);\n return [];\n }\n\n let newVersion: string;\n try {\n const strategy = family.version ?? \"auto\";\n const isBumpKeyword = strategy === \"auto\" || strategy === \"patch\" || strategy === \"minor\" || strategy === \"major\";\n\n if (!isBumpKeyword && semver.valid(semver.coerce(strategy) ?? strategy)) {\n // Explicit semver string — use as-is\n newVersion = strategy;\n } else {\n // Bump keyword — find the highest current version across all family members, then bump it\n let highestVersion = \"0.0.0\";\n for (const pkg of family.packages) {\n const root = resolvePath(configDir, pkg.root);\n const sourceJson = readSourcePackageJson(root, pkg.name);\n const v = sourceJson.version ?? \"0.0.0\";\n if (semver.gt(v, highestVersion)) {\n highestVersion = v;\n }\n }\n newVersion = resolveVersion(highestVersion, strategy, family.name);\n }\n } catch (err) {\n throw wrapError(\"family-version\", family.name, err);\n }\n\n logger.info(`Family \"${family.name}\": shared version → ${newVersion} (${family.packages.length} packages)`);\n\n const concurrency = options.concurrency ?? settings.concurrency ?? 4;\n\n // The family commit message overrides per-package commit messages\n const familyCommit = family.commit;\n\n const tasks = family.packages.map((pkg) => () =>\n buildPackage(\n pkg,\n \"auto\", // not used — forcedVersion overrides\n settings,\n options,\n configDir,\n familyCommit ?? pkg.commit,\n newVersion, // all packages use the same version\n ),\n );\n\n return runParallel(tasks, concurrency);\n}\n","import type { Command } from \"commander\";\nimport { loadConfig, findDefaultConfigPath } from \"../config/index.js\";\nimport { buildFamily } from \"../build/family-builder.js\";\nimport { logger } from \"../utils/logger.js\";\nimport type { BuildOptions } from \"../types/index.js\";\n\ninterface BuildFamilyOptions {\n dryRun?: boolean;\n noPublish?: boolean;\n noGit?: boolean;\n config?: string;\n concurrency?: string;\n}\n\nexport function registerBuildFamilyCommand(program: Command): void {\n program\n .command(\"build:family <name>\")\n .description(\"Build all packages in a named family with a single shared version.\")\n .option(\"--dry-run\", \"Print what would happen without making any changes\")\n .option(\"--no-publish\", \"Skip npm publish\")\n .option(\"--no-git\", \"Skip git operations\")\n .option(\"--config <path>\", \"Path to config file\")\n .option(\"--concurrency <n>\", \"Override concurrency\")\n .action(async (familyName: string, opts: BuildFamilyOptions) => {\n const configPath =\n opts.config ?? findDefaultConfigPath(process.cwd());\n\n const { config, configDir } = await loadConfig(configPath);\n\n const rawOpts = opts as Record<string, unknown>;\n const shouldPublish = rawOpts[\"publish\"] !== false;\n\n const buildOptions: BuildOptions = {\n dryRun: opts.dryRun ?? false,\n noPublish: !shouldPublish,\n noGit: opts.noGit ?? false,\n concurrency: opts.concurrency ? parseInt(opts.concurrency, 10) : undefined,\n configPath,\n };\n\n const family = (config.families ?? []).find((f) => f.name === familyName);\n\n if (!family) {\n const available = (config.families ?? []).map((f) => f.name).join(\", \");\n logger.error(\n `Family \"${familyName}\" not found. Available families: ${available || \"(none)\"}`,\n );\n process.exit(1);\n }\n\n const results = await buildFamily(family, config.settings, buildOptions, configDir);\n const anyFailed = results.some((r) => !r.success);\n process.exit(anyFailed ? 1 : 0);\n });\n}\n","import type { Command } from \"commander\";\nimport { loadConfig, findDefaultConfigPath } from \"../config/index.js\";\nimport { buildPackage } from \"../build/package-builder.js\";\nimport { buildFamily } from \"../build/family-builder.js\";\nimport { runParallel } from \"../build/parallel-builder.js\";\nimport { logger } from \"../utils/logger.js\";\nimport type { BuildOptions } from \"../types/index.js\";\nimport type { BuildResult } from \"../build/package-builder.js\";\n\ninterface BuildAllOptions {\n dryRun?: boolean;\n noPublish?: boolean;\n noGit?: boolean;\n config?: string;\n concurrency?: string;\n}\n\nexport function registerBuildAllCommand(program: Command): void {\n program\n .command(\"build:all\")\n .description(\"Build all standalone packages and all families.\")\n .option(\"--dry-run\", \"Print what would happen without making any changes\")\n .option(\"--no-publish\", \"Skip npm publish\")\n .option(\"--no-git\", \"Skip git operations\")\n .option(\"--config <path>\", \"Path to config file\")\n .option(\"--concurrency <n>\", \"Override concurrency\")\n .action(async (opts: BuildAllOptions) => {\n const configPath =\n opts.config ?? findDefaultConfigPath(process.cwd());\n\n const { config, configDir } = await loadConfig(configPath);\n\n const rawOpts = opts as Record<string, unknown>;\n const shouldPublish = rawOpts[\"publish\"] !== false;\n\n const buildOptions: BuildOptions = {\n dryRun: opts.dryRun ?? false,\n noPublish: !shouldPublish,\n noGit: opts.noGit ?? false,\n concurrency: opts.concurrency ? parseInt(opts.concurrency, 10) : undefined,\n configPath,\n };\n\n const concurrency = buildOptions.concurrency ?? config.settings.concurrency ?? 4;\n\n const allResults: BuildResult[] = [];\n\n // Build all standalone packages in parallel\n const standalone = config.standalone ?? [];\n if (standalone.length > 0) {\n logger.info(`Building ${standalone.length} standalone package(s)…`);\n const standaloneTasks = standalone.map(\n (pkg) => () =>\n buildPackage(\n pkg,\n pkg.version ?? \"auto\",\n config.settings,\n buildOptions,\n configDir,\n ),\n );\n const standaloneResults = await runParallel(standaloneTasks, concurrency);\n allResults.push(...standaloneResults);\n }\n\n // Build all families sequentially (families share a version; running\n // multiple families in parallel is fine since they're independent)\n const families = config.families ?? [];\n if (families.length > 0) {\n logger.info(`Building ${families.length} famil${families.length === 1 ? \"y\" : \"ies\"}…`);\n for (const family of families) {\n const familyResults = await buildFamily(\n family,\n config.settings,\n buildOptions,\n configDir,\n );\n allResults.push(...familyResults);\n }\n }\n\n const succeeded = allResults.filter((r) => r.success).length;\n const failed = allResults.filter((r) => !r.success).length;\n\n logger.info(`\\nSummary: ${succeeded} succeeded, ${failed} failed out of ${allResults.length} total`);\n process.exit(failed > 0 ? 1 : 0);\n });\n}\n","import type { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { loadConfig, findDefaultConfigPath } from \"../config/index.js\";\nimport { readSourcePackageJson } from \"../files/package-json.js\";\nimport { resolvePath } from \"../utils/paths.js\";\n\ninterface ListOptions {\n config?: string;\n}\n\nexport function registerListCommand(program: Command): void {\n program\n .command(\"list\")\n .description(\"List all registered standalone packages and families.\")\n .option(\"--config <path>\", \"Path to config file\")\n .action(async (opts: ListOptions) => {\n const configPath = opts.config ?? findDefaultConfigPath(process.cwd());\n const { config, configDir } = await loadConfig(configPath);\n\n const standalone = config.standalone ?? [];\n const families = config.families ?? [];\n\n console.log(chalk.bold(\"\\n=== Standalone Packages ===\"));\n if (standalone.length === 0) {\n console.log(chalk.gray(\" (none)\"));\n } else {\n for (const pkg of standalone) {\n const root = resolvePath(configDir, pkg.root);\n let version = \"?\";\n try {\n const json = readSourcePackageJson(root, pkg.name);\n version = json.version;\n } catch {\n version = chalk.red(\"(package.json missing)\");\n }\n const type = pkg.type ?? \"typescript\";\n const formats = (pkg.formats ?? [\"esm\", \"cjs\"]).join(\", \");\n console.log(\n ` ${chalk.cyan(pkg.name)} ${chalk.yellow(`v${version}`)}` +\n chalk.gray(` [${type}] [${formats}]`),\n );\n console.log(chalk.gray(` root: ${root}`));\n }\n }\n\n console.log(chalk.bold(\"\\n=== Families ===\"));\n if (families.length === 0) {\n console.log(chalk.gray(\" (none)\"));\n } else {\n for (const family of families) {\n console.log(chalk.bold(`\\n Family: ${chalk.magenta(family.name)}`));\n for (const pkg of family.packages) {\n const root = resolvePath(configDir, pkg.root);\n let version = \"?\";\n try {\n const json = readSourcePackageJson(root, pkg.name);\n version = json.version;\n } catch {\n version = chalk.red(\"(package.json missing)\");\n }\n const type = pkg.type ?? \"typescript\";\n const formats = (pkg.formats ?? [\"esm\", \"cjs\"]).join(\", \");\n console.log(\n ` ${chalk.cyan(pkg.name)} ${chalk.yellow(`v${version}`)}` +\n chalk.gray(` [${type}] [${formats}]`),\n );\n console.log(chalk.gray(` root: ${root}`));\n }\n }\n }\n\n console.log(\"\");\n });\n}\n","import type { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport fs from \"fs\";\nimport { loadConfig, findDefaultConfigPath } from \"../config/index.js\";\nimport { resolvePath } from \"../utils/paths.js\";\nimport { logger } from \"../utils/logger.js\";\n\ninterface ValidateOptions {\n config?: string;\n}\n\ninterface ValidationIssue {\n level: \"error\" | \"warn\";\n message: string;\n}\n\nexport function registerValidateCommand(program: Command): void {\n program\n .command(\"validate\")\n .description(\"Validate the config file and check that all package roots exist.\")\n .option(\"--config <path>\", \"Path to config file\")\n .action(async (opts: ValidateOptions) => {\n const configPath = opts.config ?? findDefaultConfigPath(process.cwd());\n\n let config: Awaited<ReturnType<typeof loadConfig>>[\"config\"];\n let configDir: string;\n\n try {\n const loaded = await loadConfig(configPath);\n config = loaded.config;\n configDir = loaded.configDir;\n } catch (err) {\n logger.error(\n `Config load failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n process.exit(1);\n }\n\n const issues: ValidationIssue[] = [];\n\n // Check all package roots exist\n const allPackages = [\n ...(config.standalone ?? []).map((p) => ({\n name: p.name,\n root: p.root,\n context: \"standalone\",\n })),\n ...(config.families ?? []).flatMap((f) =>\n f.packages.map((p) => ({\n name: p.name,\n root: p.root,\n context: `family:${f.name}`,\n })),\n ),\n ];\n\n for (const { name, root, context } of allPackages) {\n const abs = resolvePath(configDir, root);\n if (!fs.existsSync(abs)) {\n issues.push({\n level: \"error\",\n message: `[${context}] \"${name}\": root does not exist — ${abs}`,\n });\n continue;\n }\n\n const pkgJsonPath = resolvePath(abs, \"package.json\");\n if (!fs.existsSync(pkgJsonPath)) {\n issues.push({\n level: \"error\",\n message: `[${context}] \"${name}\": package.json not found at ${pkgJsonPath}`,\n });\n continue;\n }\n\n try {\n const raw = fs.readFileSync(pkgJsonPath, \"utf-8\");\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n if (!parsed[\"version\"]) {\n issues.push({\n level: \"error\",\n message: `[${context}] \"${name}\": package.json is missing \"version\" field`,\n });\n }\n } catch (err) {\n issues.push({\n level: \"error\",\n message: `[${context}] \"${name}\": failed to parse package.json — ${\n err instanceof Error ? err.message : String(err)\n }`,\n });\n }\n }\n\n // Check buildDir\n const buildDir = resolvePath(configDir, config.settings.buildDir);\n if (!fs.existsSync(buildDir)) {\n issues.push({\n level: \"warn\",\n message: `settings.buildDir does not exist yet and will be created on first build: ${buildDir}`,\n });\n }\n\n // Print results\n if (issues.length === 0) {\n console.log(chalk.green(`Config is valid. ${allPackages.length} package(s) found.`));\n process.exit(0);\n } else {\n const errors = issues.filter((i) => i.level === \"error\");\n const warnings = issues.filter((i) => i.level === \"warn\");\n\n for (const issue of warnings) {\n console.log(chalk.yellow(`WARN ${issue.message}`));\n }\n for (const issue of errors) {\n console.log(chalk.red(`ERROR ${issue.message}`));\n }\n\n console.log(\n `\\n${errors.length} error(s), ${warnings.length} warning(s) found.`,\n );\n process.exit(errors.length > 0 ? 1 : 0);\n }\n });\n}\n"],"mappings":"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","names":["path","path","path","fs","path","fs","path","fs","fs","path","fs","fs","path","r","program","semver","semver","program","program","chalk","program","chalk","chalk","fs","program","fs","chalk","__dirname","path"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/config/load-config.ts","../src/utils/paths.ts","../src/utils/errors.ts","../src/files/file-manager.ts","../src/files/package-json.ts","../src/files/clone-files.ts","../src/utils/logger.ts","../src/compile/tsdown-compiler.ts","../src/version/increment.ts","../src/git/operations.ts","../src/utils/exec.ts","../src/publish/npm-publisher.ts","../src/build/package-builder.ts","../src/build/parallel-builder.ts","../src/commands/build.ts","../src/build/family-builder.ts","../src/commands/build-family.ts","../src/commands/build-all.ts","../src/commands/list.ts","../src/commands/validate.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from \"commander\";\nimport { readFileSync } from \"fs\";\nimport { fileURLToPath } from \"url\";\nimport path from \"path\";\nimport {\n registerBuildCommand,\n registerBuildFamilyCommand,\n registerBuildAllCommand,\n registerListCommand,\n registerValidateCommand,\n} from \"./commands/index.js\";\nimport { setVerbose } from \"./utils/logger.js\";\n\n// Resolve package.json version without importing it (works with ESM)\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nlet cliVersion = \"1.0.0\";\ntry {\n const pkgPath = path.resolve(__dirname, \"../package.json\");\n const raw = readFileSync(pkgPath, \"utf-8\");\n const pkg = JSON.parse(raw) as { version?: string };\n cliVersion = pkg.version ?? \"1.0.0\";\n} catch {\n // fallback to hardcoded version\n}\n\nconst program = new Command();\n\nprogram\n .name(\"pkgist\")\n .description(\"Build, version, and publish TypeScript npm packages using tsdown.\")\n .version(cliVersion)\n .option(\"--verbose\", \"Enable verbose debug logging\", false)\n .hook(\"preAction\", (thisCommand) => {\n const opts = thisCommand.opts() as { verbose?: boolean };\n if (opts.verbose) {\n setVerbose(true);\n }\n });\n\n// Register all subcommands\nregisterBuildCommand(program);\nregisterBuildFamilyCommand(program);\nregisterBuildAllCommand(program);\nregisterListCommand(program);\nregisterValidateCommand(program);\n\nprogram.parseAsync(process.argv).catch((err: unknown) => {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n});\n","import path from \"path\";\nimport { pathToFileURL } from \"url\";\nimport fs from \"fs\";\nimport type { BundlerConfig } from \"../types/index.js\";\nimport { resolvePath } from \"../utils/paths.js\";\nimport { wrapError } from \"../utils/errors.js\";\n\nexport interface LoadedConfig {\n config: BundlerConfig;\n /** Absolute, forward-slash normalised path to the config file */\n configPath: string;\n /** Directory containing the config file — used to resolve relative roots */\n configDir: string;\n}\n\n/**\n * Register tsx as a Node loader so TypeScript config files can be imported\n * directly via dynamic import(). Safe to call multiple times — tsx is only\n * registered once. No-ops when tsx is not installed (JS-only config still works).\n */\nasync function ensureTsxRegistered(): Promise<void> {\n try {\n const { register } = await import(\"node:module\");\n let tsxUrl: string | null = null;\n try {\n tsxUrl = import.meta.resolve(\"tsx/esm\");\n } catch {\n // tsx not installed — JS-only configs still work fine\n }\n if (register && tsxUrl) {\n register(tsxUrl, import.meta.url);\n }\n } catch {\n // node:module unavailable (old Node) — fall through silently\n }\n}\n\n/** Load and validate a pkgist config file (TypeScript or JavaScript). */\nexport async function loadConfig(configFilePath: string): Promise<LoadedConfig> {\n const absolute = resolvePath(configFilePath);\n\n if (!fs.existsSync(absolute)) {\n throw new Error(`Config file not found: ${absolute}`);\n }\n\n let mod: { default?: BundlerConfig };\n\n try {\n // Register tsx so .ts config files import without the user needing\n // to prefix the command with `node --import tsx/esm`.\n if (absolute.endsWith(\".ts\")) {\n await ensureTsxRegistered();\n }\n\n // Convert to a file:// URL so dynamic import works correctly on Windows.\n const fileUrl = pathToFileURL(absolute).href;\n mod = await import(fileUrl);\n } catch (err) {\n throw wrapError(\"load-config\", absolute, err);\n }\n\n const config = mod.default;\n\n if (!config || typeof config !== \"object\") {\n throw new Error(\n `Config file ${absolute} must export a default object from defineConfig(). Got: ${typeof config}`,\n );\n }\n\n validateConfig(config, absolute);\n\n return {\n config,\n configPath: absolute,\n configDir: resolvePath(path.dirname(absolute)),\n };\n}\n\nfunction validateConfig(config: BundlerConfig, filePath: string): void {\n if (!config.settings) {\n throw new Error(`Config \"${filePath}\" must have a \"settings\" object.`);\n }\n if (!config.settings.buildDir) {\n throw new Error(`Config \"${filePath}\" settings.buildDir is required.`);\n }\n\n const names = new Set<string>();\n\n for (const pkg of config.standalone ?? []) {\n if (!pkg.name) throw new Error(`Standalone package is missing \"name\" in ${filePath}`);\n if (!pkg.root) throw new Error(`Standalone package \"${pkg.name}\" is missing \"root\"`);\n if (names.has(pkg.name)) throw new Error(`Duplicate package name: \"${pkg.name}\"`);\n names.add(pkg.name);\n }\n\n for (const family of config.families ?? []) {\n if (!family.name) throw new Error(`A family is missing \"name\" in ${filePath}`);\n for (const pkg of family.packages) {\n if (!pkg.name) throw new Error(`Package inside family \"${family.name}\" is missing \"name\"`);\n if (!pkg.root) throw new Error(`Package \"${pkg.name}\" in family \"${family.name}\" is missing \"root\"`);\n if (names.has(pkg.name)) throw new Error(`Duplicate package name: \"${pkg.name}\"`);\n names.add(pkg.name);\n }\n }\n}\n\n/**\n * Attempt to find the default config file in the working directory.\n * Tries: builder.ts, builder.js, mongez.ts, mongez.js\n */\nexport function findDefaultConfigPath(cwd: string): string {\n const candidates = [\"pkgist.config.ts\", \"pkgist.config.js\", \"builder.ts\", \"builder.js\", \"mongez.ts\", \"mongez.js\"];\n for (const candidate of candidates) {\n const full = path.join(cwd, candidate);\n if (fs.existsSync(full)) return full;\n }\n throw new Error(\n `No config file found in ${cwd}. Tried: ${candidates.join(\", \")}. ` +\n `Use --config <path> to specify a custom location.`,\n );\n}\n","import path from \"path\";\n\n/** Normalise any path to forward-slash form (Windows-safe). */\nexport function toForwardSlash(p: string): string {\n return p.replace(/\\\\/g, \"/\");\n}\n\n/** Join path segments and normalise the result to forward slashes. */\nexport function joinPath(...segments: string[]): string {\n return toForwardSlash(path.join(...segments));\n}\n\n/** Resolve an absolute path from segments and normalise to forward slashes. */\nexport function resolvePath(...segments: string[]): string {\n return toForwardSlash(path.resolve(...segments));\n}\n\n/**\n * Given a package name like \"@mongez/reinforcements\",\n * return just the scoped part without the scope prefix: \"reinforcements\".\n */\nexport function scopelessName(packageName: string): string {\n const slash = packageName.indexOf(\"/\");\n return slash === -1 ? packageName : packageName.slice(slash + 1);\n}\n\n/**\n * Build the versioned build output path:\n * <buildDir>/<scopeless-name>/<version>/\n */\nexport function buildOutputPath(\n buildDir: string,\n packageName: string,\n version: string,\n): string {\n return joinPath(buildDir, scopelessName(packageName), version);\n}\n\n/**\n * Build the sources snapshot path:\n * <sourcesDir>/<scopeless-name>/\n */\nexport function sourceSnapshotPath(\n sourcesDir: string,\n packageName: string,\n): string {\n return joinPath(sourcesDir, scopelessName(packageName));\n}\n","/** Base error class for all bundler errors. Carries a step name for structured logging. */\nexport class BundlerError extends Error {\n constructor(\n public readonly step: string,\n public readonly packageName: string,\n message: string,\n public readonly cause?: unknown,\n ) {\n super(message);\n this.name = \"BundlerError\";\n if (cause instanceof Error && cause.stack) {\n this.stack = `${this.stack}\\nCaused by: ${cause.stack}`;\n }\n }\n}\n\n/** Wrap any thrown value into a BundlerError with context. */\nexport function wrapError(\n step: string,\n packageName: string,\n error: unknown,\n): BundlerError {\n if (error instanceof BundlerError) return error;\n const msg =\n error instanceof Error\n ? error.message\n : typeof error === \"string\"\n ? error\n : JSON.stringify(error);\n return new BundlerError(step, packageName, `[${step}] ${packageName}: ${msg}`, error);\n}\n\n/** Throw a wrapped error immediately. */\nexport function failWith(\n step: string,\n packageName: string,\n error: unknown,\n): never {\n throw wrapError(step, packageName, error);\n}\n","import fs from \"fs\";\nimport path from \"path\";\nimport { resolvePath, joinPath } from \"../utils/paths.js\";\nimport { wrapError } from \"../utils/errors.js\";\n\n/**\n * Ensure a directory exists, creating all intermediate directories as needed.\n */\nexport function ensureDir(dir: string): void {\n try {\n fs.mkdirSync(dir, { recursive: true });\n } catch (err) {\n throw wrapError(\"ensure-dir\", dir, err);\n }\n}\n\n/**\n * Copy a single file from src to dest.\n * Creates the destination directory if it does not exist.\n */\nexport function copyFile(src: string, dest: string): void {\n ensureDir(path.dirname(dest));\n try {\n fs.copyFileSync(src, dest);\n } catch (err) {\n throw wrapError(\"copy-file\", src, err);\n }\n}\n\n/** Directories that are never copied in any directory tree operation. */\nconst COPY_EXCLUDES = new Set([\".git\", \"node_modules\", \"dist\", \".turbo\", \".cache\"]);\n\n/**\n * Copy an entire directory tree recursively, skipping .git and node_modules.\n */\nexport function copyDir(src: string, dest: string): void {\n ensureDir(dest);\n const entries = fs.readdirSync(src, { withFileTypes: true });\n for (const entry of entries) {\n if (COPY_EXCLUDES.has(entry.name)) continue;\n const srcPath = joinPath(src, entry.name);\n const destPath = joinPath(dest, entry.name);\n if (entry.isDirectory()) {\n copyDir(srcPath, destPath);\n } else {\n copyFile(srcPath, destPath);\n }\n }\n}\n\n/**\n * Read a file as a UTF-8 string, or throw a BundlerError with context.\n */\nexport function readFile(filePath: string, packageName = filePath): string {\n try {\n return fs.readFileSync(filePath, \"utf-8\");\n } catch (err) {\n throw wrapError(\"read-file\", packageName, err);\n }\n}\n\n/**\n * Write a UTF-8 string to a file, creating intermediate directories.\n */\nexport function writeFile(filePath: string, content: string, packageName = filePath): void {\n ensureDir(path.dirname(filePath));\n try {\n fs.writeFileSync(filePath, content, \"utf-8\");\n } catch (err) {\n throw wrapError(\"write-file\", packageName, err);\n }\n}\n\n/**\n * Move all files matching a glob-like condition.\n * Actually does a rename — works only within the same filesystem volume.\n */\nexport function moveFile(src: string, dest: string, packageName = src): void {\n ensureDir(path.dirname(dest));\n try {\n fs.renameSync(src, dest);\n } catch (err) {\n // rename across devices fails — fall back to copy+unlink\n try {\n fs.copyFileSync(src, dest);\n fs.unlinkSync(src);\n } catch (fallbackErr) {\n throw wrapError(\"move-file\", packageName, fallbackErr);\n }\n }\n}\n\n/**\n * Check whether a path exists on the filesystem.\n */\nexport function pathExists(p: string): boolean {\n return fs.existsSync(p);\n}\n\n/**\n * List all file paths inside a directory (non-recursive).\n */\nexport function listFiles(dir: string): string[] {\n if (!fs.existsSync(dir)) return [];\n return fs\n .readdirSync(dir, { withFileTypes: true })\n .filter((e) => e.isFile())\n .map((e) => joinPath(dir, e.name));\n}\n","import path from \"path\";\nimport { readFile, writeFile } from \"./file-manager.js\";\nimport { joinPath } from \"../utils/paths.js\";\nimport { wrapError } from \"../utils/errors.js\";\nimport type { PackageBase } from \"../types/index.js\";\n\n// Fields kept verbatim from the source package.json into the build package.json.\nconst KEPT_FIELDS = [\n \"name\",\n \"description\",\n \"keywords\",\n \"author\",\n \"license\",\n \"repository\",\n \"homepage\",\n \"bugs\",\n \"dependencies\",\n \"peerDependencies\",\n \"sideEffects\",\n \"bin\",\n \"engines\",\n] as const;\n\nexport type SourcePackageJson = Record<string, unknown> & {\n version: string;\n dependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n};\n\n/**\n * Read and parse the package.json at <packageRoot>/package.json.\n * Throws a BundlerError if the file is missing or malformed.\n */\nexport function readSourcePackageJson(\n packageRoot: string,\n packageName: string,\n): SourcePackageJson {\n const pkgPath = joinPath(packageRoot, \"package.json\");\n let raw: string;\n try {\n raw = readFile(pkgPath, packageName);\n } catch {\n throw wrapError(\n \"read-package-json\",\n packageName,\n new Error(`package.json not found at ${pkgPath}`),\n );\n }\n\n try {\n const parsed = JSON.parse(raw) as SourcePackageJson;\n if (!parsed.version) {\n throw new Error(`package.json at ${pkgPath} is missing \"version\" field`);\n }\n return parsed;\n } catch (err) {\n throw wrapError(\"parse-package-json\", packageName, err);\n }\n}\n\n/**\n * Write the new version back into the source package.json.\n */\nexport function writeSourceVersion(\n packageRoot: string,\n packageName: string,\n newVersion: string,\n): void {\n const pkgPath = joinPath(packageRoot, \"package.json\");\n const raw = readFile(pkgPath, packageName);\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n parsed.version = newVersion;\n writeFile(pkgPath, JSON.stringify(parsed, null, 2) + \"\\n\", packageName);\n}\n\n/**\n * Build and write the clean package.json for the build output directory.\n */\nexport function writeBuildPackageJson(\n pkg: PackageBase,\n sourceJson: SourcePackageJson,\n buildPath: string,\n newVersion: string,\n): void {\n const formats = pkg.formats ?? [\"esm\", \"cjs\"];\n const hasEsm = formats.includes(\"esm\");\n const hasCjs = formats.includes(\"cjs\");\n const esmOnly = hasEsm && !hasCjs;\n\n // When preserveModules is on (the default), tsdown keeps one file per source\n // module and uses native extensions (.mjs/.cjs) so internal cross-file imports\n // resolve correctly. When bundling, everything is renamed to .js for simplicity.\n const preserve = pkg.preserveModules !== false;\n const esmExt = preserve ? \".mjs\" : \".js\";\n const cjsExt = preserve ? \".cjs\" : \".js\";\n const esmDts = preserve ? \".d.mts\" : \".d.ts\";\n const cjsDts = preserve ? \".d.cts\" : \".d.ts\";\n\n // Determine entry base names from entries config\n const rawEntries = pkg.entries ?? [\"index.ts\"];\n const entryList = Array.isArray(rawEntries) ? rawEntries : [rawEntries];\n\n /**\n * Convert an entry path (relative to srcDir) into:\n * basePath — path without extension, used to build file paths (e.g. \"cli/index\")\n * exportPath — the key in the exports map (e.g. \"./cli\")\n *\n * When the basename is \"index\" the directory becomes the export path so that\n * `cli/index.ts` maps to `\"./cli\"` and `index.ts` maps to `\".\"`.\n */\n function entryPaths(entry: string): { basePath: string; exportPath: string } {\n const basePath = entry.replace(/\\.tsx?$/, \"\");\n const parts = basePath.split(\"/\");\n const last = parts[parts.length - 1];\n let exportPath: string;\n if (last === \"index\") {\n const dir = parts.slice(0, -1).join(\"/\");\n exportPath = dir ? `./${dir}` : \".\";\n } else {\n exportPath = `./${basePath}`;\n }\n return { basePath, exportPath };\n }\n\n // Primary entry drives `main` / `module` / `types` fields.\n const { basePath: primaryBase } = entryPaths(entryList[0]!);\n\n // Build the full exports map — one condition block per entry.\n const exportsMap: Record<string, unknown> = {};\n\n for (const entry of entryList) {\n const { basePath, exportPath } = entryPaths(entry);\n const conditions: Record<string, unknown> = {};\n\n if (hasEsm) {\n conditions[\"import\"] = {\n types: `./esm/${basePath}${esmDts}`,\n default: `./esm/${basePath}${esmExt}`,\n };\n }\n if (hasCjs) {\n // When preserveModules is on, CJS is built without DTS to avoid a rolldown bug.\n // TypeScript resolves types correctly from the ESM declarations via the exports map.\n const cjsTypes = preserve && hasEsm\n ? `./esm/${basePath}${esmDts}`\n : `./cjs/${basePath}${cjsDts}`;\n conditions[\"require\"] = {\n types: cjsTypes,\n default: `./cjs/${basePath}${cjsExt}`,\n };\n }\n\n exportsMap[exportPath] = conditions;\n }\n\n const output: Record<string, unknown> = {};\n\n // Copy allowed fields from source\n for (const field of KEPT_FIELDS) {\n if (field in sourceJson && sourceJson[field] !== undefined) {\n output[field] = sourceJson[field];\n }\n }\n\n // Override name / version\n output[\"name\"] = pkg.name;\n output[\"version\"] = newVersion;\n\n if (esmOnly) {\n output[\"type\"] = \"module\";\n }\n\n // Entry points\n const mainType = pkg.mainType ?? \"cjs\";\n if (mainType === \"esm\" || esmOnly) {\n output[\"main\"] = `./esm/${primaryBase}${esmExt}`;\n } else {\n output[\"main\"] = `./cjs/${primaryBase}${cjsExt}`;\n }\n\n if (hasEsm) {\n output[\"module\"] = `./esm/${primaryBase}${esmExt}`;\n }\n\n output[\"types\"] = `./esm/${primaryBase}${esmDts}`;\n\n output[\"exports\"] = exportsMap;\n\n const pkgPath = joinPath(buildPath, \"package.json\");\n writeFile(pkgPath, JSON.stringify(output, null, 2) + \"\\n\", pkg.name);\n}\n","import fs from \"fs\";\nimport { copyFile, copyDir, pathExists } from \"./file-manager.js\";\nimport { joinPath } from \"../utils/paths.js\";\nimport { logger } from \"../utils/logger.js\";\n\n/**\n * Clone extra files (README, license, etc.) from the package root into the build directory.\n *\n * Each entry in the `clone` array can be:\n * - a plain string: copied from `<packageRoot>/<str>` to `<buildDir>/<str>`\n * - a tuple [src, dest]: copied from `<packageRoot>/<src>` to `<buildDir>/<dest>`\n */\nexport function cloneFiles(\n packageRoot: string,\n buildDir: string,\n cloneList: (string | [string, string])[],\n packageName: string,\n dryRun: boolean,\n): void {\n for (const entry of cloneList) {\n const [srcRel, destRel] =\n typeof entry === \"string\" ? [entry, entry] : entry;\n\n const src = joinPath(packageRoot, srcRel);\n const dest = joinPath(buildDir, destRel);\n\n if (!pathExists(src)) {\n logger.warn(`[clone-files] ${packageName}: source file not found, skipping — ${src}`);\n continue;\n }\n\n if (dryRun) {\n logger.info(`[dry-run] clone ${src} → ${dest}`);\n continue;\n }\n\n const stat = fs.statSync(src);\n if (stat.isDirectory()) {\n copyDir(src, dest);\n } else {\n copyFile(src, dest);\n }\n logger.debug(`Cloned ${src} → ${dest}`);\n }\n}\n","import chalk from \"chalk\";\n\nexport type LogLevel = \"info\" | \"success\" | \"warn\" | \"error\" | \"debug\" | \"step\";\n\nlet _verbose = false;\n\nexport function setVerbose(v: boolean): void {\n _verbose = v;\n}\n\nexport function log(level: LogLevel, message: string): void {\n const ts = new Date().toISOString().replace(\"T\", \" \").replace(\"Z\", \"\");\n switch (level) {\n case \"info\":\n console.log(chalk.cyan(`[${ts}] INFO ${message}`));\n break;\n case \"success\":\n console.log(chalk.green(`[${ts}] OK ${message}`));\n break;\n case \"warn\":\n console.warn(chalk.yellow(`[${ts}] WARN ${message}`));\n break;\n case \"error\":\n console.error(chalk.red(`[${ts}] ERROR ${message}`));\n break;\n case \"step\":\n console.log(chalk.blueBright(`[${ts}] STEP ${message}`));\n break;\n case \"debug\":\n if (_verbose) {\n console.log(chalk.gray(`[${ts}] DEBUG ${message}`));\n }\n break;\n }\n}\n\nexport const logger = {\n info: (msg: string) => log(\"info\", msg),\n success: (msg: string) => log(\"success\", msg),\n warn: (msg: string) => log(\"warn\", msg),\n error: (msg: string) => log(\"error\", msg),\n step: (msg: string) => log(\"step\", msg),\n debug: (msg: string) => log(\"debug\", msg),\n};\n","import path from \"path\";\nimport fs from \"fs\";\nimport { build } from \"tsdown\";\nimport type { InputOptions } from \"rolldown\";\nimport type { PackageBase } from \"../types/index.js\";\nimport { joinPath, toForwardSlash, resolvePath } from \"../utils/paths.js\";\nimport { ensureDir, moveFile, listFiles, pathExists } from \"../files/file-manager.js\";\nimport { wrapError } from \"../utils/errors.js\";\nimport { logger } from \"../utils/logger.js\";\n\n// ─── Helpers ───────────────────────────────────────────────────────────────\n\n/**\n * Collect all dependency names that should be treated as external.\n * Both `dependencies` and `peerDependencies` must never be bundled.\n */\nfunction collectExternals(sourceJson: Record<string, unknown>): string[] {\n const deps = Object.keys((sourceJson[\"dependencies\"] as Record<string, string> | undefined) ?? {});\n const peers = Object.keys((sourceJson[\"peerDependencies\"] as Record<string, string> | undefined) ?? {});\n return [...new Set([...deps, ...peers])];\n}\n\n/**\n * Resolve entry file paths to absolute forward-slash paths.\n */\nfunction resolveEntries(pkg: PackageBase, packageRoot: string): string[] {\n const srcDir = pkg.srcDir ?? \"src\";\n const rawEntries = pkg.entries ?? [\"index.ts\"];\n const entryList = Array.isArray(rawEntries) ? rawEntries : [rawEntries];\n return entryList.map((e) => toForwardSlash(resolvePath(packageRoot, srcDir, e)));\n}\n\n/**\n * Return the path to the tsconfig.json inside the package root, if it exists.\n */\nfunction findTsconfig(packageRoot: string): string | undefined {\n const local = joinPath(packageRoot, \"tsconfig.json\");\n return pathExists(local) ? local : undefined;\n}\n\n// ─── Main compiler ──────────────────────────────────────────────────────────\n\n/**\n * Compile a single package using tsdown.\n *\n * When `preserveModules` is on (the default), we run two separate tsdown builds\n * in parallel so that each format's output options are fully independent:\n *\n * ESM build — preserveModules: true, dts: true → _tmp_esm/ → esm/*.mjs + *.d.mts\n * CJS build — preserveModules: false, dts: false → _tmp_cjs/ → cjs/*.cjs\n *\n * CJS skips DTS because rolldown has a bug in CJS preserveModules mode where\n * `export { default as X }` assigns the whole module object to exports.X instead\n * of unwrapping .default. Bundled CJS has no such issue. Types are shared from\n * the ESM declarations (TypeScript resolves them correctly via the exports map).\n *\n * When `preserveModules` is false, a single combined build is used.\n */\nexport async function compilePackage(\n pkg: PackageBase,\n packageRoot: string,\n buildPath: string,\n sourceJson: Record<string, unknown>,\n dryRun: boolean,\n): Promise<void> {\n if (dryRun) {\n logger.info(`[dry-run] compile ${pkg.name} → ${buildPath}`);\n return;\n }\n\n const entries = resolveEntries(pkg, packageRoot);\n const formats = pkg.formats ?? [\"esm\", \"cjs\"];\n const externals = collectExternals(sourceJson);\n const tsconfig = findTsconfig(packageRoot);\n const shouldPreserveModules = pkg.preserveModules !== false;\n const srcDir = toForwardSlash(resolvePath(packageRoot, pkg.srcDir ?? \"src\"));\n\n logger.step(`Compiling ${pkg.name} (${formats.join(\", \")}) → ${buildPath}`);\n logger.debug(` entries: ${entries.join(\", \")}`);\n logger.debug(` externals: ${externals.slice(0, 8).join(\", \")}${externals.length > 8 ? \"…\" : \"\"}`);\n\n // Wipe any previous esm/ and cjs/ output so re-runs of the same version don't\n // leave stale files from a different build mode.\n for (const subDir of [\"esm\", \"cjs\"]) {\n const dir = resolvePath(buildPath, subDir);\n if (fs.existsSync(dir)) {\n fs.rmSync(dir, { recursive: true, force: true });\n }\n }\n\n // Build inputOptions for rolldown — used to set the JSX transform for React packages.\n const rolldownInputOptions: InputOptions | undefined =\n pkg.type === \"react\"\n ? {\n transform: {\n jsx: \"react-jsx\", // automatic runtime — works with React 17+\n },\n }\n : undefined;\n\n // Common options shared across all tsdown invocations.\n const sharedOptions = {\n entry: entries,\n deps: { neverBundle: externals },\n sourcemap: pkg.sourcemap !== false,\n clean: true,\n minify: pkg.minify ?? false,\n tsconfig: tsconfig ?? true,\n ...(rolldownInputOptions ? { inputOptions: rolldownInputOptions } : {}),\n } as const;\n\n try {\n if (shouldPreserveModules && formats.includes(\"esm\") && formats.includes(\"cjs\")) {\n // Two parallel builds: ESM with preserveModules + DTS, CJS bundled without DTS.\n const tmpEsm = toForwardSlash(resolvePath(buildPath, \"_tmp_esm\"));\n const tmpCjs = toForwardSlash(resolvePath(buildPath, \"_tmp_cjs\"));\n ensureDir(tmpEsm);\n ensureDir(tmpCjs);\n\n await Promise.all([\n build({\n ...sharedOptions,\n format: [\"esm\"],\n dts: pkg.dts !== false,\n outDir: tmpEsm,\n outputOptions: {\n preserveModules: true,\n preserveModulesRoot: srcDir,\n },\n }),\n build({\n ...sharedOptions,\n format: [\"cjs\"],\n // CJS skips DTS — types are served from ESM declarations (see package-json.ts).\n dts: false,\n outDir: tmpCjs,\n }),\n ]);\n\n reorganiseOutput(tmpEsm, buildPath, [\"esm\"], pkg, true);\n // keepNativeExtension=true: CJS files come out as .cjs from tsdown; we keep that\n // extension so the exports map (./cjs/index.cjs) resolves correctly.\n reorganiseOutput(tmpCjs, buildPath, [\"cjs\"], pkg, false, true);\n rmTmp(tmpEsm);\n rmTmp(tmpCjs);\n } else {\n // Single build: either one format only, or preserveModules disabled.\n const tmpDir = toForwardSlash(resolvePath(buildPath, \"_tmp\"));\n ensureDir(tmpDir);\n\n await build({\n ...sharedOptions,\n format: formats as (\"esm\" | \"cjs\")[],\n dts: pkg.dts !== false,\n outDir: tmpDir,\n ...(shouldPreserveModules && formats.includes(\"esm\")\n ? { outputOptions: { preserveModules: true, preserveModulesRoot: srcDir } }\n : {}),\n });\n\n reorganiseOutput(tmpDir, buildPath, formats as (\"esm\" | \"cjs\")[], pkg, shouldPreserveModules);\n rmTmp(tmpDir);\n }\n } catch (err) {\n throw wrapError(\"tsdown-build\", pkg.name, err);\n }\n\n logger.success(`Compiled ${pkg.name}`);\n}\n\nfunction rmTmp(dir: string): void {\n try {\n fs.rmSync(dir, { recursive: true, force: true });\n } catch {\n // non-fatal — stale tmp is harmless\n }\n}\n\n// ─── Output reorganisation ──────────────────────────────────────────────────\n\n/**\n * Move the flat tsdown output (in tmpDir) into `esm/` and `cjs/` subdirectories\n * under buildPath. Renames .mjs → .js and .cjs → .js so that relative imports\n * inside each format directory resolve correctly.\n */\nfunction reorganiseOutput(\n tmpDir: string,\n buildPath: string,\n formats: (\"esm\" | \"cjs\")[],\n pkg: PackageBase,\n preserveModules: boolean,\n keepNativeExtension = false,\n): void {\n const esmDir = joinPath(buildPath, \"esm\");\n const cjsDir = joinPath(buildPath, \"cjs\");\n\n if (formats.includes(\"esm\")) ensureDir(esmDir);\n if (formats.includes(\"cjs\")) ensureDir(cjsDir);\n\n const mainType = pkg.mainType ?? (formats.includes(\"cjs\") ? \"cjs\" : \"esm\");\n\n processDirectory(tmpDir, { esmDir, cjsDir, formats, mainType, pkg, tmpDir, preserveModules, keepNativeExtension });\n}\n\ninterface ReorgContext {\n esmDir: string;\n cjsDir: string;\n formats: (\"esm\" | \"cjs\")[];\n mainType: \"esm\" | \"cjs\";\n pkg: PackageBase;\n /** Absolute path to the flat _tmp/ directory — used to compute relative paths when preserveModules is on. */\n tmpDir: string;\n preserveModules: boolean;\n /**\n * When true, keep the native .mjs/.cjs extensions instead of normalising to .js.\n * Used in the CJS-only leg of the two-build path so the final file stays .cjs.\n */\n keepNativeExtension: boolean;\n}\n\nfunction processDirectory(dir: string, ctx: ReorgContext): void {\n if (!fs.existsSync(dir)) return;\n\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = joinPath(dir, entry.name);\n if (entry.isDirectory()) {\n // Recursively handle subdirectories (chunk splits, etc.)\n processDirectory(fullPath, ctx);\n } else {\n processFile(fullPath, entry.name, ctx);\n }\n }\n}\n\nfunction processFile(filePath: string, name: string, ctx: ReorgContext): void {\n const { esmDir, cjsDir, formats, mainType, pkg, tmpDir, preserveModules } = ctx;\n\n // Relative subdirectory from the tmp root — preserves folder structure for both\n // preserveModules output and multi-entry single-bundle output (where each entry\n // lands in its own subdirectory, e.g. cli/index.cjs).\n // path.relative may return backslashes on Windows — normalise to forward slashes.\n const relDir = toForwardSlash(path.relative(tmpDir, path.dirname(filePath)));\n\n if (preserveModules) {\n if (isEsmFile(name)) {\n if (formats.includes(\"esm\")) {\n moveFile(filePath, joinPath(esmDir, relDir, name), pkg.name);\n }\n } else if (isCjsFile(name)) {\n if (formats.includes(\"cjs\")) {\n moveFile(filePath, joinPath(cjsDir, relDir, name), pkg.name);\n }\n } else if (isDtsFile(name)) {\n const targetDir = formats.includes(\"esm\") ? esmDir : cjsDir;\n moveFile(filePath, joinPath(targetDir, relDir, name), pkg.name);\n }\n // Unknown extensions silently ignored.\n return;\n }\n\n // ── Single-bundle mode ──────────────────────────────────────────────────────\n const { keepNativeExtension } = ctx;\n\n if (isEsmFile(name)) {\n if (formats.includes(\"esm\")) {\n const destName = keepNativeExtension ? name : normaliseEsmName(name);\n moveFile(filePath, joinPath(esmDir, relDir, destName), pkg.name);\n }\n } else if (isCjsFile(name)) {\n if (formats.includes(\"cjs\")) {\n const destName = keepNativeExtension ? name : normaliseCjsName(name);\n moveFile(filePath, joinPath(cjsDir, relDir, destName), pkg.name);\n }\n } else if (isDtsFile(name)) {\n const targetDir = formats.includes(\"esm\") ? esmDir : cjsDir;\n moveFile(filePath, joinPath(targetDir, relDir, name), pkg.name);\n } else if (isJsFile(name)) {\n // Plain .js / .js.map — emitted when the format array contains only one format\n // (tsdown uses .js instead of .mjs/.cjs when there's no other format to differentiate from).\n const targetDir = mainType === \"esm\" ? esmDir : cjsDir;\n if (formats.includes(mainType)) {\n // Files landing in cjsDir should use the .cjs extension for consistency.\n const destName =\n targetDir === cjsDir\n ? name.replace(/\\.js\\.map$/, \".cjs.map\").replace(/\\.js$/, \".cjs\")\n : name;\n moveFile(filePath, joinPath(targetDir, relDir, destName), pkg.name);\n }\n }\n // Unknown extensions are silently ignored.\n}\n\n// ─── Extension predicates ───────────────────────────────────────────────────\n\nfunction isEsmFile(name: string): boolean {\n return (\n name.endsWith(\".mjs\") ||\n name.endsWith(\".mjs.map\") ||\n name.endsWith(\".d.mts\") ||\n name.endsWith(\".d.mts.map\")\n );\n}\n\nfunction isCjsFile(name: string): boolean {\n return (\n name.endsWith(\".cjs\") ||\n name.endsWith(\".cjs.map\") ||\n name.endsWith(\".d.cts\") ||\n name.endsWith(\".d.cts.map\")\n );\n}\n\nfunction isDtsFile(name: string): boolean {\n return name.endsWith(\".d.ts\") || name.endsWith(\".d.ts.map\");\n}\n\nfunction isJsFile(name: string): boolean {\n return (\n (name.endsWith(\".js\") || name.endsWith(\".js.map\")) &&\n !name.endsWith(\".d.ts\") &&\n !name.endsWith(\".d.ts.map\")\n );\n}\n\n// ─── Name normalisation ─────────────────────────────────────────────────────\n\n/** Rename .mjs / .d.mts → .js / .d.ts for the esm/ directory. */\nfunction normaliseEsmName(name: string): string {\n return name\n .replace(/\\.mjs\\.map$/, \".js.map\")\n .replace(/\\.mjs$/, \".js\")\n .replace(/\\.d\\.mts\\.map$/, \".d.ts.map\")\n .replace(/\\.d\\.mts$/, \".d.ts\");\n}\n\n/** Rename .cjs / .d.cts → .js / .d.ts for the cjs/ directory. */\nfunction normaliseCjsName(name: string): string {\n return name\n .replace(/\\.cjs\\.map$/, \".js.map\")\n .replace(/\\.cjs$/, \".js\")\n .replace(/\\.d\\.cts\\.map$/, \".d.ts.map\")\n .replace(/\\.d\\.cts$/, \".d.ts\");\n}\n","import semver from \"semver\";\nimport { wrapError } from \"../utils/errors.js\";\n\n/**\n * Given the current version string and a version strategy, return the new version.\n *\n * @param currentVersion semver string from source package.json, e.g. \"1.2.3\"\n * @param strategy \"auto\" / \"patch\" → patch bump\n * \"minor\" → minor bump\n * \"major\" → major bump\n * any valid semver string → use as-is\n * @param packageName used in error messages only\n */\nexport function resolveVersion(\n currentVersion: string,\n strategy: \"auto\" | \"patch\" | \"minor\" | \"major\" | string = \"auto\",\n packageName: string,\n): string {\n const bumpType =\n strategy === \"auto\" || strategy === \"patch\" ? \"patch\"\n : strategy === \"minor\" ? \"minor\"\n : strategy === \"major\" ? \"major\"\n : null;\n\n if (bumpType) {\n const bumped = semver.inc(currentVersion, bumpType);\n if (!bumped) {\n throw wrapError(\n \"version-increment\",\n packageName,\n new Error(\n `Cannot ${bumpType}-bump invalid semver version \"${currentVersion}\" for package \"${packageName}\"`,\n ),\n );\n }\n return bumped;\n }\n\n // Explicit version string — validate it\n const cleaned = semver.valid(semver.coerce(strategy) ?? strategy);\n if (!cleaned) {\n throw wrapError(\n \"version-increment\",\n packageName,\n new Error(\n `Explicit version \"${strategy}\" is not a valid semver string for package \"${packageName}\"`,\n ),\n );\n }\n return cleaned;\n}\n","import simpleGit, { SimpleGit } from \"simple-git\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { joinPath } from \"../utils/paths.js\";\nimport { wrapError } from \"../utils/errors.js\";\nimport { logger } from \"../utils/logger.js\";\n\n/**\n * Returns true if the given directory is inside a git repository.\n */\nexport async function isGitRepo(dir: string): Promise<boolean> {\n try {\n const git: SimpleGit = simpleGit(dir);\n const result = await git.checkIsRepo();\n return result;\n } catch {\n return false;\n }\n}\n\n/**\n * Perform git operations for a package after a successful build:\n * 1. git add -A (in the package root)\n * 2. git commit -m <message>\n * 3. git push origin <branch>\n * 4. git tag v<version>\n * 5. git push origin <tag>\n */\nexport async function gitCommitTagPush(\n packageRoot: string,\n packageName: string,\n version: string,\n commitMessage: string,\n branch: string,\n dryRun: boolean,\n): Promise<void> {\n const isRepo = await isGitRepo(packageRoot);\n if (!isRepo) {\n logger.warn(`[git] ${packageName}: directory is not a git repo — skipping git operations`);\n return;\n }\n\n const tag = `v${version}`;\n logger.step(`[git] ${packageName}: commit \"${commitMessage}\", tag ${tag}, push to ${branch}`);\n\n if (dryRun) {\n logger.info(`[dry-run] git add + commit \"${commitMessage}\" + tag ${tag} + push`);\n return;\n }\n\n const git: SimpleGit = simpleGit(packageRoot);\n\n try {\n // Stage all changes\n await git.add(\"-A\");\n\n // Commit\n await git.commit(commitMessage);\n\n // Push to remote\n await git.push(\"origin\", branch);\n\n // Tag\n await git.addTag(tag);\n\n // Push tags\n await git.pushTags(\"origin\");\n\n logger.success(`[git] ${packageName}: pushed ${branch}, tagged ${tag}`);\n } catch (err) {\n throw wrapError(\"git-operations\", packageName, err);\n }\n}\n\n/**\n * Resolve the current branch name in the given directory.\n * Falls back to \"main\" if the directory is not a git repo.\n */\nexport async function currentBranch(dir: string): Promise<string> {\n try {\n const git: SimpleGit = simpleGit(dir);\n const branch = await git.revparse([\"--abbrev-ref\", \"HEAD\"]);\n return branch.trim() || \"main\";\n } catch {\n return \"main\";\n }\n}\n","import { execa } from \"execa\";\nimport { wrapError } from \"./errors.js\";\n\nexport interface ExecResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\n/**\n * Run a shell command and return stdout/stderr.\n * Throws a BundlerError on non-zero exit.\n */\nexport async function exec(\n step: string,\n packageName: string,\n command: string,\n args: string[],\n cwd?: string,\n): Promise<ExecResult> {\n try {\n const result = await execa(command, args, {\n cwd,\n all: true,\n reject: false,\n });\n if (result.exitCode !== 0) {\n const combined = result.all ?? result.stderr ?? \"\";\n throw new Error(\n `Command \"${command} ${args.join(\" \")}\" exited with code ${result.exitCode}.\\n${combined}`,\n );\n }\n return {\n stdout: result.stdout ?? \"\",\n stderr: result.stderr ?? \"\",\n exitCode: result.exitCode,\n };\n } catch (err) {\n throw wrapError(step, packageName, err);\n }\n}\n\n/**\n * Run a command and ignore its output. Does NOT throw on non-zero exit.\n * Useful for optional operations (e.g. `git tag -d`).\n */\nexport async function execSilent(\n command: string,\n args: string[],\n cwd?: string,\n): Promise<number> {\n try {\n const result = await execa(command, args, { cwd, reject: false });\n return result.exitCode ?? 0;\n } catch {\n return 1;\n }\n}\n","import { exec } from \"../utils/exec.js\";\nimport { logger } from \"../utils/logger.js\";\nimport type { PackageBase } from \"../types/index.js\";\n\n/**\n * Run `npm publish` from the build output directory.\n */\nexport async function publishPackage(\n pkg: PackageBase,\n buildPath: string,\n dryRun: boolean,\n): Promise<void> {\n if (pkg.publish === false) {\n logger.info(`[publish] ${pkg.name}: publish=false, skipping`);\n return;\n }\n\n const access = pkg.access ?? \"public\";\n\n if (dryRun) {\n logger.info(`[dry-run] npm publish --access ${access} from ${buildPath}`);\n return;\n }\n\n logger.step(`Publishing ${pkg.name}@... to npm (access: ${access})`);\n\n await exec(\n \"npm-publish\",\n pkg.name,\n \"npm\",\n [\"publish\", \"--access\", access],\n buildPath,\n );\n\n logger.success(`Published ${pkg.name}`);\n}\n","import path from \"path\";\nimport { copyDir, ensureDir } from \"../files/file-manager.js\";\nimport {\n readSourcePackageJson,\n writeSourceVersion,\n writeBuildPackageJson,\n} from \"../files/package-json.js\";\nimport { cloneFiles } from \"../files/clone-files.js\";\nimport { compilePackage } from \"../compile/tsdown-compiler.js\";\nimport { resolveVersion } from \"../version/increment.js\";\nimport { gitCommitTagPush, currentBranch } from \"../git/operations.js\";\nimport { publishPackage } from \"../publish/npm-publisher.js\";\nimport { buildOutputPath, sourceSnapshotPath, resolvePath } from \"../utils/paths.js\";\nimport { wrapError } from \"../utils/errors.js\";\nimport { logger } from \"../utils/logger.js\";\nimport type { PackageBase, BuildOptions, BuilderSettings } from \"../types/index.js\";\n\nexport interface BuildResult {\n packageName: string;\n version: string;\n buildPath: string;\n success: boolean;\n error?: Error;\n}\n\n/**\n * Execute the full build pipeline for a single package.\n *\n * Steps:\n * 1. Resolve package root\n * 2. Read source package.json → current version\n * 3. Compute new version\n * 4. Create build output directory\n * 5. Source snapshot (optional)\n * 6. tsdown compile\n * 7. Clone extra files\n * 8. Write build package.json\n * 9. Update source package.json version\n * 10. Git: add, commit, push, tag\n * 11. npm publish\n */\nexport async function buildPackage(\n pkg: PackageBase,\n versionStrategy: \"auto\" | string = \"auto\",\n settings: BuilderSettings,\n options: BuildOptions,\n configDir: string,\n /**\n * Override commit message (used by family builder to apply a shared message).\n * If undefined, uses pkg.commit.\n */\n overrideCommit?: string,\n /**\n * Pre-resolved version — used when a family has already determined the version\n * and needs all member packages to use the same one.\n */\n forcedVersion?: string,\n): Promise<BuildResult> {\n const step = \"package-builder\";\n\n try {\n // 1. Resolve absolute package root\n const packageRoot = resolvePath(configDir, pkg.root);\n\n // 2. Read source package.json\n const sourceJson = readSourcePackageJson(packageRoot, pkg.name);\n const currentVersion = sourceJson.version;\n\n // 3. Determine new version\n const newVersion =\n forcedVersion ?? resolveVersion(currentVersion, versionStrategy, pkg.name);\n\n logger.info(`Building ${pkg.name}: ${currentVersion} → ${newVersion}`);\n\n // 4. Build output directory\n const absoluteBuildDir = resolvePath(configDir, settings.buildDir);\n const buildPath = buildOutputPath(absoluteBuildDir, pkg.name, newVersion);\n\n if (!options.dryRun) {\n ensureDir(buildPath);\n }\n\n // 5. Source snapshot\n if (settings.sourcesDir) {\n const absoluteSourcesDir = resolvePath(configDir, settings.sourcesDir);\n const snapshotPath = sourceSnapshotPath(absoluteSourcesDir, pkg.name);\n if (options.dryRun) {\n logger.info(`[dry-run] snapshot ${packageRoot} → ${snapshotPath}`);\n } else {\n ensureDir(snapshotPath);\n copyDir(packageRoot, snapshotPath);\n logger.debug(`Snapshot: ${packageRoot} → ${snapshotPath}`);\n }\n }\n\n // 6. Compile with tsdown\n await compilePackage(pkg, packageRoot, buildPath, sourceJson as Record<string, unknown>, options.dryRun);\n\n // 7. Clone extra files\n if (pkg.clone && pkg.clone.length > 0) {\n cloneFiles(packageRoot, buildPath, pkg.clone, pkg.name, options.dryRun);\n }\n\n // 8. Write build package.json\n if (!options.dryRun) {\n writeBuildPackageJson(pkg, sourceJson, buildPath, newVersion);\n logger.debug(`Wrote build package.json for ${pkg.name}@${newVersion}`);\n } else {\n logger.info(`[dry-run] write build package.json for ${pkg.name}@${newVersion}`);\n }\n\n // 9. Update source package.json version\n if (!options.dryRun) {\n writeSourceVersion(packageRoot, pkg.name, newVersion);\n logger.debug(`Updated source version ${pkg.name} → ${newVersion}`);\n } else {\n logger.info(`[dry-run] update source package.json version → ${newVersion}`);\n }\n\n // 10. Git operations (only if commit message is set and --no-git is not passed)\n const commitMessage = overrideCommit ?? pkg.commit;\n if (commitMessage && !options.noGit) {\n const branch = pkg.branch ?? (await currentBranch(packageRoot));\n await gitCommitTagPush(\n packageRoot,\n pkg.name,\n newVersion,\n commitMessage,\n branch,\n options.dryRun,\n );\n } else if (!commitMessage) {\n logger.debug(`[git] ${pkg.name}: no commit message set — skipping git`);\n }\n\n // 11. npm publish\n if (!options.noPublish) {\n await publishPackage(pkg, buildPath, options.dryRun);\n } else {\n logger.info(`[publish] ${pkg.name}: --no-publish, skipping`);\n }\n\n return { packageName: pkg.name, version: newVersion, buildPath, success: true };\n } catch (err) {\n const wrapped = wrapError(step, pkg.name, err);\n logger.error(`Failed to build ${pkg.name}: ${wrapped.message}`);\n return {\n packageName: pkg.name,\n version: \"\",\n buildPath: \"\",\n success: false,\n error: wrapped,\n };\n }\n}\n","import pLimit from \"p-limit\";\nimport type { BuildResult } from \"./package-builder.js\";\nimport { logger } from \"../utils/logger.js\";\n\n/**\n * Run an array of async build tasks with a concurrency cap.\n * Each task is a zero-argument function that returns a Promise<BuildResult>.\n */\nexport async function runParallel(\n tasks: (() => Promise<BuildResult>)[],\n concurrency: number,\n): Promise<BuildResult[]> {\n if (tasks.length === 0) return [];\n\n const limit = pLimit(Math.max(1, concurrency));\n\n logger.info(`Running ${tasks.length} task(s) with concurrency=${concurrency}`);\n\n const results = await Promise.all(\n tasks.map((task) => limit(task)),\n );\n\n const succeeded = results.filter((r) => r.success).length;\n const failed = results.filter((r) => !r.success).length;\n\n if (failed > 0) {\n logger.warn(`${succeeded} succeeded, ${failed} failed`);\n for (const r of results.filter((r) => !r.success)) {\n logger.error(` FAILED: ${r.packageName} — ${r.error?.message ?? \"unknown error\"}`);\n }\n } else {\n logger.success(`All ${succeeded} package(s) built successfully`);\n }\n\n return results;\n}\n","import type { Command } from \"commander\";\nimport { loadConfig, findDefaultConfigPath } from \"../config/index.js\";\nimport { buildPackage } from \"../build/package-builder.js\";\nimport { runParallel } from \"../build/parallel-builder.js\";\nimport { logger } from \"../utils/logger.js\";\nimport type { BuildOptions } from \"../types/index.js\";\n\ninterface BuildCommandOptions {\n all?: boolean;\n dryRun?: boolean;\n noPublish?: boolean;\n noGit?: boolean;\n config?: string;\n concurrency?: string;\n}\n\nexport function registerBuildCommand(program: Command): void {\n program\n .command(\"build [packages...]\")\n .description(\"Build standalone packages by name. Use --all to build all standalone packages.\")\n .option(\"--all\", \"Build all standalone packages\")\n .option(\"--dry-run\", \"Print what would happen without making any changes\")\n .option(\"--no-publish\", \"Skip npm publish\")\n .option(\"--no-git\", \"Skip git operations\")\n .option(\"--config <path>\", \"Path to config file\")\n .option(\"--concurrency <n>\", \"Override concurrency\")\n .action(async (packageNames: string[], opts: BuildCommandOptions) => {\n const configPath =\n opts.config ?? findDefaultConfigPath(process.cwd());\n\n const { config, configDir } = await loadConfig(configPath);\n\n const buildOptions: BuildOptions = {\n dryRun: opts.dryRun ?? false,\n noPublish: !opts.noPublish, // commander flips --no-publish to noPublish=false\n noGit: opts.noGit ?? false,\n concurrency: opts.concurrency ? parseInt(opts.concurrency, 10) : undefined,\n configPath,\n };\n\n // Fix: commander's --no-publish sets opts.publish = false (not opts.noPublish)\n // We need to check for the raw value\n const rawOpts = opts as Record<string, unknown>;\n const shouldPublish = rawOpts[\"publish\"] !== false;\n buildOptions.noPublish = !shouldPublish;\n\n const standalone = config.standalone ?? [];\n\n let targets = standalone;\n\n if (!opts.all && packageNames.length > 0) {\n targets = standalone.filter((p) => packageNames.includes(p.name));\n const missing = packageNames.filter(\n (n) => !standalone.some((p) => p.name === n),\n );\n if (missing.length > 0) {\n logger.warn(`Unknown package names: ${missing.join(\", \")}`);\n }\n }\n\n if (targets.length === 0) {\n logger.warn(\"No standalone packages matched. Use --all or specify package names.\");\n process.exit(0);\n }\n\n const concurrency =\n buildOptions.concurrency ?? config.settings.concurrency ?? 4;\n\n const tasks = targets.map(\n (pkg) => () =>\n buildPackage(\n pkg,\n pkg.version ?? \"auto\",\n config.settings,\n buildOptions,\n configDir,\n ),\n );\n\n const results = await runParallel(tasks, concurrency);\n const anyFailed = results.some((r) => !r.success);\n process.exit(anyFailed ? 1 : 0);\n });\n}\n","import semver from \"semver\";\nimport { readSourcePackageJson } from \"../files/package-json.js\";\nimport { resolveVersion } from \"../version/increment.js\";\nimport { resolvePath } from \"../utils/paths.js\";\nimport { buildPackage } from \"./package-builder.js\";\nimport { runParallel } from \"./parallel-builder.js\";\nimport { wrapError } from \"../utils/errors.js\";\nimport { logger } from \"../utils/logger.js\";\nimport type { Family, BuildOptions, BuilderSettings } from \"../types/index.js\";\nimport type { BuildResult } from \"./package-builder.js\";\n\n/**\n * Build all packages in a family using a single shared version.\n *\n * The shared version is determined by taking the HIGHEST current version\n * across all family members and bumping it. This prevents a lower-versioned\n * member (e.g. atomic-query@0.1.0) from pulling down a higher-versioned one\n * (e.g. react-atom@5.1.3) when they are first unified.\n */\nexport async function buildFamily(\n family: Family,\n settings: BuilderSettings,\n options: BuildOptions,\n configDir: string,\n): Promise<BuildResult[]> {\n if (family.packages.length === 0) {\n logger.warn(`Family \"${family.name}\" has no packages — nothing to build`);\n return [];\n }\n\n let newVersion: string;\n try {\n const strategy = family.version ?? \"auto\";\n const isBumpKeyword = strategy === \"auto\" || strategy === \"patch\" || strategy === \"minor\" || strategy === \"major\";\n\n if (!isBumpKeyword && semver.valid(semver.coerce(strategy) ?? strategy)) {\n // Explicit semver string — use as-is\n newVersion = strategy;\n } else {\n // Bump keyword — find the highest current version across all family members, then bump it\n let highestVersion = \"0.0.0\";\n for (const pkg of family.packages) {\n const root = resolvePath(configDir, pkg.root);\n const sourceJson = readSourcePackageJson(root, pkg.name);\n const v = sourceJson.version ?? \"0.0.0\";\n if (semver.gt(v, highestVersion)) {\n highestVersion = v;\n }\n }\n newVersion = resolveVersion(highestVersion, strategy, family.name);\n }\n } catch (err) {\n throw wrapError(\"family-version\", family.name, err);\n }\n\n logger.info(`Family \"${family.name}\": shared version → ${newVersion} (${family.packages.length} packages)`);\n\n const concurrency = options.concurrency ?? settings.concurrency ?? 4;\n\n // The family commit message overrides per-package commit messages\n const familyCommit = family.commit;\n\n const tasks = family.packages.map((pkg) => () =>\n buildPackage(\n pkg,\n \"auto\", // not used — forcedVersion overrides\n settings,\n options,\n configDir,\n familyCommit ?? pkg.commit,\n newVersion, // all packages use the same version\n ),\n );\n\n return runParallel(tasks, concurrency);\n}\n","import type { Command } from \"commander\";\nimport { loadConfig, findDefaultConfigPath } from \"../config/index.js\";\nimport { buildFamily } from \"../build/family-builder.js\";\nimport { logger } from \"../utils/logger.js\";\nimport type { BuildOptions } from \"../types/index.js\";\n\ninterface BuildFamilyOptions {\n dryRun?: boolean;\n noPublish?: boolean;\n noGit?: boolean;\n config?: string;\n concurrency?: string;\n}\n\nexport function registerBuildFamilyCommand(program: Command): void {\n program\n .command(\"build:family <name>\")\n .description(\"Build all packages in a named family with a single shared version.\")\n .option(\"--dry-run\", \"Print what would happen without making any changes\")\n .option(\"--no-publish\", \"Skip npm publish\")\n .option(\"--no-git\", \"Skip git operations\")\n .option(\"--config <path>\", \"Path to config file\")\n .option(\"--concurrency <n>\", \"Override concurrency\")\n .action(async (familyName: string, opts: BuildFamilyOptions) => {\n const configPath =\n opts.config ?? findDefaultConfigPath(process.cwd());\n\n const { config, configDir } = await loadConfig(configPath);\n\n const rawOpts = opts as Record<string, unknown>;\n const shouldPublish = rawOpts[\"publish\"] !== false;\n\n const buildOptions: BuildOptions = {\n dryRun: opts.dryRun ?? false,\n noPublish: !shouldPublish,\n noGit: opts.noGit ?? false,\n concurrency: opts.concurrency ? parseInt(opts.concurrency, 10) : undefined,\n configPath,\n };\n\n const family = (config.families ?? []).find((f) => f.name === familyName);\n\n if (!family) {\n const available = (config.families ?? []).map((f) => f.name).join(\", \");\n logger.error(\n `Family \"${familyName}\" not found. Available families: ${available || \"(none)\"}`,\n );\n process.exit(1);\n }\n\n const results = await buildFamily(family, config.settings, buildOptions, configDir);\n const anyFailed = results.some((r) => !r.success);\n process.exit(anyFailed ? 1 : 0);\n });\n}\n","import type { Command } from \"commander\";\nimport { loadConfig, findDefaultConfigPath } from \"../config/index.js\";\nimport { buildPackage } from \"../build/package-builder.js\";\nimport { buildFamily } from \"../build/family-builder.js\";\nimport { runParallel } from \"../build/parallel-builder.js\";\nimport { logger } from \"../utils/logger.js\";\nimport type { BuildOptions } from \"../types/index.js\";\nimport type { BuildResult } from \"../build/package-builder.js\";\n\ninterface BuildAllOptions {\n dryRun?: boolean;\n noPublish?: boolean;\n noGit?: boolean;\n config?: string;\n concurrency?: string;\n}\n\nexport function registerBuildAllCommand(program: Command): void {\n program\n .command(\"build:all\")\n .description(\"Build all standalone packages and all families.\")\n .option(\"--dry-run\", \"Print what would happen without making any changes\")\n .option(\"--no-publish\", \"Skip npm publish\")\n .option(\"--no-git\", \"Skip git operations\")\n .option(\"--config <path>\", \"Path to config file\")\n .option(\"--concurrency <n>\", \"Override concurrency\")\n .action(async (opts: BuildAllOptions) => {\n const configPath =\n opts.config ?? findDefaultConfigPath(process.cwd());\n\n const { config, configDir } = await loadConfig(configPath);\n\n const rawOpts = opts as Record<string, unknown>;\n const shouldPublish = rawOpts[\"publish\"] !== false;\n\n const buildOptions: BuildOptions = {\n dryRun: opts.dryRun ?? false,\n noPublish: !shouldPublish,\n noGit: opts.noGit ?? false,\n concurrency: opts.concurrency ? parseInt(opts.concurrency, 10) : undefined,\n configPath,\n };\n\n const concurrency = buildOptions.concurrency ?? config.settings.concurrency ?? 4;\n\n const allResults: BuildResult[] = [];\n\n // Build all standalone packages in parallel\n const standalone = config.standalone ?? [];\n if (standalone.length > 0) {\n logger.info(`Building ${standalone.length} standalone package(s)…`);\n const standaloneTasks = standalone.map(\n (pkg) => () =>\n buildPackage(\n pkg,\n pkg.version ?? \"auto\",\n config.settings,\n buildOptions,\n configDir,\n ),\n );\n const standaloneResults = await runParallel(standaloneTasks, concurrency);\n allResults.push(...standaloneResults);\n }\n\n // Build all families sequentially (families share a version; running\n // multiple families in parallel is fine since they're independent)\n const families = config.families ?? [];\n if (families.length > 0) {\n logger.info(`Building ${families.length} famil${families.length === 1 ? \"y\" : \"ies\"}…`);\n for (const family of families) {\n const familyResults = await buildFamily(\n family,\n config.settings,\n buildOptions,\n configDir,\n );\n allResults.push(...familyResults);\n }\n }\n\n const succeeded = allResults.filter((r) => r.success).length;\n const failed = allResults.filter((r) => !r.success).length;\n\n logger.info(`\\nSummary: ${succeeded} succeeded, ${failed} failed out of ${allResults.length} total`);\n process.exit(failed > 0 ? 1 : 0);\n });\n}\n","import type { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { loadConfig, findDefaultConfigPath } from \"../config/index.js\";\nimport { readSourcePackageJson } from \"../files/package-json.js\";\nimport { resolvePath } from \"../utils/paths.js\";\n\ninterface ListOptions {\n config?: string;\n}\n\nexport function registerListCommand(program: Command): void {\n program\n .command(\"list\")\n .description(\"List all registered standalone packages and families.\")\n .option(\"--config <path>\", \"Path to config file\")\n .action(async (opts: ListOptions) => {\n const configPath = opts.config ?? findDefaultConfigPath(process.cwd());\n const { config, configDir } = await loadConfig(configPath);\n\n const standalone = config.standalone ?? [];\n const families = config.families ?? [];\n\n console.log(chalk.bold(\"\\n=== Standalone Packages ===\"));\n if (standalone.length === 0) {\n console.log(chalk.gray(\" (none)\"));\n } else {\n for (const pkg of standalone) {\n const root = resolvePath(configDir, pkg.root);\n let version = \"?\";\n try {\n const json = readSourcePackageJson(root, pkg.name);\n version = json.version;\n } catch {\n version = chalk.red(\"(package.json missing)\");\n }\n const type = pkg.type ?? \"typescript\";\n const formats = (pkg.formats ?? [\"esm\", \"cjs\"]).join(\", \");\n console.log(\n ` ${chalk.cyan(pkg.name)} ${chalk.yellow(`v${version}`)}` +\n chalk.gray(` [${type}] [${formats}]`),\n );\n console.log(chalk.gray(` root: ${root}`));\n }\n }\n\n console.log(chalk.bold(\"\\n=== Families ===\"));\n if (families.length === 0) {\n console.log(chalk.gray(\" (none)\"));\n } else {\n for (const family of families) {\n console.log(chalk.bold(`\\n Family: ${chalk.magenta(family.name)}`));\n for (const pkg of family.packages) {\n const root = resolvePath(configDir, pkg.root);\n let version = \"?\";\n try {\n const json = readSourcePackageJson(root, pkg.name);\n version = json.version;\n } catch {\n version = chalk.red(\"(package.json missing)\");\n }\n const type = pkg.type ?? \"typescript\";\n const formats = (pkg.formats ?? [\"esm\", \"cjs\"]).join(\", \");\n console.log(\n ` ${chalk.cyan(pkg.name)} ${chalk.yellow(`v${version}`)}` +\n chalk.gray(` [${type}] [${formats}]`),\n );\n console.log(chalk.gray(` root: ${root}`));\n }\n }\n }\n\n console.log(\"\");\n });\n}\n","import type { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport fs from \"fs\";\nimport { loadConfig, findDefaultConfigPath } from \"../config/index.js\";\nimport { resolvePath } from \"../utils/paths.js\";\nimport { logger } from \"../utils/logger.js\";\n\ninterface ValidateOptions {\n config?: string;\n}\n\ninterface ValidationIssue {\n level: \"error\" | \"warn\";\n message: string;\n}\n\nexport function registerValidateCommand(program: Command): void {\n program\n .command(\"validate\")\n .description(\"Validate the config file and check that all package roots exist.\")\n .option(\"--config <path>\", \"Path to config file\")\n .action(async (opts: ValidateOptions) => {\n const configPath = opts.config ?? findDefaultConfigPath(process.cwd());\n\n let config: Awaited<ReturnType<typeof loadConfig>>[\"config\"];\n let configDir: string;\n\n try {\n const loaded = await loadConfig(configPath);\n config = loaded.config;\n configDir = loaded.configDir;\n } catch (err) {\n logger.error(\n `Config load failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n process.exit(1);\n }\n\n const issues: ValidationIssue[] = [];\n\n // Check all package roots exist\n const allPackages = [\n ...(config.standalone ?? []).map((p) => ({\n name: p.name,\n root: p.root,\n context: \"standalone\",\n })),\n ...(config.families ?? []).flatMap((f) =>\n f.packages.map((p) => ({\n name: p.name,\n root: p.root,\n context: `family:${f.name}`,\n })),\n ),\n ];\n\n for (const { name, root, context } of allPackages) {\n const abs = resolvePath(configDir, root);\n if (!fs.existsSync(abs)) {\n issues.push({\n level: \"error\",\n message: `[${context}] \"${name}\": root does not exist — ${abs}`,\n });\n continue;\n }\n\n const pkgJsonPath = resolvePath(abs, \"package.json\");\n if (!fs.existsSync(pkgJsonPath)) {\n issues.push({\n level: \"error\",\n message: `[${context}] \"${name}\": package.json not found at ${pkgJsonPath}`,\n });\n continue;\n }\n\n try {\n const raw = fs.readFileSync(pkgJsonPath, \"utf-8\");\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n if (!parsed[\"version\"]) {\n issues.push({\n level: \"error\",\n message: `[${context}] \"${name}\": package.json is missing \"version\" field`,\n });\n }\n } catch (err) {\n issues.push({\n level: \"error\",\n message: `[${context}] \"${name}\": failed to parse package.json — ${\n err instanceof Error ? err.message : String(err)\n }`,\n });\n }\n }\n\n // Check buildDir\n const buildDir = resolvePath(configDir, config.settings.buildDir);\n if (!fs.existsSync(buildDir)) {\n issues.push({\n level: \"warn\",\n message: `settings.buildDir does not exist yet and will be created on first build: ${buildDir}`,\n });\n }\n\n // Print results\n if (issues.length === 0) {\n console.log(chalk.green(`Config is valid. ${allPackages.length} package(s) found.`));\n process.exit(0);\n } else {\n const errors = issues.filter((i) => i.level === \"error\");\n const warnings = issues.filter((i) => i.level === \"warn\");\n\n for (const issue of warnings) {\n console.log(chalk.yellow(`WARN ${issue.message}`));\n }\n for (const issue of errors) {\n console.log(chalk.red(`ERROR ${issue.message}`));\n }\n\n console.log(\n `\\n${errors.length} error(s), ${warnings.length} warning(s) found.`,\n );\n process.exit(errors.length > 0 ? 1 : 0);\n }\n });\n}\n"],"mappings":"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","names":["path","path","path","fs","path","fs","path","fs","fs","path","fs","fs","path","r","program","semver","semver","program","program","chalk","program","chalk","chalk","fs","program","fs","chalk","__dirname","path"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -119,16 +119,7 @@ interface LoadedConfig {
|
|
|
119
119
|
/** Directory containing the config file — used to resolve relative roots */
|
|
120
120
|
configDir: string;
|
|
121
121
|
}
|
|
122
|
-
/**
|
|
123
|
-
* Load and validate a builder config file.
|
|
124
|
-
*
|
|
125
|
-
* The file must be a TypeScript or JavaScript module with a default export
|
|
126
|
-
* produced by `defineConfig(...)`.
|
|
127
|
-
*
|
|
128
|
-
* When the file is TypeScript (`.ts`), we use `tsx` via Node's `--import` flag
|
|
129
|
-
* (which is already set up when the CLI is invoked via the compiled entry), or
|
|
130
|
-
* we fall back to requiring `tsx/esm` at runtime if available.
|
|
131
|
-
*/
|
|
122
|
+
/** Load and validate a pkgist config file (TypeScript or JavaScript). */
|
|
132
123
|
declare function loadConfig(configFilePath: string): Promise<LoadedConfig>;
|
|
133
124
|
/**
|
|
134
125
|
* Attempt to find the default config file in the working directory.
|
package/dist/index.js
CHANGED
|
@@ -54,6 +54,20 @@ function wrapError(step, packageName, error) {
|
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
// src/config/load-config.ts
|
|
57
|
+
async function ensureTsxRegistered() {
|
|
58
|
+
try {
|
|
59
|
+
const { register } = await import("module");
|
|
60
|
+
let tsxUrl = null;
|
|
61
|
+
try {
|
|
62
|
+
tsxUrl = import.meta.resolve("tsx/esm");
|
|
63
|
+
} catch {
|
|
64
|
+
}
|
|
65
|
+
if (register && tsxUrl) {
|
|
66
|
+
register(tsxUrl, import.meta.url);
|
|
67
|
+
}
|
|
68
|
+
} catch {
|
|
69
|
+
}
|
|
70
|
+
}
|
|
57
71
|
async function loadConfig(configFilePath) {
|
|
58
72
|
const absolute = resolvePath(configFilePath);
|
|
59
73
|
if (!fs.existsSync(absolute)) {
|
|
@@ -61,6 +75,9 @@ async function loadConfig(configFilePath) {
|
|
|
61
75
|
}
|
|
62
76
|
let mod;
|
|
63
77
|
try {
|
|
78
|
+
if (absolute.endsWith(".ts")) {
|
|
79
|
+
await ensureTsxRegistered();
|
|
80
|
+
}
|
|
64
81
|
const fileUrl = pathToFileURL(absolute).href;
|
|
65
82
|
mod = await import(fileUrl);
|
|
66
83
|
} catch (err) {
|
|
@@ -104,7 +121,7 @@ function validateConfig(config, filePath) {
|
|
|
104
121
|
}
|
|
105
122
|
}
|
|
106
123
|
function findDefaultConfigPath(cwd) {
|
|
107
|
-
const candidates = ["builder.ts", "builder.js", "mongez.ts", "mongez.js"];
|
|
124
|
+
const candidates = ["pkgist.config.ts", "pkgist.config.js", "builder.ts", "builder.js", "mongez.ts", "mongez.js"];
|
|
108
125
|
for (const candidate of candidates) {
|
|
109
126
|
const full = path2.join(cwd, candidate);
|
|
110
127
|
if (fs.existsSync(full)) return full;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config/define-config.ts","../src/config/load-config.ts","../src/utils/paths.ts","../src/utils/errors.ts","../src/files/file-manager.ts","../src/files/package-json.ts","../src/files/clone-files.ts","../src/utils/logger.ts","../src/compile/tsdown-compiler.ts","../src/version/increment.ts","../src/git/operations.ts","../src/utils/exec.ts","../src/publish/npm-publisher.ts","../src/build/package-builder.ts","../src/build/family-builder.ts","../src/build/parallel-builder.ts"],"sourcesContent":["import type { BundlerConfig } from \"../types/index.js\";\n\n/**\n * Type-safe config factory.\n * Simply returns the config object unchanged — used purely for IDE autocomplete and type checking.\n */\nexport function defineConfig(config: BundlerConfig): BundlerConfig {\n return config;\n}\n","import path from \"path\";\nimport { createRequire } from \"module\";\nimport { pathToFileURL } from \"url\";\nimport fs from \"fs\";\nimport type { BundlerConfig } from \"../types/index.js\";\nimport { resolvePath } from \"../utils/paths.js\";\nimport { wrapError } from \"../utils/errors.js\";\n\nexport interface LoadedConfig {\n config: BundlerConfig;\n /** Absolute, forward-slash normalised path to the config file */\n configPath: string;\n /** Directory containing the config file — used to resolve relative roots */\n configDir: string;\n}\n\n/**\n * Load and validate a builder config file.\n *\n * The file must be a TypeScript or JavaScript module with a default export\n * produced by `defineConfig(...)`.\n *\n * When the file is TypeScript (`.ts`), we use `tsx` via Node's `--import` flag\n * (which is already set up when the CLI is invoked via the compiled entry), or\n * we fall back to requiring `tsx/esm` at runtime if available.\n */\nexport async function loadConfig(configFilePath: string): Promise<LoadedConfig> {\n const absolute = resolvePath(configFilePath);\n\n if (!fs.existsSync(absolute)) {\n throw new Error(`Config file not found: ${absolute}`);\n }\n\n let mod: { default?: BundlerConfig };\n\n try {\n // Convert to a file:// URL so dynamic import works correctly on Windows.\n const fileUrl = pathToFileURL(absolute).href;\n mod = await import(fileUrl);\n } catch (err) {\n throw wrapError(\"load-config\", absolute, err);\n }\n\n const config = mod.default;\n\n if (!config || typeof config !== \"object\") {\n throw new Error(\n `Config file ${absolute} must export a default object from defineConfig(). Got: ${typeof config}`,\n );\n }\n\n validateConfig(config, absolute);\n\n return {\n config,\n configPath: absolute,\n configDir: resolvePath(path.dirname(absolute)),\n };\n}\n\nfunction validateConfig(config: BundlerConfig, filePath: string): void {\n if (!config.settings) {\n throw new Error(`Config \"${filePath}\" must have a \"settings\" object.`);\n }\n if (!config.settings.buildDir) {\n throw new Error(`Config \"${filePath}\" settings.buildDir is required.`);\n }\n\n const names = new Set<string>();\n\n for (const pkg of config.standalone ?? []) {\n if (!pkg.name) throw new Error(`Standalone package is missing \"name\" in ${filePath}`);\n if (!pkg.root) throw new Error(`Standalone package \"${pkg.name}\" is missing \"root\"`);\n if (names.has(pkg.name)) throw new Error(`Duplicate package name: \"${pkg.name}\"`);\n names.add(pkg.name);\n }\n\n for (const family of config.families ?? []) {\n if (!family.name) throw new Error(`A family is missing \"name\" in ${filePath}`);\n for (const pkg of family.packages) {\n if (!pkg.name) throw new Error(`Package inside family \"${family.name}\" is missing \"name\"`);\n if (!pkg.root) throw new Error(`Package \"${pkg.name}\" in family \"${family.name}\" is missing \"root\"`);\n if (names.has(pkg.name)) throw new Error(`Duplicate package name: \"${pkg.name}\"`);\n names.add(pkg.name);\n }\n }\n}\n\n/**\n * Attempt to find the default config file in the working directory.\n * Tries: builder.ts, builder.js, mongez.ts, mongez.js\n */\nexport function findDefaultConfigPath(cwd: string): string {\n const candidates = [\"builder.ts\", \"builder.js\", \"mongez.ts\", \"mongez.js\"];\n for (const candidate of candidates) {\n const full = path.join(cwd, candidate);\n if (fs.existsSync(full)) return full;\n }\n throw new Error(\n `No config file found in ${cwd}. Tried: ${candidates.join(\", \")}. ` +\n `Use --config <path> to specify a custom location.`,\n );\n}\n","import path from \"path\";\n\n/** Normalise any path to forward-slash form (Windows-safe). */\nexport function toForwardSlash(p: string): string {\n return p.replace(/\\\\/g, \"/\");\n}\n\n/** Join path segments and normalise the result to forward slashes. */\nexport function joinPath(...segments: string[]): string {\n return toForwardSlash(path.join(...segments));\n}\n\n/** Resolve an absolute path from segments and normalise to forward slashes. */\nexport function resolvePath(...segments: string[]): string {\n return toForwardSlash(path.resolve(...segments));\n}\n\n/**\n * Given a package name like \"@mongez/reinforcements\",\n * return just the scoped part without the scope prefix: \"reinforcements\".\n */\nexport function scopelessName(packageName: string): string {\n const slash = packageName.indexOf(\"/\");\n return slash === -1 ? packageName : packageName.slice(slash + 1);\n}\n\n/**\n * Build the versioned build output path:\n * <buildDir>/<scopeless-name>/<version>/\n */\nexport function buildOutputPath(\n buildDir: string,\n packageName: string,\n version: string,\n): string {\n return joinPath(buildDir, scopelessName(packageName), version);\n}\n\n/**\n * Build the sources snapshot path:\n * <sourcesDir>/<scopeless-name>/\n */\nexport function sourceSnapshotPath(\n sourcesDir: string,\n packageName: string,\n): string {\n return joinPath(sourcesDir, scopelessName(packageName));\n}\n","/** Base error class for all bundler errors. Carries a step name for structured logging. */\nexport class BundlerError extends Error {\n constructor(\n public readonly step: string,\n public readonly packageName: string,\n message: string,\n public readonly cause?: unknown,\n ) {\n super(message);\n this.name = \"BundlerError\";\n if (cause instanceof Error && cause.stack) {\n this.stack = `${this.stack}\\nCaused by: ${cause.stack}`;\n }\n }\n}\n\n/** Wrap any thrown value into a BundlerError with context. */\nexport function wrapError(\n step: string,\n packageName: string,\n error: unknown,\n): BundlerError {\n if (error instanceof BundlerError) return error;\n const msg =\n error instanceof Error\n ? error.message\n : typeof error === \"string\"\n ? error\n : JSON.stringify(error);\n return new BundlerError(step, packageName, `[${step}] ${packageName}: ${msg}`, error);\n}\n\n/** Throw a wrapped error immediately. */\nexport function failWith(\n step: string,\n packageName: string,\n error: unknown,\n): never {\n throw wrapError(step, packageName, error);\n}\n","import fs from \"fs\";\nimport path from \"path\";\nimport { resolvePath, joinPath } from \"../utils/paths.js\";\nimport { wrapError } from \"../utils/errors.js\";\n\n/**\n * Ensure a directory exists, creating all intermediate directories as needed.\n */\nexport function ensureDir(dir: string): void {\n try {\n fs.mkdirSync(dir, { recursive: true });\n } catch (err) {\n throw wrapError(\"ensure-dir\", dir, err);\n }\n}\n\n/**\n * Copy a single file from src to dest.\n * Creates the destination directory if it does not exist.\n */\nexport function copyFile(src: string, dest: string): void {\n ensureDir(path.dirname(dest));\n try {\n fs.copyFileSync(src, dest);\n } catch (err) {\n throw wrapError(\"copy-file\", src, err);\n }\n}\n\n/** Directories that are never copied in any directory tree operation. */\nconst COPY_EXCLUDES = new Set([\".git\", \"node_modules\", \"dist\", \".turbo\", \".cache\"]);\n\n/**\n * Copy an entire directory tree recursively, skipping .git and node_modules.\n */\nexport function copyDir(src: string, dest: string): void {\n ensureDir(dest);\n const entries = fs.readdirSync(src, { withFileTypes: true });\n for (const entry of entries) {\n if (COPY_EXCLUDES.has(entry.name)) continue;\n const srcPath = joinPath(src, entry.name);\n const destPath = joinPath(dest, entry.name);\n if (entry.isDirectory()) {\n copyDir(srcPath, destPath);\n } else {\n copyFile(srcPath, destPath);\n }\n }\n}\n\n/**\n * Read a file as a UTF-8 string, or throw a BundlerError with context.\n */\nexport function readFile(filePath: string, packageName = filePath): string {\n try {\n return fs.readFileSync(filePath, \"utf-8\");\n } catch (err) {\n throw wrapError(\"read-file\", packageName, err);\n }\n}\n\n/**\n * Write a UTF-8 string to a file, creating intermediate directories.\n */\nexport function writeFile(filePath: string, content: string, packageName = filePath): void {\n ensureDir(path.dirname(filePath));\n try {\n fs.writeFileSync(filePath, content, \"utf-8\");\n } catch (err) {\n throw wrapError(\"write-file\", packageName, err);\n }\n}\n\n/**\n * Move all files matching a glob-like condition.\n * Actually does a rename — works only within the same filesystem volume.\n */\nexport function moveFile(src: string, dest: string, packageName = src): void {\n ensureDir(path.dirname(dest));\n try {\n fs.renameSync(src, dest);\n } catch (err) {\n // rename across devices fails — fall back to copy+unlink\n try {\n fs.copyFileSync(src, dest);\n fs.unlinkSync(src);\n } catch (fallbackErr) {\n throw wrapError(\"move-file\", packageName, fallbackErr);\n }\n }\n}\n\n/**\n * Check whether a path exists on the filesystem.\n */\nexport function pathExists(p: string): boolean {\n return fs.existsSync(p);\n}\n\n/**\n * List all file paths inside a directory (non-recursive).\n */\nexport function listFiles(dir: string): string[] {\n if (!fs.existsSync(dir)) return [];\n return fs\n .readdirSync(dir, { withFileTypes: true })\n .filter((e) => e.isFile())\n .map((e) => joinPath(dir, e.name));\n}\n","import path from \"path\";\nimport { readFile, writeFile } from \"./file-manager.js\";\nimport { joinPath } from \"../utils/paths.js\";\nimport { wrapError } from \"../utils/errors.js\";\nimport type { PackageBase } from \"../types/index.js\";\n\n// Fields kept verbatim from the source package.json into the build package.json.\nconst KEPT_FIELDS = [\n \"name\",\n \"description\",\n \"keywords\",\n \"author\",\n \"license\",\n \"repository\",\n \"homepage\",\n \"bugs\",\n \"dependencies\",\n \"peerDependencies\",\n \"sideEffects\",\n \"bin\",\n \"engines\",\n] as const;\n\nexport type SourcePackageJson = Record<string, unknown> & {\n version: string;\n dependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n};\n\n/**\n * Read and parse the package.json at <packageRoot>/package.json.\n * Throws a BundlerError if the file is missing or malformed.\n */\nexport function readSourcePackageJson(\n packageRoot: string,\n packageName: string,\n): SourcePackageJson {\n const pkgPath = joinPath(packageRoot, \"package.json\");\n let raw: string;\n try {\n raw = readFile(pkgPath, packageName);\n } catch {\n throw wrapError(\n \"read-package-json\",\n packageName,\n new Error(`package.json not found at ${pkgPath}`),\n );\n }\n\n try {\n const parsed = JSON.parse(raw) as SourcePackageJson;\n if (!parsed.version) {\n throw new Error(`package.json at ${pkgPath} is missing \"version\" field`);\n }\n return parsed;\n } catch (err) {\n throw wrapError(\"parse-package-json\", packageName, err);\n }\n}\n\n/**\n * Write the new version back into the source package.json.\n */\nexport function writeSourceVersion(\n packageRoot: string,\n packageName: string,\n newVersion: string,\n): void {\n const pkgPath = joinPath(packageRoot, \"package.json\");\n const raw = readFile(pkgPath, packageName);\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n parsed.version = newVersion;\n writeFile(pkgPath, JSON.stringify(parsed, null, 2) + \"\\n\", packageName);\n}\n\n/**\n * Build and write the clean package.json for the build output directory.\n */\nexport function writeBuildPackageJson(\n pkg: PackageBase,\n sourceJson: SourcePackageJson,\n buildPath: string,\n newVersion: string,\n): void {\n const formats = pkg.formats ?? [\"esm\", \"cjs\"];\n const hasEsm = formats.includes(\"esm\");\n const hasCjs = formats.includes(\"cjs\");\n const esmOnly = hasEsm && !hasCjs;\n\n // When preserveModules is on (the default), tsdown keeps one file per source\n // module and uses native extensions (.mjs/.cjs) so internal cross-file imports\n // resolve correctly. When bundling, everything is renamed to .js for simplicity.\n const preserve = pkg.preserveModules !== false;\n const esmExt = preserve ? \".mjs\" : \".js\";\n const cjsExt = preserve ? \".cjs\" : \".js\";\n const esmDts = preserve ? \".d.mts\" : \".d.ts\";\n const cjsDts = preserve ? \".d.cts\" : \".d.ts\";\n\n // Determine entry base names from entries config\n const rawEntries = pkg.entries ?? [\"index.ts\"];\n const entryList = Array.isArray(rawEntries) ? rawEntries : [rawEntries];\n\n /**\n * Convert an entry path (relative to srcDir) into:\n * basePath — path without extension, used to build file paths (e.g. \"cli/index\")\n * exportPath — the key in the exports map (e.g. \"./cli\")\n *\n * When the basename is \"index\" the directory becomes the export path so that\n * `cli/index.ts` maps to `\"./cli\"` and `index.ts` maps to `\".\"`.\n */\n function entryPaths(entry: string): { basePath: string; exportPath: string } {\n const basePath = entry.replace(/\\.tsx?$/, \"\");\n const parts = basePath.split(\"/\");\n const last = parts[parts.length - 1];\n let exportPath: string;\n if (last === \"index\") {\n const dir = parts.slice(0, -1).join(\"/\");\n exportPath = dir ? `./${dir}` : \".\";\n } else {\n exportPath = `./${basePath}`;\n }\n return { basePath, exportPath };\n }\n\n // Primary entry drives `main` / `module` / `types` fields.\n const { basePath: primaryBase } = entryPaths(entryList[0]!);\n\n // Build the full exports map — one condition block per entry.\n const exportsMap: Record<string, unknown> = {};\n\n for (const entry of entryList) {\n const { basePath, exportPath } = entryPaths(entry);\n const conditions: Record<string, unknown> = {};\n\n if (hasEsm) {\n conditions[\"import\"] = {\n types: `./esm/${basePath}${esmDts}`,\n default: `./esm/${basePath}${esmExt}`,\n };\n }\n if (hasCjs) {\n // When preserveModules is on, CJS is built without DTS to avoid a rolldown bug.\n // TypeScript resolves types correctly from the ESM declarations via the exports map.\n const cjsTypes = preserve && hasEsm\n ? `./esm/${basePath}${esmDts}`\n : `./cjs/${basePath}${cjsDts}`;\n conditions[\"require\"] = {\n types: cjsTypes,\n default: `./cjs/${basePath}${cjsExt}`,\n };\n }\n\n exportsMap[exportPath] = conditions;\n }\n\n const output: Record<string, unknown> = {};\n\n // Copy allowed fields from source\n for (const field of KEPT_FIELDS) {\n if (field in sourceJson && sourceJson[field] !== undefined) {\n output[field] = sourceJson[field];\n }\n }\n\n // Override name / version\n output[\"name\"] = pkg.name;\n output[\"version\"] = newVersion;\n\n if (esmOnly) {\n output[\"type\"] = \"module\";\n }\n\n // Entry points\n const mainType = pkg.mainType ?? \"cjs\";\n if (mainType === \"esm\" || esmOnly) {\n output[\"main\"] = `./esm/${primaryBase}${esmExt}`;\n } else {\n output[\"main\"] = `./cjs/${primaryBase}${cjsExt}`;\n }\n\n if (hasEsm) {\n output[\"module\"] = `./esm/${primaryBase}${esmExt}`;\n }\n\n output[\"types\"] = `./esm/${primaryBase}${esmDts}`;\n\n output[\"exports\"] = exportsMap;\n\n const pkgPath = joinPath(buildPath, \"package.json\");\n writeFile(pkgPath, JSON.stringify(output, null, 2) + \"\\n\", pkg.name);\n}\n","import fs from \"fs\";\nimport { copyFile, copyDir, pathExists } from \"./file-manager.js\";\nimport { joinPath } from \"../utils/paths.js\";\nimport { logger } from \"../utils/logger.js\";\n\n/**\n * Clone extra files (README, license, etc.) from the package root into the build directory.\n *\n * Each entry in the `clone` array can be:\n * - a plain string: copied from `<packageRoot>/<str>` to `<buildDir>/<str>`\n * - a tuple [src, dest]: copied from `<packageRoot>/<src>` to `<buildDir>/<dest>`\n */\nexport function cloneFiles(\n packageRoot: string,\n buildDir: string,\n cloneList: (string | [string, string])[],\n packageName: string,\n dryRun: boolean,\n): void {\n for (const entry of cloneList) {\n const [srcRel, destRel] =\n typeof entry === \"string\" ? [entry, entry] : entry;\n\n const src = joinPath(packageRoot, srcRel);\n const dest = joinPath(buildDir, destRel);\n\n if (!pathExists(src)) {\n logger.warn(`[clone-files] ${packageName}: source file not found, skipping — ${src}`);\n continue;\n }\n\n if (dryRun) {\n logger.info(`[dry-run] clone ${src} → ${dest}`);\n continue;\n }\n\n const stat = fs.statSync(src);\n if (stat.isDirectory()) {\n copyDir(src, dest);\n } else {\n copyFile(src, dest);\n }\n logger.debug(`Cloned ${src} → ${dest}`);\n }\n}\n","import chalk from \"chalk\";\n\nexport type LogLevel = \"info\" | \"success\" | \"warn\" | \"error\" | \"debug\" | \"step\";\n\nlet _verbose = false;\n\nexport function setVerbose(v: boolean): void {\n _verbose = v;\n}\n\nexport function log(level: LogLevel, message: string): void {\n const ts = new Date().toISOString().replace(\"T\", \" \").replace(\"Z\", \"\");\n switch (level) {\n case \"info\":\n console.log(chalk.cyan(`[${ts}] INFO ${message}`));\n break;\n case \"success\":\n console.log(chalk.green(`[${ts}] OK ${message}`));\n break;\n case \"warn\":\n console.warn(chalk.yellow(`[${ts}] WARN ${message}`));\n break;\n case \"error\":\n console.error(chalk.red(`[${ts}] ERROR ${message}`));\n break;\n case \"step\":\n console.log(chalk.blueBright(`[${ts}] STEP ${message}`));\n break;\n case \"debug\":\n if (_verbose) {\n console.log(chalk.gray(`[${ts}] DEBUG ${message}`));\n }\n break;\n }\n}\n\nexport const logger = {\n info: (msg: string) => log(\"info\", msg),\n success: (msg: string) => log(\"success\", msg),\n warn: (msg: string) => log(\"warn\", msg),\n error: (msg: string) => log(\"error\", msg),\n step: (msg: string) => log(\"step\", msg),\n debug: (msg: string) => log(\"debug\", msg),\n};\n","import path from \"path\";\nimport fs from \"fs\";\nimport { build } from \"tsdown\";\nimport type { InputOptions } from \"rolldown\";\nimport type { PackageBase } from \"../types/index.js\";\nimport { joinPath, toForwardSlash, resolvePath } from \"../utils/paths.js\";\nimport { ensureDir, moveFile, listFiles, pathExists } from \"../files/file-manager.js\";\nimport { wrapError } from \"../utils/errors.js\";\nimport { logger } from \"../utils/logger.js\";\n\n// ─── Helpers ───────────────────────────────────────────────────────────────\n\n/**\n * Collect all dependency names that should be treated as external.\n * Both `dependencies` and `peerDependencies` must never be bundled.\n */\nfunction collectExternals(sourceJson: Record<string, unknown>): string[] {\n const deps = Object.keys((sourceJson[\"dependencies\"] as Record<string, string> | undefined) ?? {});\n const peers = Object.keys((sourceJson[\"peerDependencies\"] as Record<string, string> | undefined) ?? {});\n return [...new Set([...deps, ...peers])];\n}\n\n/**\n * Resolve entry file paths to absolute forward-slash paths.\n */\nfunction resolveEntries(pkg: PackageBase, packageRoot: string): string[] {\n const srcDir = pkg.srcDir ?? \"src\";\n const rawEntries = pkg.entries ?? [\"index.ts\"];\n const entryList = Array.isArray(rawEntries) ? rawEntries : [rawEntries];\n return entryList.map((e) => toForwardSlash(resolvePath(packageRoot, srcDir, e)));\n}\n\n/**\n * Return the path to the tsconfig.json inside the package root, if it exists.\n */\nfunction findTsconfig(packageRoot: string): string | undefined {\n const local = joinPath(packageRoot, \"tsconfig.json\");\n return pathExists(local) ? local : undefined;\n}\n\n// ─── Main compiler ──────────────────────────────────────────────────────────\n\n/**\n * Compile a single package using tsdown.\n *\n * When `preserveModules` is on (the default), we run two separate tsdown builds\n * in parallel so that each format's output options are fully independent:\n *\n * ESM build — preserveModules: true, dts: true → _tmp_esm/ → esm/*.mjs + *.d.mts\n * CJS build — preserveModules: false, dts: false → _tmp_cjs/ → cjs/*.cjs\n *\n * CJS skips DTS because rolldown has a bug in CJS preserveModules mode where\n * `export { default as X }` assigns the whole module object to exports.X instead\n * of unwrapping .default. Bundled CJS has no such issue. Types are shared from\n * the ESM declarations (TypeScript resolves them correctly via the exports map).\n *\n * When `preserveModules` is false, a single combined build is used.\n */\nexport async function compilePackage(\n pkg: PackageBase,\n packageRoot: string,\n buildPath: string,\n sourceJson: Record<string, unknown>,\n dryRun: boolean,\n): Promise<void> {\n if (dryRun) {\n logger.info(`[dry-run] compile ${pkg.name} → ${buildPath}`);\n return;\n }\n\n const entries = resolveEntries(pkg, packageRoot);\n const formats = pkg.formats ?? [\"esm\", \"cjs\"];\n const externals = collectExternals(sourceJson);\n const tsconfig = findTsconfig(packageRoot);\n const shouldPreserveModules = pkg.preserveModules !== false;\n const srcDir = toForwardSlash(resolvePath(packageRoot, pkg.srcDir ?? \"src\"));\n\n logger.step(`Compiling ${pkg.name} (${formats.join(\", \")}) → ${buildPath}`);\n logger.debug(` entries: ${entries.join(\", \")}`);\n logger.debug(` externals: ${externals.slice(0, 8).join(\", \")}${externals.length > 8 ? \"…\" : \"\"}`);\n\n // Wipe any previous esm/ and cjs/ output so re-runs of the same version don't\n // leave stale files from a different build mode.\n for (const subDir of [\"esm\", \"cjs\"]) {\n const dir = resolvePath(buildPath, subDir);\n if (fs.existsSync(dir)) {\n fs.rmSync(dir, { recursive: true, force: true });\n }\n }\n\n // Build inputOptions for rolldown — used to set the JSX transform for React packages.\n const rolldownInputOptions: InputOptions | undefined =\n pkg.type === \"react\"\n ? {\n transform: {\n jsx: \"react-jsx\", // automatic runtime — works with React 17+\n },\n }\n : undefined;\n\n // Common options shared across all tsdown invocations.\n const sharedOptions = {\n entry: entries,\n deps: { neverBundle: externals },\n sourcemap: pkg.sourcemap !== false,\n clean: true,\n minify: pkg.minify ?? false,\n tsconfig: tsconfig ?? true,\n ...(rolldownInputOptions ? { inputOptions: rolldownInputOptions } : {}),\n } as const;\n\n try {\n if (shouldPreserveModules && formats.includes(\"esm\") && formats.includes(\"cjs\")) {\n // Two parallel builds: ESM with preserveModules + DTS, CJS bundled without DTS.\n const tmpEsm = toForwardSlash(resolvePath(buildPath, \"_tmp_esm\"));\n const tmpCjs = toForwardSlash(resolvePath(buildPath, \"_tmp_cjs\"));\n ensureDir(tmpEsm);\n ensureDir(tmpCjs);\n\n await Promise.all([\n build({\n ...sharedOptions,\n format: [\"esm\"],\n dts: pkg.dts !== false,\n outDir: tmpEsm,\n outputOptions: {\n preserveModules: true,\n preserveModulesRoot: srcDir,\n },\n }),\n build({\n ...sharedOptions,\n format: [\"cjs\"],\n // CJS skips DTS — types are served from ESM declarations (see package-json.ts).\n dts: false,\n outDir: tmpCjs,\n }),\n ]);\n\n reorganiseOutput(tmpEsm, buildPath, [\"esm\"], pkg, true);\n // keepNativeExtension=true: CJS files come out as .cjs from tsdown; we keep that\n // extension so the exports map (./cjs/index.cjs) resolves correctly.\n reorganiseOutput(tmpCjs, buildPath, [\"cjs\"], pkg, false, true);\n rmTmp(tmpEsm);\n rmTmp(tmpCjs);\n } else {\n // Single build: either one format only, or preserveModules disabled.\n const tmpDir = toForwardSlash(resolvePath(buildPath, \"_tmp\"));\n ensureDir(tmpDir);\n\n await build({\n ...sharedOptions,\n format: formats as (\"esm\" | \"cjs\")[],\n dts: pkg.dts !== false,\n outDir: tmpDir,\n ...(shouldPreserveModules && formats.includes(\"esm\")\n ? { outputOptions: { preserveModules: true, preserveModulesRoot: srcDir } }\n : {}),\n });\n\n reorganiseOutput(tmpDir, buildPath, formats as (\"esm\" | \"cjs\")[], pkg, shouldPreserveModules);\n rmTmp(tmpDir);\n }\n } catch (err) {\n throw wrapError(\"tsdown-build\", pkg.name, err);\n }\n\n logger.success(`Compiled ${pkg.name}`);\n}\n\nfunction rmTmp(dir: string): void {\n try {\n fs.rmSync(dir, { recursive: true, force: true });\n } catch {\n // non-fatal — stale tmp is harmless\n }\n}\n\n// ─── Output reorganisation ──────────────────────────────────────────────────\n\n/**\n * Move the flat tsdown output (in tmpDir) into `esm/` and `cjs/` subdirectories\n * under buildPath. Renames .mjs → .js and .cjs → .js so that relative imports\n * inside each format directory resolve correctly.\n */\nfunction reorganiseOutput(\n tmpDir: string,\n buildPath: string,\n formats: (\"esm\" | \"cjs\")[],\n pkg: PackageBase,\n preserveModules: boolean,\n keepNativeExtension = false,\n): void {\n const esmDir = joinPath(buildPath, \"esm\");\n const cjsDir = joinPath(buildPath, \"cjs\");\n\n if (formats.includes(\"esm\")) ensureDir(esmDir);\n if (formats.includes(\"cjs\")) ensureDir(cjsDir);\n\n const mainType = pkg.mainType ?? (formats.includes(\"cjs\") ? \"cjs\" : \"esm\");\n\n processDirectory(tmpDir, { esmDir, cjsDir, formats, mainType, pkg, tmpDir, preserveModules, keepNativeExtension });\n}\n\ninterface ReorgContext {\n esmDir: string;\n cjsDir: string;\n formats: (\"esm\" | \"cjs\")[];\n mainType: \"esm\" | \"cjs\";\n pkg: PackageBase;\n /** Absolute path to the flat _tmp/ directory — used to compute relative paths when preserveModules is on. */\n tmpDir: string;\n preserveModules: boolean;\n /**\n * When true, keep the native .mjs/.cjs extensions instead of normalising to .js.\n * Used in the CJS-only leg of the two-build path so the final file stays .cjs.\n */\n keepNativeExtension: boolean;\n}\n\nfunction processDirectory(dir: string, ctx: ReorgContext): void {\n if (!fs.existsSync(dir)) return;\n\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = joinPath(dir, entry.name);\n if (entry.isDirectory()) {\n // Recursively handle subdirectories (chunk splits, etc.)\n processDirectory(fullPath, ctx);\n } else {\n processFile(fullPath, entry.name, ctx);\n }\n }\n}\n\nfunction processFile(filePath: string, name: string, ctx: ReorgContext): void {\n const { esmDir, cjsDir, formats, mainType, pkg, tmpDir, preserveModules } = ctx;\n\n // Relative subdirectory from the tmp root — preserves folder structure for both\n // preserveModules output and multi-entry single-bundle output (where each entry\n // lands in its own subdirectory, e.g. cli/index.cjs).\n // path.relative may return backslashes on Windows — normalise to forward slashes.\n const relDir = toForwardSlash(path.relative(tmpDir, path.dirname(filePath)));\n\n if (preserveModules) {\n if (isEsmFile(name)) {\n if (formats.includes(\"esm\")) {\n moveFile(filePath, joinPath(esmDir, relDir, name), pkg.name);\n }\n } else if (isCjsFile(name)) {\n if (formats.includes(\"cjs\")) {\n moveFile(filePath, joinPath(cjsDir, relDir, name), pkg.name);\n }\n } else if (isDtsFile(name)) {\n const targetDir = formats.includes(\"esm\") ? esmDir : cjsDir;\n moveFile(filePath, joinPath(targetDir, relDir, name), pkg.name);\n }\n // Unknown extensions silently ignored.\n return;\n }\n\n // ── Single-bundle mode ──────────────────────────────────────────────────────\n const { keepNativeExtension } = ctx;\n\n if (isEsmFile(name)) {\n if (formats.includes(\"esm\")) {\n const destName = keepNativeExtension ? name : normaliseEsmName(name);\n moveFile(filePath, joinPath(esmDir, relDir, destName), pkg.name);\n }\n } else if (isCjsFile(name)) {\n if (formats.includes(\"cjs\")) {\n const destName = keepNativeExtension ? name : normaliseCjsName(name);\n moveFile(filePath, joinPath(cjsDir, relDir, destName), pkg.name);\n }\n } else if (isDtsFile(name)) {\n const targetDir = formats.includes(\"esm\") ? esmDir : cjsDir;\n moveFile(filePath, joinPath(targetDir, relDir, name), pkg.name);\n } else if (isJsFile(name)) {\n // Plain .js / .js.map — emitted when the format array contains only one format\n // (tsdown uses .js instead of .mjs/.cjs when there's no other format to differentiate from).\n const targetDir = mainType === \"esm\" ? esmDir : cjsDir;\n if (formats.includes(mainType)) {\n // Files landing in cjsDir should use the .cjs extension for consistency.\n const destName =\n targetDir === cjsDir\n ? name.replace(/\\.js\\.map$/, \".cjs.map\").replace(/\\.js$/, \".cjs\")\n : name;\n moveFile(filePath, joinPath(targetDir, relDir, destName), pkg.name);\n }\n }\n // Unknown extensions are silently ignored.\n}\n\n// ─── Extension predicates ───────────────────────────────────────────────────\n\nfunction isEsmFile(name: string): boolean {\n return (\n name.endsWith(\".mjs\") ||\n name.endsWith(\".mjs.map\") ||\n name.endsWith(\".d.mts\") ||\n name.endsWith(\".d.mts.map\")\n );\n}\n\nfunction isCjsFile(name: string): boolean {\n return (\n name.endsWith(\".cjs\") ||\n name.endsWith(\".cjs.map\") ||\n name.endsWith(\".d.cts\") ||\n name.endsWith(\".d.cts.map\")\n );\n}\n\nfunction isDtsFile(name: string): boolean {\n return name.endsWith(\".d.ts\") || name.endsWith(\".d.ts.map\");\n}\n\nfunction isJsFile(name: string): boolean {\n return (\n (name.endsWith(\".js\") || name.endsWith(\".js.map\")) &&\n !name.endsWith(\".d.ts\") &&\n !name.endsWith(\".d.ts.map\")\n );\n}\n\n// ─── Name normalisation ─────────────────────────────────────────────────────\n\n/** Rename .mjs / .d.mts → .js / .d.ts for the esm/ directory. */\nfunction normaliseEsmName(name: string): string {\n return name\n .replace(/\\.mjs\\.map$/, \".js.map\")\n .replace(/\\.mjs$/, \".js\")\n .replace(/\\.d\\.mts\\.map$/, \".d.ts.map\")\n .replace(/\\.d\\.mts$/, \".d.ts\");\n}\n\n/** Rename .cjs / .d.cts → .js / .d.ts for the cjs/ directory. */\nfunction normaliseCjsName(name: string): string {\n return name\n .replace(/\\.cjs\\.map$/, \".js.map\")\n .replace(/\\.cjs$/, \".js\")\n .replace(/\\.d\\.cts\\.map$/, \".d.ts.map\")\n .replace(/\\.d\\.cts$/, \".d.ts\");\n}\n","import semver from \"semver\";\nimport { wrapError } from \"../utils/errors.js\";\n\n/**\n * Given the current version string and a version strategy, return the new version.\n *\n * @param currentVersion semver string from source package.json, e.g. \"1.2.3\"\n * @param strategy \"auto\" / \"patch\" → patch bump\n * \"minor\" → minor bump\n * \"major\" → major bump\n * any valid semver string → use as-is\n * @param packageName used in error messages only\n */\nexport function resolveVersion(\n currentVersion: string,\n strategy: \"auto\" | \"patch\" | \"minor\" | \"major\" | string = \"auto\",\n packageName: string,\n): string {\n const bumpType =\n strategy === \"auto\" || strategy === \"patch\" ? \"patch\"\n : strategy === \"minor\" ? \"minor\"\n : strategy === \"major\" ? \"major\"\n : null;\n\n if (bumpType) {\n const bumped = semver.inc(currentVersion, bumpType);\n if (!bumped) {\n throw wrapError(\n \"version-increment\",\n packageName,\n new Error(\n `Cannot ${bumpType}-bump invalid semver version \"${currentVersion}\" for package \"${packageName}\"`,\n ),\n );\n }\n return bumped;\n }\n\n // Explicit version string — validate it\n const cleaned = semver.valid(semver.coerce(strategy) ?? strategy);\n if (!cleaned) {\n throw wrapError(\n \"version-increment\",\n packageName,\n new Error(\n `Explicit version \"${strategy}\" is not a valid semver string for package \"${packageName}\"`,\n ),\n );\n }\n return cleaned;\n}\n","import simpleGit, { SimpleGit } from \"simple-git\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { joinPath } from \"../utils/paths.js\";\nimport { wrapError } from \"../utils/errors.js\";\nimport { logger } from \"../utils/logger.js\";\n\n/**\n * Returns true if the given directory is inside a git repository.\n */\nexport async function isGitRepo(dir: string): Promise<boolean> {\n try {\n const git: SimpleGit = simpleGit(dir);\n const result = await git.checkIsRepo();\n return result;\n } catch {\n return false;\n }\n}\n\n/**\n * Perform git operations for a package after a successful build:\n * 1. git add -A (in the package root)\n * 2. git commit -m <message>\n * 3. git push origin <branch>\n * 4. git tag v<version>\n * 5. git push origin <tag>\n */\nexport async function gitCommitTagPush(\n packageRoot: string,\n packageName: string,\n version: string,\n commitMessage: string,\n branch: string,\n dryRun: boolean,\n): Promise<void> {\n const isRepo = await isGitRepo(packageRoot);\n if (!isRepo) {\n logger.warn(`[git] ${packageName}: directory is not a git repo — skipping git operations`);\n return;\n }\n\n const tag = `v${version}`;\n logger.step(`[git] ${packageName}: commit \"${commitMessage}\", tag ${tag}, push to ${branch}`);\n\n if (dryRun) {\n logger.info(`[dry-run] git add + commit \"${commitMessage}\" + tag ${tag} + push`);\n return;\n }\n\n const git: SimpleGit = simpleGit(packageRoot);\n\n try {\n // Stage all changes\n await git.add(\"-A\");\n\n // Commit\n await git.commit(commitMessage);\n\n // Push to remote\n await git.push(\"origin\", branch);\n\n // Tag\n await git.addTag(tag);\n\n // Push tags\n await git.pushTags(\"origin\");\n\n logger.success(`[git] ${packageName}: pushed ${branch}, tagged ${tag}`);\n } catch (err) {\n throw wrapError(\"git-operations\", packageName, err);\n }\n}\n\n/**\n * Resolve the current branch name in the given directory.\n * Falls back to \"main\" if the directory is not a git repo.\n */\nexport async function currentBranch(dir: string): Promise<string> {\n try {\n const git: SimpleGit = simpleGit(dir);\n const branch = await git.revparse([\"--abbrev-ref\", \"HEAD\"]);\n return branch.trim() || \"main\";\n } catch {\n return \"main\";\n }\n}\n","import { execa } from \"execa\";\nimport { wrapError } from \"./errors.js\";\n\nexport interface ExecResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\n/**\n * Run a shell command and return stdout/stderr.\n * Throws a BundlerError on non-zero exit.\n */\nexport async function exec(\n step: string,\n packageName: string,\n command: string,\n args: string[],\n cwd?: string,\n): Promise<ExecResult> {\n try {\n const result = await execa(command, args, {\n cwd,\n all: true,\n reject: false,\n });\n if (result.exitCode !== 0) {\n const combined = result.all ?? result.stderr ?? \"\";\n throw new Error(\n `Command \"${command} ${args.join(\" \")}\" exited with code ${result.exitCode}.\\n${combined}`,\n );\n }\n return {\n stdout: result.stdout ?? \"\",\n stderr: result.stderr ?? \"\",\n exitCode: result.exitCode,\n };\n } catch (err) {\n throw wrapError(step, packageName, err);\n }\n}\n\n/**\n * Run a command and ignore its output. Does NOT throw on non-zero exit.\n * Useful for optional operations (e.g. `git tag -d`).\n */\nexport async function execSilent(\n command: string,\n args: string[],\n cwd?: string,\n): Promise<number> {\n try {\n const result = await execa(command, args, { cwd, reject: false });\n return result.exitCode ?? 0;\n } catch {\n return 1;\n }\n}\n","import { exec } from \"../utils/exec.js\";\nimport { logger } from \"../utils/logger.js\";\nimport type { PackageBase } from \"../types/index.js\";\n\n/**\n * Run `npm publish` from the build output directory.\n */\nexport async function publishPackage(\n pkg: PackageBase,\n buildPath: string,\n dryRun: boolean,\n): Promise<void> {\n if (pkg.publish === false) {\n logger.info(`[publish] ${pkg.name}: publish=false, skipping`);\n return;\n }\n\n const access = pkg.access ?? \"public\";\n\n if (dryRun) {\n logger.info(`[dry-run] npm publish --access ${access} from ${buildPath}`);\n return;\n }\n\n logger.step(`Publishing ${pkg.name}@... to npm (access: ${access})`);\n\n await exec(\n \"npm-publish\",\n pkg.name,\n \"npm\",\n [\"publish\", \"--access\", access],\n buildPath,\n );\n\n logger.success(`Published ${pkg.name}`);\n}\n","import path from \"path\";\nimport { copyDir, ensureDir } from \"../files/file-manager.js\";\nimport {\n readSourcePackageJson,\n writeSourceVersion,\n writeBuildPackageJson,\n} from \"../files/package-json.js\";\nimport { cloneFiles } from \"../files/clone-files.js\";\nimport { compilePackage } from \"../compile/tsdown-compiler.js\";\nimport { resolveVersion } from \"../version/increment.js\";\nimport { gitCommitTagPush, currentBranch } from \"../git/operations.js\";\nimport { publishPackage } from \"../publish/npm-publisher.js\";\nimport { buildOutputPath, sourceSnapshotPath, resolvePath } from \"../utils/paths.js\";\nimport { wrapError } from \"../utils/errors.js\";\nimport { logger } from \"../utils/logger.js\";\nimport type { PackageBase, BuildOptions, BuilderSettings } from \"../types/index.js\";\n\nexport interface BuildResult {\n packageName: string;\n version: string;\n buildPath: string;\n success: boolean;\n error?: Error;\n}\n\n/**\n * Execute the full build pipeline for a single package.\n *\n * Steps:\n * 1. Resolve package root\n * 2. Read source package.json → current version\n * 3. Compute new version\n * 4. Create build output directory\n * 5. Source snapshot (optional)\n * 6. tsdown compile\n * 7. Clone extra files\n * 8. Write build package.json\n * 9. Update source package.json version\n * 10. Git: add, commit, push, tag\n * 11. npm publish\n */\nexport async function buildPackage(\n pkg: PackageBase,\n versionStrategy: \"auto\" | string = \"auto\",\n settings: BuilderSettings,\n options: BuildOptions,\n configDir: string,\n /**\n * Override commit message (used by family builder to apply a shared message).\n * If undefined, uses pkg.commit.\n */\n overrideCommit?: string,\n /**\n * Pre-resolved version — used when a family has already determined the version\n * and needs all member packages to use the same one.\n */\n forcedVersion?: string,\n): Promise<BuildResult> {\n const step = \"package-builder\";\n\n try {\n // 1. Resolve absolute package root\n const packageRoot = resolvePath(configDir, pkg.root);\n\n // 2. Read source package.json\n const sourceJson = readSourcePackageJson(packageRoot, pkg.name);\n const currentVersion = sourceJson.version;\n\n // 3. Determine new version\n const newVersion =\n forcedVersion ?? resolveVersion(currentVersion, versionStrategy, pkg.name);\n\n logger.info(`Building ${pkg.name}: ${currentVersion} → ${newVersion}`);\n\n // 4. Build output directory\n const absoluteBuildDir = resolvePath(configDir, settings.buildDir);\n const buildPath = buildOutputPath(absoluteBuildDir, pkg.name, newVersion);\n\n if (!options.dryRun) {\n ensureDir(buildPath);\n }\n\n // 5. Source snapshot\n if (settings.sourcesDir) {\n const absoluteSourcesDir = resolvePath(configDir, settings.sourcesDir);\n const snapshotPath = sourceSnapshotPath(absoluteSourcesDir, pkg.name);\n if (options.dryRun) {\n logger.info(`[dry-run] snapshot ${packageRoot} → ${snapshotPath}`);\n } else {\n ensureDir(snapshotPath);\n copyDir(packageRoot, snapshotPath);\n logger.debug(`Snapshot: ${packageRoot} → ${snapshotPath}`);\n }\n }\n\n // 6. Compile with tsdown\n await compilePackage(pkg, packageRoot, buildPath, sourceJson as Record<string, unknown>, options.dryRun);\n\n // 7. Clone extra files\n if (pkg.clone && pkg.clone.length > 0) {\n cloneFiles(packageRoot, buildPath, pkg.clone, pkg.name, options.dryRun);\n }\n\n // 8. Write build package.json\n if (!options.dryRun) {\n writeBuildPackageJson(pkg, sourceJson, buildPath, newVersion);\n logger.debug(`Wrote build package.json for ${pkg.name}@${newVersion}`);\n } else {\n logger.info(`[dry-run] write build package.json for ${pkg.name}@${newVersion}`);\n }\n\n // 9. Update source package.json version\n if (!options.dryRun) {\n writeSourceVersion(packageRoot, pkg.name, newVersion);\n logger.debug(`Updated source version ${pkg.name} → ${newVersion}`);\n } else {\n logger.info(`[dry-run] update source package.json version → ${newVersion}`);\n }\n\n // 10. Git operations (only if commit message is set and --no-git is not passed)\n const commitMessage = overrideCommit ?? pkg.commit;\n if (commitMessage && !options.noGit) {\n const branch = pkg.branch ?? (await currentBranch(packageRoot));\n await gitCommitTagPush(\n packageRoot,\n pkg.name,\n newVersion,\n commitMessage,\n branch,\n options.dryRun,\n );\n } else if (!commitMessage) {\n logger.debug(`[git] ${pkg.name}: no commit message set — skipping git`);\n }\n\n // 11. npm publish\n if (!options.noPublish) {\n await publishPackage(pkg, buildPath, options.dryRun);\n } else {\n logger.info(`[publish] ${pkg.name}: --no-publish, skipping`);\n }\n\n return { packageName: pkg.name, version: newVersion, buildPath, success: true };\n } catch (err) {\n const wrapped = wrapError(step, pkg.name, err);\n logger.error(`Failed to build ${pkg.name}: ${wrapped.message}`);\n return {\n packageName: pkg.name,\n version: \"\",\n buildPath: \"\",\n success: false,\n error: wrapped,\n };\n }\n}\n","import semver from \"semver\";\nimport { readSourcePackageJson } from \"../files/package-json.js\";\nimport { resolveVersion } from \"../version/increment.js\";\nimport { resolvePath } from \"../utils/paths.js\";\nimport { buildPackage } from \"./package-builder.js\";\nimport { runParallel } from \"./parallel-builder.js\";\nimport { wrapError } from \"../utils/errors.js\";\nimport { logger } from \"../utils/logger.js\";\nimport type { Family, BuildOptions, BuilderSettings } from \"../types/index.js\";\nimport type { BuildResult } from \"./package-builder.js\";\n\n/**\n * Build all packages in a family using a single shared version.\n *\n * The shared version is determined by taking the HIGHEST current version\n * across all family members and bumping it. This prevents a lower-versioned\n * member (e.g. atomic-query@0.1.0) from pulling down a higher-versioned one\n * (e.g. react-atom@5.1.3) when they are first unified.\n */\nexport async function buildFamily(\n family: Family,\n settings: BuilderSettings,\n options: BuildOptions,\n configDir: string,\n): Promise<BuildResult[]> {\n if (family.packages.length === 0) {\n logger.warn(`Family \"${family.name}\" has no packages — nothing to build`);\n return [];\n }\n\n let newVersion: string;\n try {\n const strategy = family.version ?? \"auto\";\n const isBumpKeyword = strategy === \"auto\" || strategy === \"patch\" || strategy === \"minor\" || strategy === \"major\";\n\n if (!isBumpKeyword && semver.valid(semver.coerce(strategy) ?? strategy)) {\n // Explicit semver string — use as-is\n newVersion = strategy;\n } else {\n // Bump keyword — find the highest current version across all family members, then bump it\n let highestVersion = \"0.0.0\";\n for (const pkg of family.packages) {\n const root = resolvePath(configDir, pkg.root);\n const sourceJson = readSourcePackageJson(root, pkg.name);\n const v = sourceJson.version ?? \"0.0.0\";\n if (semver.gt(v, highestVersion)) {\n highestVersion = v;\n }\n }\n newVersion = resolveVersion(highestVersion, strategy, family.name);\n }\n } catch (err) {\n throw wrapError(\"family-version\", family.name, err);\n }\n\n logger.info(`Family \"${family.name}\": shared version → ${newVersion} (${family.packages.length} packages)`);\n\n const concurrency = options.concurrency ?? settings.concurrency ?? 4;\n\n // The family commit message overrides per-package commit messages\n const familyCommit = family.commit;\n\n const tasks = family.packages.map((pkg) => () =>\n buildPackage(\n pkg,\n \"auto\", // not used — forcedVersion overrides\n settings,\n options,\n configDir,\n familyCommit ?? pkg.commit,\n newVersion, // all packages use the same version\n ),\n );\n\n return runParallel(tasks, concurrency);\n}\n","import pLimit from \"p-limit\";\nimport type { BuildResult } from \"./package-builder.js\";\nimport { logger } from \"../utils/logger.js\";\n\n/**\n * Run an array of async build tasks with a concurrency cap.\n * Each task is a zero-argument function that returns a Promise<BuildResult>.\n */\nexport async function runParallel(\n tasks: (() => Promise<BuildResult>)[],\n concurrency: number,\n): Promise<BuildResult[]> {\n if (tasks.length === 0) return [];\n\n const limit = pLimit(Math.max(1, concurrency));\n\n logger.info(`Running ${tasks.length} task(s) with concurrency=${concurrency}`);\n\n const results = await Promise.all(\n tasks.map((task) => limit(task)),\n );\n\n const succeeded = results.filter((r) => r.success).length;\n const failed = results.filter((r) => !r.success).length;\n\n if (failed > 0) {\n logger.warn(`${succeeded} succeeded, ${failed} failed`);\n for (const r of results.filter((r) => !r.success)) {\n logger.error(` FAILED: ${r.packageName} — ${r.error?.message ?? \"unknown error\"}`);\n }\n } else {\n logger.success(`All ${succeeded} package(s) built successfully`);\n }\n\n return results;\n}\n"],"mappings":"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","names":["path","path","fs","path","fs","path","fs","fs","path","fs","fs","path","semver","r","semver"]}
|
|
1
|
+
{"version":3,"sources":["../src/config/define-config.ts","../src/config/load-config.ts","../src/utils/paths.ts","../src/utils/errors.ts","../src/files/file-manager.ts","../src/files/package-json.ts","../src/files/clone-files.ts","../src/utils/logger.ts","../src/compile/tsdown-compiler.ts","../src/version/increment.ts","../src/git/operations.ts","../src/utils/exec.ts","../src/publish/npm-publisher.ts","../src/build/package-builder.ts","../src/build/family-builder.ts","../src/build/parallel-builder.ts"],"sourcesContent":["import type { BundlerConfig } from \"../types/index.js\";\n\n/**\n * Type-safe config factory.\n * Simply returns the config object unchanged — used purely for IDE autocomplete and type checking.\n */\nexport function defineConfig(config: BundlerConfig): BundlerConfig {\n return config;\n}\n","import path from \"path\";\nimport { pathToFileURL } from \"url\";\nimport fs from \"fs\";\nimport type { BundlerConfig } from \"../types/index.js\";\nimport { resolvePath } from \"../utils/paths.js\";\nimport { wrapError } from \"../utils/errors.js\";\n\nexport interface LoadedConfig {\n config: BundlerConfig;\n /** Absolute, forward-slash normalised path to the config file */\n configPath: string;\n /** Directory containing the config file — used to resolve relative roots */\n configDir: string;\n}\n\n/**\n * Register tsx as a Node loader so TypeScript config files can be imported\n * directly via dynamic import(). Safe to call multiple times — tsx is only\n * registered once. No-ops when tsx is not installed (JS-only config still works).\n */\nasync function ensureTsxRegistered(): Promise<void> {\n try {\n const { register } = await import(\"node:module\");\n let tsxUrl: string | null = null;\n try {\n tsxUrl = import.meta.resolve(\"tsx/esm\");\n } catch {\n // tsx not installed — JS-only configs still work fine\n }\n if (register && tsxUrl) {\n register(tsxUrl, import.meta.url);\n }\n } catch {\n // node:module unavailable (old Node) — fall through silently\n }\n}\n\n/** Load and validate a pkgist config file (TypeScript or JavaScript). */\nexport async function loadConfig(configFilePath: string): Promise<LoadedConfig> {\n const absolute = resolvePath(configFilePath);\n\n if (!fs.existsSync(absolute)) {\n throw new Error(`Config file not found: ${absolute}`);\n }\n\n let mod: { default?: BundlerConfig };\n\n try {\n // Register tsx so .ts config files import without the user needing\n // to prefix the command with `node --import tsx/esm`.\n if (absolute.endsWith(\".ts\")) {\n await ensureTsxRegistered();\n }\n\n // Convert to a file:// URL so dynamic import works correctly on Windows.\n const fileUrl = pathToFileURL(absolute).href;\n mod = await import(fileUrl);\n } catch (err) {\n throw wrapError(\"load-config\", absolute, err);\n }\n\n const config = mod.default;\n\n if (!config || typeof config !== \"object\") {\n throw new Error(\n `Config file ${absolute} must export a default object from defineConfig(). Got: ${typeof config}`,\n );\n }\n\n validateConfig(config, absolute);\n\n return {\n config,\n configPath: absolute,\n configDir: resolvePath(path.dirname(absolute)),\n };\n}\n\nfunction validateConfig(config: BundlerConfig, filePath: string): void {\n if (!config.settings) {\n throw new Error(`Config \"${filePath}\" must have a \"settings\" object.`);\n }\n if (!config.settings.buildDir) {\n throw new Error(`Config \"${filePath}\" settings.buildDir is required.`);\n }\n\n const names = new Set<string>();\n\n for (const pkg of config.standalone ?? []) {\n if (!pkg.name) throw new Error(`Standalone package is missing \"name\" in ${filePath}`);\n if (!pkg.root) throw new Error(`Standalone package \"${pkg.name}\" is missing \"root\"`);\n if (names.has(pkg.name)) throw new Error(`Duplicate package name: \"${pkg.name}\"`);\n names.add(pkg.name);\n }\n\n for (const family of config.families ?? []) {\n if (!family.name) throw new Error(`A family is missing \"name\" in ${filePath}`);\n for (const pkg of family.packages) {\n if (!pkg.name) throw new Error(`Package inside family \"${family.name}\" is missing \"name\"`);\n if (!pkg.root) throw new Error(`Package \"${pkg.name}\" in family \"${family.name}\" is missing \"root\"`);\n if (names.has(pkg.name)) throw new Error(`Duplicate package name: \"${pkg.name}\"`);\n names.add(pkg.name);\n }\n }\n}\n\n/**\n * Attempt to find the default config file in the working directory.\n * Tries: builder.ts, builder.js, mongez.ts, mongez.js\n */\nexport function findDefaultConfigPath(cwd: string): string {\n const candidates = [\"pkgist.config.ts\", \"pkgist.config.js\", \"builder.ts\", \"builder.js\", \"mongez.ts\", \"mongez.js\"];\n for (const candidate of candidates) {\n const full = path.join(cwd, candidate);\n if (fs.existsSync(full)) return full;\n }\n throw new Error(\n `No config file found in ${cwd}. Tried: ${candidates.join(\", \")}. ` +\n `Use --config <path> to specify a custom location.`,\n );\n}\n","import path from \"path\";\n\n/** Normalise any path to forward-slash form (Windows-safe). */\nexport function toForwardSlash(p: string): string {\n return p.replace(/\\\\/g, \"/\");\n}\n\n/** Join path segments and normalise the result to forward slashes. */\nexport function joinPath(...segments: string[]): string {\n return toForwardSlash(path.join(...segments));\n}\n\n/** Resolve an absolute path from segments and normalise to forward slashes. */\nexport function resolvePath(...segments: string[]): string {\n return toForwardSlash(path.resolve(...segments));\n}\n\n/**\n * Given a package name like \"@mongez/reinforcements\",\n * return just the scoped part without the scope prefix: \"reinforcements\".\n */\nexport function scopelessName(packageName: string): string {\n const slash = packageName.indexOf(\"/\");\n return slash === -1 ? packageName : packageName.slice(slash + 1);\n}\n\n/**\n * Build the versioned build output path:\n * <buildDir>/<scopeless-name>/<version>/\n */\nexport function buildOutputPath(\n buildDir: string,\n packageName: string,\n version: string,\n): string {\n return joinPath(buildDir, scopelessName(packageName), version);\n}\n\n/**\n * Build the sources snapshot path:\n * <sourcesDir>/<scopeless-name>/\n */\nexport function sourceSnapshotPath(\n sourcesDir: string,\n packageName: string,\n): string {\n return joinPath(sourcesDir, scopelessName(packageName));\n}\n","/** Base error class for all bundler errors. Carries a step name for structured logging. */\nexport class BundlerError extends Error {\n constructor(\n public readonly step: string,\n public readonly packageName: string,\n message: string,\n public readonly cause?: unknown,\n ) {\n super(message);\n this.name = \"BundlerError\";\n if (cause instanceof Error && cause.stack) {\n this.stack = `${this.stack}\\nCaused by: ${cause.stack}`;\n }\n }\n}\n\n/** Wrap any thrown value into a BundlerError with context. */\nexport function wrapError(\n step: string,\n packageName: string,\n error: unknown,\n): BundlerError {\n if (error instanceof BundlerError) return error;\n const msg =\n error instanceof Error\n ? error.message\n : typeof error === \"string\"\n ? error\n : JSON.stringify(error);\n return new BundlerError(step, packageName, `[${step}] ${packageName}: ${msg}`, error);\n}\n\n/** Throw a wrapped error immediately. */\nexport function failWith(\n step: string,\n packageName: string,\n error: unknown,\n): never {\n throw wrapError(step, packageName, error);\n}\n","import fs from \"fs\";\nimport path from \"path\";\nimport { resolvePath, joinPath } from \"../utils/paths.js\";\nimport { wrapError } from \"../utils/errors.js\";\n\n/**\n * Ensure a directory exists, creating all intermediate directories as needed.\n */\nexport function ensureDir(dir: string): void {\n try {\n fs.mkdirSync(dir, { recursive: true });\n } catch (err) {\n throw wrapError(\"ensure-dir\", dir, err);\n }\n}\n\n/**\n * Copy a single file from src to dest.\n * Creates the destination directory if it does not exist.\n */\nexport function copyFile(src: string, dest: string): void {\n ensureDir(path.dirname(dest));\n try {\n fs.copyFileSync(src, dest);\n } catch (err) {\n throw wrapError(\"copy-file\", src, err);\n }\n}\n\n/** Directories that are never copied in any directory tree operation. */\nconst COPY_EXCLUDES = new Set([\".git\", \"node_modules\", \"dist\", \".turbo\", \".cache\"]);\n\n/**\n * Copy an entire directory tree recursively, skipping .git and node_modules.\n */\nexport function copyDir(src: string, dest: string): void {\n ensureDir(dest);\n const entries = fs.readdirSync(src, { withFileTypes: true });\n for (const entry of entries) {\n if (COPY_EXCLUDES.has(entry.name)) continue;\n const srcPath = joinPath(src, entry.name);\n const destPath = joinPath(dest, entry.name);\n if (entry.isDirectory()) {\n copyDir(srcPath, destPath);\n } else {\n copyFile(srcPath, destPath);\n }\n }\n}\n\n/**\n * Read a file as a UTF-8 string, or throw a BundlerError with context.\n */\nexport function readFile(filePath: string, packageName = filePath): string {\n try {\n return fs.readFileSync(filePath, \"utf-8\");\n } catch (err) {\n throw wrapError(\"read-file\", packageName, err);\n }\n}\n\n/**\n * Write a UTF-8 string to a file, creating intermediate directories.\n */\nexport function writeFile(filePath: string, content: string, packageName = filePath): void {\n ensureDir(path.dirname(filePath));\n try {\n fs.writeFileSync(filePath, content, \"utf-8\");\n } catch (err) {\n throw wrapError(\"write-file\", packageName, err);\n }\n}\n\n/**\n * Move all files matching a glob-like condition.\n * Actually does a rename — works only within the same filesystem volume.\n */\nexport function moveFile(src: string, dest: string, packageName = src): void {\n ensureDir(path.dirname(dest));\n try {\n fs.renameSync(src, dest);\n } catch (err) {\n // rename across devices fails — fall back to copy+unlink\n try {\n fs.copyFileSync(src, dest);\n fs.unlinkSync(src);\n } catch (fallbackErr) {\n throw wrapError(\"move-file\", packageName, fallbackErr);\n }\n }\n}\n\n/**\n * Check whether a path exists on the filesystem.\n */\nexport function pathExists(p: string): boolean {\n return fs.existsSync(p);\n}\n\n/**\n * List all file paths inside a directory (non-recursive).\n */\nexport function listFiles(dir: string): string[] {\n if (!fs.existsSync(dir)) return [];\n return fs\n .readdirSync(dir, { withFileTypes: true })\n .filter((e) => e.isFile())\n .map((e) => joinPath(dir, e.name));\n}\n","import path from \"path\";\nimport { readFile, writeFile } from \"./file-manager.js\";\nimport { joinPath } from \"../utils/paths.js\";\nimport { wrapError } from \"../utils/errors.js\";\nimport type { PackageBase } from \"../types/index.js\";\n\n// Fields kept verbatim from the source package.json into the build package.json.\nconst KEPT_FIELDS = [\n \"name\",\n \"description\",\n \"keywords\",\n \"author\",\n \"license\",\n \"repository\",\n \"homepage\",\n \"bugs\",\n \"dependencies\",\n \"peerDependencies\",\n \"sideEffects\",\n \"bin\",\n \"engines\",\n] as const;\n\nexport type SourcePackageJson = Record<string, unknown> & {\n version: string;\n dependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n};\n\n/**\n * Read and parse the package.json at <packageRoot>/package.json.\n * Throws a BundlerError if the file is missing or malformed.\n */\nexport function readSourcePackageJson(\n packageRoot: string,\n packageName: string,\n): SourcePackageJson {\n const pkgPath = joinPath(packageRoot, \"package.json\");\n let raw: string;\n try {\n raw = readFile(pkgPath, packageName);\n } catch {\n throw wrapError(\n \"read-package-json\",\n packageName,\n new Error(`package.json not found at ${pkgPath}`),\n );\n }\n\n try {\n const parsed = JSON.parse(raw) as SourcePackageJson;\n if (!parsed.version) {\n throw new Error(`package.json at ${pkgPath} is missing \"version\" field`);\n }\n return parsed;\n } catch (err) {\n throw wrapError(\"parse-package-json\", packageName, err);\n }\n}\n\n/**\n * Write the new version back into the source package.json.\n */\nexport function writeSourceVersion(\n packageRoot: string,\n packageName: string,\n newVersion: string,\n): void {\n const pkgPath = joinPath(packageRoot, \"package.json\");\n const raw = readFile(pkgPath, packageName);\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n parsed.version = newVersion;\n writeFile(pkgPath, JSON.stringify(parsed, null, 2) + \"\\n\", packageName);\n}\n\n/**\n * Build and write the clean package.json for the build output directory.\n */\nexport function writeBuildPackageJson(\n pkg: PackageBase,\n sourceJson: SourcePackageJson,\n buildPath: string,\n newVersion: string,\n): void {\n const formats = pkg.formats ?? [\"esm\", \"cjs\"];\n const hasEsm = formats.includes(\"esm\");\n const hasCjs = formats.includes(\"cjs\");\n const esmOnly = hasEsm && !hasCjs;\n\n // When preserveModules is on (the default), tsdown keeps one file per source\n // module and uses native extensions (.mjs/.cjs) so internal cross-file imports\n // resolve correctly. When bundling, everything is renamed to .js for simplicity.\n const preserve = pkg.preserveModules !== false;\n const esmExt = preserve ? \".mjs\" : \".js\";\n const cjsExt = preserve ? \".cjs\" : \".js\";\n const esmDts = preserve ? \".d.mts\" : \".d.ts\";\n const cjsDts = preserve ? \".d.cts\" : \".d.ts\";\n\n // Determine entry base names from entries config\n const rawEntries = pkg.entries ?? [\"index.ts\"];\n const entryList = Array.isArray(rawEntries) ? rawEntries : [rawEntries];\n\n /**\n * Convert an entry path (relative to srcDir) into:\n * basePath — path without extension, used to build file paths (e.g. \"cli/index\")\n * exportPath — the key in the exports map (e.g. \"./cli\")\n *\n * When the basename is \"index\" the directory becomes the export path so that\n * `cli/index.ts` maps to `\"./cli\"` and `index.ts` maps to `\".\"`.\n */\n function entryPaths(entry: string): { basePath: string; exportPath: string } {\n const basePath = entry.replace(/\\.tsx?$/, \"\");\n const parts = basePath.split(\"/\");\n const last = parts[parts.length - 1];\n let exportPath: string;\n if (last === \"index\") {\n const dir = parts.slice(0, -1).join(\"/\");\n exportPath = dir ? `./${dir}` : \".\";\n } else {\n exportPath = `./${basePath}`;\n }\n return { basePath, exportPath };\n }\n\n // Primary entry drives `main` / `module` / `types` fields.\n const { basePath: primaryBase } = entryPaths(entryList[0]!);\n\n // Build the full exports map — one condition block per entry.\n const exportsMap: Record<string, unknown> = {};\n\n for (const entry of entryList) {\n const { basePath, exportPath } = entryPaths(entry);\n const conditions: Record<string, unknown> = {};\n\n if (hasEsm) {\n conditions[\"import\"] = {\n types: `./esm/${basePath}${esmDts}`,\n default: `./esm/${basePath}${esmExt}`,\n };\n }\n if (hasCjs) {\n // When preserveModules is on, CJS is built without DTS to avoid a rolldown bug.\n // TypeScript resolves types correctly from the ESM declarations via the exports map.\n const cjsTypes = preserve && hasEsm\n ? `./esm/${basePath}${esmDts}`\n : `./cjs/${basePath}${cjsDts}`;\n conditions[\"require\"] = {\n types: cjsTypes,\n default: `./cjs/${basePath}${cjsExt}`,\n };\n }\n\n exportsMap[exportPath] = conditions;\n }\n\n const output: Record<string, unknown> = {};\n\n // Copy allowed fields from source\n for (const field of KEPT_FIELDS) {\n if (field in sourceJson && sourceJson[field] !== undefined) {\n output[field] = sourceJson[field];\n }\n }\n\n // Override name / version\n output[\"name\"] = pkg.name;\n output[\"version\"] = newVersion;\n\n if (esmOnly) {\n output[\"type\"] = \"module\";\n }\n\n // Entry points\n const mainType = pkg.mainType ?? \"cjs\";\n if (mainType === \"esm\" || esmOnly) {\n output[\"main\"] = `./esm/${primaryBase}${esmExt}`;\n } else {\n output[\"main\"] = `./cjs/${primaryBase}${cjsExt}`;\n }\n\n if (hasEsm) {\n output[\"module\"] = `./esm/${primaryBase}${esmExt}`;\n }\n\n output[\"types\"] = `./esm/${primaryBase}${esmDts}`;\n\n output[\"exports\"] = exportsMap;\n\n const pkgPath = joinPath(buildPath, \"package.json\");\n writeFile(pkgPath, JSON.stringify(output, null, 2) + \"\\n\", pkg.name);\n}\n","import fs from \"fs\";\nimport { copyFile, copyDir, pathExists } from \"./file-manager.js\";\nimport { joinPath } from \"../utils/paths.js\";\nimport { logger } from \"../utils/logger.js\";\n\n/**\n * Clone extra files (README, license, etc.) from the package root into the build directory.\n *\n * Each entry in the `clone` array can be:\n * - a plain string: copied from `<packageRoot>/<str>` to `<buildDir>/<str>`\n * - a tuple [src, dest]: copied from `<packageRoot>/<src>` to `<buildDir>/<dest>`\n */\nexport function cloneFiles(\n packageRoot: string,\n buildDir: string,\n cloneList: (string | [string, string])[],\n packageName: string,\n dryRun: boolean,\n): void {\n for (const entry of cloneList) {\n const [srcRel, destRel] =\n typeof entry === \"string\" ? [entry, entry] : entry;\n\n const src = joinPath(packageRoot, srcRel);\n const dest = joinPath(buildDir, destRel);\n\n if (!pathExists(src)) {\n logger.warn(`[clone-files] ${packageName}: source file not found, skipping — ${src}`);\n continue;\n }\n\n if (dryRun) {\n logger.info(`[dry-run] clone ${src} → ${dest}`);\n continue;\n }\n\n const stat = fs.statSync(src);\n if (stat.isDirectory()) {\n copyDir(src, dest);\n } else {\n copyFile(src, dest);\n }\n logger.debug(`Cloned ${src} → ${dest}`);\n }\n}\n","import chalk from \"chalk\";\n\nexport type LogLevel = \"info\" | \"success\" | \"warn\" | \"error\" | \"debug\" | \"step\";\n\nlet _verbose = false;\n\nexport function setVerbose(v: boolean): void {\n _verbose = v;\n}\n\nexport function log(level: LogLevel, message: string): void {\n const ts = new Date().toISOString().replace(\"T\", \" \").replace(\"Z\", \"\");\n switch (level) {\n case \"info\":\n console.log(chalk.cyan(`[${ts}] INFO ${message}`));\n break;\n case \"success\":\n console.log(chalk.green(`[${ts}] OK ${message}`));\n break;\n case \"warn\":\n console.warn(chalk.yellow(`[${ts}] WARN ${message}`));\n break;\n case \"error\":\n console.error(chalk.red(`[${ts}] ERROR ${message}`));\n break;\n case \"step\":\n console.log(chalk.blueBright(`[${ts}] STEP ${message}`));\n break;\n case \"debug\":\n if (_verbose) {\n console.log(chalk.gray(`[${ts}] DEBUG ${message}`));\n }\n break;\n }\n}\n\nexport const logger = {\n info: (msg: string) => log(\"info\", msg),\n success: (msg: string) => log(\"success\", msg),\n warn: (msg: string) => log(\"warn\", msg),\n error: (msg: string) => log(\"error\", msg),\n step: (msg: string) => log(\"step\", msg),\n debug: (msg: string) => log(\"debug\", msg),\n};\n","import path from \"path\";\nimport fs from \"fs\";\nimport { build } from \"tsdown\";\nimport type { InputOptions } from \"rolldown\";\nimport type { PackageBase } from \"../types/index.js\";\nimport { joinPath, toForwardSlash, resolvePath } from \"../utils/paths.js\";\nimport { ensureDir, moveFile, listFiles, pathExists } from \"../files/file-manager.js\";\nimport { wrapError } from \"../utils/errors.js\";\nimport { logger } from \"../utils/logger.js\";\n\n// ─── Helpers ───────────────────────────────────────────────────────────────\n\n/**\n * Collect all dependency names that should be treated as external.\n * Both `dependencies` and `peerDependencies` must never be bundled.\n */\nfunction collectExternals(sourceJson: Record<string, unknown>): string[] {\n const deps = Object.keys((sourceJson[\"dependencies\"] as Record<string, string> | undefined) ?? {});\n const peers = Object.keys((sourceJson[\"peerDependencies\"] as Record<string, string> | undefined) ?? {});\n return [...new Set([...deps, ...peers])];\n}\n\n/**\n * Resolve entry file paths to absolute forward-slash paths.\n */\nfunction resolveEntries(pkg: PackageBase, packageRoot: string): string[] {\n const srcDir = pkg.srcDir ?? \"src\";\n const rawEntries = pkg.entries ?? [\"index.ts\"];\n const entryList = Array.isArray(rawEntries) ? rawEntries : [rawEntries];\n return entryList.map((e) => toForwardSlash(resolvePath(packageRoot, srcDir, e)));\n}\n\n/**\n * Return the path to the tsconfig.json inside the package root, if it exists.\n */\nfunction findTsconfig(packageRoot: string): string | undefined {\n const local = joinPath(packageRoot, \"tsconfig.json\");\n return pathExists(local) ? local : undefined;\n}\n\n// ─── Main compiler ──────────────────────────────────────────────────────────\n\n/**\n * Compile a single package using tsdown.\n *\n * When `preserveModules` is on (the default), we run two separate tsdown builds\n * in parallel so that each format's output options are fully independent:\n *\n * ESM build — preserveModules: true, dts: true → _tmp_esm/ → esm/*.mjs + *.d.mts\n * CJS build — preserveModules: false, dts: false → _tmp_cjs/ → cjs/*.cjs\n *\n * CJS skips DTS because rolldown has a bug in CJS preserveModules mode where\n * `export { default as X }` assigns the whole module object to exports.X instead\n * of unwrapping .default. Bundled CJS has no such issue. Types are shared from\n * the ESM declarations (TypeScript resolves them correctly via the exports map).\n *\n * When `preserveModules` is false, a single combined build is used.\n */\nexport async function compilePackage(\n pkg: PackageBase,\n packageRoot: string,\n buildPath: string,\n sourceJson: Record<string, unknown>,\n dryRun: boolean,\n): Promise<void> {\n if (dryRun) {\n logger.info(`[dry-run] compile ${pkg.name} → ${buildPath}`);\n return;\n }\n\n const entries = resolveEntries(pkg, packageRoot);\n const formats = pkg.formats ?? [\"esm\", \"cjs\"];\n const externals = collectExternals(sourceJson);\n const tsconfig = findTsconfig(packageRoot);\n const shouldPreserveModules = pkg.preserveModules !== false;\n const srcDir = toForwardSlash(resolvePath(packageRoot, pkg.srcDir ?? \"src\"));\n\n logger.step(`Compiling ${pkg.name} (${formats.join(\", \")}) → ${buildPath}`);\n logger.debug(` entries: ${entries.join(\", \")}`);\n logger.debug(` externals: ${externals.slice(0, 8).join(\", \")}${externals.length > 8 ? \"…\" : \"\"}`);\n\n // Wipe any previous esm/ and cjs/ output so re-runs of the same version don't\n // leave stale files from a different build mode.\n for (const subDir of [\"esm\", \"cjs\"]) {\n const dir = resolvePath(buildPath, subDir);\n if (fs.existsSync(dir)) {\n fs.rmSync(dir, { recursive: true, force: true });\n }\n }\n\n // Build inputOptions for rolldown — used to set the JSX transform for React packages.\n const rolldownInputOptions: InputOptions | undefined =\n pkg.type === \"react\"\n ? {\n transform: {\n jsx: \"react-jsx\", // automatic runtime — works with React 17+\n },\n }\n : undefined;\n\n // Common options shared across all tsdown invocations.\n const sharedOptions = {\n entry: entries,\n deps: { neverBundle: externals },\n sourcemap: pkg.sourcemap !== false,\n clean: true,\n minify: pkg.minify ?? false,\n tsconfig: tsconfig ?? true,\n ...(rolldownInputOptions ? { inputOptions: rolldownInputOptions } : {}),\n } as const;\n\n try {\n if (shouldPreserveModules && formats.includes(\"esm\") && formats.includes(\"cjs\")) {\n // Two parallel builds: ESM with preserveModules + DTS, CJS bundled without DTS.\n const tmpEsm = toForwardSlash(resolvePath(buildPath, \"_tmp_esm\"));\n const tmpCjs = toForwardSlash(resolvePath(buildPath, \"_tmp_cjs\"));\n ensureDir(tmpEsm);\n ensureDir(tmpCjs);\n\n await Promise.all([\n build({\n ...sharedOptions,\n format: [\"esm\"],\n dts: pkg.dts !== false,\n outDir: tmpEsm,\n outputOptions: {\n preserveModules: true,\n preserveModulesRoot: srcDir,\n },\n }),\n build({\n ...sharedOptions,\n format: [\"cjs\"],\n // CJS skips DTS — types are served from ESM declarations (see package-json.ts).\n dts: false,\n outDir: tmpCjs,\n }),\n ]);\n\n reorganiseOutput(tmpEsm, buildPath, [\"esm\"], pkg, true);\n // keepNativeExtension=true: CJS files come out as .cjs from tsdown; we keep that\n // extension so the exports map (./cjs/index.cjs) resolves correctly.\n reorganiseOutput(tmpCjs, buildPath, [\"cjs\"], pkg, false, true);\n rmTmp(tmpEsm);\n rmTmp(tmpCjs);\n } else {\n // Single build: either one format only, or preserveModules disabled.\n const tmpDir = toForwardSlash(resolvePath(buildPath, \"_tmp\"));\n ensureDir(tmpDir);\n\n await build({\n ...sharedOptions,\n format: formats as (\"esm\" | \"cjs\")[],\n dts: pkg.dts !== false,\n outDir: tmpDir,\n ...(shouldPreserveModules && formats.includes(\"esm\")\n ? { outputOptions: { preserveModules: true, preserveModulesRoot: srcDir } }\n : {}),\n });\n\n reorganiseOutput(tmpDir, buildPath, formats as (\"esm\" | \"cjs\")[], pkg, shouldPreserveModules);\n rmTmp(tmpDir);\n }\n } catch (err) {\n throw wrapError(\"tsdown-build\", pkg.name, err);\n }\n\n logger.success(`Compiled ${pkg.name}`);\n}\n\nfunction rmTmp(dir: string): void {\n try {\n fs.rmSync(dir, { recursive: true, force: true });\n } catch {\n // non-fatal — stale tmp is harmless\n }\n}\n\n// ─── Output reorganisation ──────────────────────────────────────────────────\n\n/**\n * Move the flat tsdown output (in tmpDir) into `esm/` and `cjs/` subdirectories\n * under buildPath. Renames .mjs → .js and .cjs → .js so that relative imports\n * inside each format directory resolve correctly.\n */\nfunction reorganiseOutput(\n tmpDir: string,\n buildPath: string,\n formats: (\"esm\" | \"cjs\")[],\n pkg: PackageBase,\n preserveModules: boolean,\n keepNativeExtension = false,\n): void {\n const esmDir = joinPath(buildPath, \"esm\");\n const cjsDir = joinPath(buildPath, \"cjs\");\n\n if (formats.includes(\"esm\")) ensureDir(esmDir);\n if (formats.includes(\"cjs\")) ensureDir(cjsDir);\n\n const mainType = pkg.mainType ?? (formats.includes(\"cjs\") ? \"cjs\" : \"esm\");\n\n processDirectory(tmpDir, { esmDir, cjsDir, formats, mainType, pkg, tmpDir, preserveModules, keepNativeExtension });\n}\n\ninterface ReorgContext {\n esmDir: string;\n cjsDir: string;\n formats: (\"esm\" | \"cjs\")[];\n mainType: \"esm\" | \"cjs\";\n pkg: PackageBase;\n /** Absolute path to the flat _tmp/ directory — used to compute relative paths when preserveModules is on. */\n tmpDir: string;\n preserveModules: boolean;\n /**\n * When true, keep the native .mjs/.cjs extensions instead of normalising to .js.\n * Used in the CJS-only leg of the two-build path so the final file stays .cjs.\n */\n keepNativeExtension: boolean;\n}\n\nfunction processDirectory(dir: string, ctx: ReorgContext): void {\n if (!fs.existsSync(dir)) return;\n\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = joinPath(dir, entry.name);\n if (entry.isDirectory()) {\n // Recursively handle subdirectories (chunk splits, etc.)\n processDirectory(fullPath, ctx);\n } else {\n processFile(fullPath, entry.name, ctx);\n }\n }\n}\n\nfunction processFile(filePath: string, name: string, ctx: ReorgContext): void {\n const { esmDir, cjsDir, formats, mainType, pkg, tmpDir, preserveModules } = ctx;\n\n // Relative subdirectory from the tmp root — preserves folder structure for both\n // preserveModules output and multi-entry single-bundle output (where each entry\n // lands in its own subdirectory, e.g. cli/index.cjs).\n // path.relative may return backslashes on Windows — normalise to forward slashes.\n const relDir = toForwardSlash(path.relative(tmpDir, path.dirname(filePath)));\n\n if (preserveModules) {\n if (isEsmFile(name)) {\n if (formats.includes(\"esm\")) {\n moveFile(filePath, joinPath(esmDir, relDir, name), pkg.name);\n }\n } else if (isCjsFile(name)) {\n if (formats.includes(\"cjs\")) {\n moveFile(filePath, joinPath(cjsDir, relDir, name), pkg.name);\n }\n } else if (isDtsFile(name)) {\n const targetDir = formats.includes(\"esm\") ? esmDir : cjsDir;\n moveFile(filePath, joinPath(targetDir, relDir, name), pkg.name);\n }\n // Unknown extensions silently ignored.\n return;\n }\n\n // ── Single-bundle mode ──────────────────────────────────────────────────────\n const { keepNativeExtension } = ctx;\n\n if (isEsmFile(name)) {\n if (formats.includes(\"esm\")) {\n const destName = keepNativeExtension ? name : normaliseEsmName(name);\n moveFile(filePath, joinPath(esmDir, relDir, destName), pkg.name);\n }\n } else if (isCjsFile(name)) {\n if (formats.includes(\"cjs\")) {\n const destName = keepNativeExtension ? name : normaliseCjsName(name);\n moveFile(filePath, joinPath(cjsDir, relDir, destName), pkg.name);\n }\n } else if (isDtsFile(name)) {\n const targetDir = formats.includes(\"esm\") ? esmDir : cjsDir;\n moveFile(filePath, joinPath(targetDir, relDir, name), pkg.name);\n } else if (isJsFile(name)) {\n // Plain .js / .js.map — emitted when the format array contains only one format\n // (tsdown uses .js instead of .mjs/.cjs when there's no other format to differentiate from).\n const targetDir = mainType === \"esm\" ? esmDir : cjsDir;\n if (formats.includes(mainType)) {\n // Files landing in cjsDir should use the .cjs extension for consistency.\n const destName =\n targetDir === cjsDir\n ? name.replace(/\\.js\\.map$/, \".cjs.map\").replace(/\\.js$/, \".cjs\")\n : name;\n moveFile(filePath, joinPath(targetDir, relDir, destName), pkg.name);\n }\n }\n // Unknown extensions are silently ignored.\n}\n\n// ─── Extension predicates ───────────────────────────────────────────────────\n\nfunction isEsmFile(name: string): boolean {\n return (\n name.endsWith(\".mjs\") ||\n name.endsWith(\".mjs.map\") ||\n name.endsWith(\".d.mts\") ||\n name.endsWith(\".d.mts.map\")\n );\n}\n\nfunction isCjsFile(name: string): boolean {\n return (\n name.endsWith(\".cjs\") ||\n name.endsWith(\".cjs.map\") ||\n name.endsWith(\".d.cts\") ||\n name.endsWith(\".d.cts.map\")\n );\n}\n\nfunction isDtsFile(name: string): boolean {\n return name.endsWith(\".d.ts\") || name.endsWith(\".d.ts.map\");\n}\n\nfunction isJsFile(name: string): boolean {\n return (\n (name.endsWith(\".js\") || name.endsWith(\".js.map\")) &&\n !name.endsWith(\".d.ts\") &&\n !name.endsWith(\".d.ts.map\")\n );\n}\n\n// ─── Name normalisation ─────────────────────────────────────────────────────\n\n/** Rename .mjs / .d.mts → .js / .d.ts for the esm/ directory. */\nfunction normaliseEsmName(name: string): string {\n return name\n .replace(/\\.mjs\\.map$/, \".js.map\")\n .replace(/\\.mjs$/, \".js\")\n .replace(/\\.d\\.mts\\.map$/, \".d.ts.map\")\n .replace(/\\.d\\.mts$/, \".d.ts\");\n}\n\n/** Rename .cjs / .d.cts → .js / .d.ts for the cjs/ directory. */\nfunction normaliseCjsName(name: string): string {\n return name\n .replace(/\\.cjs\\.map$/, \".js.map\")\n .replace(/\\.cjs$/, \".js\")\n .replace(/\\.d\\.cts\\.map$/, \".d.ts.map\")\n .replace(/\\.d\\.cts$/, \".d.ts\");\n}\n","import semver from \"semver\";\nimport { wrapError } from \"../utils/errors.js\";\n\n/**\n * Given the current version string and a version strategy, return the new version.\n *\n * @param currentVersion semver string from source package.json, e.g. \"1.2.3\"\n * @param strategy \"auto\" / \"patch\" → patch bump\n * \"minor\" → minor bump\n * \"major\" → major bump\n * any valid semver string → use as-is\n * @param packageName used in error messages only\n */\nexport function resolveVersion(\n currentVersion: string,\n strategy: \"auto\" | \"patch\" | \"minor\" | \"major\" | string = \"auto\",\n packageName: string,\n): string {\n const bumpType =\n strategy === \"auto\" || strategy === \"patch\" ? \"patch\"\n : strategy === \"minor\" ? \"minor\"\n : strategy === \"major\" ? \"major\"\n : null;\n\n if (bumpType) {\n const bumped = semver.inc(currentVersion, bumpType);\n if (!bumped) {\n throw wrapError(\n \"version-increment\",\n packageName,\n new Error(\n `Cannot ${bumpType}-bump invalid semver version \"${currentVersion}\" for package \"${packageName}\"`,\n ),\n );\n }\n return bumped;\n }\n\n // Explicit version string — validate it\n const cleaned = semver.valid(semver.coerce(strategy) ?? strategy);\n if (!cleaned) {\n throw wrapError(\n \"version-increment\",\n packageName,\n new Error(\n `Explicit version \"${strategy}\" is not a valid semver string for package \"${packageName}\"`,\n ),\n );\n }\n return cleaned;\n}\n","import simpleGit, { SimpleGit } from \"simple-git\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { joinPath } from \"../utils/paths.js\";\nimport { wrapError } from \"../utils/errors.js\";\nimport { logger } from \"../utils/logger.js\";\n\n/**\n * Returns true if the given directory is inside a git repository.\n */\nexport async function isGitRepo(dir: string): Promise<boolean> {\n try {\n const git: SimpleGit = simpleGit(dir);\n const result = await git.checkIsRepo();\n return result;\n } catch {\n return false;\n }\n}\n\n/**\n * Perform git operations for a package after a successful build:\n * 1. git add -A (in the package root)\n * 2. git commit -m <message>\n * 3. git push origin <branch>\n * 4. git tag v<version>\n * 5. git push origin <tag>\n */\nexport async function gitCommitTagPush(\n packageRoot: string,\n packageName: string,\n version: string,\n commitMessage: string,\n branch: string,\n dryRun: boolean,\n): Promise<void> {\n const isRepo = await isGitRepo(packageRoot);\n if (!isRepo) {\n logger.warn(`[git] ${packageName}: directory is not a git repo — skipping git operations`);\n return;\n }\n\n const tag = `v${version}`;\n logger.step(`[git] ${packageName}: commit \"${commitMessage}\", tag ${tag}, push to ${branch}`);\n\n if (dryRun) {\n logger.info(`[dry-run] git add + commit \"${commitMessage}\" + tag ${tag} + push`);\n return;\n }\n\n const git: SimpleGit = simpleGit(packageRoot);\n\n try {\n // Stage all changes\n await git.add(\"-A\");\n\n // Commit\n await git.commit(commitMessage);\n\n // Push to remote\n await git.push(\"origin\", branch);\n\n // Tag\n await git.addTag(tag);\n\n // Push tags\n await git.pushTags(\"origin\");\n\n logger.success(`[git] ${packageName}: pushed ${branch}, tagged ${tag}`);\n } catch (err) {\n throw wrapError(\"git-operations\", packageName, err);\n }\n}\n\n/**\n * Resolve the current branch name in the given directory.\n * Falls back to \"main\" if the directory is not a git repo.\n */\nexport async function currentBranch(dir: string): Promise<string> {\n try {\n const git: SimpleGit = simpleGit(dir);\n const branch = await git.revparse([\"--abbrev-ref\", \"HEAD\"]);\n return branch.trim() || \"main\";\n } catch {\n return \"main\";\n }\n}\n","import { execa } from \"execa\";\nimport { wrapError } from \"./errors.js\";\n\nexport interface ExecResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\n/**\n * Run a shell command and return stdout/stderr.\n * Throws a BundlerError on non-zero exit.\n */\nexport async function exec(\n step: string,\n packageName: string,\n command: string,\n args: string[],\n cwd?: string,\n): Promise<ExecResult> {\n try {\n const result = await execa(command, args, {\n cwd,\n all: true,\n reject: false,\n });\n if (result.exitCode !== 0) {\n const combined = result.all ?? result.stderr ?? \"\";\n throw new Error(\n `Command \"${command} ${args.join(\" \")}\" exited with code ${result.exitCode}.\\n${combined}`,\n );\n }\n return {\n stdout: result.stdout ?? \"\",\n stderr: result.stderr ?? \"\",\n exitCode: result.exitCode,\n };\n } catch (err) {\n throw wrapError(step, packageName, err);\n }\n}\n\n/**\n * Run a command and ignore its output. Does NOT throw on non-zero exit.\n * Useful for optional operations (e.g. `git tag -d`).\n */\nexport async function execSilent(\n command: string,\n args: string[],\n cwd?: string,\n): Promise<number> {\n try {\n const result = await execa(command, args, { cwd, reject: false });\n return result.exitCode ?? 0;\n } catch {\n return 1;\n }\n}\n","import { exec } from \"../utils/exec.js\";\nimport { logger } from \"../utils/logger.js\";\nimport type { PackageBase } from \"../types/index.js\";\n\n/**\n * Run `npm publish` from the build output directory.\n */\nexport async function publishPackage(\n pkg: PackageBase,\n buildPath: string,\n dryRun: boolean,\n): Promise<void> {\n if (pkg.publish === false) {\n logger.info(`[publish] ${pkg.name}: publish=false, skipping`);\n return;\n }\n\n const access = pkg.access ?? \"public\";\n\n if (dryRun) {\n logger.info(`[dry-run] npm publish --access ${access} from ${buildPath}`);\n return;\n }\n\n logger.step(`Publishing ${pkg.name}@... to npm (access: ${access})`);\n\n await exec(\n \"npm-publish\",\n pkg.name,\n \"npm\",\n [\"publish\", \"--access\", access],\n buildPath,\n );\n\n logger.success(`Published ${pkg.name}`);\n}\n","import path from \"path\";\nimport { copyDir, ensureDir } from \"../files/file-manager.js\";\nimport {\n readSourcePackageJson,\n writeSourceVersion,\n writeBuildPackageJson,\n} from \"../files/package-json.js\";\nimport { cloneFiles } from \"../files/clone-files.js\";\nimport { compilePackage } from \"../compile/tsdown-compiler.js\";\nimport { resolveVersion } from \"../version/increment.js\";\nimport { gitCommitTagPush, currentBranch } from \"../git/operations.js\";\nimport { publishPackage } from \"../publish/npm-publisher.js\";\nimport { buildOutputPath, sourceSnapshotPath, resolvePath } from \"../utils/paths.js\";\nimport { wrapError } from \"../utils/errors.js\";\nimport { logger } from \"../utils/logger.js\";\nimport type { PackageBase, BuildOptions, BuilderSettings } from \"../types/index.js\";\n\nexport interface BuildResult {\n packageName: string;\n version: string;\n buildPath: string;\n success: boolean;\n error?: Error;\n}\n\n/**\n * Execute the full build pipeline for a single package.\n *\n * Steps:\n * 1. Resolve package root\n * 2. Read source package.json → current version\n * 3. Compute new version\n * 4. Create build output directory\n * 5. Source snapshot (optional)\n * 6. tsdown compile\n * 7. Clone extra files\n * 8. Write build package.json\n * 9. Update source package.json version\n * 10. Git: add, commit, push, tag\n * 11. npm publish\n */\nexport async function buildPackage(\n pkg: PackageBase,\n versionStrategy: \"auto\" | string = \"auto\",\n settings: BuilderSettings,\n options: BuildOptions,\n configDir: string,\n /**\n * Override commit message (used by family builder to apply a shared message).\n * If undefined, uses pkg.commit.\n */\n overrideCommit?: string,\n /**\n * Pre-resolved version — used when a family has already determined the version\n * and needs all member packages to use the same one.\n */\n forcedVersion?: string,\n): Promise<BuildResult> {\n const step = \"package-builder\";\n\n try {\n // 1. Resolve absolute package root\n const packageRoot = resolvePath(configDir, pkg.root);\n\n // 2. Read source package.json\n const sourceJson = readSourcePackageJson(packageRoot, pkg.name);\n const currentVersion = sourceJson.version;\n\n // 3. Determine new version\n const newVersion =\n forcedVersion ?? resolveVersion(currentVersion, versionStrategy, pkg.name);\n\n logger.info(`Building ${pkg.name}: ${currentVersion} → ${newVersion}`);\n\n // 4. Build output directory\n const absoluteBuildDir = resolvePath(configDir, settings.buildDir);\n const buildPath = buildOutputPath(absoluteBuildDir, pkg.name, newVersion);\n\n if (!options.dryRun) {\n ensureDir(buildPath);\n }\n\n // 5. Source snapshot\n if (settings.sourcesDir) {\n const absoluteSourcesDir = resolvePath(configDir, settings.sourcesDir);\n const snapshotPath = sourceSnapshotPath(absoluteSourcesDir, pkg.name);\n if (options.dryRun) {\n logger.info(`[dry-run] snapshot ${packageRoot} → ${snapshotPath}`);\n } else {\n ensureDir(snapshotPath);\n copyDir(packageRoot, snapshotPath);\n logger.debug(`Snapshot: ${packageRoot} → ${snapshotPath}`);\n }\n }\n\n // 6. Compile with tsdown\n await compilePackage(pkg, packageRoot, buildPath, sourceJson as Record<string, unknown>, options.dryRun);\n\n // 7. Clone extra files\n if (pkg.clone && pkg.clone.length > 0) {\n cloneFiles(packageRoot, buildPath, pkg.clone, pkg.name, options.dryRun);\n }\n\n // 8. Write build package.json\n if (!options.dryRun) {\n writeBuildPackageJson(pkg, sourceJson, buildPath, newVersion);\n logger.debug(`Wrote build package.json for ${pkg.name}@${newVersion}`);\n } else {\n logger.info(`[dry-run] write build package.json for ${pkg.name}@${newVersion}`);\n }\n\n // 9. Update source package.json version\n if (!options.dryRun) {\n writeSourceVersion(packageRoot, pkg.name, newVersion);\n logger.debug(`Updated source version ${pkg.name} → ${newVersion}`);\n } else {\n logger.info(`[dry-run] update source package.json version → ${newVersion}`);\n }\n\n // 10. Git operations (only if commit message is set and --no-git is not passed)\n const commitMessage = overrideCommit ?? pkg.commit;\n if (commitMessage && !options.noGit) {\n const branch = pkg.branch ?? (await currentBranch(packageRoot));\n await gitCommitTagPush(\n packageRoot,\n pkg.name,\n newVersion,\n commitMessage,\n branch,\n options.dryRun,\n );\n } else if (!commitMessage) {\n logger.debug(`[git] ${pkg.name}: no commit message set — skipping git`);\n }\n\n // 11. npm publish\n if (!options.noPublish) {\n await publishPackage(pkg, buildPath, options.dryRun);\n } else {\n logger.info(`[publish] ${pkg.name}: --no-publish, skipping`);\n }\n\n return { packageName: pkg.name, version: newVersion, buildPath, success: true };\n } catch (err) {\n const wrapped = wrapError(step, pkg.name, err);\n logger.error(`Failed to build ${pkg.name}: ${wrapped.message}`);\n return {\n packageName: pkg.name,\n version: \"\",\n buildPath: \"\",\n success: false,\n error: wrapped,\n };\n }\n}\n","import semver from \"semver\";\nimport { readSourcePackageJson } from \"../files/package-json.js\";\nimport { resolveVersion } from \"../version/increment.js\";\nimport { resolvePath } from \"../utils/paths.js\";\nimport { buildPackage } from \"./package-builder.js\";\nimport { runParallel } from \"./parallel-builder.js\";\nimport { wrapError } from \"../utils/errors.js\";\nimport { logger } from \"../utils/logger.js\";\nimport type { Family, BuildOptions, BuilderSettings } from \"../types/index.js\";\nimport type { BuildResult } from \"./package-builder.js\";\n\n/**\n * Build all packages in a family using a single shared version.\n *\n * The shared version is determined by taking the HIGHEST current version\n * across all family members and bumping it. This prevents a lower-versioned\n * member (e.g. atomic-query@0.1.0) from pulling down a higher-versioned one\n * (e.g. react-atom@5.1.3) when they are first unified.\n */\nexport async function buildFamily(\n family: Family,\n settings: BuilderSettings,\n options: BuildOptions,\n configDir: string,\n): Promise<BuildResult[]> {\n if (family.packages.length === 0) {\n logger.warn(`Family \"${family.name}\" has no packages — nothing to build`);\n return [];\n }\n\n let newVersion: string;\n try {\n const strategy = family.version ?? \"auto\";\n const isBumpKeyword = strategy === \"auto\" || strategy === \"patch\" || strategy === \"minor\" || strategy === \"major\";\n\n if (!isBumpKeyword && semver.valid(semver.coerce(strategy) ?? strategy)) {\n // Explicit semver string — use as-is\n newVersion = strategy;\n } else {\n // Bump keyword — find the highest current version across all family members, then bump it\n let highestVersion = \"0.0.0\";\n for (const pkg of family.packages) {\n const root = resolvePath(configDir, pkg.root);\n const sourceJson = readSourcePackageJson(root, pkg.name);\n const v = sourceJson.version ?? \"0.0.0\";\n if (semver.gt(v, highestVersion)) {\n highestVersion = v;\n }\n }\n newVersion = resolveVersion(highestVersion, strategy, family.name);\n }\n } catch (err) {\n throw wrapError(\"family-version\", family.name, err);\n }\n\n logger.info(`Family \"${family.name}\": shared version → ${newVersion} (${family.packages.length} packages)`);\n\n const concurrency = options.concurrency ?? settings.concurrency ?? 4;\n\n // The family commit message overrides per-package commit messages\n const familyCommit = family.commit;\n\n const tasks = family.packages.map((pkg) => () =>\n buildPackage(\n pkg,\n \"auto\", // not used — forcedVersion overrides\n settings,\n options,\n configDir,\n familyCommit ?? pkg.commit,\n newVersion, // all packages use the same version\n ),\n );\n\n return runParallel(tasks, concurrency);\n}\n","import pLimit from \"p-limit\";\nimport type { BuildResult } from \"./package-builder.js\";\nimport { logger } from \"../utils/logger.js\";\n\n/**\n * Run an array of async build tasks with a concurrency cap.\n * Each task is a zero-argument function that returns a Promise<BuildResult>.\n */\nexport async function runParallel(\n tasks: (() => Promise<BuildResult>)[],\n concurrency: number,\n): Promise<BuildResult[]> {\n if (tasks.length === 0) return [];\n\n const limit = pLimit(Math.max(1, concurrency));\n\n logger.info(`Running ${tasks.length} task(s) with concurrency=${concurrency}`);\n\n const results = await Promise.all(\n tasks.map((task) => limit(task)),\n );\n\n const succeeded = results.filter((r) => r.success).length;\n const failed = results.filter((r) => !r.success).length;\n\n if (failed > 0) {\n logger.warn(`${succeeded} succeeded, ${failed} failed`);\n for (const r of results.filter((r) => !r.success)) {\n logger.error(` FAILED: ${r.packageName} — ${r.error?.message ?? \"unknown error\"}`);\n }\n } else {\n logger.success(`All ${succeeded} package(s) built successfully`);\n }\n\n return results;\n}\n"],"mappings":"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","names":["path","path","fs","path","fs","path","fs","fs","path","fs","fs","path","semver","r","semver"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mongez/pkgist",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "Build, version, and publish tool for TypeScript npm packages. Powered by tsdown.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -29,7 +29,8 @@
|
|
|
29
29
|
"p-limit": "^5.0.0",
|
|
30
30
|
"semver": "^7.6.0",
|
|
31
31
|
"simple-git": "^3.25.0",
|
|
32
|
-
"tsdown": "^0.22.0"
|
|
32
|
+
"tsdown": "^0.22.0",
|
|
33
|
+
"tsx": "^4.19.0"
|
|
33
34
|
},
|
|
34
35
|
"devDependencies": {
|
|
35
36
|
"@typescript-eslint/eslint-plugin": "^8.50.0",
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import path from "path";
|
|
2
|
-
import { createRequire } from "module";
|
|
3
2
|
import { pathToFileURL } from "url";
|
|
4
3
|
import fs from "fs";
|
|
5
4
|
import type { BundlerConfig } from "../types/index.js";
|
|
@@ -15,15 +14,28 @@ export interface LoadedConfig {
|
|
|
15
14
|
}
|
|
16
15
|
|
|
17
16
|
/**
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* produced by `defineConfig(...)`.
|
|
22
|
-
*
|
|
23
|
-
* When the file is TypeScript (`.ts`), we use `tsx` via Node's `--import` flag
|
|
24
|
-
* (which is already set up when the CLI is invoked via the compiled entry), or
|
|
25
|
-
* we fall back to requiring `tsx/esm` at runtime if available.
|
|
17
|
+
* Register tsx as a Node loader so TypeScript config files can be imported
|
|
18
|
+
* directly via dynamic import(). Safe to call multiple times — tsx is only
|
|
19
|
+
* registered once. No-ops when tsx is not installed (JS-only config still works).
|
|
26
20
|
*/
|
|
21
|
+
async function ensureTsxRegistered(): Promise<void> {
|
|
22
|
+
try {
|
|
23
|
+
const { register } = await import("node:module");
|
|
24
|
+
let tsxUrl: string | null = null;
|
|
25
|
+
try {
|
|
26
|
+
tsxUrl = import.meta.resolve("tsx/esm");
|
|
27
|
+
} catch {
|
|
28
|
+
// tsx not installed — JS-only configs still work fine
|
|
29
|
+
}
|
|
30
|
+
if (register && tsxUrl) {
|
|
31
|
+
register(tsxUrl, import.meta.url);
|
|
32
|
+
}
|
|
33
|
+
} catch {
|
|
34
|
+
// node:module unavailable (old Node) — fall through silently
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Load and validate a pkgist config file (TypeScript or JavaScript). */
|
|
27
39
|
export async function loadConfig(configFilePath: string): Promise<LoadedConfig> {
|
|
28
40
|
const absolute = resolvePath(configFilePath);
|
|
29
41
|
|
|
@@ -34,6 +46,12 @@ export async function loadConfig(configFilePath: string): Promise<LoadedConfig>
|
|
|
34
46
|
let mod: { default?: BundlerConfig };
|
|
35
47
|
|
|
36
48
|
try {
|
|
49
|
+
// Register tsx so .ts config files import without the user needing
|
|
50
|
+
// to prefix the command with `node --import tsx/esm`.
|
|
51
|
+
if (absolute.endsWith(".ts")) {
|
|
52
|
+
await ensureTsxRegistered();
|
|
53
|
+
}
|
|
54
|
+
|
|
37
55
|
// Convert to a file:// URL so dynamic import works correctly on Windows.
|
|
38
56
|
const fileUrl = pathToFileURL(absolute).href;
|
|
39
57
|
mod = await import(fileUrl);
|
|
@@ -91,7 +109,7 @@ function validateConfig(config: BundlerConfig, filePath: string): void {
|
|
|
91
109
|
* Tries: builder.ts, builder.js, mongez.ts, mongez.js
|
|
92
110
|
*/
|
|
93
111
|
export function findDefaultConfigPath(cwd: string): string {
|
|
94
|
-
const candidates = ["builder.ts", "builder.js", "mongez.ts", "mongez.js"];
|
|
112
|
+
const candidates = ["pkgist.config.ts", "pkgist.config.js", "builder.ts", "builder.js", "mongez.ts", "mongez.js"];
|
|
95
113
|
for (const candidate of candidates) {
|
|
96
114
|
const full = path.join(cwd, candidate);
|
|
97
115
|
if (fs.existsSync(full)) return full;
|