@portaidentity/server 1.7.2 → 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 +10 -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,39 @@
1
+ -- Up Migration
2
+
3
+ -- Operational policy uses native JSONB scalars. Canonical earlier values are intentionally reset;
4
+ -- bootstrap/internal rows are not part of the administrative catalog and remain untouched.
5
+ INSERT INTO system_config (key, value, value_type, description, is_sensitive) VALUES
6
+ ('access_token_ttl', '3600'::jsonb, 'duration', 'How long newly issued access tokens remain valid.', FALSE),
7
+ ('id_token_ttl', '3600'::jsonb, 'duration', 'How long newly issued ID tokens remain valid.', FALSE),
8
+ ('refresh_token_ttl', '2592000'::jsonb, 'duration', 'How long newly issued refresh tokens remain valid.', FALSE),
9
+ ('authorization_code_ttl', '600'::jsonb, 'duration', 'How long a newly issued authorization code remains valid.', FALSE),
10
+ ('session_ttl', '86400'::jsonb, 'duration', 'How long newly created OIDC sessions remain valid.', FALSE),
11
+ ('magic_link_ttl', '900'::jsonb, 'duration', 'How long a newly created magic-link token remains valid.', FALSE),
12
+ ('password_reset_ttl', '3600'::jsonb, 'duration', 'How long a newly created password-reset token remains valid.', FALSE),
13
+ ('invitation_ttl', '604800'::jsonb, 'duration', 'How long a newly created user invitation remains valid.', FALSE),
14
+ ('rate_limit_login_max', '10'::jsonb, 'number', 'Maximum login attempts allowed in one login window.', FALSE),
15
+ ('rate_limit_login_window', '900'::jsonb, 'duration', 'Window used to count login attempts.', FALSE),
16
+ ('rate_limit_magic_link_max', '5'::jsonb, 'number', 'Maximum magic-link requests allowed in one window.', FALSE),
17
+ ('rate_limit_magic_link_window', '900'::jsonb, 'duration', 'Window used to count magic-link requests.', FALSE),
18
+ ('rate_limit_password_reset_max', '5'::jsonb, 'number', 'Maximum password-reset requests allowed in one window.', FALSE),
19
+ ('rate_limit_password_reset_window', '900'::jsonb, 'duration', 'Window used to count password-reset requests.', FALSE),
20
+ ('max_failed_logins', '5'::jsonb, 'number', 'Failed login count that activates automatic lockout.', FALSE),
21
+ ('lockout_duration_seconds', '900'::jsonb, 'duration', 'Duration applied when automatic lockout eligibility is checked.', FALSE),
22
+ ('audit_retention_days', '90'::jsonb, 'number', 'Default number of days retained by audit cleanup.', FALSE),
23
+ ('default_locale', '"en"'::jsonb, 'string', 'Final locale fallback used by the authentication UI.', FALSE)
24
+ ON CONFLICT (key) DO UPDATE SET
25
+ value = EXCLUDED.value,
26
+ value_type = EXCLUDED.value_type,
27
+ description = EXCLUDED.description,
28
+ is_sensitive = EXCLUDED.is_sensitive,
29
+ updated_at = NOW();
30
+
31
+ DELETE FROM system_config WHERE key IN (
32
+ 'login_rate_limit', 'lockout_duration', 'api_rate_limit', 'cookie_secure',
33
+ 'magic_link_length', 'require_pkce', 'cors_max_age'
34
+ );
35
+
36
+ -- Down Migration
37
+
38
+ -- No-op: earlier policy values cannot be reconstructed after the intentional reset.
39
+ -- Development recovery uses yarn admin:env reset rather than reversing these defaults.
@@ -0,0 +1,28 @@
1
+ -- Up Migration
2
+
3
+ -- Make updated_at strictly advance on every row update.
4
+ --
5
+ -- ETags are derived from updated_at at millisecond precision, while PostgreSQL
6
+ -- stores microseconds and the JavaScript driver truncates the value to
7
+ -- milliseconds. Two updates stamped within the same millisecond therefore
8
+ -- produced an identical ETag even though the row changed, which let a stale
9
+ -- If-Match header match after a concurrent write. Advancing the stored value by
10
+ -- at least one millisecond per update keeps millisecond-precision ETags unique
11
+ -- across consecutive updates.
12
+ CREATE OR REPLACE FUNCTION trigger_set_updated_at()
13
+ RETURNS TRIGGER AS $$
14
+ BEGIN
15
+ NEW.updated_at = GREATEST(clock_timestamp(), OLD.updated_at + interval '1 millisecond');
16
+ RETURN NEW;
17
+ END;
18
+ $$ LANGUAGE plpgsql;
19
+
20
+ -- Down Migration
21
+
22
+ CREATE OR REPLACE FUNCTION trigger_set_updated_at()
23
+ RETURNS TRIGGER AS $$
24
+ BEGIN
25
+ NEW.updated_at = NOW();
26
+ RETURN NEW;
27
+ END;
28
+ $$ LANGUAGE plpgsql;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@portaidentity/server",
3
- "version": "1.7.2",
3
+ "version": "1.8.0",
4
4
  "description": "Multi-tenant OIDC provider built on node-oidc-provider, Koa, and TypeScript",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -57,7 +57,7 @@
