monocrate 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/dist/collect-package-locations.d.ts +7 -43
  2. package/dist/collect-package-locations.d.ts.map +1 -1
  3. package/dist/collect-package-locations.js +23 -19
  4. package/dist/collect-package-locations.js.map +1 -1
  5. package/dist/compute-package-closure.d.ts +2 -1
  6. package/dist/compute-package-closure.d.ts.map +1 -1
  7. package/dist/compute-package-closure.js +37 -12
  8. package/dist/compute-package-closure.js.map +1 -1
  9. package/dist/file-copier.d.ts +4 -4
  10. package/dist/file-copier.d.ts.map +1 -1
  11. package/dist/file-copier.js +5 -6
  12. package/dist/file-copier.js.map +1 -1
  13. package/dist/get-files-to-pack.d.ts +3 -1
  14. package/dist/get-files-to-pack.d.ts.map +1 -1
  15. package/dist/get-files-to-pack.js +7 -33
  16. package/dist/get-files-to-pack.js.map +1 -1
  17. package/dist/import-rewriter.d.ts +4 -4
  18. package/dist/import-rewriter.d.ts.map +1 -1
  19. package/dist/import-rewriter.js +5 -7
  20. package/dist/import-rewriter.js.map +1 -1
  21. package/dist/index.d.ts +1 -1
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js.map +1 -1
  24. package/dist/mirror-sources.d.ts +11 -0
  25. package/dist/mirror-sources.d.ts.map +1 -0
  26. package/dist/mirror-sources.js +90 -0
  27. package/dist/mirror-sources.js.map +1 -0
  28. package/dist/monocrate-cli.d.ts.map +1 -1
  29. package/dist/monocrate-cli.js +74 -38
  30. package/dist/monocrate-cli.js.map +1 -1
  31. package/dist/monocrate-options.d.ts +67 -0
  32. package/dist/monocrate-options.d.ts.map +1 -0
  33. package/dist/monocrate-options.js +2 -0
  34. package/dist/monocrate-options.js.map +1 -0
  35. package/dist/monocrate-result.d.ts +18 -0
  36. package/dist/monocrate-result.d.ts.map +1 -0
  37. package/dist/monocrate-result.js +2 -0
  38. package/dist/monocrate-result.js.map +1 -0
  39. package/dist/monocrate.d.ts +6 -32
  40. package/dist/monocrate.d.ts.map +1 -1
  41. package/dist/monocrate.js +64 -18
  42. package/dist/monocrate.js.map +1 -1
  43. package/dist/name-mangler.d.ts +2 -0
  44. package/dist/name-mangler.d.ts.map +1 -0
  45. package/dist/name-mangler.js +4 -0
  46. package/dist/name-mangler.js.map +1 -0
  47. package/dist/npm-client.d.ts +29 -0
  48. package/dist/npm-client.d.ts.map +1 -0
  49. package/dist/npm-client.js +83 -0
  50. package/dist/npm-client.js.map +1 -0
  51. package/dist/package-assembler.d.ts +16 -0
  52. package/dist/package-assembler.d.ts.map +1 -0
  53. package/dist/package-assembler.js +52 -0
  54. package/dist/package-assembler.js.map +1 -0
  55. package/dist/package-closure.d.ts +1 -1
  56. package/dist/package-closure.d.ts.map +1 -1
  57. package/dist/{package-map.d.ts → package-location.d.ts} +9 -10
  58. package/dist/package-location.d.ts.map +1 -0
  59. package/dist/package-location.js +2 -0
  60. package/dist/package-location.js.map +1 -0
  61. package/dist/paths.d.ts +37 -0
  62. package/dist/paths.d.ts.map +1 -0
  63. package/dist/paths.js +59 -0
  64. package/dist/paths.js.map +1 -0
  65. package/dist/publish.d.ts +3 -1
  66. package/dist/publish.d.ts.map +1 -1
  67. package/dist/publish.js +2 -6
  68. package/dist/publish.js.map +1 -1
  69. package/dist/repo-explorer.d.ts +23 -0
  70. package/dist/repo-explorer.d.ts.map +1 -0
  71. package/dist/repo-explorer.js +121 -0
  72. package/dist/repo-explorer.js.map +1 -0
  73. package/dist/resolve-version.d.ts +4 -1
  74. package/dist/resolve-version.d.ts.map +1 -1
  75. package/dist/resolve-version.js +31 -33
  76. package/dist/resolve-version.js.map +1 -1
  77. package/dist/rewrite-package-json.d.ts +2 -1
  78. package/dist/rewrite-package-json.d.ts.map +1 -1
  79. package/dist/rewrite-package-json.js.map +1 -1
  80. package/dist/run-npm.d.ts +36 -0
  81. package/dist/run-npm.d.ts.map +1 -0
  82. package/dist/run-npm.js +35 -0
  83. package/dist/run-npm.js.map +1 -0
  84. package/package.json +10 -3
  85. package/dist/assemble.d.ts +0 -4
  86. package/dist/assemble.d.ts.map +0 -1
  87. package/dist/assemble.js +0 -21
  88. package/dist/assemble.js.map +0 -1
  89. package/dist/monorepo.d.ts +0 -9
  90. package/dist/monorepo.d.ts.map +0 -1
  91. package/dist/monorepo.js +0 -82
  92. package/dist/monorepo.js.map +0 -1
  93. package/dist/package-map.d.ts.map +0 -1
  94. package/dist/package-map.js +0 -2
  95. package/dist/package-map.js.map +0 -1
