@hilbras/keystone 1.6.0 → 2.5.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 (604) hide show
  1. package/CHANGELOG.md +625 -0
  2. package/README.md +198 -50
  3. package/dist/cli.js +25 -27
  4. package/dist/cli.js.map +1 -1
  5. package/dist/config.d.ts +23 -1
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +53 -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/dist/db/migrations/0015_chief_vargas.sql +7 -0
  20. package/dist/db/migrations/0016_gorgeous_charles_xavier.sql +5 -0
  21. package/dist/db/migrations/0017_flashy_nekra.sql +1 -0
  22. package/{src/db/migrations/meta/0007_snapshot.json → dist/db/migrations/meta/0008_snapshot.json} +136 -32
  23. package/{src/db/migrations/meta/0006_snapshot.json → dist/db/migrations/meta/0009_snapshot.json} +359 -30
  24. package/{src/db/migrations/meta/0005_snapshot.json → dist/db/migrations/meta/0010_snapshot.json} +459 -29
  25. package/{src/db/migrations/meta/0004_snapshot.json → dist/db/migrations/meta/0011_snapshot.json} +594 -30
  26. package/dist/db/migrations/meta/0012_snapshot.json +3891 -0
  27. package/dist/db/migrations/meta/0013_snapshot.json +3919 -0
  28. package/dist/db/migrations/meta/0014_snapshot.json +4311 -0
  29. package/dist/db/migrations/meta/0015_snapshot.json +4340 -0
  30. package/dist/db/migrations/meta/0016_snapshot.json +4363 -0
  31. package/dist/db/migrations/meta/0017_snapshot.json +4370 -0
  32. package/dist/db/migrations/meta/_journal.json +70 -0
  33. package/dist/db/reencryptOidcSecrets.d.ts +2 -0
  34. package/dist/db/reencryptOidcSecrets.d.ts.map +1 -0
  35. package/dist/db/reencryptOidcSecrets.js +41 -0
  36. package/dist/db/reencryptOidcSecrets.js.map +1 -0
  37. package/dist/db/schema.d.ts +2693 -88
  38. package/dist/db/schema.d.ts.map +1 -1
  39. package/dist/db/schema.js +157 -4
  40. package/dist/db/schema.js.map +1 -1
  41. package/dist/db/seed.js +67 -40
  42. package/dist/db/seed.js.map +1 -1
  43. package/dist/di.d.ts.map +1 -1
  44. package/dist/di.js +11 -3
  45. package/dist/di.js.map +1 -1
  46. package/dist/index.d.ts +2 -2
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +34 -3
  49. package/dist/index.js.map +1 -1
  50. package/dist/lib/errors.d.ts +2 -1
  51. package/dist/lib/errors.d.ts.map +1 -1
  52. package/dist/lib/errors.js +10 -0
  53. package/dist/lib/errors.js.map +1 -1
  54. package/dist/plugins/appContext.d.ts.map +1 -1
  55. package/dist/plugins/appContext.js +3 -12
  56. package/dist/plugins/appContext.js.map +1 -1
  57. package/dist/plugins/audit.d.ts.map +1 -1
  58. package/dist/plugins/audit.js +26 -6
  59. package/dist/plugins/audit.js.map +1 -1
  60. package/dist/plugins/auth.d.ts.map +1 -1
  61. package/dist/plugins/auth.js +32 -7
  62. package/dist/plugins/auth.js.map +1 -1
  63. package/dist/plugins/headerSanitization.d.ts +15 -0
  64. package/dist/plugins/headerSanitization.d.ts.map +1 -0
  65. package/dist/plugins/headerSanitization.js +39 -0
  66. package/dist/plugins/headerSanitization.js.map +1 -0
  67. package/dist/plugins/metrics.d.ts.map +1 -1
  68. package/dist/plugins/mtls.d.ts +21 -2
  69. package/dist/plugins/mtls.d.ts.map +1 -1
  70. package/dist/plugins/mtls.js +94 -47
  71. package/dist/plugins/mtls.js.map +1 -1
  72. package/dist/plugins/permissions.d.ts.map +1 -1
  73. package/dist/plugins/permissions.js +29 -9
  74. package/dist/plugins/permissions.js.map +1 -1
  75. package/dist/plugins/rateLimit.d.ts +16 -0
  76. package/dist/plugins/rateLimit.d.ts.map +1 -1
  77. package/dist/plugins/rateLimit.js +16 -3
  78. package/dist/plugins/rateLimit.js.map +1 -1
  79. package/dist/plugins/requestLogger.d.ts.map +1 -1
  80. package/dist/repositories/apiKey.d.ts.map +1 -1
  81. package/dist/repositories/application.d.ts +1 -1
  82. package/dist/repositories/application.d.ts.map +1 -1
  83. package/dist/repositories/application.js +9 -3
  84. package/dist/repositories/application.js.map +1 -1
  85. package/dist/repositories/audit.d.ts.map +1 -1
  86. package/dist/repositories/index.d.ts +3 -0
  87. package/dist/repositories/index.d.ts.map +1 -1
  88. package/dist/repositories/index.js +3 -0
  89. package/dist/repositories/index.js.map +1 -1
  90. package/dist/repositories/mfaChallenge.d.ts +23 -0
  91. package/dist/repositories/mfaChallenge.d.ts.map +1 -0
  92. package/dist/repositories/mfaChallenge.js +71 -0
  93. package/dist/repositories/mfaChallenge.js.map +1 -0
  94. package/dist/repositories/oidcConnection.d.ts +27 -43
  95. package/dist/repositories/oidcConnection.d.ts.map +1 -1
  96. package/dist/repositories/oidcConnection.js +15 -6
  97. package/dist/repositories/oidcConnection.js.map +1 -1
  98. package/dist/repositories/organization.d.ts +9 -9
  99. package/dist/repositories/organization.d.ts.map +1 -1
  100. package/dist/repositories/organization.js +91 -37
  101. package/dist/repositories/organization.js.map +1 -1
  102. package/dist/repositories/permission.d.ts.map +1 -1
  103. package/dist/repositories/permission.js +27 -5
  104. package/dist/repositories/permission.js.map +1 -1
  105. package/dist/repositories/samlConnection.d.ts +28 -28
  106. package/dist/repositories/samlConnection.d.ts.map +1 -1
  107. package/dist/repositories/samlConnection.js +12 -4
  108. package/dist/repositories/samlConnection.js.map +1 -1
  109. package/dist/repositories/scimConnection.d.ts +38 -0
  110. package/dist/repositories/scimConnection.d.ts.map +1 -0
  111. package/dist/repositories/scimConnection.js +123 -0
  112. package/dist/repositories/scimConnection.js.map +1 -0
  113. package/dist/repositories/scimGroup.d.ts +36 -0
  114. package/dist/repositories/scimGroup.d.ts.map +1 -0
  115. package/dist/repositories/scimGroup.js +113 -0
  116. package/dist/repositories/scimGroup.js.map +1 -0
  117. package/dist/repositories/session.d.ts +24 -13
  118. package/dist/repositories/session.d.ts.map +1 -1
  119. package/dist/repositories/session.js +13 -1
  120. package/dist/repositories/session.js.map +1 -1
  121. package/dist/repositories/types.d.ts +117 -6
  122. package/dist/repositories/types.d.ts.map +1 -1
  123. package/dist/repositories/types.js +7 -1
  124. package/dist/repositories/types.js.map +1 -1
  125. package/dist/repositories/user.d.ts +23 -1
  126. package/dist/repositories/user.d.ts.map +1 -1
  127. package/dist/repositories/user.js +180 -4
  128. package/dist/repositories/user.js.map +1 -1
  129. package/dist/routes/admin/billing.js +4 -4
  130. package/dist/routes/admin/billing.js.map +1 -1
  131. package/dist/routes/admin/helpers.d.ts +16 -20
  132. package/dist/routes/admin/helpers.d.ts.map +1 -1
  133. package/dist/routes/admin/helpers.js +53 -10
  134. package/dist/routes/admin/helpers.js.map +1 -1
  135. package/dist/routes/admin/organizations.d.ts.map +1 -1
  136. package/dist/routes/admin/organizations.js +105 -69
  137. package/dist/routes/admin/organizations.js.map +1 -1
  138. package/dist/routes/admin/permissions.d.ts.map +1 -1
  139. package/dist/routes/admin/permissions.js +48 -14
  140. package/dist/routes/admin/permissions.js.map +1 -1
  141. package/dist/routes/admin/platform.d.ts.map +1 -1
  142. package/dist/routes/admin/platform.js +86 -35
  143. package/dist/routes/admin/platform.js.map +1 -1
  144. package/dist/routes/admin/sso.d.ts.map +1 -1
  145. package/dist/routes/admin/sso.js +143 -12
  146. package/dist/routes/admin/sso.js.map +1 -1
  147. package/dist/routes/admin/webhooks.js +8 -8
  148. package/dist/routes/admin/webhooks.js.map +1 -1
  149. package/dist/routes/apiKeys.d.ts.map +1 -1
  150. package/dist/routes/apiKeys.js +23 -5
  151. package/dist/routes/apiKeys.js.map +1 -1
  152. package/dist/routes/auth.d.ts.map +1 -1
  153. package/dist/routes/auth.js +112 -22
  154. package/dist/routes/auth.js.map +1 -1
  155. package/dist/routes/authz.d.ts.map +1 -1
  156. package/dist/routes/authz.js +16 -4
  157. package/dist/routes/authz.js.map +1 -1
  158. package/dist/routes/config.d.ts.map +1 -1
  159. package/dist/routes/config.js +16 -14
  160. package/dist/routes/config.js.map +1 -1
  161. package/dist/routes/federation.d.ts.map +1 -1
  162. package/dist/routes/federation.js +17 -3
  163. package/dist/routes/federation.js.map +1 -1
  164. package/dist/routes/magicLinks.d.ts.map +1 -1
  165. package/dist/routes/magicLinks.js +15 -3
  166. package/dist/routes/magicLinks.js.map +1 -1
  167. package/dist/routes/oauth.d.ts.map +1 -1
  168. package/dist/routes/oauth.js +60 -5
  169. package/dist/routes/oauth.js.map +1 -1
  170. package/dist/routes/oauth2.d.ts.map +1 -1
  171. package/dist/routes/oauth2.js +188 -22
  172. package/dist/routes/oauth2.js.map +1 -1
  173. package/dist/routes/oidcEnterprise.d.ts.map +1 -1
  174. package/dist/routes/oidcEnterprise.js +67 -21
  175. package/dist/routes/oidcEnterprise.js.map +1 -1
  176. package/dist/routes/password.d.ts.map +1 -1
  177. package/dist/routes/password.js.map +1 -1
  178. package/dist/routes/profile.js +4 -4
  179. package/dist/routes/profile.js.map +1 -1
  180. package/dist/routes/saml.d.ts +33 -0
  181. package/dist/routes/saml.d.ts.map +1 -1
  182. package/dist/routes/saml.js +217 -12
  183. package/dist/routes/saml.js.map +1 -1
  184. package/dist/routes/scim.d.ts +13 -0
  185. package/dist/routes/scim.d.ts.map +1 -1
  186. package/dist/routes/scim.js +885 -110
  187. package/dist/routes/scim.js.map +1 -1
  188. package/dist/routes/sdk.d.ts.map +1 -1
  189. package/dist/routes/sdk.js +24 -8
  190. package/dist/routes/sdk.js.map +1 -1
  191. package/dist/routes/serviceAccounts.d.ts.map +1 -1
  192. package/dist/routes/serviceAccounts.js +63 -2
  193. package/dist/routes/serviceAccounts.js.map +1 -1
  194. package/dist/routes/setup.d.ts.map +1 -1
  195. package/dist/routes/setup.js +15 -16
  196. package/dist/routes/setup.js.map +1 -1
  197. package/dist/routes/smsOtp.js +1 -1
  198. package/dist/routes/smsOtp.js.map +1 -1
  199. package/dist/routes/totp.d.ts.map +1 -1
  200. package/dist/routes/totp.js +112 -23
  201. package/dist/routes/totp.js.map +1 -1
  202. package/dist/routes/webauthn.d.ts.map +1 -1
  203. package/dist/routes/webauthn.js +44 -8
  204. package/dist/routes/webauthn.js.map +1 -1
  205. package/dist/routes/workflows.d.ts.map +1 -1
  206. package/dist/routes/workflows.js +58 -25
  207. package/dist/routes/workflows.js.map +1 -1
  208. package/dist/sdk/index.d.ts.map +1 -1
  209. package/dist/sdk/index.js +141 -40
  210. package/dist/sdk/index.js.map +1 -1
  211. package/dist/sdk/types.d.ts +64 -30
  212. package/dist/sdk/types.d.ts.map +1 -1
  213. package/dist/services/application/authentication.d.ts +39 -1
  214. package/dist/services/application/authentication.d.ts.map +1 -1
  215. package/dist/services/application/authentication.js +43 -1
  216. package/dist/services/application/authentication.js.map +1 -1
  217. package/dist/services/application/identity.d.ts +10 -7
  218. package/dist/services/application/identity.d.ts.map +1 -1
  219. package/dist/services/application/identity.js +13 -10
  220. package/dist/services/application/identity.js.map +1 -1
  221. package/dist/services/application/organization.d.ts +16 -8
  222. package/dist/services/application/organization.d.ts.map +1 -1
  223. package/dist/services/application/organization.js +160 -12
  224. package/dist/services/application/organization.js.map +1 -1
  225. package/dist/services/applications.js +2 -2
  226. package/dist/services/applications.js.map +1 -1
  227. package/dist/services/audit.d.ts +1 -0
  228. package/dist/services/audit.d.ts.map +1 -1
  229. package/dist/services/audit.js +13 -0
  230. package/dist/services/audit.js.map +1 -1
  231. package/dist/services/cache.d.ts.map +1 -1
  232. package/dist/services/configuration/profiles.d.ts +4 -0
  233. package/dist/services/configuration/profiles.d.ts.map +1 -1
  234. package/dist/services/configuration/profiles.js +50 -0
  235. package/dist/services/configuration/profiles.js.map +1 -1
  236. package/dist/services/configuration.d.ts.map +1 -1
  237. package/dist/services/configuration.js.map +1 -1
  238. package/dist/services/connectors/google.d.ts +18 -1
  239. package/dist/services/connectors/google.d.ts.map +1 -1
  240. package/dist/services/connectors/google.js +27 -4
  241. package/dist/services/connectors/google.js.map +1 -1
  242. package/dist/services/connectors/oidc.d.ts +14 -2
  243. package/dist/services/connectors/oidc.d.ts.map +1 -1
  244. package/dist/services/connectors/oidc.js +35 -6
  245. package/dist/services/connectors/oidc.js.map +1 -1
  246. package/dist/services/connectors/types.d.ts +13 -1
  247. package/dist/services/connectors/types.d.ts.map +1 -1
  248. package/dist/services/connectors/zitadel.d.ts.map +1 -1
  249. package/dist/services/connectors/zitadel.js +4 -3
  250. package/dist/services/connectors/zitadel.js.map +1 -1
  251. package/dist/services/domain/authentication.d.ts +43 -4
  252. package/dist/services/domain/authentication.d.ts.map +1 -1
  253. package/dist/services/domain/authentication.js +119 -40
  254. package/dist/services/domain/authentication.js.map +1 -1
  255. package/dist/services/domain/authorization.d.ts +11 -0
  256. package/dist/services/domain/authorization.d.ts.map +1 -1
  257. package/dist/services/domain/authorization.js +36 -1
  258. package/dist/services/domain/authorization.js.map +1 -1
  259. package/dist/services/domain/identity.d.ts +21 -9
  260. package/dist/services/domain/identity.d.ts.map +1 -1
  261. package/dist/services/domain/identity.js +187 -10
  262. package/dist/services/domain/identity.js.map +1 -1
  263. package/dist/services/domain/organization.d.ts +11 -10
  264. package/dist/services/domain/organization.d.ts.map +1 -1
  265. package/dist/services/domain/organization.js +48 -30
  266. package/dist/services/domain/organization.js.map +1 -1
  267. package/dist/services/emailVerification.d.ts +2 -2
  268. package/dist/services/enterpriseSso.d.ts +13 -6
  269. package/dist/services/enterpriseSso.d.ts.map +1 -1
  270. package/dist/services/enterpriseSso.js +75 -6
  271. package/dist/services/enterpriseSso.js.map +1 -1
  272. package/dist/services/events/subscribers/auditLog.js +1 -1
  273. package/dist/services/events/subscribers/auditLog.js.map +1 -1
  274. package/dist/services/events/types.d.ts +7 -1
  275. package/dist/services/events/types.d.ts.map +1 -1
  276. package/dist/services/events/types.js.map +1 -1
  277. package/dist/services/events/validate.d.ts.map +1 -1
  278. package/dist/services/events/validate.js +33 -0
  279. package/dist/services/events/validate.js.map +1 -1
  280. package/dist/services/features.d.ts.map +1 -1
  281. package/dist/services/features.js.map +1 -1
  282. package/dist/services/federation.d.ts +6 -1
  283. package/dist/services/federation.d.ts.map +1 -1
  284. package/dist/services/federation.js +31 -4
  285. package/dist/services/federation.js.map +1 -1
  286. package/dist/services/ipControls.js +2 -2
  287. package/dist/services/ipControls.js.map +1 -1
  288. package/dist/services/magicLinks.d.ts +2 -2
  289. package/dist/services/magicLinks.d.ts.map +1 -1
  290. package/dist/services/magicLinks.js +13 -9
  291. package/dist/services/magicLinks.js.map +1 -1
  292. package/dist/services/mfa.d.ts +53 -0
  293. package/dist/services/mfa.d.ts.map +1 -0
  294. package/dist/services/mfa.js +157 -0
  295. package/dist/services/mfa.js.map +1 -0
  296. package/dist/services/oauth2.d.ts +88 -14
  297. package/dist/services/oauth2.d.ts.map +1 -1
  298. package/dist/services/oauth2.js +125 -16
  299. package/dist/services/oauth2.js.map +1 -1
  300. package/dist/services/oidcSecretFormat.d.ts +3 -0
  301. package/dist/services/oidcSecretFormat.d.ts.map +1 -0
  302. package/dist/services/oidcSecretFormat.js +5 -0
  303. package/dist/services/oidcSecretFormat.js.map +1 -0
  304. package/dist/services/organizations.d.ts +4 -16
  305. package/dist/services/organizations.d.ts.map +1 -1
  306. package/dist/services/organizations.js +0 -62
  307. package/dist/services/organizations.js.map +1 -1
  308. package/dist/services/permissions.d.ts.map +1 -1
  309. package/dist/services/permissions.js +9 -1
  310. package/dist/services/permissions.js.map +1 -1
  311. package/dist/services/plugins/registry.d.ts.map +1 -1
  312. package/dist/services/plugins/registry.js.map +1 -1
  313. package/dist/services/plugins/types.d.ts.map +1 -1
  314. package/dist/services/queue/bullmq.d.ts.map +1 -1
  315. package/dist/services/queue/inProcess.d.ts.map +1 -1
  316. package/dist/services/redirectUri.d.ts +56 -0
  317. package/dist/services/redirectUri.d.ts.map +1 -0
  318. package/dist/services/redirectUri.js +129 -0
  319. package/dist/services/redirectUri.js.map +1 -0
  320. package/dist/services/redis.d.ts +1 -1
  321. package/dist/services/redis.d.ts.map +1 -1
  322. package/dist/services/scimCredentials.d.ts +46 -0
  323. package/dist/services/scimCredentials.d.ts.map +1 -0
  324. package/dist/services/scimCredentials.js +123 -0
  325. package/dist/services/scimCredentials.js.map +1 -0
  326. package/dist/services/scimLegacyMigration.d.ts +12 -0
  327. package/dist/services/scimLegacyMigration.d.ts.map +1 -0
  328. package/dist/services/scimLegacyMigration.js +44 -0
  329. package/dist/services/scimLegacyMigration.js.map +1 -0
  330. package/dist/services/secrets/awsKms.d.ts +2 -2
  331. package/dist/services/secrets/awsKms.d.ts.map +1 -1
  332. package/dist/services/secrets/awsKms.js +3 -5
  333. package/dist/services/secrets/awsKms.js.map +1 -1
  334. package/dist/services/secrets/azureKeyVault.d.ts.map +1 -1
  335. package/dist/services/secrets/database.d.ts.map +1 -1
  336. package/dist/services/secrets/database.js.map +1 -1
  337. package/dist/services/secrets/environment.d.ts.map +1 -1
  338. package/dist/services/secrets/environment.js.map +1 -1
  339. package/dist/services/secrets/index.d.ts.map +1 -1
  340. package/dist/services/secrets/password.d.ts.map +1 -1
  341. package/dist/services/secrets/password.js +0 -4
  342. package/dist/services/secrets/password.js.map +1 -1
  343. package/dist/services/secrets/provider.d.ts +2 -3
  344. package/dist/services/secrets/provider.d.ts.map +1 -1
  345. package/dist/services/secrets/vault.d.ts.map +1 -1
  346. package/dist/services/serviceAccounts.d.ts +20 -0
  347. package/dist/services/serviceAccounts.d.ts.map +1 -1
  348. package/dist/services/serviceAccounts.js +47 -1
  349. package/dist/services/serviceAccounts.js.map +1 -1
  350. package/dist/services/sessionRevocation.d.ts +76 -0
  351. package/dist/services/sessionRevocation.d.ts.map +1 -0
  352. package/dist/services/sessionRevocation.js +86 -0
  353. package/dist/services/sessionRevocation.js.map +1 -0
  354. package/dist/services/setup/configWriter.d.ts.map +1 -1
  355. package/dist/services/setup/configWriter.js.map +1 -1
  356. package/dist/services/singleUse.d.ts +68 -0
  357. package/dist/services/singleUse.d.ts.map +1 -0
  358. package/dist/services/singleUse.js +54 -0
  359. package/dist/services/singleUse.js.map +1 -0
  360. package/dist/services/smsOtp.d.ts.map +1 -1
  361. package/dist/services/smsOtp.js +12 -8
  362. package/dist/services/smsOtp.js.map +1 -1
  363. package/dist/services/ssoEndpointPolicy.d.ts +8 -0
  364. package/dist/services/ssoEndpointPolicy.d.ts.map +1 -0
  365. package/dist/services/ssoEndpointPolicy.js +136 -0
  366. package/dist/services/ssoEndpointPolicy.js.map +1 -0
  367. package/dist/services/stepUp.d.ts +35 -0
  368. package/dist/services/stepUp.d.ts.map +1 -0
  369. package/dist/services/stepUp.js +65 -0
  370. package/dist/services/stepUp.js.map +1 -0
  371. package/dist/services/tokens.d.ts +39 -11
  372. package/dist/services/tokens.d.ts.map +1 -1
  373. package/dist/services/tokens.js +80 -14
  374. package/dist/services/tokens.js.map +1 -1
  375. package/dist/services/totp.d.ts +46 -0
  376. package/dist/services/totp.d.ts.map +1 -1
  377. package/dist/services/totp.js +178 -41
  378. package/dist/services/totp.js.map +1 -1
  379. package/dist/services/trustedProxies.d.ts +90 -0
  380. package/dist/services/trustedProxies.d.ts.map +1 -0
  381. package/dist/services/trustedProxies.js +283 -0
  382. package/dist/services/trustedProxies.js.map +1 -0
  383. package/dist/services/users.d.ts +20 -12
  384. package/dist/services/users.d.ts.map +1 -1
  385. package/dist/services/users.js +24 -51
  386. package/dist/services/users.js.map +1 -1
  387. package/dist/services/webauthn.d.ts +8 -4
  388. package/dist/services/webauthn.d.ts.map +1 -1
  389. package/dist/services/webauthn.js +4 -4
  390. package/dist/services/webauthn.js.map +1 -1
  391. package/dist/services/webhooks.d.ts +20 -20
  392. package/dist/services/workflows/engine.d.ts +4 -2
  393. package/dist/services/workflows/engine.d.ts.map +1 -1
  394. package/dist/services/workflows/engine.js +181 -12
  395. package/dist/services/workflows/engine.js.map +1 -1
  396. package/dist/services/workflows/steps.d.ts +2 -0
  397. package/dist/services/workflows/steps.d.ts.map +1 -1
  398. package/dist/services/workflows/steps.js +8 -75
  399. package/dist/services/workflows/steps.js.map +1 -1
  400. package/dist/setup-server.js +2 -1
  401. package/dist/setup-server.js.map +1 -1
  402. package/dist/types.d.ts +33 -4
  403. package/dist/types.d.ts.map +1 -1
  404. package/dist/types.js +26 -2
  405. package/dist/types.js.map +1 -1
  406. package/package.json +25 -3
  407. package/dist/tests/errors.test.d.ts +0 -2
  408. package/dist/tests/errors.test.d.ts.map +0 -1
  409. package/dist/tests/errors.test.js +0 -64
  410. package/dist/tests/errors.test.js.map +0 -1
  411. package/dist/tests/events.test.d.ts +0 -2
  412. package/dist/tests/events.test.d.ts.map +0 -1
  413. package/dist/tests/events.test.js +0 -45
  414. package/dist/tests/events.test.js.map +0 -1
  415. package/dist/tests/featureFlags.test.d.ts +0 -2
  416. package/dist/tests/featureFlags.test.d.ts.map +0 -1
  417. package/dist/tests/featureFlags.test.js +0 -24
  418. package/dist/tests/featureFlags.test.js.map +0 -1
  419. package/dist/tests/integration/queue.test.d.ts +0 -2
  420. package/dist/tests/integration/queue.test.d.ts.map +0 -1
  421. package/dist/tests/integration/queue.test.js +0 -49
  422. package/dist/tests/integration/queue.test.js.map +0 -1
  423. package/dist/tests/plugins.test.d.ts +0 -2
  424. package/dist/tests/plugins.test.d.ts.map +0 -1
  425. package/dist/tests/plugins.test.js +0 -56
  426. package/dist/tests/plugins.test.js.map +0 -1
  427. package/dist/tests/result.test.d.ts +0 -2
  428. package/dist/tests/result.test.d.ts.map +0 -1
  429. package/dist/tests/result.test.js +0 -46
  430. package/dist/tests/result.test.js.map +0 -1
  431. package/dist/tests/setup/configWriter.test.d.ts +0 -2
  432. package/dist/tests/setup/configWriter.test.d.ts.map +0 -1
  433. package/dist/tests/setup/configWriter.test.js +0 -55
  434. package/dist/tests/setup/configWriter.test.js.map +0 -1
  435. package/dist/tests/setup/validation.test.d.ts +0 -2
  436. package/dist/tests/setup/validation.test.d.ts.map +0 -1
  437. package/dist/tests/setup/validation.test.js +0 -26
  438. package/dist/tests/setup/validation.test.js.map +0 -1
  439. package/dist/tests/smoke.test.d.ts +0 -2
  440. package/dist/tests/smoke.test.d.ts.map +0 -1
  441. package/dist/tests/smoke.test.js +0 -124
  442. package/dist/tests/smoke.test.js.map +0 -1
  443. package/src/cli.ts +0 -172
  444. package/src/config.ts +0 -143
  445. package/src/container.ts +0 -48
  446. package/src/db/index.ts +0 -53
  447. package/src/db/migrations/0000_skinny_ben_parker.sql +0 -553
  448. package/src/db/migrations/0001_brief_joseph.sql +0 -10
  449. package/src/db/migrations/0002_add_account_lockout.sql +0 -3
  450. package/src/db/migrations/0003_steep_rachel_grey.sql +0 -1
  451. package/src/db/migrations/0004_clever_bill_hollister.sql +0 -20
  452. package/src/db/migrations/0005_steep_the_call.sql +0 -2
  453. package/src/db/migrations/0006_ambitious_boomer.sql +0 -17
  454. package/src/db/migrations/0007_greedy_vindicator.sql +0 -40
  455. package/src/db/migrations/meta/0000_snapshot.json +0 -2964
  456. package/src/db/migrations/meta/0001_snapshot.json +0 -3031
  457. package/src/db/migrations/meta/0003_snapshot.json +0 -3051
  458. package/src/db/migrations/meta/_journal.json +0 -62
  459. package/src/db/schema.ts +0 -676
  460. package/src/db/seed.ts +0 -146
  461. package/src/di.ts +0 -81
  462. package/src/index.ts +0 -326
  463. package/src/lib/errors.ts +0 -139
  464. package/src/lib/result.ts +0 -44
  465. package/src/lib/webhookSignature.ts +0 -41
  466. package/src/plugins/appContext.ts +0 -76
  467. package/src/plugins/audit.ts +0 -42
  468. package/src/plugins/auth.ts +0 -230
  469. package/src/plugins/metrics.ts +0 -41
  470. package/src/plugins/mtls.ts +0 -94
  471. package/src/plugins/permissions.ts +0 -29
  472. package/src/plugins/rateLimit.ts +0 -133
  473. package/src/plugins/requestLogger.ts +0 -25
  474. package/src/plugins/tracing.ts +0 -22
  475. package/src/repositories/apiKey.ts +0 -158
  476. package/src/repositories/application.ts +0 -70
  477. package/src/repositories/audit.ts +0 -32
  478. package/src/repositories/index.ts +0 -9
  479. package/src/repositories/oidcConnection.ts +0 -111
  480. package/src/repositories/organization.ts +0 -167
  481. package/src/repositories/permission.ts +0 -153
  482. package/src/repositories/samlConnection.ts +0 -96
  483. package/src/repositories/session.ts +0 -86
  484. package/src/repositories/types.ts +0 -134
  485. package/src/repositories/user.ts +0 -161
  486. package/src/routes/admin/billing.ts +0 -48
  487. package/src/routes/admin/helpers.ts +0 -50
  488. package/src/routes/admin/index.ts +0 -16
  489. package/src/routes/admin/organizations.ts +0 -299
  490. package/src/routes/admin/permissions.ts +0 -80
  491. package/src/routes/admin/platform.ts +0 -335
  492. package/src/routes/admin/sso.ts +0 -138
  493. package/src/routes/admin/webhooks.ts +0 -73
  494. package/src/routes/admin.ts +0 -1
  495. package/src/routes/apiKeys.ts +0 -60
  496. package/src/routes/auth.ts +0 -214
  497. package/src/routes/authz.ts +0 -38
  498. package/src/routes/config.ts +0 -67
  499. package/src/routes/emailVerification.ts +0 -73
  500. package/src/routes/federation.ts +0 -156
  501. package/src/routes/helpers.ts +0 -17
  502. package/src/routes/magicLinks.ts +0 -107
  503. package/src/routes/oauth.ts +0 -167
  504. package/src/routes/oauth2.ts +0 -284
  505. package/src/routes/oidcEnterprise.ts +0 -166
  506. package/src/routes/password.ts +0 -90
  507. package/src/routes/profile.ts +0 -44
  508. package/src/routes/saml.ts +0 -209
  509. package/src/routes/scim.ts +0 -199
  510. package/src/routes/sdk.ts +0 -141
  511. package/src/routes/serviceAccounts.ts +0 -124
  512. package/src/routes/sessions.ts +0 -62
  513. package/src/routes/setup.ts +0 -315
  514. package/src/routes/smsOtp.ts +0 -67
  515. package/src/routes/totp.ts +0 -122
  516. package/src/routes/webauthn.ts +0 -147
  517. package/src/routes/workflows.ts +0 -157
  518. package/src/sdk/index.ts +0 -152
  519. package/src/sdk/types.ts +0 -54
  520. package/src/services/anomalyDetection.ts +0 -73
  521. package/src/services/application/authentication.ts +0 -75
  522. package/src/services/application/identity.ts +0 -56
  523. package/src/services/application/index.ts +0 -3
  524. package/src/services/application/organization.ts +0 -77
  525. package/src/services/applications.ts +0 -89
  526. package/src/services/audit.ts +0 -41
  527. package/src/services/auditExport.ts +0 -59
  528. package/src/services/billing.ts +0 -87
  529. package/src/services/cache.ts +0 -131
  530. package/src/services/configuration/profiles.ts +0 -115
  531. package/src/services/configuration.ts +0 -120
  532. package/src/services/connectors/google.ts +0 -92
  533. package/src/services/connectors/oidc.ts +0 -111
  534. package/src/services/connectors/registry.ts +0 -124
  535. package/src/services/connectors/types.ts +0 -38
  536. package/src/services/connectors/zitadel.ts +0 -77
  537. package/src/services/devices.ts +0 -76
  538. package/src/services/domain/authentication.ts +0 -279
  539. package/src/services/domain/authorization.ts +0 -49
  540. package/src/services/domain/identity.ts +0 -108
  541. package/src/services/domain/index.ts +0 -4
  542. package/src/services/domain/organization.ts +0 -114
  543. package/src/services/email.ts +0 -167
  544. package/src/services/emailVerification.ts +0 -75
  545. package/src/services/enterpriseSso.ts +0 -58
  546. package/src/services/events/bus.ts +0 -43
  547. package/src/services/events/subscribers/anomaly.ts +0 -13
  548. package/src/services/events/subscribers/auditLog.ts +0 -21
  549. package/src/services/events/subscribers/webhook.ts +0 -39
  550. package/src/services/events/subscribers/webhookDispatch.ts +0 -14
  551. package/src/services/events/types.ts +0 -106
  552. package/src/services/events/validate.ts +0 -118
  553. package/src/services/featureFlags.ts +0 -90
  554. package/src/services/features.ts +0 -22
  555. package/src/services/federation.ts +0 -30
  556. package/src/services/hibp.ts +0 -28
  557. package/src/services/ipControls.ts +0 -99
  558. package/src/services/magicLinks.ts +0 -51
  559. package/src/services/oauth2.ts +0 -216
  560. package/src/services/organizations.ts +0 -171
  561. package/src/services/permissions.ts +0 -146
  562. package/src/services/plugins/registry.ts +0 -242
  563. package/src/services/plugins/types.ts +0 -98
  564. package/src/services/queue/bullmq.ts +0 -104
  565. package/src/services/queue/inProcess.ts +0 -75
  566. package/src/services/queue/index.ts +0 -19
  567. package/src/services/queue/types.ts +0 -26
  568. package/src/services/redis.ts +0 -16
  569. package/src/services/secrets/awsKms.ts +0 -97
  570. package/src/services/secrets/azureKeyVault.ts +0 -171
  571. package/src/services/secrets/database.ts +0 -166
  572. package/src/services/secrets/environment.ts +0 -117
  573. package/src/services/secrets/index.ts +0 -50
  574. package/src/services/secrets/password.ts +0 -73
  575. package/src/services/secrets/provider.ts +0 -36
  576. package/src/services/secrets/vault.ts +0 -149
  577. package/src/services/secrets.ts +0 -2
  578. package/src/services/serviceAccounts.ts +0 -74
  579. package/src/services/setup/configWriter.ts +0 -200
  580. package/src/services/setup/diagnostics.ts +0 -76
  581. package/src/services/setup/token.ts +0 -42
  582. package/src/services/setup/types.ts +0 -40
  583. package/src/services/setup/validation.ts +0 -205
  584. package/src/services/sms.ts +0 -81
  585. package/src/services/smsOtp.ts +0 -74
  586. package/src/services/tokens.ts +0 -287
  587. package/src/services/totp.ts +0 -113
  588. package/src/services/users.ts +0 -239
  589. package/src/services/webauthn.ts +0 -193
  590. package/src/services/webhooks.ts +0 -190
  591. package/src/services/workflows/engine.ts +0 -125
  592. package/src/services/workflows/steps.ts +0 -129
  593. package/src/services/zitadel.ts +0 -277
  594. package/src/setup-server.ts +0 -71
  595. package/src/tests/errors.test.ts +0 -74
  596. package/src/tests/events.test.ts +0 -52
  597. package/src/tests/featureFlags.test.ts +0 -26
  598. package/src/tests/integration/queue.test.ts +0 -54
  599. package/src/tests/plugins.test.ts +0 -73
  600. package/src/tests/result.test.ts +0 -52
  601. package/src/tests/setup/configWriter.test.ts +0 -69
  602. package/src/tests/setup/validation.test.ts +0 -29
  603. package/src/tests/smoke.test.ts +0 -136
  604. package/src/types.ts +0 -70
