@fastkit/plugboy 1.0.0-next.4 → 1.0.0-next.6

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/dist/plugboy.mjs CHANGED
@@ -1,3 +1,2 @@
1
- import { $ as normalizeDTSSettings, A as resolveRawExposeEntriesSettings, B as exitHook, C as findProjectPlugin, D as loadProjectConfig, E as isProjectPackageJson, F as getFilename, G as resolveListable, H as mergeExternals, I as isFileNotFoundException, J as WORKSPACE_REQUIRED_FIELDS, K as PROJECT_REQUIRED_FIELDS, L as pathExists, M as findConfig, N as findFile, O as resolveUserProjectConfig, P as getDirname, Q as normalizeDTSPreserveTypeTarget, R as rmrf, S as extractProjectPlugins, T as defineProjectConfig, U as mergeNoExternals, V as mergeChunkAddons, W as isPromise, X as mergeDTSSettingsList, Y as resolveOptimizeCSSOptions, Z as normalizeDTSPreserveTypeSettings, _ as loadWorkspaceConfig, a as syncWorkspacePackageFields, b as resolveUserWorkspaceConfig, c as Builder, d as getWorkspacePackageJson, et as createHooksDefaults, f as Path, g as isWorkspacePackageJson, h as defineWorkspaceConfig, i as getWorkspace, j as copyDirSync, k as exposeEntries, l as findWorkspacePackages, m as resolveUserHooks, n as PlugboyWorkspace, o as PlugboyProject, p as buildHooks, q as TSDOWN_SYNC_OPTIONS, r as WORKSPACE_PACKAGE_SYNC_FIELDS, s as getProject, t as generateWorkspace, u as getProjectPackageJson, v as resolveRawWorkspaceEntries, w as resolveUserPluginOption, x as definePlugin, y as resolveRawWorkspaceEntry, z as writeFileAtomic } from "./workspace-Den7m7D_.mjs";
2
-
3
- export { Builder, PROJECT_REQUIRED_FIELDS, Path, PlugboyProject, PlugboyWorkspace, TSDOWN_SYNC_OPTIONS, WORKSPACE_PACKAGE_SYNC_FIELDS, WORKSPACE_REQUIRED_FIELDS, buildHooks, copyDirSync, createHooksDefaults, definePlugin, defineProjectConfig, defineWorkspaceConfig, exitHook, exposeEntries, extractProjectPlugins, findConfig, findFile, findProjectPlugin, findWorkspacePackages, generateWorkspace, getDirname, getFilename, getProject, getProjectPackageJson, getWorkspace, getWorkspacePackageJson, isFileNotFoundException, isProjectPackageJson, isPromise, isWorkspacePackageJson, loadProjectConfig, loadWorkspaceConfig, mergeChunkAddons, mergeDTSSettingsList, mergeExternals, mergeNoExternals, normalizeDTSPreserveTypeSettings, normalizeDTSPreserveTypeTarget, normalizeDTSSettings, pathExists, resolveListable, resolveOptimizeCSSOptions, resolveRawExposeEntriesSettings, resolveRawWorkspaceEntries, resolveRawWorkspaceEntry, resolveUserHooks, resolveUserPluginOption, resolveUserProjectConfig, resolveUserWorkspaceConfig, rmrf, syncWorkspacePackageFields, writeFileAtomic };
1
+ import { $ as normalizeDTSSettings, A as resolveRawExposeEntriesSettings, B as exitHook, C as findProjectPlugin, D as loadProjectConfig, E as isProjectPackageJson, F as getFilename, G as resolveListable, H as mergeExternals, I as isFileNotFoundException, J as WORKSPACE_REQUIRED_FIELDS, K as PROJECT_REQUIRED_FIELDS, L as pathExists, M as findConfig, N as findFile, O as resolveUserProjectConfig, P as getDirname, Q as normalizeDTSPreserveTypeTarget, R as rmrf, S as extractProjectPlugins, T as defineProjectConfig, U as mergeNoExternals, V as mergeChunkAddons, W as isPromise, X as mergeDTSSettingsList, Y as resolveOptimizeCSSOptions, Z as normalizeDTSPreserveTypeSettings, _ as loadWorkspaceConfig, a as syncWorkspacePackageFields, b as resolveUserWorkspaceConfig, c as Builder, d as getWorkspacePackageJson, et as createHooksDefaults, f as Path, g as isWorkspacePackageJson, h as defineWorkspaceConfig, i as getWorkspace, j as copyDirSync, k as exposeEntries, l as findWorkspacePackages, m as resolveUserHooks, n as PlugboyWorkspace, o as PlugboyProject, p as buildHooks, q as TSDOWN_SYNC_OPTIONS, r as WORKSPACE_PACKAGE_SYNC_FIELDS, s as getProject, t as generateWorkspace, u as getProjectPackageJson, v as resolveRawWorkspaceEntries, w as resolveUserPluginOption, x as definePlugin, y as resolveRawWorkspaceEntry, z as writeFileAtomic } from "./workspace-XEn7b5JU.mjs";
2
+ export { Builder, PROJECT_REQUIRED_FIELDS, Path, PlugboyProject, PlugboyWorkspace, TSDOWN_SYNC_OPTIONS, WORKSPACE_PACKAGE_SYNC_FIELDS, WORKSPACE_REQUIRED_FIELDS, buildHooks, copyDirSync, createHooksDefaults, definePlugin, defineProjectConfig, defineWorkspaceConfig, exitHook, exposeEntries, extractProjectPlugins, findConfig, findFile, findProjectPlugin, findWorkspacePackages, generateWorkspace, getDirname, getFilename, getProject, getProjectPackageJson, getWorkspace, getWorkspacePackageJson, isFileNotFoundException, isProjectPackageJson, isPromise, isWorkspacePackageJson, loadProjectConfig, loadWorkspaceConfig, mergeChunkAddons, mergeDTSSettingsList, mergeExternals, mergeNoExternals, normalizeDTSPreserveTypeSettings, normalizeDTSPreserveTypeTarget, normalizeDTSSettings, pathExists, resolveListable, resolveOptimizeCSSOptions, resolveRawExposeEntriesSettings, resolveRawWorkspaceEntries, resolveRawWorkspaceEntry, resolveUserHooks, resolveUserPluginOption, resolveUserProjectConfig, resolveUserWorkspaceConfig, rmrf, syncWorkspacePackageFields, writeFileAtomic };
@@ -1,7 +1,6 @@
1
1
  import { dirname, join } from "node:path";
