glasswork 0.6.2 → 0.7.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.
Files changed (37) hide show
  1. package/README.md +37 -9
  2. package/dist/core/bootstrap.d.ts.map +1 -1
  3. package/dist/core/bootstrap.js +43 -6
  4. package/dist/core/bootstrap.js.map +1 -1
  5. package/dist/core/types.d.ts +103 -23
  6. package/dist/core/types.d.ts.map +1 -1
  7. package/dist/http/route-helpers.d.ts +102 -44
  8. package/dist/http/route-helpers.d.ts.map +1 -1
  9. package/dist/http/route-helpers.js +137 -129
  10. package/dist/http/route-helpers.js.map +1 -1
  11. package/dist/index.d.ts +4 -4
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +1 -1
  14. package/dist/index.js.map +1 -1
  15. package/dist/list-query/casl.d.ts +9 -8
  16. package/dist/list-query/casl.d.ts.map +1 -1
  17. package/dist/list-query/casl.js +29 -11
  18. package/dist/list-query/casl.js.map +1 -1
  19. package/dist/middleware/rate-limit.d.ts.map +1 -1
  20. package/dist/middleware/rate-limit.js +47 -13
  21. package/dist/middleware/rate-limit.js.map +1 -1
  22. package/dist/openapi/defaults.d.ts.map +1 -1
  23. package/dist/openapi/defaults.js +5 -3
  24. package/dist/openapi/defaults.js.map +1 -1
  25. package/dist/openapi/openapi-processors.d.ts +51 -0
  26. package/dist/openapi/openapi-processors.d.ts.map +1 -0
  27. package/dist/openapi/openapi-processors.js +166 -0
  28. package/dist/openapi/openapi-processors.js.map +1 -0
  29. package/dist/openapi/openapi.d.ts +36 -3
  30. package/dist/openapi/openapi.d.ts.map +1 -1
  31. package/dist/openapi/openapi.js +27 -39
  32. package/dist/openapi/openapi.js.map +1 -1
  33. package/dist/utils/serialize-prisma-types.d.ts +63 -30
  34. package/dist/utils/serialize-prisma-types.d.ts.map +1 -1
  35. package/dist/utils/serialize-prisma-types.js +8 -4
  36. package/dist/utils/serialize-prisma-types.js.map +1 -1
  37. package/package.json +11 -3
@@ -1,11 +1,11 @@
1
1
  import { writeFile } from 'node:fs/promises';
2
2
  import { swaggerUI } from '@hono/swagger-ui';
3
3
  import { openAPIRouteHandler } from 'hono-openapi';
4
- import { setGlobalResponseHooks, setGlobalSecuritySchemes } from '../http/route-helpers.js';
5
4
  import { deepMerge } from '../utils/deep-merge.js';
6
5
  import { createLogger } from '../utils/logger.js';
7
6
  import { defaultOpenAPIComponents } from './defaults.js';
8
- import { createCorsHeadersHook, createPaginationHeadersHook, createRateLimitHeadersHook, } from './hooks.js';
7
+ /** Default delay before writing OpenAPI spec (ms). Allows routes to register. */
8
+ const DEFAULT_WRITE_DELAY_MS = 1000;
9
9
  /**
10
10
  * Configure OpenAPI documentation for the application.
11
11
  *
@@ -14,30 +14,31 @@ import { createCorsHeadersHook, createPaginationHeadersHook, createRateLimitHead
14
14
  * - production: No serving by default
15
15
  * - test: Disabled by default
16
16
  *
17
- * This function automatically sets up response hooks based on enabled features
18
- * and merges them with any application-provided hooks.
17
+ * Note: Response processors are now configured in bootstrap.ts and stored
18
+ * per-app instance via setOpenAPIContext. This eliminates global state.
19
19
  *
20
20
  * @param options - Configuration options
21
+ * @returns Object with optional `writeSpec` function for writing the spec to file
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * // Basic usage (auto-write with delay)
26
+ * configureOpenAPI({ app, environment, openapi });
27
+ *
28
+ * // Explicit write after routes are registered (recommended)
29
+ * const { writeSpec } = configureOpenAPI({ app, environment, openapi });
30
+ * // ... register all routes ...
31
+ * await writeSpec?.();
32
+ * ```
21
33
  */
