alepha 0.20.2 → 0.20.4

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 (304) hide show
  1. package/README.md +0 -1
  2. package/assets/swagger-ui/swagger-ui-bundle.js +1 -1
  3. package/assets/swagger-ui/swagger-ui.css +1 -1
  4. package/dist/api/audits/index.browser.js +49 -0
  5. package/dist/api/audits/index.browser.js.map +1 -1
  6. package/dist/api/audits/index.js +49 -0
  7. package/dist/api/audits/index.js.map +1 -1
  8. package/dist/api/files/index.js.map +1 -1
  9. package/dist/api/jobs/index.d.ts +2 -61
  10. package/dist/api/jobs/index.d.ts.map +1 -1
  11. package/dist/api/jobs/index.js.map +1 -1
  12. package/dist/api/keys/index.d.ts +4 -4
  13. package/dist/api/keys/index.js.map +1 -1
  14. package/dist/api/notifications/index.d.ts +1 -10
  15. package/dist/api/notifications/index.d.ts.map +1 -1
  16. package/dist/api/parameters/index.browser.js +37 -0
  17. package/dist/api/parameters/index.browser.js.map +1 -1
  18. package/dist/api/parameters/index.d.ts +12 -68
  19. package/dist/api/parameters/index.d.ts.map +1 -1
  20. package/dist/api/parameters/index.js +57 -4
  21. package/dist/api/parameters/index.js.map +1 -1
  22. package/dist/api/payments/index.js.map +1 -1
  23. package/dist/api/users/index.browser.js +6 -0
  24. package/dist/api/users/index.browser.js.map +1 -1
  25. package/dist/api/users/index.d.ts +148 -227
  26. package/dist/api/users/index.d.ts.map +1 -1
  27. package/dist/api/users/index.js +60 -14
  28. package/dist/api/users/index.js.map +1 -1
  29. package/dist/api/verifications/index.d.ts.map +1 -1
  30. package/dist/api/verifications/index.js +2 -1
  31. package/dist/api/verifications/index.js.map +1 -1
  32. package/dist/bucket/index.d.ts +77 -107
  33. package/dist/bucket/index.d.ts.map +1 -1
  34. package/dist/bucket/index.js +153 -5
  35. package/dist/bucket/index.js.map +1 -1
  36. package/dist/bucket/index.workerd.js +12 -2
  37. package/dist/bucket/index.workerd.js.map +1 -1
  38. package/dist/cache/core/index.d.ts +26 -0
  39. package/dist/cache/core/index.d.ts.map +1 -1
  40. package/dist/cache/core/index.js +11 -1
  41. package/dist/cache/core/index.js.map +1 -1
  42. package/dist/cache/core/index.workerd.js +11 -1
  43. package/dist/cache/core/index.workerd.js.map +1 -1
  44. package/dist/captcha/index.js.map +1 -1
  45. package/dist/cli/config/index.d.ts +7 -5
  46. package/dist/cli/config/index.d.ts.map +1 -1
  47. package/dist/cli/config/index.js +2 -3
  48. package/dist/cli/config/index.js.map +1 -1
  49. package/dist/cli/core/index.d.ts +637 -11660
  50. package/dist/cli/core/index.d.ts.map +1 -1
  51. package/dist/cli/core/index.js +707 -532
  52. package/dist/cli/core/index.js.map +1 -1
  53. package/dist/cli/devtools/index.d.ts +4 -8
  54. package/dist/cli/devtools/index.d.ts.map +1 -1
  55. package/dist/cli/devtools/index.js +20 -16
  56. package/dist/cli/devtools/index.js.map +1 -1
  57. package/dist/cli/platform/index.d.ts +51 -77
  58. package/dist/cli/platform/index.d.ts.map +1 -1
  59. package/dist/cli/platform/index.js +65 -15
  60. package/dist/cli/platform/index.js.map +1 -1
  61. package/dist/cli/vendor/index.d.ts +10 -13
  62. package/dist/cli/vendor/index.d.ts.map +1 -1
  63. package/dist/cli/vendor/index.js +30 -12
  64. package/dist/cli/vendor/index.js.map +1 -1
  65. package/dist/command/index.js +1 -1
  66. package/dist/command/index.js.map +1 -1
  67. package/dist/core/index.browser.js +27 -3
  68. package/dist/core/index.browser.js.map +1 -1
  69. package/dist/core/index.d.ts +8 -11
  70. package/dist/core/index.d.ts.map +1 -1
  71. package/dist/core/index.js +27 -3
  72. package/dist/core/index.js.map +1 -1
  73. package/dist/core/index.native.js +27 -3
  74. package/dist/core/index.native.js.map +1 -1
  75. package/dist/core/index.workerd.js +27 -3
  76. package/dist/core/index.workerd.js.map +1 -1
  77. package/dist/crypto/index.js.map +1 -1
  78. package/dist/datetime/index.d.ts +69 -10
  79. package/dist/datetime/index.d.ts.map +1 -1
  80. package/dist/datetime/index.js +135 -13
  81. package/dist/datetime/index.js.map +1 -1
  82. package/dist/email/core/index.js.map +1 -1
  83. package/dist/email/smtp/index.js +130 -16
  84. package/dist/email/smtp/index.js.map +1 -1
  85. package/dist/fake/index.js.map +1 -1
  86. package/dist/lock/core/index.d.ts +30 -2
  87. package/dist/lock/core/index.d.ts.map +1 -1
  88. package/dist/lock/core/index.js +35 -12
  89. package/dist/lock/core/index.js.map +1 -1
  90. package/dist/lock/redis/index.js.map +1 -1
  91. package/dist/logger/index.js +32 -1
  92. package/dist/logger/index.js.map +1 -1
  93. package/dist/mcp/index.d.ts +238 -31
  94. package/dist/mcp/index.d.ts.map +1 -1
  95. package/dist/mcp/index.js +198 -67
  96. package/dist/mcp/index.js.map +1 -1
  97. package/dist/orm/core/index.browser.js +2 -362
  98. package/dist/orm/core/index.browser.js.map +1 -1
  99. package/dist/orm/core/index.bun.js +18 -409
  100. package/dist/orm/core/index.bun.js.map +1 -1
  101. package/dist/orm/core/index.d.ts +41 -194
  102. package/dist/orm/core/index.d.ts.map +1 -1
  103. package/dist/orm/core/index.js +27 -422
  104. package/dist/orm/core/index.js.map +1 -1
  105. package/dist/orm/postgres/index.bun.js +17 -20
  106. package/dist/orm/postgres/index.bun.js.map +1 -1
  107. package/dist/orm/postgres/index.d.ts +1 -5
  108. package/dist/orm/postgres/index.d.ts.map +1 -1
  109. package/dist/orm/postgres/index.js +17 -20
  110. package/dist/orm/postgres/index.js.map +1 -1
  111. package/dist/react/core/index.d.ts +102 -1
  112. package/dist/react/core/index.d.ts.map +1 -1
  113. package/dist/react/core/index.js +65 -1
  114. package/dist/react/core/index.js.map +1 -1
  115. package/dist/react/form/index.d.ts +6 -0
  116. package/dist/react/form/index.d.ts.map +1 -1
  117. package/dist/react/form/index.js +7 -7
  118. package/dist/react/form/index.js.map +1 -1
  119. package/dist/react/i18n/index.d.ts +7 -1
  120. package/dist/react/i18n/index.d.ts.map +1 -1
  121. package/dist/react/i18n/index.js +6 -0
  122. package/dist/react/i18n/index.js.map +1 -1
  123. package/dist/react/intro/index.js +22 -17
  124. package/dist/react/intro/index.js.map +1 -1
  125. package/dist/react/router/index.browser.js +98 -4
  126. package/dist/react/router/index.browser.js.map +1 -1
  127. package/dist/react/router/index.d.ts +58 -5
  128. package/dist/react/router/index.d.ts.map +1 -1
  129. package/dist/react/router/index.js +122 -6
  130. package/dist/react/router/index.js.map +1 -1
  131. package/dist/react/testing/{chunk-DBEY4PJZ.js → chunk-6Ep1yQYe.js} +1 -1
  132. package/dist/react/testing/index.js +1 -1
  133. package/dist/react/testing/index.js.map +1 -1
  134. package/dist/react/ui/index.d.ts +195 -1
  135. package/dist/react/ui/index.d.ts.map +1 -1
  136. package/dist/react/ui/index.js +64 -1
  137. package/dist/react/ui/index.js.map +1 -1
  138. package/dist/react/websocket/index.js.map +1 -1
  139. package/dist/redis/index.js.map +1 -1
  140. package/dist/scheduler/index.d.ts +1 -2
  141. package/dist/scheduler/index.d.ts.map +1 -1
  142. package/dist/scheduler/index.js +1 -1
  143. package/dist/scheduler/index.js.map +1 -1
  144. package/dist/scheduler/index.workerd.js +1 -1
  145. package/dist/scheduler/index.workerd.js.map +1 -1
  146. package/dist/security/index.browser.js.map +1 -1
  147. package/dist/security/index.d.ts.map +1 -1
  148. package/dist/security/index.js +2 -2
  149. package/dist/security/index.js.map +1 -1
  150. package/dist/server/auth/index.d.ts.map +1 -1
  151. package/dist/server/auth/index.js +24 -10
  152. package/dist/server/auth/index.js.map +1 -1
  153. package/dist/server/cookies/index.js.map +1 -1
  154. package/dist/server/core/index.browser.js +10 -3
  155. package/dist/server/core/index.browser.js.map +1 -1
  156. package/dist/server/core/index.d.ts +1 -4
  157. package/dist/server/core/index.d.ts.map +1 -1
  158. package/dist/server/core/index.js +47 -9
  159. package/dist/server/core/index.js.map +1 -1
  160. package/dist/server/links/index.browser.js.map +1 -1
  161. package/dist/server/links/index.js.map +1 -1
  162. package/dist/server/metrics/index.js +19 -1
  163. package/dist/server/metrics/index.js.map +1 -1
  164. package/dist/server/rate-limit/index.js.map +1 -1
  165. package/dist/server/static/index.js.map +1 -1
  166. package/dist/server/swagger/index.d.ts.map +1 -1
  167. package/dist/server/swagger/index.js +4 -5
  168. package/dist/server/swagger/index.js.map +1 -1
  169. package/dist/sms/index.js.map +1 -1
  170. package/dist/system/index.browser.js.map +1 -1
  171. package/dist/system/index.js.map +1 -1
  172. package/dist/system/index.workerd.js.map +1 -1
  173. package/dist/topic/core/index.js.map +1 -1
  174. package/dist/websocket/index.browser.js +32 -5
  175. package/dist/websocket/index.browser.js.map +1 -1
  176. package/dist/websocket/index.d.ts +3 -1
  177. package/dist/websocket/index.d.ts.map +1 -1
  178. package/dist/websocket/index.js +42 -6
  179. package/dist/websocket/index.js.map +1 -1
  180. package/package.json +685 -274
  181. package/src/api/files/__tests__/FileController.spec.ts +1 -1
  182. package/src/api/jobs/__tests__/$job.spec.ts +5 -1
  183. package/src/api/parameters/services/ParameterProvider.ts +21 -4
  184. package/src/api/users/__tests__/SessionService.spec.ts +99 -0
  185. package/src/api/users/__tests__/UserJobs.spec.ts +67 -0
  186. package/src/api/users/atoms/realmAuthSettingsAtom.ts +15 -0
  187. package/src/api/users/entities/sessions.ts +6 -0
  188. package/src/api/users/jobs/UserJobs.ts +44 -17
  189. package/src/api/users/providers/RealmProvider.ts +4 -0
  190. package/src/api/users/schemas/userQuerySchema.ts +0 -1
  191. package/src/api/users/services/SessionService.ts +27 -0
  192. package/src/api/users/services/UserService.ts +1 -5
  193. package/src/api/verifications/__tests__/CodeVerification.spec.ts +14 -0
  194. package/src/api/verifications/__tests__/LinkVerification.spec.ts +14 -0
  195. package/src/api/verifications/services/VerificationService.ts +1 -0
  196. package/src/bucket/__tests__/NodeS3BucketProvider.spec.ts +74 -0
  197. package/src/bucket/index.ts +19 -2
  198. package/src/bucket/primitives/$bucket.ts +9 -1
  199. package/src/bucket/providers/CloudflareR2Provider.ts +2 -137
  200. package/src/bucket/providers/NodeS3BucketProvider.ts +218 -0
  201. package/src/cache/core/index.ts +29 -0
  202. package/src/cache/core/primitives/$cache.ts +14 -1
  203. package/src/cli/config/defineConfig.ts +13 -15
  204. package/src/cli/core/__tests__/init.spec.ts +214 -7
  205. package/src/cli/core/commands/init.ts +12 -0
  206. package/src/cli/core/services/PackageManagerUtils.ts +23 -6
  207. package/src/cli/core/services/ProjectScaffolder.ts +315 -33
  208. package/src/cli/core/tasks/BuildCloudflareTask.ts +5 -0
  209. package/src/cli/core/tasks/BuildDockerTask.ts +9 -10
  210. package/src/cli/core/tasks/BuildServerTask.ts +8 -0
  211. package/src/cli/core/templates/agentMd.ts +2 -10
  212. package/src/cli/core/templates/apiIndexTs.ts +23 -1
  213. package/src/cli/core/templates/componentsJsonTs.ts +39 -0
  214. package/src/cli/core/templates/mainCss.ts +1 -0
  215. package/src/cli/core/templates/saasAdminLayoutTsx.ts +77 -0
  216. package/src/cli/core/templates/saasAdminPagesTsx.ts +26 -0
  217. package/src/cli/core/templates/saasAuthLayoutTsx.ts +20 -0
  218. package/src/cli/core/templates/saasAuthPagesTsx.ts +62 -0
  219. package/src/cli/core/templates/saasRealmProviderTs.ts +46 -0
  220. package/src/cli/core/templates/webAppRouterTs.ts +104 -1
  221. package/src/cli/core/templates/webIndexTs.ts +23 -1
  222. package/src/cli/devtools/index.ts +12 -26
  223. package/src/cli/platform/__tests__/SecretsCommand.spec.ts +2 -0
  224. package/src/cli/platform/index.ts +15 -24
  225. package/src/cli/vendor/atoms/vendorOptions.ts +1 -1
  226. package/src/cli/vendor/index.ts +14 -23
  227. package/src/command/providers/CliProvider.ts +1 -1
  228. package/src/core/Alepha.ts +11 -1
  229. package/src/core/helpers/ref.ts +18 -0
  230. package/src/core/index.shared.ts +1 -0
  231. package/src/core/interfaces/Service.ts +3 -1
  232. package/src/core/providers/SchemaValidator.ts +9 -1
  233. package/src/core/providers/TypeProvider.ts +2 -3
  234. package/src/datetime/REFACTORING.md +118 -0
  235. package/src/datetime/providers/DateTimeProvider.ts +203 -24
  236. package/src/lock/core/index.ts +31 -0
  237. package/src/lock/core/primitives/$lock.ts +14 -1
  238. package/src/logger/services/Logger.ts +1 -1
  239. package/src/mcp/__tests__/$resource.spec.ts +1 -1
  240. package/src/mcp/__tests__/$tool.spec.ts +1 -1
  241. package/src/mcp/__tests__/McpServerProvider.spec.ts +1 -1
  242. package/src/mcp/__tests__/jsonrpc.spec.ts +1 -1
  243. package/src/mcp/helpers/jsonrpc.ts +26 -1
  244. package/src/mcp/index.ts +10 -5
  245. package/src/mcp/interfaces/McpTypes.ts +83 -6
  246. package/src/mcp/primitives/$prompt.ts +18 -1
  247. package/src/mcp/primitives/$resource.ts +18 -1
  248. package/src/mcp/primitives/$tool.ts +83 -7
  249. package/src/mcp/providers/McpServerProvider.ts +74 -16
  250. package/src/mcp/transports/StreamableHttpMcpTransport.ts +226 -0
  251. package/src/orm/REFACTORING.md +330 -0
  252. package/src/orm/__tests__/$repository-tests.ts +1 -0
  253. package/src/orm/__tests__/orm-next-tests.ts +2 -67
  254. package/src/orm/__tests__/orm-next.spec.ts +0 -21
  255. package/src/orm/core/index.shared.ts +0 -2
  256. package/src/orm/core/index.ts +1 -2
  257. package/src/orm/core/primitives/$repository.ts +3 -6
  258. package/src/orm/core/primitives/$transactional.ts +11 -0
  259. package/src/orm/core/providers/drivers/DatabaseProvider.ts +0 -5
  260. package/src/orm/core/providers/drivers/NodeSqliteProvider.ts +11 -13
  261. package/src/orm/core/schemas/updateSchema.ts +1 -1
  262. package/src/orm/core/services/ModelBuilder.ts +1 -13
  263. package/src/orm/core/services/PgRelationManager.ts +4 -2
  264. package/src/orm/core/services/Repository.ts +1 -42
  265. package/src/orm/core/services/SqliteModelBuilder.ts +2 -33
  266. package/src/orm/postgres/services/PostgresModelBuilder.ts +10 -45
  267. package/src/react/core/__tests__/useQuery.browser.spec.tsx +86 -0
  268. package/src/react/core/hooks/useQuery.ts +153 -0
  269. package/src/react/core/index.ts +1 -0
  270. package/src/react/form/services/FormModel.ts +15 -6
  271. package/src/react/form/services/parseField.ts +8 -0
  272. package/src/react/i18n/providers/I18nProvider.ts +8 -2
  273. package/src/react/intro/components/GettingStartedAuthSlide.tsx +11 -4
  274. package/src/react/router/__tests__/$page.spec.tsx +0 -16
  275. package/src/react/router/__tests__/ReactBrowserProvider.browser.spec.ts +213 -2
  276. package/src/react/router/__tests__/ssr.spec.tsx +339 -0
  277. package/src/react/router/primitives/$page.ts +28 -4
  278. package/src/react/router/providers/ReactBrowserProvider.ts +73 -0
  279. package/src/react/router/providers/ReactBrowserRouterProvider.ts +1 -1
  280. package/src/react/router/providers/ReactPageProvider.ts +27 -9
  281. package/src/react/router/providers/ReactPreloadProvider.ts +1 -1
  282. package/src/react/router/providers/ReactServerProvider.ts +1 -0
  283. package/src/react/ui/atoms/uiThemeListAtom.ts +36 -0
  284. package/src/react/ui/index.ts +6 -0
  285. package/src/react/ui/services/SchemaControl.ts +209 -0
  286. package/src/scheduler/providers/CronProvider.ts +1 -1
  287. package/src/security/primitives/$basicAuth.ts +1 -1
  288. package/src/security/primitives/$issuer.ts +6 -3
  289. package/src/server/auth/providers/ServerAuthProvider.ts +5 -1
  290. package/src/server/core/__tests__/ServerRouterProvider-serializationError.spec.ts +75 -0
  291. package/src/server/core/__tests__/ServerRouterProvider-validationError.spec.ts +306 -0
  292. package/src/server/core/errors/ValidationError.ts +13 -1
  293. package/src/server/core/interfaces/ServerRequest.ts +1 -0
  294. package/src/server/core/primitives/$action.ts +16 -5
  295. package/src/server/core/providers/ServerProvider.ts +1 -1
  296. package/src/server/core/providers/ServerRouterProvider.ts +28 -6
  297. package/src/server/core/services/HttpClient.ts +1 -1
  298. package/src/server/swagger/providers/ServerSwaggerProvider.ts +6 -8
  299. package/src/websocket/providers/NodeWebSocketServerProvider.ts +10 -4
  300. package/src/websocket/services/WebSocketClient.ts +11 -5
  301. package/src/mcp/transports/SseMcpTransport.ts +0 -182
  302. package/src/orm/core/__tests__/parseQueryString.spec.ts +0 -196
  303. package/src/orm/core/helpers/parseQueryString.ts +0 -502
  304. package/src/orm/core/primitives/$view.ts +0 -88
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/api/keys/schemas/adminApiKeyQuerySchema.ts","../../../src/api/keys/schemas/adminApiKeyResourceSchema.ts","../../../src/api/keys/entities/apiKeyEntity.ts","../../../src/api/keys/services/ApiKeyService.ts","../../../src/api/keys/controllers/AdminApiKeyController.ts","../../../src/api/keys/schemas/createApiKeyBodySchema.ts","../../../src/api/keys/schemas/createApiKeyResponseSchema.ts","../../../src/api/keys/schemas/listApiKeyResponseSchema.ts","../../../src/api/keys/schemas/revokeApiKeyParamsSchema.ts","../../../src/api/keys/schemas/revokeApiKeyResponseSchema.ts","../../../src/api/keys/controllers/ApiKeyController.ts","../../../src/api/keys/index.ts"],"sourcesContent":["import { t } from \"alepha\";\nimport { pageQuerySchema } from \"alepha/orm\";\n\nexport const adminApiKeyQuerySchema = t.extend(pageQuerySchema, {\n userId: t.optional(t.uuid()),\n includeRevoked: t.optional(t.boolean()),\n});\n","import { t } from \"alepha\";\n\nexport const adminApiKeyResourceSchema = t.object({\n id: t.uuid(),\n userId: t.uuid(),\n name: t.string(),\n description: t.optional(t.string()),\n tokenPrefix: t.string(),\n tokenSuffix: t.string(),\n roles: t.array(t.string()),\n createdAt: t.datetime(),\n lastUsedAt: t.optional(t.datetime()),\n lastUsedIp: t.optional(t.string()),\n expiresAt: t.optional(t.datetime()),\n revokedAt: t.optional(t.datetime()),\n usageCount: t.integer(),\n});\n","import { type Static, t } from \"alepha\";\nimport { $entity, db } from \"alepha/orm\";\n\nexport const apiKeyEntity = $entity({\n name: \"api_keys\",\n schema: t.object({\n id: db.primaryKey(t.uuid()),\n createdAt: db.createdAt(),\n updatedAt: db.updatedAt(),\n\n // Owner\n userId: t.uuid(),\n\n // Key metadata\n name: t.text({ maxLength: 100 }),\n description: t.optional(t.text({ maxLength: 500 })),\n\n // Token (hashed) - internal, not user input\n tokenHash: t.string({ maxLength: 256 }),\n tokenPrefix: t.string({ maxLength: 10 }),\n tokenSuffix: t.string({ maxLength: 8 }),\n\n // Roles (snapshot from user at creation)\n roles: db.default(t.array(t.string()), []),\n\n // Tracking\n lastUsedAt: t.optional(t.datetime()),\n lastUsedIp: t.optional(t.string({ maxLength: 45 })),\n usageCount: db.default(t.integer(), 0),\n\n // Lifecycle\n expiresAt: t.optional(t.datetime()),\n revokedAt: t.optional(t.datetime()),\n }),\n indexes: [\n { columns: [\"userId\", \"name\"], unique: true },\n { columns: [\"tokenHash\"], unique: true },\n ],\n});\n\nexport type ApiKeyEntity = Static<typeof apiKeyEntity.schema>;\n","import { createHash, randomBytes } from \"node:crypto\";\nimport { $inject, Alepha } from \"alepha\";\nimport { $cache } from \"alepha/cache\";\nimport { DateTimeProvider } from \"alepha/datetime\";\nimport { $logger } from \"alepha/logger\";\nimport { $repository, sql } from \"alepha/orm\";\nimport type { IssuerResolver, UserInfo } from \"alepha/security\";\nimport { ForbiddenError, type ServerRequest } from \"alepha/server\";\nimport { type ApiKeyEntity, apiKeyEntity } from \"../entities/apiKeyEntity.ts\";\n\nexport class ApiKeyService {\n protected readonly alepha = $inject(Alepha);\n protected readonly dateTimeProvider = $inject(DateTimeProvider);\n protected readonly log = $logger();\n protected readonly repo = $repository(apiKeyEntity);\n\n /**\n * Cache validated API keys for 15 minutes.\n */\n protected readonly validationCache = $cache<ApiKeyEntity | null, [string]>({\n name: \"api:keys:validation\",\n ttl: [15, \"minutes\"],\n });\n\n // -------------------------------------------------------------------------\n // Resolver\n // -------------------------------------------------------------------------\n\n /**\n * Create an issuer resolver for API key authentication.\n * Lower priority means it runs before JWT resolver.\n *\n * @param options.priority - Priority of this resolver (default: 50, JWT is 100)\n * @param options.prefix - API key prefix to match in Bearer header (default: \"ak\")\n */\n public createResolver(\n options: { priority?: number; prefix?: string } = {},\n ): IssuerResolver {\n const { priority = 50, prefix = \"ak\" } = options;\n const prefixPattern = `${prefix}_`;\n\n return {\n priority,\n onRequest: async (req: ServerRequest) => {\n // Try query param first\n const url = typeof req.url === \"string\" ? new URL(req.url) : req.url;\n let token = url.searchParams.get(\"api_key\");\n\n // Try Bearer header - only if token starts with expected prefix\n if (!token) {\n const auth = req.headers.authorization;\n if (auth?.startsWith(\"Bearer \")) {\n const bearerToken = auth.slice(7);\n if (bearerToken.startsWith(prefixPattern)) {\n token = bearerToken;\n }\n }\n }\n\n if (!token) {\n return null;\n }\n\n return this.validate(token);\n },\n };\n }\n\n // -------------------------------------------------------------------------\n // CRUD\n // -------------------------------------------------------------------------\n\n /**\n * Create a new API key for a user.\n * Returns both the API key entity and the plain token (which is only available once).\n */\n public async create(options: {\n userId: string;\n name: string;\n roles: string[];\n description?: string;\n expiresAt?: Date;\n prefix?: string;\n }): Promise<{ apiKey: ApiKeyEntity; token: string }> {\n const prefix = options.prefix ?? \"ak\";\n const random = randomBytes(24).toString(\"base64url\");\n const token = `${prefix}_${random}`;\n const hash = this.hashToken(token);\n const suffix = token.slice(-8);\n\n const apiKey = await this.repo.create({\n userId: options.userId,\n name: options.name,\n description: options.description,\n tokenHash: hash,\n tokenPrefix: prefix,\n tokenSuffix: suffix,\n roles: options.roles,\n expiresAt: options.expiresAt?.toISOString(),\n });\n\n this.log.info(\"API key created\", {\n apiKeyId: apiKey.id,\n userId: options.userId,\n name: options.name,\n });\n\n return { apiKey, token };\n }\n\n /**\n * List all non-revoked API keys for a user.\n */\n public async list(userId: string): Promise<ApiKeyEntity[]> {\n return this.repo.findMany({\n where: {\n userId: { eq: userId },\n revokedAt: { isNull: true },\n },\n orderBy: { column: \"createdAt\", direction: \"desc\" },\n });\n }\n\n // -------------------------------------------------------------------------\n // Admin Operations\n // -------------------------------------------------------------------------\n\n /**\n * Find all API keys with optional filtering (admin only).\n */\n public async findAll(query: {\n userId?: string;\n includeRevoked?: boolean;\n page?: number;\n size?: number;\n sort?: string;\n }) {\n query.sort ??= \"-createdAt\";\n\n const where = this.repo.createQueryWhere();\n\n if (query.userId) {\n where.userId = { eq: query.userId };\n }\n\n if (!query.includeRevoked) {\n where.revokedAt = { isNull: true };\n }\n\n return this.repo.paginate(query, { where }, { count: true });\n }\n\n /**\n * Get an API key by ID (admin only).\n */\n public async getById(id: string): Promise<ApiKeyEntity> {\n return await this.repo.getById(id);\n }\n\n /**\n * Revoke any API key (admin only).\n */\n public async revokeByAdmin(id: string): Promise<void> {\n const apiKey = await this.repo.getById(id);\n\n if (apiKey.revokedAt) {\n return; // Already revoked\n }\n\n // Invalidate cache\n await this.validationCache.invalidate(apiKey.tokenHash);\n\n await this.repo.updateById(id, {\n revokedAt: this.dateTimeProvider.now().toISOString(),\n });\n\n this.log.info(\"API key revoked by admin\", {\n apiKeyId: id,\n userId: apiKey.userId,\n });\n }\n\n // -------------------------------------------------------------------------\n // User Operations\n // -------------------------------------------------------------------------\n\n /**\n * Revoke an API key. Only the owner can revoke their own keys.\n */\n public async revoke(id: string, userId: string): Promise<void> {\n const apiKey = await this.repo.getById(id);\n\n if (apiKey.userId !== userId) {\n throw new ForbiddenError(\"Not your API key\");\n }\n\n await this.validationCache.invalidate(apiKey.tokenHash);\n\n await this.repo.updateById(id, {\n revokedAt: this.dateTimeProvider.now().toISOString(),\n });\n\n this.log.info(\"API key revoked\", {\n apiKeyId: id,\n userId,\n });\n }\n\n // -------------------------------------------------------------------------\n // Validation\n // -------------------------------------------------------------------------\n\n /**\n * Validate an API key token and return user info if valid.\n */\n public async validate(token: string): Promise<UserInfo | null> {\n // Quick check for API key format\n if (!token.includes(\"_\")) {\n return null;\n }\n\n const hash = this.hashToken(token);\n\n // Try cache first\n let apiKey = await this.validationCache.get(hash);\n\n // If not in cache, look up in database\n if (apiKey === undefined) {\n apiKey =\n (await this.repo.findOne({\n where: { tokenHash: { eq: hash } },\n })) ?? null;\n\n // Store in cache (even if null, to prevent repeated lookups)\n await this.validationCache.set(hash, apiKey);\n }\n\n if (!apiKey) {\n return null;\n }\n\n // Check revocation\n if (apiKey.revokedAt) {\n return null;\n }\n\n // Check expiration\n if (\n apiKey.expiresAt &&\n this.dateTimeProvider.now().isAfter(apiKey.expiresAt)\n ) {\n return null;\n }\n\n // Update usage stats (fire and forget)\n this.updateUsage(apiKey.id).catch((error) => {\n this.log.warn(\"Failed to update API key usage\", { error });\n });\n\n return {\n id: apiKey.userId,\n roles: apiKey.roles,\n };\n }\n\n /**\n * Update usage statistics for an API key.\n */\n protected async updateUsage(id: string): Promise<void> {\n const request = this.alepha.store.get(\"alepha.http.request\");\n\n await this.repo.updateById(id, {\n lastUsedAt: this.dateTimeProvider.now().toISOString(),\n lastUsedIp: request?.ip,\n usageCount: sql`${this.repo.table.usageCount} + 1`,\n });\n }\n\n /**\n * Hash a token using SHA-256.\n */\n protected hashToken(token: string): string {\n return createHash(\"sha256\").update(token).digest(\"hex\");\n }\n}\n","import { $inject, t } from \"alepha\";\nimport { $secure } from \"alepha/security\";\nimport { $action, okSchema } from \"alepha/server\";\nimport { adminApiKeyQuerySchema } from \"../schemas/adminApiKeyQuerySchema.ts\";\nimport { adminApiKeyResourceSchema } from \"../schemas/adminApiKeyResourceSchema.ts\";\nimport { ApiKeyService } from \"../services/ApiKeyService.ts\";\n\n/**\n * REST API controller for admin API key management.\n * Admins can list, view, and revoke any API key.\n */\nexport class AdminApiKeyController {\n protected readonly url = \"/admin/api-keys\";\n protected readonly group = \"admin:api-keys\";\n protected readonly apiKeyService = $inject(ApiKeyService);\n\n /**\n * Find all API keys with optional filtering.\n */\n public readonly findApiKeys = $action({\n path: this.url,\n group: this.group,\n use: [$secure({ permissions: [\"admin:api-key:read\"] })],\n description: \"Find API keys with pagination and filtering\",\n schema: {\n query: adminApiKeyQuerySchema,\n response: t.page(adminApiKeyResourceSchema),\n },\n handler: ({ query }) => {\n const { userId, includeRevoked, ...pagination } = query;\n return this.apiKeyService.findAll({\n userId,\n includeRevoked,\n ...pagination,\n });\n },\n });\n\n /**\n * Get an API key by ID.\n */\n public readonly getApiKey = $action({\n path: `${this.url}/:id`,\n group: this.group,\n use: [$secure({ permissions: [\"admin:api-key:read\"] })],\n description: \"Get an API key by ID\",\n schema: {\n params: t.object({\n id: t.uuid(),\n }),\n response: adminApiKeyResourceSchema,\n },\n handler: ({ params }) => this.apiKeyService.getById(params.id),\n });\n\n /**\n * Revoke any API key.\n */\n public readonly revokeApiKey = $action({\n method: \"DELETE\",\n path: `${this.url}/:id`,\n group: this.group,\n use: [$secure({ permissions: [\"admin:api-key:delete\"] })],\n description: \"Revoke an API key\",\n schema: {\n params: t.object({\n id: t.uuid(),\n }),\n response: okSchema,\n },\n handler: async ({ params }) => {\n await this.apiKeyService.revokeByAdmin(params.id);\n return { ok: true, id: params.id };\n },\n });\n}\n","import { t } from \"alepha\";\n\nexport const createApiKeyBodySchema = t.object({\n name: t.text({ minLength: 1, maxLength: 100 }),\n description: t.optional(t.text({ maxLength: 500 })),\n expiresAt: t.optional(t.datetime()),\n});\n","import { t } from \"alepha\";\n\nexport const createApiKeyResponseSchema = t.object({\n id: t.uuid(),\n name: t.string(),\n token: t.string(),\n tokenSuffix: t.string(),\n roles: t.array(t.string()),\n createdAt: t.datetime(),\n expiresAt: t.optional(t.datetime()),\n});\n","import { t } from \"alepha\";\n\nexport const listApiKeyItemSchema = t.object({\n id: t.uuid(),\n name: t.string(),\n tokenPrefix: t.string(),\n tokenSuffix: t.string(),\n roles: t.array(t.string()),\n createdAt: t.datetime(),\n lastUsedAt: t.optional(t.datetime()),\n expiresAt: t.optional(t.datetime()),\n usageCount: t.integer(),\n});\n\nexport const listApiKeyResponseSchema = t.array(listApiKeyItemSchema);\n","import { t } from \"alepha\";\n\nexport const revokeApiKeyParamsSchema = t.object({\n id: t.uuid(),\n});\n","import { t } from \"alepha\";\n\nexport const revokeApiKeyResponseSchema = t.object({\n ok: t.boolean(),\n});\n","import { $inject } from \"alepha\";\nimport { $secure } from \"alepha/security\";\nimport { $action } from \"alepha/server\";\nimport { createApiKeyBodySchema } from \"../schemas/createApiKeyBodySchema.ts\";\nimport { createApiKeyResponseSchema } from \"../schemas/createApiKeyResponseSchema.ts\";\nimport { listApiKeyResponseSchema } from \"../schemas/listApiKeyResponseSchema.ts\";\nimport { revokeApiKeyParamsSchema } from \"../schemas/revokeApiKeyParamsSchema.ts\";\nimport { revokeApiKeyResponseSchema } from \"../schemas/revokeApiKeyResponseSchema.ts\";\nimport { ApiKeyService } from \"../services/ApiKeyService.ts\";\n\n/**\n * REST API controller for user's own API key management.\n * Users can create, list, and revoke their own API keys.\n */\nexport class ApiKeyController {\n protected readonly url = \"/api-keys\";\n protected readonly group = \"api-keys\";\n protected readonly apiKeyService = $inject(ApiKeyService);\n\n /**\n * Create a new API key for the authenticated user.\n * The token is only returned once upon creation.\n */\n public readonly createApiKey = $action({\n method: \"POST\",\n path: this.url,\n group: this.group,\n description: \"Create a new API key\",\n use: [$secure({ permissions: [\"api-key:create\"] })],\n schema: {\n body: createApiKeyBodySchema,\n response: createApiKeyResponseSchema,\n },\n handler: async (request) => {\n const { apiKey, token } = await this.apiKeyService.create({\n userId: request.user.id,\n name: request.body.name,\n description: request.body.description,\n roles: request.user.roles ?? [],\n expiresAt: request.body.expiresAt\n ? new Date(request.body.expiresAt)\n : undefined,\n });\n\n return {\n id: apiKey.id,\n name: apiKey.name,\n token,\n tokenSuffix: apiKey.tokenSuffix,\n roles: apiKey.roles,\n createdAt: apiKey.createdAt,\n expiresAt: apiKey.expiresAt,\n };\n },\n });\n\n /**\n * List all active API keys for the authenticated user.\n * Does not return the actual tokens.\n */\n public readonly listApiKeys = $action({\n path: this.url,\n group: this.group,\n description: \"List your API keys\",\n use: [$secure({ permissions: [\"api-key:read\"] })],\n schema: {\n response: listApiKeyResponseSchema,\n },\n handler: async (request) => {\n const apiKeys = await this.apiKeyService.list(request.user.id);\n\n return apiKeys.map((apiKey) => ({\n id: apiKey.id,\n name: apiKey.name,\n tokenPrefix: apiKey.tokenPrefix,\n tokenSuffix: apiKey.tokenSuffix,\n roles: apiKey.roles,\n createdAt: apiKey.createdAt,\n lastUsedAt: apiKey.lastUsedAt,\n expiresAt: apiKey.expiresAt,\n usageCount: apiKey.usageCount,\n }));\n },\n });\n\n /**\n * Revoke an API key. Only the owner can revoke their own keys.\n */\n public readonly revokeMyApiKey = $action({\n method: \"DELETE\",\n path: `${this.url}/:id`,\n group: this.group,\n description: \"Revoke an API key\",\n use: [$secure({ permissions: [\"api-key:delete\"] })],\n schema: {\n params: revokeApiKeyParamsSchema,\n response: revokeApiKeyResponseSchema,\n },\n handler: async (request) => {\n await this.apiKeyService.revoke(request.params.id, request.user.id);\n return { ok: true };\n },\n });\n}\n","import { $module } from \"alepha\";\nimport { AdminApiKeyController } from \"./controllers/AdminApiKeyController.ts\";\nimport { ApiKeyController } from \"./controllers/ApiKeyController.ts\";\nimport { ApiKeyService } from \"./services/ApiKeyService.ts\";\n\nexport * from \"./controllers/AdminApiKeyController.ts\";\nexport * from \"./controllers/ApiKeyController.ts\";\nexport * from \"./entities/apiKeyEntity.ts\";\nexport * from \"./schemas/adminApiKeyQuerySchema.ts\";\nexport * from \"./schemas/adminApiKeyResourceSchema.ts\";\nexport * from \"./schemas/createApiKeyBodySchema.ts\";\nexport * from \"./schemas/createApiKeyResponseSchema.ts\";\nexport * from \"./schemas/listApiKeyResponseSchema.ts\";\nexport * from \"./schemas/revokeApiKeyParamsSchema.ts\";\nexport * from \"./schemas/revokeApiKeyResponseSchema.ts\";\nexport * from \"./services/ApiKeyService.ts\";\n\n/**\n * API key management module for programmatic access.\n *\n * **Features:**\n * - Create API keys with role snapshots\n * - List and revoke API keys\n * - 15-minute validation caching\n * - Query param (?api_key=) and Bearer header support\n *\n * **Integration:**\n * To enable API key authentication for an issuer, register the resolver:\n *\n * ```ts\n * class MyApp {\n * apiKeyService = $inject(ApiKeyService);\n * issuer = $issuer({\n * secret: env.APP_SECRET,\n * resolvers: [this.apiKeyService.createResolver()],\n * });\n * }\n * ```\n *\n * @module alepha.api.keys\n */\nexport const AlephaApiKeys = $module({\n name: \"alepha.api.keys\",\n services: [ApiKeyService, ApiKeyController, AdminApiKeyController],\n});\n"],"mappings":";;;;;;;;;AAGA,MAAa,yBAAyB,EAAE,OAAO,iBAAiB;CAC9D,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC;CAC5B,gBAAgB,EAAE,SAAS,EAAE,SAAS,CAAC;CACxC,CAAC;;;ACJF,MAAa,4BAA4B,EAAE,OAAO;CAChD,IAAI,EAAE,MAAM;CACZ,QAAQ,EAAE,MAAM;CAChB,MAAM,EAAE,QAAQ;CAChB,aAAa,EAAE,SAAS,EAAE,QAAQ,CAAC;CACnC,aAAa,EAAE,QAAQ;CACvB,aAAa,EAAE,QAAQ;CACvB,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC;CAC1B,WAAW,EAAE,UAAU;CACvB,YAAY,EAAE,SAAS,EAAE,UAAU,CAAC;CACpC,YAAY,EAAE,SAAS,EAAE,QAAQ,CAAC;CAClC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC;CACnC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC;CACnC,YAAY,EAAE,SAAS;CACxB,CAAC;;;ACbF,MAAa,eAAe,QAAQ;CAClC,MAAM;CACN,QAAQ,EAAE,OAAO;EACf,IAAI,GAAG,WAAW,EAAE,MAAM,CAAC;EAC3B,WAAW,GAAG,WAAW;EACzB,WAAW,GAAG,WAAW;EAGzB,QAAQ,EAAE,MAAM;EAGhB,MAAM,EAAE,KAAK,EAAE,WAAW,KAAK,CAAC;EAChC,aAAa,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,KAAK,CAAC,CAAC;EAGnD,WAAW,EAAE,OAAO,EAAE,WAAW,KAAK,CAAC;EACvC,aAAa,EAAE,OAAO,EAAE,WAAW,IAAI,CAAC;EACxC,aAAa,EAAE,OAAO,EAAE,WAAW,GAAG,CAAC;EAGvC,OAAO,GAAG,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC;EAG1C,YAAY,EAAE,SAAS,EAAE,UAAU,CAAC;EACpC,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,IAAI,CAAC,CAAC;EACnD,YAAY,GAAG,QAAQ,EAAE,SAAS,EAAE,EAAE;EAGtC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC;EACnC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC;EACpC,CAAC;CACF,SAAS,CACP;EAAE,SAAS,CAAC,UAAU,OAAO;EAAE,QAAQ;EAAM,EAC7C;EAAE,SAAS,CAAC,YAAY;EAAE,QAAQ;EAAM,CACzC;CACF,CAAC;;;AC5BF,IAAa,gBAAb,MAA2B;CACzB,SAA4B,QAAQ,OAAO;CAC3C,mBAAsC,QAAQ,iBAAiB;CAC/D,MAAyB,SAAS;CAClC,OAA0B,YAAY,aAAa;;;;CAKnD,kBAAqC,OAAsC;EACzE,MAAM;EACN,KAAK,CAAC,IAAI,UAAU;EACrB,CAAC;;;;;;;;CAaF,eACE,UAAkD,EAAE,EACpC;EAChB,MAAM,EAAE,WAAW,IAAI,SAAS,SAAS;EACzC,MAAM,gBAAgB,GAAG,OAAO;AAEhC,SAAO;GACL;GACA,WAAW,OAAO,QAAuB;IAGvC,IAAI,SADQ,OAAO,IAAI,QAAQ,WAAW,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,KACjD,aAAa,IAAI,UAAU;AAG3C,QAAI,CAAC,OAAO;KACV,MAAM,OAAO,IAAI,QAAQ;AACzB,SAAI,MAAM,WAAW,UAAU,EAAE;MAC/B,MAAM,cAAc,KAAK,MAAM,EAAE;AACjC,UAAI,YAAY,WAAW,cAAc,CACvC,SAAQ;;;AAKd,QAAI,CAAC,MACH,QAAO;AAGT,WAAO,KAAK,SAAS,MAAM;;GAE9B;;;;;;CAWH,MAAa,OAAO,SAOiC;EACnD,MAAM,SAAS,QAAQ,UAAU;EAEjC,MAAM,QAAQ,GAAG,OAAO,GADT,YAAY,GAAG,CAAC,SAAS,YAAY;EAEpD,MAAM,OAAO,KAAK,UAAU,MAAM;EAClC,MAAM,SAAS,MAAM,MAAM,GAAG;EAE9B,MAAM,SAAS,MAAM,KAAK,KAAK,OAAO;GACpC,QAAQ,QAAQ;GAChB,MAAM,QAAQ;GACd,aAAa,QAAQ;GACrB,WAAW;GACX,aAAa;GACb,aAAa;GACb,OAAO,QAAQ;GACf,WAAW,QAAQ,WAAW,aAAa;GAC5C,CAAC;AAEF,OAAK,IAAI,KAAK,mBAAmB;GAC/B,UAAU,OAAO;GACjB,QAAQ,QAAQ;GAChB,MAAM,QAAQ;GACf,CAAC;AAEF,SAAO;GAAE;GAAQ;GAAO;;;;;CAM1B,MAAa,KAAK,QAAyC;AACzD,SAAO,KAAK,KAAK,SAAS;GACxB,OAAO;IACL,QAAQ,EAAE,IAAI,QAAQ;IACtB,WAAW,EAAE,QAAQ,MAAM;IAC5B;GACD,SAAS;IAAE,QAAQ;IAAa,WAAW;IAAQ;GACpD,CAAC;;;;;CAUJ,MAAa,QAAQ,OAMlB;AACD,QAAM,SAAS;EAEf,MAAM,QAAQ,KAAK,KAAK,kBAAkB;AAE1C,MAAI,MAAM,OACR,OAAM,SAAS,EAAE,IAAI,MAAM,QAAQ;AAGrC,MAAI,CAAC,MAAM,eACT,OAAM,YAAY,EAAE,QAAQ,MAAM;AAGpC,SAAO,KAAK,KAAK,SAAS,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,MAAM,CAAC;;;;;CAM9D,MAAa,QAAQ,IAAmC;AACtD,SAAO,MAAM,KAAK,KAAK,QAAQ,GAAG;;;;;CAMpC,MAAa,cAAc,IAA2B;EACpD,MAAM,SAAS,MAAM,KAAK,KAAK,QAAQ,GAAG;AAE1C,MAAI,OAAO,UACT;AAIF,QAAM,KAAK,gBAAgB,WAAW,OAAO,UAAU;AAEvD,QAAM,KAAK,KAAK,WAAW,IAAI,EAC7B,WAAW,KAAK,iBAAiB,KAAK,CAAC,aAAa,EACrD,CAAC;AAEF,OAAK,IAAI,KAAK,4BAA4B;GACxC,UAAU;GACV,QAAQ,OAAO;GAChB,CAAC;;;;;CAUJ,MAAa,OAAO,IAAY,QAA+B;EAC7D,MAAM,SAAS,MAAM,KAAK,KAAK,QAAQ,GAAG;AAE1C,MAAI,OAAO,WAAW,OACpB,OAAM,IAAI,eAAe,mBAAmB;AAG9C,QAAM,KAAK,gBAAgB,WAAW,OAAO,UAAU;AAEvD,QAAM,KAAK,KAAK,WAAW,IAAI,EAC7B,WAAW,KAAK,iBAAiB,KAAK,CAAC,aAAa,EACrD,CAAC;AAEF,OAAK,IAAI,KAAK,mBAAmB;GAC/B,UAAU;GACV;GACD,CAAC;;;;;CAUJ,MAAa,SAAS,OAAyC;AAE7D,MAAI,CAAC,MAAM,SAAS,IAAI,CACtB,QAAO;EAGT,MAAM,OAAO,KAAK,UAAU,MAAM;EAGlC,IAAI,SAAS,MAAM,KAAK,gBAAgB,IAAI,KAAK;AAGjD,MAAI,WAAW,KAAA,GAAW;AACxB,YACG,MAAM,KAAK,KAAK,QAAQ,EACvB,OAAO,EAAE,WAAW,EAAE,IAAI,MAAM,EAAE,EACnC,CAAC,IAAK;AAGT,SAAM,KAAK,gBAAgB,IAAI,MAAM,OAAO;;AAG9C,MAAI,CAAC,OACH,QAAO;AAIT,MAAI,OAAO,UACT,QAAO;AAIT,MACE,OAAO,aACP,KAAK,iBAAiB,KAAK,CAAC,QAAQ,OAAO,UAAU,CAErD,QAAO;AAIT,OAAK,YAAY,OAAO,GAAG,CAAC,OAAO,UAAU;AAC3C,QAAK,IAAI,KAAK,kCAAkC,EAAE,OAAO,CAAC;IAC1D;AAEF,SAAO;GACL,IAAI,OAAO;GACX,OAAO,OAAO;GACf;;;;;CAMH,MAAgB,YAAY,IAA2B;EACrD,MAAM,UAAU,KAAK,OAAO,MAAM,IAAI,sBAAsB;AAE5D,QAAM,KAAK,KAAK,WAAW,IAAI;GAC7B,YAAY,KAAK,iBAAiB,KAAK,CAAC,aAAa;GACrD,YAAY,SAAS;GACrB,YAAY,GAAG,GAAG,KAAK,KAAK,MAAM,WAAW;GAC9C,CAAC;;;;;CAMJ,UAAoB,OAAuB;AACzC,SAAO,WAAW,SAAS,CAAC,OAAO,MAAM,CAAC,OAAO,MAAM;;;;;;;;;AC/Q3D,IAAa,wBAAb,MAAmC;CACjC,MAAyB;CACzB,QAA2B;CAC3B,gBAAmC,QAAQ,cAAc;;;;CAKzD,cAA8B,QAAQ;EACpC,MAAM,KAAK;EACX,OAAO,KAAK;EACZ,KAAK,CAAC,QAAQ,EAAE,aAAa,CAAC,qBAAqB,EAAE,CAAC,CAAC;EACvD,aAAa;EACb,QAAQ;GACN,OAAO;GACP,UAAU,EAAE,KAAK,0BAA0B;GAC5C;EACD,UAAU,EAAE,YAAY;GACtB,MAAM,EAAE,QAAQ,gBAAgB,GAAG,eAAe;AAClD,UAAO,KAAK,cAAc,QAAQ;IAChC;IACA;IACA,GAAG;IACJ,CAAC;;EAEL,CAAC;;;;CAKF,YAA4B,QAAQ;EAClC,MAAM,GAAG,KAAK,IAAI;EAClB,OAAO,KAAK;EACZ,KAAK,CAAC,QAAQ,EAAE,aAAa,CAAC,qBAAqB,EAAE,CAAC,CAAC;EACvD,aAAa;EACb,QAAQ;GACN,QAAQ,EAAE,OAAO,EACf,IAAI,EAAE,MAAM,EACb,CAAC;GACF,UAAU;GACX;EACD,UAAU,EAAE,aAAa,KAAK,cAAc,QAAQ,OAAO,GAAG;EAC/D,CAAC;;;;CAKF,eAA+B,QAAQ;EACrC,QAAQ;EACR,MAAM,GAAG,KAAK,IAAI;EAClB,OAAO,KAAK;EACZ,KAAK,CAAC,QAAQ,EAAE,aAAa,CAAC,uBAAuB,EAAE,CAAC,CAAC;EACzD,aAAa;EACb,QAAQ;GACN,QAAQ,EAAE,OAAO,EACf,IAAI,EAAE,MAAM,EACb,CAAC;GACF,UAAU;GACX;EACD,SAAS,OAAO,EAAE,aAAa;AAC7B,SAAM,KAAK,cAAc,cAAc,OAAO,GAAG;AACjD,UAAO;IAAE,IAAI;IAAM,IAAI,OAAO;IAAI;;EAErC,CAAC;;;;ACxEJ,MAAa,yBAAyB,EAAE,OAAO;CAC7C,MAAM,EAAE,KAAK;EAAE,WAAW;EAAG,WAAW;EAAK,CAAC;CAC9C,aAAa,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,KAAK,CAAC,CAAC;CACnD,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC;CACpC,CAAC;;;ACJF,MAAa,6BAA6B,EAAE,OAAO;CACjD,IAAI,EAAE,MAAM;CACZ,MAAM,EAAE,QAAQ;CAChB,OAAO,EAAE,QAAQ;CACjB,aAAa,EAAE,QAAQ;CACvB,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC;CAC1B,WAAW,EAAE,UAAU;CACvB,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC;CACpC,CAAC;;;ACRF,MAAa,uBAAuB,EAAE,OAAO;CAC3C,IAAI,EAAE,MAAM;CACZ,MAAM,EAAE,QAAQ;CAChB,aAAa,EAAE,QAAQ;CACvB,aAAa,EAAE,QAAQ;CACvB,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC;CAC1B,WAAW,EAAE,UAAU;CACvB,YAAY,EAAE,SAAS,EAAE,UAAU,CAAC;CACpC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC;CACnC,YAAY,EAAE,SAAS;CACxB,CAAC;AAEF,MAAa,2BAA2B,EAAE,MAAM,qBAAqB;;;ACZrE,MAAa,2BAA2B,EAAE,OAAO,EAC/C,IAAI,EAAE,MAAM,EACb,CAAC;;;ACFF,MAAa,6BAA6B,EAAE,OAAO,EACjD,IAAI,EAAE,SAAS,EAChB,CAAC;;;;;;;ACUF,IAAa,mBAAb,MAA8B;CAC5B,MAAyB;CACzB,QAA2B;CAC3B,gBAAmC,QAAQ,cAAc;;;;;CAMzD,eAA+B,QAAQ;EACrC,QAAQ;EACR,MAAM,KAAK;EACX,OAAO,KAAK;EACZ,aAAa;EACb,KAAK,CAAC,QAAQ,EAAE,aAAa,CAAC,iBAAiB,EAAE,CAAC,CAAC;EACnD,QAAQ;GACN,MAAM;GACN,UAAU;GACX;EACD,SAAS,OAAO,YAAY;GAC1B,MAAM,EAAE,QAAQ,UAAU,MAAM,KAAK,cAAc,OAAO;IACxD,QAAQ,QAAQ,KAAK;IACrB,MAAM,QAAQ,KAAK;IACnB,aAAa,QAAQ,KAAK;IAC1B,OAAO,QAAQ,KAAK,SAAS,EAAE;IAC/B,WAAW,QAAQ,KAAK,YACpB,IAAI,KAAK,QAAQ,KAAK,UAAU,GAChC,KAAA;IACL,CAAC;AAEF,UAAO;IACL,IAAI,OAAO;IACX,MAAM,OAAO;IACb;IACA,aAAa,OAAO;IACpB,OAAO,OAAO;IACd,WAAW,OAAO;IAClB,WAAW,OAAO;IACnB;;EAEJ,CAAC;;;;;CAMF,cAA8B,QAAQ;EACpC,MAAM,KAAK;EACX,OAAO,KAAK;EACZ,aAAa;EACb,KAAK,CAAC,QAAQ,EAAE,aAAa,CAAC,eAAe,EAAE,CAAC,CAAC;EACjD,QAAQ,EACN,UAAU,0BACX;EACD,SAAS,OAAO,YAAY;AAG1B,WAFgB,MAAM,KAAK,cAAc,KAAK,QAAQ,KAAK,GAAG,EAE/C,KAAK,YAAY;IAC9B,IAAI,OAAO;IACX,MAAM,OAAO;IACb,aAAa,OAAO;IACpB,aAAa,OAAO;IACpB,OAAO,OAAO;IACd,WAAW,OAAO;IAClB,YAAY,OAAO;IACnB,WAAW,OAAO;IAClB,YAAY,OAAO;IACpB,EAAE;;EAEN,CAAC;;;;CAKF,iBAAiC,QAAQ;EACvC,QAAQ;EACR,MAAM,GAAG,KAAK,IAAI;EAClB,OAAO,KAAK;EACZ,aAAa;EACb,KAAK,CAAC,QAAQ,EAAE,aAAa,CAAC,iBAAiB,EAAE,CAAC,CAAC;EACnD,QAAQ;GACN,QAAQ;GACR,UAAU;GACX;EACD,SAAS,OAAO,YAAY;AAC1B,SAAM,KAAK,cAAc,OAAO,QAAQ,OAAO,IAAI,QAAQ,KAAK,GAAG;AACnE,UAAO,EAAE,IAAI,MAAM;;EAEtB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC7DJ,MAAa,gBAAgB,QAAQ;CACnC,MAAM;CACN,UAAU;EAAC;EAAe;EAAkB;EAAsB;CACnE,CAAC"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/api/keys/schemas/adminApiKeyQuerySchema.ts","../../../src/api/keys/schemas/adminApiKeyResourceSchema.ts","../../../src/api/keys/entities/apiKeyEntity.ts","../../../src/api/keys/services/ApiKeyService.ts","../../../src/api/keys/controllers/AdminApiKeyController.ts","../../../src/api/keys/schemas/createApiKeyBodySchema.ts","../../../src/api/keys/schemas/createApiKeyResponseSchema.ts","../../../src/api/keys/schemas/listApiKeyResponseSchema.ts","../../../src/api/keys/schemas/revokeApiKeyParamsSchema.ts","../../../src/api/keys/schemas/revokeApiKeyResponseSchema.ts","../../../src/api/keys/controllers/ApiKeyController.ts","../../../src/api/keys/index.ts"],"sourcesContent":["import { t } from \"alepha\";\nimport { pageQuerySchema } from \"alepha/orm\";\n\nexport const adminApiKeyQuerySchema = t.extend(pageQuerySchema, {\n userId: t.optional(t.uuid()),\n includeRevoked: t.optional(t.boolean()),\n});\n","import { t } from \"alepha\";\n\nexport const adminApiKeyResourceSchema = t.object({\n id: t.uuid(),\n userId: t.uuid(),\n name: t.string(),\n description: t.optional(t.string()),\n tokenPrefix: t.string(),\n tokenSuffix: t.string(),\n roles: t.array(t.string()),\n createdAt: t.datetime(),\n lastUsedAt: t.optional(t.datetime()),\n lastUsedIp: t.optional(t.string()),\n expiresAt: t.optional(t.datetime()),\n revokedAt: t.optional(t.datetime()),\n usageCount: t.integer(),\n});\n","import { type Static, t } from \"alepha\";\nimport { $entity, db } from \"alepha/orm\";\n\nexport const apiKeyEntity = $entity({\n name: \"api_keys\",\n schema: t.object({\n id: db.primaryKey(t.uuid()),\n createdAt: db.createdAt(),\n updatedAt: db.updatedAt(),\n\n // Owner\n userId: t.uuid(),\n\n // Key metadata\n name: t.text({ maxLength: 100 }),\n description: t.optional(t.text({ maxLength: 500 })),\n\n // Token (hashed) - internal, not user input\n tokenHash: t.string({ maxLength: 256 }),\n tokenPrefix: t.string({ maxLength: 10 }),\n tokenSuffix: t.string({ maxLength: 8 }),\n\n // Roles (snapshot from user at creation)\n roles: db.default(t.array(t.string()), []),\n\n // Tracking\n lastUsedAt: t.optional(t.datetime()),\n lastUsedIp: t.optional(t.string({ maxLength: 45 })),\n usageCount: db.default(t.integer(), 0),\n\n // Lifecycle\n expiresAt: t.optional(t.datetime()),\n revokedAt: t.optional(t.datetime()),\n }),\n indexes: [\n { columns: [\"userId\", \"name\"], unique: true },\n { columns: [\"tokenHash\"], unique: true },\n ],\n});\n\nexport type ApiKeyEntity = Static<typeof apiKeyEntity.schema>;\n","import { createHash, randomBytes } from \"node:crypto\";\nimport { $inject, Alepha } from \"alepha\";\nimport { $cache } from \"alepha/cache\";\nimport { DateTimeProvider } from \"alepha/datetime\";\nimport { $logger } from \"alepha/logger\";\nimport { $repository, sql } from \"alepha/orm\";\nimport type { IssuerResolver, UserInfo } from \"alepha/security\";\nimport { ForbiddenError, type ServerRequest } from \"alepha/server\";\nimport { type ApiKeyEntity, apiKeyEntity } from \"../entities/apiKeyEntity.ts\";\n\nexport class ApiKeyService {\n protected readonly alepha = $inject(Alepha);\n protected readonly dateTimeProvider = $inject(DateTimeProvider);\n protected readonly log = $logger();\n protected readonly repo = $repository(apiKeyEntity);\n\n /**\n * Cache validated API keys for 15 minutes.\n */\n protected readonly validationCache = $cache<ApiKeyEntity | null, [string]>({\n name: \"api:keys:validation\",\n ttl: [15, \"minutes\"],\n });\n\n // -------------------------------------------------------------------------\n // Resolver\n // -------------------------------------------------------------------------\n\n /**\n * Create an issuer resolver for API key authentication.\n * Lower priority means it runs before JWT resolver.\n *\n * @param options.priority - Priority of this resolver (default: 50, JWT is 100)\n * @param options.prefix - API key prefix to match in Bearer header (default: \"ak\")\n */\n public createResolver(\n options: { priority?: number; prefix?: string } = {},\n ): IssuerResolver {\n const { priority = 50, prefix = \"ak\" } = options;\n const prefixPattern = `${prefix}_`;\n\n return {\n priority,\n onRequest: async (req: ServerRequest) => {\n // Try query param first\n const url = typeof req.url === \"string\" ? new URL(req.url) : req.url;\n let token = url.searchParams.get(\"api_key\");\n\n // Try Bearer header - only if token starts with expected prefix\n if (!token) {\n const auth = req.headers.authorization;\n if (auth?.startsWith(\"Bearer \")) {\n const bearerToken = auth.slice(7);\n if (bearerToken.startsWith(prefixPattern)) {\n token = bearerToken;\n }\n }\n }\n\n if (!token) {\n return null;\n }\n\n return this.validate(token);\n },\n };\n }\n\n // -------------------------------------------------------------------------\n // CRUD\n // -------------------------------------------------------------------------\n\n /**\n * Create a new API key for a user.\n * Returns both the API key entity and the plain token (which is only available once).\n */\n public async create(options: {\n userId: string;\n name: string;\n roles: string[];\n description?: string;\n expiresAt?: Date;\n prefix?: string;\n }): Promise<{ apiKey: ApiKeyEntity; token: string }> {\n const prefix = options.prefix ?? \"ak\";\n const random = randomBytes(24).toString(\"base64url\");\n const token = `${prefix}_${random}`;\n const hash = this.hashToken(token);\n const suffix = token.slice(-8);\n\n const apiKey = await this.repo.create({\n userId: options.userId,\n name: options.name,\n description: options.description,\n tokenHash: hash,\n tokenPrefix: prefix,\n tokenSuffix: suffix,\n roles: options.roles,\n expiresAt: options.expiresAt?.toISOString(),\n });\n\n this.log.info(\"API key created\", {\n apiKeyId: apiKey.id,\n userId: options.userId,\n name: options.name,\n });\n\n return { apiKey, token };\n }\n\n /**\n * List all non-revoked API keys for a user.\n */\n public async list(userId: string): Promise<ApiKeyEntity[]> {\n return this.repo.findMany({\n where: {\n userId: { eq: userId },\n revokedAt: { isNull: true },\n },\n orderBy: { column: \"createdAt\", direction: \"desc\" },\n });\n }\n\n // -------------------------------------------------------------------------\n // Admin Operations\n // -------------------------------------------------------------------------\n\n /**\n * Find all API keys with optional filtering (admin only).\n */\n public async findAll(query: {\n userId?: string;\n includeRevoked?: boolean;\n page?: number;\n size?: number;\n sort?: string;\n }) {\n query.sort ??= \"-createdAt\";\n\n const where = this.repo.createQueryWhere();\n\n if (query.userId) {\n where.userId = { eq: query.userId };\n }\n\n if (!query.includeRevoked) {\n where.revokedAt = { isNull: true };\n }\n\n return this.repo.paginate(query, { where }, { count: true });\n }\n\n /**\n * Get an API key by ID (admin only).\n */\n public async getById(id: string): Promise<ApiKeyEntity> {\n return await this.repo.getById(id);\n }\n\n /**\n * Revoke any API key (admin only).\n */\n public async revokeByAdmin(id: string): Promise<void> {\n const apiKey = await this.repo.getById(id);\n\n if (apiKey.revokedAt) {\n return; // Already revoked\n }\n\n // Invalidate cache\n await this.validationCache.invalidate(apiKey.tokenHash);\n\n await this.repo.updateById(id, {\n revokedAt: this.dateTimeProvider.now().toISOString(),\n });\n\n this.log.info(\"API key revoked by admin\", {\n apiKeyId: id,\n userId: apiKey.userId,\n });\n }\n\n // -------------------------------------------------------------------------\n // User Operations\n // -------------------------------------------------------------------------\n\n /**\n * Revoke an API key. Only the owner can revoke their own keys.\n */\n public async revoke(id: string, userId: string): Promise<void> {\n const apiKey = await this.repo.getById(id);\n\n if (apiKey.userId !== userId) {\n throw new ForbiddenError(\"Not your API key\");\n }\n\n await this.validationCache.invalidate(apiKey.tokenHash);\n\n await this.repo.updateById(id, {\n revokedAt: this.dateTimeProvider.now().toISOString(),\n });\n\n this.log.info(\"API key revoked\", {\n apiKeyId: id,\n userId,\n });\n }\n\n // -------------------------------------------------------------------------\n // Validation\n // -------------------------------------------------------------------------\n\n /**\n * Validate an API key token and return user info if valid.\n */\n public async validate(token: string): Promise<UserInfo | null> {\n // Quick check for API key format\n if (!token.includes(\"_\")) {\n return null;\n }\n\n const hash = this.hashToken(token);\n\n // Try cache first\n let apiKey = await this.validationCache.get(hash);\n\n // If not in cache, look up in database\n if (apiKey === undefined) {\n apiKey =\n (await this.repo.findOne({\n where: { tokenHash: { eq: hash } },\n })) ?? null;\n\n // Store in cache (even if null, to prevent repeated lookups)\n await this.validationCache.set(hash, apiKey);\n }\n\n if (!apiKey) {\n return null;\n }\n\n // Check revocation\n if (apiKey.revokedAt) {\n return null;\n }\n\n // Check expiration\n if (\n apiKey.expiresAt &&\n this.dateTimeProvider.now().isAfter(apiKey.expiresAt)\n ) {\n return null;\n }\n\n // Update usage stats (fire and forget)\n this.updateUsage(apiKey.id).catch((error) => {\n this.log.warn(\"Failed to update API key usage\", { error });\n });\n\n return {\n id: apiKey.userId,\n roles: apiKey.roles,\n };\n }\n\n /**\n * Update usage statistics for an API key.\n */\n protected async updateUsage(id: string): Promise<void> {\n const request = this.alepha.store.get(\"alepha.http.request\");\n\n await this.repo.updateById(id, {\n lastUsedAt: this.dateTimeProvider.now().toISOString(),\n lastUsedIp: request?.ip,\n usageCount: sql`${this.repo.table.usageCount} + 1`,\n });\n }\n\n /**\n * Hash a token using SHA-256.\n */\n protected hashToken(token: string): string {\n return createHash(\"sha256\").update(token).digest(\"hex\");\n }\n}\n","import { $inject, t } from \"alepha\";\nimport { $secure } from \"alepha/security\";\nimport { $action, okSchema } from \"alepha/server\";\nimport { adminApiKeyQuerySchema } from \"../schemas/adminApiKeyQuerySchema.ts\";\nimport { adminApiKeyResourceSchema } from \"../schemas/adminApiKeyResourceSchema.ts\";\nimport { ApiKeyService } from \"../services/ApiKeyService.ts\";\n\n/**\n * REST API controller for admin API key management.\n * Admins can list, view, and revoke any API key.\n */\nexport class AdminApiKeyController {\n protected readonly url = \"/admin/api-keys\";\n protected readonly group = \"admin:api-keys\";\n protected readonly apiKeyService = $inject(ApiKeyService);\n\n /**\n * Find all API keys with optional filtering.\n */\n public readonly findApiKeys = $action({\n path: this.url,\n group: this.group,\n use: [$secure({ permissions: [\"admin:api-key:read\"] })],\n description: \"Find API keys with pagination and filtering\",\n schema: {\n query: adminApiKeyQuerySchema,\n response: t.page(adminApiKeyResourceSchema),\n },\n handler: ({ query }) => {\n const { userId, includeRevoked, ...pagination } = query;\n return this.apiKeyService.findAll({\n userId,\n includeRevoked,\n ...pagination,\n });\n },\n });\n\n /**\n * Get an API key by ID.\n */\n public readonly getApiKey = $action({\n path: `${this.url}/:id`,\n group: this.group,\n use: [$secure({ permissions: [\"admin:api-key:read\"] })],\n description: \"Get an API key by ID\",\n schema: {\n params: t.object({\n id: t.uuid(),\n }),\n response: adminApiKeyResourceSchema,\n },\n handler: ({ params }) => this.apiKeyService.getById(params.id),\n });\n\n /**\n * Revoke any API key.\n */\n public readonly revokeApiKey = $action({\n method: \"DELETE\",\n path: `${this.url}/:id`,\n group: this.group,\n use: [$secure({ permissions: [\"admin:api-key:delete\"] })],\n description: \"Revoke an API key\",\n schema: {\n params: t.object({\n id: t.uuid(),\n }),\n response: okSchema,\n },\n handler: async ({ params }) => {\n await this.apiKeyService.revokeByAdmin(params.id);\n return { ok: true, id: params.id };\n },\n });\n}\n","import { t } from \"alepha\";\n\nexport const createApiKeyBodySchema = t.object({\n name: t.text({ minLength: 1, maxLength: 100 }),\n description: t.optional(t.text({ maxLength: 500 })),\n expiresAt: t.optional(t.datetime()),\n});\n","import { t } from \"alepha\";\n\nexport const createApiKeyResponseSchema = t.object({\n id: t.uuid(),\n name: t.string(),\n token: t.string(),\n tokenSuffix: t.string(),\n roles: t.array(t.string()),\n createdAt: t.datetime(),\n expiresAt: t.optional(t.datetime()),\n});\n","import { t } from \"alepha\";\n\nexport const listApiKeyItemSchema = t.object({\n id: t.uuid(),\n name: t.string(),\n tokenPrefix: t.string(),\n tokenSuffix: t.string(),\n roles: t.array(t.string()),\n createdAt: t.datetime(),\n lastUsedAt: t.optional(t.datetime()),\n expiresAt: t.optional(t.datetime()),\n usageCount: t.integer(),\n});\n\nexport const listApiKeyResponseSchema = t.array(listApiKeyItemSchema);\n","import { t } from \"alepha\";\n\nexport const revokeApiKeyParamsSchema = t.object({\n id: t.uuid(),\n});\n","import { t } from \"alepha\";\n\nexport const revokeApiKeyResponseSchema = t.object({\n ok: t.boolean(),\n});\n","import { $inject } from \"alepha\";\nimport { $secure } from \"alepha/security\";\nimport { $action } from \"alepha/server\";\nimport { createApiKeyBodySchema } from \"../schemas/createApiKeyBodySchema.ts\";\nimport { createApiKeyResponseSchema } from \"../schemas/createApiKeyResponseSchema.ts\";\nimport { listApiKeyResponseSchema } from \"../schemas/listApiKeyResponseSchema.ts\";\nimport { revokeApiKeyParamsSchema } from \"../schemas/revokeApiKeyParamsSchema.ts\";\nimport { revokeApiKeyResponseSchema } from \"../schemas/revokeApiKeyResponseSchema.ts\";\nimport { ApiKeyService } from \"../services/ApiKeyService.ts\";\n\n/**\n * REST API controller for user's own API key management.\n * Users can create, list, and revoke their own API keys.\n */\nexport class ApiKeyController {\n protected readonly url = \"/api-keys\";\n protected readonly group = \"api-keys\";\n protected readonly apiKeyService = $inject(ApiKeyService);\n\n /**\n * Create a new API key for the authenticated user.\n * The token is only returned once upon creation.\n */\n public readonly createApiKey = $action({\n method: \"POST\",\n path: this.url,\n group: this.group,\n description: \"Create a new API key\",\n use: [$secure({ permissions: [\"api-key:create\"] })],\n schema: {\n body: createApiKeyBodySchema,\n response: createApiKeyResponseSchema,\n },\n handler: async (request) => {\n const { apiKey, token } = await this.apiKeyService.create({\n userId: request.user.id,\n name: request.body.name,\n description: request.body.description,\n roles: request.user.roles ?? [],\n expiresAt: request.body.expiresAt\n ? new Date(request.body.expiresAt)\n : undefined,\n });\n\n return {\n id: apiKey.id,\n name: apiKey.name,\n token,\n tokenSuffix: apiKey.tokenSuffix,\n roles: apiKey.roles,\n createdAt: apiKey.createdAt,\n expiresAt: apiKey.expiresAt,\n };\n },\n });\n\n /**\n * List all active API keys for the authenticated user.\n * Does not return the actual tokens.\n */\n public readonly listApiKeys = $action({\n path: this.url,\n group: this.group,\n description: \"List your API keys\",\n use: [$secure({ permissions: [\"api-key:read\"] })],\n schema: {\n response: listApiKeyResponseSchema,\n },\n handler: async (request) => {\n const apiKeys = await this.apiKeyService.list(request.user.id);\n\n return apiKeys.map((apiKey) => ({\n id: apiKey.id,\n name: apiKey.name,\n tokenPrefix: apiKey.tokenPrefix,\n tokenSuffix: apiKey.tokenSuffix,\n roles: apiKey.roles,\n createdAt: apiKey.createdAt,\n lastUsedAt: apiKey.lastUsedAt,\n expiresAt: apiKey.expiresAt,\n usageCount: apiKey.usageCount,\n }));\n },\n });\n\n /**\n * Revoke an API key. Only the owner can revoke their own keys.\n */\n public readonly revokeMyApiKey = $action({\n method: \"DELETE\",\n path: `${this.url}/:id`,\n group: this.group,\n description: \"Revoke an API key\",\n use: [$secure({ permissions: [\"api-key:delete\"] })],\n schema: {\n params: revokeApiKeyParamsSchema,\n response: revokeApiKeyResponseSchema,\n },\n handler: async (request) => {\n await this.apiKeyService.revoke(request.params.id, request.user.id);\n return { ok: true };\n },\n });\n}\n","import { $module } from \"alepha\";\nimport { AdminApiKeyController } from \"./controllers/AdminApiKeyController.ts\";\nimport { ApiKeyController } from \"./controllers/ApiKeyController.ts\";\nimport { ApiKeyService } from \"./services/ApiKeyService.ts\";\n\nexport * from \"./controllers/AdminApiKeyController.ts\";\nexport * from \"./controllers/ApiKeyController.ts\";\nexport * from \"./entities/apiKeyEntity.ts\";\nexport * from \"./schemas/adminApiKeyQuerySchema.ts\";\nexport * from \"./schemas/adminApiKeyResourceSchema.ts\";\nexport * from \"./schemas/createApiKeyBodySchema.ts\";\nexport * from \"./schemas/createApiKeyResponseSchema.ts\";\nexport * from \"./schemas/listApiKeyResponseSchema.ts\";\nexport * from \"./schemas/revokeApiKeyParamsSchema.ts\";\nexport * from \"./schemas/revokeApiKeyResponseSchema.ts\";\nexport * from \"./services/ApiKeyService.ts\";\n\n/**\n * API key management module for programmatic access.\n *\n * **Features:**\n * - Create API keys with role snapshots\n * - List and revoke API keys\n * - 15-minute validation caching\n * - Query param (?api_key=) and Bearer header support\n *\n * **Integration:**\n * To enable API key authentication for an issuer, register the resolver:\n *\n * ```ts\n * class MyApp {\n * apiKeyService = $inject(ApiKeyService);\n * issuer = $issuer({\n * secret: env.APP_SECRET,\n * resolvers: [this.apiKeyService.createResolver()],\n * });\n * }\n * ```\n *\n * @module alepha.api.keys\n */\nexport const AlephaApiKeys = $module({\n name: \"alepha.api.keys\",\n services: [ApiKeyService, ApiKeyController, AdminApiKeyController],\n});\n"],"mappings":"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"}
@@ -8,7 +8,6 @@ import { DateTimeProvider } from "alepha/datetime";
8
8
  import * as _$alepha_logger0 from "alepha/logger";
