smartbundle 0.15.0-alpha.1 → 0.15.0-alpha.2

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 CHANGED
@@ -51,7 +51,7 @@ npm install --save-dev smartbundle@latest
51
51
  ```bash
52
52
  npm run build
53
53
  ```
54
- 4) Your built files (including an auto-generated package.json) will be in the ./dist folder
54
+ 4) Your built files (including an auto-generated package.json) will be in the ./sb-dist folder
55
55
 
56
56
  ## Features
57
57
 
@@ -68,14 +68,14 @@ npm run build
68
68
  Every bundled package is tested in real environments - from Node.js and Bun to Webpack and Metro - to ensure it just works.
69
69
 
70
70
  ### Runtimes
71
- | Runtime | Version | Supported | E2E Tests |
72
- |------------|-----------|:---------:|:---------:|
73
- | Node.js | ^18.0.0 | ✔ | ✔ |
74
- | | ^20.0.0 | ✔ | ✔ |
75
- | | ^22.0.0 | ✔ | ✔ |
76
- | | ^23.0.0 | ✔ | ✔ |
77
- | Bun | ^1.0.0 | ✔ | ✔ |
78
- | Deno | ^2.0.0 | ✔ | - |
71
+ | Runtime | Version | Supported | E2E Tests |
72
+ |------------|---------|:---------:|:---------:|
73
+ | Node.js | ^18.0.0 | ✔ | ✔ |
74
+ | | ^20.0.0 | ✔ | ✔ |
75
+ | | ^22.0.0 | ✔ | ✔ |
76
+ | | ^24.0.0 | ✔ | ✔ |
77
+ | Bun | ^1.0.0 | ✔ | ✔ |
78
+ | Deno | ^2.0.0 | ✔ | - |
79
79
 
80
80
  ### Bundlers
81
81
  | Bundler | Version | Supported | E2E Tests |
