@hilbras/keystone 1.5.0 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (559) hide show
  1. package/CHANGELOG.md +272 -0
  2. package/README.md +59 -25
  3. package/dist/cli.js +25 -27
  4. package/dist/cli.js.map +1 -1
  5. package/dist/config.d.ts +15 -1
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +45 -8
  8. package/dist/config.js.map +1 -1
  9. package/dist/container.d.ts +4 -1
  10. package/dist/container.d.ts.map +1 -1
  11. package/dist/container.js.map +1 -1
  12. package/dist/db/migrations/0008_flashy_firestar.sql +5 -0
  13. package/dist/db/migrations/0009_daffy_changeling.sql +1 -0
  14. package/dist/db/migrations/0010_wealthy_shadow_king.sql +37 -0
  15. package/dist/db/migrations/0011_overrated_vector.sql +18 -0
  16. package/dist/db/migrations/0012_brave_darkhawk.sql +28 -0
  17. package/dist/db/migrations/0013_wonderful_chimera.sql +5 -0
  18. package/dist/db/migrations/0014_magical_morph.sql +48 -0
  19. package/{src/db/migrations/meta/0007_snapshot.json → dist/db/migrations/meta/0008_snapshot.json} +136 -32
  20. package/{src/db/migrations/meta/0006_snapshot.json → dist/db/migrations/meta/0009_snapshot.json} +359 -30
  21. package/{src/db/migrations/meta/0005_snapshot.json → dist/db/migrations/meta/0010_snapshot.json} +459 -29
  22. package/{src/db/migrations/meta/0004_snapshot.json → dist/db/migrations/meta/0011_snapshot.json} +594 -30
  23. package/dist/db/migrations/meta/0012_snapshot.json +3891 -0
  24. package/dist/db/migrations/meta/0013_snapshot.json +3919 -0
  25. package/dist/db/migrations/meta/0014_snapshot.json +4311 -0
  26. package/dist/db/migrations/meta/_journal.json +49 -0
  27. package/dist/db/reencryptOidcSecrets.d.ts +2 -0
  28. package/dist/db/reencryptOidcSecrets.d.ts.map +1 -0
  29. package/dist/db/reencryptOidcSecrets.js +41 -0
  30. package/dist/db/reencryptOidcSecrets.js.map +1 -0
  31. package/dist/db/schema.d.ts +2521 -53
  32. package/dist/db/schema.d.ts.map +1 -1
  33. package/dist/db/schema.js +118 -3
  34. package/dist/db/schema.js.map +1 -1
  35. package/dist/db/seed.js +67 -40
  36. package/dist/db/seed.js.map +1 -1
  37. package/dist/di.d.ts.map +1 -1
  38. package/dist/di.js +11 -3
  39. package/dist/di.js.map +1 -1
  40. package/dist/index.d.ts +2 -2
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +26 -2
  43. package/dist/index.js.map +1 -1
  44. package/dist/lib/errors.d.ts +2 -1
  45. package/dist/lib/errors.d.ts.map +1 -1
  46. package/dist/lib/errors.js +10 -0
  47. package/dist/lib/errors.js.map +1 -1
  48. package/dist/plugins/appContext.d.ts.map +1 -1
  49. package/dist/plugins/appContext.js +3 -12
  50. package/dist/plugins/appContext.js.map +1 -1
  51. package/dist/plugins/audit.d.ts.map +1 -1
  52. package/dist/plugins/audit.js +26 -6
  53. package/dist/plugins/audit.js.map +1 -1
  54. package/dist/plugins/auth.d.ts.map +1 -1
  55. package/dist/plugins/auth.js +32 -7
  56. package/dist/plugins/auth.js.map +1 -1
  57. package/dist/plugins/metrics.d.ts.map +1 -1
  58. package/dist/plugins/mtls.d.ts.map +1 -1
  59. package/dist/plugins/permissions.d.ts.map +1 -1
  60. package/dist/plugins/permissions.js +29 -9
  61. package/dist/plugins/permissions.js.map +1 -1
  62. package/dist/plugins/rateLimit.d.ts +15 -0
  63. package/dist/plugins/rateLimit.d.ts.map +1 -1
  64. package/dist/plugins/rateLimit.js +11 -1
  65. package/dist/plugins/rateLimit.js.map +1 -1
  66. package/dist/plugins/requestLogger.d.ts.map +1 -1
  67. package/dist/repositories/apiKey.d.ts.map +1 -1
  68. package/dist/repositories/application.d.ts.map +1 -1
  69. package/dist/repositories/application.js +1 -1
  70. package/dist/repositories/application.js.map +1 -1
  71. package/dist/repositories/audit.d.ts.map +1 -1
  72. package/dist/repositories/index.d.ts +3 -0
  73. package/dist/repositories/index.d.ts.map +1 -1
  74. package/dist/repositories/index.js +3 -0
  75. package/dist/repositories/index.js.map +1 -1
  76. package/dist/repositories/mfaChallenge.d.ts +23 -0
  77. package/dist/repositories/mfaChallenge.d.ts.map +1 -0
  78. package/dist/repositories/mfaChallenge.js +71 -0
  79. package/dist/repositories/mfaChallenge.js.map +1 -0
  80. package/dist/repositories/oidcConnection.d.ts +27 -43
  81. package/dist/repositories/oidcConnection.d.ts.map +1 -1
  82. package/dist/repositories/oidcConnection.js +15 -6
  83. package/dist/repositories/oidcConnection.js.map +1 -1
  84. package/dist/repositories/organization.d.ts +9 -9
  85. package/dist/repositories/organization.d.ts.map +1 -1
  86. package/dist/repositories/organization.js +91 -37
  87. package/dist/repositories/organization.js.map +1 -1
  88. package/dist/repositories/permission.d.ts.map +1 -1
  89. package/dist/repositories/permission.js +27 -5
  90. package/dist/repositories/permission.js.map +1 -1
  91. package/dist/repositories/samlConnection.d.ts +28 -28
  92. package/dist/repositories/samlConnection.d.ts.map +1 -1
  93. package/dist/repositories/samlConnection.js +12 -4
  94. package/dist/repositories/samlConnection.js.map +1 -1
  95. package/dist/repositories/scimConnection.d.ts +38 -0
  96. package/dist/repositories/scimConnection.d.ts.map +1 -0
  97. package/dist/repositories/scimConnection.js +123 -0
  98. package/dist/repositories/scimConnection.js.map +1 -0
  99. package/dist/repositories/scimGroup.d.ts +36 -0
  100. package/dist/repositories/scimGroup.d.ts.map +1 -0
  101. package/dist/repositories/scimGroup.js +113 -0
  102. package/dist/repositories/scimGroup.js.map +1 -0
  103. package/dist/repositories/session.d.ts +23 -13
  104. package/dist/repositories/session.d.ts.map +1 -1
  105. package/dist/repositories/session.js +13 -1
  106. package/dist/repositories/session.js.map +1 -1
  107. package/dist/repositories/types.d.ts +112 -5
  108. package/dist/repositories/types.d.ts.map +1 -1
  109. package/dist/repositories/types.js +7 -1
  110. package/dist/repositories/types.js.map +1 -1
  111. package/dist/repositories/user.d.ts +23 -1
  112. package/dist/repositories/user.d.ts.map +1 -1
  113. package/dist/repositories/user.js +180 -4
  114. package/dist/repositories/user.js.map +1 -1
  115. package/dist/routes/admin/billing.js +4 -4
  116. package/dist/routes/admin/billing.js.map +1 -1
  117. package/dist/routes/admin/helpers.d.ts +16 -20
  118. package/dist/routes/admin/helpers.d.ts.map +1 -1
  119. package/dist/routes/admin/helpers.js +53 -10
  120. package/dist/routes/admin/helpers.js.map +1 -1
  121. package/dist/routes/admin/organizations.d.ts.map +1 -1
  122. package/dist/routes/admin/organizations.js +76 -69
  123. package/dist/routes/admin/organizations.js.map +1 -1
  124. package/dist/routes/admin/permissions.d.ts.map +1 -1
  125. package/dist/routes/admin/permissions.js +48 -14
  126. package/dist/routes/admin/permissions.js.map +1 -1
  127. package/dist/routes/admin/platform.d.ts.map +1 -1
  128. package/dist/routes/admin/platform.js +86 -35
  129. package/dist/routes/admin/platform.js.map +1 -1
  130. package/dist/routes/admin/sso.d.ts.map +1 -1
  131. package/dist/routes/admin/sso.js +143 -12
  132. package/dist/routes/admin/sso.js.map +1 -1
  133. package/dist/routes/admin/webhooks.js +8 -8
  134. package/dist/routes/admin/webhooks.js.map +1 -1
  135. package/dist/routes/apiKeys.d.ts.map +1 -1
  136. package/dist/routes/apiKeys.js +23 -5
  137. package/dist/routes/apiKeys.js.map +1 -1
  138. package/dist/routes/auth.d.ts.map +1 -1
  139. package/dist/routes/auth.js +112 -22
  140. package/dist/routes/auth.js.map +1 -1
  141. package/dist/routes/authz.d.ts.map +1 -1
  142. package/dist/routes/authz.js +16 -4
  143. package/dist/routes/authz.js.map +1 -1
  144. package/dist/routes/config.d.ts.map +1 -1
  145. package/dist/routes/config.js +16 -14
  146. package/dist/routes/config.js.map +1 -1
  147. package/dist/routes/federation.d.ts.map +1 -1
  148. package/dist/routes/federation.js +17 -3
  149. package/dist/routes/federation.js.map +1 -1
  150. package/dist/routes/magicLinks.d.ts.map +1 -1
  151. package/dist/routes/magicLinks.js +15 -3
  152. package/dist/routes/magicLinks.js.map +1 -1
  153. package/dist/routes/oauth.d.ts.map +1 -1
  154. package/dist/routes/oauth.js +22 -3
  155. package/dist/routes/oauth.js.map +1 -1
  156. package/dist/routes/oauth2.d.ts.map +1 -1
  157. package/dist/routes/oauth2.js +104 -11
  158. package/dist/routes/oauth2.js.map +1 -1
  159. package/dist/routes/oidcEnterprise.d.ts.map +1 -1
  160. package/dist/routes/oidcEnterprise.js +67 -21
  161. package/dist/routes/oidcEnterprise.js.map +1 -1
  162. package/dist/routes/password.d.ts.map +1 -1
  163. package/dist/routes/password.js.map +1 -1
  164. package/dist/routes/profile.js +4 -4
  165. package/dist/routes/profile.js.map +1 -1
  166. package/dist/routes/saml.d.ts +9 -0
  167. package/dist/routes/saml.d.ts.map +1 -1
  168. package/dist/routes/saml.js +187 -11
  169. package/dist/routes/saml.js.map +1 -1
  170. package/dist/routes/scim.d.ts +13 -0
  171. package/dist/routes/scim.d.ts.map +1 -1
  172. package/dist/routes/scim.js +885 -110
  173. package/dist/routes/scim.js.map +1 -1
  174. package/dist/routes/sdk.d.ts.map +1 -1
  175. package/dist/routes/sdk.js +24 -8
  176. package/dist/routes/sdk.js.map +1 -1
  177. package/dist/routes/serviceAccounts.d.ts.map +1 -1
  178. package/dist/routes/serviceAccounts.js +2 -1
  179. package/dist/routes/serviceAccounts.js.map +1 -1
  180. package/dist/routes/setup.d.ts.map +1 -1
  181. package/dist/routes/setup.js +15 -16
  182. package/dist/routes/setup.js.map +1 -1
  183. package/dist/routes/smsOtp.js +1 -1
  184. package/dist/routes/smsOtp.js.map +1 -1
  185. package/dist/routes/totp.d.ts.map +1 -1
  186. package/dist/routes/totp.js +113 -23
  187. package/dist/routes/totp.js.map +1 -1
  188. package/dist/routes/webauthn.d.ts.map +1 -1
  189. package/dist/routes/webauthn.js +44 -8
  190. package/dist/routes/webauthn.js.map +1 -1
  191. package/dist/routes/workflows.d.ts.map +1 -1
  192. package/dist/routes/workflows.js +58 -25
  193. package/dist/routes/workflows.js.map +1 -1
  194. package/dist/sdk/index.d.ts.map +1 -1
  195. package/dist/sdk/index.js +141 -40
  196. package/dist/sdk/index.js.map +1 -1
  197. package/dist/sdk/types.d.ts +60 -29
  198. package/dist/sdk/types.d.ts.map +1 -1
  199. package/dist/services/application/authentication.d.ts +39 -1
  200. package/dist/services/application/authentication.d.ts.map +1 -1
  201. package/dist/services/application/authentication.js +43 -1
  202. package/dist/services/application/authentication.js.map +1 -1
  203. package/dist/services/application/identity.d.ts +10 -7
  204. package/dist/services/application/identity.d.ts.map +1 -1
  205. package/dist/services/application/identity.js +13 -10
  206. package/dist/services/application/identity.js.map +1 -1
  207. package/dist/services/application/organization.d.ts +11 -7
  208. package/dist/services/application/organization.d.ts.map +1 -1
  209. package/dist/services/application/organization.js +160 -12
  210. package/dist/services/application/organization.js.map +1 -1
  211. package/dist/services/applications.js +2 -2
  212. package/dist/services/applications.js.map +1 -1
  213. package/dist/services/audit.d.ts +1 -0
  214. package/dist/services/audit.d.ts.map +1 -1
  215. package/dist/services/audit.js +13 -0
  216. package/dist/services/audit.js.map +1 -1
  217. package/dist/services/cache.d.ts.map +1 -1
  218. package/dist/services/configuration/profiles.d.ts +4 -0
  219. package/dist/services/configuration/profiles.d.ts.map +1 -1
  220. package/dist/services/configuration/profiles.js +50 -0
  221. package/dist/services/configuration/profiles.js.map +1 -1
  222. package/dist/services/configuration.d.ts.map +1 -1
  223. package/dist/services/configuration.js.map +1 -1
  224. package/dist/services/connectors/google.d.ts.map +1 -1
  225. package/dist/services/connectors/google.js +3 -2
  226. package/dist/services/connectors/google.js.map +1 -1
  227. package/dist/services/connectors/oidc.d.ts.map +1 -1
  228. package/dist/services/connectors/oidc.js +6 -3
  229. package/dist/services/connectors/oidc.js.map +1 -1
  230. package/dist/services/connectors/zitadel.d.ts.map +1 -1
  231. package/dist/services/connectors/zitadel.js +4 -3
  232. package/dist/services/connectors/zitadel.js.map +1 -1
  233. package/dist/services/domain/authentication.d.ts +43 -4
  234. package/dist/services/domain/authentication.d.ts.map +1 -1
  235. package/dist/services/domain/authentication.js +82 -20
  236. package/dist/services/domain/authentication.js.map +1 -1
  237. package/dist/services/domain/authorization.d.ts +11 -0
  238. package/dist/services/domain/authorization.d.ts.map +1 -1
  239. package/dist/services/domain/authorization.js +36 -1
  240. package/dist/services/domain/authorization.js.map +1 -1
  241. package/dist/services/domain/identity.d.ts +21 -9
  242. package/dist/services/domain/identity.d.ts.map +1 -1
  243. package/dist/services/domain/identity.js +187 -10
  244. package/dist/services/domain/identity.js.map +1 -1
  245. package/dist/services/domain/organization.d.ts +6 -9
  246. package/dist/services/domain/organization.d.ts.map +1 -1
  247. package/dist/services/domain/organization.js +48 -30
  248. package/dist/services/domain/organization.js.map +1 -1
  249. package/dist/services/emailVerification.d.ts +2 -2
  250. package/dist/services/enterpriseSso.d.ts +13 -6
  251. package/dist/services/enterpriseSso.d.ts.map +1 -1
  252. package/dist/services/enterpriseSso.js +75 -6
  253. package/dist/services/enterpriseSso.js.map +1 -1
  254. package/dist/services/events/subscribers/auditLog.js +1 -1
  255. package/dist/services/events/subscribers/auditLog.js.map +1 -1
  256. package/dist/services/events/types.d.ts +7 -1
  257. package/dist/services/events/types.d.ts.map +1 -1
  258. package/dist/services/events/types.js.map +1 -1
  259. package/dist/services/events/validate.d.ts.map +1 -1
  260. package/dist/services/events/validate.js +27 -0
  261. package/dist/services/events/validate.js.map +1 -1
  262. package/dist/services/features.d.ts.map +1 -1
  263. package/dist/services/features.js.map +1 -1
  264. package/dist/services/federation.d.ts +6 -1
  265. package/dist/services/federation.d.ts.map +1 -1
  266. package/dist/services/federation.js +31 -4
  267. package/dist/services/federation.js.map +1 -1
  268. package/dist/services/ipControls.js +2 -2
  269. package/dist/services/ipControls.js.map +1 -1
  270. package/dist/services/magicLinks.d.ts +2 -2
  271. package/dist/services/mfa.d.ts +53 -0
  272. package/dist/services/mfa.d.ts.map +1 -0
  273. package/dist/services/mfa.js +157 -0
  274. package/dist/services/mfa.js.map +1 -0
  275. package/dist/services/oauth2.d.ts +16 -12
  276. package/dist/services/oauth2.d.ts.map +1 -1
  277. package/dist/services/oauth2.js +22 -13
  278. package/dist/services/oauth2.js.map +1 -1
  279. package/dist/services/oidcSecretFormat.d.ts +3 -0
  280. package/dist/services/oidcSecretFormat.d.ts.map +1 -0
  281. package/dist/services/oidcSecretFormat.js +5 -0
  282. package/dist/services/oidcSecretFormat.js.map +1 -0
  283. package/dist/services/organizations.d.ts +4 -16
  284. package/dist/services/organizations.d.ts.map +1 -1
  285. package/dist/services/organizations.js +0 -62
  286. package/dist/services/organizations.js.map +1 -1
  287. package/dist/services/permissions.d.ts.map +1 -1
  288. package/dist/services/permissions.js +9 -1
  289. package/dist/services/permissions.js.map +1 -1
  290. package/dist/services/plugins/registry.d.ts.map +1 -1
  291. package/dist/services/plugins/registry.js.map +1 -1
  292. package/dist/services/plugins/types.d.ts.map +1 -1
  293. package/dist/services/queue/bullmq.d.ts.map +1 -1
  294. package/dist/services/queue/inProcess.d.ts.map +1 -1
  295. package/dist/services/redis.d.ts +1 -1
  296. package/dist/services/redis.d.ts.map +1 -1
  297. package/dist/services/scimCredentials.d.ts +46 -0
  298. package/dist/services/scimCredentials.d.ts.map +1 -0
  299. package/dist/services/scimCredentials.js +123 -0
  300. package/dist/services/scimCredentials.js.map +1 -0
  301. package/dist/services/scimLegacyMigration.d.ts +12 -0
  302. package/dist/services/scimLegacyMigration.d.ts.map +1 -0
  303. package/dist/services/scimLegacyMigration.js +44 -0
  304. package/dist/services/scimLegacyMigration.js.map +1 -0
  305. package/dist/services/secrets/awsKms.d.ts +2 -2
  306. package/dist/services/secrets/awsKms.d.ts.map +1 -1
  307. package/dist/services/secrets/awsKms.js +3 -5
  308. package/dist/services/secrets/awsKms.js.map +1 -1
  309. package/dist/services/secrets/azureKeyVault.d.ts.map +1 -1
  310. package/dist/services/secrets/database.d.ts.map +1 -1
  311. package/dist/services/secrets/database.js.map +1 -1
  312. package/dist/services/secrets/environment.d.ts.map +1 -1
  313. package/dist/services/secrets/environment.js.map +1 -1
  314. package/dist/services/secrets/index.d.ts.map +1 -1
  315. package/dist/services/secrets/password.d.ts.map +1 -1
  316. package/dist/services/secrets/password.js +0 -4
  317. package/dist/services/secrets/password.js.map +1 -1
  318. package/dist/services/secrets/provider.d.ts +2 -3
  319. package/dist/services/secrets/provider.d.ts.map +1 -1
  320. package/dist/services/secrets/vault.d.ts.map +1 -1
  321. package/dist/services/setup/configWriter.d.ts.map +1 -1
  322. package/dist/services/setup/configWriter.js.map +1 -1
  323. package/dist/services/ssoEndpointPolicy.d.ts +8 -0
  324. package/dist/services/ssoEndpointPolicy.d.ts.map +1 -0
  325. package/dist/services/ssoEndpointPolicy.js +136 -0
  326. package/dist/services/ssoEndpointPolicy.js.map +1 -0
  327. package/dist/services/stepUp.d.ts +35 -0
  328. package/dist/services/stepUp.d.ts.map +1 -0
  329. package/dist/services/stepUp.js +65 -0
  330. package/dist/services/stepUp.js.map +1 -0
  331. package/dist/services/tokens.d.ts +37 -11
  332. package/dist/services/tokens.d.ts.map +1 -1
  333. package/dist/services/tokens.js +75 -14
  334. package/dist/services/tokens.js.map +1 -1
  335. package/dist/services/totp.d.ts +46 -0
  336. package/dist/services/totp.d.ts.map +1 -1
  337. package/dist/services/totp.js +178 -41
  338. package/dist/services/totp.js.map +1 -1
  339. package/dist/services/users.d.ts +20 -12
  340. package/dist/services/users.d.ts.map +1 -1
  341. package/dist/services/users.js +24 -51
  342. package/dist/services/users.js.map +1 -1
  343. package/dist/services/webauthn.d.ts +8 -4
  344. package/dist/services/webauthn.d.ts.map +1 -1
  345. package/dist/services/webauthn.js +4 -4
  346. package/dist/services/webauthn.js.map +1 -1
  347. package/dist/services/webhooks.d.ts +20 -20
  348. package/dist/services/workflows/engine.d.ts +4 -2
  349. package/dist/services/workflows/engine.d.ts.map +1 -1
  350. package/dist/services/workflows/engine.js +181 -12
  351. package/dist/services/workflows/engine.js.map +1 -1
  352. package/dist/services/workflows/steps.d.ts +2 -0
  353. package/dist/services/workflows/steps.d.ts.map +1 -1
  354. package/dist/services/workflows/steps.js +8 -75
  355. package/dist/services/workflows/steps.js.map +1 -1
  356. package/dist/setup-server.js.map +1 -1
  357. package/dist/types.d.ts +33 -4
  358. package/dist/types.d.ts.map +1 -1
  359. package/dist/types.js +26 -2
  360. package/dist/types.js.map +1 -1
  361. package/package.json +26 -3
  362. package/dist/tests/errors.test.d.ts +0 -2
  363. package/dist/tests/errors.test.d.ts.map +0 -1
  364. package/dist/tests/errors.test.js +0 -64
  365. package/dist/tests/errors.test.js.map +0 -1
  366. package/dist/tests/events.test.d.ts +0 -2
  367. package/dist/tests/events.test.d.ts.map +0 -1
  368. package/dist/tests/events.test.js +0 -45
  369. package/dist/tests/events.test.js.map +0 -1
  370. package/dist/tests/featureFlags.test.d.ts +0 -2
  371. package/dist/tests/featureFlags.test.d.ts.map +0 -1
  372. package/dist/tests/featureFlags.test.js +0 -24
  373. package/dist/tests/featureFlags.test.js.map +0 -1
  374. package/dist/tests/integration/queue.test.d.ts +0 -2
  375. package/dist/tests/integration/queue.test.d.ts.map +0 -1
  376. package/dist/tests/integration/queue.test.js +0 -49
  377. package/dist/tests/integration/queue.test.js.map +0 -1
  378. package/dist/tests/plugins.test.d.ts +0 -2
  379. package/dist/tests/plugins.test.d.ts.map +0 -1
  380. package/dist/tests/plugins.test.js +0 -56
  381. package/dist/tests/plugins.test.js.map +0 -1
  382. package/dist/tests/result.test.d.ts +0 -2
  383. package/dist/tests/result.test.d.ts.map +0 -1
  384. package/dist/tests/result.test.js +0 -46
  385. package/dist/tests/result.test.js.map +0 -1
  386. package/dist/tests/setup/configWriter.test.d.ts +0 -2
  387. package/dist/tests/setup/configWriter.test.d.ts.map +0 -1
  388. package/dist/tests/setup/configWriter.test.js +0 -55
  389. package/dist/tests/setup/configWriter.test.js.map +0 -1
  390. package/dist/tests/setup/validation.test.d.ts +0 -2
  391. package/dist/tests/setup/validation.test.d.ts.map +0 -1
  392. package/dist/tests/setup/validation.test.js +0 -26
  393. package/dist/tests/setup/validation.test.js.map +0 -1
  394. package/dist/tests/smoke.test.d.ts +0 -2
  395. package/dist/tests/smoke.test.d.ts.map +0 -1
  396. package/dist/tests/smoke.test.js +0 -124
  397. package/dist/tests/smoke.test.js.map +0 -1
  398. package/src/cli.ts +0 -172
  399. package/src/config.ts +0 -143
  400. package/src/container.ts +0 -48
  401. package/src/db/index.ts +0 -53
  402. package/src/db/migrations/0000_skinny_ben_parker.sql +0 -553
  403. package/src/db/migrations/0001_brief_joseph.sql +0 -10
  404. package/src/db/migrations/0002_add_account_lockout.sql +0 -3
  405. package/src/db/migrations/0003_steep_rachel_grey.sql +0 -1
  406. package/src/db/migrations/0004_clever_bill_hollister.sql +0 -20
  407. package/src/db/migrations/0005_steep_the_call.sql +0 -2
  408. package/src/db/migrations/0006_ambitious_boomer.sql +0 -17
  409. package/src/db/migrations/0007_greedy_vindicator.sql +0 -40
  410. package/src/db/migrations/meta/0000_snapshot.json +0 -2964
  411. package/src/db/migrations/meta/0001_snapshot.json +0 -3031
  412. package/src/db/migrations/meta/0003_snapshot.json +0 -3051
  413. package/src/db/migrations/meta/_journal.json +0 -62
  414. package/src/db/schema.ts +0 -676
  415. package/src/db/seed.ts +0 -146
  416. package/src/di.ts +0 -81
  417. package/src/index.ts +0 -326
  418. package/src/lib/errors.ts +0 -139
  419. package/src/lib/result.ts +0 -44
  420. package/src/lib/webhookSignature.ts +0 -41
  421. package/src/plugins/appContext.ts +0 -76
  422. package/src/plugins/audit.ts +0 -42
  423. package/src/plugins/auth.ts +0 -230
  424. package/src/plugins/metrics.ts +0 -41
  425. package/src/plugins/mtls.ts +0 -94
  426. package/src/plugins/permissions.ts +0 -29
  427. package/src/plugins/rateLimit.ts +0 -133
  428. package/src/plugins/requestLogger.ts +0 -25
  429. package/src/plugins/tracing.ts +0 -22
  430. package/src/repositories/apiKey.ts +0 -158
  431. package/src/repositories/application.ts +0 -70
  432. package/src/repositories/audit.ts +0 -32
  433. package/src/repositories/index.ts +0 -9
  434. package/src/repositories/oidcConnection.ts +0 -111
  435. package/src/repositories/organization.ts +0 -167
  436. package/src/repositories/permission.ts +0 -153
  437. package/src/repositories/samlConnection.ts +0 -96
  438. package/src/repositories/session.ts +0 -86
  439. package/src/repositories/types.ts +0 -134
  440. package/src/repositories/user.ts +0 -161
  441. package/src/routes/admin/billing.ts +0 -48
  442. package/src/routes/admin/helpers.ts +0 -50
  443. package/src/routes/admin/index.ts +0 -16
  444. package/src/routes/admin/organizations.ts +0 -299
  445. package/src/routes/admin/permissions.ts +0 -80
  446. package/src/routes/admin/platform.ts +0 -335
  447. package/src/routes/admin/sso.ts +0 -138
  448. package/src/routes/admin/webhooks.ts +0 -73
  449. package/src/routes/admin.ts +0 -1
  450. package/src/routes/apiKeys.ts +0 -60
  451. package/src/routes/auth.ts +0 -214
  452. package/src/routes/authz.ts +0 -38
  453. package/src/routes/config.ts +0 -67
  454. package/src/routes/emailVerification.ts +0 -73
  455. package/src/routes/federation.ts +0 -156
  456. package/src/routes/helpers.ts +0 -17
  457. package/src/routes/magicLinks.ts +0 -107
  458. package/src/routes/oauth.ts +0 -167
  459. package/src/routes/oauth2.ts +0 -284
  460. package/src/routes/oidcEnterprise.ts +0 -166
  461. package/src/routes/password.ts +0 -90
  462. package/src/routes/profile.ts +0 -44
  463. package/src/routes/saml.ts +0 -209
  464. package/src/routes/scim.ts +0 -199
  465. package/src/routes/sdk.ts +0 -141
  466. package/src/routes/serviceAccounts.ts +0 -124
  467. package/src/routes/sessions.ts +0 -62
  468. package/src/routes/setup.ts +0 -315
  469. package/src/routes/smsOtp.ts +0 -67
  470. package/src/routes/totp.ts +0 -122
  471. package/src/routes/webauthn.ts +0 -147
  472. package/src/routes/workflows.ts +0 -157
  473. package/src/sdk/index.ts +0 -152
  474. package/src/sdk/types.ts +0 -54
  475. package/src/services/anomalyDetection.ts +0 -73
  476. package/src/services/application/authentication.ts +0 -75
  477. package/src/services/application/identity.ts +0 -56
  478. package/src/services/application/index.ts +0 -3
  479. package/src/services/application/organization.ts +0 -77
  480. package/src/services/applications.ts +0 -89
  481. package/src/services/audit.ts +0 -41
  482. package/src/services/auditExport.ts +0 -59
  483. package/src/services/billing.ts +0 -87
  484. package/src/services/cache.ts +0 -131
  485. package/src/services/configuration/profiles.ts +0 -115
  486. package/src/services/configuration.ts +0 -120
  487. package/src/services/connectors/google.ts +0 -92
  488. package/src/services/connectors/oidc.ts +0 -111
  489. package/src/services/connectors/registry.ts +0 -124
  490. package/src/services/connectors/types.ts +0 -38
  491. package/src/services/connectors/zitadel.ts +0 -77
  492. package/src/services/devices.ts +0 -76
  493. package/src/services/domain/authentication.ts +0 -279
  494. package/src/services/domain/authorization.ts +0 -49
  495. package/src/services/domain/identity.ts +0 -108
  496. package/src/services/domain/index.ts +0 -4
  497. package/src/services/domain/organization.ts +0 -114
  498. package/src/services/email.ts +0 -167
  499. package/src/services/emailVerification.ts +0 -75
  500. package/src/services/enterpriseSso.ts +0 -58
  501. package/src/services/events/bus.ts +0 -43
  502. package/src/services/events/subscribers/anomaly.ts +0 -13
  503. package/src/services/events/subscribers/auditLog.ts +0 -21
  504. package/src/services/events/subscribers/webhook.ts +0 -39
  505. package/src/services/events/subscribers/webhookDispatch.ts +0 -14
  506. package/src/services/events/types.ts +0 -106
  507. package/src/services/events/validate.ts +0 -118
  508. package/src/services/featureFlags.ts +0 -90
  509. package/src/services/features.ts +0 -22
  510. package/src/services/federation.ts +0 -30
  511. package/src/services/hibp.ts +0 -28
  512. package/src/services/ipControls.ts +0 -99
  513. package/src/services/magicLinks.ts +0 -51
  514. package/src/services/oauth2.ts +0 -216
  515. package/src/services/organizations.ts +0 -171
  516. package/src/services/permissions.ts +0 -146
  517. package/src/services/plugins/registry.ts +0 -242
  518. package/src/services/plugins/types.ts +0 -98
  519. package/src/services/queue/bullmq.ts +0 -104
  520. package/src/services/queue/inProcess.ts +0 -75
  521. package/src/services/queue/index.ts +0 -19
  522. package/src/services/queue/types.ts +0 -26
  523. package/src/services/redis.ts +0 -16
  524. package/src/services/secrets/awsKms.ts +0 -97
  525. package/src/services/secrets/azureKeyVault.ts +0 -171
  526. package/src/services/secrets/database.ts +0 -166
  527. package/src/services/secrets/environment.ts +0 -117
  528. package/src/services/secrets/index.ts +0 -50
  529. package/src/services/secrets/password.ts +0 -73
  530. package/src/services/secrets/provider.ts +0 -36
  531. package/src/services/secrets/vault.ts +0 -149
  532. package/src/services/secrets.ts +0 -2
  533. package/src/services/serviceAccounts.ts +0 -74
  534. package/src/services/setup/configWriter.ts +0 -200
  535. package/src/services/setup/diagnostics.ts +0 -76
  536. package/src/services/setup/token.ts +0 -42
  537. package/src/services/setup/types.ts +0 -40
  538. package/src/services/setup/validation.ts +0 -205
  539. package/src/services/sms.ts +0 -81
  540. package/src/services/smsOtp.ts +0 -74
  541. package/src/services/tokens.ts +0 -287
  542. package/src/services/totp.ts +0 -113
  543. package/src/services/users.ts +0 -239
  544. package/src/services/webauthn.ts +0 -193
  545. package/src/services/webhooks.ts +0 -190
  546. package/src/services/workflows/engine.ts +0 -125
  547. package/src/services/workflows/steps.ts +0 -129
  548. package/src/services/zitadel.ts +0 -277
  549. package/src/setup-server.ts +0 -71
  550. package/src/tests/errors.test.ts +0 -74
  551. package/src/tests/events.test.ts +0 -52
  552. package/src/tests/featureFlags.test.ts +0 -26
  553. package/src/tests/integration/queue.test.ts +0 -54
  554. package/src/tests/plugins.test.ts +0 -73
  555. package/src/tests/result.test.ts +0 -52
  556. package/src/tests/setup/configWriter.test.ts +0 -69
  557. package/src/tests/setup/validation.test.ts +0 -29
  558. package/src/tests/smoke.test.ts +0 -136
  559. package/src/types.ts +0 -70
