@ucdjs/release-scripts 0.1.0-beta.57 → 0.1.0-beta.59
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/dist/index.mjs +108 -84
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -1,60 +1,16 @@
|
|
|
1
1
|
import { t as Eta } from "./eta-DAZlmVBQ.mjs";
|
|
2
|
-
import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
3
|
-
import { join, relative } from "node:path";
|
|
4
|
-
import { getCommits, groupByType } from "commit-parser";
|
|
5
2
|
import process from "node:process";
|
|
6
3
|
import readline from "node:readline";
|
|
7
4
|
import farver from "farver";
|
|
8
5
|
import mri from "mri";
|
|
9
6
|
import { exec } from "tinyexec";
|
|
7
|
+
import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
8
|
+
import { join, relative } from "node:path";
|
|
9
|
+
import { getCommits, groupByType } from "commit-parser";
|
|
10
10
|
import { dedent } from "@luxass/utils";
|
|
11
11
|
import semver, { gt } from "semver";
|
|
12
12
|
import prompts from "prompts";
|
|
13
13
|
|
|
14
|
-
//#region src/operations/changelog-format.ts
|
|
15
|
-
function formatCommitLine({ commit, owner, repo, authors }) {
|
|
16
|
-
const commitUrl = `https://github.com/${owner}/${repo}/commit/${commit.hash}`;
|
|
17
|
-
let line = `${commit.description}`;
|
|
18
|
-
const references = commit.references ?? [];
|
|
19
|
-
for (const ref of references) {
|
|
20
|
-
if (!ref.value) continue;
|
|
21
|
-
const number = Number.parseInt(ref.value.replace(/^#/, ""), 10);
|
|
22
|
-
if (Number.isNaN(number)) continue;
|
|
23
|
-
if (ref.type === "issue") {
|
|
24
|
-
line += ` ([Issue ${ref.value}](https://github.com/${owner}/${repo}/issues/${number}))`;
|
|
25
|
-
continue;
|
|
26
|
-
}
|
|
27
|
-
line += ` ([PR ${ref.value}](https://github.com/${owner}/${repo}/pull/${number}))`;
|
|
28
|
-
}
|
|
29
|
-
line += ` ([${commit.shortHash}](${commitUrl}))`;
|
|
30
|
-
if (authors.length > 0) {
|
|
31
|
-
const authorList = authors.map((author) => author.login ? `[@${author.login}](https://github.com/${author.login})` : author.name).join(", ");
|
|
32
|
-
line += ` (by ${authorList})`;
|
|
33
|
-
}
|
|
34
|
-
return line;
|
|
35
|
-
}
|
|
36
|
-
function buildTemplateGroups(options) {
|
|
37
|
-
const { commits, owner, repo, types, commitAuthors } = options;
|
|
38
|
-
const grouped = groupByType(commits, {
|
|
39
|
-
includeNonConventional: false,
|
|
40
|
-
mergeKeys: Object.fromEntries(Object.entries(types).map(([key, value]) => [key, value.types ?? [key]]))
|
|
41
|
-
});
|
|
42
|
-
return Object.entries(types).map(([key, value]) => {
|
|
43
|
-
const formattedCommits = (grouped.get(key) ?? []).map((commit) => ({ line: formatCommitLine({
|
|
44
|
-
commit,
|
|
45
|
-
owner,
|
|
46
|
-
repo,
|
|
47
|
-
authors: commitAuthors.get(commit.hash) ?? []
|
|
48
|
-
}) }));
|
|
49
|
-
return {
|
|
50
|
-
name: key,
|
|
51
|
-
title: value.title,
|
|
52
|
-
commits: formattedCommits
|
|
53
|
-
};
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
//#endregion
|
|
58
14
|
//#region src/shared/utils.ts
|
|
59
15
|
const args = mri(process.argv.slice(2));
|
|
60
16
|
const isDryRun = !!args.dry;
|
|
@@ -133,6 +89,50 @@ if (isDryRun || isVerbose$1 || isForce) {
|
|
|
133
89
|
logger.verbose();
|
|
134
90
|
}
|
|
135
91
|
|
|
92
|
+
//#endregion
|
|
93
|
+
//#region src/operations/changelog-format.ts
|
|
94
|
+
function formatCommitLine({ commit, owner, repo, authors }) {
|
|
95
|
+
const commitUrl = `https://github.com/${owner}/${repo}/commit/${commit.hash}`;
|
|
96
|
+
let line = `${commit.description}`;
|
|
97
|
+
const references = commit.references ?? [];
|
|
98
|
+
for (const ref of references) {
|
|
99
|
+
if (!ref.value) continue;
|
|
100
|
+
const number = Number.parseInt(ref.value.replace(/^#/, ""), 10);
|
|
101
|
+
if (Number.isNaN(number)) continue;
|
|
102
|
+
if (ref.type === "issue") {
|
|
103
|
+
line += ` ([Issue ${ref.value}](https://github.com/${owner}/${repo}/issues/${number}))`;
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
line += ` ([PR ${ref.value}](https://github.com/${owner}/${repo}/pull/${number}))`;
|
|
107
|
+
}
|
|
108
|
+
line += ` ([${commit.shortHash}](${commitUrl}))`;
|
|
109
|
+
if (authors.length > 0) {
|
|
110
|
+
const authorList = authors.map((author) => author.login ? `[@${author.login}](https://github.com/${author.login})` : author.name).join(", ");
|
|
111
|
+
line += ` (by ${authorList})`;
|
|
112
|
+
}
|
|
113
|
+
return line;
|
|
114
|
+
}
|
|
115
|
+
function buildTemplateGroups(options) {
|
|
116
|
+
const { commits, owner, repo, types, commitAuthors } = options;
|
|
117
|
+
const grouped = groupByType(commits, {
|
|
118
|
+
includeNonConventional: false,
|
|
119
|
+
mergeKeys: Object.fromEntries(Object.entries(types).map(([key, value]) => [key, value.types ?? [key]]))
|
|
120
|
+
});
|
|
121
|
+
return Object.entries(types).map(([key, value]) => {
|
|
122
|
+
const formattedCommits = (grouped.get(key) ?? []).map((commit) => ({ line: formatCommitLine({
|
|
123
|
+
commit,
|
|
124
|
+
owner,
|
|
125
|
+
repo,
|
|
126
|
+
authors: commitAuthors.get(commit.hash) ?? []
|
|
127
|
+
}) }));
|
|
128
|
+
return {
|
|
129
|
+
name: key,
|
|
130
|
+
title: value.title,
|
|
131
|
+
commits: formattedCommits
|
|
132
|
+
};
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
|
|
136
136
|
//#endregion
|
|
137
137
|
//#region src/shared/errors.ts
|
|
138
138
|
const isVerbose = !!mri(process.argv.slice(2)).verbose;
|
|
@@ -1417,6 +1417,14 @@ async function discoverWorkspacePackages(workspaceRoot, options) {
|
|
|
1417
1417
|
if (missing.length > 0) exitWithError(`Package${missing.length > 1 ? "s" : ""} not found in workspace: ${missing.join(", ")}`, "Check your package names or run 'pnpm ls' to see available packages");
|
|
1418
1418
|
}
|
|
1419
1419
|
const isPackagePromptEnabled = options.prompts?.packages !== false;
|
|
1420
|
+
logger.verbose("Package prompt gating", {
|
|
1421
|
+
isCI,
|
|
1422
|
+
isPackagePromptEnabled,
|
|
1423
|
+
hasExplicitPackages: Boolean(explicitPackages),
|
|
1424
|
+
include: workspaceOptions.include ?? [],
|
|
1425
|
+
exclude: workspaceOptions.exclude ?? [],
|
|
1426
|
+
excludePrivate: workspaceOptions.excludePrivate ?? false
|
|
1427
|
+
});
|
|
1420
1428
|
if (!isCI && isPackagePromptEnabled && !explicitPackages) {
|
|
1421
1429
|
const selectedNames = await selectPackagePrompt(workspacePackages);
|
|
1422
1430
|
workspacePackages = workspacePackages.filter((pkg) => selectedNames.includes(pkg.name));
|
|
@@ -1887,12 +1895,6 @@ async function calculateVersionUpdates({ workspacePackages, packageCommits, work
|
|
|
1887
1895
|
const processedPackages = /* @__PURE__ */ new Set();
|
|
1888
1896
|
const newOverrides = { ...initialOverrides };
|
|
1889
1897
|
const excludedPackages = /* @__PURE__ */ new Set();
|
|
1890
|
-
const bumpRanks = {
|
|
1891
|
-
major: 3,
|
|
1892
|
-
minor: 2,
|
|
1893
|
-
patch: 1,
|
|
1894
|
-
none: 0
|
|
1895
|
-
};
|
|
1896
1898
|
logger.verbose(`Starting version inference for ${packageCommits.size} packages with commits`);
|
|
1897
1899
|
for (const [pkgName, pkgCommits] of packageCommits) {
|
|
1898
1900
|
const pkg = workspacePackages.find((p) => p.name === pkgName);
|
|
@@ -1915,18 +1917,24 @@ async function calculateVersionUpdates({ workspacePackages, packageCommits, work
|
|
|
1915
1917
|
logger.clearScreen();
|
|
1916
1918
|
logger.section(`📝 Commits for ${farver.cyan(pkg.name)}`);
|
|
1917
1919
|
formatCommitsForDisplay(allCommitsForPackage).split("\n").forEach((line) => logger.item(line));
|
|
1920
|
+
logger.item(farver.dim(`Auto bump: ${determinedBump} → ${autoVersion}`));
|
|
1918
1921
|
logger.emptyLine();
|
|
1919
1922
|
if (override) {
|
|
1920
1923
|
const overrideChoice = await confirmOverridePrompt(pkg, override.version);
|
|
1921
1924
|
if (overrideChoice === null) continue;
|
|
1922
1925
|
if (overrideChoice === "use") {
|
|
1926
|
+
newOverrides[pkgName] = {
|
|
1927
|
+
type: override.type,
|
|
1928
|
+
version: override.version
|
|
1929
|
+
};
|
|
1930
|
+
if (override.version === pkg.version) excludedPackages.add(pkgName);
|
|
1923
1931
|
versionUpdates.push({
|
|
1924
1932
|
package: pkg,
|
|
1925
1933
|
currentVersion: pkg.version,
|
|
1926
1934
|
newVersion: override.version,
|
|
1927
1935
|
bumpType: override.type,
|
|
1928
1936
|
hasDirectChanges: allCommitsForPackage.length > 0,
|
|
1929
|
-
changeKind: "manual"
|
|
1937
|
+
changeKind: override.version === pkg.version ? "as-is" : "manual"
|
|
1930
1938
|
});
|
|
1931
1939
|
continue;
|
|
1932
1940
|
}
|
|
@@ -1934,26 +1942,18 @@ async function calculateVersionUpdates({ workspacePackages, packageCommits, work
|
|
|
1934
1942
|
}
|
|
1935
1943
|
const selectedVersion = await selectVersionPrompt(workspaceRoot, pkg, pkg.version, newVersion, {
|
|
1936
1944
|
defaultChoice: override ? "suggested" : "auto",
|
|
1937
|
-
suggestedHint:
|
|
1945
|
+
suggestedHint: `auto: ${determinedBump} → ${autoVersion}`
|
|
1938
1946
|
});
|
|
1939
1947
|
if (selectedVersion === null) continue;
|
|
1940
1948
|
const userBump = calculateBumpType(pkg.version, selectedVersion);
|
|
1941
1949
|
finalBumpType = userBump;
|
|
1942
1950
|
if (selectedVersion === pkg.version) {
|
|
1943
1951
|
excludedPackages.add(pkgName);
|
|
1944
|
-
|
|
1945
|
-
|
|
1946
|
-
|
|
1947
|
-
|
|
1948
|
-
|
|
1949
|
-
if (!override || override.type !== nextOverride.type || override.version !== nextOverride.version) {
|
|
1950
|
-
newOverrides[pkgName] = nextOverride;
|
|
1951
|
-
logger.info(`Override set for ${pkgName}: suggested as-is (${pkg.version}) from auto ${determinedBump}`);
|
|
1952
|
-
}
|
|
1953
|
-
} else if (newOverrides[pkgName]) {
|
|
1954
|
-
delete newOverrides[pkgName];
|
|
1955
|
-
logger.info(`Override cleared for ${pkgName}.`);
|
|
1956
|
-
}
|
|
1952
|
+
newOverrides[pkgName] = {
|
|
1953
|
+
type: "none",
|
|
1954
|
+
version: pkg.version
|
|
1955
|
+
};
|
|
1956
|
+
logger.info(`Override set for ${pkgName}: manual as-is (${pkg.version})`);
|
|
1957
1957
|
versionUpdates.push({
|
|
1958
1958
|
package: pkg,
|
|
1959
1959
|
currentVersion: pkg.version,
|
|
@@ -1964,19 +1964,11 @@ async function calculateVersionUpdates({ workspacePackages, packageCommits, work
|
|
|
1964
1964
|
});
|
|
1965
1965
|
continue;
|
|
1966
1966
|
}
|
|
1967
|
-
|
|
1968
|
-
|
|
1969
|
-
|
|
1970
|
-
|
|
1971
|
-
|
|
1972
|
-
if (!override || override.type !== nextOverride.type || override.version !== nextOverride.version) {
|
|
1973
|
-
newOverrides[pkgName] = nextOverride;
|
|
1974
|
-
logger.info(`Override set for ${pkgName}: suggested ${userBump} (${selectedVersion}) from auto ${determinedBump}`);
|
|
1975
|
-
}
|
|
1976
|
-
} else if (newOverrides[pkgName] && bumpRanks[userBump] >= bumpRanks[determinedBump]) {
|
|
1977
|
-
delete newOverrides[pkgName];
|
|
1978
|
-
logger.info(`Override cleared for ${pkgName}.`);
|
|
1979
|
-
}
|
|
1967
|
+
newOverrides[pkgName] = {
|
|
1968
|
+
type: userBump,
|
|
1969
|
+
version: selectedVersion
|
|
1970
|
+
};
|
|
1971
|
+
logger.info(`Override set for ${pkgName}: manual ${userBump} (${selectedVersion})`);
|
|
1980
1972
|
newVersion = selectedVersion;
|
|
1981
1973
|
}
|
|
1982
1974
|
versionUpdates.push({
|
|
@@ -1993,13 +1985,27 @@ async function calculateVersionUpdates({ workspacePackages, packageCommits, work
|
|
|
1993
1985
|
logger.clearScreen();
|
|
1994
1986
|
logger.section(`📦 Package: ${pkg.name}`);
|
|
1995
1987
|
logger.item("No direct commits found");
|
|
1996
|
-
|
|
1988
|
+
logger.item(farver.dim(`Auto bump: none → ${pkg.version}`));
|
|
1989
|
+
const newVersion = await selectVersionPrompt(workspaceRoot, pkg, pkg.version, pkg.version, {
|
|
1990
|
+
defaultChoice: "auto",
|
|
1991
|
+
suggestedHint: `auto: none → ${pkg.version}`
|
|
1992
|
+
});
|
|
1997
1993
|
if (newVersion === null) break;
|
|
1998
1994
|
if (newVersion === pkg.version) {
|
|
1999
1995
|
excludedPackages.add(pkg.name);
|
|
1996
|
+
newOverrides[pkg.name] = {
|
|
1997
|
+
type: "none",
|
|
1998
|
+
version: pkg.version
|
|
1999
|
+
};
|
|
2000
|
+
logger.info(`Override set for ${pkg.name}: manual as-is (${pkg.version})`);
|
|
2000
2001
|
continue;
|
|
2001
2002
|
}
|
|
2002
2003
|
const bumpType = calculateBumpType(pkg.version, newVersion);
|
|
2004
|
+
newOverrides[pkg.name] = {
|
|
2005
|
+
type: bumpType,
|
|
2006
|
+
version: newVersion
|
|
2007
|
+
};
|
|
2008
|
+
logger.info(`Override set for ${pkg.name}: manual ${bumpType} (${newVersion})`);
|
|
2003
2009
|
versionUpdates.push({
|
|
2004
2010
|
package: pkg,
|
|
2005
2011
|
currentVersion: pkg.version,
|
|
@@ -2431,11 +2437,13 @@ async function publishPackage(packageName, version, workspaceRoot, options) {
|
|
|
2431
2437
|
15e3
|
|
2432
2438
|
];
|
|
2433
2439
|
for (let attempt = 1; attempt <= maxAttempts; attempt++) try {
|
|
2434
|
-
await runIfNotDry("pnpm", args, { nodeOptions: {
|
|
2440
|
+
const result = await runIfNotDry("pnpm", args, { nodeOptions: {
|
|
2435
2441
|
cwd: workspaceRoot,
|
|
2436
|
-
stdio: "
|
|
2442
|
+
stdio: "pipe",
|
|
2437
2443
|
env
|
|
2438
2444
|
} });
|
|
2445
|
+
if (result?.stdout && result.stdout.trim()) logger.verbose(result.stdout.trim());
|
|
2446
|
+
if (result?.stderr && result.stderr.trim()) logger.verbose(result.stderr.trim());
|
|
2439
2447
|
return ok(void 0);
|
|
2440
2448
|
} catch (error) {
|
|
2441
2449
|
const code = classifyPublishErrorCode(error);
|
|
@@ -2714,6 +2722,22 @@ async function verifyWorkflow(options) {
|
|
|
2714
2722
|
//#region src/index.ts
|
|
2715
2723
|
async function createReleaseScripts(options) {
|
|
2716
2724
|
const normalizedOptions = normalizeReleaseScriptsOptions(options);
|
|
2725
|
+
logger.verbose("Release scripts config", {
|
|
2726
|
+
repo: `${normalizedOptions.owner}/${normalizedOptions.repo}`,
|
|
2727
|
+
workspaceRoot: normalizedOptions.workspaceRoot,
|
|
2728
|
+
dryRun: normalizedOptions.dryRun,
|
|
2729
|
+
safeguards: normalizedOptions.safeguards,
|
|
2730
|
+
branch: normalizedOptions.branch,
|
|
2731
|
+
globalCommitMode: normalizedOptions.globalCommitMode,
|
|
2732
|
+
prompts: normalizedOptions.prompts,
|
|
2733
|
+
packages: normalizedOptions.packages,
|
|
2734
|
+
npm: {
|
|
2735
|
+
access: normalizedOptions.npm.access,
|
|
2736
|
+
provenance: normalizedOptions.npm.provenance,
|
|
2737
|
+
otp: normalizedOptions.npm.otp ? "set" : "unset"
|
|
2738
|
+
},
|
|
2739
|
+
changelog: normalizedOptions.changelog
|
|
2740
|
+
});
|
|
2717
2741
|
return {
|
|
2718
2742
|
async verify() {
|
|
2719
2743
|
return verifyWorkflow(normalizedOptions);
|