@build-script/package-tools 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +136 -0
- package/config/rig.json +6 -0
- package/lib/command-file-map.generated.d.ts +23 -0
- package/lib/command-file-map.generated.d.ts.map +1 -0
- package/lib/command-file-map.generated.js +27 -0
- package/lib/command-file-map.generated.js.map +1 -0
- package/lib/commands/detect-package-change.d.ts +14 -0
- package/lib/commands/detect-package-change.d.ts.map +1 -0
- package/lib/commands/detect-package-change.js +55 -0
- package/lib/commands/detect-package-change.js.map +1 -0
- package/lib/commands/monorepo-bump-version.d.ts +22 -0
- package/lib/commands/monorepo-bump-version.d.ts.map +1 -0
- package/lib/commands/monorepo-bump-version.js +121 -0
- package/lib/commands/monorepo-bump-version.js.map +1 -0
- package/lib/commands/monorepo-cnpm-sync.d.ts +8 -0
- package/lib/commands/monorepo-cnpm-sync.d.ts.map +1 -0
- package/lib/commands/monorepo-cnpm-sync.js +16 -0
- package/lib/commands/monorepo-cnpm-sync.js.map +1 -0
- package/lib/commands/monorepo-invalid.d.ts +8 -0
- package/lib/commands/monorepo-invalid.d.ts.map +1 -0
- package/lib/commands/monorepo-invalid.js +19 -0
- package/lib/commands/monorepo-invalid.js.map +1 -0
- package/lib/commands/monorepo-list.d.ts +22 -0
- package/lib/commands/monorepo-list.d.ts.map +1 -0
- package/lib/commands/monorepo-list.js +40 -0
- package/lib/commands/monorepo-list.js.map +1 -0
- package/lib/commands/monorepo-publish.d.ts +22 -0
- package/lib/commands/monorepo-publish.d.ts.map +1 -0
- package/lib/commands/monorepo-publish.js +178 -0
- package/lib/commands/monorepo-publish.js.map +1 -0
- package/lib/commands/monorepo-tsconfig.d.ts +14 -0
- package/lib/commands/monorepo-tsconfig.d.ts.map +1 -0
- package/lib/commands/monorepo-tsconfig.js +131 -0
- package/lib/commands/monorepo-tsconfig.js.map +1 -0
- package/lib/commands/monorepo-upgrade.d.ts +8 -0
- package/lib/commands/monorepo-upgrade.d.ts.map +1 -0
- package/lib/commands/monorepo-upgrade.js +110 -0
- package/lib/commands/monorepo-upgrade.js.map +1 -0
- package/lib/commands/run-if-version-mismatch.d.ts +23 -0
- package/lib/commands/run-if-version-mismatch.d.ts.map +1 -0
- package/lib/commands/run-if-version-mismatch.js +64 -0
- package/lib/commands/run-if-version-mismatch.js.map +1 -0
- package/lib/commands/sync-my-readme.d.ts +9 -0
- package/lib/commands/sync-my-readme.d.ts.map +1 -0
- package/lib/commands/sync-my-readme.js +51 -0
- package/lib/commands/sync-my-readme.js.map +1 -0
- package/lib/commands/test.d.ts +9 -0
- package/lib/commands/test.d.ts.map +1 -0
- package/lib/commands/test.js +16 -0
- package/lib/commands/test.js.map +1 -0
- package/lib/common/cache/escape-package-path.d.ts +2 -0
- package/lib/common/cache/escape-package-path.d.ts.map +1 -0
- package/lib/common/cache/escape-package-path.js +7 -0
- package/lib/common/cache/escape-package-path.js.map +1 -0
- package/lib/common/cache/native.npm.d.ts +50 -0
- package/lib/common/cache/native.npm.d.ts.map +1 -0
- package/lib/common/cache/native.npm.js +162 -0
- package/lib/common/cache/native.npm.js.map +1 -0
- package/lib/common/functions/cli.d.ts +85 -0
- package/lib/common/functions/cli.d.ts.map +1 -0
- package/lib/common/functions/cli.js +110 -0
- package/lib/common/functions/cli.js.map +1 -0
- package/lib/common/functions/global-lifecycle.d.ts +5 -0
- package/lib/common/functions/global-lifecycle.d.ts.map +1 -0
- package/lib/common/functions/global-lifecycle.js +34 -0
- package/lib/common/functions/global-lifecycle.js.map +1 -0
- package/lib/common/git/git.d.ts +12 -0
- package/lib/common/git/git.d.ts.map +1 -0
- package/lib/common/git/git.js +65 -0
- package/lib/common/git/git.js.map +1 -0
- package/lib/common/package-manager/constant.d.ts +2 -0
- package/lib/common/package-manager/constant.d.ts.map +1 -0
- package/lib/common/package-manager/constant.js +2 -0
- package/lib/common/package-manager/constant.js.map +1 -0
- package/lib/common/package-manager/driver.abstract.d.ts +41 -0
- package/lib/common/package-manager/driver.abstract.d.ts.map +1 -0
- package/lib/common/package-manager/driver.abstract.js +138 -0
- package/lib/common/package-manager/driver.abstract.js.map +1 -0
- package/lib/common/package-manager/driver.npm.d.ts +7 -0
- package/lib/common/package-manager/driver.npm.d.ts.map +1 -0
- package/lib/common/package-manager/driver.npm.js +11 -0
- package/lib/common/package-manager/driver.npm.js.map +1 -0
- package/lib/common/package-manager/driver.pnpm.d.ts +7 -0
- package/lib/common/package-manager/driver.pnpm.d.ts.map +1 -0
- package/lib/common/package-manager/driver.pnpm.js +83 -0
- package/lib/common/package-manager/driver.pnpm.js.map +1 -0
- package/lib/common/package-manager/functions.d.ts +13 -0
- package/lib/common/package-manager/functions.d.ts.map +1 -0
- package/lib/common/package-manager/functions.js +95 -0
- package/lib/common/package-manager/functions.js.map +1 -0
- package/lib/common/package-manager/package-json.d.ts +5 -0
- package/lib/common/package-manager/package-json.d.ts.map +1 -0
- package/lib/common/package-manager/package-json.js +50 -0
- package/lib/common/package-manager/package-json.js.map +1 -0
- package/lib/common/package-manager/package-manager.d.ts +5 -0
- package/lib/common/package-manager/package-manager.d.ts.map +1 -0
- package/lib/common/package-manager/package-manager.js +27 -0
- package/lib/common/package-manager/package-manager.js.map +1 -0
- package/lib/common/package-manager/proxy.d.ts +5 -0
- package/lib/common/package-manager/proxy.d.ts.map +1 -0
- package/lib/common/package-manager/proxy.js +116 -0
- package/lib/common/package-manager/proxy.js.map +1 -0
- package/lib/common/shared-jobs/cnpm-sync.d.ts +4 -0
- package/lib/common/shared-jobs/cnpm-sync.d.ts.map +1 -0
- package/lib/common/shared-jobs/cnpm-sync.js +52 -0
- package/lib/common/shared-jobs/cnpm-sync.js.map +1 -0
- package/lib/common/shared-jobs/detect-change-job.d.ts +12 -0
- package/lib/common/shared-jobs/detect-change-job.d.ts.map +1 -0
- package/lib/common/shared-jobs/detect-change-job.js +52 -0
- package/lib/common/shared-jobs/detect-change-job.js.map +1 -0
- package/lib/common/shared-jobs/publish-package-version-job.d.ts +4 -0
- package/lib/common/shared-jobs/publish-package-version-job.d.ts.map +1 -0
- package/lib/common/shared-jobs/publish-package-version-job.js +40 -0
- package/lib/common/shared-jobs/publish-package-version-job.js.map +1 -0
- package/lib/common/taball/decompress.d.ts +2 -0
- package/lib/common/taball/decompress.d.ts.map +1 -0
- package/lib/common/taball/decompress.js +39 -0
- package/lib/common/taball/decompress.js.map +1 -0
- package/lib/common/taball/file-download.d.ts +15 -0
- package/lib/common/taball/file-download.d.ts.map +1 -0
- package/lib/common/taball/file-download.js +137 -0
- package/lib/common/taball/file-download.js.map +1 -0
- package/lib/common/temp-work-folder.d.ts +20 -0
- package/lib/common/temp-work-folder.d.ts.map +1 -0
- package/lib/common/temp-work-folder.js +68 -0
- package/lib/common/temp-work-folder.js.map +1 -0
- package/lib/common/version.generated.d.ts +12 -0
- package/lib/common/version.generated.d.ts.map +1 -0
- package/lib/common/version.generated.js +17 -0
- package/lib/common/version.generated.js.map +1 -0
- package/lib/main.d.ts +2 -0
- package/lib/main.d.ts.map +1 -0
- package/lib/main.js +115 -0
- package/lib/main.js.map +1 -0
- package/lib/tsconfig.tsbuildinfo +1 -0
- package/load.js +12 -0
- package/package.json +59 -0
- package/src/command-file-map.generated.ts +28 -0
- package/src/command-file-map.generator.ts +23 -0
- package/src/commands/detect-package-change.ts +57 -0
- package/src/commands/monorepo-bump-version.ts +152 -0
- package/src/commands/monorepo-cnpm-sync.ts +19 -0
- package/src/commands/monorepo-invalid.ts +22 -0
- package/src/commands/monorepo-list.ts +46 -0
- package/src/commands/monorepo-publish.ts +227 -0
- package/src/commands/monorepo-tsconfig.ts +156 -0
- package/src/commands/monorepo-upgrade.ts +131 -0
- package/src/commands/run-if-version-mismatch.ts +78 -0
- package/src/commands/sync-my-readme.ts +56 -0
- package/src/commands/test.ts +18 -0
- package/src/common/cache/escape-package-path.ts +6 -0
- package/src/common/cache/native.npm.ts +206 -0
- package/src/common/functions/cli.ts +145 -0
- package/src/common/functions/global-lifecycle.ts +40 -0
- package/src/common/git/git.ts +75 -0
- package/src/common/package-manager/constant.ts +1 -0
- package/src/common/package-manager/driver.abstract.ts +162 -0
- package/src/common/package-manager/driver.npm.ts +13 -0
- package/src/common/package-manager/driver.pnpm.ts +113 -0
- package/src/common/package-manager/functions.ts +117 -0
- package/src/common/package-manager/package-json.ts +56 -0
- package/src/common/package-manager/package-manager.ts +46 -0
- package/src/common/package-manager/proxy.ts +129 -0
- package/src/common/shared-jobs/cnpm-sync.ts +57 -0
- package/src/common/shared-jobs/detect-change-job.ts +76 -0
- package/src/common/shared-jobs/publish-package-version-job.ts +46 -0
- package/src/common/taball/decompress.ts +41 -0
- package/src/common/taball/file-download.ts +166 -0
- package/src/common/temp-work-folder.ts +80 -0
- package/src/common/version.generated.ts +18 -0
- package/src/common/version.generator.ts +15 -0
- package/src/global.d.ts +17 -0
- package/src/main.ts +144 -0
- package/src/tsconfig.json +11 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { logger } from '@idlebox/logger';
|
|
2
|
+
import { printLine } from '@idlebox/node';
|
|
3
|
+
import { argv, CommandDefine, isJsonOutput, pArgS } from '../common/functions/cli.js';
|
|
4
|
+
import { PackageManagerUsageKind } from '../common/package-manager/driver.abstract.js';
|
|
5
|
+
import { increaseVersion } from '../common/package-manager/package-json.js';
|
|
6
|
+
import { createPackageManager } from '../common/package-manager/package-manager.js';
|
|
7
|
+
import { executeChangeDetect } from '../common/shared-jobs/detect-change-job.js';
|
|
8
|
+
|
|
9
|
+
process.env.COREPACK_ENABLE_STRICT = '0';
|
|
10
|
+
|
|
11
|
+
export class Command extends CommandDefine {
|
|
12
|
+
protected override _usage = `${pArgS('--bump')} ${pArgS('--json')}`;
|
|
13
|
+
protected override _description = '本地运行npm pack并与npm上的最新版本对比差异';
|
|
14
|
+
protected override _help = '';
|
|
15
|
+
protected override _arguments = {
|
|
16
|
+
'--bump': { flag: true, description: '当发现更改时更新package.json,增加版本号0.0.1' },
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export async function main() {
|
|
21
|
+
const autoInc = argv.flag('--bump');
|
|
22
|
+
|
|
23
|
+
const pm = await createPackageManager(PackageManagerUsageKind.Read);
|
|
24
|
+
|
|
25
|
+
const pkgJson = await pm.loadPackageJson();
|
|
26
|
+
const { changedFiles, hasChange, remoteVersion } = await executeChangeDetect(pm, {});
|
|
27
|
+
|
|
28
|
+
if (autoInc) {
|
|
29
|
+
if (changedFiles.length) {
|
|
30
|
+
logger.log('自动增加版本号...');
|
|
31
|
+
if (!remoteVersion) {
|
|
32
|
+
throw new Error('程序错误, remoteVersion 为空');
|
|
33
|
+
}
|
|
34
|
+
await increaseVersion(pkgJson, remoteVersion);
|
|
35
|
+
} else {
|
|
36
|
+
logger.log('没有检测到更改');
|
|
37
|
+
}
|
|
38
|
+
} else {
|
|
39
|
+
printResult(changedFiles, hasChange);
|
|
40
|
+
}
|
|
41
|
+
return 0;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function printResult(changedFiles: string[], changed: boolean) {
|
|
45
|
+
if (process.stdout.isTTY && !isJsonOutput) {
|
|
46
|
+
if (changedFiles.length === 0) {
|
|
47
|
+
console.log('changes: no');
|
|
48
|
+
} else {
|
|
49
|
+
printLine();
|
|
50
|
+
logger.log('%s', changedFiles.join('\n'));
|
|
51
|
+
printLine();
|
|
52
|
+
console.log('changes: yes');
|
|
53
|
+
}
|
|
54
|
+
} else {
|
|
55
|
+
console.log(JSON.stringify({ changedFiles, changed }));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,152 @@
|
|
|
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';
|
|
4
|
+
import { logger } from '@idlebox/logger';
|
|
5
|
+
import { makeRe } from 'minimatch';
|
|
6
|
+
import { inspect } from 'node:util';
|
|
7
|
+
import { argv, CommandDefine, CSI } from '../common/functions/cli.js';
|
|
8
|
+
import { PackageManagerUsageKind } from '../common/package-manager/driver.abstract.js';
|
|
9
|
+
import { increaseVersion } from '../common/package-manager/package-json.js';
|
|
10
|
+
import { createPackageManager } from '../common/package-manager/package-manager.js';
|
|
11
|
+
import { executeChangeDetect } from '../common/shared-jobs/detect-change-job.js';
|
|
12
|
+
|
|
13
|
+
export class Command extends CommandDefine {
|
|
14
|
+
protected override _usage = ``;
|
|
15
|
+
protected override _description = '在monorepo中按照依赖顺序分别运行detect-package-change';
|
|
16
|
+
protected override _help = '';
|
|
17
|
+
protected override _arguments = {
|
|
18
|
+
'--skip': { flag: false, description: '跳过前N-1个包(从第N个包开始运行)' },
|
|
19
|
+
'--allow-private': { flag: true, description: '即使private=true也执行' },
|
|
20
|
+
'--exclude': { flag: false, description: '排除指定的包' },
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
interface IState {
|
|
25
|
+
readonly index: number;
|
|
26
|
+
readonly length: number;
|
|
27
|
+
readonly options: ReturnType<typeof options>;
|
|
28
|
+
readonly changedPackages: string[];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
class BumpVersionJob implements IWatchEvents {
|
|
32
|
+
private readonly _onSuccess = new Emitter<void>();
|
|
33
|
+
public readonly onSuccess = this._onSuccess.event;
|
|
34
|
+
|
|
35
|
+
private readonly _onFailed = new Emitter<Error>();
|
|
36
|
+
public readonly onFailed = this._onFailed.event;
|
|
37
|
+
|
|
38
|
+
private readonly _onRunning = new Emitter<void>();
|
|
39
|
+
public readonly onRunning = this._onRunning.event;
|
|
40
|
+
|
|
41
|
+
private readonly allowPrivate: boolean;
|
|
42
|
+
|
|
43
|
+
constructor(
|
|
44
|
+
private readonly state: IState,
|
|
45
|
+
private readonly project: IPackageInfo,
|
|
46
|
+
private readonly workspace: MonorepoWorkspace,
|
|
47
|
+
) {
|
|
48
|
+
this.allowPrivate = argv.flag('--allow-private') > 0;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async execute() {
|
|
52
|
+
const { index, length, options, changedPackages } = this.state;
|
|
53
|
+
const w = length.toFixed(0).length;
|
|
54
|
+
console.log(`📦 [${(index + 1).toFixed(0).padStart(w)}/${length}] ${this.project.name}`);
|
|
55
|
+
if (this.project.packageJson.private && !this.allowPrivate) {
|
|
56
|
+
console.log(` 🛑 跳过,private=true: ${this.project.name}`);
|
|
57
|
+
} else if (options.skip > index + 1 || options.exclude?.test(this.project.name)) {
|
|
58
|
+
console.log(` ⏩ ${CSI}2m跳过${CSI}0m`);
|
|
59
|
+
} else {
|
|
60
|
+
const startTime = Date.now();
|
|
61
|
+
|
|
62
|
+
console.log(` 🔍 ${CSI}38;5;14m检查包${CSI}0m`);
|
|
63
|
+
|
|
64
|
+
const pm = await createPackageManager(PackageManagerUsageKind.Write, this.workspace, this.project.absolute);
|
|
65
|
+
const { hasChange, remoteVersion } = await executeChangeDetect(pm, { forcePrivate: this.allowPrivate });
|
|
66
|
+
|
|
67
|
+
if (!remoteVersion) {
|
|
68
|
+
console.log(' ✨ 远程版本不存在\n');
|
|
69
|
+
if (this.project.packageJson.version !== '0.0.1') {
|
|
70
|
+
throw new Error(`远程版本不存在,但本地包版本不是 0.0.1\n package: ${pm.projectPath}/package.json`);
|
|
71
|
+
}
|
|
72
|
+
} else if (hasChange) {
|
|
73
|
+
changedPackages.push(this.project.name);
|
|
74
|
+
|
|
75
|
+
const packageJson = await pm.loadPackageJson();
|
|
76
|
+
await increaseVersion(packageJson, remoteVersion);
|
|
77
|
+
console.log(' ✍️ 已修改本地包版本\n');
|
|
78
|
+
} else {
|
|
79
|
+
console.log(` ✨ ${CSI}38;5;10m未发现修改${CSI}0m (in ${humanDate.delta(Date.now() - startTime)})\n`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
[inspect.custom]() {
|
|
85
|
+
// TODO
|
|
86
|
+
return '~~~~~~~~';
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function options() {
|
|
91
|
+
const excludes = argv.multiple('--exclude');
|
|
92
|
+
let excludeReg: RegExp | undefined;
|
|
93
|
+
if (excludes.length > 0) {
|
|
94
|
+
let regTxt = [];
|
|
95
|
+
for (const exclude of excludes) {
|
|
96
|
+
const match = makeRe(exclude, { platform: 'linux' });
|
|
97
|
+
if (!match) {
|
|
98
|
+
throw new Error(`无法解析排除模式: ${exclude}`);
|
|
99
|
+
}
|
|
100
|
+
regTxt.push(match.source);
|
|
101
|
+
}
|
|
102
|
+
excludeReg = new RegExp(`^(${regTxt.join('|')})$`);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const skip = Number.parseInt(argv.single('--skip') || '0');
|
|
106
|
+
if (Number.isNaN(skip)) {
|
|
107
|
+
throw new Error('skip 不是数字');
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return {
|
|
111
|
+
exclude: excludeReg,
|
|
112
|
+
skip: skip,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export async function main() {
|
|
117
|
+
const workspace = await createWorkspace();
|
|
118
|
+
await workspace.decoupleDependencies();
|
|
119
|
+
const projects = await workspace.listPackages();
|
|
120
|
+
|
|
121
|
+
const graph = new BuilderDependencyGraph(1, logger);
|
|
122
|
+
|
|
123
|
+
const opts = options();
|
|
124
|
+
|
|
125
|
+
const changedPackages: string[] = [];
|
|
126
|
+
|
|
127
|
+
let index = 0;
|
|
128
|
+
for (const project of projects) {
|
|
129
|
+
if (!project.packageJson.name) continue;
|
|
130
|
+
|
|
131
|
+
graph.addNode(
|
|
132
|
+
project.packageJson.name,
|
|
133
|
+
[],
|
|
134
|
+
new BumpVersionJob(
|
|
135
|
+
{
|
|
136
|
+
index,
|
|
137
|
+
length: projects.length,
|
|
138
|
+
options: opts,
|
|
139
|
+
changedPackages,
|
|
140
|
+
},
|
|
141
|
+
project,
|
|
142
|
+
workspace,
|
|
143
|
+
),
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
index++;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
await graph.startup();
|
|
150
|
+
|
|
151
|
+
console.log(`🎉 所有任务完成,共修改了 ${changedPackages.length} 个包`);
|
|
152
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { createWorkspace } from '@build-script/monorepo-lib';
|
|
2
|
+
import { argv } from '@idlebox/args/default';
|
|
3
|
+
import { CommandDefine, isQuiet, pDesc } from '../common/functions/cli.js';
|
|
4
|
+
import { cnpmSync } from '../common/shared-jobs/cnpm-sync.js';
|
|
5
|
+
|
|
6
|
+
export class Command extends CommandDefine {
|
|
7
|
+
protected override _usage = '';
|
|
8
|
+
protected override _description = '调用cnpm sync命令';
|
|
9
|
+
protected override _help = pDesc('需要在PATH中存在cnpm命令');
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export async function main() {
|
|
13
|
+
const workspace = await createWorkspace();
|
|
14
|
+
const list = await workspace.listPackages();
|
|
15
|
+
|
|
16
|
+
const dry = argv.flag('--dry') > 0;
|
|
17
|
+
|
|
18
|
+
await cnpmSync(list, isQuiet, dry);
|
|
19
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { logger } from '@idlebox/logger';
|
|
2
|
+
import { CommandDefine } from '../common/functions/cli.js';
|
|
3
|
+
import { PackageManagerUsageKind } from '../common/package-manager/driver.abstract.js';
|
|
4
|
+
import { createPackageManager } from '../common/package-manager/package-manager.js';
|
|
5
|
+
|
|
6
|
+
export class Command extends CommandDefine {
|
|
7
|
+
protected override _usage = '';
|
|
8
|
+
protected override _description = '从npm缓存中删除关于本monorepo的数据,以便安装最新版本';
|
|
9
|
+
protected override _help = '';
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export async function main() {
|
|
13
|
+
const packageManager = await createPackageManager(PackageManagerUsageKind.Read);
|
|
14
|
+
const cache = await packageManager.createCacheHandler();
|
|
15
|
+
|
|
16
|
+
const list = await packageManager.workspace.listPackages();
|
|
17
|
+
|
|
18
|
+
logger.log('删除%d个项目在 %s 的npm缓存', list.length, cache.path);
|
|
19
|
+
for (const data of list) {
|
|
20
|
+
await cache.deleteMetadata(data.packageJson.name);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { createWorkspace } from '@build-script/monorepo-lib';
|
|
2
|
+
import { argv, CommandDefine, isJsonOutput, isVerbose, pArgS } from '../common/functions/cli.js';
|
|
3
|
+
|
|
4
|
+
export class Command extends CommandDefine {
|
|
5
|
+
protected override _usage = `${pArgS('--verbose')} ${pArgS('--json')} ${pArgS('--relative')}`;
|
|
6
|
+
protected override _description = '列出所有项目目录';
|
|
7
|
+
protected override _help = '';
|
|
8
|
+
protected override _arguments = {
|
|
9
|
+
'--verbose': { flag: true, description: '列出所有信息,而不仅是目录' },
|
|
10
|
+
'--json': { flag: true, description: '输出json(同时使--verbose和--relative无效)' },
|
|
11
|
+
'--relative': { flag: true, description: '输出相对路径(相对于monorepo根目录)' },
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export async function main() {
|
|
16
|
+
const repo = await createWorkspace();
|
|
17
|
+
const list = await repo.listPackages();
|
|
18
|
+
|
|
19
|
+
const isRelative = argv.flag('--relative') > 0;
|
|
20
|
+
|
|
21
|
+
if (isJsonOutput) {
|
|
22
|
+
console.log(
|
|
23
|
+
JSON.stringify(
|
|
24
|
+
list.map((e) => {
|
|
25
|
+
const { packageJson, ...extras } = e;
|
|
26
|
+
return extras;
|
|
27
|
+
}),
|
|
28
|
+
),
|
|
29
|
+
);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
for (const item of list) {
|
|
34
|
+
if (isVerbose) {
|
|
35
|
+
console.log('name: %s', item.name);
|
|
36
|
+
console.log('path: %s', item.absolute);
|
|
37
|
+
console.log('relative: %s', item.relative);
|
|
38
|
+
console.log('dependOn: %s', item.dependencies.join(', '));
|
|
39
|
+
console.log('');
|
|
40
|
+
} else if (isRelative) {
|
|
41
|
+
console.log(item.relative);
|
|
42
|
+
} else {
|
|
43
|
+
console.log(item.absolute);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createWorkspace,
|
|
3
|
+
normalizePackageName,
|
|
4
|
+
type IPackageInfo,
|
|
5
|
+
type MonorepoWorkspace,
|
|
6
|
+
} from '@build-script/monorepo-lib';
|
|
7
|
+
import { Emitter, prettyPrintError } from '@idlebox/common';
|
|
8
|
+
import { BuilderDependencyGraph, type IWatchEvents } from '@idlebox/dependency-graph';
|
|
9
|
+
import { logger } from '@idlebox/logger';
|
|
10
|
+
import { commandInPath, emptyDir, writeFileIfChangeSync } from '@idlebox/node';
|
|
11
|
+
import { cpSync, existsSync } from 'fs';
|
|
12
|
+
import { resolve } from 'path';
|
|
13
|
+
import { inspect } from 'util';
|
|
14
|
+
import { argv, CommandDefine, CSI, pArgS } from '../common/functions/cli.js';
|
|
15
|
+
import { PackageManagerUsageKind } from '../common/package-manager/driver.abstract.js';
|
|
16
|
+
import { increaseVersion } from '../common/package-manager/package-json.js';
|
|
17
|
+
import { createPackageManager } from '../common/package-manager/package-manager.js';
|
|
18
|
+
import { cnpmSyncNames } from '../common/shared-jobs/cnpm-sync.js';
|
|
19
|
+
import { executeChangeDetect } from '../common/shared-jobs/detect-change-job.js';
|
|
20
|
+
|
|
21
|
+
export class Command extends CommandDefine {
|
|
22
|
+
protected override _usage = `${pArgS('--debug')} ${pArgS('--dry')}`;
|
|
23
|
+
protected override _description = '在monorepo中按照依赖顺序发布修改过的包';
|
|
24
|
+
protected override _help = '';
|
|
25
|
+
protected override _arguments = {
|
|
26
|
+
'--debug': { flag: true, description: '详细输出模式' },
|
|
27
|
+
'--dry': { flag: true, description: '仅检查修改,不发布(仍会修改version字段)' },
|
|
28
|
+
'--private': { flag: false, description: '即使private=true也执行' },
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
interface IState {
|
|
33
|
+
readonly index: number;
|
|
34
|
+
readonly length: number;
|
|
35
|
+
readonly options: ReturnType<typeof options>;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
let indexDisplay = 0;
|
|
39
|
+
class BuildPackageJob implements IWatchEvents {
|
|
40
|
+
private readonly _onSuccess = new Emitter<void>();
|
|
41
|
+
public readonly onSuccess = this._onSuccess.event;
|
|
42
|
+
|
|
43
|
+
private readonly _onFailed = new Emitter<Error>();
|
|
44
|
+
public readonly onFailed = this._onFailed.event;
|
|
45
|
+
|
|
46
|
+
private readonly _onRunning = new Emitter<void>();
|
|
47
|
+
public readonly onRunning = this._onRunning.event;
|
|
48
|
+
|
|
49
|
+
private shouldPublish = '';
|
|
50
|
+
|
|
51
|
+
constructor(
|
|
52
|
+
private readonly state: IState,
|
|
53
|
+
private readonly project: IPackageInfo,
|
|
54
|
+
private readonly workspace: MonorepoWorkspace,
|
|
55
|
+
) {
|
|
56
|
+
this.onSuccess(() => {
|
|
57
|
+
indexDisplay++;
|
|
58
|
+
const { length } = this.state;
|
|
59
|
+
const w = length.toFixed(0).length;
|
|
60
|
+
console.log(`📦 [${indexDisplay.toFixed(0).padStart(w)}/${length}] ${this.project.name}`);
|
|
61
|
+
console.log(this.logText.join('\n'));
|
|
62
|
+
this.logText.length = 0;
|
|
63
|
+
});
|
|
64
|
+
this.onFailed((e) => {
|
|
65
|
+
indexDisplay++;
|
|
66
|
+
const { length } = this.state;
|
|
67
|
+
const w = length.toFixed(0).length;
|
|
68
|
+
console.log(`📦 [${indexDisplay.toFixed(0).padStart(w)}/${length}] ${this.project.name}`);
|
|
69
|
+
console.log(this.logText.join('\n'));
|
|
70
|
+
prettyPrintError('❌pack failed', e);
|
|
71
|
+
this.logText.length = 0;
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
get name() {
|
|
76
|
+
return this.project.name;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
getPackagePath() {
|
|
80
|
+
return this.shouldPublish || undefined;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
async execute() {
|
|
84
|
+
this._onRunning.fire();
|
|
85
|
+
this.log(` 🔍 ${CSI}38;5;14m检查包${CSI}0m`);
|
|
86
|
+
|
|
87
|
+
const pm = await createPackageManager(PackageManagerUsageKind.Write, this.workspace, this.project.absolute);
|
|
88
|
+
const { changedFiles, hasChange, remoteVersion } = await executeChangeDetect(pm, {});
|
|
89
|
+
let shouldPublish = hasChange || changedFiles.length > 0;
|
|
90
|
+
let localVersion = this.project.packageJson.version;
|
|
91
|
+
|
|
92
|
+
if (hasChange) {
|
|
93
|
+
const packageJson = await pm.loadPackageJson();
|
|
94
|
+
localVersion = await increaseVersion(packageJson, remoteVersion || '0.0.0');
|
|
95
|
+
this.log(' ✍️ 已修改本地包版本\n');
|
|
96
|
+
}
|
|
97
|
+
if (!shouldPublish) {
|
|
98
|
+
this.log(` ✨ ${CSI}38;5;10m未发现修改${CSI}0m\n`);
|
|
99
|
+
this._onSuccess.fire();
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
this.log(` 🔄 打包文件`);
|
|
104
|
+
|
|
105
|
+
const tempFile = resolve(
|
|
106
|
+
this.workspace.temp,
|
|
107
|
+
`publish/${normalizePackageName(this.project.name)}-${localVersion}.tgz`,
|
|
108
|
+
);
|
|
109
|
+
this.shouldPublish = await pm.pack(tempFile);
|
|
110
|
+
|
|
111
|
+
if (remoteVersion) {
|
|
112
|
+
this.log(` 🎈 即将发布新版本 "${this.project.packageJson.version}" 以更新远程版本 "${remoteVersion}"`);
|
|
113
|
+
} else {
|
|
114
|
+
this.log(` 🎈 即将发布初始版本 "${this.project.packageJson.version}"`);
|
|
115
|
+
}
|
|
116
|
+
this._onSuccess.fire();
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
private readonly logText: string[] = [];
|
|
120
|
+
log(text: string) {
|
|
121
|
+
this.logText.push(text);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
[inspect.custom]() {
|
|
125
|
+
// TODO
|
|
126
|
+
return '~~~~~~~~';
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function options() {
|
|
131
|
+
const dryRun = argv.flag('--dry') > 0;
|
|
132
|
+
|
|
133
|
+
return {
|
|
134
|
+
dryRun: dryRun,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export async function main() {
|
|
139
|
+
const workspace = await createWorkspace();
|
|
140
|
+
await workspace.decoupleDependencies();
|
|
141
|
+
|
|
142
|
+
const temp = resolve(workspace.temp, 'publish');
|
|
143
|
+
await emptyDir(temp);
|
|
144
|
+
|
|
145
|
+
const projects = await workspace.listPackages();
|
|
146
|
+
|
|
147
|
+
const concurrency = argv.flag(['--debug', '-d']) > 0 ? 1 : 10;
|
|
148
|
+
const graph = new BuilderDependencyGraph<BuildPackageJob>(concurrency, logger);
|
|
149
|
+
const opts = options();
|
|
150
|
+
|
|
151
|
+
const shouldPublishProjects = projects.filter((project) => {
|
|
152
|
+
if (!project.packageJson.name) return false;
|
|
153
|
+
|
|
154
|
+
if (project.packageJson.private) {
|
|
155
|
+
console.log(`📦 ${project.name}`);
|
|
156
|
+
console.log(` 🛑 跳过,private=true: ${project.name}`);
|
|
157
|
+
graph.addEmptyNode(project.name);
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
return true;
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
let index = 0;
|
|
165
|
+
for (const project of shouldPublishProjects) {
|
|
166
|
+
graph.addNode(
|
|
167
|
+
project.name,
|
|
168
|
+
project.devDependencies,
|
|
169
|
+
new BuildPackageJob(
|
|
170
|
+
{
|
|
171
|
+
index,
|
|
172
|
+
length: shouldPublishProjects.length,
|
|
173
|
+
options: opts,
|
|
174
|
+
},
|
|
175
|
+
project,
|
|
176
|
+
workspace,
|
|
177
|
+
),
|
|
178
|
+
);
|
|
179
|
+
|
|
180
|
+
index++;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
await graph.startup();
|
|
184
|
+
|
|
185
|
+
const packageToPublish: { name: string; pack: string }[] = [];
|
|
186
|
+
for (const id of graph.overallOrder) {
|
|
187
|
+
const node = graph.getNodeData(id);
|
|
188
|
+
if (!(node instanceof BuildPackageJob)) continue;
|
|
189
|
+
|
|
190
|
+
const pack = node.getPackagePath();
|
|
191
|
+
if (!pack) continue;
|
|
192
|
+
packageToPublish.push({ name: node.name, pack });
|
|
193
|
+
}
|
|
194
|
+
console.log(`✅ 打包阶段结束,有 ${packageToPublish.length} 个包需要发布`);
|
|
195
|
+
|
|
196
|
+
if (opts.dryRun) {
|
|
197
|
+
console.log(`中断并退出(--dry)`);
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
const pm = await createPackageManager(PackageManagerUsageKind.Write, workspace, temp);
|
|
202
|
+
const npmrc = workspace.getNpmRCPath(true);
|
|
203
|
+
if (existsSync(npmrc)) {
|
|
204
|
+
cpSync(npmrc, resolve(temp, '.npmrc'));
|
|
205
|
+
writeFileIfChangeSync(resolve(temp, 'package.json'), '{}');
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
const w = packageToPublish.length.toFixed(0).length;
|
|
209
|
+
let published: string[] = [];
|
|
210
|
+
for (const { name, pack } of packageToPublish) {
|
|
211
|
+
console.log(`📦 [${(index + 1).toFixed(0).padStart(w)}/${packageToPublish.length}] ${name}`);
|
|
212
|
+
const r = await pm.uploadTarball(pack);
|
|
213
|
+
if (r.published) {
|
|
214
|
+
console.log(` 👌 已发布新版本 ${r.version}`);
|
|
215
|
+
published.push(name);
|
|
216
|
+
} else {
|
|
217
|
+
console.log(` 🤔 版本号未改变 ${r.version}`);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
console.log(`🎉 所有任务完成,共发布了 ${published.length} 个包`);
|
|
222
|
+
|
|
223
|
+
if (await commandInPath('cnpm')) {
|
|
224
|
+
await cnpmSyncNames(published, true).catch();
|
|
225
|
+
}
|
|
226
|
+
console.log(` 🐱 已同步到 cnpm`);
|
|
227
|
+
}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { createWorkspace, type IPackageInfo } from '@build-script/monorepo-lib';
|
|
2
|
+
import { resolveExportPath } from '@idlebox/common';
|
|
3
|
+
import { loadJsonFile, writeJsonFile, writeJsonFileBack } from '@idlebox/json-edit';
|
|
4
|
+
import { logger } from '@idlebox/logger';
|
|
5
|
+
import { relativePath } from '@idlebox/node';
|
|
6
|
+
import { existsSync } from 'node:fs';
|
|
7
|
+
import { dirname, resolve } from 'node:path';
|
|
8
|
+
import { argv, CommandDefine, pArgS } from '../common/functions/cli.js';
|
|
9
|
+
|
|
10
|
+
export class Command extends CommandDefine {
|
|
11
|
+
protected override _usage = `${pArgS('--dev')}`;
|
|
12
|
+
protected override _description = '为所有项目的 tsconfig.json 添加 references 字段';
|
|
13
|
+
protected override _help =
|
|
14
|
+
`查找tsconfig.json和src/tsconfig.json\n 如果不在这里,可以在package.json中设置exports['./tsconfig.json'] = './xxxx'`;
|
|
15
|
+
protected override _arguments = {
|
|
16
|
+
'--dev': { flag: true, description: '也将devDependencies中的包添加到references中' },
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const path_element_id = 'package-tools/monorepo-tsconfig';
|
|
21
|
+
interface IReference {
|
|
22
|
+
$id?: string;
|
|
23
|
+
path: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export async function main() {
|
|
27
|
+
const includeDev = argv.flag('--dev') > 0;
|
|
28
|
+
|
|
29
|
+
const repo = await createWorkspace();
|
|
30
|
+
|
|
31
|
+
try {
|
|
32
|
+
await repo.requireGitClean();
|
|
33
|
+
} catch (e: any) {
|
|
34
|
+
logger.fatal(e.message);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const list = await repo.listPackages();
|
|
38
|
+
const configAbsMap = new Map<IPackageInfo, string>();
|
|
39
|
+
const projNameMap = new Map<string, IPackageInfo>();
|
|
40
|
+
// repo.root
|
|
41
|
+
|
|
42
|
+
logger.log(`在${list.length}个项目中搜索tsconfig.json文件...`);
|
|
43
|
+
for (const proj of list) {
|
|
44
|
+
projNameMap.set(proj.name, proj);
|
|
45
|
+
|
|
46
|
+
if (typeof proj.packageJson.exports === 'object' && proj.packageJson.exports['./tsconfig.json']) {
|
|
47
|
+
const file = resolveExportPath(proj.packageJson.exports['./tsconfig.json'], ['default']);
|
|
48
|
+
if (file) {
|
|
49
|
+
configAbsMap.set(proj, resolve(proj.absolute, file));
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
let file = resolve(proj.absolute, 'tsconfig.json');
|
|
55
|
+
if (existsSync(file)) {
|
|
56
|
+
configAbsMap.set(proj, file);
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
file = resolve(proj.absolute, 'src', 'tsconfig.json');
|
|
61
|
+
if (existsSync(file)) {
|
|
62
|
+
configAbsMap.set(proj, file);
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
logger.log(`未找到${proj.name}的tsconfig.json文件`);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const batchSave = new Map<IPackageInfo, any>();
|
|
69
|
+
for (const [proj, tsconfig] of configAbsMap.entries()) {
|
|
70
|
+
logger.log(`正在处理${proj.name}的tsconfig.json文件...`);
|
|
71
|
+
const tsconfigJson = await loadJsonFile(tsconfig);
|
|
72
|
+
batchSave.set(proj, tsconfigJson);
|
|
73
|
+
|
|
74
|
+
if (!tsconfigJson.references) tsconfigJson.references = [];
|
|
75
|
+
const references: IReference[] = tsconfigJson.references;
|
|
76
|
+
|
|
77
|
+
const workspaceDeps = filterByLink(proj.packageJson.dependencies);
|
|
78
|
+
if (includeDev) {
|
|
79
|
+
workspaceDeps.push(...filterByLink(proj.packageJson.devDependencies));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const knownPaths = [];
|
|
83
|
+
|
|
84
|
+
for (const name of workspaceDeps) {
|
|
85
|
+
const depProj = projNameMap.get(name);
|
|
86
|
+
if (!depProj) {
|
|
87
|
+
throw new Error(`在${proj.name}的package.json中存在未知依赖项目:${name}`);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const depTsconfig = configAbsMap.get(depProj);
|
|
91
|
+
if (!depTsconfig) continue;
|
|
92
|
+
|
|
93
|
+
const path = relativePath(dirname(tsconfig), depTsconfig);
|
|
94
|
+
const added = addToSet(references, path);
|
|
95
|
+
if (added) logger.log(` - 添加${path}`);
|
|
96
|
+
|
|
97
|
+
knownPaths.push(path);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
for (const ref of references.toReversed()) {
|
|
101
|
+
if (ref.$id !== path_element_id) continue;
|
|
102
|
+
|
|
103
|
+
if (knownPaths.includes(ref.path)) continue;
|
|
104
|
+
// 删除不再引用
|
|
105
|
+
const index = references.lastIndexOf(ref);
|
|
106
|
+
references.splice(index, 1);
|
|
107
|
+
logger.log(` - 删除${ref.path}`);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
if (references.length === 0) {
|
|
111
|
+
tsconfigJson.references = undefined;
|
|
112
|
+
logger.log(` - 删除references字段`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
for (const [proj, tsconfigJson] of batchSave.entries()) {
|
|
117
|
+
const ch = await writeJsonFileBack(tsconfigJson);
|
|
118
|
+
|
|
119
|
+
logger.log(` - ${proj.name} ${ch ? '已修改' : '未修改'} tsconfig.json`);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const rootTsconfig = resolve(repo.root, 'tsconfig.everything.json');
|
|
123
|
+
const references: IReference[] = [];
|
|
124
|
+
for (const tsconfig of configAbsMap.values()) {
|
|
125
|
+
references.push({ path: relativePath(repo.root, tsconfig) });
|
|
126
|
+
}
|
|
127
|
+
await writeJsonFile(rootTsconfig, {
|
|
128
|
+
compilerOptions: {
|
|
129
|
+
esModuleInterop: true,
|
|
130
|
+
outDir: './lib',
|
|
131
|
+
moduleResolution: 'Node',
|
|
132
|
+
module: 'ESNext',
|
|
133
|
+
target: 'ESNext',
|
|
134
|
+
},
|
|
135
|
+
references,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function addToSet(set: IReference[], value: string) {
|
|
140
|
+
if (set.some((item) => item.path === value)) {
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
set.push({ $id: path_element_id, path: value });
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function filterByLink(dependencies: Record<string, string>): string[] {
|
|
149
|
+
// 只保留引用workspace的
|
|
150
|
+
if (!dependencies) return [];
|
|
151
|
+
|
|
152
|
+
return Object.keys(dependencies).filter((dep) => {
|
|
153
|
+
const version = dependencies[dep];
|
|
154
|
+
return version.startsWith('workspace:');
|
|
155
|
+
});
|
|
156
|
+
}
|