@build-script/package-tools 0.0.4 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/lib/command-file-map.generated.d.ts +2 -1
  2. package/lib/command-file-map.generated.d.ts.map +1 -1
  3. package/lib/command-file-map.generated.js +2 -1
  4. package/lib/command-file-map.generated.js.map +1 -1
  5. package/lib/commands/detect-package-change.d.ts.map +1 -1
  6. package/lib/commands/detect-package-change.js +3 -1
  7. package/lib/commands/detect-package-change.js.map +1 -1
  8. package/lib/commands/monorepo-bump-version.d.ts.map +1 -1
  9. package/lib/commands/monorepo-bump-version.js +13 -23
  10. package/lib/commands/monorepo-bump-version.js.map +1 -1
  11. package/lib/commands/monorepo-cnpm-sync.d.ts.map +1 -1
  12. package/lib/commands/monorepo-cnpm-sync.js +12 -2
  13. package/lib/commands/monorepo-cnpm-sync.js.map +1 -1
  14. package/lib/commands/monorepo-invalid.d.ts.map +1 -1
  15. package/lib/commands/monorepo-invalid.js +4 -2
  16. package/lib/commands/monorepo-invalid.js.map +1 -1
  17. package/lib/commands/monorepo-link-binaries.d.ts +22 -0
  18. package/lib/commands/monorepo-link-binaries.d.ts.map +1 -0
  19. package/lib/commands/monorepo-link-binaries.js +146 -0
  20. package/lib/commands/monorepo-link-binaries.js.map +1 -0
  21. package/lib/commands/monorepo-publish.d.ts.map +1 -1
  22. package/lib/commands/monorepo-publish.js +37 -40
  23. package/lib/commands/monorepo-publish.js.map +1 -1
  24. package/lib/commands/monorepo-tsconfig.d.ts.map +1 -1
  25. package/lib/commands/monorepo-tsconfig.js.map +1 -1
  26. package/lib/commands/monorepo-upgrade.d.ts.map +1 -1
  27. package/lib/commands/monorepo-upgrade.js +4 -2
  28. package/lib/commands/monorepo-upgrade.js.map +1 -1
  29. package/lib/commands/run-if-version-mismatch.d.ts.map +1 -1
  30. package/lib/commands/run-if-version-mismatch.js +6 -4
  31. package/lib/commands/run-if-version-mismatch.js.map +1 -1
  32. package/lib/commands/test.d.ts.map +1 -1
  33. package/lib/commands/test.js +3 -1
  34. package/lib/commands/test.js.map +1 -1
  35. package/lib/common/cache/native.npm.js +2 -2
  36. package/lib/common/cache/native.npm.js.map +1 -1
  37. package/lib/common/functions/cli.d.ts +3 -0
  38. package/lib/common/functions/cli.d.ts.map +1 -1
  39. package/lib/common/functions/cli.js.map +1 -1
  40. package/lib/common/git/git.d.ts.map +1 -1
  41. package/lib/common/git/git.js +3 -3
  42. package/lib/common/git/git.js.map +1 -1
  43. package/lib/common/package-manager/driver.abstract.d.ts +3 -3
  44. package/lib/common/package-manager/driver.abstract.d.ts.map +1 -1
  45. package/lib/common/package-manager/driver.abstract.js +3 -5
  46. package/lib/common/package-manager/driver.abstract.js.map +1 -1
  47. package/lib/common/package-manager/driver.pnpm.d.ts.map +1 -1
  48. package/lib/common/package-manager/driver.pnpm.js +19 -7
  49. package/lib/common/package-manager/driver.pnpm.js.map +1 -1
  50. package/lib/common/package-manager/functions.d.ts.map +1 -1
  51. package/lib/common/package-manager/functions.js.map +1 -1
  52. package/lib/common/package-manager/package-manager.d.ts +2 -2
  53. package/lib/common/package-manager/package-manager.d.ts.map +1 -1
  54. package/lib/common/package-manager/package-manager.js +0 -3
  55. package/lib/common/package-manager/package-manager.js.map +1 -1
  56. package/lib/common/package-manager/proxy.js +1 -1
  57. package/lib/common/package-manager/proxy.js.map +1 -1
  58. package/lib/common/shared-jobs/clear-cache.d.ts +3 -0
  59. package/lib/common/shared-jobs/clear-cache.d.ts.map +1 -0
  60. package/lib/common/shared-jobs/clear-cache.js +14 -0
  61. package/lib/common/shared-jobs/clear-cache.js.map +1 -0
  62. package/lib/common/shared-jobs/cnpm-sync.d.ts +0 -2
  63. package/lib/common/shared-jobs/cnpm-sync.d.ts.map +1 -1
  64. package/lib/common/shared-jobs/cnpm-sync.js +1 -22
  65. package/lib/common/shared-jobs/cnpm-sync.js.map +1 -1
  66. package/lib/common/taball/decompress.d.ts.map +1 -1
  67. package/lib/common/taball/decompress.js +8 -2
  68. package/lib/common/taball/decompress.js.map +1 -1
  69. package/lib/common/taball/file-download.js +1 -6
  70. package/lib/common/taball/file-download.js.map +1 -1
  71. package/lib/common/temp-work-folder.d.ts +2 -2
  72. package/lib/common/temp-work-folder.d.ts.map +1 -1
  73. package/lib/common/temp-work-folder.js.map +1 -1
  74. package/lib/common/version.generated.d.ts +2 -2
  75. package/lib/common/version.generated.js +2 -2
  76. package/lib/main.js +2 -2
  77. package/lib/main.js.map +1 -1
  78. package/lib/tsconfig.tsbuildinfo +1 -1
  79. package/package.json +13 -13
  80. package/src/command-file-map.generated.ts +2 -1
  81. package/src/command-file-map.generator.ts +2 -2
  82. package/src/commands/detect-package-change.ts +3 -1
  83. package/src/commands/monorepo-bump-version.ts +17 -28
  84. package/src/commands/monorepo-cnpm-sync.ts +14 -2
  85. package/src/commands/monorepo-invalid.ts +4 -2
  86. package/src/commands/monorepo-link-binaries.ts +168 -0
  87. package/src/commands/monorepo-publish.ts +45 -54
  88. package/src/commands/monorepo-tsconfig.ts +1 -2
  89. package/src/commands/monorepo-upgrade.ts +4 -3
  90. package/src/commands/run-if-version-mismatch.ts +7 -7
  91. package/src/commands/test.ts +3 -1
  92. package/src/common/cache/native.npm.ts +2 -2
  93. package/src/common/functions/cli.ts +3 -0
  94. package/src/common/git/git.ts +4 -9
  95. package/src/common/package-manager/driver.abstract.ts +5 -8
  96. package/src/common/package-manager/driver.pnpm.ts +21 -7
  97. package/src/common/package-manager/functions.ts +2 -12
  98. package/src/common/package-manager/package-manager.ts +3 -13
  99. package/src/common/package-manager/proxy.ts +1 -1
  100. package/src/common/shared-jobs/clear-cache.ts +14 -0
  101. package/src/common/shared-jobs/cnpm-sync.ts +1 -25
  102. package/src/common/taball/decompress.ts +8 -2
  103. package/src/common/taball/file-download.ts +3 -14
  104. package/src/common/temp-work-folder.ts +2 -2
  105. package/src/common/version.generated.ts +2 -2
  106. package/src/common/version.generator.ts +1 -1
  107. package/src/main.ts +3 -15
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@build-script/package-tools",
3
3
  "type": "module",
