@devbro/neko-storage 0.1.0 → 0.1.2
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/README.md +60 -0
- package/dist/AWSS3Storage.mjs +32 -39
- package/dist/AWSS3Storage.mjs.map +1 -1
- package/dist/LocalStorage.mjs +2 -4
- package/dist/LocalStorage.mjs.map +1 -1
- package/dist/Storage.mjs +0 -3
- package/dist/Storage.mjs.map +1 -1
- package/dist/StorageFactory.mjs +3 -8
- package/dist/StorageFactory.mjs.map +1 -1
- package/dist/index.js +302 -11
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +5 -5
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -2
- package/dist/AWSS3Storage.d.ts +0 -23
- package/dist/AWSS3Storage.js +0 -194
- package/dist/AWSS3Storage.js.map +0 -1
- package/dist/LocalStorage.d.ts +0 -21
- package/dist/LocalStorage.js +0 -162
- package/dist/LocalStorage.js.map +0 -1
- package/dist/Storage.d.ts +0 -20
- package/dist/Storage.js +0 -42
- package/dist/Storage.js.map +0 -1
- package/dist/StorageFactory.d.ts +0 -13
- package/dist/StorageFactory.js +0 -52
- package/dist/StorageFactory.js.map +0 -1
- package/dist/index.d.ts +0 -8
- package/dist/types.d.ts +0 -15
- package/dist/types.js +0 -17
- package/dist/types.js.map +0 -1
package/README.md
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# @devbro/neko-storage
|
|
2
|
+
|
|
3
|
+
a library to abstract file storage and management.
|
|
4
|
+
|
|
5
|
+
## basic usage
|
|
6
|
+
|
|
7
|
+
```ts
|
|
8
|
+
import { Storage, StorageFactory } from '@devbro/neko-storage';
|
|
9
|
+
|
|
10
|
+
const storage: Storage = StorageFactory.create(???);
|
|
11
|
+
|
|
12
|
+
// put a file, if file exists already, it will override it.
|
|
13
|
+
content : string | object | Stream | Buffer = ??? ;
|
|
14
|
+
let success = await storage.put('path/to/file/filename.ext', content);
|
|
15
|
+
|
|
16
|
+
// check if the file exists or not
|
|
17
|
+
let file_exists = await storage.exists('path/to/file/filename.ext');
|
|
18
|
+
|
|
19
|
+
// get some details about the file, depending on type of drive metadata may differ
|
|
20
|
+
let file_metadata = await storage.metadata('path/to/file/filename.ext');
|
|
21
|
+
/*
|
|
22
|
+
{
|
|
23
|
+
size: 12345; //bytes
|
|
24
|
+
mimeType: 'application/json';
|
|
25
|
+
lastModifiedDate: 'date string';
|
|
26
|
+
}
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
// get the file in the format you want, if fails it will throw an Error
|
|
30
|
+
let file_content_as_Json = await storage.getJson('path/to/file/filename.ext');
|
|
31
|
+
let file_content_as_String = await storage.getString('path/to/file/filename.ext');
|
|
32
|
+
let file_content_as_Buffer = await storage.getBuffer('path/to/file/filename.ext');
|
|
33
|
+
let file_content_as_Stream = await storage.getStream('path/to/file/filename.ext');
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
// delete a file
|
|
37
|
+
let is_file_deleted = await storage.delete('path/to/file/filename.ext');
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## available drivers
|
|
41
|
+
|
|
42
|
+
local
|
|
43
|
+
|
|
44
|
+
```ts
|
|
45
|
+
import { Storage, StorageFactory } from '@devbro/neko-storage';
|
|
46
|
+
|
|
47
|
+
const basePath = path.resolve(os.tmpdir(), `test-storage-${randomUUID()}`);
|
|
48
|
+
const storage: Storage = StorageFactory.create({ engine: 'local', basePath });
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
AWS S3
|
|
52
|
+
|
|
53
|
+
```ts
|
|
54
|
+
import { Storage, StorageFactory } from '@devbro/neko-storage';
|
|
55
|
+
|
|
56
|
+
const s3Config : AWSS3Config = ???;
|
|
57
|
+
const storage: Storage = StorageFactory.create({ engine: 's3', { s3Config } });
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
More driver available upon request or through PR.
|
package/dist/AWSS3Storage.mjs
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
2
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
4
|
-
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
5
3
|
var __async = (__this, __arguments, generator) => {
|
|
6
4
|
return new Promise((resolve, reject) => {
|
|
7
5
|
var fulfilled = (value) => {
|
|
@@ -22,15 +20,19 @@ var __async = (__this, __arguments, generator) => {
|
|
|
22
20
|
step((generator = generator.apply(__this, __arguments)).next());
|
|
23
21
|
});
|
|
24
22
|
};
|
|
25
|
-
import { Storage } from "./Storage";
|
|
26
|
-
import {
|
|
23
|
+
import { Storage } from "./Storage.mjs";
|
|
24
|
+
import {
|
|
25
|
+
S3Client,
|
|
26
|
+
HeadObjectCommand,
|
|
27
|
+
PutObjectCommand,
|
|
28
|
+
GetObjectCommand,
|
|
29
|
+
DeleteObjectCommand
|
|
30
|
+
} from "@aws-sdk/client-s3";
|
|
27
31
|
import Stream from "stream";
|
|
28
32
|
const _AWSS3Storage = class _AWSS3Storage extends Storage {
|
|
29
33
|
constructor(config) {
|
|
30
34
|
var _a;
|
|
31
35
|
super(config);
|
|
32
|
-
__publicField(this, "config");
|
|
33
|
-
__publicField(this, "s3");
|
|
34
36
|
this.config = config;
|
|
35
37
|
if (!_AWSS3Storage.canHandle(config)) {
|
|
36
38
|
throw new Error(`storage engine cannot handle this config.`);
|
|
@@ -44,10 +46,7 @@ const _AWSS3Storage = class _AWSS3Storage extends Storage {
|
|
|
44
46
|
return __async(this, null, function* () {
|
|
45
47
|
var _a;
|
|
46
48
|
try {
|
|
47
|
-
yield this.s3.send(new HeadObjectCommand({
|
|
48
|
-
Bucket: (_a = this.config) == null ? void 0 : _a.bucket,
|
|
49
|
-
Key: path
|
|
50
|
-
}));
|
|
49
|
+
yield this.s3.send(new HeadObjectCommand({ Bucket: (_a = this.config) == null ? void 0 : _a.bucket, Key: path }));
|
|
51
50
|
return true;
|
|
52
51
|
} catch (error) {
|
|
53
52
|
if (error.name === "NotFound") {
|
|
@@ -69,39 +68,36 @@ const _AWSS3Storage = class _AWSS3Storage extends Storage {
|
|
|
69
68
|
} else {
|
|
70
69
|
throw new Error("Unsupported content type");
|
|
71
70
|
}
|
|
72
|
-
yield this.s3.send(
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
71
|
+
yield this.s3.send(
|
|
72
|
+
new PutObjectCommand({
|
|
73
|
+
Bucket: this.config.bucket,
|
|
74
|
+
Key: path,
|
|
75
|
+
Body: body
|
|
76
|
+
})
|
|
77
|
+
);
|
|
77
78
|
return true;
|
|
78
79
|
});
|
|
79
80
|
}
|
|
80
81
|
getJson(path) {
|
|
81
82
|
return __async(this, null, function* () {
|
|
82
|
-
const data = yield this.s3.send(
|
|
83
|
-
Bucket: this.config.bucket,
|
|
84
|
-
|
|
85
|
-
}));
|
|
83
|
+
const data = yield this.s3.send(
|
|
84
|
+
new GetObjectCommand({ Bucket: this.config.bucket, Key: path })
|
|
85
|
+
);
|
|
86
86
|
const body = yield this.streamToString(data.Body);
|
|
87
87
|
return JSON.parse(body);
|
|
88
88
|
});
|
|
89
89
|
}
|
|
90
90
|
getString(path) {
|
|
91
91
|
return __async(this, null, function* () {
|
|
92
|
-
const data = yield this.s3.send(
|
|
93
|
-
Bucket: this.config.bucket,
|
|
94
|
-
|
|
95
|
-
}));
|
|
92
|
+
const data = yield this.s3.send(
|
|
93
|
+
new GetObjectCommand({ Bucket: this.config.bucket, Key: path })
|
|
94
|
+
);
|
|
96
95
|
return yield this.streamToString(data.Body);
|
|
97
96
|
});
|
|
98
97
|
}
|
|
99
98
|
delete(path) {
|
|
100
99
|
return __async(this, null, function* () {
|
|
101
|
-
yield this.s3.send(new DeleteObjectCommand({
|
|
102
|
-
Bucket: this.config.bucket,
|
|
103
|
-
Key: path
|
|
104
|
-
}));
|
|
100
|
+
yield this.s3.send(new DeleteObjectCommand({ Bucket: this.config.bucket, Key: path }));
|
|
105
101
|
return true;
|
|
106
102
|
});
|
|
107
103
|
}
|
|
@@ -117,10 +113,9 @@ const _AWSS3Storage = class _AWSS3Storage extends Storage {
|
|
|
117
113
|
}
|
|
118
114
|
getBuffer(path) {
|
|
119
115
|
return __async(this, null, function* () {
|
|
120
|
-
const data = yield this.s3.send(
|
|
121
|
-
Bucket: this.config.bucket,
|
|
122
|
-
|
|
123
|
-
}));
|
|
116
|
+
const data = yield this.s3.send(
|
|
117
|
+
new GetObjectCommand({ Bucket: this.config.bucket, Key: path })
|
|
118
|
+
);
|
|
124
119
|
const chunks = [];
|
|
125
120
|
const stream = data.Body;
|
|
126
121
|
return new Promise((resolve, reject) => {
|
|
@@ -132,19 +127,17 @@ const _AWSS3Storage = class _AWSS3Storage extends Storage {
|
|
|
132
127
|
}
|
|
133
128
|
getStream(path) {
|
|
134
129
|
return __async(this, null, function* () {
|
|
135
|
-
const data = yield this.s3.send(
|
|
136
|
-
Bucket: this.config.bucket,
|
|
137
|
-
|
|
138
|
-
}));
|
|
130
|
+
const data = yield this.s3.send(
|
|
131
|
+
new GetObjectCommand({ Bucket: this.config.bucket, Key: path })
|
|
132
|
+
);
|
|
139
133
|
return data.Body;
|
|
140
134
|
});
|
|
141
135
|
}
|
|
142
136
|
metadata(path) {
|
|
143
137
|
return __async(this, null, function* () {
|
|
144
|
-
const metadata = yield this.s3.send(
|
|
145
|
-
Bucket: this.config.bucket,
|
|
146
|
-
|
|
147
|
-
}));
|
|
138
|
+
const metadata = yield this.s3.send(
|
|
139
|
+
new HeadObjectCommand({ Bucket: this.config.bucket, Key: path })
|
|
140
|
+
);
|
|
148
141
|
return {
|
|
149
142
|
size: metadata.ContentLength || 0,
|
|
150
143
|
mimeType: metadata.ContentType || "unknown",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/AWSS3Storage.
|
|
1
|
+
{"version":3,"sources":["../src/AWSS3Storage.mts"],"sourcesContent":["import { Metadata, StorageConfig } from './types.mjs';\nimport { Storage } from './Storage.mjs';\nimport {\n S3Client,\n HeadObjectCommand,\n PutObjectCommand,\n GetObjectCommand,\n DeleteObjectCommand,\n HeadObjectOutput,\n} from '@aws-sdk/client-s3';\nimport { ReadStream } from 'fs';\nimport Stream, { Readable } from 'stream';\n\nexport class AWSS3Storage extends Storage {\n private s3: S3Client;\n\n constructor(protected config: StorageConfig) {\n super(config);\n\n if (!AWSS3Storage.canHandle(config)) {\n throw new Error(`storage engine cannot handle this config.`);\n }\n\n this.s3 = new S3Client(this.config?.s3Config || {});\n }\n\n static canHandle(config: StorageConfig): boolean {\n return config.engine === 's3';\n }\n\n async exists(path: string): Promise<boolean> {\n try {\n await this.s3.send(new HeadObjectCommand({ Bucket: this.config?.bucket, Key: path }));\n return true;\n } catch (error: any) {\n if (error.name === 'NotFound') {\n return false;\n }\n throw error;\n }\n }\n\n async put(path: string, content: string | object | Stream | Buffer): Promise<boolean> {\n let body: any;\n if (typeof content === 'string' || content instanceof Buffer) {\n body = content;\n } else if (typeof content === 'object' && !(content instanceof Stream)) {\n body = JSON.stringify(content);\n } else if (content instanceof Stream) {\n body = content;\n } else {\n throw new Error('Unsupported content type');\n }\n\n await this.s3.send(\n new PutObjectCommand({\n Bucket: this.config.bucket,\n Key: path,\n Body: body,\n })\n );\n\n return true;\n }\n\n async getJson(path: string): Promise<object> {\n const data = await this.s3.send(\n new GetObjectCommand({ Bucket: this.config.bucket, Key: path })\n );\n const body = await this.streamToString(data.Body as Stream);\n return JSON.parse(body);\n }\n\n async getString(path: string): Promise<string> {\n const data = await this.s3.send(\n new GetObjectCommand({ Bucket: this.config.bucket, Key: path })\n );\n return await this.streamToString(data.Body as Stream);\n }\n\n async delete(path: string): Promise<boolean> {\n await this.s3.send(new DeleteObjectCommand({ Bucket: this.config.bucket, Key: path }));\n return true;\n }\n\n private async streamToString(stream: Stream): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Uint8Array[] = [];\n stream.on('data', (chunk) => chunks.push(chunk));\n stream.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8')));\n stream.on('error', reject);\n });\n }\n\n async getBuffer(path: string): Promise<Buffer> {\n const data = await this.s3.send(\n new GetObjectCommand({ Bucket: this.config.bucket, Key: path })\n );\n const chunks: Uint8Array[] = [];\n const stream = data.Body as Readable;\n\n return new Promise((resolve, reject) => {\n stream.on('data', (chunk) => chunks.push(chunk));\n stream.on('end', () => resolve(Buffer.concat(chunks)));\n stream.on('error', reject);\n });\n }\n\n async getStream(path: string): Promise<ReadStream> {\n const data = await this.s3.send(\n new GetObjectCommand({ Bucket: this.config.bucket, Key: path })\n );\n return data.Body as unknown as ReadStream;\n }\n\n async metadata(path: string): Promise<Metadata> {\n const metadata = await this.s3.send(\n new HeadObjectCommand({ Bucket: this.config.bucket, Key: path })\n );\n return {\n size: metadata.ContentLength || 0,\n mimeType: metadata.ContentType || 'unknown',\n lastModifiedDate: (metadata.LastModified || new Date(0)).toISOString(),\n };\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/LocalStorage.mjs
CHANGED
|
@@ -25,16 +25,14 @@ import * as fs from "fs/promises";
|
|
|
25
25
|
import { createWriteStream, createReadStream } from "fs";
|
|
26
26
|
import * as path from "path";
|
|
27
27
|
import * as mime from "mime-types";
|
|
28
|
-
import { Storage } from "./Storage";
|
|
28
|
+
import { Storage } from "./Storage.mjs";
|
|
29
29
|
const _LocalStorage = class _LocalStorage extends Storage {
|
|
30
30
|
constructor(config) {
|
|
31
31
|
super(config);
|
|
32
32
|
if (!_LocalStorage.canHandle(config)) {
|
|
33
33
|
throw new Error(`storage engine cannot handle this config.`);
|
|
34
34
|
}
|
|
35
|
-
fs.mkdir(this.config.basePath, {
|
|
36
|
-
recursive: true
|
|
37
|
-
}).catch((error) => {
|
|
35
|
+
fs.mkdir(this.config.basePath, { recursive: true }).catch((error) => {
|
|
38
36
|
throw error;
|
|
39
37
|
});
|
|
40
38
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/LocalStorage.
|
|
1
|
+
{"version":3,"sources":["../src/LocalStorage.mts"],"sourcesContent":["import Stream from 'stream';\nimport * as fs from 'fs/promises';\nimport { createWriteStream, createReadStream, ReadStream } from 'fs';\nimport * as path from 'path';\nimport * as mime from 'mime-types';\nimport { Metadata, StorageConfig } from './types.mjs';\nimport { Storage } from './Storage.mjs';\n\nexport class LocalStorage extends Storage {\n constructor(config: StorageConfig) {\n super(config);\n\n if (!LocalStorage.canHandle(config)) {\n throw new Error(`storage engine cannot handle this config.`);\n }\n // Ensure the base folder exists\n fs.mkdir(this.config.basePath, { recursive: true }).catch((error) => {\n throw error;\n });\n }\n\n async metadata(path: string): Promise<Metadata> {\n const fullPath = this.getFullPath(path);\n const stats = await fs.stat(fullPath);\n return {\n size: stats.size,\n mimeType: mime.lookup(fullPath) || 'unknown',\n lastModifiedDate: stats.mtime.toISOString(),\n };\n }\n\n static canHandle(config: StorageConfig) {\n if (config.engine === 'local') {\n return true;\n }\n return false;\n }\n\n getFullPath(filePath: string) {\n return path.join(this.config.basePath, filePath);\n }\n\n async exists(path: string): Promise<boolean> {\n try {\n await fs.access(this.getFullPath(path));\n return true;\n } catch {\n return false;\n }\n }\n\n async put(path: string, content: string | object | Stream | Buffer): Promise<boolean> {\n const fullPath = this.getFullPath(path);\n\n if (typeof content === 'string' || content instanceof Buffer) {\n await fs.writeFile(fullPath, content);\n } else if (typeof content === 'object' && !(content instanceof Stream)) {\n await fs.writeFile(fullPath, JSON.stringify(content, null, 2));\n } else if (typeof content === 'object' && content instanceof Stream) {\n const writeStream = createWriteStream(fullPath);\n await new Promise((resolve, reject) => {\n (content as Stream).pipe(writeStream);\n (content as Stream).on('end', resolve);\n (content as Stream).on('error', reject);\n });\n } else {\n throw new Error('Unsupported content type');\n }\n\n return true;\n }\n\n async getJson(path: string): Promise<object> {\n const fullPath = this.getFullPath(path);\n const content = await fs.readFile(fullPath, 'utf-8');\n return JSON.parse(content);\n }\n\n async getString(path: string, encoding: BufferEncoding = 'utf-8'): Promise<string> {\n const fullPath = this.getFullPath(path);\n return await fs.readFile(fullPath, encoding);\n }\n\n async getBuffer(path: string): Promise<Buffer> {\n const fullPath = this.getFullPath(path);\n return await fs.readFile(fullPath);\n }\n\n async getStream(path: string): Promise<ReadStream> {\n const fullPath = this.getFullPath(path);\n return createReadStream(fullPath);\n }\n\n async delete(path: string): Promise<boolean> {\n const fullPath = this.getFullPath(path);\n await fs.unlink(fullPath);\n return true;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,YAAY;AACnB,YAAY,QAAQ;AACpB,SAAS,mBAAmB,wBAAoC;AAChE,YAAY,UAAU;AACtB,YAAY,UAAU;AAEtB,SAAS,eAAe;AAEjB,MAAM,gBAAN,MAAM,sBAAqB,QAAQ;AAAA,EACxC,YAAY,QAAuB;AACjC,UAAM,MAAM;AAEZ,QAAI,CAAC,cAAa,UAAU,MAAM,GAAG;AACnC,YAAM,IAAI,MAAM,2CAA2C;AAAA,IAC7D;AAEA,OAAG,MAAM,KAAK,OAAO,UAAU,EAAE,WAAW,KAAK,CAAC,EAAE,MAAM,CAAC,UAAU;AACnE,YAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA,EAEM,SAASA,OAAiC;AAAA;AAC9C,YAAM,WAAW,KAAK,YAAYA,KAAI;AACtC,YAAM,QAAQ,MAAM,GAAG,KAAK,QAAQ;AACpC,aAAO;AAAA,QACL,MAAM,MAAM;AAAA,QACZ,UAAU,KAAK,OAAO,QAAQ,KAAK;AAAA,QACnC,kBAAkB,MAAM,MAAM,YAAY;AAAA,MAC5C;AAAA,IACF;AAAA;AAAA,EAEA,OAAO,UAAU,QAAuB;AACtC,QAAI,OAAO,WAAW,SAAS;AAC7B,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,UAAkB;AAC5B,WAAO,KAAK,KAAK,KAAK,OAAO,UAAU,QAAQ;AAAA,EACjD;AAAA,EAEM,OAAOA,OAAgC;AAAA;AAC3C,UAAI;AACF,cAAM,GAAG,OAAO,KAAK,YAAYA,KAAI,CAAC;AACtC,eAAO;AAAA,MACT,SAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA,EAEM,IAAIA,OAAc,SAA8D;AAAA;AACpF,YAAM,WAAW,KAAK,YAAYA,KAAI;AAEtC,UAAI,OAAO,YAAY,YAAY,mBAAmB,QAAQ;AAC5D,cAAM,GAAG,UAAU,UAAU,OAAO;AAAA,MACtC,WAAW,OAAO,YAAY,YAAY,EAAE,mBAAmB,SAAS;AACtE,cAAM,GAAG,UAAU,UAAU,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,MAC/D,WAAW,OAAO,YAAY,YAAY,mBAAmB,QAAQ;AACnE,cAAM,cAAc,kBAAkB,QAAQ;AAC9C,cAAM,IAAI,QAAQ,CAAC,SAAS,WAAW;AACrC,UAAC,QAAmB,KAAK,WAAW;AACpC,UAAC,QAAmB,GAAG,OAAO,OAAO;AACrC,UAAC,QAAmB,GAAG,SAAS,MAAM;AAAA,QACxC,CAAC;AAAA,MACH,OAAO;AACL,cAAM,IAAI,MAAM,0BAA0B;AAAA,MAC5C;AAEA,aAAO;AAAA,IACT;AAAA;AAAA,EAEM,QAAQA,OAA+B;AAAA;AAC3C,YAAM,WAAW,KAAK,YAAYA,KAAI;AACtC,YAAM,UAAU,MAAM,GAAG,SAAS,UAAU,OAAO;AACnD,aAAO,KAAK,MAAM,OAAO;AAAA,IAC3B;AAAA;AAAA,EAEM,UAAUA,OAAc,WAA2B,SAA0B;AAAA;AACjF,YAAM,WAAW,KAAK,YAAYA,KAAI;AACtC,aAAO,MAAM,GAAG,SAAS,UAAU,QAAQ;AAAA,IAC7C;AAAA;AAAA,EAEM,UAAUA,OAA+B;AAAA;AAC7C,YAAM,WAAW,KAAK,YAAYA,KAAI;AACtC,aAAO,MAAM,GAAG,SAAS,QAAQ;AAAA,IACnC;AAAA;AAAA,EAEM,UAAUA,OAAmC;AAAA;AACjD,YAAM,WAAW,KAAK,YAAYA,KAAI;AACtC,aAAO,iBAAiB,QAAQ;AAAA,IAClC;AAAA;AAAA,EAEM,OAAOA,OAAgC;AAAA;AAC3C,YAAM,WAAW,KAAK,YAAYA,KAAI;AACtC,YAAM,GAAG,OAAO,QAAQ;AACxB,aAAO;AAAA,IACT;AAAA;AACF;AA1F0C;AAAnC,IAAM,eAAN;","names":["path"]}
|
package/dist/Storage.mjs
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
2
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
4
|
-
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
5
3
|
const _Storage = class _Storage {
|
|
6
4
|
constructor(config) {
|
|
7
|
-
__publicField(this, "config");
|
|
8
5
|
this.config = config;
|
|
9
6
|
}
|
|
10
7
|
static canHandle(config) {
|
package/dist/Storage.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/Storage.
|
|
1
|
+
{"version":3,"sources":["../src/Storage.mts"],"sourcesContent":["import { ReadStream } from 'fs';\nimport { Stream } from 'stream';\nimport { Metadata } from './types.mjs';\nimport { StorageConfig } from './types.mjs';\n\nexport abstract class Storage {\n constructor(protected config: StorageConfig) {}\n\n static canHandle(config: StorageConfig): boolean {\n throw new Error('Method not implemented.');\n }\n\n abstract exists(path: string): Promise<boolean>;\n abstract put(path: string, content: string | object | Stream | Buffer): Promise<boolean>;\n abstract getJson(path: string): Promise<object>;\n abstract getString(path: string): Promise<string>;\n abstract getBuffer(path: string): Promise<Buffer>;\n abstract getStream(path: string): Promise<ReadStream>;\n abstract delete(path: string): Promise<boolean>;\n abstract metadata(path: string): Promise<Metadata>;\n}\n"],"mappings":";;AAKO,MAAe,WAAf,MAAe,SAAQ;AAAA,EAC5B,YAAsB,QAAuB;AAAvB;AAAA,EAAwB;AAAA,EAE9C,OAAO,UAAU,QAAgC;AAC/C,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AAUF;AAf8B;AAAvB,IAAe,UAAf;","names":[]}
|
package/dist/StorageFactory.mjs
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
2
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
4
|
-
|
|
5
|
-
import {
|
|
6
|
-
import { LocalStorage } from "./LocalStorage";
|
|
3
|
+
import { AWSS3Storage } from "./AWSS3Storage.mjs";
|
|
4
|
+
import { LocalStorage } from "./LocalStorage.mjs";
|
|
7
5
|
const _StorageFactory = class _StorageFactory {
|
|
8
6
|
registerStorageEngine(engine) {
|
|
9
7
|
_StorageFactory.storageEngines.push(engine);
|
|
@@ -18,10 +16,7 @@ const _StorageFactory = class _StorageFactory {
|
|
|
18
16
|
}
|
|
19
17
|
};
|
|
20
18
|
__name(_StorageFactory, "StorageFactory");
|
|
21
|
-
|
|
22
|
-
LocalStorage,
|
|
23
|
-
AWSS3Storage
|
|
24
|
-
]);
|
|
19
|
+
_StorageFactory.storageEngines = [LocalStorage, AWSS3Storage];
|
|
25
20
|
let StorageFactory = _StorageFactory;
|
|
26
21
|
export {
|
|
27
22
|
StorageFactory
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/StorageFactory.
|
|
1
|
+
{"version":3,"sources":["../src/StorageFactory.mts"],"sourcesContent":["import { AWSS3Storage } from './AWSS3Storage.mjs';\nimport { LocalStorage } from './LocalStorage.mjs';\nimport { Storage } from './Storage.mjs';\nimport { StorageConfig } from './types.mjs';\n\nexport class StorageFactory {\n public static storageEngines: (typeof Storage)[] = [LocalStorage, AWSS3Storage];\n\n registerStorageEngine(engine: typeof Storage) {\n StorageFactory.storageEngines.push(engine);\n }\n\n public static create(config: StorageConfig): Storage {\n for (const engine of StorageFactory.storageEngines) {\n if (engine.canHandle(config)) {\n // @ts-ignore\n return new engine(config);\n }\n }\n throw new Error('No matchin storage engine found');\n }\n}\n"],"mappings":";;AAAA,SAAS,oBAAoB;AAC7B,SAAS,oBAAoB;AAItB,MAAM,kBAAN,MAAM,gBAAe;AAAA,EAG1B,sBAAsB,QAAwB;AAC5C,oBAAe,eAAe,KAAK,MAAM;AAAA,EAC3C;AAAA,EAEA,OAAc,OAAO,QAAgC;AACnD,eAAW,UAAU,gBAAe,gBAAgB;AAClD,UAAI,OAAO,UAAU,MAAM,GAAG;AAE5B,eAAO,IAAI,OAAO,MAAM;AAAA,MAC1B;AAAA,IACF;AACA,UAAM,IAAI,MAAM,iCAAiC;AAAA,EACnD;AACF;AAhB4B;AAAf,gBACG,iBAAqC,CAAC,cAAc,YAAY;AADzE,IAAM,iBAAN;","names":[]}
|