2
2
  import { fileURLToPath } from "node:url";
3
3
  import { stat } from "node:fs/promises";
4
-
5
4
  //#region src/runtime-utils/path.ts
6
5
  /**
7
6
  * Universal ESM function to get the file path of the caller.
@@ -88,7 +87,7 @@ async function getPackageDir(callerFilePath = getCallerFilePath()) {
88
87
  }
89
88
  throw new Error(`package.json not found for: ${callerFilePath}`);
90
89
  }
91
-
92
90
  //#endregion
93
91
  export { getCallerFile, getCallerFilePath, getPackageDir };
92
+
94
93
  //# sourceMappingURL=runtime-utils.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-utils.mjs","names":[],"sources":["../src/runtime-utils/path.ts"],"sourcesContent":["import { stat } from 'node:fs/promises';\nimport { join, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n/**\n * Universal ESM function to get the file path of the caller.\n * Works in Node.js, Deno, and Bun (native ESM environments).\n *\n * - Uses V8 structured stack traces when available (Node/Bun).\n * - Falls back to string-based stack parsing when necessary (e.g., Deno).\n * - Throws a descriptive error when the file path cannot be determined.\n */\n\nclass CallerFileError extends Error {\n info: unknown;\n constructor(message: string, info: unknown = {}) {\n super(message);\n this.name = 'CallerFileError';\n this.info = info;\n }\n}\n\n/**\n * Returns the absolute file path of the calling file.\n *\n * @param {number} depth - 1 = immediate caller, 2 = caller's caller, etc.\n * @returns {string} Absolute file path of the caller.\n * @throws {CallerFileError} If the caller file cannot be determined.\n */\nexport function getCallerFile(depth = 1) {\n if (typeof depth !== 'number' || depth < 1) {\n throw new CallerFileError('Invalid depth argument', { depth });\n }\n\n // --- Primary method: V8 structured stack trace (Node.js / Bun) ---\n try {\n const originalPrepare = Error.prepareStackTrace;\n Error.prepareStackTrace = (_, structuredStackTrace) => structuredStackTrace;\n const err = new Error();\n const { stack } = err;\n Error.prepareStackTrace = originalPrepare;\n\n if (Array.isArray(stack)) {\n const frame = stack[depth];\n if (frame && typeof frame.getFileName === 'function') {\n const file = frame.getFileName();\n if (typeof file === 'string') return file;\n throw new CallerFileError('CallSite#getFileName() returned null', {\n frame,\n });\n } else {\n throw new CallerFileError('Invalid or missing CallSite object', {\n frame,\n });\n }\n } else {\n throw new CallerFileError('Structured stack trace unavailable', {\n stack,\n });\n }\n } catch (v8Error) {\n // --- Fallback: plain text stack parsing (Deno and others) ---\n try {\n const stackStr = new Error().stack;\n if (typeof stackStr !== 'string') {\n throw new CallerFileError('Error.stack is not a string', {\n stack: stackStr,\n });\n }\n\n const lines = stackStr\n .split('\\n')\n .map((l) => l.trim())\n .filter(Boolean);\n const index = 1 + depth;\n if (index >= lines.length) {\n throw new CallerFileError('Stack trace too shallow', { lines });\n }\n\n const line = lines[index];\n\n // Match file URLs or absolute paths\n const match =\n line.match(/(file:\\/\\/[^\\s)]+)/) ||\n line.match(/(\\/[^:\\s)]+)(:\\d+){0,2}/) ||\n line.match(/([A-Za-z]:\\\\[^:\\s)]+)(:\\d+){0,2}/);\n\n if (!match) {\n throw new CallerFileError('No file path pattern found in stack line', {\n line,\n });\n }\n\n const raw = match[1];\n if (raw.startsWith('file://')) {\n const url = new URL(raw);\n return url.pathname;\n }\n\n return raw.replace(/:\\d+(:\\d+)?$/, '');\n } catch (fallbackError) {\n if (fallbackError instanceof CallerFileError) throw fallbackError;\n throw new CallerFileError('Fallback stack parsing failed', {\n cause: fallbackError,\n });\n }\n }\n}\n\n/**\n * Returns the absolute file path of the calling file.\n *\n * @param {number} depth - 1 = immediate caller, 2 = caller's caller, etc.\n * @returns {string} Absolute file path of the caller.\n * @throws {CallerFileError} If the caller file cannot be determined.\n */\nexport function getCallerFilePath(depth = 1) {\n const file = getCallerFile(depth + 1);\n return file.startsWith('file:') ? fileURLToPath(file) : file;\n}\n\n/**\n * Returns the directory that contains the package.json\n * associated with the specified import.meta.url.\n *\n * If no package.json is found while walking up the directory tree,\n * an error will be thrown.\n */\nexport async function getPackageDir(\n callerFilePath = getCallerFilePath(),\n): Promise<string> {\n // const { stat } = await import('node:fs/promises');\n // const { join, dirname } = await import('node:path');\n // const { fileURLToPath } = await import('node:url');\n\n let dir = dirname(callerFilePath);\n\n while (true) {\n const pkgJson = join(dir, 'package.json');\n\n const exists = await stat(pkgJson)\n .then(() => true)\n .catch(() => false);\n if (exists) return dir;\n\n // Move to the parent directory\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n\n throw new Error(`package.json not found for: ${callerFilePath}`);\n}\n"],"mappings":";;;;;;;;;;;;;AAaA,IAAM,kBAAN,cAA8B,MAAM;CAClC;CACA,YAAY,SAAiB,OAAgB,EAAE,EAAE;AAC/C,QAAM,QAAQ;AACd,OAAK,OAAO;AACZ,OAAK,OAAO;;;;;;;;;;AAWhB,SAAgB,cAAc,QAAQ,GAAG;AACvC,KAAI,OAAO,UAAU,YAAY,QAAQ,EACvC,OAAM,IAAI,gBAAgB,0BAA0B,EAAE,OAAO,CAAC;AAIhE,KAAI;EACF,MAAM,kBAAkB,MAAM;AAC9B,QAAM,qBAAqB,GAAG,yBAAyB;EAEvD,MAAM,EAAE,0BADI,IAAI,OAAO;AAEvB,QAAM,oBAAoB;AAE1B,MAAI,MAAM,QAAQ,MAAM,EAAE;GACxB,MAAM,QAAQ,MAAM;AACpB,OAAI,SAAS,OAAO,MAAM,gBAAgB,YAAY;IACpD,MAAM,OAAO,MAAM,aAAa;AAChC,QAAI,OAAO,SAAS,SAAU,QAAO;AACrC,UAAM,IAAI,gBAAgB,wCAAwC,EAChE,OACD,CAAC;SAEF,OAAM,IAAI,gBAAgB,sCAAsC,EAC9D,OACD,CAAC;QAGJ,OAAM,IAAI,gBAAgB,sCAAsC,EAC9D,OACD,CAAC;UAEG,SAAS;AAEhB,MAAI;GACF,MAAM,4BAAW,IAAI,OAAO,EAAC;AAC7B,OAAI,OAAO,aAAa,SACtB,OAAM,IAAI,gBAAgB,+BAA+B,EACvD,OAAO,UACR,CAAC;GAGJ,MAAM,QAAQ,SACX,MAAM,KAAK,CACX,KAAK,MAAM,EAAE,MAAM,CAAC,CACpB,OAAO,QAAQ;GAClB,MAAM,QAAQ,IAAI;AAClB,OAAI,SAAS,MAAM,OACjB,OAAM,IAAI,gBAAgB,2BAA2B,EAAE,OAAO,CAAC;GAGjE,MAAM,OAAO,MAAM;GAGnB,MAAM,QACJ,KAAK,MAAM,qBAAqB,IAChC,KAAK,MAAM,0BAA0B,IACrC,KAAK,MAAM,mCAAmC;AAEhD,OAAI,CAAC,MACH,OAAM,IAAI,gBAAgB,4CAA4C,EACpE,MACD,CAAC;GAGJ,MAAM,MAAM,MAAM;AAClB,OAAI,IAAI,WAAW,UAAU,CAE3B,QADY,IAAI,IAAI,IAAI,CACb;AAGb,UAAO,IAAI,QAAQ,gBAAgB,GAAG;WAC/B,eAAe;AACtB,OAAI,yBAAyB,gBAAiB,OAAM;AACpD,SAAM,IAAI,gBAAgB,iCAAiC,EACzD,OAAO,eACR,CAAC;;;;;;;;;;;AAYR,SAAgB,kBAAkB,QAAQ,GAAG;CAC3C,MAAM,OAAO,cAAc,QAAQ,EAAE;AACrC,QAAO,KAAK,WAAW,QAAQ,GAAG,cAAc,KAAK,GAAG;;;;;;;;;AAU1D,eAAsB,cACpB,iBAAiB,mBAAmB,EACnB;CAKjB,IAAI,MAAM,QAAQ,eAAe;AAEjC,QAAO,MAAM;AAMX,MAHe,MAAM,KAFL,KAAK,KAAK,eAAe,CAEP,CAC/B,WAAW,KAAK,CAChB,YAAY,MAAM,CACT,QAAO;EAGnB,MAAM,SAAS,QAAQ,IAAI;AAC3B,MAAI,WAAW,IAAK;AACpB,QAAM;;AAGR,OAAM,IAAI,MAAM,+BAA+B,iBAAiB"}
1
+ {"version":3,"file":"runtime-utils.mjs","names":[],"sources":["../src/runtime-utils/path.ts"],"sourcesContent":["import { stat } from 'node:fs/promises';\nimport { join, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n/**\n * Universal ESM function to get the file path of the caller.\n * Works in Node.js, Deno, and Bun (native ESM environments).\n *\n * - Uses V8 structured stack traces when available (Node/Bun).\n * - Falls back to string-based stack parsing when necessary (e.g., Deno).\n * - Throws a descriptive error when the file path cannot be determined.\n */\n\nclass CallerFileError extends Error {\n info: unknown;\n constructor(message: string, info: unknown = {}) {\n super(message);\n this.name = 'CallerFileError';\n this.info = info;\n }\n}\n\n/**\n * Returns the absolute file path of the calling file.\n *\n * @param {number} depth - 1 = immediate caller, 2 = caller's caller, etc.\n * @returns {string} Absolute file path of the caller.\n * @throws {CallerFileError} If the caller file cannot be determined.\n */\nexport function getCallerFile(depth = 1) {\n if (typeof depth !== 'number' || depth < 1) {\n throw new CallerFileError('Invalid depth argument', { depth });\n }\n\n // --- Primary method: V8 structured stack trace (Node.js / Bun) ---\n try {\n const originalPrepare = Error.prepareStackTrace;\n Error.prepareStackTrace = (_, structuredStackTrace) => structuredStackTrace;\n const err = new Error();\n const { stack } = err;\n Error.prepareStackTrace = originalPrepare;\n\n if (Array.isArray(stack)) {\n const frame = stack[depth];\n if (frame && typeof frame.getFileName === 'function') {\n const file = frame.getFileName();\n if (typeof file === 'string') return file;\n throw new CallerFileError('CallSite#getFileName() returned null', {\n frame,\n });\n } else {\n throw new CallerFileError('Invalid or missing CallSite object', {\n frame,\n });\n }\n } else {\n throw new CallerFileError('Structured stack trace unavailable', {\n stack,\n });\n }\n } catch (v8Error) {\n // --- Fallback: plain text stack parsing (Deno and others) ---\n try {\n const stackStr = new Error().stack;\n if (typeof stackStr !== 'string') {\n throw new CallerFileError('Error.stack is not a string', {\n stack: stackStr,\n });\n }\n\n const lines = stackStr\n .split('\\n')\n .map((l) => l.trim())\n .filter(Boolean);\n const index = 1 + depth;\n if (index >= lines.length) {\n throw new CallerFileError('Stack trace too shallow', { lines });\n }\n\n const line = lines[index];\n\n // Match file URLs or absolute paths\n const match =\n line.match(/(file:\\/\\/[^\\s)]+)/) ||\n line.match(/(\\/[^:\\s)]+)(:\\d+){0,2}/) ||\n line.match(/([A-Za-z]:\\\\[^:\\s)]+)(:\\d+){0,2}/);\n\n if (!match) {\n throw new CallerFileError('No file path pattern found in stack line', {\n line,\n });\n }\n\n const raw = match[1];\n if (raw.startsWith('file://')) {\n const url = new URL(raw);\n return url.pathname;\n }\n\n return raw.replace(/:\\d+(:\\d+)?$/, '');\n } catch (fallbackError) {\n if (fallbackError instanceof CallerFileError) throw fallbackError;\n throw new CallerFileError('Fallback stack parsing failed', {\n cause: fallbackError,\n });\n }\n }\n}\n\n/**\n * Returns the absolute file path of the calling file.\n *\n * @param {number} depth - 1 = immediate caller, 2 = caller's caller, etc.\n * @returns {string} Absolute file path of the caller.\n * @throws {CallerFileError} If the caller file cannot be determined.\n */\nexport function getCallerFilePath(depth = 1) {\n const file = getCallerFile(depth + 1);\n return file.startsWith('file:') ? fileURLToPath(file) : file;\n}\n\n/**\n * Returns the directory that contains the package.json\n * associated with the specified import.meta.url.\n *\n * If no package.json is found while walking up the directory tree,\n * an error will be thrown.\n */\nexport async function getPackageDir(\n callerFilePath = getCallerFilePath(),\n): Promise<string> {\n // const { stat } = await import('node:fs/promises');\n // const { join, dirname } = await import('node:path');\n // const { fileURLToPath } = await import('node:url');\n\n let dir = dirname(callerFilePath);\n\n while (true) {\n const pkgJson = join(dir, 'package.json');\n\n const exists = await stat(pkgJson)\n .then(() => true)\n .catch(() => false);\n if (exists) return dir;\n\n // Move to the parent directory\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n\n throw new Error(`package.json not found for: ${callerFilePath}`);\n}\n"],"mappings":";;;;;;;;;;;;AAaA,IAAM,kBAAN,cAA8B,MAAM;CAClC;CACA,YAAY,SAAiB,OAAgB,CAAC,GAAG;EAC/C,MAAM,OAAO;EACb,KAAK,OAAO;EACZ,KAAK,OAAO;CACd;AACF;;;;;;;;AASA,SAAgB,cAAc,QAAQ,GAAG;CACvC,IAAI,OAAO,UAAU,YAAY,QAAQ,GACvC,MAAM,IAAI,gBAAgB,0BAA0B,EAAE,MAAM,CAAC;CAI/D,IAAI;EACF,MAAM,kBAAkB,MAAM;EAC9B,MAAM,qBAAqB,GAAG,yBAAyB;EAEvD,MAAM,EAAE,0BAAU,IADF,MACI;EACpB,MAAM,oBAAoB;EAE1B,IAAI,MAAM,QAAQ,KAAK,GAAG;GACxB,MAAM,QAAQ,MAAM;GACpB,IAAI,SAAS,OAAO,MAAM,gBAAgB,YAAY;IACpD,MAAM,OAAO,MAAM,YAAY;IAC/B,IAAI,OAAO,SAAS,UAAU,OAAO;IACrC,MAAM,IAAI,gBAAgB,wCAAwC,EAChE,MACF,CAAC;GACH,OACE,MAAM,IAAI,gBAAgB,sCAAsC,EAC9D,MACF,CAAC;EAEL,OACE,MAAM,IAAI,gBAAgB,sCAAsC,EAC9D,MACF,CAAC;CAEL,SAAS,SAAS;EAEhB,IAAI;GACF,MAAM,4BAAW,IAAI,MAAM,EAAA,CAAE;GAC7B,IAAI,OAAO,aAAa,UACtB,MAAM,IAAI,gBAAgB,+BAA+B,EACvD,OAAO,SACT,CAAC;GAGH,MAAM,QAAQ,SACX,MAAM,IAAI,CAAC,CACX,KAAK,MAAM,EAAE,KAAK,CAAC,CAAC,CACpB,OAAO,OAAO;GACjB,MAAM,QAAQ,IAAI;GAClB,IAAI,SAAS,MAAM,QACjB,MAAM,IAAI,gBAAgB,2BAA2B,EAAE,MAAM,CAAC;GAGhE,MAAM,OAAO,MAAM;GAGnB,MAAM,QACJ,KAAK,MAAM,oBAAoB,KAC/B,KAAK,MAAM,yBAAyB,KACpC,KAAK,MAAM,kCAAkC;GAE/C,IAAI,CAAC,OACH,MAAM,IAAI,gBAAgB,4CAA4C,EACpE,KACF,CAAC;GAGH,MAAM,MAAM,MAAM;GAClB,IAAI,IAAI,WAAW,SAAS,GAE1B,OAAO,IADS,IAAI,GACX,CAAC,CAAC;GAGb,OAAO,IAAI,QAAQ,gBAAgB,EAAE;EACvC,SAAS,eAAe;GACtB,IAAI,yBAAyB,iBAAiB,MAAM;GACpD,MAAM,IAAI,gBAAgB,iCAAiC,EACzD,OAAO,cACT,CAAC;EACH;CACF;AACF;;;;;;;;AASA,SAAgB,kBAAkB,QAAQ,GAAG;CAC3C,MAAM,OAAO,cAAc,QAAQ,CAAC;CACpC,OAAO,KAAK,WAAW,OAAO,IAAI,cAAc,IAAI,IAAI;AAC1D;;;;;;;;AASA,eAAsB,cACpB,iBAAiB,kBAAkB,GAClB;CAKjB,IAAI,MAAM,QAAQ,cAAc;CAEhC,OAAO,MAAM;EAMX,IAAI,MAHiB,KAFL,KAAK,KAAK,cAEM,CAAC,CAAC,CAC/B,WAAW,IAAI,CAAC,CAChB,YAAY,KAAK,GACR,OAAO;EAGnB,MAAM,SAAS,QAAQ,GAAG;EAC1B,IAAI,WAAW,KAAK;EACpB,MAAM;CACR;CAEA,MAAM,IAAI,MAAM,+BAA+B,gBAAgB;AACjE"}
@@ -9,7 +9,6 @@ import { execa } from "execa";
9
9
  import { parse } from "acorn";
10
10
  import sortPackageJson from "sort-package-json";
11
11
  import * as prompts from "@inquirer/prompts";
12
-
13
12
  //#region src/types/hook.ts
14
13
  function createHooksDefaults() {
15
14
  return {
@@ -18,7 +17,6 @@ function createHooksDefaults() {
18
17
  preparePackageJSON: []
19
18
  };
20
19
  }
21
-
22
20
  //#endregion
23
21
  //#region src/types/dts.ts
24
22
  function normalizeDTSPreserveTypeTarget(target) {
@@ -61,7 +59,6 @@ function mergeDTSSettingsList(...settingsList) {
61
59
  });
62
60
  return normalizeDTSSettings(merged);
63
61
  }
64
-
65
62
  //#endregion
66
63
  //#region src/types/css.ts
67
64
  function resolveOptimizeCSSOptions(options) {
@@ -73,23 +70,19 @@ function resolveOptimizeCSSOptions(options) {
73
70
  if (cssnano !== false) resolved.cssnano = cssnano === true ? { preset: ["default", { normalizeWhitespace: false }] } : cssnano;
74
71
  return resolved;
75
72
  }
76
-
77
73
  //#endregion
78
74
  //#region src/types/workspace.ts
79
75
  const WORKSPACE_REQUIRED_FIELDS = ["name", "version"];
80
76
  const TSDOWN_SYNC_OPTIONS = [
81
77
  "define",
82
- "noExternal",
83
- "external",
84
78
  "skipNodeModulesBundle",
85
79
  "onSuccess",
86
- "copy"
80
+ "copy",
81
+ "deps"
87
82
  ];
88
-
89
83
  //#endregion
90
84
  //#region src/types/project.ts
91
85
  const PROJECT_REQUIRED_FIELDS = ["name"];
92
-
93
86
  //#endregion
94
87
  //#region src/utils/general.ts
95
88
  function isPromise(obj) {
@@ -109,7 +102,6 @@ async function resolveListable(raw) {
109
102
  }
110
103
  return result;
111
104
  }
112
-
113
105
  //#endregion
114
106
  //#region src/utils/tsdown.ts
115
107
  const _stringChunkToObject = (source) => {
@@ -183,7 +175,6 @@ function mergeNoExternals(base, override) {
183
175
  });
184
176
  };
185
177
  }
