permdock 0.6.0 → 0.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 (507) hide show
  1. package/README.md +2 -3
  2. package/dist/{2020-C9VN-x8c.js → 2020-CJbO8Bvz.js} +1 -3
  3. package/dist/a2a/index.d.ts +7 -7
  4. package/dist/a2a/index.js +9 -9
  5. package/dist/action-result-CL-QCITA.d.ts +19 -0
  6. package/dist/{adapter-context-CRhqyzCk.js → adapter-context-CIQpQxbE.js} +8 -2
  7. package/dist/{adoption-scan-DCYe60Pi.js → adoption-scan-BLs67P1l.js} +5 -5
  8. package/dist/agent/index.d.ts +3 -3
  9. package/dist/agent/index.js +1 -1
  10. package/dist/ai-sdk/index.d.ts +31 -10
  11. package/dist/ai-sdk/index.js +22 -12
  12. package/dist/{app-data-MuyzVqX8.js → app-data-UNNm07jV.js} +10 -7
  13. package/dist/{approval-header-CJACtHkv.js → approval-header-8QV6MU4H.js} +6 -3
  14. package/dist/{approval-prompt-Dg5LeAcT.js → approval-prompt-B8hQY69x.js} +5 -6
  15. package/dist/{approval-prompt-DvSSPQJX.d.ts → approval-prompt-PYagyQUj.d.ts} +13 -11
  16. package/dist/approvals/index.d.ts +5 -5
  17. package/dist/approvals/index.js +7 -7
  18. package/dist/{approvals-p1PGoVjb.js → approvals-DnIBTuXE.js} +128 -78
  19. package/dist/{approvers-CqPOLD-o.js → approvers-B4r0N_Uz.js} +8 -2
  20. package/dist/{arazzo-41WuzHou.js → arazzo-3RhGfkAK.js} +2 -2
  21. package/dist/{arazzo-CaUVBn7D.js → arazzo-B5-ulWif.js} +6 -6
  22. package/dist/{args-IIolxxKA.js → args-0FrVs5EH.js} +125 -8
  23. package/dist/astro/index.d.ts +30 -12
  24. package/dist/astro/index.js +2 -2
  25. package/dist/{audience-DabClFLQ.js → audience-BAkBDMqn.js} +8 -8
  26. package/dist/{auth-DRLEizbL.js → auth--yPyZNgr.js} +21 -10
  27. package/dist/authzen/index.d.ts +171 -25
  28. package/dist/authzen/index.js +321 -149
  29. package/dist/{automation-BNM3TtDo.d.ts → automation-DqEoWHBc.d.ts} +42 -32
  30. package/dist/{automation-DVjOckjV.js → automation-x3KEUusw.js} +22 -21
  31. package/dist/base-url-BQbddZO5.js +9 -0
  32. package/dist/better-auth/index.d.ts +2 -2
  33. package/dist/better-auth/index.js +13 -7
  34. package/dist/better-supabase/index.d.ts +392 -220
  35. package/dist/better-supabase/index.js +293 -152
  36. package/dist/{bind-DOyrv6zi.d.ts → bind-Cp2hBHzP.d.ts} +27 -12
  37. package/dist/{bind-CAvgUuKs.js → bind-D_sZSVA3.js} +22 -10
  38. package/dist/{body-CH5of8Ne.js → body-CJQwYVa8.js} +3 -3
  39. package/dist/{body-text-QcXok_SI.js → body-text-DQhcmqdY.js} +8 -4
  40. package/dist/{boundary-BM8a_P6E.js → boundary-BV3O1eud.js} +8 -2
  41. package/dist/{boundary-BmHxVH1J.d.ts → boundary-C9ck-3uK.d.ts} +13 -4
  42. package/dist/{budget-NbEtbJC_.js → budget-BELja5A9.js} +6 -3
  43. package/dist/{budget-JqcRqyhK.d.ts → budget-hYsPz_yE.d.ts} +6 -3
  44. package/dist/{build-instance-Bu_eDqYw.js → build-instance-CNWaYJyr.js} +3 -3
  45. package/dist/{canonical-json-BC8_nMTw.js → canonical-json-DwilZ1iB.js} +6 -3
  46. package/dist/{capability-N1K9IpqS.js → capability-BqX94r07.js} +31 -25
  47. package/dist/{capability-Drg-1YhL.d.ts → capability-ChuiONQU.d.ts} +41 -29
  48. package/dist/{casbin-Dyu2gnUD.js → casbin-H0rKxBx2.js} +16 -8
  49. package/dist/{casbin-Cr7RLtA3.js → casbin-cbSbhT_k.js} +2 -2
  50. package/dist/{casl-64gpT-8x.js → casl-C4OINZHI.js} +2 -2
  51. package/dist/{casl-DjEDhTCP.js → casl-CHHoCldP.js} +19 -10
  52. package/dist/catalog/index.d.ts +104 -23
  53. package/dist/catalog/index.js +117 -8
  54. package/dist/{catalog-HD2gf5mY.js → catalog-BFpz2EmT.js} +57 -26
  55. package/dist/{catalog-DZVbrF-z.js → catalog-DCspHDc8.js} +3 -3
  56. package/dist/{catalog-doc-Cdn7-0pQ.js → catalog-doc-DjMKzJp9.js} +53 -16
  57. package/dist/{catalog-fingerprint-CCP0-yQS.js → catalog-fingerprint-e6aCWosn.js} +19 -15
  58. package/dist/catalog-mRQQQhNK.js +1 -0
  59. package/dist/catalog-operations-Dadrl7Z-.js +60 -0
  60. package/dist/{create-CQWIpUG-.js → challenge-DImNcR7B.js} +157 -39
  61. package/dist/chat/index.d.ts +1 -1
  62. package/dist/chat/index.js +13 -10
  63. package/dist/chat-sdk/index.d.ts +44 -26
  64. package/dist/chat-sdk/index.js +17 -17
  65. package/dist/checks-CGkP3Z7A.js +40 -0
  66. package/dist/{claims-map-7oQ3ue4X.js → claims-map-CKkoAAYF.js} +5 -2
  67. package/dist/{claims-map-Ca-QX8C6.d.ts → claims-map-D1Pb5oRq.d.ts} +8 -5
  68. package/dist/claude-agent/index.d.ts +6 -6
  69. package/dist/claude-agent/index.js +6 -3
  70. package/dist/clerk/index.d.ts +11 -7
  71. package/dist/clerk/index.js +6 -6
  72. package/dist/cli/bin.js +4 -4
  73. package/dist/cli/index.d.ts +82 -7
  74. package/dist/cli/index.js +6 -6
  75. package/dist/{clients-C7zLFuWT.d.ts → clients-C_NOET3z.d.ts} +5 -5
  76. package/dist/{clients-DjU5ABMy.js → clients-DYr3U86j.js} +3 -3
  77. package/dist/cloud/index.d.ts +186 -38
  78. package/dist/cloud/index.js +293 -31
  79. package/dist/{cloud-ytQ3uviA.js → cloud-BFlGMaak.js} +5 -6
  80. package/dist/{codemod-5mpSpnUY.js → codemod-DLQ9Zpo4.js} +3 -4
  81. package/dist/{codemod-ua2hHy7w.js → codemod-DWSN2erG.js} +523 -201
  82. package/dist/collect-B5BL3klN.js +1 -0
  83. package/dist/{collect-mLTY4nwb.js → collect-B7ZFAJU3.js} +36 -64
  84. package/dist/{collect-Ci6akVwH.js → collect-Bzv3le0A.js} +6 -6
  85. package/dist/{compare-pfyVnBjE.js → compare-DTfyUunF.js} +2 -2
  86. package/dist/compile/index.d.ts +2 -2
  87. package/dist/compile/index.js +1 -1
  88. package/dist/{compile-1bsAezL0.d.ts → compile-BFzysW3o.d.ts} +36 -12
  89. package/dist/{compile-CMqMx_IN.js → compile-EzEMB-7v.js} +77 -33
  90. package/dist/{completion-BTFrHZhX.js → completion-saoYiRFO.js} +17 -8
  91. package/dist/config-BwPBfN0t.js +108 -0
  92. package/dist/{config-Bj2Ixq3d.js → config-DBeXXmBF.js} +2 -2
  93. package/dist/{config-report-DSpsLpCE.js → config-report-BipSWA6V.js} +9 -6
  94. package/dist/config-shape-ykV0Vm2n.js +134 -0
  95. package/dist/{connection-DjhIJSs2.js → connection-B72dg5Q2.js} +23 -22
  96. package/dist/connector-schema-CYLQNMYq.js +434 -0
  97. package/dist/{context-B_u3_bDJ.js → context-BnIzxTNE.js} +4 -3
  98. package/dist/convex/index.d.ts +13 -7
  99. package/dist/convex/index.js +9 -6
  100. package/dist/core-H-mbhpZc.js +341 -0
  101. package/dist/core-hWIARPDz.d.ts +206 -0
  102. package/dist/{create-CBMmFie-.d.ts → create-BSNrVuxh.d.ts} +87 -34
  103. package/dist/{create-B30OMUOJ.d.ts → create-BVq1lNQE.d.ts} +49 -28
  104. package/dist/{create-D_NmPOdH.d.ts → create-CM1FciYG.d.ts} +37 -29
  105. package/dist/{create-CGm28gyI.js → create-Cq4Uox0f.js} +13 -9
  106. package/dist/{create-DCF2SvoT.js → create-_noSrY1T.js} +15 -21
  107. package/dist/{credential-BcoiejpY.js → credential-CyyyvCsL.js} +42 -39
  108. package/dist/{credentials-DPyHmYz5.js → credentials-CdDxp7jN.js} +6 -6
  109. package/dist/{deciding-columns-Sq12mEA6.js → deciding-columns-NB4wcyBf.js} +13 -2
  110. package/dist/{delegation-j6-rc37o.js → delegation-CDB6_keF.js} +31 -22
  111. package/dist/delivery/index.d.ts +5 -5
  112. package/dist/delivery/index.js +6 -5
  113. package/dist/{delivery-DCAgNyCn.js → delivery-BupfvJIV.js} +81 -20
  114. package/dist/{delivery-event-xX4obB8F.js → delivery-event-JioK5YbS.js} +6 -6
  115. package/dist/denied-text-CHNlVInN.d.ts +22 -0
  116. package/dist/{describe-BybMRY7A.js → describe-Bb4hGK5d.js} +6 -5
  117. package/dist/{describe-B5qgDvEW.d.ts → describe-ByS9LgHK.d.ts} +5 -5
  118. package/dist/{device-BARQ8eYG.js → device-BwbJNmb2.js} +11 -8
  119. package/dist/{diff-CmuSD3vc.js → diff-CN8IYhC_.js} +2 -2
  120. package/dist/{diff-3jbx6Rm4.js → diff-iZWV65nC.js} +23 -14
  121. package/dist/{digest-B3kc_PgQ.d.ts → digest-8Yx2CchM.d.ts} +3 -3
  122. package/dist/{doctor-BdZw53-k.js → doctor-CHD1M9R5.js} +485 -141
  123. package/dist/{doctor-3ZqNHX_G.js → doctor-D3wo-yuz.js} +4 -4
  124. package/dist/drizzle/index.d.ts +33 -19
  125. package/dist/drizzle/index.js +17 -9
  126. package/dist/elysia/index.d.ts +17 -11
  127. package/dist/elysia/index.js +5 -5
  128. package/dist/{errors-BKy0EfhN.js → errors-B6R_lg2a.js} +13 -4
  129. package/dist/{errors-BWXBMaKK.d.ts → errors-CHwoRRpB.d.ts} +4 -1
  130. package/dist/{errors-CWTY6uih.js → errors-Vpu6rKHl.js} +14 -10
  131. package/dist/{errors-DH5QEGXh.d.ts → errors-zi_4T-rx.d.ts} +22 -6
  132. package/dist/{evaluate-CNClBvcj.js → evaluate-Dd8Ta0Ie.js} +185 -80
  133. package/dist/{evaluations-beAooV0n.js → evaluations-IBceAeKT.js} +41 -20
  134. package/dist/{evaluations-C_1vdSZc.d.ts → evaluations-z8dQFDaN.d.ts} +12 -6
  135. package/dist/eve/index.d.ts +9 -6
  136. package/dist/eve/index.js +4 -4
  137. package/dist/{event-time-CsegxXxB.js → event-time-BGy48400.js} +8 -4
  138. package/dist/{expiry-D4_YKRKD.js → expiry-6XByK0dm.js} +8 -5
  139. package/dist/express/index.d.ts +9 -6
  140. package/dist/express/index.js +9 -6
  141. package/dist/fastify/index.d.ts +16 -10
  142. package/dist/fastify/index.js +8 -5
  143. package/dist/{fetch-adapter-Dw0MTS3D.d.ts → fetch-adapter-C1DCvpqV.d.ts} +9 -6
  144. package/dist/{fetch-adapter-DD_gfmrC.js → fetch-adapter-JL43jD3E.js} +14 -11
  145. package/dist/fields-D0vUI6dq.js +498 -0
  146. package/dist/{files-C5ZI27eV.js → files-B3AA05f1.js} +21 -5
  147. package/dist/{files-D_JIzUrP.js → files-BSjrtIHw.js} +11 -4
  148. package/dist/{fixtures-B7XrLeY7.js → fixtures-A1_sp_tR.js} +15 -6
  149. package/dist/{flags-C3DktBDY.js → flags-DXjoTVbS.js} +2 -2
  150. package/dist/{freeze-CrU8nQeX.js → freeze-jjan0lCv.js} +4 -1
  151. package/dist/{from-snapshot-CTCMsFZk.js → from-snapshot-DCakWRsr.js} +26 -16
  152. package/dist/gen-B5kvbAoZ.js +58 -0
  153. package/dist/gen-DWCYcMQM.js +827 -0
  154. package/dist/generate-CRVV5V7l.js +165 -0
  155. package/dist/generate-CezbCaTI.js +275 -0
  156. package/dist/{grantee-hxrUsbpM.js → grantee-Dke-9rd1.js} +4 -4
  157. package/dist/{grantee-conditions-CcXf8hMM.js → grantee-conditions-BrYPe-w0.js} +12 -12
  158. package/dist/{grantee-match-DbENBHLB.js → grantee-match-7RZZvoT_.js} +12 -6
  159. package/dist/{graph-sql-B-dsAT6j.d.ts → graph-sql-BwFC4Qjs.d.ts} +3 -3
  160. package/dist/h3/index.d.ts +10 -7
  161. package/dist/h3/index.js +3 -3
  162. package/dist/headers-B9jQxjtW.d.ts +10 -0
  163. package/dist/{helpers-CBYVMjwh.js → helpers-DJicaG6f.js} +40 -28
  164. package/dist/hono/index.d.ts +16 -10
  165. package/dist/hono/index.js +5 -5
  166. package/dist/{hosted-BPk51-kX.d.ts → hosted-Cmtxogd0.d.ts} +44 -20
  167. package/dist/{hosted-B46-5LYE.js → hosted-D0IzESu_.js} +68 -25
  168. package/dist/{http-ujKm0JXE.js → http-DH94eh6f.js} +4 -4
  169. package/dist/{http-BBoKefeS.js → http-DKLXrFGk.js} +13 -7
  170. package/dist/{http-DXJ37RDA.js → http-DOL33cO0.js} +11 -8
  171. package/dist/{import-wyqXUyjm.js → import-CST57XLp.js} +64 -51
  172. package/dist/{import-CNV7I2Dw.js → import-_YqhhwvX.js} +6 -6
  173. package/dist/{index-B8YjkEZ4.d.ts → index-B8s204GL.d.ts} +64 -52
  174. package/dist/{index-Ch8LpNDp.d.ts → index-BT5-1VsX.d.ts} +64 -25
  175. package/dist/{index-DuWxc5dt.d.ts → index-BW_0MZOS.d.ts} +388 -149
  176. package/dist/index-BhxEUY9J.d.ts +233 -0
  177. package/dist/index-Bv5iXPqU.d.ts +210 -0
  178. package/dist/{index-C-6Letxg.d.ts → index-_9UiQIkt.d.ts} +164 -77
  179. package/dist/index.d.ts +22 -21
  180. package/dist/index.js +35 -33
  181. package/dist/{init-GG6Jh8HD.js → init-Dz_PsHdv.js} +5 -5
  182. package/dist/{init-DeMYsnYJ.js → init-cE3A8aXq.js} +10 -10
  183. package/dist/{instance-options-BsVpyGIk.d.ts → instance-options-B0KXqTrJ.d.ts} +4 -4
  184. package/dist/{instance-snapshot-BOEhcqIF.js → instance-snapshot--JWiTrvO.js} +81 -56
  185. package/dist/{instant-BluqDvyS.js → instant-DK3Iz83e.js} +2 -2
  186. package/dist/{internals-Dk8A8fX3.js → internals-B3IgHrvo.js} +6 -3
  187. package/dist/{json-schema-B-vAwlde.js → json-schema-BPGa-RjQ.js} +9 -3
  188. package/dist/{json-schema-CN_iLFH2.d.ts → json-schema-BfXgnRNT.d.ts} +4 -4
  189. package/dist/jwt/index.d.ts +125 -17
  190. package/dist/jwt/index.js +157 -16
  191. package/dist/{kernel-D0NVb1cK.js → kernel-C-fYydV2.js} +151 -16
  192. package/dist/kysely/index.d.ts +49 -33
  193. package/dist/kysely/index.js +9 -7
  194. package/dist/{live-options-BaAFCIiu.js → live-options-BBIT68le.js} +2 -2
  195. package/dist/{load-DFS_ry0W.js → load-DjSU5KXO.js} +6 -6
  196. package/dist/load-Dm0pSYH3.js +1 -0
  197. package/dist/{login-Dfe5RlYk.js → login-D-8tMqzo.js} +4 -4
  198. package/dist/{login-imhuwvn3.js → login-DplQ0s84.js} +18 -15
  199. package/dist/{manifest-dvL2XEe1.js → manifest-Cgiq5oqc.js} +67 -37
  200. package/dist/{manifest-mx5ghSFM.d.ts → manifest-CzzWtnAb.d.ts} +144 -28
  201. package/dist/{manifest-schema-C0kK_8V0.js → manifest-schema-2r37XRhD.js} +80 -9
  202. package/dist/{manifest-C8IzW3Do.js → manifest-wg8WkkpD.js} +11 -7
  203. package/dist/{map-claims-D3oRmTk0.js → map-claims-BNWCJtmP.js} +27 -18
  204. package/dist/{map-error-Dr70oA_3.js → map-error-pasIGqMT.js} +7 -7
  205. package/dist/{markers-C6joDI3o.js → markers-BeHZ4x9Q.js} +20 -5
  206. package/dist/mcp/index.d.ts +154 -47
  207. package/dist/mcp/index.js +200 -41
  208. package/dist/{migrate-CIq4-E9F.js → migrate-B7oP_sQU.js} +102 -31
  209. package/dist/module-values-BJTBdo6y.js +107 -0
  210. package/dist/nest/index.d.ts +23 -13
  211. package/dist/nest/index.js +18 -11
  212. package/dist/next/client.d.ts +5 -2
  213. package/dist/next/client.js +1 -1
  214. package/dist/next/index.d.ts +72 -26
  215. package/dist/next/index.js +110 -6
  216. package/dist/next/plugin.d.ts +1 -1
  217. package/dist/next/plugin.js +4 -3
  218. package/dist/node/index.d.ts +5 -5
  219. package/dist/node/index.js +3 -3
  220. package/dist/{ocsf-BFp-PZZA.js → ocsf-TcjRBgIs.js} +15 -5
  221. package/dist/openai/index.d.ts +13 -7
  222. package/dist/openai/index.js +3 -3
  223. package/dist/openapi/index.d.ts +61 -30
  224. package/dist/openapi/index.js +2 -2
  225. package/dist/{openapi-B7HZ0f-r.js → openapi-BOsx0xn9.js} +34 -24
  226. package/dist/{openapi-C4dDTVEd.js → openapi-CBZUhA3l.js} +4 -5
  227. package/dist/{openapi-DD1SV-5-.js → openapi-VeHHU2l9.js} +23 -14
  228. package/dist/{operation-findings-DgATDpvh.js → operation-findings-CXtFzlKJ.js} +3 -3
  229. package/dist/{operations-X0VM7F3m.d.ts → operations-Ci_rT6Uo.d.ts} +10 -7
  230. package/dist/orpc/index.d.ts +68 -14
  231. package/dist/orpc/index.js +62 -13
  232. package/dist/otel/index.d.ts +7 -4
  233. package/dist/otel/index.js +8 -5
  234. package/dist/output-files-BHOIlrfD.js +1 -0
  235. package/dist/{output-files-DhRBBE4n.js → output-files-BIQ_9pIs.js} +29 -17
  236. package/dist/{output-1im__-08.js → output-tkju6U7R.js} +15 -7
  237. package/dist/ownership-B4L59T9u.js +1054 -0
  238. package/dist/parse-1_ZheTW5.js +151 -0
  239. package/dist/parse-local-manifest-BQhTlLQS.d.ts +10 -0
  240. package/dist/parse-local-manifest-DEiCF4ah.js +69 -0
  241. package/dist/{parse-request-D_tUXG6M.js → parse-request-CwCZpyjV.js} +7 -8
  242. package/dist/{paths-DXSHAMIa.js → paths-CUvURzHp.js} +4 -1
  243. package/dist/pdp/index.d.ts +9 -6
  244. package/dist/pdp/index.js +23 -12
  245. package/dist/{peer-CRvC7Hg1.js → peer-C9LvBCcb.js} +1 -1
  246. package/dist/peer-Q0fuZ6hx.js +982 -0
  247. package/dist/{permdock-SV8ZINYT.d.ts → permdock-B6Sf4T_S.d.ts} +270 -117
  248. package/dist/{permdock-BrAscV28.js → permdock-L-_I_3zP.js} +226 -74
  249. package/dist/{permission-registry-Br4jSNVi.js → permission-registry-B8tYxPIt.js} +24 -11
  250. package/dist/{vocabulary-CN8H_9UF.d.ts → permission-types-CAY-GU7e.d.ts} +130 -104
  251. package/dist/{permissions-u_KHg-sN.d.ts → permissions-Bx6UI8n1.d.ts} +6 -2
  252. package/dist/{permissions-B-wCP5ZC.js → permissions-CVXmRILq.js} +3 -3
  253. package/dist/{permissions-BPxlwVhN.js → permissions-mDcTWoBs.js} +8 -5
  254. package/dist/pg-DQTqRrou.js +60 -0
  255. package/dist/{pins-8ILTftC9.js → pins-nqarl3oE.js} +4 -1
  256. package/dist/pkce-CnmmYqUZ.js +21 -0
  257. package/dist/{policy-77FSAq_V.d.ts → policy-Ba4bDhaj.d.ts} +5 -5
  258. package/dist/{policy-DbM5YYtV.js → policy-CLQ8__GF.js} +49 -20
  259. package/dist/{policy-from-catalog-C2gMa2Dj.js → policy-from-catalog-CJgOm6aq.js} +28 -25
  260. package/dist/{policy-module-CTlwMvLI.js → policy-module-xym9fnSq.js} +12 -6
  261. package/dist/{policy-types-n0uRTsW8.d.ts → policy-types-CCiDRZBH.d.ts} +802 -334
  262. package/dist/postgres-store-DcyrPS-r.js +1028 -0
  263. package/dist/{postgrest-DAjUkF9w.js → postgrest-D4nuPXIQ.js} +88 -36
  264. package/dist/{postgrest-CEgRbefE.d.ts → postgrest-DicQyqm-.d.ts} +60 -30
  265. package/dist/powersync-DHNQX06W.js +1117 -0
  266. package/dist/{powersync-DISt6SUe.js → powersync-DXqGuq9A.js} +3 -3
  267. package/dist/powersync-Djf-zCpB.js +1 -0
  268. package/dist/preset/index.d.ts +38 -28
  269. package/dist/preset/index.js +1 -1
  270. package/dist/{preset-DZdU0tne.js → preset-BjLzeFpp.js} +58 -34
  271. package/dist/{principal-source-pHneukrx.js → principal-source-C6N60GtM.js} +10 -10
  272. package/dist/prisma/index.d.ts +69 -41
  273. package/dist/prisma/index.js +21 -17
  274. package/dist/{problem-CTviyH5L.js → problem-BVLHFK33.js} +41 -21
  275. package/dist/{problem-details-cn5X30gZ.js → problem-details-CLDgX1KV.js} +13 -4
  276. package/dist/{problem-types-CJ2325SZ.js → problem-types-DSsRfONQ.js} +4 -1
  277. package/dist/prompt-BYc6drYW.js +938 -0
  278. package/dist/protected-action-BE7N_Luo.d.ts +58 -0
  279. package/dist/protected-action-DUYqb-Ma.js +80 -0
  280. package/dist/{protected-BlF0F6wL.js → protected-action-QEA8arRB.js} +48 -14
  281. package/dist/{provider-B1al-AZz.js → provider-C55OGXJ7.js} +5 -4
  282. package/dist/{provider-DILL9oPK.d.ts → provider-DXfq5c2d.d.ts} +1 -1
  283. package/dist/{provider-store-DM6DNcta.js → provider-store-CaTv00tr.js} +13 -9
  284. package/dist/pull-B65ndFNZ.js +1 -0
  285. package/dist/{pull-jEwbf80J.js → pull-CwpGaQSi.js} +12 -11
  286. package/dist/{push-BD4f15co.js → push-DgssgzkK.js} +62 -16
  287. package/dist/{pushed-policy-DCW91KQU.d.ts → pushed-policy-D1Eoi6NM.d.ts} +12 -6
  288. package/dist/{pushed-policy-CqtxkV4G.js → pushed-policy-ITwYKvvH.js} +10 -7
  289. package/dist/react/index.d.ts +9 -8
  290. package/dist/react/index.js +7 -6
  291. package/dist/react/provider-client.d.ts +1 -1
  292. package/dist/react/provider-client.js +1 -1
  293. package/dist/react-native/index.d.ts +104 -51
  294. package/dist/react-native/index.js +394 -67
  295. package/dist/{refs-K6eWUJ0H.js → refs-C8BKxc_e.js} +17 -3
  296. package/dist/{relation-walk-3OyDBF0S.js → relation-walk-DK_gkgL7.js} +12 -9
  297. package/dist/{relations-BnCWnJGI.js → relations-BxvRvDHK.js} +3 -3
  298. package/dist/{replay-Du1tJjG7.js → replay-BU09ad4L.js} +1 -1
  299. package/dist/{replay-Bkm-Ne4l.d.ts → replay-DNftIb_R.d.ts} +1 -1
  300. package/dist/{request-context-C81Pip9n.js → request-context-C25ilqiJ.js} +8 -8
  301. package/dist/{request-schema-CMreVuFM.js → request-schema-DhX7UbfQ.js} +4 -1
  302. package/dist/resend/index.d.ts +34 -28
  303. package/dist/resend/index.js +29 -29
  304. package/dist/resolve-names-CF7xXLSG.js +201 -0
  305. package/dist/{resource-relations-D_jw0BFx.js → resource-relations-8-pCScBO.js} +18 -9
  306. package/dist/{retire-CALjIQ7e.js → retire-B2xffQgY.js} +15 -6
  307. package/dist/{revocations-R07lFBnX.d.ts → revocations-BaUXHM1N.d.ts} +6 -3
  308. package/dist/{rls-DTvYd-lI.js → rls-CNEH2_BG.js} +743 -624
  309. package/dist/{rls-BAqP4q66.js → rls-Ca8Jz9b5.js} +41 -10
  310. package/dist/{role-builder-uWQZ4v84.js → role-builder-BK2-T6oD.js} +41 -20
  311. package/dist/rolldown-runtime-C3I60J0A.js +4 -0
  312. package/dist/{row-conditions-h2HythXQ.js → row-conditions-BAGHOmVq.js} +4 -3
  313. package/dist/{rpc-VSl5ylaQ.js → rpc-fNqAIqQk.js} +8 -5
  314. package/dist/{run-CUKuz0A8.js → run-Bz26OTfO.js} +26 -23
  315. package/dist/run-D-JE8QWb.js +1 -0
  316. package/dist/{run-ticket-DocwaTKn.d.ts → run-ticket-DbWI9f99.d.ts} +33 -13
  317. package/dist/{run-ticket-sxFI6LAk.js → run-ticket-Dv7aF7Dk.js} +29 -8
  318. package/dist/{runtime-D3VTAiCA.js → runtime-BGnrOkVH.js} +5 -2
  319. package/dist/{saas-BCXRuXca.js → saas-iWnUdwCt.js} +42 -29
  320. package/dist/{scan-qvOe0hS3.js → scan-DCj1KQfn.js} +1 -1
  321. package/dist/{schema-B4v0Qrac.js → schema-BOJjqlWL.js} +3 -2
  322. package/dist/{schema-yLuBWWsh.js → schema-Dst9I9Gs.js} +9 -5
  323. package/dist/scim/index.d.ts +3 -2
  324. package/dist/scim/index.js +3 -1
  325. package/dist/scim-D8YupzX1.js +44 -0
  326. package/dist/{scim-ClHtpyV3.js → scim-jJBJ7g1Z.js} +35 -551
  327. package/dist/{scopes-CUPSjo9q.js → scopes-0Up_UA2t.js} +42 -24
  328. package/dist/server/index.d.ts +12 -12
  329. package/dist/server/index.js +13 -13
  330. package/dist/{server-C3WXAHZj.js → server-3cVlTLde.js} +31 -31
  331. package/dist/{server-types-CKQiCnON.d.ts → server-types-CIlpSA2G.d.ts} +81 -46
  332. package/dist/{sha256-D9ihqmvd.js → sha256-C-4WXKIu.js} +4 -3
  333. package/dist/{shared-BAK8t4Uo.js → shared-Afctg7B0.js} +100 -61
  334. package/dist/{shared-DvvFzYXe.js → shared-l0oGGetg.js} +9 -6
  335. package/dist/{signals-D3NcTKUS.js → signals-B1vHR3fN.js} +2 -2
  336. package/dist/{sink-BEZSlMS_.js → sink-D9_vh372.js} +32 -21
  337. package/dist/{sink-4-eQIRWf.d.ts → sink-Dvi7YZG_.d.ts} +44 -20
  338. package/dist/{skills-B6lVdD_W.js → skills-Bjj7BNEQ.js} +16 -12
  339. package/dist/{skills-CTYwkl44.js → skills-OuoMR49L.js} +3 -3
  340. package/dist/{snapshot-B7DkYg6g.js → snapshot-CXlzi69u.js} +21 -18
  341. package/dist/{snapshot-cache-PXI-vGpY.d.ts → snapshot-cache-BAXZ0KOp.d.ts} +21 -12
  342. package/dist/{snapshot-cache-DZHQ0KF6.js → snapshot-cache-Bx_4xC_6.js} +14 -11
  343. package/dist/solid/index.d.ts +55 -15
  344. package/dist/solid/index.js +46 -12
  345. package/dist/solid-start/index.d.ts +30 -12
  346. package/dist/solid-start/index.js +3 -3
  347. package/dist/sources-B1Os_YUu.d.ts +312 -0
  348. package/dist/{sources-vs5dGOsS.js → sources-CMAM-2A3.js} +156 -51
  349. package/dist/sources-qoIJQrJv.js +11 -0
  350. package/dist/{sql-B5T1IL83.js → sql-0WjxIp9g.js} +32 -7
  351. package/dist/sql-B80DFdpG.d.ts +10 -0
  352. package/dist/{src-Cu2m75uo.js → src-DZ0l9UAg.js} +305 -123
  353. package/dist/ssf/index.d.ts +4 -4
  354. package/dist/ssf/index.js +665 -224
  355. package/dist/{standard-webhooks-rbD7LS6h.d.ts → standard-webhooks-C-qX4mJW.d.ts} +7 -7
  356. package/dist/{standard-webhooks-DgFFD-Ga.js → standard-webhooks-D67a3nzk.js} +5 -5
  357. package/dist/{store-BDutJkDL.js → store-RNFvaJJv.js} +43 -29
  358. package/dist/{store-options-u0ycEe8s.js → store-options-Dil3lraY.js} +105 -15
  359. package/dist/stores-C0Kta5Ft.d.ts +59 -0
  360. package/dist/{stores-CGhM8BN_.js → stores-DxZWDXCs.js} +42 -5
  361. package/dist/{stream-CvdUS9V1.js → stream-CDvF0sJm.js} +5 -5
  362. package/dist/{stream-CeCMJmBB.d.ts → stream-ltuLdtTG.d.ts} +4 -3
  363. package/dist/{style-DiKWnAvn.js → style-DblOtSga.js} +1 -1
  364. package/dist/{style-Uao76wO7.js → style-Ds11Hmk4.js} +3 -1
  365. package/dist/{subject-settings-CkEwrw3W.js → subject-settings-8sH5HlII.js} +8 -4
  366. package/dist/{row-check-Dt35czLy.d.ts → subject-settings-vNW8qmUH.d.ts} +30 -18
  367. package/dist/supabase/index.d.ts +48 -37
  368. package/dist/supabase/index.js +6 -6
  369. package/dist/supabase/middleware.d.ts +19 -13
  370. package/dist/supabase/middleware.js +7 -7
  371. package/dist/{supabase-x5JtR2tc.js → supabase-BL1qJzzY.js} +82 -36
  372. package/dist/{supabase-By_frk3U.js → supabase-D39cuGPt.js} +3 -3
  373. package/dist/{supabase-hook-BMoEhZir.js → supabase-hook-B-yXnzUl.js} +1206 -286
  374. package/dist/supabase-hook-H-MtE9Wd.js +1 -0
  375. package/dist/supautils-BU-pAEpf.js +808 -0
  376. package/dist/{support-session-C6xJQYut.js → support-session-BsmPCbz8.js} +22 -22
  377. package/dist/svelte/PermissionBoundary.svelte +2 -6
  378. package/dist/svelte/Protected.svelte +2 -8
  379. package/dist/svelte/index.d.ts +9 -8
  380. package/dist/svelte/index.js +10 -9
  381. package/dist/svelte/runtime.d.ts +4 -4
  382. package/dist/svelte/runtime.js +4 -4
  383. package/dist/svelte/source.d.ts +9 -8
  384. package/dist/svelte/source.js +6 -5
  385. package/dist/sveltekit/index.d.ts +30 -12
  386. package/dist/sveltekit/index.js +2 -2
  387. package/dist/{ownership-DqaJNJPn.js → tables-DeMNEy6V.js} +1025 -1085
  388. package/dist/tanstack-start/index.d.ts +22 -10
  389. package/dist/tanstack-start/index.js +2 -2
  390. package/dist/{target-Bw37TFNA.js → target-qdEAnnhU.js} +6 -6
  391. package/dist/{tenancy-DN2QAx9z.js → tenancy-5d1zVBvK.js} +36 -21
  392. package/dist/terminal/index.d.ts +23 -14
  393. package/dist/terminal/index.js +17 -20
  394. package/dist/testing/core.d.ts +2 -0
  395. package/dist/testing/core.js +1 -0
  396. package/dist/testing/fixtures/index.d.ts +15 -0
  397. package/dist/testing/fixtures/index.js +831 -0
  398. package/dist/testing/index.d.ts +235 -285
  399. package/dist/testing/index.js +502 -927
  400. package/dist/testing/saas/index.d.ts +43 -27
  401. package/dist/testing/saas/index.js +2 -2
  402. package/dist/testing/saas/permissions.d.ts +1 -1
  403. package/dist/testing/saas/permissions.js +1 -1
  404. package/dist/text-diff-BtfSmdUo.js +444 -0
  405. package/dist/{thenable-yD7SabqG.js → thenable-BNSM1U2R.js} +12 -3
  406. package/dist/{time-DkWjdL98.js → time-nR1JesoH.js} +32 -8
  407. package/dist/{token-BLZcjQgt.js → token-DC9EQiet.js} +15 -13
  408. package/dist/{tool-refusal-CMLN5xhn.js → tool-refusal-Qpjs_W6M.js} +5 -2
  409. package/dist/trpc/index.d.ts +11 -8
  410. package/dist/trpc/index.js +15 -9
  411. package/dist/type-helpers-BIPIDa6a.d.ts +50 -0
  412. package/dist/{types-8RnwUAvE.d.ts → types-AMJ5qoU_.d.ts} +49 -30
  413. package/dist/{types-C_IiEs64.d.ts → types-B2mlGuhW.d.ts} +14 -11
  414. package/dist/{types-_WhUP7ud.d.ts → types-B4uqKDnp.d.ts} +25 -12
  415. package/dist/{types-CX7AvRqP.d.ts → types-BJk0BKRX.d.ts} +24 -14
  416. package/dist/types-B_d_g7T3.d.ts +262 -0
  417. package/dist/{types-BdtSDbBO.d.ts → types-B_tiYvk8.d.ts} +59 -32
  418. package/dist/{types-DqzsnlSA.js → types-CcUXciSj.js} +17 -5
  419. package/dist/{types-Dfv0aTER.d.ts → types-DC1Loeh3.d.ts} +449 -168
  420. package/dist/{types-lUlG3TVd.d.ts → types-DHKPcqzr.d.ts} +2 -2
  421. package/dist/{types-C791HFu9.d.ts → types-DjuMBNF9.d.ts} +68 -32
  422. package/dist/{types-C863OQiR.d.ts → types-HzqOtvsJ.d.ts} +23 -12
  423. package/dist/{types-Druu9wLM.d.ts → types-ZzRGoViD.d.ts} +77 -24
  424. package/dist/{types-BzzaHxt3.d.ts → types-ah9NlU6j.d.ts} +137 -48
  425. package/dist/{types-CVZSNocA.d.ts → types-djVzLlIV.d.ts} +31 -14
  426. package/dist/{types-BtHtcKMr.d.ts → types-yUuPR5Hy.d.ts} +47 -24
  427. package/dist/unplugin/index.d.ts +1 -1
  428. package/dist/unplugin/index.js +2 -2
  429. package/dist/usage-CYeXek0p.js +1 -0
  430. package/dist/{usage-SveTRTyr.js → usage-CxEzS4ey.js} +50 -26
  431. package/dist/{usage-CRVl9V3t.js → usage-ab0PdusX.js} +2 -2
  432. package/dist/{validation-error-ZfUHbKvf.js → validation-error-CYg2kJEw.js} +4 -1
  433. package/dist/{validation-error-DHUrAkku.d.ts → validation-error-YGg2mXyH.d.ts} +5 -2
  434. package/dist/{validity-CZ7-y0Cj.js → validity-Buc7w8E9.js} +13 -10
  435. package/dist/{verifier-DHuh-okk.js → verifier-DUV6pLqZ.js} +10 -4
  436. package/dist/{verify-BaAKx7t6.js → verify-DZeqoWu5.js} +417 -489
  437. package/dist/version-DMQ0dnN5.js +48 -0
  438. package/dist/version-DizhmD72.js +1 -0
  439. package/dist/{views-DTIIO-oQ.js → views-CD8wuL4Z.js} +19 -6
  440. package/dist/vocabulary-DEJ5j4mR.d.ts +70 -0
  441. package/dist/vue/index.d.ts +71 -21
  442. package/dist/vue/index.js +50 -13
  443. package/dist/{waiter-B986w1oK.d.ts → waiter-Bu9zAlE0.d.ts} +13 -10
  444. package/dist/{waiter-BGUtGYoU.js → waiter-aBLM63_f.js} +1 -1
  445. package/dist/{watch-vea54PRw.js → watch-Cx_WciLE.js} +8 -8
  446. package/dist/watch-DB42U1ib.js +1 -0
  447. package/dist/webmcp/index.d.ts +11 -11
  448. package/dist/webmcp/index.js +8 -5
  449. package/dist/{where-scope-C9vfEphl.js → where-scope-DlCdCM_8.js} +56 -30
  450. package/dist/{who-can-DWBAcaCQ.js → who-can-rI7dCR9Q.js} +23 -20
  451. package/dist/workflow/index.d.ts +3 -3
  452. package/dist/workflow/index.js +13 -13
  453. package/dist/workflow-sdk/index.d.ts +19 -13
  454. package/dist/workflow-sdk/index.js +6 -6
  455. package/dist/{wrap-gX61EtpB.js → wrap-B2wziJI_.js} +11 -5
  456. package/dist/{wrap-C5jC6sKI.d.ts → wrap-DlJE3gS_.d.ts} +8 -5
  457. package/package.json +25 -14
  458. package/schemas/catalog-v1.json +3 -0
  459. package/schemas/cli-result-v1.json +1 -0
  460. package/schemas/cloud-api-v1.json +152 -7
  461. package/schemas/connector-v1.json +8 -0
  462. package/schemas/supabase-claims-v1.json +5 -0
  463. package/schemas/supabase-manifest-v1.json +308 -75
  464. package/skills/permdock/SKILL.md +1 -0
  465. package/skills/permdock-agents/references/runtimes.md +3 -1
  466. package/skills/permdock-approvals/references/stores-and-resume.md +2 -1
  467. package/skills/permdock-credentials/references/tokens-keys-links.md +8 -6
  468. package/skills/permdock-data/references/queries-and-rls.md +6 -2
  469. package/skills/permdock-tenancy/SKILL.md +1 -1
  470. package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +2 -1
  471. package/skills/permdock-wire/references/adapters.md +28 -22
  472. package/skills/permdock-wire/references/policy-options.md +1 -0
  473. package/dist/catalog-BoWglDPI.js +0 -1
  474. package/dist/collect-D7eQDffE.js +0 -1
  475. package/dist/config-bs_kZeYq.js +0 -162
  476. package/dist/denied-text-CiFQNuMV.d.ts +0 -19
  477. package/dist/fields-OYG_JR78.js +0 -203
  478. package/dist/generate-CNU1pIOo.js +0 -171
  479. package/dist/headers-BIjfMaoC.js +0 -8
  480. package/dist/headers-CIbDTUTK.d.ts +0 -7
  481. package/dist/index-Cp_ilKi1.d.ts +0 -91
  482. package/dist/index-CueFnxQc.d.ts +0 -110
  483. package/dist/load-BxEtwlBS.js +0 -1
  484. package/dist/output-files-B3IZJksC.js +0 -1
  485. package/dist/package-root-Dk_ETdkp.js +0 -31
  486. package/dist/parse-Cxq0WxrA.js +0 -53
  487. package/dist/parse-local-manifest-5ODwqu8b.d.ts +0 -10
  488. package/dist/parse-local-manifest-CVSs6J9I.js +0 -34
  489. package/dist/peer-C8swJ2GH.js +0 -50
  490. package/dist/policies-DP2nqRoF.js +0 -295
  491. package/dist/powersync-BkWWCS1K.js +0 -538
  492. package/dist/powersync-MMJ2mI2q.js +0 -1
  493. package/dist/problem-details-B45V5d2b.d.ts +0 -7
  494. package/dist/prompt-DfZLJLIn.js +0 -32
  495. package/dist/protected-RFGpakN9.d.ts +0 -38
  496. package/dist/pull-CvpINcMK.js +0 -1
  497. package/dist/run-DDwUaJDU.js +0 -1
  498. package/dist/sources-Xc4zkszI.d.ts +0 -190
  499. package/dist/stores-BUGNbJTt.d.ts +0 -30
  500. package/dist/supabase-hook-CCw5m35C.js +0 -1
  501. package/dist/supautils-B6HYL9eL.js +0 -91
  502. package/dist/text-diff-BQcUapOb.js +0 -15
  503. package/dist/types-B3_ooZgZ.d.ts +0 -172
  504. package/dist/usage-CZpSQP6L.js +0 -1
  505. package/dist/version-CEbQ5UeM.js +0 -18
  506. package/dist/version-DXkYUISx.js +0 -1
  507. package/dist/watch--ovlPOc0.js +0 -1