@@ -1,48 +1,12 @@
1
- import type { PackageLocation } from './package-map.js';
1
+ import type { PackageLocation } from './package-location.js';
2
2
  import type { PackageClosure } from './package-closure.js';
3
+ import { AbsolutePath } from './paths.js';
4
+ import type { PackageJson } from './package-json.js';
5
+ import type { NpmClient } from './npm-client.js';
3
6
  /**
4
- * Resolves an import specifier to a file path using Node.js resolution semantics.
7
+ * Resolves an import specifier to a package-relative path using Node.js resolution semantics.
5
8
  * Handles both bare imports (subpath='') and subpath imports (subpath='utils/helper').
6
9
  */
7
- export declare function resolveImport(location: PackageLocation, subpath: string): string;
8
- export declare function collectPackageLocations(closure: PackageClosure, monorepoRoot: string): Promise<{
9
- name: string;
10
- packageDir: string;
11
- outputPrefix: string;
12
- filesToCopy: string[];
13
- packageJson: {
14
- [x: string]: unknown;
15
- name: string;
16
- version?: string | undefined;
17
- main?: string | undefined;
18
- source?: string | undefined;
19
- types?: string | undefined;
20
- dependencies?: Partial<Record<string, string>> | undefined;
21
- devDependencies?: Partial<Record<string, string>> | undefined;
22
- peerDependencies?: Partial<Record<string, string>> | undefined;
23
- description?: string | undefined;
24
- keywords?: string[] | undefined;
25
- author?: string | {
26
- name: string;
27
- email?: string | undefined;
28
- } | undefined;
29
- license?: string | undefined;
30
- repository?: string | {
31
- type: string;
32
- url: string;
33
- } | undefined;
34
- homepage?: string | undefined;
35
- bugs?: string | {
36
- url?: string | undefined;
37
- email?: string | undefined;
38
- } | undefined;
39
- engines?: Partial<Record<string, string>> | undefined;
40
- bin?: string | Partial<Record<string, string>> | undefined;
41
- type?: "module" | "commonjs" | undefined;
42
- workspaces?: string[] | {
43
- packages: string[];
44
- } | undefined;
45
- files?: string[] | undefined;
46
- };
47
- }[]>;
10
+ export declare function resolveImport(packageJson: PackageJson, subpath: string): string;
11
+ export declare function collectPackageLocations(npmClient: NpmClient, closure: PackageClosure, outputDir: AbsolutePath): Promise<PackageLocation[]>;
48
12
  //# sourceMappingURL=collect-package-locations.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"collect-package-locations.d.ts","sourceRoot":"","sources":["../src/collect-package-locations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAI1D;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAyBhF;AAkBD,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAU1F"}
