schemock 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +82 -0
- package/dist/adapters/index.d.mts +1364 -0
- package/dist/adapters/index.d.ts +1364 -0
- package/dist/adapters/index.js +36988 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/index.mjs +36972 -0
- package/dist/adapters/index.mjs.map +1 -0
- package/dist/cli/index.d.mts +831 -0
- package/dist/cli/index.d.ts +831 -0
- package/dist/cli/index.js +4425 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/index.mjs +4401 -0
- package/dist/cli/index.mjs.map +1 -0
- package/dist/cli.js +6776 -0
- package/dist/index.d.mts +8 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +39439 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +39367 -0
- package/dist/index.mjs.map +1 -0
- package/dist/middleware/index.d.mts +688 -0
- package/dist/middleware/index.d.ts +688 -0
- package/dist/middleware/index.js +921 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/index.mjs +899 -0
- package/dist/middleware/index.mjs.map +1 -0
- package/dist/react/index.d.mts +316 -0
- package/dist/react/index.d.ts +316 -0
- package/dist/react/index.js +466 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/index.mjs +456 -0
- package/dist/react/index.mjs.map +1 -0
- package/dist/runtime/index.d.mts +814 -0
- package/dist/runtime/index.d.ts +814 -0
- package/dist/runtime/index.js +1270 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/index.mjs +1246 -0
- package/dist/runtime/index.mjs.map +1 -0
- package/dist/schema/index.d.mts +838 -0
- package/dist/schema/index.d.ts +838 -0
- package/dist/schema/index.js +696 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/index.mjs +681 -0
- package/dist/schema/index.mjs.map +1 -0
- package/dist/types-C1MiZh1d.d.ts +96 -0
- package/dist/types-C2bd2vgy.d.mts +773 -0
- package/dist/types-C2bd2vgy.d.ts +773 -0
- package/dist/types-C9VMgu3E.d.mts +289 -0
- package/dist/types-DV2DS7wj.d.mts +96 -0
- package/dist/types-c2AN3vky.d.ts +289 -0
- package/package.json +116 -0
|
@@ -0,0 +1,688 @@
|
|
|
1
|
+
import { M as Middleware, b as MiddlewareContext } from '../types-C1MiZh1d.js';
|
|
2
|
+
export { a as MiddlewareFunction, c as MiddlewareResult } from '../types-C1MiZh1d.js';
|
|
3
|
+
import { b as AdapterResponse } from '../types-c2AN3vky.js';
|
|
4
|
+
import { o as EntitySchema } from '../types-C2bd2vgy.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* MiddlewareChain - Executor for composable middleware
|
|
8
|
+
*
|
|
9
|
+
* Chains middleware in order, executing before hooks, the handler,
|
|
10
|
+
* and after hooks in sequence.
|
|
11
|
+
*
|
|
12
|
+
* @module middleware/chain
|
|
13
|
+
* @category Middleware
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* MiddlewareChain class for executing middleware in sequence.
|
|
18
|
+
*
|
|
19
|
+
* Supports both hook-based middleware (before/after/onError) and
|
|
20
|
+
* function-based middleware (Koa-style handler).
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* const chain = new MiddlewareChain([
|
|
25
|
+
* createAuthMiddleware({ getToken: () => 'token' }),
|
|
26
|
+
* createLoggerMiddleware(),
|
|
27
|
+
* createCacheMiddleware({ ttl: 60000 }),
|
|
28
|
+
* ]);
|
|
29
|
+
*
|
|
30
|
+
* const result = await chain.execute(ctx, async () => {
|
|
31
|
+
* return adapter.findMany(ctx);
|
|
32
|
+
* });
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
declare class MiddlewareChain {
|
|
36
|
+
/** The middleware stack */
|
|
37
|
+
private middlewares;
|
|
38
|
+
/**
|
|
39
|
+
* Create a new MiddlewareChain.
|
|
40
|
+
*
|
|
41
|
+
* @param middlewares - Array of middleware to execute in order
|
|
42
|
+
*/
|
|
43
|
+
constructor(middlewares: Middleware[]);
|
|
44
|
+
/**
|
|
45
|
+
* Execute the middleware chain with the given handler.
|
|
46
|
+
*
|
|
47
|
+
* @param ctx - The middleware context
|
|
48
|
+
* @param handler - The final handler (adapter call)
|
|
49
|
+
* @returns The response after all middleware processing
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```typescript
|
|
53
|
+
* const result = await chain.execute<User[]>(
|
|
54
|
+
* { entity: 'user', operation: 'findMany', metadata: {} },
|
|
55
|
+
* () => adapter.findMany({ entity: 'user' })
|
|
56
|
+
* );
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
execute<T>(ctx: MiddlewareContext, handler: () => Promise<AdapterResponse<T>>): Promise<AdapterResponse<T>>;
|
|
60
|
+
/**
|
|
61
|
+
* Execute middleware using hook-style (before/after/onError).
|
|
62
|
+
*/
|
|
63
|
+
private executeHookStyle;
|
|
64
|
+
/**
|
|
65
|
+
* Execute middleware using function-style (Koa-like compose).
|
|
66
|
+
*/
|
|
67
|
+
private executeFunctionStyle;
|
|
68
|
+
/**
|
|
69
|
+
* Add middleware to the chain.
|
|
70
|
+
*
|
|
71
|
+
* @param middleware - Middleware to add
|
|
72
|
+
*/
|
|
73
|
+
use(middleware: Middleware): this;
|
|
74
|
+
/**
|
|
75
|
+
* Remove middleware by name.
|
|
76
|
+
*
|
|
77
|
+
* @param name - Name of middleware to remove
|
|
78
|
+
*/
|
|
79
|
+
remove(name: string): this;
|
|
80
|
+
/**
|
|
81
|
+
* Get middleware by name.
|
|
82
|
+
*
|
|
83
|
+
* @param name - Middleware name
|
|
84
|
+
* @returns The middleware or undefined
|
|
85
|
+
*/
|
|
86
|
+
get(name: string): Middleware | undefined;
|
|
87
|
+
/**
|
|
88
|
+
* Get all middleware names.
|
|
89
|
+
*
|
|
90
|
+
* @returns Array of middleware names
|
|
91
|
+
*/
|
|
92
|
+
names(): string[];
|
|
93
|
+
/**
|
|
94
|
+
* Get the middleware count.
|
|
95
|
+
*/
|
|
96
|
+
get length(): number;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Create a middleware chain from an array of middleware.
|
|
100
|
+
*
|
|
101
|
+
* @param middlewares - Array of middleware
|
|
102
|
+
* @returns A configured MiddlewareChain
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* ```typescript
|
|
106
|
+
* const chain = createMiddlewareChain([
|
|
107
|
+
* createAuthMiddleware({ getToken: () => token }),
|
|
108
|
+
* createLoggerMiddleware(),
|
|
109
|
+
* ]);
|
|
110
|
+
* ```
|
|
111
|
+
*/
|
|
112
|
+
declare function createMiddlewareChain(middlewares: Middleware[]): MiddlewareChain;
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Auth Middleware - Authentication token management
|
|
116
|
+
*
|
|
117
|
+
* Automatically attaches authentication tokens to requests
|
|
118
|
+
* and handles token refresh on 401 responses.
|
|
119
|
+
*
|
|
120
|
+
* @module middleware/auth
|
|
121
|
+
* @category Middleware
|
|
122
|
+
*/
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Configuration options for auth middleware.
|
|
126
|
+
*/
|
|
127
|
+
interface AuthMiddlewareConfig {
|
|
128
|
+
/** Function to get the current auth token */
|
|
129
|
+
getToken: () => string | null | Promise<string | null>;
|
|
130
|
+
/** Function to refresh the token (optional) */
|
|
131
|
+
refreshToken?: () => Promise<string>;
|
|
132
|
+
/** Callback when user is unauthorized (optional) */
|
|
133
|
+
onUnauthorized?: () => void;
|
|
134
|
+
/** Header name for the token (default: 'Authorization') */
|
|
135
|
+
headerName?: string;
|
|
136
|
+
/** Token prefix (default: 'Bearer ') */
|
|
137
|
+
tokenPrefix?: string;
|
|
138
|
+
/** Whether to skip auth for certain operations */
|
|
139
|
+
skipOperations?: string[];
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Create an authentication middleware.
|
|
143
|
+
*
|
|
144
|
+
* Attaches auth tokens to requests and handles 401 responses
|
|
145
|
+
* with optional token refresh.
|
|
146
|
+
*
|
|
147
|
+
* @param config - Auth middleware configuration
|
|
148
|
+
* @returns A configured Middleware instance
|
|
149
|
+
*
|
|
150
|
+
* @example
|
|
151
|
+
* ```typescript
|
|
152
|
+
* const authMiddleware = createAuthMiddleware({
|
|
153
|
+
* getToken: () => localStorage.getItem('token'),
|
|
154
|
+
* refreshToken: async () => {
|
|
155
|
+
* const response = await fetch('/auth/refresh');
|
|
156
|
+
* const { token } = await response.json();
|
|
157
|
+
* localStorage.setItem('token', token);
|
|
158
|
+
* return token;
|
|
159
|
+
* },
|
|
160
|
+
* onUnauthorized: () => {
|
|
161
|
+
* window.location.href = '/login';
|
|
162
|
+
* },
|
|
163
|
+
* });
|
|
164
|
+
* ```
|
|
165
|
+
*/
|
|
166
|
+
declare function createAuthMiddleware(config: AuthMiddlewareConfig): Middleware;
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Retry Middleware - Automatic retry with exponential backoff
|
|
170
|
+
*
|
|
171
|
+
* Automatically retries failed requests with configurable
|
|
172
|
+
* retry count and exponential backoff delay.
|
|
173
|
+
*
|
|
174
|
+
* @module middleware/retry
|
|
175
|
+
* @category Middleware
|
|
176
|
+
*/
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Configuration options for retry middleware.
|
|
180
|
+
*/
|
|
181
|
+
interface RetryMiddlewareConfig {
|
|
182
|
+
/** Maximum number of retry attempts (default: 3) */
|
|
183
|
+
maxRetries?: number;
|
|
184
|
+
/** Initial delay between retries in ms (default: 1000) */
|
|
185
|
+
retryDelay?: number;
|
|
186
|
+
/** Whether to use exponential backoff (default: true) */
|
|
187
|
+
exponentialBackoff?: boolean;
|
|
188
|
+
/** Maximum delay in ms (default: 30000) */
|
|
189
|
+
maxDelay?: number;
|
|
190
|
+
/** HTTP status codes that should trigger a retry */
|
|
191
|
+
retryableStatuses?: number[];
|
|
192
|
+
/** Custom function to determine if an error is retryable */
|
|
193
|
+
isRetryable?: (error: Error) => boolean;
|
|
194
|
+
/** Callback when a retry is attempted */
|
|
195
|
+
onRetry?: (attempt: number, error: Error, ctx: MiddlewareContext) => void;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Create a retry middleware with exponential backoff.
|
|
199
|
+
*
|
|
200
|
+
* @param config - Retry middleware configuration
|
|
201
|
+
* @returns A configured Middleware instance
|
|
202
|
+
*
|
|
203
|
+
* @example
|
|
204
|
+
* ```typescript
|
|
205
|
+
* const retryMiddleware = createRetryMiddleware({
|
|
206
|
+
* maxRetries: 3,
|
|
207
|
+
* retryDelay: 1000,
|
|
208
|
+
* onRetry: (attempt, error) => {
|
|
209
|
+
* console.log(`Retry attempt ${attempt}: ${error.message}`);
|
|
210
|
+
* },
|
|
211
|
+
* });
|
|
212
|
+
* ```
|
|
213
|
+
*/
|
|
214
|
+
declare function createRetryMiddleware(config?: RetryMiddlewareConfig): Middleware;
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Cache Middleware - Response caching with TTL
|
|
218
|
+
*
|
|
219
|
+
* Caches successful responses to reduce API calls
|
|
220
|
+
* and improve performance.
|
|
221
|
+
*
|
|
222
|
+
* @module middleware/cache
|
|
223
|
+
* @category Middleware
|
|
224
|
+
*/
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Configuration options for cache middleware.
|
|
228
|
+
*/
|
|
229
|
+
interface CacheMiddlewareConfig {
|
|
230
|
+
/** Time-to-live for cache entries in ms (default: 60000 = 1 minute) */
|
|
231
|
+
ttl?: number;
|
|
232
|
+
/** Operations to cache (default: ['findOne', 'findMany']) */
|
|
233
|
+
cacheOperations?: string[];
|
|
234
|
+
/** Maximum number of cached entries (default: 1000) */
|
|
235
|
+
maxSize?: number;
|
|
236
|
+
/** Custom cache key generator */
|
|
237
|
+
getCacheKey?: (ctx: MiddlewareContext) => string;
|
|
238
|
+
/** Whether to cache errors (default: false) */
|
|
239
|
+
cacheErrors?: boolean;
|
|
240
|
+
/** Storage backend (default: in-memory Map) */
|
|
241
|
+
storage?: CacheStorage;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Cache storage interface.
|
|
245
|
+
*/
|
|
246
|
+
interface CacheStorage {
|
|
247
|
+
get<T>(key: string): Promise<CacheEntry<T> | undefined>;
|
|
248
|
+
set<T>(key: string, entry: CacheEntry<T>): Promise<void>;
|
|
249
|
+
delete(key: string): Promise<void>;
|
|
250
|
+
clear(): Promise<void>;
|
|
251
|
+
size(): Promise<number>;
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Cache entry structure.
|
|
255
|
+
*/
|
|
256
|
+
interface CacheEntry<T> {
|
|
257
|
+
/** Cached response data */
|
|
258
|
+
data: AdapterResponse<T>;
|
|
259
|
+
/** Timestamp when cached */
|
|
260
|
+
timestamp: number;
|
|
261
|
+
/** TTL for this entry */
|
|
262
|
+
ttl: number;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Default in-memory cache storage.
|
|
266
|
+
*/
|
|
267
|
+
declare class MemoryCacheStorage implements CacheStorage {
|
|
268
|
+
private cache;
|
|
269
|
+
private maxSize;
|
|
270
|
+
constructor(maxSize?: number);
|
|
271
|
+
get<T>(key: string): Promise<CacheEntry<T> | undefined>;
|
|
272
|
+
set<T>(key: string, entry: CacheEntry<T>): Promise<void>;
|
|
273
|
+
delete(key: string): Promise<void>;
|
|
274
|
+
clear(): Promise<void>;
|
|
275
|
+
size(): Promise<number>;
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Create a cache middleware with TTL.
|
|
279
|
+
*
|
|
280
|
+
* @param config - Cache middleware configuration
|
|
281
|
+
* @returns A configured Middleware instance
|
|
282
|
+
*
|
|
283
|
+
* @example
|
|
284
|
+
* ```typescript
|
|
285
|
+
* const cacheMiddleware = createCacheMiddleware({
|
|
286
|
+
* ttl: 60000, // 1 minute
|
|
287
|
+
* cacheOperations: ['findOne', 'findMany'],
|
|
288
|
+
* });
|
|
289
|
+
* ```
|
|
290
|
+
*
|
|
291
|
+
* @example
|
|
292
|
+
* ```typescript
|
|
293
|
+
* // With custom cache key
|
|
294
|
+
* const cacheMiddleware = createCacheMiddleware({
|
|
295
|
+
* ttl: 300000, // 5 minutes
|
|
296
|
+
* getCacheKey: (ctx) => `${ctx.entity}:${ctx.params?.id}:${ctx.filter?.status}`,
|
|
297
|
+
* });
|
|
298
|
+
* ```
|
|
299
|
+
*/
|
|
300
|
+
declare function createCacheMiddleware(config?: CacheMiddlewareConfig): Middleware;
|
|
301
|
+
/**
|
|
302
|
+
* Create a utility to invalidate cache entries.
|
|
303
|
+
*
|
|
304
|
+
* @param storage - The cache storage to invalidate
|
|
305
|
+
* @returns Invalidation functions
|
|
306
|
+
*
|
|
307
|
+
* @example
|
|
308
|
+
* ```typescript
|
|
309
|
+
* const storage = new MemoryCacheStorage();
|
|
310
|
+
* const cache = createCacheInvalidator(storage);
|
|
311
|
+
*
|
|
312
|
+
* // Clear all cache
|
|
313
|
+
* await cache.clear();
|
|
314
|
+
*
|
|
315
|
+
* // Invalidate specific entry
|
|
316
|
+
* await cache.invalidate('findMany:user');
|
|
317
|
+
* ```
|
|
318
|
+
*/
|
|
319
|
+
declare function createCacheInvalidator(storage: CacheStorage): {
|
|
320
|
+
invalidate: (key: string) => Promise<void>;
|
|
321
|
+
clear: () => Promise<void>;
|
|
322
|
+
size: () => Promise<number>;
|
|
323
|
+
};
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* Logger Middleware - Request/response logging
|
|
327
|
+
*
|
|
328
|
+
* Logs request and response information for debugging
|
|
329
|
+
* and monitoring purposes.
|
|
330
|
+
*
|
|
331
|
+
* @module middleware/logger
|
|
332
|
+
* @category Middleware
|
|
333
|
+
*/
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* Log level type.
|
|
337
|
+
*/
|
|
338
|
+
type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
339
|
+
/**
|
|
340
|
+
* Configuration options for logger middleware.
|
|
341
|
+
*/
|
|
342
|
+
interface LoggerMiddlewareConfig {
|
|
343
|
+
/** Custom log function (default: console.log) */
|
|
344
|
+
log?: (message: string, data?: unknown) => void;
|
|
345
|
+
/** Whether to log requests (default: true) */
|
|
346
|
+
logRequest?: boolean;
|
|
347
|
+
/** Whether to log responses (default: true) */
|
|
348
|
+
logResponse?: boolean;
|
|
349
|
+
/** Whether to log errors (default: true) */
|
|
350
|
+
logErrors?: boolean;
|
|
351
|
+
/** Whether to log timing information (default: true) */
|
|
352
|
+
logTiming?: boolean;
|
|
353
|
+
/** Minimum log level (default: 'debug') */
|
|
354
|
+
level?: LogLevel;
|
|
355
|
+
/** Custom formatter for log messages */
|
|
356
|
+
formatter?: (type: 'request' | 'response' | 'error', ctx: MiddlewareContext, data?: unknown) => string;
|
|
357
|
+
/** Whether to include request data in logs (be careful with sensitive data) */
|
|
358
|
+
includeData?: boolean;
|
|
359
|
+
/** Fields to redact from logs */
|
|
360
|
+
redactFields?: string[];
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Create a logger middleware.
|
|
364
|
+
*
|
|
365
|
+
* @param config - Logger middleware configuration
|
|
366
|
+
* @returns A configured Middleware instance
|
|
367
|
+
*
|
|
368
|
+
* @example
|
|
369
|
+
* ```typescript
|
|
370
|
+
* const loggerMiddleware = createLoggerMiddleware({
|
|
371
|
+
* log: console.log,
|
|
372
|
+
* logRequest: true,
|
|
373
|
+
* logResponse: true,
|
|
374
|
+
* });
|
|
375
|
+
* ```
|
|
376
|
+
*
|
|
377
|
+
* @example
|
|
378
|
+
* ```typescript
|
|
379
|
+
* // With custom logger
|
|
380
|
+
* const loggerMiddleware = createLoggerMiddleware({
|
|
381
|
+
* log: (msg, data) => winston.info(msg, data),
|
|
382
|
+
* formatter: (type, ctx) => `[${type.toUpperCase()}] ${ctx.entity}.${ctx.operation}`,
|
|
383
|
+
* });
|
|
384
|
+
* ```
|
|
385
|
+
*/
|
|
386
|
+
declare function createLoggerMiddleware(config?: LoggerMiddlewareConfig): Middleware;
|
|
387
|
+
/**
|
|
388
|
+
* Create a silent logger (logs nothing).
|
|
389
|
+
* Useful for testing.
|
|
390
|
+
*/
|
|
391
|
+
declare function createSilentLogger(): Middleware;
|
|
392
|
+
/**
|
|
393
|
+
* Create a verbose logger (logs everything).
|
|
394
|
+
* Useful for debugging.
|
|
395
|
+
*/
|
|
396
|
+
declare function createVerboseLogger(): Middleware;
|
|
397
|
+
|
|
398
|
+
/**
|
|
399
|
+
* Context Middleware - Extract execution context from headers
|
|
400
|
+
*
|
|
401
|
+
* Extracts user information, tenant IDs, and other context from
|
|
402
|
+
* request headers (Authorization, custom headers) and populates
|
|
403
|
+
* ctx.context for use by RLS and other middleware.
|
|
404
|
+
*
|
|
405
|
+
* @module middleware/context
|
|
406
|
+
* @category Middleware
|
|
407
|
+
*/
|
|
408
|
+
|
|
409
|
+
/**
|
|
410
|
+
* Configuration options for context middleware.
|
|
411
|
+
*/
|
|
412
|
+
interface ContextMiddlewareConfig {
|
|
413
|
+
/**
|
|
414
|
+
* Function to decode/validate token and extract user info.
|
|
415
|
+
* In production, this would validate the JWT signature.
|
|
416
|
+
*
|
|
417
|
+
* @param token - The JWT token (without 'Bearer ' prefix)
|
|
418
|
+
* @returns Decoded token payload or null if invalid
|
|
419
|
+
*/
|
|
420
|
+
decodeToken?: (token: string) => Record<string, unknown> | null;
|
|
421
|
+
/**
|
|
422
|
+
* Additional headers to extract as context.
|
|
423
|
+
* Headers will be converted to camelCase context keys.
|
|
424
|
+
*
|
|
425
|
+
* @example ['X-Tenant-ID', 'X-Request-ID']
|
|
426
|
+
*/
|
|
427
|
+
extractHeaders?: string[];
|
|
428
|
+
/**
|
|
429
|
+
* Mock mode: decode JWT without validation.
|
|
430
|
+
* In mock mode, the JWT payload is decoded without signature validation.
|
|
431
|
+
* This is useful for development/testing where tokens may be self-signed.
|
|
432
|
+
*
|
|
433
|
+
* @default true
|
|
434
|
+
*/
|
|
435
|
+
mockMode?: boolean;
|
|
436
|
+
/**
|
|
437
|
+
* Header name for the Authorization token.
|
|
438
|
+
*
|
|
439
|
+
* @default 'Authorization'
|
|
440
|
+
*/
|
|
441
|
+
authHeaderName?: string;
|
|
442
|
+
/**
|
|
443
|
+
* Token prefix to strip (e.g., 'Bearer ').
|
|
444
|
+
*
|
|
445
|
+
* @default 'Bearer '
|
|
446
|
+
*/
|
|
447
|
+
tokenPrefix?: string;
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* Create a context middleware that extracts execution context from headers.
|
|
451
|
+
*
|
|
452
|
+
* This middleware:
|
|
453
|
+
* 1. Extracts JWT payload from Authorization header
|
|
454
|
+
* 2. Extracts additional values from custom headers
|
|
455
|
+
* 3. Populates ctx.context for use by RLS middleware
|
|
456
|
+
*
|
|
457
|
+
* @param config - Context middleware configuration
|
|
458
|
+
* @returns A configured Middleware instance
|
|
459
|
+
*
|
|
460
|
+
* @example
|
|
461
|
+
* ```typescript
|
|
462
|
+
* const contextMiddleware = createContextMiddleware({
|
|
463
|
+
* mockMode: true, // Decode JWT without validation
|
|
464
|
+
* extractHeaders: ['X-Tenant-ID', 'X-Request-ID'],
|
|
465
|
+
* });
|
|
466
|
+
*
|
|
467
|
+
* // With custom decoder
|
|
468
|
+
* const contextMiddleware = createContextMiddleware({
|
|
469
|
+
* decodeToken: (token) => {
|
|
470
|
+
* // Validate and decode the token
|
|
471
|
+
* return jwt.verify(token, secret);
|
|
472
|
+
* },
|
|
473
|
+
* });
|
|
474
|
+
* ```
|
|
475
|
+
*/
|
|
476
|
+
declare function createContextMiddleware(config?: ContextMiddlewareConfig): Middleware;
|
|
477
|
+
/**
|
|
478
|
+
* Create a mock JWT token for testing.
|
|
479
|
+
* Encodes the payload as a JWT without signing.
|
|
480
|
+
*
|
|
481
|
+
* @param payload - The token payload
|
|
482
|
+
* @returns A mock JWT token string
|
|
483
|
+
*
|
|
484
|
+
* @example
|
|
485
|
+
* ```typescript
|
|
486
|
+
* const token = createMockJwt({
|
|
487
|
+
* sub: 'user-123',
|
|
488
|
+
* userId: 'user-123',
|
|
489
|
+
* role: 'admin',
|
|
490
|
+
* tenantId: 'tenant-456',
|
|
491
|
+
* });
|
|
492
|
+
*
|
|
493
|
+
* // Use in headers
|
|
494
|
+
* api._setHeaders({ Authorization: `Bearer ${token}` });
|
|
495
|
+
* ```
|
|
496
|
+
*/
|
|
497
|
+
declare function createMockJwt(payload: Record<string, unknown>): string;
|
|
498
|
+
|
|
499
|
+
/**
|
|
500
|
+
* RLS Middleware - Row-Level Security enforcement in middleware chain
|
|
501
|
+
*
|
|
502
|
+
* Applies row-level security policies before and after storage operations.
|
|
503
|
+
* Works with ctx.context populated by the context middleware.
|
|
504
|
+
*
|
|
505
|
+
* @module middleware/rls-middleware
|
|
506
|
+
* @category Middleware
|
|
507
|
+
*/
|
|
508
|
+
|
|
509
|
+
/**
|
|
510
|
+
* RLS filter function type.
|
|
511
|
+
* Returns true if the row passes the security check.
|
|
512
|
+
*/
|
|
513
|
+
type RLSFilter = (row: Record<string, unknown>, ctx: Record<string, unknown> | null) => boolean;
|
|
514
|
+
/**
|
|
515
|
+
* RLS filters for a single entity.
|
|
516
|
+
*/
|
|
517
|
+
interface RLSFilters {
|
|
518
|
+
/** Filter for SELECT/read operations */
|
|
519
|
+
select?: RLSFilter;
|
|
520
|
+
/** Filter for INSERT operations */
|
|
521
|
+
insert?: RLSFilter;
|
|
522
|
+
/** Filter for UPDATE operations */
|
|
523
|
+
update?: RLSFilter;
|
|
524
|
+
/** Filter for DELETE operations */
|
|
525
|
+
delete?: RLSFilter;
|
|
526
|
+
}
|
|
527
|
+
/**
|
|
528
|
+
* Configuration options for RLS middleware.
|
|
529
|
+
*/
|
|
530
|
+
interface RLSMiddlewareConfig {
|
|
531
|
+
/**
|
|
532
|
+
* Entity schemas with RLS configuration.
|
|
533
|
+
* Used for schema lookup during operations.
|
|
534
|
+
*/
|
|
535
|
+
schemas: Map<string, EntitySchema>;
|
|
536
|
+
/**
|
|
537
|
+
* Function to get RLS filters for all entities.
|
|
538
|
+
* Typically returns generated RLS filter functions.
|
|
539
|
+
*
|
|
540
|
+
* @returns Map of entity names to RLS filters
|
|
541
|
+
*/
|
|
542
|
+
getFilters: () => Record<string, RLSFilters>;
|
|
543
|
+
/**
|
|
544
|
+
* Enable debug logging.
|
|
545
|
+
*
|
|
546
|
+
* @default false
|
|
547
|
+
*/
|
|
548
|
+
debug?: boolean;
|
|
549
|
+
}
|
|
550
|
+
/**
|
|
551
|
+
* RLS Error thrown when a security check fails.
|
|
552
|
+
*/
|
|
553
|
+
declare class RLSError extends Error {
|
|
554
|
+
/** Error code for programmatic handling */
|
|
555
|
+
readonly code = "RLS_DENIED";
|
|
556
|
+
/** The entity that was accessed */
|
|
557
|
+
readonly entity: string;
|
|
558
|
+
/** The operation that was attempted */
|
|
559
|
+
readonly operation: string;
|
|
560
|
+
constructor(operation: string, entity: string);
|
|
561
|
+
}
|
|
562
|
+
/**
|
|
563
|
+
* Create an RLS middleware that enforces row-level security.
|
|
564
|
+
*
|
|
565
|
+
* This middleware:
|
|
566
|
+
* 1. Pre-checks write operations (insert, update, delete) before execution
|
|
567
|
+
* 2. Post-filters read operations (select) after execution
|
|
568
|
+
* 3. Uses ctx.context populated by context middleware
|
|
569
|
+
*
|
|
570
|
+
* @param config - RLS middleware configuration
|
|
571
|
+
* @returns A configured Middleware instance
|
|
572
|
+
*
|
|
573
|
+
* @example
|
|
574
|
+
* ```typescript
|
|
575
|
+
* const rlsMiddleware = createRLSMiddleware({
|
|
576
|
+
* schemas: schemaMap,
|
|
577
|
+
* getFilters: () => ({
|
|
578
|
+
* post: {
|
|
579
|
+
* select: (row, ctx) => row.published || row.authorId === ctx?.userId,
|
|
580
|
+
* insert: (row, ctx) => row.authorId === ctx?.userId,
|
|
581
|
+
* update: (row, ctx) => row.authorId === ctx?.userId,
|
|
582
|
+
* delete: (row, ctx) => row.authorId === ctx?.userId,
|
|
583
|
+
* },
|
|
584
|
+
* }),
|
|
585
|
+
* });
|
|
586
|
+
* ```
|
|
587
|
+
*/
|
|
588
|
+
declare function createRLSMiddleware(config: RLSMiddlewareConfig): Middleware;
|
|
589
|
+
/**
|
|
590
|
+
* Create a bypass check function from bypass conditions.
|
|
591
|
+
* Returns a function that checks if the context matches any bypass condition.
|
|
592
|
+
*
|
|
593
|
+
* @param bypassConditions - Array of { contextKey, values } conditions
|
|
594
|
+
* @returns A function that returns true if bypass should occur
|
|
595
|
+
*
|
|
596
|
+
* @example
|
|
597
|
+
* ```typescript
|
|
598
|
+
* const checkBypass = createBypassCheck([
|
|
599
|
+
* { contextKey: 'role', values: ['admin', 'superuser'] },
|
|
600
|
+
* ]);
|
|
601
|
+
*
|
|
602
|
+
* checkBypass({ role: 'admin' }); // true
|
|
603
|
+
* checkBypass({ role: 'user' }); // false
|
|
604
|
+
* ```
|
|
605
|
+
*/
|
|
606
|
+
declare function createBypassCheck(bypassConditions: Array<{
|
|
607
|
+
contextKey: string;
|
|
608
|
+
values: string[];
|
|
609
|
+
}>): (ctx: Record<string, unknown> | null) => boolean;
|
|
610
|
+
|
|
611
|
+
/**
|
|
612
|
+
* Middleware Defaults - Default ordering and configuration
|
|
613
|
+
*
|
|
614
|
+
* Provides sensible defaults for middleware ordering and common
|
|
615
|
+
* middleware chain configurations.
|
|
616
|
+
*
|
|
617
|
+
* @module middleware/defaults
|
|
618
|
+
* @category Middleware
|
|
619
|
+
*/
|
|
620
|
+
|
|
621
|
+
/**
|
|
622
|
+
* Default middleware execution order.
|
|
623
|
+
*
|
|
624
|
+
* The order is designed for optimal security and performance:
|
|
625
|
+
* 1. auth - Add authentication token to headers (must be first)
|
|
626
|
+
* 2. logger - Log request start (early for timing)
|
|
627
|
+
* 3. context - Extract context from headers (after auth adds token)
|
|
628
|
+
* 4. rls - Apply row-level security (needs context)
|
|
629
|
+
* 5. retry - Handle retries (wraps actual request)
|
|
630
|
+
* 6. cache - Check cache (before hitting storage)
|
|
631
|
+
*
|
|
632
|
+
* After hooks execute in reverse order.
|
|
633
|
+
*/
|
|
634
|
+
declare const DEFAULT_MIDDLEWARE_ORDER: string[];
|
|
635
|
+
/**
|
|
636
|
+
* Sort middleware array according to a specified order.
|
|
637
|
+
* Unknown middleware are placed at the end in their original order.
|
|
638
|
+
*
|
|
639
|
+
* @param middlewares - Array of middleware to sort
|
|
640
|
+
* @param customOrder - Optional custom order array (defaults to DEFAULT_MIDDLEWARE_ORDER)
|
|
641
|
+
* @returns Sorted middleware array
|
|
642
|
+
*
|
|
643
|
+
* @example
|
|
644
|
+
* ```typescript
|
|
645
|
+
* const sorted = orderMiddleware([
|
|
646
|
+
* createCacheMiddleware(),
|
|
647
|
+
* createAuthMiddleware(),
|
|
648
|
+
* createLoggerMiddleware(),
|
|
649
|
+
* ]);
|
|
650
|
+
* // => [auth, logger, cache]
|
|
651
|
+
* ```
|
|
652
|
+
*/
|
|
653
|
+
declare function orderMiddleware(middlewares: Middleware[], customOrder?: string[]): Middleware[];
|
|
654
|
+
/**
|
|
655
|
+
* Filter middleware by enabled/disabled state and names.
|
|
656
|
+
*
|
|
657
|
+
* @param middlewares - Array of middleware to filter
|
|
658
|
+
* @param enabled - Middleware names to enable (if empty, all are enabled)
|
|
659
|
+
* @param disabled - Middleware names to disable
|
|
660
|
+
* @returns Filtered middleware array
|
|
661
|
+
*
|
|
662
|
+
* @example
|
|
663
|
+
* ```typescript
|
|
664
|
+
* const filtered = filterMiddleware(
|
|
665
|
+
* middlewares,
|
|
666
|
+
* [], // Enable all
|
|
667
|
+
* ['cache'] // But disable cache
|
|
668
|
+
* );
|
|
669
|
+
* ```
|
|
670
|
+
*/
|
|
671
|
+
declare function filterMiddleware(middlewares: Middleware[], enabled?: string[], disabled?: string[]): Middleware[];
|
|
672
|
+
/**
|
|
673
|
+
* Middleware configuration preset for mock/development mode.
|
|
674
|
+
* Includes auth, context, and logger.
|
|
675
|
+
*/
|
|
676
|
+
declare const MOCK_MIDDLEWARE_PRESET: string[];
|
|
677
|
+
/**
|
|
678
|
+
* Middleware configuration preset for production mode.
|
|
679
|
+
* Includes all middleware with caching and retries.
|
|
680
|
+
*/
|
|
681
|
+
declare const PRODUCTION_MIDDLEWARE_PRESET: string[];
|
|
682
|
+
/**
|
|
683
|
+
* Middleware configuration preset for testing.
|
|
684
|
+
* Minimal middleware for fast test execution.
|
|
685
|
+
*/
|
|
686
|
+
declare const TEST_MIDDLEWARE_PRESET: string[];
|
|
687
|
+
|
|
688
|
+
export { type AuthMiddlewareConfig, type CacheEntry, type CacheMiddlewareConfig, type CacheStorage, type ContextMiddlewareConfig, DEFAULT_MIDDLEWARE_ORDER, type LogLevel, type LoggerMiddlewareConfig, MOCK_MIDDLEWARE_PRESET, MemoryCacheStorage, Middleware, MiddlewareChain, MiddlewareContext, PRODUCTION_MIDDLEWARE_PRESET, RLSError, type RLSFilter, type RLSFilters, type RLSMiddlewareConfig, type RetryMiddlewareConfig, TEST_MIDDLEWARE_PRESET, createAuthMiddleware, createBypassCheck, createCacheInvalidator, createCacheMiddleware, createContextMiddleware, createLoggerMiddleware, createMiddlewareChain, createMockJwt, createRLSMiddleware, createRetryMiddleware, createSilentLogger, createVerboseLogger, filterMiddleware, orderMiddleware };
|