@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
package/dist/file/index.js
CHANGED
|
@@ -3,6 +3,13 @@
|
|
|
3
3
|
* @fractary/core - File Module
|
|
4
4
|
*
|
|
5
5
|
* File storage operations across local and cloud storage backends.
|
|
6
|
+
*
|
|
7
|
+
* Supported backends:
|
|
8
|
+
* - LocalStorage: Local filesystem
|
|
9
|
+
* - S3Storage: AWS S3 (requires @aws-sdk/client-s3)
|
|
10
|
+
* - R2Storage: Cloudflare R2 (requires @aws-sdk/client-s3)
|
|
11
|
+
* - GCSStorage: Google Cloud Storage (requires @google-cloud/storage)
|
|
12
|
+
* - GDriveStorage: Google Drive (requires googleapis)
|
|
6
13
|
*/
|
|
7
14
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
15
|
if (k2 === undefined) k2 = k;
|
|
@@ -19,10 +26,27 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
19
26
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
20
27
|
};
|
|
21
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
-
exports.LocalStorage = exports.FileManager = void 0;
|
|
29
|
+
exports.getDefaultStorageType = exports.sourceConfigToStorageConfig = exports.createStorageFromSource = exports.createStorage = exports.GDriveStorage = exports.GCSStorage = exports.R2Storage = exports.S3Storage = exports.LocalStorage = exports.FileManager = void 0;
|
|
30
|
+
// Core exports
|
|
23
31
|
var manager_1 = require("./manager");
|
|
24
32
|
Object.defineProperty(exports, "FileManager", { enumerable: true, get: function () { return manager_1.FileManager; } });
|
|
25
33
|
var local_1 = require("./local");
|
|
26
34
|
Object.defineProperty(exports, "LocalStorage", { enumerable: true, get: function () { return local_1.LocalStorage; } });
|
|
35
|
+
// Cloud storage implementations (lazy loaded)
|
|
36
|
+
var s3_1 = require("./s3");
|
|
37
|
+
Object.defineProperty(exports, "S3Storage", { enumerable: true, get: function () { return s3_1.S3Storage; } });
|
|
38
|
+
var r2_1 = require("./r2");
|
|
39
|
+
Object.defineProperty(exports, "R2Storage", { enumerable: true, get: function () { return r2_1.R2Storage; } });
|
|
40
|
+
var gcs_1 = require("./gcs");
|
|
41
|
+
Object.defineProperty(exports, "GCSStorage", { enumerable: true, get: function () { return gcs_1.GCSStorage; } });
|
|
42
|
+
var gdrive_1 = require("./gdrive");
|
|
43
|
+
Object.defineProperty(exports, "GDriveStorage", { enumerable: true, get: function () { return gdrive_1.GDriveStorage; } });
|
|
44
|
+
// Factory functions
|
|
45
|
+
var factory_1 = require("./factory");
|
|
46
|
+
Object.defineProperty(exports, "createStorage", { enumerable: true, get: function () { return factory_1.createStorage; } });
|
|
47
|
+
Object.defineProperty(exports, "createStorageFromSource", { enumerable: true, get: function () { return factory_1.createStorageFromSource; } });
|
|
48
|
+
Object.defineProperty(exports, "sourceConfigToStorageConfig", { enumerable: true, get: function () { return factory_1.sourceConfigToStorageConfig; } });
|
|
49
|
+
Object.defineProperty(exports, "getDefaultStorageType", { enumerable: true, get: function () { return factory_1.getDefaultStorageType; } });
|
|
50
|
+
// Type exports
|
|
27
51
|
__exportStar(require("./types"), exports);
|
|
28
52
|
//# sourceMappingURL=index.js.map
|
package/dist/file/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/file/index.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/file/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;;;;;;;;;;;;;;;AAEH,eAAe;AACf,qCAA4D;AAAnD,sGAAA,WAAW,OAAA;AACpB,iCAAuC;AAA9B,qGAAA,YAAY,OAAA;AAErB,8CAA8C;AAC9C,2BAAiC;AAAxB,+FAAA,SAAS,OAAA;AAClB,2BAAiC;AAAxB,+FAAA,SAAS,OAAA;AAClB,6BAAmC;AAA1B,iGAAA,UAAU,OAAA;AACnB,mCAAyC;AAAhC,uGAAA,aAAa,OAAA;AAEtB,oBAAoB;AACpB,qCAKmB;AAJjB,wGAAA,aAAa,OAAA;AACb,kHAAA,uBAAuB,OAAA;AACvB,sHAAA,2BAA2B,OAAA;AAC3B,gHAAA,qBAAqB,OAAA;AAGvB,eAAe;AACf,0CAAwB"}
|
package/dist/file/manager.d.ts
CHANGED
|
@@ -2,41 +2,122 @@
|
|
|
2
2
|
* @fractary/core - File Manager
|
|
3
3
|
*
|
|
4
4
|
* Unified interface for file storage operations.
|
|
5
|
+
* Supports multiple storage backends: local, S3, R2, GCS, Google Drive.
|
|
5
6
|
*/
|
|
6
|
-
import { FileManagerConfig } from './types';
|
|
7
|
+
import { Storage, FileManagerConfig, StorageConfig } from './types';
|
|
8
|
+
/**
|
|
9
|
+
* Extended configuration options for FileManager
|
|
10
|
+
*/
|
|
11
|
+
export interface FileManagerOptions extends FileManagerConfig {
|
|
12
|
+
/**
|
|
13
|
+
* Storage configuration for automatic backend selection
|
|
14
|
+
* If provided, this takes precedence over storage and basePath
|
|
15
|
+
*/
|
|
16
|
+
storageConfig?: StorageConfig;
|
|
17
|
+
}
|
|
7
18
|
/**
|
|
8
19
|
* File Manager - Unified interface for file operations
|
|
20
|
+
*
|
|
21
|
+
* Provides a consistent API for file operations across different storage backends.
|
|
22
|
+
* Supports local filesystem, AWS S3, Cloudflare R2, Google Cloud Storage,
|
|
23
|
+
* and Google Drive.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* // Local storage (default)
|
|
27
|
+
* const localManager = new FileManager({ basePath: '.fractary/files' });
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* // S3 storage with configuration
|
|
31
|
+
* const s3Manager = new FileManager({
|
|
32
|
+
* storageConfig: {
|
|
33
|
+
* type: 's3',
|
|
34
|
+
* bucket: 'my-bucket',
|
|
35
|
+
* region: 'us-east-1',
|
|
36
|
+
* prefix: 'files/',
|
|
37
|
+
* auth: { profile: 'default' }
|
|
38
|
+
* }
|
|
39
|
+
* });
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* // Custom storage backend
|
|
43
|
+
* const customManager = new FileManager({
|
|
44
|
+
* storage: myCustomStorage
|
|
45
|
+
* });
|
|
9
46
|
*/
|
|
10
47
|
export declare class FileManager {
|
|
11
48
|
private storage;
|
|
12
|
-
constructor(config
|
|
49
|
+
constructor(config?: FileManagerOptions);
|
|
50
|
+
/**
|
|
51
|
+
* Validate a file path for security issues
|
|
52
|
+
*
|
|
53
|
+
* @param path - Path to validate
|
|
54
|
+
* @throws Error if path is invalid or contains security issues
|
|
55
|
+
*/
|
|
56
|
+
private validatePath;
|
|
13
57
|
/**
|
|
14
58
|
* Write file content
|
|
59
|
+
*
|
|
60
|
+
* @param path - Path/identifier for the file
|
|
61
|
+
* @param content - Content to write
|
|
62
|
+
* @returns URI or path where the content was written
|
|
15
63
|
*/
|
|
16
64
|
write(path: string, content: string): Promise<string>;
|
|
17
65
|
/**
|
|
18
66
|
* Read file content
|
|
67
|
+
*
|
|
68
|
+
* @param path - Path/identifier for the file
|
|
69
|
+
* @returns File content or null if not found
|
|
19
70
|
*/
|
|
20
71
|
read(path: string): Promise<string | null>;
|
|
21
72
|
/**
|
|
22
73
|
* Check if file exists
|
|
74
|
+
*
|
|
75
|
+
* @param path - Path/identifier for the file
|
|
76
|
+
* @returns True if the file exists
|
|
23
77
|
*/
|
|
24
78
|
exists(path: string): Promise<boolean>;
|
|
25
79
|
/**
|
|
26
80
|
* List files (optionally with prefix)
|
|
81
|
+
*
|
|
82
|
+
* @param prefix - Optional prefix to filter results
|
|
83
|
+
* @returns List of file paths/identifiers
|
|
27
84
|
*/
|
|
28
85
|
list(prefix?: string): Promise<string[]>;
|
|
29
86
|
/**
|
|
30
87
|
* Delete file
|
|
88
|
+
*
|
|
89
|
+
* @param path - Path/identifier for the file
|
|
31
90
|
*/
|
|
32
91
|
delete(path: string): Promise<void>;
|
|
33
92
|
/**
|
|
34
93
|
* Copy file from one location to another
|
|
94
|
+
*
|
|
95
|
+
* @param sourcePath - Source path/identifier
|
|
96
|
+
* @param destPath - Destination path/identifier
|
|
97
|
+
* @returns URI or path where the content was copied
|
|
35
98
|
*/
|
|
36
99
|
copy(sourcePath: string, destPath: string): Promise<string>;
|
|
37
100
|
/**
|
|
38
101
|
* Move file from one location to another
|
|
102
|
+
*
|
|
103
|
+
* @param sourcePath - Source path/identifier
|
|
104
|
+
* @param destPath - Destination path/identifier
|
|
105
|
+
* @returns URI or path where the content was moved
|
|
39
106
|
*/
|
|
40
107
|
move(sourcePath: string, destPath: string): Promise<string>;
|
|
108
|
+
/**
|
|
109
|
+
* Get a URL for the file (if supported by the storage backend)
|
|
110
|
+
*
|
|
111
|
+
* @param path - Path/identifier for the file
|
|
112
|
+
* @param expiresIn - Expiration time in seconds (for presigned URLs)
|
|
113
|
+
* @returns URL or null if not supported
|
|
114
|
+
*/
|
|
115
|
+
getUrl(path: string, expiresIn?: number): Promise<string | null>;
|
|
116
|
+
/**
|
|
117
|
+
* Get the underlying storage backend
|
|
118
|
+
*
|
|
119
|
+
* @returns The storage instance
|
|
120
|
+
*/
|
|
121
|
+
getStorage(): Storage;
|
|
41
122
|
}
|
|
42
123
|
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/file/manager.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/file/manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAIpE;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB;IAC3D;;;OAGG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAU;gBAEb,MAAM,CAAC,EAAE,kBAAkB;IAYvC;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IA0BpB;;;;;;OAMG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK3D;;;;;OAKG;IACG,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAKhD;;;;;OAKG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK5C;;;;;OAKG;IACG,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAO9C;;;;OAIG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKzC;;;;;;OAMG;IACG,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAUjE;;;;;;OAMG;IACG,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQjE;;;;;;OAMG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAQtE;;;;OAIG;IACH,UAAU,IAAI,OAAO;CAGtB"}
|
package/dist/file/manager.js
CHANGED
|
@@ -3,66 +3,187 @@
|
|
|
3
3
|
* @fractary/core - File Manager
|
|
4
4
|
*
|
|
5
5
|
* Unified interface for file storage operations.
|
|
6
|
+
* Supports multiple storage backends: local, S3, R2, GCS, Google Drive.
|
|
6
7
|
*/
|
|
7
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
9
|
exports.FileManager = void 0;
|
|
9
10
|
const local_1 = require("./local");
|
|
11
|
+
const factory_1 = require("./factory");
|
|
10
12
|
/**
|
|
11
13
|
* File Manager - Unified interface for file operations
|
|
14
|
+
*
|
|
15
|
+
* Provides a consistent API for file operations across different storage backends.
|
|
16
|
+
* Supports local filesystem, AWS S3, Cloudflare R2, Google Cloud Storage,
|
|
17
|
+
* and Google Drive.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* // Local storage (default)
|
|
21
|
+
* const localManager = new FileManager({ basePath: '.fractary/files' });
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* // S3 storage with configuration
|
|
25
|
+
* const s3Manager = new FileManager({
|
|
26
|
+
* storageConfig: {
|
|
27
|
+
* type: 's3',
|
|
28
|
+
* bucket: 'my-bucket',
|
|
29
|
+
* region: 'us-east-1',
|
|
30
|
+
* prefix: 'files/',
|
|
31
|
+
* auth: { profile: 'default' }
|
|
32
|
+
* }
|
|
33
|
+
* });
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* // Custom storage backend
|
|
37
|
+
* const customManager = new FileManager({
|
|
38
|
+
* storage: myCustomStorage
|
|
39
|
+
* });
|
|
12
40
|
*/
|
|
13
41
|
class FileManager {
|
|
14
42
|
storage;
|
|
15
43
|
constructor(config) {
|
|
16
|
-
|
|
44
|
+
// Priority: storageConfig > storage > LocalStorage with basePath
|
|
45
|
+
if (config?.storageConfig) {
|
|
46
|
+
this.storage = (0, factory_1.createStorage)(config.storageConfig);
|
|
47
|
+
}
|
|
48
|
+
else if (config?.storage) {
|
|
49
|
+
this.storage = config.storage;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
const basePath = config?.basePath || '.fractary/files';
|
|
53
|
+
this.storage = new local_1.LocalStorage(basePath);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Validate a file path for security issues
|
|
58
|
+
*
|
|
59
|
+
* @param path - Path to validate
|
|
60
|
+
* @throws Error if path is invalid or contains security issues
|
|
61
|
+
*/
|
|
62
|
+
validatePath(path) {
|
|
63
|
+
if (!path || path.trim() === '') {
|
|
64
|
+
throw new Error('Path cannot be empty');
|
|
65
|
+
}
|
|
66
|
+
// Check for directory traversal sequences
|
|
67
|
+
if (path.includes('..')) {
|
|
68
|
+
throw new Error('Path cannot contain directory traversal sequences (..)');
|
|
69
|
+
}
|
|
70
|
+
// Check for null bytes (potential security issue)
|
|
71
|
+
if (path.includes('\0')) {
|
|
72
|
+
throw new Error('Path cannot contain null bytes');
|
|
73
|
+
}
|
|
74
|
+
// Check for absolute paths on Windows
|
|
75
|
+
if (/^[a-zA-Z]:/.test(path)) {
|
|
76
|
+
throw new Error('Absolute Windows paths are not allowed');
|
|
77
|
+
}
|
|
78
|
+
// Check for absolute Unix paths (starting with /)
|
|
79
|
+
if (path.startsWith('/')) {
|
|
80
|
+
throw new Error('Absolute paths are not allowed');
|
|
81
|
+
}
|
|
17
82
|
}
|
|
18
83
|
/**
|
|
19
84
|
* Write file content
|
|
85
|
+
*
|
|
86
|
+
* @param path - Path/identifier for the file
|
|
87
|
+
* @param content - Content to write
|
|
88
|
+
* @returns URI or path where the content was written
|
|
20
89
|
*/
|
|
21
90
|
async write(path, content) {
|
|
91
|
+
this.validatePath(path);
|
|
22
92
|
return this.storage.write(path, content);
|
|
23
93
|
}
|
|
24
94
|
/**
|
|
25
95
|
* Read file content
|
|
96
|
+
*
|
|
97
|
+
* @param path - Path/identifier for the file
|
|
98
|
+
* @returns File content or null if not found
|
|
26
99
|
*/
|
|
27
100
|
async read(path) {
|
|
101
|
+
this.validatePath(path);
|
|
28
102
|
return this.storage.read(path);
|
|
29
103
|
}
|
|
30
104
|
/**
|
|
31
105
|
* Check if file exists
|
|
106
|
+
*
|
|
107
|
+
* @param path - Path/identifier for the file
|
|
108
|
+
* @returns True if the file exists
|
|
32
109
|
*/
|
|
33
110
|
async exists(path) {
|
|
111
|
+
this.validatePath(path);
|
|
34
112
|
return this.storage.exists(path);
|
|
35
113
|
}
|
|
36
114
|
/**
|
|
37
115
|
* List files (optionally with prefix)
|
|
116
|
+
*
|
|
117
|
+
* @param prefix - Optional prefix to filter results
|
|
118
|
+
* @returns List of file paths/identifiers
|
|
38
119
|
*/
|
|
39
120
|
async list(prefix) {
|
|
121
|
+
if (prefix) {
|
|
122
|
+
this.validatePath(prefix);
|
|
123
|
+
}
|
|
40
124
|
return this.storage.list(prefix);
|
|
41
125
|
}
|
|
42
126
|
/**
|
|
43
127
|
* Delete file
|
|
128
|
+
*
|
|
129
|
+
* @param path - Path/identifier for the file
|
|
44
130
|
*/
|
|
45
131
|
async delete(path) {
|
|
132
|
+
this.validatePath(path);
|
|
46
133
|
return this.storage.delete(path);
|
|
47
134
|
}
|
|
48
135
|
/**
|
|
49
136
|
* Copy file from one location to another
|
|
137
|
+
*
|
|
138
|
+
* @param sourcePath - Source path/identifier
|
|
139
|
+
* @param destPath - Destination path/identifier
|
|
140
|
+
* @returns URI or path where the content was copied
|
|
50
141
|
*/
|
|
51
142
|
async copy(sourcePath, destPath) {
|
|
52
|
-
|
|
143
|
+
this.validatePath(sourcePath);
|
|
144
|
+
this.validatePath(destPath);
|
|
145
|
+
const content = await this.storage.read(sourcePath);
|
|
53
146
|
if (!content) {
|
|
54
147
|
throw new Error(`Source file not found: ${sourcePath}`);
|
|
55
148
|
}
|
|
56
|
-
return this.write(destPath, content);
|
|
149
|
+
return this.storage.write(destPath, content);
|
|
57
150
|
}
|
|
58
151
|
/**
|
|
59
152
|
* Move file from one location to another
|
|
153
|
+
*
|
|
154
|
+
* @param sourcePath - Source path/identifier
|
|
155
|
+
* @param destPath - Destination path/identifier
|
|
156
|
+
* @returns URI or path where the content was moved
|
|
60
157
|
*/
|
|
61
158
|
async move(sourcePath, destPath) {
|
|
159
|
+
this.validatePath(sourcePath);
|
|
160
|
+
this.validatePath(destPath);
|
|
62
161
|
const result = await this.copy(sourcePath, destPath);
|
|
63
|
-
await this.delete(sourcePath);
|
|
162
|
+
await this.storage.delete(sourcePath);
|
|
64
163
|
return result;
|
|
65
164
|
}
|
|
165
|
+
/**
|
|
166
|
+
* Get a URL for the file (if supported by the storage backend)
|
|
167
|
+
*
|
|
168
|
+
* @param path - Path/identifier for the file
|
|
169
|
+
* @param expiresIn - Expiration time in seconds (for presigned URLs)
|
|
170
|
+
* @returns URL or null if not supported
|
|
171
|
+
*/
|
|
172
|
+
async getUrl(path, expiresIn) {
|
|
173
|
+
this.validatePath(path);
|
|
174
|
+
if (this.storage.getUrl) {
|
|
175
|
+
return this.storage.getUrl(path, expiresIn);
|
|
176
|
+
}
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Get the underlying storage backend
|
|
181
|
+
*
|
|
182
|
+
* @returns The storage instance
|
|
183
|
+
*/
|
|
184
|
+
getStorage() {
|
|
185
|
+
return this.storage;
|
|
186
|
+
}
|
|
66
187
|
}
|
|
67
188
|
exports.FileManager = FileManager;
|
|
68
189
|
//# sourceMappingURL=manager.js.map
|
package/dist/file/manager.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/file/manager.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/file/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fractary/core - R2 Storage Implementation
|
|
3
|
+
*
|
|
4
|
+
* Cloudflare R2 storage backend for file operations.
|
|
5
|
+
* R2 is S3-compatible, so this uses the AWS SDK with R2 endpoint.
|
|
6
|
+
*/
|
|
7
|
+
import { Storage, R2StorageConfig } from './types';
|
|
8
|
+
/**
|
|
9
|
+
* Cloudflare R2 storage implementation
|
|
10
|
+
*
|
|
11
|
+
* Uses S3Storage internally with R2-specific endpoint configuration.
|
|
12
|
+
*/
|
|
13
|
+
export declare class R2Storage implements Storage {
|
|
14
|
+
private s3Storage;
|
|
15
|
+
private config;
|
|
16
|
+
constructor(config: R2StorageConfig);
|
|
17
|
+
/**
|
|
18
|
+
* Write content to R2
|
|
19
|
+
*/
|
|
20
|
+
write(id: string, content: string): Promise<string>;
|
|
21
|
+
/**
|
|
22
|
+
* Read content from R2
|
|
23
|
+
*/
|
|
24
|
+
read(id: string): Promise<string | null>;
|
|
25
|
+
/**
|
|
26
|
+
* Check if object exists in R2
|
|
27
|
+
*/
|
|
28
|
+
exists(id: string): Promise<boolean>;
|
|
29
|
+
/**
|
|
30
|
+
* List objects in R2 with optional prefix
|
|
31
|
+
*/
|
|
32
|
+
list(prefix?: string): Promise<string[]>;
|
|
33
|
+
/**
|
|
34
|
+
* Delete object from R2
|
|
35
|
+
*/
|
|
36
|
+
delete(id: string): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Get a URL for the object
|
|
39
|
+
*
|
|
40
|
+
* R2 supports presigned URLs, and can also use public bucket URLs.
|
|
41
|
+
*/
|
|
42
|
+
getUrl(id: string, expiresIn?: number): Promise<string | null>;
|
|
43
|
+
/**
|
|
44
|
+
* Get the bucket name
|
|
45
|
+
*/
|
|
46
|
+
getBucket(): string;
|
|
47
|
+
/**
|
|
48
|
+
* Get the account ID
|
|
49
|
+
*/
|
|
50
|
+
getAccountId(): string;
|
|
51
|
+
/**
|
|
52
|
+
* Get the configured prefix
|
|
53
|
+
*/
|
|
54
|
+
getPrefix(): string | undefined;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=r2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"r2.d.ts","sourceRoot":"","sources":["../../src/file/r2.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,eAAe,EAAmB,MAAM,SAAS,CAAC;AAGpE;;;;GAIG;AACH,qBAAa,SAAU,YAAW,OAAO;IACvC,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,MAAM,CAAkB;gBAEpB,MAAM,EAAE,eAAe;IAoBnC;;OAEG;IACG,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMzD;;OAEG;IACG,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAI9C;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAI1C;;OAEG;IACG,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAI9C;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvC;;;;OAIG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,GAAE,MAAc,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAI3E;;OAEG;IACH,SAAS,IAAI,MAAM;IAInB;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,SAAS,IAAI,MAAM,GAAG,SAAS;CAGhC"}
|
package/dist/file/r2.js
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fractary/core - R2 Storage Implementation
|
|
4
|
+
*
|
|
5
|
+
* Cloudflare R2 storage backend for file operations.
|
|
6
|
+
* R2 is S3-compatible, so this uses the AWS SDK with R2 endpoint.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.R2Storage = void 0;
|
|
10
|
+
const s3_1 = require("./s3");
|
|
11
|
+
/**
|
|
12
|
+
* Cloudflare R2 storage implementation
|
|
13
|
+
*
|
|
14
|
+
* Uses S3Storage internally with R2-specific endpoint configuration.
|
|
15
|
+
*/
|
|
16
|
+
class R2Storage {
|
|
17
|
+
s3Storage;
|
|
18
|
+
config;
|
|
19
|
+
constructor(config) {
|
|
20
|
+
this.config = config;
|
|
21
|
+
// Convert R2 config to S3-compatible config
|
|
22
|
+
const s3Config = {
|
|
23
|
+
type: 's3',
|
|
24
|
+
bucket: config.bucket,
|
|
25
|
+
region: 'auto', // R2 uses 'auto' region
|
|
26
|
+
prefix: config.prefix,
|
|
27
|
+
endpoint: `https://${config.accountId}.r2.cloudflarestorage.com`,
|
|
28
|
+
publicUrl: config.publicUrl,
|
|
29
|
+
auth: {
|
|
30
|
+
accessKeyId: config.accessKeyId,
|
|
31
|
+
secretAccessKey: config.secretAccessKey,
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
this.s3Storage = new s3_1.S3Storage(s3Config);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Write content to R2
|
|
38
|
+
*/
|
|
39
|
+
async write(id, content) {
|
|
40
|
+
const result = await this.s3Storage.write(id, content);
|
|
41
|
+
// Return R2-style URI
|
|
42
|
+
return result.replace('s3://', 'r2://');
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Read content from R2
|
|
46
|
+
*/
|
|
47
|
+
async read(id) {
|
|
48
|
+
return this.s3Storage.read(id);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Check if object exists in R2
|
|
52
|
+
*/
|
|
53
|
+
async exists(id) {
|
|
54
|
+
return this.s3Storage.exists(id);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* List objects in R2 with optional prefix
|
|
58
|
+
*/
|
|
59
|
+
async list(prefix) {
|
|
60
|
+
return this.s3Storage.list(prefix);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Delete object from R2
|
|
64
|
+
*/
|
|
65
|
+
async delete(id) {
|
|
66
|
+
return this.s3Storage.delete(id);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get a URL for the object
|
|
70
|
+
*
|
|
71
|
+
* R2 supports presigned URLs, and can also use public bucket URLs.
|
|
72
|
+
*/
|
|
73
|
+
async getUrl(id, expiresIn = 86400) {
|
|
74
|
+
return this.s3Storage.getUrl(id, expiresIn);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Get the bucket name
|
|
78
|
+
*/
|
|
79
|
+
getBucket() {
|
|
80
|
+
return this.config.bucket;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Get the account ID
|
|
84
|
+
*/
|
|
85
|
+
getAccountId() {
|
|
86
|
+
return this.config.accountId;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get the configured prefix
|
|
90
|
+
*/
|
|
91
|
+
getPrefix() {
|
|
92
|
+
return this.config.prefix;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
exports.R2Storage = R2Storage;
|
|
96
|
+
//# sourceMappingURL=r2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"r2.js","sourceRoot":"","sources":["../../src/file/r2.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAGH,6BAAiC;AAEjC;;;;GAIG;AACH,MAAa,SAAS;IACZ,SAAS,CAAY;IACrB,MAAM,CAAkB;IAEhC,YAAY,MAAuB;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,4CAA4C;QAC5C,MAAM,QAAQ,GAAoB;YAChC,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,MAAM,EAAE,wBAAwB;YACxC,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,QAAQ,EAAE,WAAW,MAAM,CAAC,SAAS,2BAA2B;YAChE,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,IAAI,EAAE;gBACJ,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,eAAe,EAAE,MAAM,CAAC,eAAe;aACxC;SACF,CAAC;QAEF,IAAI,CAAC,SAAS,GAAG,IAAI,cAAS,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,EAAU,EAAE,OAAe;QACrC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACvD,sBAAsB;QACtB,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,EAAU;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,MAAe;QACxB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,YAAoB,KAAK;QAChD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5B,CAAC;CACF;AA1FD,8BA0FC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fractary/core - S3 Storage Implementation
|
|
3
|
+
*
|
|
4
|
+
* AWS S3 storage backend for file operations.
|
|
5
|
+
* Uses AWS SDK v3 with lazy loading to avoid hard dependencies.
|
|
6
|
+
*/
|
|
7
|
+
import { Storage, S3StorageConfig } from './types';
|
|
8
|
+
/**
|
|
9
|
+
* AWS S3 storage implementation
|
|
10
|
+
*/
|
|
11
|
+
export declare class S3Storage implements Storage {
|
|
12
|
+
private config;
|
|
13
|
+
private s3Client;
|
|
14
|
+
constructor(config: S3StorageConfig);
|
|
15
|
+
/**
|
|
16
|
+
* Get or create the S3 client (lazy loaded)
|
|
17
|
+
*/
|
|
18
|
+
private getClient;
|
|
19
|
+
/**
|
|
20
|
+
* Get the full S3 key with optional prefix
|
|
21
|
+
*/
|
|
22
|
+
private getKey;
|
|
23
|
+
/**
|
|
24
|
+
* Check if an error is a "not found" error
|
|
25
|
+
* AWS SDK v3 uses error.name and error.$metadata.httpStatusCode
|
|
26
|
+
*/
|
|
27
|
+
private isNotFoundError;
|
|
28
|
+
/**
|
|
29
|
+
* Write content to S3
|
|
30
|
+
*/
|
|
31
|
+
write(id: string, content: string): Promise<string>;
|
|
32
|
+
/**
|
|
33
|
+
* Read content from S3
|
|
34
|
+
*/
|
|
35
|
+
read(id: string): Promise<string | null>;
|
|
36
|
+
/**
|
|
37
|
+
* Check if object exists in S3
|
|
38
|
+
*/
|
|
39
|
+
exists(id: string): Promise<boolean>;
|
|
40
|
+
/**
|
|
41
|
+
* List objects in S3 with optional prefix
|
|
42
|
+
*/
|
|
43
|
+
list(prefix?: string): Promise<string[]>;
|
|
44
|
+
/**
|
|
45
|
+
* Delete object from S3
|
|
46
|
+
*/
|
|
47
|
+
delete(id: string): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Get a presigned URL for the object
|
|
50
|
+
*/
|
|
51
|
+
getUrl(id: string, expiresIn?: number): Promise<string | null>;
|
|
52
|
+
/**
|
|
53
|
+
* Get the bucket name
|
|
54
|
+
*/
|
|
55
|
+
getBucket(): string;
|
|
56
|
+
/**
|
|
57
|
+
* Get the configured prefix
|
|
58
|
+
*/
|
|
59
|
+
getPrefix(): string | undefined;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=s3.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"s3.d.ts","sourceRoot":"","sources":["../../src/file/s3.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAKnD;;GAEG;AACH,qBAAa,SAAU,YAAW,OAAO;IACvC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,QAAQ,CAAyB;gBAE7B,MAAM,EAAE,eAAe;IAInC;;OAEG;YACW,SAAS;IAwCvB;;OAEG;IACH,OAAO,CAAC,MAAM;IAOd;;;OAGG;IACH,OAAO,CAAC,eAAe;IAQvB;;OAEG;IACG,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgBzD;;OAEG;IACG,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA4B9C;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAsB1C;;OAEG;IACG,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAoC9C;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAavC;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,GAAE,MAAc,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA4B3E;;OAEG;IACH,SAAS,IAAI,MAAM;IAInB;;OAEG;IACH,SAAS,IAAI,MAAM,GAAG,SAAS;CAGhC"}
|