1
+ {"version":3,"file":"collect-package-locations.d.ts","sourceRoot":"","sources":["../src/collect-package-locations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAG1D,OAAO,EAAE,YAAY,EAAgB,MAAM,YAAY,CAAA;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAEhD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAwB/E;AAwBD,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,YAAY,GACtB,OAAO,CAAC,eAAe,EAAE,CAAC,CAa5B"}
@@ -1,14 +1,15 @@
1
- import * as path from 'node:path';
1
+ import * as fs from 'node:fs';
2
2
  import * as ResolveExports from 'resolve.exports';
3
3
  import { getFilesToPack } from './get-files-to-pack.js';
4
+ import { AbsolutePath, RelativePath } from './paths.js';
4
5
  /**
5
- * Resolves an import specifier to a file path using Node.js resolution semantics.
6
+ * Resolves an import specifier to a package-relative path using Node.js resolution semantics.
6
7
  * Handles both bare imports (subpath='') and subpath imports (subpath='utils/helper').
7
8
  */
8
- export function resolveImport(location, subpath) {
9
+ export function resolveImport(packageJson, subpath) {
9
10
  const entry = subpath === '' ? '.' : `./${subpath}`;
10
11
  // Try exports field resolution (resolve.exports only handles the exports field, not main)
11
- const resolved = ResolveExports.resolve(location.packageJson, entry);
12
+ const resolved = ResolveExports.resolve(packageJson, entry);
12
13
  if (resolved) {
13
14
  // The exports field can map to an array of fallback paths. Node.js tries them in order and uses
14
15
  // the first "processable" path (e.g., skips unsupported protocols), but does NOT fall back if the
@@ -16,34 +17,37 @@ export function resolveImport(location, subpath) {
16
17
  // See: https://nodejs.org/api/packages.html#package-entry-points
17
18
  const resolvedPath = Array.isArray(resolved) ? resolved[0] : resolved;
18
19
  if (resolvedPath !== undefined) {
19
- // The resolved path starts with './', remove it
20
- const cleanPath = resolvedPath.startsWith('./') ? resolvedPath.slice(2) : resolvedPath;
21
- return path.join(location.outputPrefix, cleanPath);
20
+ // If the resolved path starts with './', remove it
21
+ return resolvedPath.startsWith('./') ? resolvedPath.slice(2) : resolvedPath;
22
22
  }
23
23
  }
24
- // No exports field or no matching export
24
+ // Otherwise (no exports field or no matching export) -
25
25
  if (subpath === '') {
26
26
  // Bare import (e.g., import ... from '@myorg/pkg'): use main field, then index.js (Node.js default)
27
- return path.join(location.outputPrefix, location.packageJson.main ?? 'index.js');
27
+ return packageJson.main ?? 'index.js';
28
28
  }
29
29
  // Subpath import (e.g., import ... from '@myorg/pkg/utils/helper'): subpath relative to package root
30
- return path.join(location.outputPrefix, `${subpath}.js`);
30
+ return `${subpath}.js`;
31
31
  }
32
- async function createPackageLocation(pkg, outputPrefix) {
33
- const filesToCopy = await getFilesToPack(pkg.path);
32
+ async function createPackageLocation(npmClient, pkg, directoryInOutput) {
33
+ const filesToCopy = await getFilesToPack(npmClient, pkg.fromDir);
34
+ // Add .npmrc if it exists (npm pack doesn't include it since it's a config file)
35
+ const npmrcPath = AbsolutePath.join(pkg.fromDir, RelativePath('.npmrc'));
36
+ if (fs.existsSync(npmrcPath)) {
37
+ filesToCopy.push('.npmrc');
38
+ }
34
39
  return {
35
40
  name: pkg.name,
36
- packageDir: pkg.path,
37
- outputPrefix,
41
+ fromDir: pkg.fromDir,
42
+ toDir: directoryInOutput,
38
43
  filesToCopy,
39
44
  packageJson: pkg.packageJson,
40
45
  };
41
46
  }
42
- function computeDepOutputPrefix(dep, monorepoRoot) {
43
- return path.join('deps', path.relative(monorepoRoot, dep.path));
44
- }
45
- export async function collectPackageLocations(closure, monorepoRoot) {
47
+ export async function collectPackageLocations(npmClient, closure, outputDir) {
46
48
  // TODO(imaman): use promises()
47
- return Promise.all(closure.members.map((dep) => createPackageLocation(dep, dep.name === closure.subjectPackageName ? '' : computeDepOutputPrefix(dep, monorepoRoot))));
49
+ return Promise.all(closure.members.map((dep) => createPackageLocation(npmClient, dep, dep.name === closure.subjectPackageName
50
+ ? outputDir
51
+ : AbsolutePath.join(outputDir, RelativePath('deps'), dep.pathInRepo))));
48
52
  }
49
53
  //# sourceMappingURL=collect-package-locations.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"collect-package-locations.js","sourceRoot":"","sources":["../src/collect-package-locations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,KAAK,cAAc,MAAM,iBAAiB,CAAA;AAIjD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAEvD;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,QAAyB,EAAE,OAAe;IACtE,MAAM,KAAK,GAAG,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAA;IAEnD,0FAA0F;IAC1F,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;IACpE,IAAI,QAAQ,EAAE,CAAC;QACb,gGAAgG;QAChG,kGAAkG;QAClG,qEAAqE;QACrE,iEAAiE;QACjE,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;QACrE,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,gDAAgD;YAChD,MAAM,SAAS,GAAG,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAA;YACtF,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC,CAAA;QACpD,CAAC;IACH,CAAC;IAED,yCAAyC;IACzC,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;QACnB,oGAAoG;QACpG,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,UAAU,CAAC,CAAA;IAClF,CAAC;IACD,qGAAqG;IACrG,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,GAAG,OAAO,KAAK,CAAC,CAAA;AAC1D,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,GAAoB,EAAE,YAAoB;IAC7E,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAElD,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,UAAU,EAAE,GAAG,CAAC,IAAI;QACpB,YAAY;QACZ,WAAW;QACX,WAAW,EAAE,GAAG,CAAC,WAAW;KAC7B,CAAA;AACH,CAAC;AAED,SAAS,sBAAsB,CAAC,GAAoB,EAAE,YAAoB;IACxE,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;AACjE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,OAAuB,EAAE,YAAoB;IACzF,+BAA+B;IAC/B,OAAO,OAAO,CAAC,GAAG,CAChB,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAC1B,qBAAqB,CACnB,GAAG,EACH,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,sBAAsB,CAAC,GAAG,EAAE,YAAY,CAAC,CACzF,CACF,CACF,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"collect-package-locations.js","sourceRoot":"","sources":["../src/collect-package-locations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,KAAK,cAAc,MAAM,iBAAiB,CAAA;AAIjD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAIvD;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,WAAwB,EAAE,OAAe;IACrE,MAAM,KAAK,GAAG,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAA;IAEnD,0FAA0F;IAC1F,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;IAC3D,IAAI,QAAQ,EAAE,CAAC;QACb,gGAAgG;QAChG,kGAAkG;QAClG,qEAAqE;QACrE,iEAAiE;QACjE,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;QACrE,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,mDAAmD;YACnD,OAAO,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAA;QAC7E,CAAC;IACH,CAAC;IAED,uDAAuD;IACvD,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;QACnB,oGAAoG;QACpG,OAAO,WAAW,CAAC,IAAI,IAAI,UAAU,CAAA;IACvC,CAAC;IACD,qGAAqG;IACrG,OAAO,GAAG,OAAO,KAAK,CAAA;AACxB,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,SAAoB,EACpB,GAAoB,EACpB,iBAA+B;IAE/B,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;IAEhE,iFAAiF;IACjF,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAA;IACxE,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC5B,CAAC;IAED,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,KAAK,EAAE,iBAAiB;QACxB,WAAW;QACX,WAAW,EAAE,GAAG,CAAC,WAAW;KAC7B,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,SAAoB,EACpB,OAAuB,EACvB,SAAuB;IAEvB,+BAA+B;IAC/B,OAAO,OAAO,CAAC,GAAG,CAChB,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAC1B,qBAAqB,CACnB,SAAS,EACT,GAAG,EACH,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,kBAAkB;QACrC,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC,CACvE,CACF,CACF,CAAA;AACH,CAAC"}
@@ -1,3 +1,4 @@
1
+ import type { RepoExplorer } from './repo-explorer.js';
1
2
  import type { PackageClosure } from './package-closure.js';
2
- export declare function computePackageClosure(sourceDir: string, monorepoRoot: string): Promise<PackageClosure>;
3
+ export declare function computePackageClosure(pkgName: string, repoExplorer: RepoExplorer): PackageClosure;
3
4
  //# sourceMappingURL=compute-package-closure.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"compute-package-closure.d.ts","sourceRoot":"","sources":["../src/compute-package-closure.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAE1D,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAwC5G"}
1
+ {"version":3,"file":"compute-package-closure.d.ts","sourceRoot":"","sources":["../src/compute-package-closure.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAgC1D,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,GAAG,cAAc,CAiDjG"}
@@ -1,11 +1,25 @@
1
- import { discoverMonorepoPackages } from './monorepo.js';
2
- export async function computePackageClosure(sourceDir, monorepoRoot) {
3
- const allRepoPackages = await discoverMonorepoPackages(monorepoRoot);
4
- const subjectPackage = [...allRepoPackages.values()].find((at) => at.path === sourceDir);
5
- if (!subjectPackage) {
6
- throw new Error(`Could not find a monorepo package at ${sourceDir}`);
1
+ function detectVersionConflicts(versionsByDep) {
2
+ const conflicts = {};
3
+ for (const [depName, versionInfos] of versionsByDep.entries()) {
4
+ const uniqueVersions = [...new Set(versionInfos.map((v) => v.version))];
5
+ if (uniqueVersions.length > 1) {
6
+ conflicts[depName] = versionInfos.map((v) => `${v.version} (by ${v.requiredBy})`);
7
+ }
7
8
  }
8
- const allThirdPartyDeps = {};
9
+ return conflicts;
10
+ }
11
+ function formatConflictError(conflicts) {
12
+ const lines = ['Third-party dependency version conflicts detected:'];
13
+ for (const [depName, versions] of Object.entries(conflicts)) {
14
+ if (versions) {
15
+ lines.push(` - ${depName}: ${versions.join(', ')}`);
16
+ }
17
+ }
18
+ return lines.join('\n');
19
+ }
20
+ export function computePackageClosure(pkgName, repoExplorer) {
21
+ const subjectPackage = repoExplorer.getPackage(pkgName);
22
+ const versionsByDep = new Map();
9
23
  const visited = new Map();
10
24
  function collectDeps(pkg) {
11
25
  if (visited.has(pkg.name)) {
@@ -16,20 +30,31 @@ export async function computePackageClosure(sourceDir, monorepoRoot) {
16
30
  if (!depVersion) {
17
31
  throw new Error(`no version for dep ${depName} in ${pkg.name}`);
18
32
  }
19
- const depPackage = allRepoPackages.get(depName);
33
+ const depPackage = repoExplorer.lookupPackage(depName);
20
34
  if (depPackage) {
21
35
  // Is an in-repo dep
22
36
  collectDeps(depPackage);
23
37
  }
24
38
  else {
25
- if (!(depName in allThirdPartyDeps)) {
26
- // TODO(imaman): validate consistency of versions
27
- allThirdPartyDeps[depName] = depVersion;
28
- }
39
+ const existing = versionsByDep.get(depName) ?? [];
40
+ existing.push({ version: depVersion, requiredBy: pkg.name });
41
+ versionsByDep.set(depName, existing);
29
42
  }
30
43
  }
31
44
  }
32
45
  collectDeps(subjectPackage);
46
+ const conflicts = detectVersionConflicts(versionsByDep);
47
+ if (Object.keys(conflicts).length > 0) {
48
+ throw new Error(formatConflictError(conflicts));
49
+ }
50
+ const allThirdPartyDeps = {};
51
+ for (const [depName, versionInfos] of versionsByDep.entries()) {
52
+ const first = versionInfos[0];
53
+ if (!first) {
54
+ throw new Error(`Internal error: no version info for ${depName}`);
55
+ }
56
+ allThirdPartyDeps[depName] = first.version;
57
+ }
33
58
  return {
34
59
  subjectPackageName: subjectPackage.name,
35
60
  members: [...visited.values()],
@@ -1 +1 @@
1
- {"version":3,"file":"compute-package-closure.js","sourceRoot":"","sources":["../src/compute-package-closure.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAA;AAGxD,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,SAAiB,EAAE,YAAoB;IACjF,MAAM,eAAe,GAAG,MAAM,wBAAwB,CAAC,YAAY,CAAC,CAAA;IACpE,MAAM,cAAc,GAAG,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAA;IACxF,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,wCAAwC,SAAS,EAAE,CAAC,CAAA;IACtE,CAAC;IAED,MAAM,iBAAiB,GAAoC,EAAE,CAAA;IAC7D,MAAM,OAAO,GAAG,IAAI,GAAG,EAA2B,CAAA;IAElD,SAAS,WAAW,CAAC,GAAoB;QACvC,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,OAAM;QACR,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QAE1B,KAAK,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,CAAC;YACvF,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CAAC,sBAAsB,OAAO,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;YACjE,CAAC;YACD,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YAC/C,IAAI,UAAU,EAAE,CAAC;gBACf,oBAAoB;gBACpB,WAAW,CAAC,UAAU,CAAC,CAAA;YACzB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,CAAC,OAAO,IAAI,iBAAiB,CAAC,EAAE,CAAC;oBACpC,iDAAiD;oBACjD,iBAAiB,CAAC,OAAO,CAAC,GAAG,UAAU,CAAA;gBACzC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,WAAW,CAAC,cAAc,CAAC,CAAA;IAE3B,OAAO;QACL,kBAAkB,EAAE,cAAc,CAAC,IAAI;QACvC,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAC9B,iBAAiB;KAClB,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"compute-package-closure.js","sourceRoot":"","sources":["../src/compute-package-closure.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,9 @@
1
- import type { PackageMap } from './package-map.js';
1
+ import type { PackageMap } from './package-location.js';
2
+ import { AbsolutePath } from './paths.js';
2
3
  export declare class FileCopier {
3
4
  private packageMap;
4
- private outputDir;
5
- constructor(packageMap: PackageMap, outputDir: string);
6
- copy(): Promise<string[]>;
5
+ constructor(packageMap: PackageMap);
6
+ copy(): Promise<AbsolutePath[]>;
7
7
  private collectCopyOperations;
8
8
  }
9
9
  //# sourceMappingURL=file-copier.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-copier.d.ts","sourceRoot":"","sources":["../src/file-copier.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAOlD,qBAAa,UAAU;IAEnB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,SAAS;gBADT,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,MAAM;IAGrB,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAkB/B,OAAO,CAAC,qBAAqB;CAc9B"}
1
+ {"version":3,"file":"file-copier.d.ts","sourceRoot":"","sources":["../src/file-copier.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,YAAY,EAAgB,MAAM,YAAY,CAAA;AAOvD,qBAAa,UAAU;IACT,OAAO,CAAC,UAAU;gBAAV,UAAU,EAAE,UAAU;IAEpC,IAAI,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAkBrC,OAAO,CAAC,qBAAqB;CAc9B"}
@@ -1,11 +1,10 @@
1
1
  import * as fsPromises from 'node:fs/promises';
2
2
  import * as path from 'node:path';
3
+ import { AbsolutePath, RelativePath } from './paths.js';
3
4
  export class FileCopier {
4
5
  packageMap;
5
- outputDir;
6
- constructor(packageMap, outputDir) {
6
+ constructor(packageMap) {
7
7
  this.packageMap = packageMap;
8
- this.outputDir = outputDir;
9
8
  }
10
9
  async copy() {
11
10
  const operations = this.collectCopyOperations();
@@ -25,10 +24,10 @@ export class FileCopier {
25
24
  collectCopyOperations() {
26
25
  const operations = [];
27
26
  for (const location of this.packageMap.values()) {
28
- for (const filePath of location.filesToCopy) {
27
+ for (const at of location.filesToCopy) {
29
28
  operations.push({
30
- source: path.join(location.packageDir, filePath),
31
- destination: path.join(this.outputDir, location.outputPrefix, filePath),
29
+ source: AbsolutePath.join(location.fromDir, RelativePath(at)),
30
+ destination: AbsolutePath.join(location.toDir, RelativePath(at)),
32
31
  });
33
32
  }
34
33
  }
@@ -1 +1 @@
1
- {"version":3,"file":"file-copier.js","sourceRoot":"","sources":["../src/file-copier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAA;AAC9C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAQjC,MAAM,OAAO,UAAU;IAEX;IACA;IAFV,YACU,UAAsB,EACtB,SAAiB;QADjB,eAAU,GAAV,UAAU,CAAY;QACtB,cAAS,GAAT,SAAS,CAAQ;IACxB,CAAC;IAEJ,KAAK,CAAC,IAAI;QACR,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAA;QAE/C,iDAAiD;QACjD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;QACjF,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,MAAM,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAClD,CAAC;QAED,0BAA0B;QAC1B,MAAM,WAAW,GAAa,EAAE,CAAA;QAChC,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;YAC5B,MAAM,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,CAAA;YACpD,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,CAAA;QAClC,CAAC;QACD,OAAO,WAAW,CAAA;IACpB,CAAC;IAEO,qBAAqB;QAC3B,MAAM,UAAU,GAAoB,EAAE,CAAA;QAEtC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;YAChD,KAAK,MAAM,QAAQ,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;gBAC5C,UAAU,CAAC,IAAI,CAAC;oBACd,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC;oBAChD,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC;iBACxE,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAA;IACnB,CAAC;CACF"}
1
+ {"version":3,"file":"file-copier.js","sourceRoot":"","sources":["../src/file-copier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAA;AAC9C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAEjC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAOvD,MAAM,OAAO,UAAU;IACD;IAApB,YAAoB,UAAsB;QAAtB,eAAU,GAAV,UAAU,CAAY;IAAG,CAAC;IAE9C,KAAK,CAAC,IAAI;QACR,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAA;QAE/C,iDAAiD;QACjD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;QACjF,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,MAAM,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAClD,CAAC;QAED,0BAA0B;QAC1B,MAAM,WAAW,GAAmB,EAAE,CAAA;QACtC,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;YAC5B,MAAM,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,CAAA;YACpD,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,CAAA;QAClC,CAAC;QACD,OAAO,WAAW,CAAA;IACpB,CAAC;IAEO,qBAAqB;QAC3B,MAAM,UAAU,GAAoB,EAAE,CAAA;QAEtC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;YAChD,KAAK,MAAM,EAAE,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;gBACtC,UAAU,CAAC,IAAI,CAAC;oBACd,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC;oBAC7D,WAAW,EAAE,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC;iBACjE,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAA;IACnB,CAAC;CACF"}
@@ -1,3 +1,5 @@
1
+ import type { AbsolutePath } from './paths.js';
2
+ import type { NpmClient } from './npm-client.js';
1
3
  /**
2
4
  * Gets the list of files that npm would include in a package tarball.
3
5
  * Uses `npm pack --dry-run --json` to get npm's exact file selection.
@@ -6,5 +8,5 @@
6
8
  * @returns Array of relative file paths that npm would include
7
9
  * @example getFilesToPack("/home/user/my-package") => ["dist/index.js", "README.md", "package.json"]
8
10
  */
9
- export declare function getFilesToPack(packageDir: string): Promise<string[]>;
11
+ export declare function getFilesToPack(npmClient: NpmClient, packageDir: AbsolutePath): Promise<string[]>;
10
12
  //# sourceMappingURL=get-files-to-pack.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-files-to-pack.d.ts","sourceRoot":"","sources":["../src/get-files-to-pack.ts"],"names":[],"mappings":"AAsBA;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAyB1E"}
1
+ {"version":3,"file":"get-files-to-pack.d.ts","sourceRoot":"","sources":["../src/get-files-to-pack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAEhD;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAYtG"}
@@ -1,19 +1,3 @@
1
- import { exec } from 'node:child_process';
2
- import { promisify } from 'node:util';
3
- import { z } from 'zod';
4
- const execAsync = promisify(exec);
5
- const NpmPackFile = z.object({
6
- path: z.string(),
7
- });
8
- const NpmPackResult = z.object({
9
- files: z.array(NpmPackFile),
10
- });
11
- const NpmPackOutput = z.array(NpmPackResult);
12
- const NpmPackError = z.object({
13
- error: z.object({
14
- summary: z.string(),
15
- }),
16
- });
17
1
  /**
18
2
  * Gets the list of files that npm would include in a package tarball.
19
3
  * Uses `npm pack --dry-run --json` to get npm's exact file selection.
@@ -22,25 +6,15 @@ const NpmPackError = z.object({
22
6
  * @returns Array of relative file paths that npm would include
23
7
  * @example getFilesToPack("/home/user/my-package") => ["dist/index.js", "README.md", "package.json"]
24
8
  */
25
- export async function getFilesToPack(packageDir) {
26
- const { stdout } = await execAsync('npm pack --dry-run --json', {
27
- cwd: packageDir,
28
- encoding: 'utf-8',
29
- });
30
- const json = JSON.parse(stdout);
31
- // Check if npm returned an error
32
- const errorResult = NpmPackError.safeParse(json);
33
- if (errorResult.success) {
34
- throw new Error(`npm pack failed: ${errorResult.data.error.summary}`);
9
+ export async function getFilesToPack(npmClient, packageDir) {
10
+ const o = await npmClient.pack(packageDir, { dryRun: true });
11
+ if (o.length !== 1) {
12
+ throw new Error(`Expected npm pack to return a single element array`);
35
13
  }
36
- const parsed = NpmPackOutput.safeParse(json);
37
- if (!parsed.success) {
38
- throw new Error(`Failed to parse npm pack output: ${parsed.error.message}`);
39
- }
40
- const packOutput = parsed.data[0];
41
- if (packOutput === undefined) {
14
+ const at0 = o.at(0);
15
+ if (at0 === undefined) {
42
16
  throw new Error('npm pack returned empty output');
43
17
  }
44
- return packOutput.files.map((f) => f.path);
18
+ return at0.files.map((f) => f.path);
45
19
  }
46
20
  //# sourceMappingURL=get-files-to-pack.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-files-to-pack.js","sourceRoot":"","sources":["../src/get-files-to-pack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;AAEjC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;CACjB,CAAC,CAAA;AAEF,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7B,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC;CAC5B,CAAC,CAAA;AAEF,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;AAE5C,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;KACpB,CAAC;CACH,CAAC,CAAA;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,UAAkB;IACrD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,2BAA2B,EAAE;QAC9D,GAAG,EAAE,UAAU;QACf,QAAQ,EAAE,OAAO;KAClB,CAAC,CAAA;IAEF,MAAM,IAAI,GAAY,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IAExC,iCAAiC;IACjC,MAAM,WAAW,GAAG,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;IAChD,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,oBAAoB,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;IACvE,CAAC;IAED,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;IAC5C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,oCAAoC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;IAC7E,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;IACnD,CAAC;IAED,OAAO,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;AAC5C,CAAC"}
1
+ {"version":3,"file":"get-files-to-pack.js","sourceRoot":"","sources":["../src/get-files-to-pack.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,SAAoB,EAAE,UAAwB;IACjF,MAAM,CAAC,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;IAC5D,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAA;IACvE,CAAC;IAED,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IACnB,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;IACnD,CAAC;IAED,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;AACrC,CAAC"}
@@ -1,9 +1,9 @@
1
- import type { PackageMap } from './package-map.js';
1
+ import type { PackageMap } from './package-location.js';
2
+ import { AbsolutePath } from './paths.js';
2
3
  export declare class ImportRewriter {
3
4
  private packageMap;
4
- private outputDir;
5
- constructor(packageMap: PackageMap, outputDir: string);
6
- rewriteAll(files: string[]): Promise<void>;
5
+ constructor(packageMap: PackageMap);
6
+ rewriteAll(files: AbsolutePath[]): Promise<void>;
7
7
  private rewriteFile;
8
8
  private computeNewSpecifier;
9
9
  private extractPackageName;
@@ -1 +1 @@
1
- {"version":3,"file":"import-rewriter.d.ts","sourceRoot":"","sources":["../src/import-rewriter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAGlD,qBAAa,cAAc;IAEvB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,SAAS;gBADT,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,MAAM;IAGrB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YAOlC,WAAW;IAqDzB,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,mBAAmB;CAQ5B"}
1
+ {"version":3,"file":"import-rewriter.d.ts","sourceRoot":"","sources":["../src/import-rewriter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAEvD,OAAO,EAAE,YAAY,EAAgB,MAAM,YAAY,CAAA;AAEvD,qBAAa,cAAc;IACb,OAAO,CAAC,UAAU;gBAAV,UAAU,EAAE,UAAU;IAEpC,UAAU,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YAOxC,WAAW;IAqDzB,OAAO,CAAC,mBAAmB;IAc3B,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,mBAAmB;CAO5B"}
@@ -1,12 +1,11 @@
1
1
  import * as path from 'node:path';
2
2
  import { Project, SyntaxKind } from 'ts-morph';
3
3
  import { resolveImport } from './collect-package-locations.js';
4
+ import { AbsolutePath, RelativePath } from './paths.js';
4
5
  export class ImportRewriter {
5
6
  packageMap;
6
- outputDir;
7
- constructor(packageMap, outputDir) {
7
+ constructor(packageMap) {
8
8
  this.packageMap = packageMap;
9
- this.outputDir = outputDir;
10
9
  }
11
10
  async rewriteAll(files) {
12
11
  const jsAndDtsFiles = files.filter((f) => f.endsWith('.js') || f.endsWith('.d.ts'));
@@ -67,16 +66,15 @@ export class ImportRewriter {
67
66
  if (!importeeLocation) {
68
67
  return undefined;
69
68
  }
70
- const pathAtImportee = resolveImport(importeeLocation, subPath);
71
- return this.computeRelativePath(pathToImporter, pathAtImportee);
69
+ const pathAtImportee = resolveImport(importeeLocation.packageJson, subPath);
70
+ return this.computeRelativePath(pathToImporter, AbsolutePath.join(importeeLocation.toDir, RelativePath(pathAtImportee)));
72
71
  }
73
72
  extractPackageName(specifier) {
74
73
  const parts = specifier.split('/');
75
74
  const cutoff = specifier.startsWith('@') ? 2 : 1;
76
75
  return { packageName: parts.slice(0, cutoff).join('/'), subPath: parts.slice(cutoff).join('/') };
77
76
  }
78
- computeRelativePath(importerPath, importeePath) {
79
- const absoluteImporteePath = path.join(this.outputDir, importeePath);
77
+ computeRelativePath(importerPath, absoluteImporteePath) {
80
78
  let relative = path.relative(path.dirname(importerPath), absoluteImporteePath);
81
79
  if (!relative.startsWith('.')) {
82
80
  relative = './' + relative;
@@ -1 +1 @@
1
- {"version":3,"file":"import-rewriter.js","sourceRoot":"","sources":["../src/import-rewriter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"import-rewriter.js","sourceRoot":"","sources":["../src/import-rewriter.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export { monocrate, type MonocrateOptions } from './monocrate.js';
1
+ export { monocrate, type MonocrateOptions, type MonocrateResult } from './monocrate.js';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAA"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAyB,MAAM,gBAAgB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA+C,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,11 @@
1
+ import type { MonorepoPackage } from './repo-explorer.js';
2
+ import { AbsolutePath } from './paths.js';
3
+ /**
4
+ * Mirrors source code of packages to a target directory.
5
+ * Each package's files are copied preserving the path structure relative to the monorepo root.
6
+ * Only committed files (from HEAD) are copied.
7
+ * Throws if any package has untracked files.
8
+ * Each package's target directory is wiped before copying.
9
+ */
10
+ export declare function mirrorSources(packages: MonorepoPackage[], mirrorDir: AbsolutePath): Promise<void>;
11
+ //# sourceMappingURL=mirror-sources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mirror-sources.d.ts","sourceRoot":"","sources":["../src/mirror-sources.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,YAAY,EAAgB,MAAM,YAAY,CAAA;AA2EvD;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,eAAe,EAAE,EAAE,SAAS,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBvG"}
@@ -0,0 +1,90 @@
1
+ import { execSync } from 'node:child_process';
2
+ import * as fs from 'node:fs';
3
+ import * as fsPromises from 'node:fs/promises';
4
+ import * as path from 'node:path';
5
+ import { AbsolutePath, RelativePath } from './paths.js';
6
+ /**
7
+ * Lists files in a directory that are committed in git (not just staged).
8
+ * Uses `git ls-tree` to get only files from HEAD.
9
+ * Throws if there are any untracked files.
10
+ */
11
+ function listCommittedFiles(packageDir) {
12
+ // Check for untracked files (not gitignored)
13
+ const untrackedOutput = execSync('git ls-files --others --exclude-standard', {
14
+ cwd: packageDir,
15
+ encoding: 'utf-8',
16
+ });
17
+ const untrackedFiles = untrackedOutput
18
+ .split('\n')
19
+ .map((line) => line.trim())
20
+ .filter((line) => line.length > 0);
21
+ if (untrackedFiles.length > 0) {
22
+ throw new Error(`Cannot mirror: found ${String(untrackedFiles.length)} untracked file(s) in ${packageDir}. ` +
23
+ `First few: ${untrackedFiles.slice(0, 3).join(', ')}. ` +
24
+ `Commit or gitignore them before mirroring.`);
25
+ }
26
+ // Get only committed files from HEAD
27
+ // -r: recursive
28
+ // --name-only: show only file names
29
+ const output = execSync('git ls-tree -r --name-only HEAD', {
30
+ cwd: packageDir,
31
+ encoding: 'utf-8',
32
+ });
33
+ return output
34
+ .split('\n')
35
+ .map((line) => line.trim())
36
+ .filter((line) => line.length > 0)
37
+ .map((line) => RelativePath(line));
38
+ }
39
+ function collectCopyOperations(packages, mirrorDir) {
40
+ const operations = [];
41
+ for (const pkg of packages) {
42
+ const targetDir = AbsolutePath.join(mirrorDir, pkg.pathInRepo);
43
+ const files = listCommittedFiles(pkg.fromDir);
44
+ for (const relativePath of files) {
45
+ const sourceFile = AbsolutePath.join(pkg.fromDir, relativePath);
46
+ if (!fs.existsSync(sourceFile)) {
47
+ throw new Error(`Source file does not exist: ${sourceFile}`);
48
+ }
49
+ const stat = fs.statSync(sourceFile);
50
+ if (stat.isDirectory()) {
51
+ throw new Error(`git ls-files returned a directory, which is unexpected: ${sourceFile}`);
52
+ }
53
+ operations.push({
54
+ source: sourceFile,
55
+ destination: AbsolutePath.join(targetDir, relativePath),
56
+ });
57
+ }
58
+ }
59
+ return operations;
60
+ }
61
+ /**
62
+ * Mirrors source code of packages to a target directory.
63
+ * Each package's files are copied preserving the path structure relative to the monorepo root.
64
+ * Only committed files (from HEAD) are copied.
65
+ * Throws if any package has untracked files.
66
+ * Each package's target directory is wiped before copying.
67
+ */
68
+ export async function mirrorSources(packages, mirrorDir) {
69
+ // TODO(imaman): can we dedup with file-copier.ts?
70
+ // Phase 1: Wipe target directories for each package
71
+ for (const pkg of packages) {
72
+ const targetDir = AbsolutePath.join(mirrorDir, pkg.pathInRepo);
73
+ if (fs.existsSync(targetDir)) {
74
+ await fsPromises.rm(targetDir, { recursive: true });
75
+ }
76
+ }
77
+ // Phase 2: Collect all copy operations
78
+ const operations = collectCopyOperations(packages, mirrorDir);
79
+ // Phase 3: Create all unique directories
80
+ const directories = new Set(operations.map((op) => path.dirname(op.destination)));
81
+ for (const dir of directories) {
82
+ await fsPromises.mkdir(dir, { recursive: true });
83
+ }
84
+ // TODO(imaman): make the loop run concurrently (with some controlled concurrency).
85
+ // Phase 4: Copy all files
86
+ for (const op of operations) {
87
+ await fsPromises.copyFile(op.source, op.destination);
88
+ }
89
+ }
90
+ //# sourceMappingURL=mirror-sources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mirror-sources.js","sourceRoot":"","sources":["../src/mirror-sources.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"monocrate-cli.d.ts","sourceRoot":"","sources":["../src/monocrate-cli.ts"],"names":[],"mappings":"AA4CA,wBAAgB,YAAY,IAAI,IAAI,CAKnC"}
1
+ {"version":3,"file":"monocrate-cli.d.ts","sourceRoot":"","sources":["../src/monocrate-cli.ts"],"names":[],"mappings":"AA+DA,wBAAgB,YAAY,IAAI,IAAI,CAgDnC"}