@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.
- package/CHANGELOG.md +72 -0
- package/MIGRATION.md +220 -0
- package/README.md +353 -547
- package/dist/index.d.ts +1 -4
- package/dist/index.js +1 -4
- package/dist/index.js.map +1 -1
- package/dist/lib/constants.d.ts +3 -1
- package/dist/lib/constants.js +4 -2
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/driver-registry.d.ts +34 -0
- package/dist/lib/driver-registry.js +118 -0
- package/dist/lib/driver-registry.js.map +1 -0
- package/dist/lib/drivers/azure.driver.d.ts +21 -0
- package/dist/lib/drivers/azure.driver.js +91 -0
- package/dist/lib/drivers/azure.driver.js.map +1 -0
- package/dist/lib/drivers/driver.interface.d.ts +40 -0
- package/dist/lib/drivers/driver.interface.js +3 -0
- package/dist/lib/drivers/driver.interface.js.map +1 -0
- package/dist/lib/drivers/driver.util.d.ts +2 -0
- package/dist/lib/drivers/driver.util.js +15 -0
- package/dist/lib/drivers/driver.util.js.map +1 -0
- package/dist/lib/drivers/index.d.ts +7 -0
- package/dist/lib/drivers/index.js +39 -0
- package/dist/lib/drivers/index.js.map +1 -0
- package/dist/lib/drivers/local.driver.d.ts +15 -0
- package/dist/lib/drivers/local.driver.js +110 -0
- package/dist/lib/drivers/local.driver.js.map +1 -0
- package/dist/lib/drivers/s3.driver.d.ts +22 -0
- package/dist/lib/drivers/s3.driver.js +103 -0
- package/dist/lib/drivers/s3.driver.js.map +1 -0
- package/dist/lib/file-storage.service.d.ts +16 -5
- package/dist/lib/file-storage.service.js +60 -22
- package/dist/lib/file-storage.service.js.map +1 -1
- package/dist/lib/index.d.ts +9 -2
- package/dist/lib/index.js +15 -2
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/interceptor/file-storage.interceptor.d.ts +7 -10
- package/dist/lib/interceptor/file-storage.interceptor.js +119 -112
- package/dist/lib/interceptor/file-storage.interceptor.js.map +1 -1
- package/dist/lib/multer/driver-multer-engine.d.ts +18 -0
- package/dist/lib/multer/driver-multer-engine.js +91 -0
- package/dist/lib/multer/driver-multer-engine.js.map +1 -0
- package/dist/lib/nest-file-storage.module.d.ts +3 -3
- package/dist/lib/nest-file-storage.module.js +81 -44
- package/dist/lib/nest-file-storage.module.js.map +1 -1
- package/dist/lib/registry-holder.d.ts +6 -0
- package/dist/lib/registry-holder.js +26 -0
- package/dist/lib/registry-holder.js.map +1 -0
- package/dist/lib/tenant/tenant-from.d.ts +14 -0
- package/dist/lib/tenant/tenant-from.js +71 -0
- package/dist/lib/tenant/tenant-from.js.map +1 -0
- package/dist/lib/tenant/tenant.types.d.ts +20 -0
- package/dist/lib/tenant/tenant.types.js +3 -0
- package/dist/lib/tenant/tenant.types.js.map +1 -0
- package/dist/lib/types.d.ts +45 -35
- package/dist/lib/types.js.map +1 -1
- package/dist/lib/validation.d.ts +22 -0
- package/dist/lib/validation.js +98 -0
- package/dist/lib/validation.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/examples/1-basic-local-storage.example.ts +11 -7
- package/examples/10-testing.example.ts +60 -196
- package/examples/11-custom-driver.example.ts +82 -0
- package/examples/12-multi-tenant.example.ts +93 -0
- package/examples/2-s3-storage.example.ts +18 -16
- package/examples/3-azure-storage.example.ts +14 -12
- package/examples/4-upload-controller.example.ts +20 -55
- package/examples/5-custom-configuration.example.ts +37 -57
- package/examples/6-file-service.example.ts +34 -91
- package/examples/7-user-avatar.example.ts +37 -92
- package/examples/8-document-management.example.ts +45 -196
- package/examples/9-dynamic-storage.example.ts +29 -147
- package/examples/README.md +25 -107
- package/package.json +17 -4
- package/dist/lib/storage/azure.storage.d.ts +0 -18
- package/dist/lib/storage/azure.storage.js +0 -210
- package/dist/lib/storage/azure.storage.js.map +0 -1
- package/dist/lib/storage/local.storage.d.ts +0 -20
- package/dist/lib/storage/local.storage.js +0 -212
- package/dist/lib/storage/local.storage.js.map +0 -1
- package/dist/lib/storage/s3.storage.d.ts +0 -19
- package/dist/lib/storage/s3.storage.js +0 -241
- package/dist/lib/storage/s3.storage.js.map +0 -1
- package/dist/lib/storage.factory.d.ts +0 -8
- package/dist/lib/storage.factory.js +0 -46
- 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":"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"}
|