@build-script/package-tools 0.0.3 → 0.0.5

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 (113) 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 +45 -36
  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 +4 -1
  38. package/lib/common/functions/cli.d.ts.map +1 -1
  39. package/lib/common/functions/cli.js +3 -3
  40. package/lib/common/functions/cli.js.map +1 -1
  41. package/lib/common/git/git.d.ts +1 -0
  42. package/lib/common/git/git.d.ts.map +1 -1
  43. package/lib/common/git/git.js +38 -0
  44. package/lib/common/git/git.js.map +1 -1
  45. package/lib/common/package-manager/driver.abstract.d.ts +3 -3
  46. package/lib/common/package-manager/driver.abstract.d.ts.map +1 -1
  47. package/lib/common/package-manager/driver.abstract.js +2 -4
  48. package/lib/common/package-manager/driver.abstract.js.map +1 -1
  49. package/lib/common/package-manager/driver.pnpm.d.ts.map +1 -1
  50. package/lib/common/package-manager/driver.pnpm.js +6 -3
  51. package/lib/common/package-manager/driver.pnpm.js.map +1 -1
  52. package/lib/common/package-manager/functions.d.ts.map +1 -1
  53. package/lib/common/package-manager/functions.js.map +1 -1
  54. package/lib/common/package-manager/package-manager.d.ts +2 -2
  55. package/lib/common/package-manager/package-manager.d.ts.map +1 -1
  56. package/lib/common/package-manager/package-manager.js +0 -3
  57. package/lib/common/package-manager/package-manager.js.map +1 -1
  58. package/lib/common/package-manager/proxy.js +1 -1
  59. package/lib/common/package-manager/proxy.js.map +1 -1
  60. package/lib/common/shared-jobs/clear-cache.d.ts +3 -0
  61. package/lib/common/shared-jobs/clear-cache.d.ts.map +1 -0
  62. package/lib/common/shared-jobs/clear-cache.js +14 -0
  63. package/lib/common/shared-jobs/clear-cache.js.map +1 -0
  64. package/lib/common/shared-jobs/cnpm-sync.d.ts +0 -2
  65. package/lib/common/shared-jobs/cnpm-sync.d.ts.map +1 -1
  66. package/lib/common/shared-jobs/cnpm-sync.js +1 -22
  67. package/lib/common/shared-jobs/cnpm-sync.js.map +1 -1
  68. package/lib/common/shared-jobs/detect-change-job.d.ts.map +1 -1
  69. package/lib/common/shared-jobs/detect-change-job.js +6 -0
  70. package/lib/common/shared-jobs/detect-change-job.js.map +1 -1
  71. package/lib/common/taball/decompress.d.ts.map +1 -1
  72. package/lib/common/taball/decompress.js +4 -1
  73. package/lib/common/taball/decompress.js.map +1 -1
  74. package/lib/common/taball/file-download.js +2 -7
  75. package/lib/common/taball/file-download.js.map +1 -1
  76. package/lib/common/temp-work-folder.d.ts +2 -2
  77. package/lib/common/temp-work-folder.d.ts.map +1 -1
  78. package/lib/common/temp-work-folder.js.map +1 -1
  79. package/lib/common/version.generated.d.ts +2 -2
  80. package/lib/common/version.generated.js +2 -2
  81. package/lib/main.js +1 -1
  82. package/lib/main.js.map +1 -1
  83. package/lib/tsconfig.tsbuildinfo +1 -1
  84. package/package.json +12 -12
  85. package/src/command-file-map.generated.ts +2 -1
  86. package/src/command-file-map.generator.ts +2 -2
  87. package/src/commands/detect-package-change.ts +3 -1
  88. package/src/commands/monorepo-bump-version.ts +17 -28
  89. package/src/commands/monorepo-cnpm-sync.ts +14 -2
  90. package/src/commands/monorepo-invalid.ts +4 -2
  91. package/src/commands/monorepo-link-binaries.ts +168 -0
  92. package/src/commands/monorepo-publish.ts +58 -54
  93. package/src/commands/monorepo-tsconfig.ts +1 -2
  94. package/src/commands/monorepo-upgrade.ts +4 -3
  95. package/src/commands/run-if-version-mismatch.ts +7 -7
  96. package/src/commands/test.ts +3 -1
  97. package/src/common/cache/native.npm.ts +2 -2
  98. package/src/common/functions/cli.ts +6 -3
  99. package/src/common/git/git.ts +44 -6
  100. package/src/common/package-manager/driver.abstract.ts +4 -7
  101. package/src/common/package-manager/driver.pnpm.ts +8 -3
  102. package/src/common/package-manager/functions.ts +2 -12
  103. package/src/common/package-manager/package-manager.ts +3 -13
  104. package/src/common/package-manager/proxy.ts +1 -1
  105. package/src/common/shared-jobs/clear-cache.ts +14 -0
  106. package/src/common/shared-jobs/cnpm-sync.ts +1 -25
  107. package/src/common/shared-jobs/detect-change-job.ts +7 -0
  108. package/src/common/taball/decompress.ts +3 -1
  109. package/src/common/taball/file-download.ts +4 -15
  110. package/src/common/temp-work-folder.ts +2 -2
  111. package/src/common/version.generated.ts +2 -2
  112. package/src/common/version.generator.ts +1 -1
  113. package/src/main.ts +2 -14
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.3",
4
+ "version": "0.0.5",
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.2",
25
- "@idlebox/common": "^1.4.15",
26
- "@idlebox/args": "^0.0.10",
27
- "@idlebox/ensure-symlink": "^1.0.33",
28
- "@idlebox/logger": "^0.0.3",
29
- "@idlebox/json-edit": "^0.0.2",
30
- "@idlebox/dependency-graph": "^0.0.2",
31
- "@idlebox/node": "^1.4.8"
24
+ "@build-script/monorepo-lib": "^0.0.4",
25
+ "@idlebox/args": "^0.0.12",
26
+ "@idlebox/ensure-symlink": "^1.0.35",
27
+ "@idlebox/common": "^1.4.17",
28
+ "@idlebox/logger": "^0.0.5",
29
+ "@idlebox/json-edit": "^0.0.4",
30
+ "@idlebox/node": "^1.4.10",
31
+ "@idlebox/dependency-graph": "^0.0.4"
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.2",
45
- "@build-script/single-dog-asset": "^1.0.36",
44
+ "@build-script/codegen": "^1.0.5",
45
+ "@build-script/single-dog-asset": "^1.0.38",
46
46
  "@internal/local-rig": "^1.0.1",