@@ -1,56 +0,0 @@
1
- import type { IdentityDomainService } from "../domain/identity.js";
2
- import type { User } from "../../db/schema.js";
3
- import type { Result } from "../../lib/result.js";
4
-
5
- export class IdentityApplicationService {
6
- constructor(private readonly domain: IdentityDomainService) {}
7
-
8
- async findUser(id: string): Promise<Result<User>> {
9
- return this.domain.findUser(id);
10
- }
11
-
12
- async findUserByEmail(email: string): Promise<Result<User>> {
13
- return this.domain.findUserByEmail(email);
14
- }
15
-
16
- async upsertInvitedUser(input: { email: string; name?: string; username?: string }): Promise<Result<User>> {
17
- return this.domain.upsertInvitedUser(input);
18
- }
19
-
20
- async updateUserProfile(
21
- userId: string,
22
- updates: Partial<{ name: string; username: string; role: string; emailVerified: boolean }>
23
- ): Promise<Result<User>> {
24
- return this.domain.updateUserProfile(userId, updates);
25
- }
26
-
27
- async deactivate(userId: string): Promise<Result<void>> {
28
- return this.domain.deactivate(userId);
29
- }
30
-
31
- async listOrganizationUsers(orgId: string): Promise<User[]> {
32
- return this.domain.listOrganizationUsers(orgId);
33
- }
34
-
35
- async linkUserIdentity(
36
- userId: string,
37
- providerId: string,
38
- providerType: string,
39
- externalSub: string,
40
- email?: string
41
- ): Promise<Result<void>> {
42
- return this.domain.linkUserIdentity(userId, providerId, providerType, externalSub, email);
43
- }
44
-
45
- async getFederationAuthorizeUrl(provider: string, state: string, redirectUri: string): Promise<Result<{ url: string }>> {
46
- return this.domain.getFederationAuthorizeUrl(provider, state, redirectUri);
47
- }
48
-
49
- async completeFederationLogin(
50
- provider: string,
51
- code: string,
52
- redirectUri: string
53
- ): Promise<Result<{ user: User; tokens: { accessToken: string; refreshToken: string } }>> {
54
- return this.domain.completeFederationLogin(provider, code, redirectUri);
55
- }
56
- }
@@ -1,3 +0,0 @@
1
- export { AuthenticationApplicationService } from "./authentication.js";
2
- export { IdentityApplicationService } from "./identity.js";
3
- export { OrganizationApplicationService } from "./organization.js";
@@ -1,77 +0,0 @@
1
- import type { OrganizationDomainService } from "../domain/organization.js";
2
- import type { AuthorizationDomainService, OrgRole } from "../domain/authorization.js";
3
- import type { IdentityDomainService } from "../domain/identity.js";
4
- import type { Organization, Application, OrgMembership } from "../../db/schema.js";
5
- import type { Result } from "../../lib/result.js";
6
-
7
- export class OrganizationApplicationService {
8
- constructor(
9
- private readonly domain: OrganizationDomainService,
10
- private readonly authorization: AuthorizationDomainService,
11
- private readonly identity: IdentityDomainService
12
- ) {}
13
-
14
- async createOrganization(
15
- userId: string,
16
- input: { name: string; slug?: string; plan?: string }
17
- ): Promise<Result<Organization>> {
18
- return this.domain.createOrganization(input, userId);
19
- }
20
-
21
- async getOrganization(userId: string, orgId: string): Promise<Result<Organization>> {
22
- const membership = await this.authorization.isOrgMember(userId, orgId);
23
- if (!membership) return { success: false, error: { code: "NOT_MEMBER", message: "Not a member", statusCode: 403 } };
24
- return this.domain.getOrganization(orgId);
25
- }
26
-
27
- async listUserOrganizations(userId: string): Promise<Organization[]> {
28
- return this.domain.listUserOrganizations(userId);
29
- }
30
-
31
- async inviteMember(
32
- actorId: string,
33
- orgId: string,
34
- input: { email: string; role: OrgRole }
35
- ): Promise<Result<{ user: { id: string }; membership: OrgMembership }>> {
36
- const roleCheck = await this.authorization.requireOrgRole(actorId, orgId, ["owner", "admin"]);
37
- if (!roleCheck.success) return roleCheck;
38
-
39
- const userResult = await this.identity.upsertInvitedUser({ email: input.email });
40
- if (!userResult.success) return userResult;
41
-
42
- const membershipResult = await this.domain.addOrgMembership({ orgId, userId: userResult.data.id, role: input.role });
43
- if (!membershipResult.success) return membershipResult;
44
-
45
- return { success: true, data: { user: userResult.data, membership: membershipResult.data } };
46
- }
47
-
48
- async createApplication(
49
- actorId: string,
50
- orgId: string,
51
- input: { name: string; redirectUris?: string[]; allowedOrigins?: string[] }
52
- ): Promise<Result<Application & { clientSecret: string }>> {
53
- const permCheck = await this.authorization.requireOrgRole(actorId, orgId, ["owner", "admin"]);
54
- if (!permCheck.success) return permCheck;
55
- return this.domain.createApplication({ orgId, ...input });
56
- }
57
-
58
- async listOrganizationApplications(
59
- actorId: string,
60
- orgId: string
61
- ): Promise<Result<Application[]>> {
62
- const roleCheck = await this.authorization.requireOrgRole(actorId, orgId, ["owner", "admin", "member"]);
63
- if (!roleCheck.success) return roleCheck;
64
- return { success: true, data: await this.domain.listOrganizationApplications(orgId) };
65
- }
66
-
67
- async updateApplication(
68
- actorId: string,
69
- orgId: string,
70
- appId: string,
71
- updates: Partial<{ name: string; redirectUris: string[]; allowedOrigins: string[]; allowedIps: string[]; blockedIps: string[]; isActive: boolean }>
72
- ): Promise<Result<Application>> {
73
- const permCheck = await this.authorization.requireOrgRole(actorId, orgId, ["owner", "admin"]);
74
- if (!permCheck.success) return permCheck;
75
- return this.domain.updateApplication(appId, orgId, updates);
76
- }
77
- }
@@ -1,89 +0,0 @@
1
- import crypto from "node:crypto";
2
- import { eq, and } from "drizzle-orm";
3
- import { db } from "../db/index.js";
4
- import { applications, type Application } from "../db/schema.js";
5
- import { generateClientSecret, hashClientSecret } from "./secrets.js";
6
- import { cache } from "./cache.js";
7
-
8
- function appCacheKey(clientId: string): string {
9
- return `app:clientId:${clientId}`;
10
- }
11
-
12
- export function generateClientId(): string {
13
- return `app_${crypto.randomBytes(16).toString("base64url")}`;
14
- }
15
-
16
- // Re-exported for callers that imported these helpers from this module.
17
- export { generateClientSecret, hashClientSecret };
18
-
19
- export async function createApplication(input: {
20
- orgId: string;
21
- name: string;
22
- redirectUris?: string[];
23
- allowedOrigins?: string[];
24
- clientId?: string;
25
- clientSecret?: string;
26
- }): Promise<Application & { clientSecret: string }> {
27
- const clientSecret = input.clientSecret || generateClientSecret();
28
- const [app] = await db
29
- .insert(applications)
30
- .values({
31
- orgId: input.orgId,
32
- clientId: input.clientId || generateClientId(),
33
- clientSecretHash: hashClientSecret(clientSecret),
34
- name: input.name,
35
- redirectUris: input.redirectUris ?? [],
36
- allowedOrigins: input.allowedOrigins ?? [],
37
- })
38
- .returning();
39
- return { ...app, clientSecret };
40
- }
41
-
42
- export async function findApplicationByClientId(
43
- clientId: string
44
- ): Promise<Application | undefined> {
45
- const cached = await cache.get<Application>(appCacheKey(clientId));
46
- if (cached) return cached;
47
-
48
- const [app] = await db
49
- .select()
50
- .from(applications)
51
- .where(eq(applications.clientId, clientId))
52
- .limit(1);
53
- if (app) await cache.set(appCacheKey(clientId), app, 60);
54
- return app;
55
- }
56
-
57
- export async function findApplicationsByOrgId(orgId: string): Promise<Application[]> {
58
- return db.select().from(applications).where(eq(applications.orgId, orgId));
59
- }
60
-
61
- export async function updateApplication(
62
- appId: string,
63
- orgId: string,
64
- updates: Partial<{
65
- name: string;
66
- redirectUris: string[];
67
- allowedOrigins: string[];
68
- isActive: boolean;
69
- branding: Record<string, unknown>;
70
- }>
71
- ): Promise<Application | undefined> {
72
- const [updated] = await db
73
- .update(applications)
74
- .set(updates)
75
- .where(and(eq(applications.id, appId), eq(applications.orgId, orgId)))
76
- .returning();
77
- if (updated) await cache.del(appCacheKey(updated.clientId));
78
- return updated;
79
- }
80
-
81
- export async function verifyClientSecret(
82
- clientId: string,
83
- secret: string
84
- ): Promise<Application | undefined> {
85
- const app = await findApplicationByClientId(clientId);
86
- if (!app || !app.isActive) return undefined;
87
- if (app.clientSecretHash !== hashClientSecret(secret)) return undefined;
88
- return app;
89
- }
@@ -1,41 +0,0 @@
1
- import { eq, and, desc, sql } from "drizzle-orm";
2
- import { db } from "../db/index.js";
3
- import { auditLog } from "../db/schema.js";
4
- import { emit } from "./events/bus.js";
5
- import type { AuditEventType, EventPayload } from "./events/types.js";
6
-
7
- export type AuditEvent = AuditEventType;
8
-
9
- export interface AuditInput extends EventPayload {
10
- event: AuditEvent;
11
- }
12
-
13
- export async function audit(input: AuditInput): Promise<void> {
14
- await emit({ type: input.event, version: 1, payload: input });
15
- }
16
-
17
- export async function listAuditLogs(opts: {
18
- orgId?: string;
19
- appId?: string;
20
- userId?: string;
21
- event?: string;
22
- limit?: number;
23
- offset?: number;
24
- }): Promise<typeof auditLog.$inferSelect[]> {
25
- const limit = opts.limit ?? 50;
26
- const offset = opts.offset ?? 0;
27
-
28
- const conditions = [];
29
- if (opts.orgId) conditions.push(eq(auditLog.orgId, opts.orgId));
30
- if (opts.appId) conditions.push(eq(auditLog.appId, opts.appId));
31
- if (opts.userId) conditions.push(eq(auditLog.userId, opts.userId));
32
- if (opts.event) conditions.push(eq(auditLog.event, opts.event));
33
-
34
- return db
35
- .select()
36
- .from(auditLog)
37
- .where(conditions.length ? and(...conditions) : sql`true`)
38
- .orderBy(desc(auditLog.createdAt))
39
- .limit(limit)
40
- .offset(offset);
41
- }
@@ -1,59 +0,0 @@
1
- import { config } from "../config.js";
2
- import type { AuditEvent } from "./audit.js";
3
-
4
- export interface AuditExportRecord {
5
- event: AuditEvent;
6
- userId?: string;
7
- orgId?: string;
8
- appId?: string;
9
- ip?: string;
10
- userAgent?: string;
11
- metadata?: Record<string, unknown>;
12
- createdAt: Date;
13
- }
14
-
15
- export interface AuditSink {
16
- send(record: AuditExportRecord): Promise<void>;
17
- }
18
-
19
- class WebhookSink implements AuditSink {
20
- private url: string;
21
-
22
- constructor(url: string) {
23
- this.url = url;
24
- }
25
-
26
- async send(record: AuditExportRecord): Promise<void> {
27
- await fetch(this.url, {
28
- method: "POST",
29
- headers: { "Content-Type": "application/json" },
30
- body: JSON.stringify(record),
31
- });
32
- }
33
- }
34
-
35
- class ConsoleSink implements AuditSink {
36
- async send(record: AuditExportRecord): Promise<void> {
37
- console.log("[audit-export]", JSON.stringify(record));
38
- }
39
- }
40
-
41
- function createSinks(): AuditSink[] {
42
- const sinks: AuditSink[] = [];
43
- const webhookUrl = config.AUDIT_WEBHOOK_URL || process.env.AUDIT_WEBHOOK_URL;
44
- if (webhookUrl) {
45
- sinks.push(new WebhookSink(webhookUrl));
46
- }
47
- if (config.AUDIT_CONSOLE_EXPORT === "true" || process.env.AUDIT_CONSOLE_EXPORT === "true") {
48
- sinks.push(new ConsoleSink());
49
- }
50
- return sinks;
51
- }
52
-
53
- export const auditSinks = createSinks();
54
-
55
- export async function exportAuditRecord(record: AuditExportRecord): Promise<void> {
56
- await Promise.all(auditSinks.map((sink) => sink.send(record).catch((err: unknown) => {
57
- console.error("[audit-export] sink failed:", err);
58
- })));
59
- }
@@ -1,87 +0,0 @@
1
- import { eq, and, gte, count } from "drizzle-orm";
2
- import { db } from "../db/index.js";
3
- import { organizations, auditLog, orgMemberships, applications } from "../db/schema.js";
4
- import { getBillingProviderFactory } from "./plugins/registry.js";
5
-
6
- const DEFAULT_PLANS = ["free", "starter", "growth", "enterprise"];
7
-
8
- export function listPlans(): Array<{ id: string; name: string; description: string }> {
9
- return [
10
- { id: "free", name: "Free", description: "Core authentication for small projects." },
11
- { id: "starter", name: "Starter", description: "Email delivery, workflows, and API keys." },
12
- { id: "growth", name: "Growth", description: "SSO, SCIM, and priority queue workers." },
13
- { id: "enterprise", name: "Enterprise", description: "Custom SLAs, dedicated support, and advanced audit." },
14
- ];
15
- }
16
-
17
- export function isValidPlan(plan: string): boolean {
18
- return DEFAULT_PLANS.includes(plan);
19
- }
20
-
21
- export interface BillingSummary {
22
- plan: string;
23
- provider?: string;
24
- subscription?: Record<string, unknown>;
25
- usage?: {
26
- users: number;
27
- applications: number;
28
- logins30d: number;
29
- signups30d: number;
30
- };
31
- }
32
-
33
- export async function getBillingSummary(orgId: string): Promise<BillingSummary> {
34
- const [org] = await db.select({ plan: organizations.plan }).from(organizations).where(eq(organizations.id, orgId)).limit(1);
35
- if (!org) {
36
- throw Object.assign(new Error("Organization not found"), { statusCode: 404 });
37
- }
38
-
39
- const since = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000);
40
- const [[memberRow], [appRow], [loginRow], [signupRow]] = await Promise.all([
41
- db.select({ total: count() }).from(orgMemberships).where(eq(orgMemberships.orgId, orgId)),
42
- db.select({ total: count() }).from(applications).where(eq(applications.orgId, orgId)),
43
- db
44
- .select({ total: count() })
45
- .from(auditLog)
46
- .where(and(eq(auditLog.orgId, orgId), eq(auditLog.event, "user_login"), gte(auditLog.createdAt, since))),
47
- db
48
- .select({ total: count() })
49
- .from(auditLog)
50
- .where(and(eq(auditLog.orgId, orgId), eq(auditLog.event, "user_registered"), gte(auditLog.createdAt, since))),
51
- ]);
52
-
53
- const usage = {
54
- users: memberRow?.total ?? 0,
55
- applications: appRow?.total ?? 0,
56
- logins30d: loginRow?.total ?? 0,
57
- signups30d: signupRow?.total ?? 0,
58
- };
59
-
60
- const factory = getBillingProviderFactory(process.env.KEYSTONE_BILLING_PROVIDER || "none");
61
- if (!factory) {
62
- return { plan: org.plan, usage };
63
- }
64
- const provider = factory();
65
- const subscription = await provider.getSubscription(orgId).catch(() => null);
66
- return { plan: org.plan, provider: provider.name, subscription: subscription ?? undefined, usage };
67
- }
68
-
69
- export async function setOrganizationPlan(orgId: string, plan: string): Promise<{ plan: string }> {
70
- if (!isValidPlan(plan)) {
71
- throw Object.assign(new Error("Invalid plan"), { statusCode: 400 });
72
- }
73
- const [org] = await db.update(organizations).set({ plan, updatedAt: new Date() }).where(eq(organizations.id, orgId)).returning();
74
- if (!org) {
75
- throw Object.assign(new Error("Organization not found"), { statusCode: 404 });
76
- }
77
- return { plan: org.plan };
78
- }
79
-
80
- export async function provisionBillingCustomer(orgId: string, email: string): Promise<Record<string, unknown>> {
81
- const factory = getBillingProviderFactory(process.env.KEYSTONE_BILLING_PROVIDER || "none");
82
- if (!factory) {
83
- return { ok: false, reason: "No billing provider configured" };
84
- }
85
- const provider = factory();
86
- return provider.createCustomer(orgId, email);
87
- }
@@ -1,131 +0,0 @@
1
- import { Redis } from "ioredis";
2
- import { Counter } from "prom-client";
3
- import { config } from "../config.js";
4
-
5
- const cacheHits = new Counter({ name: "keystone_cache_hits_total", help: "Cache hits", labelNames: ["cache"] });
6
- const cacheMisses = new Counter({ name: "keystone_cache_misses_total", help: "Cache misses", labelNames: ["cache"] });
7
- const cacheSets = new Counter({ name: "keystone_cache_sets_total", help: "Cache writes", labelNames: ["cache"] });
8
- const cacheDeletes = new Counter({ name: "keystone_cache_deletes_total", help: "Cache invalidations", labelNames: ["cache"] });
9
-
10
- interface CacheMetrics {
11
- hits: number;
12
- misses: number;
13
- sets: number;
14
- deletes: number;
15
- }
16
-
17
- interface CacheEntry<T> {
18
- value: T;
19
- expiresAt: number;
20
- }
21
-
22
- class CacheProvider {
23
- private redis: Redis | null = null;
24
- private memory = new Map<string, CacheEntry<unknown>>();
25
- private metrics: CacheMetrics = { hits: 0, misses: 0, sets: 0, deletes: 0 };
26
- private prefix: string;
27
-
28
- constructor() {
29
- this.prefix = config.CACHE_KEY_PREFIX || "keystone:";
30
- if (config.REDIS_URL) {
31
- this.redis = new Redis(config.REDIS_URL, { maxRetriesPerRequest: 2 });
32
- this.redis.on("error", (err) => {
33
- console.warn("[cache] redis error, falling back to in-memory:", err.message);
34
- });
35
- }
36
- }
37
-
38
- private key(k: string): string {
39
- return `${this.prefix}${k}`;
40
- }
41
-
42
- async get<T>(key: string): Promise<T | null> {
43
- if (this.redis?.status === "ready") {
44
- try {
45
- const value = await this.redis.get(this.key(key));
46
- if (value !== null) {
47
- this.metrics.hits++;
48
- cacheHits.inc({ cache: "redis" });
49
- return JSON.parse(value) as T;
50
- }
51
- } catch {
52
- // fall through to memory fallback
53
- }
54
- }
55
-
56
- const entry = this.memory.get(key);
57
- if (entry && entry.expiresAt > Date.now()) {
58
- this.metrics.hits++;
59
- cacheHits.inc({ cache: "memory" });
60
- return entry.value as T;
61
- }
62
- if (entry) this.memory.delete(key);
63
- this.metrics.misses++;
64
- cacheMisses.inc({ cache: this.redis ? "redis" : "memory" });
65
- return null;
66
- }
67
-
68
- async set<T>(key: string, value: T, ttlSeconds = 60): Promise<void> {
69
- if (this.redis?.status === "ready") {
70
- try {
71
- await this.redis.setex(this.key(key), ttlSeconds, JSON.stringify(value));
72
- this.metrics.sets++;
73
- cacheSets.inc({ cache: "redis" });
74
- return;
75
- } catch {
76
- // fall through to memory fallback
77
- }
78
- }
79
- this.memory.set(key, { value, expiresAt: Date.now() + ttlSeconds * 1000 });
80
- this.metrics.sets++;
81
- cacheSets.inc({ cache: "memory" });
82
- }
83
-
84
- async del(key: string): Promise<void> {
85
- this.memory.delete(key);
86
- if (this.redis?.status === "ready") {
87
- try {
88
- await this.redis.del(this.key(key));
89
- } catch {
90
- // ignore
91
- }
92
- }
93
- this.metrics.deletes++;
94
- cacheDeletes.inc({ cache: this.redis ? "redis" : "memory" });
95
- }
96
-
97
- async invalidate(pattern: string): Promise<void> {
98
- const memoryKeys = [...this.memory.keys()].filter((k) => k.includes(pattern));
99
- for (const k of memoryKeys) this.memory.delete(k);
100
-
101
- if (this.redis?.status === "ready") {
102
- try {
103
- let cursor = "0";
104
- do {
105
- const result = await this.redis.scan(cursor, "MATCH", this.key(`*${pattern}*`), "COUNT", 100);
106
- cursor = result[0];
107
- const keys = result[1];
108
- if (keys.length) await this.redis.del(...keys);
109
- } while (cursor !== "0");
110
- } catch {
111
- // ignore
112
- }
113
- }
114
- this.metrics.deletes += memoryKeys.length;
115
- cacheDeletes.inc({ cache: this.redis ? "redis" : "memory" }, memoryKeys.length);
116
- }
117
-
118
- getMetrics(): CacheMetrics {
119
- return { ...this.metrics };
120
- }
121
-
122
- async close(): Promise<void> {
123
- this.memory.clear();
124
- if (this.redis) {
125
- await this.redis.quit();
126
- this.redis = null;
127
- }
128
- }
129
- }
130
-
131
- export const cache = new CacheProvider();
@@ -1,115 +0,0 @@
1
- export interface ConfigurationProfile {
2
- name: string;
3
- description: string;
4
- values: Record<string, string>;
5
- }
6
-
7
- export const CONFIGURATION_PROFILES: Record<string, ConfigurationProfile> = {
8
- development: {
9
- name: "Development",
10
- description: "Local development with debug logging and relaxed security defaults.",
11
- values: {
12
- NODE_ENV: "development",
13
- PORT: "4001",
14
- HOST: "0.0.0.0",
15
- DATABASE_URL: "postgresql://hilbras:hilbras@localhost:5432/hilbras",
16
- REDIS_URL: "redis://localhost:6379",
17
- KEYSTONE_QUEUE_PROVIDER: "in-process",
18
- KEYSTONE_SECRETS_PROVIDER: "database",
19
- EMAIL_PROVIDER: "console",
20
- SMS_PROVIDER: "none",
21
- AUDIT_CONSOLE_EXPORT: "true",
22
- KEYSTONE_FEATURE_FLAGS: "workflows=true,beta_auth=false",
23
- },
24
- },
25
- production: {
26
- name: "Production",
27
- description: "Production-grade settings with external queue and secrets providers.",
28
- values: {
29
- NODE_ENV: "production",
30
- PORT: "4001",
31
- HOST: "0.0.0.0",
32
- KEYSTONE_QUEUE_PROVIDER: "bullmq",
33
- KEYSTONE_SECRETS_PROVIDER: "database",
34
- EMAIL_PROVIDER: "smtp",
35
- SMS_PROVIDER: "twilio",
36
- AUDIT_CONSOLE_EXPORT: "false",
37
- KEYSTONE_FEATURE_FLAGS: "workflows=true",
38
- },
39
- },
40
- docker: {
41
- name: "Docker",
42
- description: "Single-container deployment using linked Postgres and Redis services.",
43
- values: {
44
- NODE_ENV: "production",
45
- PORT: "4001",
46
- HOST: "0.0.0.0",
47
- DATABASE_URL: "postgresql://hilbras:hilbras@postgres:5432/hilbras",
48
- REDIS_URL: "redis://redis:6379",
49
- KEYSTONE_QUEUE_PROVIDER: "bullmq",
50
- KEYSTONE_SECRETS_PROVIDER: "database",
51
- EMAIL_PROVIDER: "smtp",
52
- SMS_PROVIDER: "none",
53
- AUDIT_CONSOLE_EXPORT: "false",
54
- },
55
- },
56
- "docker-compose": {
57
- name: "Docker Compose",
58
- description: "Multi-service deployment via Docker Compose.",
59
- values: {
60
- NODE_ENV: "production",
61
- PORT: "4001",
62
- HOST: "0.0.0.0",
63
- DATABASE_URL: "postgresql://hilbras:hilbras@postgres:5432/hilbras",
64
- REDIS_URL: "redis://redis:6379",
65
- KEYSTONE_QUEUE_PROVIDER: "bullmq",
66
- KEYSTONE_SECRETS_PROVIDER: "database",
67
- EMAIL_PROVIDER: "smtp",
68
- SMS_PROVIDER: "none",
69
- AUDIT_CONSOLE_EXPORT: "false",
70
- KEYSTONE_CONFIG_MODE: "json",
71
- },
72
- },
73
- kubernetes: {
74
- name: "Kubernetes",
75
- description: "Kubernetes deployment with external secrets and HA queue.",
76
- values: {
77
- NODE_ENV: "production",
78
- PORT: "4001",
79
- HOST: "0.0.0.0",
80
- KEYSTONE_QUEUE_PROVIDER: "bullmq",
81
- KEYSTONE_SECRETS_PROVIDER: "environment",
82
- EMAIL_PROVIDER: "smtp",
83
- SMS_PROVIDER: "twilio",
84
- AUDIT_CONSOLE_EXPORT: "false",
85
- KEYSTONE_CONFIG_MODE: "json",
86
- },
87
- },
88
- "high-availability": {
89
- name: "High Availability",
90
- description: "Scaled deployment with dedicated Redis, Postgres, and external secrets.",
91
- values: {
92
- NODE_ENV: "production",
93
- PORT: "4001",
94
- HOST: "0.0.0.0",
95
- KEYSTONE_QUEUE_PROVIDER: "bullmq",
96
- KEYSTONE_SECRETS_PROVIDER: "environment",
97
- EMAIL_PROVIDER: "smtp",
98
- SMS_PROVIDER: "twilio",
99
- AUDIT_CONSOLE_EXPORT: "false",
100
- KEYSTONE_FEATURE_FLAGS: "workflows=true,advanced_audit=true",
101
- },
102
- },
103
- };
104
-
105
- export function listConfigurationProfiles(): Array<{ id: string; name: string; description: string }> {
106
- return Object.entries(CONFIGURATION_PROFILES).map(([id, profile]) => ({
107
- id,
108
- name: profile.name,
109
- description: profile.description,
110
- }));
111
- }
112
-
113
- export function getConfigurationProfile(id: string): ConfigurationProfile | undefined {
114
- return CONFIGURATION_PROFILES[id];
115
- }