@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,137 @@
1
+ /** Small deterministic helpers shared by portability planning steps. */
2
+ import type { ImportClientRow, ImportOrganizationRow, ImportUserRow } from './import-repository.js';
3
+ import type { PortabilityAction, PortabilityActionCounts, PortabilityEntityType, PortabilityImportMode, PortabilityManifest, PortabilityNaturalKey, PortabilityResultError, PortabilityResultErrorCode, PortabilityResultItem } from './types.js';
4
+ /** Entity groups in their required parent-before-child order. */
5
+ export declare const entityOrder: readonly PortabilityEntityType[];
6
+ /** Mutable accumulator used only while assembling a safe result. */
7
+ export interface PlanAccumulator {
8
+ readonly items: PortabilityResultItem[];
9
+ readonly errors: PortabilityResultError[];
10
+ readonly summary: Record<PortabilityEntityType, PortabilityActionCounts>;
11
+ }
12
+ /** @returns Zeroed action counts for every fixed entity group. */
13
+ export declare function emptySummary(): Record<PortabilityEntityType, PortabilityActionCounts>;
14
+ /**
15
+ * @param parts - Normalized natural-key components
16
+ * @returns Components joined with an unambiguous internal separator
17
+ */
18
+ export declare function key(...parts: readonly string[]): string;
19
+ /**
20
+ * @param value - Stored or validated slug
21
+ * @returns Lowercase trimmed slug used only for matching
22
+ */
23
+ export declare function normalizedSlug(value: string): string;
24
+ /**
25
+ * @param value - External RBAC claim value
26
+ * @returns Trimmed value with case and inner content preserved
27
+ */
28
+ export declare function normalizedRbac(value: string): string;
29
+ /**
30
+ * @param value - User email identity
31
+ * @returns Trimmed lowercase identity used for matching
32
+ */
33
+ export declare function normalizedEmail(value: string): string;
34
+ /**
35
+ * @param left - First normalized portable value
36
+ * @param right - Second normalized portable value
37
+ * @returns Whether both values serialize identically
38
+ */
39
+ export declare function sameValue(left: unknown, right: unknown): boolean;
40
+ /**
41
+ * @param rows - Destination or manifest records
42
+ * @param selectKey - Normalized key selector
43
+ * @returns Every row grouped without discarding ambiguous matches
44
+ */
45
+ export declare function groupByKey<Row>(rows: readonly Row[], selectKey: (row: Row) => string): Map<string, Row[]>;
46
+ /**
47
+ * @param matches - Destination rows sharing a normalized key
48
+ * @returns Fixed cardinality state used by dependency validation
49
+ */
50
+ export declare function dependencyState<Row>(matches: readonly Row[] | undefined): 'resolved' | 'missing' | 'ambiguous';
51
+ /**
52
+ * Add an action and increment its group count.
53
+ *
54
+ * @param accumulator - Result being assembled
55
+ * @param entityType - Manifest collection
56
+ * @param action - Planned action
57
+ * @param naturalKey - Safe public identity
58
+ * @param credentialWillBeGenerated - Whether a new confidential client needs one secret
59
+ */
60
+ export declare function addItem(accumulator: PlanAccumulator, entityType: PortabilityEntityType, action: PortabilityAction, naturalKey: PortabilityNaturalKey, credentialWillBeGenerated?: boolean): void;
61
+ /**
62
+ * Add one bounded public error while retaining the complete rejected count.
63
+ *
64
+ * @param accumulator - Result being assembled
65
+ * @param entityType - Rejected manifest collection
66
+ * @param naturalKey - Safe public identity
67
+ * @param code - Fixed non-reflective rejection code
68
+ * @param countRejected - Whether the error represents a manifest record in aggregate counts
69
+ */
70
+ export declare function addError(accumulator: PlanAccumulator, entityType: PortabilityEntityType, naturalKey: PortabilityNaturalKey, code: PortabilityResultErrorCode, countRejected?: boolean): void;
71
+ /**
72
+ * Check whether an application-qualified record belongs to the manifest selection.
73
+ *
74
+ * @param manifest - Strict normalized import manifest
75
+ * @param applicationSlug - Application owner named by one record
76
+ * @returns Whether the record is inside the declared application scope
77
+ */
78
+ export declare function applicationIsSelected(manifest: PortabilityManifest, applicationSlug: string): boolean;
79
+ /**
80
+ * Validate scope metadata that may have no corresponding manifest record.
81
+ *
82
+ * @param manifest - Strict normalized import manifest
83
+ * @param accumulator - Result being assembled
84
+ * @param organizations - Destination organizations grouped by normalized slug
85
+ * @param manifestOrganizations - Organization slugs created by this manifest
86
+ */
87
+ export declare function validateRootScope(manifest: PortabilityManifest, accumulator: PlanAccumulator, organizations: ReadonlyMap<string, readonly ImportOrganizationRow[]>, manifestOrganizations: ReadonlySet<string>): void;
88
+ /**
89
+ * @param mode - Preview or apply behavior
90
+ * @param exists - Whether one compatible destination record exists
91
+ * @param mutableValuesMatch - Whether all portable mutable values already match
92
+ * @returns Create, update, or skip action
93
+ */
94
+ export declare function recordAction(mode: PortabilityImportMode, exists: boolean, mutableValuesMatch: boolean): PortabilityAction;
95
+ /**
96
+ * @param left - First safe result outcome
97
+ * @param right - Second safe result outcome
98
+ * @returns Stable dependency-order comparison
99
+ */
100
+ export declare function compareOutcomes(left: Pick<PortabilityResultItem, 'entity_type' | 'natural_key'>, right: Pick<PortabilityResultItem, 'entity_type' | 'natural_key'>): number;
101
+ /**
102
+ * @param manifest - Strict normalized manifest
103
+ * @param accumulator - Result being assembled
104
+ * @returns Stable identities for every record rejected as a duplicate
105
+ */
106
+ export declare function rejectDuplicates(manifest: PortabilityManifest, accumulator: PlanAccumulator): ReadonlySet<string>;
107
+ /** Create the stable identity used to exclude a rejected duplicate from ordinary planning. */
108
+ export declare function recordIdentity(entityType: PortabilityEntityType, naturalKey: PortabilityNaturalKey): string;
109
+ /**
110
+ * @param source - Portable organization fields
111
+ * @param destination - Existing destination organization
112
+ * @param destinationAssets - Existing validated image bytes by branding slot
113
+ * @returns Whether every mutable organization field and asset matches
114
+ */
115
+ export declare function organizationMatches(source: PortabilityManifest['organizations'][number], destination: ImportOrganizationRow, destinationAssets: ReadonlyMap<'logo' | 'favicon', {
116
+ readonly content_type: string;
117
+ readonly data: Buffer;
118
+ }>): boolean;
119
+ /**
120
+ * @param source - Portable user profile
121
+ * @param destination - Existing destination user
122
+ * @returns Whether portable fields match while ignoring authentication and lock state
123
+ */
124
+ export declare function userMatches(source: PortabilityManifest['users'][number], destination: ImportUserRow): boolean;
125
+ /**
126
+ * @param source - Portable OIDC client
127
+ * @param destination - Existing destination client
128
+ * @returns Whether every mutable protocol and lifecycle field matches
129
+ */
130
+ export declare function clientMutableValuesMatch(source: PortabilityManifest['clients'][number], destination: ImportClientRow): boolean;
131
+ /**
132
+ * @param manifestHasParent - Whether the manifest creates or matches the parent itself
133
+ * @param matches - Destination rows sharing the normalized parent key
134
+ * @returns Fixed safe error, or null when the parent resolves
135
+ */
136
+ export declare function parentError<Row>(manifestHasParent: boolean, matches: readonly Row[] | undefined): PortabilityResultErrorCode | null;
137
+ //# sourceMappingURL=plan-support.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-support.d.ts","sourceRoot":"","sources":["../../src/portability/plan-support.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,336 @@
1
+ /** Small deterministic helpers shared by portability planning steps. */
2
+ /** Entity groups in their required parent-before-child order. */
3
+ export const entityOrder = [
4
+ 'organizations',
5
+ 'applications',
6
+ 'application_modules',
7
+ 'roles',
8
+ 'permissions',
9
+ 'claim_definitions',
10
+ 'role_permission_mappings',
11
+ 'users',
12
+ 'user_role_assignments',
13
+ 'user_claim_values',
14
+ 'clients',
15
+ ];
16
+ /** @returns Zeroed action counts for every fixed entity group. */
17
+ export function emptySummary() {
18
+ return Object.fromEntries(entityOrder.map((entityType) => [
19
+ entityType,
20
+ { created: 0, updated: 0, skipped: 0, rejected: 0 },
21
+ ]));
22
+ }
23
+ /**
24
+ * @param parts - Normalized natural-key components
25
+ * @returns Components joined with an unambiguous internal separator
26
+ */
27
+ export function key(...parts) {
28
+ return parts.join('\u001f');
29
+ }
30
+ /**
31
+ * @param value - Stored or validated slug
32
+ * @returns Lowercase trimmed slug used only for matching
33
+ */
34
+ export function normalizedSlug(value) {
35
+ return value.trim().toLowerCase();
36
+ }
37
+ /**
38
+ * @param value - External RBAC claim value
39
+ * @returns Trimmed value with case and inner content preserved
40
+ */
41
+ export function normalizedRbac(value) {
42
+ return value.trim();
43
+ }
44
+ /**
45
+ * @param value - User email identity
46
+ * @returns Trimmed lowercase identity used for matching
47
+ */
48
+ export function normalizedEmail(value) {
49
+ return value.trim().toLowerCase();
50
+ }
51
+ /**
52
+ * @param left - First normalized portable value
53
+ * @param right - Second normalized portable value
54
+ * @returns Whether both values serialize identically
55
+ */
56
+ export function sameValue(left, right) {
57
+ return JSON.stringify(left) === JSON.stringify(right);
58
+ }
59
+ /**
60
+ * @param rows - Destination or manifest records
61
+ * @param selectKey - Normalized key selector
62
+ * @returns Every row grouped without discarding ambiguous matches
63
+ */
64
+ export function groupByKey(rows, selectKey) {
65
+ const grouped = new Map();
66
+ for (const row of rows) {
67
+ const rowKey = selectKey(row);
68
+ grouped.set(rowKey, [...(grouped.get(rowKey) ?? []), row]);
69
+ }
70
+ return grouped;
71
+ }
72
+ /**
73
+ * @param matches - Destination rows sharing a normalized key
74
+ * @returns Fixed cardinality state used by dependency validation
75
+ */
76
+ export function dependencyState(matches) {
77
+ if (matches === undefined || matches.length === 0)
78
+ return 'missing';
79
+ return matches.length === 1 ? 'resolved' : 'ambiguous';
80
+ }
81
+ /**
82
+ * Add an action and increment its group count.
83
+ *
84
+ * @param accumulator - Result being assembled
85
+ * @param entityType - Manifest collection
86
+ * @param action - Planned action
87
+ * @param naturalKey - Safe public identity
88
+ * @param credentialWillBeGenerated - Whether a new confidential client needs one secret
89
+ */
90
+ export function addItem(accumulator, entityType, action, naturalKey, credentialWillBeGenerated = false) {
91
+ accumulator.summary[entityType] = {
92
+ ...accumulator.summary[entityType],
93
+ [action]: accumulator.summary[entityType][action] + 1,
94
+ };
95
+ accumulator.items.push({
96
+ entity_type: entityType,
97
+ action,
98
+ natural_key: naturalKey,
99
+ ...(credentialWillBeGenerated ? { credential_will_be_generated: true } : {}),
100
+ });
101
+ }
102
+ /**
103
+ * Add one bounded public error while retaining the complete rejected count.
104
+ *
105
+ * @param accumulator - Result being assembled
106
+ * @param entityType - Rejected manifest collection
107
+ * @param naturalKey - Safe public identity
108
+ * @param code - Fixed non-reflective rejection code
109
+ * @param countRejected - Whether the error represents a manifest record in aggregate counts
110
+ */
111
+ export function addError(accumulator, entityType, naturalKey, code, countRejected = true) {
112
+ if (countRejected)
113
+ accumulator.summary[entityType] = {
114
+ ...accumulator.summary[entityType],
115
+ rejected: accumulator.summary[entityType].rejected + 1,
116
+ };
117
+ if (accumulator.errors.length < 100)
118
+ accumulator.errors.push({ entity_type: entityType, natural_key: naturalKey, code });
119
+ }
120
+ /**
121
+ * Check whether an application-qualified record belongs to the manifest selection.
122
+ *
123
+ * @param manifest - Strict normalized import manifest
124
+ * @param applicationSlug - Application owner named by one record
125
+ * @returns Whether the record is inside the declared application scope
126
+ */
127
+ export function applicationIsSelected(manifest, applicationSlug) {
128
+ return (manifest.application_selection.all_applications ||
129
+ manifest.application_selection.application_slugs.some((selected) => normalizedSlug(selected) === normalizedSlug(applicationSlug)));
130
+ }
131
+ /**
132
+ * Validate scope metadata that may have no corresponding manifest record.
133
+ *
134
+ * @param manifest - Strict normalized import manifest
135
+ * @param accumulator - Result being assembled
136
+ * @param organizations - Destination organizations grouped by normalized slug
137
+ * @param manifestOrganizations - Organization slugs created by this manifest
138
+ */
139
+ export function validateRootScope(manifest, accumulator, organizations, manifestOrganizations) {
140
+ if (manifest.scope.kind === 'organization') {
141
+ const selected = normalizedSlug(manifest.scope.organization_slug);
142
+ const matches = organizations.get(selected);
143
+ const code = selected === 'porta-admin' || matches?.[0]?.is_super_admin
144
+ ? 'control_plane_record'
145
+ : (matches?.length ?? 0) > 1
146
+ ? 'ambiguous_dependency'
147
+ : matches?.[0] === undefined && !manifestOrganizations.has(selected)
148
+ ? 'missing_dependency'
149
+ : null;
150
+ if (code !== null)
151
+ addError(accumulator, 'organizations', { slug: selected }, code, false);
152
+ }
153
+ if (manifest.application_selection.application_slugs.some((slug) => normalizedSlug(slug) === 'porta-admin')) {
154
+ addError(accumulator, 'applications', { slug: 'porta-admin' }, 'control_plane_record', false);
155
+ }
156
+ }
157
+ /**
158
+ * @param mode - Preview or apply behavior
159
+ * @param exists - Whether one compatible destination record exists
160
+ * @param mutableValuesMatch - Whether all portable mutable values already match
161
+ * @returns Create, update, or skip action
162
+ */
163
+ export function recordAction(mode, exists, mutableValuesMatch) {
164
+ if (!exists)
165
+ return 'created';
166
+ if (mode === 'keep-existing' || mutableValuesMatch)
167
+ return 'skipped';
168
+ return 'updated';
169
+ }
170
+ /**
171
+ * @param left - First safe result outcome
172
+ * @param right - Second safe result outcome
173
+ * @returns Stable dependency-order comparison
174
+ */
175
+ export function compareOutcomes(left, right) {
176
+ const groupOrder = entityOrder.indexOf(left.entity_type) - entityOrder.indexOf(right.entity_type);
177
+ if (groupOrder !== 0)
178
+ return groupOrder;
179
+ const leftKey = Object.values(left.natural_key).join('\u001f');
180
+ const rightKey = Object.values(right.natural_key).join('\u001f');
181
+ return leftKey < rightKey ? -1 : leftKey > rightKey ? 1 : 0;
182
+ }
183
+ /** Return public natural keys for all manifest collections. */
184
+ function manifestNaturalKeys(manifest) {
185
+ return {
186
+ organizations: manifest.organizations.map(({ slug }) => ({ slug })),
187
+ applications: manifest.applications.map(({ slug }) => ({ slug })),
188
+ application_modules: manifest.application_modules.map(({ application_slug, slug }) => ({
189
+ application_slug,
190
+ slug,
191
+ })),
192
+ roles: manifest.roles.map(({ application_slug, slug }) => ({ application_slug, slug })),
193
+ permissions: manifest.permissions.map(({ application_slug, slug }) => ({
194
+ application_slug,
195
+ slug,
196
+ })),
197
+ claim_definitions: manifest.claim_definitions.map(({ application_slug, claim_name }) => ({
198
+ application_slug,
199
+ claim_name,
200
+ })),
201
+ role_permission_mappings: manifest.role_permission_mappings.map(({ application_slug, role_slug }) => ({ application_slug, role_slug })),
202
+ users: manifest.users.map(({ organization_slug, email }) => ({ organization_slug, email })),
203
+ user_role_assignments: manifest.user_role_assignments.map(({ organization_slug, email, application_slug, role_slug }) => ({
204
+ organization_slug,
205
+ email,
206
+ application_slug,
207
+ role_slug,
208
+ })),
209
+ user_claim_values: manifest.user_claim_values.map(({ organization_slug, email, application_slug, claim_name }) => ({
210
+ organization_slug,
211
+ email,
212
+ application_slug,
213
+ claim_name,
214
+ })),
215
+ clients: manifest.clients.map(({ client_id }) => ({ client_id })),
216
+ };
217
+ }
218
+ /**
219
+ * @param manifest - Strict normalized manifest
220
+ * @param accumulator - Result being assembled
221
+ * @returns Stable identities for every record rejected as a duplicate
222
+ */
223
+ export function rejectDuplicates(manifest, accumulator) {
224
+ const duplicateRecords = new Set();
225
+ const keysByType = manifestNaturalKeys(manifest);
226
+ for (const entityType of entityOrder) {
227
+ const grouped = groupByKey(keysByType[entityType], (naturalKey) => Object.values(naturalKey).join('\u001f'));
228
+ for (const matches of grouped.values()) {
229
+ if (matches.length < 2)
230
+ continue;
231
+ for (const naturalKey of matches) {
232
+ duplicateRecords.add(recordIdentity(entityType, naturalKey));
233
+ addError(accumulator, entityType, naturalKey, 'duplicate_natural_key');
234
+ }
235
+ }
236
+ }
237
+ return duplicateRecords;
238
+ }
239
+ /** Create the stable identity used to exclude a rejected duplicate from ordinary planning. */
240
+ export function recordIdentity(entityType, naturalKey) {
241
+ return `${entityType}\u001e${Object.values(naturalKey).join('\u001f')}`;
242
+ }
243
+ /**
244
+ * @param source - Portable organization fields
245
+ * @param destination - Existing destination organization
246
+ * @param destinationAssets - Existing validated image bytes by branding slot
247
+ * @returns Whether every mutable organization field and asset matches
248
+ */
249
+ export function organizationMatches(source, destination, destinationAssets) {
250
+ const logo = destinationAssets.get('logo');
251
+ const favicon = destinationAssets.get('favicon');
252
+ const logoMatches = source.branding.logo_asset === null
253
+ ? logo === undefined
254
+ : logo?.content_type === source.branding.logo_asset.media_type &&
255
+ logo.data.toString('base64') === source.branding.logo_asset.content_base64;
256
+ const faviconMatches = source.branding.favicon_asset === null
257
+ ? favicon === undefined
258
+ : favicon?.content_type === source.branding.favicon_asset.media_type &&
259
+ favicon.data.toString('base64') === source.branding.favicon_asset.content_base64;
260
+ return (source.name === destination.name &&
261
+ source.status === destination.status &&
262
+ source.default_locale === destination.default_locale &&
263
+ sameValue(source.default_login_methods, destination.default_login_methods) &&
264
+ source.two_factor_policy === destination.two_factor_policy &&
265
+ source.branding.logo_url === destination.branding_logo_url &&
266
+ source.branding.favicon_url === destination.branding_favicon_url &&
267
+ source.branding.primary_color === destination.branding_primary_color &&
268
+ source.branding.company_name === destination.branding_company_name &&
269
+ source.branding.custom_css === destination.branding_custom_css &&
270
+ logoMatches &&
271
+ faviconMatches);
272
+ }
273
+ /**
274
+ * @param source - Portable user profile
275
+ * @param destination - Existing destination user
276
+ * @returns Whether portable fields match while ignoring authentication and lock state
277
+ */
278
+ export function userMatches(source, destination) {
279
+ return sameValue(source, {
280
+ organization_slug: destination.organization_slug,
281
+ email: normalizedEmail(destination.email),
282
+ email_verified: destination.email_verified,
283
+ given_name: destination.given_name,
284
+ family_name: destination.family_name,
285
+ middle_name: destination.middle_name,
286
+ nickname: destination.nickname,
287
+ preferred_username: destination.preferred_username,
288
+ profile_url: destination.profile_url,
289
+ picture_url: destination.picture_url,
290
+ website_url: destination.website_url,
291
+ gender: destination.gender,
292
+ birthdate: destination.birthdate,
293
+ zoneinfo: destination.zoneinfo,
294
+ locale: destination.locale,
295
+ phone_number: destination.phone_number,
296
+ phone_number_verified: destination.phone_number_verified,
297
+ address_street: destination.address_street,
298
+ address_locality: destination.address_locality,
299
+ address_region: destination.address_region,
300
+ address_postal_code: destination.address_postal_code,
301
+ address_country: destination.address_country,
302
+ status: destination.status,
303
+ });
304
+ }
305
+ /**
306
+ * @param source - Portable OIDC client
307
+ * @param destination - Existing destination client
308
+ * @returns Whether every mutable protocol and lifecycle field matches
309
+ */
310
+ export function clientMutableValuesMatch(source, destination) {
311
+ return (source.name === destination.name &&
312
+ source.status === destination.status &&
313
+ sameValue(source.grant_types, destination.grant_types) &&
314
+ sameValue(source.response_types, destination.response_types) &&
315
+ source.scope === destination.scope &&
316
+ sameValue(source.login_methods, destination.login_methods) &&
317
+ source.token_endpoint_auth_method === destination.token_endpoint_auth_method &&
318
+ sameValue(source.redirect_uris, destination.redirect_uris) &&
319
+ sameValue(source.post_logout_redirect_uris, destination.post_logout_redirect_uris) &&
320
+ sameValue(source.allowed_origins, destination.allowed_origins) &&
321
+ source.require_pkce === destination.require_pkce);
322
+ }
323
+ /**
324
+ * @param manifestHasParent - Whether the manifest creates or matches the parent itself
325
+ * @param matches - Destination rows sharing the normalized parent key
326
+ * @returns Fixed safe error, or null when the parent resolves
327
+ */
328
+ export function parentError(manifestHasParent, matches) {
329
+ if (manifestHasParent)
330
+ return null;
331
+ const state = dependencyState(matches);
332
+ if (state === 'resolved')
333
+ return null;
334
+ return state === 'ambiguous' ? 'ambiguous_dependency' : 'missing_dependency';
335
+ }
336
+ //# sourceMappingURL=plan-support.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-support.js","sourceRoot":"","sources":["../../src/portability/plan-support.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /** Mutation-free normalization, dependency resolution, and import action planning. */
2
+ import { type PortabilityImportSnapshot } from './import-repository.js';
3
+ import type { PortabilityImportMode, PortabilityManifest, PortabilityResult } from './types.js';
4
+ /** Internal resolved plan retained for the later atomic writer. */
5
+ export interface ResolvedPortabilityPlan {
6
+ /** Strict normalized manifest used to build every action. */
7
+ readonly manifest: PortabilityManifest;
8
+ /** Destination snapshot containing private relationship identifiers. */
9
+ readonly snapshot: PortabilityImportSnapshot;
10
+ /** Safe public result from the same snapshot. */
11
+ readonly result: PortabilityResult;
12
+ }
13
+ /**
14
+ * Build the resolved plan using the current request-owned transaction.
15
+ *
16
+ * Apply uses this boundary so preview and mutation share the same normalization,
17
+ * compatibility, and dependency checks.
18
+ *
19
+ * @param input - Manifest received by the service
20
+ * @param mode - Requested preview or apply behavior
21
+ * @returns Normalized manifest, private snapshot, and safe public result
22
+ */
23
+ export declare function buildResolvedPortabilityPlan(input: PortabilityManifest, mode: PortabilityImportMode): Promise<ResolvedPortabilityPlan>;
24
+ /**
25
+ * Build a safe preview result without changing product, credential, or audit records.
26
+ *
27
+ * @param manifest - Complete manifest received from an import request
28
+ * @param mode - Import behavior represented by the plan
29
+ * @returns Ordered safe plan result
30
+ * @example
31
+ * const preview = await buildPortabilityPlan(manifest, 'dry-run');
32
+ */
33
+ export declare function buildPortabilityPlan(manifest: PortabilityManifest, mode: PortabilityImportMode): Promise<PortabilityResult>;
34
+ //# sourceMappingURL=plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/portability/plan.ts"],"names":[],"mappings":"AAAA,sFAAsF;AAItF,OAAO,EAEL,KAAK,yBAAyB,EAC/B,MAAM,wBAAwB,CAAC;AAyBhC,OAAO,KAAK,EAEV,qBAAqB,EACrB,mBAAmB,EACnB,iBAAiB,EAElB,MAAM,YAAY,CAAC;AAEpB,mEAAmE;AACnE,MAAM,WAAW,uBAAuB;IACtC,6DAA6D;IAC7D,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,EAAE,yBAAyB,CAAC;IAC7C,iDAAiD;IACjD,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;CACpC;AAED;;;;;;;;;GASG;AACH,wBAAsB,4BAA4B,CAChD,KAAK,EAAE,mBAAmB,EAC1B,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC,uBAAuB,CAAC,CAumBlC;AAED;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,mBAAmB,EAC7B,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CAI5B"}