@venizia/ignis 0.4.7-0 → 0.4.7-2

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 (177) hide show
  1. package/LICENSE.md +1 -4
  2. package/README.md +2 -2
  3. package/dist/esm/base/applications/base.d.ts.map +1 -1
  4. package/dist/esm/base/applications/base.js +25 -18
  5. package/dist/esm/base/applications/base.js.map +1 -1
  6. package/dist/esm/base/applications/common/index.d.ts +1 -0
  7. package/dist/esm/base/applications/common/index.d.ts.map +1 -1
  8. package/dist/esm/base/applications/common/index.js +1 -0
  9. package/dist/esm/base/applications/common/index.js.map +1 -1
  10. package/dist/esm/base/applications/common/logger-startup.d.ts +11 -0
  11. package/dist/esm/base/applications/common/logger-startup.d.ts.map +1 -0
  12. package/dist/esm/base/applications/common/logger-startup.js +29 -0
  13. package/dist/esm/base/applications/common/logger-startup.js.map +1 -0
  14. package/dist/esm/base/applications/server.d.ts +14 -9
  15. package/dist/esm/base/applications/server.d.ts.map +1 -1
  16. package/dist/esm/base/applications/server.js +36 -29
  17. package/dist/esm/base/applications/server.js.map +1 -1
  18. package/dist/esm/common/constants.d.ts.map +1 -1
  19. package/dist/esm/common/constants.js +2 -2
  20. package/dist/esm/common/constants.js.map +1 -1
  21. package/dist/esm/components/auth/authenticate/component.js +2 -2
  22. package/dist/esm/components/auth/authenticate/component.js.map +1 -1
  23. package/dist/esm/components/auth/authenticate/controllers/factory.d.ts +139 -136
  24. package/dist/esm/components/auth/authenticate/controllers/factory.d.ts.map +1 -1
  25. package/dist/esm/components/auth/authenticate/controllers/factory.js +175 -172
  26. package/dist/esm/components/auth/authenticate/controllers/factory.js.map +1 -1
  27. package/dist/esm/components/auth/authenticate/controllers/jwks/definitions.js +2 -2
  28. package/dist/esm/components/auth/authenticate/controllers/jwks/definitions.js.map +1 -1
  29. package/dist/esm/components/auth/authenticate/controllers/service-certs/definitions.js +2 -2
  30. package/dist/esm/components/auth/authenticate/controllers/service-certs/definitions.js.map +1 -1
  31. package/dist/esm/components/auth/authorize/adapters/base-filtered.js +2 -2
  32. package/dist/esm/components/auth/authorize/adapters/base-filtered.js.map +1 -1
  33. package/dist/esm/components/auth/authorize/adapters/custom-grant-expander.d.ts.map +1 -1
  34. package/dist/esm/components/auth/authorize/adapters/custom-grant-expander.js +2 -2
  35. package/dist/esm/components/auth/authorize/adapters/custom-grant-expander.js.map +1 -1
  36. package/dist/esm/components/auth/models/entities/columns.d.ts +99 -0
  37. package/dist/esm/components/auth/models/entities/columns.d.ts.map +1 -0
  38. package/dist/esm/components/auth/models/entities/columns.js +133 -0
  39. package/dist/esm/components/auth/models/entities/columns.js.map +1 -0
  40. package/dist/esm/components/auth/models/entities/index.d.ts +1 -2
  41. package/dist/esm/components/auth/models/entities/index.d.ts.map +1 -1
  42. package/dist/esm/components/auth/models/entities/index.js +1 -2
  43. package/dist/esm/components/auth/models/entities/index.js.map +1 -1
  44. package/dist/esm/components/auth/models/entities/permission.model.d.ts +1 -12
  45. package/dist/esm/components/auth/models/entities/permission.model.d.ts.map +1 -1
  46. package/dist/esm/components/auth/models/entities/permission.model.js +1 -36
  47. package/dist/esm/components/auth/models/entities/permission.model.js.map +1 -1
  48. package/dist/esm/components/auth/models/entities/policy-definition.model.d.ts +1 -49
  49. package/dist/esm/components/auth/models/entities/policy-definition.model.d.ts.map +1 -1
  50. package/dist/esm/components/auth/models/entities/policy-definition.model.js +1 -69
  51. package/dist/esm/components/auth/models/entities/policy-definition.model.js.map +1 -1
  52. package/dist/esm/components/controller/grpc/grpc.component.js +2 -2
  53. package/dist/esm/components/controller/grpc/grpc.component.js.map +1 -1
  54. package/dist/esm/components/health-check/controller.js +5 -5
  55. package/dist/esm/components/health-check/controller.js.map +1 -1
  56. package/dist/esm/components/index.d.ts +0 -1
  57. package/dist/esm/components/index.d.ts.map +1 -1
  58. package/dist/esm/components/index.js +0 -1
  59. package/dist/esm/components/index.js.map +1 -1
  60. package/dist/esm/components/mail/helpers/transporters/amazon-ses-transporter.helper.d.ts.map +1 -1
  61. package/dist/esm/components/mail/helpers/transporters/amazon-ses-transporter.helper.js +13 -9
  62. package/dist/esm/components/mail/helpers/transporters/amazon-ses-transporter.helper.js.map +1 -1
  63. package/dist/esm/components/mail/helpers/transporters/mailgun-transporter.helper.d.ts.map +1 -1
  64. package/dist/esm/components/mail/helpers/transporters/mailgun-transporter.helper.js +5 -3
  65. package/dist/esm/components/mail/helpers/transporters/mailgun-transporter.helper.js.map +1 -1
  66. package/dist/esm/components/mail/helpers/transporters/nodemail-transporter.helper.d.ts.map +1 -1
  67. package/dist/esm/components/mail/helpers/transporters/nodemail-transporter.helper.js +5 -5
  68. package/dist/esm/components/mail/helpers/transporters/nodemail-transporter.helper.js.map +1 -1
  69. package/dist/esm/components/mail/services/generators/verification-data.d.ts.map +1 -1
  70. package/dist/esm/components/mail/services/generators/verification-data.js +7 -3
  71. package/dist/esm/components/mail/services/generators/verification-data.js.map +1 -1
  72. package/dist/esm/components/mail/services/mail.service.js +7 -7
  73. package/dist/esm/components/mail/services/mail.service.js.map +1 -1
  74. package/dist/esm/components/mail/utilities/address.utility.d.ts +12 -8
  75. package/dist/esm/components/mail/utilities/address.utility.d.ts.map +1 -1
  76. package/dist/esm/components/mail/utilities/address.utility.js +30 -27
  77. package/dist/esm/components/mail/utilities/address.utility.js.map +1 -1
  78. package/dist/esm/components/mail/utilities/attachment.utility.d.ts +31 -29
  79. package/dist/esm/components/mail/utilities/attachment.utility.d.ts.map +1 -1
  80. package/dist/esm/components/mail/utilities/attachment.utility.js +97 -86
  81. package/dist/esm/components/mail/utilities/attachment.utility.js.map +1 -1
  82. package/dist/esm/components/mail/utilities/body.utility.d.ts +6 -4
  83. package/dist/esm/components/mail/utilities/body.utility.d.ts.map +1 -1
  84. package/dist/esm/components/mail/utilities/body.utility.js +14 -12
  85. package/dist/esm/components/mail/utilities/body.utility.js.map +1 -1
  86. package/dist/esm/components/mail/utilities/mime.utility.d.ts +23 -17
  87. package/dist/esm/components/mail/utilities/mime.utility.d.ts.map +1 -1
  88. package/dist/esm/components/mail/utilities/mime.utility.js +109 -102
  89. package/dist/esm/components/mail/utilities/mime.utility.js.map +1 -1
  90. package/dist/esm/components/mail/utilities/verification.utility.d.ts +8 -2
  91. package/dist/esm/components/mail/utilities/verification.utility.d.ts.map +1 -1
  92. package/dist/esm/components/mail/utilities/verification.utility.js +7 -5
  93. package/dist/esm/components/mail/utilities/verification.utility.js.map +1 -1
  94. package/dist/esm/components/socket-io/component.js +3 -3
  95. package/dist/esm/components/socket-io/component.js.map +1 -1
  96. package/dist/esm/components/socket-io/handlers/bun.handler.d.ts +13 -11
  97. package/dist/esm/components/socket-io/handlers/bun.handler.d.ts.map +1 -1
  98. package/dist/esm/components/socket-io/handlers/bun.handler.js +32 -30
  99. package/dist/esm/components/socket-io/handlers/bun.handler.js.map +1 -1
  100. package/dist/esm/components/static-asset/common/commit-token.d.ts +21 -16
  101. package/dist/esm/components/static-asset/common/commit-token.d.ts.map +1 -1
  102. package/dist/esm/components/static-asset/common/commit-token.js +35 -28
  103. package/dist/esm/components/static-asset/common/commit-token.js.map +1 -1
  104. package/dist/esm/components/static-asset/common/constants.d.ts +0 -2
  105. package/dist/esm/components/static-asset/common/constants.d.ts.map +1 -1
  106. package/dist/esm/components/static-asset/common/constants.js +1 -3
  107. package/dist/esm/components/static-asset/common/constants.js.map +1 -1
  108. package/dist/esm/components/static-asset/common/types.d.ts +0 -4
  109. package/dist/esm/components/static-asset/common/types.d.ts.map +1 -1
  110. package/dist/esm/components/static-asset/common/types.js.map +1 -1
  111. package/dist/esm/components/static-asset/component.js +2 -2
  112. package/dist/esm/components/static-asset/component.js.map +1 -1
  113. package/dist/esm/components/static-asset/controller/base.definition.d.ts +6 -6
  114. package/dist/esm/components/static-asset/controller/base.definition.d.ts.map +1 -1
  115. package/dist/esm/components/static-asset/controller/base.definition.js +224 -224
  116. package/dist/esm/components/static-asset/controller/base.definition.js.map +1 -1
  117. package/dist/esm/components/static-asset/controller/factory.d.ts +23 -23
  118. package/dist/esm/components/static-asset/controller/factory.d.ts.map +1 -1
  119. package/dist/esm/components/static-asset/controller/factory.js +105 -76
  120. package/dist/esm/components/static-asset/controller/factory.js.map +1 -1
  121. package/dist/esm/components/static-asset/controller/key-scope.d.ts +28 -26
  122. package/dist/esm/components/static-asset/controller/key-scope.d.ts.map +1 -1
  123. package/dist/esm/components/static-asset/controller/key-scope.js +34 -30
  124. package/dist/esm/components/static-asset/controller/key-scope.js.map +1 -1
  125. package/dist/esm/components/static-asset/controller/meta-link.d.ts +37 -33
  126. package/dist/esm/components/static-asset/controller/meta-link.d.ts.map +1 -1
  127. package/dist/esm/components/static-asset/controller/meta-link.js +86 -84
  128. package/dist/esm/components/static-asset/controller/meta-link.js.map +1 -1
  129. package/dist/esm/components/static-asset/controller/route-options.d.ts +18 -16
  130. package/dist/esm/components/static-asset/controller/route-options.d.ts.map +1 -1
  131. package/dist/esm/components/static-asset/controller/route-options.js +28 -26
  132. package/dist/esm/components/static-asset/controller/route-options.js.map +1 -1
  133. package/dist/esm/components/static-asset/models/base.model.js +3 -3
  134. package/dist/esm/components/static-asset/models/base.model.js.map +1 -1
  135. package/dist/esm/components/websocket/component.js +2 -2
  136. package/dist/esm/components/websocket/component.js.map +1 -1
  137. package/dist/esm/components/websocket/handlers/bun.handler.d.ts +6 -4
  138. package/dist/esm/components/websocket/handlers/bun.handler.d.ts.map +1 -1
  139. package/dist/esm/components/websocket/handlers/bun.handler.js +21 -19
  140. package/dist/esm/components/websocket/handlers/bun.handler.js.map +1 -1
  141. package/dist/esm/testing/assert-application-boots.d.ts +6 -1
  142. package/dist/esm/testing/assert-application-boots.d.ts.map +1 -1
  143. package/dist/esm/testing/assert-application-boots.js +139 -136
  144. package/dist/esm/testing/assert-application-boots.js.map +1 -1
  145. package/dist/esm/utilities/drizzle-result.utility.d.ts +6 -8
  146. package/dist/esm/utilities/drizzle-result.utility.d.ts.map +1 -1
  147. package/dist/esm/utilities/drizzle-result.utility.js +23 -49
  148. package/dist/esm/utilities/drizzle-result.utility.js.map +1 -1
  149. package/dist/esm/utilities/network.utility.d.ts.map +1 -1
  150. package/dist/esm/utilities/network.utility.js +2 -2
  151. package/dist/esm/utilities/network.utility.js.map +1 -1
  152. package/dist/presets/app/files/src/boot.test.ts +2 -2
  153. package/dist/presets/app/files/src/controllers/hello.controller.ts +2 -2
  154. package/dist/presets/app/preset.json +4 -4
  155. package/dist/presets/lib/preset.json +4 -4
  156. package/dist/presets/shared/files/.configs/formatters/.ignore +4 -0
  157. package/dist/presets/shared/files/.configs/lints/.ignore +4 -0
  158. package/dist/presets/shared/files/.configs/lints/eslint.config.mjs +4 -0
  159. package/dist/presets/shared/files/.configs/lints/oxlint.config.mts +4 -0
  160. package/dist/presets/shared/files/README.md +15 -0
  161. package/dist/presets/shared/files/src/index.test.ts +8 -0
  162. package/dist/presets/shared/files/src/index.ts +8 -0
  163. package/dist/presets/shared/files/tsconfig.json +20 -0
  164. package/dist/presets/shared/preset.json +35 -0
  165. package/package.json +11 -11
  166. package/dist/esm/components/auth/models/entities/role.model.d.ts +0 -10
  167. package/dist/esm/components/auth/models/entities/role.model.d.ts.map +0 -1
  168. package/dist/esm/components/auth/models/entities/role.model.js +0 -15
  169. package/dist/esm/components/auth/models/entities/role.model.js.map +0 -1
  170. package/dist/esm/components/auth/models/entities/user.model.d.ts +0 -28
  171. package/dist/esm/components/auth/models/entities/user.model.d.ts.map +0 -1
  172. package/dist/esm/components/auth/models/entities/user.model.js +0 -17
  173. package/dist/esm/components/auth/models/entities/user.model.js.map +0 -1
  174. package/dist/esm/components/controller/index.d.ts +0 -2
  175. package/dist/esm/components/controller/index.d.ts.map +0 -1
  176. package/dist/esm/components/controller/index.js +0 -7
  177. package/dist/esm/components/controller/index.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../../src/base/applications/server.ts"],"names":[],"mappings":"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","sourcesContent":["import { CoreBindings, RestApplication } from '@venizia/ignis-kernel';\nimport { ModuleUtility } from '@venizia/ignis-helpers';\nimport { getError } from '@venizia/ignis-helpers/core';\nimport { RuntimeModules } from '@venizia/ignis-helpers/common';\nimport type { Env, Schema } from 'hono';\nimport { existsSync } from 'node:fs';\nimport path from 'node:path';\nimport type {\n IServerApplication,\n IServerApplicationConfigs,\n IServerRuntimeConfigs,\n IShutdownSignalsOptions,\n} from './common';\n\n/** Lives here, not in the kernel: `Bun.serve` resolves only through `@types/bun`, and emitting `Bun` into the kernel's published `.d.ts` would force that dependency on every browser consumer of `@venizia/ignis-kernel`. This package legitimately has Bun types - it is the layer that calls `Bun.serve`. */\nexport type TBunServerInstance = ReturnType<typeof Bun.serve>;\n\nconst MINIMUM_BUN = { major: 1, minor: 4 };\n\n/** What the process runs on. `Bun` is the one global that tells the runtimes apart, and it cannot be hidden in a test, so the guard reads this snapshot instead. */\nexport interface IRuntimeSnapshot {\n /** `Bun.version`, set only under Bun. */\n bunVersion?: string;\n /** `process.release.name` and `process.version` of a runtime that is not Bun (`node`, `v24.14.0`). */\n otherName?: string;\n otherVersion?: string;\n}\n\nexport const readRuntimeSnapshot = (): IRuntimeSnapshot => ({\n bunVersion: RuntimeModules.isBun() ? Bun.version : undefined,\n otherName: globalThis.process?.release?.name,\n otherVersion: globalThis.process?.version,\n});\n\nconst describeRuntime = (opts: { runtime: IRuntimeSnapshot }): string => {\n const { bunVersion, otherName, otherVersion } = opts.runtime;\n\n if (bunVersion !== undefined) {\n return `bun ${bunVersion}`;\n }\n\n return otherName ? `${otherName} ${otherVersion ?? ''}`.trim() : 'an unknown runtime';\n};\n\n/**\n * IGNIS runs on Bun 1.4 or later, and nothing else. One refusal at the top of `start()`, before any\n * hook, datasource or socket is touched, replaces a failure that would otherwise surface halfway\n * through startup.\n */\nexport const assertBunRuntime = (opts: { runtime?: IRuntimeSnapshot } = {}): void => {\n const runtime = opts.runtime ?? readRuntimeSnapshot();\n\n if (runtime.bunVersion !== undefined) {\n const [major = 0, minor = 0] = runtime.bunVersion.split('.').map(Number);\n if (major > MINIMUM_BUN.major || (major === MINIMUM_BUN.major && minor >= MINIMUM_BUN.minor)) {\n return;\n }\n }\n\n throw getError({\n message: `IGNIS requires Bun >= ${MINIMUM_BUN.major}.${MINIMUM_BUN.minor} (running on ${describeRuntime({ runtime })})`,\n });\n};\n\nconst DEFAULT_SHUTDOWN_SIGNALS: NodeJS.Signals[] = ['SIGTERM', 'SIGINT'];\nconst DEFAULT_SHUTDOWN_TIMEOUT_MS = 15_000;\n\nconst DEFAULT_SERVER_HOST = 'localhost';\nconst DEFAULT_SERVER_PORT = 3000;\nconst MAX_SERVER_PORT = 65535;\n\n/**\n * The first candidate USABLE as a port. Rejection is on validity, never falsiness: `0` legitimately\n * asks the OS for an ephemeral port, and taking the first TRUTHY value instead let an unusable\n * `PORT` shadow a usable `APP_ENV_SERVER_PORT` - `PORT=abc APP_ENV_SERVER_PORT=8080` bound 3000, as\n * did Docker's legacy container-link form `PORT=tcp://172.17.0.5:8080`.\n */\nconst resolveServerPort = (opts: { candidates: Array<number | string | undefined> }): number => {\n for (const candidate of opts.candidates) {\n if (candidate === undefined || candidate === null) {\n continue;\n }\n\n const normalized = typeof candidate === 'string' ? candidate.trim() : candidate;\n if (normalized === '') {\n continue;\n }\n\n const parsed = Number(normalized);\n if (!Number.isInteger(parsed) || parsed < 0 || parsed > MAX_SERVER_PORT) {\n continue;\n }\n\n return parsed;\n }\n\n return DEFAULT_SERVER_PORT;\n};\n\n/** Adds the listening server (`Bun.serve`) on top of `RestApplication` - the only layer that touches a socket, so it is the layer that stays out of the browser-pure kernel. */\nexport abstract class ServerApplication<\n AppEnv extends Env = Env,\n AppSchema extends Schema = {},\n BasePath extends string = '/',\n>\n extends RestApplication<AppEnv, AppSchema, BasePath>\n implements IServerApplication<AppEnv, AppSchema, BasePath>\n{\n /** Which runtime is underneath, and the socket once one is bound. Both live here, not on `RestApplication`: a browser Worker has neither. `start()` refuses to run unless this is Bun. */\n protected runtime = RuntimeModules.detect();\n protected serverInstance?: TBunServerInstance;\n\n /** Widened by this layer, which is the only one that binds a socket. Assigned by the base constructor - `declare` so no field initializer runs here and overwrites it with `undefined`. */\n declare protected configs: IServerApplicationConfigs;\n\n /**\n * The address resolution the kernel deliberately does not do: `host` and `port` mean nothing to a\n * host with no socket, and resolving them there silently configured every browser Worker with\n * `localhost:3000`. Env is the fallback, explicit config always wins.\n */\n constructor(opts: { scope: string; config: IServerApplicationConfigs }) {\n super(opts);\n\n this.configs.host =\n [opts.config.host, process.env.HOST, process.env.APP_ENV_SERVER_HOST].find(Boolean) ??\n DEFAULT_SERVER_HOST;\n this.configs.port = resolveServerPort({\n candidates: [opts.config.port, process.env.PORT, process.env.APP_ENV_SERVER_PORT],\n });\n }\n\n /** Restores the pre-split default: a server-capable application installs `hono/context-storage` unless the caller opts out explicitly. */\n protected override getDefaultAsyncContextEnabled(): boolean {\n return true;\n }\n\n /** `configs.projectRoot` wins, else the process cwd. The value is bound AND handed to `ModuleUtility`, so every peer lookup (optional modules, the gRPC adapter) resolves under it - a compiled binary sets it to where its `node_modules` really is. */\n override getProjectRoot(): string {\n const projectRoot = this.configs.projectRoot ?? process.cwd();\n if (this.configs.projectRoot && !existsSync(path.join(projectRoot, 'node_modules'))) {\n this.logger\n .for(this.getProjectRoot.name)\n .warn(\n 'configs.projectRoot has no node_modules | root: %s | optional peers will not resolve from it',\n projectRoot,\n );\n }\n this.bind<string>({ key: CoreBindings.APPLICATION_PROJECT_ROOT }).toValue(projectRoot);\n ModuleUtility.setProjectRoot({ projectRoot });\n return projectRoot;\n }\n\n getServerHost(): string {\n return this.configs.host!;\n }\n\n getServerPort(): number {\n return this.configs.port!;\n }\n\n getServerAddress() {\n return `${this.getServerHost()}:${this.getServerPort()}`;\n }\n\n /** `configs.server` with unset keys dropped, so a missing option keeps Bun's default instead of passing `undefined`. */\n protected getServerRuntimeOptions(): IServerRuntimeConfigs {\n const { idleTimeout, maxRequestBodySize } = this.configs.server ?? {};\n return {\n ...(idleTimeout === undefined ? {} : { idleTimeout }),\n ...(maxRequestBodySize === undefined ? {} : { maxRequestBodySize }),\n };\n }\n\n /** What `start()` checks. A seam for the guard's test: the `Bun` global cannot be hidden from inside Bun. */\n protected getRuntimeSnapshot(): IRuntimeSnapshot {\n return readRuntimeSnapshot();\n }\n\n getServerInstance<T extends TBunServerInstance = TBunServerInstance>(): T | undefined {\n return this.serverInstance as T | undefined;\n }\n\n protected startBunModule() {\n return new Promise((resolve, reject) => {\n const port = this.getServerPort();\n const host = this.getServerHost();\n const server = this.getServer();\n\n Promise.resolve(\n Bun.serve({\n port,\n hostname: host,\n fetch: server.fetch,\n ...this.getServerRuntimeOptions(),\n }),\n )\n .then((rs) => {\n this.serverInstance = rs;\n this.configs.port = rs.port;\n this.inspectRoutes();\n\n this.logger\n .for(this.start.name)\n .info('Server STARTED | Address: %s', this.getServerAddress());\n this.logger\n .for(this.start.name)\n .info(\n 'Log folder: %s',\n path.resolve(process.env.APP_ENV_LOGGER_FOLDER_PATH ?? '').toString(),\n );\n\n resolve(rs);\n })\n .catch(reject);\n });\n }\n\n async start() {\n assertBunRuntime({ runtime: this.getRuntimeSnapshot() });\n\n await this.initialize();\n await this.setupMiddlewares();\n\n const server = this.getServer();\n server.route(this.configs.path.base, this.rootRouter);\n\n await this.startBunModule();\n\n await this.executePostStartHooks();\n }\n\n /** Post-stop hooks, then the server, then the datasources - closed even when the server fails to, so a stopped application holds no connection. */\n async stop() {\n await this.executePostStopHooks();\n\n try {\n await this.stopServer();\n } finally {\n await this.closeDataSources();\n }\n }\n\n /** Set once `installShutdownSignals` ran; holds the way back, so a second call is a no-op. */\n protected shutdownSignals?: { uninstall: () => void };\n\n /**\n * Stops the application on a signal (SIGTERM and SIGINT by default), then exits the process.\n * Opt-in: nothing is installed until you call it, usually right after `start()`.\n *\n * - Calls `stop()` once. A second signal while it runs is ignored.\n * - Exits 0 when `stop()` finishes, 1 when it throws or does not finish within `timeoutMs`.\n * - Idempotent: calling it again returns the same uninstall function and adds no listener.\n * - Returns an uninstall function that removes the listeners and the pending timeout.\n */\n installShutdownSignals(opts: IShutdownSignalsOptions = {}): () => void {\n if (this.shutdownSignals) {\n return this.shutdownSignals.uninstall;\n }\n\n const {\n signals = DEFAULT_SHUTDOWN_SIGNALS,\n timeoutMs = DEFAULT_SHUTDOWN_TIMEOUT_MS,\n exit = (code: number) => process.exit(code),\n } = opts;\n\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n throw getError({\n message: `[installShutdownSignals] timeoutMs must be a positive number of milliseconds | value: ${String(timeoutMs)}`,\n });\n }\n\n const log = this.logger.for(this.installShutdownSignals.name);\n let isShuttingDown = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const finish = (code: number) => {\n clearTimeout(timer);\n exit(code);\n };\n\n const onSignal = (signal: NodeJS.Signals) => {\n if (isShuttingDown) {\n log.warn('Signal %s ignored | shutdown already in progress', signal);\n return;\n }\n\n isShuttingDown = true;\n log.info('Signal %s received | stopping the application | timeout: %s ms', signal, timeoutMs);\n\n timer = setTimeout(() => {\n log.error('Shutdown did not finish within %s ms | forcing exit', timeoutMs);\n exit(1);\n }, timeoutMs);\n\n this.stop().then(\n () => {\n log.info('Application stopped | exiting');\n finish(0);\n },\n (error: unknown) => {\n log.error(\n 'Shutdown failed | error: %s',\n error instanceof Error ? error.message : String(error),\n );\n finish(1);\n },\n );\n };\n\n const listeners = signals.map((signal) => {\n const listener = () => onSignal(signal);\n process.on(signal, listener);\n return { signal, listener };\n });\n\n const uninstall = () => {\n clearTimeout(timer);\n for (const { signal, listener } of listeners) {\n process.off(signal, listener);\n }\n this.shutdownSignals = undefined;\n };\n\n this.shutdownSignals = { uninstall };\n return uninstall;\n }\n\n protected async stopServer(): Promise<void> {\n const instance = this.serverInstance;\n if (!instance) {\n this.logger.for(this.stop.name).info('Server was not started | Nothing to stop');\n return;\n }\n\n await instance.stop();\n\n this.serverInstance = undefined;\n this.logger.for(this.stop.name).info('Server STOPPED');\n }\n}\n"]}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../../src/base/applications/server.ts"],"names":[],"mappings":"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","sourcesContent":["import { CoreBindings, RestApplication } from '@venizia/ignis-kernel';\nimport { ModuleUtility } from '@venizia/ignis-helpers';\nimport { getError } from '@venizia/ignis-helpers/core';\nimport { RuntimeModules } from '@venizia/ignis-helpers/common';\nimport type { Env, Schema } from 'hono';\nimport { existsSync } from 'node:fs';\nimport path from 'node:path';\nimport type {\n IServerApplication,\n IServerApplicationConfigs,\n IServerRuntimeConfigs,\n IShutdownSignalsOptions,\n} from './common';\n\n/** Lives here, not in the kernel: `Bun.serve` resolves only through `@types/bun`, and emitting `Bun` into the kernel's published `.d.ts` would force that dependency on every browser consumer of `@venizia/ignis-kernel`. This package legitimately has Bun types - it is the layer that calls `Bun.serve`. */\nexport type TBunServerInstance = ReturnType<typeof Bun.serve>;\n\nconst MINIMUM_BUN = { major: 1, minor: 4 };\n\n/** What the process runs on. `Bun` is the one global that tells the runtimes apart, and it cannot be hidden in a test, so the guard reads this snapshot instead. */\nexport interface IRuntimeSnapshot {\n /** `Bun.version`, set only under Bun. */\n bunVersion?: string;\n /** `process.release.name` and `process.version` of a runtime that is not Bun (`node`, `v24.14.0`). */\n otherName?: string;\n otherVersion?: string;\n}\n\n/** The Bun-only guard: what the process runs on, and the refusal when it is not Bun 1.4 or later. */\nexport class BunRuntimeGuard {\n /** Reads the runtime the process is on. */\n static readSnapshot(): IRuntimeSnapshot {\n return {\n bunVersion: RuntimeModules.isBun() ? Bun.version : undefined,\n otherName: globalThis.process?.release?.name,\n otherVersion: globalThis.process?.version,\n };\n }\n\n private static describeRuntime(opts: { runtime: IRuntimeSnapshot }): string {\n const { bunVersion, otherName, otherVersion } = opts.runtime;\n\n if (bunVersion !== undefined) {\n return `bun ${bunVersion}`;\n }\n\n return otherName ? `${otherName} ${otherVersion ?? ''}`.trim() : 'an unknown runtime';\n }\n\n /**\n * IGNIS runs on Bun 1.4 or later, and nothing else. One refusal at the top of `start()`, before any\n * hook, datasource or socket is touched, replaces a failure that would otherwise surface halfway\n * through startup.\n */\n static assert(opts: { runtime?: IRuntimeSnapshot } = {}): void {\n const runtime = opts.runtime ?? BunRuntimeGuard.readSnapshot();\n\n if (runtime.bunVersion !== undefined) {\n const [major = 0, minor = 0] = runtime.bunVersion.split('.').map(Number);\n if (\n major > MINIMUM_BUN.major ||\n (major === MINIMUM_BUN.major && minor >= MINIMUM_BUN.minor)\n ) {\n return;\n }\n }\n\n throw getError({\n message: `IGNIS requires Bun >= ${MINIMUM_BUN.major}.${MINIMUM_BUN.minor} (running on ${BunRuntimeGuard.describeRuntime({ runtime })})`,\n });\n }\n}\n\nconst DEFAULT_SHUTDOWN_SIGNALS: NodeJS.Signals[] = ['SIGTERM', 'SIGINT'];\nconst DEFAULT_SHUTDOWN_TIMEOUT_MS = 15_000;\n\nconst DEFAULT_SERVER_HOST = 'localhost';\nconst DEFAULT_SERVER_PORT = 3000;\nconst MAX_SERVER_PORT = 65535;\n\n/**\n * The first candidate USABLE as a port. Rejection is on validity, never falsiness: `0` legitimately\n * asks the OS for an ephemeral port, and taking the first TRUTHY value instead let an unusable\n * `PORT` shadow a usable `APP_ENV_SERVER_PORT` - `PORT=abc APP_ENV_SERVER_PORT=8080` bound 3000, as\n * did Docker's legacy container-link form `PORT=tcp://172.17.0.5:8080`.\n */\nconst resolveServerPort = (opts: { candidates: Array<number | string | undefined> }): number => {\n for (const candidate of opts.candidates) {\n if (candidate === undefined || candidate === null) {\n continue;\n }\n\n const normalized = typeof candidate === 'string' ? candidate.trim() : candidate;\n if (normalized === '') {\n continue;\n }\n\n const parsed = Number(normalized);\n if (!Number.isInteger(parsed) || parsed < 0 || parsed > MAX_SERVER_PORT) {\n continue;\n }\n\n return parsed;\n }\n\n return DEFAULT_SERVER_PORT;\n};\n\n/** Adds the listening server (`Bun.serve`) on top of `RestApplication` - the only layer that touches a socket, so it is the layer that stays out of the browser-pure kernel. */\nexport abstract class ServerApplication<\n AppEnv extends Env = Env,\n AppSchema extends Schema = {},\n BasePath extends string = '/',\n>\n extends RestApplication<AppEnv, AppSchema, BasePath>\n implements IServerApplication<AppEnv, AppSchema, BasePath>\n{\n /** Which runtime is underneath, and the socket once one is bound. Both live here, not on `RestApplication`: a browser Worker has neither. `start()` refuses to run unless this is Bun. */\n protected runtime = RuntimeModules.detect();\n protected serverInstance?: TBunServerInstance;\n\n /** Widened by this layer, which is the only one that binds a socket. Assigned by the base constructor - `declare` so no field initializer runs here and overwrites it with `undefined`. */\n declare protected configs: IServerApplicationConfigs;\n\n /**\n * The address resolution the kernel deliberately does not do: `host` and `port` mean nothing to a\n * host with no socket, and resolving them there silently configured every browser Worker with\n * `localhost:3000`. Env is the fallback, explicit config always wins.\n */\n constructor(opts: { scope: string; config: IServerApplicationConfigs }) {\n super(opts);\n\n this.configs.host =\n [opts.config.host, process.env.HOST, process.env.APP_ENV_SERVER_HOST].find(Boolean) ??\n DEFAULT_SERVER_HOST;\n this.configs.port = resolveServerPort({\n candidates: [opts.config.port, process.env.PORT, process.env.APP_ENV_SERVER_PORT],\n });\n }\n\n /** Restores the pre-split default: a server-capable application installs `hono/context-storage` unless the caller opts out explicitly. */\n protected override getDefaultAsyncContextEnabled(): boolean {\n return true;\n }\n\n /** `configs.projectRoot` wins, else the process cwd. The value is bound AND handed to `ModuleUtility`, so every peer lookup (optional modules, the gRPC adapter) resolves under it - a compiled binary sets it to where its `node_modules` really is. */\n override getProjectRoot(): string {\n const projectRoot = this.configs.projectRoot ?? process.cwd();\n if (this.configs.projectRoot && !existsSync(path.join(projectRoot, 'node_modules'))) {\n this.logger\n .for(this.getProjectRoot.name)\n .warn(\n 'configs.projectRoot has no node_modules | root: %s | optional peers will not resolve from it',\n projectRoot,\n );\n }\n this.bind<string>({ key: CoreBindings.APPLICATION_PROJECT_ROOT }).toValue(projectRoot);\n ModuleUtility.setProjectRoot({ projectRoot });\n return projectRoot;\n }\n\n getServerHost(): string {\n return this.configs.host!;\n }\n\n getServerPort(): number {\n return this.configs.port!;\n }\n\n getServerAddress() {\n return `${this.getServerHost()}:${this.getServerPort()}`;\n }\n\n /** `configs.server` with unset keys dropped, so a missing option keeps Bun's default instead of passing `undefined`. */\n protected getServerRuntimeOptions(): IServerRuntimeConfigs {\n const { idleTimeout, maxRequestBodySize } = this.configs.server ?? {};\n return {\n ...(idleTimeout === undefined ? {} : { idleTimeout }),\n ...(maxRequestBodySize === undefined ? {} : { maxRequestBodySize }),\n };\n }\n\n /** What `start()` checks. A seam for the guard's test: the `Bun` global cannot be hidden from inside Bun. */\n protected getRuntimeSnapshot(): IRuntimeSnapshot {\n return BunRuntimeGuard.readSnapshot();\n }\n\n getServerInstance<T extends TBunServerInstance = TBunServerInstance>(): T | undefined {\n return this.serverInstance as T | undefined;\n }\n\n protected startBunModule() {\n return new Promise((resolve, reject) => {\n const port = this.getServerPort();\n const host = this.getServerHost();\n const server = this.getServer();\n\n Promise.resolve(\n Bun.serve({\n port,\n hostname: host,\n fetch: server.fetch,\n ...this.getServerRuntimeOptions(),\n }),\n )\n .then((rs) => {\n this.serverInstance = rs;\n this.configs.port = rs.port;\n this.inspectRoutes();\n\n this.logger\n .for(this.start.name)\n .info('Server STARTED | Address: %s', this.getServerAddress());\n this.logger\n .for(this.start.name)\n .info(\n 'Log folder: %s',\n path.resolve(process.env.APP_ENV_LOGGER_FOLDER_PATH ?? '').toString(),\n );\n\n resolve(rs);\n })\n .catch(reject);\n });\n }\n\n async start() {\n BunRuntimeGuard.assert({ runtime: this.getRuntimeSnapshot() });\n\n await this.initialize();\n await this.setupMiddlewares();\n\n const server = this.getServer();\n server.route(this.configs.path.base, this.rootRouter);\n\n await this.startBunModule();\n\n await this.executePostStartHooks();\n }\n\n /** Post-stop hooks, then the server, then the datasources - closed even when the server fails to, so a stopped application holds no connection. */\n async stop() {\n await this.executePostStopHooks();\n\n try {\n await this.stopServer();\n } finally {\n await this.closeDataSources();\n }\n }\n\n /** Set once `installShutdownSignals` ran; holds the way back, so a second call is a no-op. */\n protected shutdownSignals?: { uninstall: () => void };\n\n /**\n * Stops the application on a signal (SIGTERM and SIGINT by default), then exits the process.\n * Opt-in: nothing is installed until you call it, usually right after `start()`.\n *\n * - Calls `stop()` once. A second signal while it runs is ignored.\n * - Exits 0 when `stop()` finishes, 1 when it throws or does not finish within `timeoutMs`.\n * - Idempotent: calling it again returns the same uninstall function and adds no listener.\n * - Returns an uninstall function that removes the listeners and the pending timeout.\n */\n installShutdownSignals(opts: IShutdownSignalsOptions = {}): () => void {\n if (this.shutdownSignals) {\n return this.shutdownSignals.uninstall;\n }\n\n const {\n signals = DEFAULT_SHUTDOWN_SIGNALS,\n timeoutMs = DEFAULT_SHUTDOWN_TIMEOUT_MS,\n exit = (code: number) => process.exit(code),\n } = opts;\n\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n throw getError({\n message: `[installShutdownSignals] timeoutMs must be a positive number of milliseconds | value: ${String(timeoutMs)}`,\n });\n }\n\n const log = this.logger.for(this.installShutdownSignals.name);\n let isShuttingDown = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const finish = (code: number) => {\n clearTimeout(timer);\n exit(code);\n };\n\n const onSignal = (signal: NodeJS.Signals) => {\n if (isShuttingDown) {\n log.warn('Signal %s ignored | shutdown already in progress', signal);\n return;\n }\n\n isShuttingDown = true;\n log.info('Signal %s received | stopping the application | timeout: %s ms', signal, timeoutMs);\n\n timer = setTimeout(() => {\n log.error('Shutdown did not finish within %s ms | forcing exit', timeoutMs);\n exit(1);\n }, timeoutMs);\n\n this.stop().then(\n () => {\n log.info('Application stopped | exiting');\n finish(0);\n },\n (error: unknown) => {\n log.error(\n 'Shutdown failed | error: %s',\n error instanceof Error ? error.message : String(error),\n );\n finish(1);\n },\n );\n };\n\n const listeners = signals.map((signal) => {\n const listener = () => onSignal(signal);\n process.on(signal, listener);\n return { signal, listener };\n });\n\n const uninstall = () => {\n clearTimeout(timer);\n for (const { signal, listener } of listeners) {\n process.off(signal, listener);\n }\n this.shutdownSignals = undefined;\n };\n\n this.shutdownSignals = { uninstall };\n return uninstall;\n }\n\n protected async stopServer(): Promise<void> {\n const instance = this.serverInstance;\n if (!instance) {\n this.logger.for(this.stop.name).info('Server was not started | Nothing to stop');\n return;\n }\n\n await instance.stop();\n\n this.serverInstance = undefined;\n this.logger.for(this.stop.name).info('Server STOPPED');\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/common/constants.ts"],"names":[],"mappings":"AAEA,kCAAkC;AAClC,qBAAa,GAAG;IACd,MAAM,CAAC,QAAQ,CAAC,gBAAgB,SACkC;IAElE,MAAM,CAAC,QAAQ,CAAC,mBAAmB,MAAM;IACzC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,KAAK;IAEzC,MAAM,CAAC,QAAQ,CAAC,WAAW,gBAAgB;IAC3C,MAAM,CAAC,QAAQ,CAAC,SAAS,YAAY;IACrC,MAAM,CAAC,QAAQ,CAAC,QAAQ,WAAW;CACpC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/common/constants.ts"],"names":[],"mappings":"AAEA,kCAAkC;AAClC,qBAAa,GAAG;IACd,MAAM,CAAC,QAAQ,CAAC,gBAAgB,SAC0D;IAE1F,MAAM,CAAC,QAAQ,CAAC,mBAAmB,MAAM;IACzC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,KAAK;IAEzC,MAAM,CAAC,QAAQ,CAAC,WAAW,gBAAgB;IAC3C,MAAM,CAAC,QAAQ,CAAC,SAAS,YAAY;IACrC,MAAM,CAAC,QAAQ,CAAC,QAAQ,WAAW;CACpC"}
