glasswork 1.5.0 → 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 (200) hide show
  1. package/CHANGELOG.md +54 -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 +142 -68
  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 +6 -3
  47. package/dist/core/index.d.ts.map +1 -1
  48. package/dist/core/index.js +4 -2
  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 +29 -1
  55. package/dist/core/lifecycle.d.ts.map +1 -1
  56. package/dist/core/lifecycle.js +98 -15
  57. package/dist/core/lifecycle.js.map +1 -1
  58. package/dist/core/module-graph.d.ts +2 -0
  59. package/dist/core/module-graph.d.ts.map +1 -1
  60. package/dist/core/module-graph.js +63 -10
  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 +8 -0
  67. package/dist/core/module-runtime.d.ts.map +1 -1
  68. package/dist/core/module-runtime.js +60 -6
  69. package/dist/core/module-runtime.js.map +1 -1
  70. package/dist/core/request-scope.js +1 -1
  71. package/dist/core/request-scope.js.map +1 -1
  72. package/dist/core/types.d.ts +98 -7
  73. package/dist/core/types.d.ts.map +1 -1
  74. package/dist/email/ses.d.ts +7 -0
  75. package/dist/email/ses.d.ts.map +1 -0
  76. package/dist/email/ses.js +6 -0
  77. package/dist/email/ses.js.map +1 -0
  78. package/dist/email/smtp.d.ts +7 -0
  79. package/dist/email/smtp.d.ts.map +1 -0
  80. package/dist/email/smtp.js +6 -0
  81. package/dist/email/smtp.js.map +1 -0
  82. package/dist/email/transports/ses-transport.d.ts.map +1 -1
  83. package/dist/email/transports/ses-transport.js +6 -4
  84. package/dist/email/transports/ses-transport.js.map +1 -1
  85. package/dist/email/transports/smtp-transport.d.ts +40 -0
  86. package/dist/email/transports/smtp-transport.d.ts.map +1 -0
  87. package/dist/email/transports/smtp-transport.js +67 -0
  88. package/dist/email/transports/smtp-transport.js.map +1 -0
  89. package/dist/http/error-handler.d.ts +7 -1
  90. package/dist/http/error-handler.d.ts.map +1 -1
  91. package/dist/http/error-handler.js +18 -6
  92. package/dist/http/error-handler.js.map +1 -1
  93. package/dist/http/error-response.dto.d.ts +6 -0
  94. package/dist/http/error-response.dto.d.ts.map +1 -1
  95. package/dist/http/error-response.dto.js +6 -0
  96. package/dist/http/error-response.dto.js.map +1 -1
  97. package/dist/http/errors.d.ts +12 -0
  98. package/dist/http/errors.d.ts.map +1 -1
  99. package/dist/http/errors.js +35 -23
  100. package/dist/http/errors.js.map +1 -1
  101. package/dist/http/index.d.ts +1 -1
  102. package/dist/http/index.d.ts.map +1 -1
  103. package/dist/http/index.js +1 -1
  104. package/dist/http/index.js.map +1 -1
  105. package/dist/http/route-authorization.d.ts.map +1 -1
  106. package/dist/http/route-authorization.js +3 -3
  107. package/dist/http/route-authorization.js.map +1 -1
  108. package/dist/http/route-helpers.d.ts +2 -1
  109. package/dist/http/route-helpers.d.ts.map +1 -1
  110. package/dist/http/route-helpers.js +29 -2
  111. package/dist/http/route-helpers.js.map +1 -1
  112. package/dist/http/route-openapi-context.d.ts +15 -1
  113. package/dist/http/route-openapi-context.d.ts.map +1 -1
  114. package/dist/http/route-openapi-context.js.map +1 -1
  115. package/dist/http/route-response.d.ts +6 -2
  116. package/dist/http/route-response.d.ts.map +1 -1
  117. package/dist/http/route-response.js +36 -16
  118. package/dist/http/route-response.js.map +1 -1
  119. package/dist/http/route-types.d.ts +12 -4
  120. package/dist/http/route-types.d.ts.map +1 -1
  121. package/dist/http/route-types.js.map +1 -1
  122. package/dist/http/route-validation.d.ts.map +1 -1
  123. package/dist/http/route-validation.js +21 -1
  124. package/dist/http/route-validation.js.map +1 -1
  125. package/dist/jobs/drivers/eventbridge-scheduler-driver.d.ts +1 -0
  126. package/dist/jobs/drivers/eventbridge-scheduler-driver.d.ts.map +1 -1
  127. package/dist/jobs/drivers/eventbridge-scheduler-driver.js +12 -2
  128. package/dist/jobs/drivers/eventbridge-scheduler-driver.js.map +1 -1
  129. package/dist/jobs/drivers/mock-driver.d.ts +4 -0
  130. package/dist/jobs/drivers/mock-driver.d.ts.map +1 -1
  131. package/dist/jobs/drivers/mock-driver.js +10 -3
  132. package/dist/jobs/drivers/mock-driver.js.map +1 -1
  133. package/dist/jobs/drivers/sqs-driver.d.ts +1 -1
  134. package/dist/jobs/drivers/sqs-driver.d.ts.map +1 -1
  135. package/dist/jobs/drivers/sqs-driver.js +8 -2
  136. package/dist/jobs/drivers/sqs-driver.js.map +1 -1
  137. package/dist/jobs/errors.d.ts +14 -1
  138. package/dist/jobs/errors.d.ts.map +1 -1
  139. package/dist/jobs/errors.js +19 -2
  140. package/dist/jobs/errors.js.map +1 -1
  141. package/dist/jobs/index.d.ts +3 -3
  142. package/dist/jobs/index.d.ts.map +1 -1
  143. package/dist/jobs/index.js +1 -1
  144. package/dist/jobs/index.js.map +1 -1
  145. package/dist/jobs/job-service.d.ts +46 -7
  146. package/dist/jobs/job-service.d.ts.map +1 -1
  147. package/dist/jobs/job-service.js +63 -9
  148. package/dist/jobs/job-service.js.map +1 -1
  149. package/dist/jobs/scheduler.d.ts +6 -0
  150. package/dist/jobs/scheduler.d.ts.map +1 -0
  151. package/dist/jobs/scheduler.js +6 -0
  152. package/dist/jobs/scheduler.js.map +1 -0
  153. package/dist/jobs/sqs.d.ts +7 -0
  154. package/dist/jobs/sqs.d.ts.map +1 -0
  155. package/dist/jobs/sqs.js +7 -0
  156. package/dist/jobs/sqs.js.map +1 -0
  157. package/dist/jobs/types.d.ts +6 -1
  158. package/dist/jobs/types.d.ts.map +1 -1
  159. package/dist/jobs/utils.d.ts +6 -0
  160. package/dist/jobs/utils.d.ts.map +1 -1
  161. package/dist/jobs/utils.js +8 -0
  162. package/dist/jobs/utils.js.map +1 -1
  163. package/dist/middleware/rate-limit.d.ts.map +1 -1
  164. package/dist/middleware/rate-limit.js +5 -4
  165. package/dist/middleware/rate-limit.js.map +1 -1
  166. package/dist/observability/exception-tracking.d.ts +23 -0
  167. package/dist/observability/exception-tracking.d.ts.map +1 -1
  168. package/dist/observability/exception-tracking.js +101 -6
  169. package/dist/observability/exception-tracking.js.map +1 -1
  170. package/dist/observability/index.d.ts +1 -1
  171. package/dist/observability/index.d.ts.map +1 -1
  172. package/dist/observability/index.js +1 -1
  173. package/dist/observability/index.js.map +1 -1
  174. package/dist/observability/sanitizers.d.ts.map +1 -1
  175. package/dist/observability/sanitizers.js +2 -0
  176. package/dist/observability/sanitizers.js.map +1 -1
  177. package/dist/openapi/drift.d.ts +17 -2
  178. package/dist/openapi/drift.d.ts.map +1 -1
  179. package/dist/openapi/drift.js +79 -5
  180. package/dist/openapi/drift.js.map +1 -1
  181. package/dist/openapi/openapi.d.ts.map +1 -1
  182. package/dist/openapi/openapi.js +2 -1
  183. package/dist/openapi/openapi.js.map +1 -1
  184. package/dist/utils/environment.d.ts +10 -2
  185. package/dist/utils/environment.d.ts.map +1 -1
  186. package/dist/utils/environment.js +20 -3
  187. package/dist/utils/environment.js.map +1 -1
  188. package/dist/utils/module-interop.d.ts +9 -0
  189. package/dist/utils/module-interop.d.ts.map +1 -0
  190. package/dist/utils/module-interop.js +16 -0
  191. package/dist/utils/module-interop.js.map +1 -0
  192. package/dist/utils/optional-dependency.d.ts +6 -0
  193. package/dist/utils/optional-dependency.d.ts.map +1 -0
  194. package/dist/utils/optional-dependency.js +16 -0
  195. package/dist/utils/optional-dependency.js.map +1 -0
  196. package/dist/utils/serialize-prisma-types.d.ts +51 -15
  197. package/dist/utils/serialize-prisma-types.d.ts.map +1 -1
  198. package/dist/utils/serialize-prisma-types.js +47 -16
  199. package/dist/utils/serialize-prisma-types.js.map +1 -1
  200. package/package.json +56 -12
