glasswork 1.4.1 → 1.6.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.
Files changed (224) hide show
  1. package/CHANGELOG.md +75 -1
  2. package/README.md +6 -2
  3. package/dist/audit/audit-logger.d.ts +6 -1
  4. package/dist/audit/audit-logger.d.ts.map +1 -1
  5. package/dist/audit/audit-logger.js +6 -1
  6. package/dist/audit/audit-logger.js.map +1 -1
  7. package/dist/auth/assert.d.ts +4 -0
  8. package/dist/auth/assert.d.ts.map +1 -1
  9. package/dist/auth/assert.js +7 -3
  10. package/dist/auth/assert.js.map +1 -1
  11. package/dist/auth/better-auth-provider.js +13 -4
  12. package/dist/auth/better-auth-provider.js.map +1 -1
  13. package/dist/auth/errors.d.ts +17 -0
  14. package/dist/auth/errors.d.ts.map +1 -0
  15. package/dist/auth/errors.js +23 -0
  16. package/dist/auth/errors.js.map +1 -0
  17. package/dist/auth/index.d.ts +2 -1
  18. package/dist/auth/index.d.ts.map +1 -1
  19. package/dist/auth/index.js +1 -0
  20. package/dist/auth/index.js.map +1 -1
  21. package/dist/auth/middleware.d.ts +13 -0
  22. package/dist/auth/middleware.d.ts.map +1 -1
  23. package/dist/auth/middleware.js +19 -8
  24. package/dist/auth/middleware.js.map +1 -1
  25. package/dist/auth/types.d.ts +4 -0
  26. package/dist/auth/types.d.ts.map +1 -1
  27. package/dist/config/providers.d.ts.map +1 -1
  28. package/dist/config/providers.js +5 -4
  29. package/dist/config/providers.js.map +1 -1
  30. package/dist/core/bootstrap.d.ts +2 -2
  31. package/dist/core/bootstrap.d.ts.map +1 -1
  32. package/dist/core/bootstrap.js +162 -83
  33. package/dist/core/bootstrap.js.map +1 -1
  34. package/dist/core/contract.d.ts +9 -2
  35. package/dist/core/contract.d.ts.map +1 -1
  36. package/dist/core/contract.js +2 -1
  37. package/dist/core/contract.js.map +1 -1
  38. package/dist/core/errors.d.ts +16 -0
  39. package/dist/core/errors.d.ts.map +1 -0
  40. package/dist/core/errors.js +31 -0
  41. package/dist/core/errors.js.map +1 -0
  42. package/dist/core/glasswork-config.d.ts +42 -0
  43. package/dist/core/glasswork-config.d.ts.map +1 -0
  44. package/dist/core/glasswork-config.js +2 -0
  45. package/dist/core/glasswork-config.js.map +1 -0
  46. package/dist/core/index.d.ts +7 -4
  47. package/dist/core/index.d.ts.map +1 -1
  48. package/dist/core/index.js +5 -3
  49. package/dist/core/index.js.map +1 -1
  50. package/dist/core/job-services.d.ts +16 -0
  51. package/dist/core/job-services.d.ts.map +1 -0
  52. package/dist/core/job-services.js +19 -0
  53. package/dist/core/job-services.js.map +1 -0
  54. package/dist/core/lifecycle.d.ts +30 -2
  55. package/dist/core/lifecycle.d.ts.map +1 -1
  56. package/dist/core/lifecycle.js +100 -13
  57. package/dist/core/lifecycle.js.map +1 -1
  58. package/dist/core/module-graph.d.ts +7 -1
  59. package/dist/core/module-graph.d.ts.map +1 -1
  60. package/dist/core/module-graph.js +90 -21
  61. package/dist/core/module-graph.js.map +1 -1
  62. package/dist/core/module-inspection.d.ts +44 -0
  63. package/dist/core/module-inspection.d.ts.map +1 -0
  64. package/dist/core/module-inspection.js +114 -0
  65. package/dist/core/module-inspection.js.map +1 -0
  66. package/dist/core/module-runtime.d.ts +22 -0
  67. package/dist/core/module-runtime.d.ts.map +1 -0
  68. package/dist/core/module-runtime.js +252 -0
  69. package/dist/core/module-runtime.js.map +1 -0
  70. package/dist/core/module.d.ts +5 -1
  71. package/dist/core/module.d.ts.map +1 -1
  72. package/dist/core/module.js +15 -3
  73. package/dist/core/module.js.map +1 -1
  74. package/dist/core/request-scope.d.ts +1 -1
  75. package/dist/core/request-scope.d.ts.map +1 -1
  76. package/dist/core/request-scope.js +10 -8
  77. package/dist/core/request-scope.js.map +1 -1
  78. package/dist/core/types.d.ts +106 -10
  79. package/dist/core/types.d.ts.map +1 -1
  80. package/dist/email/compiler/compiler.d.ts.map +1 -1
  81. package/dist/email/compiler/compiler.js +24 -13
  82. package/dist/email/compiler/compiler.js.map +1 -1
  83. package/dist/email/email-service.d.ts +0 -4
  84. package/dist/email/email-service.d.ts.map +1 -1
  85. package/dist/email/email-service.js +2 -29
  86. package/dist/email/email-service.js.map +1 -1
  87. package/dist/email/html-to-text.d.ts +14 -0
  88. package/dist/email/html-to-text.d.ts.map +1 -0
  89. package/dist/email/html-to-text.js +47 -0
  90. package/dist/email/html-to-text.js.map +1 -0
  91. package/dist/email/index.d.ts +1 -0
  92. package/dist/email/index.d.ts.map +1 -1
  93. package/dist/email/index.js +1 -0
  94. package/dist/email/index.js.map +1 -1
  95. package/dist/email/ses.d.ts +7 -0
  96. package/dist/email/ses.d.ts.map +1 -0
  97. package/dist/email/ses.js +6 -0
  98. package/dist/email/ses.js.map +1 -0
  99. package/dist/email/smtp.d.ts +7 -0
  100. package/dist/email/smtp.d.ts.map +1 -0
  101. package/dist/email/smtp.js +6 -0
  102. package/dist/email/smtp.js.map +1 -0
  103. package/dist/email/transports/ses-transport.d.ts.map +1 -1
  104. package/dist/email/transports/ses-transport.js +6 -4
  105. package/dist/email/transports/ses-transport.js.map +1 -1
  106. package/dist/email/transports/smtp-transport.d.ts +40 -0
  107. package/dist/email/transports/smtp-transport.d.ts.map +1 -0
  108. package/dist/email/transports/smtp-transport.js +67 -0
  109. package/dist/email/transports/smtp-transport.js.map +1 -0
  110. package/dist/http/error-handler.d.ts +7 -1
  111. package/dist/http/error-handler.d.ts.map +1 -1
  112. package/dist/http/error-handler.js +18 -6
  113. package/dist/http/error-handler.js.map +1 -1
  114. package/dist/http/error-response.dto.d.ts +6 -0
  115. package/dist/http/error-response.dto.d.ts.map +1 -1
  116. package/dist/http/error-response.dto.js +6 -0
  117. package/dist/http/error-response.dto.js.map +1 -1
  118. package/dist/http/errors.d.ts +12 -0
  119. package/dist/http/errors.d.ts.map +1 -1
  120. package/dist/http/errors.js +35 -23
  121. package/dist/http/errors.js.map +1 -1
  122. package/dist/http/index.d.ts +1 -1
  123. package/dist/http/index.d.ts.map +1 -1
  124. package/dist/http/index.js +1 -1
  125. package/dist/http/index.js.map +1 -1
  126. package/dist/http/route-authorization.d.ts.map +1 -1
  127. package/dist/http/route-authorization.js +3 -3
  128. package/dist/http/route-authorization.js.map +1 -1
  129. package/dist/http/route-helpers.d.ts +2 -1
  130. package/dist/http/route-helpers.d.ts.map +1 -1
  131. package/dist/http/route-helpers.js +29 -2
  132. package/dist/http/route-helpers.js.map +1 -1
  133. package/dist/http/route-openapi-context.d.ts +15 -1
  134. package/dist/http/route-openapi-context.d.ts.map +1 -1
  135. package/dist/http/route-openapi-context.js.map +1 -1
  136. package/dist/http/route-response.d.ts +6 -2
  137. package/dist/http/route-response.d.ts.map +1 -1
  138. package/dist/http/route-response.js +36 -16
  139. package/dist/http/route-response.js.map +1 -1
  140. package/dist/http/route-types.d.ts +12 -4
  141. package/dist/http/route-types.d.ts.map +1 -1
  142. package/dist/http/route-types.js.map +1 -1
  143. package/dist/http/route-validation.d.ts.map +1 -1
  144. package/dist/http/route-validation.js +21 -1
  145. package/dist/http/route-validation.js.map +1 -1
  146. package/dist/jobs/drivers/eventbridge-scheduler-driver.d.ts +1 -0
  147. package/dist/jobs/drivers/eventbridge-scheduler-driver.d.ts.map +1 -1
  148. package/dist/jobs/drivers/eventbridge-scheduler-driver.js +12 -2
  149. package/dist/jobs/drivers/eventbridge-scheduler-driver.js.map +1 -1
  150. package/dist/jobs/drivers/mock-driver.d.ts +4 -0
  151. package/dist/jobs/drivers/mock-driver.d.ts.map +1 -1
  152. package/dist/jobs/drivers/mock-driver.js +10 -3
  153. package/dist/jobs/drivers/mock-driver.js.map +1 -1
  154. package/dist/jobs/drivers/sqs-driver.d.ts +1 -1
  155. package/dist/jobs/drivers/sqs-driver.d.ts.map +1 -1
  156. package/dist/jobs/drivers/sqs-driver.js +8 -2
  157. package/dist/jobs/drivers/sqs-driver.js.map +1 -1
  158. package/dist/jobs/errors.d.ts +14 -1
  159. package/dist/jobs/errors.d.ts.map +1 -1
  160. package/dist/jobs/errors.js +19 -2
  161. package/dist/jobs/errors.js.map +1 -1
  162. package/dist/jobs/index.d.ts +3 -3
  163. package/dist/jobs/index.d.ts.map +1 -1
  164. package/dist/jobs/index.js +1 -1
  165. package/dist/jobs/index.js.map +1 -1
  166. package/dist/jobs/job-service.d.ts +46 -7
  167. package/dist/jobs/job-service.d.ts.map +1 -1
  168. package/dist/jobs/job-service.js +63 -9
  169. package/dist/jobs/job-service.js.map +1 -1
  170. package/dist/jobs/scheduler.d.ts +6 -0
  171. package/dist/jobs/scheduler.d.ts.map +1 -0
  172. package/dist/jobs/scheduler.js +6 -0
  173. package/dist/jobs/scheduler.js.map +1 -0
  174. package/dist/jobs/sqs.d.ts +7 -0
  175. package/dist/jobs/sqs.d.ts.map +1 -0
  176. package/dist/jobs/sqs.js +7 -0
  177. package/dist/jobs/sqs.js.map +1 -0
  178. package/dist/jobs/types.d.ts +6 -1
  179. package/dist/jobs/types.d.ts.map +1 -1
  180. package/dist/jobs/utils.d.ts +6 -0
  181. package/dist/jobs/utils.d.ts.map +1 -1
  182. package/dist/jobs/utils.js +8 -0
  183. package/dist/jobs/utils.js.map +1 -1
  184. package/dist/jobs/worker.d.ts.map +1 -1
  185. package/dist/jobs/worker.js +28 -23
  186. package/dist/jobs/worker.js.map +1 -1
  187. package/dist/middleware/rate-limit.d.ts.map +1 -1
  188. package/dist/middleware/rate-limit.js +5 -4
  189. package/dist/middleware/rate-limit.js.map +1 -1
  190. package/dist/observability/exception-tracking.d.ts +23 -0
  191. package/dist/observability/exception-tracking.d.ts.map +1 -1
  192. package/dist/observability/exception-tracking.js +101 -6
  193. package/dist/observability/exception-tracking.js.map +1 -1
  194. package/dist/observability/index.d.ts +1 -1
  195. package/dist/observability/index.d.ts.map +1 -1
  196. package/dist/observability/index.js +1 -1
  197. package/dist/observability/index.js.map +1 -1
  198. package/dist/observability/sanitizers.d.ts.map +1 -1
  199. package/dist/observability/sanitizers.js +2 -0
  200. package/dist/observability/sanitizers.js.map +1 -1
  201. package/dist/openapi/drift.d.ts +17 -2
  202. package/dist/openapi/drift.d.ts.map +1 -1
  203. package/dist/openapi/drift.js +79 -5
  204. package/dist/openapi/drift.js.map +1 -1
  205. package/dist/openapi/openapi.d.ts.map +1 -1
  206. package/dist/openapi/openapi.js +2 -1
  207. package/dist/openapi/openapi.js.map +1 -1
  208. package/dist/utils/environment.d.ts +10 -2
  209. package/dist/utils/environment.d.ts.map +1 -1
  210. package/dist/utils/environment.js +20 -3
  211. package/dist/utils/environment.js.map +1 -1
  212. package/dist/utils/module-interop.d.ts +9 -0
  213. package/dist/utils/module-interop.d.ts.map +1 -0
  214. package/dist/utils/module-interop.js +16 -0
  215. package/dist/utils/module-interop.js.map +1 -0
  216. package/dist/utils/optional-dependency.d.ts +6 -0
  217. package/dist/utils/optional-dependency.d.ts.map +1 -0
  218. package/dist/utils/optional-dependency.js +16 -0
  219. package/dist/utils/optional-dependency.js.map +1 -0
  220. package/dist/utils/serialize-prisma-types.d.ts +51 -15
  221. package/dist/utils/serialize-prisma-types.d.ts.map +1 -1
  222. package/dist/utils/serialize-prisma-types.js +47 -16
  223. package/dist/utils/serialize-prisma-types.js.map +1 -1
  224. package/package.json +56 -12