@@ -1,7 +1,7 @@
1
- import { blankToUndefined } from '@venizia/ignis-helpers/core';
1
+ import { ParseUtility } from '@venizia/ignis-helpers/core';
2
2
  /** Application-wide constants. */
3
3
  export class App {
4
- static { this.APPLICATION_NAME = blankToUndefined(process.env.APP_ENV_APPLICATION_NAME) ?? 'APP'; }
4
+ static { this.APPLICATION_NAME = ParseUtility.blankToUndefined({ input: process.env.APP_ENV_APPLICATION_NAME }) ?? 'APP'; }
5
5
  static { this.DEFAULT_QUERY_LIMIT = 50; }
6
6
  static { this.DEFAULT_QUERY_OFFSET = 0; }
7
7
  static { this.DS_POSTGRES = 'postgresql'; }
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/common/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE/D,kCAAkC;AAClC,MAAM,OAAO,GAAG;aACE,qBAAgB,GAC9B,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,IAAI,KAAK,CAAC;aAElD,wBAAmB,GAAG,EAAE,CAAC;aACzB,yBAAoB,GAAG,CAAC,CAAC;aAEzB,gBAAW,GAAG,YAAY,CAAC;aAC3B,cAAS,GAAG,QAAQ,CAAC;aACrB,aAAQ,GAAG,OAAO,CAAC","sourcesContent":["import { blankToUndefined } from '@venizia/ignis-helpers/core';\n\n/** Application-wide constants. */\nexport class App {\n static readonly APPLICATION_NAME =\n blankToUndefined(process.env.APP_ENV_APPLICATION_NAME) ?? 'APP';\n\n static readonly DEFAULT_QUERY_LIMIT = 50;\n static readonly DEFAULT_QUERY_OFFSET = 0;\n\n static readonly DS_POSTGRES = 'postgresql';\n static readonly DS_MEMORY = 'memory';\n static readonly DS_REDIS = 'redis';\n}\n"]}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/common/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE3D,kCAAkC;AAClC,MAAM,OAAO,GAAG;aACE,qBAAgB,GAC9B,YAAY,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,CAAC,IAAI,KAAK,CAAC;aAE1E,wBAAmB,GAAG,EAAE,CAAC;aACzB,yBAAoB,GAAG,CAAC,CAAC;aAEzB,gBAAW,GAAG,YAAY,CAAC;aAC3B,cAAS,GAAG,QAAQ,CAAC;aACrB,aAAQ,GAAG,OAAO,CAAC","sourcesContent":["import { ParseUtility } from '@venizia/ignis-helpers/core';\n\n/** Application-wide constants. */\nexport class App {\n static readonly APPLICATION_NAME =\n ParseUtility.blankToUndefined({ input: process.env.APP_ENV_APPLICATION_NAME }) ?? 'APP';\n\n static readonly DEFAULT_QUERY_LIMIT = 50;\n static readonly DEFAULT_QUERY_OFFSET = 0;\n\n static readonly DS_POSTGRES = 'postgresql';\n static readonly DS_MEMORY = 'memory';\n static readonly DS_REDIS = 'redis';\n}\n"]}
@@ -14,7 +14,7 @@ var AuthenticateComponent_1;
14
14
  import { getError } from '@venizia/ignis-helpers/core';