9
9
  import { EmailProvider } from "alepha/email";
10
10
  import { SmsProvider } from "alepha/sms";
11
- import * as _$typebox from "typebox";
12
11
 
13
12
  //#region ../../src/api/notifications/primitives/$notification.d.ts
14
13
  /**
@@ -116,15 +115,7 @@ declare class NotificationSenderService {
116
115
  };
117
116
  protected load(payload: NotificationPayload): {
118
117
  template: NotificationPrimitive<_$alepha.TObject<_$alepha.TProperties>>;
119
- variables: _$typebox.StaticRecord<[], "Decode", {}, {
120
- type: _$alepha.TUnsafe<"email" | "sms">;
121
- template: _$alepha.TString;
122
- contact: _$alepha.TString;
123
- variables: _$alepha.TOptional<_$alepha.TRecord<"^.*$", _$alepha.TAny>>;
124
- category: _$alepha.TOptional<_$alepha.TString>;
125
- critical: _$alepha.TOptional<_$alepha.TBoolean>;
126
- sensitive: _$alepha.TOptional<_$alepha.TBoolean>;
127
- }, "^.*$", _$alepha.TAny>;
118
+ variables: Record<string, any>;
128
119
  contact: string;
129
120
  };
130
121
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/api/notifications/primitives/$notification.ts","../../../src/api/notifications/schemas/notificationPayloadSchema.ts","../../../src/api/notifications/services/NotificationSenderService.ts","../../../src/api/notifications/jobs/NotificationJobs.ts","../../../src/api/notifications/controllers/AdminNotificationController.ts","../../../src/api/notifications/schemas/notificationContactPreferencesSchema.ts","../../../src/api/notifications/schemas/notificationContactSchema.ts","../../../src/api/notifications/schemas/notificationDetailResourceSchema.ts","../../../src/api/notifications/schemas/notificationQuerySchema.ts","../../../src/api/notifications/schemas/notificationResourceSchema.ts","../../../src/api/notifications/index.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/api/notifications/primitives/$notification.ts","../../../src/api/notifications/schemas/notificationPayloadSchema.ts","../../../src/api/notifications/services/NotificationSenderService.ts","../../../src/api/notifications/jobs/NotificationJobs.ts","../../../src/api/notifications/controllers/AdminNotificationController.ts","../../../src/api/notifications/schemas/notificationContactPreferencesSchema.ts","../../../src/api/notifications/schemas/notificationContactSchema.ts","../../../src/api/notifications/schemas/notificationDetailResourceSchema.ts","../../../src/api/notifications/schemas/notificationQuerySchema.ts","../../../src/api/notifications/schemas/notificationResourceSchema.ts","../../../src/api/notifications/index.ts"],"mappings":"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"}
@@ -16,16 +16,53 @@ const parameters = $entity({
16
16
  id: db.primaryKey(t.uuid()),
17
17
  createdAt: db.createdAt(),
18
18
  updatedAt: db.updatedAt(),
19
+ /**
20
+ * Configuration name using dot notation for tree hierarchy.
21
+ * Examples: "app.features", "app.pricing.tiers", "system.limits"
22
+ */
19
23
  name: t.text(),
