glasswork 0.3.1 → 0.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 +5 -3
- package/dist/http/route-helpers.d.ts +77 -4
- package/dist/http/route-helpers.d.ts.map +1 -1
- package/dist/http/route-helpers.js +90 -32
- package/dist/http/route-helpers.js.map +1 -1
- package/dist/index.d.ts +5 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -6
- package/dist/index.js.map +1 -1
- package/dist/list-query/builder.d.ts.map +1 -1
- package/dist/list-query/builder.js +3 -1
- package/dist/list-query/builder.js.map +1 -1
- package/dist/list-query/casl.d.ts.map +1 -1
- package/dist/list-query/casl.js +7 -1
- package/dist/list-query/casl.js.map +1 -1
- package/dist/list-query/index.d.ts +2 -2
- package/dist/list-query/index.d.ts.map +1 -1
- package/dist/list-query/index.js +1 -1
- package/dist/list-query/index.js.map +1 -1
- package/dist/openapi/openapi-transformer.d.ts +5 -0
- package/dist/openapi/openapi-transformer.d.ts.map +1 -1
- package/dist/openapi/openapi-transformer.js +5 -0
- package/dist/openapi/openapi-transformer.js.map +1 -1
- package/dist/openapi/openapi.d.ts.map +1 -1
- package/dist/openapi/openapi.js +6 -24
- package/dist/openapi/openapi.js.map +1 -1
- package/dist/utils/serialize-prisma-types.d.ts +178 -0
- package/dist/utils/serialize-prisma-types.d.ts.map +1 -0
- package/dist/utils/serialize-prisma-types.js +143 -0
- package/dist/utils/serialize-prisma-types.js.map +1 -0
- package/package.json +21 -11
package/README.md
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
# Glasswork
|
|
2
2
|
|
|
3
|
-
[](https://www.npmjs.com/package/glasswork)
|
|
4
|
+
[](https://www.npmjs.com/package/glasswork)
|
|
5
|
+
[](https://github.com/rolandboon/glasswork/actions/workflows/ci.yml)
|
|
6
|
+
[](https://opensource.org/licenses/MIT)
|
|
4
7
|
[](https://www.typescriptlang.org/)
|
|
5
|
-
[](https://github.com/yourusername/glasswork)
|
|
6
8
|
|
|
7
9
|
**A transparent, serverless-optimized web framework for building OpenAPI-compliant REST APIs.**
|
|
8
10
|
|
|
@@ -149,7 +151,7 @@ export default app; // Ready for Lambda or local server
|
|
|
149
151
|
|
|
150
152
|
## Requirements
|
|
151
153
|
|
|
152
|
-
- Node.js
|
|
154
|
+
- Node.js 20+
|
|
153
155
|
- TypeScript 5+
|
|
154
156
|
|
|
155
157
|
## Contributing
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import type { Context, Hono, MiddlewareHandler } from 'hono';
|
|
2
|
-
import type
|
|
2
|
+
import { type DescribeRouteOptions } from 'hono-openapi';
|
|
3
3
|
import type { BaseIssue, BaseSchema, BaseSchemaAsync, InferOutput } from 'valibot';
|
|
4
4
|
import type { OpenAPIResponseHook } from '../core/types.js';
|
|
5
|
+
import { type AcceptPrismaTypes, type SerializationConfig } from '../utils/serialize-prisma-types.js';
|
|
5
6
|
/**
|
|
6
7
|
* Set the global OpenAPI response hooks.
|
|
7
8
|
* This is called during bootstrap and makes hooks available to route definitions.
|
|
@@ -99,8 +100,10 @@ export declare function createRoutes<TServices = Record<string, unknown>>(factor
|
|
|
99
100
|
*
|
|
100
101
|
* @template TBody - The body schema (automatically inferred)
|
|
101
102
|
* @template TResponses - The responses object (automatically inferred)
|
|
103
|
+
* @template TPublic - Whether the route is public (affects session typing)
|
|
104
|
+
* @template TStrictTypes - Whether to enforce strict return types (no automatic Prisma type acceptance)
|
|
102
105
|
*/
|
|
103
|
-
export interface RouteConfig<TBody extends ValibotSchema | undefined = undefined, TResponses extends Partial<Record<keyof typeof STATUS_DESCRIPTIONS, ValibotSchema | undefined>> = Record<never, never>, TPublic extends boolean = false> {
|
|
106
|
+
export interface RouteConfig<TBody extends ValibotSchema | undefined = undefined, TResponses extends Partial<Record<keyof typeof STATUS_DESCRIPTIONS, ValibotSchema | undefined>> = Record<never, never>, TPublic extends boolean = false, TStrictTypes extends boolean = false> {
|
|
104
107
|
tags?: string[];
|
|
105
108
|
summary?: string;
|
|
106
109
|
description?: string;
|
|
@@ -124,11 +127,81 @@ export interface RouteConfig<TBody extends ValibotSchema | undefined = undefined
|
|
|
124
127
|
* Enable pagination - adds pagination query params and response headers to OpenAPI spec
|
|
125
128
|
*/
|
|
126
129
|
paginate?: boolean;
|
|
130
|
+
/**
|
|
131
|
+
* Enforce strict return types (requires explicit type assertions for Prisma objects)
|
|
132
|
+
*
|
|
133
|
+
* - false (default): Handler can return Prisma types (Date/Decimal) which are auto-serialized
|
|
134
|
+
* - true: Handler must return exact schema types (requires explicit casting)
|
|
135
|
+
*
|
|
136
|
+
* @default false
|
|
137
|
+
*
|
|
138
|
+
* @example
|
|
139
|
+
* ```typescript
|
|
140
|
+
* // strictTypes: false (default) - Prisma types accepted
|
|
141
|
+
* handler: async () => {
|
|
142
|
+
* const user = await prisma.user.findUnique({ where: { id } });
|
|
143
|
+
* return user; // ✅ Works - Date/Decimal auto-serialized
|
|
144
|
+
* }
|
|
145
|
+
*
|
|
146
|
+
* // strictTypes: true - Exact types required
|
|
147
|
+
* handler: async () => {
|
|
148
|
+
* const user = await prisma.user.findUnique({ where: { id } });
|
|
149
|
+
* return user as UserResponse; // Type assertion needed
|
|
150
|
+
* }
|
|
151
|
+
* ```
|
|
152
|
+
*/
|
|
153
|
+
strictTypes?: TStrictTypes;
|
|
154
|
+
/**
|
|
155
|
+
* Custom serialization configuration for response data
|
|
156
|
+
*
|
|
157
|
+
* Allows you to add custom type transformers in addition to the default Date/Decimal handling.
|
|
158
|
+
* Your custom transformers are prepended to the default transformers, so they take precedence.
|
|
159
|
+
*
|
|
160
|
+
* @example
|
|
161
|
+
* ```typescript
|
|
162
|
+
* // Define custom transformer for Money class
|
|
163
|
+
* const moneyTransformer = (value: unknown) => {
|
|
164
|
+
* if (value instanceof Money) {
|
|
165
|
+
* return { amount: value.amount, currency: value.currency };
|
|
166
|
+
* }
|
|
167
|
+
* return undefined;
|
|
168
|
+
* };
|
|
169
|
+
*
|
|
170
|
+
* route({
|
|
171
|
+
* responses: { 200: ProductSchema },
|
|
172
|
+
* serialization: {
|
|
173
|
+
* transformers: [moneyTransformer]
|
|
174
|
+
* },
|
|
175
|
+
* handler: async () => {
|
|
176
|
+
* return {
|
|
177
|
+
* price: new Money(99.99, 'USD'), // Auto-serialized
|
|
178
|
+
* createdAt: new Date(), // Still handled by default transformer
|
|
179
|
+
* };
|
|
180
|
+
* }
|
|
181
|
+
* })
|
|
182
|
+
* ```
|
|
183
|
+
*/
|
|
184
|
+
serialization?: Partial<SerializationConfig>;
|
|
127
185
|
/**
|
|
128
186
|
* Route handler - body and return types are automatically inferred from schemas
|
|
129
187
|
* Session is required by default (unless public: true)
|
|
188
|
+
*
|
|
189
|
+
* **Return type behavior (controlled by strictTypes option):**
|
|
190
|
+
*
|
|
191
|
+
* When strictTypes is false (default):
|
|
192
|
+
* - Uses `AcceptPrismaTypes<T>` which allows Date/Decimal objects
|
|
193
|
+
* - Date objects are automatically converted to ISO strings
|
|
194
|
+
* - Decimal objects are automatically converted to numbers
|
|
195
|
+
* - ALL string fields accept Date, ALL number fields accept Decimal
|
|
196
|
+
* - Pragmatic for Prisma integration, but permissive typing
|
|
197
|
+
*
|
|
198
|
+
* When strictTypes is true:
|
|
199
|
+
* - Requires exact schema types (no automatic Prisma type acceptance)
|
|
200
|
+
* - Provides stricter type safety
|
|
201
|
+
* - Requires explicit type assertions when returning Prisma objects
|
|
202
|
+
* - Serialization still works at runtime, but types are enforced
|
|
130
203
|
*/
|
|
131
|
-
handler: (context: RouteContext<TBody extends ValibotSchema ? InferSchemaType<TBody> : never, TPublic extends true ? false : true>) => Promise<InferResponseType<TResponses>> | InferResponseType<TResponses
|
|
204
|
+
handler: (context: RouteContext<TBody extends ValibotSchema ? InferSchemaType<TBody> : never, TPublic extends true ? false : true>) => TStrictTypes extends true ? Promise<InferResponseType<TResponses>> | InferResponseType<TResponses> : Promise<AcceptPrismaTypes<InferResponseType<TResponses>>> | AcceptPrismaTypes<InferResponseType<TResponses>>;
|
|
132
205
|
}
|
|
133
206
|
/**
|
|
134
207
|
* Route handler context with typed body
|
|
@@ -219,6 +292,6 @@ export interface RouteContext<TBody = never, TSessionRequired extends boolean =
|
|
|
219
292
|
* })
|
|
220
293
|
* ```
|
|
221
294
|
*/
|
|
222
|
-
export declare function route<TBody extends ValibotSchema | undefined = undefined, TResponses extends Partial<Record<keyof typeof STATUS_DESCRIPTIONS, ValibotSchema | undefined>> = Record<never, never>, TPublic extends boolean = false>(config: RouteConfig<TBody, TResponses, TPublic>): MiddlewareHandler[];
|
|
295
|
+
export declare function route<TBody extends ValibotSchema | undefined = undefined, TResponses extends Partial<Record<keyof typeof STATUS_DESCRIPTIONS, ValibotSchema | undefined>> = Record<never, never>, TPublic extends boolean = false, TStrictTypes extends boolean = false>(config: RouteConfig<TBody, TResponses, TPublic, TStrictTypes>): MiddlewareHandler[];
|
|
223
296
|
export {};
|
|
224
297
|
//# sourceMappingURL=route-helpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-helpers.d.ts","sourceRoot":"","sources":["../../src/http/route-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAE7D,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"route-helpers.d.ts","sourceRoot":"","sources":["../../src/http/route-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { describeRoute as honoDescribeRoute } from 'hono-openapi';
|
|
2
|
-
import { resolver, validator } from 'hono-openapi/valibot';
|
|
1
|
+
import { describeRoute as honoDescribeRoute, resolver, validator, } from 'hono-openapi';
|
|
3
2
|
import { safeParseAsync } from 'valibot';
|
|
4
3
|
import { getClientIp } from '../utils/get-client-ip.js';
|
|
5
4
|
import { createLogger } from '../utils/logger.js';
|
|
5
|
+
import { defaultConfig as defaultSerializationConfig, serializePrismaTypes, } from '../utils/serialize-prisma-types.js';
|
|
6
6
|
/**
|
|
7
7
|
* Logger instance for route helpers
|
|
8
8
|
*/
|
|
@@ -162,49 +162,98 @@ export function route(config) {
|
|
|
162
162
|
if (config.body) {
|
|
163
163
|
middlewares.push(validator('json', config.body, (result, c) => {
|
|
164
164
|
if (!result.success) {
|
|
165
|
-
return c.json({ error: 'Validation failed', issues: result.
|
|
165
|
+
return c.json({ error: 'Validation failed', issues: result.error }, 422);
|
|
166
166
|
}
|
|
167
167
|
}));
|
|
168
168
|
}
|
|
169
169
|
if (config.query) {
|
|
170
170
|
middlewares.push(validator('query', config.query, (result, c) => {
|
|
171
171
|
if (!result.success) {
|
|
172
|
-
return c.json({ error: 'Validation failed', issues: result.
|
|
172
|
+
return c.json({ error: 'Validation failed', issues: result.error }, 422);
|
|
173
173
|
}
|
|
174
174
|
}));
|
|
175
175
|
}
|
|
176
176
|
if (config.params) {
|
|
177
177
|
middlewares.push(validator('param', config.params, (result, c) => {
|
|
178
178
|
if (!result.success) {
|
|
179
|
-
return c.json({ error: 'Validation failed', issues: result.
|
|
179
|
+
return c.json({ error: 'Validation failed', issues: result.error }, 422);
|
|
180
180
|
}
|
|
181
181
|
}));
|
|
182
182
|
}
|
|
183
183
|
// Add handler wrapper
|
|
184
184
|
middlewares.push(async (c) => {
|
|
185
185
|
const routeContext = buildRouteContext(c);
|
|
186
|
-
const result = await config.handler(
|
|
187
|
-
|
|
188
|
-
routeContext);
|
|
189
|
-
// If handler returned a Response, return it directly (for custom responses like text)
|
|
190
|
-
if (result instanceof Response) {
|
|
191
|
-
return result;
|
|
192
|
-
}
|
|
193
|
-
// Return appropriate response
|
|
194
|
-
if (result === null || result === undefined) {
|
|
195
|
-
c.status(204);
|
|
196
|
-
return c.body(null);
|
|
197
|
-
}
|
|
198
|
-
// Parse and validate response through schema (strips extra keys and determines status code)
|
|
199
|
-
const { data: parsedResult, statusCode } = await parseResponse(result, config.responses);
|
|
200
|
-
// Automatically set the status code based on which schema matched
|
|
201
|
-
if (statusCode) {
|
|
202
|
-
c.status(statusCode);
|
|
203
|
-
}
|
|
204
|
-
return c.json(parsedResult);
|
|
186
|
+
const result = await config.handler(routeContext);
|
|
187
|
+
return handleResponse(result, config.responses, config.serialization, config.summary, c);
|
|
205
188
|
});
|
|
206
189
|
return middlewares;
|
|
207
190
|
}
|
|
191
|
+
/**
|
|
192
|
+
* Serialize response data with custom transformers and default Prisma type handling.
|
|
193
|
+
*
|
|
194
|
+
* @param data - The raw response data from the handler
|
|
195
|
+
* @param serializationConfig - Optional custom serialization configuration
|
|
196
|
+
* @returns Serialized data with Prisma types converted to JSON-safe types
|
|
197
|
+
* @throws Error if circular reference or max depth is exceeded
|
|
198
|
+
*/
|
|
199
|
+
function serializeResponseData(data, serializationConfig) {
|
|
200
|
+
const config = serializationConfig
|
|
201
|
+
? {
|
|
202
|
+
transformers: [
|
|
203
|
+
...(serializationConfig.transformers || []),
|
|
204
|
+
...defaultSerializationConfig.transformers,
|
|
205
|
+
],
|
|
206
|
+
}
|
|
207
|
+
: defaultSerializationConfig;
|
|
208
|
+
return serializePrismaTypes(data, config);
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Handle response serialization and validation, including error handling.
|
|
212
|
+
*
|
|
213
|
+
* @param result - The raw result from the handler
|
|
214
|
+
* @param responses - The response schemas configuration
|
|
215
|
+
* @param serializationConfig - Optional custom serialization configuration
|
|
216
|
+
* @param routeSummary - Route summary for logging
|
|
217
|
+
* @param context - Hono context
|
|
218
|
+
* @returns Response object or undefined if handled
|
|
219
|
+
*/
|
|
220
|
+
async function handleResponse(result, responses, serializationConfig, routeSummary, context) {
|
|
221
|
+
// If handler returned a Response, return it directly (for custom responses like text)
|
|
222
|
+
if (result instanceof Response) {
|
|
223
|
+
return result;
|
|
224
|
+
}
|
|
225
|
+
// Handle empty responses
|
|
226
|
+
if (result === null || result === undefined) {
|
|
227
|
+
context.status(204);
|
|
228
|
+
return context.body(null);
|
|
229
|
+
}
|
|
230
|
+
// Serialize Prisma types and custom transformers
|
|
231
|
+
let serializedResult;
|
|
232
|
+
try {
|
|
233
|
+
serializedResult = serializeResponseData(result, serializationConfig);
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
// Handle serialization errors (circular references, max depth exceeded)
|
|
237
|
+
logger.error('Failed to serialize response data', {
|
|
238
|
+
error: error instanceof Error ? error.message : String(error),
|
|
239
|
+
route: routeSummary || 'unknown',
|
|
240
|
+
});
|
|
241
|
+
// In production, don't leak error details
|
|
242
|
+
const errorMessage = process.env.NODE_ENV === 'production'
|
|
243
|
+
? 'Failed to serialize response data'
|
|
244
|
+
: error instanceof Error
|
|
245
|
+
? error.message
|
|
246
|
+
: String(error);
|
|
247
|
+
return context.json({ error: 'Internal Server Error', message: errorMessage }, 500);
|
|
248
|
+
}
|
|
249
|
+
// Parse and validate response through schema
|
|
250
|
+
const { data: parsedResult, statusCode } = await parseResponse(serializedResult, responses);
|
|
251
|
+
// Set status code if determined by schema matching
|
|
252
|
+
if (statusCode) {
|
|
253
|
+
context.status(statusCode);
|
|
254
|
+
}
|
|
255
|
+
return context.json(parsedResult);
|
|
256
|
+
}
|
|
208
257
|
/**
|
|
209
258
|
* Parse and validate response data through the appropriate success/redirect schema.
|
|
210
259
|
* Tries each 2xx and 3xx schema in order until one successfully validates.
|
|
@@ -236,12 +285,19 @@ async function parseResponse(data, responses) {
|
|
|
236
285
|
return { data: result.output, statusCode };
|
|
237
286
|
}
|
|
238
287
|
}
|
|
239
|
-
// No schema matched -
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
288
|
+
// No schema matched - this is a potential security issue in production
|
|
289
|
+
if (process.env.NODE_ENV === 'production') {
|
|
290
|
+
// In production, throw an error to prevent leaking unvalidated data
|
|
291
|
+
// This could expose sensitive fields that should have been stripped
|
|
292
|
+
logger.error('Response data does not match any defined success/redirect schema. ' +
|
|
293
|
+
'Refusing to return unvalidated data in production.');
|
|
294
|
+
throw new Error('Response validation failed: Data does not match any defined response schema. ' +
|
|
295
|
+
'This prevents potentially sensitive data from being leaked.');
|
|
244
296
|
}
|
|
297
|
+
// In development, log a warning and return data as-is for debugging
|
|
298
|
+
logger.warn('Response data does not match any defined success/redirect schema. ' +
|
|
299
|
+
'Data will be returned as-is without validation or key stripping. ' +
|
|
300
|
+
'This would throw an error in production.');
|
|
245
301
|
return { data };
|
|
246
302
|
}
|
|
247
303
|
function buildOpenAPIMiddleware(config) {
|
|
@@ -319,8 +375,9 @@ function buildOpenAPIResponses(config) {
|
|
|
319
375
|
content: {
|
|
320
376
|
'application/json': {
|
|
321
377
|
// resolver type only supports BaseSchema, but works with BaseSchemaAsync at runtime
|
|
322
|
-
|
|
323
|
-
|
|
378
|
+
schema: resolver(schema, {
|
|
379
|
+
errorMode: 'ignore',
|
|
380
|
+
}),
|
|
324
381
|
},
|
|
325
382
|
},
|
|
326
383
|
}
|
|
@@ -356,13 +413,14 @@ function buildRouteContext(c) {
|
|
|
356
413
|
const req = c.req;
|
|
357
414
|
// Spread all context variables (from ContextVariableMap)
|
|
358
415
|
// This includes session, ability, role, and any other middleware-added variables
|
|
416
|
+
// Return with TSessionRequired=false to allow undefined session
|
|
417
|
+
// The type will be narrowed at the call site based on the route's public setting
|
|
359
418
|
return {
|
|
360
419
|
...c.var,
|
|
361
420
|
body: req.valid('json'),
|
|
362
421
|
query: req.valid('query'),
|
|
363
422
|
params: req.valid('param'),
|
|
364
423
|
services: c.get('services') || {},
|
|
365
|
-
// @ts-expect-error - Session typing works at compile time via ContextVariableMap
|
|
366
424
|
session: c.get('session'),
|
|
367
425
|
ip: getClientIp(c),
|
|
368
426
|
userAgent: c.req.header('user-agent'),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-helpers.js","sourceRoot":"","sources":["../../src/http/route-helpers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"route-helpers.js","sourceRoot":"","sources":["../../src/http/route-helpers.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -18,14 +18,13 @@ export { type ErrorResponse, ErrorResponseDto, type ValidationErrorResponse, Val
|
|
|
18
18
|
export { BadGatewayException, BadRequestException, ConflictException, DomainException, ForbiddenException, GatewayTimeoutException, GoneException, InternalServerErrorException, LockedException, MethodNotAllowedException, NotFoundException, NotImplementedException, PayloadTooLargeException, PreconditionFailedException, RequestTimeoutException, ServiceUnavailableException, TooManyRequestsException, UnauthorizedException, UnprocessableEntityException, UnsupportedMediaTypeException, ValidationException, } from './http/errors.js';
|
|
19
19
|
export type { RouteConfig, RouteContext, RouteFactory, ValibotSchema, } from './http/route-helpers.js';
|
|
20
20
|
export { createRoutes, route } from './http/route-helpers.js';
|
|
21
|
+
export { createCaslScope, withCaslScope } from './list-query/casl.js';
|
|
22
|
+
export type { FieldPath, FilterOperator, ParsedFilter, ParsedQueryParams, ParsedSort, PrismaListParams, RawQueryParams, SchemaValidationConfig, SearchFieldInput, SortDirection, ValidatedListParams, } from './list-query/index.js';
|
|
23
|
+
export { booleanFilterSchema, createFilterSchema, createListQuery, createSortSchema, dateFilterSchema, enumFilterSchema, type ListQueryBuilder, type ListQueryConfig, ListQuerySchema, numberFilterSchema, type PaginatedResult, relationFilterSchema, sortDirectionSchema, stringFilterSchema, } from './list-query/index.js';
|
|
21
24
|
export { createRateLimitMiddleware } from './middleware/rate-limit.js';
|
|
22
25
|
export { defaultOpenAPIComponents } from './openapi/defaults.js';
|
|
23
26
|
export { createCorsHeadersHook, createPaginationHeadersHook, createRateLimitHeadersHook, } from './openapi/hooks.js';
|
|
24
27
|
export { configureOpenAPI } from './openapi/openapi.js';
|
|
25
|
-
export { transformOpenAPIDocument } from './openapi/openapi-transformer.js';
|
|
26
|
-
export { booleanFilterSchema, createFilterSchema, createListQuery, createSortSchema, dateFilterSchema, enumFilterSchema, type ListQueryBuilder, type ListQueryConfig, ListQuerySchema, numberFilterSchema, type PaginatedResult, relationFilterSchema, sortDirectionSchema, stringFilterSchema, } from './list-query/index.js';
|
|
27
|
-
export type { FieldPath, FilterOperator, ParsedFilter, ParsedQueryParams, ParsedSort, PrismaListParams, RawQueryParams, SchemaValidationConfig, SearchFieldInput, SortDirection, ValidatedListParams, } from './list-query/index.js';
|
|
28
|
-
export { createCaslScope, withCaslScope } from './list-query/casl.js';
|
|
29
28
|
export { deepMerge } from './utils/deep-merge.js';
|
|
30
29
|
export { isDevelopment, isLambda, isProduction, isTest } from './utils/environment.js';
|
|
31
30
|
export { getClientIp } from './utils/get-client-ip.js';
|
|
@@ -33,6 +32,6 @@ export type { Logger } from './utils/logger.js';
|
|
|
33
32
|
export { createLogger, createPlainLogger, defaultLogger } from './utils/logger.js';
|
|
34
33
|
export { omit } from './utils/omit.js';
|
|
35
34
|
export { pick } from './utils/pick.js';
|
|
36
|
-
export type {
|
|
37
|
-
export {
|
|
35
|
+
export type { AcceptPrismaTypes, SerializationConfig, SerializedTypes, TypeTransformer, } from './utils/serialize-prisma-types.js';
|
|
36
|
+
export { defaultConfig, serializePrismaTypes } from './utils/serialize-prisma-types.js';
|
|
38
37
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,YAAY,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAC9C,YAAY,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC/C,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAG/C,OAAO,EACL,KAAK,MAAM,EACX,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,yBAAyB,EACzB,YAAY,EACZ,KAAK,qBAAqB,EAC1B,cAAc,EACd,KAAK,kBAAkB,EACvB,WAAW,EACX,cAAc,EACd,UAAU,EACV,YAAY,EACZ,SAAS,EACT,KAAK,kBAAkB,EACvB,WAAW,EACX,WAAW,EACX,WAAW,EACX,cAAc,GACf,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,oBAAoB,EACpB,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,GACb,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAClF,OAAO,EACL,KAAK,aAAa,EAClB,gBAAgB,EAChB,KAAK,uBAAuB,EAC5B,0BAA0B,EAC1B,KAAK,eAAe,EACpB,kBAAkB,GACnB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,uBAAuB,EACvB,aAAa,EACb,4BAA4B,EAC5B,eAAe,EACf,yBAAyB,EACzB,iBAAiB,EACjB,uBAAuB,EACvB,wBAAwB,EACxB,2BAA2B,EAC3B,uBAAuB,EACvB,2BAA2B,EAC3B,wBAAwB,EACxB,qBAAqB,EACrB,4BAA4B,EAC5B,6BAA6B,EAC7B,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,aAAa,GACd,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -16,17 +16,16 @@ export { createErrorHandler, defaultErrorHandler } from './http/error-handler.js
|
|
|
16
16
|
export { ErrorResponseDto, ValidationErrorResponseDto, ValidationIssueDto, } from './http/error-response.dto.js';
|
|
17
17
|
export { BadGatewayException, BadRequestException, ConflictException, DomainException, ForbiddenException, GatewayTimeoutException, GoneException, InternalServerErrorException, LockedException, MethodNotAllowedException, NotFoundException, NotImplementedException, PayloadTooLargeException, PreconditionFailedException, RequestTimeoutException, ServiceUnavailableException, TooManyRequestsException, UnauthorizedException, UnprocessableEntityException, UnsupportedMediaTypeException, ValidationException, } from './http/errors.js';
|
|
18
18
|
export { createRoutes, route } from './http/route-helpers.js';
|
|
19
|
+
// Optional CASL integration
|
|
20
|
+
export { createCaslScope, withCaslScope } from './list-query/casl.js';
|
|
21
|
+
// List Query (Prisma filtering/sorting/pagination)
|
|
22
|
+
export { booleanFilterSchema, createFilterSchema, createListQuery, createSortSchema, dateFilterSchema, enumFilterSchema, ListQuerySchema, numberFilterSchema, relationFilterSchema, sortDirectionSchema, stringFilterSchema, } from './list-query/index.js';
|
|
19
23
|
// Middleware
|
|
20
24
|
export { createRateLimitMiddleware } from './middleware/rate-limit.js';
|
|
21
25
|
// OpenAPI
|
|
22
26
|
export { defaultOpenAPIComponents } from './openapi/defaults.js';
|
|
23
27
|
export { createCorsHeadersHook, createPaginationHeadersHook, createRateLimitHeadersHook, } from './openapi/hooks.js';
|
|
24
28
|
export { configureOpenAPI } from './openapi/openapi.js';
|
|
25
|
-
export { transformOpenAPIDocument } from './openapi/openapi-transformer.js';
|
|
26
|
-
// List Query (Prisma filtering/sorting/pagination)
|
|
27
|
-
export { booleanFilterSchema, createFilterSchema, createListQuery, createSortSchema, dateFilterSchema, enumFilterSchema, ListQuerySchema, numberFilterSchema, relationFilterSchema, sortDirectionSchema, stringFilterSchema, } from './list-query/index.js';
|
|
28
|
-
// Optional CASL integration
|
|
29
|
-
export { createCaslScope, withCaslScope } from './list-query/casl.js';
|
|
30
29
|
// Utilities
|
|
31
30
|
export { deepMerge } from './utils/deep-merge.js';
|
|
32
31
|
export { isDevelopment, isLambda, isProduction, isTest } from './utils/environment.js';
|
|
@@ -34,5 +33,5 @@ export { getClientIp } from './utils/get-client-ip.js';
|
|
|
34
33
|
export { createLogger, createPlainLogger, defaultLogger } from './utils/logger.js';
|
|
35
34
|
export { omit } from './utils/omit.js';
|
|
36
35
|
export { pick } from './utils/pick.js';
|
|
37
|
-
export {
|
|
36
|
+
export { defaultConfig, serializePrismaTypes } from './utils/serialize-prisma-types.js';
|
|
38
37
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,gBAAgB;AAChB,OAAO,EAIL,yBAAyB,EACzB,YAAY,EAEZ,cAAc,EAEd,WAAW,EACX,cAAc,EACd,UAAU,EACV,YAAY,EACZ,SAAS,EAET,WAAW,EACX,WAAW,EACX,WAAW,EACX,cAAc,GACf,MAAM,mBAAmB,CAAC;AAE3B,iBAAiB;AACjB,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAkBhD,eAAe;AACf,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAClF,OAAO,EAEL,gBAAgB,EAEhB,0BAA0B,EAE1B,kBAAkB,GACnB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,uBAAuB,EACvB,aAAa,EACb,4BAA4B,EAC5B,eAAe,EACf,yBAAyB,EACzB,iBAAiB,EACjB,uBAAuB,EACvB,wBAAwB,EACxB,2BAA2B,EAC3B,uBAAuB,EACvB,2BAA2B,EAC3B,wBAAwB,EACxB,qBAAqB,EACrB,4BAA4B,EAC5B,6BAA6B,EAC7B,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAO1B,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,gBAAgB;AAChB,OAAO,EAIL,yBAAyB,EACzB,YAAY,EAEZ,cAAc,EAEd,WAAW,EACX,cAAc,EACd,UAAU,EACV,YAAY,EACZ,SAAS,EAET,WAAW,EACX,WAAW,EACX,WAAW,EACX,cAAc,GACf,MAAM,mBAAmB,CAAC;AAE3B,iBAAiB;AACjB,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAkBhD,eAAe;AACf,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAClF,OAAO,EAEL,gBAAgB,EAEhB,0BAA0B,EAE1B,kBAAkB,GACnB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,uBAAuB,EACvB,aAAa,EACb,4BAA4B,EAC5B,eAAe,EACf,yBAAyB,EACzB,iBAAiB,EACjB,uBAAuB,EACvB,wBAAwB,EACxB,2BAA2B,EAC3B,uBAAuB,EACvB,2BAA2B,EAC3B,wBAAwB,EACxB,qBAAqB,EACrB,4BAA4B,EAC5B,6BAA6B,EAC7B,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAO1B,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAC9D,4BAA4B;AAC5B,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AActE,mDAAmD;AACnD,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAGhB,eAAe,EACf,kBAAkB,EAElB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAC/B,aAAa;AACb,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,UAAU;AACV,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EACL,qBAAqB,EACrB,2BAA2B,EAC3B,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,YAAY;AACZ,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACvF,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACnF,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAOvC,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/list-query/builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAIlE,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/list-query/builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAIlE,OAAO,KAAK,EAGV,cAAc,EACd,gBAAgB,EACjB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAGlF,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe,CAC9B,YAAY,SAAS,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,EACrE,cAAc,SAAS,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IAEvE,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,IAAI,CAAC,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,gBAAgB,EAAE,CAAC;CAC/C;AAED,qBAAa,gBAAgB,CAC3B,YAAY,SAAS,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,EACrE,cAAc,SAAS,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IAYrE,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,gBAAgB,CAAC;IAX3B,OAAO,CAAC,WAAW,CAAC,CAAoB;IACxC,OAAO,CAAC,YAAY,CAAC,CAAmB;IACxC,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,OAAO,CAAC,CAAU;IAC1B,OAAO,CAAC,eAAe,CAAiC;IACxD,OAAO,CAAC,WAAW,CAAC,CAEmC;gBAG7C,MAAM,EAAE,eAAe,CAAC,YAAY,EAAE,cAAc,CAAC,EACrD,gBAAgB,CAAC,EAAE,sBAAsB,CAAC,YAAY,EAAE,cAAc,CAAC,YAAA;IAGjF,KAAK,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI;IAgBrD,KAAK,CAAC,UAAU,EAAE,WAAW,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAO5E,QAAQ,IAAI,IAAI;IAKhB,SAAS,CACP,EAAE,EAAE,CACF,MAAM,EAAE,mBAAmB,CAAC,YAAY,EAAE,cAAc,CAAC,KACtD,mBAAmB,CAAC,YAAY,EAAE,cAAc,CAAC,GACrD,IAAI;IAKP,KAAK,IAAI,mBAAmB,CAAC,YAAY,EAAE,cAAc,CAAC;IA6CpD,OAAO,CAAC,CAAC,EACb,QAAQ,EAAE,CACR,MAAM,EAAE,mBAAmB,CAAC,YAAY,EAAE,cAAc,CAAC,KACtD,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,GAC/B,OAAO,CAAC,CAAC,EAAE,CAAC;IAgBf,OAAO,CAAC,oBAAoB;CAM7B;AAED,wBAAgB,eAAe,CAC7B,YAAY,SAAS,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,EACrE,cAAc,SAAS,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,EACvE,MAAM,EAAE,eAAe,CAAC,YAAY,EAAE,cAAc,CAAC,kDAOtD"}
|
|
@@ -98,7 +98,9 @@ export class ListQueryBuilder {
|
|
|
98
98
|
}
|
|
99
99
|
}
|
|
100
100
|
export function createListQuery(config) {
|
|
101
|
-
const validationConfig = config.filter && config.sort
|
|
101
|
+
const validationConfig = config.filter && config.sort
|
|
102
|
+
? { whereSchema: config.filter, orderBySchema: config.sort }
|
|
103
|
+
: undefined;
|
|
102
104
|
return new ListQueryBuilder(config, validationConfig);
|
|
103
105
|
}
|
|
104
106
|
//# sourceMappingURL=builder.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/list-query/builder.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/list-query/builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"casl.d.ts","sourceRoot":"","sources":["../../src/list-query/casl.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"casl.d.ts","sourceRoot":"","sources":["../../src/list-query/casl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAErD;;;;;;;;;;;;;;;GAeG;AAEH,wBAAgB,eAAe,CAAC,QAAQ,SAAS,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,EACpE,OAAO,EAAE,QAAQ,EACjB,OAAO,EAAE,MAAM,IAKP,SAAS,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,gCAC5C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,IAGzC,QAAQ,SAAS,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,EAGtC,SAAS,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,EACnC,SAAS,QAAQ,gCAKpB"}
|
package/dist/list-query/casl.js
CHANGED
|
@@ -15,8 +15,11 @@ import { accessibleBy } from '@casl/prisma';
|
|
|
15
15
|
* .build();
|
|
16
16
|
* ```
|
|
17
17
|
*/
|
|
18
|
+
// biome-ignore lint/suspicious/noExplicitAny: PureAbility requires two type parameters for full flexibility. Using 'any' here allows this function to accept any CASL ability regardless of its action/subject types.
|
|
18
19
|
export function createCaslScope(ability, subject) {
|
|
20
|
+
// biome-ignore lint/suspicious/noExplicitAny: CASL's accessibleBy function has type constraints that don't perfectly align with generic PureAbility types. This cast is necessary for runtime compatibility.
|
|
19
21
|
const conditions = accessibleBy(ability)[subject];
|
|
22
|
+
// biome-ignore lint/suspicious/noExplicitAny: Return type must be generic to work with any ListQueryBuilder regardless of its schema types. This maintains maximum flexibility for consumers.
|
|
20
23
|
return (builder) => builder.scope(conditions);
|
|
21
24
|
}
|
|
22
25
|
/**
|
|
@@ -35,7 +38,10 @@ export function createCaslScope(ability, subject) {
|
|
|
35
38
|
* ```
|
|
36
39
|
*/
|
|
37
40
|
export function withCaslScope(subject) {
|
|
38
|
-
return (
|
|
41
|
+
return (
|
|
42
|
+
// biome-ignore lint/suspicious/noExplicitAny: ListQueryBuilder must be generic to work with any schema types. This maintains maximum flexibility for consumers.
|
|
43
|
+
builder, ability) => {
|
|
44
|
+
// biome-ignore lint/suspicious/noExplicitAny: CASL's accessibleBy function has type constraints that don't perfectly align with generic PureAbility types. This cast is necessary for runtime compatibility.
|
|
39
45
|
return builder.scope(accessibleBy(ability)[subject]);
|
|
40
46
|
};
|
|
41
47
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"casl.js","sourceRoot":"","sources":["../../src/list-query/casl.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"casl.js","sourceRoot":"","sources":["../../src/list-query/casl.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5C;;;;;;;;;;;;;;;GAeG;AACH,sNAAsN;AACtN,MAAM,UAAU,eAAe,CAC7B,OAAiB,EACjB,OAAe;IAEf,6MAA6M;IAC7M,MAAM,UAAU,GAAG,YAAY,CAAC,OAAc,CAAC,CAAC,OAAO,CAAC,CAAC;IACzD,8LAA8L;IAC9L,OAAO,CAAC,OAAmC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;AAC5E,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,OAAO;IAIL,gKAAgK;IAChK,OAAmC,EACnC,OAAiB,EACjB,EAAE;QACF,6MAA6M;QAC7M,OAAO,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,OAAc,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export { createListQuery, type ListQueryBuilder, type ListQueryConfig, type PaginatedResult } from './builder.js';
|
|
1
|
+
export { createListQuery, type ListQueryBuilder, type ListQueryConfig, type PaginatedResult, } from './builder.js';
|
|
2
2
|
export { ListQuerySchema } from './query-schema.js';
|
|
3
3
|
export { booleanFilterSchema, createFilterSchema, createSortSchema, dateFilterSchema, enumFilterSchema, numberFilterSchema, relationFilterSchema, sortDirectionSchema, stringFilterSchema, } from './schema-helpers.js';
|
|
4
|
-
export type { FieldPath, FilterOperator, ParsedFilter,
|
|
4
|
+
export type { FieldPath, FilterOperator, ParsedFilter, ParsedQueryParams, ParsedSort, PrismaListParams, RawQueryParams, SearchFieldInput, SortDirection, } from './types.js';
|
|
5
5
|
export type { SchemaValidationConfig, ValidatedListParams } from './validator.js';
|
|
6
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/list-query/index.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/list-query/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EACf,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,eAAe,GACrB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAG7B,YAAY,EACV,SAAS,EACT,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,aAAa,GACd,MAAM,YAAY,CAAC;AAGpB,YAAY,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/list-query/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/list-query/index.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/list-query/index.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,OAAO,EACL,eAAe,GAIhB,MAAM,cAAc,CAAC;AAEtB,eAAe;AACf,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,iBAAiB;AACjB,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC"}
|
|
@@ -6,6 +6,11 @@ import type { OpenAPIV3_1 } from 'openapi-types';
|
|
|
6
6
|
* - Converts OpenAPI 3.0-style nullable syntax to OpenAPI 3.1.0 format
|
|
7
7
|
* - Recursively processes all schemas in components, paths, and responses
|
|
8
8
|
*
|
|
9
|
+
* **Note**: As of hono-openapi 1.x, this transformation is no longer needed for
|
|
10
|
+
* hono-openapi generated specs, as they already produce proper OpenAPI 3.1 format.
|
|
11
|
+
* This function is kept for backwards compatibility and for transforming external
|
|
12
|
+
* OpenAPI 3.0 specs.
|
|
13
|
+
*
|
|
9
14
|
* @param doc - OpenAPI document to transform
|
|
10
15
|
* @returns Transformed OpenAPI document
|
|
11
16
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openapi-transformer.d.ts","sourceRoot":"","sources":["../../src/openapi/openapi-transformer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAmFjD
|
|
1
|
+
{"version":3,"file":"openapi-transformer.d.ts","sourceRoot":"","sources":["../../src/openapi/openapi-transformer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAmFjD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,WAAW,CAAC,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAExF"}
|
|
@@ -78,6 +78,11 @@ function transformNullable(schema) {
|
|
|
78
78
|
* - Converts OpenAPI 3.0-style nullable syntax to OpenAPI 3.1.0 format
|
|
79
79
|
* - Recursively processes all schemas in components, paths, and responses
|
|
80
80
|
*
|
|
81
|
+
* **Note**: As of hono-openapi 1.x, this transformation is no longer needed for
|
|
82
|
+
* hono-openapi generated specs, as they already produce proper OpenAPI 3.1 format.
|
|
83
|
+
* This function is kept for backwards compatibility and for transforming external
|
|
84
|
+
* OpenAPI 3.0 specs.
|
|
85
|
+
*
|
|
81
86
|
* @param doc - OpenAPI document to transform
|
|
82
87
|
* @returns Transformed OpenAPI document
|
|
83
88
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openapi-transformer.js","sourceRoot":"","sources":["../../src/openapi/openapi-transformer.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,SAAS,iBAAiB,CAAC,KAAgB;IACzC,OAAO,KAAK,CAAC,IAAI,CACf,CAAC,IAAI,EAAE,EAAE,CACP,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,UAAU,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAC5F,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAAC,IAAa;IAC3C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAC9C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,IAA+B,CAAC;IACpD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACrB,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,0BAA0B,CAAC,KAAgB;IAClD,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACpE,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAC9C,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IACH,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACnC,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB,CAAC,GAAW,EAAE,KAAc;IAC1D,IAAI,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5C,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,0BAA0B,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IACD,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,YAAY,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QAClF,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,iBAAiB,CAAC,MAAe;IACxC,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1E,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACvC,CAAC;IACD,MAAM,GAAG,GAAG,MAAiC,CAAC;IAC9C,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,IAAI,GAAG,KAAK,UAAU,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACzC,SAAS;QACX,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,GAAG,uBAAuB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"openapi-transformer.js","sourceRoot":"","sources":["../../src/openapi/openapi-transformer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../../src/openapi/openapi.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAGjC,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EACjB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../../src/openapi/openapi.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAGjC,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EACjB,MAAM,kBAAkB,CAAC;AAW1B,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,IAAI,CAAC;IACV,WAAW,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,cAAc,CAAC;IACxB,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,UAAU,CAAC,EAAE,iBAAiB,CAAC;CAChC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAyFvE"}
|
package/dist/openapi/openapi.js
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { writeFile } from 'node:fs/promises';
|
|
2
2
|
import { swaggerUI } from '@hono/swagger-ui';
|
|
3
|
-
import {
|
|
3
|
+
import { openAPIRouteHandler } from 'hono-openapi';
|
|
4
4
|
import { setGlobalResponseHooks, setGlobalSecuritySchemes } from '../http/route-helpers.js';
|
|
5
5
|
import { deepMerge } from '../utils/deep-merge.js';
|
|
6
6
|
import { createLogger } from '../utils/logger.js';
|
|
7
7
|
import { defaultOpenAPIComponents } from './defaults.js';
|
|
8
8
|
import { createCorsHeadersHook, createPaginationHeadersHook, createRateLimitHeadersHook, } from './hooks.js';
|
|
9
|
-
import { transformOpenAPIDocument } from './openapi-transformer.js';
|
|
10
9
|
/**
|
|
11
10
|
* Configure OpenAPI documentation for the application.
|
|
12
11
|
*
|
|
@@ -55,23 +54,7 @@ export function configureOpenAPI(options) {
|
|
|
55
54
|
}
|
|
56
55
|
// Serve OpenAPI spec endpoint (development only by default)
|
|
57
56
|
if (shouldServeSpecs) {
|
|
58
|
-
|
|
59
|
-
app.get('/api/openapi-base.json', openAPISpecs(app, { documentation: mergedDocumentation }));
|
|
60
|
-
// Create a custom handler that transforms the spec to OpenAPI 3.1 format
|
|
61
|
-
app.get('/api/openapi.json', async (c) => {
|
|
62
|
-
try {
|
|
63
|
-
// Get the base spec from the internal endpoint
|
|
64
|
-
const response = await app.request('/api/openapi-base.json');
|
|
65
|
-
const spec = (await response.json());
|
|
66
|
-
// Transform to OpenAPI 3.1 format
|
|
67
|
-
const transformedSpec = transformOpenAPIDocument(spec);
|
|
68
|
-
return c.json(transformedSpec);
|
|
69
|
-
}
|
|
70
|
-
catch (error) {
|
|
71
|
-
logger.error('Failed to generate OpenAPI spec:', error);
|
|
72
|
-
return c.json({ error: 'Failed to generate OpenAPI spec' }, 500);
|
|
73
|
-
}
|
|
74
|
-
});
|
|
57
|
+
app.get('/api/openapi.json', openAPIRouteHandler(app, { documentation: mergedDocumentation }));
|
|
75
58
|
}
|
|
76
59
|
// Serve Swagger UI (development only by default)
|
|
77
60
|
if (shouldServeUI) {
|
|
@@ -86,18 +69,17 @@ export function configureOpenAPI(options) {
|
|
|
86
69
|
try {
|
|
87
70
|
let specContent;
|
|
88
71
|
if (shouldServeSpecs) {
|
|
89
|
-
// Use
|
|
72
|
+
// Use Hono's built-in request method to simulate the request
|
|
90
73
|
const response = await app.request('/api/openapi.json');
|
|
91
74
|
specContent = await response.text();
|
|
92
75
|
}
|
|
93
76
|
else {
|
|
94
|
-
// If not serving specs, generate
|
|
77
|
+
// If not serving specs, generate manually
|
|
95
78
|
// Mount a temporary internal endpoint
|
|
96
|
-
app.get('/api/openapi-internal.json',
|
|
79
|
+
app.get('/api/openapi-internal.json', openAPIRouteHandler(app, { documentation: mergedDocumentation }));
|
|
97
80
|
const response = await app.request('/api/openapi-internal.json');
|
|
98
81
|
const spec = (await response.json());
|
|
99
|
-
|
|
100
|
-
specContent = JSON.stringify(transformedSpec, null, 2);
|
|
82
|
+
specContent = JSON.stringify(spec, null, 2);
|
|
101
83
|
}
|
|
102
84
|
await writeFile(filePath, specContent, 'utf-8');
|
|
103
85
|
logger.info(`OpenAPI spec written to ${filePath}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openapi.js","sourceRoot":"","sources":["../../src/openapi/openapi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"openapi.js","sourceRoot":"","sources":["../../src/openapi/openapi.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type helper to recursively convert Date and Decimal fields in an object type
|
|
3
|
+
* - Date → string (ISO 8601)
|
|
4
|
+
* - Decimal → number
|
|
5
|
+
*
|
|
6
|
+
* Note: Decimal is from Prisma's Decimal.js, but we don't import the type
|
|
7
|
+
* to avoid hard dependency on @prisma/client
|
|
8
|
+
*/
|
|
9
|
+
export type SerializedTypes<T> = T extends Date ? string : T extends {
|
|
10
|
+
constructor: {
|
|
11
|
+
name: 'Decimal';
|
|
12
|
+
};
|
|
13
|
+
} ? number : T extends Array<infer U> ? Array<SerializedTypes<U>> : T extends object ? {
|
|
14
|
+
[K in keyof T]: SerializedTypes<T[K]>;
|
|
15
|
+
} : T;
|
|
16
|
+
/**
|
|
17
|
+
* Type for a transformer function that converts a value to a serializable type
|
|
18
|
+
*/
|
|
19
|
+
export type TypeTransformer = (value: unknown) => unknown;
|
|
20
|
+
/**
|
|
21
|
+
* Configuration for type serialization
|
|
22
|
+
*/
|
|
23
|
+
export interface SerializationConfig {
|
|
24
|
+
/**
|
|
25
|
+
* Custom transformers to apply to specific types
|
|
26
|
+
* The function should return the transformed value or undefined if not applicable
|
|
27
|
+
*/
|
|
28
|
+
transformers: TypeTransformer[];
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Default configuration with built-in transformers for Date and Decimal types.
|
|
32
|
+
* Export this if you want to extend it with custom transformers.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```typescript
|
|
36
|
+
* import { defaultConfig, serializePrismaTypes } from './serialize-prisma-types';
|
|
37
|
+
*
|
|
38
|
+
* const customConfig = {
|
|
39
|
+
* transformers: [
|
|
40
|
+
* myCustomTransformer,
|
|
41
|
+
* ...defaultConfig.transformers, // Include Date/Decimal handling
|
|
42
|
+
* ],
|
|
43
|
+
* };
|
|
44
|
+
*
|
|
45
|
+
* serializePrismaTypes(data, customConfig);
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export declare const defaultConfig: SerializationConfig;
|
|
49
|
+
/**
|
|
50
|
+
* Recursively converts Prisma types to JSON-serializable equivalents.
|
|
51
|
+
*
|
|
52
|
+
* This utility handles the mismatch between Prisma's data types and API response DTOs:
|
|
53
|
+
* - Date objects → ISO 8601 strings
|
|
54
|
+
* - Decimal objects → numbers
|
|
55
|
+
*
|
|
56
|
+
* It preserves null values and handles nested objects and arrays.
|
|
57
|
+
* You can extend it with custom transformers for additional types.
|
|
58
|
+
*
|
|
59
|
+
* **Custom Transformers with AcceptPrismaTypes:**
|
|
60
|
+
* ⚠️ Important: Custom transformers work at runtime, but `AcceptPrismaTypes` only knows
|
|
61
|
+
* about Date and Decimal at compile-time. If you use custom transformers for other types,
|
|
62
|
+
* you'll need to use type assertions or `strictTypes: true` in your route handlers.
|
|
63
|
+
*
|
|
64
|
+
* @template T - The type of data to transform
|
|
65
|
+
* @param data - The data to transform (object, array, or primitive)
|
|
66
|
+
* @param config - Optional configuration with custom transformers
|
|
67
|
+
* @returns The same structure with Prisma types converted to JSON-serializable types
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* ```typescript
|
|
71
|
+
* // Basic usage (Date/Decimal only)
|
|
72
|
+
* const discount = await prisma.discount.findUnique({
|
|
73
|
+
* where: { id },
|
|
74
|
+
* });
|
|
75
|
+
* return serializePrismaTypes(discount);
|
|
76
|
+
* // Date fields → ISO strings, Decimal fields → numbers
|
|
77
|
+
*
|
|
78
|
+
* // With custom transformer (requires type assertion in route handler)
|
|
79
|
+
* class Money {
|
|
80
|
+
* constructor(public amount: number, public currency: string) {}
|
|
81
|
+
* serialize() { return `${this.amount} ${this.currency}`; }
|
|
82
|
+
* }
|
|
83
|
+
*
|
|
84
|
+
* const customConfig = {
|
|
85
|
+
* transformers: [
|
|
86
|
+
* (value) => {
|
|
87
|
+
* if (value instanceof Money) return value.serialize();
|
|
88
|
+
* return undefined;
|
|
89
|
+
* },
|
|
90
|
+
* // Include default transformers
|
|
91
|
+
* (value) => {
|
|
92
|
+
* if (value instanceof Date) return value.toISOString();
|
|
93
|
+
* if (isDecimal(value)) return value.toNumber();
|
|
94
|
+
* return undefined;
|
|
95
|
+
* }
|
|
96
|
+
* ]
|
|
97
|
+
* };
|
|
98
|
+
*
|
|
99
|
+
* // In route handler, you'll need to cast:
|
|
100
|
+
* handler: async () => {
|
|
101
|
+
* const data = { balance: new Money(100, 'USD') };
|
|
102
|
+
* return serializePrismaTypes(data, customConfig) as ResponseType;
|
|
103
|
+
* }
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
export declare function serializePrismaTypes<T>(data: T, config?: SerializationConfig, _depth?: number, _seen?: WeakSet<object>): SerializedTypes<T>;
|
|
107
|
+
/**
|
|
108
|
+
* Reverse type helper that accepts both serialized types AND their Prisma equivalents.
|
|
109
|
+
* This allows handlers to return Prisma objects directly while TypeScript knows they'll be serialized.
|
|
110
|
+
*
|
|
111
|
+
* **How it works:**
|
|
112
|
+
* - string → string | Date (accepts both)
|
|
113
|
+
* - number → number | Decimal-like (accepts both)
|
|
114
|
+
* - Recursively applies to objects and arrays
|
|
115
|
+
*
|
|
116
|
+
* ⚠️ **Important Trade-off:**
|
|
117
|
+
* This type will accept Date for ANY string field and Decimal for ANY number field in your response.
|
|
118
|
+
* While this may seem overly permissive, it's a pragmatic trade-off that:
|
|
119
|
+
* - ✅ Enables seamless Prisma type serialization without manual type assertions
|
|
120
|
+
* - ✅ Maintains structural type safety (correct shape, correct property names)
|
|
121
|
+
* - ✅ Relies on schema validation for format correctness (which you should have anyway)
|
|
122
|
+
* - ⚠️ Allows theoretically incorrect assignments (e.g., Date to a 'name' field)
|
|
123
|
+
*
|
|
124
|
+
* In practice, you're unlikely to accidentally pass `new Date()` to a name field, and if you do,
|
|
125
|
+
* Valibot validation will likely catch it at runtime.
|
|
126
|
+
*
|
|
127
|
+
* @example
|
|
128
|
+
* ```typescript
|
|
129
|
+
* // Schema definition
|
|
130
|
+
* const UserSchema = v.object({
|
|
131
|
+
* id: v.string(),
|
|
132
|
+
* name: v.string(),
|
|
133
|
+
* createdAt: v.string(), // Expects ISO string
|
|
134
|
+
* balance: v.number(), // Expects number
|
|
135
|
+
* });
|
|
136
|
+
*
|
|
137
|
+
* // ✅ Intended usage: Prisma types are automatically handled
|
|
138
|
+
* handler: async () => {
|
|
139
|
+
* const user = await prisma.user.findUnique({ where: { id } });
|
|
140
|
+
* // user.createdAt is Date, user.balance is Decimal
|
|
141
|
+
* return user; // Works! Automatically serialized to match schema
|
|
142
|
+
* }
|
|
143
|
+
*
|
|
144
|
+
* // ✅ Also works: Pre-serialized or mixed data
|
|
145
|
+
* handler: async () => {
|
|
146
|
+
* return {
|
|
147
|
+
* id: '123',
|
|
148
|
+
* name: 'John',
|
|
149
|
+
* createdAt: new Date(), // Date will be serialized
|
|
150
|
+
* balance: new Decimal('100.50'), // Decimal will be serialized
|
|
151
|
+
* };
|
|
152
|
+
* }
|
|
153
|
+
*
|
|
154
|
+
* // ⚠️ Type system allows this (but you probably won't write this accidentally)
|
|
155
|
+
* handler: async () => {
|
|
156
|
+
* return {
|
|
157
|
+
* id: '123',
|
|
158
|
+
* name: new Date(), // Type allows, but weird - who would do this?
|
|
159
|
+
* createdAt: '2025-01-01',
|
|
160
|
+
* balance: 100,
|
|
161
|
+
* };
|
|
162
|
+
* }
|
|
163
|
+
* // Note: Even if you did, schema validation might catch format issues
|
|
164
|
+
*
|
|
165
|
+
* // Type inference example
|
|
166
|
+
* type ResponseType = AcceptPrismaTypes<{ createdAt: string; amount: number }>;
|
|
167
|
+
* // Result: { createdAt: string | Date; amount: number | Decimal }
|
|
168
|
+
* ```
|
|
169
|
+
*/
|
|
170
|
+
export type AcceptPrismaTypes<T> = T extends string ? string | Date : T extends number ? number | {
|
|
171
|
+
constructor: {
|
|
172
|
+
name: 'Decimal';
|
|
173
|
+
};
|
|
174
|
+
toNumber(): number;
|
|
175
|
+
} : T extends Array<infer U> ? Array<AcceptPrismaTypes<U>> : T extends object ? {
|
|
176
|
+
[K in keyof T]: AcceptPrismaTypes<T[K]>;
|
|
177
|
+
} : T;
|
|
178
|
+
//# sourceMappingURL=serialize-prisma-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serialize-prisma-types.d.ts","sourceRoot":"","sources":["../../src/utils/serialize-prisma-types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,GAC3C,MAAM,GACN,CAAC,SAAS;IAAE,WAAW,EAAE;QAAE,IAAI,EAAE,SAAS,CAAA;KAAE,CAAA;CAAE,GAC5C,MAAM,GACN,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,CAAC,GACtB,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,GACzB,CAAC,SAAS,MAAM,GACd;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,GACzC,CAAC,CAAC;AAEZ;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,YAAY,EAAE,eAAe,EAAE,CAAC;CACjC;AAsCD;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,aAAa,EAAE,mBAE3B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EACpC,IAAI,EAAE,CAAC,EACP,MAAM,GAAE,mBAAmC,EAC3C,MAAM,SAAI,EACV,KAAK,kBAAwB,GAC5B,eAAe,CAAC,CAAC,CAAC,CAqDpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8DG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,GAC/C,MAAM,GAAG,IAAI,GACb,CAAC,SAAS,MAAM,GACd,MAAM,GAAG;IAAE,WAAW,EAAE;QAAE,IAAI,EAAE,SAAS,CAAA;KAAE,CAAC;IAAC,QAAQ,IAAI,MAAM,CAAA;CAAE,GACjE,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,CAAC,GACtB,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,GAC3B,CAAC,SAAS,MAAM,GACd;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,GAC3C,CAAC,CAAC"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check if a value is a Decimal instance (from Prisma/Decimal.js)
|
|
3
|
+
*/
|
|
4
|
+
function isDecimal(value) {
|
|
5
|
+
return (value !== null &&
|
|
6
|
+
typeof value === 'object' &&
|
|
7
|
+
'constructor' in value &&
|
|
8
|
+
value.constructor.name === 'Decimal' &&
|
|
9
|
+
'toNumber' in value &&
|
|
10
|
+
typeof value.toNumber === 'function');
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Default transformer that handles Date and Decimal types
|
|
14
|
+
*/
|
|
15
|
+
const defaultTransformer = (value) => {
|
|
16
|
+
if (value instanceof Date) {
|
|
17
|
+
return value.toISOString();
|
|
18
|
+
}
|
|
19
|
+
if (isDecimal(value)) {
|
|
20
|
+
return value.toNumber();
|
|
21
|
+
}
|
|
22
|
+
return undefined; // Not handled by this transformer
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Default configuration with built-in transformers for Date and Decimal types.
|
|
26
|
+
* Export this if you want to extend it with custom transformers.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* import { defaultConfig, serializePrismaTypes } from './serialize-prisma-types';
|
|
31
|
+
*
|
|
32
|
+
* const customConfig = {
|
|
33
|
+
* transformers: [
|
|
34
|
+
* myCustomTransformer,
|
|
35
|
+
* ...defaultConfig.transformers, // Include Date/Decimal handling
|
|
36
|
+
* ],
|
|
37
|
+
* };
|
|
38
|
+
*
|
|
39
|
+
* serializePrismaTypes(data, customConfig);
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export const defaultConfig = {
|
|
43
|
+
transformers: [defaultTransformer],
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Recursively converts Prisma types to JSON-serializable equivalents.
|
|
47
|
+
*
|
|
48
|
+
* This utility handles the mismatch between Prisma's data types and API response DTOs:
|
|
49
|
+
* - Date objects → ISO 8601 strings
|
|
50
|
+
* - Decimal objects → numbers
|
|
51
|
+
*
|
|
52
|
+
* It preserves null values and handles nested objects and arrays.
|
|
53
|
+
* You can extend it with custom transformers for additional types.
|
|
54
|
+
*
|
|
55
|
+
* **Custom Transformers with AcceptPrismaTypes:**
|
|
56
|
+
* ⚠️ Important: Custom transformers work at runtime, but `AcceptPrismaTypes` only knows
|
|
57
|
+
* about Date and Decimal at compile-time. If you use custom transformers for other types,
|
|
58
|
+
* you'll need to use type assertions or `strictTypes: true` in your route handlers.
|
|
59
|
+
*
|
|
60
|
+
* @template T - The type of data to transform
|
|
61
|
+
* @param data - The data to transform (object, array, or primitive)
|
|
62
|
+
* @param config - Optional configuration with custom transformers
|
|
63
|
+
* @returns The same structure with Prisma types converted to JSON-serializable types
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```typescript
|
|
67
|
+
* // Basic usage (Date/Decimal only)
|
|
68
|
+
* const discount = await prisma.discount.findUnique({
|
|
69
|
+
* where: { id },
|
|
70
|
+
* });
|
|
71
|
+
* return serializePrismaTypes(discount);
|
|
72
|
+
* // Date fields → ISO strings, Decimal fields → numbers
|
|
73
|
+
*
|
|
74
|
+
* // With custom transformer (requires type assertion in route handler)
|
|
75
|
+
* class Money {
|
|
76
|
+
* constructor(public amount: number, public currency: string) {}
|
|
77
|
+
* serialize() { return `${this.amount} ${this.currency}`; }
|
|
78
|
+
* }
|
|
79
|
+
*
|
|
80
|
+
* const customConfig = {
|
|
81
|
+
* transformers: [
|
|
82
|
+
* (value) => {
|
|
83
|
+
* if (value instanceof Money) return value.serialize();
|
|
84
|
+
* return undefined;
|
|
85
|
+
* },
|
|
86
|
+
* // Include default transformers
|
|
87
|
+
* (value) => {
|
|
88
|
+
* if (value instanceof Date) return value.toISOString();
|
|
89
|
+
* if (isDecimal(value)) return value.toNumber();
|
|
90
|
+
* return undefined;
|
|
91
|
+
* }
|
|
92
|
+
* ]
|
|
93
|
+
* };
|
|
94
|
+
*
|
|
95
|
+
* // In route handler, you'll need to cast:
|
|
96
|
+
* handler: async () => {
|
|
97
|
+
* const data = { balance: new Money(100, 'USD') };
|
|
98
|
+
* return serializePrismaTypes(data, customConfig) as ResponseType;
|
|
99
|
+
* }
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
102
|
+
export function serializePrismaTypes(data, config = defaultConfig, _depth = 0, _seen = new WeakSet()) {
|
|
103
|
+
// Guard: Maximum recursion depth (prevents stack overflow)
|
|
104
|
+
if (_depth > 20) {
|
|
105
|
+
throw new Error('Maximum serialization depth (20) exceeded. ' +
|
|
106
|
+
'This might indicate a circular reference or extremely deep nesting.');
|
|
107
|
+
}
|
|
108
|
+
// Null/undefined check
|
|
109
|
+
if (data === null || data === undefined) {
|
|
110
|
+
return data;
|
|
111
|
+
}
|
|
112
|
+
// Guard: Circular reference detection
|
|
113
|
+
if (typeof data === 'object' && _seen.has(data)) {
|
|
114
|
+
throw new Error('Circular reference detected during serialization. ' +
|
|
115
|
+
'The data structure contains a reference to itself.');
|
|
116
|
+
}
|
|
117
|
+
// Add object to seen set before processing
|
|
118
|
+
if (typeof data === 'object') {
|
|
119
|
+
_seen.add(data);
|
|
120
|
+
}
|
|
121
|
+
// Try each transformer
|
|
122
|
+
for (const transformer of config.transformers) {
|
|
123
|
+
const transformed = transformer(data);
|
|
124
|
+
if (transformed !== undefined) {
|
|
125
|
+
return transformed;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Handle arrays
|
|
129
|
+
if (Array.isArray(data)) {
|
|
130
|
+
return data.map((item) => serializePrismaTypes(item, config, _depth + 1, _seen));
|
|
131
|
+
}
|
|
132
|
+
// Handle objects
|
|
133
|
+
if (typeof data === 'object') {
|
|
134
|
+
const result = {};
|
|
135
|
+
for (const [key, value] of Object.entries(data)) {
|
|
136
|
+
result[key] = serializePrismaTypes(value, config, _depth + 1, _seen);
|
|
137
|
+
}
|
|
138
|
+
return result;
|
|
139
|
+
}
|
|
140
|
+
// Return primitives as-is
|
|
141
|
+
return data;
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=serialize-prisma-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serialize-prisma-types.js","sourceRoot":"","sources":["../../src/utils/serialize-prisma-types.ts"],"names":[],"mappings":"AA2CA;;GAEG;AACH,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,CACL,KAAK,KAAK,IAAI;QACd,OAAO,KAAK,KAAK,QAAQ;QACzB,aAAa,IAAI,KAAK;QACtB,KAAK,CAAC,WAAW,CAAC,IAAI,KAAK,SAAS;QACpC,UAAU,IAAI,KAAK;QACnB,OAAQ,KAAgC,CAAC,QAAQ,KAAK,UAAU,CACjE,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,kBAAkB,GAAoB,CAAC,KAAc,EAAE,EAAE;IAC7D,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC;IACD,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IACD,OAAO,SAAS,CAAC,CAAC,kCAAkC;AACtD,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,aAAa,GAAwB;IAChD,YAAY,EAAE,CAAC,kBAAkB,CAAC;CACnC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAO,EACP,SAA8B,aAAa,EAC3C,MAAM,GAAG,CAAC,EACV,QAAQ,IAAI,OAAO,EAAU;IAE7B,2DAA2D;IAC3D,IAAI,MAAM,GAAG,EAAE,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACb,6CAA6C;YAC3C,qEAAqE,CACxE,CAAC;IACJ,CAAC;IAED,uBAAuB;IACvB,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACxC,OAAO,IAA0B,CAAC;IACpC,CAAC;IAED,sCAAsC;IACtC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CACb,oDAAoD;YAClD,oDAAoD,CACvD,CAAC;IACJ,CAAC;IAED,2CAA2C;IAC3C,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IAED,uBAAuB;IACvB,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QAC9C,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO,WAAiC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACvB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,CAAC,CAChC,CAAC;IAC1B,CAAC;IAED,iBAAiB;IACjB,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAChD,MAAM,CAAC,GAAG,CAAC,GAAG,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,MAA4B,CAAC;IACtC,CAAC;IAED,0BAA0B;IAC1B,OAAO,IAA0B,CAAC;AACpC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "glasswork",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "A transparent, Lambda-optimized web framework for building OpenAPI-compliant REST APIs.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
],
|
|
21
21
|
"sideEffects": false,
|
|
22
22
|
"engines": {
|
|
23
|
-
"node": ">=
|
|
23
|
+
"node": ">=20.0.0"
|
|
24
24
|
},
|
|
25
25
|
"keywords": [
|
|
26
26
|
"framework",
|
|
@@ -57,16 +57,16 @@
|
|
|
57
57
|
"access": "public"
|
|
58
58
|
},
|
|
59
59
|
"peerDependencies": {
|
|
60
|
-
"@aws-sdk/client-dynamodb": "^3.
|
|
61
|
-
"@aws-sdk/client-ssm": "^3.
|
|
62
|
-
"@aws-sdk/lib-dynamodb": "^3.
|
|
60
|
+
"@aws-sdk/client-dynamodb": "^3.900.0",
|
|
61
|
+
"@aws-sdk/client-ssm": "^3.900.0",
|
|
62
|
+
"@aws-sdk/lib-dynamodb": "^3.900.0",
|
|
63
63
|
"@casl/prisma": "^1.4.0",
|
|
64
64
|
"@hono/swagger-ui": "^0.5.0",
|
|
65
65
|
"@prisma/client": "^6.0.0",
|
|
66
66
|
"awilix": "^12.0.0",
|
|
67
67
|
"dotenv": "^16.0.0",
|
|
68
68
|
"hono": "^4.9.0",
|
|
69
|
-
"hono-openapi": "^0.
|
|
69
|
+
"hono-openapi": "^1.0.0",
|
|
70
70
|
"valibot": "^1.0.0"
|
|
71
71
|
},
|
|
72
72
|
"peerDependenciesMeta": {
|
|
@@ -93,19 +93,29 @@
|
|
|
93
93
|
}
|
|
94
94
|
},
|
|
95
95
|
"devDependencies": {
|
|
96
|
-
"@aws-sdk/client-
|
|
96
|
+
"@aws-sdk/client-dynamodb": "^3.932.0",
|
|
97
|
+
"@aws-sdk/client-ssm": "^3.932.0",
|
|
98
|
+
"@aws-sdk/lib-dynamodb": "^3.932.0",
|
|
97
99
|
"@biomejs/biome": "^2.2.5",
|
|
98
100
|
"@casl/ability": "^6.7.3",
|
|
99
101
|
"@casl/prisma": "^1.5.2",
|
|
100
|
-
"@
|
|
101
|
-
"@
|
|
102
|
-
"@
|
|
102
|
+
"@hono/swagger-ui": "^0.5.2",
|
|
103
|
+
"@prisma/client": "^6.19.0",
|
|
104
|
+
"@types/node": "^22.19.1",
|
|
105
|
+
"@vitest/coverage-v8": "^4.0.10",
|
|
106
|
+
"awilix": "^12.0.5",
|
|
103
107
|
"dotenv": "^17.2.3",
|
|
108
|
+
"hono": "^4.10.6",
|
|
109
|
+
"hono-openapi": "^1.1.1",
|
|
104
110
|
"typescript": "^5.9.3",
|
|
105
|
-
"
|
|
111
|
+
"valibot": "^1.1.0",
|
|
112
|
+
"vitest": "^4.0.10"
|
|
106
113
|
},
|
|
107
114
|
"dependencies": {
|
|
115
|
+
"@hono/standard-validator": "^0.1.5",
|
|
108
116
|
"@hono/valibot-validator": "^0.5.3",
|
|
117
|
+
"@standard-community/standard-json": "^0.3.5",
|
|
118
|
+
"@standard-community/standard-openapi": "^0.2.8",
|
|
109
119
|
"@valibot/to-json-schema": "^1.3.0",
|
|
110
120
|
"deepmerge": "^4.3.1",
|
|
111
121
|
"openapi-types": "^12.1.3"
|