@@ -1,18 +1,92 @@
1
- import { readFile } from 'node:fs/promises';
1
+ import { readFile, writeFile } from 'node:fs/promises';
2
2
  import { isDeepStrictEqual } from 'node:util';
3
+ const HTTP_METHODS = new Set(['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace']);
4
+ const MAX_LISTED = 20;
3
5
  export class OpenAPIDriftError extends Error {
4
- constructor(filePath) {
5
- super(`OpenAPI contract drift: regenerate and commit ${filePath}`);
6
+ differences;
7
+ constructor(filePath, differences = []) {
8
+ super(formatDrift(filePath, differences));
6
9
  this.name = 'OpenAPIDriftError';
10
+ this.differences = differences;
7
11
  }
8
12
  }
9
- /** Compares JSON documents without changing the committed contract file. */
13
+ /**
14
+ * Compares JSON documents without changing the committed contract file. On a mismatch the
15
+ * error lists the changed operations and schemas.
16
+ */
10
17
  export async function assertOpenAPIMatches(document, filePath) {
11
18
  const expected = JSON.parse(await readFile(filePath, 'utf8'));
12
19
  // Normalize to JSON so omitted undefined properties match the written artifact.
13
20
  const actual = JSON.parse(JSON.stringify(document));
14
21
  if (!isDeepStrictEqual(expected, actual)) {
15
- throw new OpenAPIDriftError(filePath);
22
+ throw new OpenAPIDriftError(filePath, diffOpenAPI(expected, actual));
16
23
  }
17
24
  }
25
+ /** Writes a document in the form `assertOpenAPIMatches()` reads: indented JSON. */
26
+ export async function writeOpenAPIDocument(document, filePath) {
27
+ await writeFile(filePath, `${JSON.stringify(document, null, 2)}\n`, 'utf8');
28
+ }
29
+ /** Lists where two JSON documents differ, at the deepest object key that differs. */
30
+ export function diffOpenAPI(expected, actual) {
31
+ const differences = [];
32
+ collect(expected, actual, '', differences);
33
+ return differences;
34
+ }
35
+ function isObject(value) {
36
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
37
+ }
38
+ function collect(expected, actual, pointer, differences) {
39
+ if (isDeepStrictEqual(expected, actual))
40
+ return;
41
+ if (!isObject(expected) || !isObject(actual)) {
42
+ differences.push({ kind: 'changed', pointer });
43
+ return;
44
+ }
45
+ for (const key of new Set([...Object.keys(expected), ...Object.keys(actual)])) {
46
+ const child = `${pointer}/${key.replaceAll('~', '~0').replaceAll('/', '~1')}`;
47
+ if (!(key in actual))
48
+ differences.push({ kind: 'removed', pointer: child });
49
+ else if (!(key in expected))
50
+ differences.push({ kind: 'added', pointer: child });
51
+ else
52
+ collect(expected[key], actual[key], child, differences);
53
+ }
54
+ }
55
+ function unescapePointerToken(token) {
56
+ return token.replaceAll('~1', '/').replaceAll('~0', '~');
57
+ }
58
+ /** `GET /api/projects` or `schema ProjectDto` for a pointer, with the rest of the pointer. */
59
+ function describe(pointer) {
60
+ const tokens = pointer.split('/').slice(1);
61
+ if (tokens[0] === 'paths' && tokens[1] !== undefined) {
62
+ const path = unescapePointerToken(tokens[1]);
63
+ if (tokens[2] !== undefined && HTTP_METHODS.has(tokens[2])) {
64
+ return { subject: `${tokens[2].toUpperCase()} ${path}`, detail: tokens.slice(3).join('/') };
65
+ }
66
+ return { subject: path, detail: tokens.slice(2).join('/') };
67
+ }
68
+ if (tokens[0] === 'components' && tokens[1] === 'schemas' && tokens[2] !== undefined) {
69
+ return {
70
+ subject: `schema ${unescapePointerToken(tokens[2])}`,
71
+ detail: tokens.slice(3).join('/'),
72
+ };
73
+ }
74
+ return { subject: pointer || '(document)', detail: '' };
75
+ }
76
+ function formatDrift(filePath, differences) {
77
+ const symbol = { added: '+', removed: '-', changed: '~' };
78
+ const lines = differences.slice(0, MAX_LISTED).map(({ kind, pointer }) => {
79
+ const { subject, detail } = describe(pointer);
80
+ const kindOfWhole = detail === '' ? kind : 'changed';
81
+ return ` ${symbol[kindOfWhole]} ${subject}${detail ? `: ${detail} ${kind}` : ''}`;
82
+ });
83
+ if (differences.length > MAX_LISTED) {
84
+ lines.push(` … and ${differences.length - MAX_LISTED} more`);
85
+ }
86
+ return [
87
+ `OpenAPI contract drift in ${filePath}${lines.length ? ':' : ''}`,
88
+ ...lines,
89
+ `Regenerate and commit ${filePath} if the change is intended.`,
90
+ ].join('\n');
91
+ }
18
92
  //# sourceMappingURL=drift.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"drift.js","sourceRoot":"","sources":["../../src/openapi/drift.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9C,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C,YAAY,QAAgB;QAC1B,KAAK,CAAC,iDAAiD,QAAQ,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,4EAA4E;AAC5E,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,QAAiB,EAAE,QAAgB;IAC5E,MAAM,QAAQ,GAAY,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IACvE,gFAAgF;IAChF,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC7D,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"drift.js","sourceRoot":"","sources":["../../src/openapi/drift.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../../src/openapi/openapi.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAqB,MAAM,MAAM,CAAC;AACpD,OAAO,EAAE,aAAa,EAAuB,MAAM,cAAc,CAAC;AAElE,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EACjB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG/D,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,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;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC;IACxE;;;;;;;;;;;;;;OAcG;IACH,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACjC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,sBAAsB,CAiEzF"}
1
+ {"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../../src/openapi/openapi.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAqB,MAAM,MAAM,CAAC;AACpD,OAAO,EAAE,aAAa,EAAuB,MAAM,cAAc,CAAC;AAElE,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EACjB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAI/D,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,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;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC;IACxE;;;;;;;;;;;;;;OAcG;IACH,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACjC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,sBAAsB,CAiEzF"}
@@ -2,6 +2,7 @@ import { writeFile } from 'node:fs/promises';
2
2
  import { generateSpecs, openAPIRouteHandler } from 'hono-openapi';
3
3
  import { deepMerge } from '../utils/deep-merge.js';
4
4
  import { createLogger } from '../utils/logger.js';
5
+ import { namedExports } from '../utils/module-interop.js';
5
6
  import { defaultOpenAPIComponents } from './defaults.js';
6
7
  /**
7
8
  * Configure OpenAPI documentation for the application.
@@ -51,7 +52,7 @@ export function configureOpenAPI(options) {
51
52
  let handlerPromise;
52
53
  app.get('/api', async (c, next) => {
53
54
  handlerPromise ??= import('@hono/swagger-ui')
54
- .then(({ swaggerUI }) => swaggerUI({ url: '/api/openapi.json' }))
55
+ .then((module) => namedExports(module).swaggerUI({ url: '/api/openapi.json' }))
55
56
  .catch((cause) => {
56
57
  throw new Error('Unable to load Swagger UI. Install the optional peer with: npm install @hono/swagger-ui', { cause });
57
58
  });
@@ -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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"}
@@ -6,8 +6,16 @@
6
6
  */
7
7
  export declare function isLambda(): boolean;
8
8
  /**
9
- * Check if running in production environment
10
- * (either NODE_ENV=production or in Lambda)
9
+ * Detect the runtime environment.
10
+ *
11
+ * `NODE_ENV=production` and `NODE_ENV=test` are used as-is. Otherwise AWS Lambda
12
+ * counts as production and everything else as development. This is the default
13
+ * for the `environment` option of `bootstrap()`.
14
+ */
15
+ export declare function detectEnvironment(): 'development' | 'production' | 'test';
16
+ /**
17
+ * Check if the detected environment is production
18
+ * (`NODE_ENV=production`, or AWS Lambda unless `NODE_ENV=test`).
11
19
  */
12
20
  export declare function isProduction(): boolean;
13
21
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../src/utils/environment.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,QAAQ,IAAI,OAAO,CAElC;AAED;;;GAGG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED;;;GAGG;AACH,wBAAgB,MAAM,IAAI,OAAO,CAUhC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAEvC"}
1
+ {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../src/utils/environment.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,QAAQ,IAAI,OAAO,CAElC;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,IAAI,aAAa,GAAG,YAAY,GAAG,MAAM,CAMzE;AAED;;;GAGG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED;;;GAGG;AACH,wBAAgB,MAAM,IAAI,OAAO,CAUhC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAEvC"}
@@ -8,11 +8,28 @@ export function isLambda() {
8
8
  return !!(process.env.AWS_LAMBDA_FUNCTION_NAME || process.env.LAMBDA_TASK_ROOT);
9
9
  }
10
10
  /**
11
- * Check if running in production environment
12
- * (either NODE_ENV=production or in Lambda)
11
+ * Detect the runtime environment.
12
+ *
13
+ * `NODE_ENV=production` and `NODE_ENV=test` are used as-is. Otherwise AWS Lambda
14
+ * counts as production and everything else as development. This is the default
15
+ * for the `environment` option of `bootstrap()`.
16
+ */
17
+ export function detectEnvironment() {
18
+ const nodeEnv = process.env.NODE_ENV;
19
+ if (nodeEnv === 'production')
20
+ return 'production';
21
+ if (nodeEnv === 'test')
22
+ return 'test';
23
+ if (isLambda())
24
+ return 'production';
25
+ return 'development';
26
+ }
27
+ /**
28
+ * Check if the detected environment is production
29
+ * (`NODE_ENV=production`, or AWS Lambda unless `NODE_ENV=test`).
13
30
  */
14
31
  export function isProduction() {
15
- return process.env.NODE_ENV === 'production' || isLambda();
32
+ return detectEnvironment() === 'production';
16
33
  }
17
34
  /**
18
35
  * Check if running in test environment.
@@ -1 +1 @@
1
- {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/utils/environment.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,UAAU,QAAQ;IACtB,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AAClF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,IAAI,QAAQ,EAAE,CAAC;AAC7D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,MAAM;IACpB,uBAAuB;IACvB,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,wEAAwE;IACxE,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;QAChE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AACtC,CAAC"}
1
+ {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/utils/environment.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,UAAU,QAAQ;IACtB,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AAClF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;IACrC,IAAI,OAAO,KAAK,YAAY;QAAE,OAAO,YAAY,CAAC;IAClD,IAAI,OAAO,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IACtC,IAAI,QAAQ,EAAE;QAAE,OAAO,YAAY,CAAC;IACpC,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,iBAAiB,EAAE,KAAK,YAAY,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,MAAM;IACpB,uBAAuB;IACvB,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,wEAAwE;IACxE,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;QAChE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AACtC,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Named exports of a dynamically imported module.
3
+ *
4
+ * Node exposes the named exports of a CommonJS package through `import()`, but a bundler that
5
+ * turns the package into an ESM chunk may expose them only as `default`. Optional peers such
6
+ * as the AWS SDK clients are CommonJS packages, so read their exports from either place.
7
+ */
8
+ export declare function namedExports<T extends object>(module: T): T;
9
+ //# sourceMappingURL=module-interop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-interop.d.ts","sourceRoot":"","sources":["../../src/utils/module-interop.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAO3D"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Named exports of a dynamically imported module.
3
+ *
4
+ * Node exposes the named exports of a CommonJS package through `import()`, but a bundler that
5
+ * turns the package into an ESM chunk may expose them only as `default`. Optional peers such
6
+ * as the AWS SDK clients are CommonJS packages, so read their exports from either place.
7
+ */
8
+ export function namedExports(module) {
9
+ // Check first: module mocks may throw for an export they do not define.
10
+ const fallback = 'default' in module ? module.default : undefined;
11
+ if (fallback === null || (typeof fallback !== 'object' && typeof fallback !== 'function')) {
12
+ return module;
13
+ }
14
+ return { ...fallback, ...module };
15
+ }
16
+ //# sourceMappingURL=module-interop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-interop.js","sourceRoot":"","sources":["../../src/utils/module-interop.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAmB,MAAS;IACtD,wEAAwE;IACxE,MAAM,QAAQ,GAAG,SAAS,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IAClE,IAAI,QAAQ,KAAK,IAAI,IAAI,CAAC,OAAO,QAAQ,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,UAAU,CAAC,EAAE,CAAC;QAC1F,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,EAAE,GAAG,QAAQ,EAAE,GAAG,MAAM,EAAO,CAAC;AACzC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Loads an optional peer the first time an adapter needs it, so importing the adapter's entry
3
+ * point works without the peer installed. A missing peer fails with an install hint.
4
+ */
5
+ export declare function optionalDependency<T extends object>(name: string, user: string, load: () => Promise<T>): () => Promise<T>;
6
+ //# sourceMappingURL=optional-dependency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optional-dependency.d.ts","sourceRoot":"","sources":["../../src/utils/optional-dependency.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,EACjD,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACrB,MAAM,OAAO,CAAC,CAAC,CAAC,CASlB"}
@@ -0,0 +1,16 @@
1
+ import { namedExports } from './module-interop.js';
2
+ /**
3
+ * Loads an optional peer the first time an adapter needs it, so importing the adapter's entry
4
+ * point works without the peer installed. A missing peer fails with an install hint.
5
+ */
6
+ export function optionalDependency(name, user, load) {
7
+ let loading;
8
+ return () => {
9
+ loading ??= load().then(namedExports, (cause) => {
10
+ loading = undefined;
11
+ throw new Error(`${user} requires ${name}. Install it with: npm install ${name}`, { cause });
12
+ });
13
+ return loading;
14
+ };
15
+ }
16
+ //# sourceMappingURL=optional-dependency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optional-dependency.js","sourceRoot":"","sources":["../../src/utils/optional-dependency.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,IAAY,EACZ,IAAY,EACZ,IAAsB;IAEtB,IAAI,OAA+B,CAAC;IACpC,OAAO,GAAG,EAAE;QACV,OAAO,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,KAAc,EAAE,EAAE;YACvD,OAAO,GAAG,SAAS,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,aAAa,IAAI,kCAAkC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/F,CAAC,CAAC,CAAC;QACH,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;AACJ,CAAC"}
@@ -1,34 +1,62 @@
1
+ import type { ConfiguredDecimalSerialization, DecimalSerialization } from '../core/glasswork-config.js';
1
2
  /**
2
3
  * Type helper to recursively convert Date and Decimal fields in an object type
3
4
  * - Date → string (ISO 8601)
4
- * - Decimal → number
5
+ * - Decimal → number, or string when `TDecimals` is `'string'`
5
6
  *
6
7
  * Note: Decimal is from Prisma's Decimal.js, but we don't import the type
7
- * to avoid hard dependency on @prisma/client
8
+ * to avoid hard dependency on @prisma/client. It is matched structurally through
9
+ * {@link PrismaDecimalLike}.
8
10
  */
9
- export type SerializedTypes<T> = T extends Date ? string : T extends {
11
+ export type SerializedTypes<T, TDecimals extends DecimalSerialization = 'number'> = T extends Date ? string : T extends PrismaDecimalLike | {
10
12
  constructor: {
11
13
  name: 'Decimal';
12
14
  };
13
- } ? number : T extends Array<infer U> ? Array<SerializedTypes<U>> : T extends object ? {
14
- [K in keyof T]: SerializedTypes<T[K]>;
15
+ } ? TDecimals extends 'string' ? string : number : T extends Array<infer U> ? Array<SerializedTypes<U, TDecimals>> : T extends object ? {
16
+ [K in keyof T]: SerializedTypes<T[K], TDecimals>;
15
17
  } : T;
16
18
  /**
17
19
  * Type for a transformer function that converts a value to a serializable type
18
20
  */
19
21
  export type TypeTransformer = (value: unknown) => unknown;
20
22
  /**
21
- * Configuration for type serialization
23
+ * Configuration for type serialization. Build one with {@link createSerializationConfig}, or
24
+ * list the transformers directly.
22
25
  */
23
- export interface SerializationConfig {
26
+ export interface SerializationConfig<TDecimals extends DecimalSerialization = 'number'> {
24
27
  /**
25
28
  * Custom transformers to apply to specific types
26
29
  * The function should return the transformed value or undefined if not applicable
27
30
  */
28
31
  transformers: TypeTransformer[];
32
+ /**
33
+ * How the built-in transformer serializes Decimal values; `'number'` when absent. Set by
34
+ * {@link createSerializationConfig}, which picks the matching transformer.
35
+ */
36
+ decimals?: TDecimals;
29
37
  }
30
38
  /**
31
- * Default configuration with built-in transformers for Date and Decimal types.
39
+ * Build a serialization configuration: your transformers first, then the built-in Date and
40
+ * Decimal handling. `bootstrap()` builds the application-wide configuration this way from its
41
+ * `serialization` option; use this for calls to `serializePrismaTypes()` outside routes.
42
+ *
43
+ * @example
44
+ * ```typescript
45
+ * const config = createSerializationConfig({
46
+ * decimals: 'string',
47
+ * transformers: [moneyTransformer],
48
+ * });
49
+ *
50
+ * serializePrismaTypes({ price: new Decimal('10.50') }, config);
51
+ * // { price: '10.50' }
52
+ * ```
53
+ */
54
+ export declare function createSerializationConfig<TDecimals extends DecimalSerialization = 'number'>(options?: {
55
+ decimals?: TDecimals;
56
+ transformers?: TypeTransformer[];
57
+ }): SerializationConfig<TDecimals>;
58
+ /**
59
+ * Default configuration with built-in transformers for Date and Decimal types (as numbers).
32
60
  * Export this if you want to extend it with custom transformers.
33
61
  *
34
62
  * @example
@@ -51,7 +79,7 @@ export declare const defaultConfig: SerializationConfig;
51
79
  *
52
80
  * This utility handles the mismatch between Prisma's data types and API response DTOs:
53
81
  * - Date objects → ISO 8601 strings
54
- * - Decimal objects → numbers
82
+ * - Decimal objects → numbers, or strings with a `decimals: 'string'` configuration
55
83
  *
56
84
  * It preserves null values and handles nested objects and arrays.
57
85
  * You can extend it with custom transformers for additional types.
@@ -62,8 +90,9 @@ export declare const defaultConfig: SerializationConfig;
62
90
  * you'll need to use type assertions or `strictTypes: true` in your route handlers.
63
91
  *
64
92
  * @template T - The type of data to transform
93
+ * @template TDecimals - The Decimal serialization of `config`, which decides the result type
65
94
  * @param data - The data to transform (object, array, or primitive)
66
- * @param config - Optional configuration with custom transformers
95
+ * @param config - Optional configuration, see {@link createSerializationConfig}
67
96
  * @returns The same structure with Prisma types converted to JSON-serializable types
68
97
  *
69
98
  * @example
@@ -103,7 +132,7 @@ export declare const defaultConfig: SerializationConfig;
103
132
  * }
104
133
  * ```
105
134
  */
106
- export declare function serializePrismaTypes<T>(data: T, config?: SerializationConfig, _depth?: number, _ancestors?: WeakSet<object>): SerializedTypes<T>;
135
+ export declare function serializePrismaTypes<T, TDecimals extends DecimalSerialization = 'number'>(data: T, config?: SerializationConfig<TDecimals>, _depth?: number, _ancestors?: WeakSet<object>): SerializedTypes<T, TDecimals>;
107
136
  /**
108
137
  * Type representing Prisma's Decimal type structure.
109
138
  * We use a structural type to avoid importing from @prisma/client.
@@ -136,6 +165,8 @@ type DateFieldPattern = `${string}At` | `${string}Date` | `${string}Time` | `${s
136
165
  * - For Date fields: Only string fields with conventional date names (ending in `At`, `Date`, `Time`, etc.)
137
166
  * accept Date objects. Other string fields only accept strings.
138
167
  * - For Decimal fields: All number fields accept Decimal-like objects (see rationale below).
168
+ * When `GlassworkConfig` declares `decimals: 'string'`, the non-date string fields accept
169
+ * them instead, because Decimals then serialize to strings.
139
170
  * - Recursively applies to objects and arrays.
140
171
  *
141
172
  * **Date Field Detection:**
@@ -208,12 +239,17 @@ type DateFieldPattern = `${string}At` | `${string}Date` | `${string}Time` | `${s
208
239
  */
209
240
  type WithDateSupport<T> = T extends string | infer Rest ? string | Date | Rest : T;
210
241
  /**
211
- * Helper type to add Decimal support to number types (including nullable numbers).
212
- * Preserves null and undefined in unions.
242
+ * The type a Decimal serializes into, as declared in `GlassworkConfig` (`number` by default).
243
+ */
244
+ type DecimalField = ConfiguredDecimalSerialization extends 'string' ? string : number;
245
+ /**
246
+ * Helper type to add Decimal support to the fields Decimals serialize into (including nullable
247
+ * ones). Preserves null and undefined in unions. Literal unions such as `'open' | 'closed'`
248
+ * and `1 | 2` stay as they are, because a Decimal never serializes into one of them.
213
249
  */
214
- type WithDecimalSupport<T> = T extends number | infer Rest ? number | PrismaDecimalLike | Rest : T;
250
+ type WithDecimalSupport<T> = DecimalField extends T ? T | PrismaDecimalLike : T;
215
251
  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>;
252
+ [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 DecimalField | null | undefined ? WithDecimalSupport<T[K]> : AcceptPrismaTypes<T[K], AdditionalDatePatterns> : AcceptPrismaTypes<T[K], AdditionalDatePatterns>;
217
253
  } : T;
218
254
  export {};
219
255
  //# 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":"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"}
1
+ {"version":3,"file":"serialize-prisma-types.d.ts","sourceRoot":"","sources":["../../src/utils/serialize-prisma-types.ts"],"names":[],"mappings":"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"}
@@ -38,19 +38,51 @@ function isDecimal(value) {
38
38
  return hasDecimalStructure || hasDecimalConstructor;
39
39
  }
40
40
  /**
41
- * Default transformer that handles Date and Decimal types
41
+ * Serialize a Decimal in plain notation with every digit and the stored scale. `toString()`
42
+ * and `toJSON()` switch to exponential notation for large and small values.
42
43
  */
43
- const defaultTransformer = (value) => {
44
- if (value instanceof Date) {
45
- return value.toISOString();
46
- }
47
- if (isDecimal(value)) {
48
- return value.toNumber();
49
- }
50
- return undefined; // Not handled by this transformer
51
- };
44
+ function decimalToString(value) {
45
+ return typeof value.toFixed === 'function' ? value.toFixed() : String(value);
46
+ }
47
+ /**
48
+ * Build the transformer that handles Date and Decimal types
49
+ */
50
+ function createDefaultTransformer(decimals) {
51
+ return (value) => {
52
+ if (value instanceof Date) {
53
+ return value.toISOString();
54
+ }
55
+ if (isDecimal(value)) {
56
+ return decimals === 'string' ? decimalToString(value) : value.toNumber();
57
+ }
58
+ return undefined; // Not handled by this transformer
59
+ };
60
+ }
61
+ /**
62
+ * Build a serialization configuration: your transformers first, then the built-in Date and
63
+ * Decimal handling. `bootstrap()` builds the application-wide configuration this way from its
64
+ * `serialization` option; use this for calls to `serializePrismaTypes()` outside routes.
65
+ *
66
+ * @example
67
+ * ```typescript
68
+ * const config = createSerializationConfig({
69
+ * decimals: 'string',
70
+ * transformers: [moneyTransformer],
71
+ * });
72
+ *
73
+ * serializePrismaTypes({ price: new Decimal('10.50') }, config);
74
+ * // { price: '10.50' }
75
+ * ```
76
+ */
77
+ export function createSerializationConfig(options = {}) {
78
+ const decimals = (options.decimals ?? 'number');
79
+ return {
80
+ decimals,
81
+ transformers: [...(options.transformers ?? []), createDefaultTransformer(decimals)],
82
+ };
83
+ }
52
84
  /**
53
- * Default configuration with built-in transformers for Date and Decimal types.
85
+ * Default configuration with built-in transformers for Date and Decimal types (as numbers).
54
86
  * Export this if you want to extend it with custom transformers.
55
87
  *
56
88
  * @example
@@ -67,15 +99,13 @@ const defaultTransformer = (value) => {
67
99
  * serializePrismaTypes(data, customConfig);
68
100
  * ```
69
101
  */
70
- export const defaultConfig = {
71
- transformers: [defaultTransformer],
72
- };
102
+ export const defaultConfig = createSerializationConfig();
73
103
  /**
74
104
  * Recursively converts Prisma types to JSON-serializable equivalents.
75
105
  *
76
106
  * This utility handles the mismatch between Prisma's data types and API response DTOs:
77
107
  * - Date objects → ISO 8601 strings
78
- * - Decimal objects → numbers
108
+ * - Decimal objects → numbers, or strings with a `decimals: 'string'` configuration
79
109
  *
80
110
  * It preserves null values and handles nested objects and arrays.
81
111
  * You can extend it with custom transformers for additional types.
@@ -86,8 +116,9 @@ export const defaultConfig = {
86
116
  * you'll need to use type assertions or `strictTypes: true` in your route handlers.
87
117
  *
88
118
  * @template T - The type of data to transform
119
+ * @template TDecimals - The Decimal serialization of `config`, which decides the result type
89
120
  * @param data - The data to transform (object, array, or primitive)
90
- * @param config - Optional configuration with custom transformers
121
+ * @param config - Optional configuration, see {@link createSerializationConfig}
91
122
  * @returns The same structure with Prisma types converted to JSON-serializable types
92
123
  *
93
124
  * @example
@@ -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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"}