24
+ /**
25
+ * The configuration content as JSON.
26
+ */
20
27
  content: t.json(),
28
+ /**
29
+ * Schema version hash for detecting schema changes.
30
+ * Used for auto-migration when schema evolves.
31
+ */
21
32
  schemaHash: t.text(),
33
+ /**
34
+ * When this version should become active.
35
+ * Default is immediate (now).
36
+ */
22
37
  activationDate: t.datetime(),
38
+ /**
39
+ * Version number for this configuration.
40
+ * Auto-incremented per config name.
41
+ */
23
42
  version: t.integer(),
43
+ /**
44
+ * Optional description of changes in this version.
45
+ */
24
46
  changeDescription: t.optional(t.text()),
47
+ /**
48
+ * Optional tags for filtering/categorization.
49
+ */
25
50
  tags: t.optional(t.array(t.text())),
51
+ /**
52
+ * Creator user ID (if available).
53
+ */
26
54
  creatorId: t.optional(t.uuid()),
55
+ /**
56
+ * Creator display name for audit trail.
57
+ */
27
58
  creatorName: t.optional(t.text()),
59
+ /**
60
+ * Previous content before this change (for rollback reference).
61
+ */
28
62
  previousContent: t.optional(t.json()),
63
+ /**
64
+ * Migration log if schema changed.
65
+ */
29
66
  migrationLog: t.optional(t.text())
