@morojs/moro 1.0.0 → 1.0.2
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 +1 -1
- package/dist/core/config/index.d.ts +5 -5
- package/dist/core/config/index.js +1 -1
- package/dist/core/config/index.js.map +1 -1
- package/dist/core/config/loader.d.ts +1 -1
- package/dist/core/config/loader.js +58 -82
- package/dist/core/config/loader.js.map +1 -1
- package/dist/core/config/schema.d.ts +1 -1
- package/dist/core/config/schema.js +52 -111
- package/dist/core/config/schema.js.map +1 -1
- package/dist/core/config/utils.d.ts +2 -2
- package/dist/core/config/utils.js +18 -18
- package/dist/core/config/utils.js.map +1 -1
- package/dist/core/database/adapters/drizzle.d.ts +1 -1
- package/dist/core/database/adapters/drizzle.js +39 -55
- package/dist/core/database/adapters/drizzle.js.map +1 -1
- package/dist/core/database/adapters/index.d.ts +7 -7
- package/dist/core/database/adapters/index.js +11 -11
- package/dist/core/database/adapters/index.js.map +1 -1
- package/dist/core/database/adapters/mongodb.d.ts +1 -1
- package/dist/core/database/adapters/mongodb.js +19 -23
- package/dist/core/database/adapters/mongodb.js.map +1 -1
- package/dist/core/database/adapters/mysql.d.ts +1 -1
- package/dist/core/database/adapters/mysql.js +31 -27
- package/dist/core/database/adapters/mysql.js.map +1 -1
- package/dist/core/database/adapters/postgresql.d.ts +1 -1
- package/dist/core/database/adapters/postgresql.js +27 -35
- package/dist/core/database/adapters/postgresql.js.map +1 -1
- package/dist/core/database/adapters/redis.d.ts +1 -1
- package/dist/core/database/adapters/redis.js +24 -24
- package/dist/core/database/adapters/redis.js.map +1 -1
- package/dist/core/database/adapters/sqlite.d.ts +1 -1
- package/dist/core/database/adapters/sqlite.js +36 -36
- package/dist/core/database/adapters/sqlite.js.map +1 -1
- package/dist/core/database/index.d.ts +2 -2
- package/dist/core/docs/index.d.ts +7 -7
- package/dist/core/docs/index.js +13 -15
- package/dist/core/docs/index.js.map +1 -1
- package/dist/core/docs/openapi-generator.d.ts +5 -5
- package/dist/core/docs/openapi-generator.js +93 -94
- package/dist/core/docs/openapi-generator.js.map +1 -1
- package/dist/core/docs/simple-docs.d.ts +1 -1
- package/dist/core/docs/simple-docs.js +25 -28
- package/dist/core/docs/simple-docs.js.map +1 -1
- package/dist/core/docs/swagger-ui.d.ts +2 -2
- package/dist/core/docs/swagger-ui.js +46 -51
- package/dist/core/docs/swagger-ui.js.map +1 -1
- package/dist/core/docs/zod-to-openapi.d.ts +1 -1
- package/dist/core/docs/zod-to-openapi.js +115 -125
- package/dist/core/docs/zod-to-openapi.js.map +1 -1
- package/dist/core/events/event-bus.d.ts +1 -1
- package/dist/core/events/event-bus.js +15 -21
- package/dist/core/events/event-bus.js.map +1 -1
- package/dist/core/events/index.d.ts +2 -2
- package/dist/core/framework.d.ts +5 -5
- package/dist/core/framework.js +55 -60
- package/dist/core/framework.js.map +1 -1
- package/dist/core/http/http-server.d.ts +2 -2
- package/dist/core/http/http-server.js +228 -261
- package/dist/core/http/http-server.js.map +1 -1
- package/dist/core/http/index.d.ts +3 -3
- package/dist/core/http/router.d.ts +1 -1
- package/dist/core/http/router.js +15 -17
- package/dist/core/http/router.js.map +1 -1
- package/dist/core/logger/filters.d.ts +1 -1
- package/dist/core/logger/filters.js +16 -16
- package/dist/core/logger/filters.js.map +1 -1
- package/dist/core/logger/index.d.ts +3 -3
- package/dist/core/logger/logger.d.ts +1 -1
- package/dist/core/logger/logger.js +48 -59
- package/dist/core/logger/logger.js.map +1 -1
- package/dist/core/logger/outputs.d.ts +4 -4
- package/dist/core/logger/outputs.js +16 -20
- package/dist/core/logger/outputs.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/file.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cache/file.js +19 -19
- package/dist/core/middleware/built-in/adapters/cache/file.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/index.d.ts +4 -4
- package/dist/core/middleware/built-in/adapters/cache/index.js +3 -3
- package/dist/core/middleware/built-in/adapters/cache/index.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/memory.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cache/memory.js +5 -5
- package/dist/core/middleware/built-in/adapters/cache/memory.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/redis.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cache/redis.js +18 -18
- package/dist/core/middleware/built-in/adapters/cache/redis.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/azure.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/azure.js +8 -8
- package/dist/core/middleware/built-in/adapters/cdn/azure.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js +14 -14
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js +13 -15
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/index.d.ts +4 -4
- package/dist/core/middleware/built-in/adapters/cdn/index.js +3 -3
- package/dist/core/middleware/built-in/adapters/index.d.ts +4 -4
- package/dist/core/middleware/built-in/auth.d.ts +1 -1
- package/dist/core/middleware/built-in/auth.js +14 -14
- package/dist/core/middleware/built-in/cache.d.ts +2 -2
- package/dist/core/middleware/built-in/cache.js +43 -45
- package/dist/core/middleware/built-in/cache.js.map +1 -1
- package/dist/core/middleware/built-in/cdn.d.ts +2 -2
- package/dist/core/middleware/built-in/cdn.js +27 -29
- package/dist/core/middleware/built-in/cdn.js.map +1 -1
- package/dist/core/middleware/built-in/cookie.d.ts +2 -2
- package/dist/core/middleware/built-in/cookie.js +17 -17
- package/dist/core/middleware/built-in/cookie.js.map +1 -1
- package/dist/core/middleware/built-in/cors.d.ts +1 -1
- package/dist/core/middleware/built-in/cors.js +13 -13
- package/dist/core/middleware/built-in/csp.d.ts +1 -1
- package/dist/core/middleware/built-in/csp.js +22 -25
- package/dist/core/middleware/built-in/csp.js.map +1 -1
- package/dist/core/middleware/built-in/csrf.d.ts +1 -1
- package/dist/core/middleware/built-in/csrf.js +21 -24
- package/dist/core/middleware/built-in/csrf.js.map +1 -1
- package/dist/core/middleware/built-in/error-tracker.js +2 -2
- package/dist/core/middleware/built-in/index.d.ts +14 -14
- package/dist/core/middleware/built-in/performance-monitor.js +2 -2
- package/dist/core/middleware/built-in/rate-limit.d.ts +1 -1
- package/dist/core/middleware/built-in/rate-limit.js +12 -12
- package/dist/core/middleware/built-in/request-logger.js.map +1 -1
- package/dist/core/middleware/built-in/session.d.ts +5 -5
- package/dist/core/middleware/built-in/session.js +35 -38
- package/dist/core/middleware/built-in/session.js.map +1 -1
- package/dist/core/middleware/built-in/sse.d.ts +1 -1
- package/dist/core/middleware/built-in/sse.js +20 -22
- package/dist/core/middleware/built-in/sse.js.map +1 -1
- package/dist/core/middleware/built-in/validation.d.ts +1 -1
- package/dist/core/middleware/built-in/validation.js +13 -13
- package/dist/core/middleware/index.d.ts +5 -5
- package/dist/core/middleware/index.js +16 -16
- package/dist/core/middleware/index.js.map +1 -1
- package/dist/core/modules/auto-discovery.d.ts +2 -2
- package/dist/core/modules/auto-discovery.js +12 -13
- package/dist/core/modules/auto-discovery.js.map +1 -1
- package/dist/core/modules/index.d.ts +2 -2
- package/dist/core/modules/index.js.map +1 -1
- package/dist/core/modules/modules.d.ts +3 -3
- package/dist/core/modules/modules.js +3 -6
- package/dist/core/modules/modules.js.map +1 -1
- package/dist/core/networking/index.d.ts +2 -2
- package/dist/core/networking/index.js.map +1 -1
- package/dist/core/networking/service-discovery.d.ts +2 -2
- package/dist/core/networking/service-discovery.js +27 -27
- package/dist/core/networking/service-discovery.js.map +1 -1
- package/dist/core/networking/websocket-manager.d.ts +3 -3
- package/dist/core/networking/websocket-manager.js +15 -16
- package/dist/core/networking/websocket-manager.js.map +1 -1
- package/dist/core/routing/app-integration.d.ts +2 -2
- package/dist/core/routing/app-integration.js +13 -13
- package/dist/core/routing/app-integration.js.map +1 -1
- package/dist/core/routing/index.d.ts +3 -3
- package/dist/core/routing/index.js +43 -52
- package/dist/core/routing/index.js.map +1 -1
- package/dist/core/runtime/aws-lambda-adapter.d.ts +3 -3
- package/dist/core/runtime/aws-lambda-adapter.js +14 -16
- package/dist/core/runtime/aws-lambda-adapter.js.map +1 -1
- package/dist/core/runtime/base-adapter.d.ts +2 -2
- package/dist/core/runtime/base-adapter.js +11 -12
- package/dist/core/runtime/base-adapter.js.map +1 -1
- package/dist/core/runtime/cloudflare-workers-adapter.d.ts +3 -3
- package/dist/core/runtime/cloudflare-workers-adapter.js +20 -21
- package/dist/core/runtime/cloudflare-workers-adapter.js.map +1 -1
- package/dist/core/runtime/index.d.ts +9 -9
- package/dist/core/runtime/index.js +4 -4
- package/dist/core/runtime/index.js.map +1 -1
- package/dist/core/runtime/node-adapter.d.ts +5 -5
- package/dist/core/runtime/node-adapter.js +35 -35
- package/dist/core/runtime/node-adapter.js.map +1 -1
- package/dist/core/runtime/vercel-edge-adapter.d.ts +3 -3
- package/dist/core/runtime/vercel-edge-adapter.js +12 -15
- package/dist/core/runtime/vercel-edge-adapter.js.map +1 -1
- package/dist/core/utilities/circuit-breaker.js +6 -6
- package/dist/core/utilities/container.d.ts +1 -1
- package/dist/core/utilities/container.js +17 -22
- package/dist/core/utilities/container.js.map +1 -1
- package/dist/core/utilities/hooks.d.ts +3 -3
- package/dist/core/utilities/hooks.js +11 -11
- package/dist/core/utilities/hooks.js.map +1 -1
- package/dist/core/utilities/index.d.ts +4 -4
- package/dist/core/validation/index.d.ts +3 -3
- package/dist/core/validation/index.js +15 -15
- package/dist/core/validation/index.js.map +1 -1
- package/dist/index.d.ts +41 -30
- package/dist/index.js +50 -1
- package/dist/index.js.map +1 -1
- package/dist/moro.d.ts +14 -14
- package/dist/moro.js +79 -88
- package/dist/moro.js.map +1 -1
- package/dist/types/cache.d.ts +1 -1
- package/dist/types/core.d.ts +2 -2
- package/dist/types/events.d.ts +19 -19
- package/dist/types/hooks.d.ts +1 -1
- package/dist/types/http.d.ts +2 -2
- package/dist/types/logger.d.ts +3 -3
- package/dist/types/module.d.ts +2 -2
- package/dist/types/runtime.d.ts +2 -2
- package/dist/types/session.d.ts +4 -4
- package/package.json +183 -165
- package/src/core/config/index.ts +7 -9
- package/src/core/config/loader.ts +86 -158
- package/src/core/config/schema.ts +59 -122
- package/src/core/config/utils.ts +27 -45
- package/src/core/database/adapters/drizzle.ts +53 -75
- package/src/core/database/adapters/index.ts +26 -29
- package/src/core/database/adapters/mongodb.ts +31 -54
- package/src/core/database/adapters/mysql.ts +40 -50
- package/src/core/database/adapters/postgresql.ts +32 -42
- package/src/core/database/adapters/redis.ts +31 -36
- package/src/core/database/adapters/sqlite.ts +43 -51
- package/src/core/database/index.ts +2 -2
- package/src/core/docs/index.ts +25 -39
- package/src/core/docs/openapi-generator.ts +104 -117
- package/src/core/docs/simple-docs.ts +29 -39
- package/src/core/docs/swagger-ui.ts +57 -76
- package/src/core/docs/zod-to-openapi.ts +121 -153
- package/src/core/events/event-bus.ts +22 -45
- package/src/core/events/index.ts +2 -2
- package/src/core/framework.ts +119 -197
- package/src/core/http/http-server.ts +260 -360
- package/src/core/http/index.ts +3 -8
- package/src/core/http/router.ts +19 -31
- package/src/core/logger/filters.ts +19 -22
- package/src/core/logger/index.ts +3 -3
- package/src/core/logger/logger.ts +59 -100
- package/src/core/logger/outputs.ts +23 -27
- package/src/core/middleware/built-in/adapters/cache/file.ts +21 -23
- package/src/core/middleware/built-in/adapters/cache/index.ts +11 -14
- package/src/core/middleware/built-in/adapters/cache/memory.ts +7 -7
- package/src/core/middleware/built-in/adapters/cache/redis.ts +21 -24
- package/src/core/middleware/built-in/adapters/cdn/azure.ts +10 -18
- package/src/core/middleware/built-in/adapters/cdn/cloudflare.ts +19 -36
- package/src/core/middleware/built-in/adapters/cdn/cloudfront.ts +17 -26
- package/src/core/middleware/built-in/adapters/cdn/index.ts +10 -10
- package/src/core/middleware/built-in/adapters/index.ts +4 -4
- package/src/core/middleware/built-in/auth.ts +16 -16
- package/src/core/middleware/built-in/cache.ts +50 -67
- package/src/core/middleware/built-in/cdn.ts +34 -61
- package/src/core/middleware/built-in/cookie.ts +23 -28
- package/src/core/middleware/built-in/cors.ts +17 -17
- package/src/core/middleware/built-in/csp.ts +25 -31
- package/src/core/middleware/built-in/csrf.ts +24 -29
- package/src/core/middleware/built-in/error-tracker.ts +3 -3
- package/src/core/middleware/built-in/index.ts +28 -28
- package/src/core/middleware/built-in/performance-monitor.ts +4 -4
- package/src/core/middleware/built-in/rate-limit.ts +15 -15
- package/src/core/middleware/built-in/request-logger.ts +1 -3
- package/src/core/middleware/built-in/session.ts +47 -70
- package/src/core/middleware/built-in/sse.ts +23 -28
- package/src/core/middleware/built-in/validation.ts +15 -15
- package/src/core/middleware/index.ts +26 -37
- package/src/core/modules/auto-discovery.ts +21 -31
- package/src/core/modules/index.ts +2 -5
- package/src/core/modules/modules.ts +11 -20
- package/src/core/networking/index.ts +2 -6
- package/src/core/networking/service-discovery.ts +41 -61
- package/src/core/networking/websocket-manager.ts +27 -36
- package/src/core/routing/app-integration.ts +19 -32
- package/src/core/routing/index.ts +57 -88
- package/src/core/runtime/aws-lambda-adapter.ts +20 -30
- package/src/core/runtime/base-adapter.ts +17 -27
- package/src/core/runtime/cloudflare-workers-adapter.ts +28 -42
- package/src/core/runtime/index.ts +21 -33
- package/src/core/runtime/node-adapter.ts +59 -73
- package/src/core/runtime/vercel-edge-adapter.ts +18 -29
- package/src/core/utilities/circuit-breaker.ts +7 -7
- package/src/core/utilities/container.ts +52 -89
- package/src/core/utilities/hooks.ts +17 -23
- package/src/core/utilities/index.ts +4 -4
- package/src/core/validation/index.ts +25 -51
- package/src/index.ts +104 -60
- package/src/moro.ts +119 -191
- package/src/types/cache.ts +1 -1
- package/src/types/core.ts +2 -2
- package/src/types/database.ts +2 -10
- package/src/types/events.ts +23 -31
- package/src/types/hooks.ts +1 -1
- package/src/types/http.ts +5 -8
- package/src/types/logger.ts +7 -23
- package/src/types/module.ts +2 -2
- package/src/types/runtime.ts +6 -21
- package/src/types/session.ts +4 -4
|
@@ -14,10 +14,10 @@ import {
|
|
|
14
14
|
ZodDefault,
|
|
15
15
|
ZodUnion,
|
|
16
16
|
ZodLiteral,
|
|
17
|
-
} from
|
|
18
|
-
import { createFrameworkLogger } from
|
|
17
|
+
} from 'zod';
|
|
18
|
+
import { createFrameworkLogger } from '../logger';
|
|
19
19
|
|
|
20
|
-
const logger = createFrameworkLogger(
|
|
20
|
+
const logger = createFrameworkLogger('ZodToOpenAPI');
|
|
21
21
|
|
|
22
22
|
// OpenAPI schema types
|
|
23
23
|
export interface OpenAPISchema {
|
|
@@ -50,10 +50,7 @@ export interface ConversionOptions {
|
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
// Main conversion function
|
|
53
|
-
export function zodToOpenAPI(
|
|
54
|
-
schema: ZodSchema,
|
|
55
|
-
options: ConversionOptions = {},
|
|
56
|
-
): OpenAPISchema {
|
|
53
|
+
export function zodToOpenAPI(schema: ZodSchema, options: ConversionOptions = {}): OpenAPISchema {
|
|
57
54
|
const opts = {
|
|
58
55
|
includeExamples: true,
|
|
59
56
|
includeDescriptions: true,
|
|
@@ -64,14 +61,14 @@ export function zodToOpenAPI(
|
|
|
64
61
|
try {
|
|
65
62
|
return convertZodType(schema._def, opts);
|
|
66
63
|
} catch (error) {
|
|
67
|
-
logger.error(
|
|
64
|
+
logger.error('Failed to convert Zod schema to OpenAPI', 'Conversion', {
|
|
68
65
|
error: error instanceof Error ? error.message : String(error),
|
|
69
66
|
});
|
|
70
67
|
|
|
71
68
|
// Return a basic schema as fallback
|
|
72
69
|
return {
|
|
73
|
-
type:
|
|
74
|
-
description:
|
|
70
|
+
type: 'object',
|
|
71
|
+
description: 'Schema conversion failed',
|
|
75
72
|
additionalProperties: true,
|
|
76
73
|
};
|
|
77
74
|
}
|
|
@@ -79,84 +76,81 @@ export function zodToOpenAPI(
|
|
|
79
76
|
|
|
80
77
|
// Convert Zod type definition to OpenAPI schema
|
|
81
78
|
function convertZodType(def: any, options: ConversionOptions): OpenAPISchema {
|
|
82
|
-
if (!def || typeof def !==
|
|
83
|
-
logger.warn(
|
|
84
|
-
return { type:
|
|
79
|
+
if (!def || typeof def !== 'object') {
|
|
80
|
+
logger.warn('Invalid Zod definition received', 'Conversion', { def });
|
|
81
|
+
return { type: 'object', additionalProperties: true };
|
|
85
82
|
}
|
|
86
83
|
|
|
87
84
|
// Handle newer Zod structure - check for 'type' field first, then 'typeName'
|
|
88
85
|
const typeName = def.typeName || def.type;
|
|
89
86
|
|
|
90
87
|
if (!typeName) {
|
|
91
|
-
logger.warn(
|
|
88
|
+
logger.warn('Missing typeName/type in Zod definition', 'Conversion', {
|
|
92
89
|
def: JSON.stringify(def).substring(0, 200),
|
|
93
90
|
});
|
|
94
|
-
return { type:
|
|
91
|
+
return { type: 'object', additionalProperties: true };
|
|
95
92
|
}
|
|
96
93
|
|
|
97
94
|
switch (typeName) {
|
|
98
|
-
case
|
|
99
|
-
case
|
|
95
|
+
case 'ZodString':
|
|
96
|
+
case 'string':
|
|
100
97
|
return convertZodString(def, options);
|
|
101
98
|
|
|
102
|
-
case
|
|
103
|
-
case
|
|
99
|
+
case 'ZodNumber':
|
|
100
|
+
case 'number':
|
|
104
101
|
return convertZodNumber(def, options);
|
|
105
102
|
|
|
106
|
-
case
|
|
107
|
-
case
|
|
103
|
+
case 'ZodBoolean':
|
|
104
|
+
case 'boolean':
|
|
108
105
|
return convertZodBoolean(def, options);
|
|
109
106
|
|
|
110
|
-
case
|
|
111
|
-
case
|
|
107
|
+
case 'ZodObject':
|
|
108
|
+
case 'object':
|
|
112
109
|
return convertZodObject(def, options);
|
|
113
110
|
|
|
114
|
-
case
|
|
115
|
-
case
|
|
111
|
+
case 'ZodArray':
|
|
112
|
+
case 'array':
|
|
116
113
|
return convertZodArray(def, options);
|
|
117
114
|
|
|
118
|
-
case
|
|
119
|
-
case
|
|
115
|
+
case 'ZodEnum':
|
|
116
|
+
case 'enum':
|
|
120
117
|
return convertZodEnum(def, options);
|
|
121
118
|
|
|
122
|
-
case
|
|
123
|
-
case
|
|
119
|
+
case 'ZodOptional':
|
|
120
|
+
case 'optional':
|
|
124
121
|
return convertZodOptional(def, options);
|
|
125
122
|
|
|
126
|
-
case
|
|
127
|
-
case
|
|
123
|
+
case 'ZodDefault':
|
|
124
|
+
case 'default':
|
|
128
125
|
return convertZodDefault(def, options);
|
|
129
126
|
|
|
130
|
-
case
|
|
131
|
-
case
|
|
127
|
+
case 'ZodUnion':
|
|
128
|
+
case 'union':
|
|
132
129
|
return convertZodUnion(def, options);
|
|
133
130
|
|
|
134
|
-
case
|
|
135
|
-
case
|
|
131
|
+
case 'ZodLiteral':
|
|
132
|
+
case 'literal':
|
|
136
133
|
return convertZodLiteral(def, options);
|
|
137
134
|
|
|
138
|
-
case
|
|
135
|
+
case 'ZodDate':
|
|
139
136
|
return {
|
|
140
|
-
type:
|
|
141
|
-
format:
|
|
142
|
-
description: options.includeDescriptions
|
|
143
|
-
? "ISO 8601 date-time string"
|
|
144
|
-
: undefined,
|
|
137
|
+
type: 'string',
|
|
138
|
+
format: 'date-time',
|
|
139
|
+
description: options.includeDescriptions ? 'ISO 8601 date-time string' : undefined,
|
|
145
140
|
};
|
|
146
141
|
|
|
147
|
-
case
|
|
142
|
+
case 'ZodUUID':
|
|
148
143
|
return {
|
|
149
|
-
type:
|
|
150
|
-
format:
|
|
151
|
-
pattern:
|
|
152
|
-
|
|
153
|
-
description: options.includeDescriptions ? "UUID string" : undefined,
|
|
144
|
+
type: 'string',
|
|
145
|
+
format: 'uuid',
|
|
146
|
+
pattern: '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$',
|
|
147
|
+
description: options.includeDescriptions ? 'UUID string' : undefined,
|
|
154
148
|
};
|
|
155
149
|
|
|
156
150
|
default:
|
|
157
|
-
logger.warn(`Unsupported Zod type: ${typeName}`,
|
|
151
|
+
logger.warn(`Unsupported Zod type: ${typeName}`, 'Conversion');
|
|
158
152
|
return {
|
|
159
|
-
type:
|
|
153
|
+
type: 'object',
|
|
160
154
|
description: `Unsupported type: ${typeName}`,
|
|
161
155
|
additionalProperties: true,
|
|
162
156
|
};
|
|
@@ -165,48 +159,47 @@ function convertZodType(def: any, options: ConversionOptions): OpenAPISchema {
|
|
|
165
159
|
|
|
166
160
|
// Convert ZodString
|
|
167
161
|
function convertZodString(def: any, options: ConversionOptions): OpenAPISchema {
|
|
168
|
-
const schema: OpenAPISchema = { type:
|
|
162
|
+
const schema: OpenAPISchema = { type: 'string' };
|
|
169
163
|
|
|
170
164
|
// Handle checks (validations)
|
|
171
165
|
if (def.checks) {
|
|
172
166
|
for (const check of def.checks) {
|
|
173
167
|
switch (check.kind) {
|
|
174
|
-
case
|
|
168
|
+
case 'min':
|
|
175
169
|
schema.minLength = check.value;
|
|
176
170
|
break;
|
|
177
|
-
case
|
|
171
|
+
case 'max':
|
|
178
172
|
schema.maxLength = check.value;
|
|
179
173
|
break;
|
|
180
|
-
case
|
|
181
|
-
schema.format =
|
|
174
|
+
case 'email':
|
|
175
|
+
schema.format = 'email';
|
|
182
176
|
break;
|
|
183
|
-
case
|
|
184
|
-
schema.format =
|
|
177
|
+
case 'url':
|
|
178
|
+
schema.format = 'uri';
|
|
185
179
|
break;
|
|
186
|
-
case
|
|
187
|
-
schema.format =
|
|
188
|
-
schema.pattern =
|
|
189
|
-
"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$";
|
|
180
|
+
case 'uuid':
|
|
181
|
+
schema.format = 'uuid';
|
|
182
|
+
schema.pattern = '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$';
|
|
190
183
|
break;
|
|
191
|
-
case
|
|
184
|
+
case 'regex':
|
|
192
185
|
schema.pattern = check.regex.source;
|
|
193
186
|
break;
|
|
194
|
-
case
|
|
195
|
-
schema.format =
|
|
187
|
+
case 'datetime':
|
|
188
|
+
schema.format = 'date-time';
|
|
196
189
|
break;
|
|
197
190
|
}
|
|
198
191
|
}
|
|
199
192
|
}
|
|
200
193
|
|
|
201
194
|
if (options.includeExamples) {
|
|
202
|
-
if (schema.format ===
|
|
203
|
-
schema.example =
|
|
204
|
-
} else if (schema.format ===
|
|
205
|
-
schema.example =
|
|
206
|
-
} else if (schema.format ===
|
|
207
|
-
schema.example =
|
|
195
|
+
if (schema.format === 'email') {
|
|
196
|
+
schema.example = 'user@example.com';
|
|
197
|
+
} else if (schema.format === 'uuid') {
|
|
198
|
+
schema.example = '123e4567-e89b-12d3-a456-426614174000';
|
|
199
|
+
} else if (schema.format === 'date-time') {
|
|
200
|
+
schema.example = '2023-12-01T10:00:00Z';
|
|
208
201
|
} else {
|
|
209
|
-
schema.example =
|
|
202
|
+
schema.example = 'string';
|
|
210
203
|
}
|
|
211
204
|
}
|
|
212
205
|
|
|
@@ -215,37 +208,34 @@ function convertZodString(def: any, options: ConversionOptions): OpenAPISchema {
|
|
|
215
208
|
|
|
216
209
|
// Convert ZodNumber
|
|
217
210
|
function convertZodNumber(def: any, options: ConversionOptions): OpenAPISchema {
|
|
218
|
-
const schema: OpenAPISchema = { type:
|
|
211
|
+
const schema: OpenAPISchema = { type: 'number' };
|
|
219
212
|
|
|
220
213
|
if (def.checks) {
|
|
221
214
|
for (const check of def.checks) {
|
|
222
215
|
switch (check.kind) {
|
|
223
|
-
case
|
|
216
|
+
case 'min':
|
|
224
217
|
schema.minimum = check.value;
|
|
225
218
|
break;
|
|
226
|
-
case
|
|
219
|
+
case 'max':
|
|
227
220
|
schema.maximum = check.value;
|
|
228
221
|
break;
|
|
229
|
-
case
|
|
230
|
-
schema.type =
|
|
222
|
+
case 'int':
|
|
223
|
+
schema.type = 'integer';
|
|
231
224
|
break;
|
|
232
225
|
}
|
|
233
226
|
}
|
|
234
227
|
}
|
|
235
228
|
|
|
236
229
|
if (options.includeExamples) {
|
|
237
|
-
schema.example = schema.type ===
|
|
230
|
+
schema.example = schema.type === 'integer' ? 42 : 3.14;
|
|
238
231
|
}
|
|
239
232
|
|
|
240
233
|
return schema;
|
|
241
234
|
}
|
|
242
235
|
|
|
243
236
|
// Convert ZodBoolean
|
|
244
|
-
function convertZodBoolean(
|
|
245
|
-
|
|
246
|
-
options: ConversionOptions,
|
|
247
|
-
): OpenAPISchema {
|
|
248
|
-
const schema: OpenAPISchema = { type: "boolean" };
|
|
237
|
+
function convertZodBoolean(def: any, options: ConversionOptions): OpenAPISchema {
|
|
238
|
+
const schema: OpenAPISchema = { type: 'boolean' };
|
|
249
239
|
|
|
250
240
|
if (options.includeExamples) {
|
|
251
241
|
schema.example = true;
|
|
@@ -257,20 +247,20 @@ function convertZodBoolean(
|
|
|
257
247
|
// Convert ZodObject
|
|
258
248
|
function convertZodObject(def: any, options: ConversionOptions): OpenAPISchema {
|
|
259
249
|
const schema: OpenAPISchema = {
|
|
260
|
-
type:
|
|
250
|
+
type: 'object',
|
|
261
251
|
properties: {},
|
|
262
252
|
required: [],
|
|
263
253
|
};
|
|
264
254
|
|
|
265
255
|
// Handle both old and new Zod object structures
|
|
266
256
|
let shape;
|
|
267
|
-
if (typeof def.shape ===
|
|
257
|
+
if (typeof def.shape === 'function') {
|
|
268
258
|
shape = def.shape();
|
|
269
|
-
} else if (def.shape && typeof def.shape ===
|
|
259
|
+
} else if (def.shape && typeof def.shape === 'object') {
|
|
270
260
|
shape = def.shape;
|
|
271
261
|
} else {
|
|
272
|
-
logger.warn(
|
|
273
|
-
return { type:
|
|
262
|
+
logger.warn('Could not extract shape from Zod object', 'Conversion');
|
|
263
|
+
return { type: 'object', additionalProperties: true };
|
|
274
264
|
}
|
|
275
265
|
|
|
276
266
|
for (const [key, value] of Object.entries(shape)) {
|
|
@@ -291,10 +281,10 @@ function convertZodObject(def: any, options: ConversionOptions): OpenAPISchema {
|
|
|
291
281
|
// Check if field is required (not optional and no default)
|
|
292
282
|
const typeStr = typeDef.typeName || typeDef.type;
|
|
293
283
|
if (
|
|
294
|
-
typeStr !==
|
|
295
|
-
typeStr !==
|
|
296
|
-
typeStr !==
|
|
297
|
-
typeStr !==
|
|
284
|
+
typeStr !== 'optional' &&
|
|
285
|
+
typeStr !== 'ZodOptional' &&
|
|
286
|
+
typeStr !== 'default' &&
|
|
287
|
+
typeStr !== 'ZodDefault'
|
|
298
288
|
) {
|
|
299
289
|
schema.required!.push(key);
|
|
300
290
|
}
|
|
@@ -311,25 +301,20 @@ function convertZodObject(def: any, options: ConversionOptions): OpenAPISchema {
|
|
|
311
301
|
// Convert ZodArray
|
|
312
302
|
function convertZodArray(def: any, options: ConversionOptions): OpenAPISchema {
|
|
313
303
|
const schema: OpenAPISchema = {
|
|
314
|
-
type:
|
|
315
|
-
items:
|
|
316
|
-
def.type && def.type._def
|
|
317
|
-
? convertZodType(def.type._def, options)
|
|
318
|
-
: { type: "string" },
|
|
304
|
+
type: 'array',
|
|
305
|
+
items: def.type && def.type._def ? convertZodType(def.type._def, options) : { type: 'string' },
|
|
319
306
|
};
|
|
320
307
|
|
|
321
308
|
// Handle array length constraints
|
|
322
309
|
if (def.minLength !== null && def.minLength !== undefined) {
|
|
323
|
-
schema.minLength =
|
|
324
|
-
typeof def.minLength === "object" ? def.minLength.value : def.minLength;
|
|
310
|
+
schema.minLength = typeof def.minLength === 'object' ? def.minLength.value : def.minLength;
|
|
325
311
|
}
|
|
326
312
|
if (def.maxLength !== null && def.maxLength !== undefined) {
|
|
327
|
-
schema.maxLength =
|
|
328
|
-
typeof def.maxLength === "object" ? def.maxLength.value : def.maxLength;
|
|
313
|
+
schema.maxLength = typeof def.maxLength === 'object' ? def.maxLength.value : def.maxLength;
|
|
329
314
|
}
|
|
330
315
|
|
|
331
316
|
if (options.includeExamples && schema.items) {
|
|
332
|
-
schema.example = [schema.items.example ||
|
|
317
|
+
schema.example = [schema.items.example || 'item'];
|
|
333
318
|
}
|
|
334
319
|
|
|
335
320
|
return schema;
|
|
@@ -338,16 +323,11 @@ function convertZodArray(def: any, options: ConversionOptions): OpenAPISchema {
|
|
|
338
323
|
// Convert ZodEnum
|
|
339
324
|
function convertZodEnum(def: any, options: ConversionOptions): OpenAPISchema {
|
|
340
325
|
const schema: OpenAPISchema = {
|
|
341
|
-
type:
|
|
326
|
+
type: 'string',
|
|
342
327
|
enum: def.values || [],
|
|
343
328
|
};
|
|
344
329
|
|
|
345
|
-
if (
|
|
346
|
-
options.includeExamples &&
|
|
347
|
-
def.values &&
|
|
348
|
-
Array.isArray(def.values) &&
|
|
349
|
-
def.values.length > 0
|
|
350
|
-
) {
|
|
330
|
+
if (options.includeExamples && def.values && Array.isArray(def.values) && def.values.length > 0) {
|
|
351
331
|
schema.example = def.values[0];
|
|
352
332
|
}
|
|
353
333
|
|
|
@@ -355,26 +335,20 @@ function convertZodEnum(def: any, options: ConversionOptions): OpenAPISchema {
|
|
|
355
335
|
}
|
|
356
336
|
|
|
357
337
|
// Convert ZodOptional
|
|
358
|
-
function convertZodOptional(
|
|
359
|
-
def: any,
|
|
360
|
-
options: ConversionOptions,
|
|
361
|
-
): OpenAPISchema {
|
|
338
|
+
function convertZodOptional(def: any, options: ConversionOptions): OpenAPISchema {
|
|
362
339
|
return convertZodType(def.innerType._def, options);
|
|
363
340
|
}
|
|
364
341
|
|
|
365
342
|
// Convert ZodDefault
|
|
366
|
-
function convertZodDefault(
|
|
367
|
-
def: any,
|
|
368
|
-
options: ConversionOptions,
|
|
369
|
-
): OpenAPISchema {
|
|
343
|
+
function convertZodDefault(def: any, options: ConversionOptions): OpenAPISchema {
|
|
370
344
|
const schema = convertZodType(def.innerType._def, options);
|
|
371
345
|
|
|
372
346
|
// Handle both function and property forms of defaultValue
|
|
373
|
-
if (typeof def.defaultValue ===
|
|
347
|
+
if (typeof def.defaultValue === 'function') {
|
|
374
348
|
try {
|
|
375
349
|
schema.default = def.defaultValue();
|
|
376
350
|
} catch (error) {
|
|
377
|
-
logger.warn(
|
|
351
|
+
logger.warn('Failed to get default value from function', 'Conversion', {
|
|
378
352
|
error,
|
|
379
353
|
});
|
|
380
354
|
schema.default = undefined;
|
|
@@ -382,7 +356,7 @@ function convertZodDefault(
|
|
|
382
356
|
} else if (def.defaultValue !== undefined) {
|
|
383
357
|
schema.default = def.defaultValue;
|
|
384
358
|
} else {
|
|
385
|
-
logger.warn(
|
|
359
|
+
logger.warn('No default value found in ZodDefault', 'Conversion');
|
|
386
360
|
schema.default = undefined;
|
|
387
361
|
}
|
|
388
362
|
|
|
@@ -391,9 +365,7 @@ function convertZodDefault(
|
|
|
391
365
|
|
|
392
366
|
// Convert ZodUnion
|
|
393
367
|
function convertZodUnion(def: any, options: ConversionOptions): OpenAPISchema {
|
|
394
|
-
const schemas = def.options.map((option: ZodType) =>
|
|
395
|
-
convertZodType(option._def, options),
|
|
396
|
-
);
|
|
368
|
+
const schemas = def.options.map((option: ZodType) => convertZodType(option._def, options));
|
|
397
369
|
|
|
398
370
|
return {
|
|
399
371
|
oneOf: schemas,
|
|
@@ -401,10 +373,7 @@ function convertZodUnion(def: any, options: ConversionOptions): OpenAPISchema {
|
|
|
401
373
|
}
|
|
402
374
|
|
|
403
375
|
// Convert ZodLiteral
|
|
404
|
-
function convertZodLiteral(
|
|
405
|
-
def: any,
|
|
406
|
-
options: ConversionOptions,
|
|
407
|
-
): OpenAPISchema {
|
|
376
|
+
function convertZodLiteral(def: any, options: ConversionOptions): OpenAPISchema {
|
|
408
377
|
const value = def.value;
|
|
409
378
|
|
|
410
379
|
return {
|
|
@@ -416,11 +385,11 @@ function convertZodLiteral(
|
|
|
416
385
|
|
|
417
386
|
// Helper functions
|
|
418
387
|
function isOptionalType(type: ZodType): boolean {
|
|
419
|
-
return (type._def as any).typeName ===
|
|
388
|
+
return (type._def as any).typeName === 'ZodOptional';
|
|
420
389
|
}
|
|
421
390
|
|
|
422
391
|
function hasDefault(type: ZodType): boolean {
|
|
423
|
-
return (type._def as any).typeName ===
|
|
392
|
+
return (type._def as any).typeName === 'ZodDefault';
|
|
424
393
|
}
|
|
425
394
|
|
|
426
395
|
// Generate example data from Zod schema
|
|
@@ -428,7 +397,7 @@ export function generateExampleFromSchema(schema: ZodSchema): any {
|
|
|
428
397
|
try {
|
|
429
398
|
return generateExample(schema._def);
|
|
430
399
|
} catch (error) {
|
|
431
|
-
logger.warn(
|
|
400
|
+
logger.warn('Failed to generate example from schema', 'ExampleGeneration', {
|
|
432
401
|
error: error instanceof Error ? error.message : String(error),
|
|
433
402
|
});
|
|
434
403
|
return {};
|
|
@@ -439,32 +408,31 @@ function generateExample(def: any): any {
|
|
|
439
408
|
const typeName = def.typeName;
|
|
440
409
|
|
|
441
410
|
switch (typeName) {
|
|
442
|
-
case
|
|
411
|
+
case 'ZodString':
|
|
443
412
|
if (def.checks) {
|
|
444
413
|
for (const check of def.checks) {
|
|
445
|
-
if (check.kind ===
|
|
446
|
-
if (check.kind ===
|
|
447
|
-
|
|
448
|
-
if (check.kind ===
|
|
449
|
-
if (check.kind === "datetime") return "2023-12-01T10:00:00Z";
|
|
414
|
+
if (check.kind === 'email') return 'user@example.com';
|
|
415
|
+
if (check.kind === 'uuid') return '123e4567-e89b-12d3-a456-426614174000';
|
|
416
|
+
if (check.kind === 'url') return 'https://example.com';
|
|
417
|
+
if (check.kind === 'datetime') return '2023-12-01T10:00:00Z';
|
|
450
418
|
}
|
|
451
419
|
}
|
|
452
|
-
return
|
|
420
|
+
return 'string';
|
|
453
421
|
|
|
454
|
-
case
|
|
422
|
+
case 'ZodNumber':
|
|
455
423
|
return 42;
|
|
456
424
|
|
|
457
|
-
case
|
|
425
|
+
case 'ZodBoolean':
|
|
458
426
|
return true;
|
|
459
427
|
|
|
460
|
-
case
|
|
428
|
+
case 'ZodObject': {
|
|
461
429
|
const example: any = {};
|
|
462
430
|
let shape;
|
|
463
431
|
|
|
464
432
|
try {
|
|
465
|
-
if (typeof def.shape ===
|
|
433
|
+
if (typeof def.shape === 'function') {
|
|
466
434
|
shape = def.shape();
|
|
467
|
-
} else if (def.shape && typeof def.shape ===
|
|
435
|
+
} else if (def.shape && typeof def.shape === 'object') {
|
|
468
436
|
shape = def.shape;
|
|
469
437
|
} else {
|
|
470
438
|
return {};
|
|
@@ -477,7 +445,7 @@ function generateExample(def: any): any {
|
|
|
477
445
|
}
|
|
478
446
|
}
|
|
479
447
|
} catch (error) {
|
|
480
|
-
logger.warn(
|
|
448
|
+
logger.warn('Failed to generate object example', 'ExampleGeneration', {
|
|
481
449
|
error,
|
|
482
450
|
});
|
|
483
451
|
return {};
|
|
@@ -486,31 +454,31 @@ function generateExample(def: any): any {
|
|
|
486
454
|
return example;
|
|
487
455
|
}
|
|
488
456
|
|
|
489
|
-
case
|
|
457
|
+
case 'ZodArray':
|
|
490
458
|
if (def.type && def.type._def) {
|
|
491
459
|
const itemExample = generateExample(def.type._def);
|
|
492
460
|
return [itemExample];
|
|
493
461
|
}
|
|
494
|
-
return [
|
|
462
|
+
return ['item'];
|
|
495
463
|
|
|
496
|
-
case
|
|
464
|
+
case 'ZodEnum':
|
|
497
465
|
return def.values && Array.isArray(def.values) && def.values.length > 0
|
|
498
466
|
? def.values[0]
|
|
499
|
-
:
|
|
467
|
+
: 'enum-value';
|
|
500
468
|
|
|
501
|
-
case
|
|
469
|
+
case 'ZodOptional':
|
|
502
470
|
return generateExample(def.innerType._def);
|
|
503
471
|
|
|
504
|
-
case
|
|
472
|
+
case 'ZodDefault':
|
|
505
473
|
// Handle both function and property forms of defaultValue
|
|
506
|
-
if (typeof def.defaultValue ===
|
|
474
|
+
if (typeof def.defaultValue === 'function') {
|
|
507
475
|
try {
|
|
508
476
|
return def.defaultValue();
|
|
509
477
|
} catch (error) {
|
|
510
478
|
logger.warn(
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
{ error }
|
|
479
|
+
'Failed to get default value from function in example generation',
|
|
480
|
+
'ExampleGeneration',
|
|
481
|
+
{ error }
|
|
514
482
|
);
|
|
515
483
|
return null;
|
|
516
484
|
}
|
|
@@ -520,10 +488,10 @@ function generateExample(def: any): any {
|
|
|
520
488
|
return null;
|
|
521
489
|
}
|
|
522
490
|
|
|
523
|
-
case
|
|
491
|
+
case 'ZodUnion':
|
|
524
492
|
return generateExample(def.options[0]._def);
|
|
525
493
|
|
|
526
|
-
case
|
|
494
|
+
case 'ZodLiteral':
|
|
527
495
|
return def.value;
|
|
528
496
|
|
|
529
497
|
default:
|