@portaidentity/server 1.7.3 → 1.8.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 (487) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/dist/applications/index.d.ts +2 -2
  3. package/dist/applications/index.d.ts.map +1 -1
  4. package/dist/applications/index.js +2 -2
  5. package/dist/applications/index.js.map +1 -1
  6. package/dist/applications/repository.d.ts +49 -4
  7. package/dist/applications/repository.d.ts.map +1 -1
  8. package/dist/applications/repository.js +148 -10
  9. package/dist/applications/repository.js.map +1 -1
  10. package/dist/applications/service.d.ts +35 -17
  11. package/dist/applications/service.d.ts.map +1 -1
  12. package/dist/applications/service.js +144 -35
  13. package/dist/applications/service.js.map +1 -1
  14. package/dist/applications/types.d.ts +1 -1
  15. package/dist/applications/types.d.ts.map +1 -1
  16. package/dist/applications/validators.d.ts +14 -0
  17. package/dist/applications/validators.d.ts.map +1 -0
  18. package/dist/applications/validators.js +14 -0
  19. package/dist/applications/validators.js.map +1 -0
  20. package/dist/auth/effective-branding.d.ts +35 -0
  21. package/dist/auth/effective-branding.d.ts.map +1 -0
  22. package/dist/auth/effective-branding.js +81 -0
  23. package/dist/auth/effective-branding.js.map +1 -0
  24. package/dist/auth/email-service.d.ts +3 -8
  25. package/dist/auth/email-service.d.ts.map +1 -1
  26. package/dist/auth/email-service.js +22 -30
  27. package/dist/auth/email-service.js.map +1 -1
  28. package/dist/auth/i18n.d.ts +5 -0
  29. package/dist/auth/i18n.d.ts.map +1 -1
  30. package/dist/auth/i18n.js +6 -5
  31. package/dist/auth/i18n.js.map +1 -1
  32. package/dist/auth/rate-limiter.d.ts +6 -10
  33. package/dist/auth/rate-limiter.d.ts.map +1 -1
  34. package/dist/auth/rate-limiter.js +12 -16
  35. package/dist/auth/rate-limiter.js.map +1 -1
  36. package/dist/auth/recovery-job-processor.d.ts.map +1 -1
  37. package/dist/auth/recovery-job-processor.js +1 -1
  38. package/dist/auth/recovery-job-processor.js.map +1 -1
  39. package/dist/auth/template-engine.d.ts +3 -1
  40. package/dist/auth/template-engine.d.ts.map +1 -1
  41. package/dist/auth/template-engine.js +1 -1
  42. package/dist/auth/template-engine.js.map +1 -1
  43. package/dist/cli/commands/init.d.ts +1 -1
  44. package/dist/cli/commands/init.d.ts.map +1 -1
  45. package/dist/cli/commands/init.js +12 -12
  46. package/dist/cli/commands/init.js.map +1 -1
  47. package/dist/cli/error-handler.d.ts +3 -2
  48. package/dist/cli/error-handler.d.ts.map +1 -1
  49. package/dist/cli/error-handler.js +9 -2
  50. package/dist/cli/error-handler.js.map +1 -1
  51. package/dist/cli/index.d.ts +1 -1
  52. package/dist/cli/index.d.ts.map +1 -1
  53. package/dist/cli/index.js +1 -1
  54. package/dist/cli/index.js.map +1 -1
  55. package/dist/clients/index.d.ts +1 -1
  56. package/dist/clients/index.js +1 -1
  57. package/dist/clients/repository.d.ts +18 -0
  58. package/dist/clients/repository.d.ts.map +1 -1
  59. package/dist/clients/repository.js +36 -0
  60. package/dist/clients/repository.js.map +1 -1
  61. package/dist/clients/secret-repository.d.ts +35 -8
  62. package/dist/clients/secret-repository.d.ts.map +1 -1
  63. package/dist/clients/secret-repository.js +69 -16
  64. package/dist/clients/secret-repository.js.map +1 -1
  65. package/dist/clients/secret-service.d.ts +5 -9
  66. package/dist/clients/secret-service.d.ts.map +1 -1
  67. package/dist/clients/secret-service.js +13 -22
  68. package/dist/clients/secret-service.js.map +1 -1
  69. package/dist/clients/service.d.ts +10 -13
  70. package/dist/clients/service.d.ts.map +1 -1
  71. package/dist/clients/service.js +112 -40
  72. package/dist/clients/service.js.map +1 -1
  73. package/dist/clients/types.d.ts +1 -1
  74. package/dist/clients/types.d.ts.map +1 -1
  75. package/dist/clients/validators.d.ts +83 -1
  76. package/dist/clients/validators.d.ts.map +1 -1
  77. package/dist/clients/validators.js +110 -0
  78. package/dist/clients/validators.js.map +1 -1
  79. package/dist/config/index.d.ts +1 -0
  80. package/dist/config/index.d.ts.map +1 -1
  81. package/dist/config/index.js +1 -0
  82. package/dist/config/index.js.map +1 -1
  83. package/dist/config/schema.d.ts +1 -0
  84. package/dist/config/schema.d.ts.map +1 -1
  85. package/dist/config/schema.js +23 -1
  86. package/dist/config/schema.js.map +1 -1
  87. package/dist/custom-claims/repository.d.ts +14 -9
  88. package/dist/custom-claims/repository.d.ts.map +1 -1
  89. package/dist/custom-claims/repository.js +38 -11
  90. package/dist/custom-claims/repository.js.map +1 -1
  91. package/dist/custom-claims/service.d.ts +11 -6
  92. package/dist/custom-claims/service.d.ts.map +1 -1
  93. package/dist/custom-claims/service.js +43 -20
  94. package/dist/custom-claims/service.js.map +1 -1
  95. package/dist/index.js +8 -2
  96. package/dist/index.js.map +1 -1
  97. package/dist/lib/admin-permissions.d.ts +12 -7
  98. package/dist/lib/admin-permissions.d.ts.map +1 -1
  99. package/dist/lib/admin-permissions.js +26 -16
  100. package/dist/lib/admin-permissions.js.map +1 -1
  101. package/dist/lib/audit-log.d.ts +2 -2
  102. package/dist/lib/audit-log.d.ts.map +1 -1
  103. package/dist/lib/audit-log.js +1 -1
  104. package/dist/lib/audit-log.js.map +1 -1
  105. package/dist/lib/authority-revocation.d.ts +18 -0
  106. package/dist/lib/authority-revocation.d.ts.map +1 -0
  107. package/dist/lib/authority-revocation.js +37 -0
  108. package/dist/lib/authority-revocation.js.map +1 -0
  109. package/dist/lib/branding-assets.d.ts +35 -5
  110. package/dist/lib/branding-assets.d.ts.map +1 -1
  111. package/dist/lib/branding-assets.js +33 -26
  112. package/dist/lib/branding-assets.js.map +1 -1
  113. package/dist/lib/bulk-operations.d.ts +1 -1
  114. package/dist/lib/bulk-operations.d.ts.map +1 -1
  115. package/dist/lib/bulk-operations.js +1 -13
  116. package/dist/lib/bulk-operations.js.map +1 -1
  117. package/dist/lib/cursor.d.ts +2 -0
  118. package/dist/lib/cursor.d.ts.map +1 -1
  119. package/dist/lib/cursor.js +2 -7
  120. package/dist/lib/cursor.js.map +1 -1
  121. package/dist/lib/database.d.ts.map +1 -1
  122. package/dist/lib/database.js +5 -0
  123. package/dist/lib/database.js.map +1 -1
  124. package/dist/lib/deletion-cleanup.d.ts +43 -0
  125. package/dist/lib/deletion-cleanup.d.ts.map +1 -0
  126. package/dist/lib/deletion-cleanup.js +207 -0
  127. package/dist/lib/deletion-cleanup.js.map +1 -0
  128. package/dist/lib/image-validator.d.ts +3 -1
  129. package/dist/lib/image-validator.d.ts.map +1 -1
  130. package/dist/lib/image-validator.js +32 -19
  131. package/dist/lib/image-validator.js.map +1 -1
  132. package/dist/lib/log-format.d.ts +20 -0
  133. package/dist/lib/log-format.d.ts.map +1 -0
  134. package/dist/lib/log-format.js +22 -0
  135. package/dist/lib/log-format.js.map +1 -0
  136. package/dist/lib/logger.d.ts +3 -1
  137. package/dist/lib/logger.d.ts.map +1 -1
  138. package/dist/lib/logger.js +21 -4
  139. package/dist/lib/logger.js.map +1 -1
  140. package/dist/lib/redis.d.ts.map +1 -1
  141. package/dist/lib/redis.js +3 -0
  142. package/dist/lib/redis.js.map +1 -1
  143. package/dist/lib/session-tracking.d.ts +73 -11
  144. package/dist/lib/session-tracking.d.ts.map +1 -1
  145. package/dist/lib/session-tracking.js +76 -32
  146. package/dist/lib/session-tracking.js.map +1 -1
  147. package/dist/lib/signing-key-crypto.d.ts.map +1 -1
  148. package/dist/lib/signing-key-crypto.js +4 -5
  149. package/dist/lib/signing-key-crypto.js.map +1 -1
  150. package/dist/lib/signing-keys.d.ts +3 -4
  151. package/dist/lib/signing-keys.d.ts.map +1 -1
  152. package/dist/lib/signing-keys.js +66 -41
  153. package/dist/lib/signing-keys.js.map +1 -1
  154. package/dist/lib/super-admin-protection.d.ts +5 -5
  155. package/dist/lib/super-admin-protection.d.ts.map +1 -1
  156. package/dist/lib/super-admin-protection.js +6 -9
  157. package/dist/lib/super-admin-protection.js.map +1 -1
  158. package/dist/lib/system-config-catalog.d.ts +268 -0
  159. package/dist/lib/system-config-catalog.d.ts.map +1 -0
  160. package/dist/lib/system-config-catalog.js +90 -0
  161. package/dist/lib/system-config-catalog.js.map +1 -0
  162. package/dist/lib/system-config.d.ts +30 -33
  163. package/dist/lib/system-config.d.ts.map +1 -1
  164. package/dist/lib/system-config.js +78 -93
  165. package/dist/lib/system-config.js.map +1 -1
  166. package/dist/lib/with-timeout.d.ts +32 -0
  167. package/dist/lib/with-timeout.d.ts.map +1 -0
  168. package/dist/lib/with-timeout.js +45 -0
  169. package/dist/lib/with-timeout.js.map +1 -0
  170. package/dist/middleware/admin-auth.d.ts +6 -5
  171. package/dist/middleware/admin-auth.d.ts.map +1 -1
  172. package/dist/middleware/admin-auth.js +30 -20
  173. package/dist/middleware/admin-auth.js.map +1 -1
  174. package/dist/middleware/admin-cors.d.ts +3 -3
  175. package/dist/middleware/admin-cors.js +3 -3
  176. package/dist/middleware/admin-mutation-audit.d.ts +3 -2
  177. package/dist/middleware/admin-mutation-audit.d.ts.map +1 -1
  178. package/dist/middleware/admin-mutation-audit.js +12 -5
  179. package/dist/middleware/admin-mutation-audit.js.map +1 -1
  180. package/dist/middleware/admin-rate-limiter.d.ts +7 -8
  181. package/dist/middleware/admin-rate-limiter.d.ts.map +1 -1
  182. package/dist/middleware/admin-rate-limiter.js +7 -8
  183. package/dist/middleware/admin-rate-limiter.js.map +1 -1
  184. package/dist/middleware/client-secret-hash.d.ts +10 -29
  185. package/dist/middleware/client-secret-hash.d.ts.map +1 -1
  186. package/dist/middleware/client-secret-hash.js +161 -59
  187. package/dist/middleware/client-secret-hash.js.map +1 -1
  188. package/dist/middleware/health.d.ts +17 -0
  189. package/dist/middleware/health.d.ts.map +1 -1
  190. package/dist/middleware/health.js +25 -21
  191. package/dist/middleware/health.js.map +1 -1
  192. package/dist/middleware/ready.d.ts.map +1 -1
  193. package/dist/middleware/ready.js +1 -12
  194. package/dist/middleware/ready.js.map +1 -1
  195. package/dist/middleware/require-existing-organization.d.ts +18 -0
  196. package/dist/middleware/require-existing-organization.d.ts.map +1 -0
  197. package/dist/middleware/require-existing-organization.js +38 -0
  198. package/dist/middleware/require-existing-organization.js.map +1 -0
  199. package/dist/middleware/require-permission.d.ts.map +1 -1
  200. package/dist/middleware/require-permission.js +35 -1
  201. package/dist/middleware/require-permission.js.map +1 -1
  202. package/dist/middleware/require-user-organization.d.ts.map +1 -1
  203. package/dist/middleware/require-user-organization.js +4 -2
  204. package/dist/middleware/require-user-organization.js.map +1 -1
  205. package/dist/middleware/security-headers.d.ts +18 -0
  206. package/dist/middleware/security-headers.d.ts.map +1 -1
  207. package/dist/middleware/security-headers.js +32 -1
  208. package/dist/middleware/security-headers.js.map +1 -1
  209. package/dist/middleware/tenant-resolver.d.ts +1 -2
  210. package/dist/middleware/tenant-resolver.d.ts.map +1 -1
  211. package/dist/middleware/tenant-resolver.js +1 -5
  212. package/dist/middleware/tenant-resolver.js.map +1 -1
  213. package/dist/middleware/token-rate-limiter.d.ts +37 -16
  214. package/dist/middleware/token-rate-limiter.d.ts.map +1 -1
  215. package/dist/middleware/token-rate-limiter.js +126 -54
  216. package/dist/middleware/token-rate-limiter.js.map +1 -1
  217. package/dist/oidc/account-finder.d.ts +5 -5
  218. package/dist/oidc/account-finder.d.ts.map +1 -1
  219. package/dist/oidc/account-finder.js +31 -23
  220. package/dist/oidc/account-finder.js.map +1 -1
  221. package/dist/oidc/adapter-factory.d.ts.map +1 -1
  222. package/dist/oidc/adapter-factory.js +83 -3
  223. package/dist/oidc/adapter-factory.js.map +1 -1
  224. package/dist/oidc/configuration.d.ts +3 -8
  225. package/dist/oidc/configuration.d.ts.map +1 -1
  226. package/dist/oidc/configuration.js +64 -50
  227. package/dist/oidc/configuration.js.map +1 -1
  228. package/dist/oidc/provider.d.ts.map +1 -1
  229. package/dist/oidc/provider.js +7 -0
  230. package/dist/oidc/provider.js.map +1 -1
  231. package/dist/oidc/redis-adapter.d.ts +2 -3
  232. package/dist/oidc/redis-adapter.d.ts.map +1 -1
  233. package/dist/oidc/redis-adapter.js +54 -46
  234. package/dist/oidc/redis-adapter.js.map +1 -1
  235. package/dist/organizations/branding-url.d.ts +17 -0
  236. package/dist/organizations/branding-url.d.ts.map +1 -0
  237. package/dist/organizations/branding-url.js +38 -0
  238. package/dist/organizations/branding-url.js.map +1 -0
  239. package/dist/organizations/index.d.ts +2 -2
  240. package/dist/organizations/index.d.ts.map +1 -1
  241. package/dist/organizations/index.js +1 -1
  242. package/dist/organizations/index.js.map +1 -1
  243. package/dist/organizations/repository.d.ts +22 -32
  244. package/dist/organizations/repository.d.ts.map +1 -1
  245. package/dist/organizations/repository.js +64 -45
  246. package/dist/organizations/repository.js.map +1 -1
  247. package/dist/organizations/service.d.ts +14 -46
  248. package/dist/organizations/service.d.ts.map +1 -1
  249. package/dist/organizations/service.js +60 -112
  250. package/dist/organizations/service.js.map +1 -1
  251. package/dist/organizations/types.d.ts +1 -15
  252. package/dist/organizations/types.d.ts.map +1 -1
  253. package/dist/organizations/validators.d.ts +41 -0
  254. package/dist/organizations/validators.d.ts.map +1 -0
  255. package/dist/organizations/validators.js +48 -0
  256. package/dist/organizations/validators.js.map +1 -0
  257. package/dist/portability/apply.d.ts +15 -0
  258. package/dist/portability/apply.d.ts.map +1 -0
  259. package/dist/portability/apply.js +274 -0
  260. package/dist/portability/apply.js.map +1 -0
  261. package/dist/portability/authorization.d.ts +30 -0
  262. package/dist/portability/authorization.d.ts.map +1 -0
  263. package/dist/portability/authorization.js +130 -0
  264. package/dist/portability/authorization.js.map +1 -0
  265. package/dist/portability/cleanup.d.ts +29 -0
  266. package/dist/portability/cleanup.d.ts.map +1 -0
  267. package/dist/portability/cleanup.js +167 -0
  268. package/dist/portability/cleanup.js.map +1 -0
  269. package/dist/portability/export.d.ts +18 -0
  270. package/dist/portability/export.d.ts.map +1 -0
  271. package/dist/portability/export.js +125 -0
  272. package/dist/portability/export.js.map +1 -0
  273. package/dist/portability/import-repository.d.ts +204 -0
  274. package/dist/portability/import-repository.d.ts.map +1 -0
  275. package/dist/portability/import-repository.js +347 -0
  276. package/dist/portability/import-repository.js.map +1 -0
  277. package/dist/portability/import-user-client-writers.d.ts +40 -0
  278. package/dist/portability/import-user-client-writers.d.ts.map +1 -0
  279. package/dist/portability/import-user-client-writers.js +168 -0
  280. package/dist/portability/import-user-client-writers.js.map +1 -0
  281. package/dist/portability/index.d.ts +8 -0
  282. package/dist/portability/index.d.ts.map +1 -0
  283. package/dist/portability/index.js +8 -0
  284. package/dist/portability/index.js.map +1 -0
  285. package/dist/portability/plan-support.d.ts +137 -0
  286. package/dist/portability/plan-support.d.ts.map +1 -0
  287. package/dist/portability/plan-support.js +336 -0
  288. package/dist/portability/plan-support.js.map +1 -0
  289. package/dist/portability/plan.d.ts +34 -0
  290. package/dist/portability/plan.d.ts.map +1 -0
  291. package/dist/portability/plan.js +450 -0
  292. package/dist/portability/plan.js.map +1 -0
  293. package/dist/portability/repository.d.ts +95 -0
  294. package/dist/portability/repository.d.ts.map +1 -0
  295. package/dist/portability/repository.js +388 -0
  296. package/dist/portability/repository.js.map +1 -0
  297. package/dist/portability/schema.d.ts +589 -0
  298. package/dist/portability/schema.d.ts.map +1 -0
  299. package/dist/portability/schema.js +458 -0
  300. package/dist/portability/schema.js.map +1 -0
  301. package/dist/portability/types.d.ts +381 -0
  302. package/dist/portability/types.d.ts.map +1 -0
  303. package/dist/portability/types.js +19 -0
  304. package/dist/portability/types.js.map +1 -0
  305. package/dist/rbac/errors.d.ts +4 -0
  306. package/dist/rbac/errors.d.ts.map +1 -1
  307. package/dist/rbac/errors.js +7 -0
  308. package/dist/rbac/errors.js.map +1 -1
  309. package/dist/rbac/index.d.ts +3 -3
  310. package/dist/rbac/index.d.ts.map +1 -1
  311. package/dist/rbac/index.js +3 -3
  312. package/dist/rbac/index.js.map +1 -1
  313. package/dist/rbac/mapping-repository.d.ts +84 -9
  314. package/dist/rbac/mapping-repository.d.ts.map +1 -1
  315. package/dist/rbac/mapping-repository.js +222 -55
  316. package/dist/rbac/mapping-repository.js.map +1 -1
  317. package/dist/rbac/permission-repository.d.ts +36 -19
  318. package/dist/rbac/permission-repository.d.ts.map +1 -1
  319. package/dist/rbac/permission-repository.js +93 -35
  320. package/dist/rbac/permission-repository.js.map +1 -1
  321. package/dist/rbac/permission-service.d.ts +18 -19
  322. package/dist/rbac/permission-service.d.ts.map +1 -1
  323. package/dist/rbac/permission-service.js +100 -57
  324. package/dist/rbac/permission-service.js.map +1 -1
  325. package/dist/rbac/role-repository.d.ts +29 -24
  326. package/dist/rbac/role-repository.d.ts.map +1 -1
  327. package/dist/rbac/role-repository.js +66 -43
  328. package/dist/rbac/role-repository.js.map +1 -1
  329. package/dist/rbac/role-service.d.ts +35 -32
  330. package/dist/rbac/role-service.d.ts.map +1 -1
  331. package/dist/rbac/role-service.js +210 -96
  332. package/dist/rbac/role-service.js.map +1 -1
  333. package/dist/rbac/slugs.d.ts +16 -27
  334. package/dist/rbac/slugs.d.ts.map +1 -1
  335. package/dist/rbac/slugs.js +36 -59
  336. package/dist/rbac/slugs.js.map +1 -1
  337. package/dist/rbac/types.d.ts +2 -4
  338. package/dist/rbac/types.d.ts.map +1 -1
  339. package/dist/rbac/types.js.map +1 -1
  340. package/dist/rbac/user-role-service.d.ts +23 -24
  341. package/dist/rbac/user-role-service.d.ts.map +1 -1
  342. package/dist/rbac/user-role-service.js +117 -61
  343. package/dist/rbac/user-role-service.js.map +1 -1
  344. package/dist/routes/applications.d.ts +4 -2
  345. package/dist/routes/applications.d.ts.map +1 -1
  346. package/dist/routes/applications.js +57 -19
  347. package/dist/routes/applications.js.map +1 -1
  348. package/dist/routes/audit.js +1 -1
  349. package/dist/routes/audit.js.map +1 -1
  350. package/dist/routes/branding.d.ts +3 -3
  351. package/dist/routes/branding.d.ts.map +1 -1
  352. package/dist/routes/branding.js +44 -16
  353. package/dist/routes/branding.js.map +1 -1
  354. package/dist/routes/bulk.d.ts +0 -5
  355. package/dist/routes/bulk.d.ts.map +1 -1
  356. package/dist/routes/bulk.js +3 -5
  357. package/dist/routes/bulk.js.map +1 -1
  358. package/dist/routes/clients.d.ts +4 -4
  359. package/dist/routes/clients.d.ts.map +1 -1
  360. package/dist/routes/clients.js +111 -52
  361. package/dist/routes/clients.js.map +1 -1
  362. package/dist/routes/config.d.ts +17 -12
  363. package/dist/routes/config.d.ts.map +1 -1
  364. package/dist/routes/config.js +165 -64
  365. package/dist/routes/config.js.map +1 -1
  366. package/dist/routes/custom-claims.d.ts.map +1 -1
  367. package/dist/routes/custom-claims.js +8 -2
  368. package/dist/routes/custom-claims.js.map +1 -1
  369. package/dist/routes/exports.d.ts +2 -1
  370. package/dist/routes/exports.d.ts.map +1 -1
  371. package/dist/routes/exports.js +57 -1
  372. package/dist/routes/exports.js.map +1 -1
  373. package/dist/routes/imports.d.ts +2 -2
  374. package/dist/routes/imports.d.ts.map +1 -1
  375. package/dist/routes/imports.js +95 -40
  376. package/dist/routes/imports.js.map +1 -1
  377. package/dist/routes/interactions.d.ts.map +1 -1
  378. package/dist/routes/interactions.js +16 -34
  379. package/dist/routes/interactions.js.map +1 -1
  380. package/dist/routes/invitation.d.ts.map +1 -1
  381. package/dist/routes/invitation.js +10 -23
  382. package/dist/routes/invitation.js.map +1 -1
  383. package/dist/routes/keys.d.ts.map +1 -1
  384. package/dist/routes/keys.js +26 -13
  385. package/dist/routes/keys.js.map +1 -1
  386. package/dist/routes/magic-link.d.ts.map +1 -1
  387. package/dist/routes/magic-link.js +5 -17
  388. package/dist/routes/magic-link.js.map +1 -1
  389. package/dist/routes/organizations.d.ts +1 -2
  390. package/dist/routes/organizations.d.ts.map +1 -1
  391. package/dist/routes/organizations.js +43 -104
  392. package/dist/routes/organizations.js.map +1 -1
  393. package/dist/routes/password-reset.d.ts.map +1 -1
  394. package/dist/routes/password-reset.js +13 -35
  395. package/dist/routes/password-reset.js.map +1 -1
  396. package/dist/routes/permissions.d.ts +1 -1
  397. package/dist/routes/permissions.d.ts.map +1 -1
  398. package/dist/routes/permissions.js +58 -17
  399. package/dist/routes/permissions.js.map +1 -1
  400. package/dist/routes/public-branding.d.ts +16 -0
  401. package/dist/routes/public-branding.d.ts.map +1 -0
  402. package/dist/routes/public-branding.js +52 -0
  403. package/dist/routes/public-branding.js.map +1 -0
  404. package/dist/routes/roles.d.ts +1 -1
  405. package/dist/routes/roles.d.ts.map +1 -1
  406. package/dist/routes/roles.js +63 -21
  407. package/dist/routes/roles.js.map +1 -1
  408. package/dist/routes/sessions.d.ts.map +1 -1
  409. package/dist/routes/sessions.js +23 -12
  410. package/dist/routes/sessions.js.map +1 -1
  411. package/dist/routes/two-factor.d.ts.map +1 -1
  412. package/dist/routes/two-factor.js +91 -38
  413. package/dist/routes/two-factor.js.map +1 -1
  414. package/dist/routes/user-roles.d.ts.map +1 -1
  415. package/dist/routes/user-roles.js +56 -9
  416. package/dist/routes/user-roles.js.map +1 -1
  417. package/dist/routes/users.d.ts +4 -8
  418. package/dist/routes/users.d.ts.map +1 -1
  419. package/dist/routes/users.js +108 -265
  420. package/dist/routes/users.js.map +1 -1
  421. package/dist/server.d.ts.map +1 -1
  422. package/dist/server.js +53 -37
  423. package/dist/server.js.map +1 -1
  424. package/dist/two-factor/errors.d.ts +9 -0
  425. package/dist/two-factor/errors.d.ts.map +1 -1
  426. package/dist/two-factor/errors.js +12 -0
  427. package/dist/two-factor/errors.js.map +1 -1
  428. package/dist/two-factor/index.d.ts +5 -4
  429. package/dist/two-factor/index.d.ts.map +1 -1
  430. package/dist/two-factor/index.js +4 -4
  431. package/dist/two-factor/index.js.map +1 -1
  432. package/dist/two-factor/repository.d.ts +17 -6
  433. package/dist/two-factor/repository.d.ts.map +1 -1
  434. package/dist/two-factor/repository.js +37 -9
  435. package/dist/two-factor/repository.js.map +1 -1
  436. package/dist/two-factor/service.d.ts.map +1 -1
  437. package/dist/two-factor/service.js +26 -19
  438. package/dist/two-factor/service.js.map +1 -1
  439. package/dist/two-factor/totp.d.ts +13 -2
  440. package/dist/two-factor/totp.d.ts.map +1 -1
  441. package/dist/two-factor/totp.js +20 -7
  442. package/dist/two-factor/totp.js.map +1 -1
  443. package/dist/two-factor/types.d.ts +3 -0
  444. package/dist/two-factor/types.d.ts.map +1 -1
  445. package/dist/two-factor/types.js +5 -0
  446. package/dist/two-factor/types.js.map +1 -1
  447. package/dist/users/gdpr.d.ts +2 -40
  448. package/dist/users/gdpr.d.ts.map +1 -1
  449. package/dist/users/gdpr.js +3 -110
  450. package/dist/users/gdpr.js.map +1 -1
  451. package/dist/users/index.d.ts +5 -4
  452. package/dist/users/index.d.ts.map +1 -1
  453. package/dist/users/index.js +5 -4
  454. package/dist/users/index.js.map +1 -1
  455. package/dist/users/repository.d.ts +49 -3
  456. package/dist/users/repository.d.ts.map +1 -1
  457. package/dist/users/repository.js +169 -18
  458. package/dist/users/repository.js.map +1 -1
  459. package/dist/users/service.d.ts +19 -51
  460. package/dist/users/service.d.ts.map +1 -1
  461. package/dist/users/service.js +72 -122
  462. package/dist/users/service.js.map +1 -1
  463. package/dist/users/types.d.ts +4 -5
  464. package/dist/users/types.d.ts.map +1 -1
  465. package/dist/users/types.js.map +1 -1
  466. package/dist/users/validators.d.ts +28 -0
  467. package/dist/users/validators.d.ts.map +1 -0
  468. package/dist/users/validators.js +25 -0
  469. package/dist/users/validators.js.map +1 -0
  470. package/locales/default/en/errors.json +2 -1
  471. package/migrations/024_application_client_correction.sql +39 -0
  472. package/migrations/025_record_deletion_lifecycle.sql +26 -0
  473. package/migrations/026_simplify_user_lifecycle.sql +33 -0
  474. package/migrations/027_branding_asset_size_limits.sql +19 -0
  475. package/migrations/028_totp_replay_protection.sql +17 -0
  476. package/migrations/029_public_session_identifiers.sql +16 -0
  477. package/migrations/030_global_configuration_catalog.sql +39 -0
  478. package/migrations/031_monotonic_updated_at.sql +28 -0
  479. package/package.json +2 -2
  480. package/dist/lib/data-import-plan.d.ts +0 -50
  481. package/dist/lib/data-import-plan.d.ts.map +0 -1
  482. package/dist/lib/data-import-plan.js +0 -235
  483. package/dist/lib/data-import-plan.js.map +0 -1
  484. package/dist/lib/data-import.d.ts +0 -276
  485. package/dist/lib/data-import.d.ts.map +0 -1
  486. package/dist/lib/data-import.js +0 -1694
  487. package/dist/lib/data-import.js.map +0 -1