30
67
  }),
31
68
  indexes: [
@@ -1 +1 @@
1
- {"version":3,"file":"index.browser.js","names":[],"sources":["../../../src/api/parameters/entities/parameters.ts","../../../src/api/parameters/schemas/activateParameterBodySchema.ts","../../../src/api/parameters/schemas/createParameterVersionBodySchema.ts","../../../src/api/parameters/schemas/parameterStatusSchema.ts","../../../src/api/parameters/schemas/parameterResponseSchema.ts","../../../src/api/parameters/schemas/parameterCurrentResponseSchema.ts","../../../src/api/parameters/schemas/parameterHistoryResponseSchema.ts","../../../src/api/parameters/schemas/parameterNameParamSchema.ts","../../../src/api/parameters/schemas/parameterNamesResponseSchema.ts","../../../src/api/parameters/schemas/parameterTreeNodeSchema.ts","../../../src/api/parameters/schemas/parameterVersionParamSchema.ts","../../../src/api/parameters/schemas/parameterVersionResponseSchema.ts","../../../src/api/parameters/schemas/rollbackParameterBodySchema.ts","../../../src/api/parameters/index.browser.ts"],"sourcesContent":["import { type Static, t } from \"alepha\";\nimport { $entity, db } from \"alepha/orm\";\n\n/**\n * Configuration parameter entity for versioned configuration management.\n *\n * Stores all versions of configuration parameters with:\n * - Status derived from activationDate at query time\n * - Schema versioning for migrations\n * - Activation scheduling\n * - Audit trail (creator info)\n */\nexport const parameters = $entity({\n name: \"parameters\",\n schema: t.object({\n id: db.primaryKey(t.uuid()),\n createdAt: db.createdAt(),\n updatedAt: db.updatedAt(),\n\n /**\n * Configuration name using dot notation for tree hierarchy.\n * Examples: \"app.features\", \"app.pricing.tiers\", \"system.limits\"\n */\n name: t.text(),\n\n /**\n * The configuration content as JSON.\n */\n content: t.json(),\n\n /**\n * Schema version hash for detecting schema changes.\n * Used for auto-migration when schema evolves.\n */\n schemaHash: t.text(),\n\n /**\n * When this version should become active.\n * Default is immediate (now).\n */\n activationDate: t.datetime(),\n\n /**\n * Version number for this configuration.\n * Auto-incremented per config name.\n */\n version: t.integer(),\n\n /**\n * Optional description of changes in this version.\n */\n changeDescription: t.optional(t.text()),\n\n /**\n * Optional tags for filtering/categorization.\n */\n tags: t.optional(t.array(t.text())),\n\n /**\n * Creator user ID (if available).\n */\n creatorId: t.optional(t.uuid()),\n\n /**\n * Creator display name for audit trail.\n */\n creatorName: t.optional(t.text()),\n\n /**\n * Previous content before this change (for rollback reference).\n */\n previousContent: t.optional(t.json()),\n\n /**\n * Migration log if schema changed.\n */\n migrationLog: t.optional(t.text()),\n }),\n indexes: [\n { columns: [\"name\", \"activationDate\"] },\n { columns: [\"name\", \"version\"], unique: true },\n { columns: [\"activationDate\"] },\n ],\n});\n\nexport type Parameter = Static<typeof parameters.schema>;\n","import { type Static, t } from \"alepha\";\nimport { parameters } from \"../entities/parameters.ts\";\n\n/**\n * Activate parameter body schema.\n * Uses t.pick for version and creator fields.\n */\nexport const activateParameterBodySchema = t.pick(parameters.schema, [\n \"version\",\n \"creatorId\",\n \"creatorName\",\n]);\n\nexport type ActivateParameterBody = Static<typeof activateParameterBodySchema>;\n","import { type Static, t } from \"alepha\";\nimport { parameters } from \"../entities/parameters.ts\";\n\n/**\n * Create parameter version body schema.\n * Uses t.pick to derive from entity, with required fields made non-optional.\n */\nexport const createParameterVersionBodySchema = t.extend(\n t.pick(parameters.schema, [\n \"content\",\n \"schemaHash\",\n \"changeDescription\",\n \"tags\",\n \"creatorId\",\n \"creatorName\",\n ]),\n {\n activationDate: t.optional(\n t.datetime({ description: \"When to activate (default: now)\" }),\n ),\n },\n);\n\nexport type CreateParameterVersionBody = Static<\n typeof createParameterVersionBodySchema\n>;\n","import { type Static, t } from \"alepha\";\n\n/**\n * Parameter status enum schema.\n */\nexport const parameterStatusSchema = t.enum([\n \"expired\",\n \"current\",\n \"next\",\n \"future\",\n]);\n\nexport type ParameterStatus = Static<typeof parameterStatusSchema>;\n","import { type Static, t } from \"alepha\";\nimport { parameters } from \"../entities/parameters.ts\";\nimport { parameterStatusSchema } from \"./parameterStatusSchema.ts\";\n\n/**\n * Parameter response schema for API responses.\n * Extends the entity schema with a calculated status field.\n * Status is derived from activationDate at query time, not stored.\n */\nexport const parameterResponseSchema = t.extend(parameters.schema, {\n status: parameterStatusSchema,\n});\n\nexport type ParameterResponse = Static<typeof parameterResponseSchema>;\n","import { type Static, t } from \"alepha\";\nimport { parameterResponseSchema } from \"./parameterResponseSchema.ts\";\n\n/**\n * Current parameter response schema.\n * Includes current version, next scheduled version, and defaults.\n */\nexport const parameterCurrentResponseSchema = t.object({\n current: t.optional(parameterResponseSchema),\n next: t.optional(parameterResponseSchema),\n defaultValue: t.optional(t.json()),\n currentValue: t.optional(t.json()),\n schema: t.optional(t.json()),\n});\n\nexport type ParameterCurrentResponse = Static<\n typeof parameterCurrentResponseSchema\n>;\n","import { type Static, t } from \"alepha\";\nimport { parameterResponseSchema } from \"./parameterResponseSchema.ts\";\n\n/**\n * Parameter history response schema.\n */\nexport const parameterHistoryResponseSchema = t.object({\n versions: t.array(parameterResponseSchema),\n});\n\nexport type ParameterHistoryResponse = Static<\n typeof parameterHistoryResponseSchema\n>;\n","import { t } from \"alepha\";\nimport { parameters } from \"../entities/parameters.ts\";\n\n/**\n * Parameter name param schema.\n * Uses t.pick from entity for consistency.\n */\nexport const parameterNameParamSchema = t.pick(parameters.schema, [\"name\"]);\n","import { type Static, t } from \"alepha\";\n\n/**\n * Parameter names list response schema.\n */\nexport const parameterNamesResponseSchema = t.object({\n names: t.array(t.text()),\n});\n\nexport type ParameterNamesResponse = Static<\n typeof parameterNamesResponseSchema\n>;\n","import { type Static, t } from \"alepha\";\n\n/**\n * Tree node schema for parameter tree navigation.\n */\nexport const parameterTreeNodeSchema = t.object({\n name: t.text(),\n path: t.text(),\n isLeaf: t.boolean(),\n children: t.array(t.any()),\n});\n\nexport type ParameterTreeNode = Static<typeof parameterTreeNodeSchema>;\n","import { t } from \"alepha\";\nimport { parameters } from \"../entities/parameters.ts\";\n\n/**\n * Parameter name and version param schema.\n * Uses t.pick from entity for consistency.\n */\nexport const parameterVersionParamSchema = t.pick(parameters.schema, [\n \"name\",\n \"version\",\n]);\n","import { type Static, t } from \"alepha\";\nimport { parameterResponseSchema } from \"./parameterResponseSchema.ts\";\n\n/**\n * Parameter version response schema.\n */\nexport const parameterVersionResponseSchema = t.object({\n parameter: t.optional(parameterResponseSchema),\n});\n\nexport type ParameterVersionResponse = Static<\n typeof parameterVersionResponseSchema\n>;\n","import { type Static, t } from \"alepha\";\nimport { parameters } from \"../entities/parameters.ts\";\n\n/**\n * Rollback parameter body schema.\n * Uses t.pick for creator fields, adds targetVersion.\n */\nexport const rollbackParameterBodySchema = t.extend(\n t.pick(parameters.schema, [\"changeDescription\", \"creatorId\", \"creatorName\"]),\n {\n targetVersion: t.integer({\n description: \"Version number to rollback to\",\n }),\n },\n);\n\nexport type RollbackParameterBody = Static<typeof rollbackParameterBodySchema>;\n","import { $module } from \"alepha\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./entities/parameters.ts\";\nexport * from \"./schemas/activateParameterBodySchema.ts\";\nexport * from \"./schemas/createParameterVersionBodySchema.ts\";\nexport * from \"./schemas/parameterCurrentResponseSchema.ts\";\nexport * from \"./schemas/parameterHistoryResponseSchema.ts\";\nexport * from \"./schemas/parameterNameParamSchema.ts\";\nexport * from \"./schemas/parameterNamesResponseSchema.ts\";\nexport * from \"./schemas/parameterResponseSchema.ts\";\nexport * from \"./schemas/parameterStatusSchema.ts\";\nexport * from \"./schemas/parameterTreeNodeSchema.ts\";\nexport * from \"./schemas/parameterVersionParamSchema.ts\";\nexport * from \"./schemas/parameterVersionResponseSchema.ts\";\nexport * from \"./schemas/rollbackParameterBodySchema.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport const AlephaApiParameters = $module({\n name: \"alepha.api.parameters\",\n services: [],\n});\n"],"mappings":";;;;;;;;;;;;AAYA,MAAa,aAAa,QAAQ;CAChC,MAAM;CACN,QAAQ,EAAE,OAAO;EACf,IAAI,GAAG,WAAW,EAAE,MAAM,CAAC;EAC3B,WAAW,GAAG,WAAW;EACzB,WAAW,GAAG,WAAW;EAMzB,MAAM,EAAE,MAAM;EAKd,SAAS,EAAE,MAAM;EAMjB,YAAY,EAAE,MAAM;EAMpB,gBAAgB,EAAE,UAAU;EAM5B,SAAS,EAAE,SAAS;EAKpB,mBAAmB,EAAE,SAAS,EAAE,MAAM,CAAC;EAKvC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;EAKnC,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC;EAK/B,aAAa,EAAE,SAAS,EAAE,MAAM,CAAC;EAKjC,iBAAiB,EAAE,SAAS,EAAE,MAAM,CAAC;EAKrC,cAAc,EAAE,SAAS,EAAE,MAAM,CAAC;EACnC,CAAC;CACF,SAAS;EACP,EAAE,SAAS,CAAC,QAAQ,iBAAiB,EAAE;EACvC;GAAE,SAAS,CAAC,QAAQ,UAAU;GAAE,QAAQ;GAAM;EAC9C,EAAE,SAAS,CAAC,iBAAiB,EAAE;EAChC;CACF,CAAC;;;;;;;AC5EF,MAAa,8BAA8B,EAAE,KAAK,WAAW,QAAQ;CACnE;CACA;CACA;CACD,CAAC;;;;;;;ACJF,MAAa,mCAAmC,EAAE,OAChD,EAAE,KAAK,WAAW,QAAQ;CACxB;CACA;CACA;CACA;CACA;CACA;CACD,CAAC,EACF,EACE,gBAAgB,EAAE,SAChB,EAAE,SAAS,EAAE,aAAa,mCAAmC,CAAC,CAC/D,EACF,CACF;;;;;;AChBD,MAAa,wBAAwB,EAAE,KAAK;CAC1C;CACA;CACA;CACA;CACD,CAAC;;;;;;;;ACDF,MAAa,0BAA0B,EAAE,OAAO,WAAW,QAAQ,EACjE,QAAQ,uBACT,CAAC;;;;;;;ACJF,MAAa,iCAAiC,EAAE,OAAO;CACrD,SAAS,EAAE,SAAS,wBAAwB;CAC5C,MAAM,EAAE,SAAS,wBAAwB;CACzC,cAAc,EAAE,SAAS,EAAE,MAAM,CAAC;CAClC,cAAc,EAAE,SAAS,EAAE,MAAM,CAAC;CAClC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC;CAC7B,CAAC;;;;;;ACPF,MAAa,iCAAiC,EAAE,OAAO,EACrD,UAAU,EAAE,MAAM,wBAAwB,EAC3C,CAAC;;;;;;;ACDF,MAAa,2BAA2B,EAAE,KAAK,WAAW,QAAQ,CAAC,OAAO,CAAC;;;;;;ACF3E,MAAa,+BAA+B,EAAE,OAAO,EACnD,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EACzB,CAAC;;;;;;ACFF,MAAa,0BAA0B,EAAE,OAAO;CAC9C,MAAM,EAAE,MAAM;CACd,MAAM,EAAE,MAAM;CACd,QAAQ,EAAE,SAAS;CACnB,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC;CAC3B,CAAC;;;;;;;ACHF,MAAa,8BAA8B,EAAE,KAAK,WAAW,QAAQ,CACnE,QACA,UACD,CAAC;;;;;;ACJF,MAAa,iCAAiC,EAAE,OAAO,EACrD,WAAW,EAAE,SAAS,wBAAwB,EAC/C,CAAC;;;;;;;ACDF,MAAa,8BAA8B,EAAE,OAC3C,EAAE,KAAK,WAAW,QAAQ;CAAC;CAAqB;CAAa;CAAc,CAAC,EAC5E,EACE,eAAe,EAAE,QAAQ,EACvB,aAAa,iCACd,CAAC,EACH,CACF;;;ACMD,MAAa,sBAAsB,QAAQ;CACzC,MAAM;CACN,UAAU,EAAE;CACb,CAAC"}
1
+ {"version":3,"file":"index.browser.js","names":[],"sources":["../../../src/api/parameters/entities/parameters.ts","../../../src/api/parameters/schemas/activateParameterBodySchema.ts","../../../src/api/parameters/schemas/createParameterVersionBodySchema.ts","../../../src/api/parameters/schemas/parameterStatusSchema.ts","../../../src/api/parameters/schemas/parameterResponseSchema.ts","../../../src/api/parameters/schemas/parameterCurrentResponseSchema.ts","../../../src/api/parameters/schemas/parameterHistoryResponseSchema.ts","../../../src/api/parameters/schemas/parameterNameParamSchema.ts","../../../src/api/parameters/schemas/parameterNamesResponseSchema.ts","../../../src/api/parameters/schemas/parameterTreeNodeSchema.ts","../../../src/api/parameters/schemas/parameterVersionParamSchema.ts","../../../src/api/parameters/schemas/parameterVersionResponseSchema.ts","../../../src/api/parameters/schemas/rollbackParameterBodySchema.ts","../../../src/api/parameters/index.browser.ts"],"sourcesContent":["import { type Static, t } from \"alepha\";\nimport { $entity, db } from \"alepha/orm\";\n\n/**\n * Configuration parameter entity for versioned configuration management.\n *\n * Stores all versions of configuration parameters with:\n * - Status derived from activationDate at query time\n * - Schema versioning for migrations\n * - Activation scheduling\n * - Audit trail (creator info)\n */\nexport const parameters = $entity({\n name: \"parameters\",\n schema: t.object({\n id: db.primaryKey(t.uuid()),\n createdAt: db.createdAt(),\n updatedAt: db.updatedAt(),\n\n /**\n * Configuration name using dot notation for tree hierarchy.\n * Examples: \"app.features\", \"app.pricing.tiers\", \"system.limits\"\n */\n name: t.text(),\n\n /**\n * The configuration content as JSON.\n */\n content: t.json(),\n\n /**\n * Schema version hash for detecting schema changes.\n * Used for auto-migration when schema evolves.\n */\n schemaHash: t.text(),\n\n /**\n * When this version should become active.\n * Default is immediate (now).\n */\n activationDate: t.datetime(),\n\n /**\n * Version number for this configuration.\n * Auto-incremented per config name.\n */\n version: t.integer(),\n\n /**\n * Optional description of changes in this version.\n */\n changeDescription: t.optional(t.text()),\n\n /**\n * Optional tags for filtering/categorization.\n */\n tags: t.optional(t.array(t.text())),\n\n /**\n * Creator user ID (if available).\n */\n creatorId: t.optional(t.uuid()),\n\n /**\n * Creator display name for audit trail.\n */\n creatorName: t.optional(t.text()),\n\n /**\n * Previous content before this change (for rollback reference).\n */\n previousContent: t.optional(t.json()),\n\n /**\n * Migration log if schema changed.\n */\n migrationLog: t.optional(t.text()),\n }),\n indexes: [\n { columns: [\"name\", \"activationDate\"] },\n { columns: [\"name\", \"version\"], unique: true },\n { columns: [\"activationDate\"] },\n ],\n});\n\nexport type Parameter = Static<typeof parameters.schema>;\n","import { type Static, t } from \"alepha\";\nimport { parameters } from \"../entities/parameters.ts\";\n\n/**\n * Activate parameter body schema.\n * Uses t.pick for version and creator fields.\n */\nexport const activateParameterBodySchema = t.pick(parameters.schema, [\n \"version\",\n \"creatorId\",\n \"creatorName\",\n]);\n\nexport type ActivateParameterBody = Static<typeof activateParameterBodySchema>;\n","import { type Static, t } from \"alepha\";\nimport { parameters } from \"../entities/parameters.ts\";\n\n/**\n * Create parameter version body schema.\n * Uses t.pick to derive from entity, with required fields made non-optional.\n */\nexport const createParameterVersionBodySchema = t.extend(\n t.pick(parameters.schema, [\n \"content\",\n \"schemaHash\",\n \"changeDescription\",\n \"tags\",\n \"creatorId\",\n \"creatorName\",\n ]),\n {\n activationDate: t.optional(\n t.datetime({ description: \"When to activate (default: now)\" }),\n ),\n },\n);\n\nexport type CreateParameterVersionBody = Static<\n typeof createParameterVersionBodySchema\n>;\n","import { type Static, t } from \"alepha\";\n\n/**\n * Parameter status enum schema.\n */\nexport const parameterStatusSchema = t.enum([\n \"expired\",\n \"current\",\n \"next\",\n \"future\",\n]);\n\nexport type ParameterStatus = Static<typeof parameterStatusSchema>;\n","import { type Static, t } from \"alepha\";\nimport { parameters } from \"../entities/parameters.ts\";\nimport { parameterStatusSchema } from \"./parameterStatusSchema.ts\";\n\n/**\n * Parameter response schema for API responses.\n * Extends the entity schema with a calculated status field.\n * Status is derived from activationDate at query time, not stored.\n */\nexport const parameterResponseSchema = t.extend(parameters.schema, {\n status: parameterStatusSchema,\n});\n\nexport type ParameterResponse = Static<typeof parameterResponseSchema>;\n","import { type Static, t } from \"alepha\";\nimport { parameterResponseSchema } from \"./parameterResponseSchema.ts\";\n\n/**\n * Current parameter response schema.\n * Includes current version, next scheduled version, and defaults.\n */\nexport const parameterCurrentResponseSchema = t.object({\n current: t.optional(parameterResponseSchema),\n next: t.optional(parameterResponseSchema),\n defaultValue: t.optional(t.json()),\n currentValue: t.optional(t.json()),\n schema: t.optional(t.json()),\n});\n\nexport type ParameterCurrentResponse = Static<\n typeof parameterCurrentResponseSchema\n>;\n","import { type Static, t } from \"alepha\";\nimport { parameterResponseSchema } from \"./parameterResponseSchema.ts\";\n\n/**\n * Parameter history response schema.\n */\nexport const parameterHistoryResponseSchema = t.object({\n versions: t.array(parameterResponseSchema),\n});\n\nexport type ParameterHistoryResponse = Static<\n typeof parameterHistoryResponseSchema\n>;\n","import { t } from \"alepha\";\nimport { parameters } from \"../entities/parameters.ts\";\n\n/**\n * Parameter name param schema.\n * Uses t.pick from entity for consistency.\n */\nexport const parameterNameParamSchema = t.pick(parameters.schema, [\"name\"]);\n","import { type Static, t } from \"alepha\";\n\n/**\n * Parameter names list response schema.\n */\nexport const parameterNamesResponseSchema = t.object({\n names: t.array(t.text()),\n});\n\nexport type ParameterNamesResponse = Static<\n typeof parameterNamesResponseSchema\n>;\n","import { type Static, t } from \"alepha\";\n\n/**\n * Tree node schema for parameter tree navigation.\n */\nexport const parameterTreeNodeSchema = t.object({\n name: t.text(),\n path: t.text(),\n isLeaf: t.boolean(),\n children: t.array(t.any()),\n});\n\nexport type ParameterTreeNode = Static<typeof parameterTreeNodeSchema>;\n","import { t } from \"alepha\";\nimport { parameters } from \"../entities/parameters.ts\";\n\n/**\n * Parameter name and version param schema.\n * Uses t.pick from entity for consistency.\n */\nexport const parameterVersionParamSchema = t.pick(parameters.schema, [\n \"name\",\n \"version\",\n]);\n","import { type Static, t } from \"alepha\";\nimport { parameterResponseSchema } from \"./parameterResponseSchema.ts\";\n\n/**\n * Parameter version response schema.\n */\nexport const parameterVersionResponseSchema = t.object({\n parameter: t.optional(parameterResponseSchema),\n});\n\nexport type ParameterVersionResponse = Static<\n typeof parameterVersionResponseSchema\n>;\n","import { type Static, t } from \"alepha\";\nimport { parameters } from \"../entities/parameters.ts\";\n\n/**\n * Rollback parameter body schema.\n * Uses t.pick for creator fields, adds targetVersion.\n */\nexport const rollbackParameterBodySchema = t.extend(\n t.pick(parameters.schema, [\"changeDescription\", \"creatorId\", \"creatorName\"]),\n {\n targetVersion: t.integer({\n description: \"Version number to rollback to\",\n }),\n },\n);\n\nexport type RollbackParameterBody = Static<typeof rollbackParameterBodySchema>;\n","import { $module } from \"alepha\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./entities/parameters.ts\";\nexport * from \"./schemas/activateParameterBodySchema.ts\";\nexport * from \"./schemas/createParameterVersionBodySchema.ts\";\nexport * from \"./schemas/parameterCurrentResponseSchema.ts\";\nexport * from \"./schemas/parameterHistoryResponseSchema.ts\";\nexport * from \"./schemas/parameterNameParamSchema.ts\";\nexport * from \"./schemas/parameterNamesResponseSchema.ts\";\nexport * from \"./schemas/parameterResponseSchema.ts\";\nexport * from \"./schemas/parameterStatusSchema.ts\";\nexport * from \"./schemas/parameterTreeNodeSchema.ts\";\nexport * from \"./schemas/parameterVersionParamSchema.ts\";\nexport * from \"./schemas/parameterVersionResponseSchema.ts\";\nexport * from \"./schemas/rollbackParameterBodySchema.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport const AlephaApiParameters = $module({\n name: \"alepha.api.parameters\",\n services: [],\n});\n"],"mappings":";;;;;;;;;;;;AAYA,MAAa,aAAa,QAAQ;CAChC,MAAM;CACN,QAAQ,EAAE,OAAO;EACf,IAAI,GAAG,WAAW,EAAE,MAAM,CAAC;EAC3B,WAAW,GAAG,WAAW;EACzB,WAAW,GAAG,WAAW;;;;;EAMzB,MAAM,EAAE,MAAM;;;;EAKd,SAAS,EAAE,MAAM;;;;;EAMjB,YAAY,EAAE,MAAM;;;;;EAMpB,gBAAgB,EAAE,UAAU;;;;;EAM5B,SAAS,EAAE,SAAS;;;;EAKpB,mBAAmB,EAAE,SAAS,EAAE,MAAM,CAAC;;;;EAKvC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;;;;EAKnC,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC;;;;EAK/B,aAAa,EAAE,SAAS,EAAE,MAAM,CAAC;;;;EAKjC,iBAAiB,EAAE,SAAS,EAAE,MAAM,CAAC;;;;EAKrC,cAAc,EAAE,SAAS,EAAE,MAAM,CAAC;EACnC,CAAC;CACF,SAAS;EACP,EAAE,SAAS,CAAC,QAAQ,iBAAiB,EAAE;EACvC;GAAE,SAAS,CAAC,QAAQ,UAAU;GAAE,QAAQ;GAAM;EAC9C,EAAE,SAAS,CAAC,iBAAiB,EAAE;EAChC;CACF,CAAC;;;;;;;AC5EF,MAAa,8BAA8B,EAAE,KAAK,WAAW,QAAQ;CACnE;CACA;CACA;CACD,CAAC;;;;;;;ACJF,MAAa,mCAAmC,EAAE,OAChD,EAAE,KAAK,WAAW,QAAQ;CACxB;CACA;CACA;CACA;CACA;CACA;CACD,CAAC,EACF,EACE,gBAAgB,EAAE,SAChB,EAAE,SAAS,EAAE,aAAa,mCAAmC,CAAC,CAC/D,EACF,CACF;;;;;;AChBD,MAAa,wBAAwB,EAAE,KAAK;CAC1C;CACA;CACA;CACA;CACD,CAAC;;;;;;;;ACDF,MAAa,0BAA0B,EAAE,OAAO,WAAW,QAAQ,EACjE,QAAQ,uBACT,CAAC;;;;;;;ACJF,MAAa,iCAAiC,EAAE,OAAO;CACrD,SAAS,EAAE,SAAS,wBAAwB;CAC5C,MAAM,EAAE,SAAS,wBAAwB;CACzC,cAAc,EAAE,SAAS,EAAE,MAAM,CAAC;CAClC,cAAc,EAAE,SAAS,EAAE,MAAM,CAAC;CAClC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC;CAC7B,CAAC;;;;;;ACPF,MAAa,iCAAiC,EAAE,OAAO,EACrD,UAAU,EAAE,MAAM,wBAAwB,EAC3C,CAAC;;;;;;;ACDF,MAAa,2BAA2B,EAAE,KAAK,WAAW,QAAQ,CAAC,OAAO,CAAC;;;;;;ACF3E,MAAa,+BAA+B,EAAE,OAAO,EACnD,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EACzB,CAAC;;;;;;ACFF,MAAa,0BAA0B,EAAE,OAAO;CAC9C,MAAM,EAAE,MAAM;CACd,MAAM,EAAE,MAAM;CACd,QAAQ,EAAE,SAAS;CACnB,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC;CAC3B,CAAC;;;;;;;ACHF,MAAa,8BAA8B,EAAE,KAAK,WAAW,QAAQ,CACnE,QACA,UACD,CAAC;;;;;;ACJF,MAAa,iCAAiC,EAAE,OAAO,EACrD,WAAW,EAAE,SAAS,wBAAwB,EAC/C,CAAC;;;;;;;ACDF,MAAa,8BAA8B,EAAE,OAC3C,EAAE,KAAK,WAAW,QAAQ;CAAC;CAAqB;CAAa;CAAc,CAAC,EAC5E,EACE,eAAe,EAAE,QAAQ,EACvB,aAAa,iCACd,CAAC,EACH,CACF;;;ACMD,MAAa,sBAAsB,QAAQ;CACzC,MAAM;CACN,UAAU,EAAE;CACb,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import * as _$alepha from "alepha";
2
- import { Alepha, AlephaError, KIND, Primitive, Static, TNull, TObject, TOptional, TSchema, TUnion } from "alepha";
2
+ import { Alepha, AlephaError, KIND, Primitive, SchemaValidator, Static, TNull, TObject, TOptional, TSchema, TUnion } from "alepha";
3
3
  import { UserAccount } from "alepha/security";
4
4
  import * as _$alepha_server0 from "alepha/server";
5
5
  import * as _$alepha_orm0 from "alepha/orm";
@@ -10,7 +10,6 @@ import * as _$alepha_logger0 from "alepha/logger";
10
10
  import * as _$alepha_topic0 from "alepha/topic";
11
11
  import { BuildExtraConfigColumns, SQL } from "drizzle-orm";
12
12
  import { PgColumnBuilderBase, PgSequenceOptions, PgTableExtraConfigValue, UpdateDeleteAction } from "drizzle-orm/pg-core";
13
- import * as _$typebox from "typebox";
14
13
  //#region ../../src/orm/core/schemas/insertSchema.d.ts
15
14
  /**
16
15
  * Transforms a TObject schema for insert operations.
@@ -499,43 +498,13 @@ declare class ParameterPrimitive<T extends TObject> extends Primitive<ParameterP
499
498
  tags?: string[] | undefined;
500
499
  creatorId?: string | undefined;
501
500
  creatorName?: string | undefined;
502
- previousContent?: _$typebox.StaticRecord<[], "Decode", {}, {
503
- id: PgAttr<PgAttr<_$alepha.TString, typeof PG_PRIMARY_KEY>, typeof PG_DEFAULT>;
504
- createdAt: PgAttr<PgAttr<_$alepha.TString, typeof PG_CREATED_AT>, typeof PG_DEFAULT>;
505
- updatedAt: PgAttr<PgAttr<_$alepha.TString, typeof PG_UPDATED_AT>, typeof PG_DEFAULT>;
506
- name: _$alepha.TString;
507
- content: _$alepha.TRecord<string, _$alepha.TAny>;
508
- schemaHash: _$alepha.TString;
509
- activationDate: _$alepha.TString;
510
- version: _$alepha.TInteger;
511
- changeDescription: _$alepha.TOptional<_$alepha.TString>;
512
- tags: _$alepha.TOptional<_$alepha.TArray<_$alepha.TString>>;
513
- creatorId: _$alepha.TOptional<_$alepha.TString>;
514
- creatorName: _$alepha.TOptional<_$alepha.TString>;
515
- previousContent: _$alepha.TOptional<_$alepha.TRecord<string, _$alepha.TAny>>;
516
- migrationLog: _$alepha.TOptional<_$alepha.TString>;
517
- }, string, _$alepha.TAny> | undefined;
501
+ previousContent?: Record<string, any> | undefined;
518
502
  migrationLog?: string | undefined;
503
+ name: string;
519
504
  id: string;
520
505
  createdAt: string;
521
506
  updatedAt: string;
522
- name: string;
523
- content: _$typebox.StaticRecord<[], "Decode", {}, {
524
- id: PgAttr<PgAttr<_$alepha.TString, typeof PG_PRIMARY_KEY>, typeof PG_DEFAULT>;
525
- createdAt: PgAttr<PgAttr<_$alepha.TString, typeof PG_CREATED_AT>, typeof PG_DEFAULT>;
526
- updatedAt: PgAttr<PgAttr<_$alepha.TString, typeof PG_UPDATED_AT>, typeof PG_DEFAULT>;
527
- name: _$alepha.TString;
528
- content: _$alepha.TRecord<string, _$alepha.TAny>;
529
- schemaHash: _$alepha.TString;
530
- activationDate: _$alepha.TString;
531
- version: _$alepha.TInteger;
532
- changeDescription: _$alepha.TOptional<_$alepha.TString>;
533
- tags: _$alepha.TOptional<_$alepha.TArray<_$alepha.TString>>;
534
- creatorId: _$alepha.TOptional<_$alepha.TString>;
535
- creatorName: _$alepha.TOptional<_$alepha.TString>;
536
- previousContent: _$alepha.TOptional<_$alepha.TRecord<string, _$alepha.TAny>>;
537
- migrationLog: _$alepha.TOptional<_$alepha.TString>;
538
- }, string, _$alepha.TAny>;
507
+ content: Record<string, any>;
539
508
  schemaHash: string;
540
509
  activationDate: string;
541
510
  version: number;
@@ -548,43 +517,13 @@ declare class ParameterPrimitive<T extends TObject> extends Primitive<ParameterP
548
517
  tags?: string[] | undefined;
549
518
  creatorId?: string | undefined;
550
519
  creatorName?: string | undefined;
551
- previousContent?: _$typebox.StaticRecord<[], "Decode", {}, {
552
- id: PgAttr<PgAttr<_$alepha.TString, typeof PG_PRIMARY_KEY>, typeof PG_DEFAULT>;
553
- createdAt: PgAttr<PgAttr<_$alepha.TString, typeof PG_CREATED_AT>, typeof PG_DEFAULT>;
554
- updatedAt: PgAttr<PgAttr<_$alepha.TString, typeof PG_UPDATED_AT>, typeof PG_DEFAULT>;
555
- name: _$alepha.TString;
556
- content: _$alepha.TRecord<string, _$alepha.TAny>;
557
- schemaHash: _$alepha.TString;
558
- activationDate: _$alepha.TString;
559
- version: _$alepha.TInteger;
560
- changeDescription: _$alepha.TOptional<_$alepha.TString>;
561
- tags: _$alepha.TOptional<_$alepha.TArray<_$alepha.TString>>;
562
- creatorId: _$alepha.TOptional<_$alepha.TString>;
563
- creatorName: _$alepha.TOptional<_$alepha.TString>;
564
- previousContent: _$alepha.TOptional<_$alepha.TRecord<string, _$alepha.TAny>>;
565
- migrationLog: _$alepha.TOptional<_$alepha.TString>;
566
- }, string, _$alepha.TAny> | undefined;
520
+ previousContent?: Record<string, any> | undefined;
567
521
  migrationLog?: string | undefined;
522
+ name: string;
568
523
  id: string;
569
524
  createdAt: string;
570
525
  updatedAt: string;
571
- name: string;
572
- content: _$typebox.StaticRecord<[], "Decode", {}, {
573
- id: PgAttr<PgAttr<_$alepha.TString, typeof PG_PRIMARY_KEY>, typeof PG_DEFAULT>;
574
- createdAt: PgAttr<PgAttr<_$alepha.TString, typeof PG_CREATED_AT>, typeof PG_DEFAULT>;
575
- updatedAt: PgAttr<PgAttr<_$alepha.TString, typeof PG_UPDATED_AT>, typeof PG_DEFAULT>;
576
- name: _$alepha.TString;
577
- content: _$alepha.TRecord<string, _$alepha.TAny>;
578
- schemaHash: _$alepha.TString;
579
- activationDate: _$alepha.TString;
580
- version: _$alepha.TInteger;
581
- changeDescription: _$alepha.TOptional<_$alepha.TString>;
582
- tags: _$alepha.TOptional<_$alepha.TArray<_$alepha.TString>>;
583
- creatorId: _$alepha.TOptional<_$alepha.TString>;
584
- creatorName: _$alepha.TOptional<_$alepha.TString>;
585
- previousContent: _$alepha.TOptional<_$alepha.TRecord<string, _$alepha.TAny>>;
586
- migrationLog: _$alepha.TOptional<_$alepha.TString>;
587
- }, string, _$alepha.TAny>;
526
+ content: Record<string, any>;
588
527
  schemaHash: string;
589
528
  activationDate: string;
590
529
  version: number;
@@ -676,6 +615,7 @@ declare class ParameterProvider {
676
615
  protected readonly dateTimeProvider: DateTimeProvider;
677
616
  protected readonly crypto: CryptoProvider;
678
617
  protected readonly lockProvider: LockProvider;
618
+ protected readonly schemaValidator: SchemaValidator;
679
619
  protected readonly repo: _$alepha_orm0.Repository<TObject<{
680
620
  id: _$alepha_orm0.PgAttr<_$alepha_orm0.PgAttr<_$alepha.TString, typeof _$alepha_orm0.PG_PRIMARY_KEY>, typeof _$alepha_orm0.PG_DEFAULT>;
681
621
  createdAt: _$alepha_orm0.PgAttr<_$alepha_orm0.PgAttr<_$alepha.TString, typeof _$alepha_orm0.PG_CREATED_AT>, typeof _$alepha_orm0.PG_DEFAULT>;
@@ -898,6 +838,10 @@ declare class ParameterProvider {
898
838
  * Notify all subscribers of a value change.
899
839
  */
900
840
  protected notifySubscribers(name: string): void;
841
+ /**
842
+ * Probe whether a value matches the schema, without throwing or mutating.
843
+ */
844
+ protected isValid(schema: TObject, value: unknown): boolean;
901
845
  /**
902
846
  * Return a new object containing only keys present in the schema.
903
847
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/orm/core/schemas/insertSchema.ts","../../../src/orm/core/schemas/updateSchema.ts","../../../src/orm/core/primitives/$entity.ts","../../../src/orm/core/constants/PG_SYMBOLS.ts","../../../src/orm/core/helpers/pgAttr.ts","../../../src/orm/core/schemas/databaseEnvSchema.ts","../../../src/api/parameters/entities/parameters.ts","../../../src/api/parameters/primitives/$parameter.ts","../../../src/api/parameters/schemas/parameterStatusSchema.ts","../../../src/api/parameters/schemas/parameterTreeNodeSchema.ts","../../../src/api/parameters/services/ParameterProvider.ts","../../../src/api/parameters/controllers/AdminParameterController.ts","../../../src/api/parameters/schemas/activateParameterBodySchema.ts","../../../src/api/parameters/schemas/createParameterVersionBodySchema.ts","../../../src/api/parameters/schemas/parameterCurrentResponseSchema.ts","../../../src/api/parameters/schemas/parameterHistoryResponseSchema.ts","../../../src/api/parameters/schemas/parameterNameParamSchema.ts","../../../src/api/parameters/schemas/parameterNamesResponseSchema.ts","../../../src/api/parameters/schemas/parameterResponseSchema.ts","../../../src/api/parameters/schemas/parameterVersionParamSchema.ts","../../../src/api/parameters/schemas/parameterVersionResponseSchema.ts","../../../src/api/parameters/schemas/rollbackParameterBodySchema.ts","../../../src/api/parameters/index.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/orm/core/schemas/insertSchema.ts","../../../src/orm/core/schemas/updateSchema.ts","../../../src/orm/core/primitives/$entity.ts","../../../src/orm/core/constants/PG_SYMBOLS.ts","../../../src/orm/core/helpers/pgAttr.ts","../../../src/orm/core/schemas/databaseEnvSchema.ts","../../../src/api/parameters/entities/parameters.ts","../../../src/api/parameters/primitives/$parameter.ts","../../../src/api/parameters/schemas/parameterStatusSchema.ts","../../../src/api/parameters/schemas/parameterTreeNodeSchema.ts","../../../src/api/parameters/services/ParameterProvider.ts","../../../src/api/parameters/controllers/AdminParameterController.ts","../../../src/api/parameters/schemas/activateParameterBodySchema.ts","../../../src/api/parameters/schemas/createParameterVersionBodySchema.ts","../../../src/api/parameters/schemas/parameterCurrentResponseSchema.ts","../../../src/api/parameters/schemas/parameterHistoryResponseSchema.ts","../../../src/api/parameters/schemas/parameterNameParamSchema.ts","../../../src/api/parameters/schemas/parameterNamesResponseSchema.ts","../../../src/api/parameters/schemas/parameterResponseSchema.ts","../../../src/api/parameters/schemas/parameterVersionParamSchema.ts","../../../src/api/parameters/schemas/parameterVersionResponseSchema.ts","../../../src/api/parameters/schemas/rollbackParameterBodySchema.ts","../../../src/api/parameters/index.ts"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { $hook, $inject, $module, Alepha, AlephaError, KIND, Primitive, Value, createPrimitive, t } from "alepha";
1
+ import { $hook, $inject, $module, Alepha, AlephaError, KIND, Primitive, SchemaValidator, createPrimitive, t } from "alepha";
2
2
  import { $secure } from "alepha/security";
3
3
  import { $action, okSchema } from "alepha/server";
4
4
  import { $entity, $repository, db } from "alepha/orm";
@@ -23,16 +23,53 @@ const parameters = $entity({
23
23
  id: db.primaryKey(t.uuid()),
24
24
  createdAt: db.createdAt(),
25
25
  updatedAt: db.updatedAt(),
26
+ /**
27
+ * Configuration name using dot notation for tree hierarchy.
28
+ * Examples: "app.features", "app.pricing.tiers", "system.limits"
29
+ */
26
30
  name: t.text(),
31
+ /**
32
+ * The configuration content as JSON.
33
+ */
27
34
  content: t.json(),
35
+ /**
36
+ * Schema version hash for detecting schema changes.
37
+ * Used for auto-migration when schema evolves.
38
+ */
28
39
  schemaHash: t.text(),
40
+ /**
41
+ * When this version should become active.
42
+ * Default is immediate (now).
43
+ */
29
44
  activationDate: t.datetime(),
45
+ /**
46
+ * Version number for this configuration.
47
+ * Auto-incremented per config name.
48
+ */
30
49
  version: t.integer(),
50
+ /**
51
+ * Optional description of changes in this version.
52
+ */
31
53
  changeDescription: t.optional(t.text()),
54
+ /**
55
+ * Optional tags for filtering/categorization.
56
+ */
32
57
  tags: t.optional(t.array(t.text())),
58
+ /**
59
+ * Creator user ID (if available).
60
+ */
33
61
  creatorId: t.optional(t.uuid()),
62
+ /**
63
+ * Creator display name for audit trail.
64
+ */
34
65
  creatorName: t.optional(t.text()),
66
+ /**
67
+ * Previous content before this change (for rollback reference).
68
+ */
35
69
  previousContent: t.optional(t.json()),
70
+ /**
71
+ * Migration log if schema changed.
72
+ */
36
73
  migrationLog: t.optional(t.text())
37
74
  }),
