@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,347 @@
1
+ /** Explicit PostgreSQL reads used to plan selective portability imports. */
2
+ import { randomUUID } from 'node:crypto';
3
+ import { getPool } from '../lib/database.js';
4
+ /**
5
+ * Restrict organization-owned reads to the requested portability scope.
6
+ *
7
+ * @param column - Qualified organization slug column
8
+ * @param manifest - Normalized import manifest
9
+ * @returns Parameterized organization predicate
10
+ */
11
+ function organizationFilter(column, manifest) {
12
+ if (manifest.scope.kind === 'organization') {
13
+ return {
14
+ sql: `WHERE LOWER(BTRIM(${column})) = $1`,
15
+ values: [manifest.scope.organization_slug.trim().toLowerCase()],
16
+ };
17
+ }
18
+ return { sql: 'WHERE NOT o.is_super_admin', values: [] };
19
+ }
20
+ /**
21
+ * Restrict application-owned reads to the declared application selection.
22
+ *
23
+ * @param column - Qualified application slug column
24
+ * @param manifest - Normalized import manifest
25
+ * @param parameterIndex - First PostgreSQL placeholder available to this predicate
26
+ * @returns Parameterized application predicate
27
+ */
28
+ function applicationFilter(column, manifest, parameterIndex = 1) {
29
+ if (manifest.application_selection.all_applications) {
30
+ return { sql: `WHERE LOWER(BTRIM(${column})) <> 'porta-admin'`, values: [] };
31
+ }
32
+ return {
33
+ sql: `WHERE LOWER(BTRIM(${column})) = ANY($${parameterIndex}::text[])`,
34
+ values: [
35
+ manifest.application_selection.application_slugs.map((slug) => slug.trim().toLowerCase()),
36
+ ],
37
+ };
38
+ }
39
+ /**
40
+ * Read the small destination catalog used to plan an import.
41
+ *
42
+ * The product is configured by an administrator and does not need large-data streaming here.
43
+ * Explicit columns keep credentials, lock state, audit data, and other non-portable fields out of
44
+ * planner memory. The surrounding request transaction provides the consistent snapshot.
45
+ *
46
+ * @param manifest - Normalized scope, category, application selection, and imported client IDs
47
+ * @returns Destination records with internal identifiers retained only for relationship matching
48
+ */
49
+ export async function readPortabilityImportSnapshot(manifest) {
50
+ const pool = getPool();
51
+ const organizationScope = organizationFilter(manifest.scope.kind === 'organization' ? 'slug' : 'o.slug', manifest);
52
+ const ownedOrganizationScope = organizationFilter('o.slug', manifest);
53
+ const selectedApplications = applicationFilter('a.slug', manifest);
54
+ const applicationTableSelection = applicationFilter('slug', manifest);
55
+ const selectedApplicationsAfterOrganization = applicationFilter('a.slug', manifest, ownedOrganizationScope.values.length + 1);
56
+ const includesOrganizations = manifest.categories.includes('organizations');
57
+ const includesAuthorization = manifest.categories.includes('applications_authorization');
58
+ const includesUsers = manifest.categories.includes('users_assignments');
59
+ const includesClients = manifest.categories.includes('oidc_clients');
60
+ const includesApplicationData = includesAuthorization || includesUsers || includesClients;
61
+ const organizations = await pool.query(`SELECT o.id, o.slug, o.name, o.status, o.is_super_admin, o.default_locale,
62
+ o.default_login_methods,
63
+ two_factor_policy, branding_logo_url, branding_favicon_url,
64
+ branding_primary_color, branding_company_name, branding_custom_css
65
+ FROM organizations o
66
+ ${organizationScope.sql}`, [...organizationScope.values]);
67
+ const applications = includesApplicationData
68
+ ? await pool.query(`SELECT id, slug, name, description, status
69
+ FROM applications
70
+ ${applicationTableSelection.sql}`, [...applicationTableSelection.values])
71
+ : { rows: [] };
72
+ const brandingAssets = includesOrganizations
73
+ ? await pool.query(`SELECT o.slug AS organization_slug, b.asset_type, b.content_type, b.data
74
+ FROM branding_assets b
75
+ JOIN organizations o ON o.id = b.organization_id
76
+ ${ownedOrganizationScope.sql}`, [...ownedOrganizationScope.values])
77
+ : { rows: [] };
78
+ const modules = includesAuthorization
79
+ ? await pool.query(`SELECT m.id, m.application_id, a.slug AS application_slug, m.slug, m.name,
80
+ m.description, m.status
81
+ FROM application_modules m
82
+ JOIN applications a ON a.id = m.application_id
83
+ ${selectedApplications.sql}`, [...selectedApplications.values])
84
+ : { rows: [] };
85
+ const roles = includesAuthorization || includesUsers
86
+ ? await pool.query(`SELECT r.id, r.application_id, a.slug AS application_slug, r.slug, r.name, r.description
87
+ FROM roles r
88
+ JOIN applications a ON a.id = r.application_id
89
+ ${selectedApplications.sql}`, [...selectedApplications.values])
90
+ : { rows: [] };
91
+ const permissions = includesAuthorization
92
+ ? await pool.query(`SELECT p.id, p.application_id, p.module_id, a.slug AS application_slug, p.slug,
93
+ m.slug AS module_slug, p.name, p.description
94
+ FROM permissions p
95
+ JOIN applications a ON a.id = p.application_id
96
+ LEFT JOIN application_modules m ON m.id = p.module_id
97
+ ${selectedApplications.sql}`, [...selectedApplications.values])
98
+ : { rows: [] };
99
+ const includeClaimDefinitions = includesAuthorization || manifest.user_claim_values.length > 0;
100
+ const claims = includeClaimDefinitions
101
+ ? await pool.query(`SELECT c.id, c.application_id, a.slug AS application_slug, c.claim_name, c.claim_type,
102
+ c.description, c.include_in_id_token, c.include_in_access_token,
103
+ c.include_in_userinfo
104
+ FROM custom_claim_definitions c
105
+ JOIN applications a ON a.id = c.application_id
106
+ ${selectedApplications.sql}`, [...selectedApplications.values])
107
+ : { rows: [] };
108
+ const rolePermissions = includesAuthorization
109
+ ? await pool.query(`SELECT a.slug AS application_slug, r.slug AS role_slug,
110
+ ARRAY_AGG(p.slug ORDER BY BTRIM(p.slug) COLLATE "C") AS permission_slugs
111
+ FROM role_permissions rp
112
+ JOIN roles r ON r.id = rp.role_id
113
+ JOIN permissions p ON p.id = rp.permission_id
114
+ JOIN applications a ON a.id = r.application_id
115
+ ${selectedApplications.sql} AND p.application_id = r.application_id
116
+ GROUP BY a.slug, r.slug`, [...selectedApplications.values])
117
+ : { rows: [] };
118
+ const users = includesUsers
119
+ ? await pool.query(`SELECT u.id, u.organization_id, o.slug AS organization_slug, u.email::text AS email,
120
+ u.email_verified, u.given_name, u.family_name, u.middle_name, u.nickname,
121
+ u.preferred_username, u.profile_url, u.picture_url, u.website_url, u.gender,
122
+ u.birthdate::text AS birthdate, u.zoneinfo, u.locale, u.phone_number,
123
+ u.phone_number_verified, u.address_street, u.address_locality, u.address_region,
124
+ u.address_postal_code, u.address_country,
125
+ CASE WHEN u.status = 'inactive' THEN 'inactive' ELSE 'active' END AS status
126
+ FROM users u
127
+ JOIN organizations o ON o.id = u.organization_id
128
+ ${ownedOrganizationScope.sql}`, [...ownedOrganizationScope.values])
129
+ : { rows: [] };
130
+ const userRoles = includesUsers
131
+ ? await pool.query(`SELECT o.slug AS organization_slug, u.email::text AS email, a.slug AS application_slug,
132
+ r.slug AS role_slug
133
+ FROM user_roles ur
134
+ JOIN users u ON u.id = ur.user_id
135
+ JOIN organizations o ON o.id = u.organization_id
136
+ JOIN roles r ON r.id = ur.role_id
137
+ JOIN applications a ON a.id = r.application_id
138
+ ${ownedOrganizationScope.sql} AND ${selectedApplicationsAfterOrganization.sql.slice('WHERE '.length)}`, [...ownedOrganizationScope.values, ...selectedApplicationsAfterOrganization.values])
139
+ : { rows: [] };
140
+ const userClaimValues = includesUsers
141
+ ? await pool.query(`SELECT o.slug AS organization_slug, u.email::text AS email, a.slug AS application_slug,
142
+ c.claim_name, v.value
143
+ FROM custom_claim_values v
144
+ JOIN users u ON u.id = v.user_id
145
+ JOIN organizations o ON o.id = u.organization_id
146
+ JOIN custom_claim_definitions c ON c.id = v.claim_id
147
+ JOIN applications a ON a.id = c.application_id
148
+ ${ownedOrganizationScope.sql} AND ${selectedApplicationsAfterOrganization.sql.slice('WHERE '.length)}`, [...ownedOrganizationScope.values, ...selectedApplicationsAfterOrganization.values])
149
+ : { rows: [] };
150
+ const clients = includesClients
151
+ ? await pool.query(`SELECT c.id, c.organization_id, c.application_id, c.client_id,
152
+ o.slug AS organization_slug, a.slug AS application_slug,
153
+ c.client_name AS name, c.client_type, c.application_type, c.status,
154
+ c.grant_types, c.response_types, c.scope, c.login_methods,
155
+ c.token_endpoint_auth_method, c.redirect_uris,
156
+ COALESCE(c.post_logout_redirect_uris, '{}') AS post_logout_redirect_uris,
157
+ COALESCE(c.allowed_origins, '{}') AS allowed_origins, c.require_pkce
158
+ FROM clients c
159
+ JOIN organizations o ON o.id = c.organization_id
160
+ JOIN applications a ON a.id = c.application_id
161
+ WHERE c.client_id = ANY($1::text[])`, [manifest.clients.map((client) => client.client_id)])
162
+ : { rows: [] };
163
+ return {
164
+ organizations: organizations.rows,
165
+ brandingAssets: brandingAssets.rows,
166
+ applications: applications.rows,
167
+ applicationModules: modules.rows,
168
+ roles: roles.rows,
169
+ permissions: permissions.rows,
170
+ claimDefinitions: claims.rows,
171
+ rolePermissions: rolePermissions.rows,
172
+ users: users.rows.map((row) => ({
173
+ ...row,
174
+ status: row.status === 'inactive' ? 'inactive' : 'active',
175
+ })),
176
+ userRoles: userRoles.rows,
177
+ userClaimValues: userClaimValues.rows,
178
+ clients: clients.rows,
179
+ };
180
+ }
181
+ /**
182
+ * Insert or update one organization and its optional branding assets.
183
+ *
184
+ * @param record - Strict portable organization fields
185
+ * @param destinationId - Existing identifier for update, or null for create
186
+ * @param destinationAssetTypes - Branding slots which currently contain stored bytes
187
+ * @returns Authoritative destination identifier
188
+ */
189
+ export async function writePortabilityOrganization(record, destinationId, destinationAssetTypes) {
190
+ const pool = getPool();
191
+ const authoritativeId = destinationId ?? randomUUID();
192
+ const values = [
193
+ record.name,
194
+ record.status,
195
+ record.default_locale,
196
+ record.default_login_methods,
197
+ record.two_factor_policy,
198
+ record.branding.logo_url,
199
+ record.branding.favicon_url,
200
+ record.branding.primary_color,
201
+ record.branding.company_name,
202
+ record.branding.custom_css,
203
+ ];
204
+ const result = destinationId === null
205
+ ? await pool.query(`INSERT INTO organizations
206
+ (id, name, status, default_locale, default_login_methods, two_factor_policy,
207
+ branding_logo_url, branding_favicon_url, branding_primary_color,
208
+ branding_company_name, branding_custom_css, slug)
209
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12) RETURNING id`, [authoritativeId, ...values, record.slug])
210
+ : await pool.query(`UPDATE organizations SET name = $1, status = $2, default_locale = $3,
211
+ default_login_methods = $4, two_factor_policy = $5, branding_logo_url = $6,
212
+ branding_favicon_url = $7, branding_primary_color = $8,
213
+ branding_company_name = $9, branding_custom_css = $10, updated_at = NOW()
214
+ WHERE id = $11 RETURNING id`, [...values, destinationId]);
215
+ const organizationId = result.rows[0]?.id ?? authoritativeId;
216
+ for (const assetType of ['logo', 'favicon']) {
217
+ const asset = assetType === 'logo' ? record.branding.logo_asset : record.branding.favicon_asset;
218
+ if (asset === null) {
219
+ if (!destinationAssetTypes.has(assetType))
220
+ continue;
221
+ await pool.query('DELETE FROM branding_assets WHERE organization_id = $1 AND asset_type = $2', [organizationId, assetType]);
222
+ }
223
+ else {
224
+ const data = Buffer.from(asset.content_base64, 'base64');
225
+ await pool.query(`INSERT INTO branding_assets
226
+ (organization_id, asset_type, file_name, content_type, file_size, data)
227
+ VALUES ($1, $2, $3, $4, $5, $6)
228
+ ON CONFLICT (organization_id, asset_type) DO UPDATE
229
+ SET file_name = EXCLUDED.file_name, content_type = EXCLUDED.content_type,
230
+ file_size = EXCLUDED.file_size, data = EXCLUDED.data, updated_at = NOW()`, [organizationId, assetType, `imported-${assetType}`, asset.media_type, data.length, data]);
231
+ }
232
+ }
233
+ return organizationId;
234
+ }
235
+ /**
236
+ * @param record - Strict portable application fields
237
+ * @param destinationId - Existing identifier for update, or null for create
238
+ * @returns Authoritative destination identifier
239
+ */
240
+ export async function writePortabilityApplication(record, destinationId) {
241
+ const authoritativeId = destinationId ?? randomUUID();
242
+ const result = destinationId === null
243
+ ? await getPool().query(`INSERT INTO applications (id, slug, name, description, status)
244
+ VALUES ($1, $2, $3, $4, $5) RETURNING id`, [authoritativeId, record.slug, record.name, record.description, record.status])
245
+ : await getPool().query(`UPDATE applications SET name = $1, description = $2, status = $3, updated_at = NOW()
246
+ WHERE id = $4 RETURNING id`, [record.name, record.description, record.status, destinationId]);
247
+ return result.rows[0]?.id ?? authoritativeId;
248
+ }
249
+ /**
250
+ * @param record - Strict portable module fields
251
+ * @param applicationId - Resolved parent application identifier
252
+ * @param destinationId - Existing identifier for update, or null for create
253
+ * @returns Authoritative destination identifier
254
+ */
255
+ export async function writePortabilityModule(record, applicationId, destinationId) {
256
+ const authoritativeId = destinationId ?? randomUUID();
257
+ const result = destinationId === null
258
+ ? await getPool().query(`INSERT INTO application_modules (id, application_id, slug, name, description, status)
259
+ VALUES ($1, $2, $3, $4, $5, $6) RETURNING id`, [
260
+ authoritativeId,
261
+ applicationId,
262
+ record.slug,
263
+ record.name,
264
+ record.description,
265
+ record.status,
266
+ ])
267
+ : await getPool().query(`UPDATE application_modules SET name = $1, description = $2, status = $3,
268
+ updated_at = NOW() WHERE id = $4 RETURNING id`, [record.name, record.description, record.status, destinationId]);
269
+ return result.rows[0]?.id ?? authoritativeId;
270
+ }
271
+ /**
272
+ * @param record - Strict portable role fields
273
+ * @param applicationId - Resolved parent application identifier
274
+ * @param destinationId - Existing identifier for update, or null for create
275
+ * @returns Authoritative destination identifier
276
+ */
277
+ export async function writePortabilityRole(record, applicationId, destinationId) {
278
+ const authoritativeId = destinationId ?? randomUUID();
279
+ const result = destinationId === null
280
+ ? await getPool().query(`INSERT INTO roles (id, application_id, slug, name, description)
281
+ VALUES ($1, $2, $3, $4, $5) RETURNING id`, [authoritativeId, applicationId, record.slug, record.name, record.description])
282
+ : await getPool().query(`UPDATE roles SET name = $1, description = $2, updated_at = NOW()
283
+ WHERE id = $3 RETURNING id`, [record.name, record.description, destinationId]);
284
+ return result.rows[0]?.id ?? authoritativeId;
285
+ }
286
+ /**
287
+ * @param record - Strict portable permission fields
288
+ * @param applicationId - Resolved parent application identifier
289
+ * @param moduleId - Resolved optional module identifier
290
+ * @param destinationId - Existing identifier for update, or null for create
291
+ * @returns Authoritative destination identifier
292
+ */
293
+ export async function writePortabilityPermission(record, applicationId, moduleId, destinationId) {
294
+ const authoritativeId = destinationId ?? randomUUID();
295
+ const result = destinationId === null
296
+ ? await getPool().query(`INSERT INTO permissions (id, application_id, module_id, slug, name, description)
297
+ VALUES ($1, $2, $3, $4, $5, $6) RETURNING id`, [authoritativeId, applicationId, moduleId, record.slug, record.name, record.description])
298
+ : await getPool().query(`UPDATE permissions SET name = $1, description = $2
299
+ WHERE id = $3 RETURNING id`, [record.name, record.description, destinationId]);
300
+ return result.rows[0]?.id ?? authoritativeId;
301
+ }
302
+ /**
303
+ * @param record - Strict portable claim-definition fields
304
+ * @param applicationId - Resolved parent application identifier
305
+ * @param destinationId - Existing identifier for update, or null for create
306
+ * @returns Authoritative destination identifier
307
+ */
308
+ export async function writePortabilityClaimDefinition(record, applicationId, destinationId) {
309
+ const authoritativeId = destinationId ?? randomUUID();
310
+ const result = destinationId === null
311
+ ? await getPool().query(`INSERT INTO custom_claim_definitions
312
+ (id, application_id, claim_name, claim_type, description, include_in_id_token,
313
+ include_in_access_token, include_in_userinfo)
314
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING id`, [
315
+ authoritativeId,
316
+ applicationId,
317
+ record.claim_name,
318
+ record.claim_type,
319
+ record.description,
320
+ record.include_in_id_token,
321
+ record.include_in_access_token,
322
+ record.include_in_userinfo,
323
+ ])
324
+ : await getPool().query(`UPDATE custom_claim_definitions SET description = $1, include_in_id_token = $2,
325
+ include_in_access_token = $3, include_in_userinfo = $4, updated_at = NOW()
326
+ WHERE id = $5 RETURNING id`, [
327
+ record.description,
328
+ record.include_in_id_token,
329
+ record.include_in_access_token,
330
+ record.include_in_userinfo,
331
+ destinationId,
332
+ ]);
333
+ return result.rows[0]?.id ?? authoritativeId;
334
+ }
335
+ /**
336
+ * Add listed role-permission edges without removing destination-only edges.
337
+ *
338
+ * @param roleId - Resolved role identifier
339
+ * @param permissionIds - Resolved permission identifiers listed by the manifest
340
+ */
341
+ export async function writePortabilityRolePermissions(roleId, permissionIds) {
342
+ for (const permissionId of permissionIds) {
343
+ await getPool().query(`INSERT INTO role_permissions (role_id, permission_id)
344
+ VALUES ($1, $2) ON CONFLICT (role_id, permission_id) DO NOTHING`, [roleId, permissionId]);
345
+ }
346
+ }
347
+ //# sourceMappingURL=import-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-repository.js","sourceRoot":"","sources":["../../src/portability/import-repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /** Transaction-bound user, relationship, client, and credential import writes. */
2
+ import type { PortabilityClient, PortabilityCredential, PortabilityJsonValue, PortabilityUser } from './types.js';
3
+ /**
4
+ * Insert or update one portable user without touching credentials or automatic lock fields.
5
+ *
6
+ * @param record - Strict portable user fields
7
+ * @param organizationId - Resolved parent organization identifier
8
+ * @param destinationId - Existing identifier for update, or null for create
9
+ * @returns Authoritative destination user identifier
10
+ */
11
+ export declare function writePortabilityUser(record: PortabilityUser, organizationId: string, destinationId: string | null): Promise<string>;
12
+ /**
13
+ * Add one listed user-role assignment without changing destination-only assignments.
14
+ *
15
+ * @param userId - Resolved destination user identifier
16
+ * @param roleId - Resolved destination role identifier
17
+ */
18
+ export declare function writePortabilityUserRole(userId: string, roleId: string): Promise<void>;
19
+ /**
20
+ * Insert or update one listed custom-claim value.
21
+ *
22
+ * @param userId - Resolved destination user identifier
23
+ * @param claimId - Resolved destination claim-definition identifier
24
+ * @param value - Portable JSON claim value
25
+ */
26
+ export declare function writePortabilityUserClaimValue(userId: string, claimId: string, value: PortabilityJsonValue): Promise<void>;
27
+ /**
28
+ * Insert or update one OIDC client and create one credential only for a new confidential client.
29
+ *
30
+ * @param record - Strict portable client fields
31
+ * @param organizationId - Resolved owner organization identifier
32
+ * @param applicationId - Resolved owner application identifier
33
+ * @param destinationId - Existing identifier for update, or null for create
34
+ * @returns Destination identifier and optional one-time credential
35
+ */
36
+ export declare function writePortabilityClient(record: PortabilityClient, organizationId: string, applicationId: string, destinationId: string | null): Promise<{
37
+ readonly id: string;
38
+ readonly credential?: PortabilityCredential;
39
+ }>;
40
+ //# sourceMappingURL=import-user-client-writers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-user-client-writers.d.ts","sourceRoot":"","sources":["../../src/portability/import-user-client-writers.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAKlF,OAAO,KAAK,EACV,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EAChB,MAAM,YAAY,CAAC;AA0BpB;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,eAAe,EACvB,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,MAAM,GAAG,IAAI,GAC3B,OAAO,CAAC,MAAM,CAAC,CAiDjB;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM5F;AAED;;;;;;GAMG;AACH,wBAAsB,8BAA8B,CAClD,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;;;;;;;GAQG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,iBAAiB,EACzB,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,GAAG,IAAI,GAC3B,OAAO,CAAC;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,qBAAqB,CAAA;CAAE,CAAC,CA4E/E"}
@@ -0,0 +1,168 @@
1
+ /** Transaction-bound user, relationship, client, and credential import writes. */
2
+ import { createHash, randomUUID } from 'node:crypto';
3
+ import { generateSecret, hashSecret } from '../clients/crypto.js';
4
+ import { getPool } from '../lib/database.js';
5
+ /**
6
+ * Add six UTC calendar months while clamping month-end to the target month's last day.
7
+ *
8
+ * @param now - Credential creation time
9
+ * @returns Exact UTC credential expiry time
10
+ */
11
+ function importedSecretExpiry(now) {
12
+ const targetMonth = now.getUTCMonth() + 6;
13
+ const targetYear = now.getUTCFullYear() + Math.floor(targetMonth / 12);
14
+ const normalizedMonth = targetMonth % 12;
15
+ const lastDay = new Date(Date.UTC(targetYear, normalizedMonth + 1, 0)).getUTCDate();
16
+ return new Date(Date.UTC(targetYear, normalizedMonth, Math.min(now.getUTCDate(), lastDay), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds()));
17
+ }
18
+ /**
19
+ * Insert or update one portable user without touching credentials or automatic lock fields.
20
+ *
21
+ * @param record - Strict portable user fields
22
+ * @param organizationId - Resolved parent organization identifier
23
+ * @param destinationId - Existing identifier for update, or null for create
24
+ * @returns Authoritative destination user identifier
25
+ */
26
+ export async function writePortabilityUser(record, organizationId, destinationId) {
27
+ const authoritativeId = destinationId ?? randomUUID();
28
+ const profileValues = [
29
+ record.email_verified,
30
+ record.given_name,
31
+ record.family_name,
32
+ record.middle_name,
33
+ record.nickname,
34
+ record.preferred_username,
35
+ record.profile_url,
36
+ record.picture_url,
37
+ record.website_url,
38
+ record.gender,
39
+ record.birthdate,
40
+ record.zoneinfo,
41
+ record.locale,
42
+ record.phone_number,
43
+ record.phone_number_verified,
44
+ record.address_street,
45
+ record.address_locality,
46
+ record.address_region,
47
+ record.address_postal_code,
48
+ record.address_country,
49
+ record.status,
50
+ ];
51
+ const result = destinationId === null
52
+ ? await getPool().query(`INSERT INTO users
53
+ (id, organization_id, email, email_verified, given_name, family_name, middle_name,
54
+ nickname, preferred_username, profile_url, picture_url, website_url, gender,
55
+ birthdate, zoneinfo, locale, phone_number, phone_number_verified, address_street,
56
+ address_locality, address_region, address_postal_code, address_country, status)
57
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14,
58
+ $15, $16, $17, $18, $19, $20, $21, $22, $23, $24) RETURNING id`, [authoritativeId, organizationId, record.email, ...profileValues])
59
+ : await getPool().query(`UPDATE users SET email_verified = $1, given_name = $2, family_name = $3,
60
+ middle_name = $4, nickname = $5, preferred_username = $6, profile_url = $7,
61
+ picture_url = $8, website_url = $9, gender = $10, birthdate = $11,
62
+ zoneinfo = $12, locale = $13, phone_number = $14,
63
+ phone_number_verified = $15, address_street = $16, address_locality = $17,
64
+ address_region = $18, address_postal_code = $19, address_country = $20,
65
+ status = CASE WHEN status = 'locked' AND $21 = 'active' THEN status ELSE $21 END,
66
+ updated_at = NOW() WHERE id = $22 RETURNING id`, [...profileValues, destinationId]);
67
+ return result.rows[0]?.id ?? authoritativeId;
68
+ }
69
+ /**
70
+ * Add one listed user-role assignment without changing destination-only assignments.
71
+ *
72
+ * @param userId - Resolved destination user identifier
73
+ * @param roleId - Resolved destination role identifier
74
+ */
75
+ export async function writePortabilityUserRole(userId, roleId) {
76
+ await getPool().query(`INSERT INTO user_roles (user_id, role_id, assigned_by)
77
+ VALUES ($1, $2, NULL) ON CONFLICT (user_id, role_id) DO NOTHING`, [userId, roleId]);
78
+ }
79
+ /**
80
+ * Insert or update one listed custom-claim value.
81
+ *
82
+ * @param userId - Resolved destination user identifier
83
+ * @param claimId - Resolved destination claim-definition identifier
84
+ * @param value - Portable JSON claim value
85
+ */
86
+ export async function writePortabilityUserClaimValue(userId, claimId, value) {
87
+ await getPool().query(`INSERT INTO custom_claim_values (user_id, claim_id, value)
88
+ VALUES ($1, $2, $3::jsonb)
89
+ ON CONFLICT (user_id, claim_id) DO UPDATE SET value = EXCLUDED.value, updated_at = NOW()`, [userId, claimId, JSON.stringify(value)]);
90
+ }
91
+ /**
92
+ * Insert or update one OIDC client and create one credential only for a new confidential client.
93
+ *
94
+ * @param record - Strict portable client fields
95
+ * @param organizationId - Resolved owner organization identifier
96
+ * @param applicationId - Resolved owner application identifier
97
+ * @param destinationId - Existing identifier for update, or null for create
98
+ * @returns Destination identifier and optional one-time credential
99
+ */
100
+ export async function writePortabilityClient(record, organizationId, applicationId, destinationId) {
101
+ const authoritativeId = destinationId ?? randomUUID();
102
+ const mutableValues = [
103
+ record.name,
104
+ record.status,
105
+ record.grant_types,
106
+ record.response_types,
107
+ record.scope,
108
+ record.login_methods,
109
+ record.token_endpoint_auth_method,
110
+ record.redirect_uris,
111
+ record.post_logout_redirect_uris,
112
+ record.allowed_origins,
113
+ record.require_pkce,
114
+ ];
115
+ if (destinationId === null) {
116
+ await getPool().query(`INSERT INTO clients
117
+ (id, client_id, organization_id, application_id, client_name, client_type,
118
+ application_type, status, grant_types, response_types, scope, login_methods,
119
+ token_endpoint_auth_method, redirect_uris, post_logout_redirect_uris,
120
+ allowed_origins, require_pkce)
121
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17)`, [
122
+ authoritativeId,
123
+ record.client_id,
124
+ organizationId,
125
+ applicationId,
126
+ record.name,
127
+ record.client_type,
128
+ record.application_type,
129
+ record.status,
130
+ record.grant_types,
131
+ record.response_types,
132
+ record.scope,
133
+ record.login_methods,
134
+ record.token_endpoint_auth_method,
135
+ record.redirect_uris,
136
+ record.post_logout_redirect_uris,
137
+ record.allowed_origins,
138
+ record.require_pkce,
139
+ ]);
140
+ }
141
+ else {
142
+ await getPool().query(`UPDATE clients SET client_name = $1, status = $2, grant_types = $3,
143
+ response_types = $4, scope = $5, login_methods = $6,
144
+ token_endpoint_auth_method = $7, redirect_uris = $8,
145
+ post_logout_redirect_uris = $9, allowed_origins = $10, require_pkce = $11,
146
+ updated_at = NOW() WHERE id = $12`, [...mutableValues, destinationId]);
147
+ }
148
+ if (destinationId !== null || record.client_type !== 'confidential') {
149
+ return { id: authoritativeId };
150
+ }
151
+ const secret = generateSecret();
152
+ const secretHash = await hashSecret(secret);
153
+ const secretSha256 = createHash('sha256').update(secret).digest('hex');
154
+ const expiresAt = importedSecretExpiry(new Date());
155
+ await getPool().query(`INSERT INTO client_secrets
156
+ (client_id, secret_hash, secret_sha256, label, expires_at)
157
+ VALUES ($1, $2, $3, 'Imported', $4)`, [authoritativeId, secretHash, secretSha256, expiresAt]);
158
+ return {
159
+ id: authoritativeId,
160
+ credential: {
161
+ client_id: record.client_id,
162
+ label: 'Imported',
163
+ secret,
164
+ expires_at: expiresAt.toISOString(),
165
+ },
166
+ };
167
+ }
168
+ //# sourceMappingURL=import-user-client-writers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-user-client-writers.js","sourceRoot":"","sources":["../../src/portability/import-user-client-writers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /** Public server contract for selective environment portability. */
2
+ export { exportManifestRequestSchema, importManifestRequestSchema, portabilityApplicationSelectionSchema, portabilityCategorySchema, portabilityEntityTypeSchema, portabilityManifestSchema, portabilityResultSchema, portabilityScopeSchema, } from './schema.js';
3
+ export { requiredPortabilityPermissions, requirePortabilityAuthorization, } from './authorization.js';
4
+ export { exportPortabilityManifest, type PortabilityExport } from './export.js';
5
+ export { buildPortabilityPlan } from './plan.js';
6
+ export { applyPortabilityManifest } from './apply.js';
7
+ export { PortabilityError, type ExportManifestRequest, type ImportManifestRequest, type PortabilityAction, type PortabilityActionCounts, type PortabilityActor, type PortabilityApplication, type PortabilityApplicationModule, type PortabilityApplicationSelection, type PortabilityBranding, type PortabilityBrandingAsset, type PortabilityCategory, type PortabilityClaimDefinition, type PortabilityClient, type PortabilityCredential, type PortabilityEntityType, type PortabilityErrorCode, type PortabilityImportMode, type PortabilityJsonValue, type PortabilityManifest, type PortabilityNaturalKey, type PortabilityOrganization, type PortabilityPermission, type PortabilityResult, type PortabilityResultError, type PortabilityResultErrorCode, type PortabilityResultItem, type PortabilityRole, type PortabilityRolePermissionMapping, type PortabilityScope, type PortabilityUser, type PortabilityUserClaimValue, type PortabilityUserRoleAssignment, } from './types.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/portability/index.ts"],"names":[],"mappings":"AAAA,oEAAoE;AAEpE,OAAO,EACL,2BAA2B,EAC3B,2BAA2B,EAC3B,qCAAqC,EACrC,yBAAyB,EACzB,2BAA2B,EAC3B,yBAAyB,EACzB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,8BAA8B,EAC9B,+BAA+B,GAChC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,yBAAyB,EAAE,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EACL,gBAAgB,EAChB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,4BAA4B,EACjC,KAAK,+BAA+B,EACpC,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EACxB,KAAK,0BAA0B,EAC/B,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,0BAA0B,EAC/B,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,gCAAgC,EACrC,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,yBAAyB,EAC9B,KAAK,6BAA6B,GACnC,MAAM,YAAY,CAAC"}
@@ -0,0 +1,8 @@
1
+ /** Public server contract for selective environment portability. */
2
+ export { exportManifestRequestSchema, importManifestRequestSchema, portabilityApplicationSelectionSchema, portabilityCategorySchema, portabilityEntityTypeSchema, portabilityManifestSchema, portabilityResultSchema, portabilityScopeSchema, } from './schema.js';
3
+ export { requiredPortabilityPermissions, requirePortabilityAuthorization, } from './authorization.js';
4
+ export { exportPortabilityManifest } from './export.js';
5
+ export { buildPortabilityPlan } from './plan.js';
6
+ export { applyPortabilityManifest } from './apply.js';
7
+ export { PortabilityError, } from './types.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/portability/index.ts"],"names":[],"mappings":"AAAA,oEAAoE;AAEpE,OAAO,EACL,2BAA2B,EAC3B,2BAA2B,EAC3B,qCAAqC,EACrC,yBAAyB,EACzB,2BAA2B,EAC3B,yBAAyB,EACzB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,8BAA8B,EAC9B,+BAA+B,GAChC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,yBAAyB,EAA0B,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EACL,gBAAgB,GAiCjB,MAAM,YAAY,CAAC"}