@@ -0,0 +1,450 @@
1
+ /** Mutation-free normalization, dependency resolution, and import action planning. */
2
+ import { runDatabaseTransaction } from '../lib/database.js';
3
+ import { validateClaimValue } from '../custom-claims/validators.js';
4
+ import { readPortabilityImportSnapshot, } from './import-repository.js';
5
+ import { addError, addItem, applicationIsSelected, clientMutableValuesMatch, compareOutcomes, dependencyState, emptySummary, groupByKey, key, normalizedEmail, normalizedRbac, normalizedSlug, organizationMatches, parentError, recordAction, recordIdentity, rejectDuplicates, sameValue, userMatches, validateRootScope, } from './plan-support.js';
6
+ import { portabilityManifestSchema, portabilityResultSchema } from './schema.js';
7
+ /**
8
+ * Build the resolved plan using the current request-owned transaction.
9
+ *
10
+ * Apply uses this boundary so preview and mutation share the same normalization,
11
+ * compatibility, and dependency checks.
12
+ *
13
+ * @param input - Manifest received by the service
14
+ * @param mode - Requested preview or apply behavior
15
+ * @returns Normalized manifest, private snapshot, and safe public result
16
+ */
17
+ export async function buildResolvedPortabilityPlan(input, mode) {
18
+ const manifest = portabilityManifestSchema.parse(input);
19
+ const snapshot = await readPortabilityImportSnapshot(manifest);
20
+ const accumulator = { items: [], errors: [], summary: emptySummary() };
21
+ const duplicateRecords = rejectDuplicates(manifest, accumulator);
22
+ const organizations = groupByKey(snapshot.organizations, (row) => normalizedSlug(row.slug));
23
+ const brandingAssets = groupByKey(snapshot.brandingAssets, (row) => normalizedSlug(row.organization_slug));
24
+ const applications = groupByKey(snapshot.applications, (row) => normalizedSlug(row.slug));
25
+ const modules = groupByKey(snapshot.applicationModules, (row) => key(normalizedSlug(row.application_slug), normalizedSlug(row.slug)));
26
+ const roles = groupByKey(snapshot.roles, (row) => key(normalizedSlug(row.application_slug), normalizedRbac(row.slug)));
27
+ const permissions = groupByKey(snapshot.permissions, (row) => key(normalizedSlug(row.application_slug), normalizedRbac(row.slug)));
28
+ const claims = groupByKey(snapshot.claimDefinitions, (row) => key(normalizedSlug(row.application_slug), row.claim_name));
29
+ const users = groupByKey(snapshot.users, (row) => key(normalizedSlug(row.organization_slug), normalizedEmail(row.email)));
30
+ const clients = groupByKey(snapshot.clients, (row) => row.client_id);
31
+ const manifestOrganizations = new Set(manifest.organizations.map((row) => normalizedSlug(row.slug)));
32
+ const manifestApplications = new Set(manifest.applications.map((row) => normalizedSlug(row.slug)));
33
+ const manifestModules = new Set(manifest.application_modules.map((row) => key(normalizedSlug(row.application_slug), normalizedSlug(row.slug))));
34
+ const manifestRoles = new Set(manifest.roles.map((row) => key(normalizedSlug(row.application_slug), normalizedRbac(row.slug))));
35
+ const manifestPermissions = new Set(manifest.permissions.map((row) => key(normalizedSlug(row.application_slug), normalizedRbac(row.slug))));
36
+ const manifestClaims = new Set(manifest.claim_definitions.map((row) => key(normalizedSlug(row.application_slug), row.claim_name)));
37
+ const manifestUsers = new Set(manifest.users.map((row) => key(normalizedSlug(row.organization_slug), normalizedEmail(row.email))));
38
+ const selectedOrganization = manifest.scope.kind === 'organization'
39
+ ? normalizedSlug(manifest.scope.organization_slug)
40
+ : null;
41
+ validateRootScope(manifest, accumulator, organizations, manifestOrganizations);
42
+ for (const source of manifest.organizations) {
43
+ const naturalKey = { slug: source.slug };
44
+ if (duplicateRecords.has(recordIdentity('organizations', naturalKey)))
45
+ continue;
46
+ if (selectedOrganization !== null && normalizedSlug(source.slug) !== selectedOrganization) {
47
+ addError(accumulator, 'organizations', naturalKey, 'cross_scope_reference');
48
+ continue;
49
+ }
50
+ if (source.slug === 'porta-admin') {
51
+ addError(accumulator, 'organizations', naturalKey, 'control_plane_record');
52
+ continue;
53
+ }
54
+ const matches = organizations.get(normalizedSlug(source.slug));
55
+ if ((matches?.length ?? 0) > 1) {
56
+ addError(accumulator, 'organizations', naturalKey, 'ambiguous_dependency');
57
+ continue;
58
+ }
59
+ const destination = matches?.[0];
60
+ if (destination?.is_super_admin) {
61
+ addError(accumulator, 'organizations', naturalKey, 'control_plane_record');
62
+ continue;
63
+ }
64
+ addItem(accumulator, 'organizations', recordAction(mode, destination !== undefined, destination !== undefined &&
65
+ organizationMatches(source, destination, new Map((brandingAssets.get(normalizedSlug(source.slug)) ?? []).map((asset) => [
66
+ asset.asset_type,
67
+ { content_type: asset.content_type, data: asset.data },
68
+ ])))), naturalKey);
69
+ }
70
+ for (const source of manifest.applications) {
71
+ const naturalKey = { slug: source.slug };
72
+ if (duplicateRecords.has(recordIdentity('applications', naturalKey)))
73
+ continue;
74
+ if (!applicationIsSelected(manifest, source.slug)) {
75
+ addError(accumulator, 'applications', naturalKey, 'cross_scope_reference');
76
+ continue;
77
+ }
78
+ if (source.slug === 'porta-admin') {
79
+ addError(accumulator, 'applications', naturalKey, 'control_plane_record');
80
+ continue;
81
+ }
82
+ const matches = applications.get(normalizedSlug(source.slug));
83
+ if ((matches?.length ?? 0) > 1) {
84
+ addError(accumulator, 'applications', naturalKey, 'ambiguous_dependency');
85
+ continue;
86
+ }
87
+ const destination = matches?.[0];
88
+ const same = destination !== undefined &&
89
+ source.name === destination.name &&
90
+ source.description === destination.description &&
91
+ source.status === destination.status;
92
+ addItem(accumulator, 'applications', recordAction(mode, destination !== undefined, same), naturalKey);
93
+ }
94
+ for (const source of manifest.application_modules) {
95
+ const naturalKey = { application_slug: source.application_slug, slug: source.slug };
96
+ const appKey = normalizedSlug(source.application_slug);
97
+ if (duplicateRecords.has(recordIdentity('application_modules', naturalKey)))
98
+ continue;
99
+ if (!applicationIsSelected(manifest, source.application_slug)) {
100
+ addError(accumulator, 'application_modules', naturalKey, 'cross_scope_reference');
101
+ continue;
102
+ }
103
+ const dependency = parentError(manifestApplications.has(appKey), applications.get(appKey));
104
+ if (appKey === 'porta-admin')
105
+ addError(accumulator, 'application_modules', naturalKey, 'control_plane_record');
106
+ else if (dependency !== null)
107
+ addError(accumulator, 'application_modules', naturalKey, dependency);
108
+ else {
109
+ const matches = modules.get(key(appKey, normalizedSlug(source.slug)));
110
+ if ((matches?.length ?? 0) > 1) {
111
+ addError(accumulator, 'application_modules', naturalKey, 'ambiguous_dependency');
112
+ continue;
113
+ }
114
+ const destination = matches?.[0];
115
+ const same = destination !== undefined &&
116
+ source.name === destination.name &&
117
+ source.description === destination.description &&
118
+ source.status === destination.status;
119
+ addItem(accumulator, 'application_modules', recordAction(mode, destination !== undefined, same), naturalKey);
120
+ }
121
+ }
122
+ for (const source of manifest.roles) {
123
+ const naturalKey = { application_slug: source.application_slug, slug: source.slug };
124
+ const appKey = normalizedSlug(source.application_slug);
125
+ if (duplicateRecords.has(recordIdentity('roles', naturalKey)))
126
+ continue;
127
+ if (!applicationIsSelected(manifest, source.application_slug)) {
128
+ addError(accumulator, 'roles', naturalKey, 'cross_scope_reference');
129
+ continue;
130
+ }
131
+ const dependency = parentError(manifestApplications.has(appKey), applications.get(appKey));
132
+ if (appKey === 'porta-admin')
133
+ addError(accumulator, 'roles', naturalKey, 'control_plane_record');
134
+ else if (dependency !== null)
135
+ addError(accumulator, 'roles', naturalKey, dependency);
136
+ else {
137
+ const matches = roles.get(key(appKey, normalizedRbac(source.slug)));
138
+ if ((matches?.length ?? 0) > 1) {
139
+ addError(accumulator, 'roles', naturalKey, 'ambiguous_dependency');
140
+ continue;
141
+ }
142
+ const destination = matches?.[0];
143
+ const same = destination !== undefined &&
144
+ source.name === destination.name &&
145
+ source.description === destination.description;
146
+ addItem(accumulator, 'roles', recordAction(mode, destination !== undefined, same), naturalKey);
147
+ }
148
+ }
149
+ for (const source of manifest.permissions) {
150
+ const naturalKey = { application_slug: source.application_slug, slug: source.slug };
151
+ const appKey = normalizedSlug(source.application_slug);
152
+ if (duplicateRecords.has(recordIdentity('permissions', naturalKey)))
153
+ continue;
154
+ if (!applicationIsSelected(manifest, source.application_slug)) {
155
+ addError(accumulator, 'permissions', naturalKey, 'cross_scope_reference');
156
+ continue;
157
+ }
158
+ const dependency = parentError(manifestApplications.has(appKey), applications.get(appKey));
159
+ if (appKey === 'porta-admin') {
160
+ addError(accumulator, 'permissions', naturalKey, 'control_plane_record');
161
+ continue;
162
+ }
163
+ if (dependency !== null) {
164
+ addError(accumulator, 'permissions', naturalKey, dependency);
165
+ continue;
166
+ }
167
+ if (source.module_slug !== null) {
168
+ const moduleKey = key(appKey, normalizedSlug(source.module_slug));
169
+ const moduleDependency = parentError(manifestModules.has(moduleKey), modules.get(moduleKey));
170
+ if (moduleDependency !== null) {
171
+ addError(accumulator, 'permissions', naturalKey, moduleDependency);
172
+ continue;
173
+ }
174
+ }
175
+ const matches = permissions.get(key(appKey, normalizedRbac(source.slug)));
176
+ if ((matches?.length ?? 0) > 1) {
177
+ addError(accumulator, 'permissions', naturalKey, 'ambiguous_dependency');
178
+ continue;
179
+ }
180
+ const destination = matches?.[0];
181
+ if (destination !== undefined &&
182
+ normalizedSlug(destination.module_slug ?? '') !== normalizedSlug(source.module_slug ?? '')) {
183
+ addError(accumulator, 'permissions', naturalKey, 'incompatible_record');
184
+ continue;
185
+ }
186
+ const same = destination !== undefined &&
187
+ source.name === destination.name &&
188
+ source.description === destination.description;
189
+ addItem(accumulator, 'permissions', recordAction(mode, destination !== undefined, same), naturalKey);
190
+ }
191
+ for (const source of manifest.claim_definitions) {
192
+ const naturalKey = { application_slug: source.application_slug, claim_name: source.claim_name };
193
+ const appKey = normalizedSlug(source.application_slug);
194
+ if (duplicateRecords.has(recordIdentity('claim_definitions', naturalKey)))
195
+ continue;
196
+ if (!applicationIsSelected(manifest, source.application_slug)) {
197
+ addError(accumulator, 'claim_definitions', naturalKey, 'cross_scope_reference');
198
+ continue;
199
+ }
200
+ const dependency = parentError(manifestApplications.has(appKey), applications.get(appKey));
201
+ if (appKey === 'porta-admin')
202
+ addError(accumulator, 'claim_definitions', naturalKey, 'control_plane_record');
203
+ else if (dependency !== null)
204
+ addError(accumulator, 'claim_definitions', naturalKey, dependency);
205
+ else {
206
+ const matches = claims.get(key(appKey, source.claim_name));
207
+ if ((matches?.length ?? 0) > 1) {
208
+ addError(accumulator, 'claim_definitions', naturalKey, 'ambiguous_dependency');
209
+ continue;
210
+ }
211
+ const destination = matches?.[0];
212
+ if (destination !== undefined && destination.claim_type !== source.claim_type) {
213
+ addError(accumulator, 'claim_definitions', naturalKey, 'incompatible_record');
214
+ continue;
215
+ }
216
+ const same = destination !== undefined &&
217
+ source.description === destination.description &&
218
+ source.include_in_id_token === destination.include_in_id_token &&
219
+ source.include_in_access_token === destination.include_in_access_token &&
220
+ source.include_in_userinfo === destination.include_in_userinfo;
221
+ addItem(accumulator, 'claim_definitions', recordAction(mode, destination !== undefined, same), naturalKey);
222
+ }
223
+ }
224
+ const rolePermissionEdges = new Set(snapshot.rolePermissions.flatMap((row) => row.permission_slugs.map((permissionSlug) => key(normalizedSlug(row.application_slug), normalizedRbac(row.role_slug), normalizedRbac(permissionSlug)))));
225
+ for (const source of manifest.role_permission_mappings) {
226
+ const naturalKey = { application_slug: source.application_slug, role_slug: source.role_slug };
227
+ const appKey = normalizedSlug(source.application_slug);
228
+ const roleKey = key(appKey, normalizedRbac(source.role_slug));
229
+ if (duplicateRecords.has(recordIdentity('role_permission_mappings', naturalKey)))
230
+ continue;
231
+ if (!applicationIsSelected(manifest, source.application_slug)) {
232
+ addError(accumulator, 'role_permission_mappings', naturalKey, 'cross_scope_reference');
233
+ continue;
234
+ }
235
+ let error = appKey === 'porta-admin'
236
+ ? 'control_plane_record'
237
+ : parentError(manifestRoles.has(roleKey), roles.get(roleKey));
238
+ for (const permissionSlug of source.permission_slugs) {
239
+ if (error !== null)
240
+ break;
241
+ const permissionKey = key(appKey, normalizedRbac(permissionSlug));
242
+ if (manifestPermissions.has(permissionKey) ||
243
+ dependencyState(permissions.get(permissionKey)) === 'resolved')
244
+ continue;
245
+ const elsewhere = manifest.permissions.some((row) => normalizedRbac(row.slug) === normalizedRbac(permissionSlug)) ||
246
+ snapshot.permissions.some((row) => normalizedRbac(row.slug) === normalizedRbac(permissionSlug));
247
+ error = elsewhere ? 'cross_scope_reference' : 'missing_dependency';
248
+ }
249
+ if (error !== null) {
250
+ addError(accumulator, 'role_permission_mappings', naturalKey, error);
251
+ continue;
252
+ }
253
+ const existingEdges = source.permission_slugs.filter((slug) => rolePermissionEdges.has(key(appKey, normalizedRbac(source.role_slug), normalizedRbac(slug)))).length;
254
+ const action = existingEdges === source.permission_slugs.length
255
+ ? 'skipped'
256
+ : existingEdges === 0
257
+ ? 'created'
258
+ : 'updated';
259
+ addItem(accumulator, 'role_permission_mappings', action, naturalKey);
260
+ }
261
+ for (const source of manifest.users) {
262
+ const naturalKey = { organization_slug: source.organization_slug, email: source.email };
263
+ const orgKey = normalizedSlug(source.organization_slug);
264
+ if (duplicateRecords.has(recordIdentity('users', naturalKey)))
265
+ continue;
266
+ if (selectedOrganization !== null && orgKey !== selectedOrganization) {
267
+ addError(accumulator, 'users', { organization_slug: source.organization_slug, email: '[redacted]' }, 'cross_scope_reference');
268
+ continue;
269
+ }
270
+ const dependency = parentError(manifestOrganizations.has(orgKey), organizations.get(orgKey));
271
+ if (orgKey === 'porta-admin')
272
+ addError(accumulator, 'users', naturalKey, 'control_plane_record');
273
+ else if (dependency !== null)
274
+ addError(accumulator, 'users', naturalKey, dependency);
275
+ else {
276
+ const matches = users.get(key(orgKey, normalizedEmail(source.email)));
277
+ if ((matches?.length ?? 0) > 1) {
278
+ addError(accumulator, 'users', naturalKey, 'ambiguous_dependency');
279
+ continue;
280
+ }
281
+ const destination = matches?.[0];
282
+ addItem(accumulator, 'users', recordAction(mode, destination !== undefined, destination !== undefined && userMatches(source, destination)), naturalKey);
283
+ }
284
+ }
285
+ const userRoleEdges = new Set(snapshot.userRoles.map((row) => key(normalizedSlug(row.organization_slug), normalizedEmail(row.email), normalizedSlug(row.application_slug), normalizedRbac(row.role_slug))));
286
+ for (const source of manifest.user_role_assignments) {
287
+ const naturalKey = {
288
+ organization_slug: source.organization_slug,
289
+ email: source.email,
290
+ application_slug: source.application_slug,
291
+ role_slug: source.role_slug,
292
+ };
293
+ const orgKey = normalizedSlug(source.organization_slug);
294
+ const appKey = normalizedSlug(source.application_slug);
295
+ const userKey = key(orgKey, normalizedEmail(source.email));
296
+ const roleKey = key(appKey, normalizedRbac(source.role_slug));
297
+ if (duplicateRecords.has(recordIdentity('user_role_assignments', naturalKey)))
298
+ continue;
299
+ let error = null;
300
+ if (!applicationIsSelected(manifest, source.application_slug))
301
+ error = 'cross_scope_reference';
302
+ else if (selectedOrganization !== null && orgKey !== selectedOrganization)
303
+ error = 'cross_scope_reference';
304
+ else if (orgKey === 'porta-admin' || appKey === 'porta-admin')
305
+ error = 'control_plane_record';
306
+ else if (!manifestUsers.has(userKey) && dependencyState(users.get(userKey)) !== 'resolved') {
307
+ const elsewhere = manifest.users.some((row) => normalizedEmail(row.email) === normalizedEmail(source.email)) ||
308
+ snapshot.users.some((row) => normalizedEmail(row.email) === normalizedEmail(source.email));
309
+ error = elsewhere ? 'cross_scope_reference' : 'missing_dependency';
310
+ }
311
+ else if (!manifestRoles.has(roleKey) && dependencyState(roles.get(roleKey)) !== 'resolved') {
312
+ const elsewhere = manifest.roles.some((row) => normalizedRbac(row.slug) === normalizedRbac(source.role_slug)) ||
313
+ snapshot.roles.some((row) => normalizedRbac(row.slug) === normalizedRbac(source.role_slug));
314
+ error = elsewhere ? 'cross_scope_reference' : 'missing_dependency';
315
+ }
316
+ if (error !== null)
317
+ addError(accumulator, 'user_role_assignments', error === 'cross_scope_reference'
318
+ ? {
319
+ organization_slug: source.organization_slug,
320
+ email: '[redacted]',
321
+ application_slug: source.application_slug,
322
+ role_slug: source.role_slug,
323
+ }
324
+ : naturalKey, error);
325
+ else
326
+ addItem(accumulator, 'user_role_assignments', userRoleEdges.has(key(orgKey, normalizedEmail(source.email), appKey, normalizedRbac(source.role_slug)))
327
+ ? 'skipped'
328
+ : 'created', naturalKey);
329
+ }
330
+ const claimValues = groupByKey(snapshot.userClaimValues, (row) => key(normalizedSlug(row.organization_slug), normalizedEmail(row.email), normalizedSlug(row.application_slug), row.claim_name));
331
+ for (const source of manifest.user_claim_values) {
332
+ const naturalKey = {
333
+ organization_slug: source.organization_slug,
334
+ email: source.email,
335
+ application_slug: source.application_slug,
336
+ claim_name: source.claim_name,
337
+ };
338
+ const orgKey = normalizedSlug(source.organization_slug);
339
+ const appKey = normalizedSlug(source.application_slug);
340
+ const userKey = key(orgKey, normalizedEmail(source.email));
341
+ const claimKey = key(appKey, source.claim_name);
342
+ if (duplicateRecords.has(recordIdentity('user_claim_values', naturalKey)))
343
+ continue;
344
+ let error = null;
345
+ if (!applicationIsSelected(manifest, source.application_slug))
346
+ error = 'cross_scope_reference';
347
+ else if (selectedOrganization !== null && orgKey !== selectedOrganization)
348
+ error = 'cross_scope_reference';
349
+ else if (orgKey === 'porta-admin' || appKey === 'porta-admin')
350
+ error = 'control_plane_record';
351
+ else if (!manifestUsers.has(userKey) && dependencyState(users.get(userKey)) !== 'resolved')
352
+ error = 'missing_dependency';
353
+ else if (!manifestClaims.has(claimKey) &&
354
+ dependencyState(claims.get(claimKey)) !== 'resolved') {
355
+ const elsewhere = manifest.claim_definitions.some((row) => row.claim_name === source.claim_name) ||
356
+ snapshot.claimDefinitions.some((row) => row.claim_name === source.claim_name);
357
+ error = elsewhere ? 'cross_scope_reference' : 'missing_dependency';
358
+ }
359
+ const claimType = manifest.claim_definitions.find((definition) => normalizedSlug(definition.application_slug) === appKey &&
360
+ definition.claim_name === source.claim_name)?.claim_type ?? claims.get(claimKey)?.[0]?.claim_type;
361
+ if (error === null &&
362
+ (claimType === undefined || !validateClaimValue(claimType, source.value).valid)) {
363
+ error = 'invalid_record';
364
+ }
365
+ if (error !== null)
366
+ addError(accumulator, 'user_claim_values', error === 'cross_scope_reference'
367
+ ? {
368
+ organization_slug: source.organization_slug,
369
+ email: '[redacted]',
370
+ application_slug: source.application_slug,
371
+ claim_name: source.claim_name,
372
+ }
373
+ : naturalKey, error);
374
+ else {
375
+ const matches = claimValues.get(key(orgKey, normalizedEmail(source.email), appKey, source.claim_name));
376
+ if ((matches?.length ?? 0) > 1) {
377
+ addError(accumulator, 'user_claim_values', naturalKey, 'ambiguous_dependency');
378
+ continue;
379
+ }
380
+ const destination = matches?.[0];
381
+ addItem(accumulator, 'user_claim_values', recordAction(mode, destination !== undefined, destination !== undefined && sameValue(source.value, destination.value)), naturalKey);
382
+ }
383
+ }
384
+ for (const source of manifest.clients) {
385
+ const naturalKey = { client_id: source.client_id };
386
+ const orgKey = normalizedSlug(source.organization_slug);
387
+ const appKey = normalizedSlug(source.application_slug);
388
+ if (duplicateRecords.has(recordIdentity('clients', naturalKey)))
389
+ continue;
390
+ if (!applicationIsSelected(manifest, source.application_slug)) {
391
+ addError(accumulator, 'clients', naturalKey, 'cross_scope_reference');
392
+ continue;
393
+ }
394
+ if (selectedOrganization !== null && orgKey !== selectedOrganization) {
395
+ addError(accumulator, 'clients', naturalKey, 'cross_scope_reference');
396
+ continue;
397
+ }
398
+ if (orgKey === 'porta-admin' || appKey === 'porta-admin') {
399
+ addError(accumulator, 'clients', naturalKey, 'control_plane_record');
400
+ continue;
401
+ }
402
+ const matches = clients.get(source.client_id);
403
+ if ((matches?.length ?? 0) > 1) {
404
+ addError(accumulator, 'clients', naturalKey, 'ambiguous_dependency');
405
+ continue;
406
+ }
407
+ const destination = matches?.[0];
408
+ if (destination !== undefined &&
409
+ (normalizedSlug(destination.organization_slug) !== orgKey ||
410
+ normalizedSlug(destination.application_slug) !== appKey)) {
411
+ addError(accumulator, 'clients', naturalKey, 'client_id_collision');
412
+ continue;
413
+ }
414
+ if (destination === undefined) {
415
+ const orgDependency = parentError(manifestOrganizations.has(orgKey), organizations.get(orgKey));
416
+ const appDependency = parentError(manifestApplications.has(appKey), applications.get(appKey));
417
+ if (orgDependency !== null || appDependency !== null) {
418
+ addError(accumulator, 'clients', naturalKey, orgDependency ?? appDependency ?? 'missing_dependency');
419
+ continue;
420
+ }
421
+ }
422
+ if (destination !== undefined &&
423
+ (destination.client_type !== source.client_type ||
424
+ destination.application_type !== source.application_type)) {
425
+ addError(accumulator, 'clients', naturalKey, 'incompatible_record');
426
+ continue;
427
+ }
428
+ addItem(accumulator, 'clients', recordAction(mode, destination !== undefined, destination !== undefined && clientMutableValuesMatch(source, destination)), naturalKey, destination === undefined && source.client_type === 'confidential');
429
+ }
430
+ const result = portabilityResultSchema.parse({
431
+ mode,
432
+ summary: accumulator.summary,
433
+ items: accumulator.errors.length > 0 ? [] : accumulator.items.sort(compareOutcomes),
434
+ errors: accumulator.errors.sort(compareOutcomes),
435
+ });
436
+ return { manifest, snapshot, result };
437
+ }
438
+ /**
439
+ * Build a safe preview result without changing product, credential, or audit records.
440
+ *
441
+ * @param manifest - Complete manifest received from an import request
442
+ * @param mode - Import behavior represented by the plan
443
+ * @returns Ordered safe plan result
444
+ * @example
445
+ * const preview = await buildPortabilityPlan(manifest, 'dry-run');
446
+ */
447
+ export async function buildPortabilityPlan(manifest, mode) {
448
+ return runDatabaseTransaction(async () => (await buildResolvedPortabilityPlan(manifest, mode)).result);
449
+ }
450
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/portability/plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ /** Explicit PostgreSQL reads used by selective portability export. */
2
+ import type { PoolClient } from 'pg';
3
+ import type { PortabilityApplication, PortabilityApplicationModule, PortabilityApplicationSelection, PortabilityClaimDefinition, PortabilityOrganization, PortabilityPermission, PortabilityRole, PortabilityRolePermissionMapping, PortabilityScope, PortabilityUser, PortabilityUserClaimValue, PortabilityUserRoleAssignment, PortabilityClient } from './types.js';
4
+ /** Resolved organization scope with internal keys kept outside the manifest. */
5
+ export interface ResolvedOrganizationExportScope {
6
+ /** Internal identifiers used only to qualify dependent reads. */
7
+ readonly organizationIds: readonly string[];
8
+ /** Portable organization records. */
9
+ readonly organizations: readonly PortabilityOrganization[];
10
+ }
11
+ /** Resolved application selection with internal keys kept outside the manifest. */
12
+ export interface ResolvedApplicationExportSelection {
13
+ /** Internal identifiers used only to qualify dependent reads. */
14
+ readonly applicationIds: readonly string[];
15
+ /** Portable selected applications. */
16
+ readonly applications: readonly PortabilityApplication[];
17
+ }
18
+ /** Portable authorization collections owned by selected applications. */
19
+ export interface PortabilityAuthorizationGraph {
20
+ /** Selected application modules. */
21
+ readonly applicationModules: readonly PortabilityApplicationModule[];
22
+ /** Selected application roles. */
23
+ readonly roles: readonly PortabilityRole[];
24
+ /** Selected application permissions. */
25
+ readonly permissions: readonly PortabilityPermission[];
26
+ /** Selected application claim definitions. */
27
+ readonly claimDefinitions: readonly PortabilityClaimDefinition[];
28
+ /** Selected role-to-permission mappings. */
29
+ readonly rolePermissionMappings: readonly PortabilityRolePermissionMapping[];
30
+ }
31
+ /** Portable users and application-qualified relationship collections. */
32
+ export interface PortabilityUserGraph {
33
+ /** Every user in the selected organization scope. */
34
+ readonly users: readonly PortabilityUser[];
35
+ /** Role assignments retained by the application selection. */
36
+ readonly userRoleAssignments: readonly PortabilityUserRoleAssignment[];
37
+ /** Claim values retained by the application selection. */
38
+ readonly userClaimValues: readonly PortabilityUserClaimValue[];
39
+ }
40
+ /**
41
+ * Resolve an organization or environment export scope while excluding the control plane.
42
+ *
43
+ * @param client - Request-owned PostgreSQL client
44
+ * @param scope - Validated public export scope
45
+ * @param controlPlaneOrganizationId - Authenticated control-plane organization identifier
46
+ * @returns Portable organizations and private identifiers for dependent reads
47
+ * @throws PortabilityError when an organization scope is missing or protected
48
+ */
49
+ export declare function readOrganizationExportScope(client: PoolClient, scope: PortabilityScope, controlPlaneOrganizationId: string): Promise<ResolvedOrganizationExportScope>;
50
+ /**
51
+ * Resolve the explicit global application selection and exclude Porta's Admin application.
52
+ *
53
+ * @param client - Request-owned PostgreSQL client
54
+ * @param selection - Validated all-or-explicit application choice
55
+ * @returns Portable applications and private identifiers for dependent reads
56
+ * @throws PortabilityError when an explicit slug is missing or selects the Admin application
57
+ */
58
+ export declare function readApplicationExportSelection(client: PoolClient, selection: PortabilityApplicationSelection): Promise<ResolvedApplicationExportSelection>;
59
+ /**
60
+ * Read the complete portable authorization graph for selected applications.
61
+ *
62
+ * @param client - Request-owned PostgreSQL client
63
+ * @param applicationIds - Resolved internal application identifiers
64
+ * @returns All portable child collections for those applications
65
+ */
66
+ export declare function readAuthorizationExportGraph(client: PoolClient, applicationIds: readonly string[]): Promise<PortabilityAuthorizationGraph>;
67
+ /**
68
+ * Attach validated stored branding bytes to portable organization records.
69
+ *
70
+ * @param client - Request-owned PostgreSQL client
71
+ * @param organizations - Portable organizations in the selected scope
72
+ * @param organizationIds - Matching private organization identifiers
73
+ * @returns Organization records with validated logo and favicon content
74
+ * @throws Error when stored bytes no longer satisfy the branding validation boundary
75
+ */
76
+ export declare function attachOrganizationBrandingAssets(client: PoolClient, organizations: readonly PortabilityOrganization[], organizationIds: readonly string[]): Promise<readonly PortabilityOrganization[]>;
77
+ /**
78
+ * Read every scoped user and only relationships owned by selected applications.
79
+ *
80
+ * @param client - Request-owned PostgreSQL client
81
+ * @param organizationIds - Resolved organization scope identifiers
82
+ * @param applicationIds - Resolved application selection identifiers
83
+ * @returns Portable users, role assignments, and claim values
84
+ */
85
+ export declare function readUserExportGraph(client: PoolClient, organizationIds: readonly string[], applicationIds: readonly string[]): Promise<PortabilityUserGraph>;
86
+ /**
87
+ * Read OIDC clients owned by both the selected organization and application scopes.
88
+ *
89
+ * @param client - Request-owned PostgreSQL client
90
+ * @param organizationIds - Resolved organization scope identifiers
91
+ * @param applicationIds - Resolved application selection identifiers
92
+ * @returns Portable clients without credential material
93
+ */
94
+ export declare function readClientExportRecords(client: PoolClient, organizationIds: readonly string[], applicationIds: readonly string[]): Promise<readonly PortabilityClient[]>;
95
+ //# sourceMappingURL=repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/portability/repository.ts"],"names":[],"mappings":"AAAA,sEAAsE;AAEtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACrC,OAAO,KAAK,EACV,sBAAsB,EACtB,4BAA4B,EAC5B,+BAA+B,EAC/B,0BAA0B,EAC1B,uBAAuB,EACvB,qBAAqB,EACrB,eAAe,EACf,gCAAgC,EAChC,gBAAgB,EAChB,eAAe,EACf,yBAAyB,EACzB,6BAA6B,EAC7B,iBAAiB,EAElB,MAAM,YAAY,CAAC;AAyFpB,gFAAgF;AAChF,MAAM,WAAW,+BAA+B;IAC9C,iEAAiE;IACjE,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,qCAAqC;IACrC,QAAQ,CAAC,aAAa,EAAE,SAAS,uBAAuB,EAAE,CAAC;CAC5D;AAED,mFAAmF;AACnF,MAAM,WAAW,kCAAkC;IACjD,iEAAiE;IACjE,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,sCAAsC;IACtC,QAAQ,CAAC,YAAY,EAAE,SAAS,sBAAsB,EAAE,CAAC;CAC1D;AAED,yEAAyE;AACzE,MAAM,WAAW,6BAA6B;IAC5C,oCAAoC;IACpC,QAAQ,CAAC,kBAAkB,EAAE,SAAS,4BAA4B,EAAE,CAAC;IACrE,kCAAkC;IAClC,QAAQ,CAAC,KAAK,EAAE,SAAS,eAAe,EAAE,CAAC;IAC3C,wCAAwC;IACxC,QAAQ,CAAC,WAAW,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACvD,8CAA8C;IAC9C,QAAQ,CAAC,gBAAgB,EAAE,SAAS,0BAA0B,EAAE,CAAC;IACjE,4CAA4C;IAC5C,QAAQ,CAAC,sBAAsB,EAAE,SAAS,gCAAgC,EAAE,CAAC;CAC9E;AAED,yEAAyE;AACzE,MAAM,WAAW,oBAAoB;IACnC,qDAAqD;IACrD,QAAQ,CAAC,KAAK,EAAE,SAAS,eAAe,EAAE,CAAC;IAC3C,8DAA8D;IAC9D,QAAQ,CAAC,mBAAmB,EAAE,SAAS,6BAA6B,EAAE,CAAC;IACvE,0DAA0D;IAC1D,QAAQ,CAAC,eAAe,EAAE,SAAS,yBAAyB,EAAE,CAAC;CAChE;AAuED;;;;;;;;GAQG;AACH,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,gBAAgB,EACvB,0BAA0B,EAAE,MAAM,GACjC,OAAO,CAAC,+BAA+B,CAAC,CAyB1C;AAED;;;;;;;GAOG;AACH,wBAAsB,8BAA8B,CAClD,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,+BAA+B,GACzC,OAAO,CAAC,kCAAkC,CAAC,CAwB7C;AAED;;;;;;GAMG;AACH,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,UAAU,EAClB,cAAc,EAAE,SAAS,MAAM,EAAE,GAChC,OAAO,CAAC,6BAA6B,CAAC,CAoIxC;AAED;;;;;;;;GAQG;AACH,wBAAsB,gCAAgC,CACpD,MAAM,EAAE,UAAU,EAClB,aAAa,EAAE,SAAS,uBAAuB,EAAE,EACjD,eAAe,EAAE,SAAS,MAAM,EAAE,GACjC,OAAO,CAAC,SAAS,uBAAuB,EAAE,CAAC,CAuC7C;AAED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,UAAU,EAClB,eAAe,EAAE,SAAS,MAAM,EAAE,EAClC,cAAc,EAAE,SAAS,MAAM,EAAE,GAChC,OAAO,CAAC,oBAAoB,CAAC,CAwF/B;AAED;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,UAAU,EAClB,eAAe,EAAE,SAAS,MAAM,EAAE,EAClC,cAAc,EAAE,SAAS,MAAM,EAAE,GAChC,OAAO,CAAC,SAAS,iBAAiB,EAAE,CAAC,CAwDvC"}