47
- "@mpis/run": "^0.0.3"
47
+ "@mpis/run": "^0.0.5"
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.2 - The Simple Code Generater
10
+ * @build-script/codegen 1.0.5 - 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,50 +44,51 @@ 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
- console.log(`📦 [${indexDisplay.toFixed(0).padStart(w)}/${length}] ${this.project.name}`);
59
+ console.log(`${CSI}K📦 [${indexDisplay.toFixed(0).padStart(w)}/${length}] ${this.project.name}`);
61
60
  console.log(this.logText.join('\n'));
62
61
  this.logText.length = 0;
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
- console.log(`📦 [${indexDisplay.toFixed(0).padStart(w)}/${length}] ${this.project.name}`);
67
+ console.log(`${CSI}K📦 [${indexDisplay.toFixed(0).padStart(w)}/${length}] ${this.project.name}`);
69
68
  console.log(this.logText.join('\n'));
70
69
  prettyPrintError('❌pack failed', e);
71
70
  this.logText.length = 0;
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
 
87
+ this.log(` 👀 ${changedFiles.length} 个文件有修改: ${changedFiles.slice(0, 3).join(', ')}${changedFiles.length > 3 ? ' ...' : ''}`);
92
88
  if (hasChange) {
93
89
  const packageJson = await pm.loadPackageJson();
94
90
  localVersion = await increaseVersion(packageJson, remoteVersion || '0.0.0');
95
- this.log(` ✍️ 已修改本地包版本: ${localVersion}`);
91
+ this.log(` ✍️ 已修改本地包版本: ${localVersion}`);
96
92
  }