15
15
  import { Binding } from '@venizia/ignis-inversion';
16
16
  import { AuthenticateBindingKeys, Authentication, AuthenticationStrategyRegistry, BaseComponent, controller, CoreBindings, inject, JOSEStandards, JWKSKeyFormats, JWKSModes, ServiceAssertion, } from '@venizia/ignis-kernel';
17
- import { defineAuthController, JWKSController } from './controllers/index.js';
17
+ import { AuthControllerFactory, JWKSController } from './controllers/index.js';
18
18
  import { ServiceCertsController } from './controllers/service-certs/index.js';
19
19
  import { BasicTokenService, JWKSIssuerTokenService, JWKSVerifierTokenService, JWSTokenService, } from './services/index.js';
20
20
  import { JoseLoader } from './services/jose-loader.js';
@@ -255,7 +255,7 @@ let AuthenticateComponent = AuthenticateComponent_1 = class AuthenticateComponen
255
255
  message: '[defineControllers] Auth controller requires jwtOptions to be configured',
256
256
  });
257
257
  }
258
- const AuthController = defineAuthController(restOptions.controllerOpts);
258
+ const AuthController = AuthControllerFactory.define(restOptions.controllerOpts);
259
259
  this.application.controller(AuthController);
260
260
  this.logger.for(this.defineControllers.name).info('Auth controller registered');
