@mexty/cli 1.2.0 → 1.3.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/dist/commands/create.d.ts +9 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +118 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/delete.d.ts +2 -0
- package/dist/commands/delete.d.ts.map +1 -0
- package/dist/commands/delete.js +59 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/fork.d.ts +2 -0
- package/dist/commands/fork.d.ts.map +1 -0
- package/dist/commands/fork.js +57 -0
- package/dist/commands/fork.js.map +1 -0
- package/dist/commands/login.d.ts +2 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +90 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/publish.d.ts +2 -0
- package/dist/commands/publish.d.ts.map +1 -0
- package/dist/commands/publish.js +144 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/save.d.ts +2 -0
- package/dist/commands/save.d.ts.map +1 -0
- package/dist/commands/save.js +162 -0
- package/dist/commands/save.js.map +1 -0
- package/dist/commands/sync.d.ts +2 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +250 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +85 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/api.d.ts +81 -0
- package/dist/utils/api.d.ts.map +1 -0
- package/dist/utils/api.js +161 -0
- package/dist/utils/api.js.map +1 -0
- package/dist/utils/auth.d.ts +4 -0
- package/dist/utils/auth.d.ts.map +1 -0
- package/dist/utils/auth.js +27 -0
- package/dist/utils/auth.js.map +1 -0
- package/dist/utils/git.d.ts +42 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +171 -0
- package/dist/utils/git.js.map +1 -0
- package/package.json +1 -1
@@ -0,0 +1,161 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
exports.apiClient = void 0;
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
8
|
+
const chalk_1 = __importDefault(require("chalk"));
|
9
|
+
const fs_1 = __importDefault(require("fs"));
|
10
|
+
const path_1 = __importDefault(require("path"));
|
11
|
+
const os_1 = __importDefault(require("os"));
|
12
|
+
class ApiClient {
|
13
|
+
constructor(baseUrl = "https://api.mexty.ai") {
|
14
|
+
this.baseUrl = baseUrl;
|
15
|
+
this.tokenPath = path_1.default.join(os_1.default.homedir(), ".mext", "auth.json");
|
16
|
+
this.client = axios_1.default.create({
|
17
|
+
baseURL: baseUrl,
|
18
|
+
timeout: 30000,
|
19
|
+
headers: {
|
20
|
+
"Content-Type": "application/json",
|
21
|
+
},
|
22
|
+
});
|
23
|
+
// Add request interceptor to include auth token
|
24
|
+
this.client.interceptors.request.use((config) => {
|
25
|
+
const token = this.getStoredToken();
|
26
|
+
if (token) {
|
27
|
+
config.headers.Authorization = `Bearer ${token}`;
|
28
|
+
}
|
29
|
+
return config;
|
30
|
+
}, (error) => Promise.reject(error));
|
31
|
+
// Add response interceptor for error handling
|
32
|
+
this.client.interceptors.response.use((response) => response, (error) => {
|
33
|
+
if (error.response?.status === 401) {
|
34
|
+
console.error(chalk_1.default.red("Authentication required. Please login first: mexty login"));
|
35
|
+
this.clearStoredToken();
|
36
|
+
}
|
37
|
+
else if (error.response) {
|
38
|
+
console.error(chalk_1.default.red(`API Error ${error.response.status}: ${error.response.data?.error || error.message}`));
|
39
|
+
}
|
40
|
+
else if (error.request) {
|
41
|
+
console.error(chalk_1.default.red("Network Error: Could not reach MEXT server"));
|
42
|
+
console.error(chalk_1.default.yellow(`Make sure the server is running at ${this.baseUrl}`));
|
43
|
+
}
|
44
|
+
else {
|
45
|
+
console.error(chalk_1.default.red(`Request Error: ${error.message}`));
|
46
|
+
}
|
47
|
+
throw error;
|
48
|
+
});
|
49
|
+
}
|
50
|
+
getStoredToken() {
|
51
|
+
try {
|
52
|
+
if (fs_1.default.existsSync(this.tokenPath)) {
|
53
|
+
const authData = JSON.parse(fs_1.default.readFileSync(this.tokenPath, "utf8"));
|
54
|
+
return authData.token || null;
|
55
|
+
}
|
56
|
+
}
|
57
|
+
catch (error) {
|
58
|
+
// Ignore errors reading token file
|
59
|
+
}
|
60
|
+
return null;
|
61
|
+
}
|
62
|
+
storeToken(token, user) {
|
63
|
+
try {
|
64
|
+
const authDir = path_1.default.dirname(this.tokenPath);
|
65
|
+
if (!fs_1.default.existsSync(authDir)) {
|
66
|
+
fs_1.default.mkdirSync(authDir, { recursive: true });
|
67
|
+
}
|
68
|
+
const authData = {
|
69
|
+
token,
|
70
|
+
user,
|
71
|
+
timestamp: new Date().toISOString(),
|
72
|
+
};
|
73
|
+
fs_1.default.writeFileSync(this.tokenPath, JSON.stringify(authData, null, 2));
|
74
|
+
}
|
75
|
+
catch (error) {
|
76
|
+
console.warn(chalk_1.default.yellow(`Warning: Could not store auth token: ${error.message}`));
|
77
|
+
}
|
78
|
+
}
|
79
|
+
clearStoredToken() {
|
80
|
+
try {
|
81
|
+
if (fs_1.default.existsSync(this.tokenPath)) {
|
82
|
+
fs_1.default.unlinkSync(this.tokenPath);
|
83
|
+
}
|
84
|
+
}
|
85
|
+
catch (error) {
|
86
|
+
// Ignore errors clearing token file
|
87
|
+
}
|
88
|
+
}
|
89
|
+
isAuthenticated() {
|
90
|
+
return this.getStoredToken() !== null;
|
91
|
+
}
|
92
|
+
getStoredUser() {
|
93
|
+
try {
|
94
|
+
if (fs_1.default.existsSync(this.tokenPath)) {
|
95
|
+
const authData = JSON.parse(fs_1.default.readFileSync(this.tokenPath, "utf8"));
|
96
|
+
return authData.user || null;
|
97
|
+
}
|
98
|
+
}
|
99
|
+
catch (error) {
|
100
|
+
// Ignore errors reading user data
|
101
|
+
}
|
102
|
+
return null;
|
103
|
+
}
|
104
|
+
async createBlock(data) {
|
105
|
+
const response = await this.client.post("/api/blocks", data);
|
106
|
+
return response.data;
|
107
|
+
}
|
108
|
+
async forkBlock(data) {
|
109
|
+
const response = await this.client.post("/api/blocks/fork", data);
|
110
|
+
return response.data;
|
111
|
+
}
|
112
|
+
async deleteBlock(blockId) {
|
113
|
+
await this.client.delete(`/api/blocks/${blockId}`);
|
114
|
+
}
|
115
|
+
async getBlock(blockId) {
|
116
|
+
const response = await this.client.get(`/api/blocks/${blockId}`);
|
117
|
+
return response.data;
|
118
|
+
}
|
119
|
+
async saveAndBundle(data) {
|
120
|
+
const response = await this.client.post("/api/blocks/save-and-bundle", data);
|
121
|
+
return response.data;
|
122
|
+
}
|
123
|
+
async healthCheck() {
|
124
|
+
try {
|
125
|
+
await this.client.get("/api/health");
|
126
|
+
return true;
|
127
|
+
}
|
128
|
+
catch (error) {
|
129
|
+
return false;
|
130
|
+
}
|
131
|
+
}
|
132
|
+
async requestOTP(email) {
|
133
|
+
const response = await this.client.post("/api/auth/request-otp", { email });
|
134
|
+
return response.data;
|
135
|
+
}
|
136
|
+
async verifyOTP(email, otp) {
|
137
|
+
const response = await this.client.post("/api/auth/verify-otp", { email, otp });
|
138
|
+
const data = response.data;
|
139
|
+
if (data.success && data.token && data.user) {
|
140
|
+
this.storeToken(data.token, data.user);
|
141
|
+
}
|
142
|
+
return data;
|
143
|
+
}
|
144
|
+
async logout() {
|
145
|
+
try {
|
146
|
+
await this.client.post("/api/auth/logout");
|
147
|
+
}
|
148
|
+
catch (error) {
|
149
|
+
// Ignore logout errors
|
150
|
+
}
|
151
|
+
finally {
|
152
|
+
this.clearStoredToken();
|
153
|
+
}
|
154
|
+
}
|
155
|
+
setBaseUrl(url) {
|
156
|
+
this.baseUrl = url;
|
157
|
+
this.client.defaults.baseURL = url;
|
158
|
+
}
|
159
|
+
}
|
160
|
+
exports.apiClient = new ApiClient();
|
161
|
+
//# sourceMappingURL=api.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/utils/api.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/utils/auth.ts"],"names":[],"mappings":"AAGA,wBAAgB,mBAAmB,IAAI,OAAO,CAO7C;AAED,wBAAgB,oBAAoB,IAAI,GAAG,CAE1C;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAI5C"}
|
@@ -0,0 +1,27 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
exports.checkAuthentication = checkAuthentication;
|
7
|
+
exports.getAuthenticatedUser = getAuthenticatedUser;
|
8
|
+
exports.requireAuthentication = requireAuthentication;
|
9
|
+
const chalk_1 = __importDefault(require("chalk"));
|
10
|
+
const api_1 = require("./api");
|
11
|
+
function checkAuthentication() {
|
12
|
+
if (!api_1.apiClient.isAuthenticated()) {
|
13
|
+
console.error(chalk_1.default.red('❌ Authentication required'));
|
14
|
+
console.log(chalk_1.default.yellow(' Please login first: mexty login'));
|
15
|
+
return false;
|
16
|
+
}
|
17
|
+
return true;
|
18
|
+
}
|
19
|
+
function getAuthenticatedUser() {
|
20
|
+
return api_1.apiClient.getStoredUser();
|
21
|
+
}
|
22
|
+
function requireAuthentication() {
|
23
|
+
if (!checkAuthentication()) {
|
24
|
+
process.exit(1);
|
25
|
+
}
|
26
|
+
}
|
27
|
+
//# sourceMappingURL=auth.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/utils/auth.ts"],"names":[],"mappings":";;;;;AAGA,kDAOC;AAED,oDAEC;AAED,sDAIC;AApBD,kDAA0B;AAC1B,+BAAkC;AAElC,SAAgB,mBAAmB;IACjC,IAAI,CAAC,eAAS,CAAC,eAAe,EAAE,EAAE,CAAC;QACjC,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,oCAAoC,CAAC,CAAC,CAAC;QAChE,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,oBAAoB;IAClC,OAAO,eAAS,CAAC,aAAa,EAAE,CAAC;AACnC,CAAC;AAED,SAAgB,qBAAqB;IACnC,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
@@ -0,0 +1,42 @@
|
|
1
|
+
import { SimpleGit } from "simple-git";
|
2
|
+
export declare class GitManager {
|
3
|
+
git: SimpleGit;
|
4
|
+
constructor(cwd?: string);
|
5
|
+
/**
|
6
|
+
* Clone a repository to a local directory
|
7
|
+
*/
|
8
|
+
cloneRepository(repoUrl: string, targetDir: string): Promise<void>;
|
9
|
+
/**
|
10
|
+
* Check if current directory is a Git repository
|
11
|
+
*/
|
12
|
+
isGitRepository(dir?: string): Promise<boolean>;
|
13
|
+
/**
|
14
|
+
* Get the current repository's remote URL
|
15
|
+
*/
|
16
|
+
getRemoteUrl(dir?: string): Promise<string | null>;
|
17
|
+
/**
|
18
|
+
* Check if there are uncommitted changes
|
19
|
+
*/
|
20
|
+
hasUncommittedChanges(dir?: string): Promise<boolean>;
|
21
|
+
/**
|
22
|
+
* Push current branch to remote
|
23
|
+
*/
|
24
|
+
pushToRemote(dir?: string): Promise<void>;
|
25
|
+
/**
|
26
|
+
* Get repository information
|
27
|
+
*/
|
28
|
+
getRepositoryInfo(dir?: string): Promise<{
|
29
|
+
branch: string;
|
30
|
+
remoteUrl: string | null;
|
31
|
+
hasChanges: boolean;
|
32
|
+
}>;
|
33
|
+
/**
|
34
|
+
* Extract repository name from URL
|
35
|
+
*/
|
36
|
+
static extractRepoName(gitUrl: string): string;
|
37
|
+
/**
|
38
|
+
* Validate Git URL format
|
39
|
+
*/
|
40
|
+
static isValidGitUrl(url: string): boolean;
|
41
|
+
}
|
42
|
+
//# sourceMappingURL=git.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAAA,OAAkB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAkDlD,qBAAa,UAAU;IACd,GAAG,EAAE,SAAS,CAAC;gBAEV,GAAG,CAAC,EAAE,MAAM;IAIxB;;OAEG;IACG,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBxE;;OAEG;IACG,eAAe,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUrD;;OAEG;IACG,YAAY,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAWxD;;OAEG;IACG,qBAAqB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU3D;;OAEG;IACG,YAAY,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB/C;;OAEG;IACG,iBAAiB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAC7C,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IAaF;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAY9C;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;CAU3C"}
|
@@ -0,0 +1,171 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
exports.GitManager = void 0;
|
7
|
+
const simple_git_1 = __importDefault(require("simple-git"));
|
8
|
+
const fs_1 = __importDefault(require("fs"));
|
9
|
+
const chalk_1 = __importDefault(require("chalk"));
|
10
|
+
// Simple spinner implementation since ora v5 has import issues
|
11
|
+
class SimpleSpinner {
|
12
|
+
constructor(message) {
|
13
|
+
this.interval = null;
|
14
|
+
this.frames = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
|
15
|
+
this.currentFrame = 0;
|
16
|
+
this.message = message;
|
17
|
+
}
|
18
|
+
start() {
|
19
|
+
process.stdout.write(this.message);
|
20
|
+
this.interval = setInterval(() => {
|
21
|
+
process.stdout.write(`\r${this.frames[this.currentFrame]} ${this.message}`);
|
22
|
+
this.currentFrame = (this.currentFrame + 1) % this.frames.length;
|
23
|
+
}, 80);
|
24
|
+
return this;
|
25
|
+
}
|
26
|
+
succeed(message) {
|
27
|
+
this.stop();
|
28
|
+
console.log(`\r✅ ${message}`);
|
29
|
+
}
|
30
|
+
fail(message) {
|
31
|
+
this.stop();
|
32
|
+
console.log(`\r❌ ${message}`);
|
33
|
+
}
|
34
|
+
stop() {
|
35
|
+
if (this.interval) {
|
36
|
+
clearInterval(this.interval);
|
37
|
+
this.interval = null;
|
38
|
+
}
|
39
|
+
process.stdout.write("\r");
|
40
|
+
}
|
41
|
+
}
|
42
|
+
function ora(message) {
|
43
|
+
return new SimpleSpinner(message);
|
44
|
+
}
|
45
|
+
class GitManager {
|
46
|
+
constructor(cwd) {
|
47
|
+
this.git = (0, simple_git_1.default)(cwd);
|
48
|
+
}
|
49
|
+
/**
|
50
|
+
* Clone a repository to a local directory
|
51
|
+
*/
|
52
|
+
async cloneRepository(repoUrl, targetDir) {
|
53
|
+
const spinner = ora(`Cloning repository from ${repoUrl}...`).start();
|
54
|
+
try {
|
55
|
+
// Ensure target directory doesn't exist
|
56
|
+
if (fs_1.default.existsSync(targetDir)) {
|
57
|
+
spinner.fail(chalk_1.default.red(`Directory ${targetDir} already exists`));
|
58
|
+
throw new Error(`Directory ${targetDir} already exists`);
|
59
|
+
}
|
60
|
+
// Clone the repository
|
61
|
+
await this.git.clone(repoUrl, targetDir);
|
62
|
+
spinner.succeed(chalk_1.default.green(`Repository cloned to ${targetDir}`));
|
63
|
+
}
|
64
|
+
catch (error) {
|
65
|
+
spinner.fail(chalk_1.default.red(`Failed to clone repository: ${error.message}`));
|
66
|
+
throw error;
|
67
|
+
}
|
68
|
+
}
|
69
|
+
/**
|
70
|
+
* Check if current directory is a Git repository
|
71
|
+
*/
|
72
|
+
async isGitRepository(dir) {
|
73
|
+
try {
|
74
|
+
const git = dir ? (0, simple_git_1.default)(dir) : this.git;
|
75
|
+
await git.status();
|
76
|
+
return true;
|
77
|
+
}
|
78
|
+
catch (error) {
|
79
|
+
return false;
|
80
|
+
}
|
81
|
+
}
|
82
|
+
/**
|
83
|
+
* Get the current repository's remote URL
|
84
|
+
*/
|
85
|
+
async getRemoteUrl(dir) {
|
86
|
+
try {
|
87
|
+
const git = dir ? (0, simple_git_1.default)(dir) : this.git;
|
88
|
+
const remotes = await git.getRemotes(true);
|
89
|
+
const origin = remotes.find((remote) => remote.name === "origin");
|
90
|
+
return origin?.refs?.fetch || null;
|
91
|
+
}
|
92
|
+
catch (error) {
|
93
|
+
return null;
|
94
|
+
}
|
95
|
+
}
|
96
|
+
/**
|
97
|
+
* Check if there are uncommitted changes
|
98
|
+
*/
|
99
|
+
async hasUncommittedChanges(dir) {
|
100
|
+
try {
|
101
|
+
const git = dir ? (0, simple_git_1.default)(dir) : this.git;
|
102
|
+
const status = await git.status();
|
103
|
+
return !status.isClean();
|
104
|
+
}
|
105
|
+
catch (error) {
|
106
|
+
return false;
|
107
|
+
}
|
108
|
+
}
|
109
|
+
/**
|
110
|
+
* Push current branch to remote
|
111
|
+
*/
|
112
|
+
async pushToRemote(dir) {
|
113
|
+
const spinner = ora("Pushing changes to remote repository...").start();
|
114
|
+
try {
|
115
|
+
const git = dir ? (0, simple_git_1.default)(dir) : this.git;
|
116
|
+
// Get current branch
|
117
|
+
const status = await git.status();
|
118
|
+
const currentBranch = status.current;
|
119
|
+
if (!currentBranch) {
|
120
|
+
throw new Error("No current branch found");
|
121
|
+
}
|
122
|
+
// Push to remote
|
123
|
+
await git.push("origin", currentBranch);
|
124
|
+
spinner.succeed(chalk_1.default.green("Changes pushed to remote repository"));
|
125
|
+
}
|
126
|
+
catch (error) {
|
127
|
+
spinner.fail(chalk_1.default.red(`Failed to push changes: ${error.message}`));
|
128
|
+
throw error;
|
129
|
+
}
|
130
|
+
}
|
131
|
+
/**
|
132
|
+
* Get repository information
|
133
|
+
*/
|
134
|
+
async getRepositoryInfo(dir) {
|
135
|
+
const git = dir ? (0, simple_git_1.default)(dir) : this.git;
|
136
|
+
const status = await git.status();
|
137
|
+
const remoteUrl = await this.getRemoteUrl(dir);
|
138
|
+
return {
|
139
|
+
branch: status.current || "unknown",
|
140
|
+
remoteUrl,
|
141
|
+
hasChanges: !status.isClean(),
|
142
|
+
};
|
143
|
+
}
|
144
|
+
/**
|
145
|
+
* Extract repository name from URL
|
146
|
+
*/
|
147
|
+
static extractRepoName(gitUrl) {
|
148
|
+
// Handle both SSH and HTTPS URLs
|
149
|
+
const match = gitUrl.match(/\/([^\/]+?)(?:\.git)?$/);
|
150
|
+
if (match) {
|
151
|
+
return match[1];
|
152
|
+
}
|
153
|
+
// Fallback: use the last part of the URL
|
154
|
+
const parts = gitUrl.split("/");
|
155
|
+
return parts[parts.length - 1].replace(".git", "");
|
156
|
+
}
|
157
|
+
/**
|
158
|
+
* Validate Git URL format
|
159
|
+
*/
|
160
|
+
static isValidGitUrl(url) {
|
161
|
+
const patterns = [
|
162
|
+
/^https:\/\/github\.com\/[\w\-\.]+\/[\w\-\.]+(?:\.git)?$/,
|
163
|
+
/^git@github\.com:[\w\-\.]+\/[\w\-\.]+(?:\.git)?$/,
|
164
|
+
/^https:\/\/gitlab\.com\/[\w\-\.]+\/[\w\-\.]+(?:\.git)?$/,
|
165
|
+
/^git@gitlab\.com:[\w\-\.]+\/[\w\-\.]+(?:\.git)?$/,
|
166
|
+
];
|
167
|
+
return patterns.some((pattern) => pattern.test(url));
|
168
|
+
}
|
169
|
+
}
|
170
|
+
exports.GitManager = GitManager;
|
171
|
+
//# sourceMappingURL=git.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"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"}
|