@portaidentity/server 1.7.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 (742) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/LICENSE +21 -0
  3. package/README.md +33 -0
  4. package/dist/applications/cache.d.ts +64 -0
  5. package/dist/applications/cache.d.ts.map +1 -0
  6. package/dist/applications/cache.js +161 -0
  7. package/dist/applications/cache.js.map +1 -0
  8. package/dist/applications/errors.d.ts +25 -0
  9. package/dist/applications/errors.d.ts.map +1 -0
  10. package/dist/applications/errors.js +31 -0
  11. package/dist/applications/errors.js.map +1 -0
  12. package/dist/applications/index.d.ts +17 -0
  13. package/dist/applications/index.d.ts.map +1 -0
  14. package/dist/applications/index.js +19 -0
  15. package/dist/applications/index.js.map +1 -0
  16. package/dist/applications/repository.d.ts +184 -0
  17. package/dist/applications/repository.d.ts.map +1 -0
  18. package/dist/applications/repository.js +367 -0
  19. package/dist/applications/repository.js.map +1 -0
  20. package/dist/applications/service.d.ts +160 -0
  21. package/dist/applications/service.d.ts.map +1 -0
  22. package/dist/applications/service.js +388 -0
  23. package/dist/applications/service.js.map +1 -0
  24. package/dist/applications/slugs.d.ts +61 -0
  25. package/dist/applications/slugs.d.ts.map +1 -0
  26. package/dist/applications/slugs.js +115 -0
  27. package/dist/applications/slugs.js.map +1 -0
  28. package/dist/applications/types.d.ts +129 -0
  29. package/dist/applications/types.d.ts.map +1 -0
  30. package/dist/applications/types.js +62 -0
  31. package/dist/applications/types.js.map +1 -0
  32. package/dist/auth/csrf.d.ts +71 -0
  33. package/dist/auth/csrf.d.ts.map +1 -0
  34. package/dist/auth/csrf.js +112 -0
  35. package/dist/auth/csrf.js.map +1 -0
  36. package/dist/auth/email-renderer.d.ts +37 -0
  37. package/dist/auth/email-renderer.d.ts.map +1 -0
  38. package/dist/auth/email-renderer.js +116 -0
  39. package/dist/auth/email-renderer.js.map +1 -0
  40. package/dist/auth/email-service.d.ts +154 -0
  41. package/dist/auth/email-service.d.ts.map +1 -0
  42. package/dist/auth/email-service.js +415 -0
  43. package/dist/auth/email-service.js.map +1 -0
  44. package/dist/auth/email-transport.d.ts +65 -0
  45. package/dist/auth/email-transport.d.ts.map +1 -0
  46. package/dist/auth/email-transport.js +82 -0
  47. package/dist/auth/email-transport.js.map +1 -0
  48. package/dist/auth/i18n.d.ts +81 -0
  49. package/dist/auth/i18n.d.ts.map +1 -0
  50. package/dist/auth/i18n.js +395 -0
  51. package/dist/auth/i18n.js.map +1 -0
  52. package/dist/auth/index.d.ts +28 -0
  53. package/dist/auth/index.d.ts.map +1 -0
  54. package/dist/auth/index.js +31 -0
  55. package/dist/auth/index.js.map +1 -0
  56. package/dist/auth/interaction-authority.d.ts +39 -0
  57. package/dist/auth/interaction-authority.d.ts.map +1 -0
  58. package/dist/auth/interaction-authority.js +30 -0
  59. package/dist/auth/interaction-authority.js.map +1 -0
  60. package/dist/auth/magic-link-session.d.ts +81 -0
  61. package/dist/auth/magic-link-session.d.ts.map +1 -0
  62. package/dist/auth/magic-link-session.js +183 -0
  63. package/dist/auth/magic-link-session.js.map +1 -0
  64. package/dist/auth/rate-limiter.d.ts +143 -0
  65. package/dist/auth/rate-limiter.d.ts.map +1 -0
  66. package/dist/auth/rate-limiter.js +220 -0
  67. package/dist/auth/rate-limiter.js.map +1 -0
  68. package/dist/auth/recovery-crypto.d.ts +34 -0
  69. package/dist/auth/recovery-crypto.d.ts.map +1 -0
  70. package/dist/auth/recovery-crypto.js +103 -0
  71. package/dist/auth/recovery-crypto.js.map +1 -0
  72. package/dist/auth/recovery-job-processor.d.ts +24 -0
  73. package/dist/auth/recovery-job-processor.d.ts.map +1 -0
  74. package/dist/auth/recovery-job-processor.js +123 -0
  75. package/dist/auth/recovery-job-processor.js.map +1 -0
  76. package/dist/auth/recovery-job-repository.d.ts +219 -0
  77. package/dist/auth/recovery-job-repository.d.ts.map +1 -0
  78. package/dist/auth/recovery-job-repository.js +340 -0
  79. package/dist/auth/recovery-job-repository.js.map +1 -0
  80. package/dist/auth/recovery-service.d.ts +27 -0
  81. package/dist/auth/recovery-service.d.ts.map +1 -0
  82. package/dist/auth/recovery-service.js +53 -0
  83. package/dist/auth/recovery-service.js.map +1 -0
  84. package/dist/auth/recovery-worker.d.ts +158 -0
  85. package/dist/auth/recovery-worker.d.ts.map +1 -0
  86. package/dist/auth/recovery-worker.js +306 -0
  87. package/dist/auth/recovery-worker.js.map +1 -0
  88. package/dist/auth/template-engine.d.ts +134 -0
  89. package/dist/auth/template-engine.d.ts.map +1 -0
  90. package/dist/auth/template-engine.js +225 -0
  91. package/dist/auth/template-engine.js.map +1 -0
  92. package/dist/auth/token-repository.d.ts +238 -0
  93. package/dist/auth/token-repository.d.ts.map +1 -0
  94. package/dist/auth/token-repository.js +475 -0
  95. package/dist/auth/token-repository.js.map +1 -0
  96. package/dist/auth/tokens.d.ts +45 -0
  97. package/dist/auth/tokens.d.ts.map +1 -0
  98. package/dist/auth/tokens.js +51 -0
  99. package/dist/auth/tokens.js.map +1 -0
  100. package/dist/cli/bootstrap.d.ts +55 -0
  101. package/dist/cli/bootstrap.d.ts.map +1 -0
  102. package/dist/cli/bootstrap.js +90 -0
  103. package/dist/cli/bootstrap.js.map +1 -0
  104. package/dist/cli/commands/health.d.ts +20 -0
  105. package/dist/cli/commands/health.d.ts.map +1 -0
  106. package/dist/cli/commands/health.js +80 -0
  107. package/dist/cli/commands/health.js.map +1 -0
  108. package/dist/cli/commands/init.d.ts +48 -0
  109. package/dist/cli/commands/init.d.ts.map +1 -0
  110. package/dist/cli/commands/init.js +349 -0
  111. package/dist/cli/commands/init.js.map +1 -0
  112. package/dist/cli/commands/migrate.d.ts +19 -0
  113. package/dist/cli/commands/migrate.d.ts.map +1 -0
  114. package/dist/cli/commands/migrate.js +88 -0
  115. package/dist/cli/commands/migrate.js.map +1 -0
  116. package/dist/cli/commands/seed.d.ts +19 -0
  117. package/dist/cli/commands/seed.d.ts.map +1 -0
  118. package/dist/cli/commands/seed.js +71 -0
  119. package/dist/cli/commands/seed.js.map +1 -0
  120. package/dist/cli/commands/user-2fa.d.ts +29 -0
  121. package/dist/cli/commands/user-2fa.d.ts.map +1 -0
  122. package/dist/cli/commands/user-2fa.js +113 -0
  123. package/dist/cli/commands/user-2fa.js.map +1 -0
  124. package/dist/cli/error-handler.d.ts +31 -0
  125. package/dist/cli/error-handler.d.ts.map +1 -0
  126. package/dist/cli/error-handler.js +65 -0
  127. package/dist/cli/error-handler.js.map +1 -0
  128. package/dist/cli/index.d.ts +48 -0
  129. package/dist/cli/index.d.ts.map +1 -0
  130. package/dist/cli/index.js +99 -0
  131. package/dist/cli/index.js.map +1 -0
  132. package/dist/cli/output.d.ts +94 -0
  133. package/dist/cli/output.d.ts.map +1 -0
  134. package/dist/cli/output.js +124 -0
  135. package/dist/cli/output.js.map +1 -0
  136. package/dist/cli/prompt.d.ts +48 -0
  137. package/dist/cli/prompt.d.ts.map +1 -0
  138. package/dist/cli/prompt.js +96 -0
  139. package/dist/cli/prompt.js.map +1 -0
  140. package/dist/clients/cache.d.ts +63 -0
  141. package/dist/clients/cache.d.ts.map +1 -0
  142. package/dist/clients/cache.js +160 -0
  143. package/dist/clients/cache.js.map +1 -0
  144. package/dist/clients/crypto.d.ts +69 -0
  145. package/dist/clients/crypto.d.ts.map +1 -0
  146. package/dist/clients/crypto.js +83 -0
  147. package/dist/clients/crypto.js.map +1 -0
  148. package/dist/clients/errors.d.ts +27 -0
  149. package/dist/clients/errors.d.ts.map +1 -0
  150. package/dist/clients/errors.js +33 -0
  151. package/dist/clients/errors.js.map +1 -0
  152. package/dist/clients/index.d.ts +19 -0
  153. package/dist/clients/index.d.ts.map +1 -0
  154. package/dist/clients/index.js +23 -0
  155. package/dist/clients/index.js.map +1 -0
  156. package/dist/clients/repository.d.ts +161 -0
  157. package/dist/clients/repository.d.ts.map +1 -0
  158. package/dist/clients/repository.js +318 -0
  159. package/dist/clients/repository.js.map +1 -0
  160. package/dist/clients/resolve-login-methods.d.ts +74 -0
  161. package/dist/clients/resolve-login-methods.d.ts.map +1 -0
  162. package/dist/clients/resolve-login-methods.js +68 -0
  163. package/dist/clients/resolve-login-methods.js.map +1 -0
  164. package/dist/clients/secret-repository.d.ts +109 -0
  165. package/dist/clients/secret-repository.d.ts.map +1 -0
  166. package/dist/clients/secret-repository.js +166 -0
  167. package/dist/clients/secret-repository.js.map +1 -0
  168. package/dist/clients/secret-service.d.ts +87 -0
  169. package/dist/clients/secret-service.d.ts.map +1 -0
  170. package/dist/clients/secret-service.js +204 -0
  171. package/dist/clients/secret-service.js.map +1 -0
  172. package/dist/clients/service.d.ts +158 -0
  173. package/dist/clients/service.d.ts.map +1 -0
  174. package/dist/clients/service.js +523 -0
  175. package/dist/clients/service.js.map +1 -0
  176. package/dist/clients/types.d.ts +214 -0
  177. package/dist/clients/types.d.ts.map +1 -0
  178. package/dist/clients/types.js +77 -0
  179. package/dist/clients/types.js.map +1 -0
  180. package/dist/clients/validators.d.ts +87 -0
  181. package/dist/clients/validators.d.ts.map +1 -0
  182. package/dist/clients/validators.js +164 -0
  183. package/dist/clients/validators.js.map +1 -0
  184. package/dist/config/index.d.ts +23 -0
  185. package/dist/config/index.d.ts.map +1 -0
  186. package/dist/config/index.js +52 -0
  187. package/dist/config/index.js.map +1 -0
  188. package/dist/config/schema.d.ts +35 -0
  189. package/dist/config/schema.d.ts.map +1 -0
  190. package/dist/config/schema.js +167 -0
  191. package/dist/config/schema.js.map +1 -0
  192. package/dist/custom-claims/cache.d.ts +48 -0
  193. package/dist/custom-claims/cache.d.ts.map +1 -0
  194. package/dist/custom-claims/cache.js +122 -0
  195. package/dist/custom-claims/cache.js.map +1 -0
  196. package/dist/custom-claims/errors.d.ts +25 -0
  197. package/dist/custom-claims/errors.d.ts.map +1 -0
  198. package/dist/custom-claims/errors.js +31 -0
  199. package/dist/custom-claims/errors.js.map +1 -0
  200. package/dist/custom-claims/index.d.ts +14 -0
  201. package/dist/custom-claims/index.d.ts.map +1 -0
  202. package/dist/custom-claims/index.js +17 -0
  203. package/dist/custom-claims/index.js.map +1 -0
  204. package/dist/custom-claims/repository.d.ts +147 -0
  205. package/dist/custom-claims/repository.d.ts.map +1 -0
  206. package/dist/custom-claims/repository.js +338 -0
  207. package/dist/custom-claims/repository.js.map +1 -0
  208. package/dist/custom-claims/service.d.ts +129 -0
  209. package/dist/custom-claims/service.d.ts.map +1 -0
  210. package/dist/custom-claims/service.js +296 -0
  211. package/dist/custom-claims/service.js.map +1 -0
  212. package/dist/custom-claims/types.d.ts +132 -0
  213. package/dist/custom-claims/types.d.ts.map +1 -0
  214. package/dist/custom-claims/types.js +61 -0
  215. package/dist/custom-claims/types.js.map +1 -0
  216. package/dist/custom-claims/validators.d.ts +61 -0
  217. package/dist/custom-claims/validators.d.ts.map +1 -0
  218. package/dist/custom-claims/validators.js +136 -0
  219. package/dist/custom-claims/validators.js.map +1 -0
  220. package/dist/index.d.ts +14 -0
  221. package/dist/index.d.ts.map +1 -0
  222. package/dist/index.js +91 -0
  223. package/dist/index.js.map +1 -0
  224. package/dist/lib/admin-permissions.d.ts +147 -0
  225. package/dist/lib/admin-permissions.d.ts.map +1 -0
  226. package/dist/lib/admin-permissions.js +261 -0
  227. package/dist/lib/admin-permissions.js.map +1 -0
  228. package/dist/lib/audit-log.d.ts +45 -0
  229. package/dist/lib/audit-log.d.ts.map +1 -0
  230. package/dist/lib/audit-log.js +79 -0
  231. package/dist/lib/audit-log.js.map +1 -0
  232. package/dist/lib/branding-assets.d.ts +47 -0
  233. package/dist/lib/branding-assets.d.ts.map +1 -0
  234. package/dist/lib/branding-assets.js +93 -0
  235. package/dist/lib/branding-assets.js.map +1 -0
  236. package/dist/lib/bulk-operations.d.ts +54 -0
  237. package/dist/lib/bulk-operations.d.ts.map +1 -0
  238. package/dist/lib/bulk-operations.js +201 -0
  239. package/dist/lib/bulk-operations.js.map +1 -0
  240. package/dist/lib/cursor.d.ts +110 -0
  241. package/dist/lib/cursor.d.ts.map +1 -0
  242. package/dist/lib/cursor.js +115 -0
  243. package/dist/lib/cursor.js.map +1 -0
  244. package/dist/lib/data-export.d.ts +67 -0
  245. package/dist/lib/data-export.d.ts.map +1 -0
  246. package/dist/lib/data-export.js +272 -0
  247. package/dist/lib/data-export.js.map +1 -0
  248. package/dist/lib/data-import-plan.d.ts +50 -0
  249. package/dist/lib/data-import-plan.d.ts.map +1 -0
  250. package/dist/lib/data-import-plan.js +235 -0
  251. package/dist/lib/data-import-plan.js.map +1 -0
  252. package/dist/lib/data-import.d.ts +276 -0
  253. package/dist/lib/data-import.d.ts.map +1 -0
  254. package/dist/lib/data-import.js +1694 -0
  255. package/dist/lib/data-import.js.map +1 -0
  256. package/dist/lib/database.d.ts +22 -0
  257. package/dist/lib/database.d.ts.map +1 -0
  258. package/dist/lib/database.js +103 -0
  259. package/dist/lib/database.js.map +1 -0
  260. package/dist/lib/entity-history.d.ts +52 -0
  261. package/dist/lib/entity-history.d.ts.map +1 -0
  262. package/dist/lib/entity-history.js +121 -0
  263. package/dist/lib/entity-history.js.map +1 -0
  264. package/dist/lib/etag.d.ts +92 -0
  265. package/dist/lib/etag.d.ts.map +1 -0
  266. package/dist/lib/etag.js +155 -0
  267. package/dist/lib/etag.js.map +1 -0
  268. package/dist/lib/image-validator.d.ts +44 -0
  269. package/dist/lib/image-validator.d.ts.map +1 -0
  270. package/dist/lib/image-validator.js +204 -0
  271. package/dist/lib/image-validator.js.map +1 -0
  272. package/dist/lib/logger.d.ts +15 -0
  273. package/dist/lib/logger.d.ts.map +1 -0
  274. package/dist/lib/logger.js +84 -0
  275. package/dist/lib/logger.js.map +1 -0
  276. package/dist/lib/migrator.d.ts +14 -0
  277. package/dist/lib/migrator.d.ts.map +1 -0
  278. package/dist/lib/migrator.js +34 -0
  279. package/dist/lib/migrator.js.map +1 -0
  280. package/dist/lib/redis.d.ts +5 -0
  281. package/dist/lib/redis.d.ts.map +1 -0
  282. package/dist/lib/redis.js +29 -0
  283. package/dist/lib/redis.js.map +1 -0
  284. package/dist/lib/runtime-paths.d.ts +38 -0
  285. package/dist/lib/runtime-paths.d.ts.map +1 -0
  286. package/dist/lib/runtime-paths.js +50 -0
  287. package/dist/lib/runtime-paths.js.map +1 -0
  288. package/dist/lib/session-tracking.d.ts +81 -0
  289. package/dist/lib/session-tracking.d.ts.map +1 -0
  290. package/dist/lib/session-tracking.js +145 -0
  291. package/dist/lib/session-tracking.js.map +1 -0
  292. package/dist/lib/signing-key-crypto.d.ts +53 -0
  293. package/dist/lib/signing-key-crypto.d.ts.map +1 -0
  294. package/dist/lib/signing-key-crypto.js +108 -0
  295. package/dist/lib/signing-key-crypto.js.map +1 -0
  296. package/dist/lib/signing-keys.d.ts +141 -0
  297. package/dist/lib/signing-keys.d.ts.map +1 -0
  298. package/dist/lib/signing-keys.js +206 -0
  299. package/dist/lib/signing-keys.js.map +1 -0
  300. package/dist/lib/stats.d.ts +83 -0
  301. package/dist/lib/stats.d.ts.map +1 -0
  302. package/dist/lib/stats.js +187 -0
  303. package/dist/lib/stats.js.map +1 -0
  304. package/dist/lib/super-admin-protection.d.ts +69 -0
  305. package/dist/lib/super-admin-protection.d.ts.map +1 -0
  306. package/dist/lib/super-admin-protection.js +102 -0
  307. package/dist/lib/super-admin-protection.js.map +1 -0
  308. package/dist/lib/system-config.d.ts +79 -0
  309. package/dist/lib/system-config.d.ts.map +1 -0
  310. package/dist/lib/system-config.js +159 -0
  311. package/dist/lib/system-config.js.map +1 -0
  312. package/dist/middleware/admin-auth.d.ts +100 -0
  313. package/dist/middleware/admin-auth.d.ts.map +1 -0
  314. package/dist/middleware/admin-auth.js +241 -0
  315. package/dist/middleware/admin-auth.js.map +1 -0
  316. package/dist/middleware/admin-cors.d.ts +41 -0
  317. package/dist/middleware/admin-cors.d.ts.map +1 -0
  318. package/dist/middleware/admin-cors.js +83 -0
  319. package/dist/middleware/admin-cors.js.map +1 -0
  320. package/dist/middleware/admin-mutation-audit.d.ts +9 -0
  321. package/dist/middleware/admin-mutation-audit.d.ts.map +1 -0
  322. package/dist/middleware/admin-mutation-audit.js +76 -0
  323. package/dist/middleware/admin-mutation-audit.js.map +1 -0
  324. package/dist/middleware/admin-rate-limiter.d.ts +56 -0
  325. package/dist/middleware/admin-rate-limiter.d.ts.map +1 -0
  326. package/dist/middleware/admin-rate-limiter.js +97 -0
  327. package/dist/middleware/admin-rate-limiter.js.map +1 -0
  328. package/dist/middleware/client-secret-hash.d.ts +34 -0
  329. package/dist/middleware/client-secret-hash.d.ts.map +1 -0
  330. package/dist/middleware/client-secret-hash.js +74 -0
  331. package/dist/middleware/client-secret-hash.js.map +1 -0
  332. package/dist/middleware/error-handler.d.ts +3 -0
  333. package/dist/middleware/error-handler.d.ts.map +1 -0
  334. package/dist/middleware/error-handler.js +93 -0
  335. package/dist/middleware/error-handler.js.map +1 -0
  336. package/dist/middleware/health.d.ts +3 -0
  337. package/dist/middleware/health.d.ts.map +1 -0
  338. package/dist/middleware/health.js +35 -0
  339. package/dist/middleware/health.js.map +1 -0
  340. package/dist/middleware/metrics.d.ts +40 -0
  341. package/dist/middleware/metrics.d.ts.map +1 -0
  342. package/dist/middleware/metrics.js +75 -0
  343. package/dist/middleware/metrics.js.map +1 -0
  344. package/dist/middleware/oidc-client-tenant.d.ts +37 -0
  345. package/dist/middleware/oidc-client-tenant.d.ts.map +1 -0
  346. package/dist/middleware/oidc-client-tenant.js +156 -0
  347. package/dist/middleware/oidc-client-tenant.js.map +1 -0
  348. package/dist/middleware/oidc-cors.d.ts +33 -0
  349. package/dist/middleware/oidc-cors.d.ts.map +1 -0
  350. package/dist/middleware/oidc-cors.js +68 -0
  351. package/dist/middleware/oidc-cors.js.map +1 -0
  352. package/dist/middleware/oidc-preflight-cors.d.ts +54 -0
  353. package/dist/middleware/oidc-preflight-cors.d.ts.map +1 -0
  354. package/dist/middleware/oidc-preflight-cors.js +267 -0
  355. package/dist/middleware/oidc-preflight-cors.js.map +1 -0
  356. package/dist/middleware/prompt-login-reset.d.ts +103 -0
  357. package/dist/middleware/prompt-login-reset.d.ts.map +1 -0
  358. package/dist/middleware/prompt-login-reset.js +204 -0
  359. package/dist/middleware/prompt-login-reset.js.map +1 -0
  360. package/dist/middleware/ready.d.ts +23 -0
  361. package/dist/middleware/ready.d.ts.map +1 -0
  362. package/dist/middleware/ready.js +60 -0
  363. package/dist/middleware/ready.js.map +1 -0
  364. package/dist/middleware/request-logger.d.ts +27 -0
  365. package/dist/middleware/request-logger.d.ts.map +1 -0
  366. package/dist/middleware/request-logger.js +46 -0
  367. package/dist/middleware/request-logger.js.map +1 -0
  368. package/dist/middleware/require-permission.d.ts +28 -0
  369. package/dist/middleware/require-permission.d.ts.map +1 -0
  370. package/dist/middleware/require-permission.js +63 -0
  371. package/dist/middleware/require-permission.js.map +1 -0
  372. package/dist/middleware/require-user-organization.d.ts +18 -0
  373. package/dist/middleware/require-user-organization.d.ts.map +1 -0
  374. package/dist/middleware/require-user-organization.js +53 -0
  375. package/dist/middleware/require-user-organization.js.map +1 -0
  376. package/dist/middleware/root-page.d.ts +62 -0
  377. package/dist/middleware/root-page.d.ts.map +1 -0
  378. package/dist/middleware/root-page.js +134 -0
  379. package/dist/middleware/root-page.js.map +1 -0
  380. package/dist/middleware/security-headers.d.ts +98 -0
  381. package/dist/middleware/security-headers.d.ts.map +1 -0
  382. package/dist/middleware/security-headers.js +159 -0
  383. package/dist/middleware/security-headers.js.map +1 -0
  384. package/dist/middleware/tenant-resolver.d.ts +37 -0
  385. package/dist/middleware/tenant-resolver.d.ts.map +1 -0
  386. package/dist/middleware/tenant-resolver.js +71 -0
  387. package/dist/middleware/tenant-resolver.js.map +1 -0
  388. package/dist/middleware/token-rate-limiter.d.ts +89 -0
  389. package/dist/middleware/token-rate-limiter.d.ts.map +1 -0
  390. package/dist/middleware/token-rate-limiter.js +189 -0
  391. package/dist/middleware/token-rate-limiter.js.map +1 -0
  392. package/dist/oidc/account-finder.d.ts +52 -0
  393. package/dist/oidc/account-finder.d.ts.map +1 -0
  394. package/dist/oidc/account-finder.js +134 -0
  395. package/dist/oidc/account-finder.js.map +1 -0
  396. package/dist/oidc/adapter-factory.d.ts +90 -0
  397. package/dist/oidc/adapter-factory.d.ts.map +1 -0
  398. package/dist/oidc/adapter-factory.js +165 -0
  399. package/dist/oidc/adapter-factory.js.map +1 -0
  400. package/dist/oidc/configuration.d.ts +155 -0
  401. package/dist/oidc/configuration.d.ts.map +1 -0
  402. package/dist/oidc/configuration.js +531 -0
  403. package/dist/oidc/configuration.js.map +1 -0
  404. package/dist/oidc/postgres-adapter.d.ts +159 -0
  405. package/dist/oidc/postgres-adapter.d.ts.map +1 -0
  406. package/dist/oidc/postgres-adapter.js +222 -0
  407. package/dist/oidc/postgres-adapter.js.map +1 -0
  408. package/dist/oidc/protocol-security-observer.d.ts +38 -0
  409. package/dist/oidc/protocol-security-observer.d.ts.map +1 -0
  410. package/dist/oidc/protocol-security-observer.js +93 -0
  411. package/dist/oidc/protocol-security-observer.js.map +1 -0
  412. package/dist/oidc/provider.d.ts +37 -0
  413. package/dist/oidc/provider.d.ts.map +1 -0
  414. package/dist/oidc/provider.js +71 -0
  415. package/dist/oidc/provider.js.map +1 -0
  416. package/dist/oidc/redis-adapter.d.ts +140 -0
  417. package/dist/oidc/redis-adapter.d.ts.map +1 -0
  418. package/dist/oidc/redis-adapter.js +344 -0
  419. package/dist/oidc/redis-adapter.js.map +1 -0
  420. package/dist/organizations/cache.d.ts +60 -0
  421. package/dist/organizations/cache.d.ts.map +1 -0
  422. package/dist/organizations/cache.js +157 -0
  423. package/dist/organizations/cache.js.map +1 -0
  424. package/dist/organizations/errors.d.ts +25 -0
  425. package/dist/organizations/errors.d.ts.map +1 -0
  426. package/dist/organizations/errors.js +31 -0
  427. package/dist/organizations/errors.js.map +1 -0
  428. package/dist/organizations/index.d.ts +15 -0
  429. package/dist/organizations/index.d.ts.map +1 -0
  430. package/dist/organizations/index.js +15 -0
  431. package/dist/organizations/index.js.map +1 -0
  432. package/dist/organizations/repository.d.ts +183 -0
  433. package/dist/organizations/repository.d.ts.map +1 -0
  434. package/dist/organizations/repository.js +354 -0
  435. package/dist/organizations/repository.js.map +1 -0
  436. package/dist/organizations/service.d.ts +168 -0
  437. package/dist/organizations/service.d.ts.map +1 -0
  438. package/dist/organizations/service.js +511 -0
  439. package/dist/organizations/service.js.map +1 -0
  440. package/dist/organizations/slugs.d.ts +57 -0
  441. package/dist/organizations/slugs.d.ts.map +1 -0
  442. package/dist/organizations/slugs.js +130 -0
  443. package/dist/organizations/slugs.js.map +1 -0
  444. package/dist/organizations/types.d.ts +146 -0
  445. package/dist/organizations/types.d.ts.map +1 -0
  446. package/dist/organizations/types.js +49 -0
  447. package/dist/organizations/types.js.map +1 -0
  448. package/dist/rbac/cache.d.ts +110 -0
  449. package/dist/rbac/cache.d.ts.map +1 -0
  450. package/dist/rbac/cache.js +271 -0
  451. package/dist/rbac/cache.js.map +1 -0
  452. package/dist/rbac/errors.d.ts +34 -0
  453. package/dist/rbac/errors.d.ts.map +1 -0
  454. package/dist/rbac/errors.js +43 -0
  455. package/dist/rbac/errors.js.map +1 -0
  456. package/dist/rbac/index.d.ts +17 -0
  457. package/dist/rbac/index.d.ts.map +1 -0
  458. package/dist/rbac/index.js +21 -0
  459. package/dist/rbac/index.js.map +1 -0
  460. package/dist/rbac/mapping-repository.d.ts +121 -0
  461. package/dist/rbac/mapping-repository.d.ts.map +1 -0
  462. package/dist/rbac/mapping-repository.js +224 -0
  463. package/dist/rbac/mapping-repository.js.map +1 -0
  464. package/dist/rbac/permission-repository.d.ts +100 -0
  465. package/dist/rbac/permission-repository.d.ts.map +1 -0
  466. package/dist/rbac/permission-repository.js +190 -0
  467. package/dist/rbac/permission-repository.js.map +1 -0
  468. package/dist/rbac/permission-service.d.ts +85 -0
  469. package/dist/rbac/permission-service.d.ts.map +1 -0
  470. package/dist/rbac/permission-service.js +179 -0
  471. package/dist/rbac/permission-service.js.map +1 -0
  472. package/dist/rbac/role-repository.d.ts +104 -0
  473. package/dist/rbac/role-repository.d.ts.map +1 -0
  474. package/dist/rbac/role-repository.js +202 -0
  475. package/dist/rbac/role-repository.js.map +1 -0
  476. package/dist/rbac/role-service.d.ts +111 -0
  477. package/dist/rbac/role-service.d.ts.map +1 -0
  478. package/dist/rbac/role-service.js +256 -0
  479. package/dist/rbac/role-service.js.map +1 -0
  480. package/dist/rbac/slugs.d.ts +116 -0
  481. package/dist/rbac/slugs.d.ts.map +1 -0
  482. package/dist/rbac/slugs.js +178 -0
  483. package/dist/rbac/slugs.js.map +1 -0
  484. package/dist/rbac/types.d.ts +187 -0
  485. package/dist/rbac/types.d.ts.map +1 -0
  486. package/dist/rbac/types.js +75 -0
  487. package/dist/rbac/types.js.map +1 -0
  488. package/dist/rbac/user-role-service.d.ts +101 -0
  489. package/dist/rbac/user-role-service.d.ts.map +1 -0
  490. package/dist/rbac/user-role-service.js +166 -0
  491. package/dist/rbac/user-role-service.js.map +1 -0
  492. package/dist/routes/applications.d.ts +40 -0
  493. package/dist/routes/applications.d.ts.map +1 -0
  494. package/dist/routes/applications.js +284 -0
  495. package/dist/routes/applications.js.map +1 -0
  496. package/dist/routes/audit.d.ts +31 -0
  497. package/dist/routes/audit.d.ts.map +1 -0
  498. package/dist/routes/audit.js +140 -0
  499. package/dist/routes/audit.js.map +1 -0
  500. package/dist/routes/branding.d.ts +17 -0
  501. package/dist/routes/branding.d.ts.map +1 -0
  502. package/dist/routes/branding.js +104 -0
  503. package/dist/routes/branding.js.map +1 -0
  504. package/dist/routes/bulk.d.ts +37 -0
  505. package/dist/routes/bulk.d.ts.map +1 -0
  506. package/dist/routes/bulk.js +94 -0
  507. package/dist/routes/bulk.js.map +1 -0
  508. package/dist/routes/clients.d.ts +44 -0
  509. package/dist/routes/clients.d.ts.map +1 -0
  510. package/dist/routes/clients.js +353 -0
  511. package/dist/routes/clients.js.map +1 -0
  512. package/dist/routes/config.d.ts +35 -0
  513. package/dist/routes/config.d.ts.map +1 -0
  514. package/dist/routes/config.js +115 -0
  515. package/dist/routes/config.js.map +1 -0
  516. package/dist/routes/custom-claims.d.ts +38 -0
  517. package/dist/routes/custom-claims.d.ts.map +1 -0
  518. package/dist/routes/custom-claims.js +208 -0
  519. package/dist/routes/custom-claims.js.map +1 -0
  520. package/dist/routes/exports.d.ts +21 -0
  521. package/dist/routes/exports.d.ts.map +1 -0
  522. package/dist/routes/exports.js +98 -0
  523. package/dist/routes/exports.js.map +1 -0
  524. package/dist/routes/imports.d.ts +18 -0
  525. package/dist/routes/imports.d.ts.map +1 -0
  526. package/dist/routes/imports.js +72 -0
  527. package/dist/routes/imports.js.map +1 -0
  528. package/dist/routes/interactions.d.ts +111 -0
  529. package/dist/routes/interactions.d.ts.map +1 -0
  530. package/dist/routes/interactions.js +1074 -0
  531. package/dist/routes/interactions.js.map +1 -0
  532. package/dist/routes/invitation.d.ts +31 -0
  533. package/dist/routes/invitation.d.ts.map +1 -0
  534. package/dist/routes/invitation.js +342 -0
  535. package/dist/routes/invitation.js.map +1 -0
  536. package/dist/routes/keys.d.ts +28 -0
  537. package/dist/routes/keys.d.ts.map +1 -0
  538. package/dist/routes/keys.js +91 -0
  539. package/dist/routes/keys.js.map +1 -0
  540. package/dist/routes/magic-link.d.ts +43 -0
  541. package/dist/routes/magic-link.d.ts.map +1 -0
  542. package/dist/routes/magic-link.js +264 -0
  543. package/dist/routes/magic-link.js.map +1 -0
  544. package/dist/routes/organizations.d.ts +38 -0
  545. package/dist/routes/organizations.d.ts.map +1 -0
  546. package/dist/routes/organizations.js +347 -0
  547. package/dist/routes/organizations.js.map +1 -0
  548. package/dist/routes/password-reset.d.ts +65 -0
  549. package/dist/routes/password-reset.d.ts.map +1 -0
  550. package/dist/routes/password-reset.js +493 -0
  551. package/dist/routes/password-reset.js.map +1 -0
  552. package/dist/routes/permissions.d.ts +33 -0
  553. package/dist/routes/permissions.d.ts.map +1 -0
  554. package/dist/routes/permissions.js +166 -0
  555. package/dist/routes/permissions.js.map +1 -0
  556. package/dist/routes/roles.d.ts +37 -0
  557. package/dist/routes/roles.d.ts.map +1 -0
  558. package/dist/routes/roles.js +222 -0
  559. package/dist/routes/roles.js.map +1 -0
  560. package/dist/routes/sessions.d.ts +37 -0
  561. package/dist/routes/sessions.d.ts.map +1 -0
  562. package/dist/routes/sessions.js +121 -0
  563. package/dist/routes/sessions.js.map +1 -0
  564. package/dist/routes/stats.d.ts +28 -0
  565. package/dist/routes/stats.d.ts.map +1 -0
  566. package/dist/routes/stats.js +65 -0
  567. package/dist/routes/stats.js.map +1 -0
  568. package/dist/routes/two-factor-admin.d.ts +54 -0
  569. package/dist/routes/two-factor-admin.d.ts.map +1 -0
  570. package/dist/routes/two-factor-admin.js +344 -0
  571. package/dist/routes/two-factor-admin.js.map +1 -0
  572. package/dist/routes/two-factor.d.ts +31 -0
  573. package/dist/routes/two-factor.d.ts.map +1 -0
  574. package/dist/routes/two-factor.js +595 -0
  575. package/dist/routes/two-factor.js.map +1 -0
  576. package/dist/routes/user-roles.d.ts +33 -0
  577. package/dist/routes/user-roles.d.ts.map +1 -0
  578. package/dist/routes/user-roles.js +129 -0
  579. package/dist/routes/user-roles.js.map +1 -0
  580. package/dist/routes/users.d.ts +61 -0
  581. package/dist/routes/users.d.ts.map +1 -0
  582. package/dist/routes/users.js +868 -0
  583. package/dist/routes/users.js.map +1 -0
  584. package/dist/security/decision-context.d.ts +52 -0
  585. package/dist/security/decision-context.d.ts.map +1 -0
  586. package/dist/security/decision-context.js +150 -0
  587. package/dist/security/decision-context.js.map +1 -0
  588. package/dist/security/decision-event.d.ts +128 -0
  589. package/dist/security/decision-event.d.ts.map +1 -0
  590. package/dist/security/decision-event.js +225 -0
  591. package/dist/security/decision-event.js.map +1 -0
  592. package/dist/security/transport-decision.d.ts +6 -0
  593. package/dist/security/transport-decision.d.ts.map +1 -0
  594. package/dist/security/transport-decision.js +37 -0
  595. package/dist/security/transport-decision.js.map +1 -0
  596. package/dist/server.d.ts +50 -0
  597. package/dist/server.d.ts.map +1 -0
  598. package/dist/server.js +491 -0
  599. package/dist/server.js.map +1 -0
  600. package/dist/two-factor/cache.d.ts +47 -0
  601. package/dist/two-factor/cache.d.ts.map +1 -0
  602. package/dist/two-factor/cache.js +122 -0
  603. package/dist/two-factor/cache.js.map +1 -0
  604. package/dist/two-factor/crypto.d.ts +41 -0
  605. package/dist/two-factor/crypto.d.ts.map +1 -0
  606. package/dist/two-factor/crypto.js +94 -0
  607. package/dist/two-factor/crypto.js.map +1 -0
  608. package/dist/two-factor/errors.d.ts +82 -0
  609. package/dist/two-factor/errors.d.ts.map +1 -0
  610. package/dist/two-factor/errors.js +112 -0
  611. package/dist/two-factor/errors.js.map +1 -0
  612. package/dist/two-factor/index.d.ts +18 -0
  613. package/dist/two-factor/index.d.ts.map +1 -0
  614. package/dist/two-factor/index.js +25 -0
  615. package/dist/two-factor/index.js.map +1 -0
  616. package/dist/two-factor/otp.d.ts +43 -0
  617. package/dist/two-factor/otp.d.ts.map +1 -0
  618. package/dist/two-factor/otp.js +57 -0
  619. package/dist/two-factor/otp.js.map +1 -0
  620. package/dist/two-factor/recovery.d.ts +45 -0
  621. package/dist/two-factor/recovery.d.ts.map +1 -0
  622. package/dist/two-factor/recovery.js +104 -0
  623. package/dist/two-factor/recovery.js.map +1 -0
  624. package/dist/two-factor/repository.d.ts +156 -0
  625. package/dist/two-factor/repository.d.ts.map +1 -0
  626. package/dist/two-factor/repository.js +251 -0
  627. package/dist/two-factor/repository.js.map +1 -0
  628. package/dist/two-factor/service.d.ts +232 -0
  629. package/dist/two-factor/service.d.ts.map +1 -0
  630. package/dist/two-factor/service.js +599 -0
  631. package/dist/two-factor/service.js.map +1 -0
  632. package/dist/two-factor/totp.d.ts +57 -0
  633. package/dist/two-factor/totp.d.ts.map +1 -0
  634. package/dist/two-factor/totp.js +96 -0
  635. package/dist/two-factor/totp.js.map +1 -0
  636. package/dist/two-factor/types.d.ts +152 -0
  637. package/dist/two-factor/types.d.ts.map +1 -0
  638. package/dist/two-factor/types.js +64 -0
  639. package/dist/two-factor/types.js.map +1 -0
  640. package/dist/users/cache.d.ts +49 -0
  641. package/dist/users/cache.d.ts.map +1 -0
  642. package/dist/users/cache.js +140 -0
  643. package/dist/users/cache.js.map +1 -0
  644. package/dist/users/claims.d.ts +67 -0
  645. package/dist/users/claims.d.ts.map +1 -0
  646. package/dist/users/claims.js +104 -0
  647. package/dist/users/claims.js.map +1 -0
  648. package/dist/users/errors.d.ts +25 -0
  649. package/dist/users/errors.d.ts.map +1 -0
  650. package/dist/users/errors.js +31 -0
  651. package/dist/users/errors.js.map +1 -0
  652. package/dist/users/gdpr.d.ts +110 -0
  653. package/dist/users/gdpr.d.ts.map +1 -0
  654. package/dist/users/gdpr.js +211 -0
  655. package/dist/users/gdpr.js.map +1 -0
  656. package/dist/users/index.d.ts +20 -0
  657. package/dist/users/index.d.ts.map +1 -0
  658. package/dist/users/index.js +19 -0
  659. package/dist/users/index.js.map +1 -0
  660. package/dist/users/password.d.ts +85 -0
  661. package/dist/users/password.d.ts.map +1 -0
  662. package/dist/users/password.js +138 -0
  663. package/dist/users/password.js.map +1 -0
  664. package/dist/users/repository.d.ts +263 -0
  665. package/dist/users/repository.d.ts.map +1 -0
  666. package/dist/users/repository.js +499 -0
  667. package/dist/users/repository.js.map +1 -0
  668. package/dist/users/service.d.ts +299 -0
  669. package/dist/users/service.d.ts.map +1 -0
  670. package/dist/users/service.js +698 -0
  671. package/dist/users/service.js.map +1 -0
  672. package/dist/users/types.d.ts +220 -0
  673. package/dist/users/types.d.ts.map +1 -0
  674. package/dist/users/types.js +77 -0
  675. package/dist/users/types.js.map +1 -0
  676. package/locales/default/en/common.json +10 -0
  677. package/locales/default/en/consent.json +13 -0
  678. package/locales/default/en/emails.json +17 -0
  679. package/locales/default/en/errors.json +21 -0
  680. package/locales/default/en/forgot-password.json +11 -0
  681. package/locales/default/en/invitation.json +18 -0
  682. package/locales/default/en/login.json +17 -0
  683. package/locales/default/en/logout.json +9 -0
  684. package/locales/default/en/magic-link.json +12 -0
  685. package/locales/default/en/reset-password.json +16 -0
  686. package/locales/default/en/two-factor.json +29 -0
  687. package/migrations/.gitkeep +0 -0
  688. package/migrations/001_extensions.sql +22 -0
  689. package/migrations/002_organizations.sql +43 -0
  690. package/migrations/003_applications.sql +50 -0
  691. package/migrations/004_clients.sql +74 -0
  692. package/migrations/005_users.sql +119 -0
  693. package/migrations/006_roles_permissions.sql +80 -0
  694. package/migrations/007_custom_claims.sql +55 -0
  695. package/migrations/008_config.sql +51 -0
  696. package/migrations/009_audit_log.sql +31 -0
  697. package/migrations/010_oidc_adapter.sql +34 -0
  698. package/migrations/011_seed.sql +53 -0
  699. package/migrations/012_two_factor.sql +88 -0
  700. package/migrations/013_client_secret_sha256.sql +22 -0
  701. package/migrations/014_login_methods.sql +34 -0
  702. package/migrations/015_signing_key_encryption.sql +20 -0
  703. package/migrations/016_failed_login_count.sql +27 -0
  704. package/migrations/017_audit_retention.sql +11 -0
  705. package/migrations/018_admin_api_enhancements.sql +78 -0
  706. package/migrations/019_invitation_details.sql +27 -0
  707. package/migrations/020_two_factor_admin_permission.sql +108 -0
  708. package/migrations/021_auth_recovery_jobs.sql +74 -0
  709. package/migrations/022_recovery_artifact_ownership.sql +25 -0
  710. package/migrations/023_magic_link_authority.sql +39 -0
  711. package/package.json +106 -0
  712. package/templates/default/emails/invitation.hbs +39 -0
  713. package/templates/default/emails/invitation.txt.hbs +18 -0
  714. package/templates/default/emails/magic-link.hbs +30 -0
  715. package/templates/default/emails/magic-link.txt.hbs +11 -0
  716. package/templates/default/emails/otp-code.hbs +31 -0
  717. package/templates/default/emails/otp-code.txt.hbs +15 -0
  718. package/templates/default/emails/password-changed.hbs +24 -0
  719. package/templates/default/emails/password-changed.txt.hbs +7 -0
  720. package/templates/default/emails/password-reset.hbs +30 -0
  721. package/templates/default/emails/password-reset.txt.hbs +11 -0
  722. package/templates/default/emails/welcome.hbs +25 -0
  723. package/templates/default/emails/welcome.txt.hbs +9 -0
  724. package/templates/default/layouts/main.hbs +49 -0
  725. package/templates/default/pages/accept-invite.hbs +25 -0
  726. package/templates/default/pages/consent.hbs +27 -0
  727. package/templates/default/pages/error.hbs +15 -0
  728. package/templates/default/pages/forgot-password.hbs +21 -0
  729. package/templates/default/pages/invite-expired.hbs +6 -0
  730. package/templates/default/pages/invite-success.hbs +9 -0
  731. package/templates/default/pages/login.hbs +108 -0
  732. package/templates/default/pages/logout-success.hbs +5 -0
  733. package/templates/default/pages/logout.hbs +24 -0
  734. package/templates/default/pages/magic-link-sent.hbs +10 -0
  735. package/templates/default/pages/magic-link-success.hbs +17 -0
  736. package/templates/default/pages/reset-password.hbs +20 -0
  737. package/templates/default/pages/reset-success.hbs +9 -0
  738. package/templates/default/pages/two-factor-setup.hbs +65 -0
  739. package/templates/default/pages/two-factor-verify.hbs +77 -0
  740. package/templates/default/partials/flash-messages.hbs +10 -0
  741. package/templates/default/partials/footer.hbs +4 -0
  742. package/templates/default/partials/header.hbs +8 -0
