@git.zone/cli 2.14.3 → 2.15.0
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/.smartconfig.json +36 -11
- package/assets/templates/service/npmextra.json +8 -2
- package/assets/templates/smartconfig/_smartconfig.json +5 -1
- package/assets/templates/website/npmextra.json +8 -2
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/gitzone.cli.js +8 -1
- package/dist_ts/helpers.changelog.d.ts +16 -0
- package/dist_ts/helpers.changelog.js +114 -0
- package/dist_ts/helpers.smartconfigmigrations.d.ts +7 -0
- package/dist_ts/helpers.smartconfigmigrations.js +161 -0
- package/dist_ts/helpers.workflow.d.ts +97 -0
- package/dist_ts/helpers.workflow.js +258 -0
- package/dist_ts/mod_commit/index.js +190 -303
- package/dist_ts/mod_commit/mod.helpers.d.ts +23 -0
- package/dist_ts/mod_commit/mod.helpers.js +22 -15
- package/dist_ts/mod_commit/mod.ui.d.ts +1 -1
- package/dist_ts/mod_commit/mod.ui.js +7 -2
- package/dist_ts/mod_config/classes.commitconfig.d.ts +6 -0
- package/dist_ts/mod_config/classes.commitconfig.js +28 -4
- package/dist_ts/mod_config/classes.releaseconfig.js +13 -7
- package/dist_ts/mod_config/index.js +77 -29
- package/dist_ts/mod_format/formatters/smartconfig.formatter.js +3 -57
- package/dist_ts/mod_release/index.d.ts +3 -0
- package/dist_ts/mod_release/index.js +299 -0
- package/dist_ts/mod_release/mod.plugins.d.ts +3 -0
- package/dist_ts/mod_release/mod.plugins.js +4 -0
- package/dist_ts/mod_standard/index.js +16 -3
- package/license +2 -2
- package/package.json +20 -30
- package/readme.hints.md +15 -17
- package/readme.md +239 -421
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/gitzone.cli.ts +8 -0
- package/ts/helpers.changelog.ts +165 -0
- package/ts/helpers.smartconfigmigrations.ts +192 -0
- package/ts/helpers.workflow.ts +387 -0
- package/ts/mod_commit/index.ts +233 -435
- package/ts/mod_commit/mod.helpers.ts +28 -16
- package/ts/mod_commit/mod.ui.ts +7 -2
- package/ts/mod_config/classes.commitconfig.ts +33 -3
- package/ts/mod_config/classes.releaseconfig.ts +14 -7
- package/ts/mod_config/index.ts +89 -28
- package/ts/mod_format/formatters/smartconfig.formatter.ts +2 -62
- package/ts/mod_release/index.ts +393 -0
- package/ts/mod_release/mod.plugins.ts +5 -0
- package/ts/mod_standard/index.ts +15 -2
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import { getCliConfigValue } from "./helpers.smartconfig.js";
|
|
2
|
+
const commitFlagToStep = {
|
|
3
|
+
f: "format",
|
|
4
|
+
t: "test",
|
|
5
|
+
b: "build",
|
|
6
|
+
p: "push",
|
|
7
|
+
};
|
|
8
|
+
const unique = (items) => {
|
|
9
|
+
const result = [];
|
|
10
|
+
for (const item of items) {
|
|
11
|
+
if (!result.includes(item)) {
|
|
12
|
+
result.push(item);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return result;
|
|
16
|
+
};
|
|
17
|
+
const normalizeConfirmation = (value, fallback) => {
|
|
18
|
+
if (value === "prompt" || value === "auto" || value === "plan") {
|
|
19
|
+
return value;
|
|
20
|
+
}
|
|
21
|
+
return fallback;
|
|
22
|
+
};
|
|
23
|
+
const normalizeRegistryUrl = (url) => {
|
|
24
|
+
let normalizedUrl = url.trim();
|
|
25
|
+
if (!normalizedUrl.startsWith("http://") && !normalizedUrl.startsWith("https://")) {
|
|
26
|
+
normalizedUrl = `https://${normalizedUrl}`;
|
|
27
|
+
}
|
|
28
|
+
return normalizedUrl.endsWith("/") ? normalizedUrl.slice(0, -1) : normalizedUrl;
|
|
29
|
+
};
|
|
30
|
+
const isDisabled = (argvArg, ...keys) => {
|
|
31
|
+
return keys.some((key) => argvArg[key] === false || argvArg[`no-${key}`] || argvArg[`no${key[0].toUpperCase()}${key.slice(1)}`]);
|
|
32
|
+
};
|
|
33
|
+
const readCliWorkflowConfig = async () => {
|
|
34
|
+
return await getCliConfigValue("", {});
|
|
35
|
+
};
|
|
36
|
+
const getOrderedArgsAfterCommand = (commandName) => {
|
|
37
|
+
const rawArgs = process.argv.slice(2);
|
|
38
|
+
const commandIndex = rawArgs.indexOf(commandName);
|
|
39
|
+
if (commandIndex === -1) {
|
|
40
|
+
return rawArgs;
|
|
41
|
+
}
|
|
42
|
+
return rawArgs.slice(commandIndex + 1);
|
|
43
|
+
};
|
|
44
|
+
const getOrderedShortFlags = (commandName) => {
|
|
45
|
+
const orderedFlags = [];
|
|
46
|
+
for (const arg of getOrderedArgsAfterCommand(commandName)) {
|
|
47
|
+
if (arg === "--") {
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
if (arg.startsWith("--")) {
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (arg.startsWith("-") && arg.length > 1) {
|
|
54
|
+
orderedFlags.push(...arg.slice(1).split(""));
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return orderedFlags;
|
|
58
|
+
};
|
|
59
|
+
const hasExplicitCommitWorkflowFlags = (argvArg) => {
|
|
60
|
+
return Boolean(argvArg.f ||
|
|
61
|
+
argvArg.format ||
|
|
62
|
+
argvArg.t ||
|
|
63
|
+
argvArg.test ||
|
|
64
|
+
argvArg.b ||
|
|
65
|
+
argvArg.build ||
|
|
66
|
+
argvArg.p ||
|
|
67
|
+
argvArg.push);
|
|
68
|
+
};
|
|
69
|
+
const normalizeCommitSteps = (rawSteps) => {
|
|
70
|
+
const steps = unique(rawSteps.filter(Boolean));
|
|
71
|
+
const pushRequested = steps.includes("push");
|
|
72
|
+
const prePushSteps = steps.filter((step) => step !== "push");
|
|
73
|
+
if (!prePushSteps.includes("analyze")) {
|
|
74
|
+
prePushSteps.unshift("analyze");
|
|
75
|
+
}
|
|
76
|
+
if (!prePushSteps.includes("changelog")) {
|
|
77
|
+
const commitIndex = prePushSteps.indexOf("commit");
|
|
78
|
+
if (commitIndex === -1) {
|
|
79
|
+
prePushSteps.push("changelog");
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
prePushSteps.splice(commitIndex, 0, "changelog");
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (!prePushSteps.includes("commit")) {
|
|
86
|
+
prePushSteps.push("commit");
|
|
87
|
+
}
|
|
88
|
+
const analyzeIndex = prePushSteps.indexOf("analyze");
|
|
89
|
+
const commitIndex = prePushSteps.indexOf("commit");
|
|
90
|
+
if (analyzeIndex > commitIndex) {
|
|
91
|
+
throw new Error("Commit workflow requires analyze before commit.");
|
|
92
|
+
}
|
|
93
|
+
const changelogIndex = prePushSteps.indexOf("changelog");
|
|
94
|
+
if (changelogIndex === -1 || changelogIndex > commitIndex) {
|
|
95
|
+
throw new Error("Commit workflow requires changelog before commit.");
|
|
96
|
+
}
|
|
97
|
+
return pushRequested ? [...prePushSteps, "push"] : prePushSteps;
|
|
98
|
+
};
|
|
99
|
+
const getTargetOverride = (argvArg) => {
|
|
100
|
+
const validTargets = ["git", "npm", "docker"];
|
|
101
|
+
const rawTargets = argvArg.target || argvArg.targets;
|
|
102
|
+
if (typeof rawTargets === "string") {
|
|
103
|
+
return rawTargets
|
|
104
|
+
.split(",")
|
|
105
|
+
.map((target) => target.trim())
|
|
106
|
+
.filter((target) => validTargets.includes(target));
|
|
107
|
+
}
|
|
108
|
+
const targets = [];
|
|
109
|
+
if (argvArg.git || argvArg.p || argvArg.push)
|
|
110
|
+
targets.push("git");
|
|
111
|
+
if (argvArg.npm)
|
|
112
|
+
targets.push("npm");
|
|
113
|
+
if (argvArg.docker)
|
|
114
|
+
targets.push("docker");
|
|
115
|
+
return targets.length > 0 ? targets : undefined;
|
|
116
|
+
};
|
|
117
|
+
const buildReleasePlan = (options) => {
|
|
118
|
+
const plan = [];
|
|
119
|
+
if (options.requireCleanTree)
|
|
120
|
+
plan.push("preflight.cleanTree");
|
|
121
|
+
if (options.runTests)
|
|
122
|
+
plan.push("preflight.test");
|
|
123
|
+
plan.push("core.version", "core.changelog", "core.commit", "core.tag");
|
|
124
|
+
if (options.runBuild)
|
|
125
|
+
plan.push("core.build");
|
|
126
|
+
for (const target of options.targets) {
|
|
127
|
+
plan.push(`target.${target}`);
|
|
128
|
+
}
|
|
129
|
+
return plan;
|
|
130
|
+
};
|
|
131
|
+
export const resolveCommitWorkflow = async (argvArg) => {
|
|
132
|
+
const cliConfig = await readCliWorkflowConfig();
|
|
133
|
+
const commitConfig = cliConfig.commit || {};
|
|
134
|
+
const releaseFlagRequested = Boolean(argvArg.r || argvArg.release);
|
|
135
|
+
let confirmation = normalizeConfirmation(commitConfig.confirmation, "prompt");
|
|
136
|
+
if (argvArg.plan) {
|
|
137
|
+
confirmation = "plan";
|
|
138
|
+
}
|
|
139
|
+
else if (argvArg.y || argvArg.yes) {
|
|
140
|
+
confirmation = "auto";
|
|
141
|
+
}
|
|
142
|
+
let rawSteps;
|
|
143
|
+
if (hasExplicitCommitWorkflowFlags(argvArg)) {
|
|
144
|
+
const orderedFlags = getOrderedShortFlags("commit");
|
|
145
|
+
rawSteps = ["analyze"];
|
|
146
|
+
for (const shortFlag of orderedFlags) {
|
|
147
|
+
const step = commitFlagToStep[shortFlag];
|
|
148
|
+
if (step) {
|
|
149
|
+
rawSteps.push(step);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
if (argvArg.format && !rawSteps.includes("format"))
|
|
153
|
+
rawSteps.push("format");
|
|
154
|
+
if (argvArg.test && !rawSteps.includes("test"))
|
|
155
|
+
rawSteps.push("test");
|
|
156
|
+
if (argvArg.build && !rawSteps.includes("build"))
|
|
157
|
+
rawSteps.push("build");
|
|
158
|
+
if (argvArg.push && !rawSteps.includes("push"))
|
|
159
|
+
rawSteps.push("push");
|
|
160
|
+
rawSteps.push("changelog");
|
|
161
|
+
rawSteps.push("commit");
|
|
162
|
+
}
|
|
163
|
+
else if (Array.isArray(commitConfig.steps) && commitConfig.steps.length > 0) {
|
|
164
|
+
rawSteps = commitConfig.steps;
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
rawSteps = ["analyze"];
|
|
168
|
+
if (commitConfig.alwaysTest)
|
|
169
|
+
rawSteps.push("test");
|
|
170
|
+
if (commitConfig.alwaysBuild)
|
|
171
|
+
rawSteps.push("build");
|
|
172
|
+
rawSteps.push("changelog");
|
|
173
|
+
rawSteps.push("commit");
|
|
174
|
+
}
|
|
175
|
+
return {
|
|
176
|
+
confirmation,
|
|
177
|
+
steps: normalizeCommitSteps(rawSteps),
|
|
178
|
+
staging: commitConfig.staging || "all",
|
|
179
|
+
testCommand: commitConfig.test?.command || "pnpm test",
|
|
180
|
+
buildCommand: commitConfig.build?.command || "pnpm build",
|
|
181
|
+
changelogFile: "changelog.md",
|
|
182
|
+
changelogSection: "Pending",
|
|
183
|
+
pushRemote: commitConfig.push?.remote || "origin",
|
|
184
|
+
pushFollowTags: commitConfig.push?.followTags || false,
|
|
185
|
+
releaseFlagRequested,
|
|
186
|
+
};
|
|
187
|
+
};
|
|
188
|
+
export const resolveReleaseWorkflow = async (argvArg) => {
|
|
189
|
+
const cliConfig = await readCliWorkflowConfig();
|
|
190
|
+
const releaseConfig = cliConfig.release || {};
|
|
191
|
+
const targetConfig = releaseConfig.targets || {};
|
|
192
|
+
const gitConfig = targetConfig.git || {};
|
|
193
|
+
const npmConfig = targetConfig.npm || {};
|
|
194
|
+
const dockerConfig = targetConfig.docker || {};
|
|
195
|
+
const npmRegistries = (npmConfig.registries || []).map(normalizeRegistryUrl);
|
|
196
|
+
const npmEnabled = npmConfig.enabled ?? npmRegistries.length > 0;
|
|
197
|
+
const gitEnabled = gitConfig.enabled ?? true;
|
|
198
|
+
const dockerEnabled = dockerConfig.enabled ?? false;
|
|
199
|
+
let confirmation = normalizeConfirmation(releaseConfig.confirmation, "prompt");
|
|
200
|
+
if (argvArg.plan) {
|
|
201
|
+
confirmation = "plan";
|
|
202
|
+
}
|
|
203
|
+
else if (argvArg.y || argvArg.yes) {
|
|
204
|
+
confirmation = "auto";
|
|
205
|
+
}
|
|
206
|
+
let requireCleanTree = releaseConfig.preflight?.requireCleanTree ?? true;
|
|
207
|
+
let runTests = releaseConfig.preflight?.test ?? false;
|
|
208
|
+
let runBuild = releaseConfig.preflight?.build ?? true;
|
|
209
|
+
if (argvArg.t || argvArg.test)
|
|
210
|
+
runTests = true;
|
|
211
|
+
if (argvArg.b || argvArg.build)
|
|
212
|
+
runBuild = true;
|
|
213
|
+
if (isDisabled(argvArg, "test"))
|
|
214
|
+
runTests = false;
|
|
215
|
+
if (isDisabled(argvArg, "build"))
|
|
216
|
+
runBuild = false;
|
|
217
|
+
if (isDisabled(argvArg, "preflight"))
|
|
218
|
+
requireCleanTree = false;
|
|
219
|
+
const configuredTargets = [];
|
|
220
|
+
if (gitEnabled)
|
|
221
|
+
configuredTargets.push("git");
|
|
222
|
+
if (npmEnabled)
|
|
223
|
+
configuredTargets.push("npm");
|
|
224
|
+
if (dockerEnabled)
|
|
225
|
+
configuredTargets.push("docker");
|
|
226
|
+
let targets = getTargetOverride(argvArg) || configuredTargets;
|
|
227
|
+
if (isDisabled(argvArg, "git", "push")) {
|
|
228
|
+
targets = targets.filter((target) => target !== "git");
|
|
229
|
+
}
|
|
230
|
+
if (isDisabled(argvArg, "publish")) {
|
|
231
|
+
targets = targets.filter((target) => target === "git");
|
|
232
|
+
}
|
|
233
|
+
targets = unique(targets);
|
|
234
|
+
return {
|
|
235
|
+
confirmation,
|
|
236
|
+
plan: buildReleasePlan({ requireCleanTree, runTests, runBuild, targets }),
|
|
237
|
+
targets,
|
|
238
|
+
requireCleanTree,
|
|
239
|
+
runTests,
|
|
240
|
+
runBuild,
|
|
241
|
+
testCommand: releaseConfig.preflight?.testCommand || "pnpm test",
|
|
242
|
+
buildCommand: releaseConfig.preflight?.buildCommand || "pnpm build",
|
|
243
|
+
changelogFile: "changelog.md",
|
|
244
|
+
changelogPendingSection: "Pending",
|
|
245
|
+
changelogVersionHeading: "## {{date}} - {{version}}",
|
|
246
|
+
gitEnabled,
|
|
247
|
+
gitRemote: gitConfig.remote || "origin",
|
|
248
|
+
pushBranch: gitConfig.pushBranch ?? true,
|
|
249
|
+
pushTags: gitConfig.pushTags ?? true,
|
|
250
|
+
npmEnabled,
|
|
251
|
+
npmRegistries,
|
|
252
|
+
npmAccessLevel: npmConfig.accessLevel || "public",
|
|
253
|
+
npmAlreadyPublished: npmConfig.alreadyPublished || "success",
|
|
254
|
+
dockerEnabled,
|
|
255
|
+
dockerImages: dockerConfig.images || [],
|
|
256
|
+
};
|
|
257
|
+
};
|
|
258
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy53b3JrZmxvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2hlbHBlcnMud29ya2Zsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUF1SDdELE1BQU0sZ0JBQWdCLEdBQTRDO0lBQ2hFLENBQUMsRUFBRSxRQUFRO0lBQ1gsQ0FBQyxFQUFFLE1BQU07SUFDVCxDQUFDLEVBQUUsT0FBTztJQUNWLENBQUMsRUFBRSxNQUFNO0NBQ1YsQ0FBQztBQUVGLE1BQU0sTUFBTSxHQUFHLENBQUksS0FBVSxFQUFPLEVBQUU7SUFDcEMsTUFBTSxNQUFNLEdBQVEsRUFBRSxDQUFDO0lBQ3ZCLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMzQixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BCLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxxQkFBcUIsR0FBRyxDQUM1QixLQUFjLEVBQ2QsUUFBMkIsRUFDUixFQUFFO0lBQ3JCLElBQUksS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssTUFBTSxJQUFJLEtBQUssS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUMvRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDLENBQUM7QUFFRixNQUFNLG9CQUFvQixHQUFHLENBQUMsR0FBVyxFQUFVLEVBQUU7SUFDbkQsSUFBSSxhQUFhLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQy9CLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFVB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
|