186
-
187
178
  //#endregion
188
179
  //#region src/utils/exit-hook.ts
189
180
  const EXIT_SIGNALS = [
@@ -211,7 +202,6 @@ for (const signal of EXIT_SIGNALS) process.on(signal, async () => {
211
202
  process.exit(1);
212
203
  }
213
204
  });
214
-
215
205
  //#endregion
216
206
  //#region src/utils/file.ts
217
207
  function getFilename(importMetaURL) {
@@ -338,7 +328,6 @@ async function writeFileAtomic(filePath, content) {
338
328
  throw error;
339
329
  }
340
330
  }
341
-
342
331
  //#endregion
343
332
  //#region src/utils/expose.ts
344
333
  function resolveRawExposeEntriesSettings(rawSettings) {
@@ -358,7 +347,6 @@ async function exposeEntries(rawSettings) {
358
347
  }
359
348
  return entries;
360
349
  }
361
-
362
350
  //#endregion
363
351
  //#region src/constants.ts
364
352
  const PROJECT_CONFIG_BASENAME = "plugboy.project";
@@ -366,7 +354,6 @@ const WORKSPACE_CONFIG_BASENAME = "plugboy.workspace";
366
354
  const PACKAGE_JSON_FILENAME = "package.json";
367
355
  const WORKSPACE_SPEC_PREFIX = "workspace:";
