@ackplus/nest-file-storage 0.1.35

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 (36) hide show
  1. package/README.md +409 -0
  2. package/package.json +52 -0
  3. package/src/index.d.ts +4 -0
  4. package/src/index.js +8 -0
  5. package/src/index.js.map +1 -0
  6. package/src/lib/constants.d.ts +1 -0
  7. package/src/lib/constants.js +5 -0
  8. package/src/lib/constants.js.map +1 -0
  9. package/src/lib/file-storage.service.d.ts +7 -0
  10. package/src/lib/file-storage.service.js +31 -0
  11. package/src/lib/file-storage.service.js.map +1 -0
  12. package/src/lib/index.d.ts +5 -0
  13. package/src/lib/index.js +9 -0
  14. package/src/lib/index.js.map +1 -0
  15. package/src/lib/interceptor/file-storage.interceptor.d.ts +21 -0
  16. package/src/lib/interceptor/file-storage.interceptor.js +122 -0
  17. package/src/lib/interceptor/file-storage.interceptor.js.map +1 -0
  18. package/src/lib/nest-file-storage.module.d.ts +8 -0
  19. package/src/lib/nest-file-storage.module.js +75 -0
  20. package/src/lib/nest-file-storage.module.js.map +1 -0
  21. package/src/lib/storage/azure.storage.d.ts +18 -0
  22. package/src/lib/storage/azure.storage.js +153 -0
  23. package/src/lib/storage/azure.storage.js.map +1 -0
  24. package/src/lib/storage/local.storage.d.ts +17 -0
  25. package/src/lib/storage/local.storage.js +133 -0
  26. package/src/lib/storage/local.storage.js.map +1 -0
  27. package/src/lib/storage/s3.storage.d.ts +19 -0
  28. package/src/lib/storage/s3.storage.js +208 -0
  29. package/src/lib/storage/s3.storage.js.map +1 -0
  30. package/src/lib/storage.factory.d.ts +8 -0
  31. package/src/lib/storage.factory.js +52 -0
  32. package/src/lib/storage.factory.js.map +1 -0
  33. package/src/lib/types.d.ts +76 -0
  34. package/src/lib/types.js +10 -0
  35. package/src/lib/types.js.map +1 -0
  36. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,208 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.S3Storage = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const client_s3_1 = require("@aws-sdk/client-s3");