261
261
  }
@@ -1 +1 @@
1
- {"version":3,"file":"component.js","sourceRoot":"","sources":["../../../../../src/components/auth/authenticate/component.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BaseApplication } from '@/base/applications/base';\nimport { type ValueOrPromise } from '@venizia/ignis-helpers/common';\nimport { getError } from '@venizia/ignis-helpers/core';\nimport { Binding } from '@venizia/ignis-inversion';\nimport {\n AuthenticateBindingKeys,\n Authentication,\n AuthenticationStrategyRegistry,\n BaseComponent,\n controller,\n CoreBindings,\n type IAuthenticateOptions,\n type IJWKSIssuerOptions,\n type IJWKSVerifierOptions,\n type IJWSTokenServiceOptions,\n inject,\n type IServiceAuthOptions,\n JOSEStandards,\n JWKSKeyFormats,\n JWKSModes,\n ServiceAssertion,\n type TAuthenticationRestOptions,\n type TBasicTokenServiceOptions,\n type TJWKSTokenServiceOptions,\n type TJWTTokenServiceOptions,\n} from '@venizia/ignis-kernel';\nimport { defineAuthController, JWKSController } from './controllers';\nimport { ServiceCertsController } from './controllers/service-certs';\nimport {\n BasicTokenService,\n JWKSIssuerTokenService,\n JWKSVerifierTokenService,\n JWSTokenService,\n} from './services';\nimport { JoseLoader } from './services/jose-loader';\nimport { ServiceAssertionSignerService } from './services/service/signer.service';\nimport { ServiceAssertionVerifierService } from './services/service/verifier.service';\nimport { ServiceAuthenticationStrategy } from './strategies/service.strategy';\n\nconst DEFAULT_SECRET = 'unknown_secret';\n\nexport class AuthenticateComponent extends BaseComponent {\n constructor(\n @inject({ key: CoreBindings.APPLICATION_INSTANCE }) private application: BaseApplication,\n ) {\n super({\n scope: AuthenticateComponent.name,\n initDefault: { enable: true, container: application },\n bindings: {\n [AuthenticateBindingKeys.REST_OPTIONS]: Binding.bind<TAuthenticationRestOptions>({\n key: AuthenticateBindingKeys.REST_OPTIONS,\n }).toValue({ useAuthController: false }),\n },\n });\n }\n\n override binding(): ValueOrPromise<void> {\n const jwtOptions = this.application.get<TJWTTokenServiceOptions>({\n key: AuthenticateBindingKeys.JWT_OPTIONS,\n isOptional: true,\n });\n const basicOptions = this.application.get<TBasicTokenServiceOptions>({\n key: AuthenticateBindingKeys.BASIC_OPTIONS,\n isOptional: true,\n });\n const restOptions = this.application.get<TAuthenticationRestOptions>({\n key: AuthenticateBindingKeys.REST_OPTIONS,\n isOptional: true,\n });\n const serviceOptions = this.application.get<IServiceAuthOptions>({\n key: AuthenticateBindingKeys.SERVICE_OPTIONS,\n isOptional: true,\n });\n\n // A service that only VERIFIES assertions needs neither jwt nor basic - and that application,\n // an IGNIS app consuming no user tokens at all, is exactly what the service strategy is for.\n if (!jwtOptions && !basicOptions && !serviceOptions) {\n throw getError({\n message:\n '[AuthenticateComponent] At least one of jwtOptions, basicOptions or serviceOptions must be provided',\n });\n }\n\n const options: IAuthenticateOptions = { restOptions, jwtOptions, basicOptions, serviceOptions };\n\n if (jwtOptions) {\n switch (jwtOptions.standard) {\n case JOSEStandards.JWS: {\n this.defineJWSAuth({ options: jwtOptions.options });\n break;\n }\n case JOSEStandards.JWKS: {\n this.defineJWKSAuth({ options: jwtOptions.options });\n break;\n }\n default: {\n throw getError({\n message: `[AuthenticateComponent] Unknown JOSE standard: ${(jwtOptions as any).standard}`,\n });\n }\n }\n }\n\n this.defineBasicAuth({ basicOptions });\n this.defineServiceAuth({ serviceOptions });\n\n this.defineControllers({ options });\n\n this.defineOAuth2();\n\n return this.preloadJose({ options });\n }\n\n /**\n * Loads `jose` at boot when a configured service signs or verifies with it, so a missing or broken\n * install fails the boot instead of answering every token check with a 401.\n */\n private async preloadJose(opts: { options: IAuthenticateOptions }): Promise<void> {\n const { jwtOptions, serviceOptions } = opts.options;\n if (!jwtOptions && !serviceOptions) {\n return;\n }\n\n try {\n await JoseLoader.load();\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n this.logger.for(this.preloadJose.name).error(\"Failed to load 'jose' | Error: %s\", reason);\n\n throw getError({\n message: `[AuthenticateComponent] Cannot load 'jose', which JWT and service authentication need. Please install it | Error: ${reason}`,\n cause: error,\n });\n }\n }\n\n private defineJWSAuth(opts: { options: IJWSTokenServiceOptions }): void {\n const { options: jwsOptions } = opts;\n\n const { jwtSecret, getTokenExpiresFn } = jwsOptions;\n\n if (!jwtSecret || jwtSecret === DEFAULT_SECRET) {\n throw getError({\n message: `[defineJWSAuth] Invalid jwtSecret | Provided: ${jwtSecret}`,\n });\n }\n\n if (!getTokenExpiresFn) {\n throw getError({\n message: '[defineJWSAuth] getTokenExpiresFn is required',\n });\n }\n\n this.application\n .bind<IJWSTokenServiceOptions>({ key: AuthenticateBindingKeys.JWT_OPTIONS })\n .toValue(jwsOptions);\n this.application.service(JWSTokenService);\n\n this.logger.for(this.defineJWSAuth.name).info('JWS authentication configured');\n }\n\n private defineJWKSAuth(opts: { options: TJWKSTokenServiceOptions }): void {\n const { options: jwksOptions } = opts;\n\n switch (jwksOptions.mode) {\n case JWKSModes.ISSUER: {\n const issuerOpts = jwksOptions;\n\n if (!issuerOpts.keys?.private || !issuerOpts.keys?.public) {\n throw getError({\n message: '[defineJWKSAuth] keys.private and keys.public are required for issuer mode',\n });\n }\n\n if (!issuerOpts.keys?.format || !JWKSKeyFormats.isValid(issuerOpts.keys.format)) {\n throw getError({\n message: `[defineJWKSAuth] keys.format is required and must be one of: ${[...JWKSKeyFormats.SCHEME_SET].join(', ')}`,\n });\n }\n\n if (!issuerOpts.kid) {\n throw getError({ message: '[defineJWKSAuth] kid is required for issuer mode' });\n }\n\n if (!issuerOpts.getTokenExpiresFn) {\n throw getError({\n message: '[defineJWKSAuth] getTokenExpiresFn is required for issuer mode',\n });\n }\n\n this.application\n .bind<IJWKSIssuerOptions>({ key: AuthenticateBindingKeys.JWKS_OPTIONS })\n .toValue(issuerOpts);\n this.application.service(JWKSIssuerTokenService);\n\n // Path depends on a runtime option, so @controller can't be applied statically — decorate here instead.\n Reflect.decorate(\n [controller({ path: issuerOpts?.rest?.path ?? '/certs' })],\n JWKSController,\n );\n this.application.controller(JWKSController);\n\n this.logger\n .for(this.defineJWKSAuth.name)\n .info('JWKS issuer configured with /certs endpoint');\n break;\n }\n\n case JWKSModes.VERIFIER: {\n const verifierOpts = jwksOptions;\n\n if (!verifierOpts.jwksUrl) {\n throw getError({ message: '[defineJWKSAuth] jwksUrl is required for verifier mode' });\n }\n\n this.application\n .bind<IJWKSVerifierOptions>({ key: AuthenticateBindingKeys.JWKS_OPTIONS })\n .toValue(verifierOpts);\n this.application.service(JWKSVerifierTokenService);\n\n this.logger.for(this.defineJWKSAuth.name).info('JWKS verifier configured');\n break;\n }\n\n default: {\n // Same exhaustive-switch-narrows-to-never situation as the JOSE standard default above.\n throw getError({\n message: `[defineJWKSAuth] Invalid JWKS mode: ${(jwksOptions as { mode?: unknown }).mode}`,\n });\n }\n }\n }\n\n /**\n * Service-to-service authentication. Absent options mean no strategy is registered and no route is\n * mounted, so an application that never sets them is byte-identical to today.\n *\n * The certs route is mounted only when SIGNING keys are present. Most services are called and\n * never call; publishing a key set for a service that signs nothing advertises a capability it\n * does not have.\n */\n private defineServiceAuth(opts: { serviceOptions?: IServiceAuthOptions }): void {\n const { serviceOptions } = opts;\n\n if (!serviceOptions) {\n this.logger\n .for(this.defineServiceAuth.name)\n .debug('serviceOptions not provided, skipping service authentication');\n return;\n }\n\n if (!serviceOptions.name) {\n throw getError({\n message:\n '[defineServiceAuth] name is required | it is the issuer this service stamps and the audience it demands',\n });\n }\n\n if (!serviceOptions.resolvePrincipal) {\n throw getError({\n message:\n '[defineServiceAuth] resolvePrincipal is required | the framework proves WHICH SERVICE called, the application decides who that acts as',\n });\n }\n\n this.application.service(ServiceAssertionVerifierService);\n\n if (serviceOptions.keys) {\n this.application.service(ServiceAssertionSignerService);\n\n const restPath = serviceOptions.rest?.path ?? ServiceAssertion.DEFAULT_REST_PATH;\n this.application\n .bind<string>({ key: AuthenticateBindingKeys.SERVICE_CERTS_PATH })\n .toValue(restPath);\n\n // Path depends on a runtime option, so @controller cannot be applied statically.\n Reflect.decorate([controller({ path: restPath })], ServiceCertsController);\n this.application.controller(ServiceCertsController);\n }\n\n AuthenticationStrategyRegistry.getInstance().register({\n container: this.application,\n strategies: [\n { name: Authentication.STRATEGY_SERVICE, strategy: ServiceAuthenticationStrategy },\n ],\n });\n\n this.logger\n .for(this.defineServiceAuth.name)\n .info(\n 'Service authentication configured | name: %s | signs: %s | callers: %s',\n serviceOptions.name,\n Boolean(serviceOptions.keys),\n Object.keys(serviceOptions.callers ?? {}).join(', ') || 'none',\n );\n }\n\n private defineBasicAuth(opts: { basicOptions?: TBasicTokenServiceOptions }): void {\n const { basicOptions } = opts;\n\n if (!basicOptions) {\n this.logger\n .for(this.defineBasicAuth.name)\n .debug('basicOptions not provided, skipping Basic configuration');\n return;\n }\n\n if (!basicOptions.verifyCredentials) {\n throw getError({\n message: '[defineBasicAuth] verifyCredentials function is required',\n });\n }\n\n this.application\n .bind<TBasicTokenServiceOptions>({ key: AuthenticateBindingKeys.BASIC_OPTIONS })\n .toValue(basicOptions);\n this.application.service(BasicTokenService);\n\n this.logger.for(this.defineBasicAuth.name).info('Basic authentication configured');\n }\n\n private defineControllers(opts: { options: IAuthenticateOptions }): void {\n const { restOptions, jwtOptions } = opts.options;\n\n if (!restOptions?.useAuthController) {\n this.logger.for(this.defineControllers.name).debug('Auth controller disabled');\n return;\n }\n\n if (!jwtOptions) {\n throw getError({\n message: '[defineControllers] Auth controller requires jwtOptions to be configured',\n });\n }\n\n const AuthController = defineAuthController(restOptions.controllerOpts);\n this.application.controller(AuthController);\n\n this.logger.for(this.defineControllers.name).info('Auth controller registered');\n }\n\n defineOAuth2() {\n // TODO Implement OAuth2\n }\n}\n"]}
1
+ {"version":3,"file":"component.js","sourceRoot":"","sources":["../../../../../src/components/auth/authenticate/component.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BaseApplication } from '@/base/applications/base';\nimport { type ValueOrPromise } from '@venizia/ignis-helpers/common';\nimport { getError } from '@venizia/ignis-helpers/core';\nimport { Binding } from '@venizia/ignis-inversion';\nimport {\n AuthenticateBindingKeys,\n Authentication,\n AuthenticationStrategyRegistry,\n BaseComponent,\n controller,\n CoreBindings,\n type IAuthenticateOptions,\n type IJWKSIssuerOptions,\n type IJWKSVerifierOptions,\n type IJWSTokenServiceOptions,\n inject,\n type IServiceAuthOptions,\n JOSEStandards,\n JWKSKeyFormats,\n JWKSModes,\n ServiceAssertion,\n type TAuthenticationRestOptions,\n type TBasicTokenServiceOptions,\n type TJWKSTokenServiceOptions,\n type TJWTTokenServiceOptions,\n} from '@venizia/ignis-kernel';\nimport { AuthControllerFactory, JWKSController } from './controllers';\nimport { ServiceCertsController } from './controllers/service-certs';\nimport {\n BasicTokenService,\n JWKSIssuerTokenService,\n JWKSVerifierTokenService,\n JWSTokenService,\n} from './services';\nimport { JoseLoader } from './services/jose-loader';\nimport { ServiceAssertionSignerService } from './services/service/signer.service';\nimport { ServiceAssertionVerifierService } from './services/service/verifier.service';\nimport { ServiceAuthenticationStrategy } from './strategies/service.strategy';\n\nconst DEFAULT_SECRET = 'unknown_secret';\n\nexport class AuthenticateComponent extends BaseComponent {\n constructor(\n @inject({ key: CoreBindings.APPLICATION_INSTANCE }) private application: BaseApplication,\n ) {\n super({\n scope: AuthenticateComponent.name,\n initDefault: { enable: true, container: application },\n bindings: {\n [AuthenticateBindingKeys.REST_OPTIONS]: Binding.bind<TAuthenticationRestOptions>({\n key: AuthenticateBindingKeys.REST_OPTIONS,\n }).toValue({ useAuthController: false }),\n },\n });\n }\n\n override binding(): ValueOrPromise<void> {\n const jwtOptions = this.application.get<TJWTTokenServiceOptions>({\n key: AuthenticateBindingKeys.JWT_OPTIONS,\n isOptional: true,\n });\n const basicOptions = this.application.get<TBasicTokenServiceOptions>({\n key: AuthenticateBindingKeys.BASIC_OPTIONS,\n isOptional: true,\n });\n const restOptions = this.application.get<TAuthenticationRestOptions>({\n key: AuthenticateBindingKeys.REST_OPTIONS,\n isOptional: true,\n });\n const serviceOptions = this.application.get<IServiceAuthOptions>({\n key: AuthenticateBindingKeys.SERVICE_OPTIONS,\n isOptional: true,\n });\n\n // A service that only VERIFIES assertions needs neither jwt nor basic - and that application,\n // an IGNIS app consuming no user tokens at all, is exactly what the service strategy is for.\n if (!jwtOptions && !basicOptions && !serviceOptions) {\n throw getError({\n message:\n '[AuthenticateComponent] At least one of jwtOptions, basicOptions or serviceOptions must be provided',\n });\n }\n\n const options: IAuthenticateOptions = { restOptions, jwtOptions, basicOptions, serviceOptions };\n\n if (jwtOptions) {\n switch (jwtOptions.standard) {\n case JOSEStandards.JWS: {\n this.defineJWSAuth({ options: jwtOptions.options });\n break;\n }\n case JOSEStandards.JWKS: {\n this.defineJWKSAuth({ options: jwtOptions.options });\n break;\n }\n default: {\n throw getError({\n message: `[AuthenticateComponent] Unknown JOSE standard: ${(jwtOptions as any).standard}`,\n });\n }\n }\n }\n\n this.defineBasicAuth({ basicOptions });\n this.defineServiceAuth({ serviceOptions });\n\n this.defineControllers({ options });\n\n this.defineOAuth2();\n\n return this.preloadJose({ options });\n }\n\n /**\n * Loads `jose` at boot when a configured service signs or verifies with it, so a missing or broken\n * install fails the boot instead of answering every token check with a 401.\n */\n private async preloadJose(opts: { options: IAuthenticateOptions }): Promise<void> {\n const { jwtOptions, serviceOptions } = opts.options;\n if (!jwtOptions && !serviceOptions) {\n return;\n }\n\n try {\n await JoseLoader.load();\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n this.logger.for(this.preloadJose.name).error(\"Failed to load 'jose' | Error: %s\", reason);\n\n throw getError({\n message: `[AuthenticateComponent] Cannot load 'jose', which JWT and service authentication need. Please install it | Error: ${reason}`,\n cause: error,\n });\n }\n }\n\n private defineJWSAuth(opts: { options: IJWSTokenServiceOptions }): void {\n const { options: jwsOptions } = opts;\n\n const { jwtSecret, getTokenExpiresFn } = jwsOptions;\n\n if (!jwtSecret || jwtSecret === DEFAULT_SECRET) {\n throw getError({\n message: `[defineJWSAuth] Invalid jwtSecret | Provided: ${jwtSecret}`,\n });\n }\n\n if (!getTokenExpiresFn) {\n throw getError({\n message: '[defineJWSAuth] getTokenExpiresFn is required',\n });\n }\n\n this.application\n .bind<IJWSTokenServiceOptions>({ key: AuthenticateBindingKeys.JWT_OPTIONS })\n .toValue(jwsOptions);\n this.application.service(JWSTokenService);\n\n this.logger.for(this.defineJWSAuth.name).info('JWS authentication configured');\n }\n\n private defineJWKSAuth(opts: { options: TJWKSTokenServiceOptions }): void {\n const { options: jwksOptions } = opts;\n\n switch (jwksOptions.mode) {\n case JWKSModes.ISSUER: {\n const issuerOpts = jwksOptions;\n\n if (!issuerOpts.keys?.private || !issuerOpts.keys?.public) {\n throw getError({\n message: '[defineJWKSAuth] keys.private and keys.public are required for issuer mode',\n });\n }\n\n if (!issuerOpts.keys?.format || !JWKSKeyFormats.isValid(issuerOpts.keys.format)) {\n throw getError({\n message: `[defineJWKSAuth] keys.format is required and must be one of: ${[...JWKSKeyFormats.SCHEME_SET].join(', ')}`,\n });\n }\n\n if (!issuerOpts.kid) {\n throw getError({ message: '[defineJWKSAuth] kid is required for issuer mode' });\n }\n\n if (!issuerOpts.getTokenExpiresFn) {\n throw getError({\n message: '[defineJWKSAuth] getTokenExpiresFn is required for issuer mode',\n });\n }\n\n this.application\n .bind<IJWKSIssuerOptions>({ key: AuthenticateBindingKeys.JWKS_OPTIONS })\n .toValue(issuerOpts);\n this.application.service(JWKSIssuerTokenService);\n\n // Path depends on a runtime option, so @controller can't be applied statically — decorate here instead.\n Reflect.decorate(\n [controller({ path: issuerOpts?.rest?.path ?? '/certs' })],\n JWKSController,\n );\n this.application.controller(JWKSController);\n\n this.logger\n .for(this.defineJWKSAuth.name)\n .info('JWKS issuer configured with /certs endpoint');\n break;\n }\n\n case JWKSModes.VERIFIER: {\n const verifierOpts = jwksOptions;\n\n if (!verifierOpts.jwksUrl) {\n throw getError({ message: '[defineJWKSAuth] jwksUrl is required for verifier mode' });\n }\n\n this.application\n .bind<IJWKSVerifierOptions>({ key: AuthenticateBindingKeys.JWKS_OPTIONS })\n .toValue(verifierOpts);\n this.application.service(JWKSVerifierTokenService);\n\n this.logger.for(this.defineJWKSAuth.name).info('JWKS verifier configured');\n break;\n }\n\n default: {\n // Same exhaustive-switch-narrows-to-never situation as the JOSE standard default above.\n throw getError({\n message: `[defineJWKSAuth] Invalid JWKS mode: ${(jwksOptions as { mode?: unknown }).mode}`,\n });\n }\n }\n }\n\n /**\n * Service-to-service authentication. Absent options mean no strategy is registered and no route is\n * mounted, so an application that never sets them is byte-identical to today.\n *\n * The certs route is mounted only when SIGNING keys are present. Most services are called and\n * never call; publishing a key set for a service that signs nothing advertises a capability it\n * does not have.\n */\n private defineServiceAuth(opts: { serviceOptions?: IServiceAuthOptions }): void {\n const { serviceOptions } = opts;\n\n if (!serviceOptions) {\n this.logger\n .for(this.defineServiceAuth.name)\n .debug('serviceOptions not provided, skipping service authentication');\n return;\n }\n\n if (!serviceOptions.name) {\n throw getError({\n message:\n '[defineServiceAuth] name is required | it is the issuer this service stamps and the audience it demands',\n });\n }\n\n if (!serviceOptions.resolvePrincipal) {\n throw getError({\n message:\n '[defineServiceAuth] resolvePrincipal is required | the framework proves WHICH SERVICE called, the application decides who that acts as',\n });\n }\n\n this.application.service(ServiceAssertionVerifierService);\n\n if (serviceOptions.keys) {\n this.application.service(ServiceAssertionSignerService);\n\n const restPath = serviceOptions.rest?.path ?? ServiceAssertion.DEFAULT_REST_PATH;\n this.application\n .bind<string>({ key: AuthenticateBindingKeys.SERVICE_CERTS_PATH })\n .toValue(restPath);\n\n // Path depends on a runtime option, so @controller cannot be applied statically.\n Reflect.decorate([controller({ path: restPath })], ServiceCertsController);\n this.application.controller(ServiceCertsController);\n }\n\n AuthenticationStrategyRegistry.getInstance().register({\n container: this.application,\n strategies: [\n { name: Authentication.STRATEGY_SERVICE, strategy: ServiceAuthenticationStrategy },\n ],\n });\n\n this.logger\n .for(this.defineServiceAuth.name)\n .info(\n 'Service authentication configured | name: %s | signs: %s | callers: %s',\n serviceOptions.name,\n Boolean(serviceOptions.keys),\n Object.keys(serviceOptions.callers ?? {}).join(', ') || 'none',\n );\n }\n\n private defineBasicAuth(opts: { basicOptions?: TBasicTokenServiceOptions }): void {\n const { basicOptions } = opts;\n\n if (!basicOptions) {\n this.logger\n .for(this.defineBasicAuth.name)\n .debug('basicOptions not provided, skipping Basic configuration');\n return;\n }\n\n if (!basicOptions.verifyCredentials) {\n throw getError({\n message: '[defineBasicAuth] verifyCredentials function is required',\n });\n }\n\n this.application\n .bind<TBasicTokenServiceOptions>({ key: AuthenticateBindingKeys.BASIC_OPTIONS })\n .toValue(basicOptions);\n this.application.service(BasicTokenService);\n\n this.logger.for(this.defineBasicAuth.name).info('Basic authentication configured');\n }\n\n private defineControllers(opts: { options: IAuthenticateOptions }): void {\n const { restOptions, jwtOptions } = opts.options;\n\n if (!restOptions?.useAuthController) {\n this.logger.for(this.defineControllers.name).debug('Auth controller disabled');\n return;\n }\n\n if (!jwtOptions) {\n throw getError({\n message: '[defineControllers] Auth controller requires jwtOptions to be configured',\n });\n }\n\n const AuthController = AuthControllerFactory.define(restOptions.controllerOpts);\n this.application.controller(AuthController);\n\n this.logger.for(this.defineControllers.name).info('Auth controller registered');\n }\n\n defineOAuth2() {\n // TODO Implement OAuth2\n }\n}\n"]}
@@ -12,150 +12,153 @@ export declare const JWTTokenPayloadSchema: z.ZodObject<{
12
12
  provider: z.ZodOptional<z.ZodString>;
13
13
  email: z.ZodOptional<z.ZodEmail>;
14
14
  }, z.core.$strip>;