368
356
  const SEARCH_BUNDLE_EXTENSIONS_MATCH = "(ts|mjs|js|json)";
369
-
370
357
  //#endregion
371
358
  //#region src/utils/project.ts
372
359
  function isProjectPackageJson(json) {
@@ -399,7 +386,6 @@ async function loadProjectConfig(searchDir, depth) {
399
386
  }, searchDir);
400
387
  return resolveUserProjectConfig(await (hit ? (await bundleRequire({ filepath: hit.path })).mod.default : {}));
401
388
  }
402
-
403
389
  //#endregion
404
390
  //#region src/utils/plugin.ts
405
391
  async function resolveUserPluginOption(pluginOption) {
@@ -419,7 +405,6 @@ async function extractProjectPlugins(searchDir) {
419
405
  async function findProjectPlugin(pluginName, searchDir) {
420
406
  return (await extractProjectPlugins(searchDir)).find((plugin) => plugin.name === pluginName);
421
407
  }
422
-
423
408
  //#endregion
424
409
  //#region src/utils/workspace.ts
425
410
  function isWorkspacePackageJson(json) {
@@ -458,7 +443,6 @@ async function loadWorkspaceConfig(searchDir, depth) {
458
443
  }, searchDir);
459
444
  return resolveUserWorkspaceConfig(await (hit ? (await bundleRequire({ filepath: hit.path })).mod.default : {}));
460
445
  }
461
-
462
446
  //#endregion
463
447
  //#region src/utils/hook.ts
464
448
  async function resolveUserHooks(...userHooks) {
@@ -481,7 +465,6 @@ function buildHooks(resolvedHooks) {
481
465
  });
482
466
  return hooks;
483
467
  }