6
+ const client_s3_2 = require("@aws-sdk/client-s3");
7
+ const s3_request_presigner_1 = require("@aws-sdk/s3-request-presigner");
8
+ const moment_1 = tslib_1.__importDefault(require("moment"));
9
+ const path_1 = tslib_1.__importStar(require("path"));
10
+ const stream_1 = require("stream");
11
+ const uuid_1 = require("uuid");
12
+ class S3Storage {
13
+ constructor(options) {
14
+ this.options = options;
15
+ this.fileNameFunction = options.fileName || ((file, _req) => {
16
+ return `${(0, uuid_1.v4)()}-${file.originalname}`;
17
+ });
18
+ this.fileDistFunction = options.fileDist || ((_file, _req) => {
19
+ return path_1.default.join('uploads', (0, moment_1.default)().format('YYYY'), (0, moment_1.default)().format('MM'), (0, moment_1.default)().format('DD'));
20
+ });
21
+ this.s3 = new client_s3_1.S3({
22
+ endpoint: this.options.endpoint || null,
23
+ region: this.options.region,
24
+ credentials: {
25
+ accessKeyId: this.options.accessKeyId,
26
+ secretAccessKey: this.options.secretAccessKey,
27
+ },
28
+ });
29
+ }
30
+ _handleFile(req, file, cb) {
31
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
32
+ const chunks = [];
33
+ file.stream.on('data', (chunk) => chunks.push(chunk));
34
+ file.stream.on('end', () => tslib_1.__awaiter(this, void 0, void 0, function* () {
35
+ var _a;
36
+ const buffer = Buffer.concat(chunks);
37
+ try {
38
+ const dist = yield this.fileDistFunction(file, req);
39
+ const key = yield this.fileNameFunction(file, req);
40
+ const filePath = (0, path_1.join)(dist, key);
41
+ const uploadedFile = yield this.putFile(buffer, filePath);
42
+ const fileInfo = Object.assign(Object.assign({}, uploadedFile), { fieldName: file.fieldname, originalName: file.originalname, mimetype: file.mimetype });
43
+ let transformData = fileInfo;
44
+ if ((_a = this.options) === null || _a === void 0 ? void 0 : _a.transformUploadedFileObject) {
45
+ transformData = yield this.options.transformUploadedFileObject(fileInfo);
46
+ }
47
+ cb(null, transformData);
48
+ }
49
+ catch (err) {
50
+ cb(err);
51
+ }
52
+ }));
53
+ file.stream.on('error', (err) => cb(err));
54
+ });
55
+ }
56
+ _removeFile(_req, file, cb) {
57
+ const params = {
58
+ Bucket: this.options.bucket,
59
+ Key: file.key,
60
+ };
61
+ this.s3
62
+ .deleteObject(params)
63
+ .then(() => cb(null))
64
+ .catch((err) => cb(err));
65
+ }
66
+ getUrl(key) {
67
+ return `https://${this.options.bucket}.s3.amazonaws.com/${key}`;
68
+ }
69
+ getSignedUrl(key, objectConfig) {
70
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
71
+ if (key) {
72
+ const url = yield (0, s3_request_presigner_1.getSignedUrl)(this.s3, new client_s3_2.GetObjectCommand(Object.assign({ Bucket: this.options.bucket, Key: key }, (objectConfig && Object.assign({}, objectConfig)))));
73
+ return url;
74
+ }
75
+ return null;
76
+ });
77
+ }
78
+ getFile(key) {
79
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
80
+ if (!key) {
81
+ throw new Error('Key is required to fetch the file from S3.');
82
+ }
83
+ try {
84
+ const command = new client_s3_2.GetObjectCommand({
85
+ Bucket: this.options.bucket,
86
+ Key: key,
87
+ });
88
+ const data = yield this.s3.send(command);
89
+ if (!data.Body) {
90
+ throw new Error('Empty response received from S3.');
91
+ }
92
+ if (data.Body instanceof stream_1.Readable) {
93
+ return yield this.streamToBuffer(data.Body);
94
+ }
95
+ throw new Error('Unexpected data.Body type received from S3.');
96
+ }
97
+ catch (error) {
98
+ console.error(`Error fetching file (${key}) from S3:`, error);
99
+ throw error;
100
+ }
101
+ });
102
+ }
103
+ putFile(fileContent, key) {
104
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
105
+ try {
106
+ const fileName = (0, path_1.basename)(key);
107
+ const fileKey = key || (Math.random() + 1).toString(36).substring(12);
108
+ const putParams = {
109
+ Bucket: this.options.bucket,
110
+ Key: fileKey,
111
+ Body: fileContent,
112
+ ContentDisposition: `inline; ${fileName}`,
113
+ };
114
+ yield this.s3.send(new client_s3_2.PutObjectCommand(putParams));
115
+ const headParams = {
116
+ Bucket: this.options.bucket,
117
+ Key: fileKey,
118
+ };
119
+ const headObject = yield this.s3.send(new client_s3_2.HeadObjectCommand(headParams));
120
+ const fileSize = headObject.ContentLength || 0;
121
+ const fileData = {
122
+ originalName: fileName,
123
+ fileName: fileName,
124
+ size: fileSize,
125
+ buffer: fileContent,
126
+ fullPath: fileKey,
127
+ key: fileKey,
128
+ url: this.getUrl(fileKey),
129
+ };
130
+ return fileData;
131
+ }
132
+ catch (error) {
133
+ console.error('Error uploading file to S3:', error);
134
+ throw error;
135
+ }
136
+ });
137
+ }
138
+ deleteFile(key) {
139
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
140
+ if (!key) {
141
+ throw new Error('File key is required for deletion.');
142
+ }
143
+ try {
144
+ const deleteParams = {
145
+ Bucket: this.options.bucket,
146
+ Key: key,
147
+ };
148
+ yield this.s3.send(new client_s3_2.DeleteObjectCommand(deleteParams));
149
+ }
150
+ catch (error) {
151
+ console.error(`Error deleting file (${key}) from S3:`, error);
152
+ throw error;
153
+ }
154
+ });
155
+ }
156
+ streamToBuffer(stream) {
157
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
158
+ var _a, stream_2, stream_2_1;
159
+ var _b, e_1, _c, _d;
160
+ const chunks = [];
161
+ try {
162
+ for (_a = true, stream_2 = tslib_1.__asyncValues(stream); stream_2_1 = yield stream_2.next(), _b = stream_2_1.done, !_b; _a = true) {
163
+ _d = stream_2_1.value;
164
+ _a = false;
165
+ const chunk = _d;
166
+ chunks.push(chunk);
167
+ }
168
+ }
169
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
170
+ finally {
171
+ try {
172
+ if (!_a && !_b && (_c = stream_2.return)) yield _c.call(stream_2);
173
+ }
174
+ finally { if (e_1) throw e_1.error; }
175
+ }
176
+ return Buffer.concat(chunks);
177
+ });
178
+ }
179
+ copyFile(oldKey, newKey) {
180
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
181
+ try {
182
+ yield this.s3.send(new client_s3_1.CopyObjectCommand({
183
+ Bucket: this.options.bucket,
184
+ CopySource: `/${this.options.bucket}/${oldKey}`,
185
+ Key: newKey,
186
+ }));
187
+ const headObject = yield this.s3.send(new client_s3_2.HeadObjectCommand({
188
+ Bucket: this.options.bucket,
189
+ Key: newKey,
190
+ }));
191
+ return {
192
+ originalName: (0, path_1.basename)(newKey),
193
+ size: headObject.ContentLength || 0,
194
+ fileName: (0, path_1.basename)(newKey),
195
+ key: newKey,
196
+ fullPath: newKey,
197
+ url: this.getUrl(newKey),
198
+ };
199
+ }
200
+ catch (error) {
201
+ console.error('Error copying file in S3:', error);
202
+ throw error;
203
+ }
204
+ });
205
+ }
206
+ }
207
+ exports.S3Storage = S3Storage;
208
+ //# sourceMappingURL=s3.storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3.storage.js","sourceRoot":"","sources":["../../../../../../packages/nest-file-storage/src/lib/storage/s3.storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { FileStorageEnum, StorageOptions } from './types';
2
+ import { StorageEngine } from 'multer';
3
+ import { Storage } from './types';
4
+ export declare class StorageFactory {
5
+ private static storageInstances;
6
+ static createStorage(storageType: FileStorageEnum, options: StorageOptions): Promise<StorageEngine & Storage>;
7
+ static clearCache(): void;
8
+ }
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StorageFactory = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const types_1 = require("./types");
6
+ class StorageFactory {
7
+ static createStorage(storageType, options) {
8
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
9
+ const cacheKey = `${storageType}-${JSON.stringify(options)}`;
10
+ if (this.storageInstances.has(cacheKey)) {
11
+ return this.storageInstances.get(cacheKey);
12
+ }
13
+ let storageInstance;
14
+ switch (storageType) {
15
+ case types_1.FileStorageEnum.LOCAL:
16
+ const { LocalStorage } = yield Promise.resolve().then(() => tslib_1.__importStar(require('./storage/local.storage')));
17
+ storageInstance = new LocalStorage(options);
18
+ break;
19
+ case types_1.FileStorageEnum.AZURE:
20
+ try {
21
+ const { AzureStorage } = yield Promise.resolve().then(() => tslib_1.__importStar(require('./storage/azure.storage')));
22
+ storageInstance = new AzureStorage(options);
23
+ }
24
+ catch (error) {
25
+ throw new Error('Azure Storage SDK (@azure/storage-blob) is required when using AzureStorage. ' +
26
+ 'Please install it: npm install @azure/storage-blob');
27
+ }
28
+ break;
29
+ case types_1.FileStorageEnum.S3:
30
+ try {
31
+ const { S3Storage } = yield Promise.resolve().then(() => tslib_1.__importStar(require('./storage/s3.storage')));
32
+ storageInstance = new S3Storage(options);
33
+ }
34
+ catch (error) {
35
+ throw new Error('AWS SDK (@aws-sdk/client-s3 and @aws-sdk/s3-request-presigner) is required when using S3Storage. ' +
36
+ 'Please install them: npm install @aws-sdk/client-s3 @aws-sdk/s3-request-presigner');
37
+ }
38
+ break;
39
+ default:
40
+ throw new Error(`Unsupported storage type: ${storageType}`);
41
+ }
42
+ this.storageInstances.set(cacheKey, storageInstance);
43
+ return storageInstance;
44
+ });
45
+ }
46
+ static clearCache() {
47
+ this.storageInstances.clear();
48
+ }
49
+ }
50
+ exports.StorageFactory = StorageFactory;
51
+ StorageFactory.storageInstances = new Map();
52
+ //# sourceMappingURL=storage.factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.factory.js","sourceRoot":"","sources":["../../../../../packages/nest-file-storage/src/lib/storage.factory.ts"],"names":[],"mappings":";;;;AAAA,mCAAsH;AAItH,MAAa,cAAc;IAGvB,MAAM,CAAO,aAAa,CAAC,WAA4B,EAAE,OAAuB;;YAC5E,MAAM,QAAQ,GAAG,GAAG,WAAW,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YAE7D,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACtC,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;YAChD,CAAC;YAED,IAAI,eAAwC,CAAC;YAE7C,QAAQ,WAAW,EAAE,CAAC;gBAClB,KAAK,uBAAe,CAAC,KAAK;oBACtB,MAAM,EAAE,YAAY,EAAE,GAAG,gEAAa,yBAAyB,GAAC,CAAC;oBACjE,eAAe,GAAG,IAAI,YAAY,CAAC,OAA8B,CAAC,CAAC;oBACnE,MAAM;gBAEV,KAAK,uBAAe,CAAC,KAAK;oBACtB,IAAI,CAAC;wBACD,MAAM,EAAE,YAAY,EAAE,GAAG,gEAAa,yBAAyB,GAAC,CAAC;wBACjE,eAAe,GAAG,IAAI,YAAY,CAAC,OAA8B,CAAC,CAAC;oBACvE,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACb,MAAM,IAAI,KAAK,CACX,+EAA+E;4BAC/E,oDAAoD,CACvD,CAAC;oBACN,CAAC;oBACD,MAAM;gBAEV,KAAK,uBAAe,CAAC,EAAE;oBACnB,IAAI,CAAC;wBACD,MAAM,EAAE,SAAS,EAAE,GAAG,gEAAa,sBAAsB,GAAC,CAAC;wBAC3D,eAAe,GAAG,IAAI,SAAS,CAAC,OAA2B,CAAC,CAAC;oBACjE,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACb,MAAM,IAAI,KAAK,CACX,mGAAmG;4BACnG,mFAAmF,CACtF,CAAC;oBACN,CAAC;oBACD,MAAM;gBAEV;oBACI,MAAM,IAAI,KAAK,CAAC,6BAA6B,WAAW,EAAE,CAAC,CAAC;YACpE,CAAC;YAED,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;YACrD,OAAO,eAAe,CAAC;QAC3B,CAAC;KAAA;IAED,MAAM,CAAC,UAAU;QACb,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;IAClC,CAAC;;AApDL,wCAqDC;AApDkB,+BAAgB,GAAG,IAAI,GAAG,EAAmC,CAAC"}
@@ -0,0 +1,76 @@
1
+ import { ModuleMetadata, Type } from '@nestjs/common';
2
+ import { Request } from 'express';
3
+ export declare enum FileStorageEnum {
4
+ LOCAL = "local",
5
+ S3 = "s3",
6
+ AZURE = "azure"
7
+ }
8
+ export interface FileStorageOptions {
9
+ prefix?: string;
10
+ fileName?: (file: any, req: Request) => string;
11
+ fileDist?: (file: any, req: Request) => string;
12
+ transformUploadedFileObject?: (file: any) => any;
13
+ }
14
+ export interface S3StorageOptions extends FileStorageOptions {
15
+ accessKeyId: string;
16
+ secretAccessKey: string;
17
+ region: string;
18
+ bucket: string;
19
+ endpoint?: string;
20
+ }
21
+ export interface LocalStorageOptions extends FileStorageOptions {
22
+ rootPath: string;
23
+ baseUrl: string;
24
+ }
25
+ export interface AzureStorageOptions extends FileStorageOptions {
26
+ account: string;
27
+ accountKey: string;
28
+ container: string;
29
+ }
30
+ export type StorageOptions = S3StorageOptions | AzureStorageOptions | LocalStorageOptions;
31
+ export type FileStorageConfigOptions = {
32
+ storage: FileStorageEnum.LOCAL;
33
+ localConfig: LocalStorageOptions;
34
+ } | {
35
+ storage: FileStorageEnum.S3;
36
+ s3Config: S3StorageOptions;
37
+ } | {
38
+ storage: FileStorageEnum.AZURE;
39
+ azureConfig: AzureStorageOptions;
40
+ };
41
+ export interface FileStorageClassOptions {
42
+ storageFactory: () => Promise<new (...args: any[]) => Storage> | (new (...args: any[]) => Storage);
43
+ options?: any;
44
+ }
45
+ export type FileStorageModuleOptions = FileStorageConfigOptions | FileStorageClassOptions;
46
+ export interface FileStorageAsyncOptions extends Pick<ModuleMetadata, 'imports'> {
47
+ useExisting?: Type<FileStorageOptionsFactory>;
48
+ useClass?: Type<FileStorageOptionsFactory>;
49
+ useFactory?: (...args: any[]) => Promise<FileStorageModuleOptions> | FileStorageModuleOptions;
50
+ inject?: any[];
51
+ }
52
+ export interface FileStorageOptionsFactory {
53
+ createFileStorageOptions(): Promise<FileStorageModuleOptions> | FileStorageModuleOptions;
54
+ }
55
+ export interface UploadedFile {
56
+ fieldName?: string;
57
+ fieldname?: string;
58
+ fileName: string;
59
+ originalName: string;
60
+ size: number;
61
+ mimetype?: string;
62
+ buffer?: Buffer;
63
+ key: string;
64
+ url: string;
65
+ fullPath: string;
66
+ encoding?: string;
67
+ }
68
+ export interface Storage {
69
+ getFile(key: string): Promise<Buffer> | Buffer;
70
+ deleteFile(key: string): Promise<void> | void;
71
+ putFile(fileContent: Buffer, key: string): Promise<UploadedFile> | UploadedFile;
72
+ path?(filePath: string): Promise<string> | string;
73
+ getUrl(key: string): Promise<string> | string;
74
+ getSignedUrl?(key: string, options: any): Promise<string> | string;
75
+ copyFile(oldKey: string, newKey: string): Promise<UploadedFile>;
76
+ }
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FileStorageEnum = void 0;
4
+ var FileStorageEnum;
5
+ (function (FileStorageEnum) {
6
+ FileStorageEnum["LOCAL"] = "local";
7
+ FileStorageEnum["S3"] = "s3";
8
+ FileStorageEnum["AZURE"] = "azure";
9
+ })(FileStorageEnum || (exports.FileStorageEnum = FileStorageEnum = {}));
10
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../packages/nest-file-storage/src/lib/types.ts"],"names":[],"mappings":";;;AAIA,IAAY,eAIX;AAJD,WAAY,eAAe;IACvB,kCAAe,CAAA;IACf,4BAAS,CAAA;IACT,kCAAe,CAAA;AACnB,CAAC,EAJW,eAAe,+BAAf,eAAe,QAI1B"}
@@ -0,0 +1 @@
1
+ {"version":"5.8.3"}