@forgedevstack/harbor 1.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 +126 -0
- package/README.md +927 -0
- package/dist/changelog/index.d.ts +3 -0
- package/dist/changelog/index.d.ts.map +1 -0
- package/dist/changelog/manager.d.ts +29 -0
- package/dist/changelog/manager.d.ts.map +1 -0
- package/dist/changelog/types.d.ts +41 -0
- package/dist/changelog/types.d.ts.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +43 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/constants/config.const.d.ts +11 -0
- package/dist/constants/config.const.d.ts.map +1 -0
- package/dist/constants/defaults.const.d.ts +10 -0
- package/dist/constants/defaults.const.d.ts.map +1 -0
- package/dist/constants/http.const.d.ts +43 -0
- package/dist/constants/http.const.d.ts.map +1 -0
- package/dist/constants/index.d.ts +5 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/validation.const.d.ts +35 -0
- package/dist/constants/validation.const.d.ts.map +1 -0
- package/dist/core/config.d.ts +6 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/errorHandler.d.ts +25 -0
- package/dist/core/errorHandler.d.ts.map +1 -0
- package/dist/core/index.d.ts +6 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/router.d.ts +68 -0
- package/dist/core/router.d.ts.map +1 -0
- package/dist/core/server.d.ts +4 -0
- package/dist/core/server.d.ts.map +1 -0
- package/dist/database/connection.d.ts +39 -0
- package/dist/database/connection.d.ts.map +1 -0
- package/dist/database/index.d.ts +28 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/model.d.ts +118 -0
- package/dist/database/model.d.ts.map +1 -0
- package/dist/database/schema.d.ts +63 -0
- package/dist/database/schema.d.ts.map +1 -0
- package/dist/database/types.d.ts +270 -0
- package/dist/database/types.d.ts.map +1 -0
- package/dist/docker/index.d.ts +3 -0
- package/dist/docker/index.d.ts.map +1 -0
- package/dist/docker/index.js +2 -0
- package/dist/docker/index.js.map +1 -0
- package/dist/docker/manager.d.ts +21 -0
- package/dist/docker/manager.d.ts.map +1 -0
- package/dist/i18n/index.d.ts +38 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/locales/en.d.ts +2 -0
- package/dist/i18n/locales/en.d.ts.map +1 -0
- package/dist/i18n/locales/he.d.ts +2 -0
- package/dist/i18n/locales/he.d.ts.map +1 -0
- package/dist/index.cjs.js +24 -0
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.es.js +2094 -0
- package/dist/index.es.js.map +1 -0
- package/dist/logger-D7aJSi62.mjs +102 -0
- package/dist/logger-D7aJSi62.mjs.map +1 -0
- package/dist/logger-DEnWXtpk.js +3 -0
- package/dist/logger-DEnWXtpk.js.map +1 -0
- package/dist/manager-B1UKMjXW.js +4 -0
- package/dist/manager-B1UKMjXW.js.map +1 -0
- package/dist/manager-B6vqJgEn.mjs +152 -0
- package/dist/manager-B6vqJgEn.mjs.map +1 -0
- package/dist/portal.d.ts +13 -0
- package/dist/portal.d.ts.map +1 -0
- package/dist/types/config.types.d.ts +83 -0
- package/dist/types/config.types.d.ts.map +1 -0
- package/dist/types/docker.types.d.ts +92 -0
- package/dist/types/docker.types.d.ts.map +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/logger.types.d.ts +35 -0
- package/dist/types/logger.types.d.ts.map +1 -0
- package/dist/types/route.types.d.ts +78 -0
- package/dist/types/route.types.d.ts.map +1 -0
- package/dist/types/server.types.d.ts +67 -0
- package/dist/types/server.types.d.ts.map +1 -0
- package/dist/types/validation.types.d.ts +64 -0
- package/dist/types/validation.types.d.ts.map +1 -0
- package/dist/utils/helpers.d.ts +7 -0
- package/dist/utils/helpers.d.ts.map +1 -0
- package/dist/utils/httpLogger.d.ts +52 -0
- package/dist/utils/httpLogger.d.ts.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/logger.d.ts +6 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/object.d.ts +6 -0
- package/dist/utils/object.d.ts.map +1 -0
- package/dist/validation/index.d.ts +5 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +2 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/mongo.d.ts +13 -0
- package/dist/validation/mongo.d.ts.map +1 -0
- package/dist/validation/paramValidators.d.ts +18 -0
- package/dist/validation/paramValidators.d.ts.map +1 -0
- package/dist/validation/validators.d.ts +9 -0
- package/dist/validation/validators.d.ts.map +1 -0
- package/harbor.config.example.json +72 -0
- package/package.json +107 -0
- package/templates/default/.eslintrc.json +45 -0
- package/templates/default/README.md +97 -0
- package/templates/default/constants/config.ts +26 -0
- package/templates/default/constants/http.ts +32 -0
- package/templates/default/constants/index.ts +3 -0
- package/templates/default/controllers/index.ts +6 -0
- package/templates/default/controllers/user.controller.ts +77 -0
- package/templates/default/env.example +22 -0
- package/templates/default/harbor.version.json +7 -0
- package/templates/default/models/index.ts +6 -0
- package/templates/default/models/user.model.ts +68 -0
- package/templates/default/package.json +44 -0
- package/templates/default/routes/index.ts +12 -0
- package/templates/default/routes/user.routes.ts +21 -0
- package/templates/default/server.ts +45 -0
- package/templates/default/services/index.ts +6 -0
- package/templates/default/services/user.service.ts +84 -0
- package/templates/default/tsconfig.json +35 -0
- package/templates/default/types/index.ts +57 -0
- package/templates/default/utils/asyncHandler.ts +14 -0
- package/templates/default/utils/index.ts +5 -0
- package/templates/default/utils/logger.ts +52 -0
- package/templates/default/utils/response.ts +24 -0
- package/templates/default/utils/validation.ts +23 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
export interface MongoValidationSchema {
|
|
2
|
+
[field: string]: MongoFieldSchema;
|
|
3
|
+
}
|
|
4
|
+
export interface MongoFieldSchema {
|
|
5
|
+
type: MongoFieldType;
|
|
6
|
+
required?: boolean;
|
|
7
|
+
unique?: boolean;
|
|
8
|
+
index?: boolean;
|
|
9
|
+
default?: unknown;
|
|
10
|
+
ref?: string;
|
|
11
|
+
enum?: unknown[];
|
|
12
|
+
min?: number;
|
|
13
|
+
max?: number;
|
|
14
|
+
minLength?: number;
|
|
15
|
+
maxLength?: number;
|
|
16
|
+
match?: RegExp;
|
|
17
|
+
validate?: CustomValidator;
|
|
18
|
+
transform?: TransformFunction;
|
|
19
|
+
}
|
|
20
|
+
export type MongoFieldType = 'String' | 'Number' | 'Boolean' | 'Date' | 'ObjectId' | 'Array' | 'Object' | 'Buffer' | 'Mixed';
|
|
21
|
+
export interface CustomValidator {
|
|
22
|
+
validator: (value: unknown) => boolean | Promise<boolean>;
|
|
23
|
+
message?: string;
|
|
24
|
+
}
|
|
25
|
+
export type TransformFunction = (value: unknown) => unknown;
|
|
26
|
+
export interface ValidationContext {
|
|
27
|
+
field: string;
|
|
28
|
+
value: unknown;
|
|
29
|
+
schema: MongoFieldSchema;
|
|
30
|
+
data: Record<string, unknown>;
|
|
31
|
+
}
|
|
32
|
+
export interface ValidatorFunction {
|
|
33
|
+
(context: ValidationContext): boolean | Promise<boolean>;
|
|
34
|
+
}
|
|
35
|
+
export interface ValidatorRegistry {
|
|
36
|
+
register: (name: string, validator: ValidatorFunction) => void;
|
|
37
|
+
get: (name: string) => ValidatorFunction | undefined;
|
|
38
|
+
has: (name: string) => boolean;
|
|
39
|
+
remove: (name: string) => boolean;
|
|
40
|
+
}
|
|
41
|
+
export interface SanitizeOptions {
|
|
42
|
+
trim?: boolean;
|
|
43
|
+
lowercase?: boolean;
|
|
44
|
+
uppercase?: boolean;
|
|
45
|
+
escape?: boolean;
|
|
46
|
+
stripHtml?: boolean;
|
|
47
|
+
maxLength?: number;
|
|
48
|
+
}
|
|
49
|
+
export interface ParamValidator<T = unknown> {
|
|
50
|
+
validate: (value: unknown) => ValidationParamResult<T>;
|
|
51
|
+
optional: () => ParamValidator<T | undefined>;
|
|
52
|
+
default: (defaultValue: T) => ParamValidator<T>;
|
|
53
|
+
transform: (fn: TransformFunction) => ParamValidator<T>;
|
|
54
|
+
}
|
|
55
|
+
export interface ValidationParamResult<T = unknown> {
|
|
56
|
+
valid: boolean;
|
|
57
|
+
value?: T;
|
|
58
|
+
error?: string;
|
|
59
|
+
}
|
|
60
|
+
export interface ObjectIdValidator {
|
|
61
|
+
isValid: (id: string) => boolean;
|
|
62
|
+
toObjectId: (id: string) => unknown;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=validation.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.types.d.ts","sourceRoot":"","sources":["../../src/types/validation.types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function generateId(length?: number): string;
|
|
2
|
+
export declare function formatDate(date: Date, format?: string): string;
|
|
3
|
+
export declare function sleep(ms: number): Promise<void>;
|
|
4
|
+
export declare function debounce<T extends (...args: unknown[]) => unknown>(fn: T, delay: number): (...args: Parameters<T>) => void;
|
|
5
|
+
export declare function throttle<T extends (...args: unknown[]) => unknown>(fn: T, limit: number): (...args: Parameters<T>) => void;
|
|
6
|
+
export declare function retry<T>(fn: () => Promise<T>, maxRetries: number, delay: number): Promise<T>;
|
|
7
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/utils/helpers.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,CAAC,MAAM,SAAK,GAAG,MAAM,CAS9C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,SAAQ,GAAG,MAAM,CAsB7D;AAED,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,EAChE,EAAE,EAAE,CAAC,EACL,KAAK,EAAE,MAAM,GACZ,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAOlC;AAED,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,EAChE,EAAE,EAAE,CAAC,EACL,KAAK,EAAE,MAAM,GACZ,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAUlC;AAED,wBAAgB,KAAK,CAAC,CAAC,EACrB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,CAAC,CAAC,CAoBZ"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { RequestHandler, Request, Response } from 'express';
|
|
2
|
+
|
|
3
|
+
export type HttpLogFormat = 'tiny' | 'short' | 'dev' | 'combined' | 'common' | 'custom';
|
|
4
|
+
export interface HttpLoggerOptions {
|
|
5
|
+
format?: HttpLogFormat;
|
|
6
|
+
skip?: (req: Request, res: Response) => boolean;
|
|
7
|
+
immediate?: boolean;
|
|
8
|
+
customFormat?: (tokens: HttpLogTokens) => string;
|
|
9
|
+
colorize?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface HttpLogTokens {
|
|
12
|
+
method: string;
|
|
13
|
+
url: string;
|
|
14
|
+
status: number;
|
|
15
|
+
statusColor: string;
|
|
16
|
+
responseTime: number;
|
|
17
|
+
contentLength: string;
|
|
18
|
+
remoteAddr: string;
|
|
19
|
+
date: string;
|
|
20
|
+
httpVersion: string;
|
|
21
|
+
userAgent: string;
|
|
22
|
+
referrer: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Create an HTTP request logger middleware (Morgan-like)
|
|
26
|
+
*/
|
|
27
|
+
export declare function httpLogger(options?: HttpLoggerOptions): RequestHandler;
|
|
28
|
+
/**
|
|
29
|
+
* Predefined skip functions
|
|
30
|
+
*/
|
|
31
|
+
export declare const skipFunctions: {
|
|
32
|
+
/** Skip successful responses */
|
|
33
|
+
successOnly: (_req: Request, res: Response) => boolean;
|
|
34
|
+
/** Skip health check endpoints */
|
|
35
|
+
healthChecks: (req: Request) => boolean;
|
|
36
|
+
/** Skip static files */
|
|
37
|
+
staticFiles: (req: Request) => boolean;
|
|
38
|
+
/** Skip based on custom paths */
|
|
39
|
+
paths: (paths: string[]) => (req: Request) => boolean;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Create a custom format function
|
|
43
|
+
*/
|
|
44
|
+
export declare function createCustomFormat(formatFn: (tokens: HttpLogTokens) => string): (tokens: HttpLogTokens) => string;
|
|
45
|
+
export declare const formats: {
|
|
46
|
+
tiny: string;
|
|
47
|
+
short: string;
|
|
48
|
+
dev: string;
|
|
49
|
+
combined: string;
|
|
50
|
+
common: string;
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=httpLogger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpLogger.d.ts","sourceRoot":"","sources":["../../src/utils/httpLogger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,QAAQ,EAAgB,MAAM,SAAS,CAAC;AAM/E,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAExF,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,KAAK,OAAO,CAAC;IAChD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,MAAM,CAAC;IACjD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AA+FD;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,cAAc,CAuD1E;AAED;;GAEG;AACH,eAAO,MAAM,aAAa;IACxB,gCAAgC;wBACZ,OAAO,OAAO,QAAQ,KAAG,OAAO;IAEpD,kCAAkC;wBACd,OAAO,KAAG,OAAO;IAGrC,wBAAwB;uBACL,OAAO,KAAG,OAAO;IAGpC,iCAAiC;mBAClB,MAAM,EAAE,MAAM,KAAK,OAAO,KAAG,OAAO;CAEpD,CAAC;AAEF;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,MAAM,GAC1C,CAAC,MAAM,EAAE,aAAa,KAAK,MAAM,CAEnC;AAGD,eAAO,MAAM,OAAO;;;;;;CAMnB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { createLogger, setGlobalLogLevel } from './logger';
|
|
2
|
+
export { deepMerge, pick, omit, isObject } from './object';
|
|
3
|
+
export { generateId, formatDate, sleep } from './helpers';
|
|
4
|
+
export { httpLogger, skipFunctions, createCustomFormat, formats } from './httpLogger';
|
|
5
|
+
export type { HttpLogFormat, HttpLoggerOptions, HttpLogTokens } from './httpLogger';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACtF,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Logger, LogLevel, LoggerOptions } from '../types';
|
|
2
|
+
|
|
3
|
+
export declare function setGlobalLogLevel(level: LogLevel): void;
|
|
4
|
+
export declare function setGlobalLogging(enabled: boolean): void;
|
|
5
|
+
export declare function createLogger(context?: string, options?: Partial<LoggerOptions>): Logger;
|
|
6
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAY,aAAa,EAAE,MAAM,UAAU,CAAC;AAuB1E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAEvD;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAEvD;AAED,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,MAAM,CAoHvF"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function isObject(value: unknown): value is Record<string, unknown>;
|
|
2
|
+
export declare function deepMerge<T extends Record<string, unknown>>(target: T, source: Partial<T>): T;
|
|
3
|
+
export declare function pick<T extends Record<string, unknown>, K extends keyof T>(obj: T, keys: K[]): Pick<T, K>;
|
|
4
|
+
export declare function omit<T extends Record<string, unknown>, K extends keyof T>(obj: T, keys: K[]): Omit<T, K>;
|
|
5
|
+
export declare function flatten(obj: Record<string, unknown>, prefix?: string): Record<string, unknown>;
|
|
6
|
+
//# sourceMappingURL=object.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../src/utils/object.ts"],"names":[],"mappings":"AAAA,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAED,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACzD,MAAM,EAAE,CAAC,EACT,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GACjB,CAAC,CAoBH;AAED,wBAAgB,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,EACvE,GAAG,EAAE,CAAC,EACN,IAAI,EAAE,CAAC,EAAE,GACR,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAUZ;AAED,wBAAgB,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,EACvE,GAAG,EAAE,CAAC,EACN,IAAI,EAAE,CAAC,EAAE,GACR,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAQZ;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,SAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAiB1F"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { validateRequest, validateField } from './validators';
|
|
2
|
+
export { MongoValidator, createMongoSchema } from './mongo';
|
|
3
|
+
export { createParamValidator, validators } from './paramValidators';
|
|
4
|
+
export type { ParamValidator, ValidationParamResult } from '../types';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACrE,YAAY,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var b=Object.defineProperty;var v=(e,t,r)=>t in e?b(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var l=(e,t,r)=>v(e,typeof t!="symbol"?t+"":t,r);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u={REQUIRED:"{field} is required",TYPE_MISMATCH:"{field} must be of type {type}",MIN_VALUE:"{field} must be at least {min}",MAX_VALUE:"{field} must be at most {max}",MIN_LENGTH:"{field} must be at least {min} characters",MAX_LENGTH:"{field} must be at most {max} characters",PATTERN:"{field} does not match the required pattern",ENUM:"{field} must be one of: {values}",INVALID_OBJECT_ID:"{field} is not a valid ObjectId",INVALID_EMAIL:"{field} is not a valid email address"},f={EMAIL:/^[^\s@]+@[^\s@]+\.[^\s@]+$/,URL:/^https?:\/\/[^\s/$.?#].[^\s]*$/i,OBJECT_ID:/^[0-9a-fA-F]{24}$/,UUID:/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i};async function I(e,t,r){const a=[],n={},i=t??{};for(const[d,m]of Object.entries(e)){const p=i[d],c=await g(d,p,m,r);c.valid?n[d]=c.value:a.push(...c.errors??[])}return a.length>0?{valid:!1,errors:a}:{valid:!0,data:n}}async function g(e,t,r,a){const n=[];if(t==null||t==="")return r.required?(n.push({field:e,message:o(u.REQUIRED,{field:e}),code:"REQUIRED"}),{valid:!1,errors:n}):r.default!==void 0?{valid:!0,value:r.default}:{valid:!0,value:void 0};let i=t;return r.transform&&(i=r.transform(i)),a.sanitize&&(i=E(i,r.type)),A(i,r.type)?(r.type==="string"&&typeof i=="string"&&(r.min!==void 0&&i.length<r.min&&n.push({field:e,message:o(u.MIN_LENGTH,{field:e,min:r.min}),code:"MIN_LENGTH"}),r.max!==void 0&&i.length>r.max&&n.push({field:e,message:o(u.MAX_LENGTH,{field:e,max:r.max}),code:"MAX_LENGTH"}),r.pattern&&(new RegExp(r.pattern).test(i)||n.push({field:e,message:o(u.PATTERN,{field:e}),code:"PATTERN"}))),r.type==="number"&&typeof i=="number"&&(r.min!==void 0&&i<r.min&&n.push({field:e,message:o(u.MIN_VALUE,{field:e,min:r.min}),code:"MIN_VALUE"}),r.max!==void 0&&i>r.max&&n.push({field:e,message:o(u.MAX_VALUE,{field:e,max:r.max}),code:"MAX_VALUE"})),r.type==="email"&&typeof i=="string"&&(f.EMAIL.test(i)||n.push({field:e,message:o(u.INVALID_EMAIL,{field:e}),code:"INVALID_EMAIL"})),r.type==="objectId"&&typeof i=="string"&&(f.OBJECT_ID.test(i)||n.push({field:e,message:o(u.INVALID_OBJECT_ID,{field:e}),code:"INVALID_OBJECT_ID"})),r.enum&&!r.enum.includes(i)&&n.push({field:e,message:o(u.ENUM,{field:e,values:r.enum.join(", ")}),code:"ENUM"}),n.length>0?{valid:!1,errors:n}:{valid:!0,value:i}):(n.push({field:e,message:o(u.TYPE_MISMATCH,{field:e,type:r.type}),code:"TYPE_MISMATCH"}),{valid:!1,errors:n})}function A(e,t){switch(t){case"string":case"email":case"objectId":return typeof e=="string";case"number":return typeof e=="number"&&!isNaN(e);case"boolean":return typeof e=="boolean";case"array":return Array.isArray(e);case"object":return typeof e=="object"&&e!==null&&!Array.isArray(e);case"date":return e instanceof Date||typeof e=="string"&&!isNaN(Date.parse(e));default:return!0}}function E(e,t){if(t==="string"&&typeof e=="string")return e.trim();if(t==="number"&&typeof e=="string"){const r=parseFloat(e);return isNaN(r)?e:r}if(t==="boolean"){if(e==="true")return!0;if(e==="false")return!1}return e}function o(e,t){let r=e;for(const[a,n]of Object.entries(t))r=r.replace(`{${a}}`,String(n));return r}class y{constructor(t,r){l(this,"schema");l(this,"customAdapter");this.schema=t,this.customAdapter=r}async validate(t){if(this.customAdapter&&typeof this.customAdapter.validate=="function")return this.customAdapter.validate(this.schema,t);const r=[],a={},n=t??{};for(const[i,d]of Object.entries(this.schema)){const m=n[i],p=this.validateField(i,m,d);p.valid?a[i]=p.value:r.push(...p.errors??[])}return r.length>0?{valid:!1,errors:r}:{valid:!0,data:a}}validateField(t,r,a){const n=[];if(r==null)return a.required?(n.push({field:t,message:`${t} is required`,code:"REQUIRED"}),{valid:!1,errors:n}):a.default!==void 0?{valid:!0,value:a.default}:{valid:!0,value:void 0};let i=r;return a.transform&&(i=a.transform(i)),this.validateType(i,a.type)?(a.type==="String"&&typeof i=="string"&&(a.minLength!==void 0&&i.length<a.minLength&&n.push({field:t,message:`${t} must be at least ${a.minLength} characters`,code:"MIN_LENGTH"}),a.maxLength!==void 0&&i.length>a.maxLength&&n.push({field:t,message:`${t} must be at most ${a.maxLength} characters`,code:"MAX_LENGTH"}),a.match&&!a.match.test(i)&&n.push({field:t,message:`${t} does not match the required pattern`,code:"PATTERN"})),a.type==="Number"&&typeof i=="number"&&(a.min!==void 0&&i<a.min&&n.push({field:t,message:`${t} must be at least ${a.min}`,code:"MIN_VALUE"}),a.max!==void 0&&i>a.max&&n.push({field:t,message:`${t} must be at most ${a.max}`,code:"MAX_VALUE"})),a.type==="ObjectId"&&typeof i=="string"&&(f.OBJECT_ID.test(i)||n.push({field:t,message:`${t} is not a valid ObjectId`,code:"INVALID_OBJECT_ID"})),a.enum&&!a.enum.includes(i)&&n.push({field:t,message:`${t} must be one of: ${a.enum.join(", ")}`,code:"ENUM"}),a.validate&&a.validate.validator(i)===!1&&n.push({field:t,message:a.validate.message??`${t} failed custom validation`,code:"CUSTOM_VALIDATION"}),n.length>0?{valid:!1,errors:n}:{valid:!0,value:i}):(n.push({field:t,message:`${t} must be of type ${a.type}`,code:"TYPE_MISMATCH"}),{valid:!1,errors:n})}validateType(t,r){switch(r){case"String":return typeof t=="string";case"Number":return typeof t=="number"&&!isNaN(t);case"Boolean":return typeof t=="boolean";case"Date":return t instanceof Date||typeof t=="string"&&!isNaN(Date.parse(t));case"ObjectId":return typeof t=="string"&&f.OBJECT_ID.test(t);case"Array":return Array.isArray(t);case"Object":case"Mixed":return typeof t=="object"&&t!==null;case"Buffer":return Buffer.isBuffer(t);default:return!0}}getSchema(){return this.schema}}function N(e){return new y(e)}class s{constructor(t){l(this,"isOptional",!1);l(this,"defaultValue");l(this,"transformFn");l(this,"validateFn");this.validateFn=t}validate(t){if(t==null||t==="")return this.defaultValue!==void 0?{valid:!0,value:this.defaultValue}:this.isOptional?{valid:!0,value:void 0}:{valid:!1,error:"Value is required"};let r=t;return this.transformFn&&(r=this.transformFn(r)),this.validateFn(r)}optional(){return this.isOptional=!0,this}default(t){return this.defaultValue=t,this}transform(t){return this.transformFn=t,this}}const V={string(){return new s(e=>typeof e!="string"?{valid:!1,error:"Value must be a string"}:{valid:!0,value:e})},number(){return new s(e=>{const t=typeof e=="string"?parseFloat(e):e;return typeof t!="number"||isNaN(t)?{valid:!1,error:"Value must be a number"}:{valid:!0,value:t}})},integer(){return new s(e=>{const t=typeof e=="string"?parseInt(e,10):e;return typeof t!="number"||isNaN(t)||!Number.isInteger(t)?{valid:!1,error:"Value must be an integer"}:{valid:!0,value:t}})},boolean(){return new s(e=>typeof e=="boolean"?{valid:!0,value:e}:e==="true"?{valid:!0,value:!0}:e==="false"?{valid:!0,value:!1}:{valid:!1,error:"Value must be a boolean"})},email(){return new s(e=>typeof e!="string"?{valid:!1,error:"Value must be a string"}:f.EMAIL.test(e)?{valid:!0,value:e}:{valid:!1,error:"Value must be a valid email"})},objectId(){return new s(e=>typeof e!="string"?{valid:!1,error:"Value must be a string"}:f.OBJECT_ID.test(e)?{valid:!0,value:e}:{valid:!1,error:"Value must be a valid ObjectId"})},uuid(){return new s(e=>typeof e!="string"?{valid:!1,error:"Value must be a string"}:f.UUID.test(e)?{valid:!0,value:e}:{valid:!1,error:"Value must be a valid UUID"})},url(){return new s(e=>typeof e!="string"?{valid:!1,error:"Value must be a string"}:f.URL.test(e)?{valid:!0,value:e}:{valid:!1,error:"Value must be a valid URL"})},date(){return new s(e=>{const t=e instanceof Date?e:new Date(e);return isNaN(t.getTime())?{valid:!1,error:"Value must be a valid date"}:{valid:!0,value:t}})},array(){return new s(e=>Array.isArray(e)?{valid:!0,value:e}:{valid:!1,error:"Value must be an array"})},enum(e){return new s(t=>e.includes(t)?{valid:!0,value:t}:{valid:!1,error:`Value must be one of: ${e.join(", ")}`})},custom(e,t){return new s(r=>e(r)?{valid:!0,value:r}:{valid:!1,error:t??"Custom validation failed"})}};function M(e){return new s(e)}exports.MongoValidator=y;exports.createMongoSchema=N;exports.createParamValidator=M;exports.validateField=g;exports.validateRequest=I;exports.validators=V;
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/constants/validation.const.ts","../../src/validation/validators.ts","../../src/validation/mongo.ts","../../src/validation/paramValidators.ts"],"sourcesContent":["export const MONGO_FIELD_TYPES = {\n STRING: 'String',\n NUMBER: 'Number',\n BOOLEAN: 'Boolean',\n DATE: 'Date',\n OBJECT_ID: 'ObjectId',\n ARRAY: 'Array',\n OBJECT: 'Object',\n BUFFER: 'Buffer',\n MIXED: 'Mixed',\n} as const;\n\nexport const VALIDATION_MESSAGES = {\n REQUIRED: '{field} is required',\n TYPE_MISMATCH: '{field} must be of type {type}',\n MIN_VALUE: '{field} must be at least {min}',\n MAX_VALUE: '{field} must be at most {max}',\n MIN_LENGTH: '{field} must be at least {min} characters',\n MAX_LENGTH: '{field} must be at most {max} characters',\n PATTERN: '{field} does not match the required pattern',\n ENUM: '{field} must be one of: {values}',\n INVALID_OBJECT_ID: '{field} is not a valid ObjectId',\n INVALID_EMAIL: '{field} is not a valid email address',\n INVALID_URL: '{field} is not a valid URL',\n INVALID_DATE: '{field} is not a valid date',\n} as const;\n\nexport const REGEX_PATTERNS = {\n EMAIL: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\n URL: /^https?:\\/\\/[^\\s/$.?#].[^\\s]*$/i,\n OBJECT_ID: /^[0-9a-fA-F]{24}$/,\n UUID: /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,\n PHONE: /^\\+?[\\d\\s-()]+$/,\n ALPHANUMERIC: /^[a-zA-Z0-9]+$/,\n SLUG: /^[a-z0-9]+(?:-[a-z0-9]+)*$/,\n} as const;\n\n","import type {\n ValidationSchema,\n FieldValidation,\n ValidationResult,\n ValidationError,\n ValidationConfig,\n} from '../types';\nimport { VALIDATION_MESSAGES, REGEX_PATTERNS } from '../constants';\n\nexport async function validateRequest<T = Record<string, unknown>>(\n schema: ValidationSchema,\n data: unknown,\n config: ValidationConfig\n): Promise<ValidationResult<T>> {\n const errors: ValidationError[] = [];\n const validated: Record<string, unknown> = {};\n const inputData = (data ?? {}) as Record<string, unknown>;\n\n for (const [field, fieldSchema] of Object.entries(schema)) {\n const value = inputData[field];\n const result = await validateField(field, value, fieldSchema, config);\n\n if (!result.valid) {\n errors.push(...(result.errors ?? []));\n } else {\n validated[field] = result.value;\n }\n }\n\n if (errors.length > 0) {\n return { valid: false, errors };\n }\n\n return { valid: true, data: validated as T };\n}\n\nexport async function validateField(\n field: string,\n value: unknown,\n schema: FieldValidation,\n config: ValidationConfig\n): Promise<{ valid: boolean; value?: unknown; errors?: ValidationError[] }> {\n const errors: ValidationError[] = [];\n\n if (value === undefined || value === null || value === '') {\n if (schema.required) {\n errors.push({\n field,\n message: formatMessage(VALIDATION_MESSAGES.REQUIRED, { field }),\n code: 'REQUIRED',\n });\n return { valid: false, errors };\n }\n\n if (schema.default !== undefined) {\n return { valid: true, value: schema.default };\n }\n\n return { valid: true, value: undefined };\n }\n\n let processedValue: unknown = value;\n\n if (schema.transform) {\n processedValue = schema.transform(processedValue);\n }\n\n if (config.sanitize) {\n processedValue = sanitizeValue(processedValue, schema.type);\n }\n\n const typeValid = validateType(processedValue, schema.type);\n if (!typeValid) {\n errors.push({\n field,\n message: formatMessage(VALIDATION_MESSAGES.TYPE_MISMATCH, { field, type: schema.type }),\n code: 'TYPE_MISMATCH',\n });\n return { valid: false, errors };\n }\n\n if (schema.type === 'string' && typeof processedValue === 'string') {\n if (schema.min !== undefined && processedValue.length < schema.min) {\n errors.push({\n field,\n message: formatMessage(VALIDATION_MESSAGES.MIN_LENGTH, { field, min: schema.min }),\n code: 'MIN_LENGTH',\n });\n }\n\n if (schema.max !== undefined && processedValue.length > schema.max) {\n errors.push({\n field,\n message: formatMessage(VALIDATION_MESSAGES.MAX_LENGTH, { field, max: schema.max }),\n code: 'MAX_LENGTH',\n });\n }\n\n if (schema.pattern) {\n const regex = new RegExp(schema.pattern);\n if (!regex.test(processedValue)) {\n errors.push({\n field,\n message: formatMessage(VALIDATION_MESSAGES.PATTERN, { field }),\n code: 'PATTERN',\n });\n }\n }\n }\n\n if (schema.type === 'number' && typeof processedValue === 'number') {\n if (schema.min !== undefined && processedValue < schema.min) {\n errors.push({\n field,\n message: formatMessage(VALIDATION_MESSAGES.MIN_VALUE, { field, min: schema.min }),\n code: 'MIN_VALUE',\n });\n }\n\n if (schema.max !== undefined && processedValue > schema.max) {\n errors.push({\n field,\n message: formatMessage(VALIDATION_MESSAGES.MAX_VALUE, { field, max: schema.max }),\n code: 'MAX_VALUE',\n });\n }\n }\n\n if (schema.type === 'email' && typeof processedValue === 'string') {\n if (!REGEX_PATTERNS.EMAIL.test(processedValue)) {\n errors.push({\n field,\n message: formatMessage(VALIDATION_MESSAGES.INVALID_EMAIL, { field }),\n code: 'INVALID_EMAIL',\n });\n }\n }\n\n if (schema.type === 'objectId' && typeof processedValue === 'string') {\n if (!REGEX_PATTERNS.OBJECT_ID.test(processedValue)) {\n errors.push({\n field,\n message: formatMessage(VALIDATION_MESSAGES.INVALID_OBJECT_ID, { field }),\n code: 'INVALID_OBJECT_ID',\n });\n }\n }\n\n if (schema.enum && !schema.enum.includes(processedValue)) {\n errors.push({\n field,\n message: formatMessage(VALIDATION_MESSAGES.ENUM, { field, values: schema.enum.join(', ') }),\n code: 'ENUM',\n });\n }\n\n if (errors.length > 0) {\n return { valid: false, errors };\n }\n\n return { valid: true, value: processedValue };\n}\n\nfunction validateType(value: unknown, type: FieldValidation['type']): boolean {\n switch (type) {\n case 'string':\n case 'email':\n case 'objectId':\n return typeof value === 'string';\n case 'number':\n return typeof value === 'number' && !isNaN(value);\n case 'boolean':\n return typeof value === 'boolean';\n case 'array':\n return Array.isArray(value);\n case 'object':\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n case 'date':\n return value instanceof Date || (typeof value === 'string' && !isNaN(Date.parse(value)));\n default:\n return true;\n }\n}\n\nfunction sanitizeValue(value: unknown, type: FieldValidation['type']): unknown {\n if (type === 'string' && typeof value === 'string') {\n return value.trim();\n }\n\n if (type === 'number' && typeof value === 'string') {\n const parsed = parseFloat(value);\n return isNaN(parsed) ? value : parsed;\n }\n\n if (type === 'boolean') {\n if (value === 'true') return true;\n if (value === 'false') return false;\n }\n\n return value;\n}\n\nfunction formatMessage(template: string, params: Record<string, unknown>): string {\n let message = template;\n for (const [key, value] of Object.entries(params)) {\n message = message.replace(`{${key}}`, String(value));\n }\n return message;\n}\n\n","import type {\n MongoValidationSchema,\n MongoFieldSchema,\n ValidationResult,\n ValidationError,\n} from '../types';\nimport { REGEX_PATTERNS } from '../constants';\n\nexport class MongoValidator {\n private schema: MongoValidationSchema;\n private customAdapter: unknown;\n\n constructor(schema: MongoValidationSchema, customAdapter?: unknown) {\n this.schema = schema;\n this.customAdapter = customAdapter;\n }\n\n async validate<T = Record<string, unknown>>(\n data: unknown\n ): Promise<ValidationResult<T>> {\n if (this.customAdapter && typeof (this.customAdapter as any).validate === 'function') {\n return (this.customAdapter as any).validate(this.schema, data);\n }\n\n const errors: ValidationError[] = [];\n const validated: Record<string, unknown> = {};\n const inputData = (data ?? {}) as Record<string, unknown>;\n\n for (const [field, fieldSchema] of Object.entries(this.schema)) {\n const value = inputData[field];\n const result = this.validateField(field, value, fieldSchema);\n\n if (!result.valid) {\n errors.push(...(result.errors ?? []));\n } else {\n validated[field] = result.value;\n }\n }\n\n if (errors.length > 0) {\n return { valid: false, errors };\n }\n\n return { valid: true, data: validated as T };\n }\n\n private validateField(\n field: string,\n value: unknown,\n schema: MongoFieldSchema\n ): { valid: boolean; value?: unknown; errors?: ValidationError[] } {\n const errors: ValidationError[] = [];\n\n if (value === undefined || value === null) {\n if (schema.required) {\n errors.push({\n field,\n message: `${field} is required`,\n code: 'REQUIRED',\n });\n return { valid: false, errors };\n }\n\n if (schema.default !== undefined) {\n return { valid: true, value: schema.default };\n }\n\n return { valid: true, value: undefined };\n }\n\n let processedValue: unknown = value;\n\n if (schema.transform) {\n processedValue = schema.transform(processedValue);\n }\n\n if (!this.validateType(processedValue, schema.type)) {\n errors.push({\n field,\n message: `${field} must be of type ${schema.type}`,\n code: 'TYPE_MISMATCH',\n });\n return { valid: false, errors };\n }\n\n if (schema.type === 'String' && typeof processedValue === 'string') {\n if (schema.minLength !== undefined && processedValue.length < schema.minLength) {\n errors.push({\n field,\n message: `${field} must be at least ${schema.minLength} characters`,\n code: 'MIN_LENGTH',\n });\n }\n\n if (schema.maxLength !== undefined && processedValue.length > schema.maxLength) {\n errors.push({\n field,\n message: `${field} must be at most ${schema.maxLength} characters`,\n code: 'MAX_LENGTH',\n });\n }\n\n if (schema.match && !schema.match.test(processedValue)) {\n errors.push({\n field,\n message: `${field} does not match the required pattern`,\n code: 'PATTERN',\n });\n }\n }\n\n if (schema.type === 'Number' && typeof processedValue === 'number') {\n if (schema.min !== undefined && processedValue < schema.min) {\n errors.push({\n field,\n message: `${field} must be at least ${schema.min}`,\n code: 'MIN_VALUE',\n });\n }\n\n if (schema.max !== undefined && processedValue > schema.max) {\n errors.push({\n field,\n message: `${field} must be at most ${schema.max}`,\n code: 'MAX_VALUE',\n });\n }\n }\n\n if (schema.type === 'ObjectId' && typeof processedValue === 'string') {\n if (!REGEX_PATTERNS.OBJECT_ID.test(processedValue)) {\n errors.push({\n field,\n message: `${field} is not a valid ObjectId`,\n code: 'INVALID_OBJECT_ID',\n });\n }\n }\n\n if (schema.enum && !schema.enum.includes(processedValue)) {\n errors.push({\n field,\n message: `${field} must be one of: ${schema.enum.join(', ')}`,\n code: 'ENUM',\n });\n }\n\n if (schema.validate) {\n const customResult = schema.validate.validator(processedValue);\n if (customResult === false) {\n errors.push({\n field,\n message: schema.validate.message ?? `${field} failed custom validation`,\n code: 'CUSTOM_VALIDATION',\n });\n }\n }\n\n if (errors.length > 0) {\n return { valid: false, errors };\n }\n\n return { valid: true, value: processedValue };\n }\n\n private validateType(value: unknown, type: MongoFieldSchema['type']): boolean {\n switch (type) {\n case 'String':\n return typeof value === 'string';\n case 'Number':\n return typeof value === 'number' && !isNaN(value);\n case 'Boolean':\n return typeof value === 'boolean';\n case 'Date':\n return value instanceof Date || (typeof value === 'string' && !isNaN(Date.parse(value)));\n case 'ObjectId':\n return typeof value === 'string' && REGEX_PATTERNS.OBJECT_ID.test(value);\n case 'Array':\n return Array.isArray(value);\n case 'Object':\n case 'Mixed':\n return typeof value === 'object' && value !== null;\n case 'Buffer':\n return Buffer.isBuffer(value);\n default:\n return true;\n }\n }\n\n getSchema(): MongoValidationSchema {\n return this.schema;\n }\n}\n\nexport function createMongoSchema(schema: MongoValidationSchema): MongoValidator {\n return new MongoValidator(schema);\n}\n\n","import type { ParamValidator, ValidationParamResult, TransformFunction } from '../types';\nimport { REGEX_PATTERNS } from '../constants';\n\nclass BaseParamValidator<T> implements ParamValidator<T> {\n protected isOptional = false;\n protected defaultValue?: T;\n protected transformFn?: TransformFunction;\n protected validateFn: (value: unknown) => ValidationParamResult<T>;\n\n constructor(validateFn: (value: unknown) => ValidationParamResult<T>) {\n this.validateFn = validateFn;\n }\n\n validate(value: unknown): ValidationParamResult<T> {\n if (value === undefined || value === null || value === '') {\n if (this.defaultValue !== undefined) {\n return { valid: true, value: this.defaultValue };\n }\n if (this.isOptional) {\n return { valid: true, value: undefined as unknown as T };\n }\n return { valid: false, error: 'Value is required' };\n }\n\n let processedValue: unknown = value;\n if (this.transformFn) {\n processedValue = this.transformFn(processedValue);\n }\n\n return this.validateFn(processedValue);\n }\n\n optional(): ParamValidator<T | undefined> {\n this.isOptional = true;\n return this as unknown as ParamValidator<T | undefined>;\n }\n\n default(defaultValue: T): ParamValidator<T> {\n this.defaultValue = defaultValue;\n return this;\n }\n\n transform(fn: TransformFunction): ParamValidator<T> {\n this.transformFn = fn;\n return this;\n }\n}\n\nexport const validators = {\n string(): ParamValidator<string> {\n return new BaseParamValidator((value) => {\n if (typeof value !== 'string') {\n return { valid: false, error: 'Value must be a string' };\n }\n return { valid: true, value };\n });\n },\n\n number(): ParamValidator<number> {\n return new BaseParamValidator((value) => {\n const num = typeof value === 'string' ? parseFloat(value) : value;\n if (typeof num !== 'number' || isNaN(num)) {\n return { valid: false, error: 'Value must be a number' };\n }\n return { valid: true, value: num };\n });\n },\n\n integer(): ParamValidator<number> {\n return new BaseParamValidator((value) => {\n const num = typeof value === 'string' ? parseInt(value, 10) : value;\n if (typeof num !== 'number' || isNaN(num) || !Number.isInteger(num)) {\n return { valid: false, error: 'Value must be an integer' };\n }\n return { valid: true, value: num };\n });\n },\n\n boolean(): ParamValidator<boolean> {\n return new BaseParamValidator((value) => {\n if (typeof value === 'boolean') {\n return { valid: true, value };\n }\n if (value === 'true') return { valid: true, value: true };\n if (value === 'false') return { valid: true, value: false };\n return { valid: false, error: 'Value must be a boolean' };\n });\n },\n\n email(): ParamValidator<string> {\n return new BaseParamValidator((value) => {\n if (typeof value !== 'string') {\n return { valid: false, error: 'Value must be a string' };\n }\n if (!REGEX_PATTERNS.EMAIL.test(value)) {\n return { valid: false, error: 'Value must be a valid email' };\n }\n return { valid: true, value };\n });\n },\n\n objectId(): ParamValidator<string> {\n return new BaseParamValidator((value) => {\n if (typeof value !== 'string') {\n return { valid: false, error: 'Value must be a string' };\n }\n if (!REGEX_PATTERNS.OBJECT_ID.test(value)) {\n return { valid: false, error: 'Value must be a valid ObjectId' };\n }\n return { valid: true, value };\n });\n },\n\n uuid(): ParamValidator<string> {\n return new BaseParamValidator((value) => {\n if (typeof value !== 'string') {\n return { valid: false, error: 'Value must be a string' };\n }\n if (!REGEX_PATTERNS.UUID.test(value)) {\n return { valid: false, error: 'Value must be a valid UUID' };\n }\n return { valid: true, value };\n });\n },\n\n url(): ParamValidator<string> {\n return new BaseParamValidator((value) => {\n if (typeof value !== 'string') {\n return { valid: false, error: 'Value must be a string' };\n }\n if (!REGEX_PATTERNS.URL.test(value)) {\n return { valid: false, error: 'Value must be a valid URL' };\n }\n return { valid: true, value };\n });\n },\n\n date(): ParamValidator<Date> {\n return new BaseParamValidator((value) => {\n const date = value instanceof Date ? value : new Date(value as string);\n if (isNaN(date.getTime())) {\n return { valid: false, error: 'Value must be a valid date' };\n }\n return { valid: true, value: date };\n });\n },\n\n array<T>(): ParamValidator<T[]> {\n return new BaseParamValidator((value) => {\n if (!Array.isArray(value)) {\n return { valid: false, error: 'Value must be an array' };\n }\n return { valid: true, value: value as T[] };\n });\n },\n\n enum<T extends string>(values: readonly T[]): ParamValidator<T> {\n return new BaseParamValidator((value) => {\n if (!values.includes(value as T)) {\n return { valid: false, error: `Value must be one of: ${values.join(', ')}` };\n }\n return { valid: true, value: value as T };\n });\n },\n\n custom<T>(validateFn: (value: unknown) => boolean, errorMessage?: string): ParamValidator<T> {\n return new BaseParamValidator((value) => {\n if (!validateFn(value)) {\n return { valid: false, error: errorMessage ?? 'Custom validation failed' };\n }\n return { valid: true, value: value as T };\n });\n },\n};\n\nexport function createParamValidator<T>(\n validateFn: (value: unknown) => ValidationParamResult<T>\n): ParamValidator<T> {\n return new BaseParamValidator(validateFn);\n}\n\n"],"names":["VALIDATION_MESSAGES","REGEX_PATTERNS","validateRequest","schema","data","config","errors","validated","inputData","field","fieldSchema","value","result","validateField","formatMessage","processedValue","sanitizeValue","validateType","type","parsed","template","params","message","key","MongoValidator","customAdapter","__publicField","createMongoSchema","BaseParamValidator","validateFn","defaultValue","fn","validators","num","date","values","errorMessage","createParamValidator"],"mappings":"oPAYO,MAAMA,EAAsB,CACjC,SAAU,sBACV,cAAe,iCACf,UAAW,iCACX,UAAW,gCACX,WAAY,4CACZ,WAAY,2CACZ,QAAS,8CACT,KAAM,mCACN,kBAAmB,kCACnB,cAAe,sCAGjB,EAEaC,EAAiB,CAC5B,MAAO,6BACP,IAAK,kCACL,UAAW,oBACX,KAAM,iEAIR,EC1BA,eAAsBC,EACpBC,EACAC,EACAC,EAC8B,CAC9B,MAAMC,EAA4B,CAAA,EAC5BC,EAAqC,CAAA,EACrCC,EAAaJ,GAAQ,CAAA,EAE3B,SAAW,CAACK,EAAOC,CAAW,IAAK,OAAO,QAAQP,CAAM,EAAG,CACzD,MAAMQ,EAAQH,EAAUC,CAAK,EACvBG,EAAS,MAAMC,EAAcJ,EAAOE,EAAOD,EAAaL,CAAM,EAE/DO,EAAO,MAGVL,EAAUE,CAAK,EAAIG,EAAO,MAF1BN,EAAO,KAAK,GAAIM,EAAO,QAAU,CAAA,CAAG,CAIxC,CAEA,OAAIN,EAAO,OAAS,EACX,CAAE,MAAO,GAAO,OAAAA,CAAA,EAGlB,CAAE,MAAO,GAAM,KAAMC,CAAA,CAC9B,CAEA,eAAsBM,EACpBJ,EACAE,EACAR,EACAE,EAC0E,CAC1E,MAAMC,EAA4B,CAAA,EAElC,GAA2BK,GAAU,MAAQA,IAAU,GACrD,OAAIR,EAAO,UACTG,EAAO,KAAK,CACV,MAAAG,EACA,QAASK,EAAcd,EAAoB,SAAU,CAAE,MAAAS,EAAO,EAC9D,KAAM,UAAA,CACP,EACM,CAAE,MAAO,GAAO,OAAAH,CAAA,GAGrBH,EAAO,UAAY,OACd,CAAE,MAAO,GAAM,MAAOA,EAAO,OAAA,EAG/B,CAAE,MAAO,GAAM,MAAO,MAAA,EAG/B,IAAIY,EAA0BJ,EAW9B,OATIR,EAAO,YACTY,EAAiBZ,EAAO,UAAUY,CAAc,GAG9CV,EAAO,WACTU,EAAiBC,EAAcD,EAAgBZ,EAAO,IAAI,GAG1Cc,EAAaF,EAAgBZ,EAAO,IAAI,GAUtDA,EAAO,OAAS,UAAY,OAAOY,GAAmB,WACpDZ,EAAO,MAAQ,QAAaY,EAAe,OAASZ,EAAO,KAC7DG,EAAO,KAAK,CACV,MAAAG,EACA,QAASK,EAAcd,EAAoB,WAAY,CAAE,MAAAS,EAAO,IAAKN,EAAO,IAAK,EACjF,KAAM,YAAA,CACP,EAGCA,EAAO,MAAQ,QAAaY,EAAe,OAASZ,EAAO,KAC7DG,EAAO,KAAK,CACV,MAAAG,EACA,QAASK,EAAcd,EAAoB,WAAY,CAAE,MAAAS,EAAO,IAAKN,EAAO,IAAK,EACjF,KAAM,YAAA,CACP,EAGCA,EAAO,UACK,IAAI,OAAOA,EAAO,OAAO,EAC5B,KAAKY,CAAc,GAC5BT,EAAO,KAAK,CACV,MAAAG,EACA,QAASK,EAAcd,EAAoB,QAAS,CAAE,MAAAS,EAAO,EAC7D,KAAM,SAAA,CACP,IAKHN,EAAO,OAAS,UAAY,OAAOY,GAAmB,WACpDZ,EAAO,MAAQ,QAAaY,EAAiBZ,EAAO,KACtDG,EAAO,KAAK,CACV,MAAAG,EACA,QAASK,EAAcd,EAAoB,UAAW,CAAE,MAAAS,EAAO,IAAKN,EAAO,IAAK,EAChF,KAAM,WAAA,CACP,EAGCA,EAAO,MAAQ,QAAaY,EAAiBZ,EAAO,KACtDG,EAAO,KAAK,CACV,MAAAG,EACA,QAASK,EAAcd,EAAoB,UAAW,CAAE,MAAAS,EAAO,IAAKN,EAAO,IAAK,EAChF,KAAM,WAAA,CACP,GAIDA,EAAO,OAAS,SAAW,OAAOY,GAAmB,WAClDd,EAAe,MAAM,KAAKc,CAAc,GAC3CT,EAAO,KAAK,CACV,MAAAG,EACA,QAASK,EAAcd,EAAoB,cAAe,CAAE,MAAAS,EAAO,EACnE,KAAM,eAAA,CACP,GAIDN,EAAO,OAAS,YAAc,OAAOY,GAAmB,WACrDd,EAAe,UAAU,KAAKc,CAAc,GAC/CT,EAAO,KAAK,CACV,MAAAG,EACA,QAASK,EAAcd,EAAoB,kBAAmB,CAAE,MAAAS,EAAO,EACvE,KAAM,mBAAA,CACP,GAIDN,EAAO,MAAQ,CAACA,EAAO,KAAK,SAASY,CAAc,GACrDT,EAAO,KAAK,CACV,MAAAG,EACA,QAASK,EAAcd,EAAoB,KAAM,CAAE,MAAAS,EAAO,OAAQN,EAAO,KAAK,KAAK,IAAI,CAAA,CAAG,EAC1F,KAAM,MAAA,CACP,EAGCG,EAAO,OAAS,EACX,CAAE,MAAO,GAAO,OAAAA,CAAA,EAGlB,CAAE,MAAO,GAAM,MAAOS,CAAA,IAvF3BT,EAAO,KAAK,CACV,MAAAG,EACA,QAASK,EAAcd,EAAoB,cAAe,CAAE,MAAAS,EAAO,KAAMN,EAAO,KAAM,EACtF,KAAM,eAAA,CACP,EACM,CAAE,MAAO,GAAO,OAAAG,CAAA,EAmF3B,CAEA,SAASW,EAAaN,EAAgBO,EAAwC,CAC5E,OAAQA,EAAA,CACN,IAAK,SACL,IAAK,QACL,IAAK,WACH,OAAO,OAAOP,GAAU,SAC1B,IAAK,SACH,OAAO,OAAOA,GAAU,UAAY,CAAC,MAAMA,CAAK,EAClD,IAAK,UACH,OAAO,OAAOA,GAAU,UAC1B,IAAK,QACH,OAAO,MAAM,QAAQA,CAAK,EAC5B,IAAK,SACH,OAAO,OAAOA,GAAU,UAAYA,IAAU,MAAQ,CAAC,MAAM,QAAQA,CAAK,EAC5E,IAAK,OACH,OAAOA,aAAiB,MAAS,OAAOA,GAAU,UAAY,CAAC,MAAM,KAAK,MAAMA,CAAK,CAAC,EACxF,QACE,MAAO,EAAA,CAEb,CAEA,SAASK,EAAcL,EAAgBO,EAAwC,CAC7E,GAAIA,IAAS,UAAY,OAAOP,GAAU,SACxC,OAAOA,EAAM,KAAA,EAGf,GAAIO,IAAS,UAAY,OAAOP,GAAU,SAAU,CAClD,MAAMQ,EAAS,WAAWR,CAAK,EAC/B,OAAO,MAAMQ,CAAM,EAAIR,EAAQQ,CACjC,CAEA,GAAID,IAAS,UAAW,CACtB,GAAIP,IAAU,OAAQ,MAAO,GAC7B,GAAIA,IAAU,QAAS,MAAO,EAChC,CAEA,OAAOA,CACT,CAEA,SAASG,EAAcM,EAAkBC,EAAyC,CAChF,IAAIC,EAAUF,EACd,SAAW,CAACG,EAAKZ,CAAK,IAAK,OAAO,QAAQU,CAAM,EAC9CC,EAAUA,EAAQ,QAAQ,IAAIC,CAAG,IAAK,OAAOZ,CAAK,CAAC,EAErD,OAAOW,CACT,CCxMO,MAAME,CAAe,CAI1B,YAAYrB,EAA+BsB,EAAyB,CAH5DC,EAAA,eACAA,EAAA,sBAGN,KAAK,OAASvB,EACd,KAAK,cAAgBsB,CACvB,CAEA,MAAM,SACJrB,EAC8B,CAC9B,GAAI,KAAK,eAAiB,OAAQ,KAAK,cAAsB,UAAa,WACxE,OAAQ,KAAK,cAAsB,SAAS,KAAK,OAAQA,CAAI,EAG/D,MAAME,EAA4B,CAAA,EAC5BC,EAAqC,CAAA,EACrCC,EAAaJ,GAAQ,CAAA,EAE3B,SAAW,CAACK,EAAOC,CAAW,IAAK,OAAO,QAAQ,KAAK,MAAM,EAAG,CAC9D,MAAMC,EAAQH,EAAUC,CAAK,EACvBG,EAAS,KAAK,cAAcH,EAAOE,EAAOD,CAAW,EAEtDE,EAAO,MAGVL,EAAUE,CAAK,EAAIG,EAAO,MAF1BN,EAAO,KAAK,GAAIM,EAAO,QAAU,CAAA,CAAG,CAIxC,CAEA,OAAIN,EAAO,OAAS,EACX,CAAE,MAAO,GAAO,OAAAA,CAAA,EAGlB,CAAE,MAAO,GAAM,KAAMC,CAAA,CAC9B,CAEQ,cACNE,EACAE,EACAR,EACiE,CACjE,MAAMG,EAA4B,CAAA,EAElC,GAA2BK,GAAU,KACnC,OAAIR,EAAO,UACTG,EAAO,KAAK,CACV,MAAAG,EACA,QAAS,GAAGA,CAAK,eACjB,KAAM,UAAA,CACP,EACM,CAAE,MAAO,GAAO,OAAAH,CAAA,GAGrBH,EAAO,UAAY,OACd,CAAE,MAAO,GAAM,MAAOA,EAAO,OAAA,EAG/B,CAAE,MAAO,GAAM,MAAO,MAAA,EAG/B,IAAIY,EAA0BJ,EAM9B,OAJIR,EAAO,YACTY,EAAiBZ,EAAO,UAAUY,CAAc,GAG7C,KAAK,aAAaA,EAAgBZ,EAAO,IAAI,GAS9CA,EAAO,OAAS,UAAY,OAAOY,GAAmB,WACpDZ,EAAO,YAAc,QAAaY,EAAe,OAASZ,EAAO,WACnEG,EAAO,KAAK,CACV,MAAAG,EACA,QAAS,GAAGA,CAAK,qBAAqBN,EAAO,SAAS,cACtD,KAAM,YAAA,CACP,EAGCA,EAAO,YAAc,QAAaY,EAAe,OAASZ,EAAO,WACnEG,EAAO,KAAK,CACV,MAAAG,EACA,QAAS,GAAGA,CAAK,oBAAoBN,EAAO,SAAS,cACrD,KAAM,YAAA,CACP,EAGCA,EAAO,OAAS,CAACA,EAAO,MAAM,KAAKY,CAAc,GACnDT,EAAO,KAAK,CACV,MAAAG,EACA,QAAS,GAAGA,CAAK,uCACjB,KAAM,SAAA,CACP,GAIDN,EAAO,OAAS,UAAY,OAAOY,GAAmB,WACpDZ,EAAO,MAAQ,QAAaY,EAAiBZ,EAAO,KACtDG,EAAO,KAAK,CACV,MAAAG,EACA,QAAS,GAAGA,CAAK,qBAAqBN,EAAO,GAAG,GAChD,KAAM,WAAA,CACP,EAGCA,EAAO,MAAQ,QAAaY,EAAiBZ,EAAO,KACtDG,EAAO,KAAK,CACV,MAAAG,EACA,QAAS,GAAGA,CAAK,oBAAoBN,EAAO,GAAG,GAC/C,KAAM,WAAA,CACP,GAIDA,EAAO,OAAS,YAAc,OAAOY,GAAmB,WACrDd,EAAe,UAAU,KAAKc,CAAc,GAC/CT,EAAO,KAAK,CACV,MAAAG,EACA,QAAS,GAAGA,CAAK,2BACjB,KAAM,mBAAA,CACP,GAIDN,EAAO,MAAQ,CAACA,EAAO,KAAK,SAASY,CAAc,GACrDT,EAAO,KAAK,CACV,MAAAG,EACA,QAAS,GAAGA,CAAK,oBAAoBN,EAAO,KAAK,KAAK,IAAI,CAAC,GAC3D,KAAM,MAAA,CACP,EAGCA,EAAO,UACYA,EAAO,SAAS,UAAUY,CAAc,IACxC,IACnBT,EAAO,KAAK,CACV,MAAAG,EACA,QAASN,EAAO,SAAS,SAAW,GAAGM,CAAK,4BAC5C,KAAM,mBAAA,CACP,EAIDH,EAAO,OAAS,EACX,CAAE,MAAO,GAAO,OAAAA,CAAA,EAGlB,CAAE,MAAO,GAAM,MAAOS,CAAA,IArF3BT,EAAO,KAAK,CACV,MAAAG,EACA,QAAS,GAAGA,CAAK,oBAAoBN,EAAO,IAAI,GAChD,KAAM,eAAA,CACP,EACM,CAAE,MAAO,GAAO,OAAAG,CAAA,EAiF3B,CAEQ,aAAaK,EAAgBO,EAAyC,CAC5E,OAAQA,EAAA,CACN,IAAK,SACH,OAAO,OAAOP,GAAU,SAC1B,IAAK,SACH,OAAO,OAAOA,GAAU,UAAY,CAAC,MAAMA,CAAK,EAClD,IAAK,UACH,OAAO,OAAOA,GAAU,UAC1B,IAAK,OACH,OAAOA,aAAiB,MAAS,OAAOA,GAAU,UAAY,CAAC,MAAM,KAAK,MAAMA,CAAK,CAAC,EACxF,IAAK,WACH,OAAO,OAAOA,GAAU,UAAYV,EAAe,UAAU,KAAKU,CAAK,EACzE,IAAK,QACH,OAAO,MAAM,QAAQA,CAAK,EAC5B,IAAK,SACL,IAAK,QACH,OAAO,OAAOA,GAAU,UAAYA,IAAU,KAChD,IAAK,SACH,OAAO,OAAO,SAASA,CAAK,EAC9B,QACE,MAAO,EAAA,CAEb,CAEA,WAAmC,CACjC,OAAO,KAAK,MACd,CACF,CAEO,SAASgB,EAAkBxB,EAA+C,CAC/E,OAAO,IAAIqB,EAAerB,CAAM,CAClC,CCjMA,MAAMyB,CAAmD,CAMvD,YAAYC,EAA0D,CAL5DH,EAAA,kBAAa,IACbA,EAAA,qBACAA,EAAA,oBACAA,EAAA,mBAGR,KAAK,WAAaG,CACpB,CAEA,SAASlB,EAA0C,CACjD,GAA2BA,GAAU,MAAQA,IAAU,GACrD,OAAI,KAAK,eAAiB,OACjB,CAAE,MAAO,GAAM,MAAO,KAAK,YAAA,EAEhC,KAAK,WACA,CAAE,MAAO,GAAM,MAAO,MAAA,EAExB,CAAE,MAAO,GAAO,MAAO,mBAAA,EAGhC,IAAII,EAA0BJ,EAC9B,OAAI,KAAK,cACPI,EAAiB,KAAK,YAAYA,CAAc,GAG3C,KAAK,WAAWA,CAAc,CACvC,CAEA,UAA0C,CACxC,YAAK,WAAa,GACX,IACT,CAEA,QAAQe,EAAoC,CAC1C,YAAK,aAAeA,EACb,IACT,CAEA,UAAUC,EAA0C,CAClD,YAAK,YAAcA,EACZ,IACT,CACF,CAEO,MAAMC,EAAa,CACxB,QAAiC,CAC/B,OAAO,IAAIJ,EAAoBjB,GACzB,OAAOA,GAAU,SACZ,CAAE,MAAO,GAAO,MAAO,wBAAA,EAEzB,CAAE,MAAO,GAAM,MAAAA,CAAA,CACvB,CACH,EAEA,QAAiC,CAC/B,OAAO,IAAIiB,EAAoBjB,GAAU,CACvC,MAAMsB,EAAM,OAAOtB,GAAU,SAAW,WAAWA,CAAK,EAAIA,EAC5D,OAAI,OAAOsB,GAAQ,UAAY,MAAMA,CAAG,EAC/B,CAAE,MAAO,GAAO,MAAO,wBAAA,EAEzB,CAAE,MAAO,GAAM,MAAOA,CAAA,CAC/B,CAAC,CACH,EAEA,SAAkC,CAChC,OAAO,IAAIL,EAAoBjB,GAAU,CACvC,MAAMsB,EAAM,OAAOtB,GAAU,SAAW,SAASA,EAAO,EAAE,EAAIA,EAC9D,OAAI,OAAOsB,GAAQ,UAAY,MAAMA,CAAG,GAAK,CAAC,OAAO,UAAUA,CAAG,EACzD,CAAE,MAAO,GAAO,MAAO,0BAAA,EAEzB,CAAE,MAAO,GAAM,MAAOA,CAAA,CAC/B,CAAC,CACH,EAEA,SAAmC,CACjC,OAAO,IAAIL,EAAoBjB,GACzB,OAAOA,GAAU,UACZ,CAAE,MAAO,GAAM,MAAAA,CAAA,EAEpBA,IAAU,OAAe,CAAE,MAAO,GAAM,MAAO,EAAA,EAC/CA,IAAU,QAAgB,CAAE,MAAO,GAAM,MAAO,EAAA,EAC7C,CAAE,MAAO,GAAO,MAAO,yBAAA,CAC/B,CACH,EAEA,OAAgC,CAC9B,OAAO,IAAIiB,EAAoBjB,GACzB,OAAOA,GAAU,SACZ,CAAE,MAAO,GAAO,MAAO,wBAAA,EAE3BV,EAAe,MAAM,KAAKU,CAAK,EAG7B,CAAE,MAAO,GAAM,MAAAA,CAAA,EAFb,CAAE,MAAO,GAAO,MAAO,6BAAA,CAGjC,CACH,EAEA,UAAmC,CACjC,OAAO,IAAIiB,EAAoBjB,GACzB,OAAOA,GAAU,SACZ,CAAE,MAAO,GAAO,MAAO,wBAAA,EAE3BV,EAAe,UAAU,KAAKU,CAAK,EAGjC,CAAE,MAAO,GAAM,MAAAA,CAAA,EAFb,CAAE,MAAO,GAAO,MAAO,gCAAA,CAGjC,CACH,EAEA,MAA+B,CAC7B,OAAO,IAAIiB,EAAoBjB,GACzB,OAAOA,GAAU,SACZ,CAAE,MAAO,GAAO,MAAO,wBAAA,EAE3BV,EAAe,KAAK,KAAKU,CAAK,EAG5B,CAAE,MAAO,GAAM,MAAAA,CAAA,EAFb,CAAE,MAAO,GAAO,MAAO,4BAAA,CAGjC,CACH,EAEA,KAA8B,CAC5B,OAAO,IAAIiB,EAAoBjB,GACzB,OAAOA,GAAU,SACZ,CAAE,MAAO,GAAO,MAAO,wBAAA,EAE3BV,EAAe,IAAI,KAAKU,CAAK,EAG3B,CAAE,MAAO,GAAM,MAAAA,CAAA,EAFb,CAAE,MAAO,GAAO,MAAO,2BAAA,CAGjC,CACH,EAEA,MAA6B,CAC3B,OAAO,IAAIiB,EAAoBjB,GAAU,CACvC,MAAMuB,EAAOvB,aAAiB,KAAOA,EAAQ,IAAI,KAAKA,CAAe,EACrE,OAAI,MAAMuB,EAAK,QAAA,CAAS,EACf,CAAE,MAAO,GAAO,MAAO,4BAAA,EAEzB,CAAE,MAAO,GAAM,MAAOA,CAAA,CAC/B,CAAC,CACH,EAEA,OAAgC,CAC9B,OAAO,IAAIN,EAAoBjB,GACxB,MAAM,QAAQA,CAAK,EAGjB,CAAE,MAAO,GAAM,MAAAA,CAAA,EAFb,CAAE,MAAO,GAAO,MAAO,wBAAA,CAGjC,CACH,EAEA,KAAuBwB,EAAyC,CAC9D,OAAO,IAAIP,EAAoBjB,GACxBwB,EAAO,SAASxB,CAAU,EAGxB,CAAE,MAAO,GAAM,MAAAA,CAAA,EAFb,CAAE,MAAO,GAAO,MAAO,yBAAyBwB,EAAO,KAAK,IAAI,CAAC,EAAA,CAG3E,CACH,EAEA,OAAUN,EAAyCO,EAA0C,CAC3F,OAAO,IAAIR,EAAoBjB,GACxBkB,EAAWlB,CAAK,EAGd,CAAE,MAAO,GAAM,MAAAA,CAAA,EAFb,CAAE,MAAO,GAAO,MAAOyB,GAAgB,0BAAA,CAGjD,CACH,CACF,EAEO,SAASC,EACdR,EACmB,CACnB,OAAO,IAAID,EAAmBC,CAAU,CAC1C"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { MongoValidationSchema, ValidationResult } from '../types';
|
|
2
|
+
|
|
3
|
+
export declare class MongoValidator {
|
|
4
|
+
private schema;
|
|
5
|
+
private customAdapter;
|
|
6
|
+
constructor(schema: MongoValidationSchema, customAdapter?: unknown);
|
|
7
|
+
validate<T = Record<string, unknown>>(data: unknown): Promise<ValidationResult<T>>;
|
|
8
|
+
private validateField;
|
|
9
|
+
private validateType;
|
|
10
|
+
getSchema(): MongoValidationSchema;
|
|
11
|
+
}
|
|
12
|
+
export declare function createMongoSchema(schema: MongoValidationSchema): MongoValidator;
|
|
13
|
+
//# sourceMappingURL=mongo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mongo.d.ts","sourceRoot":"","sources":["../../src/validation/mongo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EAErB,gBAAgB,EAEjB,MAAM,UAAU,CAAC;AAGlB,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,aAAa,CAAU;gBAEnB,MAAM,EAAE,qBAAqB,EAAE,aAAa,CAAC,EAAE,OAAO;IAK5D,QAAQ,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACxC,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;IA2B/B,OAAO,CAAC,aAAa;IAuHrB,OAAO,CAAC,YAAY;IAwBpB,SAAS,IAAI,qBAAqB;CAGnC;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,qBAAqB,GAAG,cAAc,CAE/E"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ParamValidator, ValidationParamResult } from '../types';
|
|
2
|
+
|
|
3
|
+
export declare const validators: {
|
|
4
|
+
string(): ParamValidator<string>;
|
|
5
|
+
number(): ParamValidator<number>;
|
|
6
|
+
integer(): ParamValidator<number>;
|
|
7
|
+
boolean(): ParamValidator<boolean>;
|
|
8
|
+
email(): ParamValidator<string>;
|
|
9
|
+
objectId(): ParamValidator<string>;
|
|
10
|
+
uuid(): ParamValidator<string>;
|
|
11
|
+
url(): ParamValidator<string>;
|
|
12
|
+
date(): ParamValidator<Date>;
|
|
13
|
+
array<T>(): ParamValidator<T[]>;
|
|
14
|
+
enum<T extends string>(values: readonly T[]): ParamValidator<T>;
|
|
15
|
+
custom<T>(validateFn: (value: unknown) => boolean, errorMessage?: string): ParamValidator<T>;
|
|
16
|
+
};
|
|
17
|
+
export declare function createParamValidator<T>(validateFn: (value: unknown) => ValidationParamResult<T>): ParamValidator<T>;
|
|
18
|
+
//# sourceMappingURL=paramValidators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paramValidators.d.ts","sourceRoot":"","sources":["../../src/validation/paramValidators.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAqB,MAAM,UAAU,CAAC;AAgDzF,eAAO,MAAM,UAAU;cACX,cAAc,CAAC,MAAM,CAAC;cAStB,cAAc,CAAC,MAAM,CAAC;eAUrB,cAAc,CAAC,MAAM,CAAC;eAUtB,cAAc,CAAC,OAAO,CAAC;aAWzB,cAAc,CAAC,MAAM,CAAC;gBAYnB,cAAc,CAAC,MAAM,CAAC;YAY1B,cAAc,CAAC,MAAM,CAAC;WAYvB,cAAc,CAAC,MAAM,CAAC;YAYrB,cAAc,CAAC,IAAI,CAAC;UAUtB,CAAC,KAAK,cAAc,CAAC,CAAC,EAAE,CAAC;SAS1B,CAAC,SAAS,MAAM,UAAU,SAAS,CAAC,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC;WASxD,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,iBAAiB,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC;CAQ7F,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,CAAC,EACpC,UAAU,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,qBAAqB,CAAC,CAAC,CAAC,GACvD,cAAc,CAAC,CAAC,CAAC,CAEnB"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ValidationSchema, FieldValidation, ValidationResult, ValidationError, ValidationConfig } from '../types';
|
|
2
|
+
|
|
3
|
+
export declare function validateRequest<T = Record<string, unknown>>(schema: ValidationSchema, data: unknown, config: ValidationConfig): Promise<ValidationResult<T>>;
|
|
4
|
+
export declare function validateField(field: string, value: unknown, schema: FieldValidation, config: ValidationConfig): Promise<{
|
|
5
|
+
valid: boolean;
|
|
6
|
+
value?: unknown;
|
|
7
|
+
errors?: ValidationError[];
|
|
8
|
+
}>;
|
|
9
|
+
//# sourceMappingURL=validators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/validation/validators.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EACjB,MAAM,UAAU,CAAC;AAGlB,wBAAsB,eAAe,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/D,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAqB9B;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,eAAe,EAAE,CAAA;CAAE,CAAC,CAwH1E"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
{
|
|
2
|
+
"server": {
|
|
3
|
+
"port": 3000,
|
|
4
|
+
"host": "localhost",
|
|
5
|
+
"cors": {
|
|
6
|
+
"enabled": true,
|
|
7
|
+
"origin": "*",
|
|
8
|
+
"methods": ["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"],
|
|
9
|
+
"allowedHeaders": ["Content-Type", "Authorization"],
|
|
10
|
+
"credentials": false
|
|
11
|
+
},
|
|
12
|
+
"bodyParser": {
|
|
13
|
+
"json": true,
|
|
14
|
+
"urlencoded": true,
|
|
15
|
+
"limit": "10mb"
|
|
16
|
+
},
|
|
17
|
+
"trustProxy": false
|
|
18
|
+
},
|
|
19
|
+
"routes": {
|
|
20
|
+
"prefix": "/api",
|
|
21
|
+
"timeout": 30000,
|
|
22
|
+
"defaultMiddleware": []
|
|
23
|
+
},
|
|
24
|
+
"validation": {
|
|
25
|
+
"adapter": "mongoose",
|
|
26
|
+
"strictMode": true,
|
|
27
|
+
"sanitize": true
|
|
28
|
+
},
|
|
29
|
+
"errors": {
|
|
30
|
+
"400": {
|
|
31
|
+
"message": "Bad Request",
|
|
32
|
+
"json": true,
|
|
33
|
+
"log": false
|
|
34
|
+
},
|
|
35
|
+
"401": {
|
|
36
|
+
"message": "Unauthorized",
|
|
37
|
+
"json": true,
|
|
38
|
+
"log": true
|
|
39
|
+
},
|
|
40
|
+
"403": {
|
|
41
|
+
"message": "Forbidden",
|
|
42
|
+
"json": true,
|
|
43
|
+
"log": true
|
|
44
|
+
},
|
|
45
|
+
"404": {
|
|
46
|
+
"message": "Not Found",
|
|
47
|
+
"json": true,
|
|
48
|
+
"log": false
|
|
49
|
+
},
|
|
50
|
+
"500": {
|
|
51
|
+
"message": "Internal Server Error",
|
|
52
|
+
"json": true,
|
|
53
|
+
"log": true
|
|
54
|
+
},
|
|
55
|
+
"default": {
|
|
56
|
+
"message": "An error occurred",
|
|
57
|
+
"json": true,
|
|
58
|
+
"log": true
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
"logger": {
|
|
62
|
+
"enabled": true,
|
|
63
|
+
"level": "info",
|
|
64
|
+
"format": "text",
|
|
65
|
+
"output": "console"
|
|
66
|
+
},
|
|
67
|
+
"docker": {
|
|
68
|
+
"enabled": false,
|
|
69
|
+
"compose": "./docker-compose.yml"
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
package/package.json
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@forgedevstack/harbor",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "The pipeline for Node.js backends - Fast server creation, MongoDB ODM (Mongoose replacement), route management, validation, and Docker orchestration",
|
|
5
|
+
"main": "dist/index.cjs.js",
|
|
6
|
+
"module": "dist/index.es.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.es.js",
|
|
11
|
+
"require": "./dist/index.cjs.js",
|
|
12
|
+
"types": "./dist/index.d.ts"
|
|
13
|
+
},
|
|
14
|
+
"./database": {
|
|
15
|
+
"import": "./dist/database/index.js",
|
|
16
|
+
"require": "./dist/database/index.js",
|
|
17
|
+
"types": "./dist/database/index.d.ts"
|
|
18
|
+
},
|
|
19
|
+
"./validation": {
|
|
20
|
+
"import": "./dist/validation/index.js",
|
|
21
|
+
"require": "./dist/validation/index.js",
|
|
22
|
+
"types": "./dist/validation/index.d.ts"
|
|
23
|
+
},
|
|
24
|
+
"./validations": {
|
|
25
|
+
"import": "./dist/validation/index.js",
|
|
26
|
+
"require": "./dist/validation/index.js",
|
|
27
|
+
"types": "./dist/validation/index.d.ts"
|
|
28
|
+
},
|
|
29
|
+
"./docker": {
|
|
30
|
+
"import": "./dist/docker/index.js",
|
|
31
|
+
"require": "./dist/docker/index.js",
|
|
32
|
+
"types": "./dist/docker/index.d.ts"
|
|
33
|
+
},
|
|
34
|
+
"./utils": {
|
|
35
|
+
"import": "./dist/utils/index.js",
|
|
36
|
+
"require": "./dist/utils/index.js",
|
|
37
|
+
"types": "./dist/utils/index.d.ts"
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"bin": {
|
|
41
|
+
"harbor": "./dist/cli/index.js"
|
|
42
|
+
},
|
|
43
|
+
"files": [
|
|
44
|
+
"dist",
|
|
45
|
+
"templates",
|
|
46
|
+
"README.md",
|
|
47
|
+
"CHANGELOG.md",
|
|
48
|
+
"harbor.config.example.json"
|
|
49
|
+
],
|
|
50
|
+
"scripts": {
|
|
51
|
+
"dev": "vite",
|
|
52
|
+
"build": "tsc && vite build",
|
|
53
|
+
"build:watch": "vite build --watch",
|
|
54
|
+
"lint": "eslint src --ext .ts",
|
|
55
|
+
"test": "vitest",
|
|
56
|
+
"portal:dev": "cd portal && npm run dev",
|
|
57
|
+
"portal:build": "cd portal && npm run build",
|
|
58
|
+
"prepublishOnly": "npm run build"
|
|
59
|
+
},
|
|
60
|
+
"keywords": [
|
|
61
|
+
"nodejs",
|
|
62
|
+
"server",
|
|
63
|
+
"express",
|
|
64
|
+
"mongodb",
|
|
65
|
+
"validation",
|
|
66
|
+
"routing",
|
|
67
|
+
"docker",
|
|
68
|
+
"backend",
|
|
69
|
+
"api",
|
|
70
|
+
"framework"
|
|
71
|
+
],
|
|
72
|
+
"author": "ForgeDevStack",
|
|
73
|
+
"license": "MIT",
|
|
74
|
+
"homepage": "https://forgedevstack.com",
|
|
75
|
+
"repository": {
|
|
76
|
+
"type": "git",
|
|
77
|
+
"url": "https://github.com/yaghobieh/Harbor"
|
|
78
|
+
},
|
|
79
|
+
"bugs": {
|
|
80
|
+
"url": "https://github.com/yaghobieh/Harbor/issues"
|
|
81
|
+
},
|
|
82
|
+
"engines": {
|
|
83
|
+
"node": ">=18.0.0"
|
|
84
|
+
},
|
|
85
|
+
"dependencies": {
|
|
86
|
+
"express": "^4.18.2"
|
|
87
|
+
},
|
|
88
|
+
"peerDependencies": {
|
|
89
|
+
"express": ">=4.18.0",
|
|
90
|
+
"mongodb": ">=6.0.0"
|
|
91
|
+
},
|
|
92
|
+
"peerDependenciesMeta": {
|
|
93
|
+
"mongodb": {
|
|
94
|
+
"optional": true
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
"devDependencies": {
|
|
98
|
+
"@types/express": "^4.17.21",
|
|
99
|
+
"@types/node": "^20.10.0",
|
|
100
|
+
"mongodb": "^6.0.0",
|
|
101
|
+
"typescript": "^5.3.0",
|
|
102
|
+
"vite": "^5.0.0",
|
|
103
|
+
"vite-plugin-dts": "^3.6.0",
|
|
104
|
+
"vitest": "^1.0.0"
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"root": true,
|
|
3
|
+
"parser": "@typescript-eslint/parser",
|
|
4
|
+
"parserOptions": {
|
|
5
|
+
"ecmaVersion": 2022,
|
|
6
|
+
"sourceType": "module",
|
|
7
|
+
"project": "./tsconfig.json"
|
|
8
|
+
},
|
|
9
|
+
"plugins": [
|
|
10
|
+
"@typescript-eslint"
|
|
11
|
+
],
|
|
12
|
+
"extends": [
|
|
13
|
+
"eslint:recommended",
|
|
14
|
+
"plugin:@typescript-eslint/recommended",
|
|
15
|
+
"plugin:@typescript-eslint/recommended-requiring-type-checking"
|
|
16
|
+
],
|
|
17
|
+
"env": {
|
|
18
|
+
"node": true,
|
|
19
|
+
"es2022": true
|
|
20
|
+
},
|
|
21
|
+
"rules": {
|
|
22
|
+
"@typescript-eslint/no-unused-vars": ["error", { "argsIgnorePattern": "^_" }],
|
|
23
|
+
"@typescript-eslint/explicit-function-return-type": "off",
|
|
24
|
+
"@typescript-eslint/no-explicit-any": "warn",
|
|
25
|
+
"@typescript-eslint/no-floating-promises": "error",
|
|
26
|
+
"@typescript-eslint/await-thenable": "error",
|
|
27
|
+
"no-console": ["warn", { "allow": ["warn", "error", "info"] }],
|
|
28
|
+
"prefer-const": "error",
|
|
29
|
+
"no-var": "error",
|
|
30
|
+
"eqeqeq": ["error", "always"],
|
|
31
|
+
"curly": ["error", "all"],
|
|
32
|
+
"quotes": ["error", "single", { "avoidEscape": true }],
|
|
33
|
+
"semi": ["error", "always"],
|
|
34
|
+
"indent": ["error", 2, { "SwitchCase": 1 }],
|
|
35
|
+
"comma-dangle": ["error", "always-multiline"],
|
|
36
|
+
"object-curly-spacing": ["error", "always"],
|
|
37
|
+
"array-bracket-spacing": ["error", "never"],
|
|
38
|
+
"max-len": ["warn", { "code": 120, "ignoreStrings": true, "ignoreTemplateLiterals": true }]
|
|
39
|
+
},
|
|
40
|
+
"ignorePatterns": [
|
|
41
|
+
"dist",
|
|
42
|
+
"node_modules"
|
|
43
|
+
]
|
|
44
|
+
}
|
|
45
|
+
|