monocrate 0.4.0 → 0.6.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 (96) hide show
  1. package/README.md +72 -149
  2. package/dist/collect-package-locations.d.ts +7 -43
  3. package/dist/collect-package-locations.d.ts.map +1 -1
  4. package/dist/collect-package-locations.js +23 -19
  5. package/dist/collect-package-locations.js.map +1 -1
  6. package/dist/compute-package-closure.d.ts +2 -1
  7. package/dist/compute-package-closure.d.ts.map +1 -1
  8. package/dist/compute-package-closure.js +37 -12
  9. package/dist/compute-package-closure.js.map +1 -1
  10. package/dist/file-copier.d.ts +4 -4
  11. package/dist/file-copier.d.ts.map +1 -1
  12. package/dist/file-copier.js +5 -6
  13. package/dist/file-copier.js.map +1 -1
  14. package/dist/get-files-to-pack.d.ts +3 -1
  15. package/dist/get-files-to-pack.d.ts.map +1 -1
  16. package/dist/get-files-to-pack.js +7 -33
  17. package/dist/get-files-to-pack.js.map +1 -1
  18. package/dist/import-rewriter.d.ts +4 -4
  19. package/dist/import-rewriter.d.ts.map +1 -1
  20. package/dist/import-rewriter.js +5 -7
  21. package/dist/import-rewriter.js.map +1 -1
  22. package/dist/index.d.ts +1 -1
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js.map +1 -1
  25. package/dist/mirror-sources.d.ts +11 -0
  26. package/dist/mirror-sources.d.ts.map +1 -0
  27. package/dist/mirror-sources.js +90 -0
  28. package/dist/mirror-sources.js.map +1 -0
  29. package/dist/monocrate-cli.d.ts.map +1 -1
  30. package/dist/monocrate-cli.js +74 -38
  31. package/dist/monocrate-cli.js.map +1 -1
  32. package/dist/monocrate-options.d.ts +67 -0
  33. package/dist/monocrate-options.d.ts.map +1 -0
  34. package/dist/monocrate-options.js +2 -0
  35. package/dist/monocrate-options.js.map +1 -0
  36. package/dist/monocrate-result.d.ts +18 -0
  37. package/dist/monocrate-result.d.ts.map +1 -0
  38. package/dist/monocrate-result.js +2 -0
  39. package/dist/monocrate-result.js.map +1 -0
  40. package/dist/monocrate.d.ts +6 -32
  41. package/dist/monocrate.d.ts.map +1 -1
  42. package/dist/monocrate.js +64 -18
  43. package/dist/monocrate.js.map +1 -1
  44. package/dist/name-mangler.d.ts +2 -0
  45. package/dist/name-mangler.d.ts.map +1 -0
  46. package/dist/name-mangler.js +4 -0
  47. package/dist/name-mangler.js.map +1 -0
  48. package/dist/npm-client.d.ts +29 -0
  49. package/dist/npm-client.d.ts.map +1 -0
  50. package/dist/npm-client.js +83 -0
  51. package/dist/npm-client.js.map +1 -0
  52. package/dist/package-assembler.d.ts +16 -0
  53. package/dist/package-assembler.d.ts.map +1 -0
  54. package/dist/package-assembler.js +52 -0
  55. package/dist/package-assembler.js.map +1 -0
  56. package/dist/package-closure.d.ts +1 -1
  57. package/dist/package-closure.d.ts.map +1 -1
  58. package/dist/{package-map.d.ts → package-location.d.ts} +9 -10
  59. package/dist/package-location.d.ts.map +1 -0
  60. package/dist/package-location.js +2 -0
  61. package/dist/package-location.js.map +1 -0
  62. package/dist/paths.d.ts +37 -0
  63. package/dist/paths.d.ts.map +1 -0
  64. package/dist/paths.js +59 -0
  65. package/dist/paths.js.map +1 -0
  66. package/dist/publish.d.ts +3 -1
  67. package/dist/publish.d.ts.map +1 -1
  68. package/dist/publish.js +2 -6
  69. package/dist/publish.js.map +1 -1
  70. package/dist/repo-explorer.d.ts +23 -0
  71. package/dist/repo-explorer.d.ts.map +1 -0
  72. package/dist/repo-explorer.js +121 -0
  73. package/dist/repo-explorer.js.map +1 -0
  74. package/dist/resolve-version.d.ts +4 -1
  75. package/dist/resolve-version.d.ts.map +1 -1
  76. package/dist/resolve-version.js +31 -33
  77. package/dist/resolve-version.js.map +1 -1
  78. package/dist/rewrite-package-json.d.ts +2 -1
  79. package/dist/rewrite-package-json.d.ts.map +1 -1
  80. package/dist/rewrite-package-json.js.map +1 -1
  81. package/dist/run-npm.d.ts +36 -0
  82. package/dist/run-npm.d.ts.map +1 -0
  83. package/dist/run-npm.js +35 -0
  84. package/dist/run-npm.js.map +1 -0
  85. package/package.json +10 -3
  86. package/dist/assemble.d.ts +0 -4
  87. package/dist/assemble.d.ts.map +0 -1
  88. package/dist/assemble.js +0 -21
  89. package/dist/assemble.js.map +0 -1
  90. package/dist/monorepo.d.ts +0 -9
  91. package/dist/monorepo.d.ts.map +0 -1
  92. package/dist/monorepo.js +0 -82
  93. package/dist/monorepo.js.map +0 -1
  94. package/dist/package-map.d.ts.map +0 -1
  95. package/dist/package-map.js +0 -2
  96. package/dist/package-map.js.map +0 -1
