@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,272 @@
1
+ /**
2
+ * Bounded administrative data export.
3
+ *
4
+ * Every query selects an explicit public field list, reads one row beyond the public limit, and
5
+ * writes a content-free audit record in the same repeatable-read transaction. CSV output is
6
+ * neutralized before quoting so spreadsheet applications cannot execute imported formulas.
7
+ */
8
+ import { getPool } from './database.js';
9
+ /** Maximum number of rows returned by one export. */
10
+ export const MAXIMUM_EXPORT_ROWS = 10_000;
11
+ /** Minimal export failure which never retains query or row diagnostics. */
12
+ export class ExportOperationError extends Error {
13
+ /** Stable public failure discriminator. */
14
+ code;
15
+ /** Recommended HTTP status. */
16
+ status;
17
+ /**
18
+ * Create a closed export failure.
19
+ *
20
+ * @param code - Stable public failure discriminator.
21
+ * @param status - Recommended route status.
22
+ */
23
+ constructor(code, status) {
24
+ super('Export request could not be completed');
25
+ this.name = 'ExportOperationError';
26
+ this.code = code;
27
+ this.status = status;
28
+ }
29
+ }
30
+ const EXPORT_QUERIES = Object.freeze({
31
+ users: {
32
+ sql: `SELECT u.id, u.email, u.status, u.given_name, u.family_name, u.nickname, u.locale,
33
+ u.email_verified, u.phone_number, u.created_at, u.updated_at, u.last_login_at,
34
+ u.login_count
35
+ FROM users u WHERE u.organization_id = $1
36
+ ORDER BY u.created_at LIMIT 10001`,
37
+ columns: [
38
+ 'id',
39
+ 'email',
40
+ 'status',
41
+ 'given_name',
42
+ 'family_name',
43
+ 'nickname',
44
+ 'locale',
45
+ 'email_verified',
46
+ 'phone_number',
47
+ 'created_at',
48
+ 'updated_at',
49
+ 'last_login_at',
50
+ 'login_count',
51
+ ],
52
+ requiredScope: 'organization',
53
+ },
54
+ organizations: {
55
+ sql: `SELECT id, name, slug, status, is_super_admin, default_locale, created_at, updated_at
56
+ FROM organizations ORDER BY created_at LIMIT 10001`,
57
+ columns: [
58
+ 'id',
59
+ 'name',
60
+ 'slug',
61
+ 'status',
62
+ 'is_super_admin',
63
+ 'default_locale',
64
+ 'created_at',
65
+ 'updated_at',
66
+ ],
67
+ requiredScope: 'none',
68
+ },
69
+ clients: {
70
+ sql: `SELECT c.id, c.client_id, c.client_name, c.client_type, c.status,
71
+ c.application_type, c.grant_types, c.redirect_uris, c.created_at, c.updated_at
72
+ FROM clients c WHERE c.organization_id = $1
73
+ ORDER BY c.created_at LIMIT 10001`,
74
+ columns: [
75
+ 'id',
76
+ 'client_id',
77
+ 'client_name',
78
+ 'client_type',
79
+ 'status',
80
+ 'application_type',
81
+ 'grant_types',
82
+ 'redirect_uris',
83
+ 'created_at',
84
+ 'updated_at',
85
+ ],
86
+ requiredScope: 'organization',
87
+ },
88
+ roles: {
89
+ sql: `SELECT r.id, r.name, r.slug, r.description, r.created_at
90
+ FROM roles r
91
+ WHERE r.application_id = $2
92
+ AND EXISTS (
93
+ SELECT 1 FROM clients c
94
+ WHERE c.application_id = r.application_id AND c.organization_id = $1
95
+ )
96
+ ORDER BY r.created_at LIMIT 10001`,
97
+ columns: ['id', 'name', 'slug', 'description', 'created_at'],
98
+ requiredScope: 'organization-and-application',
99
+ },
100
+ audit: {
101
+ sql: `SELECT id, event_type, event_category, actor_id, metadata, created_at
102
+ FROM audit_log
103
+ WHERE organization_id = $1 AND created_at >= $2 AND created_at <= $3
104
+ ORDER BY created_at DESC LIMIT 10001`,
105
+ columns: ['id', 'event_type', 'event_category', 'actor_id', 'created_at', 'safe_details'],
106
+ requiredScope: 'audit',
107
+ },
108
+ });
109
+ /** Metadata fields safe to disclose for explicitly recognized event types. */
110
+ const SAFE_AUDIT_DETAIL_FIELDS = Object.freeze({
111
+ 'admin.import': ['mode', 'manifestVersion', 'manifestDigest', 'created', 'updated', 'skipped'],
112
+ 'admin.export': ['entityType', 'format', 'rowCount'],
113
+ });
114
+ /** Validate scope requirements and return the query parameters in SQL order. */
115
+ function exportParameters(options, definition) {
116
+ if (definition.requiredScope !== 'none' && options.organizationId === undefined) {
117
+ throw new ExportOperationError('export_scope_required', 400);
118
+ }
119
+ if (definition.requiredScope === 'organization-and-application' &&
120
+ options.applicationId === undefined) {
121
+ throw new ExportOperationError('export_scope_required', 400);
122
+ }
123
+ if (definition.requiredScope === 'audit') {
124
+ if (options.startDate === undefined || options.endDate === undefined) {
125
+ throw new ExportOperationError('export_scope_required', 400);
126
+ }
127
+ if (options.startDate.getTime() > options.endDate.getTime()) {
128
+ throw new ExportOperationError('export_invalid_range', 400);
129
+ }
130
+ return [options.organizationId, options.startDate, options.endDate];
131
+ }
132
+ if (definition.requiredScope === 'organization-and-application') {
133
+ return [options.organizationId, options.applicationId];
134
+ }
135
+ return definition.requiredScope === 'organization' ? [options.organizationId] : [];
136
+ }
137
+ /** Copy only event-specific safe details from one audit metadata object. */
138
+ function safeAuditDetails(eventType, metadata) {
139
+ if (typeof metadata !== 'object' || metadata === null || Array.isArray(metadata))
140
+ return {};
141
+ const entries = new Map(Object.entries(metadata));
142
+ const safe = {};
143
+ for (const field of SAFE_AUDIT_DETAIL_FIELDS[eventType] ?? []) {
144
+ const value = entries.get(field);
145
+ if (typeof value === 'string' ||
146
+ typeof value === 'number' ||
147
+ typeof value === 'boolean' ||
148
+ value === null) {
149
+ safe[field] = value;
150
+ }
151
+ }
152
+ return safe;
153
+ }
154
+ /** Replace private audit metadata with the closed event-specific safe-detail object. */
155
+ function sanitizeRows(entityType, rows) {
156
+ if (entityType !== 'audit')
157
+ return rows.map((row) => ({ ...row }));
158
+ return rows.map((row) => ({
159
+ id: row.id,
160
+ event_type: row.event_type,
161
+ event_category: row.event_category,
162
+ actor_id: row.actor_id,
163
+ created_at: row.created_at,
164
+ safe_details: typeof row.event_type === 'string' ? safeAuditDetails(row.event_type, row.metadata) : {},
165
+ }));
166
+ }
167
+ /** Write one content-free audit row through the export transaction. */
168
+ async function writeExportAudit(client, options, rowCount) {
169
+ if (options.actorId === undefined)
170
+ return;
171
+ await client.query(`INSERT INTO audit_log (
172
+ organization_id, actor_id, event_type, event_category, metadata
173
+ ) VALUES ($1, $2, 'admin.export', 'admin', $3)`, [
174
+ options.organizationId ?? null,
175
+ options.actorId,
176
+ JSON.stringify({
177
+ entityType: options.entityType,
178
+ format: options.format,
179
+ rowCount,
180
+ ...(options.applicationId === undefined ? {} : { applicationId: options.applicationId }),
181
+ ...(options.startDate === undefined ? {} : { startDate: options.startDate.toISOString() }),
182
+ ...(options.endDate === undefined ? {} : { endDate: options.endDate.toISOString() }),
183
+ }),
184
+ ]);
185
+ }
186
+ /** Prove that the requested application participates in the requested tenant before role access. */
187
+ async function requireRoleRelationship(client, options) {
188
+ if (options.entityType !== 'roles')
189
+ return;
190
+ const relationship = await client.query(`SELECT 1 FROM clients
191
+ WHERE organization_id = $1 AND application_id = $2
192
+ LIMIT 1`, [options.organizationId, options.applicationId]);
193
+ if (relationship.rowCount !== 1) {
194
+ throw new ExportOperationError('export_scope_required', 400);
195
+ }
196
+ }
197
+ /**
198
+ * Export one authorized entity set through a bounded repeatable-read transaction.
199
+ *
200
+ * @param options - Exact entity, representation, scope, and actor.
201
+ * @returns Complete serialized export and exact row count.
202
+ * @throws ExportOperationError when scope is incomplete, the bound is exceeded, or persistence
203
+ * fails.
204
+ */
205
+ export async function exportData(options) {
206
+ const definition = EXPORT_QUERIES[options.entityType];
207
+ const parameters = exportParameters(options, definition);
208
+ const pool = getPool();
209
+ const client = await pool.connect();
210
+ try {
211
+ await client.query('BEGIN ISOLATION LEVEL REPEATABLE READ');
212
+ await requireRoleRelationship(client, options);
213
+ const queryResult = await client.query(definition.sql, parameters);
214
+ if (queryResult.rows.length > MAXIMUM_EXPORT_ROWS) {
215
+ throw new ExportOperationError('export_too_large', 413);
216
+ }
217
+ const rows = sanitizeRows(options.entityType, queryResult.rows);
218
+ await writeExportAudit(client, options, rows.length);
219
+ await client.query('COMMIT');
220
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
221
+ const filename = `${options.entityType}-export-${timestamp}`;
222
+ if (options.format === 'csv') {
223
+ return {
224
+ data: toCsv(rows, definition.columns),
225
+ contentType: 'text/csv',
226
+ filename: `${filename}.csv`,
227
+ rowCount: rows.length,
228
+ };
229
+ }
230
+ return {
231
+ data: JSON.stringify({ data: rows, exportedAt: new Date().toISOString(), total: rows.length }, null, 2),
232
+ contentType: 'application/json',
233
+ filename: `${filename}.json`,
234
+ rowCount: rows.length,
235
+ };
236
+ }
237
+ catch (error) {
238
+ try {
239
+ await client.query('ROLLBACK');
240
+ }
241
+ catch {
242
+ // The original error remains authoritative; releasing the connection handles cleanup.
243
+ }
244
+ throw error instanceof ExportOperationError
245
+ ? error
246
+ : new ExportOperationError('export_failed', 503);
247
+ }
248
+ finally {
249
+ client.release();
250
+ }
251
+ }
252
+ /** Prefix spreadsheet formula input after leading whitespace with an inert apostrophe. */
253
+ function neutralizeFormula(value) {
254
+ const firstContent = value.search(/\S/);
255
+ if (firstContent === -1 || !['=', '+', '-', '@'].includes(value[firstContent]))
256
+ return value;
257
+ return `${value.slice(0, firstContent)}'${value.slice(firstContent)}`;
258
+ }
259
+ /** Serialize one CSV cell after formula neutralization and RFC-compatible quote escaping. */
260
+ function escapeCsvValue(value) {
261
+ if (value === null || value === undefined)
262
+ return '';
263
+ const source = value instanceof Date ? value.toISOString() : String(value);
264
+ const safe = neutralizeFormula(source);
265
+ return /[",\r\n]/.test(safe) ? `"${safe.replace(/"/g, '""')}"` : safe;
266
+ }
267
+ /** Serialize rows using one exact ordered public column list. */
268
+ function toCsv(rows, columns) {
269
+ const dataRows = rows.map((row) => columns.map((column) => escapeCsvValue(row[column])).join(','));
270
+ return [columns.join(','), ...dataRows].join('\r\n');
271
+ }
272
+ //# sourceMappingURL=data-export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-export.js","sourceRoot":"","sources":["../../src/lib/data-export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Pure import-manifest planning.
3
+ *
4
+ * The planner assigns every admitted entity a stable tenant-qualified natural key and explicit
5
+ * parent references before database mutation begins. Database-backed planning later resolves the
6
+ * returned external references against one consistent transaction snapshot.
7
+ */
8
+ import type { ImportManifest } from './data-import.js';
9
+ import type { PoolClient } from 'pg';
10
+ /** Closed entity catalog accepted by the version 1.0 manifest. */
11
+ export type ImportEntityType = 'organization' | 'application' | 'client' | 'role' | 'permission' | 'claim_definition' | 'role_permission_mapping' | 'application_module' | 'user' | 'user_role_assignment' | 'user_claim_value' | 'config';
12
+ /** Parent reference which must exist in the manifest or the database snapshot. */
13
+ export interface ImportPlanDependency {
14
+ readonly entityType: ImportEntityType;
15
+ readonly naturalKey: string;
16
+ readonly source: 'manifest' | 'database';
17
+ }
18
+ /** One deterministic manifest entry prepared for database-backed action planning. */
19
+ export interface ImportPlanEntry {
20
+ readonly entityType: ImportEntityType;
21
+ readonly naturalKey: string;
22
+ readonly mutableFields: readonly string[];
23
+ readonly dependencies: readonly ImportPlanDependency[];
24
+ readonly credentialWillBeGenerated: boolean;
25
+ }
26
+ /** Immutable mutation-free plan produced from a validated manifest. */
27
+ export interface ImportManifestPlan {
28
+ readonly version: '1.0';
29
+ readonly entries: readonly ImportPlanEntry[];
30
+ readonly externalDependencies: readonly ImportPlanDependency[];
31
+ }
32
+ /** Return whether a configuration key can carry authentication material. */
33
+ export declare function isProhibitedImportConfigKey(configKey: string): boolean;
34
+ /**
35
+ * Build a deterministic, mutation-free plan from a schema-validated manifest.
36
+ *
37
+ * @param manifest - Strictly parsed version 1.0 manifest.
38
+ * @returns Ordered entries and the exact parents that must be resolved from the database.
39
+ * @throws Error when a system configuration key could carry authentication material.
40
+ */
41
+ export declare function buildImportManifestPlan(manifest: ImportManifest): ImportManifestPlan;
42
+ /**
43
+ * Resolve every external parent against the current transaction snapshot.
44
+ *
45
+ * @param client - Transaction client used by the later import execution.
46
+ * @param plan - Pure manifest plan built before acquiring the client.
47
+ * @throws Error when a parent is missing or storage contains an ambiguous natural key.
48
+ */
49
+ export declare function requireResolvedImportDependencies(client: PoolClient, plan: ImportManifestPlan): Promise<void>;
50
+ //# sourceMappingURL=data-import-plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-import-plan.d.ts","sourceRoot":"","sources":["../../src/lib/data-import-plan.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAErC,kEAAkE;AAClE,MAAM,MAAM,gBAAgB,GACxB,cAAc,GACd,aAAa,GACb,QAAQ,GACR,MAAM,GACN,YAAY,GACZ,kBAAkB,GAClB,yBAAyB,GACzB,oBAAoB,GACpB,MAAM,GACN,sBAAsB,GACtB,kBAAkB,GAClB,QAAQ,CAAC;AAEb,kFAAkF;AAClF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAAC;CAC1C;AAED,qFAAqF;AACrF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,YAAY,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACvD,QAAQ,CAAC,yBAAyB,EAAE,OAAO,CAAC;CAC7C;AAED,uEAAuE;AACvE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,CAAC;IAC7C,QAAQ,CAAC,oBAAoB,EAAE,SAAS,oBAAoB,EAAE,CAAC;CAChE;AA4BD,4EAA4E;AAC5E,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAEtE;AAgDD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,cAAc,GAAG,kBAAkB,CAgKpF;AAoDD;;;;;;GAMG;AACH,wBAAsB,iCAAiC,CACrD,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,IAAI,CAAC,CAyBf"}
@@ -0,0 +1,235 @@
1
+ /**
2
+ * Pure import-manifest planning.
3
+ *
4
+ * The planner assigns every admitted entity a stable tenant-qualified natural key and explicit
5
+ * parent references before database mutation begins. Database-backed planning later resolves the
6
+ * returned external references against one consistent transaction snapshot.
7
+ */
8
+ const MUTABLE_FIELDS = Object.freeze({
9
+ organization: [
10
+ 'name',
11
+ 'default_locale',
12
+ 'branding_primary_color',
13
+ 'branding_company_name',
14
+ 'branding_custom_css',
15
+ 'branding_logo_url',
16
+ 'branding_favicon_url',
17
+ ],
18
+ application: ['name', 'description'],
19
+ client: ['client_name'],
20
+ role: ['name', 'description'],
21
+ permission: ['name', 'description'],
22
+ claim_definition: ['name', 'description'],
23
+ role_permission_mapping: [],
24
+ application_module: ['name', 'description'],
25
+ user: ['given_name', 'family_name', 'locale'],
26
+ user_role_assignment: [],
27
+ user_claim_value: ['value'],
28
+ config: ['value'],
29
+ });
30
+ const PROHIBITED_CONFIG_KEY = /(^|_)(password|secret|private_key|signing_key|cookie_key|session_key|recovery_code|totp_secret)(_|$)/i;
31
+ /** Return whether a configuration key can carry authentication material. */
32
+ export function isProhibitedImportConfigKey(configKey) {
33
+ return PROHIBITED_CONFIG_KEY.test(configKey);
34
+ }
35
+ /** Join natural-key components without ambiguous concatenation. */
36
+ function key(...parts) {
37
+ return parts.join('\u001f');
38
+ }
39
+ /** Split an internal natural key and reject malformed planner state. */
40
+ function keyParts(naturalKey, expectedParts) {
41
+ const parts = naturalKey.split('\u001f');
42
+ if (parts.length !== expectedParts || parts.some((part) => part.length === 0)) {
43
+ throw new Error('Import plan contains an invalid natural key');
44
+ }
45
+ return parts;
46
+ }
47
+ /** Return a manifest/database reference for one required parent. */
48
+ function dependency(entityType, naturalKey, manifestKeys) {
49
+ return Object.freeze({
50
+ entityType,
51
+ naturalKey,
52
+ source: manifestKeys.has(naturalKey) ? 'manifest' : 'database',
53
+ });
54
+ }
55
+ /** Add one immutable entry to the ordered plan. */
56
+ function addEntry(entries, entityType, naturalKey, dependencies, credentialWillBeGenerated = false) {
57
+ entries.push(Object.freeze({
58
+ entityType,
59
+ naturalKey,
60
+ mutableFields: MUTABLE_FIELDS[entityType],
61
+ dependencies: Object.freeze([...dependencies]),
62
+ credentialWillBeGenerated,
63
+ }));
64
+ }
65
+ /**
66
+ * Build a deterministic, mutation-free plan from a schema-validated manifest.
67
+ *
68
+ * @param manifest - Strictly parsed version 1.0 manifest.
69
+ * @returns Ordered entries and the exact parents that must be resolved from the database.
70
+ * @throws Error when a system configuration key could carry authentication material.
71
+ */
72
+ export function buildImportManifestPlan(manifest) {
73
+ const entries = [];
74
+ const organizationKeys = new Set(manifest.organizations.map((item) => item.slug));
75
+ const applicationKeys = new Set(manifest.applications.map((item) => item.slug));
76
+ const roleKeys = new Set(manifest.roles.map((item) => key(item.application_slug, item.slug)));
77
+ const permissionKeys = new Set(manifest.permissions.map((item) => key(item.application_slug, item.slug)));
78
+ const claimKeys = new Set(manifest.claim_definitions.map((item) => key(item.application_slug, item.slug)));
79
+ const userKeys = new Set(manifest.users.map((item) => key(item.organization_slug, item.email.toLowerCase())));
80
+ for (const organization of manifest.organizations) {
81
+ addEntry(entries, 'organization', organization.slug, []);
82
+ }
83
+ for (const application of manifest.applications) {
84
+ addEntry(entries, 'application', application.slug, [
85
+ dependency('organization', application.organization_slug, organizationKeys),
86
+ ]);
87
+ }
88
+ for (const client of manifest.clients) {
89
+ addEntry(entries, 'client', key(client.organization_slug, client.application_slug, client.client_name), [
90
+ dependency('organization', client.organization_slug, organizationKeys),
91
+ dependency('application', client.application_slug, applicationKeys),
92
+ ], client.client_type === 'confidential');
93
+ }
94
+ for (const role of manifest.roles) {
95
+ addEntry(entries, 'role', key(role.application_slug, role.slug), [
96
+ dependency('organization', role.organization_slug, organizationKeys),
97
+ dependency('application', role.application_slug, applicationKeys),
98
+ ]);
99
+ }
100
+ for (const permission of manifest.permissions) {
101
+ addEntry(entries, 'permission', key(permission.application_slug, permission.slug), [
102
+ dependency('organization', permission.organization_slug, organizationKeys),
103
+ dependency('application', permission.application_slug, applicationKeys),
104
+ ]);
105
+ }
106
+ for (const claim of manifest.claim_definitions) {
107
+ addEntry(entries, 'claim_definition', key(claim.application_slug, claim.slug), [
108
+ dependency('organization', claim.organization_slug, organizationKeys),
109
+ dependency('application', claim.application_slug, applicationKeys),
110
+ ]);
111
+ }
112
+ for (const mapping of manifest.role_permission_mappings) {
113
+ const dependencies = [
114
+ dependency('organization', mapping.organization_slug, organizationKeys),
115
+ dependency('application', mapping.application_slug, applicationKeys),
116
+ dependency('role', key(mapping.application_slug, mapping.role_slug), roleKeys),
117
+ ...mapping.permission_slugs.map((slug) => dependency('permission', key(mapping.application_slug, slug), permissionKeys)),
118
+ ];
119
+ addEntry(entries, 'role_permission_mapping', key(mapping.application_slug, mapping.role_slug), dependencies);
120
+ }
121
+ for (const module of manifest.application_modules) {
122
+ addEntry(entries, 'application_module', key(module.application_slug, module.slug), [
123
+ dependency('organization', module.organization_slug, organizationKeys),
124
+ dependency('application', module.application_slug, applicationKeys),
125
+ ]);
126
+ }
127
+ for (const user of manifest.users) {
128
+ addEntry(entries, 'user', key(user.organization_slug, user.email.toLowerCase()), [
129
+ dependency('organization', user.organization_slug, organizationKeys),
130
+ ]);
131
+ }
132
+ for (const assignment of manifest.user_role_assignments) {
133
+ addEntry(entries, 'user_role_assignment', key(assignment.organization_slug, assignment.application_slug, assignment.email.toLowerCase(), assignment.role_slug), [
134
+ dependency('organization', assignment.organization_slug, organizationKeys),
135
+ dependency('application', assignment.application_slug, applicationKeys),
136
+ dependency('user', key(assignment.organization_slug, assignment.email.toLowerCase()), userKeys),
137
+ dependency('role', key(assignment.application_slug, assignment.role_slug), roleKeys),
138
+ ]);
139
+ }
140
+ for (const claimValue of manifest.user_claim_values) {
141
+ addEntry(entries, 'user_claim_value', key(claimValue.organization_slug, claimValue.application_slug, claimValue.email.toLowerCase(), claimValue.claim_slug), [
142
+ dependency('organization', claimValue.organization_slug, organizationKeys),
143
+ dependency('application', claimValue.application_slug, applicationKeys),
144
+ dependency('user', key(claimValue.organization_slug, claimValue.email.toLowerCase()), userKeys),
145
+ dependency('claim_definition', key(claimValue.application_slug, claimValue.claim_slug), claimKeys),
146
+ ]);
147
+ }
148
+ for (const configKey of Object.keys(manifest.config ?? {}).sort()) {
149
+ if (isProhibitedImportConfigKey(configKey)) {
150
+ throw new Error('Import manifest contains prohibited authentication material');
151
+ }
152
+ addEntry(entries, 'config', configKey, []);
153
+ }
154
+ const externalByKey = new Map();
155
+ for (const entry of entries) {
156
+ for (const required of entry.dependencies) {
157
+ if (required.source === 'database') {
158
+ externalByKey.set(key(required.entityType, required.naturalKey), required);
159
+ }
160
+ }
161
+ }
162
+ return Object.freeze({
163
+ version: '1.0',
164
+ entries: Object.freeze(entries),
165
+ externalDependencies: Object.freeze([...externalByKey.values()]),
166
+ });
167
+ }
168
+ /** Resolve one database-owned parent without exposing its identifier in an error. */
169
+ async function databaseDependencyExists(client, required) {
170
+ if (required.entityType === 'organization') {
171
+ const result = await client.query('SELECT 1 FROM organizations WHERE slug = $1', [
172
+ required.naturalKey,
173
+ ]);
174
+ return result.rowCount === 1;
175
+ }
176
+ if (required.entityType === 'application') {
177
+ const result = await client.query('SELECT 1 FROM applications WHERE slug = $1', [
178
+ required.naturalKey,
179
+ ]);
180
+ return result.rowCount === 1;
181
+ }
182
+ if (required.entityType === 'role' ||
183
+ required.entityType === 'permission' ||
184
+ required.entityType === 'claim_definition') {
185
+ const [applicationSlug, entitySlug] = keyParts(required.naturalKey, 2);
186
+ const table = required.entityType === 'role'
187
+ ? 'roles'
188
+ : required.entityType === 'permission'
189
+ ? 'permissions'
190
+ : 'claim_definitions';
191
+ const result = await client.query(`SELECT 1 FROM ${table} entity
192
+ JOIN applications application ON application.id = entity.application_id
193
+ WHERE application.slug = $1 AND entity.slug = $2`, [applicationSlug, entitySlug]);
194
+ return result.rowCount === 1;
195
+ }
196
+ if (required.entityType === 'user') {
197
+ const [organizationSlug, email] = keyParts(required.naturalKey, 2);
198
+ const result = await client.query(`SELECT 1 FROM users user_account
199
+ JOIN organizations organization ON organization.id = user_account.organization_id
200
+ WHERE organization.slug = $1 AND user_account.email = $2`, [organizationSlug, email]);
201
+ return result.rowCount === 1;
202
+ }
203
+ throw new Error('Import plan contains an unsupported external dependency');
204
+ }
205
+ /**
206
+ * Resolve every external parent against the current transaction snapshot.
207
+ *
208
+ * @param client - Transaction client used by the later import execution.
209
+ * @param plan - Pure manifest plan built before acquiring the client.
210
+ * @throws Error when a parent is missing or storage contains an ambiguous natural key.
211
+ */
212
+ export async function requireResolvedImportDependencies(client, plan) {
213
+ for (const required of plan.externalDependencies) {
214
+ if (!(await databaseDependencyExists(client, required))) {
215
+ throw new Error('Import manifest contains a missing or unauthorized parent reference');
216
+ }
217
+ }
218
+ for (const entry of plan.entries) {
219
+ if (entry.entityType !== 'client')
220
+ continue;
221
+ const [organizationSlug, applicationSlug, clientName] = keyParts(entry.naturalKey, 3);
222
+ const result = await client.query(`SELECT COUNT(*)::integer AS count
223
+ FROM clients client
224
+ JOIN organizations organization ON organization.id = client.organization_id
225
+ JOIN applications application ON application.id = client.application_id
226
+ WHERE organization.slug = $1
227
+ AND application.slug = $2
228
+ AND client.client_name = $3`, [organizationSlug, applicationSlug, clientName]);
229
+ const count = Number(result.rows[0]?.count ?? 0);
230
+ if (!Number.isSafeInteger(count) || count > 1) {
231
+ throw new Error('Import manifest natural key collides with ambiguous stored data');
232
+ }
233
+ }
234
+ }
235
+ //# sourceMappingURL=data-import-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-import-plan.js","sourceRoot":"","sources":["../../src/lib/data-import-plan.ts"],"names":[],"mappings":"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"}