@package-broker/core 0.2.15
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/cache/index.d.ts +2 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +2 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory-driver.d.ts +15 -0
- package/dist/cache/memory-driver.d.ts.map +1 -0
- package/dist/cache/memory-driver.js +56 -0
- package/dist/cache/memory-driver.js.map +1 -0
- package/dist/db/d1-driver.d.ts +3 -0
- package/dist/db/d1-driver.d.ts.map +1 -0
- package/dist/db/d1-driver.js +7 -0
- package/dist/db/d1-driver.js.map +1 -0
- package/dist/db/index.d.ts +5 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +4 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/schema.d.ts +696 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +99 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/factory.d.ts +34 -0
- package/dist/factory.d.ts.map +1 -0
- package/dist/factory.js +121 -0
- package/dist/factory.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/jobs/index.d.ts +2 -0
- package/dist/jobs/index.d.ts.map +1 -0
- package/dist/jobs/index.js +7 -0
- package/dist/jobs/index.js.map +1 -0
- package/dist/jobs/processor.d.ts +49 -0
- package/dist/jobs/processor.d.ts.map +1 -0
- package/dist/jobs/processor.js +118 -0
- package/dist/jobs/processor.js.map +1 -0
- package/dist/middleware/auth.d.ts +52 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +300 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/composer-version.d.ts +7 -0
- package/dist/middleware/composer-version.d.ts.map +1 -0
- package/dist/middleware/composer-version.js +18 -0
- package/dist/middleware/composer-version.js.map +1 -0
- package/dist/middleware/error-handler.d.ts +7 -0
- package/dist/middleware/error-handler.d.ts.map +1 -0
- package/dist/middleware/error-handler.js +45 -0
- package/dist/middleware/error-handler.js.map +1 -0
- package/dist/middleware/index.d.ts +5 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +6 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/request-id.d.ts +9 -0
- package/dist/middleware/request-id.d.ts.map +1 -0
- package/dist/middleware/request-id.js +36 -0
- package/dist/middleware/request-id.js.map +1 -0
- package/dist/ports.d.ts +32 -0
- package/dist/ports.d.ts.map +1 -0
- package/dist/ports.js +4 -0
- package/dist/ports.js.map +1 -0
- package/dist/queue/consumer.d.ts +18 -0
- package/dist/queue/consumer.d.ts.map +1 -0
- package/dist/queue/consumer.js +82 -0
- package/dist/queue/consumer.js.map +1 -0
- package/dist/queue/index.d.ts +2 -0
- package/dist/queue/index.d.ts.map +1 -0
- package/dist/queue/index.js +2 -0
- package/dist/queue/index.js.map +1 -0
- package/dist/queue/memory-driver.d.ts +13 -0
- package/dist/queue/memory-driver.d.ts.map +1 -0
- package/dist/queue/memory-driver.js +22 -0
- package/dist/queue/memory-driver.js.map +1 -0
- package/dist/queue/types.d.ts +19 -0
- package/dist/queue/types.d.ts.map +1 -0
- package/dist/queue/types.js +3 -0
- package/dist/queue/types.js.map +1 -0
- package/dist/routes/api/artifacts.d.ts +25 -0
- package/dist/routes/api/artifacts.d.ts.map +1 -0
- package/dist/routes/api/artifacts.js +57 -0
- package/dist/routes/api/artifacts.js.map +1 -0
- package/dist/routes/api/auth.d.ts +50 -0
- package/dist/routes/api/auth.d.ts.map +1 -0
- package/dist/routes/api/auth.js +268 -0
- package/dist/routes/api/auth.js.map +1 -0
- package/dist/routes/api/index.d.ts +9 -0
- package/dist/routes/api/index.d.ts.map +1 -0
- package/dist/routes/api/index.js +10 -0
- package/dist/routes/api/index.js.map +1 -0
- package/dist/routes/api/packages.d.ts +47 -0
- package/dist/routes/api/packages.d.ts.map +1 -0
- package/dist/routes/api/packages.js +671 -0
- package/dist/routes/api/packages.js.map +1 -0
- package/dist/routes/api/repositories.d.ts +56 -0
- package/dist/routes/api/repositories.d.ts.map +1 -0
- package/dist/routes/api/repositories.js +317 -0
- package/dist/routes/api/repositories.js.map +1 -0
- package/dist/routes/api/settings.d.ts +28 -0
- package/dist/routes/api/settings.d.ts.map +1 -0
- package/dist/routes/api/settings.js +81 -0
- package/dist/routes/api/settings.js.map +1 -0
- package/dist/routes/api/stats.d.ts +21 -0
- package/dist/routes/api/stats.d.ts.map +1 -0
- package/dist/routes/api/stats.js +52 -0
- package/dist/routes/api/stats.js.map +1 -0
- package/dist/routes/api/tokens.d.ts +39 -0
- package/dist/routes/api/tokens.d.ts.map +1 -0
- package/dist/routes/api/tokens.js +191 -0
- package/dist/routes/api/tokens.js.map +1 -0
- package/dist/routes/api/users.d.ts +5 -0
- package/dist/routes/api/users.d.ts.map +1 -0
- package/dist/routes/api/users.js +125 -0
- package/dist/routes/api/users.js.map +1 -0
- package/dist/routes/composer.d.ts +133 -0
- package/dist/routes/composer.d.ts.map +1 -0
- package/dist/routes/composer.js +1179 -0
- package/dist/routes/composer.js.map +1 -0
- package/dist/routes/dist.d.ts +32 -0
- package/dist/routes/dist.d.ts.map +1 -0
- package/dist/routes/dist.js +761 -0
- package/dist/routes/dist.js.map +1 -0
- package/dist/routes/health.d.ts +7 -0
- package/dist/routes/health.d.ts.map +1 -0
- package/dist/routes/health.js +22 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/index.d.ts +5 -0
- package/dist/routes/index.d.ts.map +1 -0
- package/dist/routes/index.js +6 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/services/EmailService.d.ts +20 -0
- package/dist/services/EmailService.d.ts.map +1 -0
- package/dist/services/EmailService.js +27 -0
- package/dist/services/EmailService.js.map +1 -0
- package/dist/services/UserService.d.ts +27 -0
- package/dist/services/UserService.d.ts.map +1 -0
- package/dist/services/UserService.js +164 -0
- package/dist/services/UserService.js.map +1 -0
- package/dist/storage/driver.d.ts +65 -0
- package/dist/storage/driver.d.ts.map +1 -0
- package/dist/storage/driver.js +59 -0
- package/dist/storage/driver.js.map +1 -0
- package/dist/storage/index.d.ts +4 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +5 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/r2-driver.d.ts +16 -0
- package/dist/storage/r2-driver.d.ts.map +1 -0
- package/dist/storage/r2-driver.js +28 -0
- package/dist/storage/r2-driver.js.map +1 -0
- package/dist/storage/s3-driver.d.ts +22 -0
- package/dist/storage/s3-driver.d.ts.map +1 -0
- package/dist/storage/s3-driver.js +66 -0
- package/dist/storage/s3-driver.js.map +1 -0
- package/dist/sync/github-sync.d.ts +15 -0
- package/dist/sync/github-sync.d.ts.map +1 -0
- package/dist/sync/github-sync.js +39 -0
- package/dist/sync/github-sync.js.map +1 -0
- package/dist/sync/index.d.ts +5 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +6 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/repository-sync.d.ts +18 -0
- package/dist/sync/repository-sync.d.ts.map +1 -0
- package/dist/sync/repository-sync.js +214 -0
- package/dist/sync/repository-sync.js.map +1 -0
- package/dist/sync/strategies/composer-repo.d.ts +11 -0
- package/dist/sync/strategies/composer-repo.d.ts.map +1 -0
- package/dist/sync/strategies/composer-repo.js +269 -0
- package/dist/sync/strategies/composer-repo.js.map +1 -0
- package/dist/sync/strategies/github-api.d.ts +6 -0
- package/dist/sync/strategies/github-api.d.ts.map +1 -0
- package/dist/sync/strategies/github-api.js +137 -0
- package/dist/sync/strategies/github-api.js.map +1 -0
- package/dist/sync/strategies/github-packages.d.ts +7 -0
- package/dist/sync/strategies/github-packages.d.ts.map +1 -0
- package/dist/sync/strategies/github-packages.js +66 -0
- package/dist/sync/strategies/github-packages.js.map +1 -0
- package/dist/sync/strategies/index.d.ts +4 -0
- package/dist/sync/strategies/index.d.ts.map +1 -0
- package/dist/sync/strategies/index.js +5 -0
- package/dist/sync/strategies/index.js.map +1 -0
- package/dist/sync/types.d.ts +60 -0
- package/dist/sync/types.d.ts.map +1 -0
- package/dist/sync/types.js +3 -0
- package/dist/sync/types.js.map +1 -0
- package/dist/utils/analytics.d.ts +142 -0
- package/dist/utils/analytics.d.ts.map +1 -0
- package/dist/utils/analytics.js +229 -0
- package/dist/utils/analytics.js.map +1 -0
- package/dist/utils/download.d.ts +10 -0
- package/dist/utils/download.d.ts.map +1 -0
- package/dist/utils/download.js +34 -0
- package/dist/utils/download.js.map +1 -0
- package/dist/utils/encryption.d.ts +20 -0
- package/dist/utils/encryption.d.ts.map +1 -0
- package/dist/utils/encryption.js +76 -0
- package/dist/utils/encryption.js.map +1 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +78 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +134 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/upstream-fetch.d.ts +15 -0
- package/dist/utils/upstream-fetch.d.ts.map +1 -0
- package/dist/utils/upstream-fetch.js +108 -0
- package/dist/utils/upstream-fetch.js.map +1 -0
- package/dist/workflows/index.d.ts +3 -0
- package/dist/workflows/index.d.ts.map +1 -0
- package/dist/workflows/index.js +8 -0
- package/dist/workflows/index.js.map +1 -0
- package/dist/workflows/package-storage.d.ts +47 -0
- package/dist/workflows/package-storage.d.ts.map +1 -0
- package/dist/workflows/package-storage.js +136 -0
- package/dist/workflows/package-storage.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* PACKAGE.broker
|
|
3
|
+
* Copyright (C) 2025 Łukasz Bajsarowicz
|
|
4
|
+
* Licensed under AGPL-3.0
|
|
5
|
+
*/
|
|
6
|
+
class Logger {
|
|
7
|
+
logLevel;
|
|
8
|
+
requestId;
|
|
9
|
+
constructor(logLevel = 'info') {
|
|
10
|
+
this.logLevel = logLevel;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Set request ID for correlation across log entries
|
|
14
|
+
*/
|
|
15
|
+
setRequestId(requestId) {
|
|
16
|
+
this.requestId = requestId;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Get current request ID
|
|
20
|
+
*/
|
|
21
|
+
getRequestId() {
|
|
22
|
+
return this.requestId;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Set log level
|
|
26
|
+
*/
|
|
27
|
+
setLevel(level) {
|
|
28
|
+
this.logLevel = level;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Check if a log level should be emitted
|
|
32
|
+
*/
|
|
33
|
+
shouldLog(level) {
|
|
34
|
+
const levels = ['debug', 'info', 'warn', 'error'];
|
|
35
|
+
const currentIndex = levels.indexOf(this.logLevel);
|
|
36
|
+
const messageIndex = levels.indexOf(level);
|
|
37
|
+
return messageIndex >= currentIndex;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Create log entry
|
|
41
|
+
*/
|
|
42
|
+
createLogEntry(level, message, context, error) {
|
|
43
|
+
const entry = {
|
|
44
|
+
level,
|
|
45
|
+
message,
|
|
46
|
+
timestamp: new Date().toISOString(),
|
|
47
|
+
};
|
|
48
|
+
if (this.requestId) {
|
|
49
|
+
entry.requestId = this.requestId;
|
|
50
|
+
}
|
|
51
|
+
if (context && Object.keys(context).length > 0) {
|
|
52
|
+
entry.context = context;
|
|
53
|
+
}
|
|
54
|
+
if (error) {
|
|
55
|
+
entry.error = {
|
|
56
|
+
message: error.message,
|
|
57
|
+
name: error.name,
|
|
58
|
+
stack: error.stack,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
return entry;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Emit log entry
|
|
65
|
+
*/
|
|
66
|
+
emit(level, message, context, error) {
|
|
67
|
+
if (!this.shouldLog(level)) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const entry = this.createLogEntry(level, message, context, error);
|
|
71
|
+
const jsonString = JSON.stringify(entry);
|
|
72
|
+
// Use appropriate console method based on level
|
|
73
|
+
switch (level) {
|
|
74
|
+
case 'debug':
|
|
75
|
+
console.log(jsonString);
|
|
76
|
+
break;
|
|
77
|
+
case 'info':
|
|
78
|
+
console.log(jsonString);
|
|
79
|
+
break;
|
|
80
|
+
case 'warn':
|
|
81
|
+
console.warn(jsonString);
|
|
82
|
+
break;
|
|
83
|
+
case 'error':
|
|
84
|
+
console.error(jsonString);
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Log debug message
|
|
90
|
+
*/
|
|
91
|
+
debug(message, context) {
|
|
92
|
+
this.emit('debug', message, context);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Log info message
|
|
96
|
+
*/
|
|
97
|
+
info(message, context) {
|
|
98
|
+
this.emit('info', message, context);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Log warning message
|
|
102
|
+
*/
|
|
103
|
+
warn(message, context) {
|
|
104
|
+
this.emit('warn', message, context);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Log error message
|
|
108
|
+
*/
|
|
109
|
+
error(message, context, error) {
|
|
110
|
+
this.emit('error', message, context, error);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Create singleton instance
|
|
114
|
+
let loggerInstance = null;
|
|
115
|
+
/**
|
|
116
|
+
* Get logger instance
|
|
117
|
+
* Creates a new instance if one doesn't exist
|
|
118
|
+
*/
|
|
119
|
+
export function getLogger(logLevel) {
|
|
120
|
+
if (!loggerInstance) {
|
|
121
|
+
loggerInstance = new Logger(logLevel);
|
|
122
|
+
}
|
|
123
|
+
if (logLevel) {
|
|
124
|
+
loggerInstance.setLevel(logLevel);
|
|
125
|
+
}
|
|
126
|
+
return loggerInstance;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Create a new logger instance (useful for testing)
|
|
130
|
+
*/
|
|
131
|
+
export function createLogger(logLevel = 'info') {
|
|
132
|
+
return new Logger(logLevel);
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ProviderPackageResponse } from '../sync/types';
|
|
2
|
+
export interface UpstreamRepository {
|
|
3
|
+
id: string;
|
|
4
|
+
url: string;
|
|
5
|
+
vcs_type: string;
|
|
6
|
+
credential_type: string;
|
|
7
|
+
auth_credentials: string;
|
|
8
|
+
package_filter?: string | null;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Fetch package metadata from an upstream Composer repository
|
|
12
|
+
* Supports both direct packages.json and provider-includes/providers-lazy-url
|
|
13
|
+
*/
|
|
14
|
+
export declare function fetchPackageFromUpstream(repo: UpstreamRepository, packageName: string, encryptionKey: string): Promise<ProviderPackageResponse | null>;
|
|
15
|
+
//# sourceMappingURL=upstream-fetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upstream-fetch.d.ts","sourceRoot":"","sources":["../../src/utils/upstream-fetch.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAsC,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAIjG,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,kBAAkB,EACxB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,CA0EzC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* PACKAGE.broker
|
|
3
|
+
* Copyright (C) 2025 Łukasz Bajsarowicz
|
|
4
|
+
* Licensed under AGPL-3.0
|
|
5
|
+
*/
|
|
6
|
+
// Utility for fetching package metadata from upstream Composer repositories
|
|
7
|
+
import { buildAuthHeaders, COMPOSER_USER_AGENT } from '@package-broker/shared';
|
|
8
|
+
import { decryptCredentials } from './encryption';
|
|
9
|
+
import pRetry from 'p-retry';
|
|
10
|
+
/**
|
|
11
|
+
* Fetch package metadata from an upstream Composer repository
|
|
12
|
+
* Supports both direct packages.json and provider-includes/providers-lazy-url
|
|
13
|
+
*/
|
|
14
|
+
export async function fetchPackageFromUpstream(repo, packageName, encryptionKey) {
|
|
15
|
+
const credentialsJson = JSON.parse(await decryptCredentials(repo.auth_credentials, encryptionKey));
|
|
16
|
+
const authHeaders = buildAuthHeaders(repo.credential_type, credentialsJson);
|
|
17
|
+
const baseUrl = repo.url.replace(/\/$/, '');
|
|
18
|
+
// First, get packages.json to understand repository structure
|
|
19
|
+
const packagesJsonUrl = `${baseUrl}/packages.json`;
|
|
20
|
+
const packagesRes = await pRetry(() => fetch(packagesJsonUrl, {
|
|
21
|
+
headers: {
|
|
22
|
+
...authHeaders,
|
|
23
|
+
Accept: 'application/json',
|
|
24
|
+
'User-Agent': COMPOSER_USER_AGENT,
|
|
25
|
+
},
|
|
26
|
+
}), { retries: 2 });
|
|
27
|
+
if (!packagesRes.ok) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
const packagesJson = await packagesRes.json();
|
|
31
|
+
// Check if uses providers-lazy-url (Composer 2 - preferred)
|
|
32
|
+
if (packagesJson['providers-lazy-url']) {
|
|
33
|
+
const lazyUrl = packagesJson['providers-lazy-url']
|
|
34
|
+
.replace('%package%', packageName);
|
|
35
|
+
const res = await pRetry(() => fetch(`${baseUrl}${lazyUrl}`, {
|
|
36
|
+
headers: {
|
|
37
|
+
...authHeaders,
|
|
38
|
+
Accept: 'application/json',
|
|
39
|
+
'User-Agent': COMPOSER_USER_AGENT,
|
|
40
|
+
},
|
|
41
|
+
}), { retries: 2 });
|
|
42
|
+
if (res.ok) {
|
|
43
|
+
return await res.json();
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
// Check if uses provider-includes (Composer 1)
|
|
48
|
+
if (packagesJson['providers-url'] && packagesJson['provider-includes']) {
|
|
49
|
+
return await fetchFromProviderIncludes(baseUrl, packagesJson, packageName, authHeaders);
|
|
50
|
+
}
|
|
51
|
+
// Direct packages - look in packages.json
|
|
52
|
+
if (packagesJson.packages?.[packageName]) {
|
|
53
|
+
return {
|
|
54
|
+
packages: {
|
|
55
|
+
[packageName]: packagesJson.packages[packageName],
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Fetch package metadata using provider-includes pattern
|
|
63
|
+
*/
|
|
64
|
+
async function fetchFromProviderIncludes(baseUrl, packagesJson, packageName, authHeaders) {
|
|
65
|
+
const providersUrl = packagesJson['providers-url'];
|
|
66
|
+
const providerIncludes = packagesJson['provider-includes'];
|
|
67
|
+
// Find which provider file contains this package
|
|
68
|
+
for (const [providerPath, { sha256 }] of Object.entries(providerIncludes)) {
|
|
69
|
+
const providerUrl = `${baseUrl}/${providerPath.replace('%hash%', sha256)}`;
|
|
70
|
+
try {
|
|
71
|
+
const response = await pRetry(() => fetch(providerUrl, {
|
|
72
|
+
headers: {
|
|
73
|
+
...authHeaders,
|
|
74
|
+
Accept: 'application/json',
|
|
75
|
+
'User-Agent': COMPOSER_USER_AGENT,
|
|
76
|
+
},
|
|
77
|
+
}), { retries: 2 });
|
|
78
|
+
if (!response.ok) {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
const providerData = await response.json();
|
|
82
|
+
// Check if this provider file contains our package
|
|
83
|
+
if (providerData.providers?.[packageName]) {
|
|
84
|
+
const packageHash = providerData.providers[packageName].sha256;
|
|
85
|
+
// Fetch package metadata using providers-url
|
|
86
|
+
const packageUrl = `${baseUrl}${providersUrl
|
|
87
|
+
.replace('%package%', packageName)
|
|
88
|
+
.replace('%hash%', packageHash)}`;
|
|
89
|
+
const packageRes = await pRetry(() => fetch(packageUrl, {
|
|
90
|
+
headers: {
|
|
91
|
+
...authHeaders,
|
|
92
|
+
Accept: 'application/json',
|
|
93
|
+
'User-Agent': COMPOSER_USER_AGENT,
|
|
94
|
+
},
|
|
95
|
+
}), { retries: 2 });
|
|
96
|
+
if (packageRes.ok) {
|
|
97
|
+
return await packageRes.json();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
console.warn(`Error fetching provider file ${providerUrl}:`, error);
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=upstream-fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upstream-fetch.js","sourceRoot":"","sources":["../../src/utils/upstream-fetch.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,4EAA4E;AAE5E,OAAO,EAAE,gBAAgB,EAAuB,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAEpG,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,MAAM,MAAM,SAAS,CAAC;AAW7B;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,IAAwB,EACxB,WAAmB,EACnB,aAAqB;IAErB,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAChC,MAAM,kBAAkB,CAAC,IAAI,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAC/D,CAAC;IAEF,MAAM,WAAW,GAAG,gBAAgB,CAClC,IAAI,CAAC,eAAiC,EACtC,eAAe,CAChB,CAAC;IAEF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAE5C,8DAA8D;IAC9D,MAAM,eAAe,GAAG,GAAG,OAAO,gBAAgB,CAAC;IACnD,MAAM,WAAW,GAAG,MAAM,MAAM,CAC9B,GAAG,EAAE,CACH,KAAK,CAAC,eAAe,EAAE;QACrB,OAAO,EAAE;YACP,GAAG,WAAW;YACd,MAAM,EAAE,kBAAkB;YAC1B,YAAY,EAAE,mBAAmB;SAClC;KACF,CAAC,EACJ,EAAE,OAAO,EAAE,CAAC,EAAE,CACf,CAAC;IAEF,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,YAAY,GAAyB,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;IAEpE,4DAA4D;IAC5D,IAAI,YAAY,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,YAAY,CAAC,oBAAoB,CAAC;aAC/C,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,MAAM,MAAM,CACtB,GAAG,EAAE,CACH,KAAK,CAAC,GAAG,OAAO,GAAG,OAAO,EAAE,EAAE;YAC5B,OAAO,EAAE;gBACP,GAAG,WAAW;gBACd,MAAM,EAAE,kBAAkB;gBAC1B,YAAY,EAAE,mBAAmB;aAClC;SACF,CAAC,EACJ,EAAE,OAAO,EAAE,CAAC,EAAE,CACf,CAAC;QAEF,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;YACX,OAAO,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC1B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,+CAA+C;IAC/C,IAAI,YAAY,CAAC,eAAe,CAAC,IAAI,YAAY,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACvE,OAAO,MAAM,yBAAyB,CACpC,OAAO,EACP,YAAY,EACZ,WAAW,EACX,WAAW,CACZ,CAAC;IACJ,CAAC;IAED,0CAA0C;IAC1C,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC;QACzC,OAAO;YACL,QAAQ,EAAE;gBACR,CAAC,WAAW,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC;aAClD;SACF,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,yBAAyB,CACtC,OAAe,EACf,YAAkC,EAClC,WAAmB,EACnB,WAAwB;IAExB,MAAM,YAAY,GAAG,YAAY,CAAC,eAAe,CAAE,CAAC;IACpD,MAAM,gBAAgB,GAAG,YAAY,CAAC,mBAAmB,CAAE,CAAC;IAE5D,iDAAiD;IACjD,KAAK,MAAM,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC1E,MAAM,WAAW,GAAG,GAAG,OAAO,IAAI,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;QAE3E,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAC3B,GAAG,EAAE,CACH,KAAK,CAAC,WAAW,EAAE;gBACjB,OAAO,EAAE;oBACP,GAAG,WAAW;oBACd,MAAM,EAAE,kBAAkB;oBAC1B,YAAY,EAAE,mBAAmB;iBAClC;aACF,CAAC,EACJ,EAAE,OAAO,EAAE,CAAC,EAAE,CACf,CAAC;YAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,SAAS;YACX,CAAC;YAED,MAAM,YAAY,GAAiB,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAEzD,mDAAmD;YACnD,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC1C,MAAM,WAAW,GAAG,YAAY,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC;gBAE/D,6CAA6C;gBAC7C,MAAM,UAAU,GAAG,GAAG,OAAO,GAAG,YAAY;qBACzC,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC;qBACjC,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,CAAC;gBAEpC,MAAM,UAAU,GAAG,MAAM,MAAM,CAC7B,GAAG,EAAE,CACH,KAAK,CAAC,UAAU,EAAE;oBAChB,OAAO,EAAE;wBACP,GAAG,WAAW;wBACd,MAAM,EAAE,kBAAkB;wBAC1B,YAAY,EAAE,mBAAmB;qBAClC;iBACF,CAAC,EACJ,EAAE,OAAO,EAAE,CAAC,EAAE,CACf,CAAC;gBAEF,IAAI,UAAU,CAAC,EAAE,EAAE,CAAC;oBAClB,OAAO,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;gBACjC,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,gCAAgC,WAAW,GAAG,EAAE,KAAK,CAAC,CAAC;YACpE,SAAS;QACX,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workflows/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,YAAY,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workflows/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,4CAA4C;AAE5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { WorkflowEntrypoint, WorkflowStep, WorkflowEvent } from 'cloudflare:workers';
|
|
2
|
+
/**
|
|
3
|
+
* Environment for the Package Storage Workflow
|
|
4
|
+
*/
|
|
5
|
+
export interface PackageStorageEnv {
|
|
6
|
+
DB: D1Database;
|
|
7
|
+
KV?: KVNamespace;
|
|
8
|
+
ENCRYPTION_KEY: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Parameters passed to the workflow when triggered
|
|
12
|
+
*/
|
|
13
|
+
export interface PackageStorageParams {
|
|
14
|
+
/** Package name in vendor/package format */
|
|
15
|
+
packageName: string;
|
|
16
|
+
/** Raw package data from upstream (Packagist or Composer repo) */
|
|
17
|
+
packageData: any;
|
|
18
|
+
/** Repository ID (e.g., 'packagist' or repo UUID) */
|
|
19
|
+
repoId: string;
|
|
20
|
+
/** Proxy base URL for transforming dist URLs */
|
|
21
|
+
proxyBaseUrl: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* PackageStorageWorkflow - Handles CPU-intensive D1 storage in background
|
|
25
|
+
*
|
|
26
|
+
* This workflow is triggered after a package is fetched from upstream.
|
|
27
|
+
* It runs with higher CPU limits than the main Worker request handler,
|
|
28
|
+
* allowing for reliable storage of packages with many versions.
|
|
29
|
+
*
|
|
30
|
+
* Benefits:
|
|
31
|
+
* - Automatic retries on failure
|
|
32
|
+
* - Higher CPU time limits (15 minutes vs 10ms on Free tier)
|
|
33
|
+
* - Durable execution - survives Worker restarts
|
|
34
|
+
* - Observable progress and status
|
|
35
|
+
*/
|
|
36
|
+
export declare class PackageStorageWorkflow extends WorkflowEntrypoint<PackageStorageEnv, PackageStorageParams> {
|
|
37
|
+
run(event: WorkflowEvent<PackageStorageParams>, step: WorkflowStep): Promise<{
|
|
38
|
+
storedCount: number;
|
|
39
|
+
errorCount: number;
|
|
40
|
+
}>;
|
|
41
|
+
/**
|
|
42
|
+
* Ensure repository exists in database
|
|
43
|
+
* For Packagist, creates the repository entry if missing
|
|
44
|
+
*/
|
|
45
|
+
private ensureRepository;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=package-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-storage.d.ts","sourceRoot":"","sources":["../../src/workflows/package-storage.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAOrF;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,UAAU,CAAC;IACf,EAAE,CAAC,EAAE,WAAW,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,4CAA4C;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,kEAAkE;IAClE,WAAW,EAAE,GAAG,CAAC;IACjB,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,sBAAuB,SAAQ,kBAAkB,CAAC,iBAAiB,EAAE,oBAAoB,CAAC;IAC/F,GAAG,CAAC,KAAK,EAAE,aAAa,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE,YAAY;;;;IA2ExE;;;OAGG;YACW,gBAAgB;CA4D/B"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* PACKAGE.broker
|
|
3
|
+
* Copyright (C) 2025 Łukasz Bajsarowicz
|
|
4
|
+
* Licensed under AGPL-3.0
|
|
5
|
+
*/
|
|
6
|
+
// Package Storage Workflow - Durable background processing for D1 storage
|
|
7
|
+
import { WorkflowEntrypoint } from 'cloudflare:workers';
|
|
8
|
+
import { createD1Database } from '../db';
|
|
9
|
+
import { repositories } from '../db/schema';
|
|
10
|
+
import { eq } from 'drizzle-orm';
|
|
11
|
+
import { encryptCredentials } from '../utils/encryption';
|
|
12
|
+
import { getLogger } from '../utils/logger';
|
|
13
|
+
/**
|
|
14
|
+
* PackageStorageWorkflow - Handles CPU-intensive D1 storage in background
|
|
15
|
+
*
|
|
16
|
+
* This workflow is triggered after a package is fetched from upstream.
|
|
17
|
+
* It runs with higher CPU limits than the main Worker request handler,
|
|
18
|
+
* allowing for reliable storage of packages with many versions.
|
|
19
|
+
*
|
|
20
|
+
* Benefits:
|
|
21
|
+
* - Automatic retries on failure
|
|
22
|
+
* - Higher CPU time limits (15 minutes vs 10ms on Free tier)
|
|
23
|
+
* - Durable execution - survives Worker restarts
|
|
24
|
+
* - Observable progress and status
|
|
25
|
+
*/
|
|
26
|
+
export class PackageStorageWorkflow extends WorkflowEntrypoint {
|
|
27
|
+
async run(event, step) {
|
|
28
|
+
const { packageName, packageData, repoId, proxyBaseUrl } = event.payload;
|
|
29
|
+
const logger = getLogger();
|
|
30
|
+
logger.info('Workflow started: storing package', { packageName, repoId });
|
|
31
|
+
// Step 1: Ensure repository exists (with retries)
|
|
32
|
+
await step.do('ensure-repository', {
|
|
33
|
+
retries: {
|
|
34
|
+
limit: 3,
|
|
35
|
+
delay: '1 second',
|
|
36
|
+
backoff: 'exponential',
|
|
37
|
+
},
|
|
38
|
+
timeout: '30 seconds',
|
|
39
|
+
}, async () => {
|
|
40
|
+
const db = createD1Database(this.env.DB);
|
|
41
|
+
await this.ensureRepository(db, repoId);
|
|
42
|
+
logger.debug('Repository ensured', { repoId });
|
|
43
|
+
});
|
|
44
|
+
// Step 2: Store packages in D1 (with retries for reliability)
|
|
45
|
+
const result = await step.do('store-packages', {
|
|
46
|
+
retries: {
|
|
47
|
+
limit: 5,
|
|
48
|
+
delay: '2 seconds',
|
|
49
|
+
backoff: 'exponential',
|
|
50
|
+
},
|
|
51
|
+
timeout: '10 minutes', // Package storage can take time for large packages
|
|
52
|
+
}, async () => {
|
|
53
|
+
const db = createD1Database(this.env.DB);
|
|
54
|
+
const { transformPackageDistUrls } = await import('../routes/composer');
|
|
55
|
+
const { storedCount, errors } = await transformPackageDistUrls(packageData, repoId, proxyBaseUrl, db);
|
|
56
|
+
logger.info('Stored package versions via workflow', {
|
|
57
|
+
packageName,
|
|
58
|
+
repoId,
|
|
59
|
+
storedCount,
|
|
60
|
+
errorCount: errors.length,
|
|
61
|
+
});
|
|
62
|
+
if (errors.length > 0) {
|
|
63
|
+
logger.warn('Package storage errors in workflow', {
|
|
64
|
+
packageName,
|
|
65
|
+
repoId,
|
|
66
|
+
errors: errors.slice(0, 5), // Log first 5 errors to avoid log bloat
|
|
67
|
+
totalErrors: errors.length,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
return { storedCount, errorCount: errors.length };
|
|
71
|
+
});
|
|
72
|
+
logger.info('Workflow completed: package stored', {
|
|
73
|
+
packageName,
|
|
74
|
+
repoId,
|
|
75
|
+
...result
|
|
76
|
+
});
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Ensure repository exists in database
|
|
81
|
+
* For Packagist, creates the repository entry if missing
|
|
82
|
+
*/
|
|
83
|
+
async ensureRepository(db, repoId) {
|
|
84
|
+
// For Packagist, we need to ensure the repository entry exists
|
|
85
|
+
if (repoId === 'packagist') {
|
|
86
|
+
// Cache check via KV to avoid D1 query
|
|
87
|
+
if (this.env.KV) {
|
|
88
|
+
const cached = await this.env.KV.get('packagist_repo_exists');
|
|
89
|
+
if (cached === 'true') {
|
|
90
|
+
return; // Repository exists
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const [existing] = await db
|
|
94
|
+
.select()
|
|
95
|
+
.from(repositories)
|
|
96
|
+
.where(eq(repositories.id, 'packagist'))
|
|
97
|
+
.limit(1);
|
|
98
|
+
if (existing) {
|
|
99
|
+
// Cache the result
|
|
100
|
+
if (this.env.KV) {
|
|
101
|
+
await this.env.KV.put('packagist_repo_exists', 'true', { expirationTtl: 3600 });
|
|
102
|
+
}
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
// Create Packagist repository entry
|
|
106
|
+
const emptyCredentials = await encryptCredentials('{}', this.env.ENCRYPTION_KEY);
|
|
107
|
+
await db.insert(repositories).values({
|
|
108
|
+
id: 'packagist',
|
|
109
|
+
url: 'https://repo.packagist.org',
|
|
110
|
+
vcs_type: 'composer',
|
|
111
|
+
credential_type: 'none',
|
|
112
|
+
auth_credentials: emptyCredentials,
|
|
113
|
+
composer_json_path: null,
|
|
114
|
+
package_filter: null,
|
|
115
|
+
status: 'active',
|
|
116
|
+
created_at: Math.floor(Date.now() / 1000),
|
|
117
|
+
});
|
|
118
|
+
// Cache after creation
|
|
119
|
+
if (this.env.KV) {
|
|
120
|
+
await this.env.KV.put('packagist_repo_exists', 'true', { expirationTtl: 3600 });
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
// For other repositories, just verify it exists
|
|
125
|
+
const [existing] = await db
|
|
126
|
+
.select()
|
|
127
|
+
.from(repositories)
|
|
128
|
+
.where(eq(repositories.id, repoId))
|
|
129
|
+
.limit(1);
|
|
130
|
+
if (!existing) {
|
|
131
|
+
throw new Error(`Repository ${repoId} not found`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=package-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-storage.js","sourceRoot":"","sources":["../../src/workflows/package-storage.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@package-broker/core",
|
|
3
|
+
"version": "0.2.15",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"package.json",
|
|
17
|
+
"README.md"
|
|
18
|
+
],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"lint": "echo 'no linting configured'",
|
|
21
|
+
"build": "tsc -p tsconfig.build.json",
|
|
22
|
+
"clean": "rm -rf dist",
|
|
23
|
+
"typecheck": "tsc --noEmit",
|
|
24
|
+
"db:generate": "drizzle-kit generate",
|
|
25
|
+
"db:push": "drizzle-kit push",
|
|
26
|
+
"db:studio": "drizzle-kit studio",
|
|
27
|
+
"prepublishOnly": "npm run clean && npm run build"
|
|
28
|
+
},
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"@package-broker/shared": "*",
|
|
31
|
+
"@noble/hashes": "^1.3.3",
|
|
32
|
+
"@types/nodemailer": "^7.0.4",
|
|
33
|
+
"aws4fetch": "^1.0.19",
|
|
34
|
+
"drizzle-orm": "^0.29.0",
|
|
35
|
+
"fflate": "^0.8.2",
|
|
36
|
+
"hono": "^4.0.0",
|
|
37
|
+
"micromatch": "^4.0.5",
|
|
38
|
+
"nanoid": "^5.1.6",
|
|
39
|
+
"nodemailer": "^7.0.11",
|
|
40
|
+
"otplib": "^12.0.1",
|
|
41
|
+
"p-retry": "^6.2.0",
|
|
42
|
+
"qrcode": "^1.5.4",
|
|
43
|
+
"semver": "^7.5.4",
|
|
44
|
+
"zod": "^3.22.4"
|
|
45
|
+
},
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"@cloudflare/workers-types": "^4.20240125.0",
|
|
48
|
+
"@types/micromatch": "^4.0.10",
|
|
49
|
+
"@types/qrcode": "^1.5.6",
|
|
50
|
+
"@types/semver": "^7.7.1",
|
|
51
|
+
"drizzle-kit": "^0.20.6",
|
|
52
|
+
"typescript": "^5.3.3"
|
|
53
|
+
},
|
|
54
|
+
"repository": {
|
|
55
|
+
"type": "git",
|
|
56
|
+
"url": "https://github.com/package-broker/server",
|
|
57
|
+
"directory": "packages/core"
|
|
58
|
+
},
|
|
59
|
+
"publishConfig": {
|
|
60
|
+
"access": "public"
|
|
61
|
+
}
|
|
62
|
+
}
|