package/dist/monocrate.js CHANGED
@@ -1,20 +1,24 @@
1
1
  import * as fs from 'node:fs/promises';
2
+ import * as fsSync from 'node:fs';
2
3
  import * as os from 'node:os';
3
4
  import * as path from 'node:path';
4
- import { findMonorepoRoot } from './monorepo.js';
5
- import { computePackageClosure } from './compute-package-closure.js';
6
- import { assemble } from './assemble.js';
5
+ import { RepoExplorer } from './repo-explorer.js';
6
+ import { PackageAssembler } from './package-assembler.js';
7
7
  import { publish } from './publish.js';
8
8
  import { parseVersionSpecifier } from './version-specifier.js';
9
+ import { AbsolutePath } from './paths.js';
10
+ import { maxVersion } from './resolve-version.js';
11
+ import { NpmClient } from './npm-client.js';
12
+ import { mirrorSources } from './mirror-sources.js';
9
13
  /**
10
14
  * Assembles a monorepo package and its in-repo dependencies for npm publishing.
11
15
  * @param options - Configuration options for the assembly process
12
- * @returns The output directory path where the assembly was created
16
+ * @returns The result of the assembly operation
13
17
  * @throws Error if assembly or publishing fails
14
18
  */
15
19
  export async function monocrate(options) {
16
20
  // Resolve and validate cwd first, then use it to resolve all other paths
17
- const cwd = path.resolve(options.cwd);
21
+ const cwd = AbsolutePath(path.resolve(options.cwd));
18
22
  const cwdExists = await fs
19
23
  .stat(cwd)
20
24
  .then(() => true)
@@ -22,18 +26,60 @@ export async function monocrate(options) {
22
26
  if (!cwdExists) {
23
27
  throw new Error(`cwd does not exist: ${cwd}`);
24
28
  }
25
- const sourceDir = path.resolve(cwd, options.pathToSubjectPackage);
26
- const monorepoRoot = options.monorepoRoot ? path.resolve(cwd, options.monorepoRoot) : findMonorepoRoot(sourceDir);
27
- // Validate publish argument before any side effects
28
- const versionSpecifier = parseVersionSpecifier(options.publishToVersion);
29
- const outputDir = options.outputDir
30
- ? path.resolve(cwd, options.outputDir)
31
- : await fs.mkdtemp(path.join(os.tmpdir(), 'monocrate-'));
32
- const closure = await computePackageClosure(sourceDir, monorepoRoot);
33
- await assemble(closure, monorepoRoot, outputDir, versionSpecifier);
34
- if (versionSpecifier) {
35
- publish(outputDir);
36
- }
37
- return outputDir;
29
+ const outputRoot = AbsolutePath(options.outputRoot ? path.resolve(cwd, options.outputRoot) : await fs.mkdtemp(path.join(os.tmpdir(), 'monocrate-')));
30
+ // Validate bump argument before any side effects (defaults to 'minor')
31
+ const versionSpecifier = parseVersionSpecifier(options.bump ?? 'minor');
32
+ const sources = Array.isArray(options.pathToSubjectPackages)
33
+ ? options.pathToSubjectPackages
34
+ : [options.pathToSubjectPackages];
35
+ const sourceDirs = sources.map((at) => AbsolutePath(path.resolve(cwd, at)));
36
+ const sourceDir0 = sourceDirs.at(0);
37
+ if (!sourceDir0) {
38
+ throw new Error(`At least one package must be specified`);
39
+ }
40
+ const monorepoRoot = options.monorepoRoot
41
+ ? AbsolutePath(path.resolve(cwd, options.monorepoRoot))
42
+ : RepoExplorer.findMonorepoRoot(sourceDir0);
43
+ const explorer = await RepoExplorer.create(monorepoRoot);
44
+ const npmClient = new NpmClient({ userconfig: options.npmrcPath });
45
+ const assemblers = sourceDirs.map((at) => new PackageAssembler(npmClient, explorer, at, outputRoot));
46
+ const a0 = assemblers.at(0);
47
+ if (!a0) {
48
+ throw new Error(`Incosistency - could not find an assembler for the first package`);
49
+ }
50
+ // versionSpecifier is always defined (defaults to 'minor'), so computeNewVersion always returns a string
51
+ const versions = (await Promise.all(assemblers.map((a) => a.computeNewVersion(versionSpecifier)))).flatMap((v) => v ? [v] : []);
52
+ const v = versions.at(0);
53
+ if (!v) {
54
+ throw new Error('Inconsistency - no versions computed');
55
+ }
56
+ const resolvedVersion = versions.reduce((soFar, curr) => maxVersion(soFar, curr), v);
57
+ const allPackages = new Map();
58
+ for (const assembler of assemblers) {
59
+ const members = await assembler.assemble(resolvedVersion);
60
+ for (const pkg of members) {
61
+ allPackages.set(pkg.name, pkg);
62
+ }
63
+ if (options.publish) {
64
+ await publish(npmClient, assembler.getOutputDir());
65
+ }
66
+ }
67
+ // Mirror source files if mirrorTo is specified
68
+ if (options.mirrorTo) {
69
+ const mirrorDir = AbsolutePath(path.resolve(cwd, options.mirrorTo));
70
+ await mirrorSources([...allPackages.values()], mirrorDir);
71
+ }
72
+ if (options.report) {
73
+ const outputFilePath = path.resolve(cwd, options.report);
74
+ fsSync.writeFileSync(outputFilePath, resolvedVersion);
75
+ }
76
+ else {
77
+ console.log(resolvedVersion);
78
+ }
79
+ return {
80
+ outputDir: a0.getOutputDir(),
81
+ resolvedVersion,
82
+ summaries: assemblers.map((at) => ({ outputDir: at.getOutputDir(), packageName: at.pkgName })),
83
+ };
38
84
  }
39
85
  //# sourceMappingURL=monocrate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"monocrate.js","sourceRoot":"","sources":["../src/monocrate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AAiC9D;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAyB;IACvD,yEAAyE;IACzE,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACrC,MAAM,SAAS,GAAG,MAAM,EAAE;SACvB,IAAI,CAAC,GAAG,CAAC;SACT,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;SAChB,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAA;IACrB,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,EAAE,CAAC,CAAA;IAC/C,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAA;IACjE,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAA;IAEjH,oDAAoD;IACpD,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAA;IAExE,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS;QACjC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,SAAS,CAAC;QACtC,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,YAAY,CAAC,CAAC,CAAA;IAE1D,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;IACpE,MAAM,QAAQ,CAAC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAA;IAElE,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,CAAC,SAAS,CAAC,CAAA;IACpB,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC"}
1
+ {"version":3,"file":"monocrate.js","sourceRoot":"","sources":["../src/monocrate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function manglePackageName(name: string): string;
2
+ //# sourceMappingURL=name-mangler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"name-mangler.d.ts","sourceRoot":"","sources":["../src/name-mangler.ts"],"names":[],"mappings":"AAAA,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD"}
@@ -0,0 +1,4 @@
1
+ export function manglePackageName(name) {
2
+ return name.replace(/[@/]/g, '__');
3
+ }
4
+ //# sourceMappingURL=name-mangler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"name-mangler.js","sourceRoot":"","sources":["../src/name-mangler.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;AACpC,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { AbsolutePath } from './paths.js';
2
+ import type { NpmOptionsBase } from './run-npm.js';
3
+ export declare class NpmClient {
4
+ private readonly npmOptions?;
5
+ constructor(npmOptions?: NpmOptionsBase | undefined);
6
+ publish(dir: AbsolutePath): Promise<void>;
7
+ /**
8
+ * @param packageName
9
+ * @param cwd
10
+ * @returns the version of `packageName` or undefined (if not found)
11
+ */
12
+ viewVersion(packageName: string, cwd: AbsolutePath): Promise<string | undefined>;
13
+ pack(dir: AbsolutePath, options?: {
14
+ dryRun?: boolean;
15
+ }): Promise<{
16
+ id: string;
17
+ name: string;
18
+ version: string;
19
+ size: number;
20
+ unpackedSize: number;
21
+ shasum: string;
22
+ integrity: string;
23
+ filename: string;
24
+ files: {
25
+ path: string;
26
+ }[];
27
+ }[]>;
28
+ }
29
+ //# sourceMappingURL=npm-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-client.d.ts","sourceRoot":"","sources":["../src/npm-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAC,MAAM,cAAc,CAAC;AAWlD,qBAAa,SAAS;IACR,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAAX,UAAU,CAAC,EAAE,cAAc,YAAA;IAElD,OAAO,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C;;;;OAIG;IACG,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IA4BhF,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE;;;;;;;;;;;;;CA2C7D"}
@@ -0,0 +1,83 @@
1
+ import { z } from 'zod';
2
+ import { runNpm } from './run-npm.js';
3
+ const NpmErrorResponse = z.object({
4
+ error: z.object({
5
+ code: z.string().optional(),
6
+ summary: z.string().optional(),
7
+ detail: z.string().optional(),
8
+ }),
9
+ });
10
+ export class NpmClient {
11
+ npmOptions;
12
+ constructor(npmOptions) {
13
+ this.npmOptions = npmOptions;
14
+ }
15
+ async publish(dir) {
16
+ await runNpm('publish', [], dir, { ...this.npmOptions, stdio: 'inherit' });
17
+ }
18
+ /**
19
+ * @param packageName
20
+ * @param cwd
21
+ * @returns the version of `packageName` or undefined (if not found)
22
+ */
23
+ async viewVersion(packageName, cwd) {
24
+ const { ok, stdout } = await runNpm('view', ['-s', '--json', packageName, 'version'], cwd, {
25
+ ...this.npmOptions,
26
+ stdio: 'pipe',
27
+ nonZeroExitCodePolicy: 'return',
28
+ });
29
+ if (!ok) {
30
+ const parsed = NpmErrorResponse.safeParse(JSON.parse(stdout));
31
+ if (!parsed.success) {
32
+ throw new Error(`Error response of 'npm view' could not be parsed: ${stdout}`);
33
+ }
34
+ const code = parsed.data.error.code ?? 'UNKNOWN';
35
+ if (code !== 'E404') {
36
+ const detail = parsed.data.error.detail ?? parsed.data.error.summary ?? '<No Further Details>';
37
+ throw new Error(`npm view failed (${code}): ${detail}`);
38
+ }
39
+ return undefined;
40
+ }
41
+ const parsed = z.string().safeParse(JSON.parse(stdout));
42
+ if (!parsed.success) {
43
+ throw new Error(`Response of 'npm view' could not be parsed: ${stdout}`);
44
+ }
45
+ return parsed.data;
46
+ }
47
+ async pack(dir, options) {
48
+ const { stdout, ok } = await runNpm('pack', ['--json', ...(options?.dryRun ? ['--dry-run'] : [])], dir, {
49
+ ...this.npmOptions,
50
+ stdio: 'pipe',
51
+ nonZeroExitCodePolicy: 'return',
52
+ });
53
+ if (!ok) {
54
+ const parsed = NpmErrorResponse.safeParse(JSON.parse(stdout));
55
+ if (!parsed.success) {
56
+ throw new Error(`Error response of 'npm pack' could not be parsed: ${stdout}`);
57
+ }
58
+ const code = parsed.data.error.code ?? 'UNKNOWN';
59
+ const detail = parsed.data.error.detail ?? parsed.data.error.summary ?? '<No Further Details>';
60
+ throw new Error(`The 'npm view' command failed (code: ${code}): ${detail}`);
61
+ }
62
+ const parsed = z
63
+ .array(z.object({
64
+ id: z.string(),
65
+ name: z.string(),
66
+ version: z.string(),
67
+ size: z.number(),
68
+ unpackedSize: z.number(),
69
+ shasum: z.string(),
70
+ integrity: z.string(),
71
+ filename: z.string(),
72
+ files: z.array(z.object({
73
+ path: z.string(),
74
+ })),
75
+ }))
76
+ .safeParse(JSON.parse(stdout));
77
+ if (!parsed.success) {
78
+ throw new Error(`Response of 'npm pack' could not be parsed: ${parsed.error.message}`);
79
+ }
80
+ return parsed.data;
81
+ }
82
+ }
83
+ //# sourceMappingURL=npm-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-client.js","sourceRoot":"","sources":["../src/npm-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { VersionSpecifier } from './version-specifier.js';
2
+ import { AbsolutePath } from './paths.js';
3
+ import type { RepoExplorer, MonorepoPackage } from './repo-explorer.js';
4
+ import type { NpmClient } from './npm-client.js';
5
+ export declare class PackageAssembler {
6
+ private readonly npmClient;
7
+ private readonly explorer;
8
+ private readonly fromDir;
9
+ private readonly outputRoot;
10
+ readonly pkgName: string;
11
+ constructor(npmClient: NpmClient, explorer: RepoExplorer, fromDir: AbsolutePath, outputRoot: AbsolutePath);
12
+ getOutputDir(): AbsolutePath;
13
+ computeNewVersion(versionSpecifier: VersionSpecifier | undefined): Promise<string | undefined>;
14
+ assemble(newVersion: string | undefined): Promise<MonorepoPackage[]>;
15
+ }
16
+ //# sourceMappingURL=package-assembler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-assembler.d.ts","sourceRoot":"","sources":["../src/package-assembler.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC9D,OAAO,EAAE,YAAY,EAAgB,MAAM,YAAY,CAAA;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAGvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAEhD,qBAAa,gBAAgB;IAGzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAL7B,QAAQ,CAAC,OAAO,SAAA;gBAEG,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE,YAAY,EACrB,UAAU,EAAE,YAAY;IAS3C,YAAY;IAIN,iBAAiB,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,SAAS;IAMhE,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;CAoB3E"}
@@ -0,0 +1,52 @@
1
+ import * as fsPromises from 'node:fs/promises';
2
+ import { collectPackageLocations } from './collect-package-locations.js';
3
+ import { FileCopier } from './file-copier.js';
4
+ import { ImportRewriter } from './import-rewriter.js';
5
+ import { resolveVersion } from './resolve-version.js';
6
+ import { rewritePackageJson } from './rewrite-package-json.js';
7
+ import { AbsolutePath, RelativePath } from './paths.js';
8
+ import { computePackageClosure } from './compute-package-closure.js';
9
+ import { manglePackageName } from './name-mangler.js';
10
+ export class PackageAssembler {
11
+ npmClient;
12
+ explorer;
13
+ fromDir;
14
+ outputRoot;
15
+ pkgName;
16
+ constructor(npmClient, explorer, fromDir, outputRoot) {
17
+ this.npmClient = npmClient;
18
+ this.explorer = explorer;
19
+ this.fromDir = fromDir;
20
+ this.outputRoot = outputRoot;
21
+ const found = this.explorer.listPackages().find((at) => at.fromDir === fromDir);
22
+ if (!found) {
23
+ throw new Error(`Unrecognized package source dir: "${this.fromDir}"`);
24
+ }
25
+ this.pkgName = found.name;
26
+ }
27
+ getOutputDir() {
28
+ return AbsolutePath.join(this.outputRoot, RelativePath(manglePackageName(this.pkgName)));
29
+ }
30
+ async computeNewVersion(versionSpecifier) {
31
+ return versionSpecifier
32
+ ? await resolveVersion(this.npmClient, this.fromDir, this.pkgName, versionSpecifier)
33
+ : Promise.resolve(undefined);
34
+ }
35
+ async assemble(newVersion) {
36
+ const closure = computePackageClosure(this.pkgName, this.explorer);
37
+ const outputDir = this.getOutputDir();
38
+ const locations = await collectPackageLocations(this.npmClient, closure, outputDir);
39
+ const packageMap = new Map(locations.map((at) => [at.name, at]));
40
+ const subject = packageMap.get(closure.subjectPackageName);
41
+ if (!subject) {
42
+ throw new Error(`Internal mismatch: could not find location data of "${closure.subjectPackageName}"`);
43
+ }
44
+ await fsPromises.mkdir(outputDir, { recursive: true });
45
+ const copiedFiles = await new FileCopier(packageMap).copy();
46
+ await new ImportRewriter(packageMap).rewriteAll(copiedFiles);
47
+ // This must happen after file copying completes (otherwise the rewritten package.json could be overwritten)
48
+ rewritePackageJson(closure, newVersion, outputDir);
49
+ return closure.members;
50
+ }
51
+ }
52
+ //# sourceMappingURL=package-assembler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-assembler.js","sourceRoot":"","sources":["../src/package-assembler.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { MonorepoPackage } from './monorepo.js';
1
+ import type { MonorepoPackage } from './repo-explorer.js';
2
2
  /**
3
3
  * The transitive closure of packages needed to publish a monorepo package. Computed by traversing dependencies
4
4
  * starting from a subject package.
@@ -1 +1 @@
1
- {"version":3,"file":"package-closure.d.ts","sourceRoot":"","sources":["../src/package-closure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAEpD;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,mEAAmE;IACnE,kBAAkB,EAAE,MAAM,CAAA;IAC1B,sFAAsF;IACtF,OAAO,EAAE,eAAe,EAAE,CAAA;IAC1B,wEAAwE;IACxE,iBAAiB,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CACnD"}
1
+ {"version":3,"file":"package-closure.d.ts","sourceRoot":"","sources":["../src/package-closure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEzD;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,mEAAmE;IACnE,kBAAkB,EAAE,MAAM,CAAA;IAC1B,sFAAsF;IACtF,OAAO,EAAE,eAAe,EAAE,CAAA;IAC1B,wEAAwE;IACxE,iBAAiB,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CACnD"}
@@ -1,4 +1,5 @@
1
1
  import type { PackageJson } from './package-json.js';
2
+ import type { AbsolutePath } from './paths.js';
2
3
  export interface PackageLocation {
3
4
  /**
4
5
  * The package name from package.json
@@ -6,19 +7,17 @@ export interface PackageLocation {
6
7
  */
7
8
  name: string;
8
9
  /**
9
- * Absolute path to the source package directory
10
- * @example "/home/user/monorepo/packages/utils"
10
+ * Absolute path to the package's directory in the repo.
11
+ * @example "/home/user/monorepo/packages/my-package"
11
12
  */
12
- packageDir: string;
13
+ fromDir: AbsolutePath;
13
14
  /**
14
- * Prefix for the output location. Empty string for the subject package,
15
- * relative path under deps/ for in-repo dependencies
16
- * @example "" (subject package)
17
- * @example "deps/packages/utils" (in-repo dependency)
15
+ * Absolute path to the the package's output directory
16
+ * @example "/tmp/monocrate-ab00003/deps/packages/my-package" (in-repo dependency)
18
17
  */
19
- outputPrefix: string;
18
+ toDir: AbsolutePath;
20
19
  /**
21
- * Individual file paths to copy, as determined by `npm pack --dry-run`.
20
+ * Individual file paths (relative to the package dir) to copy, as determined by `npm pack --dry-run`.
22
21
  * These are the exact files npm would include in the published tarball.
23
22
  * @example ["dist/index.js", "dist/utils.js", "package.json"]
24
23
  */
@@ -29,4 +28,4 @@ export interface PackageLocation {
29
28
  packageJson: PackageJson;
30
29
  }
31
30
  export type PackageMap = Map<string, PackageLocation>;
32
- //# sourceMappingURL=package-map.d.ts.map
31
+ //# sourceMappingURL=package-location.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-location.d.ts","sourceRoot":"","sources":["../src/package-location.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAA;IAEZ;;;OAGG;IACH,OAAO,EAAE,YAAY,CAAA;IAErB;;;OAGG;IACH,KAAK,EAAE,YAAY,CAAA;IAEnB;;;;OAIG;IACH,WAAW,EAAE,MAAM,EAAE,CAAA;IAErB;;OAEG;IACH,WAAW,EAAE,WAAW,CAAA;CACzB;AAED,MAAM,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=package-location.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-location.js","sourceRoot":"","sources":["../src/package-location.ts"],"names":[],"mappings":""}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Branded type for absolute file system paths.
3
+ * Use AbsolutePath(s) to create, AbsolutePath.join() and AbsolutePath.dirname() for manipulation.
4
+ */
5
+ export type AbsolutePath = string & {
6
+ readonly __brand: 'AbsolutePath';
7
+ };
8
+ /**
9
+ * Creates an AbsolutePath from a string. Normalizes the input.
10
+ * @throws if the path is not absolute
11
+ */
12
+ export declare function AbsolutePath(s: string): AbsolutePath;
13
+ export declare namespace AbsolutePath {
14
+ function join(base: AbsolutePath, p: RelativePath, ...paths: string[]): AbsolutePath;
15
+ function dirname(p: AbsolutePath): AbsolutePath;
16
+ /**
17
+ * Checks if `parent` contains `child` (or they are equal).
18
+ */
19
+ function contains(parent: AbsolutePath, child: AbsolutePath): boolean;
20
+ }
21
+ /**
22
+ * Branded type for paths relative to the monorepo root.
23
+ * Use RelativePath(s) to create, RelativePath.join() and RelativePath.dirname() for manipulation.
24
+ */
25
+ export type RelativePath = string & {
26
+ readonly __brand: 'RelativePath';
27
+ };
28
+ /**
29
+ * Creates a RelativePath from a string. Normalizes the input.
30
+ * @throws if the path is absolute
31
+ */
32
+ export declare function RelativePath(s: string): RelativePath;
33
+ export declare namespace RelativePath {
34
+ function join(base: RelativePath, ...paths: string[]): RelativePath;
35
+ function dirname(p: RelativePath): RelativePath;
36
+ }
37
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAA;CAAE,CAAA;AAExE;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,YAAY,CAMpD;AAGD,yBAAiB,YAAY,CAAC;IAC5B,SAAgB,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,YAAY,CAE1F;IAED,SAAgB,OAAO,CAAC,CAAC,EAAE,YAAY,GAAG,YAAY,CAErD;IAED;;OAEG;IACH,SAAgB,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAG3E;CACF;AAED;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAA;CAAE,CAAA;AAExE;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,YAAY,CAMpD;AAGD,yBAAiB,YAAY,CAAC;IAC5B,SAAgB,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,YAAY,CAOzE;IAED,SAAgB,OAAO,CAAC,CAAC,EAAE,YAAY,GAAG,YAAY,CAErD;CACF"}
package/dist/paths.js ADDED
@@ -0,0 +1,59 @@
1
+ import path from 'node:path';
2
+ /**
3
+ * Creates an AbsolutePath from a string. Normalizes the input.
4
+ * @throws if the path is not absolute
5
+ */
6
+ export function AbsolutePath(s) {
7
+ const normalized = path.normalize(s);
8
+ if (!path.isAbsolute(normalized)) {
9
+ throw new Error(`Expected absolute path, got: ${s}`);
10
+ }
11
+ return normalized;
12
+ }
13
+ // eslint-disable-next-line @typescript-eslint/no-namespace
14
+ (function (AbsolutePath) {
15
+ function join(base, p, ...paths) {
16
+ return AbsolutePath(path.join(base, RelativePath.join(p, ...paths)));
17
+ }
18
+ AbsolutePath.join = join;
19
+ function dirname(p) {
20
+ return AbsolutePath(path.dirname(p));
21
+ }
22
+ AbsolutePath.dirname = dirname;
23
+ /**
24
+ * Checks if `parent` contains `child` (or they are equal).
25
+ */
26
+ function contains(parent, child) {
27
+ const relative = path.relative(parent, child);
28
+ return !relative.startsWith('..') && !path.isAbsolute(relative);
29
+ }
30
+ AbsolutePath.contains = contains;
31
+ })(AbsolutePath || (AbsolutePath = {}));
32
+ /**
33
+ * Creates a RelativePath from a string. Normalizes the input.
34
+ * @throws if the path is absolute
35
+ */
36
+ export function RelativePath(s) {
37
+ const normalized = path.normalize(s);
38
+ if (path.isAbsolute(normalized)) {
39
+ throw new Error(`Expected relative path, got: ${s}`);
40
+ }
41
+ return normalized;
42
+ }
43
+ // eslint-disable-next-line @typescript-eslint/no-namespace
44
+ (function (RelativePath) {
45
+ function join(base, ...paths) {
46
+ for (const at of paths) {
47
+ if (path.isAbsolute(at)) {
48
+ throw new Error(`Cannot join absolute path ${at} to RelativePath`);
49
+ }
50
+ }
51
+ return RelativePath(path.join(base, ...paths));
52
+ }
53
+ RelativePath.join = join;
54
+ function dirname(p) {
55
+ return RelativePath(path.dirname(p));
56
+ }
57
+ RelativePath.dirname = dirname;
58
+ })(RelativePath || (RelativePath = {}));
59
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAQ5B;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,CAAS;IACpC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IACpC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,EAAE,CAAC,CAAA;IACtD,CAAC;IACD,OAAO,UAA0B,CAAA;AACnC,CAAC;AAED,2DAA2D;AAC3D,WAAiB,YAAY;IAC3B,SAAgB,IAAI,CAAC,IAAkB,EAAE,CAAe,EAAE,GAAG,KAAe;QAC1E,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IACtE,CAAC;IAFe,iBAAI,OAEnB,CAAA;IAED,SAAgB,OAAO,CAAC,CAAe;QACrC,OAAO,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;IACtC,CAAC;IAFe,oBAAO,UAEtB,CAAA;IAED;;OAEG;IACH,SAAgB,QAAQ,CAAC,MAAoB,EAAE,KAAmB;QAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAC7C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;IACjE,CAAC;IAHe,qBAAQ,WAGvB,CAAA;AACH,CAAC,EAhBgB,YAAY,KAAZ,YAAY,QAgB5B;AAQD;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,CAAS;IACpC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IACpC,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,EAAE,CAAC,CAAA;IACtD,CAAC;IACD,OAAO,UAA0B,CAAA;AACnC,CAAC;AAED,2DAA2D;AAC3D,WAAiB,YAAY;IAC3B,SAAgB,IAAI,CAAC,IAAkB,EAAE,GAAG,KAAe;QACzD,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;YACvB,IAAI,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,6BAA6B,EAAE,kBAAkB,CAAC,CAAA;YACpE,CAAC;QACH,CAAC;QACD,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC,CAAA;IAChD,CAAC;IAPe,iBAAI,OAOnB,CAAA;IAED,SAAgB,OAAO,CAAC,CAAe;QACrC,OAAO,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;IACtC,CAAC;IAFe,oBAAO,UAEtB,CAAA;AACH,CAAC,EAbgB,YAAY,KAAZ,YAAY,QAa5B"}
package/dist/publish.d.ts CHANGED
@@ -1,2 +1,4 @@
1
- export declare function publish(outputDir: string): void;
1
+ import type { AbsolutePath } from './paths.js';
2
+ import type { NpmClient } from './npm-client.js';
3
+ export declare function publish(npmClient: NpmClient, outputDir: AbsolutePath): Promise<void>;
2
4
  //# sourceMappingURL=publish.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../src/publish.ts"],"names":[],"mappings":"AAEA,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,QAKxC"}
1
+ {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../src/publish.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAEhD,wBAAsB,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,iBAE1E"}
package/dist/publish.js CHANGED
@@ -1,8 +1,4 @@
1
- import { spawnSync } from 'node:child_process';
2
- export function publish(outputDir) {
3
- const npmPublishResult = spawnSync('npm', ['publish'], { cwd: outputDir, stdio: 'inherit' });
4
- if (npmPublishResult.status !== 0) {
5
- throw new Error(`npm publish failed with exit code ${String(npmPublishResult.status ?? 1)}`);
6
- }
1
+ export async function publish(npmClient, outputDir) {
2
+ await npmClient.publish(outputDir);
7
3
  }
8
4
  //# sourceMappingURL=publish.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"publish.js","sourceRoot":"","sources":["../src/publish.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAE9C,MAAM,UAAU,OAAO,CAAC,SAAiB;IACvC,MAAM,gBAAgB,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA;IAC5F,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,qCAAqC,MAAM,CAAC,gBAAgB,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,CAAA;IAC9F,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../src/publish.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,SAAoB,EAAE,SAAuB;IACzE,MAAM,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;AACpC,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { PackageJson } from './package-json.js';
2
+ import { AbsolutePath, RelativePath } from './paths.js';
3
+ export interface MonorepoPackage {
4
+ name: string;
5
+ fromDir: AbsolutePath;
6
+ pathInRepo: RelativePath;
7
+ packageJson: PackageJson;
8
+ }
9
+ export declare class RepoExplorer {
10
+ readonly repoRootDir: AbsolutePath;
11
+ private readonly map;
12
+ constructor(repoRootDir: AbsolutePath, map: Map<string, MonorepoPackage>);
13
+ static create(monorepoRoot: AbsolutePath): Promise<RepoExplorer>;
14
+ listNames(): string[];
15
+ listPackages(): MonorepoPackage[];
16
+ getPackage(pkgName: string): MonorepoPackage;
17
+ lookupPackage(pkgName: string): MonorepoPackage | undefined;
18
+ static findMonorepoRoot(startDir: AbsolutePath): AbsolutePath;
19
+ private static readPackageJson;
20
+ private static parseWorkspacePatterns;
21
+ static discover(monorepoRoot: AbsolutePath): Promise<Map<string, MonorepoPackage>>;
22
+ }
23
+ //# sourceMappingURL=repo-explorer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo-explorer.d.ts","sourceRoot":"","sources":["../src/repo-explorer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAEvD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,YAAY,CAAA;IACrB,UAAU,EAAE,YAAY,CAAA;IACxB,WAAW,EAAE,WAAW,CAAA;CACzB;AAED,qBAAa,YAAY;IAErB,QAAQ,CAAC,WAAW,EAAE,YAAY;IAClC,OAAO,CAAC,QAAQ,CAAC,GAAG;gBADX,WAAW,EAAE,YAAY,EACjB,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC;WAGvC,MAAM,CAAC,YAAY,EAAE,YAAY;IAkB9C,SAAS;IAGT,YAAY;IAIZ,UAAU,CAAC,OAAO,EAAE,MAAM;IAQ1B,aAAa,CAAC,OAAO,EAAE,MAAM;IAI7B,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,GAAG,YAAY;IAuB7D,OAAO,CAAC,MAAM,CAAC,eAAe;IAa9B,OAAO,CAAC,MAAM,CAAC,sBAAsB;WA8BxB,QAAQ,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAyBzF"}