15
- export declare const defineAuthController: (opts: TDefineAuthControllerOpts) => {
16
- new (authService: IAuthService): {
17
- service: IAuthService;
18
- binding(): ValueOrPromise<void>;
19
- measure<R>(opts: {
20
- scope: string;
21
- args: unknown;
22
- task: () => Promise<R>;
23
- }): Promise<any>;
24
- normalizeCountData<ResponseSchema extends unknown, RequestContext extends import("@venizia/ignis-kernel").TRouteContext<import("hono").Env> = import("@venizia/ignis-kernel").TRouteContext<import("hono").Env>, ResponseData extends {
25
- count: number;
26
- data?: import("@venizia/ignis-helpers").TNullable<ResponseSchema>;
27
- } = {
28
- count: number;
29
- data?: import("@venizia/ignis-helpers").TNullable<ResponseSchema>;
30
- }>(opts: {
31
- context: RequestContext;
32
- payload: ResponseData;
33
- }): ResponseData | import("@venizia/ignis-helpers").TNullable<ResponseSchema>;
34
- getRequestedExtras(opts: {
35
- context: import("@venizia/ignis-kernel").TRouteContext<import("hono").Env>;
36
- }): Array<import("@venizia/ignis-kernel").IRequestedExtra>;
37
- respond<R>(opts: {
38
- context: import("@venizia/ignis-kernel").TRouteContext<import("hono").Env>;
39
- format: import("@venizia/ignis-kernel").TResponseFormat;
40
- payload: {
15
+ /** Builds the decorated REST controller of the authentication routes (sign-in, sign-up, change-password, who-am-i). */
16
+ export declare class AuthControllerFactory {
17
+ static define(opts: TDefineAuthControllerOpts): {
18
+ new (authService: IAuthService): {
19
+ service: IAuthService;
20
+ binding(): ValueOrPromise<void>;
21
+ measure<R>(opts: {
22
+ scope: string;
23
+ args: unknown;
24
+ task: () => Promise<R>;
25
+ }): Promise<any>;
26
+ normalizeCountData<ResponseSchema extends unknown, RequestContext extends import("@venizia/ignis-kernel").TRouteContext<import("hono").Env> = import("@venizia/ignis-kernel").TRouteContext<import("hono").Env>, ResponseData extends {
41
27
  count: number;
42
- data?: import("@venizia/ignis-helpers").TNullable<R>;
43
- };
44
- range?: import("@venizia/ignis-kernel").TDataRange;
45
- extra?: never;
46
- }): R | {
47
- count: number;
48
- data?: import("@venizia/ignis-helpers").TNullable<R>;
49
- } | null | undefined;
50
- respond<R, Extra extends Record<string, import("@venizia/ignis-kernel").TResponseExtra>>(opts: {
51
- context: import("@venizia/ignis-kernel").TRouteContext<import("hono").Env>;
52
- format: import("@venizia/ignis-kernel").TResponseFormat;
53
- payload: {
28
+ data?: import("@venizia/ignis-helpers").TNullable<ResponseSchema>;
29
+ } = {
30
+ count: number;
31
+ data?: import("@venizia/ignis-helpers").TNullable<ResponseSchema>;
32
+ }>(opts: {
33
+ context: RequestContext;
34
+ payload: ResponseData;
35
+ }): ResponseData | import("@venizia/ignis-helpers").TNullable<ResponseSchema>;
36
+ getRequestedExtras(opts: {
37
+ context: import("@venizia/ignis-kernel").TRouteContext<import("hono").Env>;
38
+ }): Array<import("@venizia/ignis-kernel").IRequestedExtra>;
39
+ respond<R>(opts: {
40
+ context: import("@venizia/ignis-kernel").TRouteContext<import("hono").Env>;
41
+ format: import("@venizia/ignis-kernel").TResponseFormat;
42
+ payload: {
43
+ count: number;
44
+ data?: import("@venizia/ignis-helpers").TNullable<R>;
45
+ };
46
+ range?: import("@venizia/ignis-kernel").TDataRange;
47
+ extra?: never;
48
+ }): R | {
54
49
  count: number;
55
50
  data?: import("@venizia/ignis-helpers").TNullable<R>;
56
- };
57
- range?: import("@venizia/ignis-kernel").TDataRange;
58
- extra: Extra;
59
- }): Promise<R | {
60
- count: number;
61
- data?: import("@venizia/ignis-helpers").TNullable<R>;
62
- } | {
63
- count?: number;
64
- data?: import("@venizia/ignis-helpers").TNullable<R>;
65
- extra: Partial<Record<keyof Extra, unknown>>;
66
- } | null | undefined>;
67
- respond<R>(opts: {
68
- context: import("@venizia/ignis-kernel").TRouteContext<import("hono").Env>;
69
- format: import("@venizia/ignis-kernel").TResponseFormat;
70
- payload: {
51
+ } | null | undefined;
52
+ respond<R, Extra extends Record<string, import("@venizia/ignis-kernel").TResponseExtra>>(opts: {
53
+ context: import("@venizia/ignis-kernel").TRouteContext<import("hono").Env>;
54
+ format: import("@venizia/ignis-kernel").TResponseFormat;
55
+ payload: {
56
+ count: number;
57
+ data?: import("@venizia/ignis-helpers").TNullable<R>;
58
+ };
59
+ range?: import("@venizia/ignis-kernel").TDataRange;
60
+ extra: Extra;
61
+ }): Promise<R | {
71
62
  count: number;
72
63
  data?: import("@venizia/ignis-helpers").TNullable<R>;
73
- };
74
- range?: import("@venizia/ignis-kernel").TDataRange;
75
- extra?: Record<string, import("@venizia/ignis-kernel").TResponseExtra>;
76
- }): ValueOrPromise<R | {
77
- count?: number;
78
- data?: import("@venizia/ignis-helpers").TNullable<R>;
79
- extra?: Record<string, unknown>;
80
- } | null | undefined>;
81
- respondWithExtra<R>(opts: {
82
- context: import("@venizia/ignis-kernel").TRouteContext<import("hono").Env>;
83
- payload: {
64
+ } | {
65
+ count?: number;
66
+ data?: import("@venizia/ignis-helpers").TNullable<R>;
67
+ extra: Partial<Record<keyof Extra, unknown>>;
68
+ } | null | undefined>;
69
+ respond<R>(opts: {
70
+ context: import("@venizia/ignis-kernel").TRouteContext<import("hono").Env>;
71
+ format: import("@venizia/ignis-kernel").TResponseFormat;
72
+ payload: {
73
+ count: number;
74
+ data?: import("@venizia/ignis-helpers").TNullable<R>;
75
+ };
76
+ range?: import("@venizia/ignis-kernel").TDataRange;
77
+ extra?: Record<string, import("@venizia/ignis-kernel").TResponseExtra>;
78
+ }): ValueOrPromise<R | {
79
+ count?: number;
80
+ data?: import("@venizia/ignis-helpers").TNullable<R>;
81
+ extra?: Record<string, unknown>;
82
+ } | null | undefined>;
83
+ respondWithExtra<R>(opts: {
84
+ context: import("@venizia/ignis-kernel").TRouteContext<import("hono").Env>;
85
+ payload: {
86
+ count: number;
87
+ data?: import("@venizia/ignis-helpers").TNullable<R>;
88
+ };
89
+ extra: Record<string, import("@venizia/ignis-kernel").TResponseExtra>;
90
+ }): Promise<R | {
84
91
  count: number;
85
92
  data?: import("@venizia/ignis-helpers").TNullable<R>;
93
+ } | {
94
+ count: number;
95
+ data: import("@venizia/ignis-helpers").TNullable<R>;
96
+ extra: Record<string, unknown>;
97
+ } | {
98
+ data: import("@venizia/ignis-helpers").TNullable<R>;
99
+ extra: Record<string, unknown>;
100
+ count?: undefined;
101
+ } | null | undefined>;
102
+ setListHeaders(opts: {
103
+ context: import("@venizia/ignis-kernel").TRouteContext<import("hono").Env>;
104
+ count: number;
105
+ } & ({
106
+ range: import("@venizia/ignis-kernel").TDataRange;
107
+ } | {
108
+ offset: number;
109
+ total: number;
110
+ })): void;
111
+ toHonoHandler<ResponseType = unknown>(opts: {
112
+ handler: import("@venizia/ignis-kernel").TRouteHandler<ResponseType, import("hono").Env>;
113
+ }): import("hono").Handler<import("hono").Env, string, import("hono").Input, (Response | Promise<Response>) | (import("@hono/zod-openapi").RouteConfigToTypedResponse<import("@hono/zod-openapi").RouteConfig> | Promise<import("@hono/zod-openapi").RouteConfigToTypedResponse<import("@hono/zod-openapi").RouteConfig>>)>;
114
+ bindRoute<RouteConfig extends import("@venizia/ignis-kernel").IAuthRouteConfig>(opts: {
115
+ configs: RouteConfig;
116
+ }): import("@venizia/ignis-kernel").IBindRouteOptions<RouteConfig, import("hono").Env, {}, "/">;
117
+ defineRoute<RouteConfig extends import("@venizia/ignis-kernel").IAuthRouteConfig, ResponseType = unknown>(opts: {
118
+ configs: RouteConfig;
119
+ handler: import("@venizia/ignis-kernel").TRouteHandler<ResponseType, import("hono").Env>;
120
+ hook?: import("@hono/zod-openapi").Hook<any, import("hono").Env, string, any> | undefined;
121
+ }): import("@venizia/ignis-kernel").IDefineRouteOptions<RouteConfig, import("hono").Env, {}, "/">;
122
+ defineJSXRoute<RouteConfig extends import("@venizia/ignis-kernel").IAuthRouteConfig, ResponseType = unknown>(opts: {
123
+ configs: RouteConfig;
124
+ handler: import("@venizia/ignis-kernel").TRouteHandler<ResponseType, import("hono").Env>;
125
+ hook?: import("@hono/zod-openapi").Hook<any, import("hono").Env, string, any> | undefined;
126
+ }): import("@venizia/ignis-kernel").IDefineRouteOptions<RouteConfig, import("hono").Env, {}, "/">;
127
+ isConfigured: boolean;
128
+ router: import("@hono/zod-openapi").OpenAPIHono<import("hono").Env, {}, "/">;
129
+ path: string;
130
+ definitions: Record<string, import("@venizia/ignis-kernel").IAuthRouteConfig>;
131
+ getRouter(): import("@hono/zod-openapi").OpenAPIHono<import("hono").Env, {}, "/">;
132
+ registerRoutesFromRegistry(opts?: {
133
+ paths?: import("@venizia/ignis-kernel").TRoutePathScope;
134
+ }): void;
135
+ configure(opts?: {} | undefined): Promise<import("@hono/zod-openapi").OpenAPIHono<import("hono").Env, {}, "/">>;
136
+ buildRouteMiddlewares<RouteConfig extends import("@venizia/ignis-kernel").IAuthRouteConfig>(opts: {
137
+ configs: RouteConfig;
138
+ }): {
139
+ restConfig: Omit<RouteConfig, "authenticate" | "authorize">;
140
+ security: {
141
+ [x: string]: never[];
142
+ }[];
143
+ mws: import("hono").MiddlewareHandler<import("hono").Env>[];
86
144
  };
87
- extra: Record<string, import("@venizia/ignis-kernel").TResponseExtra>;
88
- }): Promise<R | {
89
- count: number;
90
- data?: import("@venizia/ignis-helpers").TNullable<R>;
91
- } | {
92
- count: number;
93
- data: import("@venizia/ignis-helpers").TNullable<R>;
94
- extra: Record<string, unknown>;
95
- } | {
96
- data: import("@venizia/ignis-helpers").TNullable<R>;
97
- extra: Record<string, unknown>;
98
- count?: undefined;
99
- } | null | undefined>;
100
- setListHeaders(opts: {
101
- context: import("@venizia/ignis-kernel").TRouteContext<import("hono").Env>;
102
- count: number;
103
- } & ({
104
- range: import("@venizia/ignis-kernel").TDataRange;
105
- } | {
106
- offset: number;
107
- total: number;
108
- })): void;
109
- toHonoHandler<ResponseType = unknown>(opts: {
110
- handler: import("@venizia/ignis-kernel").TRouteHandler<ResponseType, import("hono").Env>;
111
- }): import("hono").Handler<import("hono").Env, string, import("hono").Input, (Response | Promise<Response>) | (import("@hono/zod-openapi").RouteConfigToTypedResponse<import("@hono/zod-openapi").RouteConfig> | Promise<import("@hono/zod-openapi").RouteConfigToTypedResponse<import("@hono/zod-openapi").RouteConfig>>)>;
112
- bindRoute<RouteConfig extends import("@venizia/ignis-kernel").IAuthRouteConfig>(opts: {
113
- configs: RouteConfig;
114
- }): import("@venizia/ignis-kernel").IBindRouteOptions<RouteConfig, import("hono").Env, {}, "/">;
115
- defineRoute<RouteConfig extends import("@venizia/ignis-kernel").IAuthRouteConfig, ResponseType = unknown>(opts: {
116
- configs: RouteConfig;
117
- handler: import("@venizia/ignis-kernel").TRouteHandler<ResponseType, import("hono").Env>;
118
- hook?: import("@hono/zod-openapi").Hook<any, import("hono").Env, string, any> | undefined;
119
- }): import("@venizia/ignis-kernel").IDefineRouteOptions<RouteConfig, import("hono").Env, {}, "/">;
120
- defineJSXRoute<RouteConfig extends import("@venizia/ignis-kernel").IAuthRouteConfig, ResponseType = unknown>(opts: {
121
- configs: RouteConfig;
122
- handler: import("@venizia/ignis-kernel").TRouteHandler<ResponseType, import("hono").Env>;
123
- hook?: import("@hono/zod-openapi").Hook<any, import("hono").Env, string, any> | undefined;
124
- }): import("@venizia/ignis-kernel").IDefineRouteOptions<RouteConfig, import("hono").Env, {}, "/">;
125
- isConfigured: boolean;
126
- router: import("@hono/zod-openapi").OpenAPIHono<import("hono").Env, {}, "/">;
127
- path: string;
128
- definitions: Record<string, import("@venizia/ignis-kernel").IAuthRouteConfig>;
129
- getRouter(): import("@hono/zod-openapi").OpenAPIHono<import("hono").Env, {}, "/">;
130
- registerRoutesFromRegistry(opts?: {
131
- paths?: import("@venizia/ignis-kernel").TRoutePathScope;
132
- }): void;
133
- configure(opts?: {} | undefined): Promise<import("@hono/zod-openapi").OpenAPIHono<import("hono").Env, {}, "/">>;
134
- buildRouteMiddlewares<RouteConfig extends import("@venizia/ignis-kernel").IAuthRouteConfig>(opts: {
135
- configs: RouteConfig;
136
- }): {
137
- restConfig: Omit<RouteConfig, "authenticate" | "authorize">;
138
- security: {
139
- [x: string]: never[];
140
- }[];
141
- mws: import("hono").MiddlewareHandler<import("hono").Env>[];
142
- };
143
- getRouteConfigs<RouteConfig extends import("@venizia/ignis-kernel").IAuthRouteConfig>(opts: {
144
- configs: RouteConfig;
145
- }): RouteConfig & {
146
- getRoutingPath(): RouteConfig["path"] extends infer T ? T extends RouteConfig["path"] ? T extends `${infer Start}/{${infer Param}}${infer Rest}` ? `${Start}/:${Param}${Rest extends `${infer Start_1}/{${infer Param_1}}${infer Rest_1}` ? `${Start_1}/:${Param_1}${Rest_1 extends `${infer Start_2}/{${infer Param_2}}${infer Rest_2}` ? `${Start_2}/:${Param_2}${Rest_2 extends `${infer Start_3}/{${infer Param_3}}${infer Rest_3}` ? `${Start_3}/:${Param_3}${Rest_3 extends `${infer Start_4}/{${infer Param_4}}${infer Rest_4}` ? `${Start_4}/:${Param_4}${Rest_4 extends `${infer Start_5}/{${infer Param_5}}${infer Rest_5}` ? `${Start_5}/:${Param_5}${Rest_5 extends `${infer Start_6}/{${infer Param_6}}${infer Rest_6}` ? `${Start_6}/:${Param_6}${Rest_6 extends `${infer Start_7}/{${infer Param_7}}${infer Rest_7}` ? `${Start_7}/:${Param_7}${Rest_7 extends `${infer Start_8}/{${infer Param_8}}${infer Rest_8}` ? `${Start_8}/:${Param_8}${Rest_8 extends `${infer Start_9}/{${infer Param_9}}${infer Rest_9}` ? `${Start_9}/:${Param_9}${Rest_9 extends `${infer Start_10}/{${infer Param_10}}${infer Rest_10}` ? `${Start_10}/:${Param_10}${any}` : Rest_9}` : Rest_8}` : Rest_7}` : Rest_6}` : Rest_5}` : Rest_4}` : Rest_3}` : Rest_2}` : Rest_1}` : Rest}` : T : never : never;
147
- };
148
- getJSXRouteConfigs<RouteConfig extends import("@venizia/ignis-kernel").IAuthRouteConfig>(opts: {
149
- configs: RouteConfig;
150
- }): RouteConfig & {
151
- getRoutingPath(): RouteConfig["path"] extends infer T ? T extends RouteConfig["path"] ? T extends `${infer Start}/{${infer Param}}${infer Rest}` ? `${Start}/:${Param}${Rest extends `${infer Start_1}/{${infer Param_1}}${infer Rest_1}` ? `${Start_1}/:${Param_1}${Rest_1 extends `${infer Start_2}/{${infer Param_2}}${infer Rest_2}` ? `${Start_2}/:${Param_2}${Rest_2 extends `${infer Start_3}/{${infer Param_3}}${infer Rest_3}` ? `${Start_3}/:${Param_3}${Rest_3 extends `${infer Start_4}/{${infer Param_4}}${infer Rest_4}` ? `${Start_4}/:${Param_4}${Rest_4 extends `${infer Start_5}/{${infer Param_5}}${infer Rest_5}` ? `${Start_5}/:${Param_5}${Rest_5 extends `${infer Start_6}/{${infer Param_6}}${infer Rest_6}` ? `${Start_6}/:${Param_6}${Rest_6 extends `${infer Start_7}/{${infer Param_7}}${infer Rest_7}` ? `${Start_7}/:${Param_7}${Rest_7 extends `${infer Start_8}/{${infer Param_8}}${infer Rest_8}` ? `${Start_8}/:${Param_8}${Rest_8 extends `${infer Start_9}/{${infer Param_9}}${infer Rest_9}` ? `${Start_9}/:${Param_9}${Rest_9 extends `${infer Start_10}/{${infer Param_10}}${infer Rest_10}` ? `${Start_10}/:${Param_10}${any}` : Rest_9}` : Rest_8}` : Rest_7}` : Rest_6}` : Rest_5}` : Rest_4}` : Rest_3}` : Rest_2}` : Rest_1}` : Rest}` : T : never : never;
145
+ getRouteConfigs<RouteConfig extends import("@venizia/ignis-kernel").IAuthRouteConfig>(opts: {
146
+ configs: RouteConfig;
147
+ }): RouteConfig & {
148
+ getRoutingPath(): RouteConfig["path"] extends infer T ? T extends RouteConfig["path"] ? T extends `${infer Start}/{${infer Param}}${infer Rest}` ? `${Start}/:${Param}${Rest extends `${infer Start_1}/{${infer Param_1}}${infer Rest_1}` ? `${Start_1}/:${Param_1}${Rest_1 extends `${infer Start_2}/{${infer Param_2}}${infer Rest_2}` ? `${Start_2}/:${Param_2}${Rest_2 extends `${infer Start_3}/{${infer Param_3}}${infer Rest_3}` ? `${Start_3}/:${Param_3}${Rest_3 extends `${infer Start_4}/{${infer Param_4}}${infer Rest_4}` ? `${Start_4}/:${Param_4}${Rest_4 extends `${infer Start_5}/{${infer Param_5}}${infer Rest_5}` ? `${Start_5}/:${Param_5}${Rest_5 extends `${infer Start_6}/{${infer Param_6}}${infer Rest_6}` ? `${Start_6}/:${Param_6}${Rest_6 extends `${infer Start_7}/{${infer Param_7}}${infer Rest_7}` ? `${Start_7}/:${Param_7}${Rest_7 extends `${infer Start_8}/{${infer Param_8}}${infer Rest_8}` ? `${Start_8}/:${Param_8}${Rest_8 extends `${infer Start_9}/{${infer Param_9}}${infer Rest_9}` ? `${Start_9}/:${Param_9}${Rest_9 extends `${infer Start_10}/{${infer Param_10}}${infer Rest_10}` ? `${Start_10}/:${Param_10}${any}` : Rest_9}` : Rest_8}` : Rest_7}` : Rest_6}` : Rest_5}` : Rest_4}` : Rest_3}` : Rest_2}` : Rest_1}` : Rest}` : T : never : never;
149
+ };
150
+ getJSXRouteConfigs<RouteConfig extends import("@venizia/ignis-kernel").IAuthRouteConfig>(opts: {
151
+ configs: RouteConfig;
152
+ }): RouteConfig & {
153
+ getRoutingPath(): RouteConfig["path"] extends infer T ? T extends RouteConfig["path"] ? T extends `${infer Start}/{${infer Param}}${infer Rest}` ? `${Start}/:${Param}${Rest extends `${infer Start_1}/{${infer Param_1}}${infer Rest_1}` ? `${Start_1}/:${Param_1}${Rest_1 extends `${infer Start_2}/{${infer Param_2}}${infer Rest_2}` ? `${Start_2}/:${Param_2}${Rest_2 extends `${infer Start_3}/{${infer Param_3}}${infer Rest_3}` ? `${Start_3}/:${Param_3}${Rest_3 extends `${infer Start_4}/{${infer Param_4}}${infer Rest_4}` ? `${Start_4}/:${Param_4}${Rest_4 extends `${infer Start_5}/{${infer Param_5}}${infer Rest_5}` ? `${Start_5}/:${Param_5}${Rest_5 extends `${infer Start_6}/{${infer Param_6}}${infer Rest_6}` ? `${Start_6}/:${Param_6}${Rest_6 extends `${infer Start_7}/{${infer Param_7}}${infer Rest_7}` ? `${Start_7}/:${Param_7}${Rest_7 extends `${infer Start_8}/{${infer Param_8}}${infer Rest_8}` ? `${Start_8}/:${Param_8}${Rest_8 extends `${infer Start_9}/{${infer Param_9}}${infer Rest_9}` ? `${Start_9}/:${Param_9}${Rest_9 extends `${infer Start_10}/{${infer Param_10}}${infer Rest_10}` ? `${Start_10}/:${Param_10}${any}` : Rest_9}` : Rest_8}` : Rest_7}` : Rest_6}` : Rest_5}` : Rest_4}` : Rest_3}` : Rest_2}` : Rest_1}` : Rest}` : T : never : never;
154
+ };
155
+ scope: string;
156
+ identifier: string;
157
+ get logger(): import("@venizia/ignis-helpers").ILogger;
158
+ set logger(value: import("@venizia/ignis-helpers").ILogger);
159
+ getIdentifier(): string;
160
+ getLogger(): import("@venizia/ignis-helpers").ILogger;
152
161
  };
153
- scope: string;
154
- identifier: string;
155
- get logger(): import("@venizia/ignis-helpers").ILogger;
156
- set logger(value: import("@venizia/ignis-helpers").ILogger);
157
- getIdentifier(): string;
158
- getLogger(): import("@venizia/ignis-helpers").ILogger;
159
162
  };
160
- };
163
+ }
161
164
  //# sourceMappingURL=factory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../../../../src/components/auth/authenticate/controllers/factory.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,CAAC,EAAE,MAAM,mBAAmB,CAAC;AAEtC,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAM1E,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,yBAAyB,EAC/B,MAAM,uBAAuB,CAAC;AAE/B,eAAO,MAAM,qBAAqB;;;;;;;;;;iBAYhC,CAAC;AAEH,eAAO,MAAM,oBAAoB,GAAI,MAAM,yBAAyB;sBAOvC,YAAY;iBAF5B,YAAY;mBAmBD,cAAc,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAbpC,CAAP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwMA,CAAC"}
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../../../../src/components/auth/authenticate/controllers/factory.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,CAAC,EAAE,MAAM,mBAAmB,CAAC;AAEtC,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAM1E,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,yBAAyB,EAC/B,MAAM,uBAAuB,CAAC;AAE/B,eAAO,MAAM,qBAAqB;;;;;;;;;;iBAYhC,CAAC;AAEH,uHAAuH;AACvH,qBAAa,qBAAqB;IAChC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,yBAAyB;0BAYhB,YAAY;qBAF5B,YAAY;uBAmBD,cAAc,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBApBhB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkN9B"}