@flareone/common 0.1.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/LICENSE +21 -0
- package/README.md +36 -0
- package/dist/chunk-4TE4W4RZ.js +231 -0
- package/dist/chunk-4TE4W4RZ.js.map +1 -0
- package/dist/chunk-JAMM5H7G.js +577 -0
- package/dist/chunk-JAMM5H7G.js.map +1 -0
- package/dist/chunk-TLAV6QIM.js +327 -0
- package/dist/chunk-TLAV6QIM.js.map +1 -0
- package/dist/chunk-VDUV5SQH.js +281 -0
- package/dist/chunk-VDUV5SQH.js.map +1 -0
- package/dist/chunk-XUS63JTZ.js +16 -0
- package/dist/chunk-XUS63JTZ.js.map +1 -0
- package/dist/guards/index.d.ts +230 -0
- package/dist/guards/index.js +4 -0
- package/dist/guards/index.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/interceptors/index.d.ts +151 -0
- package/dist/interceptors/index.js +4 -0
- package/dist/interceptors/index.js.map +1 -0
- package/dist/pipes/index.d.ts +120 -0
- package/dist/pipes/index.js +4 -0
- package/dist/pipes/index.js.map +1 -0
- package/dist/utils/index.d.ts +155 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +61 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Flareone Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# @flareone/common
|
|
2
|
+
|
|
3
|
+
Common utilities, guards, pipes, and interceptors for Flareone framework.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @flareone/common
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Features
|
|
12
|
+
|
|
13
|
+
- **Guards**: `AuthGuard` base class
|
|
14
|
+
- **Interceptors**: `LoggingInterceptor`, `TimeoutInterceptor`
|
|
15
|
+
- **Pipes**: `ValidationPipe`, `ParseIntPipe`, `ParseBoolPipe`
|
|
16
|
+
- **Exceptions**: Standard HTTP exceptions
|
|
17
|
+
- **Decorators**: Helper decorators
|
|
18
|
+
|
|
19
|
+
## Usage
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
import { UseGuards, UsePipes } from '@flareone/core';
|
|
23
|
+
import { AuthGuard, ValidationPipe } from '@flareone/common';
|
|
24
|
+
|
|
25
|
+
@Controller('cats')
|
|
26
|
+
@UseGuards(AuthGuard)
|
|
27
|
+
export class CatsController {
|
|
28
|
+
@Post()
|
|
29
|
+
@UsePipes(ValidationPipe)
|
|
30
|
+
create(@Body() createCatDto: CreateCatDto) {
|
|
31
|
+
return 'This action adds a new cat';
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
See [main repository](https://github.com/flareonejs/flareone) for full documentation.
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { __decorateClass, __publicField } from './chunk-XUS63JTZ.js';
|
|
2
|
+
import { Injectable, BadRequestException } from '@flareone/core';
|
|
3
|
+
|
|
4
|
+
var ParseIntPipe = class {
|
|
5
|
+
constructor(options = {}) {
|
|
6
|
+
this.options = options;
|
|
7
|
+
}
|
|
8
|
+
transform(value, metadata) {
|
|
9
|
+
if (this.options.optional && (value === void 0 || value === null || value === "")) {
|
|
10
|
+
return void 0;
|
|
11
|
+
}
|
|
12
|
+
const parsed = parseInt(value, 10);
|
|
13
|
+
if (isNaN(parsed)) {
|
|
14
|
+
throw new BadRequestException(
|
|
15
|
+
this.options.errorMessage ?? `Validation failed: ${metadata.name ?? "value"} must be an integer`
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
return parsed;
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
ParseIntPipe = __decorateClass([
|
|
22
|
+
Injectable()
|
|
23
|
+
], ParseIntPipe);
|
|
24
|
+
var ParseFloatPipe = class {
|
|
25
|
+
constructor(options = {}) {
|
|
26
|
+
this.options = options;
|
|
27
|
+
}
|
|
28
|
+
transform(value, metadata) {
|
|
29
|
+
if (this.options.optional && (value === void 0 || value === null || value === "")) {
|
|
30
|
+
return void 0;
|
|
31
|
+
}
|
|
32
|
+
const parsed = parseFloat(value);
|
|
33
|
+
if (isNaN(parsed)) {
|
|
34
|
+
throw new BadRequestException(
|
|
35
|
+
this.options.errorMessage ?? `Validation failed: ${metadata.name ?? "value"} must be a number`
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
return parsed;
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
ParseFloatPipe = __decorateClass([
|
|
42
|
+
Injectable()
|
|
43
|
+
], ParseFloatPipe);
|
|
44
|
+
var ParseBoolPipe = class {
|
|
45
|
+
constructor(options = {}) {
|
|
46
|
+
this.options = options;
|
|
47
|
+
}
|
|
48
|
+
transform(value, metadata) {
|
|
49
|
+
if (this.options.optional && (value === void 0 || value === null || value === "")) {
|
|
50
|
+
return void 0;
|
|
51
|
+
}
|
|
52
|
+
if (typeof value === "boolean") {
|
|
53
|
+
return value;
|
|
54
|
+
}
|
|
55
|
+
const lowered = String(value).toLowerCase();
|
|
56
|
+
if (lowered === "true" || lowered === "1" || lowered === "yes") {
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
if (lowered === "false" || lowered === "0" || lowered === "no") {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
throw new BadRequestException(
|
|
63
|
+
this.options.errorMessage ?? `Validation failed: ${metadata.name ?? "value"} must be a boolean`
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
ParseBoolPipe = __decorateClass([
|
|
68
|
+
Injectable()
|
|
69
|
+
], ParseBoolPipe);
|
|
70
|
+
var ParseUUIDPipe = class {
|
|
71
|
+
constructor(options = {}) {
|
|
72
|
+
this.options = options;
|
|
73
|
+
}
|
|
74
|
+
transform(value, metadata) {
|
|
75
|
+
if (this.options.optional && (value === void 0 || value === null || value === "")) {
|
|
76
|
+
return void 0;
|
|
77
|
+
}
|
|
78
|
+
if (!ParseUUIDPipe.UUID_REGEX.test(value)) {
|
|
79
|
+
throw new BadRequestException(
|
|
80
|
+
this.options.errorMessage ?? `Validation failed: ${metadata.name ?? "value"} must be a valid UUID`
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
return value.toLowerCase();
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
__publicField(ParseUUIDPipe, "UUID_REGEX", /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i);
|
|
87
|
+
ParseUUIDPipe = __decorateClass([
|
|
88
|
+
Injectable()
|
|
89
|
+
], ParseUUIDPipe);
|
|
90
|
+
var ParseArrayPipe = class {
|
|
91
|
+
constructor(options = {}) {
|
|
92
|
+
this.options = options;
|
|
93
|
+
}
|
|
94
|
+
transform(value, _metadata) {
|
|
95
|
+
if (this.options.optional && (value === void 0 || value === null || value === "")) {
|
|
96
|
+
return [];
|
|
97
|
+
}
|
|
98
|
+
const separator = this.options.separator ?? ",";
|
|
99
|
+
return value.split(separator).map((item) => item.trim()).filter(Boolean);
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
ParseArrayPipe = __decorateClass([
|
|
103
|
+
Injectable()
|
|
104
|
+
], ParseArrayPipe);
|
|
105
|
+
var ParseEnumPipe = class {
|
|
106
|
+
constructor(enumType, options = {}) {
|
|
107
|
+
this.options = options;
|
|
108
|
+
this.allowedValues = Object.values(enumType);
|
|
109
|
+
}
|
|
110
|
+
allowedValues;
|
|
111
|
+
transform(value, metadata) {
|
|
112
|
+
if (this.options.optional && (value === void 0 || value === null || value === "")) {
|
|
113
|
+
return void 0;
|
|
114
|
+
}
|
|
115
|
+
if (!this.allowedValues.includes(value)) {
|
|
116
|
+
throw new BadRequestException(
|
|
117
|
+
this.options.errorMessage ?? `Validation failed: ${metadata.name ?? "value"} must be one of: ${this.allowedValues.join(", ")}`
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
return value;
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
var ValidationPipe = class {
|
|
124
|
+
constructor(options = {}) {
|
|
125
|
+
this.options = options;
|
|
126
|
+
}
|
|
127
|
+
transform(value, _metadata) {
|
|
128
|
+
if (value === void 0 && this.options.skipUndefinedProperties) {
|
|
129
|
+
return value;
|
|
130
|
+
}
|
|
131
|
+
if (value === null && this.options.skipNullProperties) {
|
|
132
|
+
return value;
|
|
133
|
+
}
|
|
134
|
+
if ((value === null || value === void 0) && this.options.skipMissingProperties) {
|
|
135
|
+
return value;
|
|
136
|
+
}
|
|
137
|
+
if (typeof value !== "object" || value === null) {
|
|
138
|
+
return value;
|
|
139
|
+
}
|
|
140
|
+
const result = { ...value };
|
|
141
|
+
if (this.options.whitelist || this.options.forbidNonWhitelisted) {
|
|
142
|
+
const knownKeys = new Set(Object.keys(value));
|
|
143
|
+
if (this.options.forbidNonWhitelisted && knownKeys.size > 0) {
|
|
144
|
+
const unknownKeys = Array.from(knownKeys);
|
|
145
|
+
if (unknownKeys.length > 0) {
|
|
146
|
+
throw new BadRequestException(
|
|
147
|
+
`Unknown properties: ${unknownKeys.join(", ")}`
|
|
148
|
+
);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
if (this.options.whitelist) {
|
|
152
|
+
for (const key of knownKeys) {
|
|
153
|
+
delete result[key];
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return result;
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
ValidationPipe = __decorateClass([
|
|
161
|
+
Injectable()
|
|
162
|
+
], ValidationPipe);
|
|
163
|
+
var DefaultValuePipe = class {
|
|
164
|
+
constructor(defaultValue) {
|
|
165
|
+
this.defaultValue = defaultValue;
|
|
166
|
+
}
|
|
167
|
+
transform(value) {
|
|
168
|
+
if (value === void 0 || value === null || value === "") {
|
|
169
|
+
return this.defaultValue;
|
|
170
|
+
}
|
|
171
|
+
return value;
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
var TrimPipe = class {
|
|
175
|
+
transform(value) {
|
|
176
|
+
if (typeof value !== "string") {
|
|
177
|
+
return value;
|
|
178
|
+
}
|
|
179
|
+
return value.trim();
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
TrimPipe = __decorateClass([
|
|
183
|
+
Injectable()
|
|
184
|
+
], TrimPipe);
|
|
185
|
+
var LowerCasePipe = class {
|
|
186
|
+
transform(value) {
|
|
187
|
+
if (typeof value !== "string") {
|
|
188
|
+
return value;
|
|
189
|
+
}
|
|
190
|
+
return value.toLowerCase();
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
LowerCasePipe = __decorateClass([
|
|
194
|
+
Injectable()
|
|
195
|
+
], LowerCasePipe);
|
|
196
|
+
var UpperCasePipe = class {
|
|
197
|
+
transform(value) {
|
|
198
|
+
if (typeof value !== "string") {
|
|
199
|
+
return value;
|
|
200
|
+
}
|
|
201
|
+
return value.toUpperCase();
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
UpperCasePipe = __decorateClass([
|
|
205
|
+
Injectable()
|
|
206
|
+
], UpperCasePipe);
|
|
207
|
+
var FileValidationPipe = class {
|
|
208
|
+
constructor(options = {}) {
|
|
209
|
+
this.options = options;
|
|
210
|
+
}
|
|
211
|
+
async transform(value, _metadata) {
|
|
212
|
+
if (!(value instanceof File)) {
|
|
213
|
+
throw new BadRequestException("Expected a file");
|
|
214
|
+
}
|
|
215
|
+
if (this.options.maxSize && value.size > this.options.maxSize) {
|
|
216
|
+
throw new BadRequestException(
|
|
217
|
+
`File size exceeds maximum allowed size of ${this.options.maxSize} bytes`
|
|
218
|
+
);
|
|
219
|
+
}
|
|
220
|
+
if (this.options.mimeTypes && !this.options.mimeTypes.includes(value.type)) {
|
|
221
|
+
throw new BadRequestException(
|
|
222
|
+
`Invalid file type. Allowed types: ${this.options.mimeTypes.join(", ")}`
|
|
223
|
+
);
|
|
224
|
+
}
|
|
225
|
+
return value;
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
export { DefaultValuePipe, FileValidationPipe, LowerCasePipe, ParseArrayPipe, ParseBoolPipe, ParseEnumPipe, ParseFloatPipe, ParseIntPipe, ParseUUIDPipe, TrimPipe, UpperCasePipe, ValidationPipe };
|
|
230
|
+
//# sourceMappingURL=chunk-4TE4W4RZ.js.map
|
|
231
|
+
//# sourceMappingURL=chunk-4TE4W4RZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/pipes/index.ts"],"names":[],"mappings":"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","file":"chunk-4TE4W4RZ.js","sourcesContent":["/**\r\n * Built-in Pipes\r\n * simple data transformations.\r\n */\r\n\r\nimport {\r\n type PipeTransform,\r\n type ArgumentMetadata,\r\n BadRequestException,\r\n Injectable,\r\n} from '@flareone/core';\r\n\r\nexport interface ParsePipeOptions {\r\n errorMessage?: string;\r\n optional?: boolean;\r\n}\r\n\r\n/**\r\n * Parse and validate integer values\r\n */\r\n@Injectable()\r\nexport class ParseIntPipe implements PipeTransform<string, number> {\r\n constructor(private readonly options: ParsePipeOptions = {}) { }\r\n\r\n transform(value: string, metadata: ArgumentMetadata): number {\r\n if (this.options.optional && (value === undefined || value === null || value === '')) {\r\n return undefined as unknown as number;\r\n }\r\n\r\n const parsed = parseInt(value, 10);\r\n\r\n if (isNaN(parsed)) {\r\n throw new BadRequestException(\r\n this.options.errorMessage ??\r\n `Validation failed: ${metadata.name ?? 'value'} must be an integer`\r\n );\r\n }\r\n\r\n return parsed;\r\n }\r\n}\r\n\r\n/**\r\n * Parse and validate float values\r\n */\r\n@Injectable()\r\nexport class ParseFloatPipe implements PipeTransform<string, number> {\r\n constructor(private readonly options: ParsePipeOptions = {}) { }\r\n\r\n transform(value: string, metadata: ArgumentMetadata): number {\r\n if (this.options.optional && (value === undefined || value === null || value === '')) {\r\n return undefined as unknown as number;\r\n }\r\n\r\n const parsed = parseFloat(value);\r\n\r\n if (isNaN(parsed)) {\r\n throw new BadRequestException(\r\n this.options.errorMessage ??\r\n `Validation failed: ${metadata.name ?? 'value'} must be a number`\r\n );\r\n }\r\n\r\n return parsed;\r\n }\r\n}\r\n\r\n/**\r\n * Parse and validate boolean values\r\n */\r\n@Injectable()\r\nexport class ParseBoolPipe implements PipeTransform<string | boolean, boolean> {\r\n constructor(private readonly options: ParsePipeOptions = {}) { }\r\n\r\n transform(value: string | boolean, metadata: ArgumentMetadata): boolean {\r\n if (this.options.optional && (value === undefined || value === null || value === '')) {\r\n return undefined as unknown as boolean;\r\n }\r\n\r\n if (typeof value === 'boolean') {\r\n return value;\r\n }\r\n\r\n const lowered = String(value).toLowerCase();\r\n\r\n if (lowered === 'true' || lowered === '1' || lowered === 'yes') {\r\n return true;\r\n }\r\n\r\n if (lowered === 'false' || lowered === '0' || lowered === 'no') {\r\n return false;\r\n }\r\n\r\n throw new BadRequestException(\r\n this.options.errorMessage ??\r\n `Validation failed: ${metadata.name ?? 'value'} must be a boolean`\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Parse and validate UUID values\r\n */\r\n@Injectable()\r\nexport class ParseUUIDPipe implements PipeTransform<string, string> {\r\n private static readonly UUID_REGEX =\r\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\r\n\r\n constructor(private readonly options: ParsePipeOptions = {}) { }\r\n\r\n transform(value: string, metadata: ArgumentMetadata): string {\r\n if (this.options.optional && (value === undefined || value === null || value === '')) {\r\n return undefined as unknown as string;\r\n }\r\n\r\n if (!ParseUUIDPipe.UUID_REGEX.test(value)) {\r\n throw new BadRequestException(\r\n this.options.errorMessage ??\r\n `Validation failed: ${metadata.name ?? 'value'} must be a valid UUID`\r\n );\r\n }\r\n\r\n return value.toLowerCase();\r\n }\r\n}\r\n\r\n/**\r\n * Parse array from comma-separated string\r\n */\r\n@Injectable()\r\nexport class ParseArrayPipe implements PipeTransform<string, string[]> {\r\n constructor(\r\n private readonly options: ParsePipeOptions & { separator?: string } = {}\r\n ) { }\r\n\r\n transform(value: string, _metadata: ArgumentMetadata): string[] {\r\n if (this.options.optional && (value === undefined || value === null || value === '')) {\r\n return [];\r\n }\r\n\r\n const separator = this.options.separator ?? ',';\r\n return value.split(separator).map((item) => item.trim()).filter(Boolean);\r\n }\r\n}\r\n\r\n/**\r\n * Parse and validate enum values\r\n */\r\nexport class ParseEnumPipe<T extends Record<string, string | number>>\r\n implements PipeTransform<string, T[keyof T]> {\r\n private readonly allowedValues: Array<string | number>;\r\n\r\n constructor(\r\n enumType: T,\r\n private readonly options: ParsePipeOptions = {}\r\n ) {\r\n this.allowedValues = Object.values(enumType);\r\n }\r\n\r\n transform(value: string, metadata: ArgumentMetadata): T[keyof T] {\r\n if (this.options.optional && (value === undefined || value === null || value === '')) {\r\n return undefined as unknown as T[keyof T];\r\n }\r\n\r\n if (!this.allowedValues.includes(value)) {\r\n throw new BadRequestException(\r\n this.options.errorMessage ??\r\n `Validation failed: ${metadata.name ?? 'value'} must be one of: ${this.allowedValues.join(', ')}`\r\n );\r\n }\r\n\r\n return value as T[keyof T];\r\n }\r\n}\r\n\r\nexport interface ValidationPipeOptions {\r\n whitelist?: boolean;\r\n forbidNonWhitelisted?: boolean;\r\n transform?: boolean;\r\n groups?: string[];\r\n skipMissingProperties?: boolean;\r\n skipUndefinedProperties?: boolean;\r\n skipNullProperties?: boolean;\r\n}\r\n\r\n/**\r\n * Simple validation pipe using schema definition\r\n */\r\n@Injectable()\r\nexport class ValidationPipe implements PipeTransform {\r\n constructor(private readonly options: ValidationPipeOptions = {}) { }\r\n\r\n transform(value: unknown, _metadata: ArgumentMetadata): unknown {\r\n if (value === undefined && this.options.skipUndefinedProperties) {\r\n return value;\r\n }\r\n\r\n if (value === null && this.options.skipNullProperties) {\r\n return value;\r\n }\r\n\r\n if ((value === null || value === undefined) && this.options.skipMissingProperties) {\r\n return value;\r\n }\r\n\r\n if (typeof value !== 'object' || value === null) {\r\n return value;\r\n }\r\n\r\n const result = { ...value } as Record<string, unknown>;\r\n\r\n if (this.options.whitelist || this.options.forbidNonWhitelisted) {\r\n const knownKeys = new Set(Object.keys(value));\r\n\r\n if (this.options.forbidNonWhitelisted && knownKeys.size > 0) {\r\n const unknownKeys = Array.from(knownKeys);\r\n if (unknownKeys.length > 0) {\r\n throw new BadRequestException(\r\n `Unknown properties: ${unknownKeys.join(', ')}`\r\n );\r\n }\r\n }\r\n\r\n if (this.options.whitelist) {\r\n for (const key of knownKeys) {\r\n delete result[key];\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\n/**\r\n * Default value pipe - provides a default when value is missing\r\n */\r\nexport class DefaultValuePipe<T = unknown> implements PipeTransform<T, T> {\r\n constructor(private readonly defaultValue: T) { }\r\n\r\n transform(value: T): T {\r\n if (value === undefined || value === null || value === '') {\r\n return this.defaultValue;\r\n }\r\n return value;\r\n }\r\n}\r\n\r\n/**\r\n * Trim pipe - trims whitespace from strings\r\n */\r\n@Injectable()\r\nexport class TrimPipe implements PipeTransform<string, string> {\r\n transform(value: string): string {\r\n if (typeof value !== 'string') {\r\n return value;\r\n }\r\n return value.trim();\r\n }\r\n}\r\n\r\n/**\r\n * Lowercase pipe - converts strings to lowercase\r\n */\r\n@Injectable()\r\nexport class LowerCasePipe implements PipeTransform<string, string> {\r\n transform(value: string): string {\r\n if (typeof value !== 'string') {\r\n return value;\r\n }\r\n return value.toLowerCase();\r\n }\r\n}\r\n\r\n/**\r\n * Uppercase pipe - converts strings to uppercase\r\n */\r\n@Injectable()\r\nexport class UpperCasePipe implements PipeTransform<string, string> {\r\n transform(value: string): string {\r\n if (typeof value !== 'string') {\r\n return value;\r\n }\r\n return value.toUpperCase();\r\n }\r\n}\r\n\r\nexport interface FileValidatorOptions {\r\n maxSize?: number;\r\n mimeTypes?: string[];\r\n}\r\n\r\n/**\r\n * File validation pipe\r\n */\r\nexport class FileValidationPipe implements PipeTransform {\r\n constructor(private readonly options: FileValidatorOptions = {}) { }\r\n\r\n async transform(value: unknown, _metadata: ArgumentMetadata): Promise<unknown> {\r\n if (!(value instanceof File)) {\r\n throw new BadRequestException('Expected a file');\r\n }\r\n\r\n if (this.options.maxSize && value.size > this.options.maxSize) {\r\n throw new BadRequestException(\r\n `File size exceeds maximum allowed size of ${this.options.maxSize} bytes`\r\n );\r\n }\r\n\r\n if (this.options.mimeTypes && !this.options.mimeTypes.includes(value.type)) {\r\n throw new BadRequestException(\r\n `Invalid file type. Allowed types: ${this.options.mimeTypes.join(', ')}`\r\n );\r\n }\r\n\r\n return value;\r\n }\r\n}\r\n"]}
|