@ackplus/nest-file-storage 1.1.22 → 2.0.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 (86) hide show
  1. package/CHANGELOG.md +72 -0
  2. package/MIGRATION.md +220 -0
  3. package/README.md +353 -547
  4. package/dist/index.d.ts +1 -4
  5. package/dist/index.js +1 -4
  6. package/dist/index.js.map +1 -1
  7. package/dist/lib/constants.d.ts +3 -1
  8. package/dist/lib/constants.js +4 -2
  9. package/dist/lib/constants.js.map +1 -1
  10. package/dist/lib/driver-registry.d.ts +34 -0
  11. package/dist/lib/driver-registry.js +118 -0
  12. package/dist/lib/driver-registry.js.map +1 -0
  13. package/dist/lib/drivers/azure.driver.d.ts +21 -0
  14. package/dist/lib/drivers/azure.driver.js +91 -0
  15. package/dist/lib/drivers/azure.driver.js.map +1 -0
  16. package/dist/lib/drivers/driver.interface.d.ts +40 -0
  17. package/dist/lib/drivers/driver.interface.js +3 -0
  18. package/dist/lib/drivers/driver.interface.js.map +1 -0
  19. package/dist/lib/drivers/driver.util.d.ts +2 -0
  20. package/dist/lib/drivers/driver.util.js +15 -0
  21. package/dist/lib/drivers/driver.util.js.map +1 -0
  22. package/dist/lib/drivers/index.d.ts +7 -0
  23. package/dist/lib/drivers/index.js +39 -0
  24. package/dist/lib/drivers/index.js.map +1 -0
  25. package/dist/lib/drivers/local.driver.d.ts +15 -0
  26. package/dist/lib/drivers/local.driver.js +110 -0
  27. package/dist/lib/drivers/local.driver.js.map +1 -0
  28. package/dist/lib/drivers/s3.driver.d.ts +22 -0
  29. package/dist/lib/drivers/s3.driver.js +103 -0
  30. package/dist/lib/drivers/s3.driver.js.map +1 -0
  31. package/dist/lib/file-storage.service.d.ts +16 -5
  32. package/dist/lib/file-storage.service.js +60 -22
  33. package/dist/lib/file-storage.service.js.map +1 -1
  34. package/dist/lib/index.d.ts +9 -2
  35. package/dist/lib/index.js +15 -2
  36. package/dist/lib/index.js.map +1 -1
  37. package/dist/lib/interceptor/file-storage.interceptor.d.ts +7 -10
  38. package/dist/lib/interceptor/file-storage.interceptor.js +119 -112
  39. package/dist/lib/interceptor/file-storage.interceptor.js.map +1 -1
  40. package/dist/lib/multer/driver-multer-engine.d.ts +18 -0
  41. package/dist/lib/multer/driver-multer-engine.js +91 -0
  42. package/dist/lib/multer/driver-multer-engine.js.map +1 -0
  43. package/dist/lib/nest-file-storage.module.d.ts +3 -3
  44. package/dist/lib/nest-file-storage.module.js +81 -44
  45. package/dist/lib/nest-file-storage.module.js.map +1 -1
  46. package/dist/lib/registry-holder.d.ts +6 -0
  47. package/dist/lib/registry-holder.js +26 -0
  48. package/dist/lib/registry-holder.js.map +1 -0
  49. package/dist/lib/tenant/tenant-from.d.ts +14 -0
  50. package/dist/lib/tenant/tenant-from.js +71 -0
  51. package/dist/lib/tenant/tenant-from.js.map +1 -0
  52. package/dist/lib/tenant/tenant.types.d.ts +20 -0
  53. package/dist/lib/tenant/tenant.types.js +3 -0
  54. package/dist/lib/tenant/tenant.types.js.map +1 -0
  55. package/dist/lib/types.d.ts +45 -35
  56. package/dist/lib/types.js.map +1 -1
  57. package/dist/lib/validation.d.ts +22 -0
  58. package/dist/lib/validation.js +98 -0
  59. package/dist/lib/validation.js.map +1 -0
  60. package/dist/tsconfig.build.tsbuildinfo +1 -1
  61. package/examples/1-basic-local-storage.example.ts +11 -7
  62. package/examples/10-testing.example.ts +60 -196
  63. package/examples/11-custom-driver.example.ts +82 -0
  64. package/examples/12-multi-tenant.example.ts +93 -0
  65. package/examples/2-s3-storage.example.ts +18 -16
  66. package/examples/3-azure-storage.example.ts +14 -12
  67. package/examples/4-upload-controller.example.ts +20 -55
  68. package/examples/5-custom-configuration.example.ts +37 -57
  69. package/examples/6-file-service.example.ts +34 -91
  70. package/examples/7-user-avatar.example.ts +37 -92
  71. package/examples/8-document-management.example.ts +45 -196
  72. package/examples/9-dynamic-storage.example.ts +29 -147
  73. package/examples/README.md +25 -107
  74. package/package.json +17 -4
  75. package/dist/lib/storage/azure.storage.d.ts +0 -18
  76. package/dist/lib/storage/azure.storage.js +0 -210
  77. package/dist/lib/storage/azure.storage.js.map +0 -1
  78. package/dist/lib/storage/local.storage.d.ts +0 -20
  79. package/dist/lib/storage/local.storage.js +0 -212
  80. package/dist/lib/storage/local.storage.js.map +0 -1
  81. package/dist/lib/storage/s3.storage.d.ts +0 -19
  82. package/dist/lib/storage/s3.storage.js +0 -241
  83. package/dist/lib/storage/s3.storage.js.map +0 -1
  84. package/dist/lib/storage.factory.d.ts +0 -8
  85. package/dist/lib/storage.factory.js +0 -46
  86. package/dist/lib/storage.factory.js.map +0 -1