@@ -0,0 +1,90 @@
1
+ /**
2
+ * CLI bootstrap — direct-DB execution mode for infrastructure commands.
3
+ *
4
+ * Provides `withBootstrap()` for commands that need direct database/Redis
5
+ * access (init, migrate, seed, health --direct, user 2fa --direct).
6
+ *
7
+ * These commands run before or without the HTTP server, so they connect
8
+ * directly to PostgreSQL + Redis. The HTTP-based admin commands have been
9
+ * extracted to the standalone `@portaidentity/cli` package.
10
+ *
11
+ * Uses dynamic imports so that the config module (which validates env vars
12
+ * at load time) isn't triggered until bootstrap() is called. This allows
13
+ * CLI flag overrides (--database-url, --redis-url) to set process.env
14
+ * BEFORE config parses, making the overrides effective.
15
+ *
16
+ * @module cli/bootstrap
17
+ */
18
+ import 'dotenv/config';
19
+ /**
20
+ * Bootstrap the CLI environment: load dotenv, connect DB + Redis.
21
+ *
22
+ * CLI flags (--database-url, --redis-url) override env vars if provided.
23
+ * The overrides are applied to process.env BEFORE the config module loads,
24
+ * so they propagate through to connectDatabase() and connectRedis().
25
+ *
26
+ * @param argv - Parsed CLI global options from yargs
27
+ */
28
+ export async function bootstrap(argv) {
29
+ // CLI is a run-and-exit tool — suppress infrastructure logs (Database connected,
30
+ // Redis connected, etc.) that clutter both table and JSON output.
31
+ // Use --verbose to opt in to full diagnostic logging for debugging.
32
+ // Uses 'fatal' (quietest valid level) since the config schema doesn't allow 'silent'.
33
+ if (!argv.verbose) {
34
+ process.env.LOG_LEVEL = 'fatal';
35
+ }
36
+ // Override env vars BEFORE config module loads (via dynamic imports below).
37
+ // This ensures the config schema parses the CLI-provided URLs instead of .env values.
38
+ if (argv['database-url']) {
39
+ process.env.DATABASE_URL = argv['database-url'];
40
+ }
41
+ if (argv['redis-url']) {
42
+ process.env.REDIS_URL = argv['redis-url'];
43
+ }
44
+ // Dynamic imports ensure config/index.ts loads AFTER env var overrides are set.
45
+ // Static imports would trigger config validation at module-load time, before
46
+ // yargs has parsed argv, making CLI flag overrides ineffective.
47
+ const { connectDatabase } = await import('../lib/database.js');
48
+ const { connectRedis } = await import('../lib/redis.js');
49
+ await connectDatabase();
50
+ await connectRedis();
51
+ }
52
+ /**
53
+ * Clean shutdown: disconnect Redis then DB.
54
+ *
55
+ * Redis is disconnected first because some operations may flush
56
+ * cache entries to the database during shutdown.
57
+ */
58
+ export async function shutdown() {
59
+ const { disconnectRedis } = await import('../lib/redis.js');
60
+ const { disconnectDatabase } = await import('../lib/database.js');
61
+ await disconnectRedis();
62
+ await disconnectDatabase();
63
+ }
64
+ /**
65
+ * Convenience wrapper: bootstrap → run command → shutdown.
66
+ *
67
+ * Ensures cleanup happens even if the command throws an error.
68
+ * This is the recommended way for command handlers to use bootstrap:
69
+ *
70
+ * ```typescript
71
+ * await withBootstrap(argv, async () => {
72
+ * const orgs = await listOrganizations(pool);
73
+ * printTable(headers, rows);
74
+ * });
75
+ * ```
76
+ *
77
+ * @param argv - Parsed CLI global options from yargs
78
+ * @param fn - The command handler function to execute
79
+ * @returns The return value of the command handler
80
+ */
81
+ export async function withBootstrap(argv, fn) {
82
+ await bootstrap(argv);
83
+ try {
84
+ return await fn();
85
+ }
86
+ finally {
87
+ await shutdown();
88
+ }
89
+ }
90
+ //# sourceMappingURL=bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/cli/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,eAAe,CAAC;AAGvB;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAmB;IACjD,iFAAiF;IACjF,kEAAkE;IAClE,oEAAoE;IACpE,sFAAsF;IACtF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC;IAClC,CAAC;IAED,4EAA4E;IAC5E,sFAAsF;IACtF,IAAI,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;IAC5C,CAAC;IAED,gFAAgF;IAChF,6EAA6E;IAC7E,gEAAgE;IAChE,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAC/D,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAEzD,MAAM,eAAe,EAAE,CAAC;IACxB,MAAM,YAAY,EAAE,CAAC;AACvB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAC5D,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAElE,MAAM,eAAe,EAAE,CAAC;IACxB,MAAM,kBAAkB,EAAE,CAAC;AAC7B,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAmB,EACnB,EAAoB;IAEpB,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,EAAE,CAAC;IACpB,CAAC;YAAS,CAAC;QACT,MAAM,QAAQ,EAAE,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * CLI health check command — direct-DB mode only.
3
+ *
4
+ * Tests database and Redis connectivity directly by connecting
5
+ * to PostgreSQL and Redis via the bootstrap module.
6
+ *
7
+ * HTTP-based health checks are available in the standalone
8
+ * `@portaidentity/cli` package.
9
+ *
10
+ * Usage:
11
+ * porta health check # Table output with ✅/❌ per service
12
+ * porta health check --json # JSON output: { database: "ok"|"error", redis: "ok"|"error" }
13
+ *
14
+ * @module cli/commands/health
15
+ */
16
+ import type { CommandModule } from 'yargs';
17
+ import type { GlobalOptions } from '../index.js';
18
+ /** The health command module — registered at the top level of the CLI */
19
+ export declare const healthCommand: CommandModule<GlobalOptions, GlobalOptions>;
20
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/health.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAwCjD,yEAAyE;AACzE,eAAO,MAAM,aAAa,EAAE,aAAa,CAAC,aAAa,EAAE,aAAa,CA0CrE,CAAC"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * CLI health check command — direct-DB mode only.
3
+ *
4
+ * Tests database and Redis connectivity directly by connecting
5
+ * to PostgreSQL and Redis via the bootstrap module.
6
+ *
7
+ * HTTP-based health checks are available in the standalone
8
+ * `@portaidentity/cli` package.
9
+ *
10
+ * Usage:
11
+ * porta health check # Table output with ✅/❌ per service
12
+ * porta health check --json # JSON output: { database: "ok"|"error", redis: "ok"|"error" }
13
+ *
14
+ * @module cli/commands/health
15
+ */
16
+ import { withBootstrap } from '../bootstrap.js';
17
+ import { withErrorHandling } from '../error-handler.js';
18
+ import { printTable, success, error as errorMsg, outputResult } from '../output.js';
19
+ /**
20
+ * Check database connectivity directly.
21
+ */
22
+ async function checkDatabase() {
23
+ try {
24
+ const { getPool } = await import('../../lib/database.js');
25
+ await getPool().query('SELECT 1');
26
+ return { service: 'database', status: 'ok' };
27
+ }
28
+ catch (err) {
29
+ const message = err instanceof Error ? err.message : 'Unknown error';
30
+ return { service: 'database', status: 'error', message };
31
+ }
32
+ }
33
+ /**
34
+ * Check Redis connectivity directly.
35
+ */
36
+ async function checkRedis() {
37
+ try {
38
+ const { getRedis } = await import('../../lib/redis.js');
39
+ await getRedis().ping();
40
+ return { service: 'redis', status: 'ok' };
41
+ }
42
+ catch (err) {
43
+ const message = err instanceof Error ? err.message : 'Unknown error';
44
+ return { service: 'redis', status: 'error', message };
45
+ }
46
+ }
47
+ /** The health command module — registered at the top level of the CLI */
48
+ export const healthCommand = {
49
+ command: 'health',
50
+ describe: 'Check system health (direct DB + Redis)',
51
+ builder: (yargs) => {
52
+ return yargs.command('check', 'Test database and Redis connectivity', (y) => y, async (argv) => {
53
+ const args = argv;
54
+ await withErrorHandling(async () => {
55
+ let results = [];
56
+ await withBootstrap(args, async () => {
57
+ results = await Promise.all([checkDatabase(), checkRedis()]);
58
+ });
59
+ outputResult(args.json, () => {
60
+ const rows = results.map((r) => [
61
+ r.service,
62
+ r.status === 'ok' ? '✅ ok' : `❌ ${r.message ?? 'error'}`,
63
+ ]);
64
+ printTable(['Service', 'Status'], rows);
65
+ const allOk = results.every((r) => r.status === 'ok');
66
+ if (allOk) {
67
+ success('All services healthy');
68
+ }
69
+ else {
70
+ errorMsg('Some services are unhealthy');
71
+ }
72
+ }, Object.fromEntries(results.map((r) => [r.service, r.status])));
73
+ }, args.verbose);
74
+ }).demandCommand(1, 'Specify a health subcommand: check');
75
+ },
76
+ handler: () => {
77
+ // No-op — subcommands handle execution
78
+ },
79
+ };
80
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../../src/cli/commands/health.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * CLI init command — bootstrap Porta admin infrastructure.
3
+ *
4
+ * Solves the chicken-and-egg problem: you need an OIDC client to authenticate
5
+ * the CLI, but you need the CLI to create clients. `porta init` is a one-time,
6
+ * direct-DB bootstrap command that creates everything needed for subsequent
7
+ * OIDC-based authentication.
8
+ *
9
+ * Created entities:
10
+ * 1. "Porta Admin" application (slug: porta-admin)
11
+ * 2. Granular admin permissions (42 resource:action permissions)
12
+ * 3. Five admin roles with permission sets (super-admin, org-admin, etc.)
13
+ * 4. "Porta Admin CLI" public client (Auth Code + PKCE)
14
+ * 5. First admin user (interactive prompts or flags)
15
+ * 7. Super-admin role assigned to the user
16
+ * 8. Super-admin user ID stored in system_config
17
+ *
18
+ * Prerequisites:
19
+ * - Database migrations have been run (`porta migrate up`)
20
+ * - Super-admin organization exists (created by migration 011_seed.sql)
21
+ *
22
+ * Usage:
23
+ * porta init # Interactive — prompts for user details
24
+ * porta init --email admin@example.com # Non-interactive with flags
25
+ * --given-name Admin --family-name User --password 'Secret123!'
26
+ * porta init --force # Skip "already initialized" check
27
+ *
28
+ * @module cli/commands/init
29
+ */
30
+ import type { CommandModule } from 'yargs';
31
+ import type { GlobalOptions } from '../index.js';
32
+ /** Options specific to the init command (extends global CLI options) */
33
+ interface InitOptions extends GlobalOptions {
34
+ email?: string;
35
+ 'given-name'?: string;
36
+ 'family-name'?: string;
37
+ password?: string;
38
+ }
39
+ /**
40
+ * The init command module — registered at the top level of the CLI.
41
+ *
42
+ * Bootstraps all admin infrastructure entities in a single direct-DB
43
+ * operation. This is the only way to create the initial admin setup
44
+ * since the admin API requires authentication that doesn't exist yet.
45
+ */
46
+ export declare const initCommand: CommandModule<GlobalOptions, InitOptions>;
47
+ export {};
48
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAgBjD,wEAAwE;AACxE,UAAU,WAAY,SAAQ,aAAa;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA8JD;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,EAAE,aAAa,CAAC,aAAa,EAAE,WAAW,CA4QjE,CAAC"}
@@ -0,0 +1,349 @@
1
+ /**
2
+ * CLI init command — bootstrap Porta admin infrastructure.
3
+ *
4
+ * Solves the chicken-and-egg problem: you need an OIDC client to authenticate
5
+ * the CLI, but you need the CLI to create clients. `porta init` is a one-time,
6
+ * direct-DB bootstrap command that creates everything needed for subsequent
7
+ * OIDC-based authentication.
8
+ *
9
+ * Created entities:
10
+ * 1. "Porta Admin" application (slug: porta-admin)
11
+ * 2. Granular admin permissions (42 resource:action permissions)
12
+ * 3. Five admin roles with permission sets (super-admin, org-admin, etc.)
13
+ * 4. "Porta Admin CLI" public client (Auth Code + PKCE)
14
+ * 5. First admin user (interactive prompts or flags)
15
+ * 7. Super-admin role assigned to the user
16
+ * 8. Super-admin user ID stored in system_config
17
+ *
18
+ * Prerequisites:
19
+ * - Database migrations have been run (`porta migrate up`)
20
+ * - Super-admin organization exists (created by migration 011_seed.sql)
21
+ *
22
+ * Usage:
23
+ * porta init # Interactive — prompts for user details
24
+ * porta init --email admin@example.com # Non-interactive with flags
25
+ * --given-name Admin --family-name User --password 'Secret123!'
26
+ * porta init --force # Skip "already initialized" check
27
+ *
28
+ * @module cli/commands/init
29
+ */
30
+ import { withBootstrap } from '../bootstrap.js';
31
+ import { withErrorHandling } from '../error-handler.js';
32
+ import { success, warn } from '../output.js';
33
+ import { confirm, promptInput, promptPassword } from '../prompt.js';
34
+ import { ALL_ADMIN_PERMISSIONS, ADMIN_ROLE_DEFINITIONS, ALL_ADMIN_ROLES, } from '../../lib/admin-permissions.js';
35
+ import { SUPER_ADMIN_USER_ID_KEY } from '../../lib/super-admin-protection.js';
36
+ // ---------------------------------------------------------------------------
37
+ // Helpers
38
+ // ---------------------------------------------------------------------------
39
+ /**
40
+ * Build a human-readable permission name from a resource:action slug.
41
+ * Capitalizes the resource and action parts for display.
42
+ *
43
+ * @example
44
+ * buildPermissionName('org:create') → 'Organization Create'
45
+ * buildPermissionName('session:revoke') → 'Session Revoke'
46
+ *
47
+ * @param slug - Permission slug in resource:action format
48
+ * @returns Human-readable permission name
49
+ */
50
+ function buildPermissionName(slug) {
51
+ const [resource, action] = slug.split(':');
52
+ const capitalize = (s) => s.charAt(0).toUpperCase() + s.slice(1);
53
+ return `${capitalize(resource)} ${capitalize(action)}`;
54
+ }
55
+ /**
56
+ * Build a description for a permission from its slug.
57
+ *
58
+ * @param slug - Permission slug in resource:action format
59
+ * @returns Permission description
60
+ */
61
+ function buildPermissionDescription(slug) {
62
+ const [resource, action] = slug.split(':');
63
+ return `Permission to ${action} ${resource} resources`;
64
+ }
65
+ /**
66
+ * Pad a string to a fixed width for aligned box output.
67
+ * Truncates with ellipsis if the string exceeds the target length.
68
+ *
69
+ * @param str - The string to pad
70
+ * @param length - Target width in characters
71
+ * @returns Padded or truncated string
72
+ */
73
+ function padRight(str, length) {
74
+ if (str.length > length) {
75
+ return str.substring(0, length - 1) + '…';
76
+ }
77
+ return str + ' '.repeat(length - str.length);
78
+ }
79
+ /**
80
+ * Collect admin user details from interactive prompts or CLI flags.
81
+ *
82
+ * When all four flags (--email, --given-name, --family-name, --password)
83
+ * are provided, prompts are skipped entirely (non-interactive mode).
84
+ * Otherwise, missing fields are collected via interactive prompts.
85
+ * Password input uses hidden echo for security.
86
+ *
87
+ * @param argv - Parsed CLI options
88
+ * @returns Object with email, givenName, familyName, password
89
+ * @throws Error if required fields are empty or passwords don't match
90
+ */
91
+ async function collectAdminUserDetails(argv) {
92
+ // Collect each field from flags or prompts
93
+ const email = argv.email ?? (await promptInput('Admin email: '));
94
+ const givenName = argv['given-name'] ?? (await promptInput('First name: '));
95
+ const familyName = argv['family-name'] ?? (await promptInput('Last name: '));
96
+ let password;
97
+ if (argv.password) {
98
+ // Password provided via flag — use directly (non-interactive mode)
99
+ password = argv.password;
100
+ }
101
+ else {
102
+ // Interactive password entry with confirmation
103
+ password = await promptPassword('Password: ');
104
+ const confirmPw = await promptPassword('Confirm password: ');
105
+ if (password !== confirmPw) {
106
+ throw new Error('Passwords do not match');
107
+ }
108
+ }
109
+ // Validate all required fields are present
110
+ if (!email || !givenName || !familyName || !password) {
111
+ throw new Error('All fields are required: email, given-name, family-name, password');
112
+ }
113
+ return { email, givenName, familyName, password };
114
+ }
115
+ /**
116
+ * Print the success summary box after initialization completes.
117
+ *
118
+ * Displays all created entities and next-step instructions in an
119
+ * aligned bordered box format.
120
+ */
121
+ function printSuccessBox(orgName, orgSlug, appSlug, cliClientId, adminEmail, roleSlug, roleCount, permissionCount) {
122
+ const w = 43; // Content width inside the box
123
+ console.log('');
124
+ console.log('╔══════════════════════════════════════════════════════════════╗');
125
+ console.log('║ Porta Initialized ║');
126
+ console.log('╠══════════════════════════════════════════════════════════════╣');
127
+ console.log(`║ Organization: ${padRight(`${orgName} (${orgSlug})`, w)}║`);
128
+ console.log(`║ Application: ${padRight(`Porta Admin (${appSlug})`, w)}║`);
129
+ console.log(`║ Client ID: ${padRight(cliClientId, w)}║`);
130
+ console.log(`║ Admin User: ${padRight(adminEmail, w)}║`);
131
+ console.log(`║ Admin Role: ${padRight(`${roleSlug} (${permissionCount} permissions)`, w)}║`);
132
+ console.log(`║ Admin Roles: ${padRight(`${roleCount} roles seeded`, w)}║`);
133
+ console.log('╠══════════════════════════════════════════════════════════════╣');
134
+ console.log('║ Next steps: ║');
135
+ console.log('║ 1. Start the server: yarn dev ║');
136
+ console.log('║ 2. Authenticate: porta login ║');
137
+ console.log('║ 3. Launch admin GUI: porta gui ║');
138
+ console.log('╚══════════════════════════════════════════════════════════════╝');
139
+ }
140
+ // ---------------------------------------------------------------------------
141
+ // Command definition
142
+ // ---------------------------------------------------------------------------
143
+ /**
144
+ * The init command module — registered at the top level of the CLI.
145
+ *
146
+ * Bootstraps all admin infrastructure entities in a single direct-DB
147
+ * operation. This is the only way to create the initial admin setup
148
+ * since the admin API requires authentication that doesn't exist yet.
149
+ */
150
+ export const initCommand = {
151
+ command: 'init',
152
+ describe: 'Initialize Porta — create admin application, client, and first admin user',
153
+ builder: (yargs) => yargs
154
+ .option('email', {
155
+ type: 'string',
156
+ describe: 'Admin user email address',
157
+ })
158
+ .option('given-name', {
159
+ type: 'string',
160
+ describe: 'Admin user first name',
161
+ })
162
+ .option('family-name', {
163
+ type: 'string',
164
+ describe: 'Admin user last name',
165
+ })
166
+ .option('password', {
167
+ type: 'string',
168
+ describe: 'Admin user password (must meet NIST SP 800-63B requirements)',
169
+ }),
170
+ handler: async (argv) => {
171
+ await withErrorHandling(async () => {
172
+ await withBootstrap(argv, async () => {
173
+ // Dynamic imports — loaded after bootstrap connects DB + Redis.
174
+ // This ensures config is parsed with any CLI flag overrides.
175
+ const { findSuperAdminOrganization } = await import('../../organizations/repository.js');
176
+ const { getApplicationBySlug, createApplication } = await import('../../applications/index.js');
177
+ const { createClient } = await import('../../clients/index.js');
178
+ const { createUser, reactivateUser, markEmailVerified, } = await import('../../users/index.js');
179
+ const { createRole, createPermission, assignPermissionsToRole, assignRolesToUser, } = await import('../../rbac/index.js');
180
+ const { ensureSigningKeys } = await import('../../lib/signing-keys.js');
181
+ const { getPool } = await import('../../lib/database.js');
182
+ console.log('Initializing Porta...\n');
183
+ // -----------------------------------------------------------------
184
+ // Step 1: Verify super-admin org exists (created by migration seed)
185
+ // -----------------------------------------------------------------
186
+ const superAdminOrg = await findSuperAdminOrganization();
187
+ if (!superAdminOrg) {
188
+ throw new Error('Super-admin organization not found. Run "porta migrate up" first.');
189
+ }
190
+ // -----------------------------------------------------------------
191
+ // Step 2: Safety guard — refuse if already initialized
192
+ // -----------------------------------------------------------------
193
+ const existingApp = await getApplicationBySlug('porta-admin');
194
+ if (existingApp && !argv.force) {
195
+ throw new Error('System already initialized. Use --force to re-initialize.');
196
+ }
197
+ if (existingApp && argv.force) {
198
+ // Re-initialization with --force: confirm the destructive action.
199
+ // Full re-init (drop + recreate) is not yet supported — advise
200
+ // the user to reset the database instead.
201
+ const confirmed = await confirm('Re-initialization is not yet supported. Reset the database and re-run migrations instead. Cancel?', false);
202
+ if (confirmed) {
203
+ warn('Init cancelled — reset the database first.');
204
+ }
205
+ else {
206
+ warn('Init cancelled.');
207
+ }
208
+ return;
209
+ }
210
+ // -----------------------------------------------------------------
211
+ // Step 3: Ensure signing keys exist in the database
212
+ // -----------------------------------------------------------------
213
+ await ensureSigningKeys();
214
+ console.log(' ✅ Signing keys verified');
215
+ // -----------------------------------------------------------------
216
+ // Step 4: Create the admin application
217
+ // -----------------------------------------------------------------
218
+ const adminApp = await createApplication({
219
+ name: 'Porta Admin',
220
+ slug: 'porta-admin',
221
+ description: 'Porta administration application — manages the admin API and CLI authentication',
222
+ });
223
+ console.log(` ✅ Application created: ${adminApp.name} (${adminApp.slug})`);
224
+ // -----------------------------------------------------------------
225
+ // Step 5: Create granular admin permissions (resource:action format)
226
+ // -----------------------------------------------------------------
227
+ // Each permission maps to a specific admin API operation.
228
+ // Permission slugs come from the centralized admin-permissions module.
229
+ const permissionIdMap = new Map(); // slug → permission ID
230
+ for (const permSlug of ALL_ADMIN_PERMISSIONS) {
231
+ const permission = await createPermission({
232
+ applicationId: adminApp.id,
233
+ slug: permSlug,
234
+ name: buildPermissionName(permSlug),
235
+ description: buildPermissionDescription(permSlug),
236
+ });
237
+ permissionIdMap.set(permSlug, permission.id);
238
+ }
239
+ console.log(` ✅ ${permissionIdMap.size} granular permissions created`);
240
+ // -----------------------------------------------------------------
241
+ // Step 6: Create all 5 admin roles and assign permissions
242
+ // -----------------------------------------------------------------
243
+ // Each role gets a specific set of permissions as defined in
244
+ // ADMIN_ROLE_DEFINITIONS. The super-admin role gets all permissions.
245
+ const createdRoles = new Map(); // slug → role ID
246
+ for (const roleDef of ALL_ADMIN_ROLES) {
247
+ const role = await createRole({
248
+ applicationId: adminApp.id,
249
+ name: roleDef.name,
250
+ slug: roleDef.slug,
251
+ description: roleDef.description,
252
+ });
253
+ createdRoles.set(roleDef.slug, role.id);
254
+ // Resolve permission IDs for this role's permission set
255
+ const rolePermissionIds = roleDef.permissions
256
+ .map((permSlug) => permissionIdMap.get(permSlug))
257
+ .filter((id) => id !== undefined);
258
+ if (rolePermissionIds.length > 0) {
259
+ await assignPermissionsToRole(role.id, rolePermissionIds);
260
+ }
261
+ console.log(` ✅ Role: ${role.name} (${role.slug}) — ${rolePermissionIds.length} permissions`);
262
+ }
263
+ // -----------------------------------------------------------------
264
+ // Step 7: Create the admin CLI client (public, Auth Code + PKCE)
265
+ // -----------------------------------------------------------------
266
+ // The client is public (no secret) because CLI tools cannot safely
267
+ // store secrets. PKCE provides security for the authorization code
268
+ // exchange. The redirect URIs use loopback addresses — per RFC 8252
269
+ // §7.3, node-oidc-provider allows flexible port matching for native
270
+ // app clients using loopback redirect URIs.
271
+ const { client: adminClient } = await createClient({
272
+ organizationId: superAdminOrg.id,
273
+ applicationId: adminApp.id,
274
+ clientName: 'Porta Admin CLI',
275
+ clientType: 'public',
276
+ applicationType: 'native',
277
+ redirectUris: [
278
+ 'http://127.0.0.1/callback',
279
+ 'http://localhost/callback',
280
+ 'http://127.0.0.1/auth/callback',
281
+ ],
282
+ postLogoutRedirectUris: [
283
+ 'http://127.0.0.1',
284
+ ],
285
+ grantTypes: ['authorization_code', 'refresh_token'],
286
+ scope: 'openid profile email offline_access',
287
+ requirePkce: true,
288
+ });
289
+ console.log(` ✅ Client created: ${adminClient.clientName} (${adminClient.clientId})`);
290
+ // -----------------------------------------------------------------
291
+ // Step 8: Collect admin user details (interactive or from flags)
292
+ // -----------------------------------------------------------------
293
+ const userDetails = await collectAdminUserDetails(argv);
294
+ // -----------------------------------------------------------------
295
+ // Step 9: Create the admin user in the super-admin organization
296
+ // -----------------------------------------------------------------
297
+ const adminUser = await createUser({
298
+ organizationId: superAdminOrg.id,
299
+ email: userDetails.email,
300
+ givenName: userDetails.givenName,
301
+ familyName: userDetails.familyName,
302
+ password: userDetails.password,
303
+ });
304
+ console.log(` ✅ User created: ${adminUser.email}`);
305
+ // -----------------------------------------------------------------
306
+ // Step 10: Activate user (if not already active)
307
+ // -----------------------------------------------------------------
308
+ if (adminUser.status !== 'active') {
309
+ await reactivateUser(adminUser.id);
310
+ }
311
+ console.log(' ✅ User activated');
312
+ // -----------------------------------------------------------------
313
+ // Step 11: Mark email as verified (admin doesn't need email flow)
314
+ // -----------------------------------------------------------------
315
+ await markEmailVerified(adminUser.id);
316
+ console.log(' ✅ Email marked as verified');
317
+ // -----------------------------------------------------------------
318
+ // Step 12: Assign super-admin role to the new user
319
+ // -----------------------------------------------------------------
320
+ const superAdminRoleId = createdRoles.get(ADMIN_ROLE_DEFINITIONS.SUPER_ADMIN.slug);
321
+ if (!superAdminRoleId) {
322
+ throw new Error('Super-admin role was not created — init is broken');
323
+ }
324
+ await assignRolesToUser(adminUser.id, [superAdminRoleId]);
325
+ console.log(` ✅ Role "${ADMIN_ROLE_DEFINITIONS.SUPER_ADMIN.slug}" assigned to user`);
326
+ // -----------------------------------------------------------------
327
+ // Step 13: Store super-admin user ID in system_config
328
+ // -----------------------------------------------------------------
329
+ // This enables the super-admin protection module to identify
330
+ // the bootstrap user and prevent destructive operations on them.
331
+ const pool = getPool();
332
+ await pool.query(`INSERT INTO system_config (key, value, value_type, description, is_sensitive)
333
+ VALUES ($1, to_jsonb($2::text), 'string', $3, FALSE)
334
+ ON CONFLICT (key) DO UPDATE SET value = to_jsonb($2::text), updated_at = NOW()`, [
335
+ SUPER_ADMIN_USER_ID_KEY,
336
+ adminUser.id,
337
+ 'User ID of the super-admin user created during porta init',
338
+ ]);
339
+ console.log(' ✅ Super-admin user ID stored in system config');
340
+ // -----------------------------------------------------------------
341
+ // Step 14: Print the success summary
342
+ // -----------------------------------------------------------------
343
+ printSuccessBox(superAdminOrg.name, superAdminOrg.slug, adminApp.slug, adminClient.clientId, userDetails.email, ADMIN_ROLE_DEFINITIONS.SUPER_ADMIN.slug, createdRoles.size, permissionIdMap.size);
344
+ success('Porta initialization complete!');
345
+ });
346
+ }, argv.verbose);
347
+ },
348
+ };
349
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * CLI migration commands.
3
+ *
4
+ * Manages database schema migrations using the existing migrator module
5
+ * (node-pg-migrate). Provides up, down, and status subcommands.
6
+ *
7
+ * Usage:
8
+ * porta migrate up # Apply all pending migrations
9
+ * porta migrate down # Rollback last migration
10
+ * porta migrate down --count 3 # Rollback last 3 migrations
11
+ * porta migrate status # Show migration status
12
+ *
13
+ * @module cli/commands/migrate
14
+ */
15
+ import type { CommandModule } from 'yargs';
16
+ import type { GlobalOptions } from '../index.js';
17
+ /** The migrate command module — registered at the top level of the CLI */
18
+ export declare const migrateCommand: CommandModule<GlobalOptions, GlobalOptions>;
19
+ //# sourceMappingURL=migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/migrate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAUjD,0EAA0E;AAC1E,eAAO,MAAM,cAAc,EAAE,aAAa,CAAC,aAAa,EAAE,aAAa,CAkGtE,CAAC"}