simplemdg-dev-cli 2.0.4 → 2.4.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 +63 -354
- package/USER_GUIDE.md +55 -378
- package/dist/commands/cds.command.js +69 -60
- package/dist/commands/cds.command.js.map +1 -1
- package/dist/commands/cf-db.command.d.ts +2 -0
- package/dist/commands/cf-db.command.js +606 -0
- package/dist/commands/cf-db.command.js.map +1 -0
- package/dist/commands/cf.command.js +291 -280
- package/dist/commands/cf.command.js.map +1 -1
- package/dist/commands/gitlab.command.d.ts +2 -0
- package/dist/commands/gitlab.command.js +351 -0
- package/dist/commands/gitlab.command.js.map +1 -0
- package/dist/commands/npmrc.command.js +50 -44
- package/dist/commands/npmrc.command.js.map +1 -1
- package/dist/core/cache.d.ts +1 -1
- package/dist/core/cache.js +58 -31
- package/dist/core/cache.js.map +1 -1
- package/dist/core/cds.js +32 -22
- package/dist/core/cds.js.map +1 -1
- package/dist/core/cf-env-parser.d.ts +1 -1
- package/dist/core/cf-env-parser.js +4 -1
- package/dist/core/cf-env-parser.js.map +1 -1
- package/dist/core/cf.d.ts +1 -1
- package/dist/core/cf.js +46 -31
- package/dist/core/cf.js.map +1 -1
- package/dist/core/db/db-btp.d.ts +48 -0
- package/dist/core/db/db-btp.js +162 -0
- package/dist/core/db/db-btp.js.map +1 -0
- package/dist/core/db/db-cache.d.ts +35 -0
- package/dist/core/db/db-cache.js +164 -0
- package/dist/core/db/db-cache.js.map +1 -0
- package/dist/core/db/db-connection.d.ts +22 -0
- package/dist/core/db/db-connection.js +73 -0
- package/dist/core/db/db-connection.js.map +1 -0
- package/dist/core/db/db-crypto.d.ts +3 -0
- package/dist/core/db/db-crypto.js +54 -0
- package/dist/core/db/db-crypto.js.map +1 -0
- package/dist/core/db/db-hana-adapter.d.ts +32 -0
- package/dist/core/db/db-hana-adapter.js +243 -0
- package/dist/core/db/db-hana-adapter.js.map +1 -0
- package/dist/core/db/db-metadata.d.ts +25 -0
- package/dist/core/db/db-metadata.js +150 -0
- package/dist/core/db/db-metadata.js.map +1 -0
- package/dist/core/db/db-postgres-adapter.d.ts +30 -0
- package/dist/core/db/db-postgres-adapter.js +245 -0
- package/dist/core/db/db-postgres-adapter.js.map +1 -0
- package/dist/core/db/db-query-files.d.ts +20 -0
- package/dist/core/db/db-query-files.js +106 -0
- package/dist/core/db/db-query-files.js.map +1 -0
- package/dist/core/db/db-query-history.d.ts +5 -0
- package/dist/core/db/db-query-history.js +49 -0
- package/dist/core/db/db-query-history.js.map +1 -0
- package/dist/core/db/db-row.d.ts +22 -0
- package/dist/core/db/db-row.js +70 -0
- package/dist/core/db/db-row.js.map +1 -0
- package/dist/core/db/db-studio-html.d.ts +4 -0
- package/dist/core/db/db-studio-html.js +437 -0
- package/dist/core/db/db-studio-html.js.map +1 -0
- package/dist/core/db/db-studio-server.d.ts +11 -0
- package/dist/core/db/db-studio-server.js +465 -0
- package/dist/core/db/db-studio-server.js.map +1 -0
- package/dist/core/db/db-types.d.ts +174 -0
- package/dist/core/db/db-types.js +3 -0
- package/dist/core/db/db-types.js.map +1 -0
- package/dist/core/db/db-vcap-parser.d.ts +7 -0
- package/dist/core/db/db-vcap-parser.js +137 -0
- package/dist/core/db/db-vcap-parser.js.map +1 -0
- package/dist/core/doctor.d.ts +1 -1
- package/dist/core/doctor.js +14 -8
- package/dist/core/doctor.js.map +1 -1
- package/dist/core/guide.js +31 -26
- package/dist/core/guide.js.map +1 -1
- package/dist/core/install.d.ts +1 -1
- package/dist/core/install.js +17 -11
- package/dist/core/install.js.map +1 -1
- package/dist/core/navigator.d.ts +17 -0
- package/dist/core/navigator.js +140 -0
- package/dist/core/navigator.js.map +1 -0
- package/dist/core/npmrc.js +29 -16
- package/dist/core/npmrc.js.map +1 -1
- package/dist/core/process.js +11 -6
- package/dist/core/process.js.map +1 -1
- package/dist/core/prompts.js +16 -8
- package/dist/core/prompts.js.map +1 -1
- package/dist/core/repository.d.ts +1 -1
- package/dist/core/repository.js +16 -9
- package/dist/core/repository.js.map +1 -1
- package/dist/core/scanner.d.ts +1 -1
- package/dist/core/scanner.js +13 -7
- package/dist/core/scanner.js.map +1 -1
- package/dist/core/tooling.d.ts +28 -0
- package/dist/core/tooling.js +168 -0
- package/dist/core/tooling.js.map +1 -0
- package/dist/core/types.js +2 -1
- package/dist/core/version-conflict.d.ts +2 -2
- package/dist/core/version-conflict.js +11 -6
- package/dist/core/version-conflict.js.map +1 -1
- package/dist/index.js +65 -48
- package/dist/index.js.map +1 -1
- package/dist/types-local.js +2 -1
- package/package.json +12 -6
- package/src/commands/cds.command.ts +529 -0
- package/src/commands/cf-db.command.ts +636 -0
- package/src/commands/cf.command.ts +3345 -0
- package/src/commands/gitlab.command.ts +373 -0
- package/src/commands/npmrc.command.ts +581 -0
- package/src/core/cache.ts +332 -0
- package/src/core/cds.ts +278 -0
- package/src/core/cf-env-parser.ts +131 -0
- package/src/core/cf.ts +271 -0
- package/src/core/db/db-btp.ts +207 -0
- package/src/core/db/db-cache.ts +215 -0
- package/src/core/db/db-connection.ts +79 -0
- package/src/core/db/db-crypto.ts +53 -0
- package/src/core/db/db-hana-adapter.ts +294 -0
- package/src/core/db/db-metadata.ts +174 -0
- package/src/core/db/db-postgres-adapter.ts +275 -0
- package/src/core/db/db-query-files.ts +130 -0
- package/src/core/db/db-query-history.ts +53 -0
- package/src/core/db/db-row.ts +93 -0
- package/src/core/db/db-studio-html.ts +439 -0
- package/src/core/db/db-studio-server.ts +559 -0
- package/src/core/db/db-types.ts +195 -0
- package/src/core/db/db-vcap-parser.ts +182 -0
- package/src/core/doctor.ts +70 -0
- package/src/core/guide.ts +261 -0
- package/src/core/install.ts +91 -0
- package/src/core/navigator.ts +164 -0
- package/src/core/npmrc.ts +171 -0
- package/src/core/process.ts +75 -0
- package/src/core/prompts.ts +225 -0
- package/src/core/repository.ts +36 -0
- package/src/core/scanner.ts +41 -0
- package/src/core/tooling.ts +207 -0
- package/src/core/types.ts +152 -0
- package/src/core/version-conflict.ts +46 -0
- package/src/index.ts +460 -0
- package/src/types/external.d.ts +3 -0
- package/src/types-local.ts +11 -0
- package/tsconfig.json +17 -0
|
@@ -0,0 +1,351 @@
|
|
|
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.registerGitLabCommands = registerGitLabCommands;
|
|
7
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
8
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
9
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
10
|
+
const node_crypto_1 = __importDefault(require("node:crypto"));
|
|
11
|
+
const execa_1 = require("execa");
|
|
12
|
+
const prompts_1 = __importDefault(require("prompts"));
|
|
13
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
14
|
+
const prompts_2 = require("../core/prompts");
|
|
15
|
+
const GITLAB_CACHE_DIR = node_path_1.default.join(node_os_1.default.homedir(), ".simplemdg");
|
|
16
|
+
const GITLAB_CACHE_FILE = node_path_1.default.join(GITLAB_CACHE_DIR, "gitlab.json");
|
|
17
|
+
function emptyGitLabCache() {
|
|
18
|
+
return { instances: [], groupsByBaseUrl: {}, projectsByGroup: {}, destinations: ["."] };
|
|
19
|
+
}
|
|
20
|
+
async function readGitLabCache() {
|
|
21
|
+
if (!(await fs_extra_1.default.pathExists(GITLAB_CACHE_FILE)))
|
|
22
|
+
return emptyGitLabCache();
|
|
23
|
+
const value = await fs_extra_1.default.readJson(GITLAB_CACHE_FILE).catch(() => emptyGitLabCache());
|
|
24
|
+
return {
|
|
25
|
+
instances: value.instances ?? [],
|
|
26
|
+
groupsByBaseUrl: value.groupsByBaseUrl ?? {},
|
|
27
|
+
projectsByGroup: value.projectsByGroup ?? {},
|
|
28
|
+
destinations: value.destinations?.length ? value.destinations : ["."],
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
async function writeGitLabCache(cache) {
|
|
32
|
+
await fs_extra_1.default.ensureDir(GITLAB_CACHE_DIR);
|
|
33
|
+
await fs_extra_1.default.writeJson(GITLAB_CACHE_FILE, cache, { spaces: 2 });
|
|
34
|
+
}
|
|
35
|
+
function normalizeBaseUrl(value) {
|
|
36
|
+
return value.trim().replace(/\/+$/, "");
|
|
37
|
+
}
|
|
38
|
+
function makeGroupCacheKey(baseUrl, groupId) {
|
|
39
|
+
return `${normalizeBaseUrl(baseUrl)}|${groupId}`;
|
|
40
|
+
}
|
|
41
|
+
async function openBrowser(url) {
|
|
42
|
+
const platform = process.platform;
|
|
43
|
+
const command = platform === "win32" ? "cmd" : platform === "darwin" ? "open" : "xdg-open";
|
|
44
|
+
const args = platform === "win32" ? ["/c", "start", "", url] : [url];
|
|
45
|
+
await (0, execa_1.execa)(command, args, { reject: false, detached: true, stdio: "ignore" });
|
|
46
|
+
}
|
|
47
|
+
async function readClipboard() {
|
|
48
|
+
if (process.platform !== "win32")
|
|
49
|
+
return undefined;
|
|
50
|
+
const result = await (0, execa_1.execa)("powershell", ["-NoProfile", "-Command", "Get-Clipboard"], { reject: false });
|
|
51
|
+
return result.exitCode === 0 ? result.stdout.trim() : undefined;
|
|
52
|
+
}
|
|
53
|
+
async function gitlabFetch(auth, apiPath, search) {
|
|
54
|
+
const url = new URL(`${normalizeBaseUrl(auth.baseUrl)}/api/v4${apiPath}`);
|
|
55
|
+
if (search) {
|
|
56
|
+
for (const [key, value] of search.entries())
|
|
57
|
+
url.searchParams.set(key, value);
|
|
58
|
+
}
|
|
59
|
+
const response = await fetch(url, { headers: { "PRIVATE-TOKEN": auth.token } });
|
|
60
|
+
if (!response.ok)
|
|
61
|
+
throw new Error(`GitLab API failed ${response.status}: ${await response.text()}`);
|
|
62
|
+
return await response.json();
|
|
63
|
+
}
|
|
64
|
+
async function gitlabFetchAll(auth, apiPath, search) {
|
|
65
|
+
const rows = [];
|
|
66
|
+
let page = 1;
|
|
67
|
+
while (true) {
|
|
68
|
+
const params = new URLSearchParams({ per_page: "100", page: String(page), ...(search ?? {}) });
|
|
69
|
+
const chunk = await gitlabFetch(auth, apiPath, params);
|
|
70
|
+
rows.push(...chunk);
|
|
71
|
+
if (chunk.length < 100)
|
|
72
|
+
break;
|
|
73
|
+
page += 1;
|
|
74
|
+
}
|
|
75
|
+
return rows;
|
|
76
|
+
}
|
|
77
|
+
async function validateToken(baseUrl, token) {
|
|
78
|
+
const auth = { baseUrl: normalizeBaseUrl(baseUrl), token, updatedAt: new Date().toISOString() };
|
|
79
|
+
const user = await gitlabFetch(auth, "/user");
|
|
80
|
+
let expiresAt;
|
|
81
|
+
try {
|
|
82
|
+
const self = await gitlabFetch(auth, "/personal_access_tokens/self");
|
|
83
|
+
expiresAt = self.expires_at;
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
expiresAt = undefined;
|
|
87
|
+
}
|
|
88
|
+
return { ...auth, username: user.username, name: user.name, expiresAt };
|
|
89
|
+
}
|
|
90
|
+
async function saveAuth(auth) {
|
|
91
|
+
const cache = await readGitLabCache();
|
|
92
|
+
const next = [auth, ...cache.instances.filter((item) => normalizeBaseUrl(item.baseUrl) !== normalizeBaseUrl(auth.baseUrl))];
|
|
93
|
+
cache.instances = next.slice(0, 20);
|
|
94
|
+
await writeGitLabCache(cache);
|
|
95
|
+
await approveGitCredential(auth).catch(() => undefined);
|
|
96
|
+
}
|
|
97
|
+
async function approveGitCredential(auth) {
|
|
98
|
+
const url = new URL(auth.baseUrl);
|
|
99
|
+
const input = [`protocol=${url.protocol.replace(":", "")}`, `host=${url.host}`, "username=oauth2", `password=${auth.token}`, "", ""].join("\n");
|
|
100
|
+
await (0, execa_1.execa)("git", ["credential", "approve"], { input, reject: false });
|
|
101
|
+
}
|
|
102
|
+
async function askAuth() {
|
|
103
|
+
const cache = await readGitLabCache();
|
|
104
|
+
if (cache.instances.length) {
|
|
105
|
+
const selected = await (0, prompts_2.searchableSelectChoice)({
|
|
106
|
+
message: "Select GitLab instance",
|
|
107
|
+
choices: [
|
|
108
|
+
...cache.instances.map((item, index) => ({ title: `${item.username ?? "user"} · ${item.baseUrl} · logged in`, value: String(index) })),
|
|
109
|
+
{ title: "Login to another GitLab instance", value: "new" },
|
|
110
|
+
],
|
|
111
|
+
allowCustomValue: false,
|
|
112
|
+
});
|
|
113
|
+
if (selected !== "new")
|
|
114
|
+
return cache.instances[Number(selected)];
|
|
115
|
+
}
|
|
116
|
+
return await runLoginFlow();
|
|
117
|
+
}
|
|
118
|
+
async function runLoginFlow() {
|
|
119
|
+
const baseResponse = await (0, prompts_1.default)({ type: "text", name: "baseUrl", message: "GitLab base URL", initial: "https://gitlab.simplemdg.com" });
|
|
120
|
+
const baseUrl = normalizeBaseUrl(baseResponse.baseUrl || "https://gitlab.simplemdg.com");
|
|
121
|
+
const mode = await (0, prompts_2.searchableSelectChoice)({
|
|
122
|
+
message: "GitLab login method",
|
|
123
|
+
choices: [
|
|
124
|
+
{ title: "Open token page and auto-detect from clipboard", value: "clipboard" },
|
|
125
|
+
{ title: "Paste token manually", value: "manual" },
|
|
126
|
+
],
|
|
127
|
+
allowCustomValue: false,
|
|
128
|
+
});
|
|
129
|
+
let token = "";
|
|
130
|
+
if (mode === "clipboard") {
|
|
131
|
+
const tokenUrl = `${baseUrl}/-/user_settings/personal_access_tokens?name=SimpleMDG%20CLI&scopes=api,read_repository,write_repository`;
|
|
132
|
+
console.log(chalk_1.default.gray(`Opening: ${tokenUrl}`));
|
|
133
|
+
await openBrowser(tokenUrl);
|
|
134
|
+
console.log(chalk_1.default.yellow("Create/copy the token in GitLab. The CLI will read clipboard, then fallback to manual input."));
|
|
135
|
+
for (let i = 0; i < 60; i += 1) {
|
|
136
|
+
const value = await readClipboard();
|
|
137
|
+
if (value && /^(glpat-|gloas-|glcbt-|[A-Za-z0-9_\-]{20,})/.test(value)) {
|
|
138
|
+
token = value;
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if (!token) {
|
|
145
|
+
const response = await (0, prompts_1.default)({ type: "password", name: "token", message: "GitLab token" });
|
|
146
|
+
token = String(response.token ?? "").trim();
|
|
147
|
+
}
|
|
148
|
+
if (!token)
|
|
149
|
+
throw new Error("GitLab token is required");
|
|
150
|
+
const auth = await validateToken(baseUrl, token);
|
|
151
|
+
await saveAuth(auth);
|
|
152
|
+
console.log(chalk_1.default.green(`Logged in: ${auth.username ?? auth.name ?? "GitLab user"} · ${auth.baseUrl}`));
|
|
153
|
+
return auth;
|
|
154
|
+
}
|
|
155
|
+
async function listRootGroups(auth, refresh) {
|
|
156
|
+
const cache = await readGitLabCache();
|
|
157
|
+
const cached = cache.groupsByBaseUrl[auth.baseUrl];
|
|
158
|
+
if (!refresh && cached?.groups?.length)
|
|
159
|
+
return cached.groups;
|
|
160
|
+
console.log(chalk_1.default.gray(`Scanning GitLab root groups from ${auth.baseUrl}...`));
|
|
161
|
+
const groups = await gitlabFetchAll(auth, "/groups", { min_access_level: "10", top_level_only: "true", all_available: "false", order_by: "name", sort: "asc" });
|
|
162
|
+
cache.groupsByBaseUrl[auth.baseUrl] = { updatedAt: new Date().toISOString(), groups };
|
|
163
|
+
await writeGitLabCache(cache);
|
|
164
|
+
return groups;
|
|
165
|
+
}
|
|
166
|
+
async function askGroup(auth, refresh) {
|
|
167
|
+
const groups = await listRootGroups(auth, !!refresh);
|
|
168
|
+
if (!groups.length)
|
|
169
|
+
throw new Error("No GitLab root groups found for this account.");
|
|
170
|
+
const selected = await (0, prompts_2.searchableSelectChoice)({
|
|
171
|
+
message: "Search/select GitLab root group",
|
|
172
|
+
choices: groups.map((group) => ({ title: `${group.full_path} · #${group.id} · ${group.visibility ?? ""}`, value: String(group.id) })),
|
|
173
|
+
allowCustomValue: false,
|
|
174
|
+
});
|
|
175
|
+
const group = groups.find((item) => String(item.id) === selected);
|
|
176
|
+
if (!group)
|
|
177
|
+
throw new Error("Group not found");
|
|
178
|
+
return group;
|
|
179
|
+
}
|
|
180
|
+
async function listProjects(auth, group, refresh) {
|
|
181
|
+
const cache = await readGitLabCache();
|
|
182
|
+
const key = makeGroupCacheKey(auth.baseUrl, group.id);
|
|
183
|
+
const cached = cache.projectsByGroup[key];
|
|
184
|
+
if (!refresh && cached?.projects?.length)
|
|
185
|
+
return cached.projects;
|
|
186
|
+
console.log(chalk_1.default.gray(`Scanning projects in ${group.full_path}...`));
|
|
187
|
+
const encodedId = encodeURIComponent(String(group.id));
|
|
188
|
+
const projects = await gitlabFetchAll(auth, `/groups/${encodedId}/projects`, { include_subgroups: "true", archived: "false", order_by: "path", sort: "asc" });
|
|
189
|
+
cache.projectsByGroup[key] = { updatedAt: new Date().toISOString(), projects };
|
|
190
|
+
await writeGitLabCache(cache);
|
|
191
|
+
return projects;
|
|
192
|
+
}
|
|
193
|
+
function localProjectPath(destination, project) {
|
|
194
|
+
return node_path_1.default.resolve(destination, project.path_with_namespace.replace(/\//g, node_path_1.default.sep));
|
|
195
|
+
}
|
|
196
|
+
function gitEnv(auth) {
|
|
197
|
+
const askPass = node_path_1.default.join(node_os_1.default.tmpdir(), `smdg-git-askpass-${node_crypto_1.default.randomBytes(6).toString("hex")}${process.platform === "win32" ? ".cmd" : ".sh"}`);
|
|
198
|
+
if (process.platform === "win32") {
|
|
199
|
+
fs_extra_1.default.writeFileSync(askPass, `@echo off\r\necho %SMDG_GIT_ASKPASS_VALUE%\r\n`);
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
fs_extra_1.default.writeFileSync(askPass, `#!/bin/sh\nprintf '%s\\n' "$SMDG_GIT_ASKPASS_VALUE"\n`);
|
|
203
|
+
fs_extra_1.default.chmodSync(askPass, 0o700);
|
|
204
|
+
}
|
|
205
|
+
return { ...process.env, GIT_TERMINAL_PROMPT: "0", GIT_ASKPASS: askPass, SMDG_GIT_ASKPASS_VALUE: auth.token };
|
|
206
|
+
}
|
|
207
|
+
async function runGit(repoPath, args, auth) {
|
|
208
|
+
const result = await (0, execa_1.execa)("git", args, { cwd: repoPath, reject: false, env: gitEnv(auth) });
|
|
209
|
+
return { ok: (result.exitCode ?? 0) === 0, output: [result.stdout, result.stderr].filter(Boolean).join("\n") };
|
|
210
|
+
}
|
|
211
|
+
async function cloneOrUpdateProject(project, destination, action, auth) {
|
|
212
|
+
const repoPath = localProjectPath(destination, project);
|
|
213
|
+
await fs_extra_1.default.ensureDir(node_path_1.default.dirname(repoPath));
|
|
214
|
+
if (!(await fs_extra_1.default.pathExists(node_path_1.default.join(repoPath, ".git")))) {
|
|
215
|
+
const clone = await runGit(undefined, ["clone", project.http_url_to_repo, repoPath], auth);
|
|
216
|
+
if (!clone.ok)
|
|
217
|
+
throw new Error(clone.output);
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
await runGit(repoPath, ["fetch", "--all", "--prune", "--tags"], auth);
|
|
221
|
+
}
|
|
222
|
+
if (action === "fetch")
|
|
223
|
+
return;
|
|
224
|
+
if (action === "pull-current") {
|
|
225
|
+
const pull = await runGit(repoPath, ["pull", "--ff-only"], auth);
|
|
226
|
+
if (!pull.ok)
|
|
227
|
+
throw new Error(pull.output);
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
if (action === "pull-all") {
|
|
231
|
+
const original = await runGit(repoPath, ["branch", "--show-current"], auth);
|
|
232
|
+
const refs = await runGit(repoPath, ["for-each-ref", "--format=%(refname:short)", "refs/remotes/origin"], auth);
|
|
233
|
+
if (!refs.ok)
|
|
234
|
+
throw new Error(refs.output);
|
|
235
|
+
const branches = refs.output.split(/\r?\n/)
|
|
236
|
+
.map((line) => line.trim())
|
|
237
|
+
.filter((line) => line.startsWith("origin/"))
|
|
238
|
+
.map((line) => line.replace(/^origin\//, ""))
|
|
239
|
+
.filter((name) => name && !["HEAD", "origin"].includes(name));
|
|
240
|
+
for (const branch of branches) {
|
|
241
|
+
const localExists = await runGit(repoPath, ["show-ref", "--verify", `refs/heads/${branch}`], auth);
|
|
242
|
+
const switchArgs = localExists.ok ? ["switch", branch] : ["switch", "-c", branch, "--track", `origin/${branch}`];
|
|
243
|
+
const sw = await runGit(repoPath, switchArgs, auth);
|
|
244
|
+
if (sw.ok)
|
|
245
|
+
await runGit(repoPath, ["pull", "--ff-only"], auth);
|
|
246
|
+
}
|
|
247
|
+
const restore = original.output.trim() || project.default_branch || "main";
|
|
248
|
+
await runGit(repoPath, ["switch", restore], auth);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
async function parallelRun(items, concurrency, worker) {
|
|
252
|
+
let cursor = 0;
|
|
253
|
+
let done = 0;
|
|
254
|
+
let failed = 0;
|
|
255
|
+
async function next() {
|
|
256
|
+
while (cursor < items.length) {
|
|
257
|
+
const index = cursor++;
|
|
258
|
+
try {
|
|
259
|
+
await worker(items[index], index);
|
|
260
|
+
}
|
|
261
|
+
catch (error) {
|
|
262
|
+
failed += 1;
|
|
263
|
+
console.error(chalk_1.default.red(`[${index + 1}/${items.length}] FAIL ${error instanceof Error ? error.message : error}`));
|
|
264
|
+
}
|
|
265
|
+
finally {
|
|
266
|
+
done += 1;
|
|
267
|
+
process.stdout.write(chalk_1.default.gray(`\rProgress ${done}/${items.length} · failed ${failed}`));
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
await Promise.all(Array.from({ length: Math.min(concurrency, items.length) }, () => next()));
|
|
272
|
+
process.stdout.write("\n");
|
|
273
|
+
}
|
|
274
|
+
async function runSync(options) {
|
|
275
|
+
const auth = await askAuth();
|
|
276
|
+
const mode = await (0, prompts_2.searchableSelectChoice)({
|
|
277
|
+
message: "What do you want to pull/clone?",
|
|
278
|
+
choices: [
|
|
279
|
+
{ title: "Pull/clone a GitLab group", value: "group" },
|
|
280
|
+
{ title: "Pull/clone a single repository", value: "repo" },
|
|
281
|
+
],
|
|
282
|
+
allowCustomValue: false,
|
|
283
|
+
});
|
|
284
|
+
const group = await askGroup(auth, options.refresh);
|
|
285
|
+
const projects = await listProjects(auth, group, !!options.refresh);
|
|
286
|
+
let selectedProjects = projects;
|
|
287
|
+
if (mode === "repo") {
|
|
288
|
+
const selectedProjectId = await (0, prompts_2.searchableSelectChoice)({
|
|
289
|
+
message: "Search/select GitLab repository",
|
|
290
|
+
choices: projects.map((project) => ({ title: `${project.path_with_namespace} · #${project.id}`, value: String(project.id) })),
|
|
291
|
+
allowCustomValue: false,
|
|
292
|
+
});
|
|
293
|
+
selectedProjects = projects.filter((project) => String(project.id) === selectedProjectId);
|
|
294
|
+
}
|
|
295
|
+
const dest = await (0, prompts_1.default)({ type: "text", name: "value", message: "Destination folder", initial: "." });
|
|
296
|
+
const action = await (0, prompts_2.searchableSelectChoice)({
|
|
297
|
+
message: "Sync action",
|
|
298
|
+
choices: [
|
|
299
|
+
{ title: "Clone missing repos and fetch existing repos", value: "fetch" },
|
|
300
|
+
{ title: "Pull current branch only", value: "pull-current" },
|
|
301
|
+
{ title: "Pull all remote branches locally", value: "pull-all" },
|
|
302
|
+
],
|
|
303
|
+
allowCustomValue: false,
|
|
304
|
+
});
|
|
305
|
+
const jobValue = await (0, prompts_2.searchableSelectChoice)({
|
|
306
|
+
message: "Parallel jobs",
|
|
307
|
+
choices: ["4", "2", "6", "8"].map((value) => ({ title: `${value} parallel jobs`, value })),
|
|
308
|
+
allowCustomValue: true,
|
|
309
|
+
});
|
|
310
|
+
const concurrency = Math.max(1, Math.min(16, Number(jobValue) || 4));
|
|
311
|
+
const destination = node_path_1.default.resolve(String(dest.value || "."));
|
|
312
|
+
const cache = await readGitLabCache();
|
|
313
|
+
cache.destinations = [destination, ...cache.destinations.filter((item) => item !== destination)].slice(0, 20);
|
|
314
|
+
await writeGitLabCache(cache);
|
|
315
|
+
console.log(chalk_1.default.cyan(`Syncing ${selectedProjects.length} repo(s) with ${concurrency} job(s)...`));
|
|
316
|
+
await parallelRun(selectedProjects, concurrency, async (project, index) => {
|
|
317
|
+
console.log(chalk_1.default.blue(`\n[${index + 1}/${selectedProjects.length}] RUN ${project.path_with_namespace}`));
|
|
318
|
+
await cloneOrUpdateProject(project, destination, action, auth);
|
|
319
|
+
console.log(chalk_1.default.green(`[${index + 1}/${selectedProjects.length}] DONE ${project.path_with_namespace}`));
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
function registerGitLabCommands(program) {
|
|
323
|
+
const gitlab = program.command("gitlab").alias("gl").description("GitLab browser login, group/project scan, clone, sync, and branch fetch helpers");
|
|
324
|
+
gitlab.command("login").description("Login to GitLab and cache auth").action(async () => { await runLoginFlow(); });
|
|
325
|
+
gitlab.command("auth-status").alias("whoami").description("Show cached GitLab auth status").action(async () => {
|
|
326
|
+
const cache = await readGitLabCache();
|
|
327
|
+
if (!cache.instances.length) {
|
|
328
|
+
console.log("Not logged in.");
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
for (const auth of cache.instances)
|
|
332
|
+
console.log(`${auth.baseUrl} · ${auth.username ?? "user"} · expires ${auth.expiresAt ?? "unknown"}`);
|
|
333
|
+
});
|
|
334
|
+
gitlab.command("logout").description("Remove cached GitLab login").action(async () => { const cache = await readGitLabCache(); cache.instances = []; await writeGitLabCache(cache); console.log("GitLab login cache cleared."); });
|
|
335
|
+
gitlab.command("groups").description("List GitLab root groups").option("--refresh", "Refresh from API").action(async (options) => {
|
|
336
|
+
const auth = await askAuth();
|
|
337
|
+
const groups = await listRootGroups(auth, !!options.refresh);
|
|
338
|
+
for (const group of groups)
|
|
339
|
+
console.log(`${group.full_path} · #${group.id} · ${group.visibility ?? ""}`);
|
|
340
|
+
});
|
|
341
|
+
gitlab.command("projects").description("List projects in a GitLab root group").option("--refresh", "Refresh from API").action(async (options) => {
|
|
342
|
+
const auth = await askAuth();
|
|
343
|
+
const group = await askGroup(auth, options.refresh);
|
|
344
|
+
const projects = await listProjects(auth, group, !!options.refresh);
|
|
345
|
+
for (const project of projects)
|
|
346
|
+
console.log(`${project.path_with_namespace} · #${project.id}`);
|
|
347
|
+
});
|
|
348
|
+
gitlab.command("sync").alias("clone").description("Clone or update GitLab projects without ghorg").option("--refresh", "Refresh groups/projects from API").action(runSync);
|
|
349
|
+
gitlab.command("pull").description("Interactive pull/fetch for GitLab projects").option("--refresh", "Refresh groups/projects from API").action(runSync);
|
|
350
|
+
}
|
|
351
|
+
//# sourceMappingURL=gitlab.command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitlab.command.js","sourceRoot":"","sources":["../../src/commands/gitlab.command.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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.registerNpmrcCommands = registerNpmrcCommands;
|
|
7
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
8
|
+
const promises_1 = require("node:fs/promises");
|
|
9
|
+
const prompts_1 = __importDefault(require("prompts"));
|
|
10
|
+
const cache_1 = require("../core/cache");
|
|
11
|
+
const npmrc_1 = require("../core/npmrc");
|
|
12
|
+
const prompts_2 = require("../core/prompts");
|
|
13
|
+
const repository_1 = require("../core/repository");
|
|
8
14
|
const DEFAULT_PROJECT_NAME = "default";
|
|
9
15
|
const DEFAULT_HOST = "gitlab.simplemdg.com";
|
|
10
16
|
const DEFAULT_SCOPE = "@simplemdg";
|
|
@@ -44,16 +50,16 @@ async function resolveCurrentProjectName(cwd, explicitProjectName) {
|
|
|
44
50
|
if (explicitProjectName?.trim()) {
|
|
45
51
|
return explicitProjectName.trim();
|
|
46
52
|
}
|
|
47
|
-
const repositoryPath = await resolveRepositoryPath(cwd);
|
|
48
|
-
const packageJsonName = await readPackageJsonName(repositoryPath);
|
|
49
|
-
return packageJsonName ??
|
|
53
|
+
const repositoryPath = await (0, repository_1.resolveRepositoryPath)(cwd);
|
|
54
|
+
const packageJsonName = await (0, npmrc_1.readPackageJsonName)(repositoryPath);
|
|
55
|
+
return packageJsonName ?? node_path_1.default.basename(repositoryPath) ?? DEFAULT_PROJECT_NAME;
|
|
50
56
|
}
|
|
51
57
|
async function askHost(providedHost) {
|
|
52
58
|
if (providedHost?.trim()) {
|
|
53
|
-
return normalizeGitLabHost(providedHost);
|
|
59
|
+
return (0, npmrc_1.normalizeGitLabHost)(providedHost);
|
|
54
60
|
}
|
|
55
|
-
const cache = await readCache();
|
|
56
|
-
return normalizeGitLabHost(await searchableSelectOrInput({
|
|
61
|
+
const cache = await (0, cache_1.readCache)();
|
|
62
|
+
return (0, npmrc_1.normalizeGitLabHost)(await (0, prompts_2.searchableSelectOrInput)({
|
|
57
63
|
message: "GitLab host",
|
|
58
64
|
values: cache.npmrc.hosts,
|
|
59
65
|
initialValue: cache.npmrc.hosts[0] ?? DEFAULT_HOST,
|
|
@@ -63,10 +69,10 @@ async function askHost(providedHost) {
|
|
|
63
69
|
}
|
|
64
70
|
async function askScope(providedScope) {
|
|
65
71
|
if (providedScope?.trim()) {
|
|
66
|
-
return normalizeNpmScope(providedScope);
|
|
72
|
+
return (0, npmrc_1.normalizeNpmScope)(providedScope);
|
|
67
73
|
}
|
|
68
|
-
const cache = await readCache();
|
|
69
|
-
return normalizeNpmScope(await searchableSelectOrInput({
|
|
74
|
+
const cache = await (0, cache_1.readCache)();
|
|
75
|
+
return (0, npmrc_1.normalizeNpmScope)(await (0, prompts_2.searchableSelectOrInput)({
|
|
70
76
|
message: "NPM scope",
|
|
71
77
|
values: cache.npmrc.scopes,
|
|
72
78
|
initialValue: cache.npmrc.scopes[0] ?? DEFAULT_SCOPE,
|
|
@@ -90,7 +96,7 @@ async function askPackageEntry(options) {
|
|
|
90
96
|
updatedAt: now,
|
|
91
97
|
};
|
|
92
98
|
}
|
|
93
|
-
const cache = await readCache();
|
|
99
|
+
const cache = await (0, cache_1.readCache)();
|
|
94
100
|
const projectPackages = cache.npmrc.packageIdsByProject[options.projectName]?.packages ?? [];
|
|
95
101
|
const legacyProjectIds = cache.npmrc.packageIdsByProject[options.projectName]?.packageIds ?? [];
|
|
96
102
|
const legacyProjectPackages = legacyProjectIds.map((packageId) => ({
|
|
@@ -114,7 +120,7 @@ async function askPackageEntry(options) {
|
|
|
114
120
|
...globalPackages,
|
|
115
121
|
...legacyGlobalPackages,
|
|
116
122
|
]);
|
|
117
|
-
const selectedPackageId = await searchableSelectChoice({
|
|
123
|
+
const selectedPackageId = await (0, prompts_2.searchableSelectChoice)({
|
|
118
124
|
message: `GitLab package for ${options.projectName}`,
|
|
119
125
|
choices: packages.map((entry) => ({
|
|
120
126
|
title: buildPackageEntryTitle(entry),
|
|
@@ -132,7 +138,7 @@ async function askPackageEntry(options) {
|
|
|
132
138
|
updatedAt: now,
|
|
133
139
|
};
|
|
134
140
|
}
|
|
135
|
-
const response = await
|
|
141
|
+
const response = await (0, prompts_1.default)({
|
|
136
142
|
type: "text",
|
|
137
143
|
name: "packageName",
|
|
138
144
|
message: `Package name for ${selectedPackageId}`,
|
|
@@ -161,7 +167,7 @@ async function askToken(options) {
|
|
|
161
167
|
updatedAt: now,
|
|
162
168
|
};
|
|
163
169
|
}
|
|
164
|
-
const cache = await readCache();
|
|
170
|
+
const cache = await (0, cache_1.readCache)();
|
|
165
171
|
const scopedTokens = cache.npmrc.tokenEntries.filter((entry) => {
|
|
166
172
|
return entry.host === options.host && entry.scope === options.scope;
|
|
167
173
|
});
|
|
@@ -175,7 +181,7 @@ async function askToken(options) {
|
|
|
175
181
|
}));
|
|
176
182
|
const tokens = [...scopedTokens, ...allTokens, ...legacyTokens];
|
|
177
183
|
if (tokens.length > 0) {
|
|
178
|
-
const selectedToken = await searchableSelectChoice({
|
|
184
|
+
const selectedToken = await (0, prompts_2.searchableSelectChoice)({
|
|
179
185
|
message: `GitLab npm auth token for ${options.scope} @ ${options.host}`,
|
|
180
186
|
choices: tokens.map((entry) => ({
|
|
181
187
|
title: buildTokenTitle(entry),
|
|
@@ -201,7 +207,7 @@ async function askToken(options) {
|
|
|
201
207
|
updatedAt: now,
|
|
202
208
|
};
|
|
203
209
|
}
|
|
204
|
-
const response = await
|
|
210
|
+
const response = await (0, prompts_1.default)({
|
|
205
211
|
type: "password",
|
|
206
212
|
name: "token",
|
|
207
213
|
message: `GitLab npm auth token for ${options.scope} @ ${options.host}`,
|
|
@@ -221,7 +227,7 @@ async function askToken(options) {
|
|
|
221
227
|
async function createNpmrc(options) {
|
|
222
228
|
const cwd = options.cwd ?? process.cwd();
|
|
223
229
|
const projectName = await resolveCurrentProjectName(cwd);
|
|
224
|
-
const cache = await readCache();
|
|
230
|
+
const cache = await (0, cache_1.readCache)();
|
|
225
231
|
const host = await askHost(options.host);
|
|
226
232
|
const scope = await askScope(options.scope);
|
|
227
233
|
const packageEntry = await askPackageEntry({
|
|
@@ -237,14 +243,14 @@ async function createNpmrc(options) {
|
|
|
237
243
|
providedToken: options.token,
|
|
238
244
|
providedLabel: options.tokenLabel,
|
|
239
245
|
});
|
|
240
|
-
const outputFileName = options.out ?? await searchableSelectOrInput({
|
|
246
|
+
const outputFileName = options.out ?? await (0, prompts_2.searchableSelectOrInput)({
|
|
241
247
|
message: "Output npmrc file",
|
|
242
248
|
values: cache.npmrc.outputFileNames,
|
|
243
249
|
initialValue: ".npmrc",
|
|
244
250
|
validate: validateNotEmpty("Output file"),
|
|
245
251
|
customValueTitle: (value) => `Use typed file name: ${value}`,
|
|
246
252
|
});
|
|
247
|
-
const outputPath = await writeNpmrcFile({
|
|
253
|
+
const outputPath = await (0, npmrc_1.writeNpmrcFile)({
|
|
248
254
|
host,
|
|
249
255
|
scope,
|
|
250
256
|
packageId: packageEntry.packageId,
|
|
@@ -252,12 +258,12 @@ async function createNpmrc(options) {
|
|
|
252
258
|
outputFileName,
|
|
253
259
|
alwaysAuth: options.alwaysAuth ?? true,
|
|
254
260
|
});
|
|
255
|
-
await rememberNpmrcHost(host);
|
|
256
|
-
await rememberNpmrcScope(scope);
|
|
257
|
-
await rememberNpmrcPackages(projectName, [packageEntry]);
|
|
258
|
-
await rememberNpmrcOutputFileName(outputFileName);
|
|
261
|
+
await (0, cache_1.rememberNpmrcHost)(host);
|
|
262
|
+
await (0, cache_1.rememberNpmrcScope)(scope);
|
|
263
|
+
await (0, cache_1.rememberNpmrcPackages)(projectName, [packageEntry]);
|
|
264
|
+
await (0, cache_1.rememberNpmrcOutputFileName)(outputFileName);
|
|
259
265
|
if (options.noSaveToken !== true) {
|
|
260
|
-
await rememberNpmrcTokenEntry(tokenEntry);
|
|
266
|
+
await (0, cache_1.rememberNpmrcTokenEntry)(tokenEntry);
|
|
261
267
|
}
|
|
262
268
|
console.log(`Created ${outputPath}`);
|
|
263
269
|
console.log(`${scope}:registry=https://${host}/api/v4/projects/${packageEntry.packageId}/packages/npm/`);
|
|
@@ -270,23 +276,23 @@ async function importPackages(options) {
|
|
|
270
276
|
const scope = await askScope(options.scope);
|
|
271
277
|
let rawInput = options.ids ?? "";
|
|
272
278
|
if (options.file?.trim()) {
|
|
273
|
-
const filePath =
|
|
274
|
-
const fileContent = await readFile(filePath, "utf8");
|
|
279
|
+
const filePath = node_path_1.default.resolve(options.cwd ?? process.cwd(), options.file);
|
|
280
|
+
const fileContent = await (0, promises_1.readFile)(filePath, "utf8");
|
|
275
281
|
rawInput = `${rawInput}\n${fileContent}`;
|
|
276
282
|
}
|
|
277
283
|
if (!rawInput.trim()) {
|
|
278
|
-
const response = await
|
|
284
|
+
const response = await (0, prompts_1.default)({
|
|
279
285
|
type: "text",
|
|
280
286
|
name: "packages",
|
|
281
287
|
message: `Packages for ${projectName}. Use: name|id, name,id, or id only`,
|
|
282
|
-
validate: (value) => parsePackageInputList(value).length > 0 ? true : "Enter at least one package ID",
|
|
288
|
+
validate: (value) => (0, npmrc_1.parsePackageInputList)(value).length > 0 ? true : "Enter at least one package ID",
|
|
283
289
|
});
|
|
284
290
|
if (!response.packages) {
|
|
285
291
|
throw new Error("No packages entered");
|
|
286
292
|
}
|
|
287
293
|
rawInput = response.packages;
|
|
288
294
|
}
|
|
289
|
-
const parsedPackages = parsePackageInputList(rawInput);
|
|
295
|
+
const parsedPackages = (0, npmrc_1.parsePackageInputList)(rawInput);
|
|
290
296
|
if (parsedPackages.length === 0) {
|
|
291
297
|
throw new Error("No valid packages found. Package IDs must be numbers.");
|
|
292
298
|
}
|
|
@@ -297,9 +303,9 @@ async function importPackages(options) {
|
|
|
297
303
|
scope,
|
|
298
304
|
updatedAt: new Date().toISOString(),
|
|
299
305
|
}));
|
|
300
|
-
await rememberNpmrcHost(host);
|
|
301
|
-
await rememberNpmrcScope(scope);
|
|
302
|
-
await rememberNpmrcPackages(projectName, packageEntries);
|
|
306
|
+
await (0, cache_1.rememberNpmrcHost)(host);
|
|
307
|
+
await (0, cache_1.rememberNpmrcScope)(scope);
|
|
308
|
+
await (0, cache_1.rememberNpmrcPackages)(projectName, packageEntries);
|
|
303
309
|
console.log(`Imported ${packageEntries.length} package(s) for ${projectName}:`);
|
|
304
310
|
for (const entry of packageEntries) {
|
|
305
311
|
console.log(`- ${entry.packageName} (${entry.packageId}) - ${entry.scope} @ ${entry.host}`);
|
|
@@ -310,7 +316,7 @@ async function updateToken(options) {
|
|
|
310
316
|
const scope = await askScope(options.scope);
|
|
311
317
|
const response = options.token?.trim()
|
|
312
318
|
? { token: options.token.trim(), label: options.label?.trim() || `${scope} @ ${host}` }
|
|
313
|
-
: await
|
|
319
|
+
: await (0, prompts_1.default)([
|
|
314
320
|
{
|
|
315
321
|
type: "password",
|
|
316
322
|
name: "token",
|
|
@@ -335,13 +341,13 @@ async function updateToken(options) {
|
|
|
335
341
|
label: String(response.label || `${scope} @ ${host}`).trim(),
|
|
336
342
|
updatedAt: new Date().toISOString(),
|
|
337
343
|
};
|
|
338
|
-
await rememberNpmrcHost(host);
|
|
339
|
-
await rememberNpmrcScope(scope);
|
|
340
|
-
await rememberNpmrcTokenEntry(tokenEntry);
|
|
344
|
+
await (0, cache_1.rememberNpmrcHost)(host);
|
|
345
|
+
await (0, cache_1.rememberNpmrcScope)(scope);
|
|
346
|
+
await (0, cache_1.rememberNpmrcTokenEntry)(tokenEntry);
|
|
341
347
|
console.log(`Updated token for ${scope} @ ${host}: ${tokenEntry.label} (${maskToken(tokenEntry.token)})`);
|
|
342
348
|
}
|
|
343
349
|
async function listNpmrcCache() {
|
|
344
|
-
const cache = await readCache();
|
|
350
|
+
const cache = await (0, cache_1.readCache)();
|
|
345
351
|
console.log("NPMRC cache");
|
|
346
352
|
console.log("");
|
|
347
353
|
console.log(`Hosts: ${cache.npmrc.hosts.join(", ") || "N/A"}`);
|
|
@@ -398,7 +404,7 @@ async function listNpmrcCache() {
|
|
|
398
404
|
}
|
|
399
405
|
}
|
|
400
406
|
}
|
|
401
|
-
|
|
407
|
+
function registerNpmrcCommands(program) {
|
|
402
408
|
const npmrcCommand = program
|
|
403
409
|
.command("npmrc")
|
|
404
410
|
.description("Create and cache .npmrc config for GitLab npm package registry");
|