484
-
485
468
  //#endregion
486
469
  //#region src/path.ts
487
470
  var Path = class Path {
@@ -568,7 +551,6 @@ var Path = class Path {
568
551
  }
569
552
  }
570
553
  };
571
-
572
554
  //#endregion
573
555
  //#region src/package.ts
574
556
  async function getProjectPackageJson(searchDir, allowMissing) {
@@ -610,7 +592,6 @@ async function findWorkspacePackages(dir) {
610
592
  });
611
593
  return results;
612
594
  }
613
-
614
595
  //#endregion
615
596
  //#region src/workspace/dts.ts
616
597
  async function runTsc(compiler, opts = {}, ignoreErrors) {
@@ -643,7 +624,6 @@ async function emitDTS(opts) {
643
624
  });
644
625
  else await runTsc(compiler, { ...baseOpts }, ignoreCompilerErrors);
645
626
  }
646
-
647
627
  //#endregion
648
628
  //#region src/env/constants.ts
649
629
  const PLUGBOY_VAR_ENVS_FOR_BUNDLE = {
@@ -654,7 +634,6 @@ const PLUGBOY_VAR_ENVS_FOR_STUB = {
654
634
  __PLUGBOY_STUB__: "true",
655
635
  __PLUGBOY_DEV__: "true"
656
636
  };
657
-
658
637
  //#endregion
659
638
  //#region src/env/utils.ts
660
639
  function applyPlugboyEnvs(config) {
@@ -669,7 +648,6 @@ function applyPlugboyEnvs(config) {
669
648
  function getPlugboyEnvCodeForStub() {
670
649
  return Object.entries(PLUGBOY_VAR_ENVS_FOR_STUB).map(([envName, variable]) => `globalThis.${envName} = ${variable};`).join("\n");
671
650
  }
672
-
673
651
  //#endregion
674
652
  //#region src/env/plugin.ts
675
653
  function findAfterImports(code) {
@@ -710,7 +688,6 @@ function WorkspaceEnvPlugin(_workspace) {
710
688
  }
711
689
  };
712
690
  }
713
-
714
691
  //#endregion
715
692
  //#region src/workspace/builder.ts
716
693
  const SHEBANG_MATCH_RE = /^(#!.+?)\n/;
@@ -727,10 +704,10 @@ var Builder = class {
727
704
  this.workspace = workspace;
728
705
  }
729
706
  async tsdownOptions(overrides) {
730
- let { _tsdownOptions } = this;
707
+ const { _tsdownOptions } = this;
731
708
  if (_tsdownOptions) return _tsdownOptions;
732
709
  const { entry, dts } = this;
733
- _tsdownOptions = {
710
+ const resolvedOptions = {
734
711
  dts: dts.inline || typeof dts.compiler === "function" ? false : dts.compiler === "vue-tsc" ? { vue: true } : true,
735
712
  treeshake: true,
736
713
  css: this.workspace.cssOptions,
@@ -740,11 +717,12 @@ var Builder = class {
740
717
  clean: true,
741
718
  ...overrides
742
719
  };
743
- for (const opt of TSDOWN_SYNC_OPTIONS) _tsdownOptions[opt] = this.workspace.config[opt];
744
- applyPlugboyEnvs(_tsdownOptions);
745
- _tsdownOptions.external = mergeExternals(_tsdownOptions.external, [/^(@fastkit\/)?plugboy(?!\/runtime-utils)/, ...this.workspace.dependencies]);
746
- this._tsdownOptions = _tsdownOptions;
747
- return _tsdownOptions;
720
+ for (const opt of TSDOWN_SYNC_OPTIONS) resolvedOptions[opt] = this.workspace.config[opt];
721
+ applyPlugboyEnvs(resolvedOptions);
722
+ resolvedOptions.deps ??= {};
723
+ resolvedOptions.deps.neverBundle = mergeExternals(resolvedOptions.deps.neverBundle, [/^(@fastkit\/)?plugboy(?!\/runtime-utils)/, ...this.workspace.dependencies]);
724
+ this._tsdownOptions = resolvedOptions;
725
+ return resolvedOptions;
748
726
  }
749
727
  async _stubLinkJS(from, to) {
750
728
  const fromParsed = path.parse(from);
@@ -884,7 +862,6 @@ var Builder = class {
884
862
  else await this.normalizeDTSFiles();
885
863
  }
886
864
  };
887
-
888
865
  //#endregion
889
866
  //#region src/project/project.ts
890
867
  /**
@@ -964,16 +941,15 @@ async function getProject(searchDir, allowMissing, skipLoadConfig) {
964
941
  resolvedWorkspaces
965
942
  });
966
943
  }
967
-
968
944
  //#endregion
969
945
  //#region src/postcss/plugin.ts
970
946
  async function getPostcss(options) {
971
947
  const { layer, media, combineRules, cssnano } = options;
972
948
  const [postcss, _layer, _media, _combineRules, _cssnano] = await Promise.all([
973
949
  import("postcss").then((mod) => mod.default),
974
- layer && import("./optimize-layer-CK8NR_VC.mjs").then((mod) => mod.OptimizeLayer(layer)),
975
- media && import("./optimize-media-Bxy27Cj7.mjs").then((mod) => mod.OptimizeMedia(media)),
976
- combineRules && import("./combine-rules-CWp-M491.mjs").then((mod) => mod.CombineRules(combineRules)),
950
+ layer && import("./optimize-layer-DZdbIjXg.mjs").then((mod) => mod.OptimizeLayer(layer)),
951
+ media && import("./optimize-media-CocGC9bo.mjs").then((mod) => mod.OptimizeMedia(media)),
952
+ combineRules && import("./combine-rules-DKihHyJd.mjs").then((mod) => mod.CombineRules(combineRules)),
977
953
  cssnano && import("cssnano").then((mod) => mod.default(cssnano))
978
954
  ]);
979
955
  const plugins = [];
@@ -1019,7 +995,6 @@ function OptimizeCSSPlugin(workspace) {
1019
995
  }
1020
996
  };
1021
997
  }
1022
-
1023
998
  //#endregion
1024
999
  //#region src/workspace/plugins/raw-loader.ts
1025
1000
  const rawLoaderPlugin = {
@@ -1041,71 +1016,101 @@ const rawLoaderPlugin = {
1041
1016
  return `export default ${JSON.stringify(content)};`;
1042
1017
  }
1043
1018
  };
1044
-
1045
1019
  //#endregion
1046
1020
  //#region src/workspace/plugins/preserve-css-imports.ts
1047
1021
  /**
1048
- * Plugin to preserve CSS @import statements
1022
+ * Plugin to preserve external CSS `@import` statements.
1049
1023
  *
1050
- * rolldown tries to resolve and inline CSS @import statements,
1051
- * but external package CSS should be treated as external and output @import as-is.
1024
+ * rolldown / tsdown's CSS pipeline (lightningcss) resolves and inlines every
1025
+ * `@import` it can. For bare package specifiers (e.g.
1026
+ * `@import url('material-symbols/rounded.css') layer(...)`) that is wrong for a
1027
+ * library build: it bloats the output and rebases the imported package's own
1028
+ * relative asset URLs (fonts) against our `dist`, breaking them. Such imports
1029
+ * should stay external so the consumer's bundler resolves them.
1052
1030
  *
1053
- * Note: rolldown parses and optimizes CSS independently, so placeholder approach doesn't work.
1054
- * Instead, collect external import paths and prepend them to CSS in generateBundle.
1031
+ * We can't intercept this in a `transform` hook by then tsdown has already
1032
+ * inlined the imports. Instead we strip them in `load` (which runs before the
1033
+ * CSS transform), remember them, and re-emit them in `writeBundle`, after every
1034
+ * other CSS producer (including vanilla-extract's merge) has written the final
1035
+ * file to disk.
1055
1036
  */
1056
1037
  /**
1057
- * Regular expression for CSS @import (with optional layer() support)
1058
- *
1059
- * Supports the following patterns:
1060
- * - @import 'path';
1061
- * - @import "path";
1062
- * - @import url(path);
1063
- * - @import url('path');
1064
- * - @import url("path");
1065
- * - @import url('path') layer(name);
1066
- * - @import 'path' layer(name);
1067
- *
1068
- * Captures:
1069
- * 1: import path
1070
- * 2: layer specification (e.g. " layer(fabric.foundation)") or undefined
1038
+ * Matches a single `@import` statement, capturing the quote (group 1) and the
1039
+ * imported specifier (group 2). Handles `url(...)`, quoted, and bare forms, and
1040
+ * tolerates trailing conditions (e.g. `layer(...)`, media queries).
1041
+ */
1042
+ const IMPORT_RE = /@import\s+(?:url\(\s*)?(["']?)([^"')\s]+)\1\s*\)?[^;]*;/g;
1043
+ /**
1044
+ * A specifier is "internal" (safe to bundle/inline) when it is relative,
1045
+ * absolute, a URL, a data URI, or a fragment. Anything else is treated as a
1046
+ * bare package specifier whose `@import` is preserved.
1071
1047
  */
1072
- const EXTERNAL_IMPORT_REGEX = /@import\s+(?:url\(\s*['"]?|['"])([^'"\s);]+)(?:['"]?\s*\)|['"])(\s+layer\([^)]+\))?\s*;/g;
1073
- function externalImportKey(entry) {
1074
- return entry.layer ? `${entry.path}::${entry.layer}` : entry.path;
1048
+ function isInternalImportSpecifier(spec) {
1049
+ return /^(?:\.{1,2}\/|\/|[a-z][a-z\d+.-]*:|data:|#)/i.test(spec);
1075
1050
  }
1051
+ /** Matches a top-level `@layer <names>;` statement (declaration, not a block). */
1052
+ const LAYER_STATEMENT_RE = /@layer\s+([^{};]+);[ \t]*\n?/g;
1076
1053
  function createPreserveCssImportsPlugin() {
1077
- const externalCssImports = /* @__PURE__ */ new Map();
1054
+ const externalImports = [];
1055
+ const processed = /* @__PURE__ */ new Set();
1078
1056
  return definePlugin({
1079
1057
  name: "preserve-css-imports",
1080
- transform: { handler(code, id) {
1081
- if (!id.endsWith(".css")) return null;
1082
- let hasExternalImports = false;
1083
- const transformed = code.replace(EXTERNAL_IMPORT_REGEX, (match, importPath, layerSpec) => {
1084
- if (!importPath.startsWith(".") && !importPath.startsWith("/")) {
1085
- hasExternalImports = true;
1086
- const entry = {
1087
- path: importPath,
1088
- layer: layerSpec?.trim()
1089
- };
1090
- externalCssImports.set(externalImportKey(entry), entry);
1091
- return "";
1092
- }
1093
- return match;
1058
+ buildStart() {
1059
+ externalImports.length = 0;
1060
+ processed.clear();
1061
+ },
1062
+ async load(id) {
1063
+ const file = id.split("?")[0];
1064
+ if (!file.endsWith(".css")) return null;
1065
+ let code;
1066
+ try {
1067
+ code = await fs$1.readFile(file, "utf8");
1068
+ } catch {
1069
+ return null;
1070
+ }
1071
+ if (!code.includes("@import")) return null;
1072
+ let changed = false;
1073
+ const stripped = code.replace(IMPORT_RE, (statement, _quote, spec) => {
1074
+ if (isInternalImportSpecifier(spec)) return statement;
1075
+ changed = true;
1076
+ const normalized = statement.trim();
1077
+ if (!externalImports.includes(normalized)) externalImports.push(normalized);
1078
+ return "";
1094
1079
  });
1095
- if (hasExternalImports) return {
1096
- code: transformed,
1080
+ if (!changed) return null;
1081
+ return {
1082
+ code: stripped,
1097
1083
  map: null
1098
1084
  };
1099
- return null;
1100
- } },
1101
- generateBundle: { handler(_options, bundle) {
1102
- if (externalCssImports.size === 0) return;
1103
- const importStatements = Array.from(externalCssImports.values()).map(({ path, layer }) => layer ? `@import '${path}' ${layer};` : `@import '${path}';`).join("\n");
1104
- for (const chunk of Object.values(bundle)) if (chunk.type === "asset" && typeof chunk.source === "string" && chunk.fileName.endsWith(".css")) chunk.source = importStatements + "\n" + chunk.source;
1105
- } }
1085
+ },
1086
+ async writeBundle(options, bundle) {
1087
+ if (!externalImports.length) return;
1088
+ const { dir } = options;
1089
+ if (!dir) return;
1090
+ const importBlock = `${externalImports.join("\n")}\n`;
1091
+ await Promise.all(Object.values(bundle).map(async (chunk) => {
1092
+ if (chunk.type !== "asset" || !chunk.fileName.endsWith(".css")) return;
1093
+ const filePath = path.join(dir, chunk.fileName);
1094
+ if (processed.has(filePath)) return;
1095
+ let css;
1096
+ try {
1097
+ css = await fs$1.readFile(filePath, "utf8");
1098
+ } catch {
1099
+ return;
1100
+ }
1101
+ processed.add(filePath);
1102
+ const layerNames = [];
1103
+ for (const [, names] of css.matchAll(LAYER_STATEMENT_RE)) for (const name of names.split(",")) {
1104
+ const trimmed = name.trim();
1105
+ if (trimmed && !layerNames.includes(trimmed)) layerNames.push(trimmed);
1106
+ }
1107
+ const body = css.replace(LAYER_STATEMENT_RE, "");
1108
+ const layerStatement = layerNames.length ? `@layer ${layerNames.join(", ")};\n` : "";
1109
+ await fs$1.writeFile(filePath, `${layerStatement}${importBlock}${body}`);
1110
+ }));
1111
+ }
1106
1112
  });
1107
1113
  }
1108
-
1109
1114
  //#endregion
1110
1115
  //#region src/workspace/workspace.ts
1111
1116
  function extractWorkspaceObjectExport(at) {
@@ -1264,7 +1269,7 @@ var PlugboyWorkspace = class {
1264
1269
  const deps = cloned[prop];
1265
1270
  if (!deps) return;
1266
1271
  Object.keys(deps).forEach((dep) => {
1267
- if (deps[dep].startsWith(WORKSPACE_SPEC_PREFIX)) deps[dep] = `${WORKSPACE_SPEC_PREFIX}^`;
1272
+ if (deps[dep].startsWith("workspace:")) deps[dep] = `${WORKSPACE_SPEC_PREFIX}^`;
1268
1273
  else if (projectPeerDependencies && projectPeerDependencies[dep] && !deps[dep]) deps[dep] = projectPeerDependencies[dep];
1269
1274
  });
1270
1275
  });
@@ -1345,10 +1350,12 @@ async function getWorkspace(searchDir, allowMissing) {
1345
1350
  css: config.css,
1346
1351
  optimizeCSS,
1347
1352
  mergeExternals: (override) => {
1348
- config.external = mergeExternals(config.external, override);
1353
+ config.deps ??= {};
1354
+ config.deps.neverBundle = mergeExternals(config.deps.neverBundle, override);
1349
1355
  },
1350
1356
  mergeNoExternals: (override) => {
1351
- config.noExternal = mergeNoExternals(config.noExternal, override);
1357
+ config.deps ??= {};
1358
+ config.deps.alwaysBundle = mergeNoExternals(config.deps.alwaysBundle, override);
1352
1359
  }
1353
1360
  };
1354
1361
  await hooks.setupWorkspace(ctx, () => {
@@ -1358,7 +1365,6 @@ async function getWorkspace(searchDir, allowMissing) {
1358
1365
  await hooks.createWorkspace(workspace);
1359
1366
  return workspace;
1360
1367
  }
1361
-
1362
1368
  //#endregion
1363
1369
  //#region src/workspace/generate.ts
1364
1370
  async function generateWorkspace(workspaceName, cwd = process.cwd()) {
@@ -1477,7 +1483,7 @@ export default defineWorkspaceConfig({
1477
1483
  await (await getWorkspace(workspaceDir)).preparePackageJSON();
1478
1484
  }
1479
1485
  }
1480
-
1481
1486
  //#endregion
1482
1487
  export { normalizeDTSSettings as $, resolveRawExposeEntriesSettings as A, exitHook as B, findProjectPlugin as C, loadProjectConfig as D, isProjectPackageJson as E, getFilename as F, resolveListable as G, mergeExternals as H, isFileNotFoundException as I, WORKSPACE_REQUIRED_FIELDS as J, PROJECT_REQUIRED_FIELDS as K, pathExists as L, findConfig as M, findFile as N, resolveUserProjectConfig as O, getDirname as P, normalizeDTSPreserveTypeTarget as Q, rmrf as R, extractProjectPlugins as S, defineProjectConfig as T, mergeNoExternals as U, mergeChunkAddons as V, isPromise as W, mergeDTSSettingsList as X, resolveOptimizeCSSOptions as Y, normalizeDTSPreserveTypeSettings as Z, loadWorkspaceConfig as _, syncWorkspacePackageFields as a, resolveUserWorkspaceConfig as b, Builder as c, getWorkspacePackageJson as d, createHooksDefaults as et, Path as f, isWorkspacePackageJson as g, defineWorkspaceConfig as h, getWorkspace as i, copyDirSync as j, exposeEntries as k, findWorkspacePackages as l, resolveUserHooks as m, PlugboyWorkspace as n, PlugboyProject as o, buildHooks as p, TSDOWN_SYNC_OPTIONS as q, WORKSPACE_PACKAGE_SYNC_FIELDS as r, getProject as s, generateWorkspace as t, getProjectPackageJson as u, resolveRawWorkspaceEntries as v, resolveUserPluginOption as w, definePlugin as x, resolveRawWorkspaceEntry as y, writeFileAtomic as z };
1483
- //# sourceMappingURL=workspace-Den7m7D_.mjs.map
1488
+
1489
+ //# sourceMappingURL=workspace-XEn7b5JU.mjs.map