38
75
  indexes: [
@@ -174,6 +211,7 @@ var ParameterProvider = class {
174
211
  dateTimeProvider = $inject(DateTimeProvider);
175
212
  crypto = $inject(CryptoProvider);
176
213
  lockProvider = $inject(LockProvider);
214
+ schemaValidator = $inject(SchemaValidator);
177
215
  repo = $repository(parameters);
178
216
  /**
179
217
  * Unique identifier for this instance (to avoid self-updates).
@@ -658,7 +696,7 @@ var ParameterProvider = class {
658
696
  const defaults = param.options.default;
659
697
  if (param.options.migrate) try {
660
698
  const migrated = param.options.migrate(dbValue);
661
- if (Value.Check(schema, migrated)) {
699
+ if (this.isValid(schema, migrated)) {
662
700
  if (JSON.stringify(migrated) === JSON.stringify(dbValue)) return null;
663
701
  return {
664
702
  value: migrated,
@@ -674,7 +712,7 @@ var ParameterProvider = class {
674
712
  }
675
713
  const schemaKeys = new Set(Object.keys(schema.properties));
676
714
  const stripped = this.pickSchemaKeys(dbValue, schemaKeys);
677
- if (Value.Check(schema, stripped)) {
715
+ if (this.isValid(schema, stripped)) {
678
716
  if (JSON.stringify(stripped) === JSON.stringify(dbValue)) return null;
679
717
  return {
680
718
  value: stripped,
@@ -682,7 +720,7 @@ var ParameterProvider = class {
682
720
  };
683
721
  }
684
722
  const merged = this.pickSchemaKeys(Object.assign({}, defaults, dbValue), schemaKeys);
685
- if (Value.Check(schema, merged)) return {
723
+ if (this.isValid(schema, merged)) return {
686
724
  value: merged,
687
725
  description: "Auto-migrated: merged with defaults"
688
726
  };
@@ -719,6 +757,21 @@ var ParameterProvider = class {
719
757
  for (const fn of subs) fn(value);
720
758
  }
721
759
  /**
760
+ * Probe whether a value matches the schema, without throwing or mutating.
761
+ */
762
+ isValid(schema, value) {
763
+ try {
764
+ this.schemaValidator.validate(schema, value, {
765
+ trim: false,
766
+ nullToUndefined: false,
767
+ deleteUndefined: false
768
+ });
769
+ return true;
770
+ } catch {
771
+ return false;
772
+ }
773
+ }
774
+ /**
722
775
  * Return a new object containing only keys present in the schema.
723
776
  */
724
777
  pickSchemaKeys(obj, schemaKeys) {