@fractary/core 0.3.3 → 0.5.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/__tests__/secrets.test.d.ts +7 -0
- package/dist/common/__tests__/secrets.test.d.ts.map +1 -0
- package/dist/common/__tests__/secrets.test.js +320 -0
- package/dist/common/__tests__/secrets.test.js.map +1 -0
- package/dist/common/config.d.ts +6 -4
- package/dist/common/config.d.ts.map +1 -1
- package/dist/common/config.js +4 -30
- package/dist/common/config.js.map +1 -1
- package/dist/common/index.d.ts +1 -0
- package/dist/common/index.d.ts.map +1 -1
- package/dist/common/index.js +1 -0
- package/dist/common/index.js.map +1 -1
- package/dist/common/secrets.d.ts +68 -0
- package/dist/common/secrets.d.ts.map +1 -0
- package/dist/common/secrets.js +180 -0
- package/dist/common/secrets.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 +76 -8
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fractary/core - Manager Factories
|
|
4
|
+
*
|
|
5
|
+
* Factory functions for creating authenticated managers.
|
|
6
|
+
* Provides a convenient way to create WorkManager and RepoManager
|
|
7
|
+
* with automatic configuration loading and authentication.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.createWorkManager = createWorkManager;
|
|
11
|
+
exports.createRepoManager = createRepoManager;
|
|
12
|
+
exports.createManagers = createManagers;
|
|
13
|
+
const work_1 = require("./work");
|
|
14
|
+
const repo_1 = require("./repo");
|
|
15
|
+
const loader_1 = require("./config/loader");
|
|
16
|
+
const errors_1 = require("./common/errors");
|
|
17
|
+
/** Regex pattern for valid GitHub owner/repo format */
|
|
18
|
+
const PROJECT_FORMAT_REGEX = /^[a-zA-Z0-9_.-]+\/[a-zA-Z0-9_.-]+$/;
|
|
19
|
+
/**
|
|
20
|
+
* Validate and parse project string into owner/repo
|
|
21
|
+
*
|
|
22
|
+
* @param project Project string in "owner/repo" format
|
|
23
|
+
* @returns Tuple of [owner, repo] or null if invalid
|
|
24
|
+
* @throws ConfigurationError if format is invalid
|
|
25
|
+
*/
|
|
26
|
+
function parseProject(project) {
|
|
27
|
+
if (!project || typeof project !== 'string') {
|
|
28
|
+
throw new errors_1.ConfigurationError('Invalid project configuration: project must be a non-empty string', { project });
|
|
29
|
+
}
|
|
30
|
+
const trimmed = project.trim();
|
|
31
|
+
if (!PROJECT_FORMAT_REGEX.test(trimmed)) {
|
|
32
|
+
throw new errors_1.ConfigurationError(`Invalid project format: "${project}". Expected "owner/repo" format (e.g., "fractary/core")`, { project });
|
|
33
|
+
}
|
|
34
|
+
const parts = trimmed.split('/');
|
|
35
|
+
if (parts.length !== 2 || !parts[0] || !parts[1]) {
|
|
36
|
+
throw new errors_1.ConfigurationError(`Invalid project format: "${project}". Expected exactly one "/" separator`, { project });
|
|
37
|
+
}
|
|
38
|
+
return [parts[0], parts[1]];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Build WorkConfig from LoadedConfig
|
|
42
|
+
*
|
|
43
|
+
* @param config Loaded configuration
|
|
44
|
+
* @param token Token from token provider (if available)
|
|
45
|
+
* @returns WorkConfig for WorkManager
|
|
46
|
+
* @throws ConfigurationError if project format is invalid
|
|
47
|
+
*/
|
|
48
|
+
function buildWorkConfig(config, token) {
|
|
49
|
+
// Get platform from work config or default to github
|
|
50
|
+
const workConfig = config.work;
|
|
51
|
+
const activeHandler = workConfig?.active_handler || 'github';
|
|
52
|
+
// Map active_handler to platform
|
|
53
|
+
const platform = activeHandler;
|
|
54
|
+
// Get handler-specific config
|
|
55
|
+
const handlerConfig = workConfig?.handlers?.[activeHandler] || {};
|
|
56
|
+
// Extract owner/repo from project string if needed
|
|
57
|
+
let owner = handlerConfig.owner;
|
|
58
|
+
let repo = handlerConfig.repo;
|
|
59
|
+
const project = handlerConfig.project || config.github?.project;
|
|
60
|
+
// Parse and validate project format if we need to extract owner/repo
|
|
61
|
+
if (!owner && !repo && project) {
|
|
62
|
+
[owner, repo] = parseProject(project);
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
platform,
|
|
66
|
+
owner,
|
|
67
|
+
repo,
|
|
68
|
+
project: project,
|
|
69
|
+
token: token || handlerConfig.token || config.github?.token,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Build RepoConfig from LoadedConfig
|
|
74
|
+
*
|
|
75
|
+
* @param config Loaded configuration
|
|
76
|
+
* @param token Token from token provider (if available)
|
|
77
|
+
* @returns RepoConfig for RepoManager
|
|
78
|
+
* @throws ConfigurationError if project format is invalid
|
|
79
|
+
*/
|
|
80
|
+
function buildRepoConfig(config, token) {
|
|
81
|
+
// Get platform from repo config or default to github
|
|
82
|
+
const repoConfig = config.repo;
|
|
83
|
+
const activeHandler = repoConfig?.active_handler || 'github';
|
|
84
|
+
// Map active_handler to platform
|
|
85
|
+
const platform = activeHandler;
|
|
86
|
+
// Get handler-specific config
|
|
87
|
+
const handlerConfig = repoConfig?.handlers?.[activeHandler] || {};
|
|
88
|
+
// Get defaults
|
|
89
|
+
const defaults = repoConfig?.defaults || {};
|
|
90
|
+
// Extract owner/repo from project string if needed
|
|
91
|
+
let owner = handlerConfig.owner;
|
|
92
|
+
let repo = handlerConfig.repo;
|
|
93
|
+
const project = handlerConfig.project || config.github?.project;
|
|
94
|
+
// Parse and validate project format if we need to extract owner/repo
|
|
95
|
+
if (!owner && !repo && project) {
|
|
96
|
+
[owner, repo] = parseProject(project);
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
platform,
|
|
100
|
+
owner,
|
|
101
|
+
repo,
|
|
102
|
+
defaultBranch: defaults.default_branch || handlerConfig.default_branch,
|
|
103
|
+
token: token || handlerConfig.token || config.github?.token,
|
|
104
|
+
branchPrefixes: defaults.branch_naming?.prefixes,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Create an authenticated WorkManager
|
|
109
|
+
*
|
|
110
|
+
* Loads configuration automatically and creates a WorkManager
|
|
111
|
+
* with proper authentication.
|
|
112
|
+
*
|
|
113
|
+
* @param options Creation options
|
|
114
|
+
* @returns Configured WorkManager instance
|
|
115
|
+
*
|
|
116
|
+
* @example
|
|
117
|
+
* ```typescript
|
|
118
|
+
* // Simple usage - auto-loads config and auth
|
|
119
|
+
* const workManager = await createWorkManager();
|
|
120
|
+
* const issues = await workManager.searchIssues('bug');
|
|
121
|
+
*
|
|
122
|
+
* // With pre-loaded config
|
|
123
|
+
* const config = await loadConfig();
|
|
124
|
+
* const workManager = await createWorkManager({ config });
|
|
125
|
+
* ```
|
|
126
|
+
*/
|
|
127
|
+
async function createWorkManager(options = {}) {
|
|
128
|
+
const { config: providedConfig, skipAuth = false } = options;
|
|
129
|
+
// Load config if not provided
|
|
130
|
+
const config = providedConfig || await (0, loader_1.loadConfig)({ skipAuth });
|
|
131
|
+
// Get token from provider if available
|
|
132
|
+
let token;
|
|
133
|
+
if (!skipAuth && config.tokenProvider) {
|
|
134
|
+
try {
|
|
135
|
+
token = await config.tokenProvider.getToken();
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
// Token provider failed - continue without token
|
|
139
|
+
// The manager will fall back to gh CLI auth
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Build WorkConfig
|
|
143
|
+
const workConfig = buildWorkConfig(config, token);
|
|
144
|
+
return new work_1.WorkManager(workConfig);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Create an authenticated RepoManager
|
|
148
|
+
*
|
|
149
|
+
* Loads configuration automatically and creates a RepoManager
|
|
150
|
+
* with proper authentication.
|
|
151
|
+
*
|
|
152
|
+
* @param options Creation options
|
|
153
|
+
* @returns Configured RepoManager instance
|
|
154
|
+
*
|
|
155
|
+
* @example
|
|
156
|
+
* ```typescript
|
|
157
|
+
* // Simple usage - auto-loads config and auth
|
|
158
|
+
* const repoManager = await createRepoManager();
|
|
159
|
+
* const status = repoManager.getStatus();
|
|
160
|
+
*
|
|
161
|
+
* // With explicit working directory
|
|
162
|
+
* const repoManager = await createRepoManager({ cwd: '/path/to/repo' });
|
|
163
|
+
*
|
|
164
|
+
* // With pre-loaded config
|
|
165
|
+
* const config = await loadConfig();
|
|
166
|
+
* const repoManager = await createRepoManager({ config });
|
|
167
|
+
* ```
|
|
168
|
+
*/
|
|
169
|
+
async function createRepoManager(options = {}) {
|
|
170
|
+
const { config: providedConfig, cwd, skipAuth = false } = options;
|
|
171
|
+
// Load config if not provided
|
|
172
|
+
const config = providedConfig || await (0, loader_1.loadConfig)({ skipAuth });
|
|
173
|
+
// Get token from provider if available
|
|
174
|
+
let token;
|
|
175
|
+
if (!skipAuth && config.tokenProvider) {
|
|
176
|
+
try {
|
|
177
|
+
token = await config.tokenProvider.getToken();
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
// Token provider failed - continue without token
|
|
181
|
+
// The manager will fall back to gh CLI auth
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// Build RepoConfig
|
|
185
|
+
const repoConfig = buildRepoConfig(config, token);
|
|
186
|
+
return new repo_1.RepoManager(repoConfig, cwd);
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Create both WorkManager and RepoManager with shared config
|
|
190
|
+
*
|
|
191
|
+
* Useful when you need both managers and want to share
|
|
192
|
+
* configuration and authentication.
|
|
193
|
+
*
|
|
194
|
+
* @param options Creation options
|
|
195
|
+
* @returns Object with both managers
|
|
196
|
+
*
|
|
197
|
+
* @example
|
|
198
|
+
* ```typescript
|
|
199
|
+
* const { work, repo } = await createManagers();
|
|
200
|
+
*
|
|
201
|
+
* // Fetch issue and create branch
|
|
202
|
+
* const issue = await work.fetchIssue(123);
|
|
203
|
+
* await repo.createBranch(`feature/${issue.number}-${slug(issue.title)}`);
|
|
204
|
+
* ```
|
|
205
|
+
*/
|
|
206
|
+
async function createManagers(options = {}) {
|
|
207
|
+
const { config: providedConfig, cwd, skipAuth = false } = options;
|
|
208
|
+
// Load config once
|
|
209
|
+
const config = providedConfig || await (0, loader_1.loadConfig)({ skipAuth });
|
|
210
|
+
// Get token once
|
|
211
|
+
let token;
|
|
212
|
+
if (!skipAuth && config.tokenProvider) {
|
|
213
|
+
try {
|
|
214
|
+
token = await config.tokenProvider.getToken();
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
// Token provider failed - continue without token
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// Build configs
|
|
221
|
+
const workConfig = buildWorkConfig(config, token);
|
|
222
|
+
const repoConfig = buildRepoConfig(config, token);
|
|
223
|
+
return {
|
|
224
|
+
work: new work_1.WorkManager(workConfig),
|
|
225
|
+
repo: new repo_1.RepoManager(repoConfig, cwd),
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=factories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factories.js","sourceRoot":"","sources":["../src/factories.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fractary/core - Storage Factory
|
|
3
|
+
*
|
|
4
|
+
* Factory function for creating storage backends based on configuration.
|
|
5
|
+
* Supports automatic configuration loading from .fractary/config.yaml.
|
|
6
|
+
*/
|
|
7
|
+
import { Storage, StorageConfig, StorageType, SourceConfig } from './types';
|
|
8
|
+
/**
|
|
9
|
+
* Create a storage backend from configuration
|
|
10
|
+
*
|
|
11
|
+
* @param config - Storage configuration
|
|
12
|
+
* @returns Storage instance
|
|
13
|
+
*/
|
|
14
|
+
export declare function createStorage(config: StorageConfig): Storage;
|
|
15
|
+
/**
|
|
16
|
+
* Convert a source configuration from config.yaml to a StorageConfig
|
|
17
|
+
*
|
|
18
|
+
* @param source - Source configuration from config.yaml
|
|
19
|
+
* @returns StorageConfig for creating a storage backend
|
|
20
|
+
*/
|
|
21
|
+
export declare function sourceConfigToStorageConfig(source: SourceConfig): StorageConfig;
|
|
22
|
+
/**
|
|
23
|
+
* Create a storage backend from a named source in config.yaml
|
|
24
|
+
*
|
|
25
|
+
* @param sourceName - Name of the source (e.g., 'specs', 'logs')
|
|
26
|
+
* @param fileConfig - File plugin configuration from config.yaml
|
|
27
|
+
* @returns Storage instance
|
|
28
|
+
*/
|
|
29
|
+
export declare function createStorageFromSource(sourceName: string, fileConfig: {
|
|
30
|
+
sources?: Record<string, SourceConfig>;
|
|
31
|
+
}): Storage;
|
|
32
|
+
/**
|
|
33
|
+
* Get the default storage type based on configuration
|
|
34
|
+
*
|
|
35
|
+
* @param fileConfig - File plugin configuration
|
|
36
|
+
* @returns Default storage type
|
|
37
|
+
*/
|
|
38
|
+
export declare function getDefaultStorageType(fileConfig?: {
|
|
39
|
+
sources?: Record<string, SourceConfig>;
|
|
40
|
+
}): StorageType;
|
|
41
|
+
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/file/factory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,OAAO,EACP,aAAa,EACb,WAAW,EAMX,YAAY,EACb,MAAM,SAAS,CAAC;AAGjB;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAqB5D;AA8ED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,YAAY,GAAG,aAAa,CAsD/E;AAiBD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;CAAE,GACrD,OAAO,CAaT;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;CAAE,GACtD,WAAW,CAQb"}
|
|
@@ -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"}
|