@morojs/moro 1.3.0 → 1.5.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/README.md +61 -7
- package/dist/core/config/index.d.ts +0 -1
- package/dist/core/config/index.js +0 -4
- package/dist/core/config/index.js.map +1 -1
- package/dist/core/config/loader.js +219 -226
- package/dist/core/config/loader.js.map +1 -1
- package/dist/core/config/schema.d.ts +30 -335
- package/dist/core/config/schema.js +133 -224
- package/dist/core/config/schema.js.map +1 -1
- package/dist/core/config/utils.d.ts +3 -2
- package/dist/core/config/utils.js.map +1 -1
- package/dist/core/config/validation.d.ts +17 -0
- package/dist/core/config/validation.js +129 -0
- package/dist/core/config/validation.js.map +1 -0
- package/dist/core/docs/index.js +1 -1
- package/dist/core/docs/index.js.map +1 -1
- package/dist/core/docs/openapi-generator.js +6 -6
- package/dist/core/docs/openapi-generator.js.map +1 -1
- package/dist/core/docs/schema-to-openapi.d.ts +7 -0
- package/dist/core/docs/schema-to-openapi.js +124 -0
- package/dist/core/docs/schema-to-openapi.js.map +1 -0
- package/dist/core/docs/simple-docs.js +5 -5
- package/dist/core/docs/zod-to-openapi.d.ts +4 -3
- package/dist/core/docs/zod-to-openapi.js +28 -0
- package/dist/core/docs/zod-to-openapi.js.map +1 -1
- package/dist/core/framework.d.ts +29 -6
- package/dist/core/framework.js +117 -18
- package/dist/core/framework.js.map +1 -1
- package/dist/core/networking/adapters/index.d.ts +3 -0
- package/dist/core/networking/adapters/index.js +10 -0
- package/dist/core/networking/adapters/index.js.map +1 -0
- package/dist/core/networking/adapters/socketio-adapter.d.ts +16 -0
- package/dist/core/networking/adapters/socketio-adapter.js +244 -0
- package/dist/core/networking/adapters/socketio-adapter.js.map +1 -0
- package/dist/core/networking/adapters/ws-adapter.d.ts +54 -0
- package/dist/core/networking/adapters/ws-adapter.js +383 -0
- package/dist/core/networking/adapters/ws-adapter.js.map +1 -0
- package/dist/core/networking/websocket-adapter.d.ts +171 -0
- package/dist/core/networking/websocket-adapter.js +5 -0
- package/dist/core/networking/websocket-adapter.js.map +1 -0
- package/dist/core/networking/websocket-manager.d.ts +53 -17
- package/dist/core/networking/websocket-manager.js +184 -126
- package/dist/core/networking/websocket-manager.js.map +1 -1
- package/dist/core/routing/index.d.ts +13 -13
- package/dist/core/routing/index.js.map +1 -1
- package/dist/core/validation/adapters.d.ts +51 -0
- package/dist/core/validation/adapters.js +135 -0
- package/dist/core/validation/adapters.js.map +1 -0
- package/dist/core/validation/index.d.ts +12 -11
- package/dist/core/validation/index.js +32 -26
- package/dist/core/validation/index.js.map +1 -1
- package/dist/core/validation/schema-interface.d.ts +36 -0
- package/dist/core/validation/schema-interface.js +68 -0
- package/dist/core/validation/schema-interface.js.map +1 -0
- package/dist/index.d.ts +9 -2
- package/dist/index.js +23 -4
- package/dist/index.js.map +1 -1
- package/dist/moro.js +24 -17
- package/dist/moro.js.map +1 -1
- package/dist/types/config.d.ts +146 -0
- package/dist/types/config.js +4 -0
- package/dist/types/config.js.map +1 -0
- package/package.json +30 -7
- package/src/core/config/index.ts +0 -3
- package/src/core/config/loader.ts +571 -247
- package/src/core/config/schema.ts +146 -279
- package/src/core/config/utils.ts +1 -2
- package/src/core/config/validation.ts +140 -0
- package/src/core/docs/index.ts +1 -1
- package/src/core/docs/openapi-generator.ts +7 -6
- package/src/core/docs/schema-to-openapi.ts +148 -0
- package/src/core/docs/simple-docs.ts +5 -5
- package/src/core/docs/zod-to-openapi.ts +52 -20
- package/src/core/framework.ts +121 -28
- package/src/core/networking/adapters/index.ts +16 -0
- package/src/core/networking/adapters/socketio-adapter.ts +252 -0
- package/src/core/networking/adapters/ws-adapter.ts +425 -0
- package/src/core/networking/websocket-adapter.ts +217 -0
- package/src/core/networking/websocket-manager.ts +201 -143
- package/src/core/routing/index.ts +13 -13
- package/src/core/validation/adapters.ts +147 -0
- package/src/core/validation/index.ts +54 -38
- package/src/core/validation/schema-interface.ts +100 -0
- package/src/index.ts +36 -3
- package/src/moro.ts +27 -17
- package/src/types/config.ts +157 -0
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Validation Library Adapters for Moro Framework
|
|
3
|
+
// Makes Joi, Yup, and other libraries compatible with ValidationSchema interface
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.ClassValidatorAdapter = exports.FunctionAdapter = exports.YupAdapter = exports.JoiAdapter = void 0;
|
|
6
|
+
exports.joi = joi;
|
|
7
|
+
exports.yup = yup;
|
|
8
|
+
exports.fn = fn;
|
|
9
|
+
exports.classValidator = classValidator;
|
|
10
|
+
const schema_interface_1 = require("./schema-interface");
|
|
11
|
+
/**
|
|
12
|
+
* Zod Compatibility Check
|
|
13
|
+
* Zod ALREADY implements ValidationSchema interface natively!
|
|
14
|
+
* No adapter needed - it just works.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Joi Adapter - makes Joi schemas compatible with ValidationSchema
|
|
18
|
+
*/
|
|
19
|
+
class JoiAdapter {
|
|
20
|
+
constructor(joiSchema) {
|
|
21
|
+
this.joiSchema = joiSchema;
|
|
22
|
+
if (!joiSchema || typeof joiSchema.validateAsync !== 'function') {
|
|
23
|
+
throw new Error('Invalid Joi schema provided to JoiAdapter');
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async parseAsync(data) {
|
|
27
|
+
try {
|
|
28
|
+
const result = await this.joiSchema.validateAsync(data, { abortEarly: false });
|
|
29
|
+
return result;
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
throw (0, schema_interface_1.normalizeValidationError)(error);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
exports.JoiAdapter = JoiAdapter;
|
|
37
|
+
/**
|
|
38
|
+
* Yup Adapter - makes Yup schemas compatible with ValidationSchema
|
|
39
|
+
*/
|
|
40
|
+
class YupAdapter {
|
|
41
|
+
constructor(yupSchema) {
|
|
42
|
+
this.yupSchema = yupSchema;
|
|
43
|
+
if (!yupSchema || typeof yupSchema.validate !== 'function') {
|
|
44
|
+
throw new Error('Invalid Yup schema provided to YupAdapter');
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async parseAsync(data) {
|
|
48
|
+
try {
|
|
49
|
+
const result = await this.yupSchema.validate(data, { abortEarly: false });
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
throw (0, schema_interface_1.normalizeValidationError)(error);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
exports.YupAdapter = YupAdapter;
|
|
58
|
+
/**
|
|
59
|
+
* Custom Validation Function Adapter
|
|
60
|
+
* Allows users to use simple validation functions
|
|
61
|
+
*/
|
|
62
|
+
class FunctionAdapter {
|
|
63
|
+
constructor(validateFn, name = 'custom') {
|
|
64
|
+
this.validateFn = validateFn;
|
|
65
|
+
this.name = name;
|
|
66
|
+
if (typeof validateFn !== 'function') {
|
|
67
|
+
throw new Error('Validation function is required for FunctionAdapter');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async parseAsync(data) {
|
|
71
|
+
try {
|
|
72
|
+
return await this.validateFn(data);
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
throw new schema_interface_1.ValidationError([
|
|
76
|
+
{
|
|
77
|
+
path: [],
|
|
78
|
+
message: error instanceof Error ? error.message : String(error),
|
|
79
|
+
code: this.name,
|
|
80
|
+
},
|
|
81
|
+
]);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
exports.FunctionAdapter = FunctionAdapter;
|
|
86
|
+
/**
|
|
87
|
+
* Class Validator Adapter (for TypeScript decorators)
|
|
88
|
+
*/
|
|
89
|
+
class ClassValidatorAdapter {
|
|
90
|
+
constructor(ClassType, validate) {
|
|
91
|
+
this.ClassType = ClassType;
|
|
92
|
+
this.validate = validate;
|
|
93
|
+
if (typeof ClassType !== 'function') {
|
|
94
|
+
throw new Error('Class constructor is required for ClassValidatorAdapter');
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
async parseAsync(data) {
|
|
98
|
+
try {
|
|
99
|
+
const instance = Object.assign(new this.ClassType(), data);
|
|
100
|
+
if (this.validate) {
|
|
101
|
+
const errors = await this.validate(instance);
|
|
102
|
+
if (errors && errors.length > 0) {
|
|
103
|
+
throw new schema_interface_1.ValidationError(errors.map((error, index) => ({
|
|
104
|
+
path: error.property ? [error.property] : [index],
|
|
105
|
+
message: Object.values(error.constraints || {}).join(', ') || 'Validation failed',
|
|
106
|
+
code: 'class_validator',
|
|
107
|
+
})));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return instance;
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
if (error instanceof schema_interface_1.ValidationError)
|
|
114
|
+
throw error;
|
|
115
|
+
throw (0, schema_interface_1.normalizeValidationError)(error);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
exports.ClassValidatorAdapter = ClassValidatorAdapter;
|
|
120
|
+
/**
|
|
121
|
+
* Utility functions for creating adapters
|
|
122
|
+
*/
|
|
123
|
+
function joi(joiSchema) {
|
|
124
|
+
return new JoiAdapter(joiSchema);
|
|
125
|
+
}
|
|
126
|
+
function yup(yupSchema) {
|
|
127
|
+
return new YupAdapter(yupSchema);
|
|
128
|
+
}
|
|
129
|
+
function fn(validateFn, name) {
|
|
130
|
+
return new FunctionAdapter(validateFn, name);
|
|
131
|
+
}
|
|
132
|
+
function classValidator(ClassType, validate) {
|
|
133
|
+
return new ClassValidatorAdapter(ClassType, validate);
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=adapters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapters.js","sourceRoot":"","sources":["../../../src/core/validation/adapters.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import { ZodSchema } from 'zod';
|
|
2
1
|
import { HttpRequest, HttpResponse } from '../http';
|
|
2
|
+
import { ValidationSchema } from './schema-interface';
|
|
3
3
|
export interface ValidationConfig {
|
|
4
|
-
body?:
|
|
5
|
-
query?:
|
|
6
|
-
params?:
|
|
7
|
-
headers?:
|
|
4
|
+
body?: ValidationSchema;
|
|
5
|
+
query?: ValidationSchema;
|
|
6
|
+
params?: ValidationSchema;
|
|
7
|
+
headers?: ValidationSchema;
|
|
8
8
|
}
|
|
9
9
|
export interface ValidationResult<T = any> {
|
|
10
10
|
success: boolean;
|
|
11
11
|
data?: T;
|
|
12
|
-
errors?:
|
|
12
|
+
errors?: ValidationErrorDetail[];
|
|
13
13
|
}
|
|
14
|
-
export interface
|
|
14
|
+
export interface ValidationErrorDetail {
|
|
15
15
|
field: string;
|
|
16
16
|
message: string;
|
|
17
17
|
code: string;
|
|
@@ -23,8 +23,9 @@ export interface ValidatedRequest<T = any> extends HttpRequest {
|
|
|
23
23
|
validatedHeaders?: any;
|
|
24
24
|
}
|
|
25
25
|
export declare function validate<TBody = any, TQuery = any, TParams = any>(config: ValidationConfig, handler: (req: ValidatedRequest<TBody>, res: HttpResponse) => any | Promise<any>): (req: HttpRequest, res: HttpResponse) => Promise<any>;
|
|
26
|
-
export declare function body<T>(schema:
|
|
27
|
-
export declare function query<T>(schema:
|
|
28
|
-
export declare function params<T>(schema:
|
|
26
|
+
export declare function body<T>(schema: ValidationSchema<T>): (handler: (req: ValidatedRequest<T>, res: HttpResponse) => any | Promise<any>) => (req: HttpRequest, res: HttpResponse) => Promise<any>;
|
|
27
|
+
export declare function query<T>(schema: ValidationSchema<T>): (handler: (req: ValidatedRequest<any>, res: HttpResponse) => any | Promise<any>) => (req: HttpRequest, res: HttpResponse) => Promise<any>;
|
|
28
|
+
export declare function params<T>(schema: ValidationSchema<T>): (handler: (req: ValidatedRequest<any>, res: HttpResponse) => any | Promise<any>) => (req: HttpRequest, res: HttpResponse) => Promise<any>;
|
|
29
29
|
export declare function combineSchemas(schemas: ValidationConfig): ValidationConfig;
|
|
30
|
-
export {
|
|
30
|
+
export { ValidationSchema, ValidationError, normalizeValidationError, InferSchemaType, } from './schema-interface';
|
|
31
|
+
export { joi, yup, fn as customValidator, classValidator } from './adapters';
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
//
|
|
3
|
-
//
|
|
2
|
+
// Universal Validation System for Moro Framework
|
|
3
|
+
// Works with Zod, Joi, Yup, and any validation library via adapters
|
|
4
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
-
exports.
|
|
5
|
+
exports.classValidator = exports.customValidator = exports.yup = exports.joi = exports.normalizeValidationError = exports.ValidationError = void 0;
|
|
6
6
|
exports.validate = validate;
|
|
7
7
|
exports.body = body;
|
|
8
8
|
exports.query = query;
|
|
9
9
|
exports.params = params;
|
|
10
10
|
exports.combineSchemas = combineSchemas;
|
|
11
|
-
const zod_1 = require("zod");
|
|
12
11
|
const logger_1 = require("../logger");
|
|
12
|
+
const schema_interface_1 = require("./schema-interface");
|
|
13
|
+
// Re-export zod if available (for backward compatibility)
|
|
14
|
+
// The dynamic import is handled in the main index.ts
|
|
13
15
|
const logger = (0, logger_1.createFrameworkLogger)('Validation');
|
|
14
16
|
// Main validation wrapper function
|
|
15
17
|
function validate(config, handler) {
|
|
@@ -75,7 +77,7 @@ function validate(config, handler) {
|
|
|
75
77
|
}
|
|
76
78
|
};
|
|
77
79
|
}
|
|
78
|
-
// Validate individual field
|
|
80
|
+
// Validate individual field using universal schema interface
|
|
79
81
|
async function validateField(schema, data, fieldName) {
|
|
80
82
|
try {
|
|
81
83
|
const validated = await schema.parseAsync(data);
|
|
@@ -85,24 +87,21 @@ async function validateField(schema, data, fieldName) {
|
|
|
85
87
|
};
|
|
86
88
|
}
|
|
87
89
|
catch (error) {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
}
|
|
104
|
-
// Re-throw unexpected errors
|
|
105
|
-
throw error;
|
|
90
|
+
const normalizedError = (0, schema_interface_1.normalizeValidationError)(error);
|
|
91
|
+
const errors = normalizedError.issues.map(issue => ({
|
|
92
|
+
field: issue.path.length > 0 ? issue.path.join('.') : fieldName,
|
|
93
|
+
message: issue.message,
|
|
94
|
+
code: issue.code,
|
|
95
|
+
}));
|
|
96
|
+
logger.debug('Field validation failed', 'ValidationFailed', {
|
|
97
|
+
field: fieldName,
|
|
98
|
+
errors: errors.length,
|
|
99
|
+
details: errors,
|
|
100
|
+
});
|
|
101
|
+
return {
|
|
102
|
+
success: false,
|
|
103
|
+
errors,
|
|
104
|
+
};
|
|
106
105
|
}
|
|
107
106
|
}
|
|
108
107
|
// Send validation error response
|
|
@@ -138,7 +137,14 @@ function params(schema) {
|
|
|
138
137
|
function combineSchemas(schemas) {
|
|
139
138
|
return schemas;
|
|
140
139
|
}
|
|
141
|
-
// Re-export
|
|
142
|
-
var
|
|
143
|
-
Object.defineProperty(exports, "
|
|
140
|
+
// Re-export common validation tools
|
|
141
|
+
var schema_interface_2 = require("./schema-interface");
|
|
142
|
+
Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function () { return schema_interface_2.ValidationError; } });
|
|
143
|
+
Object.defineProperty(exports, "normalizeValidationError", { enumerable: true, get: function () { return schema_interface_2.normalizeValidationError; } });
|
|
144
|
+
var adapters_1 = require("./adapters");
|
|
145
|
+
Object.defineProperty(exports, "joi", { enumerable: true, get: function () { return adapters_1.joi; } });
|
|
146
|
+
Object.defineProperty(exports, "yup", { enumerable: true, get: function () { return adapters_1.yup; } });
|
|
147
|
+
Object.defineProperty(exports, "customValidator", { enumerable: true, get: function () { return adapters_1.fn; } });
|
|
148
|
+
Object.defineProperty(exports, "classValidator", { enumerable: true, get: function () { return adapters_1.classValidator; } });
|
|
149
|
+
// Note: z is re-exported from main index.ts with dynamic import
|
|
144
150
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/validation/index.ts"],"names":[],"mappings":";AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/validation/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standard validation error structure
|
|
3
|
+
*/
|
|
4
|
+
export interface ValidationIssue {
|
|
5
|
+
path: (string | number)[];
|
|
6
|
+
message: string;
|
|
7
|
+
code: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Standard validation error class
|
|
11
|
+
* Compatible with ZodError structure
|
|
12
|
+
*/
|
|
13
|
+
export declare class ValidationError extends Error {
|
|
14
|
+
readonly issues: ValidationIssue[];
|
|
15
|
+
constructor(issues: ValidationIssue[]);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Universal validation schema interface
|
|
19
|
+
* This is what Zod naturally implements! No breaking changes needed.
|
|
20
|
+
*/
|
|
21
|
+
export interface ValidationSchema<T = any> {
|
|
22
|
+
/**
|
|
23
|
+
* Parse data asynchronously and return validated result
|
|
24
|
+
* Throws ValidationError on validation failure
|
|
25
|
+
*/
|
|
26
|
+
parseAsync(data: unknown): Promise<T>;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Check if an object implements the ValidationSchema interface
|
|
30
|
+
*/
|
|
31
|
+
export declare function isValidationSchema(obj: any): obj is ValidationSchema;
|
|
32
|
+
/**
|
|
33
|
+
* Convert various error formats to our standard ValidationError
|
|
34
|
+
*/
|
|
35
|
+
export declare function normalizeValidationError(error: any): ValidationError;
|
|
36
|
+
export type InferSchemaType<T> = T extends ValidationSchema<infer U> ? U : never;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Universal Validation Schema Interface for Moro Framework
|
|
3
|
+
// Allows Zod, Joi, Yup, and other validation libraries to work seamlessly
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.ValidationError = void 0;
|
|
6
|
+
exports.isValidationSchema = isValidationSchema;
|
|
7
|
+
exports.normalizeValidationError = normalizeValidationError;
|
|
8
|
+
/**
|
|
9
|
+
* Standard validation error class
|
|
10
|
+
* Compatible with ZodError structure
|
|
11
|
+
*/
|
|
12
|
+
class ValidationError extends Error {
|
|
13
|
+
constructor(issues) {
|
|
14
|
+
const message = `Validation failed: ${issues.map(i => i.message).join(', ')}`;
|
|
15
|
+
super(message);
|
|
16
|
+
this.name = 'ValidationError';
|
|
17
|
+
this.issues = issues;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
exports.ValidationError = ValidationError;
|
|
21
|
+
/**
|
|
22
|
+
* Check if an object implements the ValidationSchema interface
|
|
23
|
+
*/
|
|
24
|
+
function isValidationSchema(obj) {
|
|
25
|
+
return obj && typeof obj.parseAsync === 'function';
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Convert various error formats to our standard ValidationError
|
|
29
|
+
*/
|
|
30
|
+
function normalizeValidationError(error) {
|
|
31
|
+
// Already our format
|
|
32
|
+
if (error instanceof ValidationError) {
|
|
33
|
+
return error;
|
|
34
|
+
}
|
|
35
|
+
// Zod error format
|
|
36
|
+
if (error && error.issues && Array.isArray(error.issues)) {
|
|
37
|
+
return new ValidationError(error.issues.map((issue) => ({
|
|
38
|
+
path: issue.path || [],
|
|
39
|
+
message: issue.message || 'Validation failed',
|
|
40
|
+
code: issue.code || 'invalid',
|
|
41
|
+
})));
|
|
42
|
+
}
|
|
43
|
+
// Joi error format
|
|
44
|
+
if (error && error.details && Array.isArray(error.details)) {
|
|
45
|
+
return new ValidationError(error.details.map((detail) => ({
|
|
46
|
+
path: detail.path || [],
|
|
47
|
+
message: detail.message || 'Validation failed',
|
|
48
|
+
code: detail.type || 'invalid',
|
|
49
|
+
})));
|
|
50
|
+
}
|
|
51
|
+
// Yup error format
|
|
52
|
+
if (error && error.errors && Array.isArray(error.errors)) {
|
|
53
|
+
return new ValidationError(error.errors.map((msg, index) => ({
|
|
54
|
+
path: error.path ? [error.path] : [index],
|
|
55
|
+
message: msg,
|
|
56
|
+
code: error.type || 'invalid',
|
|
57
|
+
})));
|
|
58
|
+
}
|
|
59
|
+
// Generic error
|
|
60
|
+
return new ValidationError([
|
|
61
|
+
{
|
|
62
|
+
path: [],
|
|
63
|
+
message: error.message || String(error),
|
|
64
|
+
code: 'unknown',
|
|
65
|
+
},
|
|
66
|
+
]);
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=schema-interface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-interface.js","sourceRoot":"","sources":["../../../src/core/validation/schema-interface.ts"],"names":[],"mappings":";AAAA,2DAA2D;AAC3D,0EAA0E;;;AAyC1E,gDAEC;AAKD,4DA+CC;AApFD;;;GAGG;AACH,MAAa,eAAgB,SAAQ,KAAK;IAGxC,YAAY,MAAyB;QACnC,MAAM,OAAO,GAAG,sBAAsB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9E,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AATD,0CASC;AAcD;;GAEG;AACH,SAAgB,kBAAkB,CAAC,GAAQ;IACzC,OAAO,GAAG,IAAI,OAAO,GAAG,CAAC,UAAU,KAAK,UAAU,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,SAAgB,wBAAwB,CAAC,KAAU;IACjD,qBAAqB;IACrB,IAAI,KAAK,YAAY,eAAe,EAAE,CAAC;QACrC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,mBAAmB;IACnB,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QACzD,OAAO,IAAI,eAAe,CACxB,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,CAAC;YAChC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE;YACtB,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,mBAAmB;YAC7C,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,SAAS;SAC9B,CAAC,CAAC,CACJ,CAAC;IACJ,CAAC;IAED,mBAAmB;IACnB,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3D,OAAO,IAAI,eAAe,CACxB,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAW,EAAE,EAAE,CAAC,CAAC;YAClC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,mBAAmB;YAC9C,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,SAAS;SAC/B,CAAC,CAAC,CACJ,CAAC;IACJ,CAAC;IAED,mBAAmB;IACnB,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QACzD,OAAO,IAAI,eAAe,CACxB,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAW,EAAE,KAAa,EAAE,EAAE,CAAC,CAAC;YAChD,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YACzC,OAAO,EAAE,GAAG;YACZ,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,SAAS;SAC9B,CAAC,CAAC,CACJ,CAAC;IACJ,CAAC;IAED,gBAAgB;IAChB,OAAO,IAAI,eAAe,CAAC;QACzB;YACE,IAAI,EAAE,EAAE;YACR,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC;YACvC,IAAI,EAAE,SAAS;SAChB;KACF,CAAC,CAAC;AACL,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -14,10 +14,17 @@ export { Container, FunctionalContainer, ServiceScope, ServiceLifecycle, withLog
|
|
|
14
14
|
export { MoroEventBus } from './core/events';
|
|
15
15
|
export type { EventContext, EventPayload, EventBusOptions, ModuleEventBus, GlobalEventBus, EventMetrics, SystemEvents, EventHandler, } from './types/events';
|
|
16
16
|
export { createFrameworkLogger, logger } from './core/logger';
|
|
17
|
-
export { validate, body, query, params, combineSchemas
|
|
18
|
-
|
|
17
|
+
export { validate, body, query, params, combineSchemas } from './core/validation';
|
|
18
|
+
declare let z: any;
|
|
19
|
+
export { z };
|
|
20
|
+
export type { ValidationConfig, ValidationResult, ValidationErrorDetail, ValidatedRequest, } from './core/validation';
|
|
21
|
+
export type { ValidationSchema, ValidationError, InferSchemaType, } from './core/validation/schema-interface';
|
|
22
|
+
export { normalizeValidationError } from './core/validation/schema-interface';
|
|
23
|
+
export { joi, yup, fn as customValidator, classValidator } from './core/validation/adapters';
|
|
19
24
|
export { defineModule, ModuleLoader, ModuleDiscovery, autoDiscoverModuleDirectories, } from './core/modules';
|
|
20
25
|
export type { ModuleDefinition, ModuleRoute, ModuleSocket, ModuleConfig } from './types/module';
|
|
26
|
+
export type { WebSocketAdapter, WebSocketAdapterOptions, WebSocketNamespace, WebSocketConnection, WebSocketEmitter, WebSocketMiddleware, WebSocketEventHandler, } from './core/networking/websocket-adapter';
|
|
27
|
+
export { SocketIOAdapter, WSAdapter } from './core/networking/adapters';
|
|
21
28
|
export { createRoute, defineRoute, EXECUTION_PHASES } from './core/routing';
|
|
22
29
|
export { IntelligentRoutingManager, RouteRegistry } from './core/routing/app-integration';
|
|
23
30
|
export type { RouteBuilder, RouteSchema, CompiledRoute, HttpMethod, AuthConfig, RateLimitConfig, CacheConfig, MiddlewarePhases, ExecutionPhase, } from './core/routing';
|
package/dist/index.js
CHANGED
|
@@ -14,8 +14,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.
|
|
18
|
-
exports.MiddlewareManager = exports.resetConfig = exports.isConfigInitialized = exports.getGlobalConfig = exports.initializeConfig = exports.getConfigValue = exports.envVar = exports.requireEnvVars = exports.isStaging = exports.isProduction = exports.isDevelopment = exports.getEnvJson = exports.getEnvArray = exports.getEnvVar = exports.createModuleConfig = exports.getConfig = exports.generateDocsFromIntelligentRoutes = exports.createDocumentationSystem = exports.AppDocumentationManager = exports.DocumentationSystem = exports.RouteRegistry = exports.IntelligentRoutingManager = exports.EXECUTION_PHASES = exports.defineRoute = exports.createRoute = exports.autoDiscoverModuleDirectories = void 0;
|
|
17
|
+
exports.yup = exports.joi = exports.normalizeValidationError = exports.z = exports.combineSchemas = exports.params = exports.query = exports.body = exports.validate = exports.logger = exports.createFrameworkLogger = exports.MoroEventBus = exports.middleware = exports.HOOK_EVENTS = exports.HookManager = exports.CircuitBreaker = exports.withTimeout = exports.withRetry = exports.withCaching = exports.withLogging = exports.ServiceLifecycle = exports.ServiceScope = exports.FunctionalContainer = exports.Container = exports.ServiceRegistry = exports.WebSocketManager = exports.simpleMiddleware = exports.builtInMiddleware = exports.httpMiddleware = exports.MoroHttpServer = exports.createWorkerHandler = exports.createLambdaHandler = exports.createEdgeHandler = exports.createNodeHandler = exports.createRuntimeAdapter = exports.CloudflareWorkersAdapter = exports.AWSLambdaAdapter = exports.VercelEdgeAdapter = exports.NodeRuntimeAdapter = exports.providers = exports.auth = exports.MoroJSAuth = exports.createAuthMiddleware = exports.createAppWorker = exports.createAppLambda = exports.createAppEdge = exports.createAppNode = exports.createApp = exports.MoroCore = exports.Moro = void 0;
|
|
18
|
+
exports.MiddlewareManager = exports.resetConfig = exports.isConfigInitialized = exports.getGlobalConfig = exports.initializeConfig = exports.getConfigValue = exports.envVar = exports.requireEnvVars = exports.isStaging = exports.isProduction = exports.isDevelopment = exports.getEnvJson = exports.getEnvArray = exports.getEnvVar = exports.createModuleConfig = exports.getConfig = exports.generateDocsFromIntelligentRoutes = exports.createDocumentationSystem = exports.AppDocumentationManager = exports.DocumentationSystem = exports.RouteRegistry = exports.IntelligentRoutingManager = exports.EXECUTION_PHASES = exports.defineRoute = exports.createRoute = exports.WSAdapter = exports.SocketIOAdapter = exports.autoDiscoverModuleDirectories = exports.ModuleDiscovery = exports.ModuleLoader = exports.defineModule = exports.classValidator = exports.customValidator = void 0;
|
|
19
19
|
// MoroJS Framework - Main Entry Point
|
|
20
20
|
var moro_1 = require("./moro");
|
|
21
21
|
Object.defineProperty(exports, "Moro", { enumerable: true, get: function () { return moro_1.Moro; } });
|
|
@@ -75,20 +75,39 @@ Object.defineProperty(exports, "MoroEventBus", { enumerable: true, get: function
|
|
|
75
75
|
var logger_1 = require("./core/logger");
|
|
76
76
|
Object.defineProperty(exports, "createFrameworkLogger", { enumerable: true, get: function () { return logger_1.createFrameworkLogger; } });
|
|
77
77
|
Object.defineProperty(exports, "logger", { enumerable: true, get: function () { return logger_1.logger; } });
|
|
78
|
-
// Validation System
|
|
78
|
+
// Universal Validation System
|
|
79
79
|
var validation_1 = require("./core/validation");
|
|
80
80
|
Object.defineProperty(exports, "validate", { enumerable: true, get: function () { return validation_1.validate; } });
|
|
81
81
|
Object.defineProperty(exports, "body", { enumerable: true, get: function () { return validation_1.body; } });
|
|
82
82
|
Object.defineProperty(exports, "query", { enumerable: true, get: function () { return validation_1.query; } });
|
|
83
83
|
Object.defineProperty(exports, "params", { enumerable: true, get: function () { return validation_1.params; } });
|
|
84
84
|
Object.defineProperty(exports, "combineSchemas", { enumerable: true, get: function () { return validation_1.combineSchemas; } });
|
|
85
|
-
|
|
85
|
+
// Dynamic Zod export (optional dependency)
|
|
86
|
+
let z;
|
|
87
|
+
try {
|
|
88
|
+
exports.z = z = require('zod').z;
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// Zod not available - that's fine!
|
|
92
|
+
exports.z = z = undefined;
|
|
93
|
+
}
|
|
94
|
+
var schema_interface_1 = require("./core/validation/schema-interface");
|
|
95
|
+
Object.defineProperty(exports, "normalizeValidationError", { enumerable: true, get: function () { return schema_interface_1.normalizeValidationError; } });
|
|
96
|
+
var adapters_1 = require("./core/validation/adapters");
|
|
97
|
+
Object.defineProperty(exports, "joi", { enumerable: true, get: function () { return adapters_1.joi; } });
|
|
98
|
+
Object.defineProperty(exports, "yup", { enumerable: true, get: function () { return adapters_1.yup; } });
|
|
99
|
+
Object.defineProperty(exports, "customValidator", { enumerable: true, get: function () { return adapters_1.fn; } });
|
|
100
|
+
Object.defineProperty(exports, "classValidator", { enumerable: true, get: function () { return adapters_1.classValidator; } });
|
|
86
101
|
// Module System
|
|
87
102
|
var modules_1 = require("./core/modules");
|
|
88
103
|
Object.defineProperty(exports, "defineModule", { enumerable: true, get: function () { return modules_1.defineModule; } });
|
|
89
104
|
Object.defineProperty(exports, "ModuleLoader", { enumerable: true, get: function () { return modules_1.ModuleLoader; } });
|
|
90
105
|
Object.defineProperty(exports, "ModuleDiscovery", { enumerable: true, get: function () { return modules_1.ModuleDiscovery; } });
|
|
91
106
|
Object.defineProperty(exports, "autoDiscoverModuleDirectories", { enumerable: true, get: function () { return modules_1.autoDiscoverModuleDirectories; } });
|
|
107
|
+
// Built-in WebSocket Adapters
|
|
108
|
+
var adapters_2 = require("./core/networking/adapters");
|
|
109
|
+
Object.defineProperty(exports, "SocketIOAdapter", { enumerable: true, get: function () { return adapters_2.SocketIOAdapter; } });
|
|
110
|
+
Object.defineProperty(exports, "WSAdapter", { enumerable: true, get: function () { return adapters_2.WSAdapter; } });
|
|
92
111
|
// Intelligent Routing System
|
|
93
112
|
var routing_1 = require("./core/routing");
|
|
94
113
|
Object.defineProperty(exports, "createRoute", { enumerable: true, get: function () { return routing_1.createRoute; } });
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,sCAAsC;AACtC,+BAQgB;AAPd,4FAAA,IAAI,OAAA;AACJ,gGAAA,IAAI,OAAY;AAChB,iGAAA,SAAS,OAAA;AACT,qGAAA,aAAa,OAAA;AACb,qGAAA,aAAa,OAAA;AACb,uGAAA,eAAe,OAAA;AACf,uGAAA,eAAe,OAAA;AAyBjB,qCAAqC;AACrC,6DAA8E;AAArE,sHAAA,oBAAoB,OAAA;AAAE,4GAAA,UAAU,OAAA;AAEzC,0CAA0C;AAC1C,wDAAkE;AAAzD,4FAAA,IAAI,OAAA;AAAE,iGAAA,SAAS,OAAA;AAUxB,0CAUwB;AATtB,6GAAA,kBAAkB,OAAA;AAClB,4GAAA,iBAAiB,OAAA;AACjB,2GAAA,gBAAgB,OAAA;AAChB,mHAAA,wBAAwB,OAAA;AACxB,+GAAA,oBAAoB,OAAA;AACpB,4GAAA,iBAAiB,OAAA;AACjB,4GAAA,iBAAiB,OAAA;AACjB,8GAAA,mBAAmB,OAAA;AACnB,8GAAA,mBAAmB,OAAA;AAOrB,eAAe;AACf,oCAA2E;AAAlE,sGAAA,cAAc,OAAA;AAAE,sGAAA,UAAU,OAAkB;AACrD,uDAAiF;AAAxE,6GAAA,iBAAiB,OAAA;AAAE,4GAAA,gBAAgB,OAAA;AAE5C,oBAAoB;AACpB,gDAK2B;AAJzB,8GAAA,gBAAgB,OAAA;AAChB,6GAAA,eAAe,OAAA;AAKjB,iCAAiC;AACjC,8CAa0B;AAZxB,sGAAA,SAAS,OAAA;AACT,gHAAA,mBAAmB,OAAA;AACnB,yGAAA,YAAY,OAAA;AACZ,6GAAA,gBAAgB,OAAA;AAChB,wGAAA,WAAW,OAAA;AACX,wGAAA,WAAW,OAAA;AACX,sGAAA,SAAS,OAAA;AACT,wGAAA,WAAW,OAAA;AACX,2GAAA,cAAc,OAAA;AACd,wGAAA,WAAW,OAAA;AACX,wGAAA,WAAW,OAAA;AACX,uGAAA,UAAU,OAAA;AAGZ,eAAe;AACf,wCAA6C;AAApC,sGAAA,YAAY,OAAA;AAYrB,gBAAgB;AAChB,wCAA8D;AAArD,+GAAA,qBAAqB,OAAA;AAAE,gGAAA,MAAM,OAAA;AAEtC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/moro.js
CHANGED
|
@@ -328,9 +328,15 @@ class Moro extends events_1.EventEmitter {
|
|
|
328
328
|
}
|
|
329
329
|
// WebSocket helper with events
|
|
330
330
|
websocket(namespace, handlers) {
|
|
331
|
+
const adapter = this.coreFramework.getWebSocketAdapter();
|
|
332
|
+
if (!adapter) {
|
|
333
|
+
throw new Error('WebSocket features require a WebSocket adapter. Install socket.io or configure an adapter:\n' +
|
|
334
|
+
'npm install socket.io\n' +
|
|
335
|
+
'or\n' +
|
|
336
|
+
'new Moro({ websocket: { adapter: new SocketIOAdapter() } })');
|
|
337
|
+
}
|
|
331
338
|
this.emit('websocket:registering', { namespace, handlers });
|
|
332
|
-
const
|
|
333
|
-
const ns = io.of(namespace);
|
|
339
|
+
const ns = adapter.createNamespace(namespace);
|
|
334
340
|
Object.entries(handlers).forEach(([event, handler]) => {
|
|
335
341
|
ns.on('connection', socket => {
|
|
336
342
|
this.emit('websocket:connection', { namespace, event, socket });
|
|
@@ -649,26 +655,27 @@ class Moro extends events_1.EventEmitter {
|
|
|
649
655
|
try {
|
|
650
656
|
// Enhance request with events property for direct routes
|
|
651
657
|
req.events = this.eventBus;
|
|
652
|
-
//
|
|
658
|
+
// Universal validation middleware (works with any ValidationSchema)
|
|
653
659
|
if (route.validation) {
|
|
654
660
|
try {
|
|
655
|
-
const validated = route.validation.
|
|
661
|
+
const validated = await route.validation.parseAsync(req.body);
|
|
656
662
|
req.body = validated;
|
|
657
663
|
}
|
|
658
664
|
catch (error) {
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
665
|
+
// Handle universal validation errors
|
|
666
|
+
const { normalizeValidationError } = require('./core/validation/schema-interface');
|
|
667
|
+
const normalizedError = normalizeValidationError(error);
|
|
668
|
+
res.status(400).json({
|
|
669
|
+
success: false,
|
|
670
|
+
error: 'Validation failed',
|
|
671
|
+
details: normalizedError.issues.map((issue) => ({
|
|
672
|
+
field: issue.path.length > 0 ? issue.path.join('.') : 'body',
|
|
673
|
+
message: issue.message,
|
|
674
|
+
code: issue.code,
|
|
675
|
+
})),
|
|
676
|
+
requestId: req.requestId,
|
|
677
|
+
});
|
|
678
|
+
return;
|
|
672
679
|
}
|
|
673
680
|
}
|
|
674
681
|
// Rate limiting middleware
|