@@ -1,171 +0,0 @@
1
- import { eq, and, sql } from "drizzle-orm";
2
- import { db } from "../db/index.js";
3
- import { organizations, orgMemberships, users, type Organization, type OrgMembership } from "../db/schema.js";
4
-
5
- export type OrgRole = "owner" | "admin" | "member";
6
-
7
- export function slugify(name: string): string {
8
- return name
9
- .toLowerCase()
10
- .trim()
11
- .replace(/[^a-z0-9]+/g, "-")
12
- .replace(/^-+|-+$/g, "")
13
- .slice(0, 64);
14
- }
15
-
16
- export async function createOrganization(input: {
17
- name: string;
18
- slug?: string;
19
- plan?: string;
20
- }): Promise<Organization> {
21
- const baseSlug = input.slug || slugify(input.name);
22
- const slug = await ensureUniqueSlug(baseSlug);
23
-
24
- const [org] = await db
25
- .insert(organizations)
26
- .values({
27
- name: input.name,
28
- slug,
29
- plan: input.plan || "free",
30
- })
31
- .returning();
32
- return org;
33
- }
34
-
35
- export async function findOrganizationById(id: string): Promise<Organization | undefined> {
36
- const [org] = await db.select().from(organizations).where(eq(organizations.id, id)).limit(1);
37
- return org;
38
- }
39
-
40
- export async function findOrganizationBySlug(slug: string): Promise<Organization | undefined> {
41
- const [org] = await db.select().from(organizations).where(eq(organizations.slug, slug)).limit(1);
42
- return org;
43
- }
44
-
45
- export async function findOrganizationsByUserId(userId: string): Promise<Organization[]> {
46
- const rows = await db
47
- .select({ org: organizations })
48
- .from(orgMemberships)
49
- .where(eq(orgMemberships.userId, userId))
50
- .innerJoin(organizations, eq(orgMemberships.orgId, organizations.id));
51
- return rows.map((r) => r.org);
52
- }
53
-
54
- export async function addOrgMembership(input: {
55
- orgId: string;
56
- userId: string;
57
- role: OrgRole;
58
- }): Promise<OrgMembership> {
59
- const [membership] = await db
60
- .insert(orgMemberships)
61
- .values({
62
- orgId: input.orgId,
63
- userId: input.userId,
64
- role: input.role,
65
- })
66
- .onConflictDoNothing({ target: [orgMemberships.orgId, orgMemberships.userId] })
67
- .returning();
68
-
69
- if (membership) return membership;
70
-
71
- const [existing] = await db
72
- .select()
73
- .from(orgMemberships)
74
- .where(and(eq(orgMemberships.orgId, input.orgId), eq(orgMemberships.userId, input.userId)))
75
- .limit(1);
76
- return existing;
77
- }
78
-
79
- export async function findMembership(
80
- orgId: string,
81
- userId: string
82
- ): Promise<OrgMembership | undefined> {
83
- const [membership] = await db
84
- .select()
85
- .from(orgMemberships)
86
- .where(and(eq(orgMemberships.orgId, orgId), eq(orgMemberships.userId, userId)))
87
- .limit(1);
88
- return membership;
89
- }
90
-
91
- export async function updateMembershipRole(
92
- orgId: string,
93
- userId: string,
94
- role: OrgRole
95
- ): Promise<OrgMembership | undefined> {
96
- const [updated] = await db
97
- .update(orgMemberships)
98
- .set({ role, updatedAt: sql`now()` })
99
- .where(and(eq(orgMemberships.orgId, orgId), eq(orgMemberships.userId, userId)))
100
- .returning();
101
- return updated;
102
- }
103
-
104
- export async function removeMembership(orgId: string, userId: string): Promise<boolean> {
105
- const deleted = await db
106
- .delete(orgMemberships)
107
- .where(and(eq(orgMemberships.orgId, orgId), eq(orgMemberships.userId, userId)))
108
- .returning();
109
- return deleted.length > 0;
110
- }
111
-
112
- export async function countOwners(orgId: string): Promise<number> {
113
- const rows = await db
114
- .select({ count: sql<number>`count(*)`.mapWith(Number) })
115
- .from(orgMemberships)
116
- .where(and(eq(orgMemberships.orgId, orgId), eq(orgMemberships.role, "owner")));
117
- return rows[0]?.count ?? 0;
118
- }
119
-
120
- export async function requireOrgRole(
121
- userId: string,
122
- orgId: string,
123
- allowedRoles: OrgRole[]
124
- ): Promise<OrgMembership> {
125
- const membership = await findMembership(orgId, userId);
126
- if (!membership) {
127
- const error = new Error("Not a member of this organization") as Error & { statusCode: number };
128
- error.statusCode = 403;
129
- throw error;
130
- }
131
- if (!allowedRoles.includes(membership.role as OrgRole)) {
132
- const error = new Error("Insufficient organization permissions") as Error & {
133
- statusCode: number;
134
- };
135
- error.statusCode = 403;
136
- throw error;
137
- }
138
- return membership;
139
- }
140
-
141
- export async function listOrgMembers(orgId: string) {
142
- return db
143
- .select({
144
- membership: orgMemberships,
145
- user: {
146
- id: users.id,
147
- email: users.email,
148
- username: users.username,
149
- name: users.name,
150
- avatarUrl: users.avatarUrl,
151
- },
152
- })
153
- .from(orgMemberships)
154
- .where(eq(orgMemberships.orgId, orgId))
155
- .innerJoin(users, eq(orgMemberships.userId, users.id));
156
- }
157
-
158
- async function ensureUniqueSlug(base: string): Promise<string> {
159
- let slug = base || "org";
160
- let counter = 2;
161
- while (true) {
162
- const existing = await db
163
- .select({ id: organizations.id })
164
- .from(organizations)
165
- .where(eq(organizations.slug, slug))
166
- .limit(1);
167
- if (existing.length === 0) return slug;
168
- slug = `${base}-${counter}`;
169
- counter++;
170
- }
171
- }
@@ -1,146 +0,0 @@
1
- import { eq, and, inArray } from "drizzle-orm";
2
- import { db } from "../db/index.js";
3
- import { permissions, rolePermissions, type Permission } from "../db/schema.js";
4
-
5
- export type PermissionInput = {
6
- resource: string;
7
- action: string;
8
- };
9
-
10
- export const DEFAULT_PERMISSIONS: PermissionInput[] = [
11
- { resource: "organization", action: "read" },
12
- { resource: "organization", action: "update" },
13
- { resource: "organization", action: "delete" },
14
- { resource: "organization", action: "invite" },
15
- { resource: "organization", action: "manage_members" },
16
- { resource: "application", action: "read" },
17
- { resource: "application", action: "create" },
18
- { resource: "application", action: "update" },
19
- { resource: "application", action: "delete" },
20
- { resource: "service_account", action: "read" },
21
- { resource: "service_account", action: "create" },
22
- { resource: "service_account", action: "update" },
23
- { resource: "service_account", action: "delete" },
24
- { resource: "api_key", action: "read" },
25
- { resource: "api_key", action: "create" },
26
- { resource: "api_key", action: "revoke" },
27
- { resource: "audit_log", action: "read" },
28
- ];
29
-
30
- export const DEFAULT_ROLE_PERMISSIONS: Record<string, string[]> = {
31
- owner: DEFAULT_PERMISSIONS.map((p) => `${p.resource}:${p.action}`),
32
- admin: [
33
- "organization:read",
34
- "organization:update",
35
- "organization:invite",
36
- "organization:manage_members",
37
- "application:read",
38
- "application:create",
39
- "application:update",
40
- "service_account:read",
41
- "service_account:create",
42
- "service_account:update",
43
- "api_key:read",
44
- "api_key:create",
45
- "api_key:revoke",
46
- "audit_log:read",
47
- ],
48
- member: [
49
- "organization:read",
50
- "application:read",
51
- "service_account:read",
52
- "api_key:read",
53
- ],
54
- viewer: ["organization:read", "application:read", "audit_log:read"],
55
- };
56
-
57
- export function permissionKey(resource: string, action: string): string {
58
- return `${resource}:${action}`;
59
- }
60
-
61
- export async function ensurePermissionsSeeded(): Promise<void> {
62
- const existing = await db.select().from(permissions);
63
- const existingKeys = new Set(existing.map((p) => permissionKey(p.resource, p.action)));
64
-
65
- const toInsert = DEFAULT_PERMISSIONS.filter(
66
- (p) => !existingKeys.has(permissionKey(p.resource, p.action))
67
- );
68
-
69
- if (toInsert.length > 0) {
70
- await db.insert(permissions).values(toInsert);
71
- }
72
- }
73
-
74
- export async function ensureRolePermissionsSeeded(): Promise<void> {
75
- await ensurePermissionsSeeded();
76
- const allPermissions = await db.select().from(permissions);
77
- const permissionByKey = new Map(allPermissions.map((p) => [permissionKey(p.resource, p.action), p.id]));
78
-
79
- for (const [role, perms] of Object.entries(DEFAULT_ROLE_PERMISSIONS)) {
80
- const permissionIds = perms
81
- .map((key) => permissionByKey.get(key))
82
- .filter((id): id is string => Boolean(id));
83
-
84
- for (const permissionId of permissionIds) {
85
- await db
86
- .insert(rolePermissions)
87
- .values({ role, permissionId })
88
- .onConflictDoNothing({ target: [rolePermissions.role, rolePermissions.permissionId] });
89
- }
90
- }
91
- }
92
-
93
- export async function listPermissions(): Promise<Permission[]> {
94
- return db.select().from(permissions).orderBy(permissions.resource, permissions.action);
95
- }
96
-
97
- export async function listPermissionsForRole(role: string): Promise<Permission[]> {
98
- const rows = await db
99
- .select({ permission: permissions })
100
- .from(rolePermissions)
101
- .where(eq(rolePermissions.role, role))
102
- .innerJoin(permissions, eq(rolePermissions.permissionId, permissions.id));
103
- return rows.map((r) => r.permission);
104
- }
105
-
106
- export async function listPermissionKeysForRole(role: string): Promise<Set<string>> {
107
- const perms = await listPermissionsForRole(role);
108
- return new Set(perms.map((p) => permissionKey(p.resource, p.action)));
109
- }
110
-
111
- export async function assignPermissionToRole(role: string, permissionId: string): Promise<void> {
112
- await db
113
- .insert(rolePermissions)
114
- .values({ role, permissionId })
115
- .onConflictDoNothing({ target: [rolePermissions.role, rolePermissions.permissionId] });
116
- }
117
-
118
- export async function removePermissionFromRole(role: string, permissionId: string): Promise<void> {
119
- await db
120
- .delete(rolePermissions)
121
- .where(and(eq(rolePermissions.role, role), eq(rolePermissions.permissionId, permissionId)));
122
- }
123
-
124
- export async function hasPermission(role: string, resource: string, action: string): Promise<boolean> {
125
- const key = permissionKey(resource, action);
126
- const keys = await listPermissionKeysForRole(role);
127
- return keys.has(key);
128
- }
129
-
130
- export async function hasAnyPermission(role: string, required: PermissionInput[]): Promise<boolean> {
131
- const keys = await listPermissionKeysForRole(role);
132
- return required.some((p) => keys.has(permissionKey(p.resource, p.action)));
133
- }
134
-
135
- export async function requirePermission(
136
- role: string,
137
- resource: string,
138
- action: string
139
- ): Promise<void> {
140
- const allowed = await hasPermission(role, resource, action);
141
- if (!allowed) {
142
- const error = new Error(`Missing permission ${resource}:${action}`) as Error & { statusCode: number };
143
- error.statusCode = 403;
144
- throw error;
145
- }
146
- }
@@ -1,242 +0,0 @@
1
- import type {
2
- KeystonePlugin,
3
- PluginMetadata,
4
- WorkflowStepExecutor,
5
- AuthenticationMethod,
6
- AnalyticsProvider,
7
- BillingProvider,
8
- AuthorizationPolicy,
9
- RegisteredPluginSummary,
10
- ExtensionPointSummary,
11
- } from "./types.js";
12
- import type { IdentityConnector } from "../connectors/types.js";
13
- import type { EmailProvider } from "../email.js";
14
- import type { SmsProvider } from "../sms.js";
15
-
16
- const plugins: KeystonePlugin[] = [];
17
- const connectorFactories = new Map<string, (config?: Record<string, unknown>) => IdentityConnector>();
18
- const workflowStepExecutors = new Map<string, WorkflowStepExecutor>();
19
- const authenticationMethodFactories = new Map<string, (config?: Record<string, unknown>) => AuthenticationMethod>();
20
- const analyticsProviderFactories = new Map<string, (config?: Record<string, unknown>) => AnalyticsProvider>();
21
- const billingProviderFactories = new Map<string, (config?: Record<string, unknown>) => BillingProvider>();
22
- const authorizationPolicyFactories = new Map<string, (config?: Record<string, unknown>) => AuthorizationPolicy>();
23
- let emailProvider: EmailProvider | undefined;
24
- let smsProvider: SmsProvider | undefined;
25
-
26
- function collectExtensionPoints(plugin: KeystonePlugin): string[] {
27
- const points: string[] = [];
28
- if (plugin.connectors) points.push("connectors");
29
- if (plugin.emailProvider) points.push("emailProvider");
30
- if (plugin.smsProvider) points.push("smsProvider");
31
- if (plugin.workflowSteps) points.push("workflowSteps");
32
- if (plugin.authenticationMethods) points.push("authenticationMethods");
33
- if (plugin.analyticsProviders) points.push("analyticsProviders");
34
- if (plugin.billingProviders) points.push("billingProviders");
35
- if (plugin.authorizationPolicies) points.push("authorizationPolicies");
36
- return points;
37
- }
38
-
39
- export function registerPlugin(plugin: KeystonePlugin): void {
40
- plugins.push(plugin);
41
-
42
- if (plugin.connectors) {
43
- for (const [type, factory] of Object.entries(plugin.connectors)) {
44
- connectorFactories.set(type, factory);
45
- }
46
- }
47
-
48
- if (plugin.emailProvider) {
49
- emailProvider = plugin.emailProvider;
50
- }
51
-
52
- if (plugin.smsProvider) {
53
- smsProvider = plugin.smsProvider;
54
- }
55
-
56
- if (plugin.workflowSteps) {
57
- for (const [type, executor] of Object.entries(plugin.workflowSteps)) {
58
- workflowStepExecutors.set(type, executor);
59
- }
60
- }
61
-
62
- if (plugin.authenticationMethods) {
63
- for (const [type, factory] of Object.entries(plugin.authenticationMethods)) {
64
- authenticationMethodFactories.set(type, factory);
65
- }
66
- }
67
-
68
- if (plugin.analyticsProviders) {
69
- for (const [type, factory] of Object.entries(plugin.analyticsProviders)) {
70
- analyticsProviderFactories.set(type, factory);
71
- }
72
- }
73
-
74
- if (plugin.billingProviders) {
75
- for (const [type, factory] of Object.entries(plugin.billingProviders)) {
76
- billingProviderFactories.set(type, factory);
77
- }
78
- }
79
-
80
- if (plugin.authorizationPolicies) {
81
- for (const [type, factory] of Object.entries(plugin.authorizationPolicies)) {
82
- authorizationPolicyFactories.set(type, factory);
83
- }
84
- }
85
-
86
- if (plugin.onRegister) {
87
- Promise.resolve(plugin.onRegister()).catch((err) => {
88
- console.error(`Plugin ${plugin.metadata.name} onRegister failed:`, err);
89
- });
90
- }
91
- }
92
-
93
- export function unregisterPlugin(name: string): boolean {
94
- const index = plugins.findIndex((p) => p.metadata.name === name);
95
- if (index === -1) return false;
96
-
97
- const [plugin] = plugins.splice(index, 1);
98
-
99
- if (plugin.connectors) {
100
- for (const type of Object.keys(plugin.connectors)) {
101
- connectorFactories.delete(type);
102
- }
103
- }
104
-
105
- if (plugin.workflowSteps) {
106
- for (const type of Object.keys(plugin.workflowSteps)) {
107
- workflowStepExecutors.delete(type);
108
- }
109
- }
110
-
111
- if (plugin.authenticationMethods) {
112
- for (const type of Object.keys(plugin.authenticationMethods)) {
113
- authenticationMethodFactories.delete(type);
114
- }
115
- }
116
-
117
- if (plugin.analyticsProviders) {
118
- for (const type of Object.keys(plugin.analyticsProviders)) {
119
- analyticsProviderFactories.delete(type);
120
- }
121
- }
122
-
123
- if (plugin.billingProviders) {
124
- for (const type of Object.keys(plugin.billingProviders)) {
125
- billingProviderFactories.delete(type);
126
- }
127
- }
128
-
129
- if (plugin.authorizationPolicies) {
130
- for (const type of Object.keys(plugin.authorizationPolicies)) {
131
- authorizationPolicyFactories.delete(type);
132
- }
133
- }
134
-
135
- if (plugin.emailProvider && emailProvider === plugin.emailProvider) {
136
- emailProvider = undefined;
137
- }
138
-
139
- if (plugin.smsProvider && smsProvider === plugin.smsProvider) {
140
- smsProvider = undefined;
141
- }
142
-
143
- if (plugin.onUnregister) {
144
- Promise.resolve(plugin.onUnregister()).catch((err) => {
145
- console.error(`Plugin ${plugin.metadata.name} onUnregister failed:`, err);
146
- });
147
- }
148
-
149
- return true;
150
- }
151
-
152
- export function getConnectorFactory(type: string): ((config?: Record<string, unknown>) => IdentityConnector) | undefined {
153
- return connectorFactories.get(type);
154
- }
155
-
156
- export function getPluginEmailProvider(): EmailProvider | undefined {
157
- return emailProvider;
158
- }
159
-
160
- export function getPluginSmsProvider(): SmsProvider | undefined {
161
- return smsProvider;
162
- }
163
-
164
- export function getPluginWorkflowStep(type: string): WorkflowStepExecutor | undefined {
165
- return workflowStepExecutors.get(type);
166
- }
167
-
168
- export function getAuthenticationMethodFactory(
169
- type: string
170
- ): ((config?: Record<string, unknown>) => AuthenticationMethod) | undefined {
171
- return authenticationMethodFactories.get(type);
172
- }
173
-
174
- export function getAnalyticsProviderFactory(
175
- type: string
176
- ): ((config?: Record<string, unknown>) => AnalyticsProvider) | undefined {
177
- return analyticsProviderFactories.get(type);
178
- }
179
-
180
- export function getBillingProviderFactory(
181
- type: string
182
- ): ((config?: Record<string, unknown>) => BillingProvider) | undefined {
183
- return billingProviderFactories.get(type);
184
- }
185
-
186
- export function getAuthorizationPolicyFactory(
187
- type: string
188
- ): ((config?: Record<string, unknown>) => AuthorizationPolicy) | undefined {
189
- return authorizationPolicyFactories.get(type);
190
- }
191
-
192
- export function listRegisteredPlugins(): RegisteredPluginSummary[] {
193
- return plugins.map((p) => ({
194
- metadata: p.metadata,
195
- extensionPoints: collectExtensionPoints(p),
196
- }));
197
- }
198
-
199
- export function listExtensionPoints(): ExtensionPointSummary[] {
200
- return [
201
- {
202
- name: "connectors",
203
- description: "Identity provider adapters (OAuth2/OIDC/SAML).",
204
- registered: Array.from(connectorFactories.keys()),
205
- },
206
- {
207
- name: "emailProvider",
208
- description: "Transactional email delivery backend.",
209
- registered: emailProvider?.name ? [emailProvider.name] : [],
210
- },
211
- {
212
- name: "smsProvider",
213
- description: "SMS delivery backend.",
214
- registered: smsProvider?.name ? [smsProvider.name] : [],
215
- },
216
- {
217
- name: "workflowSteps",
218
- description: "Reusable steps for automation workflows.",
219
- registered: Array.from(workflowStepExecutors.keys()),
220
- },
221
- {
222
- name: "authenticationMethods",
223
- description: "Alternative authentication mechanisms.",
224
- registered: Array.from(authenticationMethodFactories.keys()),
225
- },
226
- {
227
- name: "analyticsProviders",
228
- description: "Analytics and event tracking backends.",
229
- registered: Array.from(analyticsProviderFactories.keys()),
230
- },
231
- {
232
- name: "billingProviders",
233
- description: "Subscription and billing integrations.",
234
- registered: Array.from(billingProviderFactories.keys()),
235
- },
236
- {
237
- name: "authorizationPolicies",
238
- description: "Custom authorization policy engines.",
239
- registered: Array.from(authorizationPolicyFactories.keys()),
240
- },
241
- ];
242
- }
@@ -1,98 +0,0 @@
1
- import type { IdentityConnector } from "../connectors/types.js";
2
- import type { EmailProvider } from "../email.js";
3
- import type { SmsProvider } from "../sms.js";
4
- import type { WorkflowStep, StepContext, StepResult } from "../workflows/steps.js";
5
- import type { Result, KeystoneError } from "../../lib/result.js";
6
-
7
- export type WorkflowStepExecutor = (step: WorkflowStep, context: StepContext) => Promise<StepResult> | StepResult;
8
-
9
- export interface PluginMetadata {
10
- name: string;
11
- version: string;
12
- description?: string;
13
- author?: string;
14
- homepage?: string;
15
- }
16
-
17
- export interface AuthenticatedUser {
18
- id: string;
19
- email: string;
20
- emailVerified?: boolean;
21
- name?: string;
22
- picture?: string;
23
- username?: string;
24
- roles?: string[];
25
- }
26
-
27
- export interface AuthenticationMethodContext {
28
- body: Record<string, unknown>;
29
- ip: string;
30
- userAgent?: string;
31
- }
32
-
33
- export interface AuthenticationMethod {
34
- id: string;
35
- name: string;
36
- description?: string;
37
- authenticate(ctx: AuthenticationMethodContext): Promise<Result<AuthenticatedUser>>;
38
- }
39
-
40
- export interface AnalyticsEvent {
41
- type: string;
42
- timestamp: Date;
43
- payload: Record<string, unknown>;
44
- }
45
-
46
- export interface AnalyticsProvider {
47
- id: string;
48
- name: string;
49
- track(event: AnalyticsEvent): Promise<void>;
50
- identify?(userId: string, traits?: Record<string, unknown>): Promise<void>;
51
- page?(name: string, properties?: Record<string, unknown>): Promise<void>;
52
- }
53
-
54
- export interface BillingProvider {
55
- id: string;
56
- name?: string;
57
- createCustomer(tenantId: string, email: string): Promise<Record<string, unknown>>;
58
- subscribe(tenantId: string, planId: string): Promise<Record<string, unknown>>;
59
- getSubscription(tenantId: string): Promise<Record<string, unknown> | null>;
60
- }
61
-
62
- export interface AuthorizationPolicyContext {
63
- subjectId: string;
64
- action: string;
65
- resource: string;
66
- context?: Record<string, unknown>;
67
- }
68
-
69
- export interface AuthorizationPolicy {
70
- id: string;
71
- name: string;
72
- evaluate(ctx: AuthorizationPolicyContext): Promise<Result<boolean>> | Result<boolean>;
73
- }
74
-
75
- export interface KeystonePlugin {
76
- metadata: PluginMetadata;
77
- connectors?: Record<string, (config?: Record<string, unknown>) => IdentityConnector>;
78
- emailProvider?: EmailProvider;
79
- smsProvider?: SmsProvider;
80
- workflowSteps?: Record<string, WorkflowStepExecutor>;
81
- authenticationMethods?: Record<string, (config?: Record<string, unknown>) => AuthenticationMethod>;
82
- analyticsProviders?: Record<string, (config?: Record<string, unknown>) => AnalyticsProvider>;
83
- billingProviders?: Record<string, (config?: Record<string, unknown>) => BillingProvider>;
84
- authorizationPolicies?: Record<string, (config?: Record<string, unknown>) => AuthorizationPolicy>;
85
- onRegister?(): Promise<void> | void;
86
- onUnregister?(): Promise<void> | void;
87
- }
88
-
89
- export interface RegisteredPluginSummary {
90
- metadata: PluginMetadata;
91
- extensionPoints: string[];
92
- }
93
-
94
- export interface ExtensionPointSummary {
95
- name: string;
96
- description: string;
97
- registered: string[];
98
- }