smartbundle 0.14.1 → 0.15.0-alpha.1

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.
Files changed (87) hide show
  1. package/README.md +6 -1
  2. package/__bin__/smartbundle-monorepo-link.js +2 -0
  3. package/__compiled__/cjs/src/args.d.ts +9 -1
  4. package/__compiled__/cjs/src/args.js +3 -0
  5. package/__compiled__/cjs/src/args.js.map +1 -1
  6. package/__compiled__/cjs/src/detectModules.d.ts +25 -11
  7. package/__compiled__/cjs/src/detectModules.js +165 -28
  8. package/__compiled__/cjs/src/detectModules.js.map +1 -1
  9. package/__compiled__/cjs/src/index.d.ts +1 -1
  10. package/__compiled__/cjs/src/index.js +11 -5
  11. package/__compiled__/cjs/src/index.js.map +1 -1
  12. package/__compiled__/cjs/src/monorepo/buildAll.js +62 -0
  13. package/__compiled__/cjs/src/monorepo/buildAll.js.map +1 -0
  14. package/__compiled__/cjs/src/monorepo/convertPackageJson.d.ts +31 -0
  15. package/__compiled__/cjs/src/monorepo/convertPackageJson.js +40 -0
  16. package/__compiled__/cjs/src/monorepo/convertPackageJson.js.map +1 -0
  17. package/__compiled__/cjs/src/monorepo/createLinkPackages/createLinkPackages.js +92 -0
  18. package/__compiled__/cjs/src/monorepo/createLinkPackages/createLinkPackages.js.map +1 -0
  19. package/__compiled__/cjs/src/monorepo/link.js +11 -0
  20. package/__compiled__/cjs/src/monorepo/link.js.map +1 -0
  21. package/__compiled__/cjs/src/monorepo/parseMonorepo/parseMonorepo.js +106 -0
  22. package/__compiled__/cjs/src/monorepo/parseMonorepo/parseMonorepo.js.map +1 -0
  23. package/__compiled__/cjs/src/packageJson.d.ts +5 -0
  24. package/__compiled__/cjs/src/packageJson.js +2 -0
  25. package/__compiled__/cjs/src/packageJson.js.map +1 -1
  26. package/__compiled__/cjs/src/plugins/babel/index.js +1 -1
  27. package/__compiled__/cjs/src/plugins/babel/index.js.map +1 -1
  28. package/__compiled__/cjs/src/plugins/react/index.js +3 -2
  29. package/__compiled__/cjs/src/plugins/react/index.js.map +1 -1
  30. package/__compiled__/cjs/src/run.js +47 -8
  31. package/__compiled__/cjs/src/run.js.map +1 -1
  32. package/__compiled__/cjs/src/tasks/buildTypesTask/buildTypesTask.js +1 -3
  33. package/__compiled__/cjs/src/tasks/buildTypesTask/buildTypesTask.js.map +1 -1
  34. package/__compiled__/cjs/src/tasks/buildTypesTask/callTypescript.d.ts +2 -2
  35. package/__compiled__/cjs/src/tasks/buildTypesTask/callTypescript.js.map +1 -1
  36. package/__compiled__/cjs/src/tasks/buildTypesTask/findTypingsNames.d.ts +2 -2
  37. package/__compiled__/cjs/src/tasks/buildTypesTask/findTypingsNames.js.map +1 -1
  38. package/__compiled__/cjs/src/tasks/buildTypesTask/findTypingsPackages.d.ts +2 -2
  39. package/__compiled__/cjs/src/tasks/buildTypesTask/findTypingsPackages.js.map +1 -1
  40. package/__compiled__/cjs/src/tasks/gitignoreTask.d.ts +6 -0
  41. package/__compiled__/cjs/src/tasks/gitignoreTask.js +14 -0
  42. package/__compiled__/cjs/src/tasks/gitignoreTask.js.map +1 -0
  43. package/__compiled__/cjs/src/writePackageJson.js +2 -0
  44. package/__compiled__/cjs/src/writePackageJson.js.map +1 -1
  45. package/__compiled__/esm/src/args.d.mts +9 -1
  46. package/__compiled__/esm/src/args.mjs +3 -0
  47. package/__compiled__/esm/src/args.mjs.map +1 -1
  48. package/__compiled__/esm/src/detectModules.d.mts +25 -11
  49. package/__compiled__/esm/src/detectModules.mjs +165 -28
  50. package/__compiled__/esm/src/detectModules.mjs.map +1 -1
  51. package/__compiled__/esm/src/index.d.mts +1 -1
  52. package/__compiled__/esm/src/index.mjs +11 -5
  53. package/__compiled__/esm/src/index.mjs.map +1 -1
  54. package/__compiled__/esm/src/monorepo/buildAll.mjs +62 -0
  55. package/__compiled__/esm/src/monorepo/buildAll.mjs.map +1 -0
  56. package/__compiled__/esm/src/monorepo/convertPackageJson.d.mts +31 -0
  57. package/__compiled__/esm/src/monorepo/convertPackageJson.mjs +40 -0
  58. package/__compiled__/esm/src/monorepo/convertPackageJson.mjs.map +1 -0
  59. package/__compiled__/esm/src/monorepo/createLinkPackages/createLinkPackages.mjs +92 -0
  60. package/__compiled__/esm/src/monorepo/createLinkPackages/createLinkPackages.mjs.map +1 -0
  61. package/__compiled__/esm/src/monorepo/link.mjs +10 -0
  62. package/__compiled__/esm/src/monorepo/link.mjs.map +1 -0
  63. package/__compiled__/esm/src/monorepo/parseMonorepo/parseMonorepo.mjs +106 -0
  64. package/__compiled__/esm/src/monorepo/parseMonorepo/parseMonorepo.mjs.map +1 -0
  65. package/__compiled__/esm/src/packageJson.d.mts +5 -0
  66. package/__compiled__/esm/src/packageJson.mjs +2 -0
  67. package/__compiled__/esm/src/packageJson.mjs.map +1 -1
  68. package/__compiled__/esm/src/plugins/babel/index.mjs +1 -1
  69. package/__compiled__/esm/src/plugins/babel/index.mjs.map +1 -1
  70. package/__compiled__/esm/src/plugins/react/index.mjs +3 -2
  71. package/__compiled__/esm/src/plugins/react/index.mjs.map +1 -1
  72. package/__compiled__/esm/src/run.mjs +47 -8
  73. package/__compiled__/esm/src/run.mjs.map +1 -1
  74. package/__compiled__/esm/src/tasks/buildTypesTask/buildTypesTask.mjs +1 -3
  75. package/__compiled__/esm/src/tasks/buildTypesTask/buildTypesTask.mjs.map +1 -1
  76. package/__compiled__/esm/src/tasks/buildTypesTask/callTypescript.d.mts +2 -2
  77. package/__compiled__/esm/src/tasks/buildTypesTask/callTypescript.mjs.map +1 -1
  78. package/__compiled__/esm/src/tasks/buildTypesTask/findTypingsNames.d.mts +2 -2
  79. package/__compiled__/esm/src/tasks/buildTypesTask/findTypingsNames.mjs.map +1 -1
  80. package/__compiled__/esm/src/tasks/buildTypesTask/findTypingsPackages.d.mts +2 -2
  81. package/__compiled__/esm/src/tasks/buildTypesTask/findTypingsPackages.mjs.map +1 -1
  82. package/__compiled__/esm/src/tasks/gitignoreTask.d.mts +6 -0
  83. package/__compiled__/esm/src/tasks/gitignoreTask.mjs +14 -0
  84. package/__compiled__/esm/src/tasks/gitignoreTask.mjs.map +1 -0
  85. package/__compiled__/esm/src/writePackageJson.mjs +2 -0
  86. package/__compiled__/esm/src/writePackageJson.mjs.map +1 -1
  87. package/package.json +19 -13
@@ -9,6 +9,7 @@ import { buildTypesTask } from "./tasks/buildTypesTask/buildTypesTask.mjs";
9
9
  import { BuildError } from "./error.mjs";
10
10
  import { jsFilesTask } from "./tasks/jsFilesTask.mjs";
11
11
  import { binsTask } from "./tasks/binsTask.mjs";
12
+ import { gitignoreTask } from "./tasks/gitignoreTask.mjs";
12
13
  import { detectModules } from "./detectModules.mjs";
13
14
  import { lineLog, log, disableLog } from "./log.mjs";
14
15
  import { runSettled } from "./pipeline.mjs";
@@ -31,8 +32,8 @@ async function defineViteConfig(args = {}) {
31
32
  console.error(packageJson);
32
33
  throw new Error("Failed to parse package.json");
33
34
  }
