@ticatec/omniflow-gitlab 1.0.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/LICENSE +21 -0
- package/README.md +94 -0
- package/README_CN.md +95 -0
- package/dist/artifacts/GitLabContainerPublisher.d.ts +17 -0
- package/dist/artifacts/GitLabContainerPublisher.d.ts.map +1 -0
- package/dist/artifacts/GitLabContainerPublisher.js +44 -0
- package/dist/artifacts/GitLabContainerPublisher.js.map +1 -0
- package/dist/artifacts/GitLabGenericPublisher.d.ts +27 -0
- package/dist/artifacts/GitLabGenericPublisher.d.ts.map +1 -0
- package/dist/artifacts/GitLabGenericPublisher.js +176 -0
- package/dist/artifacts/GitLabGenericPublisher.js.map +1 -0
- package/dist/artifacts/GitLabMavenPublisher.d.ts +24 -0
- package/dist/artifacts/GitLabMavenPublisher.d.ts.map +1 -0
- package/dist/artifacts/GitLabMavenPublisher.js +185 -0
- package/dist/artifacts/GitLabMavenPublisher.js.map +1 -0
- package/dist/artifacts/GitLabNpmPublisher.d.ts +20 -0
- package/dist/artifacts/GitLabNpmPublisher.d.ts.map +1 -0
- package/dist/artifacts/GitLabNpmPublisher.js +68 -0
- package/dist/artifacts/GitLabNpmPublisher.js.map +1 -0
- package/dist/client/GitLabClient.d.ts +59 -0
- package/dist/client/GitLabClient.d.ts.map +1 -0
- package/dist/client/GitLabClient.js +169 -0
- package/dist/client/GitLabClient.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -0
- package/package.json +58 -0
- package/src/artifacts/GitLabContainerPublisher.ts +50 -0
- package/src/artifacts/GitLabGenericPublisher.ts +221 -0
- package/src/artifacts/GitLabMavenPublisher.ts +224 -0
- package/src/artifacts/GitLabNpmPublisher.ts +90 -0
- package/src/client/GitLabClient.ts +200 -0
- package/src/index.ts +58 -0
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import crypto from 'crypto';
|
|
4
|
+
import { BasePublisher, resolveMavenArtifactFilenames, mavenPomPathFor, isMavenArtifactFile } from '@ticatec/omniflow-artifact';
|
|
5
|
+
import { GitLabClient, isGitLabHost } from '../client/GitLabClient.js';
|
|
6
|
+
/**
|
|
7
|
+
* GitLab Maven Package Registry Publisher.
|
|
8
|
+
*
|
|
9
|
+
* Endpoint format: PUT https://<gitlab_host>/api/v4/projects/<projectId>/packages/maven/{groupId}/{artifactId}/{version}/{filename}
|
|
10
|
+
*/
|
|
11
|
+
export class GitLabMavenPublisher extends BasePublisher {
|
|
12
|
+
id = 'gitlab-maven';
|
|
13
|
+
name = 'GitLab Maven Repository';
|
|
14
|
+
platform = 'gitlab';
|
|
15
|
+
artifactType = 'maven';
|
|
16
|
+
priority = 20;
|
|
17
|
+
detect(registry) {
|
|
18
|
+
if (registry.type !== 'maven' && registry.type !== 'jar') {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
const regName = (registry.name || '').toLowerCase();
|
|
22
|
+
if (regName === 'gitlab' || regName.startsWith('gitlab-')) {
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
const server = (registry.server || '').toLowerCase();
|
|
26
|
+
try {
|
|
27
|
+
const parsed = new URL(server.includes('://') ? server : `https://${server}`);
|
|
28
|
+
return isGitLabHost(parsed.hostname);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
buildTargetRef(artifact, _registry) {
|
|
35
|
+
const version = artifact.tags && artifact.tags.length > 0 ? artifact.tags[0] : '1.0.0';
|
|
36
|
+
const artifactId = artifact.metadata?.artifactId || artifact.name;
|
|
37
|
+
const groupId = artifact.metadata?.groupId?.trim();
|
|
38
|
+
return groupId ? `${groupId}:${artifactId}:${version}` : `${artifactId}:${version}`;
|
|
39
|
+
}
|
|
40
|
+
async exists(artifact, registry) {
|
|
41
|
+
const creds = this.resolveCredentials(registry);
|
|
42
|
+
const token = creds.token || creds.password;
|
|
43
|
+
const reg = registry;
|
|
44
|
+
const projectId = reg.namespace?.trim() ||
|
|
45
|
+
reg.options?.projectId?.trim() ||
|
|
46
|
+
reg.metadata?.projectId?.trim();
|
|
47
|
+
if (!projectId)
|
|
48
|
+
return false;
|
|
49
|
+
const client = new GitLabClient({
|
|
50
|
+
baseUrl: registry.server,
|
|
51
|
+
token,
|
|
52
|
+
username: creds.username,
|
|
53
|
+
password: creds.password
|
|
54
|
+
});
|
|
55
|
+
let jarPath = artifact.source;
|
|
56
|
+
if (jarPath) {
|
|
57
|
+
const stat = await fs.stat(jarPath).catch(() => null);
|
|
58
|
+
if (stat?.isDirectory()) {
|
|
59
|
+
const files = await fs.readdir(jarPath).catch(() => []);
|
|
60
|
+
const jarFile = files.find(f => isMavenArtifactFile(f));
|
|
61
|
+
if (jarFile) {
|
|
62
|
+
jarPath = path.join(jarPath, jarFile);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const { groupId, artifactId, version, groupPath, jarFilename } = resolveMavenArtifactFilenames(artifact, jarPath, undefined, 'GitLab');
|
|
67
|
+
const baseUrl = client.getPackageApiUrl(projectId, 'maven');
|
|
68
|
+
const cleanBaseUrl = baseUrl.replace(/\/+$/, '');
|
|
69
|
+
const targetUrl = `${cleanBaseUrl}/${groupPath}/${artifactId}/${version}/${jarFilename}`;
|
|
70
|
+
try {
|
|
71
|
+
const res = await client.request(targetUrl, { method: 'HEAD' });
|
|
72
|
+
if (res.ok || res.status === 200 || res.status === 204) {
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
if (res.status === 404) {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
const errText = await client.extractErrorMessage(res);
|
|
79
|
+
throw new Error(`Failed to check artifact existence in GitLab Maven registry (${res.status}): ${errText}`);
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
if (err?.message?.includes('Failed to check artifact existence in GitLab')) {
|
|
83
|
+
throw err;
|
|
84
|
+
}
|
|
85
|
+
throw new Error(`Failed to check artifact existence in GitLab Maven registry: ${client.maskSecrets(err?.message || String(err))}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async login(registry, _options) {
|
|
89
|
+
const creds = this.resolveCredentials(registry);
|
|
90
|
+
if (!creds.token && !creds.password) {
|
|
91
|
+
this.log(` ℹ No auth token configured for GitLab Maven repository ${registry.server}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async doPublish(artifact, registry, options) {
|
|
95
|
+
const creds = this.resolveCredentials(registry);
|
|
96
|
+
const token = creds.token || creds.password;
|
|
97
|
+
const reg = registry;
|
|
98
|
+
const projectId = reg.namespace?.trim() ||
|
|
99
|
+
reg.options?.projectId?.trim() ||
|
|
100
|
+
reg.metadata?.projectId?.trim();
|
|
101
|
+
if (!projectId) {
|
|
102
|
+
throw new Error(`GitLab Maven registry requires a valid project ID (specify via registry.namespace)`);
|
|
103
|
+
}
|
|
104
|
+
const client = new GitLabClient({
|
|
105
|
+
baseUrl: registry.server,
|
|
106
|
+
token,
|
|
107
|
+
username: creds.username,
|
|
108
|
+
password: creds.password
|
|
109
|
+
});
|
|
110
|
+
// Locate jar file
|
|
111
|
+
let jarPath = artifact.source;
|
|
112
|
+
const stat = await fs.stat(jarPath).catch(() => null);
|
|
113
|
+
if (stat?.isDirectory()) {
|
|
114
|
+
const files = await fs.readdir(jarPath);
|
|
115
|
+
const jarFile = files.find(f => isMavenArtifactFile(f));
|
|
116
|
+
if (!jarFile) {
|
|
117
|
+
throw new Error(`No jar/war artifact found in directory: ${jarPath}`);
|
|
118
|
+
}
|
|
119
|
+
jarPath = path.join(jarPath, jarFile);
|
|
120
|
+
}
|
|
121
|
+
const { groupId, artifactId, version, groupPath, jarFilename, pomFilename } = resolveMavenArtifactFilenames(artifact, jarPath, undefined, 'GitLab');
|
|
122
|
+
const jarBuffer = await fs.readFile(jarPath);
|
|
123
|
+
const digest = `sha256:${crypto.createHash('sha256').update(jarBuffer).digest('hex')}`;
|
|
124
|
+
const baseUrl = client.getPackageApiUrl(projectId, 'maven');
|
|
125
|
+
const cleanBaseUrl = baseUrl.replace(/\/+$/, '');
|
|
126
|
+
const targetUrl = `${cleanBaseUrl}/${groupPath}/${artifactId}/${version}/${jarFilename}`;
|
|
127
|
+
this.log(` 📤 Uploading Maven JAR to GitLab: ${targetUrl}`);
|
|
128
|
+
if (options?.dryRun) {
|
|
129
|
+
this.log(` [dryRun] Would PUT ${jarFilename} (${jarBuffer.length} bytes) to ${targetUrl}`);
|
|
130
|
+
return {
|
|
131
|
+
ref: `${groupId}:${artifactId}:${version}`,
|
|
132
|
+
digest,
|
|
133
|
+
metadata: { targetUrl, size: jarBuffer.length }
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
// The POM goes up first, deliberately.
|
|
137
|
+
//
|
|
138
|
+
// The existence probe checks for the jar/war, so uploading that last is what
|
|
139
|
+
// makes the probe mean "this artifact is complete". With the artifact first, a
|
|
140
|
+
// run that uploaded it and then failed on the POM would leave a coordinate that
|
|
141
|
+
// probes as present: the retry skips it as already published, and the POM never
|
|
142
|
+
// arrives — a jar in the repository forever, with no dependency information.
|
|
143
|
+
// Upload pom if exists
|
|
144
|
+
const pomPath = mavenPomPathFor(jarPath);
|
|
145
|
+
const pomStat = await fs.stat(pomPath).catch(() => null);
|
|
146
|
+
if (pomStat?.isFile()) {
|
|
147
|
+
const pomBuffer = await fs.readFile(pomPath);
|
|
148
|
+
const pomFilename = `${artifactId}-${version}.pom`;
|
|
149
|
+
const pomTargetUrl = `${cleanBaseUrl}/${groupPath}/${artifactId}/${version}/${pomFilename}`;
|
|
150
|
+
this.log(` 📤 Uploading Maven POM to GitLab: ${pomTargetUrl}`);
|
|
151
|
+
const pomRes = await client.request(pomTargetUrl, {
|
|
152
|
+
method: 'PUT',
|
|
153
|
+
headers: { 'Content-Type': 'application/xml' },
|
|
154
|
+
body: pomBuffer
|
|
155
|
+
});
|
|
156
|
+
if (!pomRes.ok && pomRes.status !== 201 && pomRes.status !== 200) {
|
|
157
|
+
const pomErr = await client.extractErrorMessage(pomRes);
|
|
158
|
+
throw new Error(`Failed to upload Maven POM to GitLab (${pomRes.status}): ${pomErr}`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
const res = await client.request(targetUrl, {
|
|
162
|
+
method: 'PUT',
|
|
163
|
+
headers: {
|
|
164
|
+
'Content-Type': 'application/java-archive'
|
|
165
|
+
},
|
|
166
|
+
body: jarBuffer
|
|
167
|
+
});
|
|
168
|
+
if (!res.ok && res.status !== 201 && res.status !== 200) {
|
|
169
|
+
const errText = await client.extractErrorMessage(res);
|
|
170
|
+
throw new Error(`Failed to upload Maven JAR to GitLab (${res.status}): ${errText}`);
|
|
171
|
+
}
|
|
172
|
+
return {
|
|
173
|
+
ref: `${groupId}:${artifactId}:${version}`,
|
|
174
|
+
digest,
|
|
175
|
+
metadata: {
|
|
176
|
+
groupId,
|
|
177
|
+
artifactId,
|
|
178
|
+
version,
|
|
179
|
+
targetUrl,
|
|
180
|
+
size: jarBuffer.length
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=GitLabMavenPublisher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitLabMavenPublisher.js","sourceRoot":"","sources":["../../src/artifacts/GitLabMavenPublisher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { BaseNpmPublisher } from '@ticatec/omniflow-artifact';
|
|
2
|
+
import type { ArtifactPayload, PublishOptions, RegistryConfig } from '@ticatec/omniflow-artifact';
|
|
3
|
+
/**
|
|
4
|
+
* GitLab NPM Package Registry Publisher.
|
|
5
|
+
*
|
|
6
|
+
* Endpoint format: https://<gitlab_host>/api/v4/projects/<projectId>/packages/npm/
|
|
7
|
+
*/
|
|
8
|
+
export declare class GitLabNpmPublisher extends BaseNpmPublisher {
|
|
9
|
+
readonly id = "gitlab-npm";
|
|
10
|
+
readonly name = "GitLab NPM Registry";
|
|
11
|
+
readonly platform = "gitlab";
|
|
12
|
+
readonly priority = 20;
|
|
13
|
+
detect(registry: RegistryConfig): boolean;
|
|
14
|
+
normalizeRegistryUrl(server: string, _registryOrNamespace?: RegistryConfig | string): string;
|
|
15
|
+
protected doPublish(artifact: ArtifactPayload, registry: RegistryConfig, options?: PublishOptions): Promise<{
|
|
16
|
+
ref: string;
|
|
17
|
+
metadata?: Record<string, unknown>;
|
|
18
|
+
}>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=GitLabNpmPublisher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitLabNpmPublisher.d.ts","sourceRoot":"","sources":["../../src/artifacts/GitLabNpmPublisher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAGjG;;;;GAIG;AACH,qBAAa,kBAAmB,SAAQ,gBAAgB;IACtD,QAAQ,CAAC,EAAE,gBAAe;IAC1B,QAAQ,CAAC,IAAI,yBAAwB;IACrC,QAAQ,CAAC,QAAQ,YAAW;IAC5B,SAAkB,QAAQ,MAAK;IAEtB,MAAM,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO;IAmBzC,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,oBAAoB,CAAC,EAAE,cAAc,GAAG,MAAM,GAAG,MAAM;cAsC5E,SAAS,CAChC,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,cAAc,EACxB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC;QACT,GAAG,EAAE,MAAM,CAAA;QACX,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KACnC,CAAC;CAUH"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { BaseNpmPublisher } from '@ticatec/omniflow-artifact';
|
|
2
|
+
import { isGitLabHost } from '../client/GitLabClient.js';
|
|
3
|
+
/**
|
|
4
|
+
* GitLab NPM Package Registry Publisher.
|
|
5
|
+
*
|
|
6
|
+
* Endpoint format: https://<gitlab_host>/api/v4/projects/<projectId>/packages/npm/
|
|
7
|
+
*/
|
|
8
|
+
export class GitLabNpmPublisher extends BaseNpmPublisher {
|
|
9
|
+
id = 'gitlab-npm';
|
|
10
|
+
name = 'GitLab NPM Registry';
|
|
11
|
+
platform = 'gitlab';
|
|
12
|
+
priority = 20;
|
|
13
|
+
detect(registry) {
|
|
14
|
+
if (registry.type !== 'npm') {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
const regName = (registry.name || '').toLowerCase();
|
|
18
|
+
if (regName === 'gitlab' || regName.startsWith('gitlab-')) {
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
const server = (registry.server || '').toLowerCase();
|
|
22
|
+
try {
|
|
23
|
+
const parsed = new URL(server.includes('://') ? server : `https://${server}`);
|
|
24
|
+
return isGitLabHost(parsed.hostname);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
normalizeRegistryUrl(server, _registryOrNamespace) {
|
|
31
|
+
let url = server.trim();
|
|
32
|
+
if (!/^https?:\/\//i.test(url)) {
|
|
33
|
+
url = `https://${url}`;
|
|
34
|
+
}
|
|
35
|
+
const parsed = new URL(url);
|
|
36
|
+
const cleanBase = url.replace(/\/+$/, '');
|
|
37
|
+
// M6 Escape hatch: if server URL already has path segments containing /packages/npm, use it as-is
|
|
38
|
+
if (parsed.pathname.includes('/packages/npm')) {
|
|
39
|
+
return cleanBase.endsWith('/') ? cleanBase : `${cleanBase}/`;
|
|
40
|
+
}
|
|
41
|
+
// Extract projectId strictly from namespace or options/metadata
|
|
42
|
+
let projectId;
|
|
43
|
+
if (typeof _registryOrNamespace === 'string') {
|
|
44
|
+
projectId = _registryOrNamespace.trim();
|
|
45
|
+
}
|
|
46
|
+
else if (_registryOrNamespace && typeof _registryOrNamespace === 'object') {
|
|
47
|
+
const reg = _registryOrNamespace;
|
|
48
|
+
projectId =
|
|
49
|
+
reg.namespace?.trim() ||
|
|
50
|
+
reg.options?.projectId?.trim() ||
|
|
51
|
+
reg.metadata?.projectId?.trim();
|
|
52
|
+
}
|
|
53
|
+
if (!projectId) {
|
|
54
|
+
throw new Error(`GitLab NPM registry requires a valid project ID (specify via registry.namespace or full server URL)`);
|
|
55
|
+
}
|
|
56
|
+
return `${cleanBase}/api/v4/projects/${encodeURIComponent(projectId)}/packages/npm/`;
|
|
57
|
+
}
|
|
58
|
+
// NOTE: login() is intentionally NOT overridden here. BaseNpmPublisher handles .npmrc backup,
|
|
59
|
+
// auth token injection, and cleanup(session) in finally to ensure credential cleanup (S1 fix).
|
|
60
|
+
async doPublish(artifact, registry, options) {
|
|
61
|
+
const owner = registry.namespace;
|
|
62
|
+
if (owner && !artifact.name.startsWith(`@`)) {
|
|
63
|
+
this.log(` ⚠ Notice: Package "${artifact.name}" is not scoped. GitLab typically recommends package names to be scoped (e.g. @<group>/<package>).`);
|
|
64
|
+
}
|
|
65
|
+
return super.doPublish(artifact, registry, options);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=GitLabNpmPublisher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitLabNpmPublisher.js","sourceRoot":"","sources":["../../src/artifacts/GitLabNpmPublisher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export interface GitLabClientConfig {
|
|
2
|
+
baseUrl: string;
|
|
3
|
+
token?: string;
|
|
4
|
+
username?: string;
|
|
5
|
+
password?: string;
|
|
6
|
+
timeoutMs?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface ParsedGitLabRepo {
|
|
9
|
+
host: string;
|
|
10
|
+
owner: string;
|
|
11
|
+
repo: string;
|
|
12
|
+
projectPath: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Detect whether a hostname is official GitLab SaaS or a valid self-hosted GitLab instance,
|
|
16
|
+
* strictly rejecting spoofed hostnames (e.g. gitlab.com.evil.net, gitlab.com.cn).
|
|
17
|
+
*/
|
|
18
|
+
export declare function isGitLabHost(hostname: string): boolean;
|
|
19
|
+
export declare class GitLabClient {
|
|
20
|
+
readonly baseUrl: string;
|
|
21
|
+
readonly token?: string;
|
|
22
|
+
readonly username?: string;
|
|
23
|
+
readonly password?: string;
|
|
24
|
+
readonly timeoutMs: number;
|
|
25
|
+
constructor(config: GitLabClientConfig);
|
|
26
|
+
get host(): string;
|
|
27
|
+
get hostname(): string;
|
|
28
|
+
/**
|
|
29
|
+
* Return sensitive credential strings of length >= 3 for scrubbing.
|
|
30
|
+
* Username is intentionally excluded to preserve debugging visibility.
|
|
31
|
+
*/
|
|
32
|
+
getSecrets(): string[];
|
|
33
|
+
/**
|
|
34
|
+
* Mask secrets in text using shared utility.
|
|
35
|
+
*/
|
|
36
|
+
maskSecrets(text: string): string;
|
|
37
|
+
getAuthHeaders(): Record<string, string>;
|
|
38
|
+
/**
|
|
39
|
+
* Return GitLab API v4 project endpoint URL with URL-encoded project path/ID.
|
|
40
|
+
*/
|
|
41
|
+
getProjectApiUrl(projectPathOrId: string, subpath?: string): string;
|
|
42
|
+
/**
|
|
43
|
+
* Return package registry endpoint for specific package type.
|
|
44
|
+
*/
|
|
45
|
+
getPackageApiUrl(projectPathOrId: string, packageType: 'npm' | 'maven' | 'generic', subpath?: string): string;
|
|
46
|
+
/**
|
|
47
|
+
* Standard HTTP request wrapper with timeout and credential masking.
|
|
48
|
+
*/
|
|
49
|
+
request(endpointOrUrl: string, init?: RequestInit): Promise<Response>;
|
|
50
|
+
/**
|
|
51
|
+
* Safely extract, truncate (max 500 chars), and mask error text from a response.
|
|
52
|
+
*/
|
|
53
|
+
extractErrorMessage(res: Response): Promise<string>;
|
|
54
|
+
/**
|
|
55
|
+
* Parse repository URL or slug into host, owner, and repo.
|
|
56
|
+
*/
|
|
57
|
+
static parseRepo(urlOrSlug: string, defaultHost?: string): ParsedGitLabRepo;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=GitLabClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitLabClient.d.ts","sourceRoot":"","sources":["../../src/client/GitLabClient.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;CACpB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAYtD;AAED,qBAAa,YAAY;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;gBAEd,MAAM,EAAE,kBAAkB;IAYtC,IAAI,IAAI,IAAI,MAAM,CAGjB;IAED,IAAI,QAAQ,IAAI,MAAM,CAGrB;IAED;;;OAGG;IACH,UAAU,IAAI,MAAM,EAAE;IAatB;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAIjC,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAexC;;OAEG;IACH,gBAAgB,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,SAAK,GAAG,MAAM;IAM/D;;OAEG;IACH,gBAAgB,CAAC,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,GAAG,OAAO,GAAG,SAAS,EAAE,OAAO,SAAK,GAAG,MAAM;IAiBzG;;OAEG;IACG,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAkB/E;;OAEG;IACG,mBAAmB,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;IAIzD;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,SAAe,GAAG,gBAAgB;CAoClF"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { safeFetch, maskSecrets, extractErrorMessage } from '@ticatec/omniflow-artifact';
|
|
2
|
+
/**
|
|
3
|
+
* Detect whether a hostname is official GitLab SaaS or a valid self-hosted GitLab instance,
|
|
4
|
+
* strictly rejecting spoofed hostnames (e.g. gitlab.com.evil.net, gitlab.com.cn).
|
|
5
|
+
*/
|
|
6
|
+
export function isGitLabHost(hostname) {
|
|
7
|
+
const host = hostname.toLowerCase();
|
|
8
|
+
if (host === 'gitlab.com' || host === 'registry.gitlab.com' || host.endsWith('.gitlab.com')) {
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
const segments = host.split('.');
|
|
12
|
+
// Reject subdomain spoofing where "gitlab.com" appears as subdomains of a foreign host
|
|
13
|
+
const gitlabIdx = segments.indexOf('gitlab');
|
|
14
|
+
if (gitlabIdx !== -1 && segments[gitlabIdx + 1] === 'com') {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
return segments.includes('gitlab');
|
|
18
|
+
}
|
|
19
|
+
export class GitLabClient {
|
|
20
|
+
baseUrl;
|
|
21
|
+
token;
|
|
22
|
+
username;
|
|
23
|
+
password;
|
|
24
|
+
timeoutMs;
|
|
25
|
+
constructor(config) {
|
|
26
|
+
let base = config.baseUrl.trim().replace(/\/+$/, '');
|
|
27
|
+
if (!/^https?:\/\//i.test(base)) {
|
|
28
|
+
base = `https://${base}`;
|
|
29
|
+
}
|
|
30
|
+
this.baseUrl = base;
|
|
31
|
+
this.token = config.token;
|
|
32
|
+
this.username = config.username;
|
|
33
|
+
this.password = config.password;
|
|
34
|
+
this.timeoutMs = config.timeoutMs ?? 30000;
|
|
35
|
+
}
|
|
36
|
+
get host() {
|
|
37
|
+
const parsed = new URL(this.baseUrl);
|
|
38
|
+
return parsed.host;
|
|
39
|
+
}
|
|
40
|
+
get hostname() {
|
|
41
|
+
const parsed = new URL(this.baseUrl);
|
|
42
|
+
return parsed.hostname;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Return sensitive credential strings of length >= 3 for scrubbing.
|
|
46
|
+
* Username is intentionally excluded to preserve debugging visibility.
|
|
47
|
+
*/
|
|
48
|
+
getSecrets() {
|
|
49
|
+
const secrets = [this.token, this.password].filter((s) => typeof s === 'string' && s.length >= 3);
|
|
50
|
+
if (this.username && this.password) {
|
|
51
|
+
const basic = Buffer.from(`${this.username}:${this.password}`).toString('base64');
|
|
52
|
+
if (basic.length >= 3) {
|
|
53
|
+
secrets.push(basic);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return secrets;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Mask secrets in text using shared utility.
|
|
60
|
+
*/
|
|
61
|
+
maskSecrets(text) {
|
|
62
|
+
return maskSecrets(text, this.getSecrets());
|
|
63
|
+
}
|
|
64
|
+
getAuthHeaders() {
|
|
65
|
+
const headers = {
|
|
66
|
+
Accept: 'application/json'
|
|
67
|
+
};
|
|
68
|
+
if (this.token) {
|
|
69
|
+
headers['PRIVATE-TOKEN'] = this.token;
|
|
70
|
+
}
|
|
71
|
+
else if (this.username && this.password) {
|
|
72
|
+
const basic = Buffer.from(`${this.username}:${this.password}`).toString('base64');
|
|
73
|
+
headers['Authorization'] = `Basic ${basic}`;
|
|
74
|
+
}
|
|
75
|
+
else if (this.password) {
|
|
76
|
+
headers['PRIVATE-TOKEN'] = this.password;
|
|
77
|
+
}
|
|
78
|
+
return headers;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Return GitLab API v4 project endpoint URL with URL-encoded project path/ID.
|
|
82
|
+
*/
|
|
83
|
+
getProjectApiUrl(projectPathOrId, subpath = '') {
|
|
84
|
+
const encoded = encodeURIComponent(projectPathOrId.replace(/^\/+/, '').replace(/\/+$/, ''));
|
|
85
|
+
const cleanSubpath = subpath ? (subpath.startsWith('/') ? subpath : `/${subpath}`) : '';
|
|
86
|
+
return `${this.baseUrl}/api/v4/projects/${encoded}${cleanSubpath}`;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Return package registry endpoint for specific package type.
|
|
90
|
+
*/
|
|
91
|
+
getPackageApiUrl(projectPathOrId, packageType, subpath = '') {
|
|
92
|
+
const projectUrl = this.getProjectApiUrl(projectPathOrId);
|
|
93
|
+
const cleanSubpath = subpath ? (subpath.startsWith('/') ? subpath : `/${subpath}`) : '';
|
|
94
|
+
switch (packageType) {
|
|
95
|
+
case 'npm':
|
|
96
|
+
// NPM registry endpoint must end with trailing slash
|
|
97
|
+
return `${projectUrl}/packages/npm/`;
|
|
98
|
+
case 'maven':
|
|
99
|
+
return `${projectUrl}/packages/maven${cleanSubpath}`;
|
|
100
|
+
case 'generic':
|
|
101
|
+
return `${projectUrl}/packages/generic${cleanSubpath}`;
|
|
102
|
+
default:
|
|
103
|
+
throw new Error(`Unsupported GitLab package type: ${packageType}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Standard HTTP request wrapper with timeout and credential masking.
|
|
108
|
+
*/
|
|
109
|
+
async request(endpointOrUrl, init = {}) {
|
|
110
|
+
const url = endpointOrUrl.startsWith('http://') || endpointOrUrl.startsWith('https://')
|
|
111
|
+
? endpointOrUrl
|
|
112
|
+
: `${this.baseUrl}${endpointOrUrl.startsWith('/') ? endpointOrUrl : `/${endpointOrUrl}`}`;
|
|
113
|
+
const headers = {
|
|
114
|
+
...this.getAuthHeaders(),
|
|
115
|
+
...(init.headers || {})
|
|
116
|
+
};
|
|
117
|
+
return await safeFetch(url, {
|
|
118
|
+
...init,
|
|
119
|
+
headers,
|
|
120
|
+
timeoutMs: this.timeoutMs,
|
|
121
|
+
secrets: this.getSecrets()
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Safely extract, truncate (max 500 chars), and mask error text from a response.
|
|
126
|
+
*/
|
|
127
|
+
async extractErrorMessage(res) {
|
|
128
|
+
return extractErrorMessage(res, this.getSecrets());
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Parse repository URL or slug into host, owner, and repo.
|
|
132
|
+
*/
|
|
133
|
+
static parseRepo(urlOrSlug, defaultHost = 'gitlab.com') {
|
|
134
|
+
let clean = urlOrSlug.trim();
|
|
135
|
+
let host = defaultHost;
|
|
136
|
+
if (clean.includes('://')) {
|
|
137
|
+
const parsed = new URL(clean);
|
|
138
|
+
host = parsed.host;
|
|
139
|
+
clean = decodeURIComponent(parsed.pathname);
|
|
140
|
+
}
|
|
141
|
+
else if (clean.includes('@') && clean.includes(':')) {
|
|
142
|
+
const colonIdx = clean.indexOf(':');
|
|
143
|
+
const hostPart = clean.slice(0, colonIdx).replace(/.*@/, '');
|
|
144
|
+
let pathPart = clean.slice(colonIdx + 1);
|
|
145
|
+
const portMatch = pathPart.match(/^(\d+)\/(.*)/);
|
|
146
|
+
if (portMatch) {
|
|
147
|
+
host = `${hostPart}:${portMatch[1]}`;
|
|
148
|
+
pathPart = portMatch[2];
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
host = hostPart;
|
|
152
|
+
}
|
|
153
|
+
clean = decodeURIComponent(pathPart);
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
clean = decodeURIComponent(clean);
|
|
157
|
+
}
|
|
158
|
+
clean = clean.replace(/^\/+/, '').replace(/\.git$/, '');
|
|
159
|
+
const segments = clean.split('/').filter(Boolean);
|
|
160
|
+
if (segments.length < 2) {
|
|
161
|
+
throw new Error(`Invalid repository path: "${urlOrSlug}". Expected owner/repo format.`);
|
|
162
|
+
}
|
|
163
|
+
const owner = segments.slice(0, -1).join('/');
|
|
164
|
+
const repo = segments[segments.length - 1];
|
|
165
|
+
const projectPath = segments.join('/');
|
|
166
|
+
return { host, owner, repo, projectPath };
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=GitLabClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitLabClient.js","sourceRoot":"","sources":["../../src/client/GitLabClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAiBxF;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAA;IACnC,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,qBAAqB,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QAC5F,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAChC,uFAAuF;IACvF,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC5C,IAAI,SAAS,KAAK,CAAC,CAAC,IAAI,QAAQ,CAAC,SAAS,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;QAC1D,OAAO,KAAK,CAAA;IACd,CAAC;IACD,OAAO,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;AACpC,CAAC;AAED,MAAM,OAAO,YAAY;IACd,OAAO,CAAQ;IACf,KAAK,CAAS;IACd,QAAQ,CAAS;IACjB,QAAQ,CAAS;IACjB,SAAS,CAAQ;IAE1B,YAAY,MAA0B;QACpC,IAAI,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QACpD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,IAAI,GAAG,WAAW,IAAI,EAAE,CAAA;QAC1B,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;QACnB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;QACzB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAA;QAC/B,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAA;QAC/B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,KAAK,CAAA;IAC5C,CAAC;IAED,IAAI,IAAI;QACN,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACpC,OAAO,MAAM,CAAC,IAAI,CAAA;IACpB,CAAC;IAED,IAAI,QAAQ;QACV,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACpC,OAAO,MAAM,CAAC,QAAQ,CAAA;IACxB,CAAC;IAED;;;OAGG;IACH,UAAU;QACR,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAChD,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAC3D,CAAA;QACD,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;YACjF,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACrB,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,IAAY;QACtB,OAAO,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAA;IAC7C,CAAC;IAED,cAAc;QACZ,MAAM,OAAO,GAA2B;YACtC,MAAM,EAAE,kBAAkB;SAC3B,CAAA;QACD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,KAAK,CAAA;QACvC,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;YACjF,OAAO,CAAC,eAAe,CAAC,GAAG,SAAS,KAAK,EAAE,CAAA;QAC7C,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACzB,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAA;QAC1C,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,eAAuB,EAAE,OAAO,GAAG,EAAE;QACpD,MAAM,OAAO,GAAG,kBAAkB,CAAC,eAAe,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAA;QAC3F,MAAM,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QACvF,OAAO,GAAG,IAAI,CAAC,OAAO,oBAAoB,OAAO,GAAG,YAAY,EAAE,CAAA;IACpE,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,eAAuB,EAAE,WAAwC,EAAE,OAAO,GAAG,EAAE;QAC9F,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAA;QACzD,MAAM,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAEvF,QAAQ,WAAW,EAAE,CAAC;YACpB,KAAK,KAAK;gBACR,qDAAqD;gBACrD,OAAO,GAAG,UAAU,gBAAgB,CAAA;YACtC,KAAK,OAAO;gBACV,OAAO,GAAG,UAAU,kBAAkB,YAAY,EAAE,CAAA;YACtD,KAAK,SAAS;gBACZ,OAAO,GAAG,UAAU,oBAAoB,YAAY,EAAE,CAAA;YACxD;gBACE,MAAM,IAAI,KAAK,CAAC,oCAAoC,WAAW,EAAE,CAAC,CAAA;QACtE,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,aAAqB,EAAE,OAAoB,EAAE;QACzD,MAAM,GAAG,GAAG,aAAa,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,aAAa,CAAC,UAAU,CAAC,UAAU,CAAC;YACrF,CAAC,CAAC,aAAa;YACf,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,aAAa,EAAE,EAAE,CAAA;QAE3F,MAAM,OAAO,GAAG;YACd,GAAG,IAAI,CAAC,cAAc,EAAE;YACxB,GAAG,CAAC,IAAI,CAAC,OAAiC,IAAI,EAAE,CAAC;SAClD,CAAA;QAED,OAAO,MAAM,SAAS,CAAC,GAAG,EAAE;YAC1B,GAAG,IAAI;YACP,OAAO;YACP,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;SAC3B,CAAC,CAAA;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB,CAAC,GAAa;QACrC,OAAO,mBAAmB,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAA;IACpD,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,SAAiB,EAAE,WAAW,GAAG,YAAY;QAC5D,IAAI,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,CAAA;QAC5B,IAAI,IAAI,GAAG,WAAW,CAAA;QAEtB,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAA;YAC7B,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;YAClB,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QAC7C,CAAC;aAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACtD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YACnC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;YAC5D,IAAI,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAA;YACxC,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,CAAA;YAChD,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,GAAG,GAAG,QAAQ,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,CAAA;gBACpC,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA;YACzB,CAAC;iBAAM,CAAC;gBACN,IAAI,GAAG,QAAQ,CAAA;YACjB,CAAC;YACD,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAA;QACtC,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAA;QACnC,CAAC;QAED,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;QACvD,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACjD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,6BAA6B,SAAS,gCAAgC,CAAC,CAAA;QACzF,CAAC;QAED,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC7C,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QAC1C,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAEtC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,CAAA;IAC3C,CAAC;CACF"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { PluginContext } from '@ticatec/omniflow-core';
|
|
2
|
+
import type { ArtifactPublisherRegistry } from '@ticatec/omniflow-artifact';
|
|
3
|
+
import { GitLabContainerPublisher } from './artifacts/GitLabContainerPublisher.js';
|
|
4
|
+
import { GitLabNpmPublisher } from './artifacts/GitLabNpmPublisher.js';
|
|
5
|
+
import { GitLabMavenPublisher } from './artifacts/GitLabMavenPublisher.js';
|
|
6
|
+
import { GitLabGenericPublisher } from './artifacts/GitLabGenericPublisher.js';
|
|
7
|
+
export * from './client/GitLabClient.js';
|
|
8
|
+
export * from './artifacts/GitLabContainerPublisher.js';
|
|
9
|
+
export * from './artifacts/GitLabNpmPublisher.js';
|
|
10
|
+
export * from './artifacts/GitLabMavenPublisher.js';
|
|
11
|
+
export * from './artifacts/GitLabGenericPublisher.js';
|
|
12
|
+
export interface RegisterGitLabOptions {
|
|
13
|
+
artifactRegistry?: ArtifactPublisherRegistry;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Standard OmniFlow Plugin SPI entry point.
|
|
17
|
+
*/
|
|
18
|
+
export declare function register(ctx: PluginContext, options?: Record<string, unknown>): void;
|
|
19
|
+
export default register;
|
|
20
|
+
/**
|
|
21
|
+
* Register all GitLab artifact publishers into the artifact registry.
|
|
22
|
+
*/
|
|
23
|
+
export declare function registerGitLab(options?: RegisterGitLabOptions): {
|
|
24
|
+
containerPublisher: GitLabContainerPublisher;
|
|
25
|
+
npmPublisher: GitLabNpmPublisher;
|
|
26
|
+
mavenPublisher: GitLabMavenPublisher;
|
|
27
|
+
genericPublisher: GitLabGenericPublisher;
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAC3D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAA;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAA;AAClF,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAA;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAA;AAC1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAA;AAE9E,cAAc,0BAA0B,CAAA;AACxC,cAAc,yCAAyC,CAAA;AACvD,cAAc,mCAAmC,CAAA;AACjD,cAAc,qCAAqC,CAAA;AACnD,cAAc,uCAAuC,CAAA;AAErD,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,CAAC,EAAE,yBAAyB,CAAA;CAC7C;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,IAAI,CAMxF;AAED,eAAe,QAAQ,CAAA;AAEvB;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,qBAA0B,GAAG;IACnE,kBAAkB,EAAE,wBAAwB,CAAA;IAC5C,YAAY,EAAE,kBAAkB,CAAA;IAChC,cAAc,EAAE,oBAAoB,CAAA;IACpC,gBAAgB,EAAE,sBAAsB,CAAA;CACzC,CAmBA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { GitLabContainerPublisher } from './artifacts/GitLabContainerPublisher.js';
|
|
2
|
+
import { GitLabNpmPublisher } from './artifacts/GitLabNpmPublisher.js';
|
|
3
|
+
import { GitLabMavenPublisher } from './artifacts/GitLabMavenPublisher.js';
|
|
4
|
+
import { GitLabGenericPublisher } from './artifacts/GitLabGenericPublisher.js';
|
|
5
|
+
export * from './client/GitLabClient.js';
|
|
6
|
+
export * from './artifacts/GitLabContainerPublisher.js';
|
|
7
|
+
export * from './artifacts/GitLabNpmPublisher.js';
|
|
8
|
+
export * from './artifacts/GitLabMavenPublisher.js';
|
|
9
|
+
export * from './artifacts/GitLabGenericPublisher.js';
|
|
10
|
+
/**
|
|
11
|
+
* Standard OmniFlow Plugin SPI entry point.
|
|
12
|
+
*/
|
|
13
|
+
export function register(ctx, options = {}) {
|
|
14
|
+
const artifactsEnabled = options.artifacts !== false;
|
|
15
|
+
registerGitLab({
|
|
16
|
+
artifactRegistry: artifactsEnabled ? ctx.artifactRegistry : undefined
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
export default register;
|
|
20
|
+
/**
|
|
21
|
+
* Register all GitLab artifact publishers into the artifact registry.
|
|
22
|
+
*/
|
|
23
|
+
export function registerGitLab(options = {}) {
|
|
24
|
+
const containerPublisher = new GitLabContainerPublisher();
|
|
25
|
+
const npmPublisher = new GitLabNpmPublisher();
|
|
26
|
+
const mavenPublisher = new GitLabMavenPublisher();
|
|
27
|
+
const genericPublisher = new GitLabGenericPublisher();
|
|
28
|
+
if (options.artifactRegistry) {
|
|
29
|
+
options.artifactRegistry.register(containerPublisher);
|
|
30
|
+
options.artifactRegistry.register(npmPublisher);
|
|
31
|
+
options.artifactRegistry.register(mavenPublisher);
|
|
32
|
+
options.artifactRegistry.register(genericPublisher);
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
containerPublisher,
|
|
36
|
+
npmPublisher,
|
|
37
|
+
mavenPublisher,
|
|
38
|
+
genericPublisher
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAA;AAClF,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAA;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAA;AAC1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAA;AAE9E,cAAc,0BAA0B,CAAA;AACxC,cAAc,yCAAyC,CAAA;AACvD,cAAc,mCAAmC,CAAA;AACjD,cAAc,qCAAqC,CAAA;AACnD,cAAc,uCAAuC,CAAA;AAMrD;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAkB,EAAE,UAAmC,EAAE;IAChF,MAAM,gBAAgB,GAAG,OAAO,CAAC,SAAS,KAAK,KAAK,CAAA;IAEpD,cAAc,CAAC;QACb,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS;KACtE,CAAC,CAAA;AACJ,CAAC;AAED,eAAe,QAAQ,CAAA;AAEvB;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,UAAiC,EAAE;IAMhE,MAAM,kBAAkB,GAAG,IAAI,wBAAwB,EAAE,CAAA;IACzD,MAAM,YAAY,GAAG,IAAI,kBAAkB,EAAE,CAAA;IAC7C,MAAM,cAAc,GAAG,IAAI,oBAAoB,EAAE,CAAA;IACjD,MAAM,gBAAgB,GAAG,IAAI,sBAAsB,EAAE,CAAA;IAErD,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC7B,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAA;QACrD,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;QAC/C,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAA;QACjD,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAA;IACrD,CAAC;IAED,OAAO;QACL,kBAAkB;QAClB,YAAY;QACZ,cAAc;QACd,gBAAgB;KACjB,CAAA;AACH,CAAC"}
|