@quiteer/scripts 0.0.2 → 0.0.4
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/README.md +68 -0
- package/dist/index.mjs +14 -35
- package/package.json +2 -2
package/README.md
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# @quiteer/scripts
|
|
2
|
+
|
|
3
|
+
简化多包仓库的版本管理与变更日志生成,提供便捷的 CLI 命令。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
- 全局安装(推荐)
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
pnpm i -g @quiteer/scripts
|
|
11
|
+
# 或者
|
|
12
|
+
npm i -g @quiteer/scripts
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
- 项目内安装(作为开发依赖)
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
pnpm add -D @quiteer/scripts
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
> 运行环境:Node.js ≥ 22.14.0,建议使用 pnpm 管理依赖。
|
|
22
|
+
|
|
23
|
+
## 快速使用
|
|
24
|
+
|
|
25
|
+
- 查看版本
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
qui -v
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
- 版本管理与打标签(支持多包选择与自定义前缀标签,同时生成全量 changelog)
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# 交互选择需要提升版本的包
|
|
35
|
+
qui r --tag-prefix scripts
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
- 生成全量变更日志(中文,生成 CHANGELOG.md 与 CHANGELOG_TIMELINE.md)
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
qui cl
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
- 规范化提交(交互式生成符合 Conventional Commits 的提交信息)
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
qui gc
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## 常用工作流示例
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
# 1) 更新版本并创建标签(例如为 scripts 包增加前缀)
|
|
54
|
+
qui r --tag-prefix scripts
|
|
55
|
+
|
|
56
|
+
# 2) 生成 changelog(默认生成全部历史)
|
|
57
|
+
qui cl
|
|
58
|
+
|
|
59
|
+
# 3) 提交并推送(如需发布)
|
|
60
|
+
git add -A && git commit -m "docs(changelog): update"
|
|
61
|
+
# 可选:git push && git push --tags
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## 说明
|
|
65
|
+
|
|
66
|
+
- 多包仓库:发布时可交互选择要更新的包,未选中的包不受影响。
|
|
67
|
+
- 标签前缀:标签命名为 `<prefix>-vX.Y.Z`,可避免多包仓库中的全局标签冲突。
|
|
68
|
+
- changelog:默认基于仓库最初提交到当前 HEAD 的全量历史生成。
|
package/dist/index.mjs
CHANGED
|
@@ -8,11 +8,11 @@ import { execa } from "execa";
|
|
|
8
8
|
import { rimraf } from "rimraf";
|
|
9
9
|
import { loadConfig } from "c12";
|
|
10
10
|
import { readFileSync } from "node:fs";
|
|
11
|
-
import
|
|
11
|
+
import enquirer from "enquirer";
|
|
12
12
|
import { versionBump } from "bumpp";
|
|
13
13
|
|
|
14
14
|
//#region package.json
|
|
15
|
-
var version = "0.0.
|
|
15
|
+
var version = "0.0.3";
|
|
16
16
|
|
|
17
17
|
//#endregion
|
|
18
18
|
//#region src/locales/changelog.ts
|
|
@@ -196,13 +196,6 @@ function getTypeIcon(type) {
|
|
|
196
196
|
"typo": "✏️ "
|
|
197
197
|
}[type] || "";
|
|
198
198
|
}
|
|
199
|
-
async function getTags() {
|
|
200
|
-
return (await execCommand("git", [
|
|
201
|
-
"tag",
|
|
202
|
-
"--list",
|
|
203
|
-
"--sort=-version:refname"
|
|
204
|
-
])).split("\n").filter(Boolean);
|
|
205
|
-
}
|
|
206
199
|
async function getRootCommit() {
|
|
207
200
|
return await execCommand("git", [
|
|
208
201
|
"rev-list",
|
|
@@ -210,15 +203,6 @@ async function getRootCommit() {
|
|
|
210
203
|
"HEAD"
|
|
211
204
|
]);
|
|
212
205
|
}
|
|
213
|
-
async function getDateForRef(ref) {
|
|
214
|
-
return await execCommand("git", [
|
|
215
|
-
"log",
|
|
216
|
-
"-1",
|
|
217
|
-
"--date=short",
|
|
218
|
-
"--format=%ad",
|
|
219
|
-
ref
|
|
220
|
-
]) || (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
|
|
221
|
-
}
|
|
222
206
|
async function getCommitsInRange(range) {
|
|
223
207
|
return (await execCommand("git", [
|
|
224
208
|
"log",
|
|
@@ -378,18 +362,10 @@ function formatTimeline(items, repoUrl) {
|
|
|
378
362
|
async function generateChangelogFiles(options) {
|
|
379
363
|
const repoRoot = await execCommand("git", ["rev-parse", "--show-toplevel"]);
|
|
380
364
|
const homepage = await readHomepage();
|
|
381
|
-
const
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
let
|
|
385
|
-
if (tags.length >= 1) {
|
|
386
|
-
const latest = tags[0];
|
|
387
|
-
const prev = tags[1];
|
|
388
|
-
title = latest;
|
|
389
|
-
date = await getDateForRef(latest);
|
|
390
|
-
range = prev ? `${prev}..${latest}` : `${await getRootCommit()}..${latest}`;
|
|
391
|
-
} else range = "HEAD";
|
|
392
|
-
let items = await getCommitsInRange(range);
|
|
365
|
+
const root = await getRootCommit();
|
|
366
|
+
const title = "全部历史";
|
|
367
|
+
const date = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
|
|
368
|
+
let items = await getCommitsInRange(`${root}..HEAD`);
|
|
393
369
|
items = await enrichCommit(items);
|
|
394
370
|
const fallback = [
|
|
395
371
|
`## ${title} - ${date}`,
|
|
@@ -526,15 +502,16 @@ async function generateConfig() {
|
|
|
526
502
|
* @returns {Promise<void>} 异步任务
|
|
527
503
|
*/
|
|
528
504
|
async function gitCommitAdd() {
|
|
505
|
+
const { prompt: ask } = enquirer;
|
|
529
506
|
try {
|
|
530
|
-
if (!!!(await
|
|
507
|
+
if (!!!(await ask([{
|
|
531
508
|
name: "confirm",
|
|
532
509
|
type: "confirm",
|
|
533
510
|
message: "是否添加所有变更文件到暂存区?"
|
|
534
511
|
}]))?.confirm) {
|
|
535
512
|
const files = (await execCommand("git", ["diff", "--name-only"])).split("\n").filter(Boolean);
|
|
536
513
|
if (files.length === 0) return;
|
|
537
|
-
const selected = (await
|
|
514
|
+
const selected = (await ask([{
|
|
538
515
|
name: "selected",
|
|
539
516
|
type: "multiselect",
|
|
540
517
|
message: "选择需要添加到暂存区的文件(空格选择,回车确认)",
|
|
@@ -558,6 +535,7 @@ async function gitCommitAdd() {
|
|
|
558
535
|
*/
|
|
559
536
|
async function gitCommit(lang = "en-us") {
|
|
560
537
|
try {
|
|
538
|
+
const { prompt: ask } = enquirer;
|
|
561
539
|
const { gitCommitMessages, gitCommitTypes, gitCommitScopes } = locales[lang];
|
|
562
540
|
const typesChoices = gitCommitTypes.map(([value, msg]) => {
|
|
563
541
|
return {
|
|
@@ -569,7 +547,7 @@ async function gitCommit(lang = "en-us") {
|
|
|
569
547
|
name: value,
|
|
570
548
|
message: `${value.padEnd(30)} (${msg})`
|
|
571
549
|
}));
|
|
572
|
-
const result = await
|
|
550
|
+
const result = await ask([
|
|
573
551
|
{
|
|
574
552
|
name: "types",
|
|
575
553
|
type: "select",
|
|
@@ -621,6 +599,7 @@ async function gitCommitVerify(lang = "zh-cn", ignores = []) {
|
|
|
621
599
|
* @returns {Promise<void>} 异步任务
|
|
622
600
|
*/
|
|
623
601
|
async function release(tagPrefix) {
|
|
602
|
+
const { prompt: ask } = enquirer;
|
|
624
603
|
const repoRoot = await execCommand("git", ["rev-parse", "--show-toplevel"]);
|
|
625
604
|
const files = (await execCommand("git", [
|
|
626
605
|
"-C",
|
|
@@ -637,7 +616,7 @@ async function release(tagPrefix) {
|
|
|
637
616
|
value: rel
|
|
638
617
|
});
|
|
639
618
|
} catch {}
|
|
640
|
-
const selected = ((await
|
|
619
|
+
const selected = ((await ask([{
|
|
641
620
|
name: "selected",
|
|
642
621
|
type: "multiselect",
|
|
643
622
|
message: "选择需要提升版本的包(空格选择,回车确认)",
|
|
@@ -656,7 +635,7 @@ async function release(tagPrefix) {
|
|
|
656
635
|
const version$1 = JSON.parse(await readFile(firstPkgPath, "utf8")).version;
|
|
657
636
|
let prefix = tagPrefix;
|
|
658
637
|
if (prefix === void 0) try {
|
|
659
|
-
prefix = (await
|
|
638
|
+
prefix = (await ask([{
|
|
660
639
|
name: "prefix",
|
|
661
640
|
type: "text",
|
|
662
641
|
message: "请输入标签前缀(可留空)"
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@quiteer/scripts",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.0.
|
|
5
|
-
"homepage": "https://github.
|
|
4
|
+
"version": "0.0.4",
|
|
5
|
+
"homepage": "https://taiaiac.github.io/web/ci/scripts.html",
|
|
6
6
|
"publishConfig": {
|
|
7
7
|
"access": "public",
|
|
8
8
|
"registry": "https://registry.npmjs.org/"
|