@git.zone/cli 1.18.5 → 1.18.8
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_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/mod_commit/index.js +8 -3
- package/dist_ts/mod_commit/mod.helpers.d.ts +25 -0
- package/dist_ts/mod_commit/mod.helpers.js +164 -0
- package/package.json +9 -9
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/mod_commit/index.ts +9 -2
- package/ts/mod_commit/mod.helpers.ts +204 -0
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@git.zone/cli',
|
|
6
|
-
version: '1.18.
|
|
6
|
+
version: '1.18.8',
|
|
7
7
|
description: 'A comprehensive CLI tool for enhancing and managing local development workflows with gitzone utilities, focusing on project setup, version control, code formatting, and template management.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxlQUFlO0lBQ3JCLE9BQU8sRUFBRSxRQUFRO0lBQ2pCLFdBQVcsRUFBRSwrTEFBK0w7Q0FDN00sQ0FBQSJ9
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import * as plugins from './mod.plugins.js';
|
|
3
3
|
import * as paths from '../paths.js';
|
|
4
4
|
import { logger } from '../gitzone.logging.js';
|
|
5
|
+
import * as helpers from './mod.helpers.js';
|
|
5
6
|
export const run = async (argvArg) => {
|
|
6
7
|
if (argvArg.format) {
|
|
7
8
|
const formatMod = await import('../mod_format/index.js');
|
|
@@ -82,10 +83,14 @@ export const run = async (argvArg) => {
|
|
|
82
83
|
logger.log('info', `Staging files for commit:`);
|
|
83
84
|
await smartshellInstance.exec(`git add -A`);
|
|
84
85
|
await smartshellInstance.exec(`git commit -m "${commitString}"`);
|
|
85
|
-
|
|
86
|
+
// Detect project type and bump version accordingly
|
|
87
|
+
const projectType = await helpers.detectProjectType();
|
|
88
|
+
await helpers.bumpProjectVersion(projectType, commitVersionType);
|
|
86
89
|
if (answerBucket.getAnswerFor('pushToOrigin') &&
|
|
87
90
|
!(process.env.CI === 'true')) {
|
|
88
|
-
|
|
91
|
+
// Detect current branch instead of hardcoding "master"
|
|
92
|
+
const currentBranch = await helpers.detectCurrentBranch();
|
|
93
|
+
await smartshellInstance.exec(`git push origin ${currentBranch} --follow-tags`);
|
|
89
94
|
}
|
|
90
95
|
};
|
|
91
96
|
const createCommitStringFromAnswerBucket = (answerBucket) => {
|
|
@@ -94,4 +99,4 @@ const createCommitStringFromAnswerBucket = (answerBucket) => {
|
|
|
94
99
|
const commitDescription = answerBucket.getAnswerFor('commitDescription');
|
|
95
100
|
return `${commitType}(${commitScope}): ${commitDescription}`;
|
|
96
101
|
};
|
|
97
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
102
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfY29tbWl0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGdFQUFnRTtBQUVoRSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxLQUFLLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBRTVDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxLQUFLLEVBQUUsT0FBWSxFQUFFLEVBQUU7SUFDeEMsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbkIsTUFBTSxTQUFTLEdBQUcsTUFBTSxNQUFNLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUN6RCxNQUFNLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztJQUN6QyxNQUFNLEtBQUssR0FBRyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDeEMsTUFBTSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7SUFFcEIsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFdEUsTUFBTSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFFbkIsTUFBTSxDQUFDLEdBQUcsQ0FDUixNQUFNLEVBQ047OztTQUdLLGdCQUFnQixDQUFDLHNCQUFzQjtTQUN2QyxnQkFBZ0IsQ0FBQywyQkFBMkIsSUFBSSxnQkFBZ0IsQ0FBQywyQkFBMkIsTUFBTSxnQkFBZ0IsQ0FBQyw2QkFBNkI7O0dBRXRKLENBQ0EsQ0FBQztJQUNGLE1BQU0sY0FBYyxH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
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export type ProjectType = 'npm' | 'deno' | 'both' | 'none';
|
|
2
|
+
export type VersionType = 'patch' | 'minor' | 'major';
|
|
3
|
+
/**
|
|
4
|
+
* Detects the current git branch
|
|
5
|
+
* @returns The current branch name, defaults to 'master' if detection fails
|
|
6
|
+
*/
|
|
7
|
+
export declare function detectCurrentBranch(): Promise<string>;
|
|
8
|
+
/**
|
|
9
|
+
* Detects the project type based on presence of package.json and/or deno.json
|
|
10
|
+
* @returns The project type
|
|
11
|
+
*/
|
|
12
|
+
export declare function detectProjectType(): Promise<ProjectType>;
|
|
13
|
+
/**
|
|
14
|
+
* Bumps the version in deno.json
|
|
15
|
+
* @param versionType Type of version bump
|
|
16
|
+
* @returns The new version string
|
|
17
|
+
*/
|
|
18
|
+
export declare function bumpDenoVersion(versionType: VersionType): Promise<string>;
|
|
19
|
+
/**
|
|
20
|
+
* Bumps the project version based on project type
|
|
21
|
+
* @param projectType The detected project type
|
|
22
|
+
* @param versionType The type of version bump
|
|
23
|
+
* @returns The new version string
|
|
24
|
+
*/
|
|
25
|
+
export declare function bumpProjectVersion(projectType: ProjectType, versionType: VersionType): Promise<string>;
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import * as plugins from './mod.plugins.js';
|
|
2
|
+
import * as paths from '../paths.js';
|
|
3
|
+
import { logger } from '../gitzone.logging.js';
|
|
4
|
+
/**
|
|
5
|
+
* Detects the current git branch
|
|
6
|
+
* @returns The current branch name, defaults to 'master' if detection fails
|
|
7
|
+
*/
|
|
8
|
+
export async function detectCurrentBranch() {
|
|
9
|
+
try {
|
|
10
|
+
const smartshellInstance = new plugins.smartshell.Smartshell({
|
|
11
|
+
executor: 'bash',
|
|
12
|
+
sourceFilePaths: [],
|
|
13
|
+
});
|
|
14
|
+
const result = await smartshellInstance.exec('git branch --show-current');
|
|
15
|
+
const branchName = result.stdout.trim();
|
|
16
|
+
if (!branchName) {
|
|
17
|
+
logger.log('warn', 'Could not detect current branch, falling back to "master"');
|
|
18
|
+
return 'master';
|
|
19
|
+
}
|
|
20
|
+
logger.log('info', `Detected current branch: ${branchName}`);
|
|
21
|
+
return branchName;
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
logger.log('warn', `Failed to detect branch: ${error.message}, falling back to "master"`);
|
|
25
|
+
return 'master';
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Detects the project type based on presence of package.json and/or deno.json
|
|
30
|
+
* @returns The project type
|
|
31
|
+
*/
|
|
32
|
+
export async function detectProjectType() {
|
|
33
|
+
const packageJsonPath = plugins.path.join(paths.cwd, 'package.json');
|
|
34
|
+
const denoJsonPath = plugins.path.join(paths.cwd, 'deno.json');
|
|
35
|
+
const hasPackageJson = await plugins.smartfile.fs.fileExists(packageJsonPath);
|
|
36
|
+
const hasDenoJson = await plugins.smartfile.fs.fileExists(denoJsonPath);
|
|
37
|
+
if (hasPackageJson && hasDenoJson) {
|
|
38
|
+
logger.log('info', 'Detected dual project (npm + deno)');
|
|
39
|
+
return 'both';
|
|
40
|
+
}
|
|
41
|
+
else if (hasPackageJson) {
|
|
42
|
+
logger.log('info', 'Detected npm project');
|
|
43
|
+
return 'npm';
|
|
44
|
+
}
|
|
45
|
+
else if (hasDenoJson) {
|
|
46
|
+
logger.log('info', 'Detected deno project');
|
|
47
|
+
return 'deno';
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
throw new Error('No package.json or deno.json found in current directory');
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Parses a semantic version string and bumps it according to the version type
|
|
55
|
+
* @param currentVersion Current version string (e.g., "1.2.3")
|
|
56
|
+
* @param versionType Type of version bump
|
|
57
|
+
* @returns New version string
|
|
58
|
+
*/
|
|
59
|
+
function calculateNewVersion(currentVersion, versionType) {
|
|
60
|
+
const versionMatch = currentVersion.match(/^(\d+)\.(\d+)\.(\d+)/);
|
|
61
|
+
if (!versionMatch) {
|
|
62
|
+
throw new Error(`Invalid version format: ${currentVersion}`);
|
|
63
|
+
}
|
|
64
|
+
let [, major, minor, patch] = versionMatch.map(Number);
|
|
65
|
+
switch (versionType) {
|
|
66
|
+
case 'major':
|
|
67
|
+
major += 1;
|
|
68
|
+
minor = 0;
|
|
69
|
+
patch = 0;
|
|
70
|
+
break;
|
|
71
|
+
case 'minor':
|
|
72
|
+
minor += 1;
|
|
73
|
+
patch = 0;
|
|
74
|
+
break;
|
|
75
|
+
case 'patch':
|
|
76
|
+
patch += 1;
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
return `${major}.${minor}.${patch}`;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Bumps the version in deno.json
|
|
83
|
+
* @param versionType Type of version bump
|
|
84
|
+
* @returns The new version string
|
|
85
|
+
*/
|
|
86
|
+
export async function bumpDenoVersion(versionType) {
|
|
87
|
+
const denoJsonPath = plugins.path.join(paths.cwd, 'deno.json');
|
|
88
|
+
try {
|
|
89
|
+
// Read deno.json
|
|
90
|
+
const denoConfig = plugins.smartfile.fs.toObjectSync(denoJsonPath);
|
|
91
|
+
if (!denoConfig.version) {
|
|
92
|
+
throw new Error('deno.json does not contain a version field');
|
|
93
|
+
}
|
|
94
|
+
const currentVersion = denoConfig.version;
|
|
95
|
+
const newVersion = calculateNewVersion(currentVersion, versionType);
|
|
96
|
+
logger.log('info', `Bumping deno.json version: ${currentVersion} → ${newVersion}`);
|
|
97
|
+
// Update version
|
|
98
|
+
denoConfig.version = newVersion;
|
|
99
|
+
// Write back to disk
|
|
100
|
+
await plugins.smartfile.memory.toFs(JSON.stringify(denoConfig, null, 2) + '\n', denoJsonPath);
|
|
101
|
+
return newVersion;
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
throw new Error(`Failed to bump deno.json version: ${error.message}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Bumps the version in package.json using npm version command
|
|
109
|
+
* @param versionType Type of version bump
|
|
110
|
+
* @returns The new version string
|
|
111
|
+
*/
|
|
112
|
+
async function bumpNpmVersion(versionType) {
|
|
113
|
+
const smartshellInstance = new plugins.smartshell.Smartshell({
|
|
114
|
+
executor: 'bash',
|
|
115
|
+
sourceFilePaths: [],
|
|
116
|
+
});
|
|
117
|
+
logger.log('info', `Bumping package.json version using npm version ${versionType}`);
|
|
118
|
+
const result = await smartshellInstance.exec(`npm version ${versionType}`);
|
|
119
|
+
// npm version returns the new version with a 'v' prefix, e.g., "v1.2.3"
|
|
120
|
+
const newVersion = result.stdout.trim().replace(/^v/, '');
|
|
121
|
+
return newVersion;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Syncs the version from package.json to deno.json
|
|
125
|
+
* @param version The version to sync
|
|
126
|
+
*/
|
|
127
|
+
async function syncVersionToDenoJson(version) {
|
|
128
|
+
const denoJsonPath = plugins.path.join(paths.cwd, 'deno.json');
|
|
129
|
+
try {
|
|
130
|
+
const denoConfig = plugins.smartfile.fs.toObjectSync(denoJsonPath);
|
|
131
|
+
logger.log('info', `Syncing version to deno.json: ${version}`);
|
|
132
|
+
denoConfig.version = version;
|
|
133
|
+
await plugins.smartfile.memory.toFs(JSON.stringify(denoConfig, null, 2) + '\n', denoJsonPath);
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
throw new Error(`Failed to sync version to deno.json: ${error.message}`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Bumps the project version based on project type
|
|
141
|
+
* @param projectType The detected project type
|
|
142
|
+
* @param versionType The type of version bump
|
|
143
|
+
* @returns The new version string
|
|
144
|
+
*/
|
|
145
|
+
export async function bumpProjectVersion(projectType, versionType) {
|
|
146
|
+
switch (projectType) {
|
|
147
|
+
case 'npm':
|
|
148
|
+
return await bumpNpmVersion(versionType);
|
|
149
|
+
case 'deno':
|
|
150
|
+
return await bumpDenoVersion(versionType);
|
|
151
|
+
case 'both': {
|
|
152
|
+
// Bump npm version first (it handles git tags)
|
|
153
|
+
const newVersion = await bumpNpmVersion(versionType);
|
|
154
|
+
// Then sync to deno.json
|
|
155
|
+
await syncVersionToDenoJson(newVersion);
|
|
156
|
+
return newVersion;
|
|
157
|
+
}
|
|
158
|
+
case 'none':
|
|
159
|
+
throw new Error('Cannot bump version: no package.json or deno.json found');
|
|
160
|
+
default:
|
|
161
|
+
throw new Error(`Unknown project type: ${projectType}`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kLmhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfY29tbWl0L21vZC5oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLEtBQUssTUFBTSxhQUFhLENBQUM7QUFDckMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBSy9DOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsbUJBQW1CO0lBQ3ZDLElBQUksQ0FBQztRQUNILE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQztZQUMzRCxRQUFRLEVBQUUsTUFBTTtZQUNoQixlQUFlLEVBQUUsRUFBRTtTQUNwQixDQUFDLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLGtCQUFrQixDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQzFFLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFeEMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLDJEQUEyRCxDQUFDLENBQUM7WUFDaEYsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztRQUVELE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLDRCQUE0QixVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQzdELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsNEJBQTRCLEtBQUssQ0FBQyxPQUFPLDRCQUE0QixDQUFDLENBQUM7UUFDMUYsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztBQUNILENBQUM7QUFFRDs7O0dBR0c7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
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@git.zone/cli",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "1.18.
|
|
4
|
+
"version": "1.18.8",
|
|
5
5
|
"description": "A comprehensive CLI tool for enhancing and managing local development workflows with gitzone utilities, focusing on project setup, version control, code formatting, and template management.",
|
|
6
6
|
"main": "dist_ts/index.ts",
|
|
7
7
|
"typings": "dist_ts/index.d.ts",
|
|
@@ -39,19 +39,19 @@
|
|
|
39
39
|
},
|
|
40
40
|
"homepage": "https://gitlab.com/gitzone/private/gitzone#readme",
|
|
41
41
|
"devDependencies": {
|
|
42
|
-
"@git.zone/tsbuild": "^2.6.
|
|
42
|
+
"@git.zone/tsbuild": "^2.6.8",
|
|
43
43
|
"@git.zone/tsrun": "^1.3.3",
|
|
44
|
-
"@git.zone/tstest": "^2.3.
|
|
44
|
+
"@git.zone/tstest": "^2.3.6",
|
|
45
45
|
"@push.rocks/smartdelay": "^3.0.5",
|
|
46
|
-
"@push.rocks/smartfile": "^11.2.
|
|
46
|
+
"@push.rocks/smartfile": "^11.2.7",
|
|
47
47
|
"@push.rocks/smartinteract": "^2.0.16",
|
|
48
48
|
"@push.rocks/smartnetwork": "^4.1.2",
|
|
49
49
|
"@push.rocks/smartshell": "^3.3.0",
|
|
50
50
|
"@types/node": "^22.15.18"
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|
|
53
|
-
"@git.zone/tsdoc": "^1.5.
|
|
54
|
-
"@git.zone/tspublish": "^1.10.
|
|
53
|
+
"@git.zone/tsdoc": "^1.5.2",
|
|
54
|
+
"@git.zone/tspublish": "^1.10.3",
|
|
55
55
|
"@push.rocks/commitinfo": "^1.0.12",
|
|
56
56
|
"@push.rocks/early": "^4.0.4",
|
|
57
57
|
"@push.rocks/gulp-function": "^3.0.7",
|
|
@@ -64,15 +64,15 @@
|
|
|
64
64
|
"@push.rocks/smartgulp": "^3.0.4",
|
|
65
65
|
"@push.rocks/smartjson": "^5.0.20",
|
|
66
66
|
"@push.rocks/smartlegal": "^1.0.27",
|
|
67
|
-
"@push.rocks/smartlog": "^3.1.
|
|
67
|
+
"@push.rocks/smartlog": "^3.1.9",
|
|
68
68
|
"@push.rocks/smartlog-destination-local": "^9.0.2",
|
|
69
69
|
"@push.rocks/smartmustache": "^3.0.2",
|
|
70
|
-
"@push.rocks/smartnpm": "^2.0.
|
|
70
|
+
"@push.rocks/smartnpm": "^2.0.6",
|
|
71
71
|
"@push.rocks/smartobject": "^1.0.12",
|
|
72
72
|
"@push.rocks/smartopen": "^2.0.0",
|
|
73
73
|
"@push.rocks/smartpath": "^6.0.0",
|
|
74
74
|
"@push.rocks/smartpromise": "^4.2.3",
|
|
75
|
-
"@push.rocks/smartscaf": "^4.0.
|
|
75
|
+
"@push.rocks/smartscaf": "^4.0.19",
|
|
76
76
|
"@push.rocks/smartstream": "^3.2.5",
|
|
77
77
|
"@push.rocks/smartunique": "^3.0.9",
|
|
78
78
|
"@push.rocks/smartupdate": "^2.0.6",
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -3,6 +3,6 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@git.zone/cli',
|
|
6
|
-
version: '1.18.
|
|
6
|
+
version: '1.18.8',
|
|
7
7
|
description: 'A comprehensive CLI tool for enhancing and managing local development workflows with gitzone utilities, focusing on project setup, version control, code formatting, and template management.'
|
|
8
8
|
}
|
package/ts/mod_commit/index.ts
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
import * as plugins from './mod.plugins.js';
|
|
4
4
|
import * as paths from '../paths.js';
|
|
5
5
|
import { logger } from '../gitzone.logging.js';
|
|
6
|
+
import * as helpers from './mod.helpers.js';
|
|
6
7
|
|
|
7
8
|
export const run = async (argvArg: any) => {
|
|
8
9
|
if (argvArg.format) {
|
|
@@ -113,12 +114,18 @@ export const run = async (argvArg: any) => {
|
|
|
113
114
|
logger.log('info', `Staging files for commit:`);
|
|
114
115
|
await smartshellInstance.exec(`git add -A`);
|
|
115
116
|
await smartshellInstance.exec(`git commit -m "${commitString}"`);
|
|
116
|
-
|
|
117
|
+
|
|
118
|
+
// Detect project type and bump version accordingly
|
|
119
|
+
const projectType = await helpers.detectProjectType();
|
|
120
|
+
await helpers.bumpProjectVersion(projectType, commitVersionType);
|
|
121
|
+
|
|
117
122
|
if (
|
|
118
123
|
answerBucket.getAnswerFor('pushToOrigin') &&
|
|
119
124
|
!(process.env.CI === 'true')
|
|
120
125
|
) {
|
|
121
|
-
|
|
126
|
+
// Detect current branch instead of hardcoding "master"
|
|
127
|
+
const currentBranch = await helpers.detectCurrentBranch();
|
|
128
|
+
await smartshellInstance.exec(`git push origin ${currentBranch} --follow-tags`);
|
|
122
129
|
}
|
|
123
130
|
};
|
|
124
131
|
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import * as plugins from './mod.plugins.js';
|
|
2
|
+
import * as paths from '../paths.js';
|
|
3
|
+
import { logger } from '../gitzone.logging.js';
|
|
4
|
+
|
|
5
|
+
export type ProjectType = 'npm' | 'deno' | 'both' | 'none';
|
|
6
|
+
export type VersionType = 'patch' | 'minor' | 'major';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Detects the current git branch
|
|
10
|
+
* @returns The current branch name, defaults to 'master' if detection fails
|
|
11
|
+
*/
|
|
12
|
+
export async function detectCurrentBranch(): Promise<string> {
|
|
13
|
+
try {
|
|
14
|
+
const smartshellInstance = new plugins.smartshell.Smartshell({
|
|
15
|
+
executor: 'bash',
|
|
16
|
+
sourceFilePaths: [],
|
|
17
|
+
});
|
|
18
|
+
const result = await smartshellInstance.exec('git branch --show-current');
|
|
19
|
+
const branchName = result.stdout.trim();
|
|
20
|
+
|
|
21
|
+
if (!branchName) {
|
|
22
|
+
logger.log('warn', 'Could not detect current branch, falling back to "master"');
|
|
23
|
+
return 'master';
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
logger.log('info', `Detected current branch: ${branchName}`);
|
|
27
|
+
return branchName;
|
|
28
|
+
} catch (error) {
|
|
29
|
+
logger.log('warn', `Failed to detect branch: ${error.message}, falling back to "master"`);
|
|
30
|
+
return 'master';
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Detects the project type based on presence of package.json and/or deno.json
|
|
36
|
+
* @returns The project type
|
|
37
|
+
*/
|
|
38
|
+
export async function detectProjectType(): Promise<ProjectType> {
|
|
39
|
+
const packageJsonPath = plugins.path.join(paths.cwd, 'package.json');
|
|
40
|
+
const denoJsonPath = plugins.path.join(paths.cwd, 'deno.json');
|
|
41
|
+
|
|
42
|
+
const hasPackageJson = await plugins.smartfile.fs.fileExists(packageJsonPath);
|
|
43
|
+
const hasDenoJson = await plugins.smartfile.fs.fileExists(denoJsonPath);
|
|
44
|
+
|
|
45
|
+
if (hasPackageJson && hasDenoJson) {
|
|
46
|
+
logger.log('info', 'Detected dual project (npm + deno)');
|
|
47
|
+
return 'both';
|
|
48
|
+
} else if (hasPackageJson) {
|
|
49
|
+
logger.log('info', 'Detected npm project');
|
|
50
|
+
return 'npm';
|
|
51
|
+
} else if (hasDenoJson) {
|
|
52
|
+
logger.log('info', 'Detected deno project');
|
|
53
|
+
return 'deno';
|
|
54
|
+
} else {
|
|
55
|
+
throw new Error('No package.json or deno.json found in current directory');
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Parses a semantic version string and bumps it according to the version type
|
|
61
|
+
* @param currentVersion Current version string (e.g., "1.2.3")
|
|
62
|
+
* @param versionType Type of version bump
|
|
63
|
+
* @returns New version string
|
|
64
|
+
*/
|
|
65
|
+
function calculateNewVersion(currentVersion: string, versionType: VersionType): string {
|
|
66
|
+
const versionMatch = currentVersion.match(/^(\d+)\.(\d+)\.(\d+)/);
|
|
67
|
+
|
|
68
|
+
if (!versionMatch) {
|
|
69
|
+
throw new Error(`Invalid version format: ${currentVersion}`);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
let [, major, minor, patch] = versionMatch.map(Number);
|
|
73
|
+
|
|
74
|
+
switch (versionType) {
|
|
75
|
+
case 'major':
|
|
76
|
+
major += 1;
|
|
77
|
+
minor = 0;
|
|
78
|
+
patch = 0;
|
|
79
|
+
break;
|
|
80
|
+
case 'minor':
|
|
81
|
+
minor += 1;
|
|
82
|
+
patch = 0;
|
|
83
|
+
break;
|
|
84
|
+
case 'patch':
|
|
85
|
+
patch += 1;
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return `${major}.${minor}.${patch}`;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Bumps the version in deno.json
|
|
94
|
+
* @param versionType Type of version bump
|
|
95
|
+
* @returns The new version string
|
|
96
|
+
*/
|
|
97
|
+
export async function bumpDenoVersion(versionType: VersionType): Promise<string> {
|
|
98
|
+
const denoJsonPath = plugins.path.join(paths.cwd, 'deno.json');
|
|
99
|
+
|
|
100
|
+
try {
|
|
101
|
+
// Read deno.json
|
|
102
|
+
const denoConfig = plugins.smartfile.fs.toObjectSync(
|
|
103
|
+
denoJsonPath
|
|
104
|
+
) as { version?: string };
|
|
105
|
+
|
|
106
|
+
if (!denoConfig.version) {
|
|
107
|
+
throw new Error('deno.json does not contain a version field');
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const currentVersion = denoConfig.version;
|
|
111
|
+
const newVersion = calculateNewVersion(currentVersion, versionType);
|
|
112
|
+
|
|
113
|
+
logger.log('info', `Bumping deno.json version: ${currentVersion} → ${newVersion}`);
|
|
114
|
+
|
|
115
|
+
// Update version
|
|
116
|
+
denoConfig.version = newVersion;
|
|
117
|
+
|
|
118
|
+
// Write back to disk
|
|
119
|
+
await plugins.smartfile.memory.toFs(
|
|
120
|
+
JSON.stringify(denoConfig, null, 2) + '\n',
|
|
121
|
+
denoJsonPath
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
return newVersion;
|
|
125
|
+
} catch (error) {
|
|
126
|
+
throw new Error(`Failed to bump deno.json version: ${error.message}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Bumps the version in package.json using npm version command
|
|
132
|
+
* @param versionType Type of version bump
|
|
133
|
+
* @returns The new version string
|
|
134
|
+
*/
|
|
135
|
+
async function bumpNpmVersion(versionType: VersionType): Promise<string> {
|
|
136
|
+
const smartshellInstance = new plugins.smartshell.Smartshell({
|
|
137
|
+
executor: 'bash',
|
|
138
|
+
sourceFilePaths: [],
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
logger.log('info', `Bumping package.json version using npm version ${versionType}`);
|
|
142
|
+
const result = await smartshellInstance.exec(`npm version ${versionType}`);
|
|
143
|
+
|
|
144
|
+
// npm version returns the new version with a 'v' prefix, e.g., "v1.2.3"
|
|
145
|
+
const newVersion = result.stdout.trim().replace(/^v/, '');
|
|
146
|
+
return newVersion;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Syncs the version from package.json to deno.json
|
|
151
|
+
* @param version The version to sync
|
|
152
|
+
*/
|
|
153
|
+
async function syncVersionToDenoJson(version: string): Promise<void> {
|
|
154
|
+
const denoJsonPath = plugins.path.join(paths.cwd, 'deno.json');
|
|
155
|
+
|
|
156
|
+
try {
|
|
157
|
+
const denoConfig = plugins.smartfile.fs.toObjectSync(
|
|
158
|
+
denoJsonPath
|
|
159
|
+
) as { version?: string };
|
|
160
|
+
|
|
161
|
+
logger.log('info', `Syncing version to deno.json: ${version}`);
|
|
162
|
+
denoConfig.version = version;
|
|
163
|
+
|
|
164
|
+
await plugins.smartfile.memory.toFs(
|
|
165
|
+
JSON.stringify(denoConfig, null, 2) + '\n',
|
|
166
|
+
denoJsonPath
|
|
167
|
+
);
|
|
168
|
+
} catch (error) {
|
|
169
|
+
throw new Error(`Failed to sync version to deno.json: ${error.message}`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Bumps the project version based on project type
|
|
175
|
+
* @param projectType The detected project type
|
|
176
|
+
* @param versionType The type of version bump
|
|
177
|
+
* @returns The new version string
|
|
178
|
+
*/
|
|
179
|
+
export async function bumpProjectVersion(
|
|
180
|
+
projectType: ProjectType,
|
|
181
|
+
versionType: VersionType
|
|
182
|
+
): Promise<string> {
|
|
183
|
+
switch (projectType) {
|
|
184
|
+
case 'npm':
|
|
185
|
+
return await bumpNpmVersion(versionType);
|
|
186
|
+
|
|
187
|
+
case 'deno':
|
|
188
|
+
return await bumpDenoVersion(versionType);
|
|
189
|
+
|
|
190
|
+
case 'both': {
|
|
191
|
+
// Bump npm version first (it handles git tags)
|
|
192
|
+
const newVersion = await bumpNpmVersion(versionType);
|
|
193
|
+
// Then sync to deno.json
|
|
194
|
+
await syncVersionToDenoJson(newVersion);
|
|
195
|
+
return newVersion;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
case 'none':
|
|
199
|
+
throw new Error('Cannot bump version: no package.json or deno.json found');
|
|
200
|
+
|
|
201
|
+
default:
|
|
202
|
+
throw new Error(`Unknown project type: ${projectType}`);
|
|
203
|
+
}
|
|
204
|
+
}
|