@flusys/nestjs-storage 7.0.2 → 8.0.0-beta.1
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/config/index.d.ts +3 -3
- package/controllers/file-manager.controller.d.ts +4 -4
- package/controllers/folder.controller.d.ts +2 -2
- package/controllers/index.d.ts +4 -4
- package/controllers/storage-config.controller.d.ts +2 -2
- package/controllers/upload.controller.d.ts +3 -3
- package/docs/index.d.ts +1 -1
- package/docs/storage-swagger.config.d.ts +2 -2
- package/dtos/index.d.ts +4 -4
- package/entities/file-manager-with-company.entity.d.ts +2 -2
- package/entities/file-manager.entity.d.ts +1 -1
- package/entities/folder-with-company.entity.d.ts +1 -1
- package/entities/index.d.ts +15 -15
- package/entities/storage-config-with-company.entity.d.ts +1 -1
- package/enums/index.d.ts +1 -1
- package/fesm/493.js +2768 -0
- package/fesm/537.js +1157 -0
- package/fesm/562.js +786 -0
- package/fesm/{providers/azure-provider.optional.js → chunks/190.js} +33 -30
- package/fesm/chunks/252.js +12 -0
- package/fesm/chunks/327.js +12 -0
- package/fesm/chunks/385.js +12 -0
- package/fesm/{providers/s3-provider.optional.js → chunks/591.js} +37 -34
- package/fesm/chunks/746.js +12 -0
- package/fesm/chunks/798.js +12 -0
- package/fesm/{providers/sftp-provider.optional.js → chunks/918.js} +35 -31
- package/fesm/config/index.js +119 -3
- package/fesm/controllers/index.js +16 -4
- package/fesm/docs/index.js +206 -1
- package/fesm/dtos/index.js +879 -4
- package/fesm/entities/index.js +463 -18
- package/fesm/enums/index.js +36 -1
- package/fesm/index.js +398 -12
- package/fesm/interfaces/index.js +19 -5
- package/fesm/modules/index.js +16 -1
- package/fesm/providers/index.js +364 -3
- package/fesm/runtime.js +252 -0
- package/fesm/services/index.js +16 -6
- package/fesm/utils/index.js +149 -1
- package/index.d.ts +11 -11
- package/interfaces/file-manager.interface.d.ts +1 -1
- package/interfaces/folder.interface.d.ts +1 -1
- package/interfaces/index.d.ts +5 -5
- package/interfaces/storage-config.interface.d.ts +1 -1
- package/interfaces/storage-module-options.interface.d.ts +3 -3
- package/interfaces/storage-provider.interface.d.ts +1 -1
- package/middlewares/file-serve.middleware.d.ts +4 -3
- package/middlewares/index.d.ts +1 -1
- package/modules/index.d.ts +1 -1
- package/modules/storage.module.d.ts +2 -2
- package/package.json +30 -41
- package/providers/azure-provider.optional.d.ts +2 -2
- package/providers/index.d.ts +3 -3
- package/providers/local-provider.d.ts +2 -2
- package/providers/s3-provider.optional.d.ts +2 -2
- package/providers/sftp-provider.optional.d.ts +2 -2
- package/providers/storage-factory.service.d.ts +3 -3
- package/providers/storage-provider.registry.d.ts +2 -2
- package/services/file-manager.service.d.ts +9 -8
- package/services/folder.service.d.ts +6 -6
- package/services/index.d.ts +6 -6
- package/services/storage-config.service.d.ts +3 -3
- package/services/storage-datasource.provider.d.ts +3 -3
- package/services/storage-provider-config.service.d.ts +7 -7
- package/services/upload.service.d.ts +6 -6
- package/utils/image-compressor.util.d.ts +1 -1
- package/utils/index.d.ts +1 -1
- package/cjs/config/event-actions.js +0 -34
- package/cjs/config/index.js +0 -20
- package/cjs/config/message-keys.js +0 -46
- package/cjs/config/storage.constants.js +0 -28
- package/cjs/controllers/file-manager.controller.js +0 -152
- package/cjs/controllers/file-manager.controller.spec.js +0 -135
- package/cjs/controllers/folder.controller.js +0 -102
- package/cjs/controllers/folder.controller.spec.js +0 -86
- package/cjs/controllers/index.js +0 -21
- package/cjs/controllers/storage-config.controller.js +0 -102
- package/cjs/controllers/storage-config.controller.spec.js +0 -85
- package/cjs/controllers/upload.controller.js +0 -234
- package/cjs/controllers/upload.controller.spec.js +0 -132
- package/cjs/docs/index.js +0 -11
- package/cjs/docs/storage-swagger.config.js +0 -188
- package/cjs/docs/storage-swagger.config.spec.js +0 -72
- package/cjs/dtos/file-manager.dto.js +0 -327
- package/cjs/dtos/folder.dto.js +0 -105
- package/cjs/dtos/index.js +0 -21
- package/cjs/dtos/storage-config.dto.js +0 -170
- package/cjs/dtos/upload.dto.js +0 -272
- package/cjs/entities/file-manager-with-company.entity.js +0 -61
- package/cjs/entities/file-manager.entity.js +0 -122
- package/cjs/entities/folder-with-company.entity.js +0 -55
- package/cjs/entities/folder.entity.js +0 -64
- package/cjs/entities/index.js +0 -63
- package/cjs/entities/index.spec.js +0 -18
- package/cjs/entities/storage-config-with-company.entity.js +0 -51
- package/cjs/entities/storage-config.entity.js +0 -96
- package/cjs/enums/file-location.enum.js +0 -17
- package/cjs/enums/index.js +0 -18
- package/cjs/index.js +0 -29
- package/cjs/interfaces/file-manager.interface.js +0 -4
- package/cjs/interfaces/folder.interface.js +0 -4
- package/cjs/interfaces/index.js +0 -22
- package/cjs/interfaces/storage-config.interface.js +0 -4
- package/cjs/interfaces/storage-module-options.interface.js +0 -4
- package/cjs/interfaces/storage-provider.interface.js +0 -4
- package/cjs/middlewares/file-serve.middleware.js +0 -241
- package/cjs/middlewares/file-serve.middleware.spec.js +0 -211
- package/cjs/middlewares/index.js +0 -18
- package/cjs/modules/index.js +0 -18
- package/cjs/modules/storage.module.js +0 -165
- package/cjs/modules/storage.module.spec.js +0 -184
- package/cjs/providers/azure-provider.optional.js +0 -155
- package/cjs/providers/azure-provider.optional.spec.js +0 -228
- package/cjs/providers/index.js +0 -26
- package/cjs/providers/local-provider.js +0 -230
- package/cjs/providers/local-provider.spec.js +0 -239
- package/cjs/providers/s3-provider.optional.js +0 -175
- package/cjs/providers/s3-provider.optional.spec.js +0 -243
- package/cjs/providers/sftp-provider.optional.js +0 -203
- package/cjs/providers/sftp-provider.optional.spec.js +0 -217
- package/cjs/providers/storage-factory.service.js +0 -175
- package/cjs/providers/storage-factory.service.spec.js +0 -253
- package/cjs/providers/storage-provider.registry.js +0 -41
- package/cjs/providers/storage-provider.registry.spec.js +0 -67
- package/cjs/services/file-manager.service.js +0 -387
- package/cjs/services/file-manager.service.spec.js +0 -580
- package/cjs/services/folder.service.js +0 -101
- package/cjs/services/folder.service.spec.js +0 -167
- package/cjs/services/index.js +0 -23
- package/cjs/services/storage-config.service.js +0 -129
- package/cjs/services/storage-config.service.spec.js +0 -257
- package/cjs/services/storage-datasource.provider.js +0 -137
- package/cjs/services/storage-datasource.provider.spec.js +0 -217
- package/cjs/services/storage-provider-config.service.js +0 -171
- package/cjs/services/storage-provider-config.service.spec.js +0 -265
- package/cjs/services/upload.service.js +0 -376
- package/cjs/services/upload.service.spec.js +0 -426
- package/cjs/utils/file-validator.util.js +0 -440
- package/cjs/utils/file-validator.util.spec.js +0 -259
- package/cjs/utils/image-compressor.util.js +0 -162
- package/cjs/utils/image-compressor.util.spec.js +0 -166
- package/cjs/utils/index.js +0 -18
- package/fesm/config/event-actions.js +0 -13
- package/fesm/config/message-keys.js +0 -22
- package/fesm/config/storage.constants.js +0 -7
- package/fesm/controllers/file-manager.controller.js +0 -142
- package/fesm/controllers/file-manager.controller.spec.js +0 -131
- package/fesm/controllers/folder.controller.js +0 -92
- package/fesm/controllers/folder.controller.spec.js +0 -82
- package/fesm/controllers/storage-config.controller.js +0 -92
- package/fesm/controllers/storage-config.controller.spec.js +0 -81
- package/fesm/controllers/upload.controller.js +0 -224
- package/fesm/controllers/upload.controller.spec.js +0 -128
- package/fesm/docs/storage-swagger.config.js +0 -181
- package/fesm/docs/storage-swagger.config.spec.js +0 -68
- package/fesm/dtos/file-manager.dto.js +0 -300
- package/fesm/dtos/folder.dto.js +0 -84
- package/fesm/dtos/storage-config.dto.js +0 -149
- package/fesm/dtos/upload.dto.js +0 -245
- package/fesm/entities/file-manager-with-company.entity.js +0 -51
- package/fesm/entities/file-manager.entity.js +0 -112
- package/fesm/entities/folder-with-company.entity.js +0 -45
- package/fesm/entities/folder.entity.js +0 -54
- package/fesm/entities/index.spec.js +0 -14
- package/fesm/entities/storage-config-with-company.entity.js +0 -41
- package/fesm/entities/storage-config.entity.js +0 -86
- package/fesm/enums/file-location.enum.js +0 -7
- package/fesm/interfaces/file-manager.interface.js +0 -1
- package/fesm/interfaces/folder.interface.js +0 -1
- package/fesm/interfaces/storage-config.interface.js +0 -1
- package/fesm/interfaces/storage-module-options.interface.js +0 -3
- package/fesm/interfaces/storage-provider.interface.js +0 -4
- package/fesm/middlewares/file-serve.middleware.js +0 -190
- package/fesm/middlewares/file-serve.middleware.spec.js +0 -207
- package/fesm/middlewares/index.js +0 -1
- package/fesm/modules/storage.module.js +0 -156
- package/fesm/modules/storage.module.spec.js +0 -180
- package/fesm/providers/azure-provider.optional.spec.js +0 -224
- package/fesm/providers/local-provider.js +0 -182
- package/fesm/providers/local-provider.spec.js +0 -194
- package/fesm/providers/s3-provider.optional.spec.js +0 -239
- package/fesm/providers/sftp-provider.optional.spec.js +0 -213
- package/fesm/providers/storage-factory.service.js +0 -124
- package/fesm/providers/storage-factory.service.spec.js +0 -249
- package/fesm/providers/storage-provider.registry.js +0 -34
- package/fesm/providers/storage-provider.registry.spec.js +0 -63
- package/fesm/services/file-manager.service.js +0 -336
- package/fesm/services/file-manager.service.spec.js +0 -576
- package/fesm/services/folder.service.js +0 -91
- package/fesm/services/folder.service.spec.js +0 -163
- package/fesm/services/storage-config.service.js +0 -119
- package/fesm/services/storage-config.service.spec.js +0 -253
- package/fesm/services/storage-datasource.provider.js +0 -86
- package/fesm/services/storage-datasource.provider.spec.js +0 -172
- package/fesm/services/storage-provider-config.service.js +0 -161
- package/fesm/services/storage-provider-config.service.spec.js +0 -261
- package/fesm/services/upload.service.js +0 -366
- package/fesm/services/upload.service.spec.js +0 -422
- package/fesm/utils/file-validator.util.js +0 -433
- package/fesm/utils/file-validator.util.spec.js +0 -255
- package/fesm/utils/image-compressor.util.js +0 -114
- package/fesm/utils/image-compressor.util.spec.js +0 -162
package/fesm/providers/index.js
CHANGED
|
@@ -1,9 +1,370 @@
|
|
|
1
|
+
import * as __rspack_external_sharp from "sharp";
|
|
2
|
+
import * as __rspack_external_path from "path";
|
|
3
|
+
import * as __rspack_external_uuid from "uuid";
|
|
4
|
+
import * as __rspack_external_fs_promises_e1851c9c from "fs/promises";
|
|
5
|
+
export const __rspack_esm_id = 467;
|
|
6
|
+
export const __rspack_esm_ids = [467];
|
|
7
|
+
export const __webpack_modules__ = {
|
|
8
|
+
922(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
|
|
9
|
+
/* import */ var _storage_factory_service_js__rspack_import_0 = __webpack_require__(192);
|
|
10
|
+
/* import */ var _storage_provider_registry_js__rspack_import_1 = __webpack_require__(264);
|
|
11
|
+
/* import */ var _local_provider_js__rspack_import_2 = __webpack_require__(632);
|
|
1
12
|
// Core exports
|
|
2
|
-
|
|
3
|
-
|
|
13
|
+
|
|
14
|
+
|
|
4
15
|
// Built-in provider (no external dependencies)
|
|
5
|
-
|
|
16
|
+
// Note: Optional storage providers are loaded dynamically
|
|
6
17
|
// Import them directly from their files when needed:
|
|
7
18
|
// - import { S3Provider } from '@flusys/nestjs-storage/providers/s3-provider.optional';
|
|
8
19
|
// - import { AzureProvider } from '@flusys/nestjs-storage/providers/azure-provider.optional';
|
|
9
20
|
// - import { SftpProvider } from '@flusys/nestjs-storage/providers/sftp-provider.optional';
|
|
21
|
+
|
|
22
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
23
|
+
CG: () => (/* reexport safe */ _storage_provider_registry_js__rspack_import_1.C),
|
|
24
|
+
Lk: () => (/* reexport safe */ _storage_factory_service_js__rspack_import_0.L),
|
|
25
|
+
TZ: () => (/* reexport safe */ _local_provider_js__rspack_import_2.T)
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
},
|
|
30
|
+
632(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
|
|
31
|
+
|
|
32
|
+
// EXPORTS
|
|
33
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
34
|
+
T: () => (/* binding */ LocalProvider)
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
// EXTERNAL MODULE: external "@nestjs/common"
|
|
38
|
+
var common_ = __webpack_require__(157);
|
|
39
|
+
// EXTERNAL MODULE: external "@flusys/nestjs-shared/constants"
|
|
40
|
+
var constants_ = __webpack_require__(140);
|
|
41
|
+
// EXTERNAL MODULE: ./projects/nestjs-storage/src/utils/image-compressor.util.ts + 1 modules
|
|
42
|
+
var image_compressor_util = __webpack_require__(872);
|
|
43
|
+
;// CONCATENATED MODULE: external "fs/promises"
|
|
44
|
+
|
|
45
|
+
// EXTERNAL MODULE: external "path"
|
|
46
|
+
var external_path_ = __webpack_require__(521);
|
|
47
|
+
// EXTERNAL MODULE: external "uuid"
|
|
48
|
+
var external_uuid_ = __webpack_require__(37);
|
|
49
|
+
;// CONCATENATED MODULE: ./projects/nestjs-storage/src/providers/local-provider.ts
|
|
50
|
+
/**
|
|
51
|
+
* LOCAL File System Provider
|
|
52
|
+
*
|
|
53
|
+
* This provider uses Node.js built-in 'fs' module - NO external dependencies required!
|
|
54
|
+
* Perfect for same-server storage scenarios.
|
|
55
|
+
*
|
|
56
|
+
* Usage:
|
|
57
|
+
* import { LocalProvider } from '@flusys/nestjs-storage/providers/local-provider';
|
|
58
|
+
* import { StorageProviderRegistry, FileLocationEnum } from '@flusys/nestjs-storage';
|
|
59
|
+
*
|
|
60
|
+
* StorageProviderRegistry.register(FileLocationEnum.LOCAL, LocalProvider);
|
|
61
|
+
*/
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Local File System Storage Provider
|
|
69
|
+
* Uses Node.js built-in fs module - no external dependencies
|
|
70
|
+
*/ class LocalProvider {
|
|
71
|
+
basePath = '';
|
|
72
|
+
baseUrl = '';
|
|
73
|
+
relativeBasePath = '';
|
|
74
|
+
/**
|
|
75
|
+
* SECURITY: Validates that a target path does not escape the base directory
|
|
76
|
+
* Prevents path traversal attacks using ../ sequences
|
|
77
|
+
* @throws Error if path traversal is detected
|
|
78
|
+
*/ validatePathWithinBase(targetPath) {
|
|
79
|
+
const normalizedBasePath = external_path_.resolve(this.basePath);
|
|
80
|
+
const normalizedTargetPath = external_path_.resolve(targetPath);
|
|
81
|
+
if (!normalizedTargetPath.startsWith(normalizedBasePath + external_path_.sep) && normalizedTargetPath !== normalizedBasePath) {
|
|
82
|
+
throw new common_.BadRequestException({
|
|
83
|
+
message: 'Invalid path: Path traversal attempt detected',
|
|
84
|
+
messageKey: constants_.SYSTEM_MESSAGES.PATH_TRAVERSAL_DETECTED
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* SECURITY: Validates file key format to prevent malicious input
|
|
90
|
+
* @throws Error if key contains suspicious patterns
|
|
91
|
+
*/ validateKeyFormat(key) {
|
|
92
|
+
if (!key || typeof key !== 'string' || key.trim().length === 0) {
|
|
93
|
+
throw new common_.BadRequestException({
|
|
94
|
+
message: 'Invalid file key: empty or invalid',
|
|
95
|
+
messageKey: constants_.SYSTEM_MESSAGES.INVALID_FILE_KEY
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
if (key.includes('\0')) {
|
|
99
|
+
throw new common_.BadRequestException({
|
|
100
|
+
message: 'Invalid file key: contains null bytes',
|
|
101
|
+
messageKey: constants_.SYSTEM_MESSAGES.INVALID_FILE_KEY
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Initialize Local File System provider with configuration
|
|
107
|
+
* @param config.basePath - Base path for file storage (default: './uploads')
|
|
108
|
+
* @param config.baseUrl - Optional base URL for generating file URLs
|
|
109
|
+
*/ async initialize(config) {
|
|
110
|
+
// Store original relative path for key generation
|
|
111
|
+
this.relativeBasePath = config?.basePath || './uploads';
|
|
112
|
+
// Resolve to absolute path for file operations
|
|
113
|
+
this.basePath = external_path_.resolve(this.relativeBasePath);
|
|
114
|
+
this.baseUrl = config?.baseUrl || '';
|
|
115
|
+
// Ensure base directory exists
|
|
116
|
+
await __rspack_external_fs_promises_e1851c9c.mkdir(this.basePath, {
|
|
117
|
+
recursive: true
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
async uploadFile(file, options) {
|
|
121
|
+
let processedBuffer = file.buffer;
|
|
122
|
+
let contentType = file.mimetype;
|
|
123
|
+
const fileName = `${(0,external_uuid_.v4)()}-${file.originalname}`;
|
|
124
|
+
// Compress image if needed
|
|
125
|
+
if (options.compress && file.mimetype.startsWith('image/')) {
|
|
126
|
+
const result = await image_compressor_util/* .ImageCompressor.compress */.J.compress(file.buffer, file.mimetype, {
|
|
127
|
+
maxWidth: options.maxWidth,
|
|
128
|
+
maxHeight: options.maxHeight,
|
|
129
|
+
quality: options.quality,
|
|
130
|
+
format: options.format
|
|
131
|
+
});
|
|
132
|
+
processedBuffer = result.buffer;
|
|
133
|
+
contentType = result.format;
|
|
134
|
+
}
|
|
135
|
+
// Build file path
|
|
136
|
+
const folderPath = options.folderPath ? external_path_.join(this.basePath, options.folderPath) : this.basePath;
|
|
137
|
+
// SECURITY: Validate path does not escape base directory
|
|
138
|
+
this.validatePathWithinBase(folderPath);
|
|
139
|
+
const filePath = external_path_.join(folderPath, fileName);
|
|
140
|
+
// SECURITY: Double-check final file path
|
|
141
|
+
this.validatePathWithinBase(filePath);
|
|
142
|
+
// Ensure directory exists
|
|
143
|
+
await __rspack_external_fs_promises_e1851c9c.mkdir(folderPath, {
|
|
144
|
+
recursive: true
|
|
145
|
+
});
|
|
146
|
+
// Write file to disk
|
|
147
|
+
await __rspack_external_fs_promises_e1851c9c.writeFile(filePath, processedBuffer);
|
|
148
|
+
// Generate key that includes the base path (relative to cwd)
|
|
149
|
+
// This makes the key self-contained for serving files
|
|
150
|
+
const relativeKey = external_path_.join(this.relativeBasePath, options.folderPath || '', fileName).replace(/\\/g, '/'); // Normalize path separators
|
|
151
|
+
return {
|
|
152
|
+
name: fileName,
|
|
153
|
+
key: relativeKey,
|
|
154
|
+
size: processedBuffer.length,
|
|
155
|
+
contentType
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
async uploadMultipleFiles(files, options) {
|
|
159
|
+
return Promise.all(files.map((file)=>this.uploadFile(file, options)));
|
|
160
|
+
}
|
|
161
|
+
async deleteFile(key) {
|
|
162
|
+
try {
|
|
163
|
+
// SECURITY: Validate key format first
|
|
164
|
+
this.validateKeyFormat(key);
|
|
165
|
+
// Key now includes the basePath, resolve from cwd
|
|
166
|
+
let filePath = external_path_.resolve(key);
|
|
167
|
+
// SECURITY: Validate resolved path is within base directory
|
|
168
|
+
this.validatePathWithinBase(filePath);
|
|
169
|
+
// Check if file exists at the resolved path
|
|
170
|
+
try {
|
|
171
|
+
await __rspack_external_fs_promises_e1851c9c.access(filePath);
|
|
172
|
+
} catch {
|
|
173
|
+
// Fallback: try with basePath prefix (for old keys without basePath)
|
|
174
|
+
const fallbackPath = external_path_.join(this.basePath, key);
|
|
175
|
+
// SECURITY: Validate fallback path as well
|
|
176
|
+
this.validatePathWithinBase(fallbackPath);
|
|
177
|
+
try {
|
|
178
|
+
await __rspack_external_fs_promises_e1851c9c.access(fallbackPath);
|
|
179
|
+
filePath = fallbackPath;
|
|
180
|
+
} catch {
|
|
181
|
+
// File doesn't exist at either location - silent return
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
await __rspack_external_fs_promises_e1851c9c.unlink(filePath);
|
|
186
|
+
} catch (error) {
|
|
187
|
+
// Re-throw security errors
|
|
188
|
+
if (error instanceof Error && error.message.includes('Invalid')) {
|
|
189
|
+
throw error;
|
|
190
|
+
}
|
|
191
|
+
// Silent failure for other errors
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
async deleteMultipleFiles(keys) {
|
|
195
|
+
await Promise.all(keys.map((key)=>this.deleteFile(key)));
|
|
196
|
+
}
|
|
197
|
+
async generatePresignedUrl(key, _expiresInSeconds) {
|
|
198
|
+
// Return public URL or relative path
|
|
199
|
+
// Note: Local storage doesn't support true presigned URLs
|
|
200
|
+
// If baseUrl is provided, return full URL with file serving endpoint, otherwise return relative path
|
|
201
|
+
if (this.baseUrl) {
|
|
202
|
+
// Construct URL with the file serving endpoint
|
|
203
|
+
const baseUrlWithoutTrailingSlash = this.baseUrl.replace(/\/$/, '');
|
|
204
|
+
return `${baseUrlWithoutTrailingSlash}/storage/upload/file/${key}`;
|
|
205
|
+
}
|
|
206
|
+
return `/storage/upload/file/${key}`;
|
|
207
|
+
}
|
|
208
|
+
async healthCheck() {
|
|
209
|
+
try {
|
|
210
|
+
await __rspack_external_fs_promises_e1851c9c.access(this.basePath);
|
|
211
|
+
return true;
|
|
212
|
+
} catch {
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
},
|
|
220
|
+
872(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
|
|
221
|
+
|
|
222
|
+
// EXPORTS
|
|
223
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
224
|
+
J: () => (/* binding */ ImageCompressor)
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
;// CONCATENATED MODULE: external "sharp"
|
|
228
|
+
|
|
229
|
+
;// CONCATENATED MODULE: ./projects/nestjs-storage/src/utils/image-compressor.util.ts
|
|
230
|
+
|
|
231
|
+
// Handle ESM/CJS interop - sharp exports differently in each module system
|
|
232
|
+
const sharp = __rspack_external_sharp["default"] || __rspack_external_sharp;
|
|
233
|
+
/**
|
|
234
|
+
* Image Compression Utility
|
|
235
|
+
* Handles image compression and format conversion using sharp
|
|
236
|
+
*/ class ImageCompressor {
|
|
237
|
+
/**
|
|
238
|
+
* Dynamically compresses an image based on its format and provided options.
|
|
239
|
+
* - Preserves original format if not overridden
|
|
240
|
+
* - Adjusts compression settings for each codec
|
|
241
|
+
*/ static async compress(buffer, mimetype, options = {}) {
|
|
242
|
+
const { maxWidth = 1280, maxHeight = 1280, quality = 85, format = 'original' } = options;
|
|
243
|
+
// Skip processing for SVG
|
|
244
|
+
if (mimetype === 'image/svg+xml') {
|
|
245
|
+
return {
|
|
246
|
+
buffer,
|
|
247
|
+
format: mimetype
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
// Initialize sharp with improved error handling
|
|
251
|
+
const image = sharp(buffer, {
|
|
252
|
+
failOnError: false,
|
|
253
|
+
density: 300
|
|
254
|
+
});
|
|
255
|
+
// Apply initial resize
|
|
256
|
+
image.resize({
|
|
257
|
+
width: maxWidth,
|
|
258
|
+
height: maxHeight,
|
|
259
|
+
fit: 'inside',
|
|
260
|
+
withoutEnlargement: true
|
|
261
|
+
});
|
|
262
|
+
// Determine target format
|
|
263
|
+
let targetFormat = format !== 'original' ? format : mimetype.split('/')[1];
|
|
264
|
+
// Format-specific optimizations
|
|
265
|
+
switch(targetFormat.toLowerCase()){
|
|
266
|
+
case 'jpeg':
|
|
267
|
+
case 'jpg':
|
|
268
|
+
image.jpeg({
|
|
269
|
+
quality,
|
|
270
|
+
mozjpeg: true,
|
|
271
|
+
chromaSubsampling: '4:4:4'
|
|
272
|
+
});
|
|
273
|
+
break;
|
|
274
|
+
case 'png':
|
|
275
|
+
image.png({
|
|
276
|
+
compressionLevel: 9,
|
|
277
|
+
adaptiveFiltering: true,
|
|
278
|
+
palette: true,
|
|
279
|
+
quality,
|
|
280
|
+
colors: 256,
|
|
281
|
+
dither: 1.0
|
|
282
|
+
});
|
|
283
|
+
break;
|
|
284
|
+
case 'webp':
|
|
285
|
+
image.webp({
|
|
286
|
+
quality,
|
|
287
|
+
smartSubsample: true,
|
|
288
|
+
effort: 6,
|
|
289
|
+
lossless: quality === 100
|
|
290
|
+
});
|
|
291
|
+
break;
|
|
292
|
+
case 'avif':
|
|
293
|
+
image.avif({
|
|
294
|
+
quality,
|
|
295
|
+
effort: 6,
|
|
296
|
+
chromaSubsampling: '4:4:4'
|
|
297
|
+
});
|
|
298
|
+
break;
|
|
299
|
+
case 'tiff':
|
|
300
|
+
image.tiff({
|
|
301
|
+
quality,
|
|
302
|
+
compression: 'lzw',
|
|
303
|
+
predictor: 'horizontal',
|
|
304
|
+
pyramid: true
|
|
305
|
+
});
|
|
306
|
+
break;
|
|
307
|
+
case 'gif':
|
|
308
|
+
image.gif({
|
|
309
|
+
colours: 256,
|
|
310
|
+
effort: 10,
|
|
311
|
+
dither: 1
|
|
312
|
+
});
|
|
313
|
+
break;
|
|
314
|
+
case 'jp2':
|
|
315
|
+
image.jp2({
|
|
316
|
+
quality,
|
|
317
|
+
lossless: quality === 100
|
|
318
|
+
});
|
|
319
|
+
break;
|
|
320
|
+
default:
|
|
321
|
+
// Fallback to WebP for best compression/quality ratio
|
|
322
|
+
targetFormat = 'webp';
|
|
323
|
+
image.webp({
|
|
324
|
+
quality,
|
|
325
|
+
smartSubsample: true,
|
|
326
|
+
effort: 6
|
|
327
|
+
});
|
|
328
|
+
break;
|
|
329
|
+
}
|
|
330
|
+
try {
|
|
331
|
+
const compressedBuffer = await image.toBuffer();
|
|
332
|
+
return {
|
|
333
|
+
buffer: compressedBuffer,
|
|
334
|
+
format: `image/${targetFormat}`
|
|
335
|
+
};
|
|
336
|
+
} catch {
|
|
337
|
+
return {
|
|
338
|
+
buffer,
|
|
339
|
+
format: mimetype
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
|
|
346
|
+
},
|
|
347
|
+
521(module) {
|
|
348
|
+
|
|
349
|
+
module.exports = __rspack_external_path;
|
|
350
|
+
|
|
351
|
+
|
|
352
|
+
},
|
|
353
|
+
37(module) {
|
|
354
|
+
|
|
355
|
+
module.exports = __rspack_external_uuid;
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
},
|
|
359
|
+
|
|
360
|
+
};
|
|
361
|
+
import { __webpack_require__ } from '../runtime.js';
|
|
362
|
+
var __webpack_exec__ = function(moduleId) { return __webpack_require__(__webpack_require__.s = moduleId); }
|
|
363
|
+
import * as __rspack_chunk_1 from '../493.js';
|
|
364
|
+
__webpack_require__.C(__rspack_chunk_1);
|
|
365
|
+
import * as __rspack_chunk_2 from './index.js';
|
|
366
|
+
__webpack_require__.C(__rspack_chunk_2);
|
|
367
|
+
var __webpack_exports__ = __webpack_exec__(922);var __webpack_exports__LocalProvider = __webpack_exports__.TZ;
|
|
368
|
+
var __webpack_exports__StorageFactoryService = __webpack_exports__.Lk;
|
|
369
|
+
var __webpack_exports__StorageProviderRegistry = __webpack_exports__.CG;
|
|
370
|
+
export { __webpack_exports__LocalProvider as LocalProvider, __webpack_exports__StorageFactoryService as StorageFactoryService, __webpack_exports__StorageProviderRegistry as StorageProviderRegistry };
|
package/fesm/runtime.js
ADDED
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
var __webpack_modules__ = ({});
|
|
2
|
+
// The module cache
|
|
3
|
+
var __webpack_module_cache__ = {};
|
|
4
|
+
|
|
5
|
+
// The require function
|
|
6
|
+
function __webpack_require__(moduleId) {
|
|
7
|
+
|
|
8
|
+
// Check if module is in cache
|
|
9
|
+
var cachedModule = __webpack_module_cache__[moduleId];
|
|
10
|
+
if (cachedModule !== undefined) {
|
|
11
|
+
return cachedModule.exports;
|
|
12
|
+
}
|
|
13
|
+
// Create a new module (and put it into the cache)
|
|
14
|
+
var module = (__webpack_module_cache__[moduleId] = {
|
|
15
|
+
exports: {}
|
|
16
|
+
});
|
|
17
|
+
// Execute the module function
|
|
18
|
+
__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
|
|
19
|
+
|
|
20
|
+
// Return the exports of the module
|
|
21
|
+
return module.exports;
|
|
22
|
+
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// expose the modules object (__webpack_modules__)
|
|
26
|
+
__webpack_require__.m = __webpack_modules__;
|
|
27
|
+
|
|
28
|
+
// expose the module cache
|
|
29
|
+
__webpack_require__.c = __webpack_module_cache__;
|
|
30
|
+
|
|
31
|
+
// webpack/runtime/async_module
|
|
32
|
+
(() => {
|
|
33
|
+
var hasSymbol = typeof Symbol === "function";
|
|
34
|
+
var rspackQueues = hasSymbol ? Symbol("rspack queues") : "__rspack_queues";
|
|
35
|
+
var rspackExports = __webpack_require__.aE = hasSymbol ? Symbol("rspack exports") : "__webpack_exports__";
|
|
36
|
+
var rspackError = hasSymbol ? Symbol("rspack error") : "__rspack_error";
|
|
37
|
+
var rspackDone = hasSymbol ? Symbol("rspack done") : "__rspack_done";
|
|
38
|
+
var rspackDefer = __webpack_require__.zS = hasSymbol ? Symbol("rspack defer") : "__rspack_defer";
|
|
39
|
+
__webpack_require__.zT = (asyncDeps) => {
|
|
40
|
+
var hasUnresolvedAsyncSubgraph = asyncDeps.some((id) => {
|
|
41
|
+
var cache = __webpack_module_cache__[id];
|
|
42
|
+
return !cache || cache[rspackDone] === false;
|
|
43
|
+
});
|
|
44
|
+
if (hasUnresolvedAsyncSubgraph) {
|
|
45
|
+
return ({ then(onFulfilled, onRejected) { return Promise.all(asyncDeps.map(__webpack_require__)).then(onFulfilled, onRejected) } });
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
var resolveQueue = (queue) => {
|
|
49
|
+
if (queue && queue.d < 1) {
|
|
50
|
+
queue.d = 1;
|
|
51
|
+
queue.forEach((fn) => (fn.r--));
|
|
52
|
+
queue.forEach((fn) => (fn.r-- ? fn.r++ : fn()));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
var wrapDeps = (deps) => {
|
|
56
|
+
return deps.map((dep) => {
|
|
57
|
+
if (dep !== null && typeof dep === "object") {
|
|
58
|
+
if(!dep[rspackQueues] && dep[rspackDefer]) {
|
|
59
|
+
var asyncDeps = __webpack_require__.zT(dep[rspackDefer]);
|
|
60
|
+
if (asyncDeps) {
|
|
61
|
+
var d = dep;
|
|
62
|
+
dep = {
|
|
63
|
+
then(onFulfilled, onRejected) {
|
|
64
|
+
asyncDeps.then(() => (onFulfilled(d)), onRejected);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
} else return dep;
|
|
68
|
+
}
|
|
69
|
+
if (dep[rspackQueues]) return dep;
|
|
70
|
+
if (dep.then) {
|
|
71
|
+
var queue = [];
|
|
72
|
+
queue.d = 0;
|
|
73
|
+
dep.then((r) => {
|
|
74
|
+
obj[rspackExports] = r;
|
|
75
|
+
resolveQueue(queue);
|
|
76
|
+
},(e) => {
|
|
77
|
+
obj[rspackError] = e;
|
|
78
|
+
resolveQueue(queue);
|
|
79
|
+
});
|
|
80
|
+
var obj = {};
|
|
81
|
+
obj[rspackDefer] = false;
|
|
82
|
+
obj[rspackQueues] = (fn) => (fn(queue));
|
|
83
|
+
return obj;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
var ret = {};
|
|
87
|
+
ret[rspackQueues] = () => {};
|
|
88
|
+
ret[rspackExports] = dep;
|
|
89
|
+
return ret;
|
|
90
|
+
});
|
|
91
|
+
};
|
|
92
|
+
__webpack_require__.a = (module, body, hasAwait, useModuleExports) => {
|
|
93
|
+
var queue;
|
|
94
|
+
hasAwait && ((queue = []).d = -1);
|
|
95
|
+
var depQueues = new Set();
|
|
96
|
+
var exports = module.exports;
|
|
97
|
+
var currentDeps;
|
|
98
|
+
var outerResolve;
|
|
99
|
+
var reject;
|
|
100
|
+
var promise = new Promise((resolve, rej) => {
|
|
101
|
+
reject = rej;
|
|
102
|
+
outerResolve = resolve;
|
|
103
|
+
});
|
|
104
|
+
promise[rspackExports] = exports;
|
|
105
|
+
promise[rspackQueues] = (fn) => { queue && fn(queue), depQueues.forEach(fn), promise["catch"](() => {}); };
|
|
106
|
+
module.exports = promise;
|
|
107
|
+
var asyncModule = module;
|
|
108
|
+
if (useModuleExports) {
|
|
109
|
+
asyncModule = Object.create(module);
|
|
110
|
+
asyncModule.exports = exports;
|
|
111
|
+
}
|
|
112
|
+
var handle = (deps) => {
|
|
113
|
+
currentDeps = wrapDeps(deps);
|
|
114
|
+
var fn;
|
|
115
|
+
var getResult = () => {
|
|
116
|
+
return currentDeps.map((d) => {
|
|
117
|
+
if(d[rspackDefer]) return d;
|
|
118
|
+
if (d[rspackError]) throw d[rspackError];
|
|
119
|
+
return d[rspackExports];
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
var promise = new Promise((resolve) => {
|
|
123
|
+
fn = () => (resolve(getResult));
|
|
124
|
+
fn.r = 0;
|
|
125
|
+
var fnQueue = (q) => (q !== queue && !depQueues.has(q) && (depQueues.add(q), q && !q.d && (fn.r++, q.push(fn))));
|
|
126
|
+
currentDeps.map((dep) => (dep[rspackDefer] || dep[rspackQueues](fnQueue)));
|
|
127
|
+
});
|
|
128
|
+
return fn.r ? promise : getResult();
|
|
129
|
+
};
|
|
130
|
+
var done = (err) => ((err ? reject(promise[rspackError] = err) : (useModuleExports && (exports = promise[rspackExports] = asyncModule.exports), outerResolve(exports))), resolveQueue(queue), promise[rspackDone] = true);
|
|
131
|
+
body(handle, done, asyncModule);
|
|
132
|
+
queue && queue.d < 0 && (queue.d = 0);
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
})();
|
|
136
|
+
// webpack/runtime/define_property_getters
|
|
137
|
+
(() => {
|
|
138
|
+
__webpack_require__.d = (exports, getters, values) => {
|
|
139
|
+
var define = (defs, kind) => {
|
|
140
|
+
for(var key in defs) {
|
|
141
|
+
if(__webpack_require__.o(defs, key) && !__webpack_require__.o(exports, key)) {
|
|
142
|
+
Object.defineProperty(exports, key, { enumerable: true, [kind]: defs[key] });
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
define(getters, "get");
|
|
147
|
+
define(values, "value");
|
|
148
|
+
};
|
|
149
|
+
})();
|
|
150
|
+
// webpack/runtime/ensure_chunk
|
|
151
|
+
(() => {
|
|
152
|
+
__webpack_require__.f = {};
|
|
153
|
+
// This file contains only the entry chunk.
|
|
154
|
+
// The chunk loading function for additional chunks
|
|
155
|
+
__webpack_require__.e = (chunkId) => {
|
|
156
|
+
return Promise.all(
|
|
157
|
+
Object.keys(__webpack_require__.f).reduce((promises, key) => {
|
|
158
|
+
__webpack_require__.f[key](chunkId, promises);
|
|
159
|
+
return promises;
|
|
160
|
+
}, [])
|
|
161
|
+
);
|
|
162
|
+
};
|
|
163
|
+
})();
|
|
164
|
+
// webpack/runtime/export_webpack_require
|
|
165
|
+
var __webpack_require__temp = __webpack_require__;
|
|
166
|
+
export { __webpack_require__temp as __webpack_require__ };
|
|
167
|
+
// webpack/runtime/get javascript chunk filename
|
|
168
|
+
(() => {
|
|
169
|
+
// This function allow to reference chunks
|
|
170
|
+
__webpack_require__.u = (chunkId) => {
|
|
171
|
+
// return url for filenames not based on template
|
|
172
|
+
|
|
173
|
+
// return url for filenames based on template
|
|
174
|
+
return "chunks/" + chunkId + ".js"
|
|
175
|
+
}
|
|
176
|
+
})();
|
|
177
|
+
// webpack/runtime/has_own_property
|
|
178
|
+
(() => {
|
|
179
|
+
__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
|
|
180
|
+
})();
|
|
181
|
+
// webpack/runtime/make_namespace_object
|
|
182
|
+
(() => {
|
|
183
|
+
// define __esModule on exports
|
|
184
|
+
__webpack_require__.r = (exports) => {
|
|
185
|
+
if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
|
|
186
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
187
|
+
}
|
|
188
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
189
|
+
};
|
|
190
|
+
})();
|
|
191
|
+
// webpack/runtime/module_chunk_loading
|
|
192
|
+
(() => {
|
|
193
|
+
// no BaseURI
|
|
194
|
+
// object to store loaded and loading chunks
|
|
195
|
+
// undefined = chunk not loaded, null = chunk preloaded/prefetched
|
|
196
|
+
// [resolve, Promise] = chunk loading, 0 = chunk loaded
|
|
197
|
+
var moduleInstalledChunks = {146: 0,};
|
|
198
|
+
var moduleInstallChunk = (data) => {
|
|
199
|
+
var __rspack_esm_ids = data.__rspack_esm_ids;
|
|
200
|
+
var moreModules = data.__webpack_modules__;
|
|
201
|
+
var __rspack_esm_runtime = data.__rspack_esm_runtime;
|
|
202
|
+
// add "modules" to the modules object,
|
|
203
|
+
// then flag all "ids" as loaded and fire callback
|
|
204
|
+
var moduleId, chunkId, i = 0;
|
|
205
|
+
for (moduleId in moreModules) {
|
|
206
|
+
if (__webpack_require__.o(moreModules, moduleId)) {
|
|
207
|
+
__webpack_require__.m[moduleId] = moreModules[moduleId];
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
if (__rspack_esm_runtime) __rspack_esm_runtime(__webpack_require__);
|
|
211
|
+
for (; i < __rspack_esm_ids.length; i++) {
|
|
212
|
+
chunkId = __rspack_esm_ids[i];
|
|
213
|
+
if (__webpack_require__.o(moduleInstalledChunks, chunkId) && moduleInstalledChunks[chunkId]) {
|
|
214
|
+
moduleInstalledChunks[chunkId][0]();
|
|
215
|
+
}
|
|
216
|
+
moduleInstalledChunks[__rspack_esm_ids[i]] = 0;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
__webpack_require__.f.j = function (chunkId, promises) {
|
|
222
|
+
// import() chunk loading for javascript
|
|
223
|
+
var installedChunkData = __webpack_require__.o(moduleInstalledChunks, chunkId) ? moduleInstalledChunks[chunkId] : undefined;
|
|
224
|
+
if (installedChunkData !== 0) { // 0 means "already installed".'
|
|
225
|
+
// a Promise means "currently loading".
|
|
226
|
+
if (installedChunkData) {
|
|
227
|
+
promises.push(installedChunkData[1]);
|
|
228
|
+
} else {
|
|
229
|
+
if (146 != chunkId) {
|
|
230
|
+
// setup Promise in chunk cache
|
|
231
|
+
var promise = import("./" + __webpack_require__.u(chunkId)).then(moduleInstallChunk, (e) => {
|
|
232
|
+
if (moduleInstalledChunks[chunkId] !== 0) moduleInstalledChunks[chunkId] = undefined;
|
|
233
|
+
throw e;
|
|
234
|
+
});
|
|
235
|
+
var promise = Promise.race([promise, new Promise((resolve) => {
|
|
236
|
+
installedChunkData = moduleInstalledChunks[chunkId] = [resolve];
|
|
237
|
+
})]);
|
|
238
|
+
promises.push(installedChunkData[1] = promise);
|
|
239
|
+
}
|
|
240
|
+
else moduleInstalledChunks[chunkId] = 0;
|
|
241
|
+
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
__webpack_require__.C = moduleInstallChunk;
|
|
248
|
+
// no on chunks loaded
|
|
249
|
+
// no HMR
|
|
250
|
+
// no HMR manifest
|
|
251
|
+
|
|
252
|
+
})();
|
package/fesm/services/index.js
CHANGED
|
@@ -1,6 +1,16 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
3
|
-
export
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
export const __rspack_esm_id = 995;
|
|
2
|
+
export const __rspack_esm_ids = [995];
|
|
3
|
+
export const __webpack_modules__ = {};
|
|
4
|
+
import { __webpack_require__ } from '../runtime.js';
|
|
5
|
+
var __webpack_exec__ = function(moduleId) { return __webpack_require__(__webpack_require__.s = moduleId); }
|
|
6
|
+
import * as __rspack_chunk_1 from '../493.js';
|
|
7
|
+
__webpack_require__.C(__rspack_chunk_1);
|
|
8
|
+
import * as __rspack_chunk_2 from './index.js';
|
|
9
|
+
__webpack_require__.C(__rspack_chunk_2);
|
|
10
|
+
var __webpack_exports__ = __webpack_exec__(148);var __webpack_exports__FileManagerService = __webpack_exports__.DL;
|
|
11
|
+
var __webpack_exports__FolderService = __webpack_exports__.kh;
|
|
12
|
+
var __webpack_exports__StorageConfigService = __webpack_exports__.tP;
|
|
13
|
+
var __webpack_exports__StorageDataSourceProvider = __webpack_exports__.M0;
|
|
14
|
+
var __webpack_exports__StorageProviderConfigService = __webpack_exports__.ol;
|
|
15
|
+
var __webpack_exports__UploadService = __webpack_exports__.BB;
|
|
16
|
+
export { __webpack_exports__FileManagerService as FileManagerService, __webpack_exports__FolderService as FolderService, __webpack_exports__StorageConfigService as StorageConfigService, __webpack_exports__StorageDataSourceProvider as StorageDataSourceProvider, __webpack_exports__StorageProviderConfigService as StorageProviderConfigService, __webpack_exports__UploadService as UploadService };
|