@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.
Files changed (51) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/cargo/classes.cargoregistry.d.ts +79 -0
  3. package/dist_ts/cargo/classes.cargoregistry.js +490 -0
  4. package/dist_ts/cargo/index.d.ts +5 -0
  5. package/dist_ts/cargo/index.js +6 -0
  6. package/dist_ts/cargo/interfaces.cargo.d.ts +160 -0
  7. package/dist_ts/cargo/interfaces.cargo.js +6 -0
  8. package/dist_ts/classes.smartregistry.d.ts +2 -2
  9. package/dist_ts/classes.smartregistry.js +50 -2
  10. package/dist_ts/composer/classes.composerregistry.d.ts +26 -0
  11. package/dist_ts/composer/classes.composerregistry.js +366 -0
  12. package/dist_ts/composer/helpers.composer.d.ts +35 -0
  13. package/dist_ts/composer/helpers.composer.js +120 -0
  14. package/dist_ts/composer/index.d.ts +7 -0
  15. package/dist_ts/composer/index.js +8 -0
  16. package/dist_ts/composer/interfaces.composer.d.ts +102 -0
  17. package/dist_ts/composer/interfaces.composer.js +6 -0
  18. package/dist_ts/core/classes.authmanager.d.ts +46 -1
  19. package/dist_ts/core/classes.authmanager.js +121 -12
  20. package/dist_ts/core/classes.registrystorage.d.ts +103 -0
  21. package/dist_ts/core/classes.registrystorage.js +253 -1
  22. package/dist_ts/core/interfaces.core.d.ts +4 -1
  23. package/dist_ts/index.d.ts +4 -1
  24. package/dist_ts/index.js +8 -2
  25. package/dist_ts/maven/classes.mavenregistry.d.ts +35 -0
  26. package/dist_ts/maven/classes.mavenregistry.js +407 -0
  27. package/dist_ts/maven/helpers.maven.d.ts +68 -0
  28. package/dist_ts/maven/helpers.maven.js +286 -0
  29. package/dist_ts/maven/index.d.ts +6 -0
  30. package/dist_ts/maven/index.js +7 -0
  31. package/dist_ts/maven/interfaces.maven.d.ts +116 -0
  32. package/dist_ts/maven/interfaces.maven.js +6 -0
  33. package/package.json +3 -2
  34. package/readme.md +288 -14
  35. package/ts/00_commitinfo_data.ts +1 -1
  36. package/ts/cargo/classes.cargoregistry.ts +604 -0
  37. package/ts/cargo/index.ts +6 -0
  38. package/ts/cargo/interfaces.cargo.ts +169 -0
  39. package/ts/classes.smartregistry.ts +56 -2
  40. package/ts/composer/classes.composerregistry.ts +475 -0
  41. package/ts/composer/helpers.composer.ts +139 -0
  42. package/ts/composer/index.ts +8 -0
  43. package/ts/composer/interfaces.composer.ts +111 -0
  44. package/ts/core/classes.authmanager.ts +145 -12
  45. package/ts/core/classes.registrystorage.ts +334 -0
  46. package/ts/core/interfaces.core.ts +4 -1
  47. package/ts/index.ts +10 -1
  48. package/ts/maven/classes.mavenregistry.ts +580 -0
  49. package/ts/maven/helpers.maven.ts +346 -0
  50. package/ts/maven/index.ts +7 -0
  51. 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,7 @@
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';
@@ -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
+ }