97
93
  if (!shouldPublish) {
98
94
  this.log(` ✨ ${CSI}38;5;10m未发现修改${CSI}0m\n`);
@@ -102,16 +98,13 @@ class BuildPackageJob implements IWatchEvents {
102
98
 
103
99
  this.log(` 🔄 打包文件`);
104
100
 
105
- const tempFile = resolve(
106
- this.workspace.temp,
107
- `publish/${normalizePackageName(this.project.name)}-${localVersion}.tgz`,
108
- );
101
+ const tempFile = resolve(this.workspace.temp, `publish/${normalizePackageName(this.project.name)}-${localVersion}.tgz`);
109
102
  this.shouldPublish = await pm.pack(tempFile);
110
103
 
111
104
  if (remoteVersion) {
112
- this.log(` 🎈 即将发布新版本 "${this.project.packageJson.version}" 以更新远程版本 "${remoteVersion}"`);
105
+ this.log(` 🎈 即将发布新版本 "${localVersion}" 以更新远程版本 "${remoteVersion}"`);
113
106
  } else {
114
- this.log(` 🎈 即将发布初始版本 "${this.project.packageJson.version}"`);
107
+ this.log(` 🎈 即将发布初始版本 "${localVersion}"`);
115
108
  }
116
109
  this._onSuccess.fire();
117
110
  }
@@ -120,11 +113,6 @@ class BuildPackageJob implements IWatchEvents {
120
113
  log(text: string) {
121
114
  this.logText.push(text);
122
115
  }
123
-
124
- [inspect.custom]() {
125
- // TODO
126
- return '~~~~~~~~';
127
- }
128
116
  }
129
117
 
130
118
  function options() {
@@ -144,8 +132,12 @@ export async function main() {
144
132
 
145
133
  const projects = await workspace.listPackages();
146
134
 
147
- const concurrency = argv.flag(['--debug', '-d']) > 0 ? 1 : 10;
148
- const graph = new BuilderDependencyGraph<BuildPackageJob>(concurrency, logger);
135
+ const concurrency = 1; // argv.flag(['--debug', '-d']) > 0 ? 1 : 10;
136
+ if (concurrency === 1) {
137
+ logger.warn`由于设置了--debug参数,运行模式改为单线程`;
138
+ }
139
+ const builder = new JobGraphBuilder(concurrency, logger);
140
+
149
141
  const opts = options();
150
142
 
151
143
  const shouldPublishProjects = projects.filter((project) => {
@@ -154,7 +146,7 @@ export async function main() {
154
146
  if (project.packageJson.private) {
155
147
  console.log(`📦 ${project.name}`);
156
148
  console.log(` 🛑 跳过,private=true: ${project.name}`);
157
- graph.addEmptyNode(project.name);
149
+ builder.addEmptyNode(project.name);
158
150
  return false;
159
151
  }
160
152
 
@@ -163,28 +155,37 @@ export async function main() {
163
155
 
164
156
  let index = 0;
165
157
  for (const project of shouldPublishProjects) {
166
- graph.addNode(
158
+ const job = new BuildPackageJob(
167
159
  project.name,
168
160
  project.devDependencies,
169
- new BuildPackageJob(
170
- {
171
- index,
172
- length: shouldPublishProjects.length,
173
- options: opts,
174
- },
175
- project,
176
- workspace,
177
- ),
161
+ {
162
+ index,
163
+ length: shouldPublishProjects.length,
164
+ options: opts,
165
+ },
166
+ project,
167
+ workspace,
178
168
  );
179
169
 
170
+ job.onRunning(debugSummary);
171
+ job.onSuccess(debugSummary);
172
+ job.onFailed(debugSummary);
173
+ builder.addNode(job);
174
+
180
175
  index++;
181
176
  }
182
177
 
178
+ const graph = builder.finalize();
179
+
180
+ function debugSummary() {
181
+ const info = graph?.debugFormatSummary();
182
+ process.stderr.write(`${CSI}K${info}\r`);
183
+ }
183
184
  await graph.startup();
184
185
 
185
186
  const packageToPublish: { name: string; pack: string }[] = [];
186
187
  for (const id of graph.overallOrder) {
187
- const node = graph.getNodeData(id);
188
+ const node = graph.getNodeByName(id);
188
189
  if (!(node instanceof BuildPackageJob)) continue;
189
190
 
190
191
  const pack = node.getPackagePath();
@@ -202,17 +203,17 @@ export async function main() {
202
203
  const npmrc = workspace.getNpmRCPath(true);
203
204
  if (existsSync(npmrc)) {
204
205
  cpSync(npmrc, resolve(temp, '.npmrc'));
205
- writeFileIfChangeSync(resolve(temp, 'package.json'), '{}');
206
206
  }
207
+ writeFileIfChangeSync(resolve(temp, 'package.json'), '{}');
207
208
 
208
209
  const w = packageToPublish.length.toFixed(0).length;
209
- let published: string[] = [];
210
+ const published: string[] = [];
210
211
 
211
212
  try {
212
213
  index = 1;
213
214
  for (const { name, pack } of packageToPublish) {
214
215
  console.log(`📦 [${index.toFixed(0).padStart(w)}/${packageToPublish.length}] ${name}`);
215
- const r = await pm.uploadTarball(pack);
216
+ const r = await pm.uploadTarball(pack, temp);
216
217
  if (r.published) {
217
218
  console.log(` 👌 已发布新版本 ${r.version}`);
218
219
  } else {
@@ -228,8 +229,11 @@ export async function main() {
228
229
  logger.error`发布过程中发生错误: ${e instanceof Error ? e.message : e}`;
229
230
  throw e;
230
231
  } finally {
231
- if (await commandInPath('cnpm')) {
232
- 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);
233
237
  }
234
238
  }
235
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
  };