-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathhttp.zod.ts
More file actions
181 lines (155 loc) · 4.58 KB
/
http.zod.ts
File metadata and controls
181 lines (155 loc) · 4.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
import { z } from 'zod';
/**
* Shared HTTP Schemas
*
* Common HTTP-related schemas used across API and System protocols.
* These schemas ensure consistency across different parts of the stack.
*/
// ==========================================
// Basic HTTP Types
// ==========================================
/**
* HTTP Method Enum
*/
export const HttpMethod = z.enum([
'GET',
'POST',
'PUT',
'DELETE',
'PATCH',
'HEAD',
'OPTIONS'
]);
export type HttpMethod = z.infer<typeof HttpMethod>;
/**
* HTTP Method Schema (subset for UI/View data sources)
* Common HTTP methods used in view data source configurations.
* Migrated from ui/view.zod.ts to shared for reuse across modules.
*/
export const HttpMethodSchema = z.enum(['GET', 'POST', 'PUT', 'PATCH', 'DELETE']);
export type HttpMethodType = z.infer<typeof HttpMethodSchema>;
/**
* HTTP Request Configuration Schema
* Defines a complete HTTP request configuration used by API data providers.
* Migrated from ui/view.zod.ts to shared for reuse across modules.
*/
export const HttpRequestSchema = z.object({
url: z.string().describe('API endpoint URL'),
method: HttpMethodSchema.optional().default('GET').describe('HTTP method'),
headers: z.record(z.string(), z.string()).optional().describe('Custom HTTP headers'),
params: z.record(z.string(), z.unknown()).optional().describe('Query parameters'),
body: z.unknown().optional().describe('Request body for POST/PUT/PATCH'),
});
export type HttpRequest = z.infer<typeof HttpRequestSchema>;
// ==========================================
// CORS Configuration
// ==========================================
/**
* CORS Configuration Schema
* Cross-Origin Resource Sharing configuration
*
* Used by:
* - api/router.zod.ts (RouterConfigSchema)
* - system/http-server.zod.ts (HttpServerConfigSchema)
*
* @example
* {
* "enabled": true,
* "origins": ["http://localhost:3000", "https://app.example.com"],
* "methods": ["GET", "POST", "PUT", "DELETE"],
* "credentials": true,
* "maxAge": 86400
* }
*/
export const CorsConfigSchema = z.object({
/**
* Enable CORS
*/
enabled: z.boolean().default(true).describe('Enable CORS'),
/**
* Allowed origins (* for all)
*/
origins: z.union([
z.string(),
z.array(z.string())
]).default('*').describe('Allowed origins (* for all)'),
/**
* Allowed HTTP methods
*/
methods: z.array(HttpMethod).optional().describe('Allowed HTTP methods'),
/**
* Allow credentials (cookies, authorization headers)
*/
credentials: z.boolean().default(false).describe('Allow credentials (cookies, authorization headers)'),
/**
* Preflight cache duration in seconds
*/
maxAge: z.number().int().optional().describe('Preflight cache duration in seconds'),
});
export type CorsConfig = z.infer<typeof CorsConfigSchema>;
// ==========================================
// Rate Limiting
// ==========================================
/**
* Rate Limit Configuration Schema
*
* Used by:
* - api/endpoint.zod.ts (ApiEndpointSchema)
* - system/http-server.zod.ts (HttpServerConfigSchema)
*
* @example
* {
* "enabled": true,
* "windowMs": 60000,
* "maxRequests": 100
* }
*/
export const RateLimitConfigSchema = z.object({
/**
* Enable rate limiting
*/
enabled: z.boolean().default(false).describe('Enable rate limiting'),
/**
* Time window in milliseconds
*/
windowMs: z.number().int().default(60000).describe('Time window in milliseconds'),
/**
* Max requests per window
*/
maxRequests: z.number().int().default(100).describe('Max requests per window'),
});
export type RateLimitConfig = z.infer<typeof RateLimitConfigSchema>;
// ==========================================
// Static File Serving
// ==========================================
/**
* Static Mount Configuration Schema
* Configuration for serving static files
*
* Used by:
* - api/router.zod.ts (RouterConfigSchema)
* - system/http-server.zod.ts (HttpServerConfigSchema)
*
* @example
* {
* "path": "/static",
* "directory": "./public",
* "cacheControl": "public, max-age=31536000"
* }
*/
export const StaticMountSchema = z.object({
/**
* URL path to serve from
*/
path: z.string().describe('URL path to serve from'),
/**
* Physical directory to serve
*/
directory: z.string().describe('Physical directory to serve'),
/**
* Cache-Control header value
*/
cacheControl: z.string().optional().describe('Cache-Control header value'),
});
export type StaticMount = z.infer<typeof StaticMountSchema>;