4
- "version": "0.0.4",
4
+ "version": "0.0.6",
5
5
  "bin": {
6
6
  "package-tools": "./load.js",
7
7
  "njspkg": "./load.js"
@@ -21,14 +21,14 @@
21
21
  "source-map-support": "^0.5.21",
22
22
  "targz": "^1.0.1",
23
23
  "tiny-async-pool": "^2.1.0",
24
- "@build-script/monorepo-lib": "^0.0.3",
25
- "@idlebox/common": "^1.4.16",
26
- "@idlebox/json-edit": "^0.0.3",
27
- "@idlebox/args": "^0.0.11",
28
- "@idlebox/ensure-symlink": "^1.0.34",
29
- "@idlebox/logger": "^0.0.4",
30
- "@idlebox/node": "^1.4.9",
31
- "@idlebox/dependency-graph": "^0.0.3"
24
+ "@build-script/monorepo-lib": "^0.0.5",
25
+ "@idlebox/common": "^1.4.18",
26
+ "@idlebox/ensure-symlink": "^1.0.36",
27
+ "@idlebox/args": "^0.0.13",
28
+ "@idlebox/json-edit": "^0.0.5",
29
+ "@idlebox/dependency-graph": "^0.0.5",
30
+ "@idlebox/node": "^1.4.11",
31
+ "@idlebox/logger": "^0.0.6"
32
32
  },
33
33
  "devDependencies": {
34
34
  "@rushstack/heft": "^0.74.0",
@@ -41,10 +41,10 @@
41
41
  "@types/targz": "^1.0.5",
42
42
  "@types/tiny-async-pool": "^2.0.3",
43
43
  "@types/tinycolor2": "^1.4.6",
44
- "@build-script/codegen": "^1.0.4",
45
- "@internal/local-rig": "^1.0.1",
46
- "@build-script/single-dog-asset": "^1.0.37",
47
- "@mpis/run": "^0.0.4"
44
+ "@build-script/codegen": "^1.0.6",
45
+ "@build-script/single-dog-asset": "^1.0.38",
46
+ "@mpis/run": "^0.0.6",
47
+ "@internal/local-rig": "^1.0.1"
48
48
  },
49
49
  "license": "MIT",
50
50
  "author": "GongT <admin@gongt.me>",
@@ -7,7 +7,7 @@
7
7
  * GENERATED FILE, DO NOT MODIFY