34
- const modulesResult = await detectModules(packageJson, dirs);
35
- if (modulesResult.error) {
35
+ const modulesResult = await detectModules(packageJson, dirs, args.monorepo);
36
+ if (!modulesResult.success) {
36
37
  return { error: true, errors: modulesResult.errors };
37
38
  }
38
39
  const { modules } = modulesResult;
@@ -49,12 +50,12 @@ async function run(args) {
49
50
  const { sourceDir, outDir, packagePath, outBinsDir } = dirs;
50
51
  await rm(outDir, { recursive: true, force: true });
51
52
  await mkdir(outDir, { recursive: true });
52
- const packageJson = await parsePackageJson({ sourceDir, packagePath });
53
+ let packageJson = await parsePackageJson({ sourceDir, packagePath });
53
54
  if (Array.isArray(packageJson)) {
54
55
  return { error: true, errors: packageJson };
55
56
  }
56
- const modulesResult = await detectModules(packageJson, dirs);
57
- if (modulesResult.error) {
57
+ const modulesResult = await detectModules(packageJson, dirs, args.monorepo);
58
+ if (!modulesResult.success) {
58
59
  return { error: true, errors: modulesResult.errors };
59
60
  }
60
61
  const { modules } = modulesResult;
@@ -129,6 +130,11 @@ async function run(args) {
129
130
  exportsMap,
130
131
  binsMap
131
132
  });
133
+ if (!args.skipGitignore) {
134
+ await gitignoreTask({
135
+ dirs
136
+ });
137
+ }
132
138
  lineLog();
133
139
  log(`Build finished: ./${relative(sourceDir, outDir)}`);
134
140
  return { error: false };
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../../src/index.ts"],"sourcesContent":["import { relative } from \"node:path\";\nimport { mkdir, rm } from \"node:fs/promises\";\nimport { parsePackageJson } from \"./packageJson.js\";\nimport { type ExportsObject, writePackageJson } from \"./writePackageJson.js\";\nimport { resolveDirs } from \"./resolveDirs.js\";\nimport { createViteConfig } from \"./createViteConfig.js\";\nimport { copyStaticFilesTask } from \"./tasks/copyStaticFilesTask.js\";\nimport { buildTypesTask } from \"./tasks/buildTypesTask/buildTypesTask.js\";\nimport { BuildError } from \"./error.js\";\nimport { jsFilesTask } from \"./tasks/jsFilesTask.js\";\nimport { binsTask } from \"./tasks/binsTask.js\";\nimport { detectModules } from \"./detectModules.js\";\nimport { disableLog, lineLog, log, okLog } from \"./log.js\";\nimport { runSettled } from \"./pipeline.js\";\nimport { type Args } from \"./args.js\";\nimport { viteTask } from \"./tasks/viteTask.js\";\nimport { promiseSettledResultErrors } from \"./promiseSettledResultErrors.js\";\nimport { PrettyError } from \"./PrettyErrors.js\";\n\nfunction setExports(\n exportsMap: Map<string, ExportsObject>,\n exportName: string,\n mapFn: (entry: ExportsObject) => ExportsObject,\n) {\n const entry = exportsMap.get(exportName) ?? ({} as ExportsObject);\n exportsMap.set(exportName, mapFn(entry));\n}\n\nexport async function defineViteConfig(args: Args = {}) {\n disableLog();\n const dirs = resolveDirs(args);\n const { sourceDir, outDir, packagePath } = dirs;\n\n await rm(outDir, { recursive: true, force: true });\n await mkdir(outDir, { recursive: true });\n const packageJson = await parsePackageJson({ sourceDir, packagePath });\n\n if (Array.isArray(packageJson)) {\n console.error(packageJson);\n throw new Error(\"Failed to parse package.json\");\n }\n\n const modulesResult = await detectModules(packageJson, dirs);\n if (modulesResult.error) {\n return { error: true, errors: modulesResult.errors };\n }\n const { modules } = modulesResult;\n const { viteConfig } = createViteConfig({\n dirs,\n packageJson,\n modules,\n test: true,\n });\n\n return viteConfig;\n}\n\ntype RunResult =\n | {\n error: false;\n }\n | {\n error: true;\n errors: Array<string | PrettyError>;\n };\n\nexport async function run(args: Args): Promise<RunResult> {\n const dirs = resolveDirs(args);\n const { sourceDir, outDir, packagePath, outBinsDir } = dirs;\n\n await rm(outDir, { recursive: true, force: true });\n await mkdir(outDir, { recursive: true });\n const packageJson = await parsePackageJson({ sourceDir, packagePath });\n\n if (Array.isArray(packageJson)) {\n return { error: true, errors: packageJson };\n }\n\n const modulesResult = await detectModules(packageJson, dirs);\n if (modulesResult.error) {\n return { error: true, errors: modulesResult.errors };\n }\n const { modules } = modulesResult;\n const { viteConfig, entrypoints, bins } = createViteConfig({\n dirs,\n packageJson,\n modules,\n });\n\n const exportsMap = new Map<string, ExportsObject>();\n const binsMap = new Map<string, string>();\n\n const tasksRes = await runSettled(args, [\n copyStaticFilesTask(sourceDir, outDir),\n buildTypesTask({\n dirs,\n packageJson,\n entrypoints,\n modules,\n }).then(({ entrypointToEsDtsMap, entrypointToCjsDtsMap }) => {\n for (const [entrypoint, dts] of entrypointToEsDtsMap) {\n setExports(exportsMap, entrypoint, (entry) => {\n entry.dmts = \"./\" + relative(outDir, dts);\n return entry;\n });\n }\n\n for (const [entrypoint, dts] of entrypointToCjsDtsMap) {\n setExports(exportsMap, entrypoint, (entry) => {\n entry.dcts = \"./\" + relative(outDir, dts);\n return entry;\n });\n }\n }),\n viteTask({ viteConfig }).then((viteOutput) =>\n runSettled(args, [\n jsFilesTask({ buildOutput: viteOutput, entrypoints, outDir }).then(\n (res) => {\n for (const [filePath, name] of res) {\n setExports(exportsMap, name, (entry) => {\n const format = filePath.endsWith(\".js\") ? \"cjs\" : \"es\";\n if (format === \"es\") {\n entry.mjs = \"./\" + filePath;\n } else if (format === \"cjs\") {\n entry.cjs = \"./\" + filePath;\n }\n return entry;\n });\n }\n },\n ),\n binsTask({ outBinsDir, bins, buildOutput: viteOutput, outDir }).then(\n (res) => {\n for (const [value, key] of res) {\n binsMap.set(key, value);\n }\n },\n ),\n ]),\n ),\n ]);\n\n const errors = promiseSettledResultErrors(tasksRes).map((res) => {\n if (res instanceof PrettyError) {\n return res;\n }\n\n if (res instanceof BuildError) {\n return res.error;\n }\n\n return res.message;\n });\n\n if (errors.length > 0) {\n return { error: true, errors };\n }\n\n await writePackageJson(outDir, packageJson, {\n exportsMap,\n binsMap,\n });\n\n lineLog();\n log(`Build finished: ./${relative(sourceDir, outDir)}`);\n return { error: false };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../../src/index.ts"],"sourcesContent":["import { relative } from \"node:path\";\nimport { mkdir, rm } from \"node:fs/promises\";\nimport { parsePackageJson } from \"./packageJson.js\";\nimport { type ExportsObject, writePackageJson } from \"./writePackageJson.js\";\nimport { resolveDirs } from \"./resolveDirs.js\";\nimport { createViteConfig } from \"./createViteConfig.js\";\nimport { copyStaticFilesTask } from \"./tasks/copyStaticFilesTask.js\";\nimport { buildTypesTask } from \"./tasks/buildTypesTask/buildTypesTask.js\";\nimport { BuildError } from \"./error.js\";\nimport { jsFilesTask } from \"./tasks/jsFilesTask.js\";\nimport { binsTask } from \"./tasks/binsTask.js\";\nimport { gitignoreTask } from \"./tasks/gitignoreTask.js\";\nimport { detectModules } from \"./detectModules.js\";\nimport { disableLog, lineLog, log } from \"./log.js\";\nimport { runSettled } from \"./pipeline.js\";\nimport { type Args } from \"./args.js\";\nimport { viteTask } from \"./tasks/viteTask.js\";\nimport { promiseSettledResultErrors } from \"./promiseSettledResultErrors.js\";\nimport { PrettyError } from \"./PrettyErrors.js\";\n\nfunction setExports(\n exportsMap: Map<string, ExportsObject>,\n exportName: string,\n mapFn: (entry: ExportsObject) => ExportsObject,\n) {\n const entry = exportsMap.get(exportName) ?? ({} as ExportsObject);\n exportsMap.set(exportName, mapFn(entry));\n}\n\nexport async function defineViteConfig(args: Args = {}) {\n disableLog();\n const dirs = resolveDirs(args);\n const { sourceDir, outDir, packagePath } = dirs;\n\n await rm(outDir, { recursive: true, force: true });\n await mkdir(outDir, { recursive: true });\n const packageJson = await parsePackageJson({ sourceDir, packagePath });\n\n if (Array.isArray(packageJson)) {\n console.error(packageJson);\n throw new Error(\"Failed to parse package.json\");\n }\n\n const modulesResult = await detectModules(packageJson, dirs, args.monorepo);\n if (!modulesResult.success) {\n return { error: true, errors: modulesResult.errors };\n }\n const { modules } = modulesResult;\n const { viteConfig } = createViteConfig({\n dirs,\n packageJson,\n modules,\n test: true,\n });\n\n return viteConfig;\n}\n\ntype RunResult =\n | {\n error: false;\n }\n | {\n error: true;\n errors: Array<string | PrettyError>;\n };\n\nexport async function run(args: Args): Promise<RunResult> {\n const dirs = resolveDirs(args);\n const { sourceDir, outDir, packagePath, outBinsDir } = dirs;\n\n await rm(outDir, { recursive: true, force: true });\n await mkdir(outDir, { recursive: true });\n let packageJson = await parsePackageJson({ sourceDir, packagePath });\n\n if (Array.isArray(packageJson)) {\n return { error: true, errors: packageJson };\n }\n\n const modulesResult = await detectModules(packageJson, dirs, args.monorepo);\n if (!modulesResult.success) {\n return { error: true, errors: modulesResult.errors };\n }\n const { modules } = modulesResult;\n const { viteConfig, entrypoints, bins } = createViteConfig({\n dirs,\n packageJson,\n modules,\n });\n\n const exportsMap = new Map<string, ExportsObject>();\n const binsMap = new Map<string, string>();\n\n const tasksRes = await runSettled(args, [\n copyStaticFilesTask(sourceDir, outDir),\n buildTypesTask({\n dirs,\n packageJson,\n entrypoints,\n modules,\n }).then(({ entrypointToEsDtsMap, entrypointToCjsDtsMap }) => {\n for (const [entrypoint, dts] of entrypointToEsDtsMap) {\n setExports(exportsMap, entrypoint, (entry) => {\n entry.dmts = \"./\" + relative(outDir, dts);\n return entry;\n });\n }\n\n for (const [entrypoint, dts] of entrypointToCjsDtsMap) {\n setExports(exportsMap, entrypoint, (entry) => {\n entry.dcts = \"./\" + relative(outDir, dts);\n return entry;\n });\n }\n }),\n viteTask({ viteConfig }).then((viteOutput) =>\n runSettled(args, [\n jsFilesTask({ buildOutput: viteOutput, entrypoints, outDir }).then(\n (res) => {\n for (const [filePath, name] of res) {\n setExports(exportsMap, name, (entry) => {\n const format = filePath.endsWith(\".js\") ? \"cjs\" : \"es\";\n if (format === \"es\") {\n entry.mjs = \"./\" + filePath;\n } else if (format === \"cjs\") {\n entry.cjs = \"./\" + filePath;\n }\n return entry;\n });\n }\n },\n ),\n binsTask({ outBinsDir, bins, buildOutput: viteOutput, outDir }).then(\n (res) => {\n for (const [value, key] of res) {\n binsMap.set(key, value);\n }\n },\n ),\n ]),\n ),\n ]);\n\n const errors = promiseSettledResultErrors(tasksRes).map((res) => {\n if (res instanceof PrettyError) {\n return res;\n }\n\n if (res instanceof BuildError) {\n return res.error;\n }\n\n return res.message;\n });\n\n if (errors.length > 0) {\n return { error: true, errors };\n }\n\n await writePackageJson(outDir, packageJson, {\n exportsMap,\n binsMap,\n });\n\n if (!args.skipGitignore) {\n await gitignoreTask({\n dirs,\n });\n }\n\n lineLog();\n log(`Build finished: ./${relative(sourceDir, outDir)}`);\n return { error: false };\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import { join } from "node:path";
2
+ import { parseMonorepo } from "./parseMonorepo/parseMonorepo.mjs";
3
+ import { run } from "../index.mjs";
4
+ import "../args.mjs";
5
+ import { log, lineLog } from "../log.mjs";
6
+ import { PrettyError } from "../PrettyErrors.mjs";
7
+ async function buildMonorepo(args) {
8
+ const sourceDir = args.sourceDir || process.cwd();
9
+ const { monorepo, projectPaths } = await parseMonorepo({ sourceDir });
10
+ if (!monorepo) {
11
+ throw new PrettyError("Not a monorepo - pnpm-workspace.yaml not found");
12
+ }
13
+ if (projectPaths.length === 0) {
14
+ throw new PrettyError(
15
+ "No packages with -sbsources suffix found in monorepo"
16
+ );
17
+ }
18
+ log(`Found ${projectPaths.length} packages to build in monorepo`);
19
+ lineLog();
20
+ const result = {
21
+ totalPackages: projectPaths.length,
22
+ successfulBuilds: 0,
23
+ failedBuilds: 0,
24
+ errors: []
25
+ };
26
+ for (let i = 0; i < projectPaths.length; i++) {
27
+ const packagePath = projectPaths[i];
28
+ const packageSourceDir = join(sourceDir, packagePath);
29
+ log(`[${i + 1}/${projectPaths.length}] Building ${packagePath}...`);
30
+ const packageArgs = {
31
+ ...args,
32
+ sourceDir: packageSourceDir,
33
+ packagePath: join(packageSourceDir, "package.json"),
34
+ outputDir: join(packageSourceDir, "dist"),
35
+ monorepo
36
+ };
37
+ const buildResult = await run(packageArgs);
38
+ if (buildResult.error) {
39
+ result.failedBuilds++;
40
+ result.errors.push({
41
+ packagePath,
42
+ errors: buildResult.errors
43
+ });
44
+ log(
45
+ `[${i + 1}/${projectPaths.length}] ❌ Failed to build ${packagePath}`
46
+ );
47
+ } else {
48
+ result.successfulBuilds++;
49
+ log(`[${i + 1}/${projectPaths.length}] ✅ Built ${packagePath}`);
50
+ }
51
+ lineLog();
52
+ }
53
+ log(`Monorepo build completed:`);
54
+ log(` Total packages: ${result.totalPackages}`);
55
+ log(` Successful: ${result.successfulBuilds}`);
56
+ log(` Failed: ${result.failedBuilds}`);
57
+ return result;
58
+ }
59
+ export {
60
+ buildMonorepo
61
+ };
62
+ //# sourceMappingURL=buildAll.mjs.map
@@ -0,0 +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;"}
@@ -0,0 +1,31 @@
1
+ import type { PackageJson } from "../packageJson.js";
2
+ export declare function convertPackageJson(packageJson: PackageJson): {
3
+ exports?: Map<string, string>;
4
+ name?: string;
5
+ version?: string;
6
+ private?: boolean;
7
+ description?: string;
8
+ dependencies?: Record<string, string>;
9
+ optionalDependencies?: Record<string, string>;
10
+ bin?: Map<string, string>;
11
+ repository?: any;
12
+ keywords?: string[];
13
+ author?: any;
14
+ contributors?: (string | {})[];
15
+ license?: any;
16
+ devDependencies?: Record<string, string>;
17
+ peerDependencies?: Record<string, string>;
18
+ engines?: Record<string, string>;
19
+ browser?: string | Record<string, string>;
20
+ funding?: string | {};
21
+ os?: string[];
22
+ cpu?: string[];
23
+ scripts?: any;
24
+ maintainers?: any;
25
+ bugs?: any;
26
+ sideEffects?: any;
27
+ unpkg?: any;
28
+ homepage?: any;
29
+ babel?: any;
30
+ peerDependenciesMeta?: any;
31
+ };
@@ -0,0 +1,40 @@
1
+ const monorepoPostfix = "-sbsources";
2
+ const monorepoPostfixRegex = new RegExp(`${monorepoPostfix}$`);
3
+ function walkOverMonorepoDepsToRemovePostfix(deps) {
4
+ if (!deps) {
5
+ return void 0;
6
+ }
7
+ const res = {};
8
+ for (const [key, value] of Object.entries(deps)) {
9
+ if (key.endsWith(monorepoPostfix)) {
10
+ res[key.replace(monorepoPostfixRegex, "")] = value;
11
+ } else {
12
+ res[key] = value;
13
+ }
14
+ }
15
+ return res;
16
+ }
17
+ const allDepsClauses = [
18
+ "dependencies",
19
+ "optionalDependencies",
20
+ "peerDependencies",
21
+ "devDependencies"
22
+ ];
23
+ function convertPackageJson(packageJson) {
24
+ if (packageJson.name.endsWith(monorepoPostfix)) {
25
+ const originalName = packageJson.name;
26
+ packageJson.name = packageJson.name.replace(monorepoPostfix, "");
27
+ for (const depClause of allDepsClauses) {
28
+ packageJson[depClause] = walkOverMonorepoDepsToRemovePostfix(
29
+ packageJson[depClause]
30
+ );
31
+ }
32
+ packageJson.devDependencies = packageJson.devDependencies ?? {};
33
+ packageJson.devDependencies[originalName] = "workspace:*";
34
+ }
35
+ return packageJson;
36
+ }
37
+ export {
38
+ convertPackageJson
39
+ };
40
+ //# sourceMappingURL=convertPackageJson.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convertPackageJson.mjs","sources":["../../../../../src/monorepo/convertPackageJson.ts"],"sourcesContent":["import type { PackageJson } from \"../packageJson.js\";\n\nconst monorepoPostfix = \"-sbsources\";\nconst monorepoPostfixRegex = new RegExp(`${monorepoPostfix}$`);\n\nfunction walkOverMonorepoDepsToRemovePostfix(\n deps: Record<string, string> | undefined,\n) {\n if (!deps) {\n return undefined;\n }\n\n const res: Record<string, string> = {};\n for (const [key, value] of Object.entries(deps)) {\n if (key.endsWith(monorepoPostfix)) {\n res[key.replace(monorepoPostfixRegex, \"\")] = value;\n } else {\n res[key] = value;\n }\n }\n return res;\n}\n\nconst allDepsClauses = [\n \"dependencies\",\n \"optionalDependencies\",\n \"peerDependencies\",\n \"devDependencies\",\n] as const;\n\nexport function convertPackageJson(packageJson: PackageJson) {\n if (packageJson.name.endsWith(monorepoPostfix)) {\n const originalName = packageJson.name;\n packageJson.name = packageJson.name.replace(monorepoPostfix, \"\");\n\n for (const depClause of allDepsClauses) {\n packageJson[depClause] = walkOverMonorepoDepsToRemovePostfix(\n packageJson[depClause],\n );\n }\n\n // add the sources to the devDeps to create a wire between source and dist\n packageJson.devDependencies = packageJson.devDependencies ?? {};\n packageJson.devDependencies[originalName] = \"workspace:*\";\n }\n\n return packageJson;\n}\n"],"names":[],"mappings":"AAEA,MAAM,kBAAkB;AACxB,MAAM,uBAAuB,IAAI,OAAO,GAAG,eAAe,GAAG;AAE7D,SAAS,oCACP,MACA;AACA,MAAI,CAAC,MAAM;AACF,WAAA;AAAA,EAAA;AAGT,QAAM,MAA8B,CAAC;AACrC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC3C,QAAA,IAAI,SAAS,eAAe,GAAG;AACjC,UAAI,IAAI,QAAQ,sBAAsB,EAAE,CAAC,IAAI;AAAA,IAAA,OACxC;AACL,UAAI,GAAG,IAAI;AAAA,IAAA;AAAA,EACb;AAEK,SAAA;AACT;AAEA,MAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,mBAAmB,aAA0B;AAC3D,MAAI,YAAY,KAAK,SAAS,eAAe,GAAG;AAC9C,UAAM,eAAe,YAAY;AACjC,gBAAY,OAAO,YAAY,KAAK,QAAQ,iBAAiB,EAAE;AAE/D,eAAW,aAAa,gBAAgB;AACtC,kBAAY,SAAS,IAAI;AAAA,QACvB,YAAY,SAAS;AAAA,MACvB;AAAA,IAAA;AAIU,gBAAA,kBAAkB,YAAY,mBAAmB,CAAC;AAClD,gBAAA,gBAAgB,YAAY,IAAI;AAAA,EAAA;AAGvC,SAAA;AACT;"}
@@ -0,0 +1,92 @@
1
+ import { parsePackageJson } from "../../packageJson.mjs";
2
+ import { parseMonorepo } from "../parseMonorepo/parseMonorepo.mjs";
3
+ import path__default from "node:path";
4
+ import fs__default from "node:fs/promises";
5
+ async function createLinkPackages({
6
+ sourceDir
7
+ }) {
8
+ const { isMonorepo, projectPaths } = await parseMonorepo({ sourceDir });
9
+ if (projectPaths.length === 0) {
10
+ console.log("No SmartBundle-bundled projects found in the monorepo");
11
+ return;
12
+ }
13
+ for (const projectPath of projectPaths) {
14
+ const projectDir = path__default.join(sourceDir, projectPath);
15
+ const projectPackageJsonPath = path__default.join(projectDir, "package.json");
16
+ try {
17
+ const projectPackageJson = await parsePackageJson({
18
+ sourceDir: projectDir,
19
+ packagePath: projectPackageJsonPath
20
+ });
21
+ if (Array.isArray(projectPackageJson)) {
22
+ console.error(
23
+ `Failed to parse package.json for ${projectPath}:`,
24
+ projectPackageJson
25
+ );
26
+ continue;
27
+ }
28
+ const linkPackageName = projectPackageJson.name.replace(
29
+ /-sbsources$/,
30
+ ""
31
+ );
32
+ const linkPackageDir = path__default.join(sourceDir, projectPath, "dist");
33
+ await fs__default.mkdir(linkPackageDir, { recursive: true });
34
+ const linkExports = {};
35
+ const reexportFiles = [];
36
+ const reexportDirs = /* @__PURE__ */ new Set();
37
+ if (projectPackageJson.exports) {
38
+ for (const [exportKey, exportPath] of projectPackageJson.exports) {
39
+ const sourceExt = path__default.extname(exportPath);
40
+ let reexportFileName;
41
+ if (exportKey === ".") {
42
+ reexportFileName = `index${sourceExt}`;
43
+ } else {
44
+ const cleanKey = exportKey.startsWith("./") ? exportKey.slice(2) : exportKey;
45
+ reexportFileName = `${cleanKey}${sourceExt}`;
46
+ }
47
+ const reexportFilePath = path__default.join(linkPackageDir, reexportFileName);
48
+ const reexportDir = path__default.dirname(reexportFilePath);
49
+ if (reexportDir !== linkPackageDir) {
50
+ await fs__default.mkdir(reexportDir, { recursive: true });
51
+ let currentDir = path__default.relative(linkPackageDir, reexportDir);
52
+ while (currentDir && currentDir !== ".") {
53
+ reexportDirs.add(currentDir);
54
+ currentDir = path__default.dirname(currentDir);
55
+ if (currentDir === ".") break;
56
+ }
57
+ }
58
+ const importPath = exportKey === "." ? projectPackageJson.name : `${projectPackageJson.name}/${exportKey.slice(2)}`;
59
+ const reexportContent = `export * from "${importPath}";
60
+ `;
61
+ await fs__default.writeFile(reexportFilePath, reexportContent);
62
+ reexportFiles.push(reexportFileName);
63
+ linkExports[exportKey] = `./${reexportFileName}`;
64
+ }
65
+ }
66
+ const linkPackageJson = {
67
+ name: linkPackageName,
68
+ version: projectPackageJson.version ?? "0.0.0",
69
+ type: "module",
70
+ description: `Link package for ${projectPackageJson.name}`,
71
+ exports: linkExports,
72
+ // Add a devDependency on the source package to create a wire between source and dist
73
+ devDependencies: {
74
+ [projectPackageJson.name]: "workspace:*"
75
+ }
76
+ };
77
+ await fs__default.writeFile(
78
+ path__default.join(linkPackageDir, "package.json"),
79
+ JSON.stringify(linkPackageJson, null, 2)
80
+ );
81
+ console.log(
82
+ `Created link package for ${projectPackageJson.name} at ${linkPackageDir}`
83
+ );
84
+ } catch (error) {
85
+ console.error(`Error creating link package for ${projectPath}:`, error);
86
+ }
87
+ }
88
+ }
89
+ export {
90
+ createLinkPackages
91
+ };
92
+ //# sourceMappingURL=createLinkPackages.mjs.map
@@ -0,0 +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;"}
@@ -0,0 +1,10 @@
1
+ import { args } from "../args.mjs";
2
+ import { resolveDirs } from "../resolveDirs.mjs";
3
+ import { createLinkPackages } from "./createLinkPackages/createLinkPackages.mjs";
4
+ (async () => {
5
+ const dirs = resolveDirs(args);
6
+ await createLinkPackages(dirs);
7
+ console.log("Monorepo link packages created successfully");
8
+ console.log("Run 'pnpm install' to update dependencies");
9
+ })();
10
+ //# sourceMappingURL=link.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.mjs","sources":["../../../../../src/monorepo/link.ts"],"sourcesContent":["import { args } from \"../args.js\";\nimport { resolveDirs } from \"../resolveDirs.js\";\nimport { createLinkPackages } from \"./createLinkPackages/createLinkPackages.js\";\n\n(async () => {\n const dirs = resolveDirs(args);\n // Create link packages for all SmartBundle-bundled projects\n await createLinkPackages(dirs);\n\n console.log(\"Monorepo link packages created successfully\");\n console.log(\"Run 'pnpm install' to update dependencies\");\n})();\n"],"names":[],"mappings":";;;CAIC,YAAY;AACL,QAAA,OAAO,YAAY,IAAI;AAE7B,QAAM,mBAAmB,IAAI;AAE7B,UAAQ,IAAI,6CAA6C;AACzD,UAAQ,IAAI,2CAA2C;AACzD,GAAG;"}
@@ -0,0 +1,106 @@
1
+ import fs__default from "node:fs/promises";
2
+ import path__default from "node:path";
3
+ import { parse } from "yaml";
4
+ import { glob } from "glob";
5
+ async function detectMonorepoType(sourceDir) {
6
+ const isPnpmMonorepo = await isPnpmWorkspace(sourceDir);
7
+ if (!isPnpmMonorepo) {
8
+ return { monorepo: null, projectPaths: [] };
9
+ }
10
+ const projectPaths = await findSmartBundleBundledProjects(sourceDir);
11
+ const devDeps = await readDevDeps(sourceDir);
12
+ if (devDeps === null) {
13
+ return { monorepo: null, projectPaths: [] };
14
+ }
15
+ return {
16
+ monorepo: {
17
+ type: "pnpm",
18
+ devDeps
19
+ },
20
+ projectPaths
21
+ };
22
+ }
23
+ async function readDevDeps(sourceDir) {
24
+ try {
25
+ const packageJsonPath = path__default.join(sourceDir, "package.json");
26
+ const content = await fs__default.readFile(packageJsonPath, "utf-8");
27
+ const packageJson = JSON.parse(content);
28
+ return packageJson.devDependencies ?? {};
29
+ } catch (error) {
30
+ return null;
31
+ }
32
+ }
33
+ async function isPnpmWorkspace(dir) {
34
+ try {
35
+ const stat = await fs__default.stat(path__default.join(dir, "pnpm-workspace.yaml"));
36
+ return stat.isFile();
37
+ } catch (error) {
38
+ return false;
39
+ }
40
+ }
41
+ async function findSmartBundleBundledProjects(dir) {
42
+ const workspaceConfig = await readPnpmWorkspaceConfig(dir);
43
+ if (!workspaceConfig || !workspaceConfig.packages || !workspaceConfig.packages.length) {
44
+ return [];
45
+ }
46
+ const projectPaths = [];
47
+ const includePatterns = workspaceConfig.packages.filter(
48
+ (pattern) => !pattern.startsWith("!")
49
+ );
50
+ const excludePatterns = workspaceConfig.packages.filter((pattern) => pattern.startsWith("!")).map((pattern) => pattern.substring(1));
51
+ for (const pattern of includePatterns) {
52
+ const isDirectSubdir = !pattern.includes("*");
53
+ const matches = await glob(
54
+ // For direct subdirectories, we don't need to append a slash
55
+ isDirectSubdir ? pattern : pattern.endsWith("/") ? pattern : `${pattern}/`,
56
+ {
57
+ cwd: dir,
58
+ absolute: true,
59
+ ignore: ["**/node_modules/**", ...excludePatterns]
60
+ }
61
+ );
62
+ for (const match of matches) {
63
+ const isSmartBundleProject = await isSmartBundleBundledProject(match);
64
+ if (isSmartBundleProject) {
65
+ const relativePath = path__default.relative(dir, match);
66
+ projectPaths.push(relativePath);
67
+ }
68
+ }
69
+ }
70
+ return projectPaths;
71
+ }
72
+ async function readPnpmWorkspaceConfig(dir) {
73
+ try {
74
+ const content = await fs__default.readFile(
75
+ path__default.join(dir, "pnpm-workspace.yaml"),
76
+ "utf-8"
77
+ );
78
+ const parsedConfig = parse(content);
79
+ if (parsedConfig && Array.isArray(parsedConfig.packages)) {
80
+ return { packages: parsedConfig.packages };
81
+ }
82
+ return null;
83
+ } catch (error) {
84
+ return null;
85
+ }
86
+ }
87
+ async function isSmartBundleBundledProject(dir) {
88
+ try {
89
+ const packageJsonPath = path__default.join(dir, "package.json");
90
+ const content = await fs__default.readFile(packageJsonPath, "utf-8");
91
+ const packageJson = JSON.parse(content);
92
+ return typeof packageJson.name === "string" && packageJson.name.endsWith("-sbsources");
93
+ } catch (error) {
94
+ return false;
95
+ }
96
+ }
97
+ async function parseMonorepo({
98
+ sourceDir
99
+ }) {
100
+ return await detectMonorepoType(sourceDir);
101
+ }
102
+ export {
103
+ detectMonorepoType,
104
+ parseMonorepo
105
+ };
106
+ //# sourceMappingURL=parseMonorepo.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseMonorepo.mjs","sources":["../../../../../../src/monorepo/parseMonorepo/parseMonorepo.ts"],"sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport { glob } from \"glob\";\nimport type { Monorepo } from \"../../args.js\";\n\ntype ParseMonorepoArgs = {\n sourceDir: string;\n};\n\ntype DetectMonorepoTypeResult = {\n monorepo: Monorepo | null;\n projectPaths: Array<string>; // list of relative `smartbundle-bundled` project paths\n};\n\n/**\n * Detects the monorepo type and returns paths to SmartBundle-bundled projects\n * Currently only supports pnpm monorepos as per documentation\n */\nexport async function detectMonorepoType(\n sourceDir: string,\n): Promise<DetectMonorepoTypeResult> {\n // Check if it's a pnpm monorepo by looking for pnpm-workspace.yaml\n const isPnpmMonorepo = await isPnpmWorkspace(sourceDir);\n\n if (!isPnpmMonorepo) {\n // Not a supported monorepo type (only pnpm is supported)\n return { monorepo: null, projectPaths: [] };\n }\n\n // Find all SmartBundle-bundled projects (packages with names ending in -sbsources)\n const projectPaths = await findSmartBundleBundledProjects(sourceDir);\n const devDeps = await readDevDeps(sourceDir);\n\n // If we can't read the root package.json, this is not a valid monorepo\n if (devDeps === null) {\n return { monorepo: null, projectPaths: [] };\n }\n\n return {\n monorepo: {\n type: \"pnpm\",\n devDeps,\n },\n projectPaths,\n };\n}\n\nasync function readDevDeps(sourceDir: string): Promise<Record<string, string> | null> {\n try {\n const packageJsonPath = path.join(sourceDir, \"package.json\");\n const content = await fs.readFile(packageJsonPath, \"utf-8\");\n const packageJson = JSON.parse(content);\n return packageJson.devDependencies ?? {};\n } catch (error) {\n return null;\n }\n}\n\n/**\n * Checks if the directory is a pnpm workspace by looking for pnpm-workspace.yaml\n */\nasync function isPnpmWorkspace(dir: string): Promise<boolean> {\n try {\n const stat = await fs.stat(path.join(dir, \"pnpm-workspace.yaml\"));\n return stat.isFile();\n } catch (error) {\n return false;\n }\n}\n\n/**\n * Finds all packages with names ending in -sbsources in the monorepo\n */\nasync function findSmartBundleBundledProjects(dir: string): Promise<string[]> {\n // Read the pnpm-workspace.yaml to get package patterns\n const workspaceConfig = await readPnpmWorkspaceConfig(dir);\n\n if (\n !workspaceConfig ||\n !workspaceConfig.packages ||\n !workspaceConfig.packages.length\n ) {\n return [];\n }\n\n const projectPaths: string[] = [];\n\n // Separate include and exclude patterns\n const includePatterns = workspaceConfig.packages.filter(\n (pattern) => !pattern.startsWith(\"!\"),\n );\n const excludePatterns = workspaceConfig.packages\n .filter((pattern) => pattern.startsWith(\"!\"))\n .map((pattern) => pattern.substring(1)); // Remove the leading '!'\n\n // Process each include pattern in the workspace config\n for (const pattern of includePatterns) {\n // For direct subdirectory patterns (without wildcards), we need to check if it's a directory\n const isDirectSubdir = !pattern.includes(\"*\");\n\n // Use glob to find all directories matching the pattern\n const matches = await glob(\n // For direct subdirectories, we don't need to append a slash\n isDirectSubdir\n ? pattern\n : pattern.endsWith(\"/\")\n ? pattern\n : `${pattern}/`,\n {\n cwd: dir,\n absolute: true,\n ignore: [\"**/node_modules/**\", ...excludePatterns],\n },\n );\n\n // Check each matched directory to see if it contains a SmartBundle-bundled project\n for (const match of matches) {\n const isSmartBundleProject = await isSmartBundleBundledProject(match);\n\n if (isSmartBundleProject) {\n // Convert absolute path to relative path\n const relativePath = path.relative(dir, match);\n projectPaths.push(relativePath);\n }\n }\n }\n\n return projectPaths;\n}\n\n/**\n * Reads and parses the pnpm-workspace.yaml file using the yaml library\n */\nasync function readPnpmWorkspaceConfig(\n dir: string,\n): Promise<{ packages: string[] } | null> {\n try {\n const content = await fs.readFile(\n path.join(dir, \"pnpm-workspace.yaml\"),\n \"utf-8\",\n );\n\n // Use the yaml library to parse the content\n const parsedConfig = parseYaml(content) as { packages?: string[] };\n\n if (parsedConfig && Array.isArray(parsedConfig.packages)) {\n return { packages: parsedConfig.packages };\n }\n\n return null;\n } catch (error) {\n return null;\n }\n}\n\n/**\n * Checks if a directory contains a SmartBundle-bundled project\n * by looking for a package.json with a name ending in -sbsources\n */\nasync function isSmartBundleBundledProject(dir: string): Promise<boolean> {\n try {\n const packageJsonPath = path.join(dir, \"package.json\");\n const content = await fs.readFile(packageJsonPath, \"utf-8\");\n const packageJson = JSON.parse(content);\n\n // Check if the package name ends with -sbsources (case-sensitive)\n return (\n typeof packageJson.name === \"string\" &&\n packageJson.name.endsWith(\"-sbsources\")\n );\n } catch (error) {\n return false;\n }\n}\n\nexport async function parseMonorepo({\n sourceDir,\n}: ParseMonorepoArgs): Promise<DetectMonorepoTypeResult> {\n return await detectMonorepoType(sourceDir);\n}\n\nexport type { DetectMonorepoTypeResult };\n"],"names":["path","fs","parseYaml"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import z from "zod";
2
2
  declare function createPackageJsonSchema(sourceDir: string): z.ZodEffects<z.ZodObject<{
3
+ scripts: z.ZodOptional<z.ZodAny>;
3
4
  exports: z.ZodOptional<z.ZodEffects<z.ZodUnion<[
4
5
  z.ZodEffects<z.ZodString, Map<string, string>, string>,
5
6
  z.ZodEffects<z.ZodRecord<z.ZodString, z.ZodString>, Map<string, string>, Record<string, string>>
@@ -63,6 +64,7 @@ declare function createPackageJsonSchema(sourceDir: string): z.ZodEffects<z.ZodO
63
64
  funding?: string | {};
64
65
  os?: string[];
65
66
  cpu?: string[];
67
+ scripts?: any;
66
68
  maintainers?: any;
67
69
  bugs?: any;
68
70
  sideEffects?: any;
@@ -91,6 +93,7 @@ declare function createPackageJsonSchema(sourceDir: string): z.ZodEffects<z.ZodO
91
93
  funding?: string | {};
92
94
  os?: string[];
93
95
  cpu?: string[];
96
+ scripts?: any;
94
97
  maintainers?: any;
95
98
  bugs?: any;
96
99
  sideEffects?: any;
@@ -119,6 +122,7 @@ declare function createPackageJsonSchema(sourceDir: string): z.ZodEffects<z.ZodO
119
122
  funding?: string | {};
120
123
  os?: string[];
121
124
  cpu?: string[];
125
+ scripts?: any;
122
126
  maintainers?: any;
123
127
  bugs?: any;
124
128
  sideEffects?: any;
@@ -147,6 +151,7 @@ declare function createPackageJsonSchema(sourceDir: string): z.ZodEffects<z.ZodO
147
151
  funding?: string | {};
148
152
  os?: string[];
149
153
  cpu?: string[];
154
+ scripts?: any;
150
155
  maintainers?: any;
151
156
  bugs?: any;
152
157
  sideEffects?: any;
@@ -32,6 +32,8 @@ function fillPackageJson(packageJson) {
32
32
  function createPackageJsonSchema(sourceDir) {
33
33
  const pathValidator = createPathValidator(sourceDir);
34
34
  const schema = z.object({
35
+ // We don't care about this field. It is makes sense only for monorepo
36
+ scripts: z.any().optional(),
35
37
  exports: z.union(
36
38
  [
37
39
  z.string().transform((path) => /* @__PURE__ */ new Map([[".", path]])),
@@ -1 +1 @@
1
- {"version":3,"file":"packageJson.mjs","sources":["../../../../src/packageJson.ts"],"sourcesContent":["import * as fs from \"node:fs/promises\";\nimport z from \"zod\";\nimport { errors } from \"./errors.js\";\nimport { join } from \"node:path\";\n\n// <region>\n// For AI completion. Don't remove.\nconst allPackageJsonFields = [\n \"exports\",\n \"name\",\n \"version\",\n \"private\",\n \"description\",\n \"dependencies\",\n \"optionalDependencies\",\n \"bin\",\n \"repository\",\n \"keywords\",\n \"author\",\n \"contributors\",\n \"license\",\n \"devDependencies\",\n \"peerDependencies\",\n \"engines\",\n \"browser\",\n \"funding\",\n \"os\",\n \"cpu\",\n];\n\nconst requiredFields = [\"exports\", \"name\", \"version\", \"private\"];\n\nconst optionalFields = [\n \"description\",\n \"dependencies\",\n \"optionalDependencies\",\n \"bin\",\n \"repository\",\n \"keywords\",\n \"author\",\n \"contributors\",\n \"license\",\n \"devDependencies\",\n \"peerDependencies\",\n \"engines\",\n \"browser\",\n \"funding\",\n \"os\",\n \"cpu\",\n];\n// </region>\n\nasync function fileExists(filePath: string) {\n try {\n const stats = await fs.stat(filePath);\n return stats.isFile();\n } catch (error) {\n return false;\n }\n}\n\nfunction dependencies(errorText: string) {\n return z\n .record(z.string({ message: errorText }), { message: errorText })\n .optional();\n}\n\nfunction createPathValidator(sourceDir: string) {\n return (path: string) => {\n const finalPath = join(sourceDir, path);\n return fileExists(finalPath);\n };\n}\n\nconst PackageJsonNameField: string = \"___NAME___\";\nfunction fillPackageJson(packageJson: PackageJson) {\n if (packageJson.bin) {\n const binName = packageJson.bin.get(PackageJsonNameField);\n if (binName) {\n packageJson.bin.set(packageJson.name, binName);\n packageJson.bin.delete(PackageJsonNameField);\n }\n }\n}\n\nfunction createPackageJsonSchema(sourceDir: string) {\n const pathValidator = createPathValidator(sourceDir);\n\n const schema = z.object({\n exports: z\n .union(\n [\n z.string().transform((path) => new Map([[\".\", path]])),\n z.record(z.string()).transform((obj) => new Map(Object.entries(obj))),\n ],\n {\n errorMap() {\n return { message: errors.exportsRequired };\n },\n },\n )\n .refine(async (obj) => {\n for (const [key, value] of obj.entries()) {\n if (!(await pathValidator(value))) {\n return false;\n }\n }\n return true;\n }, errors.exportsInvalid)\n .optional(),\n name: z\n .string({ message: errors.nameRequired })\n .min(1, errors.nameMinLength)\n .max(214, errors.nameMaxLength)\n .refine(\n (name) => [\"_\", \".\"].every((start) => !name.startsWith(start)),\n errors.nameStartsIllegalChars,\n ),\n version: z.string({ message: errors.versionRequired }),\n private: z\n .boolean({ message: errors.privateIsTrue })\n .refine((value) => value, errors.privateIsTrue),\n description: z.string({ message: errors.descriptionString }).optional(),\n dependencies: dependencies(errors.dependenciesInvalid),\n optionalDependencies: dependencies(errors.optionalDependenciesInvalid),\n bin: z\n .union(\n [\n z\n .string()\n .transform((value) => new Map([[PackageJsonNameField, value]])),\n z\n .record(z.string())\n .transform((record) => new Map(Object.entries(record))),\n ],\n {\n errorMap() {\n return { message: errors.binFiled };\n },\n },\n )\n .refine(\n async (map) => {\n for (const [key, value] of map.entries()) {\n if (!(await pathValidator(value))) {\n return false;\n }\n }\n return true;\n },\n { message: errors.binFiled },\n )\n .optional(),\n repository: z.any().optional(),\n keywords: z\n .array(z.string(), { message: errors.keywordsInvalid })\n .optional(),\n author: z.any().optional(),\n maintainers: z.any().optional(),\n contributors: z\n .array(\n z.union([\n z.string({ message: errors.contributorsInvalid }),\n z.object({}, { message: errors.contributorsInvalid }),\n ]),\n )\n .optional(),\n license: z.any().optional(),\n devDependencies: dependencies(errors.devDependenciesInvalid),\n peerDependencies: dependencies(errors.peerDependenciesInvalid),\n engines: z\n .record(z.string(), { message: errors.enginesInvalid })\n .optional(),\n browser: z\n .union([\n z.string({ message: errors.browserInvalid }),\n z.record(z.string(), { message: errors.browserInvalid }),\n ])\n .optional(),\n bugs: z.any().optional(),\n funding: z\n .union([\n z.string({ message: errors.fundingInvalid }),\n z.object({}, { message: errors.fundingInvalid }),\n ])\n .optional(),\n os: z.array(z.string(), { message: errors.osInvalid }).optional(),\n cpu: z.array(z.string(), { message: errors.cpuInvalid }).optional(),\n sideEffects: z.any().optional(),\n unpkg: z.any().optional(),\n homepage: z.any().optional(),\n babel: z.any().optional(),\n peerDependenciesMeta: z.any().optional(),\n });\n\n // Add custom logic so that at least one of exports or bin is provided\n return schema.superRefine((data, ctx) => {\n if (!data.exports && !data.bin) {\n ctx.addIssue({\n code: \"custom\",\n message: errors.exportsRequired,\n path: [\"exports\"],\n });\n }\n });\n}\ntype PackageJsonSchema = ReturnType<typeof createPackageJsonSchema>;\n\nexport type PackageJson = z.infer<PackageJsonSchema>;\ntype Errors = Array<string>;\n\ntype ParsePackageJsonArg = {\n packagePath: string;\n sourceDir: string;\n};\n\nexport async function parsePackageJson({\n sourceDir,\n packagePath,\n}: ParsePackageJsonArg): Promise<PackageJson | Errors> {\n const packageString = await fs.readFile(packagePath, \"utf-8\");\n const rawJson = JSON.parse(packageString);\n\n const packageJsonSchema = createPackageJsonSchema(sourceDir);\n const packageJson = await packageJsonSchema.safeParseAsync(rawJson);\n if (!packageJson.success) {\n return packageJson.error.errors.map((error) => error.message);\n }\n\n fillPackageJson(packageJson.data);\n return packageJson.data;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"packageJson.mjs","sources":["../../../../src/packageJson.ts"],"sourcesContent":["import * as fs from \"node:fs/promises\";\nimport z from \"zod\";\nimport { errors } from \"./errors.js\";\nimport { join } from \"node:path\";\n\n// <region>\n// For AI completion. Don't remove.\nconst allPackageJsonFields = [\n \"exports\",\n \"name\",\n \"version\",\n \"private\",\n \"description\",\n \"dependencies\",\n \"optionalDependencies\",\n \"bin\",\n \"repository\",\n \"keywords\",\n \"author\",\n \"contributors\",\n \"license\",\n \"devDependencies\",\n \"peerDependencies\",\n \"engines\",\n \"browser\",\n \"funding\",\n \"os\",\n \"cpu\",\n];\n\nconst requiredFields = [\"exports\", \"name\", \"version\", \"private\"];\n\nconst optionalFields = [\n \"description\",\n \"dependencies\",\n \"optionalDependencies\",\n \"bin\",\n \"repository\",\n \"keywords\",\n \"author\",\n \"contributors\",\n \"license\",\n \"devDependencies\",\n \"peerDependencies\",\n \"engines\",\n \"browser\",\n \"funding\",\n \"os\",\n \"cpu\",\n];\n// </region>\n\nasync function fileExists(filePath: string) {\n try {\n const stats = await fs.stat(filePath);\n return stats.isFile();\n } catch (error) {\n return false;\n }\n}\n\nfunction dependencies(errorText: string) {\n return z\n .record(z.string({ message: errorText }), { message: errorText })\n .optional();\n}\n\nfunction createPathValidator(sourceDir: string) {\n return (path: string) => {\n const finalPath = join(sourceDir, path);\n return fileExists(finalPath);\n };\n}\n\nconst PackageJsonNameField: string = \"___NAME___\";\nfunction fillPackageJson(packageJson: PackageJson) {\n if (packageJson.bin) {\n const binName = packageJson.bin.get(PackageJsonNameField);\n if (binName) {\n packageJson.bin.set(packageJson.name, binName);\n packageJson.bin.delete(PackageJsonNameField);\n }\n }\n}\n\nfunction createPackageJsonSchema(sourceDir: string) {\n const pathValidator = createPathValidator(sourceDir);\n\n const schema = z.object({\n // We don't care about this field. It is makes sense only for monorepo\n scripts: z.any().optional(),\n exports: z\n .union(\n [\n z.string().transform((path) => new Map([[\".\", path]])),\n z.record(z.string()).transform((obj) => new Map(Object.entries(obj))),\n ],\n {\n errorMap() {\n return { message: errors.exportsRequired };\n },\n },\n )\n .refine(async (obj) => {\n for (const [key, value] of obj.entries()) {\n if (!(await pathValidator(value))) {\n return false;\n }\n }\n return true;\n }, errors.exportsInvalid)\n .optional(),\n name: z\n .string({ message: errors.nameRequired })\n .min(1, errors.nameMinLength)\n .max(214, errors.nameMaxLength)\n .refine(\n (name) => [\"_\", \".\"].every((start) => !name.startsWith(start)),\n errors.nameStartsIllegalChars,\n ),\n version: z.string({ message: errors.versionRequired }),\n private: z\n .boolean({ message: errors.privateIsTrue })\n .refine((value) => value, errors.privateIsTrue),\n description: z.string({ message: errors.descriptionString }).optional(),\n dependencies: dependencies(errors.dependenciesInvalid),\n optionalDependencies: dependencies(errors.optionalDependenciesInvalid),\n bin: z\n .union(\n [\n z\n .string()\n .transform((value) => new Map([[PackageJsonNameField, value]])),\n z\n .record(z.string())\n .transform((record) => new Map(Object.entries(record))),\n ],\n {\n errorMap() {\n return { message: errors.binFiled };\n },\n },\n )\n .refine(\n async (map) => {\n for (const [key, value] of map.entries()) {\n if (!(await pathValidator(value))) {\n return false;\n }\n }\n return true;\n },\n { message: errors.binFiled },\n )\n .optional(),\n repository: z.any().optional(),\n keywords: z\n .array(z.string(), { message: errors.keywordsInvalid })\n .optional(),\n author: z.any().optional(),\n maintainers: z.any().optional(),\n contributors: z\n .array(\n z.union([\n z.string({ message: errors.contributorsInvalid }),\n z.object({}, { message: errors.contributorsInvalid }),\n ]),\n )\n .optional(),\n license: z.any().optional(),\n devDependencies: dependencies(errors.devDependenciesInvalid),\n peerDependencies: dependencies(errors.peerDependenciesInvalid),\n engines: z\n .record(z.string(), { message: errors.enginesInvalid })\n .optional(),\n browser: z\n .union([\n z.string({ message: errors.browserInvalid }),\n z.record(z.string(), { message: errors.browserInvalid }),\n ])\n .optional(),\n bugs: z.any().optional(),\n funding: z\n .union([\n z.string({ message: errors.fundingInvalid }),\n z.object({}, { message: errors.fundingInvalid }),\n ])\n .optional(),\n os: z.array(z.string(), { message: errors.osInvalid }).optional(),\n cpu: z.array(z.string(), { message: errors.cpuInvalid }).optional(),\n sideEffects: z.any().optional(),\n unpkg: z.any().optional(),\n homepage: z.any().optional(),\n babel: z.any().optional(),\n peerDependenciesMeta: z.any().optional(),\n });\n\n // Add custom logic so that at least one of exports or bin is provided\n return schema.superRefine((data, ctx) => {\n if (!data.exports && !data.bin) {\n ctx.addIssue({\n code: \"custom\",\n message: errors.exportsRequired,\n path: [\"exports\"],\n });\n }\n });\n}\ntype PackageJsonSchema = ReturnType<typeof createPackageJsonSchema>;\n\nexport type PackageJson = z.infer<PackageJsonSchema>;\ntype Errors = Array<string>;\n\ntype ParsePackageJsonArg = {\n packagePath: string;\n sourceDir: string;\n};\n\nexport async function parsePackageJson({\n sourceDir,\n packagePath,\n}: ParsePackageJsonArg): Promise<PackageJson | Errors> {\n const packageString = await fs.readFile(packagePath, \"utf-8\");\n const rawJson = JSON.parse(packageString);\n\n const packageJsonSchema = createPackageJsonSchema(sourceDir);\n const packageJson = await packageJsonSchema.safeParseAsync(rawJson);\n if (!packageJson.success) {\n return packageJson.error.errors.map((error) => error.message);\n }\n\n fillPackageJson(packageJson.data);\n return packageJson.data;\n}\n"],"names":[],"mappings":"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"}
@@ -36,7 +36,7 @@ function babelPlugin({
36
36
  return null;
37
37
  }
38
38
  const map = this.getCombinedSourcemap();
39
- const result = await modules.babel.transformAsync(code, {
39
+ const result = await modules.babel.babel.transformAsync(code, {
40
40
  filename: id,
41
41
  sourceMaps: true,
42
42
  inputSourceMap: map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../../../../src/plugins/babel/index.ts"],"sourcesContent":["import type { Plugin } from \"vite\";\nimport * as path from \"node:path\";\nimport { findBabelConfig } from \"./findBabelConfig.js\";\nimport { type PackageJson } from \"../../packageJson.js\";\nimport { type Dirs } from \"../../resolveDirs.js\";\nimport { type DetectedModules } from \"../../detectModules.js\";\nimport { okLog } from \"../../log.js\";\n\ntype BabelPluginOptions = {\n packageJson: PackageJson;\n dirs: Dirs;\n modules: DetectedModules;\n};\n\nexport function babelPlugin({\n packageJson,\n dirs,\n modules,\n}: BabelPluginOptions): Plugin {\n let hasBabelConfig = false;\n\n return {\n name: \"smartbundle:babel\",\n async buildStart() {\n hasBabelConfig = await findBabelConfig(dirs.sourceDir, packageJson);\n if (modules.babel && !hasBabelConfig) {\n this.warn(\n \"We have found a @babel/core package, but config was not found. It could be a bug\",\n );\n } else if (!modules.babel && hasBabelConfig) {\n this.error(\n new Error(\n \"We have found a babel config. Please install @babel/core to devDeps or remove the config file\",\n ),\n );\n }\n },\n async transform(code, id) {\n if (!modules.babel || !hasBabelConfig) {\n return null;\n }\n\n const extname = path.extname(id);\n if (![\".js\", \".ts\"].includes(extname)) {\n return null;\n }\n\n const map = this.getCombinedSourcemap();\n\n const result = await modules.babel.transformAsync(code, {\n filename: id,\n sourceMaps: true,\n inputSourceMap: map,\n });\n\n if (!result?.code) {\n throw new Error(\"Babel transformation failed\");\n }\n\n return {\n code: result.code,\n map: result.map,\n };\n },\n buildEnd(error) {\n if (modules.babel && hasBabelConfig) {\n okLog(\"Babel\");\n }\n },\n };\n}\n"],"names":[],"mappings":";;;;;;;AAcO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AACF,GAA+B;AAC7B,MAAI,iBAAiB;AAEd,SAAA;AAAA,IACL,MAAM;AAAA,IACN,MAAM,aAAa;AACjB,uBAAiB,MAAM,gBAAgB,KAAK,WAAW,WAAW;AAC9D,UAAA,QAAQ,SAAS,CAAC,gBAAgB;AAC/B,aAAA;AAAA,UACH;AAAA,QACF;AAAA,MACS,WAAA,CAAC,QAAQ,SAAS,gBAAgB;AACtC,aAAA;AAAA,UACH,IAAI;AAAA,YACF;AAAA,UAAA;AAAA,QAEJ;AAAA,MAAA;AAAA,IAEJ;AAAA,IACA,MAAM,UAAU,MAAM,IAAI;AACxB,UAAI,CAAC,QAAQ,SAAS,CAAC,gBAAgB;AAC9B,eAAA;AAAA,MAAA;AAGH,YAAA,UAAU,KAAK,QAAQ,EAAE;AAC/B,UAAI,CAAC,CAAC,OAAO,KAAK,EAAE,SAAS,OAAO,GAAG;AAC9B,eAAA;AAAA,MAAA;AAGH,YAAA,MAAM,KAAK,qBAAqB;AAEtC,YAAM,SAAS,MAAM,QAAQ,MAAM,eAAe,MAAM;AAAA,QACtD,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,gBAAgB;AAAA,MAAA,CACjB;AAEG,UAAA,EAAC,iCAAQ,OAAM;AACX,cAAA,IAAI,MAAM,6BAA6B;AAAA,MAAA;AAGxC,aAAA;AAAA,QACL,MAAM,OAAO;AAAA,QACb,KAAK,OAAO;AAAA,MACd;AAAA,IACF;AAAA,IACA,SAAS,OAAO;AACV,UAAA,QAAQ,SAAS,gBAAgB;AACnC,cAAM,OAAO;AAAA,MAAA;AAAA,IACf;AAAA,EAEJ;AACF;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../../../../src/plugins/babel/index.ts"],"sourcesContent":["import type { Plugin } from \"vite\";\nimport * as path from \"node:path\";\nimport { findBabelConfig } from \"./findBabelConfig.js\";\nimport { type PackageJson } from \"../../packageJson.js\";\nimport { type Dirs } from \"../../resolveDirs.js\";\nimport { type DetectedModules } from \"../../detectModules.js\";\nimport { okLog } from \"../../log.js\";\n\ntype BabelPluginOptions = {\n packageJson: PackageJson;\n dirs: Dirs;\n modules: DetectedModules;\n};\n\nexport function babelPlugin({\n packageJson,\n dirs,\n modules,\n}: BabelPluginOptions): Plugin {\n let hasBabelConfig = false;\n\n return {\n name: \"smartbundle:babel\",\n async buildStart() {\n hasBabelConfig = await findBabelConfig(dirs.sourceDir, packageJson);\n if (modules.babel && !hasBabelConfig) {\n this.warn(\n \"We have found a @babel/core package, but config was not found. It could be a bug\",\n );\n } else if (!modules.babel && hasBabelConfig) {\n this.error(\n new Error(\n \"We have found a babel config. Please install @babel/core to devDeps or remove the config file\",\n ),\n );\n }\n },\n async transform(code, id) {\n if (!modules.babel || !hasBabelConfig) {\n return null;\n }\n\n const extname = path.extname(id);\n if (![\".js\", \".ts\"].includes(extname)) {\n return null;\n }\n\n const map = this.getCombinedSourcemap();\n\n const result = await modules.babel.babel.transformAsync(code, {\n filename: id,\n sourceMaps: true,\n inputSourceMap: map,\n });\n\n if (!result?.code) {\n throw new Error(\"Babel transformation failed\");\n }\n\n return {\n code: result.code,\n map: result.map,\n };\n },\n buildEnd(error) {\n if (modules.babel && hasBabelConfig) {\n okLog(\"Babel\");\n }\n },\n };\n}\n"],"names":[],"mappings":";;;;;;;AAcO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AACF,GAA+B;AAC7B,MAAI,iBAAiB;AAEd,SAAA;AAAA,IACL,MAAM;AAAA,IACN,MAAM,aAAa;AACjB,uBAAiB,MAAM,gBAAgB,KAAK,WAAW,WAAW;AAC9D,UAAA,QAAQ,SAAS,CAAC,gBAAgB;AAC/B,aAAA;AAAA,UACH;AAAA,QACF;AAAA,MACS,WAAA,CAAC,QAAQ,SAAS,gBAAgB;AACtC,aAAA;AAAA,UACH,IAAI;AAAA,YACF;AAAA,UAAA;AAAA,QAEJ;AAAA,MAAA;AAAA,IAEJ;AAAA,IACA,MAAM,UAAU,MAAM,IAAI;AACxB,UAAI,CAAC,QAAQ,SAAS,CAAC,gBAAgB;AAC9B,eAAA;AAAA,MAAA;AAGH,YAAA,UAAU,KAAK,QAAQ,EAAE;AAC/B,UAAI,CAAC,CAAC,OAAO,KAAK,EAAE,SAAS,OAAO,GAAG;AAC9B,eAAA;AAAA,MAAA;AAGH,YAAA,MAAM,KAAK,qBAAqB;AAEtC,YAAM,SAAS,MAAM,QAAQ,MAAM,MAAM,eAAe,MAAM;AAAA,QAC5D,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,gBAAgB;AAAA,MAAA,CACjB;AAEG,UAAA,EAAC,iCAAQ,OAAM;AACX,cAAA,IAAI,MAAM,6BAA6B;AAAA,MAAA;AAGxC,aAAA;AAAA,QACL,MAAM,OAAO;AAAA,QACb,KAAK,OAAO;AAAA,MACd;AAAA,IACF;AAAA,IACA,SAAS,OAAO;AACV,UAAA,QAAQ,SAAS,gBAAgB;AACnC,cAAM,OAAO;AAAA,MAAA;AAAA,IACf;AAAA,EAEJ;AACF;"}