@@ -31,7 +31,7 @@ const argsSchema = yargs().option("sourceDir", {
31
31
  }).option("outputDir", {
32
32
  alias: "o",
33
33
  type: "string",
34
- describe: "path to the output directory. Default: cwd()/dist"
34
+ describe: "path to the output directory. Default: cwd()/sb-dist"
35
35
  }).option("seq", {
36
36
  type: "boolean",
37
37
  describe: "run internal tasks sequentially. It is useful for performance testing and debugging. This option is unstable and not recommended for production use."
@@ -1 +1 @@
1
- {"version":3,"file":"args.js","sources":["../../../../src/args.ts"],"sourcesContent":["import yargs from \"yargs\";\nimport * as process from \"node:process\";\nimport { hideBin } from \"yargs/helpers\";\n\nconst argsSchema = yargs()\n .option(\"sourceDir\", {\n alias: \"s\",\n type: \"string\",\n describe:\n \"path to the project directory. Default: current working directory\",\n })\n .option(\"packagePath\", {\n alias: \"p\",\n type: \"string\",\n describe: \"path to the package.json. Default: cwd()/package.json\",\n })\n .option(\"outputDir\", {\n alias: \"o\",\n type: \"string\",\n describe: \"path to the output directory. Default: cwd()/dist\",\n })\n // Do not cover this option in tests because it is unstable\n .option(\"seq\", {\n type: \"boolean\",\n describe:\n \"run internal tasks sequentially. It is useful for performance testing and debugging. This option is unstable and not recommended for production use.\",\n })\n .option(\"ci\", {\n type: \"boolean\",\n describe: \"run in CI mode\",\n })\n .help(\"help\");\n\nexport const args = argsSchema.parseSync(hideBin(process.argv));\n\ntype OmitUnknown<T> = {\n [K in keyof T as string extends K ? never : K]: T[K];\n};\ntype ConvertUndefinedToOptional<T> = {\n [K in keyof T as undefined extends T[K] ? K : never]?: Exclude<\n T[K],\n undefined\n >;\n} & {\n [K in keyof T as undefined extends T[K] ? never : K]: T[K];\n};\n\nexport type Monorepo = {\n type: \"pnpm\";\n devDeps: Record<string, string>;\n};\n\nexport type Args = ConvertUndefinedToOptional<\n Omit<OmitUnknown<typeof args>, \"_\" | \"$0\">\n> & {\n monorepo?: Monorepo;\n skipGitignore?: boolean;\n};\n"],"names":["hideBin","process"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAIA,MAAM,aAAa,MAAA,EAChB,OAAO,aAAa;AAAA,EACnB,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UACE;AACJ,CAAC,EACA,OAAO,eAAe;AAAA,EACrB,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU;AACZ,CAAC,EACA,OAAO,aAAa;AAAA,EACnB,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU;AACZ,CAAC,EAEA,OAAO,OAAO;AAAA,EACb,MAAM;AAAA,EACN,UACE;AACJ,CAAC,EACA,OAAO,MAAM;AAAA,EACZ,MAAM;AAAA,EACN,UAAU;AACZ,CAAC,EACA,KAAK,MAAM;AAEP,MAAM,OAAO,WAAW,UAAUA,QAAAA,QAAQC,mBAAQ,IAAI,CAAC;;"}
1
+ {"version":3,"file":"args.js","sources":["../../../../src/args.ts"],"sourcesContent":["import yargs from \"yargs\";\nimport * as process from \"node:process\";\nimport { hideBin } from \"yargs/helpers\";\n\nconst argsSchema = yargs()\n .option(\"sourceDir\", {\n alias: \"s\",\n type: \"string\",\n describe:\n \"path to the project directory. Default: current working directory\",\n })\n .option(\"packagePath\", {\n alias: \"p\",\n type: \"string\",\n describe: \"path to the package.json. Default: cwd()/package.json\",\n })\n .option(\"outputDir\", {\n alias: \"o\",\n type: \"string\",\n describe: \"path to the output directory. Default: cwd()/sb-dist\",\n })\n // Do not cover this option in tests because it is unstable\n .option(\"seq\", {\n type: \"boolean\",\n describe:\n \"run internal tasks sequentially. It is useful for performance testing and debugging. This option is unstable and not recommended for production use.\",\n })\n .option(\"ci\", {\n type: \"boolean\",\n describe: \"run in CI mode\",\n })\n .help(\"help\");\n\nexport const args = argsSchema.parseSync(hideBin(process.argv));\n\ntype OmitUnknown<T> = {\n [K in keyof T as string extends K ? never : K]: T[K];\n};\ntype ConvertUndefinedToOptional<T> = {\n [K in keyof T as undefined extends T[K] ? K : never]?: Exclude<\n T[K],\n undefined\n >;\n} & {\n [K in keyof T as undefined extends T[K] ? never : K]: T[K];\n};\n\nexport type Monorepo = {\n type: \"pnpm\";\n devDeps: Record<string, string>;\n};\n\nexport type Args = ConvertUndefinedToOptional<\n Omit<OmitUnknown<typeof args>, \"_\" | \"$0\">\n> & {\n monorepo?: Monorepo;\n skipGitignore?: boolean;\n};\n"],"names":["hideBin","process"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAIA,MAAM,aAAa,MAAA,EAChB,OAAO,aAAa;AAAA,EACnB,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UACE;AACJ,CAAC,EACA,OAAO,eAAe;AAAA,EACrB,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU;AACZ,CAAC,EACA,OAAO,aAAa;AAAA,EACnB,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU;AACZ,CAAC,EAEA,OAAO,OAAO;AAAA,EACb,MAAM;AAAA,EACN,UACE;AACJ,CAAC,EACA,OAAO,MAAM;AAAA,EACZ,MAAM;AAAA,EACN,UAAU;AACZ,CAAC,EACA,KAAK,MAAM;AAEP,MAAM,OAAO,WAAW,UAAUA,QAAAA,QAAQC,mBAAQ,IAAI,CAAC;;"}
@@ -33,7 +33,7 @@ async function buildMonorepo(args) {
33
33
  ...args,
34
34
  sourceDir: packageSourceDir,
35
35
  packagePath: path.join(packageSourceDir, "package.json"),
36
- outputDir: path.join(packageSourceDir, "dist"),
36
+ outputDir: path.join(packageSourceDir, "sb-dist"),
37
37
  monorepo
38
38
  };
39
39
  const buildResult = await _.run(packageArgs);
@@ -1 +1 @@
1
- {"version":3,"file":"buildAll.js","sources":["../../../../../src/monorepo/buildAll.ts"],"sourcesContent":["import { join } from \"node:path\";\nimport { parseMonorepo } from \"./parseMonorepo/parseMonorepo.js\";\nimport { run } from \"../index.js\";\nimport { type Args } from \"../args.js\";\nimport { log, lineLog } from \"../log.js\";\nimport { PrettyError } from \"../PrettyErrors.js\";\n\nexport type MonorepoBuildResult = {\n totalPackages: number;\n successfulBuilds: number;\n failedBuilds: number;\n errors: Array<{ packagePath: string; errors: Array<string | PrettyError> }>;\n};\n\nexport async function buildMonorepo(args: Args): Promise<MonorepoBuildResult> {\n const sourceDir = args.sourceDir || process.cwd();\n\n // Use existing monorepo detection\n const { monorepo, projectPaths } = await parseMonorepo({ sourceDir });\n\n if (!monorepo) {\n throw new PrettyError(\"Not a monorepo - pnpm-workspace.yaml not found\");\n }\n\n if (projectPaths.length === 0) {\n throw new PrettyError(\n \"No packages with -sbsources suffix found in monorepo\",\n );\n }\n\n log(`Found ${projectPaths.length} packages to build in monorepo`);\n lineLog();\n\n const result: MonorepoBuildResult = {\n totalPackages: projectPaths.length,\n successfulBuilds: 0,\n failedBuilds: 0,\n errors: [],\n };\n\n // Build each package sequentially for now\n // TODO: Add dependency analysis and parallel builds\n for (let i = 0; i < projectPaths.length; i++) {\n const packagePath = projectPaths[i];\n const packageSourceDir = join(sourceDir, packagePath);\n\n log(`[${i + 1}/${projectPaths.length}] Building ${packagePath}...`);\n\n // Create args for this specific package\n const packageArgs: Args = {\n ...args,\n sourceDir: packageSourceDir,\n packagePath: join(packageSourceDir, \"package.json\"),\n outputDir: join(packageSourceDir, \"dist\"),\n monorepo,\n };\n\n // Reuse existing run logic\n const buildResult = await run(packageArgs);\n\n if (buildResult.error) {\n result.failedBuilds++;\n result.errors.push({\n packagePath,\n errors: buildResult.errors,\n });\n log(\n `[${i + 1}/${projectPaths.length}] ❌ Failed to build ${packagePath}`,\n );\n } else {\n result.successfulBuilds++;\n log(`[${i + 1}/${projectPaths.length}] ✅ Built ${packagePath}`);\n }\n\n lineLog();\n }\n\n // Summary\n log(`Monorepo build completed:`);\n log(` Total packages: ${result.totalPackages}`);\n log(` Successful: ${result.successfulBuilds}`);\n log(` Failed: ${result.failedBuilds}`);\n\n return result;\n}\n"],"names":["parseMonorepo","PrettyError","log","lineLog","join","run"],"mappings":";;;;;;;;AAcA,eAAsB,cAAc,MAA0C;AAC5E,QAAM,YAAY,KAAK,aAAa,QAAQ,IAAI;AAG1C,QAAA,EAAE,UAAU,aAAa,IAAI,MAAMA,cAAc,cAAA,EAAE,WAAW;AAEpE,MAAI,CAAC,UAAU;AACP,UAAA,IAAIC,yBAAY,gDAAgD;AAAA,EAAA;AAGpE,MAAA,aAAa,WAAW,GAAG;AAC7B,UAAM,IAAIA,aAAA;AAAA,MACR;AAAA,IACF;AAAA,EAAA;AAGEC,MAAAA,IAAA,SAAS,aAAa,MAAM,gCAAgC;AACxDC,cAAA;AAER,QAAM,SAA8B;AAAA,IAClC,eAAe,aAAa;AAAA,IAC5B,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,QAAQ,CAAA;AAAA,EACV;AAIA,WAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AACtC,UAAA,cAAc,aAAa,CAAC;AAC5B,UAAA,mBAAmBC,KAAAA,KAAK,WAAW,WAAW;AAEhDF,QAAAA,IAAA,IAAI,IAAI,CAAC,IAAI,aAAa,MAAM,cAAc,WAAW,KAAK;AAGlE,UAAM,cAAoB;AAAA,MACxB,GAAG;AAAA,MACH,WAAW;AAAA,MACX,aAAaE,KAAAA,KAAK,kBAAkB,cAAc;AAAA,MAClD,WAAWA,KAAAA,KAAK,kBAAkB,MAAM;AAAA,MACxC;AAAA,IACF;AAGM,UAAA,cAAc,MAAMC,EAAA,IAAI,WAAW;AAEzC,QAAI,YAAY,OAAO;AACd,aAAA;AACP,aAAO,OAAO,KAAK;AAAA,QACjB;AAAA,QACA,QAAQ,YAAY;AAAA,MAAA,CACrB;AACDH,UAAA;AAAA,QACE,IAAI,IAAI,CAAC,IAAI,aAAa,MAAM,uBAAuB,WAAW;AAAA,MACpE;AAAA,IAAA,OACK;AACE,aAAA;AACHA,UAAAA,IAAA,IAAI,IAAI,CAAC,IAAI,aAAa,MAAM,aAAa,WAAW,EAAE;AAAA,IAAA;AAGxDC,gBAAA;AAAA,EAAA;AAIVD,MAAA,IAAI,2BAA2B;AAC3BA,MAAAA,IAAA,qBAAqB,OAAO,aAAa,EAAE;AAC3CA,MAAAA,IAAA,iBAAiB,OAAO,gBAAgB,EAAE;AAC1CA,MAAAA,IAAA,aAAa,OAAO,YAAY,EAAE;AAE/B,SAAA;AACT;;"}
1
+ {"version":3,"file":"buildAll.js","sources":["../../../../../src/monorepo/buildAll.ts"],"sourcesContent":["import { join } from \"node:path\";\nimport { parseMonorepo } from \"./parseMonorepo/parseMonorepo.js\";\nimport { run } from \"../index.js\";\nimport { type Args } from \"../args.js\";\nimport { log, lineLog } from \"../log.js\";\nimport { PrettyError } from \"../PrettyErrors.js\";\n\nexport type MonorepoBuildResult = {\n totalPackages: number;\n successfulBuilds: number;\n failedBuilds: number;\n errors: Array<{ packagePath: string; errors: Array<string | PrettyError> }>;\n};\n\nexport async function buildMonorepo(args: Args): Promise<MonorepoBuildResult> {\n const sourceDir = args.sourceDir || process.cwd();\n\n // Use existing monorepo detection\n const { monorepo, projectPaths } = await parseMonorepo({ sourceDir });\n\n if (!monorepo) {\n throw new PrettyError(\"Not a monorepo - pnpm-workspace.yaml not found\");\n }\n\n if (projectPaths.length === 0) {\n throw new PrettyError(\n \"No packages with -sbsources suffix found in monorepo\",\n );\n }\n\n log(`Found ${projectPaths.length} packages to build in monorepo`);\n lineLog();\n\n const result: MonorepoBuildResult = {\n totalPackages: projectPaths.length,\n successfulBuilds: 0,\n failedBuilds: 0,\n errors: [],\n };\n\n // Build each package sequentially for now\n // TODO: Add dependency analysis and parallel builds\n for (let i = 0; i < projectPaths.length; i++) {\n const packagePath = projectPaths[i];\n const packageSourceDir = join(sourceDir, packagePath);\n\n log(`[${i + 1}/${projectPaths.length}] Building ${packagePath}...`);\n\n // Create args for this specific package\n const packageArgs: Args = {\n ...args,\n sourceDir: packageSourceDir,\n packagePath: join(packageSourceDir, \"package.json\"),\n outputDir: join(packageSourceDir, \"sb-dist\"),\n monorepo,\n };\n\n // Reuse existing run logic\n const buildResult = await run(packageArgs);\n\n if (buildResult.error) {\n result.failedBuilds++;\n result.errors.push({\n packagePath,\n errors: buildResult.errors,\n });\n log(\n `[${i + 1}/${projectPaths.length}] ❌ Failed to build ${packagePath}`,\n );\n } else {\n result.successfulBuilds++;\n log(`[${i + 1}/${projectPaths.length}] ✅ Built ${packagePath}`);\n }\n\n lineLog();\n }\n\n // Summary\n log(`Monorepo build completed:`);\n log(` Total packages: ${result.totalPackages}`);\n log(` Successful: ${result.successfulBuilds}`);\n log(` Failed: ${result.failedBuilds}`);\n\n return result;\n}\n"],"names":["parseMonorepo","PrettyError","log","lineLog","join","run"],"mappings":";;;;;;;;AAcA,eAAsB,cAAc,MAA0C;AAC5E,QAAM,YAAY,KAAK,aAAa,QAAQ,IAAI;AAG1C,QAAA,EAAE,UAAU,aAAa,IAAI,MAAMA,cAAc,cAAA,EAAE,WAAW;AAEpE,MAAI,CAAC,UAAU;AACP,UAAA,IAAIC,yBAAY,gDAAgD;AAAA,EAAA;AAGpE,MAAA,aAAa,WAAW,GAAG;AAC7B,UAAM,IAAIA,aAAA;AAAA,MACR;AAAA,IACF;AAAA,EAAA;AAGEC,MAAAA,IAAA,SAAS,aAAa,MAAM,gCAAgC;AACxDC,cAAA;AAER,QAAM,SAA8B;AAAA,IAClC,eAAe,aAAa;AAAA,IAC5B,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,QAAQ,CAAA;AAAA,EACV;AAIA,WAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AACtC,UAAA,cAAc,aAAa,CAAC;AAC5B,UAAA,mBAAmBC,KAAAA,KAAK,WAAW,WAAW;AAEhDF,QAAAA,IAAA,IAAI,IAAI,CAAC,IAAI,aAAa,MAAM,cAAc,WAAW,KAAK;AAGlE,UAAM,cAAoB;AAAA,MACxB,GAAG;AAAA,MACH,WAAW;AAAA,MACX,aAAaE,KAAAA,KAAK,kBAAkB,cAAc;AAAA,MAClD,WAAWA,KAAAA,KAAK,kBAAkB,SAAS;AAAA,MAC3C;AAAA,IACF;AAGM,UAAA,cAAc,MAAMC,EAAA,IAAI,WAAW;AAEzC,QAAI,YAAY,OAAO;AACd,aAAA;AACP,aAAO,OAAO,KAAK;AAAA,QACjB;AAAA,QACA,QAAQ,YAAY;AAAA,MAAA,CACrB;AACDH,UAAA;AAAA,QACE,IAAI,IAAI,CAAC,IAAI,aAAa,MAAM,uBAAuB,WAAW;AAAA,MACpE;AAAA,IAAA,OACK;AACE,aAAA;AACHA,UAAAA,IAAA,IAAI,IAAI,CAAC,IAAI,aAAa,MAAM,aAAa,WAAW,EAAE;AAAA,IAAA;AAGxDC,gBAAA;AAAA,EAAA;AAIVD,MAAA,IAAI,2BAA2B;AAC3BA,MAAAA,IAAA,qBAAqB,OAAO,aAAa,EAAE;AAC3CA,MAAAA,IAAA,iBAAiB,OAAO,gBAAgB,EAAE;AAC1CA,MAAAA,IAAA,aAAa,OAAO,YAAY,EAAE;AAE/B,SAAA;AACT;;"}
@@ -7,7 +7,7 @@ const fs = require("node:fs/promises");
7
7
  async function createLinkPackages({
8
8
  sourceDir
9
9
  }) {
10
- const { isMonorepo, projectPaths } = await parseMonorepo.parseMonorepo({ sourceDir });
10
+ const { monorepo, projectPaths } = await parseMonorepo.parseMonorepo({ sourceDir });
11
11
  if (projectPaths.length === 0) {
12
12
  console.log("No SmartBundle-bundled projects found in the monorepo");
13
13
  return;
@@ -31,7 +31,7 @@ async function createLinkPackages({
31
31
  /-sbsources$/,
32
32
  ""
33
33
  );
34
- const linkPackageDir = path.join(sourceDir, projectPath, "dist");
34
+ const linkPackageDir = path.join(sourceDir, projectPath, "sb-dist");
35
35
  await fs.mkdir(linkPackageDir, { recursive: true });
36
36
  const linkExports = {};
37
37
  const reexportFiles = [];
@@ -67,6 +67,7 @@ async function createLinkPackages({
67
67
  }
68
68
  const linkPackageJson = {
69
69
  name: linkPackageName,
70
+ private: true,
70
71
  version: projectPackageJson.version ?? "0.0.0",
71
72
  type: "module",
72
73
  description: `Link package for ${projectPackageJson.name}`,
@@ -1 +1 @@
1
- {"version":3,"file":"createLinkPackages.js","sources":["../../../../../../src/monorepo/createLinkPackages/createLinkPackages.ts"],"sourcesContent":["import { parsePackageJson } from \"../../packageJson.js\";\nimport { parseMonorepo } from \"../parseMonorepo/parseMonorepo.js\";\nimport path from \"node:path\";\nimport fs from \"node:fs/promises\";\n\ntype CreateLinkPackagesArgs = {\n sourceDir: string;\n};\n\n/**\n * Creates link packages for all SmartBundle-bundled projects in a monorepo\n * A link package is a reference package that points to the bundled output\n */\nexport async function createLinkPackages({\n sourceDir,\n}: CreateLinkPackagesArgs) {\n // Find all SmartBundle-bundled projects in the monorepo\n const { isMonorepo, projectPaths } = await parseMonorepo({ sourceDir });\n\n if (projectPaths.length === 0) {\n console.log(\"No SmartBundle-bundled projects found in the monorepo\");\n return;\n }\n\n // Create link packages for each SmartBundle-bundled project\n for (const projectPath of projectPaths) {\n const projectDir = path.join(sourceDir, projectPath);\n const projectPackageJsonPath = path.join(projectDir, \"package.json\");\n\n try {\n const projectPackageJson = await parsePackageJson({\n sourceDir: projectDir,\n packagePath: projectPackageJsonPath,\n });\n\n if (Array.isArray(projectPackageJson)) {\n console.error(\n `Failed to parse package.json for ${projectPath}:`,\n projectPackageJson,\n );\n continue;\n }\n\n // Create the link package directory inside the source package\n const linkPackageName = projectPackageJson.name.replace(\n /-sbsources$/,\n \"\",\n );\n const linkPackageDir = path.join(sourceDir, projectPath, \"dist\");\n\n // Ensure the directory exists\n await fs.mkdir(linkPackageDir, { recursive: true });\n\n // Create re-export files for each export entry\n const linkExports: Record<string, string> = {};\n const reexportFiles: string[] = [];\n const reexportDirs = new Set<string>();\n\n if (projectPackageJson.exports) {\n for (const [exportKey, exportPath] of projectPackageJson.exports) {\n // Get the file extension from the source file\n const sourceExt = path.extname(exportPath);\n\n // Create the re-export file path based on the export key\n let reexportFileName: string;\n if (exportKey === \".\") {\n reexportFileName = `index${sourceExt}`;\n } else {\n // Remove \"./\" prefix and add the source extension\n const cleanKey = exportKey.startsWith(\"./\")\n ? exportKey.slice(2)\n : exportKey;\n reexportFileName = `${cleanKey}${sourceExt}`;\n }\n\n const reexportFilePath = path.join(linkPackageDir, reexportFileName);\n\n // Create directory for the re-export file if needed\n const reexportDir = path.dirname(reexportFilePath);\n if (reexportDir !== linkPackageDir) {\n await fs.mkdir(reexportDir, { recursive: true });\n // Track all parent directories\n let currentDir = path.relative(linkPackageDir, reexportDir);\n while (currentDir && currentDir !== \".\") {\n reexportDirs.add(currentDir);\n currentDir = path.dirname(currentDir);\n if (currentDir === \".\") break;\n }\n }\n\n // Create the re-export content\n const importPath =\n exportKey === \".\"\n ? projectPackageJson.name\n : `${projectPackageJson.name}/${exportKey.slice(2)}`;\n\n const reexportContent = `export * from \"${importPath}\";\\n`;\n\n // Write the re-export file\n await fs.writeFile(reexportFilePath, reexportContent);\n\n // Track the file for gitignore\n reexportFiles.push(reexportFileName);\n\n // Add to link package exports\n linkExports[exportKey] = `./${reexportFileName}`;\n }\n }\n\n // Create a package.json for the link package\n const linkPackageJson = {\n name: linkPackageName,\n version: projectPackageJson.version ?? \"0.0.0\",\n type: \"module\" as const,\n description: `Link package for ${projectPackageJson.name}`,\n exports: linkExports,\n // Add a devDependency on the source package to create a wire between source and dist\n devDependencies: {\n [projectPackageJson.name]: \"workspace:*\",\n },\n };\n\n // Write the package.json for the link package\n await fs.writeFile(\n path.join(linkPackageDir, \"package.json\"),\n JSON.stringify(linkPackageJson, null, 2),\n );\n\n console.log(\n `Created link package for ${projectPackageJson.name} at ${linkPackageDir}`,\n );\n } catch (error) {\n console.error(`Error creating link package for ${projectPath}:`, error);\n }\n }\n}\n"],"names":["parseMonorepo","parsePackageJson"],"mappings":";;;;;;AAaA,eAAsB,mBAAmB;AAAA,EACvC;AACF,GAA2B;AAEnB,QAAA,EAAE,YAAY,aAAa,IAAI,MAAMA,cAAc,cAAA,EAAE,WAAW;AAElE,MAAA,aAAa,WAAW,GAAG;AAC7B,YAAQ,IAAI,uDAAuD;AACnE;AAAA,EAAA;AAIF,aAAW,eAAe,cAAc;AACtC,UAAM,aAAa,KAAK,KAAK,WAAW,WAAW;AACnD,UAAM,yBAAyB,KAAK,KAAK,YAAY,cAAc;AAE/D,QAAA;AACI,YAAA,qBAAqB,MAAMC,6BAAiB;AAAA,QAChD,WAAW;AAAA,QACX,aAAa;AAAA,MAAA,CACd;AAEG,UAAA,MAAM,QAAQ,kBAAkB,GAAG;AAC7B,gBAAA;AAAA,UACN,oCAAoC,WAAW;AAAA,UAC/C;AAAA,QACF;AACA;AAAA,MAAA;AAII,YAAA,kBAAkB,mBAAmB,KAAK;AAAA,QAC9C;AAAA,QACA;AAAA,MACF;AACA,YAAM,iBAAiB,KAAK,KAAK,WAAW,aAAa,MAAM;AAG/D,YAAM,GAAG,MAAM,gBAAgB,EAAE,WAAW,MAAM;AAGlD,YAAM,cAAsC,CAAC;AAC7C,YAAM,gBAA0B,CAAC;AAC3B,YAAA,mCAAmB,IAAY;AAErC,UAAI,mBAAmB,SAAS;AAC9B,mBAAW,CAAC,WAAW,UAAU,KAAK,mBAAmB,SAAS;AAE1D,gBAAA,YAAY,KAAK,QAAQ,UAAU;AAGrC,cAAA;AACJ,cAAI,cAAc,KAAK;AACrB,+BAAmB,QAAQ,SAAS;AAAA,UAAA,OAC/B;AAEC,kBAAA,WAAW,UAAU,WAAW,IAAI,IACtC,UAAU,MAAM,CAAC,IACjB;AACe,+BAAA,GAAG,QAAQ,GAAG,SAAS;AAAA,UAAA;AAG5C,gBAAM,mBAAmB,KAAK,KAAK,gBAAgB,gBAAgB;AAG7D,gBAAA,cAAc,KAAK,QAAQ,gBAAgB;AACjD,cAAI,gBAAgB,gBAAgB;AAClC,kBAAM,GAAG,MAAM,aAAa,EAAE,WAAW,MAAM;AAE/C,gBAAI,aAAa,KAAK,SAAS,gBAAgB,WAAW;AACnD,mBAAA,cAAc,eAAe,KAAK;AACvC,2BAAa,IAAI,UAAU;AACd,2BAAA,KAAK,QAAQ,UAAU;AACpC,kBAAI,eAAe,IAAK;AAAA,YAAA;AAAA,UAC1B;AAIF,gBAAM,aACJ,cAAc,MACV,mBAAmB,OACnB,GAAG,mBAAmB,IAAI,IAAI,UAAU,MAAM,CAAC,CAAC;AAEhD,gBAAA,kBAAkB,kBAAkB,UAAU;AAAA;AAG9C,gBAAA,GAAG,UAAU,kBAAkB,eAAe;AAGpD,wBAAc,KAAK,gBAAgB;AAGvB,sBAAA,SAAS,IAAI,KAAK,gBAAgB;AAAA,QAAA;AAAA,MAChD;AAIF,YAAM,kBAAkB;AAAA,QACtB,MAAM;AAAA,QACN,SAAS,mBAAmB,WAAW;AAAA,QACvC,MAAM;AAAA,QACN,aAAa,oBAAoB,mBAAmB,IAAI;AAAA,QACxD,SAAS;AAAA;AAAA,QAET,iBAAiB;AAAA,UACf,CAAC,mBAAmB,IAAI,GAAG;AAAA,QAAA;AAAA,MAE/B;AAGA,YAAM,GAAG;AAAA,QACP,KAAK,KAAK,gBAAgB,cAAc;AAAA,QACxC,KAAK,UAAU,iBAAiB,MAAM,CAAC;AAAA,MACzC;AAEQ,cAAA;AAAA,QACN,4BAA4B,mBAAmB,IAAI,OAAO,cAAc;AAAA,MAC1E;AAAA,aACO,OAAO;AACd,cAAQ,MAAM,mCAAmC,WAAW,KAAK,KAAK;AAAA,IAAA;AAAA,EACxE;AAEJ;;"}
1
+ {"version":3,"file":"createLinkPackages.js","sources":["../../../../../../src/monorepo/createLinkPackages/createLinkPackages.ts"],"sourcesContent":["import { parsePackageJson } from \"../../packageJson.js\";\nimport { parseMonorepo } from \"../parseMonorepo/parseMonorepo.js\";\nimport path from \"node:path\";\nimport fs from \"node:fs/promises\";\n\ntype CreateLinkPackagesArgs = {\n sourceDir: string;\n};\n\n/**\n * Creates link packages for all SmartBundle-bundled projects in a monorepo\n * A link package is a reference package that points to the bundled output\n */\nexport async function createLinkPackages({\n sourceDir,\n}: CreateLinkPackagesArgs) {\n // Find all SmartBundle-bundled projects in the monorepo\n const { monorepo, projectPaths } = await parseMonorepo({ sourceDir });\n\n if (projectPaths.length === 0) {\n console.log(\"No SmartBundle-bundled projects found in the monorepo\");\n return;\n }\n\n // Create link packages for each SmartBundle-bundled project\n for (const projectPath of projectPaths) {\n const projectDir = path.join(sourceDir, projectPath);\n const projectPackageJsonPath = path.join(projectDir, \"package.json\");\n\n try {\n const projectPackageJson = await parsePackageJson({\n sourceDir: projectDir,\n packagePath: projectPackageJsonPath,\n });\n\n if (Array.isArray(projectPackageJson)) {\n console.error(\n `Failed to parse package.json for ${projectPath}:`,\n projectPackageJson,\n );\n continue;\n }\n\n // Create the link package directory inside the source package\n const linkPackageName = projectPackageJson.name.replace(\n /-sbsources$/,\n \"\",\n );\n const linkPackageDir = path.join(sourceDir, projectPath, \"sb-dist\");\n\n // Ensure the directory exists\n await fs.mkdir(linkPackageDir, { recursive: true });\n\n // Create re-export files for each export entry\n const linkExports: Record<string, string> = {};\n const reexportFiles: string[] = [];\n const reexportDirs = new Set<string>();\n\n if (projectPackageJson.exports) {\n for (const [exportKey, exportPath] of projectPackageJson.exports) {\n // Get the file extension from the source file\n const sourceExt = path.extname(exportPath);\n\n // Create the re-export file path based on the export key\n let reexportFileName: string;\n if (exportKey === \".\") {\n reexportFileName = `index${sourceExt}`;\n } else {\n // Remove \"./\" prefix and add the source extension\n const cleanKey = exportKey.startsWith(\"./\")\n ? exportKey.slice(2)\n : exportKey;\n reexportFileName = `${cleanKey}${sourceExt}`;\n }\n\n const reexportFilePath = path.join(linkPackageDir, reexportFileName);\n\n // Create directory for the re-export file if needed\n const reexportDir = path.dirname(reexportFilePath);\n if (reexportDir !== linkPackageDir) {\n await fs.mkdir(reexportDir, { recursive: true });\n // Track all parent directories\n let currentDir = path.relative(linkPackageDir, reexportDir);\n while (currentDir && currentDir !== \".\") {\n reexportDirs.add(currentDir);\n currentDir = path.dirname(currentDir);\n if (currentDir === \".\") break;\n }\n }\n\n // Create the re-export content\n const importPath =\n exportKey === \".\"\n ? projectPackageJson.name\n : `${projectPackageJson.name}/${exportKey.slice(2)}`;\n\n const reexportContent = `export * from \"${importPath}\";\\n`;\n\n // Write the re-export file\n await fs.writeFile(reexportFilePath, reexportContent);\n\n // Track the file for gitignore\n reexportFiles.push(reexportFileName);\n\n // Add to link package exports\n linkExports[exportKey] = `./${reexportFileName}`;\n }\n }\n\n // Create a package.json for the link package\n const linkPackageJson = {\n name: linkPackageName,\n private: true,\n version: projectPackageJson.version ?? \"0.0.0\",\n type: \"module\" as const,\n description: `Link package for ${projectPackageJson.name}`,\n exports: linkExports,\n // Add a devDependency on the source package to create a wire between source and dist\n devDependencies: {\n [projectPackageJson.name]: \"workspace:*\",\n },\n };\n\n // Write the package.json for the link package\n await fs.writeFile(\n path.join(linkPackageDir, \"package.json\"),\n JSON.stringify(linkPackageJson, null, 2),\n );\n\n console.log(\n `Created link package for ${projectPackageJson.name} at ${linkPackageDir}`,\n );\n } catch (error) {\n console.error(`Error creating link package for ${projectPath}:`, error);\n }\n }\n}\n"],"names":["parseMonorepo","parsePackageJson"],"mappings":";;;;;;AAaA,eAAsB,mBAAmB;AAAA,EACvC;AACF,GAA2B;AAEnB,QAAA,EAAE,UAAU,aAAa,IAAI,MAAMA,cAAc,cAAA,EAAE,WAAW;AAEhE,MAAA,aAAa,WAAW,GAAG;AAC7B,YAAQ,IAAI,uDAAuD;AACnE;AAAA,EAAA;AAIF,aAAW,eAAe,cAAc;AACtC,UAAM,aAAa,KAAK,KAAK,WAAW,WAAW;AACnD,UAAM,yBAAyB,KAAK,KAAK,YAAY,cAAc;AAE/D,QAAA;AACI,YAAA,qBAAqB,MAAMC,6BAAiB;AAAA,QAChD,WAAW;AAAA,QACX,aAAa;AAAA,MAAA,CACd;AAEG,UAAA,MAAM,QAAQ,kBAAkB,GAAG;AAC7B,gBAAA;AAAA,UACN,oCAAoC,WAAW;AAAA,UAC/C;AAAA,QACF;AACA;AAAA,MAAA;AAII,YAAA,kBAAkB,mBAAmB,KAAK;AAAA,QAC9C;AAAA,QACA;AAAA,MACF;AACA,YAAM,iBAAiB,KAAK,KAAK,WAAW,aAAa,SAAS;AAGlE,YAAM,GAAG,MAAM,gBAAgB,EAAE,WAAW,MAAM;AAGlD,YAAM,cAAsC,CAAC;AAC7C,YAAM,gBAA0B,CAAC;AAC3B,YAAA,mCAAmB,IAAY;AAErC,UAAI,mBAAmB,SAAS;AAC9B,mBAAW,CAAC,WAAW,UAAU,KAAK,mBAAmB,SAAS;AAE1D,gBAAA,YAAY,KAAK,QAAQ,UAAU;AAGrC,cAAA;AACJ,cAAI,cAAc,KAAK;AACrB,+BAAmB,QAAQ,SAAS;AAAA,UAAA,OAC/B;AAEC,kBAAA,WAAW,UAAU,WAAW,IAAI,IACtC,UAAU,MAAM,CAAC,IACjB;AACe,+BAAA,GAAG,QAAQ,GAAG,SAAS;AAAA,UAAA;AAG5C,gBAAM,mBAAmB,KAAK,KAAK,gBAAgB,gBAAgB;AAG7D,gBAAA,cAAc,KAAK,QAAQ,gBAAgB;AACjD,cAAI,gBAAgB,gBAAgB;AAClC,kBAAM,GAAG,MAAM,aAAa,EAAE,WAAW,MAAM;AAE/C,gBAAI,aAAa,KAAK,SAAS,gBAAgB,WAAW;AACnD,mBAAA,cAAc,eAAe,KAAK;AACvC,2BAAa,IAAI,UAAU;AACd,2BAAA,KAAK,QAAQ,UAAU;AACpC,kBAAI,eAAe,IAAK;AAAA,YAAA;AAAA,UAC1B;AAIF,gBAAM,aACJ,cAAc,MACV,mBAAmB,OACnB,GAAG,mBAAmB,IAAI,IAAI,UAAU,MAAM,CAAC,CAAC;AAEhD,gBAAA,kBAAkB,kBAAkB,UAAU;AAAA;AAG9C,gBAAA,GAAG,UAAU,kBAAkB,eAAe;AAGpD,wBAAc,KAAK,gBAAgB;AAGvB,sBAAA,SAAS,IAAI,KAAK,gBAAgB;AAAA,QAAA;AAAA,MAChD;AAIF,YAAM,kBAAkB;AAAA,QACtB,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS,mBAAmB,WAAW;AAAA,QACvC,MAAM;AAAA,QACN,aAAa,oBAAoB,mBAAmB,IAAI;AAAA,QACxD,SAAS;AAAA;AAAA,QAET,iBAAiB;AAAA,UACf,CAAC,mBAAmB,IAAI,GAAG;AAAA,QAAA;AAAA,MAE/B;AAGA,YAAM,GAAG;AAAA,QACP,KAAK,KAAK,gBAAgB,cAAc;AAAA,QACxC,KAAK,UAAU,iBAAiB,MAAM,CAAC;AAAA,MACzC;AAEQ,cAAA;AAAA,QACN,4BAA4B,mBAAmB,IAAI,OAAO,cAAc;AAAA,MAC1E;AAAA,aACO,OAAO;AACd,cAAQ,MAAM,mCAAmC,WAAW,KAAK,KAAK;AAAA,IAAA;AAAA,EACxE;AAEJ;;"}
@@ -14,7 +14,7 @@ function resolveDirs(args) {
14
14
  sourceDir,
15
15
  args.packagePath ?? "./package.json"
16
16
  );
17
- const outDir = myResolve(process.cwd(), args.outputDir ?? "./dist");
17
+ const outDir = myResolve(process.cwd(), args.outputDir ?? "./sb-dist");
18
18
  const esmOutDir = myResolve(outDir, "__compiled__/esm");
19
19
  const cjsOutDir = myResolve(outDir, "__compiled__/cjs");
20
20
  const outBinsDir = myResolve(outDir, "__bin__");
@@ -1 +1 @@
1
- {"version":3,"file":"resolveDirs.js","sources":["../../../../src/resolveDirs.ts"],"sourcesContent":["import { isAbsolute, join } from \"node:path\";\nimport { type Args } from \"./args.js\";\n\nfunction myResolve(path1: string, path2: string) {\n if (isAbsolute(path2)) {\n return path2;\n }\n\n return join(path1, path2);\n}\n\nexport function resolveDirs(args: Args) {\n const sourceDir = myResolve(process.cwd(), args.sourceDir ?? \".\");\n const packagePath = myResolve(\n sourceDir,\n args.packagePath ?? \"./package.json\",\n );\n const outDir = myResolve(process.cwd(), args.outputDir ?? \"./dist\");\n const esmOutDir = myResolve(outDir, \"__compiled__/esm\");\n const cjsOutDir = myResolve(outDir, \"__compiled__/cjs\");\n const outBinsDir = myResolve(outDir, \"__bin__\");\n\n return { sourceDir, packagePath, outDir, outBinsDir, cjsOutDir, esmOutDir };\n}\n\nexport type Dirs = ReturnType<typeof resolveDirs>;\n"],"names":["isAbsolute","join"],"mappings":";;;;AAGA,SAAS,UAAU,OAAe,OAAe;AAC3C,MAAAA,KAAAA,WAAW,KAAK,GAAG;AACd,WAAA;AAAA,EAAA;AAGF,SAAAC,KAAA,KAAK,OAAO,KAAK;AAC1B;AAEO,SAAS,YAAY,MAAY;AACtC,QAAM,YAAY,UAAU,QAAQ,OAAO,KAAK,aAAa,GAAG;AAChE,QAAM,cAAc;AAAA,IAClB;AAAA,IACA,KAAK,eAAe;AAAA,EACtB;AACA,QAAM,SAAS,UAAU,QAAQ,OAAO,KAAK,aAAa,QAAQ;AAC5D,QAAA,YAAY,UAAU,QAAQ,kBAAkB;AAChD,QAAA,YAAY,UAAU,QAAQ,kBAAkB;AAChD,QAAA,aAAa,UAAU,QAAQ,SAAS;AAE9C,SAAO,EAAE,WAAW,aAAa,QAAQ,YAAY,WAAW,UAAU;AAC5E;;"}
1
+ {"version":3,"file":"resolveDirs.js","sources":["../../../../src/resolveDirs.ts"],"sourcesContent":["import { isAbsolute, join } from \"node:path\";\nimport { type Args } from \"./args.js\";\n\nfunction myResolve(path1: string, path2: string) {\n if (isAbsolute(path2)) {\n return path2;\n }\n\n return join(path1, path2);\n}\n\nexport function resolveDirs(args: Args) {\n const sourceDir = myResolve(process.cwd(), args.sourceDir ?? \".\");\n const packagePath = myResolve(\n sourceDir,\n args.packagePath ?? \"./package.json\",\n );\n const outDir = myResolve(process.cwd(), args.outputDir ?? \"./sb-dist\");\n const esmOutDir = myResolve(outDir, \"__compiled__/esm\");\n const cjsOutDir = myResolve(outDir, \"__compiled__/cjs\");\n const outBinsDir = myResolve(outDir, \"__bin__\");\n\n return { sourceDir, packagePath, outDir, outBinsDir, cjsOutDir, esmOutDir };\n}\n\nexport type Dirs = ReturnType<typeof resolveDirs>;\n"],"names":["isAbsolute","join"],"mappings":";;;;AAGA,SAAS,UAAU,OAAe,OAAe;AAC3C,MAAAA,KAAAA,WAAW,KAAK,GAAG;AACd,WAAA;AAAA,EAAA;AAGF,SAAAC,KAAA,KAAK,OAAO,KAAK;AAC1B;AAEO,SAAS,YAAY,MAAY;AACtC,QAAM,YAAY,UAAU,QAAQ,OAAO,KAAK,aAAa,GAAG;AAChE,QAAM,cAAc;AAAA,IAClB;AAAA,IACA,KAAK,eAAe;AAAA,EACtB;AACA,QAAM,SAAS,UAAU,QAAQ,OAAO,KAAK,aAAa,WAAW;AAC/D,QAAA,YAAY,UAAU,QAAQ,kBAAkB;AAChD,QAAA,YAAY,UAAU,QAAQ,kBAAkB;AAChD,QAAA,aAAa,UAAU,QAAQ,SAAS;AAE9C,SAAO,EAAE,WAAW,aAAa,QAAQ,YAAY,WAAW,UAAU;AAC5E;;"}
@@ -12,7 +12,7 @@ const argsSchema = yargs().option("sourceDir", {
12
12
  }).option("outputDir", {
13
13
  alias: "o",
14
14
  type: "string",
15
- describe: "path to the output directory. Default: cwd()/dist"
15
+ describe: "path to the output directory. Default: cwd()/sb-dist"
16
16
  }).option("seq", {
17
17
  type: "boolean",
18
18
  describe: "run internal tasks sequentially. It is useful for performance testing and debugging. This option is unstable and not recommended for production use."
@@ -1 +1 @@
1
- {"version":3,"file":"args.mjs","sources":["../../../../src/args.ts"],"sourcesContent":["import yargs from \"yargs\";\nimport * as process from \"node:process\";\nimport { hideBin } from \"yargs/helpers\";\n\nconst argsSchema = yargs()\n .option(\"sourceDir\", {\n alias: \"s\",\n type: \"string\",\n describe:\n \"path to the project directory. Default: current working directory\",\n })\n .option(\"packagePath\", {\n alias: \"p\",\n type: \"string\",\n describe: \"path to the package.json. Default: cwd()/package.json\",\n })\n .option(\"outputDir\", {\n alias: \"o\",\n type: \"string\",\n describe: \"path to the output directory. Default: cwd()/dist\",\n })\n // Do not cover this option in tests because it is unstable\n .option(\"seq\", {\n type: \"boolean\",\n describe:\n \"run internal tasks sequentially. It is useful for performance testing and debugging. This option is unstable and not recommended for production use.\",\n })\n .option(\"ci\", {\n type: \"boolean\",\n describe: \"run in CI mode\",\n })\n .help(\"help\");\n\nexport const args = argsSchema.parseSync(hideBin(process.argv));\n\ntype OmitUnknown<T> = {\n [K in keyof T as string extends K ? never : K]: T[K];\n};\ntype ConvertUndefinedToOptional<T> = {\n [K in keyof T as undefined extends T[K] ? K : never]?: Exclude<\n T[K],\n undefined\n >;\n} & {\n [K in keyof T as undefined extends T[K] ? never : K]: T[K];\n};\n\nexport type Monorepo = {\n type: \"pnpm\";\n devDeps: Record<string, string>;\n};\n\nexport type Args = ConvertUndefinedToOptional<\n Omit<OmitUnknown<typeof args>, \"_\" | \"$0\">\n> & {\n monorepo?: Monorepo;\n skipGitignore?: boolean;\n};\n"],"names":[],"mappings":";;;AAIA,MAAM,aAAa,MAAA,EAChB,OAAO,aAAa;AAAA,EACnB,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UACE;AACJ,CAAC,EACA,OAAO,eAAe;AAAA,EACrB,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU;AACZ,CAAC,EACA,OAAO,aAAa;AAAA,EACnB,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU;AACZ,CAAC,EAEA,OAAO,OAAO;AAAA,EACb,MAAM;AAAA,EACN,UACE;AACJ,CAAC,EACA,OAAO,MAAM;AAAA,EACZ,MAAM;AAAA,EACN,UAAU;AACZ,CAAC,EACA,KAAK,MAAM;AAEP,MAAM,OAAO,WAAW,UAAU,QAAQ,QAAQ,IAAI,CAAC;"}
1
+ {"version":3,"file":"args.mjs","sources":["../../../../src/args.ts"],"sourcesContent":["import yargs from \"yargs\";\nimport * as process from \"node:process\";\nimport { hideBin } from \"yargs/helpers\";\n\nconst argsSchema = yargs()\n .option(\"sourceDir\", {\n alias: \"s\",\n type: \"string\",\n describe:\n \"path to the project directory. Default: current working directory\",\n })\n .option(\"packagePath\", {\n alias: \"p\",\n type: \"string\",\n describe: \"path to the package.json. Default: cwd()/package.json\",\n })\n .option(\"outputDir\", {\n alias: \"o\",\n type: \"string\",\n describe: \"path to the output directory. Default: cwd()/sb-dist\",\n })\n // Do not cover this option in tests because it is unstable\n .option(\"seq\", {\n type: \"boolean\",\n describe:\n \"run internal tasks sequentially. It is useful for performance testing and debugging. This option is unstable and not recommended for production use.\",\n })\n .option(\"ci\", {\n type: \"boolean\",\n describe: \"run in CI mode\",\n })\n .help(\"help\");\n\nexport const args = argsSchema.parseSync(hideBin(process.argv));\n\ntype OmitUnknown<T> = {\n [K in keyof T as string extends K ? never : K]: T[K];\n};\ntype ConvertUndefinedToOptional<T> = {\n [K in keyof T as undefined extends T[K] ? K : never]?: Exclude<\n T[K],\n undefined\n >;\n} & {\n [K in keyof T as undefined extends T[K] ? never : K]: T[K];\n};\n\nexport type Monorepo = {\n type: \"pnpm\";\n devDeps: Record<string, string>;\n};\n\nexport type Args = ConvertUndefinedToOptional<\n Omit<OmitUnknown<typeof args>, \"_\" | \"$0\">\n> & {\n monorepo?: Monorepo;\n skipGitignore?: boolean;\n};\n"],"names":[],"mappings":";;;AAIA,MAAM,aAAa,MAAA,EAChB,OAAO,aAAa;AAAA,EACnB,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UACE;AACJ,CAAC,EACA,OAAO,eAAe;AAAA,EACrB,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU;AACZ,CAAC,EACA,OAAO,aAAa;AAAA,EACnB,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU;AACZ,CAAC,EAEA,OAAO,OAAO;AAAA,EACb,MAAM;AAAA,EACN,UACE;AACJ,CAAC,EACA,OAAO,MAAM;AAAA,EACZ,MAAM;AAAA,EACN,UAAU;AACZ,CAAC,EACA,KAAK,MAAM;AAEP,MAAM,OAAO,WAAW,UAAU,QAAQ,QAAQ,IAAI,CAAC;"}
@@ -31,7 +31,7 @@ async function buildMonorepo(args) {
31
31
  ...args,
32
32
  sourceDir: packageSourceDir,
33
33
  packagePath: join(packageSourceDir, "package.json"),
34
- outputDir: join(packageSourceDir, "dist"),
34
+ outputDir: join(packageSourceDir, "sb-dist"),
35
35
  monorepo
36
36
  };
37
37
  const buildResult = await run(packageArgs);
@@ -1 +1 @@
1
- {"version":3,"file":"buildAll.mjs","sources":["../../../../../src/monorepo/buildAll.ts"],"sourcesContent":["import { join } from \"node:path\";\nimport { parseMonorepo } from \"./parseMonorepo/parseMonorepo.js\";\nimport { run } from \"../index.js\";\nimport { type Args } from \"../args.js\";\nimport { log, lineLog } from \"../log.js\";\nimport { PrettyError } from \"../PrettyErrors.js\";\n\nexport type MonorepoBuildResult = {\n totalPackages: number;\n successfulBuilds: number;\n failedBuilds: number;\n errors: Array<{ packagePath: string; errors: Array<string | PrettyError> }>;\n};\n\nexport async function buildMonorepo(args: Args): Promise<MonorepoBuildResult> {\n const sourceDir = args.sourceDir || process.cwd();\n\n // Use existing monorepo detection\n const { monorepo, projectPaths } = await parseMonorepo({ sourceDir });\n\n if (!monorepo) {\n throw new PrettyError(\"Not a monorepo - pnpm-workspace.yaml not found\");\n }\n\n if (projectPaths.length === 0) {\n throw new PrettyError(\n \"No packages with -sbsources suffix found in monorepo\",\n );\n }\n\n log(`Found ${projectPaths.length} packages to build in monorepo`);\n lineLog();\n\n const result: MonorepoBuildResult = {\n totalPackages: projectPaths.length,\n successfulBuilds: 0,\n failedBuilds: 0,\n errors: [],\n };\n\n // Build each package sequentially for now\n // TODO: Add dependency analysis and parallel builds\n for (let i = 0; i < projectPaths.length; i++) {\n const packagePath = projectPaths[i];\n const packageSourceDir = join(sourceDir, packagePath);\n\n log(`[${i + 1}/${projectPaths.length}] Building ${packagePath}...`);\n\n // Create args for this specific package\n const packageArgs: Args = {\n ...args,\n sourceDir: packageSourceDir,\n packagePath: join(packageSourceDir, \"package.json\"),\n outputDir: join(packageSourceDir, \"dist\"),\n monorepo,\n };\n\n // Reuse existing run logic\n const buildResult = await run(packageArgs);\n\n if (buildResult.error) {\n result.failedBuilds++;\n result.errors.push({\n packagePath,\n errors: buildResult.errors,\n });\n log(\n `[${i + 1}/${projectPaths.length}] ❌ Failed to build ${packagePath}`,\n );\n } else {\n result.successfulBuilds++;\n log(`[${i + 1}/${projectPaths.length}] ✅ Built ${packagePath}`);\n }\n\n lineLog();\n }\n\n // Summary\n log(`Monorepo build completed:`);\n log(` Total packages: ${result.totalPackages}`);\n log(` Successful: ${result.successfulBuilds}`);\n log(` Failed: ${result.failedBuilds}`);\n\n return result;\n}\n"],"names":[],"mappings":";;;;;;AAcA,eAAsB,cAAc,MAA0C;AAC5E,QAAM,YAAY,KAAK,aAAa,QAAQ,IAAI;AAG1C,QAAA,EAAE,UAAU,aAAa,IAAI,MAAM,cAAc,EAAE,WAAW;AAEpE,MAAI,CAAC,UAAU;AACP,UAAA,IAAI,YAAY,gDAAgD;AAAA,EAAA;AAGpE,MAAA,aAAa,WAAW,GAAG;AAC7B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EAAA;AAGE,MAAA,SAAS,aAAa,MAAM,gCAAgC;AACxD,UAAA;AAER,QAAM,SAA8B;AAAA,IAClC,eAAe,aAAa;AAAA,IAC5B,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,QAAQ,CAAA;AAAA,EACV;AAIA,WAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AACtC,UAAA,cAAc,aAAa,CAAC;AAC5B,UAAA,mBAAmB,KAAK,WAAW,WAAW;AAEhD,QAAA,IAAI,IAAI,CAAC,IAAI,aAAa,MAAM,cAAc,WAAW,KAAK;AAGlE,UAAM,cAAoB;AAAA,MACxB,GAAG;AAAA,MACH,WAAW;AAAA,MACX,aAAa,KAAK,kBAAkB,cAAc;AAAA,MAClD,WAAW,KAAK,kBAAkB,MAAM;AAAA,MACxC;AAAA,IACF;AAGM,UAAA,cAAc,MAAM,IAAI,WAAW;AAEzC,QAAI,YAAY,OAAO;AACd,aAAA;AACP,aAAO,OAAO,KAAK;AAAA,QACjB;AAAA,QACA,QAAQ,YAAY;AAAA,MAAA,CACrB;AACD;AAAA,QACE,IAAI,IAAI,CAAC,IAAI,aAAa,MAAM,uBAAuB,WAAW;AAAA,MACpE;AAAA,IAAA,OACK;AACE,aAAA;AACH,UAAA,IAAI,IAAI,CAAC,IAAI,aAAa,MAAM,aAAa,WAAW,EAAE;AAAA,IAAA;AAGxD,YAAA;AAAA,EAAA;AAIV,MAAI,2BAA2B;AAC3B,MAAA,qBAAqB,OAAO,aAAa,EAAE;AAC3C,MAAA,iBAAiB,OAAO,gBAAgB,EAAE;AAC1C,MAAA,aAAa,OAAO,YAAY,EAAE;AAE/B,SAAA;AACT;"}
1
+ {"version":3,"file":"buildAll.mjs","sources":["../../../../../src/monorepo/buildAll.ts"],"sourcesContent":["import { join } from \"node:path\";\nimport { parseMonorepo } from \"./parseMonorepo/parseMonorepo.js\";\nimport { run } from \"../index.js\";\nimport { type Args } from \"../args.js\";\nimport { log, lineLog } from \"../log.js\";\nimport { PrettyError } from \"../PrettyErrors.js\";\n\nexport type MonorepoBuildResult = {\n totalPackages: number;\n successfulBuilds: number;\n failedBuilds: number;\n errors: Array<{ packagePath: string; errors: Array<string | PrettyError> }>;\n};\n\nexport async function buildMonorepo(args: Args): Promise<MonorepoBuildResult> {\n const sourceDir = args.sourceDir || process.cwd();\n\n // Use existing monorepo detection\n const { monorepo, projectPaths } = await parseMonorepo({ sourceDir });\n\n if (!monorepo) {\n throw new PrettyError(\"Not a monorepo - pnpm-workspace.yaml not found\");\n }\n\n if (projectPaths.length === 0) {\n throw new PrettyError(\n \"No packages with -sbsources suffix found in monorepo\",\n );\n }\n\n log(`Found ${projectPaths.length} packages to build in monorepo`);\n lineLog();\n\n const result: MonorepoBuildResult = {\n totalPackages: projectPaths.length,\n successfulBuilds: 0,\n failedBuilds: 0,\n errors: [],\n };\n\n // Build each package sequentially for now\n // TODO: Add dependency analysis and parallel builds\n for (let i = 0; i < projectPaths.length; i++) {\n const packagePath = projectPaths[i];\n const packageSourceDir = join(sourceDir, packagePath);\n\n log(`[${i + 1}/${projectPaths.length}] Building ${packagePath}...`);\n\n // Create args for this specific package\n const packageArgs: Args = {\n ...args,\n sourceDir: packageSourceDir,\n packagePath: join(packageSourceDir, \"package.json\"),\n outputDir: join(packageSourceDir, \"sb-dist\"),\n monorepo,\n };\n\n // Reuse existing run logic\n const buildResult = await run(packageArgs);\n\n if (buildResult.error) {\n result.failedBuilds++;\n result.errors.push({\n packagePath,\n errors: buildResult.errors,\n });\n log(\n `[${i + 1}/${projectPaths.length}] ❌ Failed to build ${packagePath}`,\n );\n } else {\n result.successfulBuilds++;\n log(`[${i + 1}/${projectPaths.length}] ✅ Built ${packagePath}`);\n }\n\n lineLog();\n }\n\n // Summary\n log(`Monorepo build completed:`);\n log(` Total packages: ${result.totalPackages}`);\n log(` Successful: ${result.successfulBuilds}`);\n log(` Failed: ${result.failedBuilds}`);\n\n return result;\n}\n"],"names":[],"mappings":";;;;;;AAcA,eAAsB,cAAc,MAA0C;AAC5E,QAAM,YAAY,KAAK,aAAa,QAAQ,IAAI;AAG1C,QAAA,EAAE,UAAU,aAAa,IAAI,MAAM,cAAc,EAAE,WAAW;AAEpE,MAAI,CAAC,UAAU;AACP,UAAA,IAAI,YAAY,gDAAgD;AAAA,EAAA;AAGpE,MAAA,aAAa,WAAW,GAAG;AAC7B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EAAA;AAGE,MAAA,SAAS,aAAa,MAAM,gCAAgC;AACxD,UAAA;AAER,QAAM,SAA8B;AAAA,IAClC,eAAe,aAAa;AAAA,IAC5B,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,QAAQ,CAAA;AAAA,EACV;AAIA,WAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AACtC,UAAA,cAAc,aAAa,CAAC;AAC5B,UAAA,mBAAmB,KAAK,WAAW,WAAW;AAEhD,QAAA,IAAI,IAAI,CAAC,IAAI,aAAa,MAAM,cAAc,WAAW,KAAK;AAGlE,UAAM,cAAoB;AAAA,MACxB,GAAG;AAAA,MACH,WAAW;AAAA,MACX,aAAa,KAAK,kBAAkB,cAAc;AAAA,MAClD,WAAW,KAAK,kBAAkB,SAAS;AAAA,MAC3C;AAAA,IACF;AAGM,UAAA,cAAc,MAAM,IAAI,WAAW;AAEzC,QAAI,YAAY,OAAO;AACd,aAAA;AACP,aAAO,OAAO,KAAK;AAAA,QACjB;AAAA,QACA,QAAQ,YAAY;AAAA,MAAA,CACrB;AACD;AAAA,QACE,IAAI,IAAI,CAAC,IAAI,aAAa,MAAM,uBAAuB,WAAW;AAAA,MACpE;AAAA,IAAA,OACK;AACE,aAAA;AACH,UAAA,IAAI,IAAI,CAAC,IAAI,aAAa,MAAM,aAAa,WAAW,EAAE;AAAA,IAAA;AAGxD,YAAA;AAAA,EAAA;AAIV,MAAI,2BAA2B;AAC3B,MAAA,qBAAqB,OAAO,aAAa,EAAE;AAC3C,MAAA,iBAAiB,OAAO,gBAAgB,EAAE;AAC1C,MAAA,aAAa,OAAO,YAAY,EAAE;AAE/B,SAAA;AACT;"}
@@ -5,7 +5,7 @@ import fs__default from "node:fs/promises";
5
5
  async function createLinkPackages({
6
6
  sourceDir
7
7
  }) {
8
- const { isMonorepo, projectPaths } = await parseMonorepo({ sourceDir });
8
+ const { monorepo, projectPaths } = await parseMonorepo({ sourceDir });
9
9
  if (projectPaths.length === 0) {
10
10
  console.log("No SmartBundle-bundled projects found in the monorepo");
11
11
  return;
@@ -29,7 +29,7 @@ async function createLinkPackages({
29
29
  /-sbsources$/,
30
30
  ""
31
31
  );
32
- const linkPackageDir = path__default.join(sourceDir, projectPath, "dist");
32
+ const linkPackageDir = path__default.join(sourceDir, projectPath, "sb-dist");
33
33
  await fs__default.mkdir(linkPackageDir, { recursive: true });
34
34
  const linkExports = {};
35
35
  const reexportFiles = [];
@@ -65,6 +65,7 @@ async function createLinkPackages({
65
65
  }
66
66
  const linkPackageJson = {
67
67
  name: linkPackageName,
68
+ private: true,
68
69
  version: projectPackageJson.version ?? "0.0.0",
69
70
  type: "module",
70
71
  description: `Link package for ${projectPackageJson.name}`,
@@ -1 +1 @@
1
- {"version":3,"file":"createLinkPackages.mjs","sources":["../../../../../../src/monorepo/createLinkPackages/createLinkPackages.ts"],"sourcesContent":["import { parsePackageJson } from \"../../packageJson.js\";\nimport { parseMonorepo } from \"../parseMonorepo/parseMonorepo.js\";\nimport path from \"node:path\";\nimport fs from \"node:fs/promises\";\n\ntype CreateLinkPackagesArgs = {\n sourceDir: string;\n};\n\n/**\n * Creates link packages for all SmartBundle-bundled projects in a monorepo\n * A link package is a reference package that points to the bundled output\n */\nexport async function createLinkPackages({\n sourceDir,\n}: CreateLinkPackagesArgs) {\n // Find all SmartBundle-bundled projects in the monorepo\n const { isMonorepo, projectPaths } = await parseMonorepo({ sourceDir });\n\n if (projectPaths.length === 0) {\n console.log(\"No SmartBundle-bundled projects found in the monorepo\");\n return;\n }\n\n // Create link packages for each SmartBundle-bundled project\n for (const projectPath of projectPaths) {\n const projectDir = path.join(sourceDir, projectPath);\n const projectPackageJsonPath = path.join(projectDir, \"package.json\");\n\n try {\n const projectPackageJson = await parsePackageJson({\n sourceDir: projectDir,\n packagePath: projectPackageJsonPath,\n });\n\n if (Array.isArray(projectPackageJson)) {\n console.error(\n `Failed to parse package.json for ${projectPath}:`,\n projectPackageJson,\n );\n continue;\n }\n\n // Create the link package directory inside the source package\n const linkPackageName = projectPackageJson.name.replace(\n /-sbsources$/,\n \"\",\n );\n const linkPackageDir = path.join(sourceDir, projectPath, \"dist\");\n\n // Ensure the directory exists\n await fs.mkdir(linkPackageDir, { recursive: true });\n\n // Create re-export files for each export entry\n const linkExports: Record<string, string> = {};\n const reexportFiles: string[] = [];\n const reexportDirs = new Set<string>();\n\n if (projectPackageJson.exports) {\n for (const [exportKey, exportPath] of projectPackageJson.exports) {\n // Get the file extension from the source file\n const sourceExt = path.extname(exportPath);\n\n // Create the re-export file path based on the export key\n let reexportFileName: string;\n if (exportKey === \".\") {\n reexportFileName = `index${sourceExt}`;\n } else {\n // Remove \"./\" prefix and add the source extension\n const cleanKey = exportKey.startsWith(\"./\")\n ? exportKey.slice(2)\n : exportKey;\n reexportFileName = `${cleanKey}${sourceExt}`;\n }\n\n const reexportFilePath = path.join(linkPackageDir, reexportFileName);\n\n // Create directory for the re-export file if needed\n const reexportDir = path.dirname(reexportFilePath);\n if (reexportDir !== linkPackageDir) {\n await fs.mkdir(reexportDir, { recursive: true });\n // Track all parent directories\n let currentDir = path.relative(linkPackageDir, reexportDir);\n while (currentDir && currentDir !== \".\") {\n reexportDirs.add(currentDir);\n currentDir = path.dirname(currentDir);\n if (currentDir === \".\") break;\n }\n }\n\n // Create the re-export content\n const importPath =\n exportKey === \".\"\n ? projectPackageJson.name\n : `${projectPackageJson.name}/${exportKey.slice(2)}`;\n\n const reexportContent = `export * from \"${importPath}\";\\n`;\n\n // Write the re-export file\n await fs.writeFile(reexportFilePath, reexportContent);\n\n // Track the file for gitignore\n reexportFiles.push(reexportFileName);\n\n // Add to link package exports\n linkExports[exportKey] = `./${reexportFileName}`;\n }\n }\n\n // Create a package.json for the link package\n const linkPackageJson = {\n name: linkPackageName,\n version: projectPackageJson.version ?? \"0.0.0\",\n type: \"module\" as const,\n description: `Link package for ${projectPackageJson.name}`,\n exports: linkExports,\n // Add a devDependency on the source package to create a wire between source and dist\n devDependencies: {\n [projectPackageJson.name]: \"workspace:*\",\n },\n };\n\n // Write the package.json for the link package\n await fs.writeFile(\n path.join(linkPackageDir, \"package.json\"),\n JSON.stringify(linkPackageJson, null, 2),\n );\n\n console.log(\n `Created link package for ${projectPackageJson.name} at ${linkPackageDir}`,\n );\n } catch (error) {\n console.error(`Error creating link package for ${projectPath}:`, error);\n }\n }\n}\n"],"names":["path","fs"],"mappings":";;;;AAaA,eAAsB,mBAAmB;AAAA,EACvC;AACF,GAA2B;AAEnB,QAAA,EAAE,YAAY,aAAa,IAAI,MAAM,cAAc,EAAE,WAAW;AAElE,MAAA,aAAa,WAAW,GAAG;AAC7B,YAAQ,IAAI,uDAAuD;AACnE;AAAA,EAAA;AAIF,aAAW,eAAe,cAAc;AACtC,UAAM,aAAaA,cAAK,KAAK,WAAW,WAAW;AACnD,UAAM,yBAAyBA,cAAK,KAAK,YAAY,cAAc;AAE/D,QAAA;AACI,YAAA,qBAAqB,MAAM,iBAAiB;AAAA,QAChD,WAAW;AAAA,QACX,aAAa;AAAA,MAAA,CACd;AAEG,UAAA,MAAM,QAAQ,kBAAkB,GAAG;AAC7B,gBAAA;AAAA,UACN,oCAAoC,WAAW;AAAA,UAC/C;AAAA,QACF;AACA;AAAA,MAAA;AAII,YAAA,kBAAkB,mBAAmB,KAAK;AAAA,QAC9C;AAAA,QACA;AAAA,MACF;AACA,YAAM,iBAAiBA,cAAK,KAAK,WAAW,aAAa,MAAM;AAG/D,YAAMC,YAAG,MAAM,gBAAgB,EAAE,WAAW,MAAM;AAGlD,YAAM,cAAsC,CAAC;AAC7C,YAAM,gBAA0B,CAAC;AAC3B,YAAA,mCAAmB,IAAY;AAErC,UAAI,mBAAmB,SAAS;AAC9B,mBAAW,CAAC,WAAW,UAAU,KAAK,mBAAmB,SAAS;AAE1D,gBAAA,YAAYD,cAAK,QAAQ,UAAU;AAGrC,cAAA;AACJ,cAAI,cAAc,KAAK;AACrB,+BAAmB,QAAQ,SAAS;AAAA,UAAA,OAC/B;AAEC,kBAAA,WAAW,UAAU,WAAW,IAAI,IACtC,UAAU,MAAM,CAAC,IACjB;AACe,+BAAA,GAAG,QAAQ,GAAG,SAAS;AAAA,UAAA;AAG5C,gBAAM,mBAAmBA,cAAK,KAAK,gBAAgB,gBAAgB;AAG7D,gBAAA,cAAcA,cAAK,QAAQ,gBAAgB;AACjD,cAAI,gBAAgB,gBAAgB;AAClC,kBAAMC,YAAG,MAAM,aAAa,EAAE,WAAW,MAAM;AAE/C,gBAAI,aAAaD,cAAK,SAAS,gBAAgB,WAAW;AACnD,mBAAA,cAAc,eAAe,KAAK;AACvC,2BAAa,IAAI,UAAU;AACd,2BAAAA,cAAK,QAAQ,UAAU;AACpC,kBAAI,eAAe,IAAK;AAAA,YAAA;AAAA,UAC1B;AAIF,gBAAM,aACJ,cAAc,MACV,mBAAmB,OACnB,GAAG,mBAAmB,IAAI,IAAI,UAAU,MAAM,CAAC,CAAC;AAEhD,gBAAA,kBAAkB,kBAAkB,UAAU;AAAA;AAG9C,gBAAAC,YAAG,UAAU,kBAAkB,eAAe;AAGpD,wBAAc,KAAK,gBAAgB;AAGvB,sBAAA,SAAS,IAAI,KAAK,gBAAgB;AAAA,QAAA;AAAA,MAChD;AAIF,YAAM,kBAAkB;AAAA,QACtB,MAAM;AAAA,QACN,SAAS,mBAAmB,WAAW;AAAA,QACvC,MAAM;AAAA,QACN,aAAa,oBAAoB,mBAAmB,IAAI;AAAA,QACxD,SAAS;AAAA;AAAA,QAET,iBAAiB;AAAA,UACf,CAAC,mBAAmB,IAAI,GAAG;AAAA,QAAA;AAAA,MAE/B;AAGA,YAAMA,YAAG;AAAA,QACPD,cAAK,KAAK,gBAAgB,cAAc;AAAA,QACxC,KAAK,UAAU,iBAAiB,MAAM,CAAC;AAAA,MACzC;AAEQ,cAAA;AAAA,QACN,4BAA4B,mBAAmB,IAAI,OAAO,cAAc;AAAA,MAC1E;AAAA,aACO,OAAO;AACd,cAAQ,MAAM,mCAAmC,WAAW,KAAK,KAAK;AAAA,IAAA;AAAA,EACxE;AAEJ;"}
1
+ {"version":3,"file":"createLinkPackages.mjs","sources":["../../../../../../src/monorepo/createLinkPackages/createLinkPackages.ts"],"sourcesContent":["import { parsePackageJson } from \"../../packageJson.js\";\nimport { parseMonorepo } from \"../parseMonorepo/parseMonorepo.js\";\nimport path from \"node:path\";\nimport fs from \"node:fs/promises\";\n\ntype CreateLinkPackagesArgs = {\n sourceDir: string;\n};\n\n/**\n * Creates link packages for all SmartBundle-bundled projects in a monorepo\n * A link package is a reference package that points to the bundled output\n */\nexport async function createLinkPackages({\n sourceDir,\n}: CreateLinkPackagesArgs) {\n // Find all SmartBundle-bundled projects in the monorepo\n const { monorepo, projectPaths } = await parseMonorepo({ sourceDir });\n\n if (projectPaths.length === 0) {\n console.log(\"No SmartBundle-bundled projects found in the monorepo\");\n return;\n }\n\n // Create link packages for each SmartBundle-bundled project\n for (const projectPath of projectPaths) {\n const projectDir = path.join(sourceDir, projectPath);\n const projectPackageJsonPath = path.join(projectDir, \"package.json\");\n\n try {\n const projectPackageJson = await parsePackageJson({\n sourceDir: projectDir,\n packagePath: projectPackageJsonPath,\n });\n\n if (Array.isArray(projectPackageJson)) {\n console.error(\n `Failed to parse package.json for ${projectPath}:`,\n projectPackageJson,\n );\n continue;\n }\n\n // Create the link package directory inside the source package\n const linkPackageName = projectPackageJson.name.replace(\n /-sbsources$/,\n \"\",\n );\n const linkPackageDir = path.join(sourceDir, projectPath, \"sb-dist\");\n\n // Ensure the directory exists\n await fs.mkdir(linkPackageDir, { recursive: true });\n\n // Create re-export files for each export entry\n const linkExports: Record<string, string> = {};\n const reexportFiles: string[] = [];\n const reexportDirs = new Set<string>();\n\n if (projectPackageJson.exports) {\n for (const [exportKey, exportPath] of projectPackageJson.exports) {\n // Get the file extension from the source file\n const sourceExt = path.extname(exportPath);\n\n // Create the re-export file path based on the export key\n let reexportFileName: string;\n if (exportKey === \".\") {\n reexportFileName = `index${sourceExt}`;\n } else {\n // Remove \"./\" prefix and add the source extension\n const cleanKey = exportKey.startsWith(\"./\")\n ? exportKey.slice(2)\n : exportKey;\n reexportFileName = `${cleanKey}${sourceExt}`;\n }\n\n const reexportFilePath = path.join(linkPackageDir, reexportFileName);\n\n // Create directory for the re-export file if needed\n const reexportDir = path.dirname(reexportFilePath);\n if (reexportDir !== linkPackageDir) {\n await fs.mkdir(reexportDir, { recursive: true });\n // Track all parent directories\n let currentDir = path.relative(linkPackageDir, reexportDir);\n while (currentDir && currentDir !== \".\") {\n reexportDirs.add(currentDir);\n currentDir = path.dirname(currentDir);\n if (currentDir === \".\") break;\n }\n }\n\n // Create the re-export content\n const importPath =\n exportKey === \".\"\n ? projectPackageJson.name\n : `${projectPackageJson.name}/${exportKey.slice(2)}`;\n\n const reexportContent = `export * from \"${importPath}\";\\n`;\n\n // Write the re-export file\n await fs.writeFile(reexportFilePath, reexportContent);\n\n // Track the file for gitignore\n reexportFiles.push(reexportFileName);\n\n // Add to link package exports\n linkExports[exportKey] = `./${reexportFileName}`;\n }\n }\n\n // Create a package.json for the link package\n const linkPackageJson = {\n name: linkPackageName,\n private: true,\n version: projectPackageJson.version ?? \"0.0.0\",\n type: \"module\" as const,\n description: `Link package for ${projectPackageJson.name}`,\n exports: linkExports,\n // Add a devDependency on the source package to create a wire between source and dist\n devDependencies: {\n [projectPackageJson.name]: \"workspace:*\",\n },\n };\n\n // Write the package.json for the link package\n await fs.writeFile(\n path.join(linkPackageDir, \"package.json\"),\n JSON.stringify(linkPackageJson, null, 2),\n );\n\n console.log(\n `Created link package for ${projectPackageJson.name} at ${linkPackageDir}`,\n );\n } catch (error) {\n console.error(`Error creating link package for ${projectPath}:`, error);\n }\n }\n}\n"],"names":["path","fs"],"mappings":";;;;AAaA,eAAsB,mBAAmB;AAAA,EACvC;AACF,GAA2B;AAEnB,QAAA,EAAE,UAAU,aAAa,IAAI,MAAM,cAAc,EAAE,WAAW;AAEhE,MAAA,aAAa,WAAW,GAAG;AAC7B,YAAQ,IAAI,uDAAuD;AACnE;AAAA,EAAA;AAIF,aAAW,eAAe,cAAc;AACtC,UAAM,aAAaA,cAAK,KAAK,WAAW,WAAW;AACnD,UAAM,yBAAyBA,cAAK,KAAK,YAAY,cAAc;AAE/D,QAAA;AACI,YAAA,qBAAqB,MAAM,iBAAiB;AAAA,QAChD,WAAW;AAAA,QACX,aAAa;AAAA,MAAA,CACd;AAEG,UAAA,MAAM,QAAQ,kBAAkB,GAAG;AAC7B,gBAAA;AAAA,UACN,oCAAoC,WAAW;AAAA,UAC/C;AAAA,QACF;AACA;AAAA,MAAA;AAII,YAAA,kBAAkB,mBAAmB,KAAK;AAAA,QAC9C;AAAA,QACA;AAAA,MACF;AACA,YAAM,iBAAiBA,cAAK,KAAK,WAAW,aAAa,SAAS;AAGlE,YAAMC,YAAG,MAAM,gBAAgB,EAAE,WAAW,MAAM;AAGlD,YAAM,cAAsC,CAAC;AAC7C,YAAM,gBAA0B,CAAC;AAC3B,YAAA,mCAAmB,IAAY;AAErC,UAAI,mBAAmB,SAAS;AAC9B,mBAAW,CAAC,WAAW,UAAU,KAAK,mBAAmB,SAAS;AAE1D,gBAAA,YAAYD,cAAK,QAAQ,UAAU;AAGrC,cAAA;AACJ,cAAI,cAAc,KAAK;AACrB,+BAAmB,QAAQ,SAAS;AAAA,UAAA,OAC/B;AAEC,kBAAA,WAAW,UAAU,WAAW,IAAI,IACtC,UAAU,MAAM,CAAC,IACjB;AACe,+BAAA,GAAG,QAAQ,GAAG,SAAS;AAAA,UAAA;AAG5C,gBAAM,mBAAmBA,cAAK,KAAK,gBAAgB,gBAAgB;AAG7D,gBAAA,cAAcA,cAAK,QAAQ,gBAAgB;AACjD,cAAI,gBAAgB,gBAAgB;AAClC,kBAAMC,YAAG,MAAM,aAAa,EAAE,WAAW,MAAM;AAE/C,gBAAI,aAAaD,cAAK,SAAS,gBAAgB,WAAW;AACnD,mBAAA,cAAc,eAAe,KAAK;AACvC,2BAAa,IAAI,UAAU;AACd,2BAAAA,cAAK,QAAQ,UAAU;AACpC,kBAAI,eAAe,IAAK;AAAA,YAAA;AAAA,UAC1B;AAIF,gBAAM,aACJ,cAAc,MACV,mBAAmB,OACnB,GAAG,mBAAmB,IAAI,IAAI,UAAU,MAAM,CAAC,CAAC;AAEhD,gBAAA,kBAAkB,kBAAkB,UAAU;AAAA;AAG9C,gBAAAC,YAAG,UAAU,kBAAkB,eAAe;AAGpD,wBAAc,KAAK,gBAAgB;AAGvB,sBAAA,SAAS,IAAI,KAAK,gBAAgB;AAAA,QAAA;AAAA,MAChD;AAIF,YAAM,kBAAkB;AAAA,QACtB,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS,mBAAmB,WAAW;AAAA,QACvC,MAAM;AAAA,QACN,aAAa,oBAAoB,mBAAmB,IAAI;AAAA,QACxD,SAAS;AAAA;AAAA,QAET,iBAAiB;AAAA,UACf,CAAC,mBAAmB,IAAI,GAAG;AAAA,QAAA;AAAA,MAE/B;AAGA,YAAMA,YAAG;AAAA,QACPD,cAAK,KAAK,gBAAgB,cAAc;AAAA,QACxC,KAAK,UAAU,iBAAiB,MAAM,CAAC;AAAA,MACzC;AAEQ,cAAA;AAAA,QACN,4BAA4B,mBAAmB,IAAI,OAAO,cAAc;AAAA,MAC1E;AAAA,aACO,OAAO;AACd,cAAQ,MAAM,mCAAmC,WAAW,KAAK,KAAK;AAAA,IAAA;AAAA,EACxE;AAEJ;"}
@@ -12,7 +12,7 @@ function resolveDirs(args) {
12
12
  sourceDir,
13
13
  args.packagePath ?? "./package.json"
14
14
  );
15
- const outDir = myResolve(process.cwd(), args.outputDir ?? "./dist");
15
+ const outDir = myResolve(process.cwd(), args.outputDir ?? "./sb-dist");
16
16
  const esmOutDir = myResolve(outDir, "__compiled__/esm");
17
17
  const cjsOutDir = myResolve(outDir, "__compiled__/cjs");
18
18
  const outBinsDir = myResolve(outDir, "__bin__");
@@ -1 +1 @@
1
- {"version":3,"file":"resolveDirs.mjs","sources":["../../../../src/resolveDirs.ts"],"sourcesContent":["import { isAbsolute, join } from \"node:path\";\nimport { type Args } from \"./args.js\";\n\nfunction myResolve(path1: string, path2: string) {\n if (isAbsolute(path2)) {\n return path2;\n }\n\n return join(path1, path2);\n}\n\nexport function resolveDirs(args: Args) {\n const sourceDir = myResolve(process.cwd(), args.sourceDir ?? \".\");\n const packagePath = myResolve(\n sourceDir,\n args.packagePath ?? \"./package.json\",\n );\n const outDir = myResolve(process.cwd(), args.outputDir ?? \"./dist\");\n const esmOutDir = myResolve(outDir, \"__compiled__/esm\");\n const cjsOutDir = myResolve(outDir, \"__compiled__/cjs\");\n const outBinsDir = myResolve(outDir, \"__bin__\");\n\n return { sourceDir, packagePath, outDir, outBinsDir, cjsOutDir, esmOutDir };\n}\n\nexport type Dirs = ReturnType<typeof resolveDirs>;\n"],"names":[],"mappings":";;AAGA,SAAS,UAAU,OAAe,OAAe;AAC3C,MAAA,WAAW,KAAK,GAAG;AACd,WAAA;AAAA,EAAA;AAGF,SAAA,KAAK,OAAO,KAAK;AAC1B;AAEO,SAAS,YAAY,MAAY;AACtC,QAAM,YAAY,UAAU,QAAQ,OAAO,KAAK,aAAa,GAAG;AAChE,QAAM,cAAc;AAAA,IAClB;AAAA,IACA,KAAK,eAAe;AAAA,EACtB;AACA,QAAM,SAAS,UAAU,QAAQ,OAAO,KAAK,aAAa,QAAQ;AAC5D,QAAA,YAAY,UAAU,QAAQ,kBAAkB;AAChD,QAAA,YAAY,UAAU,QAAQ,kBAAkB;AAChD,QAAA,aAAa,UAAU,QAAQ,SAAS;AAE9C,SAAO,EAAE,WAAW,aAAa,QAAQ,YAAY,WAAW,UAAU;AAC5E;"}
1
+ {"version":3,"file":"resolveDirs.mjs","sources":["../../../../src/resolveDirs.ts"],"sourcesContent":["import { isAbsolute, join } from \"node:path\";\nimport { type Args } from \"./args.js\";\n\nfunction myResolve(path1: string, path2: string) {\n if (isAbsolute(path2)) {\n return path2;\n }\n\n return join(path1, path2);\n}\n\nexport function resolveDirs(args: Args) {\n const sourceDir = myResolve(process.cwd(), args.sourceDir ?? \".\");\n const packagePath = myResolve(\n sourceDir,\n args.packagePath ?? \"./package.json\",\n );\n const outDir = myResolve(process.cwd(), args.outputDir ?? \"./sb-dist\");\n const esmOutDir = myResolve(outDir, \"__compiled__/esm\");\n const cjsOutDir = myResolve(outDir, \"__compiled__/cjs\");\n const outBinsDir = myResolve(outDir, \"__bin__\");\n\n return { sourceDir, packagePath, outDir, outBinsDir, cjsOutDir, esmOutDir };\n}\n\nexport type Dirs = ReturnType<typeof resolveDirs>;\n"],"names":[],"mappings":";;AAGA,SAAS,UAAU,OAAe,OAAe;AAC3C,MAAA,WAAW,KAAK,GAAG;AACd,WAAA;AAAA,EAAA;AAGF,SAAA,KAAK,OAAO,KAAK;AAC1B;AAEO,SAAS,YAAY,MAAY;AACtC,QAAM,YAAY,UAAU,QAAQ,OAAO,KAAK,aAAa,GAAG;AAChE,QAAM,cAAc;AAAA,IAClB;AAAA,IACA,KAAK,eAAe;AAAA,EACtB;AACA,QAAM,SAAS,UAAU,QAAQ,OAAO,KAAK,aAAa,WAAW;AAC/D,QAAA,YAAY,UAAU,QAAQ,kBAAkB;AAChD,QAAA,YAAY,UAAU,QAAQ,kBAAkB;AAChD,QAAA,aAAa,UAAU,QAAQ,SAAS;AAE9C,SAAO,EAAE,WAAW,aAAa,QAAQ,YAAY,WAAW,UAAU;AAC5E;"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "smartbundle",
3
3
  "type": "commonjs",
4
- "version": "0.15.0-alpha.1",
4
+ "version": "0.15.0-alpha.2",
5
5
  "bin": {
6
6
  "smartbundle": "__bin__/smartbundle.js",
7
7
  "smartbundle-monorepo-link": "__bin__/smartbundle-monorepo-link.js"