@fractary/core 0.3.2 → 0.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/__tests__/factories.test.d.ts +5 -0
- package/dist/__tests__/factories.test.d.ts.map +1 -0
- package/dist/__tests__/factories.test.js +66 -0
- package/dist/__tests__/factories.test.js.map +1 -0
- package/dist/auth/__tests__/create-token-provider.test.d.ts +5 -0
- package/dist/auth/__tests__/create-token-provider.test.d.ts.map +1 -0
- package/dist/auth/__tests__/create-token-provider.test.js +104 -0
- package/dist/auth/__tests__/create-token-provider.test.js.map +1 -0
- package/dist/auth/__tests__/github-app-auth.test.d.ts +5 -0
- package/dist/auth/__tests__/github-app-auth.test.d.ts.map +1 -0
- package/dist/auth/__tests__/github-app-auth.test.js +293 -0
- package/dist/auth/__tests__/github-app-auth.test.js.map +1 -0
- package/dist/auth/__tests__/static-token-provider.test.d.ts +5 -0
- package/dist/auth/__tests__/static-token-provider.test.d.ts.map +1 -0
- package/dist/auth/__tests__/static-token-provider.test.js +54 -0
- package/dist/auth/__tests__/static-token-provider.test.js.map +1 -0
- package/dist/auth/github-app-auth.d.ts +109 -0
- package/dist/auth/github-app-auth.d.ts.map +1 -0
- package/dist/auth/github-app-auth.js +262 -0
- package/dist/auth/github-app-auth.js.map +1 -0
- package/dist/auth/github-app-token-provider.d.ts +59 -0
- package/dist/auth/github-app-token-provider.d.ts.map +1 -0
- package/dist/auth/github-app-token-provider.js +68 -0
- package/dist/auth/github-app-token-provider.js.map +1 -0
- package/dist/auth/index.d.ts +45 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +74 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/static-token-provider.d.ts +35 -0
- package/dist/auth/static-token-provider.d.ts.map +1 -0
- package/dist/auth/static-token-provider.js +45 -0
- package/dist/auth/static-token-provider.js.map +1 -0
- package/dist/auth/types.d.ts +49 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +8 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/common/yaml-config.d.ts +10 -0
- package/dist/common/yaml-config.d.ts.map +1 -1
- package/dist/common/yaml-config.js.map +1 -1
- package/dist/config/__tests__/loader.test.d.ts +5 -0
- package/dist/config/__tests__/loader.test.d.ts.map +1 -0
- package/dist/config/__tests__/loader.test.js +129 -0
- package/dist/config/__tests__/loader.test.js.map +1 -0
- package/dist/config/index.d.ts +8 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +27 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +126 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +277 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/docs/index.d.ts +5 -0
- package/dist/docs/index.d.ts.map +1 -1
- package/dist/docs/index.js +6 -1
- package/dist/docs/index.js.map +1 -1
- package/dist/docs/manager.d.ts +27 -0
- package/dist/docs/manager.d.ts.map +1 -1
- package/dist/docs/manager.js +168 -15
- package/dist/docs/manager.js.map +1 -1
- package/dist/docs/type-registry.d.ts +123 -0
- package/dist/docs/type-registry.d.ts.map +1 -0
- package/dist/docs/type-registry.js +393 -0
- package/dist/docs/type-registry.js.map +1 -0
- package/dist/docs/types.d.ts +93 -0
- package/dist/docs/types.d.ts.map +1 -1
- package/dist/factories.d.ts +89 -0
- package/dist/factories.d.ts.map +1 -0
- package/dist/factories.js +228 -0
- package/dist/factories.js.map +1 -0
- package/dist/file/factory.d.ts +41 -0
- package/dist/file/factory.d.ts.map +1 -0
- package/dist/file/factory.js +237 -0
- package/dist/file/factory.js.map +1 -0
- package/dist/file/gcs.d.ts +66 -0
- package/dist/file/gcs.d.ts.map +1 -0
- package/dist/file/gcs.js +226 -0
- package/dist/file/gcs.js.map +1 -0
- package/dist/file/gdrive.d.ts +78 -0
- package/dist/file/gdrive.d.ts.map +1 -0
- package/dist/file/gdrive.js +302 -0
- package/dist/file/gdrive.js.map +1 -0
- package/dist/file/index.d.ts +13 -1
- package/dist/file/index.d.ts.map +1 -1
- package/dist/file/index.js +25 -1
- package/dist/file/index.js.map +1 -1
- package/dist/file/manager.d.ts +83 -2
- package/dist/file/manager.d.ts.map +1 -1
- package/dist/file/manager.js +125 -4
- package/dist/file/manager.js.map +1 -1
- package/dist/file/r2.d.ts +56 -0
- package/dist/file/r2.d.ts.map +1 -0
- package/dist/file/r2.js +96 -0
- package/dist/file/r2.js.map +1 -0
- package/dist/file/s3.d.ts +61 -0
- package/dist/file/s3.d.ts.map +1 -0
- package/dist/file/s3.js +258 -0
- package/dist/file/s3.js.map +1 -0
- package/dist/file/types.d.ts +145 -2
- package/dist/file/types.d.ts.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/logs/index.d.ts +1 -0
- package/dist/logs/index.d.ts.map +1 -1
- package/dist/logs/index.js +3 -1
- package/dist/logs/index.js.map +1 -1
- package/dist/logs/manager.d.ts +29 -2
- package/dist/logs/manager.d.ts.map +1 -1
- package/dist/logs/manager.js +48 -7
- package/dist/logs/manager.js.map +1 -1
- package/dist/logs/type-registry.d.ts +180 -0
- package/dist/logs/type-registry.d.ts.map +1 -0
- package/dist/logs/type-registry.js +421 -0
- package/dist/logs/type-registry.js.map +1 -0
- package/dist/logs/type-registry.test.d.ts +5 -0
- package/dist/logs/type-registry.test.d.ts.map +1 -0
- package/dist/logs/type-registry.test.js +671 -0
- package/dist/logs/type-registry.test.js.map +1 -0
- package/dist/logs/types.d.ts +2 -0
- package/dist/logs/types.d.ts.map +1 -1
- package/package.json +62 -8
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fractary/core - Storage Factory
|
|
4
|
+
*
|
|
5
|
+
* Factory function for creating storage backends based on configuration.
|
|
6
|
+
* Supports automatic configuration loading from .fractary/config.yaml.
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.createStorage = createStorage;
|
|
43
|
+
exports.sourceConfigToStorageConfig = sourceConfigToStorageConfig;
|
|
44
|
+
exports.createStorageFromSource = createStorageFromSource;
|
|
45
|
+
exports.getDefaultStorageType = getDefaultStorageType;
|
|
46
|
+
const local_1 = require("./local");
|
|
47
|
+
/**
|
|
48
|
+
* Create a storage backend from configuration
|
|
49
|
+
*
|
|
50
|
+
* @param config - Storage configuration
|
|
51
|
+
* @returns Storage instance
|
|
52
|
+
*/
|
|
53
|
+
function createStorage(config) {
|
|
54
|
+
switch (config.type) {
|
|
55
|
+
case 'local':
|
|
56
|
+
return new local_1.LocalStorage(config.basePath);
|
|
57
|
+
case 's3':
|
|
58
|
+
// Lazy load to avoid hard dependency
|
|
59
|
+
return createS3Storage(config);
|
|
60
|
+
case 'r2':
|
|
61
|
+
return createR2Storage(config);
|
|
62
|
+
case 'gcs':
|
|
63
|
+
return createGCSStorage(config);
|
|
64
|
+
case 'gdrive':
|
|
65
|
+
return createGDriveStorage(config);
|
|
66
|
+
default:
|
|
67
|
+
throw new Error(`Unsupported storage type: ${config.type}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Create S3 storage (with lazy module loading and instance caching)
|
|
72
|
+
*/
|
|
73
|
+
function createS3Storage(config) {
|
|
74
|
+
let cachedStorage = null;
|
|
75
|
+
return new Proxy({}, {
|
|
76
|
+
get(_target, prop) {
|
|
77
|
+
return async (...args) => {
|
|
78
|
+
if (!cachedStorage) {
|
|
79
|
+
const { S3Storage } = await Promise.resolve().then(() => __importStar(require('./s3')));
|
|
80
|
+
cachedStorage = new S3Storage(config);
|
|
81
|
+
}
|
|
82
|
+
return cachedStorage[prop](...args);
|
|
83
|
+
};
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Create R2 storage (with lazy module loading and instance caching)
|
|
89
|
+
*/
|
|
90
|
+
function createR2Storage(config) {
|
|
91
|
+
let cachedStorage = null;
|
|
92
|
+
return new Proxy({}, {
|
|
93
|
+
get(_target, prop) {
|
|
94
|
+
return async (...args) => {
|
|
95
|
+
if (!cachedStorage) {
|
|
96
|
+
const { R2Storage } = await Promise.resolve().then(() => __importStar(require('./r2')));
|
|
97
|
+
cachedStorage = new R2Storage(config);
|
|
98
|
+
}
|
|
99
|
+
return cachedStorage[prop](...args);
|
|
100
|
+
};
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Create GCS storage (with lazy module loading and instance caching)
|
|
106
|
+
*/
|
|
107
|
+
function createGCSStorage(config) {
|
|
108
|
+
let cachedStorage = null;
|
|
109
|
+
return new Proxy({}, {
|
|
110
|
+
get(_target, prop) {
|
|
111
|
+
return async (...args) => {
|
|
112
|
+
if (!cachedStorage) {
|
|
113
|
+
const { GCSStorage } = await Promise.resolve().then(() => __importStar(require('./gcs')));
|
|
114
|
+
cachedStorage = new GCSStorage(config);
|
|
115
|
+
}
|
|
116
|
+
return cachedStorage[prop](...args);
|
|
117
|
+
};
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Create Google Drive storage (with lazy module loading and instance caching)
|
|
123
|
+
*/
|
|
124
|
+
function createGDriveStorage(config) {
|
|
125
|
+
let cachedStorage = null;
|
|
126
|
+
return new Proxy({}, {
|
|
127
|
+
get(_target, prop) {
|
|
128
|
+
return async (...args) => {
|
|
129
|
+
if (!cachedStorage) {
|
|
130
|
+
const { GDriveStorage } = await Promise.resolve().then(() => __importStar(require('./gdrive')));
|
|
131
|
+
cachedStorage = new GDriveStorage(config);
|
|
132
|
+
}
|
|
133
|
+
return cachedStorage[prop](...args);
|
|
134
|
+
};
|
|
135
|
+
},
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Convert a source configuration from config.yaml to a StorageConfig
|
|
140
|
+
*
|
|
141
|
+
* @param source - Source configuration from config.yaml
|
|
142
|
+
* @returns StorageConfig for creating a storage backend
|
|
143
|
+
*/
|
|
144
|
+
function sourceConfigToStorageConfig(source) {
|
|
145
|
+
switch (source.type) {
|
|
146
|
+
case 'local':
|
|
147
|
+
return {
|
|
148
|
+
type: 'local',
|
|
149
|
+
basePath: source.local?.basePath || '.',
|
|
150
|
+
};
|
|
151
|
+
case 's3':
|
|
152
|
+
return {
|
|
153
|
+
type: 's3',
|
|
154
|
+
bucket: source.bucket,
|
|
155
|
+
region: source.region || 'us-east-1',
|
|
156
|
+
prefix: source.prefix,
|
|
157
|
+
auth: source.auth
|
|
158
|
+
? {
|
|
159
|
+
profile: source.auth.profile,
|
|
160
|
+
accessKeyId: expandEnvVar(source.auth.accessKeyId),
|
|
161
|
+
secretAccessKey: expandEnvVar(source.auth.secretAccessKey),
|
|
162
|
+
}
|
|
163
|
+
: undefined,
|
|
164
|
+
publicUrl: source.publicUrl,
|
|
165
|
+
};
|
|
166
|
+
case 'r2':
|
|
167
|
+
return {
|
|
168
|
+
type: 'r2',
|
|
169
|
+
bucket: source.bucket,
|
|
170
|
+
accountId: expandEnvVar(source.accountId) || '',
|
|
171
|
+
accessKeyId: expandEnvVar(source.auth?.accessKeyId) || '',
|
|
172
|
+
secretAccessKey: expandEnvVar(source.auth?.secretAccessKey) || '',
|
|
173
|
+
prefix: source.prefix,
|
|
174
|
+
publicUrl: source.publicUrl,
|
|
175
|
+
};
|
|
176
|
+
case 'gcs':
|
|
177
|
+
return {
|
|
178
|
+
type: 'gcs',
|
|
179
|
+
bucket: source.bucket,
|
|
180
|
+
projectId: source.projectId || '',
|
|
181
|
+
prefix: source.prefix,
|
|
182
|
+
keyFilePath: expandEnvVar(source.auth?.keyFilePath),
|
|
183
|
+
region: source.region,
|
|
184
|
+
};
|
|
185
|
+
case 'gdrive':
|
|
186
|
+
return {
|
|
187
|
+
type: 'gdrive',
|
|
188
|
+
folderId: source.folderId,
|
|
189
|
+
};
|
|
190
|
+
default:
|
|
191
|
+
throw new Error(`Unsupported source type: ${source.type}`);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Expand environment variable references in a string
|
|
196
|
+
*
|
|
197
|
+
* @param value - String potentially containing ${VAR_NAME} references
|
|
198
|
+
* @returns Expanded string with environment variable values
|
|
199
|
+
*/
|
|
200
|
+
function expandEnvVar(value) {
|
|
201
|
+
if (!value)
|
|
202
|
+
return value;
|
|
203
|
+
// Match ${VAR_NAME} pattern
|
|
204
|
+
return value.replace(/\$\{([^}]+)\}/g, (_match, varName) => {
|
|
205
|
+
return process.env[varName] || '';
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Create a storage backend from a named source in config.yaml
|
|
210
|
+
*
|
|
211
|
+
* @param sourceName - Name of the source (e.g., 'specs', 'logs')
|
|
212
|
+
* @param fileConfig - File plugin configuration from config.yaml
|
|
213
|
+
* @returns Storage instance
|
|
214
|
+
*/
|
|
215
|
+
function createStorageFromSource(sourceName, fileConfig) {
|
|
216
|
+
const source = fileConfig.sources?.[sourceName];
|
|
217
|
+
if (!source) {
|
|
218
|
+
throw new Error(`Source '${sourceName}' not found in configuration. Available sources: ${Object.keys(fileConfig.sources || {}).join(', ') || 'none'}`);
|
|
219
|
+
}
|
|
220
|
+
const storageConfig = sourceConfigToStorageConfig(source);
|
|
221
|
+
return createStorage(storageConfig);
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Get the default storage type based on configuration
|
|
225
|
+
*
|
|
226
|
+
* @param fileConfig - File plugin configuration
|
|
227
|
+
* @returns Default storage type
|
|
228
|
+
*/
|
|
229
|
+
function getDefaultStorageType(fileConfig) {
|
|
230
|
+
if (!fileConfig?.sources) {
|
|
231
|
+
return 'local';
|
|
232
|
+
}
|
|
233
|
+
// Return the type of the first source, or 'local' if none
|
|
234
|
+
const sources = Object.values(fileConfig.sources);
|
|
235
|
+
return sources.length > 0 ? sources[0].type : 'local';
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/file/factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fractary/core - GCS Storage Implementation
|
|
3
|
+
*
|
|
4
|
+
* Google Cloud Storage backend for file operations.
|
|
5
|
+
* Uses @google-cloud/storage with lazy loading.
|
|
6
|
+
*/
|
|
7
|
+
import { Storage, GCSStorageConfig } from './types';
|
|
8
|
+
/**
|
|
9
|
+
* Google Cloud Storage implementation
|
|
10
|
+
*/
|
|
11
|
+
export declare class GCSStorage implements Storage {
|
|
12
|
+
private config;
|
|
13
|
+
private storageClient;
|
|
14
|
+
private bucket;
|
|
15
|
+
constructor(config: GCSStorageConfig);
|
|
16
|
+
/**
|
|
17
|
+
* Get or create the GCS client (lazy loaded)
|
|
18
|
+
*/
|
|
19
|
+
private getClient;
|
|
20
|
+
/**
|
|
21
|
+
* Get the full GCS path with optional prefix
|
|
22
|
+
*/
|
|
23
|
+
private getPath;
|
|
24
|
+
/**
|
|
25
|
+
* Check if an error is a "not found" error
|
|
26
|
+
* Google Cloud SDK uses error.code (number) or error.errors[].reason
|
|
27
|
+
*/
|
|
28
|
+
private isNotFoundError;
|
|
29
|
+
/**
|
|
30
|
+
* Write content to GCS
|
|
31
|
+
*/
|
|
32
|
+
write(id: string, content: string): Promise<string>;
|
|
33
|
+
/**
|
|
34
|
+
* Read content from GCS
|
|
35
|
+
*/
|
|
36
|
+
read(id: string): Promise<string | null>;
|
|
37
|
+
/**
|
|
38
|
+
* Check if object exists in GCS
|
|
39
|
+
*/
|
|
40
|
+
exists(id: string): Promise<boolean>;
|
|
41
|
+
/**
|
|
42
|
+
* List objects in GCS with optional prefix
|
|
43
|
+
*/
|
|
44
|
+
list(prefix?: string): Promise<string[]>;
|
|
45
|
+
/**
|
|
46
|
+
* Delete object from GCS
|
|
47
|
+
*/
|
|
48
|
+
delete(id: string): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Get a signed URL for the object
|
|
51
|
+
*/
|
|
52
|
+
getUrl(id: string, expiresIn?: number): Promise<string | null>;
|
|
53
|
+
/**
|
|
54
|
+
* Get the bucket name
|
|
55
|
+
*/
|
|
56
|
+
getBucket(): string;
|
|
57
|
+
/**
|
|
58
|
+
* Get the project ID
|
|
59
|
+
*/
|
|
60
|
+
getProjectId(): string;
|
|
61
|
+
/**
|
|
62
|
+
* Get the configured prefix
|
|
63
|
+
*/
|
|
64
|
+
getPrefix(): string | undefined;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=gcs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gcs.d.ts","sourceRoot":"","sources":["../../src/file/gcs.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAMpD;;GAEG;AACH,qBAAa,UAAW,YAAW,OAAO;IACxC,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,MAAM,CAA0B;gBAE5B,MAAM,EAAE,gBAAgB;IAIpC;;OAEG;YACW,SAAS;IA8BvB;;OAEG;IACH,OAAO,CAAC,OAAO;IAOf;;;OAGG;IACH,OAAO,CAAC,eAAe;IAQvB;;OAEG;IACG,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAazD;;OAEG;IACG,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAqB9C;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiB1C;;OAEG;IACG,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAkB9C;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAevC;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,GAAE,MAAc,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAkB3E;;OAEG;IACH,SAAS,IAAI,MAAM;IAInB;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,SAAS,IAAI,MAAM,GAAG,SAAS;CAGhC"}
|
package/dist/file/gcs.js
ADDED
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fractary/core - GCS Storage Implementation
|
|
4
|
+
*
|
|
5
|
+
* Google Cloud Storage backend for file operations.
|
|
6
|
+
* Uses @google-cloud/storage with lazy loading.
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.GCSStorage = void 0;
|
|
43
|
+
/**
|
|
44
|
+
* Google Cloud Storage implementation
|
|
45
|
+
*/
|
|
46
|
+
class GCSStorage {
|
|
47
|
+
config;
|
|
48
|
+
storageClient = null;
|
|
49
|
+
bucket = null;
|
|
50
|
+
constructor(config) {
|
|
51
|
+
this.config = config;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get or create the GCS client (lazy loaded)
|
|
55
|
+
*/
|
|
56
|
+
async getClient() {
|
|
57
|
+
if (this.storageClient && this.bucket) {
|
|
58
|
+
return { storage: this.storageClient, bucket: this.bucket };
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
// Dynamic import to avoid hard dependency
|
|
62
|
+
const { Storage: GCStorage } = await Promise.resolve().then(() => __importStar(require('@google-cloud/storage')));
|
|
63
|
+
const clientConfig = {
|
|
64
|
+
projectId: this.config.projectId,
|
|
65
|
+
};
|
|
66
|
+
// Use key file if provided
|
|
67
|
+
if (this.config.keyFilePath) {
|
|
68
|
+
clientConfig.keyFilename = this.config.keyFilePath;
|
|
69
|
+
}
|
|
70
|
+
// Otherwise, use Application Default Credentials (ADC)
|
|
71
|
+
this.storageClient = new GCStorage(clientConfig);
|
|
72
|
+
this.bucket = this.storageClient.bucket(this.config.bucket);
|
|
73
|
+
return { storage: this.storageClient, bucket: this.bucket };
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
throw new Error('Google Cloud Storage SDK not available. Install with: npm install @google-cloud/storage');
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Get the full GCS path with optional prefix
|
|
81
|
+
*/
|
|
82
|
+
getPath(id) {
|
|
83
|
+
if (this.config.prefix) {
|
|
84
|
+
return `${this.config.prefix.replace(/\/$/, '')}/${id}`;
|
|
85
|
+
}
|
|
86
|
+
return id;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Check if an error is a "not found" error
|
|
90
|
+
* Google Cloud SDK uses error.code (number) or error.errors[].reason
|
|
91
|
+
*/
|
|
92
|
+
isNotFoundError(error) {
|
|
93
|
+
return (error.code === 404 ||
|
|
94
|
+
error.code === 'ENOENT' ||
|
|
95
|
+
error.errors?.some((e) => e.reason === 'notFound'));
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Write content to GCS
|
|
99
|
+
*/
|
|
100
|
+
async write(id, content) {
|
|
101
|
+
const { bucket } = await this.getClient();
|
|
102
|
+
const path = this.getPath(id);
|
|
103
|
+
const file = bucket.file(path);
|
|
104
|
+
await file.save(content, {
|
|
105
|
+
contentType: 'text/plain; charset=utf-8',
|
|
106
|
+
resumable: false,
|
|
107
|
+
});
|
|
108
|
+
return `gs://${this.config.bucket}/${path}`;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Read content from GCS
|
|
112
|
+
*/
|
|
113
|
+
async read(id) {
|
|
114
|
+
const { bucket } = await this.getClient();
|
|
115
|
+
const path = this.getPath(id);
|
|
116
|
+
const file = bucket.file(path);
|
|
117
|
+
try {
|
|
118
|
+
const [exists] = await file.exists();
|
|
119
|
+
if (!exists) {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
const [contents] = await file.download();
|
|
123
|
+
return contents.toString('utf-8');
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
if (this.isNotFoundError(error)) {
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
throw error;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Check if object exists in GCS
|
|
134
|
+
*/
|
|
135
|
+
async exists(id) {
|
|
136
|
+
const { bucket } = await this.getClient();
|
|
137
|
+
const path = this.getPath(id);
|
|
138
|
+
const file = bucket.file(path);
|
|
139
|
+
try {
|
|
140
|
+
const [exists] = await file.exists();
|
|
141
|
+
return exists;
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
// Only treat "not found" as false, rethrow other errors
|
|
145
|
+
if (this.isNotFoundError(error)) {
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
throw error;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* List objects in GCS with optional prefix
|
|
153
|
+
*/
|
|
154
|
+
async list(prefix) {
|
|
155
|
+
const { bucket } = await this.getClient();
|
|
156
|
+
const fullPrefix = prefix ? this.getPath(prefix) : this.config.prefix || '';
|
|
157
|
+
const [files] = await bucket.getFiles({
|
|
158
|
+
prefix: fullPrefix,
|
|
159
|
+
});
|
|
160
|
+
return files.map((file) => {
|
|
161
|
+
let name = file.name;
|
|
162
|
+
// Remove the configured prefix from the path for consistency
|
|
163
|
+
if (this.config.prefix && name.startsWith(this.config.prefix)) {
|
|
164
|
+
name = name.slice(this.config.prefix.length).replace(/^\//, '');
|
|
165
|
+
}
|
|
166
|
+
return name;
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Delete object from GCS
|
|
171
|
+
*/
|
|
172
|
+
async delete(id) {
|
|
173
|
+
const { bucket } = await this.getClient();
|
|
174
|
+
const path = this.getPath(id);
|
|
175
|
+
const file = bucket.file(path);
|
|
176
|
+
try {
|
|
177
|
+
await file.delete();
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
// Ignore if file doesn't exist
|
|
181
|
+
if (!this.isNotFoundError(error)) {
|
|
182
|
+
throw error;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Get a signed URL for the object
|
|
188
|
+
*/
|
|
189
|
+
async getUrl(id, expiresIn = 86400) {
|
|
190
|
+
const { bucket } = await this.getClient();
|
|
191
|
+
const path = this.getPath(id);
|
|
192
|
+
const file = bucket.file(path);
|
|
193
|
+
try {
|
|
194
|
+
const [url] = await file.getSignedUrl({
|
|
195
|
+
version: 'v4',
|
|
196
|
+
action: 'read',
|
|
197
|
+
expires: Date.now() + expiresIn * 1000,
|
|
198
|
+
});
|
|
199
|
+
return url;
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
// Fall back to gs:// URI if signing fails (e.g., no key file)
|
|
203
|
+
return `gs://${this.config.bucket}/${path}`;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Get the bucket name
|
|
208
|
+
*/
|
|
209
|
+
getBucket() {
|
|
210
|
+
return this.config.bucket;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Get the project ID
|
|
214
|
+
*/
|
|
215
|
+
getProjectId() {
|
|
216
|
+
return this.config.projectId;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Get the configured prefix
|
|
220
|
+
*/
|
|
221
|
+
getPrefix() {
|
|
222
|
+
return this.config.prefix;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
exports.GCSStorage = GCSStorage;
|
|
226
|
+
//# sourceMappingURL=gcs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gcs.js","sourceRoot":"","sources":["../../src/file/gcs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fractary/core - Google Drive Storage Implementation
|
|
3
|
+
*
|
|
4
|
+
* Google Drive storage backend for file operations.
|
|
5
|
+
* Uses googleapis with lazy loading.
|
|
6
|
+
*
|
|
7
|
+
* Note: Google Drive doesn't use traditional file paths. This implementation
|
|
8
|
+
* maps path-like identifiers to Google Drive files by name within a folder.
|
|
9
|
+
*/
|
|
10
|
+
import { Storage, GDriveStorageConfig } from './types';
|
|
11
|
+
/**
|
|
12
|
+
* Google Drive storage implementation
|
|
13
|
+
*/
|
|
14
|
+
export declare class GDriveStorage implements Storage {
|
|
15
|
+
private config;
|
|
16
|
+
private driveClient;
|
|
17
|
+
constructor(config: GDriveStorageConfig);
|
|
18
|
+
/**
|
|
19
|
+
* Get or create the Google Drive client (lazy loaded)
|
|
20
|
+
*/
|
|
21
|
+
private getClient;
|
|
22
|
+
/**
|
|
23
|
+
* Get the parent folder ID (internal helper)
|
|
24
|
+
*/
|
|
25
|
+
private getParentFolderId;
|
|
26
|
+
/**
|
|
27
|
+
* Extract file name from path-like ID
|
|
28
|
+
*/
|
|
29
|
+
private getFileName;
|
|
30
|
+
/**
|
|
31
|
+
* Escape a string for use in Google Drive query syntax
|
|
32
|
+
* Single quotes must be escaped with backslash
|
|
33
|
+
*/
|
|
34
|
+
private escapeQueryString;
|
|
35
|
+
/**
|
|
36
|
+
* Check if a string looks like a Google Drive file ID
|
|
37
|
+
* Drive file IDs are typically 28-44 characters, alphanumeric with - and _
|
|
38
|
+
*/
|
|
39
|
+
private isFileId;
|
|
40
|
+
/**
|
|
41
|
+
* Check if an error is a "not found" error
|
|
42
|
+
* Google APIs uses error.code (number) or error.errors[].reason
|
|
43
|
+
*/
|
|
44
|
+
private isNotFoundError;
|
|
45
|
+
/**
|
|
46
|
+
* Find a file by name in the configured folder
|
|
47
|
+
*/
|
|
48
|
+
private findFile;
|
|
49
|
+
/**
|
|
50
|
+
* Write content to Google Drive
|
|
51
|
+
*/
|
|
52
|
+
write(id: string, content: string): Promise<string>;
|
|
53
|
+
/**
|
|
54
|
+
* Read content from Google Drive
|
|
55
|
+
*/
|
|
56
|
+
read(id: string): Promise<string | null>;
|
|
57
|
+
/**
|
|
58
|
+
* Check if file exists in Google Drive
|
|
59
|
+
*/
|
|
60
|
+
exists(id: string): Promise<boolean>;
|
|
61
|
+
/**
|
|
62
|
+
* List files in the configured Google Drive folder
|
|
63
|
+
*/
|
|
64
|
+
list(prefix?: string): Promise<string[]>;
|
|
65
|
+
/**
|
|
66
|
+
* Delete file from Google Drive
|
|
67
|
+
*/
|
|
68
|
+
delete(id: string): Promise<void>;
|
|
69
|
+
/**
|
|
70
|
+
* Get a shareable URL for the file
|
|
71
|
+
*/
|
|
72
|
+
getUrl(id: string, _expiresIn?: number): Promise<string | null>;
|
|
73
|
+
/**
|
|
74
|
+
* Get the configured folder ID
|
|
75
|
+
*/
|
|
76
|
+
getFolderId(): string;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=gdrive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gdrive.d.ts","sourceRoot":"","sources":["../../src/file/gdrive.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAMvD;;GAEG;AACH,qBAAa,aAAc,YAAW,OAAO;IAC3C,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,WAAW,CAA4B;gBAEnC,MAAM,EAAE,mBAAmB;IAIvC;;OAEG;YACW,SAAS;IA0CvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IACH,OAAO,CAAC,WAAW;IAMnB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;;OAGG;IACH,OAAO,CAAC,QAAQ;IAKhB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAQvB;;OAEG;YACW,QAAQ;IAmBtB;;OAEG;IACG,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA+CzD;;OAEG;IACG,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAyB9C;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAa1C;;OAEG;IACG,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAkC9C;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBvC;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAWrE;;OAEG;IACH,WAAW,IAAI,MAAM;CAGtB"}
|