package/CHANGELOG.md CHANGED
@@ -4,9 +4,61 @@ All notable changes to Glasswork are documented in this file.
4
4
 
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+ [CONTRIBUTING.md](CONTRIBUTING.md) describes how changes are classified.
7
8
 
8
9
  ## [Unreleased]
9
10
 
11
+ ## [1.6.0] - 2026-11-04
12
+
13
+ ### Added
14
+
15
+ - `InvalidSessionError` and `AuthenticationUnavailableException` exports from `glasswork/auth`, distinguishing invalid tokens from unavailable session validation.
16
+ - `detectEnvironment()` export from `glasswork/core`, returning the environment `bootstrap()` uses when no `environment` option is given.
17
+ - `dispose` option for singleton and scoped class and factory providers. Transient disposers are rejected because Awilix does not track transient instances. It runs once per resolved instance when `stop()` disposes the container or when a request or job scope ends; an async factory's disposer receives the resolved value.
18
+ - `async: true` for factory providers that return a promise without being declared `async`, such as transpiled or bundled factories. Bootstrap awaits them like native async factories.
19
+ - `module` option for `providerOverrides`, which replaces a provider in one module only (given as the module or its name), for example when several modules declare a private provider with the same name. An override without `module` that matches several modules logs a warning, and the `ProviderOverride` type is exported from `glasswork/core`.
20
+ - Optional `flush(timeoutMs)` and `close(timeoutMs)` on `ExceptionTracker`, implemented by the CloudWatch tracker, and `flushExceptionTracker()` in `glasswork/observability`, which never throws and reports `{ completed, pending }`. `stop()` flushes the configured tracker after the destroy hooks, within `exceptionTracking.flushTimeoutMs` (default 2000 ms).
21
+ - Subpaths for provider adapters: `glasswork/jobs/sqs`, `glasswork/jobs/scheduler`, `glasswork/email/ses`, `glasswork/email/compiler` and `glasswork/email/webhooks`. `glasswork/jobs` and `glasswork/email` keep exporting everything.
22
+ - `SmtpTransport` in `glasswork/email/smtp`, an SMTP transport backed by the optional `nodemailer` peer (version 7 or later). It sends every message field including attachments, accepts connection options, extra Nodemailer options or your own transporter, reports rejected recipients, and `close()` closes a transporter it created.
23
+ - `writeOpenAPIDocument()` and `diffOpenAPI()` in `glasswork/http`. `assertOpenAPIMatches()` now lists the changed operations and schemas in its error, and `OpenAPIDriftError` exposes them as `differences`.
24
+ - Error responses carry a stable machine-readable `code` next to the `error` message, such as `not-found`, `validation-failed`, `too-many-requests` or `internal-server-error`. Domain exceptions accept `errorCode` to set their own code, the error handler's `responseHandler` receives `code` and the thrown `error`, and `ErrorResponseDto` and `ValidationErrorResponseDto` document the field in OpenAPI.
25
+ - Auth errors use stable codes: `auth-required` (401), `forbidden` (403) and `auth-unavailable` (503), from the auth middleware, route-level `authorize` and `assertCan()`. The auth middleware's `errors` option sets the message and code of its 401 and 403 responses, and `assertCan()` accepts `unauthorizedCode` and `forbiddenCode`.
26
+ - `JobService.enqueueBatchSettled()` enqueues jobs with bounded concurrency (default 10) and returns an accepted or rejected result per item, with an optional caller-provided `key`, so a partial failure can be retried for the rejected items only. `enqueueBatch()` is unchanged; its documentation now describes that it starts all jobs at once and that other jobs can still be accepted after it rejects.
27
+ - `EnqueueHookError` export from `glasswork/jobs`, carrying the accepted queue result and the failed hook as `cause`.
28
+ - `inspectModuleGraph()` and `moduleGraphToMermaid()` in `glasswork/core` describe the module graph (imports, exports, providers with kind, scope and `inject` dependencies, jobs, routes and `forwardRef` cycles) and run the bootstrap configuration checks without creating any provider.
29
+ - `serialization` bootstrap option for every route: `decimals: 'string'` serializes Decimals with `toFixed()` instead of `toNumber()`, so amounts keep every digit and their scale; `strictTypes: true` disables automatic serialization for every route unless a route sets `strictTypes: false`; `transformers` run for every route, after a route's own transformers. Declare the same values in the `GlassworkConfig` interface (module augmentation, like `RouteConfigExtensions`) so handler types follow them: Decimals are then accepted for string fields, and `strictTypes` applies to every handler. The declaration types the option, so `bootstrap()` requires matching values.
30
+ - `createSerializationConfig()` in `glasswork/core` builds a `SerializationConfig` with `decimals` and `transformers` for `serializePrismaTypes()` outside routes; its result type follows the configuration. `SerializationConfig` and `SerializedTypes` take the Decimal serialization as a type parameter, and `DecimalSerialization`, `GlassworkConfig` and `SerializationOptions` are exported.
31
+
32
+ ### Changed
33
+
34
+ - Error response DTOs now require `code`. Permissive decoders continue accepting the responses; strict object decoders and custom `ErrorResponse` producers must update their schemas/types before upgrading. The packed reference consumer covers legacy structural decoding, code translations, auth cookie semantics, and generated error types.
35
+ - A provider that a module cannot see now fails with a `ProviderNotAvailableError` (exported from `glasswork/core`) that lists the providers being created when it was needed and says which module exports or declares it, instead of a generic hint. The message still starts with `Provider "…" is not available in module "…"`.
36
+
37
+ ### Fixed
38
+
39
+ - Installing Glasswork no longer installs `deepmerge`. It was listed as a dependency but never imported, and every `deepmerge` release from 4.2.0 has a prototype poisoning advisory without a fix ([GHSA-gcqx-w48m-w2h4](https://github.com/advisories/GHSA-gcqx-w48m-w2h4)), which security scanners reported for applications using Glasswork.
40
+ - `isProduction()` uses the same detection as `bootstrap()`, so AWS Lambda with `NODE_ENV=test` is no longer production.
41
+ - A status set with `context.status()` is kept when the route declares a schema for it, instead of being replaced by the first schema that accepts the data (for example 201 becoming 200 when both share a schema). Data that fails the schema of the explicit status follows the response validation policy. Without an explicit status, or when the explicit status has no schema, the first matching schema still decides.
42
+ - Route response validation follows the environment resolved by `bootstrap()` instead of reading `NODE_ENV`. An explicit `environment: 'production'`, or AWS Lambda without `NODE_ENV`, now rejects a response that matches no declared schema with a 500 instead of returning the unvalidated data, and hides serialization error messages. An explicit `environment: 'development'` keeps the lenient behavior even when `NODE_ENV=production`.
43
+ - Concurrent `start()` calls resolve only after every `onModuleInit` hook has finished, instead of returning immediately while the first call is still initializing. A failed start keeps rejecting with its original error instead of resolving on the next call, concurrent `stop()` calls share one completion, and `stop()` waits for a pending start. Calling `start()` after `stop()` now rejects.
44
+ - `stop()` no longer creates singleton providers that were never used just to run their `onModuleDestroy` hook. Destroy hooks run for singletons that were resolved and for value providers.
45
+ - Lifecycle hooks all run to completion before `start()` or `stop()` rejects, so one failing `onModuleDestroy` hook no longer leaves the others unawaited. Several failures are reported together in an `AggregateError`; a single failure is rethrown unchanged.
46
+ - `stop()` disposes the container after the `onModuleDestroy` hooks, so Awilix disposers of resolved registrations run when the application stops instead of only on an explicit `container.dispose()`. Disposers also run when a destroy hook failed; stop waits for all disposers and reports multiple failures together. Value providers are never disposed.
47
+ - A failed `bootstrap()` (async factory, route setup or automatic start) runs destroy hooks and disposers for the providers it already created before rejecting, instead of leaving them open without a way to call `stop()`.
48
+ - A singleton factory that returns a promise without being declared `async` or marked `async: true` now fails on resolution with an error naming its module and provider, instead of injecting the pending promise into its consumers (including async factories that `inject` it). Mark such factories with `async: true`.
49
+ - Bootstrap no longer enumerates the container cradle for a debug log. That made Awilix rebuild its registration list once per provider, so bootstrap time grew quadratically with the number of providers, also with debug logging off.
50
+ - Reading a service from a route factory's `services` no longer rebuilds the container's registration list. Each read cost time proportional to the number of providers (about 4.8 ms per request with 300 modules); it is now constant.
51
+ - Async factory initialization, provider overrides, `start()`/`stop()` and a module container's `registrations` read the container registrations once instead of once per provider. With 300 modules of five providers, bootstrap went from about 0.8 s to 10 ms and `start()` from about 1.1 s to 1 ms.
52
+ - The auth middleware no longer treats a provider error during session validation as an invalid session. It answers 503 with an `AuthenticationUnavailableException` (the provider error is its `cause`), keeps the session cookie and skips `onInvalidSession`, instead of clearing the cookie and continuing as a guest. Providers return `null`, or throw the new `InvalidSessionError`, for tokens that are not a valid session.
53
+ - The Better Auth provider rethrows Better Auth failures from `validateSession()` and `refreshSession()` instead of returning `null`. It still returns `null` when there is no session or Better Auth rejects the token with a 401 error.
54
+ - `MockQueueDriver` with `executeImmediately` runs a job declared in a module's `jobs` in a new scope of that module, like the worker. With module boundaries, a local job could not resolve private providers of its own module when the driver was built in a separate jobs module (`Provider "…" is not available in module "jobs"`).
55
+ - `JobService` rejects a payload whose JSON form no longer matches the job schema, such as a `Date` for `v.date()` or a required `undefined` property, with an `InvalidJobPayloadError` at enqueue time. The worker rejected these messages on every attempt. `MockQueueDriver` runs jobs with the JSON form of the payload, so local handlers receive what the worker receives (for example a date string instead of a `Date` for jobs without a schema). Tests that relied on non-JSON payloads locally need JSON values, such as ISO strings with a transform.
56
+ - A job defined with typed services, `defineJob<typeof Schema, Services>()`, can be listed in a module's `jobs` and passed to `JobService`, which typed both for `Record<string, unknown>` services only. `EnqueueableJob` is the job type the enqueue methods accept.
57
+ - Optional dependencies loaded on demand (`@aws-sdk/client-ssm`, `@aws-sdk/client-dynamodb`, `@aws-sdk/lib-dynamodb`, `@aws-sdk/client-cloudwatch`, `dotenv` and `@hono/swagger-ui`) also work when an ESM bundle includes them. A bundler can expose a bundled CommonJS package only as `default`, so `ssmProvider` failed with "SSMClient is not a constructor" unless the application redirected the import to the ESM build.
58
+ - Importing `glasswork/jobs` or `glasswork/email` no longer requires `@aws-sdk/client-sqs`, `@aws-sdk/client-scheduler` or `@aws-sdk/client-sesv2`. The SQS, Scheduler and SES adapters load their client on first use and name the package to install when it is missing.
59
+ - Request validation errors return `issues` as `{ message, path }`, as documented and declared in `ValidationErrorResponseDto`, with `path` as property names and array indexes. They returned the raw schema issues, which also echoed the received input (the full request body, including fields such as passwords) and described the path with objects. Clients that read other issue fields need to use `message` and `path`.
60
+ - When the `onEnqueued` hook of `JobService` fails after the queue accepted a job, `enqueue()`, `enqueueIn()` and `enqueueAt()` reject with an `EnqueueHookError` that carries `accepted: true`, the queue result and the hook error as `cause`, instead of the bare hook error. Callers can tell the job was enqueued and avoid enqueueing it twice. `enqueueBatchSettled()` reports such items as accepted with a `hookError`. Code that inspects the hook error should read `error.cause`.
61
+
10
62
  ## [1.5.0] - 2026-10-31
11
63
 
12
64
  ### Changed
@@ -180,7 +232,8 @@ Major release: subpath exports, dependency upgrades (CASL 7, MJML 5, Valibot 1.4
180
232
 
181
233
  Last 0.x release before the 1.0 breaking changes. Earlier 0.x history is available on [GitHub releases](https://github.com/rolandboon/glasswork/releases).
182
234
 
183
- [Unreleased]: https://github.com/rolandboon/glasswork/compare/v1.5.0...HEAD
235
+ [Unreleased]: https://github.com/rolandboon/glasswork/compare/v1.6.0...HEAD
236
+ [1.6.0]: https://github.com/rolandboon/glasswork/compare/v1.5.0...v1.6.0
184
237
  [1.5.0]: https://github.com/rolandboon/glasswork/compare/v1.4.1...v1.5.0
185
238
  [1.4.1]: https://github.com/rolandboon/glasswork/compare/v1.4.0...v1.4.1
186
239
  [1.4.0]: https://github.com/rolandboon/glasswork/compare/v1.3.0...v1.4.0
package/README.md CHANGED
@@ -140,7 +140,7 @@ export const AuthModule = defineModule({
140
140
  // app.ts
141
141
  import { bootstrap } from 'glasswork/core';
142
142
 
143
- const { app } = bootstrap(AppModule, {
143
+ const { app } = await bootstrap(AppModule, {
144
144
  openapi: {
145
145
  enabled: true,
146
146
  documentation: {
@@ -178,6 +178,7 @@ export default app; // Ready for Lambda or local server
178
178
  ## Contributing
179
179
 
180
180
  Glasswork is in active development. Feedback, issues, and contributions are welcome!
181
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for how changes are classified and released.
181
182
 
182
183
  Builds and typechecks use stable TypeScript 7. Vitest stays on the latest 4.x
183
184
  release to remain compatible with Better Auth's testing peer range. CI runs the
@@ -193,7 +194,10 @@ npm run docs:build
193
194
  ```
194
195
 
195
196
  `npm run smoke:pack` installs the tarball in an isolated npm project, checks its
196
- published types, and imports its public entry points. Set `TYPESCRIPT_VERSION`
197
+ published types, and imports its public entry points. `npm run consumer:reference`
198
+ installs it into the [reference consumer](fixtures/reference-consumer/README.md), a small
199
+ multi-module application, and runs its tests against PostgreSQL
200
+ (`REFERENCE_DATABASE_URL`), its OpenAPI generation and a generated client. Set `TYPESCRIPT_VERSION`
197
201
  to test another supported compiler, for example
198
202
  `TYPESCRIPT_VERSION=5.9.3 npm run smoke:pack` after building. Prisma's development
199
203
  tooling requires Node.js 20.19+, 22.12+, or 24+ on the respective supported lines.
@@ -16,7 +16,12 @@ export interface CreateAuditLoggerOptions<TTx = unknown> {
16
16
  * Each call to `logger.audit(message, entry, options)`:
17
17
  * 1. Resolves ambient request context (actor, impersonation, tenant, correlation ID).
18
18
  * 2. Emits a structured log (`audit: true` with audit attributes) via the underlying logger.
19
- * 3. Persists the resolved audit record atomically using the provided sink.
19
+ * 3. Passes the resolved record to the sink, with `options.tx` when the caller gives one.
20
+ *
21
+ * The log line is written before the sink runs and describes an attempt. When the sink
22
+ * fails, or the caller's transaction rolls back after this call, the line remains while no
23
+ * record exists. The record that the sink writes in the caller's transaction is the
24
+ * authoritative evidence of a completed change.
20
25
  */
21
26
  export declare function createAuditLogger<TTx = unknown>(options: CreateAuditLoggerOptions<TTx>): AuditingLogger<TTx>;
22
27
  //# sourceMappingURL=audit-logger.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"audit-logger.d.ts","sourceRoot":"","sources":["../../src/audit/audit-logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,KAAK,EAAmB,cAAc,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE/F,MAAM,WAAW,wBAAwB,CAAC,GAAG,GAAG,OAAO;IACrD,yCAAyC;IACzC,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;IACrB,2CAA2C;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1E;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,GAAG,OAAO,EAC7C,OAAO,EAAE,wBAAwB,CAAC,GAAG,CAAC,GACrC,cAAc,CAAC,GAAG,CAAC,CA6CrB"}
1
+ {"version":3,"file":"audit-logger.d.ts","sourceRoot":"","sources":["../../src/audit/audit-logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,KAAK,EAAmB,cAAc,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE/F,MAAM,WAAW,wBAAwB,CAAC,GAAG,GAAG,OAAO;IACrD,yCAAyC;IACzC,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;IACrB,2CAA2C;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,GAAG,OAAO,EAC7C,OAAO,EAAE,wBAAwB,CAAC,GAAG,CAAC,GACrC,cAAc,CAAC,GAAG,CAAC,CA6CrB"}
@@ -5,7 +5,12 @@ import { resolveAuditRecord } from './context.js';
5
5
  * Each call to `logger.audit(message, entry, options)`:
6
6
  * 1. Resolves ambient request context (actor, impersonation, tenant, correlation ID).
7
7
  * 2. Emits a structured log (`audit: true` with audit attributes) via the underlying logger.
8
- * 3. Persists the resolved audit record atomically using the provided sink.
8
+ * 3. Passes the resolved record to the sink, with `options.tx` when the caller gives one.
9
+ *
10
+ * The log line is written before the sink runs and describes an attempt. When the sink
11
+ * fails, or the caller's transaction rolls back after this call, the line remains while no
12
+ * record exists. The record that the sink writes in the caller's transaction is the
13
+ * authoritative evidence of a completed change.
9
14
  */
10
15
  export function createAuditLogger(options) {
11
16
  const { sink, logger, service, formatLogPayload } = options;
@@ -1 +1 @@
1
- {"version":3,"file":"audit-logger.js","sourceRoot":"","sources":["../../src/audit/audit-logger.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAclD;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAAsC;IAEtC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC;IAE5D,MAAM,KAAK,GAAG,KAAK,EACjB,OAAe,EACf,KAAsB,EACtB,YAA2B,EACZ,EAAE;QACjB,MAAM,MAAM,GAAG,kBAAkB,CAC/B;YACE,GAAG,KAAK;YACR,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,OAAO;SAClC,EACD,OAAO,CACR,CAAC;QAEF,MAAM,UAAU,GAAG,gBAAgB;YACjC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC;YAC1B,CAAC,CAAC;gBACE,KAAK,EAAE,IAAI;gBACX,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,eAAe,EAAE,MAAM,CAAC,eAAe;gBACvC,eAAe,EAAE,MAAM,CAAC,eAAe;gBACvC,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;aAC1B,CAAC;QAEN,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAEjC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC1C,CAAC,CAAC;IAEF,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;QAChC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;QAC9B,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;QAC9B,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;QAChC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;QACjC,KAAK;KACN,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"audit-logger.js","sourceRoot":"","sources":["../../src/audit/audit-logger.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAclD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAAsC;IAEtC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC;IAE5D,MAAM,KAAK,GAAG,KAAK,EACjB,OAAe,EACf,KAAsB,EACtB,YAA2B,EACZ,EAAE;QACjB,MAAM,MAAM,GAAG,kBAAkB,CAC/B;YACE,GAAG,KAAK;YACR,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,OAAO;SAClC,EACD,OAAO,CACR,CAAC;QAEF,MAAM,UAAU,GAAG,gBAAgB;YACjC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC;YAC1B,CAAC,CAAC;gBACE,KAAK,EAAE,IAAI;gBACX,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,eAAe,EAAE,MAAM,CAAC,eAAe;gBACvC,eAAe,EAAE,MAAM,CAAC,eAAe;gBACvC,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;aAC1B,CAAC;QAEN,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAEjC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC1C,CAAC,CAAC;IAEF,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;QAChC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;QAC9B,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;QAC9B,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;QAChC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;QACjC,KAAK;KACN,CAAC;AACJ,CAAC"}
@@ -10,6 +10,10 @@ type AuthorizableSubject = string | {
10
10
  export declare function assertCan<TAbility extends AnyAbility>(ability: TAbility | undefined, action: string, subject: AuthorizableSubject, opts?: {
11
11
  unauthorizedMessage?: string;
12
12
  forbiddenMessage?: string;
13
+ /** Stable client code of the 401 (default `auth-required`). */
14
+ unauthorizedCode?: string;
15
+ /** Stable client code of the 403 (default `forbidden`). */
16
+ forbiddenCode?: string;
13
17
  isAuthenticated?: boolean;
14
18
  }): void;
15
19
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"assert.d.ts","sourceRoot":"","sources":["../../src/auth/assert.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,eAAe,CAAC;AAGvD,KAAK,mBAAmB,GAAG,MAAM,GAAG;IAAE,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAErE;;;GAGG;AACH,wBAAgB,SAAS,CAAC,QAAQ,SAAS,UAAU,EACnD,OAAO,EAAE,QAAQ,GAAG,SAAS,EAC7B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,mBAAmB,EAC5B,IAAI,CAAC,EAAE;IAAE,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5F,IAAI,CAgBN;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,QAAQ,SAAS,UAAU,EAC7C,OAAO,EAAE,QAAQ,GAAG,SAAS,EAC7B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAGT;AAED,OAAO,EAAE,WAAW,IAAI,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"assert.d.ts","sourceRoot":"","sources":["../../src/auth/assert.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,eAAe,CAAC;AAGvD,KAAK,mBAAmB,GAAG,MAAM,GAAG;IAAE,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAErE;;;GAGG;AACH,wBAAgB,SAAS,CAAC,QAAQ,SAAS,UAAU,EACnD,OAAO,EAAE,QAAQ,GAAG,SAAS,EAC7B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,mBAAmB,EAC5B,IAAI,CAAC,EAAE;IACL,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,+DAA+D;IAC/D,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2DAA2D;IAC3D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,GACA,IAAI,CAqBN;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,QAAQ,SAAS,UAAU,EAC7C,OAAO,EAAE,QAAQ,GAAG,SAAS,EAC7B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAGT;AAED,OAAO,EAAE,WAAW,IAAI,OAAO,EAAE,CAAC"}
@@ -6,14 +6,18 @@ import { ForbiddenException, UnauthorizedException } from '../http/errors.js';
6
6
  */
7
7
  export function assertCan(ability, action, subject, opts) {
8
8
  if (!ability) {
9
- throw new UnauthorizedException(opts?.unauthorizedMessage ?? 'Authentication required');
9
+ throw new UnauthorizedException(opts?.unauthorizedMessage ?? 'Authentication required', {
10
+ errorCode: opts?.unauthorizedCode ?? 'auth-required',
11
+ });
10
12
  }
11
13
  const canPerform = ability.can(action, subject);
12
14
  if (!canPerform) {
13
15
  if (opts?.isAuthenticated === false) {
14
- throw new UnauthorizedException(opts?.unauthorizedMessage ?? 'Authentication required');
16
+ throw new UnauthorizedException(opts?.unauthorizedMessage ?? 'Authentication required', {
17
+ errorCode: opts?.unauthorizedCode ?? 'auth-required',
18
+ });
15
19
  }
16
- throw new ForbiddenException(opts?.forbiddenMessage ?? `You don't have permission to ${action} this resource`);
20
+ throw new ForbiddenException(opts?.forbiddenMessage ?? `You don't have permission to ${action} this resource`, { errorCode: opts?.forbiddenCode ?? 'forbidden' });
17
21
  }
18
22
  }
19
23
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"assert.js","sourceRoot":"","sources":["../../src/auth/assert.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAI9E;;;GAGG;AACH,MAAM,UAAU,SAAS,CACvB,OAA6B,EAC7B,MAAc,EACd,OAA4B,EAC5B,IAA6F;IAE7F,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,qBAAqB,CAAC,IAAI,EAAE,mBAAmB,IAAI,yBAAyB,CAAC,CAAC;IAC1F,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAgB,CAAC,CAAC;IAEzD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,IAAI,IAAI,EAAE,eAAe,KAAK,KAAK,EAAE,CAAC;YACpC,MAAM,IAAI,qBAAqB,CAAC,IAAI,EAAE,mBAAmB,IAAI,yBAAyB,CAAC,CAAC;QAC1F,CAAC;QAED,MAAM,IAAI,kBAAkB,CAC1B,IAAI,EAAE,gBAAgB,IAAI,gCAAgC,MAAM,gBAAgB,CACjF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,GAAG,CACjB,OAA6B,EAC7B,MAAc,EACd,OAA4B;IAE5B,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAgB,CAAC,CAAC;AAC/C,CAAC;AAED,OAAO,EAAE,WAAW,IAAI,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"assert.js","sourceRoot":"","sources":["../../src/auth/assert.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAI9E;;;GAGG;AACH,MAAM,UAAU,SAAS,CACvB,OAA6B,EAC7B,MAAc,EACd,OAA4B,EAC5B,IAQC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,qBAAqB,CAAC,IAAI,EAAE,mBAAmB,IAAI,yBAAyB,EAAE;YACtF,SAAS,EAAE,IAAI,EAAE,gBAAgB,IAAI,eAAe;SACrD,CAAC,CAAC;IACL,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAgB,CAAC,CAAC;IAEzD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,IAAI,IAAI,EAAE,eAAe,KAAK,KAAK,EAAE,CAAC;YACpC,MAAM,IAAI,qBAAqB,CAAC,IAAI,EAAE,mBAAmB,IAAI,yBAAyB,EAAE;gBACtF,SAAS,EAAE,IAAI,EAAE,gBAAgB,IAAI,eAAe;aACrD,CAAC,CAAC;QACL,CAAC;QAED,MAAM,IAAI,kBAAkB,CAC1B,IAAI,EAAE,gBAAgB,IAAI,gCAAgC,MAAM,gBAAgB,EAChF,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,IAAI,WAAW,EAAE,CAClD,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,GAAG,CACjB,OAA6B,EAC7B,MAAc,EACd,OAA4B;IAE5B,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAgB,CAAC,CAAC;AAC/C,CAAC;AAED,OAAO,EAAE,WAAW,IAAI,OAAO,EAAE,CAAC"}
@@ -26,8 +26,10 @@ export function createBetterAuthProvider(config) {
26
26
  user: (mapUser ?? defaultMapUser)(result.user),
27
27
  };
28
28
  }
29
- catch {
30
- return null;
29
+ catch (error) {
30
+ if (isRejectedToken(error))
31
+ return null;
32
+ throw error;
31
33
  }
32
34
  },
33
35
  async invalidateSession(token) {
@@ -46,12 +48,19 @@ export function createBetterAuthProvider(config) {
46
48
  });
47
49
  return result?.session ? mapSession(result.session) : null;
48
50
  }
49
- catch {
50
- return null;
51
+ catch (error) {
52
+ if (isRejectedToken(error))
53
+ return null;
54
+ throw error;
51
55
  }
52
56
  },
53
57
  };
54
58
  }
59
+ /** Only an unauthorized result proves rejection; rate limits and other failures do not. */
60
+ function isRejectedToken(error) {
61
+ const statusCode = error?.statusCode;
62
+ return statusCode === 401;
63
+ }
55
64
  function mapSession(session) {
56
65
  return {
57
66
  id: String(session.id),
@@ -1 +1 @@
1
- {"version":3,"file":"better-auth-provider.js","sourceRoot":"","sources":["../../src/auth/better-auth-provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"better-auth-provider.js","sourceRoot":"","sources":["../../src/auth/better-auth-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { ServiceUnavailableException } from '../http/errors.js';
2
+ /**
3
+ * Thrown by an auth provider when a token is definitely not a valid session, for providers
4
+ * that report invalid sessions with an error instead of returning null. The middleware treats
5
+ * it like null: guest context, and the session cookie is cleared.
6
+ */
7
+ export declare class InvalidSessionError extends Error {
8
+ constructor(message?: string, options?: ErrorOptions);
9
+ }
10
+ /**
11
+ * The auth provider failed to validate a session, for example because its database was
12
+ * unreachable. Answers 503 and keeps the session cookie; the provider error is the `cause`.
13
+ */
14
+ export declare class AuthenticationUnavailableException extends ServiceUnavailableException {
15
+ constructor(cause: unknown);
16
+ }
17
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/auth/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAEhE;;;;GAIG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,OAAO,SAAoB,EAAE,OAAO,CAAC,EAAE,YAAY,EAG9D;CACF;AAED;;;GAGG;AACH,qBAAa,kCAAmC,SAAQ,2BAA2B;IACjF,YAAY,KAAK,EAAE,OAAO,EAGzB;CACF"}
@@ -0,0 +1,23 @@
1
+ import { ServiceUnavailableException } from '../http/errors.js';
2
+ /**
3
+ * Thrown by an auth provider when a token is definitely not a valid session, for providers
4
+ * that report invalid sessions with an error instead of returning null. The middleware treats
5
+ * it like null: guest context, and the session cookie is cleared.
6
+ */
7
+ export class InvalidSessionError extends Error {
8
+ constructor(message = 'Invalid session', options) {
9
+ super(message, options);
10
+ this.name = 'InvalidSessionError';
11
+ }
12
+ }
13
+ /**
14
+ * The auth provider failed to validate a session, for example because its database was
15
+ * unreachable. Answers 503 and keeps the session cookie; the provider error is the `cause`.
16
+ */
17
+ export class AuthenticationUnavailableException extends ServiceUnavailableException {
18
+ constructor(cause) {
19
+ super('Authentication is temporarily unavailable', { errorCode: 'auth-unavailable' });
20
+ this.cause = cause;
21
+ }
22
+ }
23
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/auth/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAEhE;;;;GAIG;AACH,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,OAAO,GAAG,iBAAiB,EAAE,OAAsB;QAC7D,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,kCAAmC,SAAQ,2BAA2B;IACjF,YAAY,KAAc;QACxB,KAAK,CAAC,2CAA2C,EAAE,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC,CAAC;QACtF,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF"}
@@ -2,6 +2,7 @@ export { createAbilityFactory, defineRoleAbilities, type InferAbility, } from '.
2
2
  export { assertCan, can, subject } from './assert.js';
3
3
  export { type BetterAuthClient, type BetterAuthProviderConfig, createBetterAuthProvider, } from './better-auth-provider.js';
4
4
  export { type PrismaAbilityFactory, registerAuthCasl } from './casl-bridge.js';
5
- export { type AuthAuthorizeConfig, type AuthMiddleware, type AuthMiddlewareConfig, createAuthMiddleware, } from './middleware.js';
5
+ export { AuthenticationUnavailableException, InvalidSessionError } from './errors.js';
6
+ export { type AuthAuthorizeConfig, type AuthErrorOptions, type AuthErrorResponse, type AuthMiddleware, type AuthMiddlewareConfig, createAuthMiddleware, } from './middleware.js';
6
7
  export type { AuthContext, AuthenticatedAuthContext, AuthProvider, AuthSession, AuthUser, } from './types.js';
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,KAAK,YAAY,GAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,EAC7B,wBAAwB,GACzB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,KAAK,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAE/E,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,WAAW,EACX,wBAAwB,EACxB,YAAY,EACZ,WAAW,EACX,QAAQ,GACT,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,KAAK,YAAY,GAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,EAC7B,wBAAwB,GACzB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,KAAK,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EAAE,kCAAkC,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEtF,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,WAAW,EACX,wBAAwB,EACxB,YAAY,EACZ,WAAW,EACX,QAAQ,GACT,MAAM,YAAY,CAAC"}
@@ -2,5 +2,6 @@ export { createAbilityFactory, defineRoleAbilities, } from './abilities.js';
2
2
  export { assertCan, can, subject } from './assert.js';
3
3
  export { createBetterAuthProvider, } from './better-auth-provider.js';
4
4
  export { registerAuthCasl } from './casl-bridge.js';
5
+ export { AuthenticationUnavailableException, InvalidSessionError } from './errors.js';
5
6
  export { createAuthMiddleware, } from './middleware.js';
6
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,mBAAmB,GAEpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAGL,wBAAwB,GACzB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAA6B,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAE/E,OAAO,EAIL,oBAAoB,GACrB,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,mBAAmB,GAEpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAGL,wBAAwB,GACzB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAA6B,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EAAE,kCAAkC,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEtF,OAAO,EAML,oBAAoB,GACrB,MAAM,iBAAiB,CAAC"}
@@ -16,6 +16,19 @@ export interface AuthMiddlewareConfig<TUser extends AuthUser = AuthUser, TAbilit
16
16
  guestAbility?: () => TAbility;
17
17
  /** Called when a session token is invalid. */
18
18
  onInvalidSession?: (c: Context) => void | Promise<void>;
19
+ /** Messages and stable codes of the errors this middleware throws. */
20
+ errors?: AuthErrorOptions;
21
+ }
22
+ /** Message and stable client code of an auth error response. */
23
+ export interface AuthErrorResponse {
24
+ message?: string;
25
+ code?: string;
26
+ }
27
+ export interface AuthErrorOptions {
28
+ /** 401 when a request needs a session and has none (default code `auth-required`). */
29
+ authenticationRequired?: AuthErrorResponse;
30
+ /** 403 when the ability denies `authorize` (default code `forbidden`). */
31
+ forbidden?: AuthErrorResponse;
19
32
  }
20
33
  export type AuthAuthorizeConfig<TAbility extends AnyAbility = AnyAbility> = {
21
34
  action: Parameters<TAbility['can']>[0];
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/auth/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAQ,MAAM,MAAM,CAAC;AAI7D,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEnF,MAAM,WAAW,oBAAoB,CACnC,KAAK,SAAS,QAAQ,GAAG,QAAQ,EACjC,QAAQ,SAAS,UAAU,GAAG,UAAU,EACxC,QAAQ,SAAS,WAAW,GAAG,WAAW;IAE1C,8BAA8B;IAC9B,QAAQ,EAAE,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACxC,2CAA2C;IAC3C,YAAY,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,QAAQ,CAAC;IACxC,8EAA8E;IAC9E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,qCAAqC;IACrC,YAAY,CAAC,EAAE,MAAM,QAAQ,CAAC;IAC9B,8CAA8C;IAC9C,gBAAgB,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzD;AAED,MAAM,MAAM,mBAAmB,CAAC,QAAQ,SAAS,UAAU,GAAG,UAAU,IAAI;IAC1E,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,OAAO,EAAE,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACzC,CAAC;AAEF,KAAK,eAAe,CAClB,KAAK,SAAS,QAAQ,EACtB,QAAQ,SAAS,UAAU,EAC3B,QAAQ,SAAS,WAAW,IAC1B;IACF,SAAS,EAAE,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;CACnD,CAAC;AAEF,MAAM,MAAM,cAAc,CACxB,KAAK,SAAS,QAAQ,GAAG,QAAQ,EACjC,QAAQ,SAAS,UAAU,GAAG,UAAU,EACxC,QAAQ,SAAS,WAAW,GAAG,WAAW,IACxC,CACF,SAAS,CAAC,EAAE,mBAAmB,CAAC,QAAQ,CAAC,KACtC,iBAAiB,CAAC,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;AAEnE;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,SAAS,QAAQ,GAAG,QAAQ,EACjC,QAAQ,SAAS,UAAU,GAAG,UAAU,EACxC,QAAQ,SAAS,WAAW,GAAG,WAAW,EAE1C,MAAM,EAAE,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,GACtD,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CA4C3C"}
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/auth/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAQ,MAAM,MAAM,CAAC;AAK7D,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEnF,MAAM,WAAW,oBAAoB,CACnC,KAAK,SAAS,QAAQ,GAAG,QAAQ,EACjC,QAAQ,SAAS,UAAU,GAAG,UAAU,EACxC,QAAQ,SAAS,WAAW,GAAG,WAAW;IAE1C,8BAA8B;IAC9B,QAAQ,EAAE,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACxC,2CAA2C;IAC3C,YAAY,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,QAAQ,CAAC;IACxC,8EAA8E;IAC9E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,qCAAqC;IACrC,YAAY,CAAC,EAAE,MAAM,QAAQ,CAAC;IAC9B,8CAA8C;IAC9C,gBAAgB,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,sEAAsE;IACtE,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC3B;AAED,gEAAgE;AAChE,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,sFAAsF;IACtF,sBAAsB,CAAC,EAAE,iBAAiB,CAAC;IAC3C,0EAA0E;IAC1E,SAAS,CAAC,EAAE,iBAAiB,CAAC;CAC/B;AAED,MAAM,MAAM,mBAAmB,CAAC,QAAQ,SAAS,UAAU,GAAG,UAAU,IAAI;IAC1E,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,OAAO,EAAE,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACzC,CAAC;AAEF,KAAK,eAAe,CAClB,KAAK,SAAS,QAAQ,EACtB,QAAQ,SAAS,UAAU,EAC3B,QAAQ,SAAS,WAAW,IAC1B;IACF,SAAS,EAAE,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;CACnD,CAAC;AAEF,MAAM,MAAM,cAAc,CACxB,KAAK,SAAS,QAAQ,GAAG,QAAQ,EACjC,QAAQ,SAAS,UAAU,GAAG,UAAU,EACxC,QAAQ,SAAS,WAAW,GAAG,WAAW,IACxC,CACF,SAAS,CAAC,EAAE,mBAAmB,CAAC,QAAQ,CAAC,KACtC,iBAAiB,CAAC,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;AAEnE;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,SAAS,QAAQ,GAAG,QAAQ,EACjC,QAAQ,SAAS,UAAU,GAAG,UAAU,EACxC,QAAQ,SAAS,WAAW,GAAG,WAAW,EAE1C,MAAM,EAAE,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,GACtD,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CA6C3C"}
@@ -2,11 +2,12 @@ import { Ability } from '@casl/ability';
2
2
  import { deleteCookie, getCookie } from 'hono/cookie';
3
3
  import { ForbiddenException, UnauthorizedException } from '../http/errors.js';
4
4
  import { setRequestAuth } from '../observability/request-context.js';
5
+ import { AuthenticationUnavailableException, InvalidSessionError } from './errors.js';
5
6
  /**
6
7
  * Create auth middleware that validates sessions and builds abilities.
7
8
  */
8
9
  export function createAuthMiddleware(config) {
9
- const { provider, buildAbility, cookieName: configuredCookieName, headerName = 'Authorization', allowGuest = true, guestAbility, onInvalidSession, } = config;
10
+ const { provider, buildAbility, cookieName: configuredCookieName, headerName = 'Authorization', allowGuest = true, guestAbility, onInvalidSession, errors = {}, } = config;
10
11
  return function authMiddleware(authorize) {
11
12
  return async (c, next) => {
12
13
  const cookieName = configuredCookieName ??
@@ -23,10 +24,10 @@ export function createAuthMiddleware(config) {
23
24
  applyAuthContext(c, state);
24
25
  if (!state.isAuthenticated && !allowGuest) {
25
26
  await clearInvalidSession(c, state.shouldClearCookie, cookieName, onInvalidSession);
26
- throw new UnauthorizedException('Authentication required');
27
+ throw authenticationRequired(errors);
27
28
  }
28
29
  if (authorize) {
29
- enforceAuthorization(authorize, state);
30
+ enforceAuthorization(authorize, state, errors);
30
31
  }
31
32
  await next();
32
33
  await clearInvalidSession(c, state.shouldClearCookie, cookieName, onInvalidSession);
@@ -58,12 +59,18 @@ async function resolveAuthState(c, options) {
58
59
  shouldClearCookie,
59
60
  };
60
61
  }
62
+ /**
63
+ * null and InvalidSessionError mean the token is not a valid session. Any other error means
64
+ * the provider could not tell, so the request fails without treating the user as logged out.
65
+ */
61
66
  async function validateSession(provider, token) {
62
67
  try {
63
68
  return await provider.validateSession(token);
64
69
  }
65
- catch {
66
- return null;
70
+ catch (error) {
71
+ if (error instanceof InvalidSessionError)
72
+ return null;
73
+ throw new AuthenticationUnavailableException(error);
67
74
  }
68
75
  }
69
76
  function applyAuthContext(c, state) {
@@ -79,14 +86,18 @@ function applyAuthContext(c, state) {
79
86
  });
80
87
  }
81
88
  }
82
- function enforceAuthorization(authorize, state) {
89
+ function enforceAuthorization(authorize, state, errors) {
83
90
  if (!state.ability.can(authorize.action, authorize.subject)) {
84
91
  if (!state.isAuthenticated) {
85
- throw new UnauthorizedException('Authentication required');
92
+ throw authenticationRequired(errors);
86
93
  }
87
- throw new ForbiddenException(`You don't have permission to ${authorize.action} ${authorize.subject}`);
94
+ throw new ForbiddenException(errors.forbidden?.message ??
95
+ `You don't have permission to ${authorize.action} ${authorize.subject}`, { errorCode: errors.forbidden?.code ?? 'forbidden' });
88
96
  }
89
97
  }
98
+ function authenticationRequired(errors) {
99
+ return new UnauthorizedException(errors.authenticationRequired?.message ?? 'Authentication required', { errorCode: errors.authenticationRequired?.code ?? 'auth-required' });
100
+ }
90
101
  async function clearInvalidSession(c, shouldClearCookie, cookieName, onInvalidSession) {
91
102
  if (!shouldClearCookie)
92
103
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/auth/middleware.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/auth/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAmB,MAAM,eAAe,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,kCAAkC,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AA4DtF;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAKlC,MAAuD;IAEvD,MAAM,EACJ,QAAQ,EACR,YAAY,EACZ,UAAU,EAAE,oBAAoB,EAChC,UAAU,GAAG,eAAe,EAC5B,UAAU,GAAG,IAAI,EACjB,YAAY,EACZ,gBAAgB,EAChB,MAAM,GAAG,EAAE,GACZ,GAAG,MAAM,CAAC;IAEX,OAAO,SAAS,cAAc,CAC5B,SAAyC;QAEzC,OAAO,KAAK,EAAE,CAAsD,EAAE,IAAU,EAAE,EAAE;YAClF,MAAM,UAAU,GACd,oBAAoB;gBACpB,CAAC,MAAM,QAAQ,CAAC,oBAAoB,EAAE,EAAE,CAAC;gBACzC,QAAQ,CAAC,iBAAiB;gBAC1B,SAAS,CAAC;YACZ,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,CAAC,EAAE;gBACtC,UAAU;gBACV,UAAU;gBACV,QAAQ;gBACR,YAAY;gBACZ,YAAY;aACb,CAAC,CAAC;YAEH,gBAAgB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAE3B,IAAI,CAAC,KAAK,CAAC,eAAe,IAAI,CAAC,UAAU,EAAE,CAAC;gBAC1C,MAAM,mBAAmB,CAAC,CAAC,EAAE,KAAK,CAAC,iBAAiB,EAAE,UAAU,EAAE,gBAAgB,CAAC,CAAC;gBACpF,MAAM,sBAAsB,CAAC,MAAM,CAAC,CAAC;YACvC,CAAC;YAED,IAAI,SAAS,EAAE,CAAC;gBACd,oBAAoB,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YACjD,CAAC;YAED,MAAM,IAAI,EAAE,CAAC;YAEb,MAAM,mBAAmB,CAAC,CAAC,EAAE,KAAK,CAAC,iBAAiB,EAAE,UAAU,EAAE,gBAAgB,CAAC,CAAC;QACtF,CAAC,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAUD,KAAK,UAAU,gBAAgB,CAK7B,CAAU,EACV,OAMC;IAED,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,IAAI,kBAAkB,CAAC,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5F,IAAI,IAAI,GAAiB,IAAI,CAAC;IAC9B,IAAI,OAAO,GAAoB,IAAI,CAAC;IACpC,IAAI,iBAAiB,GAAG,KAAK,CAAC;IAE9B,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC9D,IAAI,MAAM,EAAE,CAAC;YACX,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,iBAAiB,GAAG,IAAI,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,IAAI;QAClB,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC;QAC5B,CAAC,CAAE,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,IAAI,kBAAkB,EAAE,CAAc,CAAC;IAErE,OAAO;QACL,IAAI;QACJ,OAAO;QACP,OAAO;QACP,eAAe,EAAE,OAAO,CAAC,IAAI,CAAC;QAC9B,iBAAiB;KAClB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,eAAe,CAC5B,QAAuC,EACvC,KAAa;IAEb,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,mBAAmB;YAAE,OAAO,IAAI,CAAC;QACtD,MAAM,IAAI,kCAAkC,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAKvB,CAAsD,EACtD,KAA2C;IAE3C,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC,CAAC,GAAG,CAAC,iBAAiB,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;IAEhD,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;QACnB,cAAc,CAAC;YACb,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE;YACrB,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ;YAC7B,cAAc,EAAE,KAAK,CAAC,OAAO,EAAE,cAAc;SAC9C,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAK3B,SAAwC,EACxC,KAA2C,EAC3C,MAAwB;IAExB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,OAAgB,CAAC,EAAE,CAAC;QACrE,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;YAC3B,MAAM,sBAAsB,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC;QAED,MAAM,IAAI,kBAAkB,CAC1B,MAAM,CAAC,SAAS,EAAE,OAAO;YACvB,gCAAgC,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,OAAO,EAAE,EACzE,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,IAAI,IAAI,WAAW,EAAE,CACrD,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAAC,MAAwB;IACtD,OAAO,IAAI,qBAAqB,CAC9B,MAAM,CAAC,sBAAsB,EAAE,OAAO,IAAI,yBAAyB,EACnE,EAAE,SAAS,EAAE,MAAM,CAAC,sBAAsB,EAAE,IAAI,IAAI,eAAe,EAAE,CACtE,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,CAAU,EACV,iBAA0B,EAC1B,UAAkB,EAClB,gBAAuD;IAEvD,IAAI,CAAC,iBAAiB;QAAE,OAAO;IAE/B,iGAAiG;IACjG,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IACtF,YAAY,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAChF,MAAM,gBAAgB,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,kBAAkB,CAAC,CAAU,EAAE,UAAkB;IACxD,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,IAAI,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,kBAAkB;IACzB,OAAO,IAAI,OAAO,CAAC,EAAE,CAAC,CAAC;AACzB,CAAC"}
@@ -34,6 +34,10 @@ export interface AuthProvider<TUser extends AuthUser = AuthUser, TSession extend
34
34
  getSessionCookieName?(): Promise<string>;
35
35
  /**
36
36
  * Validate a session token/ID and return session + user.
37
+ *
38
+ * Return null (or throw `InvalidSessionError`) when the token is not a valid session. Throw
39
+ * any other error when validation itself failed, such as an unreachable database: the
40
+ * middleware then answers 503 and keeps the session cookie.
37
41
  */
38
42
  validateSession(token: string): Promise<{
39
43
  session: TSession;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,cAAc,CAAC,EAAE,IAAI,CAAC;IACtB,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,YAAY,CAC3B,KAAK,SAAS,QAAQ,GAAG,QAAQ,EACjC,QAAQ,SAAS,WAAW,GAAG,WAAW;IAE1C,iCAAiC;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,gFAAgF;IAChF,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,mFAAmF;IACnF,oBAAoB,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAEzC;;OAEG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QACtC,OAAO,EAAE,QAAQ,CAAC;QAClB,IAAI,EAAE,KAAK,CAAC;KACb,GAAG,IAAI,CAAC,CAAC;IAEV;;OAEG;IACH,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhD;;OAEG;IACH,cAAc,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;CAC1D;AAED;;GAEG;AACH,MAAM,WAAW,WAAW,CAC1B,KAAK,SAAS,QAAQ,GAAG,QAAQ,EACjC,QAAQ,SAAS,WAAW,GAAG,WAAW,EAC1C,QAAQ,SAAS,UAAU,GAAG,UAAU;IAExC,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC;IACnB,OAAO,EAAE,QAAQ,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,QAAQ,CAAC;IAClB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,MAAM,wBAAwB,CAClC,KAAK,SAAS,QAAQ,GAAG,QAAQ,EACjC,QAAQ,SAAS,WAAW,GAAG,WAAW,EAC1C,QAAQ,SAAS,UAAU,GAAG,UAAU,IACtC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,iBAAiB,CAAC,GAAG;IACzF,IAAI,EAAE,KAAK,CAAC;IACZ,OAAO,EAAE,QAAQ,CAAC;IAClB,eAAe,EAAE,IAAI,CAAC;CACvB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,cAAc,CAAC,EAAE,IAAI,CAAC;IACtB,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,YAAY,CAC3B,KAAK,SAAS,QAAQ,GAAG,QAAQ,EACjC,QAAQ,SAAS,WAAW,GAAG,WAAW;IAE1C,iCAAiC;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,gFAAgF;IAChF,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,mFAAmF;IACnF,oBAAoB,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAEzC;;;;;;OAMG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QACtC,OAAO,EAAE,QAAQ,CAAC;QAClB,IAAI,EAAE,KAAK,CAAC;KACb,GAAG,IAAI,CAAC,CAAC;IAEV;;OAEG;IACH,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhD;;OAEG;IACH,cAAc,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;CAC1D;AAED;;GAEG;AACH,MAAM,WAAW,WAAW,CAC1B,KAAK,SAAS,QAAQ,GAAG,QAAQ,EACjC,QAAQ,SAAS,WAAW,GAAG,WAAW,EAC1C,QAAQ,SAAS,UAAU,GAAG,UAAU;IAExC,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC;IACnB,OAAO,EAAE,QAAQ,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,QAAQ,CAAC;IAClB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,MAAM,wBAAwB,CAClC,KAAK,SAAS,QAAQ,GAAG,QAAQ,EACjC,QAAQ,SAAS,WAAW,GAAG,WAAW,EAC1C,QAAQ,SAAS,UAAU,GAAG,UAAU,IACtC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,iBAAiB,CAAC,GAAG;IACzF,IAAI,EAAE,KAAK,CAAC;IACZ,OAAO,EAAE,QAAQ,CAAC;IAClB,eAAe,EAAE,IAAI,CAAC;CACvB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/config/providers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,cAAc,CAuB5E;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,qBAA0B,GAAG,cAAc,CAwBlF;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAEjB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;;;;;;;;;;OAWG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AA8ED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,cAAc,CAqCvE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,cAAc,CAE9E"}
1
+ {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/config/providers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,cAAc,CAuB5E;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,qBAA0B,GAAG,cAAc,CAwBlF;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAEjB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;;;;;;;;;;OAWG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AA8ED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,cAAc,CAqCvE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,cAAc,CAE9E"}
@@ -3,6 +3,7 @@
3
3
  *
4
4
  * @module config/providers
5
5
  */
6
+ import { namedExports } from '../utils/module-interop.js';
6
7
  /**
7
8
  * Creates a provider that loads configuration from process.env.
8
9
  *
@@ -63,7 +64,7 @@ export function dotenvProvider(options = {}) {
63
64
  try {
64
65
  // Dynamic import to keep it optional
65
66
  const fs = await import('node:fs');
66
- const dotenv = await import('dotenv');
67
+ const dotenv = namedExports(await import('dotenv'));
67
68
  const content = fs.readFileSync(path, { encoding });
68
69
  const parsed = dotenv.parse(content);
69
70
  return parsed;
@@ -84,7 +85,7 @@ export function dotenvProvider(options = {}) {
84
85
  * Fetches parameters from SSM by path.
85
86
  */
86
87
  async function fetchParametersByPath(client, path, withDecryption, removePrefix) {
87
- const { GetParametersByPathCommand } = await import('@aws-sdk/client-ssm');
88
+ const { GetParametersByPathCommand } = namedExports(await import('@aws-sdk/client-ssm'));
88
89
  const config = {};
89
90
  let nextToken;
90
91
  do {
@@ -109,7 +110,7 @@ async function fetchParametersByPath(client, path, withDecryption, removePrefix)
109
110
  * Fetches specific parameters from SSM by name.
110
111
  */
111
112
  async function fetchParametersByName(client, names, withDecryption) {
112
- const { GetParametersCommand } = await import('@aws-sdk/client-ssm');
113
+ const { GetParametersCommand } = namedExports(await import('@aws-sdk/client-ssm'));
113
114
  const config = {};
114
115
  const command = new GetParametersCommand({
115
116
  Names: names,
@@ -149,7 +150,7 @@ export function ssmProvider(options) {
149
150
  }
150
151
  try {
151
152
  // Dynamic import to keep AWS SDK optional
152
- const { SSMClient } = await import('@aws-sdk/client-ssm');
153
+ const { SSMClient } = namedExports(await import('@aws-sdk/client-ssm'));
153
154
  const client = new SSMClient({ region });
154
155
  if (path) {
155
156
  return await fetchParametersByPath(client, path, withDecryption, removePrefix);
@@ -1 +1 @@
1
- {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/config/providers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/config/providers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAwB1D;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,WAAW,CAAC,OAAO,GAAuB,EAAE;IAC1D,OAAO,KAAK,IAAI,EAAE;QAChB,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;QAChD,MAAM,MAAM,GAA4B,EAAE,CAAC;QAE3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACvD,IAAI,KAAK,KAAK,SAAS;gBAAE,SAAS;YAElC,iCAAiC;YACjC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;gBACpB,SAAS;YACX,CAAC;YAED,qBAAqB;YACrB,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3B,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;gBAC/D,MAAM,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC;AA4BD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,cAAc,CAAC,OAAO,GAA0B,EAAE;IAChE,OAAO,KAAK,IAAI,EAAE;QAChB,MAAM,EAAE,IAAI,GAAG,MAAM,EAAE,QAAQ,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC;QAErD,IAAI,CAAC;YACH,qCAAqC;YACrC,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;YACnC,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAEpD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;YACpD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAErC,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,qEAAqE;YACrE,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvD,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,IAAK,KAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;gBAC9D,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;YAChF,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAmDD;;GAEG;AACH,KAAK,UAAU,qBAAqB,CAClC,MAAe,EACf,IAAY,EACZ,cAAuB,EACvB,YAAqB;IAErB,MAAM,EAAE,0BAA0B,EAAE,GAAG,YAAY,CAAC,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC;IACzF,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,IAAI,SAA6B,CAAC;IAElC,GAAG,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,0BAA0B,CAAC;YAC7C,IAAI,EAAE,IAAI;YACV,SAAS,EAAE,IAAI;YACf,cAAc,EAAE,cAAc;YAC9B,SAAS,EAAE,SAAS;SACrB,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MACf,MAMD,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEhB,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;YAC9C,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK;gBAAE,SAAS;YAE1C,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;YAEzF,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;QAC5B,CAAC;QAED,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;IACjC,CAAC,QAAQ,SAAS,EAAE;IAEpB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,qBAAqB,CAClC,MAAe,EACf,KAAe,EACf,cAAuB;IAEvB,MAAM,EAAE,oBAAoB,EAAE,GAAG,YAAY,CAAC,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC;IACnF,MAAM,MAAM,GAA4B,EAAE,CAAC;IAE3C,MAAM,OAAO,GAAG,IAAI,oBAAoB,CAAC;QACvC,KAAK,EAAE,KAAK;QACZ,cAAc,EAAE,cAAc;KAC/B,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MACf,MAKD,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEhB,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK;YAAE,SAAS;QAC1C,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;IACnC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,WAAW,CAAC,OAA2B;IACrD,OAAO,KAAK,IAAI,EAAE;QAChB,MAAM,EACJ,IAAI,EACJ,KAAK,EACL,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,WAAW,EAC9C,cAAc,GAAG,IAAI,EACrB,YAAY,GAAG,IAAI,GACpB,GAAG,OAAO,CAAC;QAEZ,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC1E,CAAC;QAED,IAAI,CAAC;YACH,0CAA0C;YAC1C,MAAM,EAAE,SAAS,EAAE,GAAG,YAAY,CAAC,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC;YACxE,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;YAEzC,IAAI,IAAI,EAAE,CAAC;gBACT,OAAO,MAAM,qBAAqB,CAAC,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC;YACjF,CAAC;YAED,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,MAAM,qBAAqB,CAAC,MAAM,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;YACpE,CAAC;YAED,OAAO,EAAE,CAAC;QACZ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;gBAC9D,MAAM,IAAI,KAAK,CACb,sFAAsF,CACvF,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,cAAc,CAAC,MAA+B;IAC5D,OAAO,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC;AAC5B,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { BootstrapOptions, BootstrapResult, ModuleConfig } from './types.js';
1
+ import type { BootstrapArguments, BootstrapResult, ModuleConfig } from './types.js';
2
2
  /**
3
3
  * Bootstrap the application with modules.
4
4
  *
@@ -35,5 +35,5 @@ import type { BootstrapOptions, BootstrapResult, ModuleConfig } from './types.js
35
35
  * container.register({ customService: asClass(CustomService) });
36
36
  * ```
37
37
  */
38
- export declare function bootstrap(rootModule: ModuleConfig, options?: BootstrapOptions): Promise<BootstrapResult>;
38
+ export declare function bootstrap(rootModule: ModuleConfig, ...args: BootstrapArguments): Promise<BootstrapResult>;
39
39
  //# sourceMappingURL=bootstrap.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/core/bootstrap.ts"],"names":[],"mappings":"AAqCA,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EAIf,YAAY,EAKb,MAAM,YAAY,CAAC;AAwBpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAsB,SAAS,CAC7B,UAAU,EAAE,YAAY,EACxB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC,CAkE1B"}
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/core/bootstrap.ts"],"names":[],"mappings":"AA4CA,OAAO,KAAK,EACV,kBAAkB,EAElB,eAAe,EAIf,YAAY,EAQb,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAsB,SAAS,CAC7B,UAAU,EAAE,YAAY,EACxB,GAAG,IAAI,EAAE,kBAAkB,GAC1B,OAAO,CAAC,eAAe,CAAC,CA0E1B"}