@push.rocks/smartregistry 1.1.1

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 (52) hide show
  1. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  2. package/dist_ts/00_commitinfo_data.js +9 -0
  3. package/dist_ts/classes.smartregistry.d.ts +45 -0
  4. package/dist_ts/classes.smartregistry.js +113 -0
  5. package/dist_ts/core/classes.authmanager.d.ts +108 -0
  6. package/dist_ts/core/classes.authmanager.js +315 -0
  7. package/dist_ts/core/classes.baseregistry.d.ts +28 -0
  8. package/dist_ts/core/classes.baseregistry.js +6 -0
  9. package/dist_ts/core/classes.registrystorage.d.ts +109 -0
  10. package/dist_ts/core/classes.registrystorage.js +226 -0
  11. package/dist_ts/core/index.d.ts +7 -0
  12. package/dist_ts/core/index.js +10 -0
  13. package/dist_ts/core/interfaces.core.d.ts +142 -0
  14. package/dist_ts/core/interfaces.core.js +5 -0
  15. package/dist_ts/index.d.ts +8 -0
  16. package/dist_ts/index.js +13 -0
  17. package/dist_ts/npm/classes.npmregistry.d.ts +36 -0
  18. package/dist_ts/npm/classes.npmregistry.js +717 -0
  19. package/dist_ts/npm/index.d.ts +5 -0
  20. package/dist_ts/npm/index.js +6 -0
  21. package/dist_ts/npm/interfaces.npm.d.ts +245 -0
  22. package/dist_ts/npm/interfaces.npm.js +6 -0
  23. package/dist_ts/oci/classes.ociregistry.d.ts +43 -0
  24. package/dist_ts/oci/classes.ociregistry.js +565 -0
  25. package/dist_ts/oci/index.d.ts +5 -0
  26. package/dist_ts/oci/index.js +6 -0
  27. package/dist_ts/oci/interfaces.oci.d.ts +103 -0
  28. package/dist_ts/oci/interfaces.oci.js +5 -0
  29. package/dist_ts/paths.d.ts +1 -0
  30. package/dist_ts/paths.js +3 -0
  31. package/dist_ts/plugins.d.ts +6 -0
  32. package/dist_ts/plugins.js +9 -0
  33. package/npmextra.json +18 -0
  34. package/package.json +49 -0
  35. package/readme.hints.md +3 -0
  36. package/readme.md +486 -0
  37. package/ts/00_commitinfo_data.ts +8 -0
  38. package/ts/classes.smartregistry.ts +129 -0
  39. package/ts/core/classes.authmanager.ts +388 -0
  40. package/ts/core/classes.baseregistry.ts +36 -0
  41. package/ts/core/classes.registrystorage.ts +270 -0
  42. package/ts/core/index.ts +11 -0
  43. package/ts/core/interfaces.core.ts +159 -0
  44. package/ts/index.ts +16 -0
  45. package/ts/npm/classes.npmregistry.ts +890 -0
  46. package/ts/npm/index.ts +6 -0
  47. package/ts/npm/interfaces.npm.ts +263 -0
  48. package/ts/oci/classes.ociregistry.ts +734 -0
  49. package/ts/oci/index.ts +6 -0
  50. package/ts/oci/interfaces.oci.ts +101 -0
  51. package/ts/paths.ts +5 -0
  52. package/ts/plugins.ts +11 -0
