@ticatec/omniflow-nexus 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.
@@ -0,0 +1,194 @@
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 { NexusClient } from '../client/NexusClient.js';
6
+ /**
7
+ * Sonatype Nexus 3 Maven Repository Publisher.
8
+ *
9
+ * Endpoint format: PUT {server}/repository/{repoName}/{groupId-as-path}/{artifactId}/{version}/{filename}
10
+ * Typically used with repositories like "maven-releases" or "maven-snapshots".
11
+ */
12
+ export class NexusMavenPublisher extends BasePublisher {
13
+ id = 'nexus-maven';
14
+ name = 'Nexus 3 Maven Repository';
15
+ platform = 'nexus';
16
+ artifactType = 'maven';
17
+ priority = 20;
18
+ detect(registry) {
19
+ if (registry.type !== 'maven' && registry.type !== 'jar') {
20
+ return false;
21
+ }
22
+ const regName = (registry.name || '').toLowerCase();
23
+ if (regName === 'nexus' || regName.startsWith('nexus-')) {
24
+ return true;
25
+ }
26
+ const server = (registry.server || '').toLowerCase();
27
+ try {
28
+ const parsed = new URL(server.includes('://') ? server : `https://${server}`);
29
+ const host = parsed.hostname.toLowerCase();
30
+ // Exclude other known platforms
31
+ if (host === 'aliyun.com' ||
32
+ host.endsWith('.aliyun.com') ||
33
+ host.endsWith('.aliyuncs.com') ||
34
+ host === 'gitlab.com' ||
35
+ host.endsWith('.gitlab.com') ||
36
+ host === 'github.com' ||
37
+ host.endsWith('.github.com')) {
38
+ return false;
39
+ }
40
+ return host.includes('nexus') || parsed.pathname.includes('/repository/');
41
+ }
42
+ catch {
43
+ return false;
44
+ }
45
+ }
46
+ async login(registry, _options) {
47
+ const creds = this.resolveCredentials(registry);
48
+ if (!creds.token && (!creds.username || !creds.password)) {
49
+ this.log(` ℹ No auth credentials configured for Nexus Maven repository ${registry.server}`);
50
+ }
51
+ }
52
+ buildTargetRef(artifact, _registry) {
53
+ try {
54
+ const { groupId, artifactId, version } = resolveMavenArtifactFilenames(artifact, undefined, undefined, 'Nexus');
55
+ return `${groupId}:${artifactId}:${version}`;
56
+ }
57
+ catch {
58
+ const version = artifact.tags && artifact.tags.length > 0 ? artifact.tags[0] : '1.0.0';
59
+ return `${artifact.name}:${version}`;
60
+ }
61
+ }
62
+ async exists(artifact, registry, options) {
63
+ const creds = this.resolveCredentials(registry);
64
+ const client = new NexusClient({
65
+ baseUrl: registry.server,
66
+ username: creds.username,
67
+ password: creds.password,
68
+ token: creds.token,
69
+ timeoutMs: options?.timeoutMs
70
+ });
71
+ let jarPath = artifact.source;
72
+ if (jarPath) {
73
+ const stat = await fs.stat(jarPath).catch(() => null);
74
+ if (stat?.isDirectory()) {
75
+ const files = await fs.readdir(jarPath).catch(() => []);
76
+ const jarFile = files.find(f => isMavenArtifactFile(f));
77
+ if (jarFile) {
78
+ jarPath = path.join(jarPath, jarFile);
79
+ }
80
+ }
81
+ }
82
+ const { groupId, artifactId, version, jarFilename } = resolveMavenArtifactFilenames(artifact, jarPath, undefined, 'Nexus');
83
+ const defaultRepo = version.toUpperCase().endsWith('-SNAPSHOT') ? 'maven-snapshots' : 'maven-releases';
84
+ const repoName = registry.namespace?.trim() ||
85
+ registry.options?.repository?.trim() ||
86
+ registry.metadata?.repository?.trim() ||
87
+ defaultRepo;
88
+ const targetUrl = client.getMavenArtifactUrl(repoName, groupId, artifactId, version, jarFilename);
89
+ try {
90
+ const res = await client.request(targetUrl, { method: 'HEAD' });
91
+ if (res.ok || res.status === 200 || res.status === 204) {
92
+ return true;
93
+ }
94
+ if (res.status === 404) {
95
+ return false;
96
+ }
97
+ const err = await client.extractErrorMessage(res);
98
+ throw new Error(`Failed to check Maven artifact existence (${res.status}): ${err}`);
99
+ }
100
+ catch (err) {
101
+ if (err?.message?.includes('Failed to check Maven artifact existence')) {
102
+ throw err;
103
+ }
104
+ throw new Error(`Failed to check Maven artifact existence: ${client.maskSecrets(err?.message || String(err))}`);
105
+ }
106
+ }
107
+ async doPublish(artifact, registry, options) {
108
+ const creds = this.resolveCredentials(registry);
109
+ const client = new NexusClient({
110
+ baseUrl: registry.server,
111
+ username: creds.username,
112
+ password: creds.password,
113
+ token: creds.token,
114
+ timeoutMs: options?.timeoutMs
115
+ });
116
+ // Locate jar file
117
+ let jarPath = artifact.source;
118
+ const stat = await fs.stat(jarPath).catch(() => null);
119
+ if (stat?.isDirectory()) {
120
+ const files = await fs.readdir(jarPath);
121
+ const jarFile = files.find(f => isMavenArtifactFile(f));
122
+ if (!jarFile) {
123
+ throw new Error(`No jar/war artifact found in directory: ${jarPath}`);
124
+ }
125
+ jarPath = path.join(jarPath, jarFile);
126
+ }
127
+ const { groupId, artifactId, version, jarFilename, pomFilename } = resolveMavenArtifactFilenames(artifact, jarPath, undefined, 'Nexus');
128
+ const defaultRepo = version.toUpperCase().endsWith('-SNAPSHOT') ? 'maven-snapshots' : 'maven-releases';
129
+ const repoName = registry.namespace?.trim() ||
130
+ registry.options?.repository?.trim() ||
131
+ registry.metadata?.repository?.trim() ||
132
+ defaultRepo;
133
+ const jarBuffer = await fs.readFile(jarPath);
134
+ const digest = `sha256:${crypto.createHash('sha256').update(jarBuffer).digest('hex')}`;
135
+ const targetUrl = client.getMavenArtifactUrl(repoName, groupId, artifactId, version, jarFilename);
136
+ this.log(` 📤 Uploading Maven JAR to Nexus: ${client.maskSecrets(targetUrl)}`);
137
+ if (options?.dryRun) {
138
+ this.log(` [dryRun] Would PUT ${jarFilename} (${jarBuffer.length} bytes) to ${client.maskSecrets(targetUrl)}`);
139
+ return {
140
+ ref: `${groupId}:${artifactId}:${version}`,
141
+ digest,
142
+ metadata: { repoName, targetUrl, size: jarBuffer.length }
143
+ };
144
+ }
145
+ // The POM goes up first, deliberately.
146
+ //
147
+ // The existence probe checks for the jar/war, so uploading that last is what
148
+ // makes the probe mean "this artifact is complete". With the artifact first, a
149
+ // run that uploaded it and then failed on the POM would leave a coordinate that
150
+ // probes as present: the retry skips it as already published, and the POM never
151
+ // arrives — a jar in the repository forever, with no dependency information.
152
+ // Upload pom if exists
153
+ const pomPath = mavenPomPathFor(jarPath);
154
+ const pomStat = await fs.stat(pomPath).catch(() => null);
155
+ if (pomStat?.isFile()) {
156
+ const pomBuffer = await fs.readFile(pomPath);
157
+ const pomTargetUrl = client.getMavenArtifactUrl(repoName, groupId, artifactId, version, pomFilename);
158
+ this.log(` 📤 Uploading Maven POM to Nexus: ${client.maskSecrets(pomTargetUrl)}`);
159
+ const pomRes = await client.request(pomTargetUrl, {
160
+ method: 'PUT',
161
+ headers: { 'Content-Type': 'application/xml' },
162
+ body: pomBuffer
163
+ });
164
+ if (!pomRes.ok && pomRes.status !== 201 && pomRes.status !== 200) {
165
+ const pomErr = await client.extractErrorMessage(pomRes);
166
+ throw new Error(`Failed to upload Maven POM to Nexus (${pomRes.status}): ${pomErr}`);
167
+ }
168
+ }
169
+ const res = await client.request(targetUrl, {
170
+ method: 'PUT',
171
+ headers: {
172
+ 'Content-Type': 'application/java-archive'
173
+ },
174
+ body: jarBuffer
175
+ });
176
+ if (!res.ok && res.status !== 201 && res.status !== 200) {
177
+ const errText = await client.extractErrorMessage(res);
178
+ throw new Error(`Failed to upload Maven JAR to Nexus (${res.status}): ${errText}`);
179
+ }
180
+ return {
181
+ ref: `${groupId}:${artifactId}:${version}`,
182
+ digest,
183
+ metadata: {
184
+ groupId,
185
+ artifactId,
186
+ version,
187
+ repoName,
188
+ targetUrl,
189
+ size: jarBuffer.length
190
+ }
191
+ };
192
+ }
193
+ }
194
+ //# sourceMappingURL=NexusMavenPublisher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NexusMavenPublisher.js","sourceRoot":"","sources":["../../src/maven/NexusMavenPublisher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { BaseNpmPublisher } from '@ticatec/omniflow-artifact';
2
+ import type { RegistryConfig } from '@ticatec/omniflow-artifact';
3
+ /**
4
+ * Sonatype Nexus 3 NPM Package Registry Publisher.
5
+ *
6
+ * Endpoint format: {server}/repository/{repoName}/
7
+ * Typically used with repositories like "npm-hosted".
8
+ */
9
+ export declare class NexusNpmPublisher extends BaseNpmPublisher {
10
+ readonly id = "nexus-npm";
11
+ readonly name = "Nexus 3 NPM Repository";
12
+ readonly platform = "nexus";
13
+ readonly priority = 20;
14
+ detect(registry: RegistryConfig): boolean;
15
+ normalizeRegistryUrl(server: string, _registryOrNamespace?: RegistryConfig | string): string;
16
+ }
17
+ //# sourceMappingURL=NexusNpmPublisher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NexusNpmPublisher.d.ts","sourceRoot":"","sources":["../../src/npm/NexusNpmPublisher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAEhE;;;;;GAKG;AACH,qBAAa,iBAAkB,SAAQ,gBAAgB;IACrD,QAAQ,CAAC,EAAE,eAAc;IACzB,QAAQ,CAAC,IAAI,4BAA2B;IACxC,QAAQ,CAAC,QAAQ,WAAU;IAC3B,SAAkB,QAAQ,MAAK;IAEtB,MAAM,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO;IAkCzC,oBAAoB,CAC3B,MAAM,EAAE,MAAM,EACd,oBAAoB,CAAC,EAAE,cAAc,GAAG,MAAM,GAC7C,MAAM;CA2BV"}
@@ -0,0 +1,67 @@
1
+ import { BaseNpmPublisher } from '@ticatec/omniflow-artifact';
2
+ /**
3
+ * Sonatype Nexus 3 NPM Package Registry Publisher.
4
+ *
5
+ * Endpoint format: {server}/repository/{repoName}/
6
+ * Typically used with repositories like "npm-hosted".
7
+ */
8
+ export class NexusNpmPublisher extends BaseNpmPublisher {
9
+ id = 'nexus-npm';
10
+ name = 'Nexus 3 NPM Repository';
11
+ platform = 'nexus';
12
+ priority = 20;
13
+ detect(registry) {
14
+ if (registry.type !== 'npm') {
15
+ return false;
16
+ }
17
+ const regName = (registry.name || '').toLowerCase();
18
+ if (regName === 'nexus' || regName.startsWith('nexus-')) {
19
+ return true;
20
+ }
21
+ const server = (registry.server || '').toLowerCase();
22
+ try {
23
+ const parsed = new URL(server.includes('://') ? server : `https://${server}`);
24
+ const host = parsed.hostname.toLowerCase();
25
+ // Exclude other known platforms
26
+ if (host === 'aliyun.com' ||
27
+ host.endsWith('.aliyun.com') ||
28
+ host.endsWith('.aliyuncs.com') ||
29
+ host === 'gitlab.com' ||
30
+ host.endsWith('.gitlab.com') ||
31
+ host === 'github.com' ||
32
+ host.endsWith('.github.com')) {
33
+ return false;
34
+ }
35
+ return host.includes('nexus') || parsed.pathname.includes('/repository/');
36
+ }
37
+ catch {
38
+ return false;
39
+ }
40
+ }
41
+ normalizeRegistryUrl(server, _registryOrNamespace) {
42
+ let url = server.trim();
43
+ if (!/^https?:\/\//i.test(url)) {
44
+ url = `https://${url}`;
45
+ }
46
+ if (url.includes('/repository/')) {
47
+ return url.endsWith('/') ? url : `${url}/`;
48
+ }
49
+ let repoName;
50
+ if (typeof _registryOrNamespace === 'string') {
51
+ repoName = _registryOrNamespace.trim();
52
+ }
53
+ else if (_registryOrNamespace && typeof _registryOrNamespace === 'object') {
54
+ const reg = _registryOrNamespace;
55
+ repoName =
56
+ reg.namespace?.trim() ||
57
+ reg.options?.repository?.trim() ||
58
+ reg.options?.repoName?.trim() ||
59
+ reg.metadata?.repository?.trim() ||
60
+ reg.metadata?.repoName?.trim();
61
+ }
62
+ const cleanBase = url.replace(/\/+$/, '');
63
+ const targetRepo = repoName ? repoName.replace(/^\/+/, '').replace(/\/+$/, '') : 'npm-hosted';
64
+ return `${cleanBase}/repository/${targetRepo}/`;
65
+ }
66
+ }
67
+ //# sourceMappingURL=NexusNpmPublisher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NexusNpmPublisher.js","sourceRoot":"","sources":["../../src/npm/NexusNpmPublisher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { BasePublisher } from '@ticatec/omniflow-artifact';
2
+ import type { ArtifactPayload, DownloadOptions, DownloadResult, PublishOptions, RegistryConfig } from '@ticatec/omniflow-artifact';
3
+ /**
4
+ * Sonatype Nexus 3 Raw (Generic) Package Repository Publisher.
5
+ *
6
+ * Publishes arbitrary binary artifacts, tarballs (.tar.gz), or zip files
7
+ * to Nexus "raw (hosted)" repositories.
8
+ * Endpoint format: PUT {server}/repository/{repoName}/{path}/{filename}
9
+ */
10
+ export declare class NexusRawPublisher extends BasePublisher {
11
+ readonly id = "nexus-raw";
12
+ readonly name = "Nexus 3 Raw Repository";
13
+ readonly platform = "nexus";
14
+ readonly artifactType = "generic";
15
+ readonly priority = 20;
16
+ detect(registry: RegistryConfig): boolean;
17
+ buildTargetRef(artifact: ArtifactPayload, registry: RegistryConfig): string;
18
+ login(registry: RegistryConfig, _options?: PublishOptions): Promise<void>;
19
+ exists(artifact: ArtifactPayload, registry: RegistryConfig, options?: PublishOptions): Promise<boolean>;
20
+ download(artifact: ArtifactPayload, registry: RegistryConfig, dest: string, options?: DownloadOptions): Promise<DownloadResult>;
21
+ protected doPublish(artifact: ArtifactPayload, registry: RegistryConfig, options?: PublishOptions): Promise<{
22
+ ref: string;
23
+ digest?: string;
24
+ metadata?: Record<string, unknown>;
25
+ }>;
26
+ }
27
+ export { NexusRawPublisher as NexusGenericPublisher };
28
+ //# sourceMappingURL=NexusRawPublisher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NexusRawPublisher.d.ts","sourceRoot":"","sources":["../../src/raw/NexusRawPublisher.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAGlI;;;;;;GAMG;AACH,qBAAa,iBAAkB,SAAQ,aAAa;IAClD,QAAQ,CAAC,EAAE,eAAc;IACzB,QAAQ,CAAC,IAAI,4BAA2B;IACxC,QAAQ,CAAC,QAAQ,WAAU;IAC3B,QAAQ,CAAC,YAAY,aAAY;IACjC,SAAkB,QAAQ,MAAK;IAEtB,MAAM,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO;IAkCzC,cAAc,CAAC,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,cAAc,GAAG,MAAM;IAW9E,KAAK,CAAC,QAAQ,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAOhE,MAAM,CACnB,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,cAAc,EACxB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,OAAO,CAAC;IAoCJ,QAAQ,CACrB,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,cAAc,CAAC;cAwBV,SAAS,CACvB,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,cAAc,EACxB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC;QACT,GAAG,EAAE,MAAM,CAAA;QACX,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KACnC,CAAC;CA+DH;AAGD,OAAO,EAAE,iBAAiB,IAAI,qBAAqB,EAAE,CAAA"}
@@ -0,0 +1,174 @@
1
+ import { promises as fs } from 'fs';
2
+ import path from 'path';
3
+ import crypto from 'crypto';
4
+ import { BasePublisher } from '@ticatec/omniflow-artifact';
5
+ import { NexusClient } from '../client/NexusClient.js';
6
+ /**
7
+ * Sonatype Nexus 3 Raw (Generic) Package Repository Publisher.
8
+ *
9
+ * Publishes arbitrary binary artifacts, tarballs (.tar.gz), or zip files
10
+ * to Nexus "raw (hosted)" repositories.
11
+ * Endpoint format: PUT {server}/repository/{repoName}/{path}/{filename}
12
+ */
13
+ export class NexusRawPublisher extends BasePublisher {
14
+ id = 'nexus-raw';
15
+ name = 'Nexus 3 Raw Repository';
16
+ platform = 'nexus';
17
+ artifactType = 'generic';
18
+ priority = 20;
19
+ detect(registry) {
20
+ if (registry.type !== 'generic' && registry.type !== 'raw' && registry.type !== 'archive') {
21
+ return false;
22
+ }
23
+ const regName = (registry.name || '').toLowerCase();
24
+ if (regName === 'nexus' || regName.startsWith('nexus-') || regName === 'nexus-raw') {
25
+ return true;
26
+ }
27
+ const server = (registry.server || '').toLowerCase();
28
+ try {
29
+ const parsed = new URL(server.includes('://') ? server : `https://${server}`);
30
+ const host = parsed.hostname.toLowerCase();
31
+ // Exclude other known platforms
32
+ if (host === 'aliyun.com' ||
33
+ host.endsWith('.aliyun.com') ||
34
+ host.endsWith('.aliyuncs.com') ||
35
+ host === 'gitlab.com' ||
36
+ host.endsWith('.gitlab.com') ||
37
+ host === 'github.com' ||
38
+ host.endsWith('.github.com')) {
39
+ return false;
40
+ }
41
+ return host.includes('nexus') || parsed.pathname.includes('/repository/raw');
42
+ }
43
+ catch {
44
+ return false;
45
+ }
46
+ }
47
+ buildTargetRef(artifact, registry) {
48
+ const repoName = registry.namespace?.trim() ||
49
+ registry.options?.repository?.trim() ||
50
+ registry.metadata?.repository?.trim() ||
51
+ 'raw-hosted';
52
+ const version = artifact.tags && artifact.tags.length > 0 ? artifact.tags[0] : 'latest';
53
+ const filename = artifact.source ? path.basename(artifact.source) : artifact.name;
54
+ return `${repoName}/${artifact.name}/${version}/${filename}`;
55
+ }
56
+ async login(registry, _options) {
57
+ const creds = this.resolveCredentials(registry);
58
+ if (!creds.token && (!creds.username || !creds.password)) {
59
+ this.log(` ℹ No auth credentials configured for Nexus Raw repository ${registry.server}`);
60
+ }
61
+ }
62
+ async exists(artifact, registry, options) {
63
+ const creds = this.resolveCredentials(registry);
64
+ const client = new NexusClient({
65
+ baseUrl: registry.server,
66
+ username: creds.username,
67
+ password: creds.password,
68
+ token: creds.token,
69
+ timeoutMs: options?.timeoutMs
70
+ });
71
+ const repoName = registry.namespace || 'raw-hosted';
72
+ const version = artifact.tags && artifact.tags.length > 0 ? artifact.tags[0] : 'latest';
73
+ const packageName = artifact.name;
74
+ const filename = artifact.source ? path.basename(artifact.source) : artifact.name;
75
+ const subpath = `${packageName}/${version}`;
76
+ const targetUrl = client.getRawArtifactUrl(repoName, subpath, filename);
77
+ try {
78
+ const res = await client.request(targetUrl, { method: 'HEAD' });
79
+ if (res.ok || res.status === 200 || res.status === 204) {
80
+ return true;
81
+ }
82
+ if (res.status === 404) {
83
+ return false;
84
+ }
85
+ const err = await client.extractErrorMessage(res);
86
+ throw new Error(`Failed to check Raw package existence (${res.status}): ${err}`);
87
+ }
88
+ catch (err) {
89
+ if (err?.message?.includes('Failed to check Raw package existence')) {
90
+ throw err;
91
+ }
92
+ throw new Error(`Failed to check Raw package existence: ${client.maskSecrets(err?.message || String(err))}`);
93
+ }
94
+ }
95
+ async download(artifact, registry, dest, options) {
96
+ const creds = this.resolveCredentials(registry);
97
+ const client = new NexusClient({
98
+ baseUrl: registry.server,
99
+ username: creds.username,
100
+ password: creds.password,
101
+ token: creds.token,
102
+ timeoutMs: options?.timeoutMs
103
+ });
104
+ const repoName = registry.namespace || 'raw-hosted';
105
+ const version = artifact.tags?.[0] || 'latest';
106
+ const filename = artifact.source ? path.basename(artifact.source) : artifact.name;
107
+ const targetUrl = client.getRawArtifactUrl(repoName, `${artifact.name}/${version}`, filename);
108
+ const masked = client.maskSecrets(targetUrl);
109
+ this.log(` 📥 Downloading ${artifact.name} ${version} from Nexus: ${masked}`);
110
+ const res = await client.request(targetUrl, { method: 'GET' });
111
+ if (!res.ok) {
112
+ throw await this.downloadError(res, `${artifact.name} ${version} (${filename})`, masked);
113
+ }
114
+ return this.saveResponse(res, dest, masked);
115
+ }
116
+ async doPublish(artifact, registry, options) {
117
+ const creds = this.resolveCredentials(registry);
118
+ const client = new NexusClient({
119
+ baseUrl: registry.server,
120
+ username: creds.username,
121
+ password: creds.password,
122
+ token: creds.token,
123
+ timeoutMs: options?.timeoutMs
124
+ });
125
+ const repoName = registry.namespace || 'raw-hosted';
126
+ const version = artifact.tags && artifact.tags.length > 0 ? artifact.tags[0] : 'latest';
127
+ const packageName = artifact.name;
128
+ let filePath = artifact.source;
129
+ const stat = await fs.stat(filePath).catch(() => null);
130
+ if (!stat || !stat.isFile()) {
131
+ throw new Error(`Nexus Raw artifact source must be an existing file: ${filePath}`);
132
+ }
133
+ const filename = path.basename(filePath);
134
+ const fileBuffer = await fs.readFile(filePath);
135
+ const digest = `sha256:${crypto.createHash('sha256').update(fileBuffer).digest('hex')}`;
136
+ const subpath = `${packageName}/${version}`;
137
+ const targetUrl = client.getRawArtifactUrl(repoName, subpath, filename);
138
+ this.log(` 📤 Uploading Raw package file to Nexus: ${client.maskSecrets(targetUrl)}`);
139
+ if (options?.dryRun) {
140
+ this.log(` [dryRun] Would PUT ${filename} (${fileBuffer.length} bytes) to ${client.maskSecrets(targetUrl)}`);
141
+ return {
142
+ ref: `${repoName}/${subpath}/${filename}`,
143
+ digest,
144
+ metadata: { repoName, subpath, filename, targetUrl, size: fileBuffer.length }
145
+ };
146
+ }
147
+ const res = await client.request(targetUrl, {
148
+ method: 'PUT',
149
+ headers: {
150
+ 'Content-Type': 'application/octet-stream'
151
+ },
152
+ body: fileBuffer
153
+ });
154
+ if (!res.ok && res.status !== 201 && res.status !== 200) {
155
+ const errText = await client.extractErrorMessage(res);
156
+ throw new Error(`Failed to upload Raw package to Nexus (${res.status}): ${errText}`);
157
+ }
158
+ return {
159
+ ref: `${repoName}/${subpath}/${filename}`,
160
+ digest,
161
+ metadata: {
162
+ repoName,
163
+ packageName,
164
+ version,
165
+ filename,
166
+ targetUrl,
167
+ size: fileBuffer.length
168
+ }
169
+ };
170
+ }
171
+ }
172
+ // Convenient alias
173
+ export { NexusRawPublisher as NexusGenericPublisher };
174
+ //# sourceMappingURL=NexusRawPublisher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NexusRawPublisher.js","sourceRoot":"","sources":["../../src/raw/NexusRawPublisher.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@ticatec/omniflow-nexus",
3
+ "version": "1.0.0",
4
+ "description": "Sonatype Nexus 3 artifact repository driver for OmniFlow: Maven, NPM, Docker, and Raw generic packages",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "license": "MIT",
15
+ "dependencies": {
16
+ "@ticatec/omniflow-artifact": "^1.0.0",
17
+ "@ticatec/omniflow-core": "^1.0.0"
18
+ },
19
+ "devDependencies": {
20
+ "@jest/globals": "^30.4.1",
21
+ "@types/jest": "^30.0.0",
22
+ "@types/node": "^22.10.2",
23
+ "jest": "^30.4.2",
24
+ "ts-jest": "^29.4.9",
25
+ "typescript": "^5.7.2"
26
+ },
27
+ "engines": {
28
+ "node": ">=20.0.0"
29
+ },
30
+ "files": [
31
+ "dist",
32
+ "src",
33
+ "README.md",
34
+ "README_CN.md",
35
+ "LICENSE"
36
+ ],
37
+ "publishConfig": {
38
+ "access": "public"
39
+ },
40
+ "scripts": {
41
+ "build": "tsc",
42
+ "clean": "rm -rf dist",
43
+ "prebuild": "npm run clean",
44
+ "test": "NODE_OPTIONS=--experimental-vm-modules jest",
45
+ "typecheck": "tsc --noEmit",
46
+ "publish:npm": "pnpm publish --access public --no-git-checks"
47
+ }
48
+ }