@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.
Files changed (138) hide show
  1. package/dist/__tests__/factories.test.d.ts +5 -0
  2. package/dist/__tests__/factories.test.d.ts.map +1 -0
  3. package/dist/__tests__/factories.test.js +66 -0
  4. package/dist/__tests__/factories.test.js.map +1 -0
  5. package/dist/auth/__tests__/create-token-provider.test.d.ts +5 -0
  6. package/dist/auth/__tests__/create-token-provider.test.d.ts.map +1 -0
  7. package/dist/auth/__tests__/create-token-provider.test.js +104 -0
  8. package/dist/auth/__tests__/create-token-provider.test.js.map +1 -0
  9. package/dist/auth/__tests__/github-app-auth.test.d.ts +5 -0
  10. package/dist/auth/__tests__/github-app-auth.test.d.ts.map +1 -0
  11. package/dist/auth/__tests__/github-app-auth.test.js +293 -0
  12. package/dist/auth/__tests__/github-app-auth.test.js.map +1 -0
  13. package/dist/auth/__tests__/static-token-provider.test.d.ts +5 -0
  14. package/dist/auth/__tests__/static-token-provider.test.d.ts.map +1 -0
  15. package/dist/auth/__tests__/static-token-provider.test.js +54 -0
  16. package/dist/auth/__tests__/static-token-provider.test.js.map +1 -0
  17. package/dist/auth/github-app-auth.d.ts +109 -0
  18. package/dist/auth/github-app-auth.d.ts.map +1 -0
  19. package/dist/auth/github-app-auth.js +262 -0
  20. package/dist/auth/github-app-auth.js.map +1 -0
  21. package/dist/auth/github-app-token-provider.d.ts +59 -0
  22. package/dist/auth/github-app-token-provider.d.ts.map +1 -0
  23. package/dist/auth/github-app-token-provider.js +68 -0
  24. package/dist/auth/github-app-token-provider.js.map +1 -0
  25. package/dist/auth/index.d.ts +45 -0
  26. package/dist/auth/index.d.ts.map +1 -0
  27. package/dist/auth/index.js +74 -0
  28. package/dist/auth/index.js.map +1 -0
  29. package/dist/auth/static-token-provider.d.ts +35 -0
  30. package/dist/auth/static-token-provider.d.ts.map +1 -0
  31. package/dist/auth/static-token-provider.js +45 -0
  32. package/dist/auth/static-token-provider.js.map +1 -0
  33. package/dist/auth/types.d.ts +49 -0
  34. package/dist/auth/types.d.ts.map +1 -0
  35. package/dist/auth/types.js +8 -0
  36. package/dist/auth/types.js.map +1 -0
  37. package/dist/common/__tests__/secrets.test.d.ts +7 -0
  38. package/dist/common/__tests__/secrets.test.d.ts.map +1 -0
  39. package/dist/common/__tests__/secrets.test.js +320 -0
  40. package/dist/common/__tests__/secrets.test.js.map +1 -0
  41. package/dist/common/config.d.ts +6 -4
  42. package/dist/common/config.d.ts.map +1 -1
  43. package/dist/common/config.js +4 -30
  44. package/dist/common/config.js.map +1 -1
  45. package/dist/common/index.d.ts +1 -0
  46. package/dist/common/index.d.ts.map +1 -1
  47. package/dist/common/index.js +1 -0
  48. package/dist/common/index.js.map +1 -1
  49. package/dist/common/secrets.d.ts +68 -0
  50. package/dist/common/secrets.d.ts.map +1 -0
  51. package/dist/common/secrets.js +180 -0
  52. package/dist/common/secrets.js.map +1 -0
  53. package/dist/common/yaml-config.d.ts +10 -0
  54. package/dist/common/yaml-config.d.ts.map +1 -1
  55. package/dist/common/yaml-config.js.map +1 -1
  56. package/dist/config/__tests__/loader.test.d.ts +5 -0
  57. package/dist/config/__tests__/loader.test.d.ts.map +1 -0
  58. package/dist/config/__tests__/loader.test.js +129 -0
  59. package/dist/config/__tests__/loader.test.js.map +1 -0
  60. package/dist/config/index.d.ts +8 -0
  61. package/dist/config/index.d.ts.map +1 -0
  62. package/dist/config/index.js +27 -0
  63. package/dist/config/index.js.map +1 -0
  64. package/dist/config/loader.d.ts +126 -0
  65. package/dist/config/loader.d.ts.map +1 -0
  66. package/dist/config/loader.js +277 -0
  67. package/dist/config/loader.js.map +1 -0
  68. package/dist/docs/index.d.ts +5 -0
  69. package/dist/docs/index.d.ts.map +1 -1
  70. package/dist/docs/index.js +6 -1
  71. package/dist/docs/index.js.map +1 -1
  72. package/dist/docs/manager.d.ts +27 -0
  73. package/dist/docs/manager.d.ts.map +1 -1
  74. package/dist/docs/manager.js +168 -15
  75. package/dist/docs/manager.js.map +1 -1
  76. package/dist/docs/type-registry.d.ts +123 -0
  77. package/dist/docs/type-registry.d.ts.map +1 -0
  78. package/dist/docs/type-registry.js +393 -0
  79. package/dist/docs/type-registry.js.map +1 -0
  80. package/dist/docs/types.d.ts +93 -0
  81. package/dist/docs/types.d.ts.map +1 -1
  82. package/dist/factories.d.ts +89 -0
  83. package/dist/factories.d.ts.map +1 -0
  84. package/dist/factories.js +228 -0
  85. package/dist/factories.js.map +1 -0
  86. package/dist/file/factory.d.ts +41 -0
  87. package/dist/file/factory.d.ts.map +1 -0
  88. package/dist/file/factory.js +237 -0
  89. package/dist/file/factory.js.map +1 -0
  90. package/dist/file/gcs.d.ts +66 -0
  91. package/dist/file/gcs.d.ts.map +1 -0
  92. package/dist/file/gcs.js +226 -0
  93. package/dist/file/gcs.js.map +1 -0
  94. package/dist/file/gdrive.d.ts +78 -0
  95. package/dist/file/gdrive.d.ts.map +1 -0
  96. package/dist/file/gdrive.js +302 -0
  97. package/dist/file/gdrive.js.map +1 -0
  98. package/dist/file/index.d.ts +13 -1
  99. package/dist/file/index.d.ts.map +1 -1
  100. package/dist/file/index.js +25 -1
  101. package/dist/file/index.js.map +1 -1
  102. package/dist/file/manager.d.ts +83 -2
  103. package/dist/file/manager.d.ts.map +1 -1
  104. package/dist/file/manager.js +125 -4
  105. package/dist/file/manager.js.map +1 -1
  106. package/dist/file/r2.d.ts +56 -0
  107. package/dist/file/r2.d.ts.map +1 -0
  108. package/dist/file/r2.js +96 -0
  109. package/dist/file/r2.js.map +1 -0
  110. package/dist/file/s3.d.ts +61 -0
  111. package/dist/file/s3.d.ts.map +1 -0
  112. package/dist/file/s3.js +258 -0
  113. package/dist/file/s3.js.map +1 -0
  114. package/dist/file/types.d.ts +145 -2
  115. package/dist/file/types.d.ts.map +1 -1
  116. package/dist/index.d.ts +3 -0
  117. package/dist/index.d.ts.map +1 -1
  118. package/dist/index.js +6 -0
  119. package/dist/index.js.map +1 -1
  120. package/dist/logs/index.d.ts +1 -0
  121. package/dist/logs/index.d.ts.map +1 -1
  122. package/dist/logs/index.js +3 -1
  123. package/dist/logs/index.js.map +1 -1
  124. package/dist/logs/manager.d.ts +29 -2
  125. package/dist/logs/manager.d.ts.map +1 -1
  126. package/dist/logs/manager.js +48 -7
  127. package/dist/logs/manager.js.map +1 -1
  128. package/dist/logs/type-registry.d.ts +180 -0
  129. package/dist/logs/type-registry.d.ts.map +1 -0
  130. package/dist/logs/type-registry.js +421 -0
  131. package/dist/logs/type-registry.js.map +1 -0
  132. package/dist/logs/type-registry.test.d.ts +5 -0
  133. package/dist/logs/type-registry.test.d.ts.map +1 -0
  134. package/dist/logs/type-registry.test.js +671 -0
  135. package/dist/logs/type-registry.test.js.map +1 -0
  136. package/dist/logs/types.d.ts +2 -0
  137. package/dist/logs/types.d.ts.map +1 -1
  138. 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"}