@push.rocks/smartregistry 1.1.1 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/cargo/classes.cargoregistry.d.ts +79 -0
- package/dist_ts/cargo/classes.cargoregistry.js +490 -0
- package/dist_ts/cargo/index.d.ts +5 -0
- package/dist_ts/cargo/index.js +6 -0
- package/dist_ts/cargo/interfaces.cargo.d.ts +160 -0
- package/dist_ts/cargo/interfaces.cargo.js +6 -0
- package/dist_ts/classes.smartregistry.d.ts +2 -2
- package/dist_ts/classes.smartregistry.js +50 -2
- package/dist_ts/composer/classes.composerregistry.d.ts +26 -0
- package/dist_ts/composer/classes.composerregistry.js +366 -0
- package/dist_ts/composer/helpers.composer.d.ts +35 -0
- package/dist_ts/composer/helpers.composer.js +120 -0
- package/dist_ts/composer/index.d.ts +7 -0
- package/dist_ts/composer/index.js +8 -0
- package/dist_ts/composer/interfaces.composer.d.ts +102 -0
- package/dist_ts/composer/interfaces.composer.js +6 -0
- package/dist_ts/core/classes.authmanager.d.ts +46 -1
- package/dist_ts/core/classes.authmanager.js +121 -12
- package/dist_ts/core/classes.registrystorage.d.ts +103 -0
- package/dist_ts/core/classes.registrystorage.js +253 -1
- package/dist_ts/core/interfaces.core.d.ts +4 -1
- package/dist_ts/index.d.ts +4 -1
- package/dist_ts/index.js +8 -2
- package/dist_ts/maven/classes.mavenregistry.d.ts +35 -0
- package/dist_ts/maven/classes.mavenregistry.js +407 -0
- package/dist_ts/maven/helpers.maven.d.ts +68 -0
- package/dist_ts/maven/helpers.maven.js +286 -0
- package/dist_ts/maven/index.d.ts +6 -0
- package/dist_ts/maven/index.js +7 -0
- package/dist_ts/maven/interfaces.maven.d.ts +116 -0
- package/dist_ts/maven/interfaces.maven.js +6 -0
- package/package.json +3 -2
- package/readme.md +288 -14
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/cargo/classes.cargoregistry.ts +604 -0
- package/ts/cargo/index.ts +6 -0
- package/ts/cargo/interfaces.cargo.ts +169 -0
- package/ts/classes.smartregistry.ts +56 -2
- package/ts/composer/classes.composerregistry.ts +475 -0
- package/ts/composer/helpers.composer.ts +139 -0
- package/ts/composer/index.ts +8 -0
- package/ts/composer/interfaces.composer.ts +111 -0
- package/ts/core/classes.authmanager.ts +145 -12
- package/ts/core/classes.registrystorage.ts +334 -0
- package/ts/core/interfaces.core.ts +4 -1
- package/ts/index.ts +10 -1
- package/ts/maven/classes.mavenregistry.ts +580 -0
- package/ts/maven/helpers.maven.ts +346 -0
- package/ts/maven/index.ts +7 -0
- package/ts/maven/interfaces.maven.ts +127 -0
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Composer Registry Implementation
|
|
3
|
+
* Compliant with Composer v2 repository API
|
|
4
|
+
*/
|
|
5
|
+
import { BaseRegistry } from '../core/classes.baseregistry.js';
|
|
6
|
+
import { normalizeVersion, validateComposerJson, extractComposerJsonFromZip, calculateSha1, parseVendorPackage, generatePackagesJson, sortVersions, } from './helpers.composer.js';
|
|
7
|
+
export class ComposerRegistry extends BaseRegistry {
|
|
8
|
+
storage;
|
|
9
|
+
authManager;
|
|
10
|
+
basePath = '/composer';
|
|
11
|
+
registryUrl;
|
|
12
|
+
constructor(storage, authManager, basePath = '/composer', registryUrl = 'http://localhost:5000/composer') {
|
|
13
|
+
super();
|
|
14
|
+
this.storage = storage;
|
|
15
|
+
this.authManager = authManager;
|
|
16
|
+
this.basePath = basePath;
|
|
17
|
+
this.registryUrl = registryUrl;
|
|
18
|
+
}
|
|
19
|
+
async init() {
|
|
20
|
+
// Composer registry initialization
|
|
21
|
+
}
|
|
22
|
+
getBasePath() {
|
|
23
|
+
return this.basePath;
|
|
24
|
+
}
|
|
25
|
+
async handleRequest(context) {
|
|
26
|
+
const path = context.path.replace(this.basePath, '');
|
|
27
|
+
// Extract token from Authorization header
|
|
28
|
+
const authHeader = context.headers['authorization'] || context.headers['Authorization'];
|
|
29
|
+
let token = null;
|
|
30
|
+
if (authHeader) {
|
|
31
|
+
if (authHeader.startsWith('Bearer ')) {
|
|
32
|
+
const tokenString = authHeader.replace(/^Bearer\s+/i, '');
|
|
33
|
+
token = await this.authManager.validateToken(tokenString, 'composer');
|
|
34
|
+
}
|
|
35
|
+
else if (authHeader.startsWith('Basic ')) {
|
|
36
|
+
// Handle HTTP Basic Auth
|
|
37
|
+
const credentials = Buffer.from(authHeader.replace(/^Basic\s+/i, ''), 'base64').toString('utf-8');
|
|
38
|
+
const [username, password] = credentials.split(':');
|
|
39
|
+
const userId = await this.authManager.authenticate({ username, password });
|
|
40
|
+
if (userId) {
|
|
41
|
+
// Create temporary token for this request
|
|
42
|
+
token = {
|
|
43
|
+
type: 'composer',
|
|
44
|
+
userId,
|
|
45
|
+
scopes: ['composer:*:*:read'],
|
|
46
|
+
readonly: true,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Root packages.json
|
|
52
|
+
if (path === '/packages.json' || path === '' || path === '/') {
|
|
53
|
+
return this.handlePackagesJson();
|
|
54
|
+
}
|
|
55
|
+
// Package metadata: /p2/{vendor}/{package}.json or /p2/{vendor}/{package}~dev.json
|
|
56
|
+
const metadataMatch = path.match(/^\/p2\/([^\/]+\/[^\/]+?)(~dev)?\.json$/);
|
|
57
|
+
if (metadataMatch) {
|
|
58
|
+
const [, vendorPackage, devSuffix] = metadataMatch;
|
|
59
|
+
const includeDev = !!devSuffix;
|
|
60
|
+
return this.handlePackageMetadata(vendorPackage, includeDev, token);
|
|
61
|
+
}
|
|
62
|
+
// Package list: /packages/list.json?filter=vendor/*
|
|
63
|
+
if (path.startsWith('/packages/list.json')) {
|
|
64
|
+
const filter = context.query['filter'];
|
|
65
|
+
return this.handlePackageList(filter, token);
|
|
66
|
+
}
|
|
67
|
+
// Package ZIP download: /dists/{vendor}/{package}/{reference}.zip
|
|
68
|
+
const distMatch = path.match(/^\/dists\/([^\/]+\/[^\/]+)\/([^\/]+)\.zip$/);
|
|
69
|
+
if (distMatch) {
|
|
70
|
+
const [, vendorPackage, reference] = distMatch;
|
|
71
|
+
return this.handlePackageDownload(vendorPackage, reference, token);
|
|
72
|
+
}
|
|
73
|
+
// Package upload: PUT /packages/{vendor}/{package}
|
|
74
|
+
const uploadMatch = path.match(/^\/packages\/([^\/]+\/[^\/]+)$/);
|
|
75
|
+
if (uploadMatch && context.method === 'PUT') {
|
|
76
|
+
const vendorPackage = uploadMatch[1];
|
|
77
|
+
return this.handlePackageUpload(vendorPackage, context.body, token);
|
|
78
|
+
}
|
|
79
|
+
// Package delete: DELETE /packages/{vendor}/{package}
|
|
80
|
+
if (uploadMatch && context.method === 'DELETE') {
|
|
81
|
+
const vendorPackage = uploadMatch[1];
|
|
82
|
+
return this.handlePackageDelete(vendorPackage, token);
|
|
83
|
+
}
|
|
84
|
+
// Version delete: DELETE /packages/{vendor}/{package}/{version}
|
|
85
|
+
const versionDeleteMatch = path.match(/^\/packages\/([^\/]+\/[^\/]+)\/(.+)$/);
|
|
86
|
+
if (versionDeleteMatch && context.method === 'DELETE') {
|
|
87
|
+
const [, vendorPackage, version] = versionDeleteMatch;
|
|
88
|
+
return this.handleVersionDelete(vendorPackage, version, token);
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
status: 404,
|
|
92
|
+
headers: { 'Content-Type': 'application/json' },
|
|
93
|
+
body: { status: 'error', message: 'Not found' },
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
async checkPermission(token, resource, action) {
|
|
97
|
+
if (!token)
|
|
98
|
+
return false;
|
|
99
|
+
return this.authManager.authorize(token, `composer:package:${resource}`, action);
|
|
100
|
+
}
|
|
101
|
+
// ========================================================================
|
|
102
|
+
// REQUEST HANDLERS
|
|
103
|
+
// ========================================================================
|
|
104
|
+
async handlePackagesJson() {
|
|
105
|
+
const availablePackages = await this.storage.listComposerPackages();
|
|
106
|
+
const packagesJson = generatePackagesJson(this.registryUrl, availablePackages);
|
|
107
|
+
return {
|
|
108
|
+
status: 200,
|
|
109
|
+
headers: { 'Content-Type': 'application/json' },
|
|
110
|
+
body: packagesJson,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
async handlePackageMetadata(vendorPackage, includeDev, token) {
|
|
114
|
+
// Check read permission
|
|
115
|
+
if (!await this.checkPermission(token, vendorPackage, 'read')) {
|
|
116
|
+
return {
|
|
117
|
+
status: 401,
|
|
118
|
+
headers: { 'WWW-Authenticate': 'Bearer realm="composer"' },
|
|
119
|
+
body: { status: 'error', message: 'Authentication required' },
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
const metadata = await this.storage.getComposerPackageMetadata(vendorPackage);
|
|
123
|
+
if (!metadata) {
|
|
124
|
+
return {
|
|
125
|
+
status: 404,
|
|
126
|
+
headers: { 'Content-Type': 'application/json' },
|
|
127
|
+
body: { status: 'error', message: 'Package not found' },
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
// Filter dev versions if needed
|
|
131
|
+
let packages = metadata.packages[vendorPackage] || [];
|
|
132
|
+
if (!includeDev) {
|
|
133
|
+
packages = packages.filter((pkg) => !pkg.version.includes('dev') && !pkg.version.includes('alpha') && !pkg.version.includes('beta'));
|
|
134
|
+
}
|
|
135
|
+
const response = {
|
|
136
|
+
minified: 'composer/2.0',
|
|
137
|
+
packages: {
|
|
138
|
+
[vendorPackage]: packages,
|
|
139
|
+
},
|
|
140
|
+
};
|
|
141
|
+
return {
|
|
142
|
+
status: 200,
|
|
143
|
+
headers: {
|
|
144
|
+
'Content-Type': 'application/json',
|
|
145
|
+
'Last-Modified': metadata.lastModified || new Date().toUTCString(),
|
|
146
|
+
},
|
|
147
|
+
body: response,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
async handlePackageList(filter, token) {
|
|
151
|
+
let packages = await this.storage.listComposerPackages();
|
|
152
|
+
// Apply filter if provided
|
|
153
|
+
if (filter) {
|
|
154
|
+
const regex = new RegExp('^' + filter.replace(/\*/g, '.*') + '$');
|
|
155
|
+
packages = packages.filter(pkg => regex.test(pkg));
|
|
156
|
+
}
|
|
157
|
+
return {
|
|
158
|
+
status: 200,
|
|
159
|
+
headers: { 'Content-Type': 'application/json' },
|
|
160
|
+
body: { packageNames: packages },
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
async handlePackageDownload(vendorPackage, reference, token) {
|
|
164
|
+
// Check read permission
|
|
165
|
+
if (!await this.checkPermission(token, vendorPackage, 'read')) {
|
|
166
|
+
return {
|
|
167
|
+
status: 401,
|
|
168
|
+
headers: { 'WWW-Authenticate': 'Bearer realm="composer"' },
|
|
169
|
+
body: { status: 'error', message: 'Authentication required' },
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
const zipData = await this.storage.getComposerPackageZip(vendorPackage, reference);
|
|
173
|
+
if (!zipData) {
|
|
174
|
+
return {
|
|
175
|
+
status: 404,
|
|
176
|
+
headers: {},
|
|
177
|
+
body: { status: 'error', message: 'Package file not found' },
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
return {
|
|
181
|
+
status: 200,
|
|
182
|
+
headers: {
|
|
183
|
+
'Content-Type': 'application/zip',
|
|
184
|
+
'Content-Length': zipData.length.toString(),
|
|
185
|
+
'Content-Disposition': `attachment; filename="${reference}.zip"`,
|
|
186
|
+
},
|
|
187
|
+
body: zipData,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
async handlePackageUpload(vendorPackage, body, token) {
|
|
191
|
+
// Check write permission
|
|
192
|
+
if (!await this.checkPermission(token, vendorPackage, 'write')) {
|
|
193
|
+
return {
|
|
194
|
+
status: 401,
|
|
195
|
+
headers: {},
|
|
196
|
+
body: { status: 'error', message: 'Write permission required' },
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
if (!body || !Buffer.isBuffer(body)) {
|
|
200
|
+
return {
|
|
201
|
+
status: 400,
|
|
202
|
+
headers: {},
|
|
203
|
+
body: { status: 'error', message: 'ZIP file required' },
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
// Extract and validate composer.json from ZIP
|
|
207
|
+
const composerJson = await extractComposerJsonFromZip(body);
|
|
208
|
+
if (!composerJson || !validateComposerJson(composerJson)) {
|
|
209
|
+
return {
|
|
210
|
+
status: 400,
|
|
211
|
+
headers: {},
|
|
212
|
+
body: { status: 'error', message: 'Invalid composer.json in ZIP' },
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
// Verify package name matches
|
|
216
|
+
if (composerJson.name !== vendorPackage) {
|
|
217
|
+
return {
|
|
218
|
+
status: 400,
|
|
219
|
+
headers: {},
|
|
220
|
+
body: { status: 'error', message: 'Package name mismatch' },
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
const version = composerJson.version;
|
|
224
|
+
if (!version) {
|
|
225
|
+
return {
|
|
226
|
+
status: 400,
|
|
227
|
+
headers: {},
|
|
228
|
+
body: { status: 'error', message: 'Version required in composer.json' },
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
// Calculate SHA-1 hash
|
|
232
|
+
const shasum = await calculateSha1(body);
|
|
233
|
+
// Generate reference (use version or commit hash)
|
|
234
|
+
const reference = composerJson.source?.reference || version.replace(/[^a-zA-Z0-9.-]/g, '-');
|
|
235
|
+
// Store ZIP file
|
|
236
|
+
await this.storage.putComposerPackageZip(vendorPackage, reference, body);
|
|
237
|
+
// Get or create metadata
|
|
238
|
+
let metadata = await this.storage.getComposerPackageMetadata(vendorPackage);
|
|
239
|
+
if (!metadata) {
|
|
240
|
+
metadata = {
|
|
241
|
+
packages: {
|
|
242
|
+
[vendorPackage]: [],
|
|
243
|
+
},
|
|
244
|
+
lastModified: new Date().toUTCString(),
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
// Build package entry
|
|
248
|
+
const packageEntry = {
|
|
249
|
+
...composerJson,
|
|
250
|
+
version_normalized: normalizeVersion(version),
|
|
251
|
+
dist: {
|
|
252
|
+
type: 'zip',
|
|
253
|
+
url: `${this.registryUrl}/dists/${vendorPackage}/${reference}.zip`,
|
|
254
|
+
reference,
|
|
255
|
+
shasum,
|
|
256
|
+
},
|
|
257
|
+
time: new Date().toISOString(),
|
|
258
|
+
};
|
|
259
|
+
// Add to metadata (check if version already exists)
|
|
260
|
+
const packages = metadata.packages[vendorPackage] || [];
|
|
261
|
+
const existingIndex = packages.findIndex((p) => p.version === version);
|
|
262
|
+
if (existingIndex >= 0) {
|
|
263
|
+
return {
|
|
264
|
+
status: 409,
|
|
265
|
+
headers: {},
|
|
266
|
+
body: { status: 'error', message: 'Version already exists' },
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
packages.push(packageEntry);
|
|
270
|
+
// Sort by version
|
|
271
|
+
const sortedVersions = sortVersions(packages.map((p) => p.version));
|
|
272
|
+
packages.sort((a, b) => {
|
|
273
|
+
return sortedVersions.indexOf(a.version) - sortedVersions.indexOf(b.version);
|
|
274
|
+
});
|
|
275
|
+
metadata.packages[vendorPackage] = packages;
|
|
276
|
+
metadata.lastModified = new Date().toUTCString();
|
|
277
|
+
// Store updated metadata
|
|
278
|
+
await this.storage.putComposerPackageMetadata(vendorPackage, metadata);
|
|
279
|
+
return {
|
|
280
|
+
status: 201,
|
|
281
|
+
headers: {},
|
|
282
|
+
body: {
|
|
283
|
+
status: 'success',
|
|
284
|
+
message: 'Package uploaded successfully',
|
|
285
|
+
package: vendorPackage,
|
|
286
|
+
version,
|
|
287
|
+
},
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
async handlePackageDelete(vendorPackage, token) {
|
|
291
|
+
// Check delete permission
|
|
292
|
+
if (!await this.checkPermission(token, vendorPackage, 'delete')) {
|
|
293
|
+
return {
|
|
294
|
+
status: 401,
|
|
295
|
+
headers: {},
|
|
296
|
+
body: { status: 'error', message: 'Delete permission required' },
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
const metadata = await this.storage.getComposerPackageMetadata(vendorPackage);
|
|
300
|
+
if (!metadata) {
|
|
301
|
+
return {
|
|
302
|
+
status: 404,
|
|
303
|
+
headers: {},
|
|
304
|
+
body: { status: 'error', message: 'Package not found' },
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
// Delete all ZIP files
|
|
308
|
+
const packages = metadata.packages[vendorPackage] || [];
|
|
309
|
+
for (const pkg of packages) {
|
|
310
|
+
if (pkg.dist?.reference) {
|
|
311
|
+
await this.storage.deleteComposerPackageZip(vendorPackage, pkg.dist.reference);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
// Delete metadata
|
|
315
|
+
await this.storage.deleteComposerPackageMetadata(vendorPackage);
|
|
316
|
+
return {
|
|
317
|
+
status: 204,
|
|
318
|
+
headers: {},
|
|
319
|
+
body: null,
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
async handleVersionDelete(vendorPackage, version, token) {
|
|
323
|
+
// Check delete permission
|
|
324
|
+
if (!await this.checkPermission(token, vendorPackage, 'delete')) {
|
|
325
|
+
return {
|
|
326
|
+
status: 401,
|
|
327
|
+
headers: {},
|
|
328
|
+
body: { status: 'error', message: 'Delete permission required' },
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
const metadata = await this.storage.getComposerPackageMetadata(vendorPackage);
|
|
332
|
+
if (!metadata) {
|
|
333
|
+
return {
|
|
334
|
+
status: 404,
|
|
335
|
+
headers: {},
|
|
336
|
+
body: { status: 'error', message: 'Package not found' },
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
const packages = metadata.packages[vendorPackage] || [];
|
|
340
|
+
const versionIndex = packages.findIndex((p) => p.version === version);
|
|
341
|
+
if (versionIndex === -1) {
|
|
342
|
+
return {
|
|
343
|
+
status: 404,
|
|
344
|
+
headers: {},
|
|
345
|
+
body: { status: 'error', message: 'Version not found' },
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
// Delete ZIP file
|
|
349
|
+
const pkg = packages[versionIndex];
|
|
350
|
+
if (pkg.dist?.reference) {
|
|
351
|
+
await this.storage.deleteComposerPackageZip(vendorPackage, pkg.dist.reference);
|
|
352
|
+
}
|
|
353
|
+
// Remove from metadata
|
|
354
|
+
packages.splice(versionIndex, 1);
|
|
355
|
+
metadata.packages[vendorPackage] = packages;
|
|
356
|
+
metadata.lastModified = new Date().toUTCString();
|
|
357
|
+
// Save updated metadata
|
|
358
|
+
await this.storage.putComposerPackageMetadata(vendorPackage, metadata);
|
|
359
|
+
return {
|
|
360
|
+
status: 204,
|
|
361
|
+
headers: {},
|
|
362
|
+
body: null,
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jb21wb3NlcnJlZ2lzdHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvY29tcG9zZXIvY2xhc3Nlcy5jb21wb3NlcnJlZ2lzdHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQVMvRCxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLG9CQUFvQixFQUNwQiwwQkFBMEIsRUFDMUIsYUFBYSxFQUNiLGtCQUFrQixFQUNsQixvQkFBb0IsRUFDcEIsWUFBWSxHQUNiLE1BQU0sdUJBQXVCLENBQUM7QUFFL0IsTUFBTSxPQUFPLGdCQUFpQixTQUFRLFlBQVk7SUFDeEMsT0FBTyxDQUFrQjtJQUN6QixXQUFXLENBQWM7SUFDekIsUUFBUSxHQUFXLFdBQVcsQ0FBQztJQUMvQixXQUFXLENBQVM7SUFFNUIsWUFDRSxPQUF3QixFQUN4QixXQUF3QixFQUN4QixXQUFtQixXQUFXLEVBQzlCLGNBQXNCLGdDQUFnQztRQUV0RCxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0lBQ2pDLENBQUM7SUFFTSxLQUFLLENBQUMsSUFBSTtRQUNmLG1DQUFtQztJQUNyQyxDQUFDO0lBRU0sV0FBVztRQUNoQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVNLEtBQUssQ0FBQyxhQUFhLENBQUMsT0FBd0I7UUFDakQsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVyRCwwQ0FBMEM7UUFDMUMs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
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Composer Registry Helper Functions
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Normalize version string to Composer format
|
|
6
|
+
* Example: "1.0.0" -> "1.0.0.0", "v2.3.1" -> "2.3.1.0"
|
|
7
|
+
*/
|
|
8
|
+
export declare function normalizeVersion(version: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* Validate composer.json structure
|
|
11
|
+
*/
|
|
12
|
+
export declare function validateComposerJson(composerJson: any): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Extract composer.json from ZIP buffer
|
|
15
|
+
*/
|
|
16
|
+
export declare function extractComposerJsonFromZip(zipBuffer: Buffer): Promise<any | null>;
|
|
17
|
+
/**
|
|
18
|
+
* Calculate SHA-1 hash for ZIP file
|
|
19
|
+
*/
|
|
20
|
+
export declare function calculateSha1(data: Buffer): Promise<string>;
|
|
21
|
+
/**
|
|
22
|
+
* Parse vendor/package format
|
|
23
|
+
*/
|
|
24
|
+
export declare function parseVendorPackage(name: string): {
|
|
25
|
+
vendor: string;
|
|
26
|
+
package: string;
|
|
27
|
+
} | null;
|
|
28
|
+
/**
|
|
29
|
+
* Generate packages.json root repository file
|
|
30
|
+
*/
|
|
31
|
+
export declare function generatePackagesJson(registryUrl: string, availablePackages: string[]): any;
|
|
32
|
+
/**
|
|
33
|
+
* Sort versions in semantic version order
|
|
34
|
+
*/
|
|
35
|
+
export declare function sortVersions(versions: string[]): string[];
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Composer Registry Helper Functions
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Normalize version string to Composer format
|
|
6
|
+
* Example: "1.0.0" -> "1.0.0.0", "v2.3.1" -> "2.3.1.0"
|
|
7
|
+
*/
|
|
8
|
+
export function normalizeVersion(version) {
|
|
9
|
+
// Remove 'v' prefix if present
|
|
10
|
+
let normalized = version.replace(/^v/i, '');
|
|
11
|
+
// Handle special versions (dev, alpha, beta, rc)
|
|
12
|
+
if (normalized.includes('dev') || normalized.includes('alpha') || normalized.includes('beta') || normalized.includes('RC')) {
|
|
13
|
+
// For dev versions, just return as-is with .0 appended if needed
|
|
14
|
+
const parts = normalized.split(/[-+]/)[0].split('.');
|
|
15
|
+
while (parts.length < 4) {
|
|
16
|
+
parts.push('0');
|
|
17
|
+
}
|
|
18
|
+
return parts.slice(0, 4).join('.');
|
|
19
|
+
}
|
|
20
|
+
// Split by dots
|
|
21
|
+
const parts = normalized.split('.');
|
|
22
|
+
// Ensure 4 parts (major.minor.patch.build)
|
|
23
|
+
while (parts.length < 4) {
|
|
24
|
+
parts.push('0');
|
|
25
|
+
}
|
|
26
|
+
return parts.slice(0, 4).join('.');
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Validate composer.json structure
|
|
30
|
+
*/
|
|
31
|
+
export function validateComposerJson(composerJson) {
|
|
32
|
+
return !!(composerJson &&
|
|
33
|
+
typeof composerJson.name === 'string' &&
|
|
34
|
+
composerJson.name.includes('/') &&
|
|
35
|
+
(composerJson.version || composerJson.require));
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Extract composer.json from ZIP buffer
|
|
39
|
+
*/
|
|
40
|
+
export async function extractComposerJsonFromZip(zipBuffer) {
|
|
41
|
+
try {
|
|
42
|
+
const AdmZip = (await import('adm-zip')).default;
|
|
43
|
+
const zip = new AdmZip(zipBuffer);
|
|
44
|
+
const entries = zip.getEntries();
|
|
45
|
+
// Look for composer.json in root or first-level directory
|
|
46
|
+
for (const entry of entries) {
|
|
47
|
+
if (entry.entryName.endsWith('composer.json')) {
|
|
48
|
+
const parts = entry.entryName.split('/');
|
|
49
|
+
if (parts.length <= 2) { // Root or first-level dir
|
|
50
|
+
const content = entry.getData().toString('utf-8');
|
|
51
|
+
return JSON.parse(content);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Calculate SHA-1 hash for ZIP file
|
|
63
|
+
*/
|
|
64
|
+
export async function calculateSha1(data) {
|
|
65
|
+
const crypto = await import('crypto');
|
|
66
|
+
return crypto.createHash('sha1').update(data).digest('hex');
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Parse vendor/package format
|
|
70
|
+
*/
|
|
71
|
+
export function parseVendorPackage(name) {
|
|
72
|
+
const parts = name.split('/');
|
|
73
|
+
if (parts.length !== 2) {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
return { vendor: parts[0], package: parts[1] };
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Generate packages.json root repository file
|
|
80
|
+
*/
|
|
81
|
+
export function generatePackagesJson(registryUrl, availablePackages) {
|
|
82
|
+
return {
|
|
83
|
+
'metadata-url': `${registryUrl}/p2/%package%.json`,
|
|
84
|
+
'available-packages': availablePackages,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Sort versions in semantic version order
|
|
89
|
+
*/
|
|
90
|
+
export function sortVersions(versions) {
|
|
91
|
+
return versions.sort((a, b) => {
|
|
92
|
+
const aParts = a.replace(/^v/i, '').split(/[.-]/).map(part => {
|
|
93
|
+
const num = parseInt(part, 10);
|
|
94
|
+
return isNaN(num) ? part : num;
|
|
95
|
+
});
|
|
96
|
+
const bParts = b.replace(/^v/i, '').split(/[.-]/).map(part => {
|
|
97
|
+
const num = parseInt(part, 10);
|
|
98
|
+
return isNaN(num) ? part : num;
|
|
99
|
+
});
|
|
100
|
+
for (let i = 0; i < Math.max(aParts.length, bParts.length); i++) {
|
|
101
|
+
const aPart = aParts[i] ?? 0;
|
|
102
|
+
const bPart = bParts[i] ?? 0;
|
|
103
|
+
// Compare numbers numerically, strings lexicographically
|
|
104
|
+
if (typeof aPart === 'number' && typeof bPart === 'number') {
|
|
105
|
+
if (aPart !== bPart) {
|
|
106
|
+
return aPart - bPart;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
const aStr = String(aPart);
|
|
111
|
+
const bStr = String(bPart);
|
|
112
|
+
if (aStr !== bStr) {
|
|
113
|
+
return aStr.localeCompare(bStr);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return 0;
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5jb21wb3Nlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2NvbXBvc2VyL2hlbHBlcnMuY29tcG9zZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFJSDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsT0FBZTtJQUM5QywrQkFBK0I7SUFDL0IsSUFBSSxVQUFVLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFNUMsaURBQWlEO0lBQ2pELElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzNILGlFQUFpRTtRQUNqRSxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyRCxPQUFPLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEIsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQixDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRXBDLDJDQUEyQztJQUMzQyxPQUFPLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDeEIsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FB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
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Composer Registry Module
|
|
3
|
+
* Export all public interfaces, classes, and helpers
|
|
4
|
+
*/
|
|
5
|
+
export { ComposerRegistry } from './classes.composerregistry.js';
|
|
6
|
+
export * from './interfaces.composer.js';
|
|
7
|
+
export * from './helpers.composer.js';
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9jb21wb3Nlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNqRSxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsdUJBQXVCLENBQUMifQ==
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Composer Registry Type Definitions
|
|
3
|
+
* Compliant with Composer v2 repository API
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Composer package metadata
|
|
7
|
+
*/
|
|
8
|
+
export interface IComposerPackage {
|
|
9
|
+
name: string;
|
|
10
|
+
version: string;
|
|
11
|
+
version_normalized: string;
|
|
12
|
+
type?: string;
|
|
13
|
+
description?: string;
|
|
14
|
+
keywords?: string[];
|
|
15
|
+
homepage?: string;
|
|
16
|
+
license?: string[];
|
|
17
|
+
authors?: IComposerAuthor[];
|
|
18
|
+
require?: Record<string, string>;
|
|
19
|
+
'require-dev'?: Record<string, string>;
|
|
20
|
+
suggest?: Record<string, string>;
|
|
21
|
+
provide?: Record<string, string>;
|
|
22
|
+
conflict?: Record<string, string>;
|
|
23
|
+
replace?: Record<string, string>;
|
|
24
|
+
autoload?: IComposerAutoload;
|
|
25
|
+
'autoload-dev'?: IComposerAutoload;
|
|
26
|
+
dist?: IComposerDist;
|
|
27
|
+
source?: IComposerSource;
|
|
28
|
+
time?: string;
|
|
29
|
+
support?: Record<string, string>;
|
|
30
|
+
funding?: IComposerFunding[];
|
|
31
|
+
extra?: Record<string, any>;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Author information
|
|
35
|
+
*/
|
|
36
|
+
export interface IComposerAuthor {
|
|
37
|
+
name: string;
|
|
38
|
+
email?: string;
|
|
39
|
+
homepage?: string;
|
|
40
|
+
role?: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* PSR-4/PSR-0 autoloading configuration
|
|
44
|
+
*/
|
|
45
|
+
export interface IComposerAutoload {
|
|
46
|
+
'psr-4'?: Record<string, string | string[]>;
|
|
47
|
+
'psr-0'?: Record<string, string | string[]>;
|
|
48
|
+
classmap?: string[];
|
|
49
|
+
files?: string[];
|
|
50
|
+
'exclude-from-classmap'?: string[];
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Distribution information (ZIP download)
|
|
54
|
+
*/
|
|
55
|
+
export interface IComposerDist {
|
|
56
|
+
type: 'zip' | 'tar' | 'phar';
|
|
57
|
+
url: string;
|
|
58
|
+
reference?: string;
|
|
59
|
+
shasum?: string;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Source repository information
|
|
63
|
+
*/
|
|
64
|
+
export interface IComposerSource {
|
|
65
|
+
type: 'git' | 'svn' | 'hg';
|
|
66
|
+
url: string;
|
|
67
|
+
reference: string;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Funding information
|
|
71
|
+
*/
|
|
72
|
+
export interface IComposerFunding {
|
|
73
|
+
type: string;
|
|
74
|
+
url: string;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Repository metadata (packages.json)
|
|
78
|
+
*/
|
|
79
|
+
export interface IComposerRepository {
|
|
80
|
+
packages?: Record<string, Record<string, IComposerPackage>>;
|
|
81
|
+
'metadata-url'?: string;
|
|
82
|
+
'available-packages'?: string[];
|
|
83
|
+
'available-package-patterns'?: string[];
|
|
84
|
+
'providers-url'?: string;
|
|
85
|
+
'notify-batch'?: string;
|
|
86
|
+
minified?: string;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Package metadata response (/p2/vendor/package.json)
|
|
90
|
+
*/
|
|
91
|
+
export interface IComposerPackageMetadata {
|
|
92
|
+
packages: Record<string, IComposerPackage[]>;
|
|
93
|
+
minified?: string;
|
|
94
|
+
lastModified?: string;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Error structure
|
|
98
|
+
*/
|
|
99
|
+
export interface IComposerError {
|
|
100
|
+
status: string;
|
|
101
|
+
message: string;
|
|
102
|
+
}
|