22
34
  export function configureOpenAPI(options) {
23
35
  const { app, environment, openapi, rateLimit, middleware } = options;
24
36
  if (!openapi.enabled) {
25
- return;
37
+ return {};
26
38
  }
27
39
  const logger = createLogger('Glasswork:OpenAPI', true);
28
40
  const shouldServeSpecs = openapi.serveSpecs ?? environment === 'development';
29
41
  const shouldServeUI = openapi.serveUI ?? environment === 'development';
30
- // Build response hooks based on enabled features
31
- const frameworkHooks = [
32
- createCorsHeadersHook(!!middleware?.cors),
33
- createRateLimitHeadersHook(rateLimit?.enabled ?? false),
34
- createPaginationHeadersHook(),
35
- ];
36
- // Merge with application-provided hooks
37
- const allHooks = [...frameworkHooks, ...(openapi.responseHooks || [])];
38
- // Make hooks available to route definitions globally
39
- // This must be done synchronously before routes are mounted
40
- setGlobalResponseHooks(allHooks);
41
42
  // Filter components based on enabled features (only include headers that are actually used)
42
43
  const filteredComponents = filterComponentsByFeatures(defaultOpenAPIComponents, {
43
44
  rateLimitEnabled: rateLimit?.enabled ?? false,
@@ -45,13 +46,6 @@ export function configureOpenAPI(options) {
45
46
  });
46
47
  // Merge application documentation with filtered Glasswork defaults
47
48
  const mergedDocumentation = deepMerge({ components: filteredComponents }, openapi.documentation || {});
48
- // Extract security scheme names from the merged documentation and make them available globally
49
- // This allows route definitions to reference the actual security schemes defined in the app
50
- const securitySchemes = extractSecuritySchemeNames(mergedDocumentation);
51
- setGlobalSecuritySchemes(securitySchemes);
52
- if (securitySchemes.length > 0) {
53
- logger.info(`Security schemes: ${securitySchemes.join(', ')}`);
54
- }
55
49
  // Serve OpenAPI spec endpoint (development only by default)
56
50
  if (shouldServeSpecs) {
57
51
  app.get('/api/openapi.json', openAPIRouteHandler(app, { documentation: mergedDocumentation }));
@@ -60,12 +54,11 @@ export function configureOpenAPI(options) {
60
54
  if (shouldServeUI) {
61
55
  app.get('/api', swaggerUI({ url: '/api/openapi.json' }));
62
56
  }
63
- // Write OpenAPI spec to file (optional)
57
+ // Create writeSpec function if file writing is configured
58
+ let writeSpec;
64
59
  if (openapi.writeToFile) {
65
60
  const filePath = openapi.writeToFile;
66
- // Generate spec and write to file
67
- // This happens after routes are registered
68
- setTimeout(async () => {
61
+ writeSpec = async () => {
69
62
  try {
70
63
  let specContent;
71
64
  if (shouldServeSpecs) {
@@ -87,19 +80,14 @@ export function configureOpenAPI(options) {
87
80
  catch (error) {
88
81
  logger.error('Failed to write OpenAPI spec:', error);
89
82
  }
90
- }, 1000); // Wait for routes to be registered
91
- }
92
- }
93
- /**
94
- * Extract security scheme names from OpenAPI documentation.
95
- * Returns an array of scheme names that can be used in route security definitions.
96
- */
97
- function extractSecuritySchemeNames(documentation) {
98
- const securitySchemes = documentation.components?.securitySchemes;
99
- if (!securitySchemes || typeof securitySchemes !== 'object') {
100
- return [];
83
+ };
84
+ // Auto-write with delay for backward compatibility
85
+ // NOTE: For more reliable writes, call writeSpec() explicitly after registering routes
86
+ setTimeout(() => {
87
+ writeSpec?.();
88
+ }, DEFAULT_WRITE_DELAY_MS);
101
89
  }
102
- return Object.keys(securitySchemes);
90
+ return { writeSpec };
103
91
  }
104
92
  /**
105
93
  * Filter component headers based on enabled features.
@@ -1 +1 @@
1
- {"version":3,"file":"openapi.js","sourceRoot":"","sources":["../../src/openapi/openapi.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"openapi.js","sourceRoot":"","sources":["../../src/openapi/openapi.ts"],"names":[],"mappings":"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"}
@@ -110,31 +110,57 @@ export declare function serializePrismaTypes<T>(data: T, config?: SerializationC
110
110
  * Prisma's Decimal has constructor.name as string (not literal 'Decimal'),
111
111
  * so we match on the toNumber() method which is the key interface we need.
112
112
  */
113
- type PrismaDecimalLike = {
113
+ export type PrismaDecimalLike = {
114
114
  toNumber(): number;
115
115
  constructor: {
116
116
  name: string;
117
117
  };
118
118
  };
119
+ /**
120
+ * Common date field naming patterns used in databases.
121
+ * Fields matching these patterns will accept Date objects in AcceptPrismaTypes.
122
+ *
123
+ * Patterns:
124
+ * - `${string}At` - createdAt, updatedAt, deletedAt, expiresAt, etc.
125
+ * - `${string}Date` - birthDate, startDate, endDate, effectiveDate, etc.
126
+ * - `${string}Time` - startTime, endTime (when stored as Date/DateTime)
127
+ * - `${string}Timestamp` - loginTimestamp, etc.
128
+ * - Common standalone names: 'date', 'timestamp', 'datetime'
129
+ */
130
+ type DateFieldPattern = `${string}At` | `${string}Date` | `${string}Time` | `${string}Timestamp` | 'date' | 'timestamp' | 'datetime';
119
131
  /**
120
132
  * Reverse type helper that accepts both serialized types AND their Prisma equivalents.
121
133
  * This allows handlers to return Prisma objects directly while TypeScript knows they'll be serialized.
122
134
  *
123
135
  * **How it works:**
124
- * - string → string | Date (accepts both)
125
- * - number → number | Decimal-like (accepts both)
126
- * - Recursively applies to objects and arrays
127
- *
128
- * ⚠️ **Important Trade-off:**
129
- * This type will accept Date for ANY string field and Decimal for ANY number field in your response.
130
- * While this may seem overly permissive, it's a pragmatic trade-off that:
131
- * - ✅ Enables seamless Prisma type serialization without manual type assertions
132
- * - ✅ Maintains structural type safety (correct shape, correct property names)
133
- * - ✅ Relies on schema validation for format correctness (which you should have anyway)
134
- * - ⚠️ Allows theoretically incorrect assignments (e.g., Date to a 'name' field)
135
- *
136
- * In practice, you're unlikely to accidentally pass `new Date()` to a name field, and if you do,
137
- * Valibot validation will likely catch it at runtime.
136
+ * - For Date fields: Only string fields with conventional date names (ending in `At`, `Date`, `Time`, etc.)
137
+ * accept Date objects. Other string fields only accept strings.
138
+ * - For Decimal fields: All number fields accept Decimal-like objects (see rationale below).
139
+ * - Recursively applies to objects and arrays.
140
+ *
141
+ * **Date Field Detection:**
142
+ * Date fields are detected by naming convention. Fields ending in `At`, `Date`, `Time`, `Timestamp`,
143
+ * or named `date`/`timestamp`/`datetime` will accept Date objects.
144
+ *
145
+ * If you have unconventionally named date fields, you have two options:
146
+ * 1. Rename them to follow the convention (recommended)
147
+ * 2. Use `strictTypes: true` in your route and handle types manually
148
+ * 3. Provide additional patterns via the `AdditionalDatePatterns` type parameter
149
+ *
150
+ * **Why Decimal is still permissive:**
151
+ * Unlike date fields which follow predictable naming conventions (`createdAt`, `updatedAt`, etc.),
152
+ * Decimal fields have domain-specific names with no reliable pattern:
153
+ * - `price`, `amount`, `balance` (finance)
154
+ * - `density`, `thickness`, `weight` (physics/materials)
155
+ * - `discountPercentage`, `taxRate` (percentages)
156
+ * - `latitude`, `longitude` (coordinates)
157
+ *
158
+ * Since there's no reliable naming convention for Decimal fields, we keep them permissive.
159
+ * In practice, developers rarely pass Decimal objects to non-decimal fields accidentally,
160
+ * and runtime schema validation will catch any actual errors.
161
+ *
162
+ * @template T - The serialized type to transform
163
+ * @template AdditionalDatePatterns - Optional additional patterns to match for date fields
138
164
  *
139
165
  * @example
140
166
  * ```typescript
@@ -143,44 +169,51 @@ type PrismaDecimalLike = {
143
169
  * id: v.string(),
144
170
  * name: v.string(),
145
171
  * createdAt: v.string(), // Expects ISO string
146
- * balance: v.number(), // Expects number
172
+ * balance: v.number(), // Expects number
147
173
  * });
148
174
  *
149
175
  * // ✅ Intended usage: Prisma types are automatically handled
150
176
  * handler: async () => {
151
177
  * const user = await prisma.user.findUnique({ where: { id } });
152
- * // user.createdAt is Date, user.balance is Decimal
178
+ * // user.createdAt is Date (matches 'At' pattern), user.balance is Decimal
153
179
  * return user; // Works! Automatically serialized to match schema
154
180
  * }
155
181
  *
156
- * // ✅ Also works: Pre-serialized or mixed data
182
+ * // ✅ Date fields with conventional names accept Date objects
157
183
  * handler: async () => {
158
184
  * return {
159
185
  * id: '123',
160
186
  * name: 'John',
161
- * createdAt: new Date(), // Date will be serialized
162
- * balance: new Decimal('100.50'), // Decimal will be serialized
187
+ * createdAt: new Date(), // ✅ 'createdAt' matches 'At' pattern
188
+ * birthDate: new Date(), // ✅ 'birthDate' matches 'Date' pattern
189
+ * balance: new Decimal('100.50'), // ✅ Decimal accepted for any number field
163
190
  * };
164
191
  * }
165
192
  *
166
- * // ⚠️ Type system allows this (but you probably won't write this accidentally)
193
+ * // ❌ Non-date string fields no longer accept Date (compile-time error)
167
194
  * handler: async () => {
168
195
  * return {
169
- * id: '123',
170
- * name: new Date(), // Type allows, but weird - who would do this?
196
+ * name: new Date(), // ❌ Type error! 'name' doesn't match date patterns
171
197
  * createdAt: '2025-01-01',
172
- * balance: 100,
173
198
  * };
174
199
  * }
175
- * // Note: Even if you did, schema validation might catch format issues
176
200
  *
177
- * // Type inference example
178
- * type ResponseType = AcceptPrismaTypes<{ createdAt: string; amount: number }>;
179
- * // Result: { createdAt: string | Date; amount: number | Decimal }
201
+ * // Using additional date patterns for unconventional field names
202
+ * type MyResponse = AcceptPrismaTypes<ResponseType, 'lastLogin' | 'nextRenewal'>;
180
203
  * ```
181
204
  */
182
- export type AcceptPrismaTypes<T> = T extends string ? string | Date : T extends number ? number | PrismaDecimalLike : T extends Array<infer U> ? Array<AcceptPrismaTypes<U>> : T extends object ? {
183
- [K in keyof T]: AcceptPrismaTypes<T[K]>;
205
+ /**
206
+ * Helper type to add Date support to string types (including nullable strings).
207
+ * Preserves null and undefined in unions.
208
+ */
209
+ type WithDateSupport<T> = T extends string | infer Rest ? string | Date | Rest : T;
210
+ /**
211
+ * Helper type to add Decimal support to number types (including nullable numbers).
212
+ * Preserves null and undefined in unions.
213
+ */
214
+ type WithDecimalSupport<T> = T extends number | infer Rest ? number | PrismaDecimalLike | Rest : T;
215
+ export type AcceptPrismaTypes<T, AdditionalDatePatterns extends string = never> = T extends object ? T extends Array<infer U> ? Array<AcceptPrismaTypes<U, AdditionalDatePatterns>> : {
216
+ [K in keyof T]: K extends string ? K extends DateFieldPattern | AdditionalDatePatterns ? T[K] extends string | null | undefined ? WithDateSupport<T[K]> : AcceptPrismaTypes<T[K], AdditionalDatePatterns> : T[K] extends number | null | undefined ? WithDecimalSupport<T[K]> : AcceptPrismaTypes<T[K], AdditionalDatePatterns> : AcceptPrismaTypes<T[K], AdditionalDatePatterns>;
184
217
  } : T;
185
218
  export {};
186
219
  //# sourceMappingURL=serialize-prisma-types.d.ts.map
@@ -1 +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;AAwED;;;;;;;;;;;;;;;;;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;;;;;GAKG;AACH,KAAK,iBAAiB,GAAG;IACvB,QAAQ,IAAI,MAAM,CAAC;IACnB,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8DG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,GAC/C,MAAM,GAAG,IAAI,GACb,CAAC,SAAS,MAAM,GACd,MAAM,GAAG,iBAAiB,GAC1B,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"}
1
+ {"version":3,"file":"serialize-prisma-types.d.ts","sourceRoot":"","sources":["../../src/utils/serialize-prisma-types.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,8 @@
1
+ /**
2
+ * Maximum depth for recursive serialization.
3
+ * Prevents stack overflow on deeply nested or circular structures.
4
+ */
5
+ const MAX_SERIALIZATION_DEPTH = 20;
1
6
  /**
2
7
  * Check if a value is a Decimal instance (from Prisma/Decimal.js)
3
8
  *
@@ -13,8 +18,7 @@ function isDecimal(value) {
13
18
  return false;
14
19
  }
15
20
  // Must have toNumber method
16
- if (!('toNumber' in value) ||
17
- typeof value.toNumber !== 'function') {
21
+ if (!('toNumber' in value) || typeof value.toNumber !== 'function') {
18
22
  return false;
19
23
  }
20
24
  // Check for Decimal.js internal structure (most reliable indicator)
@@ -125,8 +129,8 @@ export const defaultConfig = {
125
129
  */
126
130
  export function serializePrismaTypes(data, config = defaultConfig, _depth = 0, _seen = new WeakSet()) {
127
131
  // Guard: Maximum recursion depth (prevents stack overflow)
128
- if (_depth > 20) {
129
- throw new Error('Maximum serialization depth (20) exceeded. ' +
132
+ if (_depth > MAX_SERIALIZATION_DEPTH) {
133
+ throw new Error(`Maximum serialization depth (${MAX_SERIALIZATION_DEPTH}) exceeded. ` +
130
134
  'This might indicate a circular reference or extremely deep nesting.');
131
135
  }
132
136
  // Null/undefined check
@@ -1 +1 @@
1
- {"version":3,"file":"serialize-prisma-types.js","sourceRoot":"","sources":["../../src/utils/serialize-prisma-types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"serialize-prisma-types.js","sourceRoot":"","sources":["../../src/utils/serialize-prisma-types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "glasswork",
3
- "version": "0.6.2",
3
+ "version": "0.7.1",
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",
@@ -51,7 +51,11 @@
51
51
  "test": "vitest",
52
52
  "test:coverage": "vitest --coverage",
53
53
  "lint": "biome check . --write",
54
- "prepublishOnly": "npm run build && npm test"
54
+ "lint:ci": "biome check .",
55
+ "prepublishOnly": "npm run build && npm test",
56
+ "docs:dev": "vitepress dev docs",
57
+ "docs:build": "vitepress build docs",
58
+ "docs:preview": "vitepress preview docs"
55
59
  },
56
60
  "publishConfig": {
57
61
  "access": "public"
@@ -107,9 +111,13 @@
107
111
  "dotenv": "^17.2.3",
108
112
  "hono": "^4.10.6",
109
113
  "hono-openapi": "^1.1.1",
114
+ "mermaid": "^11.12.1",
110
115
  "typescript": "^5.9.3",
111
116
  "valibot": "^1.1.0",
112
- "vitest": "^4.0.10"
117
+ "vitepress": "^1.6.4",
118
+ "vitepress-plugin-mermaid": "^2.0.17",
119
+ "vitest": "^4.0.10",
120
+ "vue": "^3.5.25"
113
121
  },
114
122
  "dependencies": {
115
123
  "@hono/standard-validator": "^0.1.5",