@@ -0,0 +1,109 @@
1
+ import type { IStorageConfig, IStorageBackend } from './interfaces.core.js';
2
+ /**
3
+ * Storage abstraction layer for registry
4
+ * Provides a unified interface over SmartBucket
5
+ */
6
+ export declare class RegistryStorage implements IStorageBackend {
7
+ private config;
8
+ private smartBucket;
9
+ private bucket;
10
+ private bucketName;
11
+ constructor(config: IStorageConfig);
12
+ /**
13
+ * Initialize the storage backend
14
+ */
15
+ init(): Promise<void>;
16
+ /**
17
+ * Get an object from storage
18
+ */
19
+ getObject(key: string): Promise<Buffer | null>;
20
+ /**
21
+ * Store an object
22
+ */
23
+ putObject(key: string, data: Buffer, metadata?: Record<string, string>): Promise<void>;
24
+ /**
25
+ * Delete an object
26
+ */
27
+ deleteObject(key: string): Promise<void>;
28
+ /**
29
+ * List objects with a prefix (recursively)
30
+ */
31
+ listObjects(prefix: string): Promise<string[]>;
32
+ /**
33
+ * Check if an object exists
34
+ */
35
+ objectExists(key: string): Promise<boolean>;
36
+ /**
37
+ * Get object metadata
38
+ * Note: SmartBucket may not support metadata retrieval, returning empty object
39
+ */
40
+ getMetadata(key: string): Promise<Record<string, string> | null>;
41
+ /**
42
+ * Get OCI blob by digest
43
+ */
44
+ getOciBlob(digest: string): Promise<Buffer | null>;
45
+ /**
46
+ * Store OCI blob
47
+ */
48
+ putOciBlob(digest: string, data: Buffer): Promise<void>;
49
+ /**
50
+ * Check if OCI blob exists
51
+ */
52
+ ociBlobExists(digest: string): Promise<boolean>;
53
+ /**
54
+ * Delete OCI blob
55
+ */
56
+ deleteOciBlob(digest: string): Promise<void>;
57
+ /**
58
+ * Get OCI manifest
59
+ */
60
+ getOciManifest(repository: string, digest: string): Promise<Buffer | null>;
61
+ /**
62
+ * Store OCI manifest
63
+ */
64
+ putOciManifest(repository: string, digest: string, data: Buffer, contentType: string): Promise<void>;
65
+ /**
66
+ * Check if OCI manifest exists
67
+ */
68
+ ociManifestExists(repository: string, digest: string): Promise<boolean>;
69
+ /**
70
+ * Delete OCI manifest
71
+ */
72
+ deleteOciManifest(repository: string, digest: string): Promise<void>;
73
+ /**
74
+ * Get NPM packument (package document)
75
+ */
76
+ getNpmPackument(packageName: string): Promise<any | null>;
77
+ /**
78
+ * Store NPM packument
79
+ */
80
+ putNpmPackument(packageName: string, packument: any): Promise<void>;
81
+ /**
82
+ * Check if NPM packument exists
83
+ */
84
+ npmPackumentExists(packageName: string): Promise<boolean>;
85
+ /**
86
+ * Delete NPM packument
87
+ */
88
+ deleteNpmPackument(packageName: string): Promise<void>;
89
+ /**
90
+ * Get NPM tarball
91
+ */
92
+ getNpmTarball(packageName: string, version: string): Promise<Buffer | null>;
93
+ /**
94
+ * Store NPM tarball
95
+ */
96
+ putNpmTarball(packageName: string, version: string, tarball: Buffer): Promise<void>;
97
+ /**
98
+ * Check if NPM tarball exists
99
+ */
100
+ npmTarballExists(packageName: string, version: string): Promise<boolean>;
101
+ /**
102
+ * Delete NPM tarball
103
+ */
104
+ deleteNpmTarball(packageName: string, version: string): Promise<void>;
105
+ private getOciBlobPath;
106
+ private getOciManifestPath;
107
+ private getNpmPackumentPath;
108
+ private getNpmTarballPath;
109
+ }
@@ -0,0 +1,226 @@
1
+ import * as plugins from '../plugins.js';
2
+ /**
3
+ * Storage abstraction layer for registry
4
+ * Provides a unified interface over SmartBucket
5
+ */
6
+ export class RegistryStorage {
7
+ config;
8
+ smartBucket;
9
+ bucket;
10
+ bucketName;
11
+ constructor(config) {
12
+ this.config = config;
13
+ this.bucketName = config.bucketName;
14
+ }
15
+ /**
16
+ * Initialize the storage backend
17
+ */
18
+ async init() {
19
+ this.smartBucket = new plugins.smartbucket.SmartBucket({
20
+ accessKey: this.config.accessKey,
21
+ accessSecret: this.config.accessSecret,
22
+ endpoint: this.config.endpoint,
23
+ port: this.config.port || 443,
24
+ useSsl: this.config.useSsl !== false,
25
+ region: this.config.region || 'us-east-1',
26
+ });
27
+ // Ensure bucket exists
28
+ await this.smartBucket.createBucket(this.bucketName).catch(() => {
29
+ // Bucket may already exist
30
+ });
31
+ this.bucket = await this.smartBucket.getBucketByName(this.bucketName);
32
+ }
33
+ /**
34
+ * Get an object from storage
35
+ */
36
+ async getObject(key) {
37
+ try {
38
+ return await this.bucket.fastGet({ path: key });
39
+ }
40
+ catch (error) {
41
+ return null;
42
+ }
43
+ }
44
+ /**
45
+ * Store an object
46
+ */
47
+ async putObject(key, data, metadata) {
48
+ // Note: SmartBucket doesn't support metadata yet
49
+ await this.bucket.fastPut({
50
+ path: key,
51
+ contents: data,
52
+ overwrite: true, // Always overwrite existing objects
53
+ });
54
+ }
55
+ /**
56
+ * Delete an object
57
+ */
58
+ async deleteObject(key) {
59
+ await this.bucket.fastRemove({ path: key });
60
+ }
61
+ /**
62
+ * List objects with a prefix (recursively)
63
+ */
64
+ async listObjects(prefix) {
65
+ const paths = [];
66
+ for await (const path of this.bucket.listAllObjects(prefix)) {
67
+ paths.push(path);
68
+ }
69
+ return paths;
70
+ }
71
+ /**
72
+ * Check if an object exists
73
+ */
74
+ async objectExists(key) {
75
+ return await this.bucket.fastExists({ path: key });
76
+ }
77
+ /**
78
+ * Get object metadata
79
+ * Note: SmartBucket may not support metadata retrieval, returning empty object
80
+ */
81
+ async getMetadata(key) {
82
+ // SmartBucket doesn't expose metadata retrieval directly
83
+ // This is a limitation we'll document
84
+ const exists = await this.objectExists(key);
85
+ return exists ? {} : null;
86
+ }
87
+ // ========================================================================
88
+ // OCI-SPECIFIC HELPERS
89
+ // ========================================================================
90
+ /**
91
+ * Get OCI blob by digest
92
+ */
93
+ async getOciBlob(digest) {
94
+ const path = this.getOciBlobPath(digest);
95
+ return this.getObject(path);
96
+ }
97
+ /**
98
+ * Store OCI blob
99
+ */
100
+ async putOciBlob(digest, data) {
101
+ const path = this.getOciBlobPath(digest);
102
+ return this.putObject(path, data);
103
+ }
104
+ /**
105
+ * Check if OCI blob exists
106
+ */
107
+ async ociBlobExists(digest) {
108
+ const path = this.getOciBlobPath(digest);
109
+ return this.objectExists(path);
110
+ }
111
+ /**
112
+ * Delete OCI blob
113
+ */
114
+ async deleteOciBlob(digest) {
115
+ const path = this.getOciBlobPath(digest);
116
+ return this.deleteObject(path);
117
+ }
118
+ /**
119
+ * Get OCI manifest
120
+ */
121
+ async getOciManifest(repository, digest) {
122
+ const path = this.getOciManifestPath(repository, digest);
123
+ return this.getObject(path);
124
+ }
125
+ /**
126
+ * Store OCI manifest
127
+ */
128
+ async putOciManifest(repository, digest, data, contentType) {
129
+ const path = this.getOciManifestPath(repository, digest);
130
+ return this.putObject(path, data, { 'Content-Type': contentType });
131
+ }
132
+ /**
133
+ * Check if OCI manifest exists
134
+ */
135
+ async ociManifestExists(repository, digest) {
136
+ const path = this.getOciManifestPath(repository, digest);
137
+ return this.objectExists(path);
138
+ }
139
+ /**
140
+ * Delete OCI manifest
141
+ */
142
+ async deleteOciManifest(repository, digest) {
143
+ const path = this.getOciManifestPath(repository, digest);
144
+ return this.deleteObject(path);
145
+ }
146
+ // ========================================================================
147
+ // NPM-SPECIFIC HELPERS
148
+ // ========================================================================
149
+ /**
150
+ * Get NPM packument (package document)
151
+ */
152
+ async getNpmPackument(packageName) {
153
+ const path = this.getNpmPackumentPath(packageName);
154
+ const data = await this.getObject(path);
155
+ return data ? JSON.parse(data.toString('utf-8')) : null;
156
+ }
157
+ /**
158
+ * Store NPM packument
159
+ */
160
+ async putNpmPackument(packageName, packument) {
161
+ const path = this.getNpmPackumentPath(packageName);
162
+ const data = Buffer.from(JSON.stringify(packument, null, 2), 'utf-8');
163
+ return this.putObject(path, data, { 'Content-Type': 'application/json' });
164
+ }
165
+ /**
166
+ * Check if NPM packument exists
167
+ */
168
+ async npmPackumentExists(packageName) {
169
+ const path = this.getNpmPackumentPath(packageName);
170
+ return this.objectExists(path);
171
+ }
172
+ /**
173
+ * Delete NPM packument
174
+ */
175
+ async deleteNpmPackument(packageName) {
176
+ const path = this.getNpmPackumentPath(packageName);
177
+ return this.deleteObject(path);
178
+ }
179
+ /**
180
+ * Get NPM tarball
181
+ */
182
+ async getNpmTarball(packageName, version) {
183
+ const path = this.getNpmTarballPath(packageName, version);
184
+ return this.getObject(path);
185
+ }
186
+ /**
187
+ * Store NPM tarball
188
+ */
189
+ async putNpmTarball(packageName, version, tarball) {
190
+ const path = this.getNpmTarballPath(packageName, version);
191
+ return this.putObject(path, tarball, { 'Content-Type': 'application/octet-stream' });
192
+ }
193
+ /**
194
+ * Check if NPM tarball exists
195
+ */
196
+ async npmTarballExists(packageName, version) {
197
+ const path = this.getNpmTarballPath(packageName, version);
198
+ return this.objectExists(path);
199
+ }
200
+ /**
201
+ * Delete NPM tarball
202
+ */
203
+ async deleteNpmTarball(packageName, version) {
204
+ const path = this.getNpmTarballPath(packageName, version);
205
+ return this.deleteObject(path);
206
+ }
207
+ // ========================================================================
208
+ // PATH HELPERS
209
+ // ========================================================================
210
+ getOciBlobPath(digest) {
211
+ const hash = digest.split(':')[1];
212
+ return `oci/blobs/sha256/${hash}`;
213
+ }
214
+ getOciManifestPath(repository, digest) {
215
+ const hash = digest.split(':')[1];
216
+ return `oci/manifests/${repository}/${hash}`;
217
+ }
218
+ getNpmPackumentPath(packageName) {
219
+ return `npm/packages/${packageName}/index.json`;
220
+ }
221
+ getNpmTarballPath(packageName, version) {
222
+ const safeName = packageName.replace('@', '').replace('/', '-');
223
+ return `npm/packages/${packageName}/${safeName}-${version}.tgz`;
224
+ }
225
+ }
226
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5yZWdpc3RyeXN0b3JhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9jb3JlL2NsYXNzZXMucmVnaXN0cnlzdG9yYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBR3pDOzs7R0FHRztBQUNILE1BQU0sT0FBTyxlQUFlO0lBS047SUFKWixXQUFXLENBQWtDO0lBQzdDLE1BQU0sQ0FBNkI7SUFDbkMsVUFBVSxDQUFTO0lBRTNCLFlBQW9CLE1BQXNCO1FBQXRCLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBQ3hDLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsSUFBSTtRQUNmLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxPQUFPLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQztZQUNyRCxTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTO1lBQ2hDLFlBQVksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVk7WUFDdEMsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUTtZQUM5QixJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksR0FBRztZQUM3QixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssS0FBSztZQUNwQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksV0FBVztTQUMxQyxDQUFDLENBQUM7UUFFSCx1QkFBdUI7UUFDdkIsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTtZQUM5RCwyQkFBMkI7UUFDN0IsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsTUFB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
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Core registry infrastructure exports
3
+ */
4
+ export * from './interfaces.core.js';
5
+ export { BaseRegistry } from './classes.baseregistry.js';
6
+ export { RegistryStorage } from './classes.registrystorage.js';
7
+ export { AuthManager } from './classes.authmanager.js';
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Core registry infrastructure exports
3
+ */
4
+ // Interfaces
5
+ export * from './interfaces.core.js';
6
+ // Classes
7
+ export { BaseRegistry } from './classes.baseregistry.js';
8
+ export { RegistryStorage } from './classes.registrystorage.js';
9
+ export { AuthManager } from './classes.authmanager.js';
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9jb3JlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsYUFBYTtBQUNiLGNBQWMsc0JBQXNCLENBQUM7QUFFckMsVUFBVTtBQUNWLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDIn0=
@@ -0,0 +1,142 @@
1
+ /**
2
+ * Core interfaces for the composable registry system
3
+ */
4
+ /**
5
+ * Registry protocol types
6
+ */
7
+ export type TRegistryProtocol = 'oci' | 'npm';
8
+ /**
9
+ * Unified action types across protocols
10
+ */
11
+ export type TRegistryAction = 'pull' | 'push' | 'delete' | 'read' | 'write' | '*';
12
+ /**
13
+ * Unified authentication token
14
+ */
15
+ export interface IAuthToken {
16
+ /** Token type/protocol */
17
+ type: TRegistryProtocol;
18
+ /** User ID */
19
+ userId: string;
20
+ /** Permission scopes (e.g., "npm:package:foo:write", "oci:repository:bar:push") */
21
+ scopes: string[];
22
+ /** Token expiration */
23
+ expiresAt?: Date;
24
+ /** Read-only flag */
25
+ readonly?: boolean;
26
+ /** Additional metadata */
27
+ metadata?: Record<string, any>;
28
+ }
29
+ /**
30
+ * Credentials for authentication
31
+ */
32
+ export interface ICredentials {
33
+ username: string;
34
+ password: string;
35
+ }
36
+ /**
37
+ * Storage backend configuration
38
+ */
39
+ export interface IStorageConfig {
40
+ accessKey: string;
41
+ accessSecret: string;
42
+ endpoint: string;
43
+ port?: number;
44
+ useSsl?: boolean;
45
+ region?: string;
46
+ bucketName: string;
47
+ }
48
+ /**
49
+ * Authentication configuration
50
+ */
51
+ export interface IAuthConfig {
52
+ /** JWT secret for OCI tokens */
53
+ jwtSecret: string;
54
+ /** Token storage type */
55
+ tokenStore: 'memory' | 'redis' | 'database';
56
+ /** NPM token settings */
57
+ npmTokens: {
58
+ enabled: boolean;
59
+ defaultReadonly?: boolean;
60
+ };
61
+ /** OCI token settings */
62
+ ociTokens: {
63
+ enabled: boolean;
64
+ realm: string;
65
+ service: string;
66
+ };
67
+ }
68
+ /**
69
+ * Protocol-specific configuration
70
+ */
71
+ export interface IProtocolConfig {
72
+ enabled: boolean;
73
+ basePath: string;
74
+ features?: Record<string, boolean>;
75
+ }
76
+ /**
77
+ * Main registry configuration
78
+ */
79
+ export interface IRegistryConfig {
80
+ storage: IStorageConfig;
81
+ auth: IAuthConfig;
82
+ oci?: IProtocolConfig;
83
+ npm?: IProtocolConfig;
84
+ }
85
+ /**
86
+ * Storage backend interface
87
+ */
88
+ export interface IStorageBackend {
89
+ /**
90
+ * Get an object from storage
91
+ */
92
+ getObject(key: string): Promise<Buffer | null>;
93
+ /**
94
+ * Store an object
95
+ */
96
+ putObject(key: string, data: Buffer, metadata?: Record<string, string>): Promise<void>;
97
+ /**
98
+ * Delete an object
99
+ */
100
+ deleteObject(key: string): Promise<void>;
101
+ /**
102
+ * List objects with a prefix
103
+ */
104
+ listObjects(prefix: string): Promise<string[]>;
105
+ /**
106
+ * Check if an object exists
107
+ */
108
+ objectExists(key: string): Promise<boolean>;
109
+ /**
110
+ * Get object metadata
111
+ */
112
+ getMetadata(key: string): Promise<Record<string, string> | null>;
113
+ }
114
+ /**
115
+ * Error response structure
116
+ */
117
+ export interface IRegistryError {
118
+ errors: Array<{
119
+ code: string;
120
+ message: string;
121
+ detail?: any;
122
+ }>;
123
+ }
124
+ /**
125
+ * Base request context
126
+ */
127
+ export interface IRequestContext {
128
+ method: string;
129
+ path: string;
130
+ headers: Record<string, string>;
131
+ query: Record<string, string>;
132
+ body?: any;
133
+ token?: string;
134
+ }
135
+ /**
136
+ * Base response structure
137
+ */
138
+ export interface IResponse {
139
+ status: number;
140
+ headers: Record<string, string>;
141
+ body?: any;
142
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Core interfaces for the composable registry system
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlcy5jb3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvY29yZS9pbnRlcmZhY2VzLmNvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUcifQ==
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @push.rocks/smartregistry
3
+ * Composable registry supporting OCI and NPM protocols
4
+ */
5
+ export { SmartRegistry } from './classes.smartregistry.js';
6
+ export * from './core/index.js';
7
+ export * from './oci/index.js';
8
+ export * from './npm/index.js';
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @push.rocks/smartregistry
3
+ * Composable registry supporting OCI and NPM protocols
4
+ */
5
+ // Main orchestrator
6
+ export { SmartRegistry } from './classes.smartregistry.js';
7
+ // Core infrastructure
8
+ export * from './core/index.js';
9
+ // OCI Registry
10
+ export * from './oci/index.js';
11
+ // NPM Registry
12
+ export * from './npm/index.js';
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxvQkFBb0I7QUFDcEIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTNELHNCQUFzQjtBQUN0QixjQUFjLGlCQUFpQixDQUFDO0FBRWhDLGVBQWU7QUFDZixjQUFjLGdCQUFnQixDQUFDO0FBRS9CLGVBQWU7QUFDZixjQUFjLGdCQUFnQixDQUFDIn0=
@@ -0,0 +1,36 @@
1
+ import { BaseRegistry } from '../core/classes.baseregistry.js';
2
+ import { RegistryStorage } from '../core/classes.registrystorage.js';
3
+ import { AuthManager } from '../core/classes.authmanager.js';
4
+ import type { IRequestContext, IResponse, IAuthToken } from '../core/interfaces.core.js';
5
+ /**
6
+ * NPM Registry implementation
7
+ * Compliant with npm registry API
8
+ */
9
+ export declare class NpmRegistry extends BaseRegistry {
10
+ private storage;
11
+ private authManager;
12
+ private basePath;
13
+ private registryUrl;
14
+ private logger;
15
+ constructor(storage: RegistryStorage, authManager: AuthManager, basePath?: string, registryUrl?: string);
16
+ init(): Promise<void>;
17
+ getBasePath(): string;
18
+ handleRequest(context: IRequestContext): Promise<IResponse>;
19
+ protected checkPermission(token: IAuthToken | null, resource: string, action: string): Promise<boolean>;
20
+ private handleRegistryInfo;
21
+ private handlePackage;
22
+ private getPackument;
23
+ private handlePackageVersion;
24
+ private publishPackage;
25
+ private unpublishVersion;
26
+ private unpublishPackage;
27
+ private handleTarballDownload;
28
+ private handleSearch;
29
+ private handleUserAuth;
30
+ private handleTokens;
31
+ private listTokens;
32
+ private createToken;
33
+ private deleteToken;
34
+ private handleDistTags;
35
+ private createError;
36
+ }