@@ -0,0 +1,22 @@
1
+ import { BadRequestException } from '@nestjs/common';
2
+ import type { Options as MulterOptions } from 'multer';
3
+ export interface UploadValidation {
4
+ maxSize?: number;
5
+ allowedMimeTypes?: string[];
6
+ allowedExtensions?: string[];
7
+ maxFiles?: number;
8
+ fileFilter?: MulterOptions['fileFilter'];
9
+ }
10
+ export declare class FileTooLargeException extends BadRequestException {
11
+ constructor(maxSize?: number);
12
+ }
13
+ export declare class InvalidFileTypeException extends BadRequestException {
14
+ constructor(received: string, allowed: string[]);
15
+ }
16
+ export declare class TooManyFilesException extends BadRequestException {
17
+ constructor(maxFiles?: number);
18
+ }
19
+ export declare function mergeValidation(base?: UploadValidation, override?: UploadValidation): UploadValidation;
20
+ export declare function toMulterLimits(validation?: UploadValidation): MulterOptions['limits'] | undefined;
21
+ export declare function buildFileFilter(validation?: UploadValidation): MulterOptions['fileFilter'] | undefined;
22
+ export declare function formatBytes(bytes: number): string;
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TooManyFilesException = exports.InvalidFileTypeException = exports.FileTooLargeException = void 0;
4
+ exports.mergeValidation = mergeValidation;
5
+ exports.toMulterLimits = toMulterLimits;
6
+ exports.buildFileFilter = buildFileFilter;
7
+ exports.formatBytes = formatBytes;
8
+ const common_1 = require("@nestjs/common");
9
+ const path_1 = require("path");
10
+ class FileTooLargeException extends common_1.BadRequestException {
11
+ constructor(maxSize) {
12
+ super(maxSize
13
+ ? `File exceeds the maximum allowed size of ${formatBytes(maxSize)}.`
14
+ : 'File exceeds the maximum allowed size.');
15
+ }
16
+ }
17
+ exports.FileTooLargeException = FileTooLargeException;
18
+ class InvalidFileTypeException extends common_1.BadRequestException {
19
+ constructor(received, allowed) {
20
+ super(`File type "${received}" is not allowed. Allowed: ${allowed.join(', ')}.`);
21
+ }
22
+ }
23
+ exports.InvalidFileTypeException = InvalidFileTypeException;
24
+ class TooManyFilesException extends common_1.BadRequestException {
25
+ constructor(maxFiles) {
26
+ super(maxFiles
27
+ ? `Too many files. A maximum of ${maxFiles} file(s) is allowed.`
28
+ : 'Too many files uploaded.');
29
+ }
30
+ }
31
+ exports.TooManyFilesException = TooManyFilesException;
32
+ function mergeValidation(base, override) {
33
+ return { ...(base ?? {}), ...(override ?? {}) };
34
+ }
35
+ function toMulterLimits(validation) {
36
+ if (!validation)
37
+ return undefined;
38
+ const limits = {};
39
+ if (validation.maxSize != null)
40
+ limits.fileSize = validation.maxSize;
41
+ if (validation.maxFiles != null)
42
+ limits.files = validation.maxFiles;
43
+ return Object.keys(limits).length > 0 ? limits : undefined;
44
+ }
45
+ function matchesMime(mime, patterns) {
46
+ const value = (mime || '').toLowerCase();
47
+ return patterns.some((pattern) => {
48
+ const p = pattern.toLowerCase().trim();
49
+ if (p === '*' || p === '*/*')
50
+ return true;
51
+ if (p.endsWith('/*'))
52
+ return value.startsWith(p.slice(0, -1));
53
+ return value === p;
54
+ });
55
+ }
56
+ function normalizeExtensions(extensions) {
57
+ return extensions.map((ext) => {
58
+ const e = ext.toLowerCase().trim();
59
+ return e.startsWith('.') ? e : `.${e}`;
60
+ });
61
+ }
62
+ function buildFileFilter(validation) {
63
+ if (!validation)
64
+ return undefined;
65
+ const { allowedMimeTypes, allowedExtensions, fileFilter } = validation;
66
+ if (!allowedMimeTypes?.length && !allowedExtensions?.length && !fileFilter) {
67
+ return undefined;
68
+ }
69
+ const normalizedExtensions = allowedExtensions?.length ? normalizeExtensions(allowedExtensions) : undefined;
70
+ return (req, file, cb) => {
71
+ if (allowedMimeTypes?.length && !matchesMime(file.mimetype, allowedMimeTypes)) {
72
+ return cb(new InvalidFileTypeException(file.mimetype, allowedMimeTypes));
73
+ }
74
+ if (normalizedExtensions) {
75
+ const ext = (0, path_1.extname)(file.originalname).toLowerCase();
76
+ if (!normalizedExtensions.includes(ext)) {
77
+ return cb(new InvalidFileTypeException(ext || file.originalname, normalizedExtensions));
78
+ }
79
+ }
80
+ if (fileFilter) {
81
+ return fileFilter(req, file, cb);
82
+ }
83
+ cb(null, true);
84
+ };
85
+ }
86
+ function formatBytes(bytes) {
87
+ if (bytes < 1024)
88
+ return `${bytes} B`;
89
+ const units = ['KB', 'MB', 'GB', 'TB'];
90
+ let value = bytes / 1024;
91
+ let unit = 0;
92
+ while (value >= 1024 && unit < units.length - 1) {
93
+ value /= 1024;
94
+ unit += 1;
95
+ }
96
+ return `${value % 1 === 0 ? value : value.toFixed(1)} ${units[unit]}`;
97
+ }
98
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/lib/validation.ts"],"names":[],"mappings":";;;AAoDA,0CAKC;AAGD,wCAMC;AA0BD,0CAuBC;AAGD,kCAUC;AAhID,2CAAqD;AAErD,+BAA+B;AAqB/B,MAAa,qBAAsB,SAAQ,4BAAmB;IAC1D,YAAY,OAAgB;QACxB,KAAK,CACD,OAAO;YACH,CAAC,CAAC,4CAA4C,WAAW,CAAC,OAAO,CAAC,GAAG;YACrE,CAAC,CAAC,wCAAwC,CACjD,CAAC;IACN,CAAC;CACJ;AARD,sDAQC;AAGD,MAAa,wBAAyB,SAAQ,4BAAmB;IAC7D,YAAY,QAAgB,EAAE,OAAiB;QAC3C,KAAK,CAAC,cAAc,QAAQ,8BAA8B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrF,CAAC;CACJ;AAJD,4DAIC;AAGD,MAAa,qBAAsB,SAAQ,4BAAmB;IAC1D,YAAY,QAAiB;QACzB,KAAK,CACD,QAAQ;YACJ,CAAC,CAAC,gCAAgC,QAAQ,sBAAsB;YAChE,CAAC,CAAC,0BAA0B,CACnC,CAAC;IACN,CAAC;CACJ;AARD,sDAQC;AAGD,SAAgB,eAAe,CAC3B,IAAuB,EACvB,QAA2B;IAE3B,OAAO,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,CAAC;AACpD,CAAC;AAGD,SAAgB,cAAc,CAAC,UAA6B;IACxD,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC;IAClC,MAAM,MAAM,GAAyC,EAAE,CAAC;IACxD,IAAI,UAAU,CAAC,OAAO,IAAI,IAAI;QAAE,MAAM,CAAC,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC;IACrE,IAAI,UAAU,CAAC,QAAQ,IAAI,IAAI;QAAE,MAAM,CAAC,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC;IACpE,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/D,CAAC;AAGD,SAAS,WAAW,CAAC,IAAY,EAAE,QAAkB;IACjD,MAAM,KAAK,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACzC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QACvC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK;YAAE,OAAO,IAAI,CAAC;QAC1C,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,OAAO,KAAK,KAAK,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACP,CAAC;AAGD,SAAS,mBAAmB,CAAC,UAAoB;IAC7C,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QAC1B,MAAM,CAAC,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;IAC3C,CAAC,CAAC,CAAC;AACP,CAAC;AAOD,SAAgB,eAAe,CAAC,UAA6B;IACzD,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC;IAClC,MAAM,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,UAAU,EAAE,GAAG,UAAU,CAAC;IACvE,IAAI,CAAC,gBAAgB,EAAE,MAAM,IAAI,CAAC,iBAAiB,EAAE,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACzE,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,MAAM,oBAAoB,GAAG,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE5G,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE;QACrB,IAAI,gBAAgB,EAAE,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,gBAAgB,CAAC,EAAE,CAAC;YAC5E,OAAO,EAAE,CAAC,IAAI,wBAAwB,CAAC,IAAI,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC;QAC7E,CAAC;QACD,IAAI,oBAAoB,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,IAAA,cAAO,EAAC,IAAI,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;YACrD,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtC,OAAO,EAAE,CAAC,IAAI,wBAAwB,CAAC,GAAG,IAAI,IAAI,CAAC,YAAY,EAAE,oBAAoB,CAAC,CAAC,CAAC;YAC5F,CAAC;QACL,CAAC;QACD,IAAI,UAAU,EAAE,CAAC;YACb,OAAO,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QACrC,CAAC;QACD,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACnB,CAAC,CAAC;AACN,CAAC;AAGD,SAAgB,WAAW,CAAC,KAAa;IACrC,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,GAAG,KAAK,IAAI,CAAC;IACtC,MAAM,KAAK,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACvC,IAAI,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC;IACzB,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,OAAO,KAAK,IAAI,IAAI,IAAI,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,KAAK,IAAI,IAAI,CAAC;QACd,IAAI,IAAI,CAAC,CAAC;IACd,CAAC;IACD,OAAO,GAAG,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;AAC1E,CAAC"}