57
57
  "koa": "3.2.1",
58
58
  "koa-bodyparser": "4.4.1",
59
59
  "node-pg-migrate": "9.0.0",
60
- "nodemailer": "9.0.5",
60
+ "nodemailer": "9.1.1",
61
61
  "oidc-provider": "9.11.2",
62
62
  "open": "11.0.0",
63
63
  "otpauth": "9.5.1",
@@ -1,50 +0,0 @@
1
- /**
2
- * Pure import-manifest planning.
3
- *
4
- * The planner assigns every admitted entity a stable tenant-qualified natural key and explicit
5
- * parent references before database mutation begins. Database-backed planning later resolves the
6
- * returned external references against one consistent transaction snapshot.
7
- */
8
- import type { ImportManifest } from './data-import.js';
9
- import type { PoolClient } from 'pg';
10
- /** Closed entity catalog accepted by the version 1.0 manifest. */
11
- export type ImportEntityType = 'organization' | 'application' | 'client' | 'role' | 'permission' | 'claim_definition' | 'role_permission_mapping' | 'application_module' | 'user' | 'user_role_assignment' | 'user_claim_value' | 'config';
12
- /** Parent reference which must exist in the manifest or the database snapshot. */
13
- export interface ImportPlanDependency {
14
- readonly entityType: ImportEntityType;
15
- readonly naturalKey: string;
16
- readonly source: 'manifest' | 'database';
17
- }
18
- /** One deterministic manifest entry prepared for database-backed action planning. */
19
- export interface ImportPlanEntry {
20
- readonly entityType: ImportEntityType;
21
- readonly naturalKey: string;
22
- readonly mutableFields: readonly string[];
23
- readonly dependencies: readonly ImportPlanDependency[];
24
- readonly credentialWillBeGenerated: boolean;
25
- }
26
- /** Immutable mutation-free plan produced from a validated manifest. */
27
- export interface ImportManifestPlan {
28
- readonly version: '1.0';
29
- readonly entries: readonly ImportPlanEntry[];
30
- readonly externalDependencies: readonly ImportPlanDependency[];
31
- }
32
- /** Return whether a configuration key can carry authentication material. */
33
- export declare function isProhibitedImportConfigKey(configKey: string): boolean;
34
- /**
35
- * Build a deterministic, mutation-free plan from a schema-validated manifest.
36
- *
37
- * @param manifest - Strictly parsed version 1.0 manifest.
38
- * @returns Ordered entries and the exact parents that must be resolved from the database.
39
- * @throws Error when a system configuration key could carry authentication material.
40
- */
41
- export declare function buildImportManifestPlan(manifest: ImportManifest): ImportManifestPlan;
42
- /**
43
- * Resolve every external parent against the current transaction snapshot.
44
- *
45
- * @param client - Transaction client used by the later import execution.
46
- * @param plan - Pure manifest plan built before acquiring the client.
47
- * @throws Error when a parent is missing or storage contains an ambiguous natural key.
48
- */
49
- export declare function requireResolvedImportDependencies(client: PoolClient, plan: ImportManifestPlan): Promise<void>;
50
- //# sourceMappingURL=data-import-plan.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"data-import-plan.d.ts","sourceRoot":"","sources":["../../src/lib/data-import-plan.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAErC,kEAAkE;AAClE,MAAM,MAAM,gBAAgB,GACxB,cAAc,GACd,aAAa,GACb,QAAQ,GACR,MAAM,GACN,YAAY,GACZ,kBAAkB,GAClB,yBAAyB,GACzB,oBAAoB,GACpB,MAAM,GACN,sBAAsB,GACtB,kBAAkB,GAClB,QAAQ,CAAC;AAEb,kFAAkF;AAClF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAAC;CAC1C;AAED,qFAAqF;AACrF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,YAAY,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACvD,QAAQ,CAAC,yBAAyB,EAAE,OAAO,CAAC;CAC7C;AAED,uEAAuE;AACvE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,CAAC;IAC7C,QAAQ,CAAC,oBAAoB,EAAE,SAAS,oBAAoB,EAAE,CAAC;CAChE;AA4BD,4EAA4E;AAC5E,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAEtE;AAgDD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,cAAc,GAAG,kBAAkB,CAgKpF;AAoDD;;;;;;GAMG;AACH,wBAAsB,iCAAiC,CACrD,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,IAAI,CAAC,CAyBf"}
@@ -1,235 +0,0 @@
1
- /**
2
- * Pure import-manifest planning.
3
- *
4
- * The planner assigns every admitted entity a stable tenant-qualified natural key and explicit
5
- * parent references before database mutation begins. Database-backed planning later resolves the
6
- * returned external references against one consistent transaction snapshot.
7
- */
8
- const MUTABLE_FIELDS = Object.freeze({
9
- organization: [
10
- 'name',
11
- 'default_locale',
12
- 'branding_primary_color',
13
- 'branding_company_name',
14
- 'branding_custom_css',
15
- 'branding_logo_url',
16
- 'branding_favicon_url',
17
- ],
18
- application: ['name', 'description'],
19
- client: ['client_name'],
20
- role: ['name', 'description'],
21
- permission: ['name', 'description'],
22
- claim_definition: ['name', 'description'],
23
- role_permission_mapping: [],
24
- application_module: ['name', 'description'],
25
- user: ['given_name', 'family_name', 'locale'],
26
- user_role_assignment: [],
27
- user_claim_value: ['value'],
28
- config: ['value'],
29
- });
30
- const PROHIBITED_CONFIG_KEY = /(^|_)(password|secret|private_key|signing_key|cookie_key|session_key|recovery_code|totp_secret)(_|$)/i;
31
- /** Return whether a configuration key can carry authentication material. */
32
- export function isProhibitedImportConfigKey(configKey) {
33
- return PROHIBITED_CONFIG_KEY.test(configKey);
34
- }
35
- /** Join natural-key components without ambiguous concatenation. */
36
- function key(...parts) {
37
- return parts.join('\u001f');
38
- }
39
- /** Split an internal natural key and reject malformed planner state. */
40
- function keyParts(naturalKey, expectedParts) {
41
- const parts = naturalKey.split('\u001f');
42
- if (parts.length !== expectedParts || parts.some((part) => part.length === 0)) {
43
- throw new Error('Import plan contains an invalid natural key');
44
- }
45
- return parts;
46
- }
47
- /** Return a manifest/database reference for one required parent. */
48
- function dependency(entityType, naturalKey, manifestKeys) {
49
- return Object.freeze({
50
- entityType,
51
- naturalKey,
52
- source: manifestKeys.has(naturalKey) ? 'manifest' : 'database',
53
- });
54
- }
55
- /** Add one immutable entry to the ordered plan. */
56
- function addEntry(entries, entityType, naturalKey, dependencies, credentialWillBeGenerated = false) {
57
- entries.push(Object.freeze({
58
- entityType,
59
- naturalKey,
60
- mutableFields: MUTABLE_FIELDS[entityType],
61
- dependencies: Object.freeze([...dependencies]),
62
- credentialWillBeGenerated,
63
- }));
64
- }
65
- /**
66
- * Build a deterministic, mutation-free plan from a schema-validated manifest.
67
- *
68
- * @param manifest - Strictly parsed version 1.0 manifest.
69
- * @returns Ordered entries and the exact parents that must be resolved from the database.
70
- * @throws Error when a system configuration key could carry authentication material.
71
- */
72
- export function buildImportManifestPlan(manifest) {
73
- const entries = [];
74
- const organizationKeys = new Set(manifest.organizations.map((item) => item.slug));
75
- const applicationKeys = new Set(manifest.applications.map((item) => item.slug));
76
- const roleKeys = new Set(manifest.roles.map((item) => key(item.application_slug, item.slug)));
77
- const permissionKeys = new Set(manifest.permissions.map((item) => key(item.application_slug, item.slug)));
78
- const claimKeys = new Set(manifest.claim_definitions.map((item) => key(item.application_slug, item.slug)));
79
- const userKeys = new Set(manifest.users.map((item) => key(item.organization_slug, item.email.toLowerCase())));
80
- for (const organization of manifest.organizations) {
81
- addEntry(entries, 'organization', organization.slug, []);
82
- }
83
- for (const application of manifest.applications) {
84
- addEntry(entries, 'application', application.slug, [
85
- dependency('organization', application.organization_slug, organizationKeys),
86
- ]);
87
- }
88
- for (const client of manifest.clients) {
89
- addEntry(entries, 'client', key(client.organization_slug, client.application_slug, client.client_name), [
90
- dependency('organization', client.organization_slug, organizationKeys),
91
- dependency('application', client.application_slug, applicationKeys),
92
- ], client.client_type === 'confidential');
93
- }
94
- for (const role of manifest.roles) {
95
- addEntry(entries, 'role', key(role.application_slug, role.slug), [
96
- dependency('organization', role.organization_slug, organizationKeys),
97
- dependency('application', role.application_slug, applicationKeys),
98
- ]);
99
- }
100
- for (const permission of manifest.permissions) {
101
- addEntry(entries, 'permission', key(permission.application_slug, permission.slug), [
102
- dependency('organization', permission.organization_slug, organizationKeys),
103
- dependency('application', permission.application_slug, applicationKeys),
104
- ]);
105
- }
106
- for (const claim of manifest.claim_definitions) {
107
- addEntry(entries, 'claim_definition', key(claim.application_slug, claim.slug), [
108
- dependency('organization', claim.organization_slug, organizationKeys),
109
- dependency('application', claim.application_slug, applicationKeys),
110
- ]);
111
- }
112
- for (const mapping of manifest.role_permission_mappings) {
113
- const dependencies = [
114
- dependency('organization', mapping.organization_slug, organizationKeys),
115
- dependency('application', mapping.application_slug, applicationKeys),
116
- dependency('role', key(mapping.application_slug, mapping.role_slug), roleKeys),
117
- ...mapping.permission_slugs.map((slug) => dependency('permission', key(mapping.application_slug, slug), permissionKeys)),
118
- ];
119
- addEntry(entries, 'role_permission_mapping', key(mapping.application_slug, mapping.role_slug), dependencies);
120
- }
121
- for (const module of manifest.application_modules) {
122
- addEntry(entries, 'application_module', key(module.application_slug, module.slug), [
123
- dependency('organization', module.organization_slug, organizationKeys),
124
- dependency('application', module.application_slug, applicationKeys),
125
- ]);
126
- }
127
- for (const user of manifest.users) {
128
- addEntry(entries, 'user', key(user.organization_slug, user.email.toLowerCase()), [
129
- dependency('organization', user.organization_slug, organizationKeys),
130
- ]);
131
- }
132
- for (const assignment of manifest.user_role_assignments) {
133
- addEntry(entries, 'user_role_assignment', key(assignment.organization_slug, assignment.application_slug, assignment.email.toLowerCase(), assignment.role_slug), [
134
- dependency('organization', assignment.organization_slug, organizationKeys),
135
- dependency('application', assignment.application_slug, applicationKeys),
136
- dependency('user', key(assignment.organization_slug, assignment.email.toLowerCase()), userKeys),
137
- dependency('role', key(assignment.application_slug, assignment.role_slug), roleKeys),
138
- ]);
139
- }
140
- for (const claimValue of manifest.user_claim_values) {
141
- addEntry(entries, 'user_claim_value', key(claimValue.organization_slug, claimValue.application_slug, claimValue.email.toLowerCase(), claimValue.claim_slug), [
142
- dependency('organization', claimValue.organization_slug, organizationKeys),
143
- dependency('application', claimValue.application_slug, applicationKeys),
144
- dependency('user', key(claimValue.organization_slug, claimValue.email.toLowerCase()), userKeys),
145
- dependency('claim_definition', key(claimValue.application_slug, claimValue.claim_slug), claimKeys),
146
- ]);
147
- }
148
- for (const configKey of Object.keys(manifest.config ?? {}).sort()) {
149
- if (isProhibitedImportConfigKey(configKey)) {
150
- throw new Error('Import manifest contains prohibited authentication material');
151
- }
152
- addEntry(entries, 'config', configKey, []);
153
- }
154
- const externalByKey = new Map();
155
- for (const entry of entries) {
156
- for (const required of entry.dependencies) {
157
- if (required.source === 'database') {
158
- externalByKey.set(key(required.entityType, required.naturalKey), required);
159
- }
160
- }
161
- }
162
- return Object.freeze({
163
- version: '1.0',
164
- entries: Object.freeze(entries),
165
- externalDependencies: Object.freeze([...externalByKey.values()]),
166
- });
167
- }
168
- /** Resolve one database-owned parent without exposing its identifier in an error. */
169
- async function databaseDependencyExists(client, required) {
170
- if (required.entityType === 'organization') {
171
- const result = await client.query('SELECT 1 FROM organizations WHERE slug = $1', [
172
- required.naturalKey,
173
- ]);
174
- return result.rowCount === 1;
175
- }
176
- if (required.entityType === 'application') {
177
- const result = await client.query('SELECT 1 FROM applications WHERE slug = $1', [
178
- required.naturalKey,
179
- ]);
180
- return result.rowCount === 1;
181
- }
182
- if (required.entityType === 'role' ||
183
- required.entityType === 'permission' ||
184
- required.entityType === 'claim_definition') {
185
- const [applicationSlug, entitySlug] = keyParts(required.naturalKey, 2);
186
- const table = required.entityType === 'role'
187
- ? 'roles'
188
- : required.entityType === 'permission'
189
- ? 'permissions'
190
- : 'claim_definitions';
191
- const result = await client.query(`SELECT 1 FROM ${table} entity
192
- JOIN applications application ON application.id = entity.application_id
193
- WHERE application.slug = $1 AND entity.slug = $2`, [applicationSlug, entitySlug]);
194
- return result.rowCount === 1;
195
- }
196
- if (required.entityType === 'user') {
197
- const [organizationSlug, email] = keyParts(required.naturalKey, 2);
198
- const result = await client.query(`SELECT 1 FROM users user_account
199
- JOIN organizations organization ON organization.id = user_account.organization_id
200
- WHERE organization.slug = $1 AND user_account.email = $2`, [organizationSlug, email]);
201
- return result.rowCount === 1;
202
- }
203
- throw new Error('Import plan contains an unsupported external dependency');
204
- }
205
- /**
206
- * Resolve every external parent against the current transaction snapshot.
207
- *
208
- * @param client - Transaction client used by the later import execution.
209
- * @param plan - Pure manifest plan built before acquiring the client.
210
- * @throws Error when a parent is missing or storage contains an ambiguous natural key.
211
- */
212
- export async function requireResolvedImportDependencies(client, plan) {
213
- for (const required of plan.externalDependencies) {
214
- if (!(await databaseDependencyExists(client, required))) {
215
- throw new Error('Import manifest contains a missing or unauthorized parent reference');
216
- }
217
- }
218
- for (const entry of plan.entries) {
219
- if (entry.entityType !== 'client')
220
- continue;
221
- const [organizationSlug, applicationSlug, clientName] = keyParts(entry.naturalKey, 3);
222
- const result = await client.query(`SELECT COUNT(*)::integer AS count
223
- FROM clients client
224
- JOIN organizations organization ON organization.id = client.organization_id
225
- JOIN applications application ON application.id = client.application_id
226
- WHERE organization.slug = $1
227
- AND application.slug = $2
228
- AND client.client_name = $3`, [organizationSlug, applicationSlug, clientName]);
229
- const count = Number(result.rows[0]?.count ?? 0);
230
- if (!Number.isSafeInteger(count) || count > 1) {
231
- throw new Error('Import manifest natural key collides with ambiguous stored data');
232
- }
233
- }
234
- }
235
- //# sourceMappingURL=data-import-plan.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"data-import-plan.js","sourceRoot":"","sources":["../../src/lib/data-import-plan.ts"],"names":[],"mappings":"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"}