@@ -0,0 +1,1028 @@
1
+ import { r as isRecord, t as compact } from "./compact-CAf557ZB.js";
2
+ import { n as freezeDeep } from "./freeze-jjan0lCv.js";
3
+ import { d as isoNow } from "./time-nR1JesoH.js";
4
+ import { o as quoteSqlIdent, u as sqlRows } from "./sql-0WjxIp9g.js";
5
+ //#region src/scim/types.ts
6
+ const SCIM_CONTENT_TYPE = "application/scim+json";
7
+ const USER_SCHEMA = "urn:ietf:params:scim:schemas:core:2.0:User";
8
+ const GROUP_SCHEMA = "urn:ietf:params:scim:schemas:core:2.0:Group";
9
+ const LIST_SCHEMA = "urn:ietf:params:scim:api:messages:2.0:ListResponse";
10
+ const ERROR_SCHEMA = "urn:ietf:params:scim:api:messages:2.0:Error";
11
+ const PATCH_SCHEMA = "urn:ietf:params:scim:api:messages:2.0:PatchOp";
12
+ /** The RFC 7643 section 3.3 Group extension that carries PermDock roles. */
13
+ const ROLES_EXTENSION = "urn:ietf:params:scim:schemas:extension:permdock:2.0:Group";
14
+ /**
15
+ * The extension that carries the application's own data (`x`) on a User or a
16
+ * Group.
17
+ */
18
+ const APP_DATA_EXTENSION = "urn:ietf:params:scim:schemas:extension:permdock:2.0:AppData";
19
+ var DirectoryUniquenessError = class extends Error {
20
+ name = "DirectoryUniquenessError";
21
+ code = "uniqueness";
22
+ constructor(message = "uniqueness") {
23
+ super(message);
24
+ }
25
+ };
26
+ var DirectoryNotFoundError = class extends Error {
27
+ name = "DirectoryNotFoundError";
28
+ code = "not-found";
29
+ constructor(message = "not found") {
30
+ super(message);
31
+ }
32
+ };
33
+ function isNamedError(error, name, code) {
34
+ return error instanceof Error && error.name === name && Reflect.get(error, "code") === code;
35
+ }
36
+ /**
37
+ * Matches by `name` and `code`, so an error from another copy of the module
38
+ * still maps.
39
+ */
40
+ function isDirectoryUniquenessError(error) {
41
+ return isNamedError(error, "DirectoryUniquenessError", "uniqueness");
42
+ }
43
+ /**
44
+ * Matches by `name` and `code`, so an error from another copy of the module
45
+ * still maps.
46
+ */
47
+ function isDirectoryNotFoundError(error) {
48
+ return isNamedError(error, "DirectoryNotFoundError", "not-found");
49
+ }
50
+ //#endregion
51
+ //#region src/scim/filter.ts
52
+ const COMPARE = /* @__PURE__ */ new Set([
53
+ "eq",
54
+ "ne",
55
+ "co",
56
+ "sw"
57
+ ]);
58
+ function skipSpace(input, index) {
59
+ let cursor = index;
60
+ while (cursor < input.length && input[cursor] === " ") cursor += 1;
61
+ return cursor;
62
+ }
63
+ function readIdent(input, index) {
64
+ const start = skipSpace(input, index);
65
+ if (!/[A-Za-z]/u.test(input[start] ?? "")) return;
66
+ let cursor = start;
67
+ while (cursor < input.length && /[A-Za-z0-9._]/u.test(input[cursor] ?? "")) cursor += 1;
68
+ return {
69
+ value: input.slice(start, cursor),
70
+ next: cursor
71
+ };
72
+ }
73
+ function readString(input, index) {
74
+ const start = skipSpace(input, index);
75
+ if (input[start] !== "\"") return;
76
+ let cursor = start + 1;
77
+ let value = "";
78
+ while (cursor < input.length) {
79
+ const char = input[cursor];
80
+ if (char === "\\") {
81
+ value += input[cursor + 1] ?? "";
82
+ cursor += 2;
83
+ continue;
84
+ }
85
+ if (char === "\"") return {
86
+ value,
87
+ next: cursor + 1
88
+ };
89
+ value += char;
90
+ cursor += 1;
91
+ }
92
+ }
93
+ function readLiteral(input, index) {
94
+ const quoted = readString(input, index);
95
+ if (quoted !== void 0) return quoted;
96
+ const ident = readIdent(input, index);
97
+ if (ident === void 0) return;
98
+ if (ident.value.toLowerCase() === "true") return {
99
+ value: true,
100
+ next: ident.next
101
+ };
102
+ if (ident.value.toLowerCase() === "false") return {
103
+ value: false,
104
+ next: ident.next
105
+ };
106
+ return {
107
+ value: ident.value,
108
+ next: ident.next
109
+ };
110
+ }
111
+ function parsePrimary(input, index) {
112
+ const start = skipSpace(input, index);
113
+ if (input[start] === "(") {
114
+ const inner = parseOr(input, start + 1);
115
+ if (inner === void 0) return;
116
+ const close = skipSpace(input, inner.next);
117
+ if (input[close] !== ")") return;
118
+ return {
119
+ filter: inner.filter,
120
+ next: close + 1
121
+ };
122
+ }
123
+ const attribute = readIdent(input, start);
124
+ if (attribute === void 0) return;
125
+ const opToken = readIdent(input, attribute.next);
126
+ if (opToken === void 0) return;
127
+ const op = opToken.value.toLowerCase();
128
+ if (op === "pr") return {
129
+ filter: {
130
+ op: "pr",
131
+ attribute: attribute.value
132
+ },
133
+ next: opToken.next
134
+ };
135
+ if (!COMPARE.has(op)) return;
136
+ const value = readLiteral(input, opToken.next);
137
+ if (value === void 0) return;
138
+ return {
139
+ filter: {
140
+ op,
141
+ attribute: attribute.value,
142
+ value: value.value
143
+ },
144
+ next: value.next
145
+ };
146
+ }
147
+ function parseAnd(input, index) {
148
+ const first = parsePrimary(input, index);
149
+ if (first === void 0) return;
150
+ const filters = [first.filter];
151
+ let cursor = first.next;
152
+ for (;;) {
153
+ const nextOp = readIdent(input, cursor);
154
+ if (nextOp?.value.toLowerCase() !== "and") break;
155
+ const next = parsePrimary(input, nextOp.next);
156
+ if (next === void 0) return;
157
+ filters.push(next.filter);
158
+ cursor = next.next;
159
+ }
160
+ if (filters.length === 1) return {
161
+ filter: first.filter,
162
+ next: cursor
163
+ };
164
+ return {
165
+ filter: {
166
+ op: "and",
167
+ filters
168
+ },
169
+ next: cursor
170
+ };
171
+ }
172
+ function parseOr(input, index) {
173
+ const first = parseAnd(input, index);
174
+ if (first === void 0) return;
175
+ const filters = [first.filter];
176
+ let cursor = first.next;
177
+ for (;;) {
178
+ const nextOp = readIdent(input, cursor);
179
+ if (nextOp?.value.toLowerCase() !== "or") break;
180
+ const next = parseAnd(input, nextOp.next);
181
+ if (next === void 0) return;
182
+ filters.push(next.filter);
183
+ cursor = next.next;
184
+ }
185
+ if (filters.length === 1) return {
186
+ filter: first.filter,
187
+ next: cursor
188
+ };
189
+ return {
190
+ filter: {
191
+ op: "or",
192
+ filters
193
+ },
194
+ next: cursor
195
+ };
196
+ }
197
+ function parseScimFilter(input) {
198
+ const trimmed = input.trim();
199
+ if (trimmed === "") return;
200
+ const parsed = parseOr(trimmed, 0);
201
+ if (parsed === void 0) return;
202
+ if (skipSpace(trimmed, parsed.next) !== trimmed.length) return;
203
+ return parsed.filter;
204
+ }
205
+ function readAttribute(target, attribute) {
206
+ if (attribute === "members.value") {
207
+ const members = target["members"];
208
+ if (!Array.isArray(members)) return;
209
+ return members.map((member) => {
210
+ if (member !== null && typeof member === "object" && "value" in member) return member.value;
211
+ });
212
+ }
213
+ const parts = attribute.split(".");
214
+ let current = target;
215
+ for (const part of parts) {
216
+ if (current === null || typeof current !== "object") return;
217
+ current = current[part];
218
+ }
219
+ return current;
220
+ }
221
+ function asString(value) {
222
+ if (typeof value === "boolean") return value ? "true" : "false";
223
+ return String(value);
224
+ }
225
+ function matchCompare(actual, op, expected) {
226
+ if (Array.isArray(actual)) return actual.some((item) => matchCompare(item, op, expected));
227
+ if (actual === void 0 || actual === null) return op === "ne";
228
+ if (typeof expected === "boolean" || typeof actual === "boolean") {
229
+ const left = asString(actual).toLowerCase();
230
+ const right = asString(expected).toLowerCase();
231
+ return op === "eq" ? left === right : op === "ne" ? left !== right : false;
232
+ }
233
+ const left = asString(actual);
234
+ const right = asString(expected);
235
+ switch (op) {
236
+ case "eq": return left === right;
237
+ case "ne": return left !== right;
238
+ case "co": return left.includes(right);
239
+ case "sw": return left.startsWith(right);
240
+ default: return op;
241
+ }
242
+ }
243
+ /**
244
+ * RFC 7644 §3.4.2.2: `pr` needs a non-empty value; a multi-valued one needs an
245
+ * item.
246
+ */
247
+ function present(value) {
248
+ if (Array.isArray(value)) return value.some(present);
249
+ return value !== void 0 && value !== null && value !== "";
250
+ }
251
+ function matchFilter(target, filter) {
252
+ if (filter === void 0) return true;
253
+ const record = target;
254
+ switch (filter.op) {
255
+ case "and": return filter.filters.every((item) => matchFilter(target, item));
256
+ case "or": return filter.filters.some((item) => matchFilter(target, item));
257
+ case "pr": return present(readAttribute(record, filter.attribute));
258
+ case "eq":
259
+ case "ne":
260
+ case "co":
261
+ case "sw": return matchCompare(readAttribute(record, filter.attribute), filter.op, filter.value);
262
+ default: return filter;
263
+ }
264
+ }
265
+ const SUPPORTED_FILTER_ATTRIBUTES = /* @__PURE__ */ new Set([
266
+ "id",
267
+ "userName",
268
+ "externalId",
269
+ "active",
270
+ "displayName",
271
+ "members.value"
272
+ ]);
273
+ function filterSupported(filter) {
274
+ switch (filter.op) {
275
+ case "and":
276
+ case "or": return filter.filters.every(filterSupported);
277
+ case "pr":
278
+ case "eq":
279
+ case "ne":
280
+ case "co":
281
+ case "sw": return SUPPORTED_FILTER_ATTRIBUTES.has(filter.attribute);
282
+ default: return filter;
283
+ }
284
+ }
285
+ //#endregion
286
+ //#region src/scim/store.ts
287
+ const DEFAULT_COUNT$1 = 100;
288
+ function now() {
289
+ return isoNow();
290
+ }
291
+ function createdAt(at, ...candidates) {
292
+ return candidates.find((value) => value !== void 0 && value !== "") ?? at;
293
+ }
294
+ function randomId$1(prefix) {
295
+ const bytes = /* @__PURE__ */ new Uint8Array(8);
296
+ crypto.getRandomValues(bytes);
297
+ let hex = "";
298
+ for (const byte of bytes) hex += byte.toString(16).padStart(2, "0");
299
+ return `${prefix}${hex}`;
300
+ }
301
+ function directoryKey(tenant, id) {
302
+ return `${tenant}\0${id}`;
303
+ }
304
+ function asError(error) {
305
+ return error instanceof Error ? error : new Error(String(error));
306
+ }
307
+ function pageOf(items, page) {
308
+ const count = page.count ?? DEFAULT_COUNT$1;
309
+ let start = 0;
310
+ if (page.cursor !== void 0 && page.cursor !== "") {
311
+ const decoded = Math.trunc(Number(page.cursor));
312
+ start = Number.isFinite(decoded) && decoded > 0 ? decoded : 0;
313
+ } else if (page.startIndex !== void 0 && page.startIndex > 0) start = page.startIndex - 1;
314
+ const slice = items.slice(start, start + count);
315
+ const nextIndex = start + slice.length;
316
+ return compact({
317
+ Resources: slice,
318
+ totalResults: items.length,
319
+ startIndex: start + 1,
320
+ itemsPerPage: slice.length,
321
+ nextCursor: nextIndex < items.length ? String(nextIndex) : void 0
322
+ });
323
+ }
324
+ function emailsOf(value) {
325
+ if (!Array.isArray(value)) return;
326
+ return value.flatMap((item) => {
327
+ if (item === null || typeof item !== "object") return [];
328
+ const record = item;
329
+ if (typeof record.value !== "string") return [];
330
+ return [compact({
331
+ value: record.value,
332
+ primary: typeof record.primary === "boolean" ? record.primary : void 0,
333
+ type: typeof record.type === "string" ? record.type : void 0
334
+ })];
335
+ });
336
+ }
337
+ function membersOf(value) {
338
+ if (!Array.isArray(value)) return [];
339
+ return value.flatMap((item) => {
340
+ if (item === null || typeof item !== "object") return [];
341
+ const record = item;
342
+ return typeof record.value === "string" ? [{ value: record.value }] : [];
343
+ });
344
+ }
345
+ function rolesOf(value) {
346
+ if (!Array.isArray(value)) return;
347
+ return value.filter((item) => typeof item === "string");
348
+ }
349
+ function memberValues(value) {
350
+ return membersOf(value).map((member) => member.value);
351
+ }
352
+ function applyUserOp(user, op) {
353
+ const path = op.path ?? "";
354
+ if (path === "active" && typeof op.value === "boolean") return {
355
+ ...user,
356
+ active: op.value
357
+ };
358
+ if (path === "userName" && typeof op.value === "string") return {
359
+ ...user,
360
+ userName: op.value
361
+ };
362
+ if (path === "externalId") return compact({
363
+ ...user,
364
+ externalId: typeof op.value === "string" ? op.value : void 0
365
+ });
366
+ if (path === "emails") return compact({
367
+ ...user,
368
+ emails: emailsOf(op.value)
369
+ });
370
+ return user;
371
+ }
372
+ function applyGroupOp(group, op) {
373
+ const path = op.path ?? "";
374
+ if (path === "displayName" && typeof op.value === "string") return {
375
+ ...group,
376
+ displayName: op.value
377
+ };
378
+ if (path === "externalId") return compact({
379
+ ...group,
380
+ externalId: typeof op.value === "string" ? op.value : void 0
381
+ });
382
+ if (path === "roles") return compact({
383
+ ...group,
384
+ roles: rolesOf(op.value)
385
+ });
386
+ if (path !== "members") return group;
387
+ const incoming = memberValues(op.value);
388
+ const current = group.members.map((member) => member.value);
389
+ if (op.op === "replace") return {
390
+ ...group,
391
+ members: incoming.map((value) => ({ value }))
392
+ };
393
+ if (op.op === "add") {
394
+ const next = [...current];
395
+ for (const value of incoming) if (!next.includes(value)) next.push(value);
396
+ return {
397
+ ...group,
398
+ members: next.map((value) => ({ value }))
399
+ };
400
+ }
401
+ return {
402
+ ...group,
403
+ members: current.filter((value) => !incoming.includes(value)).map((value) => ({ value }))
404
+ };
405
+ }
406
+ function stampUser(user, created) {
407
+ const at = now();
408
+ return freezeDeep({
409
+ ...user,
410
+ meta: compact({
411
+ created: createdAt(at, created, user.meta.created),
412
+ lastModified: at,
413
+ resourceType: "User",
414
+ location: user.meta.location
415
+ })
416
+ });
417
+ }
418
+ function stampGroup(group, created) {
419
+ const at = now();
420
+ return freezeDeep({
421
+ ...group,
422
+ meta: compact({
423
+ created: createdAt(at, created, group.meta.created),
424
+ lastModified: at,
425
+ resourceType: "Group",
426
+ location: group.meta.location
427
+ })
428
+ });
429
+ }
430
+ function memoryDirectoryStore() {
431
+ const users = /* @__PURE__ */ new Map();
432
+ const groups = /* @__PURE__ */ new Map();
433
+ function usersIn(tenant) {
434
+ const found = [];
435
+ for (const [key, user] of users) if (key.startsWith(`${tenant}\0`)) found.push(user);
436
+ return found;
437
+ }
438
+ function groupsIn(tenant) {
439
+ const found = [];
440
+ for (const [key, group] of groups) if (key.startsWith(`${tenant}\0`)) found.push(group);
441
+ return found;
442
+ }
443
+ function assertUserUnique(tenant, user, ignoreId) {
444
+ for (const existing of usersIn(tenant)) {
445
+ if (existing.id === ignoreId) continue;
446
+ if (existing.userName === user.userName) throw new DirectoryUniquenessError("userName");
447
+ if (user.externalId !== void 0 && existing.externalId === user.externalId) throw new DirectoryUniquenessError("externalId");
448
+ }
449
+ }
450
+ function assertGroupUnique(tenant, group, ignoreId) {
451
+ for (const existing of groupsIn(tenant)) {
452
+ if (existing.id === ignoreId) continue;
453
+ if (group.externalId !== void 0 && existing.externalId === group.externalId) throw new DirectoryUniquenessError("externalId");
454
+ }
455
+ }
456
+ return {
457
+ getUser(tenant, id) {
458
+ return Promise.resolve(users.get(directoryKey(tenant, id)) ?? null);
459
+ },
460
+ findUsers(tenant, filter, page) {
461
+ const matched = usersIn(tenant).filter((user) => matchFilter(user, filter));
462
+ return Promise.resolve(pageOf(matched, page));
463
+ },
464
+ putUser(tenant, user) {
465
+ try {
466
+ const id = user.id === "" ? randomId$1("u_") : user.id;
467
+ const existing = users.get(directoryKey(tenant, id));
468
+ const next = stampUser({
469
+ ...user,
470
+ id
471
+ }, existing?.meta.created);
472
+ assertUserUnique(tenant, next, id);
473
+ users.set(directoryKey(tenant, id), next);
474
+ return Promise.resolve(next);
475
+ } catch (error) {
476
+ return Promise.reject(asError(error));
477
+ }
478
+ },
479
+ patchUser(tenant, id, ops) {
480
+ try {
481
+ const existing = users.get(directoryKey(tenant, id));
482
+ if (existing === void 0) throw new DirectoryNotFoundError();
483
+ let next = existing;
484
+ for (const op of ops) next = applyUserOp(next, op);
485
+ next = stampUser(next, existing.meta.created);
486
+ assertUserUnique(tenant, next, id);
487
+ users.set(directoryKey(tenant, id), next);
488
+ return Promise.resolve(next);
489
+ } catch (error) {
490
+ return Promise.reject(asError(error));
491
+ }
492
+ },
493
+ deleteUser(tenant, id) {
494
+ if (!users.delete(directoryKey(tenant, id))) return Promise.reject(new DirectoryNotFoundError());
495
+ for (const group of groupsIn(tenant)) {
496
+ if (!group.members.some((member) => member.value === id)) continue;
497
+ groups.set(directoryKey(tenant, group.id), stampGroup({
498
+ ...group,
499
+ members: group.members.filter((member) => member.value !== id)
500
+ }, group.meta.created));
501
+ }
502
+ return Promise.resolve();
503
+ },
504
+ getGroup(tenant, id) {
505
+ return Promise.resolve(groups.get(directoryKey(tenant, id)) ?? null);
506
+ },
507
+ findGroups(tenant, filter, page) {
508
+ const matched = groupsIn(tenant).filter((group) => matchFilter(group, filter));
509
+ return Promise.resolve(pageOf(matched, page));
510
+ },
511
+ putGroup(tenant, group) {
512
+ try {
513
+ const id = group.id === "" ? randomId$1("g_") : group.id;
514
+ const existing = groups.get(directoryKey(tenant, id));
515
+ const next = stampGroup({
516
+ ...group,
517
+ id,
518
+ members: group.members
519
+ }, existing?.meta.created);
520
+ assertGroupUnique(tenant, next, id);
521
+ groups.set(directoryKey(tenant, id), next);
522
+ return Promise.resolve(next);
523
+ } catch (error) {
524
+ return Promise.reject(asError(error));
525
+ }
526
+ },
527
+ patchGroup(tenant, id, ops) {
528
+ try {
529
+ const existing = groups.get(directoryKey(tenant, id));
530
+ if (existing === void 0) throw new DirectoryNotFoundError();
531
+ let next = existing;
532
+ for (const op of ops) next = applyGroupOp(next, op);
533
+ next = stampGroup(next, existing.meta.created);
534
+ assertGroupUnique(tenant, next, id);
535
+ groups.set(directoryKey(tenant, id), next);
536
+ return Promise.resolve(next);
537
+ } catch (error) {
538
+ return Promise.reject(asError(error));
539
+ }
540
+ },
541
+ deleteGroup(tenant, id) {
542
+ if (!groups.delete(directoryKey(tenant, id))) return Promise.reject(new DirectoryNotFoundError());
543
+ return Promise.resolve();
544
+ },
545
+ groupsFor(tenant, userId) {
546
+ return Promise.resolve(groupsIn(tenant).filter((group) => group.members.some((member) => member.value === userId)));
547
+ }
548
+ };
549
+ }
550
+ //#endregion
551
+ //#region src/scim/postgres-store.ts
552
+ /**
553
+ * The tables `permdock scim generate` writes; their names are the contract this
554
+ * store reads.
555
+ */
556
+ const SCIM_TABLES = {
557
+ users: "scim_users",
558
+ groups: "scim_groups",
559
+ members: "scim_group_members"
560
+ };
561
+ /**
562
+ * The constraints whose violation is a SCIM `409 uniqueness`, by the attribute
563
+ * they cover.
564
+ */
565
+ const SCIM_UNIQUE = {
566
+ userName: "scim_users_user_name_key",
567
+ userExternalId: "scim_users_external_id_key",
568
+ groupExternalId: "scim_groups_external_id_key"
569
+ };
570
+ const SCIM_SCHEMA = "permdock";
571
+ const DEFAULT_COUNT = 100;
572
+ /** A PATCH re-reads and retries when another write changed the row in between. */
573
+ const PATCH_ATTEMPTS = 8;
574
+ const iso = (column) => `to_char(${column} at time zone 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"')`;
575
+ function userJson(alias) {
576
+ return `jsonb_build_object(
577
+ 'id', ${alias}.id, 'userName', ${alias}.user_name, 'externalId', ${alias}.external_id,
578
+ 'active', ${alias}.active, 'emails', ${alias}.emails, 'x', ${alias}.x,
579
+ 'created', ${iso(`${alias}.created_at`)}, 'lastModified', ${iso(`${alias}.updated_at`)},
580
+ 'revision', ${alias}.revision)`;
581
+ }
582
+ function groupJson(alias, members) {
583
+ return `jsonb_build_object(
584
+ 'id', ${alias}.id, 'displayName', ${alias}.display_name, 'externalId', ${alias}.external_id,
585
+ 'roles', to_jsonb(${alias}.roles), 'x', ${alias}.x, 'members', ${members},
586
+ 'created', ${iso(`${alias}.created_at`)}, 'lastModified', ${iso(`${alias}.updated_at`)},
587
+ 'revision', ${alias}.revision)`;
588
+ }
589
+ function membersOfGroup(tables, alias) {
590
+ return `coalesce((select jsonb_agg(m.user_id order by m.position) from ${tables.members} m
591
+ where m.tenant = ${alias}.tenant and m.group_id = ${alias}.id), '[]'::jsonb)`;
592
+ }
593
+ function parsed(value) {
594
+ return typeof value === "string" ? JSON.parse(value) : value;
595
+ }
596
+ function text(value) {
597
+ return typeof value === "string" ? value : void 0;
598
+ }
599
+ function appData(value) {
600
+ return isRecord(value) ? value : void 0;
601
+ }
602
+ function storedUser(value) {
603
+ const row = parsed(value);
604
+ if (!isRecord(row)) throw new Error("PermDock: postgresDirectoryStore read a malformed user");
605
+ return {
606
+ revision: Number(row["revision"]),
607
+ resource: compact({
608
+ id: String(row["id"]),
609
+ userName: String(row["userName"]),
610
+ externalId: text(row["externalId"]),
611
+ active: row["active"] === true,
612
+ emails: emailsOf(row["emails"]),
613
+ x: appData(row["x"]),
614
+ meta: {
615
+ created: String(row["created"]),
616
+ lastModified: String(row["lastModified"]),
617
+ resourceType: "User"
618
+ }
619
+ })
620
+ };
621
+ }
622
+ function storedGroup(value) {
623
+ const row = parsed(value);
624
+ if (!isRecord(row)) throw new Error("PermDock: postgresDirectoryStore read a malformed group");
625
+ const members = Array.isArray(row["members"]) ? row["members"] : [];
626
+ const roles = row["roles"];
627
+ return {
628
+ revision: Number(row["revision"]),
629
+ resource: compact({
630
+ id: String(row["id"]),
631
+ displayName: String(row["displayName"]),
632
+ externalId: text(row["externalId"]),
633
+ members: members.flatMap((member) => typeof member === "string" ? [{ value: member }] : []),
634
+ roles: Array.isArray(roles) ? roles.filter((role) => typeof role === "string") : void 0,
635
+ x: appData(row["x"]),
636
+ meta: {
637
+ created: String(row["created"]),
638
+ lastModified: String(row["lastModified"]),
639
+ resourceType: "Group"
640
+ }
641
+ })
642
+ };
643
+ }
644
+ /**
645
+ * A stored or IdP-sent `meta.created` the database can read; anything else is
646
+ * "now".
647
+ */
648
+ function createdParam(created) {
649
+ return created !== "" && !Number.isNaN(Date.parse(created)) ? created : null;
650
+ }
651
+ function json(value) {
652
+ return value === void 0 ? null : JSON.stringify(value);
653
+ }
654
+ function randomId(prefix) {
655
+ const bytes = /* @__PURE__ */ new Uint8Array(8);
656
+ crypto.getRandomValues(bytes);
657
+ let hex = "";
658
+ for (const byte of bytes) hex += byte.toString(16).padStart(2, "0");
659
+ return `${prefix}${hex}`;
660
+ }
661
+ /** Each value once, first occurrence first: one member row per user. */
662
+ function uniqueMembers(group) {
663
+ return [...new Set(group.members.map((member) => member.value))];
664
+ }
665
+ function constraintOf(error) {
666
+ for (const key of [
667
+ "constraint",
668
+ "constraint_name",
669
+ "detail",
670
+ "message"
671
+ ]) {
672
+ const value = error[key];
673
+ if (typeof value === "string" && value !== "") return value;
674
+ }
675
+ return "";
676
+ }
677
+ /**
678
+ * A unique violation (`23505`) as `DirectoryUniquenessError`; any other error
679
+ * is rethrown.
680
+ */
681
+ function uniqueness(error, kind) {
682
+ if (isRecord(error) && error["code"] === "23505") {
683
+ const constraint = constraintOf(error);
684
+ throw new DirectoryUniquenessError(kind === "user" && (constraint.includes(SCIM_UNIQUE.userName) || constraint.includes("user_name")) ? "userName" : "externalId");
685
+ }
686
+ throw error;
687
+ }
688
+ const COLUMNS = {
689
+ user: {
690
+ id: "u.id",
691
+ userName: "u.user_name",
692
+ externalId: "u.external_id",
693
+ active: "u.active::text"
694
+ },
695
+ group: {
696
+ id: "g.id",
697
+ displayName: "g.display_name",
698
+ externalId: "g.external_id"
699
+ }
700
+ };
701
+ function asText(value) {
702
+ return typeof value === "boolean" ? String(value) : value;
703
+ }
704
+ /**
705
+ * The SQL twin of `matchFilter`: a missing attribute matches only `ne`, and
706
+ * booleans compare case-insensitively and only with `eq` / `ne`.
707
+ */
708
+ function compare(column, op, value, bind, caseless) {
709
+ if (caseless && (op === "co" || op === "sw")) return "false";
710
+ const left = caseless ? `lower(${column})` : column;
711
+ const right = bind(caseless ? asText(value).toLowerCase() : value);
712
+ switch (op) {
713
+ case "eq": return `${left} = ${right}`;
714
+ case "ne": return `${left} is distinct from ${right}`;
715
+ case "co": return `strpos(${left}, ${right}) > 0`;
716
+ case "sw": return `starts_with(${left}, ${right})`;
717
+ default: return op;
718
+ }
719
+ }
720
+ function compileFilter(filter, kind, tables, bind) {
721
+ switch (filter.op) {
722
+ case "and":
723
+ case "or": return `(${filter.filters.map((item) => compileFilter(item, kind, tables, bind)).join(` ${filter.op} `)})`;
724
+ case "pr":
725
+ case "eq":
726
+ case "ne":
727
+ case "co":
728
+ case "sw": {
729
+ if (filter.attribute === "members.value") {
730
+ if (kind !== "group") return filter.op === "ne" ? "true" : "false";
731
+ const member = filter.op === "pr" ? "true" : compare("m.user_id", filter.op, filter.value, bind, false);
732
+ return `exists (select 1 from ${tables.members} m where m.tenant = g.tenant and m.group_id = g.id and ${member})`;
733
+ }
734
+ const column = COLUMNS[kind][filter.attribute];
735
+ if (column === void 0) return filter.op === "ne" ? "true" : "false";
736
+ if (filter.op === "pr") return `coalesce(${column}, '') <> ''`;
737
+ const caseless = typeof filter.value === "boolean" || filter.attribute === "active";
738
+ return compare(column, filter.op, filter.value, bind, caseless);
739
+ }
740
+ default: return filter;
741
+ }
742
+ }
743
+ function where(tenant, filter, kind, tables) {
744
+ const params = [tenant];
745
+ const bind = (value) => {
746
+ params.push(value);
747
+ return `$${String(params.length)}`;
748
+ };
749
+ return {
750
+ sql: `${kind === "group" ? "g" : "u"}.tenant = $1 and ${filter === void 0 ? "true" : compileFilter(filter, kind, tables, bind)}`,
751
+ params
752
+ };
753
+ }
754
+ /** A non-negative safe integer from `value`, or `fallback`. */
755
+ function wholeOr(value, fallback) {
756
+ const whole = value === void 0 ? NaN : Math.trunc(value);
757
+ return Number.isSafeInteger(whole) && whole >= 0 ? whole : fallback;
758
+ }
759
+ function window(page) {
760
+ const count = page.count !== void 0 && page.count < 0 ? 0 : wholeOr(page.count, DEFAULT_COUNT);
761
+ if (page.cursor !== void 0 && page.cursor !== "") return {
762
+ offset: wholeOr(Number(page.cursor), 0),
763
+ count
764
+ };
765
+ return {
766
+ offset: Math.max(0, wholeOr(page.startIndex, 1) - 1),
767
+ count
768
+ };
769
+ }
770
+ function pageResult(items, total, offset) {
771
+ const next = offset + items.length;
772
+ return compact({
773
+ Resources: items,
774
+ totalResults: total,
775
+ startIndex: offset + 1,
776
+ itemsPerPage: items.length,
777
+ nextCursor: next < total ? String(next) : void 0
778
+ });
779
+ }
780
+ function userParams(tenant, user, createdOrRevision, now) {
781
+ return [
782
+ tenant,
783
+ user.id,
784
+ user.userName,
785
+ user.externalId ?? null,
786
+ user.active,
787
+ json(user.emails),
788
+ json(user.x),
789
+ createdOrRevision,
790
+ now
791
+ ];
792
+ }
793
+ function groupParams(tenant, group, createdOrRevision, now) {
794
+ return [
795
+ tenant,
796
+ group.id,
797
+ group.displayName,
798
+ group.externalId ?? null,
799
+ group.roles === void 0 ? null : [...group.roles],
800
+ json(group.x),
801
+ createdOrRevision,
802
+ now,
803
+ uniqueMembers(group)
804
+ ];
805
+ }
806
+ /**
807
+ * Reads the row, applies the operations and writes only if no other write
808
+ * landed in between; `write` answers `null` then.
809
+ */
810
+ async function patch(read, ops, step, write, label) {
811
+ for (let attempt = 0; attempt < PATCH_ATTEMPTS; attempt += 1) {
812
+ const current = await read();
813
+ if (current === null) throw new DirectoryNotFoundError();
814
+ let next = current.resource;
815
+ for (const op of ops) next = step(next, op);
816
+ const written = await write(next, current.revision);
817
+ if (written !== null) return written;
818
+ }
819
+ throw new Error(`PermDock: postgresDirectoryStore: ${label} kept changing during a PATCH`);
820
+ }
821
+ function statements(tables) {
822
+ const upsertUser = `insert into ${tables.users} as u
823
+ (tenant, id, user_name, external_id, active, emails, x, created_at, updated_at)
824
+ values ($1, $2, $3, $4, $5, $6::jsonb, $7::jsonb, coalesce($8::timestamptz, $9::timestamptz), $9::timestamptz)
825
+ on conflict (tenant, id) do update set
826
+ user_name = excluded.user_name, external_id = excluded.external_id, active = excluded.active,
827
+ emails = excluded.emails, x = excluded.x, updated_at = excluded.updated_at, revision = u.revision + 1
828
+ returning ${userJson("u")} as resource`;
829
+ const updateUser = `update ${tables.users} as u set
830
+ user_name = $3, external_id = $4, active = $5, emails = $6::jsonb, x = $7::jsonb,
831
+ updated_at = $9::timestamptz, revision = u.revision + 1
832
+ where u.tenant = $1 and u.id = $2 and u.revision = $8
833
+ returning ${userJson("u")} as resource`;
834
+ const members = `dropped as (
835
+ delete from ${tables.members} m using g
836
+ where m.tenant = g.tenant and m.group_id = g.id and not (m.user_id = any($9::text[]))
837
+ ),
838
+ kept as (
839
+ insert into ${tables.members} (tenant, group_id, user_id, position)
840
+ select g.tenant, g.id, v.user_id, v.position::integer
841
+ from g cross join unnest($9::text[]) with ordinality as v(user_id, position)
842
+ on conflict (tenant, group_id, user_id) do update set position = excluded.position
843
+ )
844
+ select ${groupJson("g", "to_jsonb($9::text[])")} as resource from g`;
845
+ const upsertGroup = `with g as (
846
+ insert into ${tables.groups} as t
847
+ (tenant, id, display_name, external_id, roles, x, created_at, updated_at)
848
+ values ($1, $2, $3, $4, $5::text[], $6::jsonb, coalesce($7::timestamptz, $8::timestamptz), $8::timestamptz)
849
+ on conflict (tenant, id) do update set
850
+ display_name = excluded.display_name, external_id = excluded.external_id, roles = excluded.roles,
851
+ x = excluded.x, updated_at = excluded.updated_at, revision = t.revision + 1
852
+ returning t.*
853
+ ),
854
+ ${members}`;
855
+ const updateGroup = `with g as (
856
+ update ${tables.groups} as t set
857
+ display_name = $3, external_id = $4, roles = $5::text[], x = $6::jsonb,
858
+ updated_at = $8::timestamptz, revision = t.revision + 1
859
+ where t.tenant = $1 and t.id = $2 and t.revision = $7
860
+ returning t.*
861
+ ),
862
+ ${members}`;
863
+ return {
864
+ getUser: `select ${userJson("u")} as resource from ${tables.users} u where u.tenant = $1 and u.id = $2`,
865
+ getGroup: `select ${groupJson("g", membersOfGroup(tables, "g"))} as resource
866
+ from ${tables.groups} g where g.tenant = $1 and g.id = $2`,
867
+ upsertUser,
868
+ updateUser,
869
+ upsertGroup,
870
+ updateGroup,
871
+ deleteUser: `with d as (
872
+ delete from ${tables.users} where tenant = $1 and id = $2 returning tenant, id
873
+ ),
874
+ m as (
875
+ delete from ${tables.members} mm using d
876
+ where mm.tenant = d.tenant and mm.user_id = d.id returning mm.group_id
877
+ ),
878
+ touched as (
879
+ update ${tables.groups} t set updated_at = $3::timestamptz, revision = t.revision + 1
880
+ where t.tenant = $1 and t.id in (select group_id from m)
881
+ )
882
+ select count(*)::integer as deleted from d`,
883
+ deleteGroup: `delete from ${tables.groups} where tenant = $1 and id = $2 returning id`,
884
+ groupsFor: `select ${groupJson("g", membersOfGroup(tables, "g"))} as resource
885
+ from ${tables.groups} g
886
+ where g.tenant = $1 and exists (
887
+ select 1 from ${tables.members} m where m.tenant = g.tenant and m.group_id = g.id and m.user_id = $2
888
+ )
889
+ order by g.seq`
890
+ };
891
+ }
892
+ function findSql(kind, tables, clause, page) {
893
+ const table = kind === "user" ? tables.users : tables.groups;
894
+ const alias = kind === "user" ? "u" : "g";
895
+ const resource = kind === "user" ? userJson(alias) : groupJson(alias, membersOfGroup(tables, alias));
896
+ return `with matched as (
897
+ select ${alias}.seq from ${table} ${alias} where ${clause}
898
+ ),
899
+ paged as (
900
+ select seq from matched order by seq offset ${page.offset}::bigint limit ${page.count}::bigint
901
+ )
902
+ select (select count(*)::integer from matched) as total,
903
+ coalesce((
904
+ select jsonb_agg(${resource} order by ${alias}.seq)
905
+ from ${table} ${alias} join paged p on p.seq = ${alias}.seq
906
+ ), '[]'::jsonb) as resources`;
907
+ }
908
+ /**
909
+ * A `DirectoryStore` over the tables `permdock scim generate` writes, called
910
+ * through a `SqlQuery` that may read and write them (the table owner, or a role
911
+ * granted on them). Every method is one statement, so a pool needs no
912
+ * transaction: a group and its members change together, and a PATCH that races
913
+ * another write re-reads the row and applies its operations again.
914
+ */
915
+ function postgresDirectoryStore(query, options = {}) {
916
+ const schema = quoteSqlIdent(options.schema ?? "permdock");
917
+ const tables = {
918
+ users: `${schema}.${quoteSqlIdent(SCIM_TABLES.users)}`,
919
+ groups: `${schema}.${quoteSqlIdent(SCIM_TABLES.groups)}`,
920
+ members: `${schema}.${quoteSqlIdent(SCIM_TABLES.members)}`
921
+ };
922
+ const sql = statements(tables);
923
+ const rows = async (statement, values) => sqlRows(await query(statement, values));
924
+ async function readUser(tenant, id) {
925
+ const [row] = await rows(sql.getUser, [tenant, id]);
926
+ return row === void 0 ? null : storedUser(row["resource"]);
927
+ }
928
+ async function readGroup(tenant, id) {
929
+ const [row] = await rows(sql.getGroup, [tenant, id]);
930
+ return row === void 0 ? null : storedGroup(row["resource"]);
931
+ }
932
+ async function find(kind, tenant, filter, page, read) {
933
+ const paging = window(page);
934
+ const clause = where(tenant, filter, kind, tables);
935
+ const next = clause.params.length;
936
+ const [row] = await rows(findSql(kind, tables, clause.sql, {
937
+ offset: `$${String(next + 1)}`,
938
+ count: `$${String(next + 2)}`
939
+ }), [
940
+ ...clause.params,
941
+ paging.offset,
942
+ paging.count
943
+ ]);
944
+ const resources = parsed(row?.["resources"]);
945
+ return pageResult(Array.isArray(resources) ? resources.map((item) => read(item).resource) : [], Number(row?.["total"] ?? 0), paging.offset);
946
+ }
947
+ return {
948
+ name: "postgres",
949
+ async getUser(tenant, id) {
950
+ return (await readUser(tenant, id))?.resource ?? null;
951
+ },
952
+ findUsers(tenant, filter, page) {
953
+ return find("user", tenant, filter, page, storedUser);
954
+ },
955
+ async putUser(tenant, user) {
956
+ const id = user.id === "" ? randomId("u_") : user.id;
957
+ try {
958
+ const [row] = await rows(sql.upsertUser, userParams(tenant, {
959
+ ...user,
960
+ id
961
+ }, createdParam(user.meta.created), isoNow()));
962
+ return storedUser(row?.["resource"]).resource;
963
+ } catch (error) {
964
+ return uniqueness(error, "user");
965
+ }
966
+ },
967
+ patchUser(tenant, id, ops) {
968
+ return patch(() => readUser(tenant, id), ops, applyUserOp, async (next, revision) => {
969
+ try {
970
+ const [row] = await rows(sql.updateUser, userParams(tenant, {
971
+ ...next,
972
+ id
973
+ }, revision, isoNow()));
974
+ return row === void 0 ? null : storedUser(row["resource"]).resource;
975
+ } catch (error) {
976
+ return uniqueness(error, "user");
977
+ }
978
+ }, `user ${id}`);
979
+ },
980
+ async deleteUser(tenant, id) {
981
+ const [row] = await rows(sql.deleteUser, [
982
+ tenant,
983
+ id,
984
+ isoNow()
985
+ ]);
986
+ if (Number(row?.["deleted"] ?? 0) === 0) throw new DirectoryNotFoundError();
987
+ },
988
+ async getGroup(tenant, id) {
989
+ return (await readGroup(tenant, id))?.resource ?? null;
990
+ },
991
+ findGroups(tenant, filter, page) {
992
+ return find("group", tenant, filter, page, storedGroup);
993
+ },
994
+ async putGroup(tenant, group) {
995
+ const id = group.id === "" ? randomId("g_") : group.id;
996
+ try {
997
+ const [row] = await rows(sql.upsertGroup, groupParams(tenant, {
998
+ ...group,
999
+ id
1000
+ }, createdParam(group.meta.created), isoNow()));
1001
+ return storedGroup(row?.["resource"]).resource;
1002
+ } catch (error) {
1003
+ return uniqueness(error, "group");
1004
+ }
1005
+ },
1006
+ patchGroup(tenant, id, ops) {
1007
+ return patch(() => readGroup(tenant, id), ops, applyGroupOp, async (next, revision) => {
1008
+ try {
1009
+ const [row] = await rows(sql.updateGroup, groupParams(tenant, {
1010
+ ...next,
1011
+ id
1012
+ }, revision, isoNow()));
1013
+ return row === void 0 ? null : storedGroup(row["resource"]).resource;
1014
+ } catch (error) {
1015
+ return uniqueness(error, "group");
1016
+ }
1017
+ }, `group ${id}`);
1018
+ },
1019
+ async deleteGroup(tenant, id) {
1020
+ if ((await rows(sql.deleteGroup, [tenant, id])).length === 0) throw new DirectoryNotFoundError();
1021
+ },
1022
+ async groupsFor(tenant, userId) {
1023
+ return (await rows(sql.groupsFor, [tenant, userId])).map((row) => storedGroup(row["resource"]).resource);
1024
+ }
1025
+ };
1026
+ }
1027
+ //#endregion
1028
+ export { SCIM_CONTENT_TYPE as _, memoryDirectoryStore as a, isDirectoryUniquenessError as b, parseScimFilter as c, DirectoryUniquenessError as d, ERROR_SCHEMA as f, ROLES_EXTENSION as g, PATCH_SCHEMA as h, postgresDirectoryStore as i, APP_DATA_EXTENSION as l, LIST_SCHEMA as m, SCIM_TABLES as n, filterSupported as o, GROUP_SCHEMA as p, SCIM_UNIQUE as r, matchFilter as s, SCIM_SCHEMA as t, DirectoryNotFoundError as u, USER_SCHEMA as v, isDirectoryNotFoundError as y };