8
8
  * 这是生成的文件,千万不要修改
9
9
  *
10
- * @build-script/codegen 1.0.4 - The Simple Code Generater
10
+ * @build-script/codegen - The Simple Code Generater
11
11
  * https://github.com/GongT/baobao
12
12
  *
13
13
  ******************************************************************************/
@@ -17,6 +17,7 @@ export default {
17
17
  "monorepo-bump-version": "./commands/monorepo-bump-version.js",
18
18
  "monorepo-cnpm-sync": "./commands/monorepo-cnpm-sync.js",
19
19
  "monorepo-invalid": "./commands/monorepo-invalid.js",
20
+ "monorepo-link-binaries": "./commands/monorepo-link-binaries.js",
20
21
  "monorepo-list": "./commands/monorepo-list.js",
21
22
  "monorepo-publish": "./commands/monorepo-publish.js",
22
23
  "monorepo-tsconfig": "./commands/monorepo-tsconfig.js",
@@ -5,8 +5,8 @@ import { resolve } from 'node:path';
5
5
  export async function generate(ctx: GenerateContext) {
6
6
  const map = {};
7
7
  const root = resolve(__dirname, 'commands');
8
- ctx.watchFiles(root + '/**/*.ts');
9
- ctx.watchFiles(root + '/');
8
+ ctx.watchFiles(`${root}/**/*.ts`);
9
+ ctx.watchFiles(`${root}/`);
10
10
  for (const name of readdirSync(root)) {
11
11
  if (!name.endsWith('.ts')) {
12
12
  continue;
@@ -1,3 +1,4 @@
1
+ import { createWorkspaceOrPackage } from '@build-script/monorepo-lib';
1
2
  import { logger } from '@idlebox/logger';
2
3
  import { printLine } from '@idlebox/node';
3
4
  import { argv, CommandDefine, isJsonOutput, pArgS } from '../common/functions/cli.js';
@@ -20,7 +21,8 @@ export class Command extends CommandDefine {
20
21
  export async function main() {
21
22
  const autoInc = argv.flag('--bump');
22
23
 
23
- const pm = await createPackageManager(PackageManagerUsageKind.Read);
24
+ const workspace = await createWorkspaceOrPackage();
25
+ const pm = await createPackageManager(PackageManagerUsageKind.Read, workspace);
24
26
 
25
27
  const pkgJson = await pm.loadPackageJson();
26
28
  const { changedFiles, hasChange, remoteVersion } = await executeChangeDetect(pm, {});
@@ -1,9 +1,8 @@
1
1
  import { createWorkspace, type IPackageInfo, type MonorepoWorkspace } from '@build-script/monorepo-lib';
2
- import { Emitter, humanDate } from '@idlebox/common';
3
- import { BuilderDependencyGraph, type IWatchEvents } from '@idlebox/dependency-graph';
2
+ import { humanDate } from '@idlebox/common';
3
+ import { Job, JobGraphBuilder } from '@idlebox/dependency-graph';
4
4
  import { logger } from '@idlebox/logger';
5
5
  import { makeRe } from 'minimatch';
6
- import { inspect } from 'node:util';
7
6
  import { argv, CommandDefine, CSI } from '../common/functions/cli.js';
8
7
  import { PackageManagerUsageKind } from '../common/package-manager/driver.abstract.js';
9
8
  import { increaseVersion } from '../common/package-manager/package-json.js';
@@ -23,31 +22,26 @@ export class Command extends CommandDefine {
23
22
  };
24
23
  }
25
24
 
26
- interface IState {
25
+ interface IPayload {
27
26
  readonly index: number;
28
27
  readonly length: number;
29
28
  readonly options: ReturnType<typeof options>;
30
29
  readonly changedPackages: string[];
31
30
  }
32
31
 
33
- class BumpVersionJob implements IWatchEvents {
34
- private readonly _onSuccess = new Emitter<void>();
35
- public readonly onSuccess = this._onSuccess.event;
36
-
37
- private readonly _onFailed = new Emitter<Error>();
38
- public readonly onFailed = this._onFailed.event;
39
-
40
- private readonly _onRunning = new Emitter<void>();
41
- public readonly onRunning = this._onRunning.event;
42
-
32
+ class BumpVersionJob extends Job<void> {
43
33
  constructor(
44
- private readonly state: IState,
34
+ name: string,
35
+ deps: readonly string[],
36
+ private readonly payload: IPayload,
45
37
  private readonly project: IPackageInfo,
46
38
  private readonly workspace: MonorepoWorkspace,
47
- ) {}
39
+ ) {
40
+ super(name, deps);
41
+ }
48
42
 
49
- async execute() {
50
- const { index, length, options, changedPackages } = this.state;
43
+ protected override async _execute() {
44
+ const { index, length, options, changedPackages } = this.payload;
51
45
  const w = length.toFixed(0).length;
52
46
  console.log(`📦 [${(index + 1).toFixed(0).padStart(w)}/${length}] ${this.project.name}`);
53
47
  if (this.project.packageJson.private && !options.allowPrivate) {
@@ -85,18 +79,13 @@ class BumpVersionJob implements IWatchEvents {
85
79
  }
86
80
  }
87
81
  }
88
-
89
- [inspect.custom]() {
90
- // TODO
91
- return '~~~~~~~~';
92
- }
93
82
  }
94
83
 
95
84
  function options() {
96
85
  const excludes = argv.multiple('--exclude');
97
86
  let excludeReg: RegExp | undefined;
98
87
  if (excludes.length > 0) {
99
- let regTxt = [];
88
+ const regTxt = [];
100
89
  for (const exclude of excludes) {
101
90
  const match = makeRe(exclude, { platform: 'linux' });
102
91
  if (!match) {
@@ -135,7 +124,7 @@ export async function main() {
135
124
  await workspace.decoupleDependencies();
136
125
  const projects = await workspace.listPackages();
137
126
 
138
- const graph = new BuilderDependencyGraph(1, logger);
127
+ const graph = new JobGraphBuilder(1, logger);
139
128
 
140
129
  const opts = options();
141
130
 
@@ -146,9 +135,9 @@ export async function main() {
146
135
  if (!project.packageJson.name) continue;
147
136
 
148
137
  graph.addNode(
149
- project.packageJson.name,
150
- [],
151
138
  new BumpVersionJob(
139
+ project.packageJson.name,
140
+ [],
152
141
  {
153
142
  index,
154
143
  length: projects.length,
@@ -163,7 +152,7 @@ export async function main() {
163
152
  index++;
164
153
  }
165
154
 
166
- await graph.startup();
155
+ await graph.finalize().startup();
167
156
 
168
157
  console.log(`🎉 所有任务完成,共修改了 ${changedPackages.length} 个包`);
169
158
  }
@@ -1,7 +1,10 @@
1
1
  import { createWorkspace } from '@build-script/monorepo-lib';
2
2
  import { argv } from '@idlebox/args/default';
3
3
  import { CommandDefine, isQuiet, pDesc } from '../common/functions/cli.js';
4
- import { cnpmSync } from '../common/shared-jobs/cnpm-sync.js';
4
+ import { PackageManagerUsageKind } from '../common/package-manager/driver.abstract.js';
5
+ import { createPackageManager } from '../common/package-manager/package-manager.js';
6
+ import { clearNpmMetaCache } from '../common/shared-jobs/clear-cache.js';
7
+ import { cnpmSyncNames } from '../common/shared-jobs/cnpm-sync.js';
5
8
 
6
9
  export class Command extends CommandDefine {
7
10
  protected override _usage = '';
@@ -15,5 +18,14 @@ export async function main() {
15
18
 
16
19
  const dry = argv.flag('--dry') > 0;
17
20
 
18
- await cnpmSync(list, isQuiet, dry);
21
+ const names = list
22
+ .filter((e) => {
23
+ return !!e.packageJson.name && !e.packageJson.private;
24
+ })
25
+ .map((e) => e.packageJson.name);
26
+
27
+ await cnpmSyncNames(names, isQuiet, dry);
28
+
29
+ const pm = await createPackageManager(PackageManagerUsageKind.Read, workspace);
30
+ await clearNpmMetaCache(pm, names);
19
31
  }
@@ -1,3 +1,4 @@
1
+ import { createWorkspace } from '@build-script/monorepo-lib';
1
2
  import { logger } from '@idlebox/logger';
2
3
  import { CommandDefine } from '../common/functions/cli.js';
3
4
  import { PackageManagerUsageKind } from '../common/package-manager/driver.abstract.js';
@@ -10,10 +11,11 @@ export class Command extends CommandDefine {
10
11
  }
11
12
 
12
13
  export async function main() {
13
- const packageManager = await createPackageManager(PackageManagerUsageKind.Read);
14
+ const workspace = await createWorkspace();
15
+ const packageManager = await createPackageManager(PackageManagerUsageKind.Read, workspace);
14
16
  const cache = await packageManager.createCacheHandler();
15
17
 
16
- const list = await packageManager.workspace.listPackages();
18
+ const list = await workspace.listPackages();
17
19
 
18
20
  logger.log('删除%d个项目在 %s 的npm缓存', list.length, cache.path);
19
21
  for (const data of list) {
@@ -0,0 +1,168 @@
1
+ import { createWorkspace, type MonorepoWorkspace } from '@build-script/monorepo-lib';
2
+ import { argv } from '@idlebox/args/default';
3
+ import type { DeepReadonly, IPackageJson } from '@idlebox/common';
4
+ import { ensureLinkTargetSync } from '@idlebox/ensure-symlink';
5
+ import { logger } from '@idlebox/logger';
6
+ import { relativePath } from '@idlebox/node';
7
+ import { readFileSync } from 'node:fs';
8
+ import { basename, resolve } from 'node:path';
9
+ import { CommandDefine, pArgS } from '../common/functions/cli.js';
10
+
11
+ export class Command extends CommandDefine {
12
+ protected override _usage = `${pArgS('--from=...')} ${pArgS('--recursive')}`;
13
+ protected override _description = '将monorepo中每个项目的bins连接到当前项目的 ./node_modules/.bin';
14
+ protected override _help = '存在bin同名时,monorepo项目优先于npm包';
15
+ protected override _arguments = {
16
+ '--from': {
17
+ flag: false,
18
+ description: '将<value>视为各个项目的直接依赖 (必须是至少一个项目的依赖,否则找不到)',
19
+ },
20
+ '--transparent': {
21
+ flag: false,
22
+ description: '将<value>的所有直接依赖视为此项目的直接依赖',
23
+ },
24
+ '--recursive': { flag: true, description: '在每个项目中运行,而非当前项目' },
25
+ };
26
+ }
27
+
28
+ interface BinaryDefine {
29
+ readonly name: string;
30
+ readonly absolutePath: string;
31
+ }
32
+ interface IJobContext {
33
+ readonly packageRoot: string;
34
+ readonly deps: readonly BinaryDefine[];
35
+ readonly globalDeps: readonly BinaryDefine[];
36
+ readonly monorepo: readonly BinaryDefine[];
37
+ }
38
+
39
+ export async function main() {
40
+ const recursiveMode = argv.flag('--recursive') > 0;
41
+
42
+ const workspace = await createWorkspace();
43
+
44
+ const localPackages = [];
45
+ const projectList = await workspace.listPackages();
46
+ for (const pkg of projectList) {
47
+ if (!pkg.packageJson.name) continue;
48
+ localPackages.push(pkg.packageJson.name);
49
+ }
50
+
51
+ const additionalPackages = new Set(argv.multiple('--from'));
52
+ for (const projectName of argv.multiple('--transparent')) {
53
+ const proj = await workspace.getPackage(projectName);
54
+ if (!proj) {
55
+ throw new Error(`missing transparent project: ${projectName}`);
56
+ }
57
+ for (const item of depNames(proj.packageJson)) {
58
+ additionalPackages.add(item);
59
+ }
60
+ }
61
+
62
+ for (const name of additionalPackages) {
63
+ if (await workspace.getPackage(name)) {
64
+ throw new Error('--from can not be a local package');
65
+ }
66
+ }
67
+
68
+ const locals = await createBins(workspace, localPackages);
69
+ const globals = await createBins(workspace, [...additionalPackages]);
70
+
71
+ if (recursiveMode) {
72
+ for (const pkg of projectList) {
73
+ const current = await createBins(workspace, depNames(pkg.packageJson));
74
+ await execute({
75
+ deps: current,
76
+ globalDeps: globals,
77
+ monorepo: locals,
78
+ packageRoot: pkg.absolute,
79
+ });
80
+ }
81
+ } else {
82
+ const pkg = await workspace.getNearestPackage(process.cwd());
83
+ const current = await createBins(workspace, depNames(pkg.packageJson));
84
+ await execute({
85
+ deps: current,
86
+ globalDeps: globals,
87
+ monorepo: locals,
88
+ packageRoot: pkg.absolute,
89
+ });
90
+ }
91
+ }
92
+
93
+ async function execute(ctx: IJobContext) {
94
+ logger.log`linking binaries in project long<${ctx.packageRoot}>`;
95
+
96
+ const final = new Map<string, string>();
97
+ for (const list of [ctx.globalDeps, ctx.deps, ctx.monorepo]) {
98
+ for (const bin of list) {
99
+ final.set(bin.name, bin.absolutePath);
100
+ }
101
+ }
102
+
103
+ const dry = argv.flag('--dry') > 0;
104
+ const bindir = resolve(ctx.packageRoot, 'node_modules/.bin');
105
+ for (const [name, target] of final) {
106
+ const link = `${bindir}/${name}`;
107
+ const rel = relativePath(bindir, target);
108
+ if (dry) {
109
+ logger.success(`Would link ${link} -> ${rel}`);
110
+ } else {
111
+ const ch = ensureLinkTargetSync(rel, link);
112
+ if (ch) {
113
+ logger.success`symlink: ${name} -> ${rel}`;
114
+ } else {
115
+ logger.debug`unchanged: ${name} -> ${rel}`;
116
+ }
117
+ }
118
+ }
119
+ }
120
+
121
+ function depNames(pkgJson: DeepReadonly<IPackageJson>) {
122
+ const o = Object.assign({}, pkgJson.dependencies, pkgJson.devDependencies, pkgJson.optionalDependencies);
123
+ const r: string[] = [];
124
+ for (const [name, version] of Object.entries(o)) {
125
+ if (version.startsWith('workspace:')) {
126
+ } else {
127
+ r.push(name);
128
+ }
129
+ }
130
+ return r;
131
+ }
132
+
133
+ async function createBins(workspace: MonorepoWorkspace, names: string[]) {
134
+ const bins: BinaryDefine[] = [];
135
+ const packageList = workspace.listPackages();
136
+
137
+ for (const want of names) {
138
+ for (const proj of await packageList) {
139
+ if (proj.name === want) {
140
+ makeBinMap(bins, proj.absolute, proj.packageJson);
141
+ }
142
+ const deps = depNames(proj.packageJson);
143
+ if (deps.includes(want)) {
144
+ const depRoot = resolve(proj.absolute, 'node_modules', want);
145
+ const pkgJson: IPackageJson = JSON.parse(readFileSync(resolve(depRoot, 'package.json'), 'utf-8'));
146
+ makeBinMap(bins, depRoot, pkgJson);
147
+ }
148
+ }
149
+ }
150
+
151
+ return bins;
152
+ }
153
+
154
+ function makeBinMap(result: BinaryDefine[], absolute: string, json: DeepReadonly<IPackageJson>) {
155
+ if (!json.bin) return;
156
+
157
+ let bins: Record<string, string> = {};
158
+ if (typeof json.bin === 'string') {
159
+ bins[basename(json.name)] = json.bin;
160
+ } else {
161
+ bins = json.bin;
162
+ }
163
+
164
+ for (const [name, path] of Object.entries(bins)) {
165
+ const absolutePath = resolve(absolute, path);
166
+ result.push({ name, absolutePath });
167
+ }
168
+ }
@@ -1,20 +1,15 @@
1
- import {
2
- createWorkspace,
3
- normalizePackageName,
4
- type IPackageInfo,
5
- type MonorepoWorkspace,
6
- } from '@build-script/monorepo-lib';
1
+ import { createWorkspace, normalizePackageName, type IPackageInfo, type MonorepoWorkspace } from '@build-script/monorepo-lib';
7
2
  import { Emitter, prettyPrintError } from '@idlebox/common';
8
- import { BuilderDependencyGraph, type IWatchEvents } from '@idlebox/dependency-graph';
3
+ import { Job, JobGraphBuilder } from '@idlebox/dependency-graph';
9
4
  import { logger } from '@idlebox/logger';
10
5
  import { commandInPath, emptyDir, writeFileIfChangeSync } from '@idlebox/node';
11
- import { cpSync, existsSync } from 'fs';
12
- import { resolve } from 'path';
13
- import { inspect } from 'util';
6
+ import { cpSync, existsSync } from 'node:fs';
7
+ import { resolve } from 'node:path';
14
8
  import { argv, CommandDefine, CSI, pArgS } from '../common/functions/cli.js';
15
9
  import { PackageManagerUsageKind } from '../common/package-manager/driver.abstract.js';
16
10
  import { increaseVersion } from '../common/package-manager/package-json.js';
17
11
  import { createPackageManager } from '../common/package-manager/package-manager.js';
12
+ import { clearNpmMetaCache } from '../common/shared-jobs/clear-cache.js';
18
13
  import { cnpmSyncNames } from '../common/shared-jobs/cnpm-sync.js';
19
14
  import { executeChangeDetect } from '../common/shared-jobs/detect-change-job.js';
20
15
 
@@ -29,14 +24,14 @@ export class Command extends CommandDefine {
29
24
  };
30
25
  }
31
26
 
32
- interface IState {
27
+ interface IPayload {
33
28
  readonly index: number;
34
29
  readonly length: number;
35
30
  readonly options: ReturnType<typeof options>;
36
31
  }
37
32
 
38
33
  let indexDisplay = 0;
39
- class BuildPackageJob implements IWatchEvents {
34
+ class BuildPackageJob extends Job<void> {
40
35
  private readonly _onSuccess = new Emitter<void>();
41
36
  public readonly onSuccess = this._onSuccess.event;
42
37
 
@@ -49,13 +44,17 @@ class BuildPackageJob implements IWatchEvents {
49
44
  private shouldPublish = '';
50
45
 
51
46
  constructor(
52
- private readonly state: IState,
47
+ name: string,
48
+ deps: readonly string[],
49
+ private readonly payload: IPayload,
53
50
  private readonly project: IPackageInfo,
54
51
  private readonly workspace: MonorepoWorkspace,
55
52
  ) {
53
+ super(name, deps);
54
+
56
55
  this.onSuccess(() => {
57
56
  indexDisplay++;
58
- const { length } = this.state;
57
+ const { length } = this.payload;
59
58
  const w = length.toFixed(0).length;
60
59
  console.log(`${CSI}K📦 [${indexDisplay.toFixed(0).padStart(w)}/${length}] ${this.project.name}`);
61
60
  console.log(this.logText.join('\n'));
@@ -63,7 +62,7 @@ class BuildPackageJob implements IWatchEvents {
63
62
  });
64
63
  this.onFailed((e) => {
65
64
  indexDisplay++;
66
- const { length } = this.state;
65
+ const { length } = this.payload;
67
66
  const w = length.toFixed(0).length;
68
67
  console.log(`${CSI}K📦 [${indexDisplay.toFixed(0).padStart(w)}/${length}] ${this.project.name}`);
69
68
  console.log(this.logText.join('\n'));
@@ -72,26 +71,20 @@ class BuildPackageJob implements IWatchEvents {
72
71
  });
73
72
  }
74
73
 
75
- get name() {
76
- return this.project.name;
77
- }
78
-
79
74
  getPackagePath() {
80
75
  return this.shouldPublish || undefined;
81
76
  }
82
77
 
83
- async execute() {
78
+ protected override async _execute() {
84
79
  this._onRunning.fire();
85
80
  this.log(` 🔍 ${CSI}38;5;14m检查包${CSI}0m`);
86
81
 
87
82
  const pm = await createPackageManager(PackageManagerUsageKind.Write, this.workspace, this.project.absolute);
88
83
  const { changedFiles, hasChange, remoteVersion } = await executeChangeDetect(pm, {});
89
- let shouldPublish = hasChange || changedFiles.length > 0;
84
+ const shouldPublish = hasChange || changedFiles.length > 0;
90
85
  let localVersion = this.project.packageJson.version;
91
86
 
92
- this.log(
93
- ` 👀 ${changedFiles.length} 个文件有修改: ${changedFiles.slice(0, 3).join(', ')}${changedFiles.length > 3 ? ' ...' : ''}`,
94
- );
87
+ this.log(` 👀 ${changedFiles.length} 个文件有修改: ${changedFiles.slice(0, 3).join(', ')}${changedFiles.length > 3 ? ' ...' : ''}`);
95
88
  if (hasChange) {
96
89
  const packageJson = await pm.loadPackageJson();
97
90
  localVersion = await increaseVersion(packageJson, remoteVersion || '0.0.0');
@@ -105,16 +98,13 @@ class BuildPackageJob implements IWatchEvents {
105
98
 
106
99
  this.log(` 🔄 打包文件`);
107
100
 
108
- const tempFile = resolve(
109
- this.workspace.temp,
110
- `publish/${normalizePackageName(this.project.name)}-${localVersion}.tgz`,
111
- );
101
+ const tempFile = resolve(this.workspace.temp, `publish/${normalizePackageName(this.project.name)}-${localVersion}.tgz`);
112
102
  this.shouldPublish = await pm.pack(tempFile);
113
103
 
114
104
  if (remoteVersion) {
115
- this.log(` 🎈 即将发布新版本 "${localVersion}" 以更新远程版本 "${remoteVersion}"`);
105
+ this.log(` 🎈 即将发布新版本 "${localVersion}" 以更新远程版本 "${remoteVersion}"\n`);
116
106
  } else {
117
- this.log(` 🎈 即将发布初始版本 "${localVersion}"`);
107
+ this.log(` 🎈 即将发布初始版本 "${localVersion}"\n`);
118
108
  }
119
109
  this._onSuccess.fire();
120
110
  }
@@ -123,11 +113,6 @@ class BuildPackageJob implements IWatchEvents {
123
113
  log(text: string) {
124
114
  this.logText.push(text);
125
115
  }
126
-
127
- [inspect.custom]() {
128
- // TODO
129
- return '~~~~~~~~';
130
- }
131
116
  }
132
117
 
133
118
  function options() {
@@ -147,16 +132,11 @@ export async function main() {
147
132
 
148
133
  const projects = await workspace.listPackages();
149
134
 
150
- const concurrency = argv.flag(['--debug', '-d']) > 0 ? 1 : 10;
135
+ const concurrency = 1; // argv.flag(['--debug', '-d']) > 0 ? 1 : 10;
151
136
  if (concurrency === 1) {
152
- logger.warn`由于设置了--debug参数,运行模式改为单线程`;
153
- }
154
- const graph = new BuilderDependencyGraph<BuildPackageJob>(concurrency, logger);
155
-
156
- function debugSummary() {
157
- const info = graph.debugFormatSummary();
158
- process.stderr.write(`${CSI}K${info}\r`);
137
+ // logger.warn`由于设置了--debug参数,运行模式改为单线程`;
159
138
  }
139
+ const builder = new JobGraphBuilder(concurrency, logger);
160
140
 
161
141
  const opts = options();
162
142
 
@@ -166,7 +146,7 @@ export async function main() {
166
146
  if (project.packageJson.private) {
167
147
  console.log(`📦 ${project.name}`);
168
148
  console.log(` 🛑 跳过,private=true: ${project.name}`);
169
- graph.addEmptyNode(project.name);
149
+ builder.addEmptyNode(project.name);
170
150
  return false;
171
151
  }
172
152
 
@@ -176,6 +156,8 @@ export async function main() {
176
156
  let index = 0;
177
157
  for (const project of shouldPublishProjects) {
178
158
  const job = new BuildPackageJob(
159
+ project.name,
160
+ project.devDependencies,
179
161
  {
180
162
  index,
181
163
  length: shouldPublishProjects.length,
@@ -188,16 +170,22 @@ export async function main() {
188
170
  job.onRunning(debugSummary);
189
171
  job.onSuccess(debugSummary);
190
172
  job.onFailed(debugSummary);
191
- graph.addNode(project.name, project.devDependencies, job);
173
+ builder.addNode(job);
192
174
 
193
175
  index++;
194
176
  }
195
177
 
178
+ const graph = builder.finalize();
179
+
180
+ function debugSummary() {
181
+ const info = graph?.debugFormatSummary();
182
+ process.stderr.write(`${CSI}K${info}\r`);
183
+ }
196
184
  await graph.startup();
197
185
 
198
186
  const packageToPublish: { name: string; pack: string }[] = [];
199
187
  for (const id of graph.overallOrder) {
200
- const node = graph.getNodeData(id);
188
+ const node = graph.getNodeByName(id);
201
189
  if (!(node instanceof BuildPackageJob)) continue;
202
190
 
203
191
  const pack = node.getPackagePath();
@@ -215,17 +203,17 @@ export async function main() {
215
203
  const npmrc = workspace.getNpmRCPath(true);
216
204
  if (existsSync(npmrc)) {
217
205
  cpSync(npmrc, resolve(temp, '.npmrc'));
218
- writeFileIfChangeSync(resolve(temp, 'package.json'), '{}');
219
206
  }
207
+ writeFileIfChangeSync(resolve(temp, 'package.json'), '{}');
220
208
 
221
209
  const w = packageToPublish.length.toFixed(0).length;
222
- let published: string[] = [];
210
+ const published: string[] = [];
223
211
 
224
212
  try {
225
213
  index = 1;
226
214
  for (const { name, pack } of packageToPublish) {
227
215
  console.log(`📦 [${index.toFixed(0).padStart(w)}/${packageToPublish.length}] ${name}`);
228
- const r = await pm.uploadTarball(pack);
216
+ const r = await pm.uploadTarball(pack, temp);
229
217
  if (r.published) {
230
218
  console.log(` 👌 已发布新版本 ${r.version}`);
231
219
  } else {
@@ -237,12 +225,15 @@ export async function main() {
237
225
  }
238
226
 
239
227
  console.log(`🎉 所有任务完成,共发布了 ${published.length} 个包`);
240
- } catch (e) {
241
- logger.error`发布过程中发生错误: ${e instanceof Error ? e.message : e}`;
242
- throw e;
228
+ } catch (e: any) {
229
+ prettyPrintError(`发布过程中发生错误`, e);
230
+ process.exitCode = 1;
243
231
  } finally {
244
- if (await commandInPath('cnpm')) {
245
- await cnpmSyncNames(published, true).catch();
232
+ if (published.length > 0 && (await commandInPath('cnpm'))) {
233
+ await cnpmSyncNames(published, true);
234
+
235
+ const pm = await createPackageManager(PackageManagerUsageKind.Read, workspace);
236
+ await clearNpmMetaCache(pm, published);
246
237
  }
247
238
  }
248
239
  }
@@ -10,8 +10,7 @@ import { argv, CommandDefine, pArgS } from '../common/functions/cli.js';
10
10
  export class Command extends CommandDefine {
11
11
  protected override _usage = `${pArgS('--dev')}`;
12
12
  protected override _description = '为所有项目的 tsconfig.json 添加 references 字段';
13
- protected override _help =
14
- `查找tsconfig.json和src/tsconfig.json\n 如果不在这里,可以在package.json中设置exports['./tsconfig.json'] = './xxxx'`;
13
+ protected override _help = `查找tsconfig.json和src/tsconfig.json\n 如果不在这里,可以在package.json中设置exports['./tsconfig.json'] = './xxxx'`;
15
14
  protected override _arguments = {
16
15
  '--dev': { flag: true, description: '也将devDependencies中的包添加到references中' },
17
16
  };
@@ -1,4 +1,4 @@
1
- import type { IPackageInfo } from '@build-script/monorepo-lib';
1
+ import { createWorkspace, type IPackageInfo } from '@build-script/monorepo-lib';
2
2
  import { loadJsonFile, writeJsonFileBack } from '@idlebox/json-edit';
3
3
  import { logger } from '@idlebox/logger';
4
4
  import { resolve } from 'node:path';
@@ -17,8 +17,9 @@ export async function main() {
17
17
  const dryRun = argv.flag('--dry') > 0;
18
18
  const skipUpdate = argv.flag('--skip-update') > 0;
19
19
 
20
- const packageManager = await createPackageManager(PackageManagerUsageKind.Read);
21
- const projects = await packageManager.workspace.listPackages();
20
+ const workspace = await createWorkspace();
21
+ const packageManager = await createPackageManager(PackageManagerUsageKind.Read, workspace);
22
+ const projects = await workspace.listPackages();
22
23
 
23
24
  logger.log('Collecting local project versions:');
24
25
  const alldeps: Record<string, string> = {};