permdock 0.5.0 → 0.7.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 (399) hide show
  1. package/README.md +1 -0
  2. package/dist/{2020-C9VN-x8c.js → 2020-CJbO8Bvz.js} +1 -3
  3. package/dist/a2a/index.d.ts +5 -5
  4. package/dist/a2a/index.js +4 -4
  5. package/dist/{adoption-scan-B4R5fnMU.js → adoption-scan-D-feE7BE.js} +1 -1
  6. package/dist/agent/index.d.ts +3 -3
  7. package/dist/agent/index.js +1 -1
  8. package/dist/ai-sdk/index.d.ts +21 -6
  9. package/dist/ai-sdk/index.js +19 -9
  10. package/dist/{approval-prompt-Djo_PyZc.d.ts → approval-prompt-K0faOLFp.d.ts} +2 -2
  11. package/dist/approvals/index.d.ts +4 -4
  12. package/dist/approvals/index.js +4 -4
  13. package/dist/{approvals-DJ6Yd5z1.js → approvals-CMRfsbBh.js} +74 -48
  14. package/dist/{arazzo-B6lebmiQ.js → arazzo-ClrF3PVb.js} +2 -2
  15. package/dist/{arazzo-BWhNF-k0.js → arazzo-rdeJ8n1J.js} +4 -4
  16. package/dist/{args-IIolxxKA.js → args-CC3OwyHW.js} +112 -2
  17. package/dist/astro/index.d.ts +6 -6
  18. package/dist/astro/index.js +2 -2
  19. package/dist/{audience-Dg8XsRaO.js → audience-BrMs8c4o.js} +1 -1
  20. package/dist/{auth-DRLEizbL.js → auth-CscUX8Sy.js} +3 -4
  21. package/dist/authzen/index.d.ts +162 -22
  22. package/dist/authzen/index.js +315 -146
  23. package/dist/{automation-BMZPIVUM.d.ts → automation-DOtAFWdy.d.ts} +3 -3
  24. package/dist/{automation-DVjOckjV.js → automation-ySsxp_Yp.js} +1 -1
  25. package/dist/base-url-BQbddZO5.js +9 -0
  26. package/dist/better-auth/index.d.ts +2 -2
  27. package/dist/better-auth/index.js +2 -2
  28. package/dist/better-supabase/index.d.ts +50 -8
  29. package/dist/better-supabase/index.js +94 -32
  30. package/dist/{bind-CZzhx-Vj.js → bind-D1nO6fiC.js} +5 -5
  31. package/dist/{bind--9EFVYWF.d.ts → bind-JDuvxjuW.d.ts} +7 -7
  32. package/dist/{build-instance-BMnAudHn.js → build-instance-DxE7czo9.js} +1 -1
  33. package/dist/{canonical-json-BC8_nMTw.js → canonical-json-DwilZ1iB.js} +6 -3
  34. package/dist/{capability-BSslw1QV.d.ts → capability-D4UC9TTW.d.ts} +2 -2
  35. package/dist/{capability-N1K9IpqS.js → capability-L7NnfhiE.js} +1 -1
  36. package/dist/{casbin-Cr7RLtA3.js → casbin-BHijLuHY.js} +2 -2
  37. package/dist/{casbin-Dyu2gnUD.js → casbin-BW9pS47J.js} +1 -1
  38. package/dist/{casl-64gpT-8x.js → casl-CmJlgziS.js} +2 -2
  39. package/dist/{casl-DjEDhTCP.js → casl-UbI8v-Wq.js} +1 -1
  40. package/dist/catalog/index.d.ts +70 -10
  41. package/dist/catalog/index.js +112 -6
  42. package/dist/catalog-BCCjSAdH.js +1 -0
  43. package/dist/{catalog-R_A__RsH.js → catalog-BaMQfQ6Y.js} +3 -3
  44. package/dist/{catalog-BECMPrwc.js → catalog-D69WhFii.js} +43 -13
  45. package/dist/{catalog-doc-C9wjsfNY.js → catalog-doc-CV9s6B1S.js} +28 -5
  46. package/dist/{catalog-fingerprint-CCP0-yQS.js → catalog-fingerprint-C144oW4M.js} +1 -1
  47. package/dist/{create-BWRSXgOF.js → challenge-nGWma08S.js} +122 -25
  48. package/dist/chat/index.d.ts +1 -1
  49. package/dist/chat/index.js +2 -2
  50. package/dist/chat-sdk/index.d.ts +3 -3
  51. package/dist/checks-BC_0mPIq.js +37 -0
  52. package/dist/claude-agent/index.d.ts +3 -3
  53. package/dist/claude-agent/index.js +2 -2
  54. package/dist/clerk/index.d.ts +3 -3
  55. package/dist/clerk/index.js +1 -1
  56. package/dist/cli/bin.js +2 -2
  57. package/dist/cli/index.d.ts +3 -3
  58. package/dist/cli/index.js +3 -3
  59. package/dist/cloud/index.d.ts +127 -11
  60. package/dist/cloud/index.js +251 -3
  61. package/dist/{cloud-CIoHNevm.js → cloud-CO8pYtwr.js} +5 -5
  62. package/dist/{codemod-Cxvvc70T.js → codemod-BP6n8N9L.js} +3 -3
  63. package/dist/{codemod-Bmj9dWMH.js → codemod-i4N2BhDc.js} +3 -3
  64. package/dist/{collect-CrZJJnEF.js → collect-BaWeMjwV.js} +17 -8
  65. package/dist/{collect-DloHbDVa.js → collect-DNm3oKOk.js} +6 -5
  66. package/dist/collect-k_Dulxr5.js +1 -0
  67. package/dist/compile/index.d.ts +1 -1
  68. package/dist/compile/index.js +1 -1
  69. package/dist/{compile-CMqMx_IN.js → compile-BAEO5bOk.js} +2 -2
  70. package/dist/{compile-Ckm2HqBZ.d.ts → compile-COM2VKuN.d.ts} +3 -3
  71. package/dist/{completion-BqhRBJD8.js → completion-BNdVf7X2.js} +3 -3
  72. package/dist/{config-bs_kZeYq.js → config-CoQHDrDi.js} +7 -3
  73. package/dist/{config-B46rm9sc.js → config-DGZzMV1B.js} +2 -2
  74. package/dist/{config-report-DUgj62Ai.js → config-report-Cm7UITNA.js} +3 -3
  75. package/dist/connector-schema-_VCSsdtD.js +433 -0
  76. package/dist/{context-bbFHR-0D.js → context--uM9V3Ui.js} +2 -2
  77. package/dist/convex/index.d.ts +5 -5
  78. package/dist/convex/index.js +2 -2
  79. package/dist/core-B5-w6Kw9.js +335 -0
  80. package/dist/core-CQkE8Esr.d.ts +179 -0
  81. package/dist/{create-0VZ7Pdiu.d.ts → create-B2-CQqCI.d.ts} +5 -5
  82. package/dist/{create-C3b4B5eF.js → create-Cb86Z8Im.js} +9 -8
  83. package/dist/{create-DnrmLnLW.js → create-DJrlhEp9.js} +5 -5
  84. package/dist/{create-BFfm17UA.d.ts → create-QHuuPw3q.d.ts} +7 -7
  85. package/dist/{create-BDS7wc3y.d.ts → create-UTnUVETj.d.ts} +30 -10
  86. package/dist/{credential-DM2um3ha.js → credential-CIM7wHwA.js} +4 -4
  87. package/dist/{credentials-DPyHmYz5.js → credentials-BpuTwd7a.js} +1 -1
  88. package/dist/{deciding-columns-Sq12mEA6.js → deciding-columns-DRo2QM6E.js} +13 -2
  89. package/dist/{delegation-DaXVdDhM.js → delegation-C5rOdTp5.js} +5 -5
  90. package/dist/delivery/index.d.ts +5 -5
  91. package/dist/delivery/index.js +4 -3
  92. package/dist/{delivery-DCAgNyCn.js → delivery-rwOKLWRm.js} +51 -2
  93. package/dist/{denied-text-D8jDHgsl.d.ts → denied-text-D4qkEtFz.d.ts} +2 -2
  94. package/dist/{describe-BybMRY7A.js → describe-DZlnEtLy.js} +1 -0
  95. package/dist/{describe-BZUsixiL.d.ts → describe-O0SwYIK8.d.ts} +2 -2
  96. package/dist/{diff-CxZo9pTq.js → diff-Btr1c1Ow.js} +2 -2
  97. package/dist/{diff-DCePiN6M.js → diff-DzT-xD13.js} +10 -10
  98. package/dist/{doctor-DFjUxf2f.js → doctor-BU1szn63.js} +241 -49
  99. package/dist/{doctor-CxiwSfqH.js → doctor-BoK_y0KO.js} +4 -4
  100. package/dist/drizzle/index.d.ts +3 -3
  101. package/dist/drizzle/index.js +1 -1
  102. package/dist/elysia/index.d.ts +5 -5
  103. package/dist/elysia/index.js +3 -3
  104. package/dist/{errors-C2PXIv4c.d.ts → errors-B_Qg9D3e.d.ts} +2 -2
  105. package/dist/{errors-CWTY6uih.js → errors-DpP_U6Bf.js} +1 -0
  106. package/dist/{evaluate-_R8QkWaf.js → evaluate-B_oqFbWC.js} +130 -34
  107. package/dist/{evaluations-16UqqQ6W.d.ts → evaluations-BCddEOfO.d.ts} +4 -4
  108. package/dist/{evaluations-DZ2CbV5k.js → evaluations-DReoiVBw.js} +4 -4
  109. package/dist/eve/index.d.ts +5 -5
  110. package/dist/eve/index.js +3 -3
  111. package/dist/express/index.d.ts +5 -5
  112. package/dist/express/index.js +3 -3
  113. package/dist/fastify/index.d.ts +5 -5
  114. package/dist/fastify/index.js +3 -3
  115. package/dist/{fetch-adapter-qKJBuRqy.d.ts → fetch-adapter-CuhyYwC1.d.ts} +4 -4
  116. package/dist/{fetch-adapter-g0ypLkID.js → fetch-adapter-De-u6vhJ.js} +3 -3
  117. package/dist/{fields-D9tPVUUS.js → fields-ClcQLrVc.js} +48 -13
  118. package/dist/{files-C5ZI27eV.js → files-acUbNwWt.js} +15 -2
  119. package/dist/{fixtures-B7XrLeY7.js → fixtures-BTMW6zgU.js} +2 -2
  120. package/dist/{flags-C3DktBDY.js → flags-aaeRAdiD.js} +2 -2
  121. package/dist/{from-snapshot-D2lZt4Dd.js → from-snapshot-Bz469dIh.js} +17 -10
  122. package/dist/generate-3FNO5P5Q.js +159 -0
  123. package/dist/{grantee-Cn1HyUsI.js → grantee-BrRANrpT.js} +14 -4
  124. package/dist/{grantee-conditions-CcXf8hMM.js → grantee-conditions-C6P1Tvol.js} +1 -1
  125. package/dist/{grantee-match-DHArqY82.js → grantee-match-0RtHWQDx.js} +3 -3
  126. package/dist/h3/index.d.ts +4 -4
  127. package/dist/h3/index.js +3 -3
  128. package/dist/{helpers-DTcZOzhF.js → helpers-DY3vXuGs.js} +3 -3
  129. package/dist/hono/index.d.ts +5 -5
  130. package/dist/hono/index.js +3 -3
  131. package/dist/{hosted-DBDX0M-P.d.ts → hosted-BmjzxQhp.d.ts} +14 -2
  132. package/dist/{hosted-BZIAYvon.js → hosted-XBgU6RGT.js} +34 -12
  133. package/dist/{http-DXJ37RDA.js → http-Ca3Sr5x1.js} +1 -1
  134. package/dist/{import-DMmOG27O.js → import-Bz0GefWg.js} +5 -5
  135. package/dist/{import-CNV7I2Dw.js → import-DB2EG_iy.js} +3 -3
  136. package/dist/{index-CxGUswIC.d.ts → index-BE8y3moU.d.ts} +50 -8
  137. package/dist/{index-Chrs5fQ-.d.ts → index-BSfRl0hZ.d.ts} +6 -6
  138. package/dist/{index-DOVf7RJv.d.ts → index-BTkwrK7v.d.ts} +155 -17
  139. package/dist/index-CMiPH2Tv.d.ts +206 -0
  140. package/dist/{index-SGdIQyzc.d.ts → index-DH9DUDEM.d.ts} +18 -3
  141. package/dist/{index-BcHcPyIo.d.ts → index-DLwcuCN_.d.ts} +86 -7
  142. package/dist/index.d.ts +18 -17
  143. package/dist/index.js +27 -25
  144. package/dist/{init-GG6Jh8HD.js → init-5TXNji88.js} +5 -5
  145. package/dist/{init-DeMYsnYJ.js → init-B-4t1NzC.js} +4 -4
  146. package/dist/{instance-options-Omfd793B.d.ts → instance-options-CU0YQCLH.d.ts} +1 -1
  147. package/dist/{instance-snapshot-Cxq4ygFc.js → instance-snapshot-CjcwnEiV.js} +20 -14
  148. package/dist/jwt/index.d.ts +83 -5
  149. package/dist/jwt/index.js +143 -5
  150. package/dist/{kernel-5JatXyND.js → kernel-DVExUwkp.js} +138 -12
  151. package/dist/kysely/index.d.ts +3 -3
  152. package/dist/kysely/index.js +1 -1
  153. package/dist/load-DrMHXzgN.js +1 -0
  154. package/dist/{load-DFS_ry0W.js → load-DxroEzH1.js} +2 -2
  155. package/dist/{login-Dfe5RlYk.js → login-ClSJh5t5.js} +4 -4
  156. package/dist/{login-imhuwvn3.js → login-WC9HPJpU.js} +6 -10
  157. package/dist/{manifest-C8IzW3Do.js → manifest-B79YuF2T.js} +6 -2
  158. package/dist/{manifest-mx5ghSFM.d.ts → manifest-BVhExYhw.d.ts} +23 -2
  159. package/dist/{manifest-CtKR3GXL.js → manifest-Dv6q4i5s.js} +54 -35
  160. package/dist/{manifest-schema-C0kK_8V0.js → manifest-schema-Cv492Qev.js} +37 -7
  161. package/dist/{map-claims-D3oRmTk0.js → map-claims-etGIS_Dv.js} +14 -11
  162. package/dist/{map-error-TCAdw-eW.js → map-error-BQGyDm_M.js} +1 -1
  163. package/dist/mcp/index.d.ts +64 -10
  164. package/dist/mcp/index.js +151 -22
  165. package/dist/{migrate-BShP7Vf4.js → migrate-Dodel0IJ.js} +77 -24
  166. package/dist/nest/index.d.ts +5 -5
  167. package/dist/nest/index.js +3 -3
  168. package/dist/next/index.d.ts +9 -9
  169. package/dist/next/index.js +5 -5
  170. package/dist/next/plugin.d.ts +1 -1
  171. package/dist/next/plugin.js +2 -2
  172. package/dist/node/index.d.ts +5 -5
  173. package/dist/node/index.js +2 -2
  174. package/dist/openai/index.d.ts +5 -5
  175. package/dist/openai/index.js +3 -3
  176. package/dist/openapi/index.d.ts +14 -4
  177. package/dist/openapi/index.js +1 -1
  178. package/dist/{openapi-ahr8rHu3.js → openapi-DMocl1bh.js} +4 -4
  179. package/dist/{openapi-B7HZ0f-r.js → openapi-Ddb4628T.js} +2 -7
  180. package/dist/{openapi-DTaEmTSW.js → openapi-ztVaux6j.js} +8 -8
  181. package/dist/{operation-findings-DgATDpvh.js → operation-findings-kRcEp8lE.js} +1 -1
  182. package/dist/{operations-CxybZErY.d.ts → operations-BNLes61x.d.ts} +1 -1
  183. package/dist/orpc/index.d.ts +6 -6
  184. package/dist/orpc/index.js +4 -4
  185. package/dist/otel/index.d.ts +3 -3
  186. package/dist/otel/index.js +1 -1
  187. package/dist/{output-Dyw8fyPF.js → output-DgSDLrta.js} +7 -3
  188. package/dist/{output-files-DhRBBE4n.js → output-files-CCMdcFWb.js} +2 -2
  189. package/dist/output-files-DPAY7-GX.js +1 -0
  190. package/dist/{ownership-BatFgAA4.js → ownership-Z2LpxsGa.js} +1349 -883
  191. package/dist/parse-Ddhz2xf4.js +148 -0
  192. package/dist/{parse-local-manifest-CVSs6J9I.js → parse-local-manifest-T1Q8X3A2.js} +24 -1
  193. package/dist/{parse-local-manifest-DgqtruPn.d.ts → parse-local-manifest-e4mdwAKd.d.ts} +1 -1
  194. package/dist/pdp/index.d.ts +3 -3
  195. package/dist/pdp/index.js +7 -3
  196. package/dist/peer-12Q5I_RH.js +976 -0
  197. package/dist/{peer-CRvC7Hg1.js → peer-DOzzMfZL.js} +1 -1
  198. package/dist/{permdock-B9JxkBwC.js → permdock-BfWEeMqk.js} +177 -49
  199. package/dist/{permdock-D7eeLJER.d.ts → permdock-Dco6dyCK.d.ts} +34 -5
  200. package/dist/{permission-registry-Br4jSNVi.js → permission-registry-DpPtSKNZ.js} +1 -1
  201. package/dist/{vocabulary-D6lPdb4Z.d.ts → permission-types-DhNEmoRG.d.ts} +4 -62
  202. package/dist/{permissions-oEWfl-kl.d.ts → permissions-CoqCOfJ3.d.ts} +2 -1
  203. package/dist/{permissions-B-wCP5ZC.js → permissions-CyH2MV_B.js} +1 -1
  204. package/dist/{permissions-CZKiUfFM.js → permissions-DArULThq.js} +4 -4
  205. package/dist/pkce-5h8NgMQJ.js +21 -0
  206. package/dist/{policies-CO1oOymN.js → policies-B2lZIurj.js} +3 -3
  207. package/dist/{policy-Czo4n3Hs.d.ts → policy-B7dg_yzu.d.ts} +2 -2
  208. package/dist/{policy-DLZJ5gAp.js → policy-DaJy4nK4.js} +17 -8
  209. package/dist/{policy-from-catalog-DzhEc3Y9.js → policy-from-catalog-DFWYkNdu.js} +9 -9
  210. package/dist/{policy-types-DzwivBgR.d.ts → policy-types-B-F-qAZk.d.ts} +109 -5
  211. package/dist/postgres-store-BL9M_CA1.js +1001 -0
  212. package/dist/{postgrest-NUqZT-RB.d.ts → postgrest-CYacM_u7.d.ts} +12 -1
  213. package/dist/{postgrest-CW0IqC-U.js → postgrest-r5faDIzD.js} +47 -5
  214. package/dist/{powersync-BHfuehf3.js → powersync-13odBwiM.js} +3 -3
  215. package/dist/powersync-53ryOZip.js +1059 -0
  216. package/dist/powersync-CExtTLyA.js +1 -0
  217. package/dist/preset/index.js +1 -1
  218. package/dist/{preset-DZdU0tne.js → preset-CHTbd-DQ.js} +2 -2
  219. package/dist/prisma/index.d.ts +2 -2
  220. package/dist/prisma/index.js +1 -1
  221. package/dist/{problem-details-DXlt-vks.d.ts → problem-details-Tcfmj3bV.d.ts} +1 -1
  222. package/dist/prompt-DwtVemER.js +935 -0
  223. package/dist/{protected-DEPHc2xV.d.ts → protected-BwZYL1X_.d.ts} +6 -5
  224. package/dist/{protected-DfjY5mLA.js → protected-DXE3cQYg.js} +2 -2
  225. package/dist/{provider-CC-u3bYP.js → provider-BQsTYYy0.js} +2 -2
  226. package/dist/{provider-DMVt6yYn.d.ts → provider-Csk-THAn.d.ts} +1 -1
  227. package/dist/{provider-store-B5Yrkhzr.js → provider-store-IgqQipCO.js} +2 -2
  228. package/dist/{pull-BgIfno6w.js → pull-CN5OLxrF.js} +7 -7
  229. package/dist/pull-Cty6Ovyu.js +1 -0
  230. package/dist/{push-CmFVBOeI.js → push-tVdG8dUL.js} +54 -14
  231. package/dist/{pushed-policy-BImMTTIM.d.ts → pushed-policy-BbcY9r_4.d.ts} +1 -1
  232. package/dist/{pushed-policy-DobP7AHI.js → pushed-policy-CmYeSQqq.js} +1 -1
  233. package/dist/react/index.d.ts +6 -6
  234. package/dist/react/index.js +3 -3
  235. package/dist/react/provider-client.d.ts +1 -1
  236. package/dist/react/provider-client.js +1 -1
  237. package/dist/react-native/index.d.ts +25 -11
  238. package/dist/react-native/index.js +214 -24
  239. package/dist/{refs-K6eWUJ0H.js → refs-CNJBiTFo.js} +15 -1
  240. package/dist/{replay-D7iKcLFe.d.ts → replay-DCDD_ZfL.d.ts} +1 -1
  241. package/dist/{request-context-BTRTG7OT.js → request-context-BykKLmyE.js} +2 -2
  242. package/dist/resend/index.d.ts +4 -4
  243. package/dist/{retire-CALjIQ7e.js → retire-Wj6dkyDE.js} +2 -2
  244. package/dist/{rls-BA8an5Ap.js → rls-Ck_PocSp.js} +32 -8
  245. package/dist/{rls-j6t43t7n.js → rls-CxBZb4rZ.js} +478 -534
  246. package/dist/{role-builder-CXbis5-X.js → role-builder-C1VJzvcr.js} +3 -3
  247. package/dist/rolldown-runtime-C3I60J0A.js +4 -0
  248. package/dist/{rpc-aPyNi6tA.js → rpc-Bk1bE-ch.js} +1 -1
  249. package/dist/run-Bz7DXGEv.js +1 -0
  250. package/dist/{run-ticket-sxFI6LAk.js → run-ticket-B5d_63Ma.js} +22 -1
  251. package/dist/{run-ticket-BjhTOi6u.d.ts → run-ticket-BpNi7BCi.d.ts} +8 -3
  252. package/dist/{run-DOfMtc9V.js → run-uLD2aWuO.js} +7 -7
  253. package/dist/{runtime-D3VTAiCA.js → runtime-Vif3_-zf.js} +1 -1
  254. package/dist/{saas-FO-Q8oj0.js → saas-Az_Kz-4D.js} +7 -7
  255. package/dist/{scan-BOI5tJ-6.js → scan-DSljDE1Y.js} +1 -1
  256. package/dist/{schema-yLuBWWsh.js → schema-gIcCx7zM.js} +1 -1
  257. package/dist/scim/index.d.ts +3 -2
  258. package/dist/scim/index.js +3 -1
  259. package/dist/scim-C7JYhySg.js +44 -0
  260. package/dist/{scim-ClHtpyV3.js → scim-YNieBO1U.js} +3 -537
  261. package/dist/{scopes-CUPSjo9q.js → scopes-BHsc-wp-.js} +1 -1
  262. package/dist/server/index.d.ts +11 -11
  263. package/dist/server/index.js +7 -7
  264. package/dist/{server-DqCT4CgZ.js → server-Bnga6I50.js} +3 -3
  265. package/dist/{server-types-BLd4MnBX.d.ts → server-types-C4gZUEZy.d.ts} +9 -9
  266. package/dist/{shared-DvvFzYXe.js → shared-C8LjUdVU.js} +1 -1
  267. package/dist/{shared-CD11nBbC.js → shared-fMKOv8hP.js} +46 -39
  268. package/dist/{sink-Bj_lDUDq.d.ts → sink-Cp_Eot9W.d.ts} +4 -4
  269. package/dist/{skills-B6lVdD_W.js → skills-Dcjw9_1C.js} +5 -5
  270. package/dist/{skills-CTYwkl44.js → skills-g_3BS9NC.js} +3 -3
  271. package/dist/{snapshot-CXUWfsNy.js → snapshot-CbGmYiJx.js} +4 -4
  272. package/dist/{snapshot-cache-DZHQ0KF6.js → snapshot-cache-DT2Kx1F8.js} +1 -1
  273. package/dist/{snapshot-cache-DqK9eDmM.d.ts → snapshot-cache-Pahd3IYJ.d.ts} +1 -1
  274. package/dist/solid/index.d.ts +6 -5
  275. package/dist/solid/index.js +4 -4
  276. package/dist/solid-start/index.d.ts +6 -6
  277. package/dist/solid-start/index.js +3 -3
  278. package/dist/{sources-vs5dGOsS.js → sources-B-zYB4GS.js} +111 -25
  279. package/dist/{sources-BV9j0DeZ.d.ts → sources-DEEuGb8S.d.ts} +63 -14
  280. package/dist/sources-qoIJQrJv.js +11 -0
  281. package/dist/{sql-B5T1IL83.js → sql-B96movIM.js} +5 -1
  282. package/dist/sql-CDEPCA0g.d.ts +10 -0
  283. package/dist/{src-DLfUWFAI.js → src-DLFrtrrC.js} +154 -53
  284. package/dist/ssf/index.d.ts +4 -4
  285. package/dist/ssf/index.js +640 -211
  286. package/dist/{standard-webhooks-6lg8v_is.d.ts → standard-webhooks-B_qRg0ws.d.ts} +2 -2
  287. package/dist/{store-4u_hxjWa.js → store-DSP9oGvh.js} +15 -7
  288. package/dist/{store-options-BqEakYRa.js → store-options-B_poyYvg.js} +6 -6
  289. package/dist/{stores-ClZUgeoP.d.ts → stores-BAZwSYZA.d.ts} +6 -5
  290. package/dist/{stores-BbsD4fAR.js → stores-BqEuHC05.js} +2 -2
  291. package/dist/{stream-7-xmnf3U.d.ts → stream-2Vwhl7Er.d.ts} +2 -2
  292. package/dist/{style-Uao76wO7.js → style-Cqo7-73x.js} +1 -0
  293. package/dist/{style-DiKWnAvn.js → style-Ds1gNm77.js} +1 -1
  294. package/dist/supabase/index.d.ts +8 -7
  295. package/dist/supabase/index.js +5 -5
  296. package/dist/supabase/middleware.d.ts +6 -6
  297. package/dist/supabase/middleware.js +6 -6
  298. package/dist/{supabase-Dxlp8A94.js → supabase--0aJdLEd.js} +9 -7
  299. package/dist/{supabase-9pqI57pW.js → supabase-Bqp7iIY2.js} +3 -3
  300. package/dist/supabase-hook-DJxC4PoP.js +1 -0
  301. package/dist/{supabase-hook-DdDQhMlw.js → supabase-hook-Dg0SrQWR.js} +1069 -123
  302. package/dist/supautils-MESd81bF.js +689 -0
  303. package/dist/{support-session-C6xJQYut.js → support-session-Cna49-3f.js} +2 -2
  304. package/dist/svelte/index.d.ts +5 -5
  305. package/dist/svelte/index.js +5 -5
  306. package/dist/svelte/runtime.d.ts +3 -3
  307. package/dist/svelte/runtime.js +3 -3
  308. package/dist/svelte/source.d.ts +5 -5
  309. package/dist/svelte/source.js +2 -2
  310. package/dist/sveltekit/index.d.ts +6 -6
  311. package/dist/sveltekit/index.js +2 -2
  312. package/dist/tanstack-start/index.d.ts +6 -6
  313. package/dist/tanstack-start/index.js +2 -2
  314. package/dist/{tenancy-DN2QAx9z.js → tenancy-CmeBQ6Nv.js} +12 -3
  315. package/dist/terminal/index.d.ts +6 -6
  316. package/dist/terminal/index.js +3 -3
  317. package/dist/testing/core.d.ts +2 -0
  318. package/dist/testing/core.js +1 -0
  319. package/dist/testing/fixtures/index.d.ts +12 -0
  320. package/dist/testing/fixtures/index.js +770 -0
  321. package/dist/testing/index.d.ts +41 -174
  322. package/dist/testing/index.js +241 -731
  323. package/dist/testing/saas/index.d.ts +5 -5
  324. package/dist/testing/saas/index.js +2 -2
  325. package/dist/testing/saas/permissions.d.ts +1 -1
  326. package/dist/testing/saas/permissions.js +1 -1
  327. package/dist/text-diff-DhITNCnD.js +444 -0
  328. package/dist/{token-BLZcjQgt.js → token-2qYDvXz2.js} +1 -1
  329. package/dist/{tool-refusal-CMLN5xhn.js → tool-refusal-reAhIzdl.js} +1 -1
  330. package/dist/trpc/index.d.ts +6 -6
  331. package/dist/trpc/index.js +3 -3
  332. package/dist/{types-5Ut_pbKy.d.ts → types-BWZybqs9.d.ts} +112 -8
  333. package/dist/{types-CZTnPFzM.d.ts → types-BXMYB7BY.d.ts} +2 -2
  334. package/dist/{types-CdlxsYQh.d.ts → types-BfVmNJO5.d.ts} +14 -3
  335. package/dist/{types-BqAKcRNW.d.ts → types-CIeZcG8v.d.ts} +2 -2
  336. package/dist/{types-BNORmDM8.d.ts → types-CKV71kKh.d.ts} +4 -4
  337. package/dist/{types-tIgIeIKJ.d.ts → types-CQVEQawv.d.ts} +4 -4
  338. package/dist/{types-BjV-fqcA.d.ts → types-CeIscIKp.d.ts} +4 -4
  339. package/dist/{types-_sHy8BQf.d.ts → types-CfiKC5aN.d.ts} +1 -1
  340. package/dist/{types-ClZaWzfb.d.ts → types-D3A19w4A.d.ts} +8 -4
  341. package/dist/{types-C8-KNsFf.d.ts → types-DBHftjgS.d.ts} +15 -8
  342. package/dist/{types-CCpc2Dcv.d.ts → types-DC44-hqb.d.ts} +2 -2
  343. package/dist/{types-fbZ7JEXr.d.ts → types-DXmwu78Z.d.ts} +4 -4
  344. package/dist/{types-DiQjupG2.d.ts → types-cTos-H7p.d.ts} +2 -2
  345. package/dist/{types-DX0LaKTb.d.ts → types-g7Oy6Zg4.d.ts} +3 -3
  346. package/dist/unplugin/index.d.ts +1 -1
  347. package/dist/unplugin/index.js +2 -2
  348. package/dist/{usage-T5mXq98v.js → usage-Bybmck7f.js} +7 -7
  349. package/dist/{usage-DHtE8j4E.js → usage-CDaLXCfL.js} +2 -2
  350. package/dist/usage-y-kBNdqs.js +1 -0
  351. package/dist/{validation-error-Bg5Tpluk.d.ts → validation-error-CQpoquwj.d.ts} +1 -1
  352. package/dist/{verify-DbCL9bnB.js → verify-pe8rL_Qw.js} +350 -83
  353. package/dist/{views-DTIIO-oQ.js → views-BB8E9dTP.js} +1 -1
  354. package/dist/vocabulary-Bg3eeT2H.d.ts +67 -0
  355. package/dist/vue/index.d.ts +6 -5
  356. package/dist/vue/index.js +4 -4
  357. package/dist/{waiter-CKy4MQSY.d.ts → waiter-DwEyouan.d.ts} +2 -2
  358. package/dist/watch-Bd9mx3rd.js +1 -0
  359. package/dist/{watch-CszoTJMq.js → watch-C-4VmFlL.js} +3 -3
  360. package/dist/webmcp/index.d.ts +2 -2
  361. package/dist/webmcp/index.js +2 -2
  362. package/dist/{where-scope-Dv-WTP-w.js → where-scope-wq2coopv.js} +41 -21
  363. package/dist/{who-can-D0QoYbEb.js → who-can-BwNsI_Js.js} +6 -6
  364. package/dist/workflow/index.d.ts +3 -3
  365. package/dist/workflow/index.js +5 -5
  366. package/dist/workflow-sdk/index.d.ts +5 -5
  367. package/dist/{wrap-Bd1Tejur.d.ts → wrap-B6R0cMRL.d.ts} +2 -2
  368. package/dist/{wrap-gX61EtpB.js → wrap-CiSc_KCq.js} +8 -2
  369. package/package.json +22 -11
  370. package/schemas/cli-result-v1.json +1 -0
  371. package/schemas/cloud-api-v1.json +152 -7
  372. package/schemas/connector-v1.json +8 -0
  373. package/schemas/supabase-claims-v1.json +5 -0
  374. package/schemas/supabase-manifest-v1.json +276 -75
  375. package/skills/permdock/SKILL.md +1 -0
  376. package/skills/permdock-agents/references/runtimes.md +3 -1
  377. package/skills/permdock-approvals/references/stores-and-resume.md +2 -1
  378. package/skills/permdock-data/references/queries-and-rls.md +5 -2
  379. package/skills/permdock-tenancy/SKILL.md +1 -1
  380. package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +2 -0
  381. package/skills/permdock-wire/references/adapters.md +14 -0
  382. package/skills/permdock-wire/references/policy-options.md +1 -0
  383. package/dist/catalog-DjhMYYCq.js +0 -1
  384. package/dist/collect-FlXJlhus.js +0 -1
  385. package/dist/index-D8EovfsP.d.ts +0 -91
  386. package/dist/load-BxEtwlBS.js +0 -1
  387. package/dist/output-files-B3IZJksC.js +0 -1
  388. package/dist/parse-Cxq0WxrA.js +0 -53
  389. package/dist/peer-C8swJ2GH.js +0 -50
  390. package/dist/powersync-CbzkqL_M.js +0 -1
  391. package/dist/powersync-bYUDLOAO.js +0 -538
  392. package/dist/prompt-DfZLJLIn.js +0 -32
  393. package/dist/pull-ByOks_Tg.js +0 -1
  394. package/dist/run-CNsApDpd.js +0 -1
  395. package/dist/supabase-hook-CXcGpHqq.js +0 -1
  396. package/dist/supautils-B6HYL9eL.js +0 -91
  397. package/dist/text-diff-BQcUapOb.js +0 -15
  398. package/dist/usage-CHOtwL19.js +0 -1
  399. package/dist/watch-Cb-NcaUw.js +0 -1
@@ -0,0 +1,1001 @@
1
+ import { r as isRecord, t as compact } from "./compact-CAf557ZB.js";
2
+ import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
3
+ import { d as isoNow } from "./time-DkWjdL98.js";
4
+ import { o as quoteSqlIdent, u as sqlRows } from "./sql-B96movIM.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
+ /** The extension that carries the application's own data (`x`) on a User or a Group. */
15
+ const APP_DATA_EXTENSION = "urn:ietf:params:scim:schemas:extension:permdock:2.0:AppData";
16
+ var DirectoryUniquenessError = class extends Error {
17
+ name = "DirectoryUniquenessError";
18
+ code = "uniqueness";
19
+ constructor(message = "uniqueness") {
20
+ super(message);
21
+ }
22
+ };
23
+ var DirectoryNotFoundError = class extends Error {
24
+ name = "DirectoryNotFoundError";
25
+ code = "not-found";
26
+ constructor(message = "not found") {
27
+ super(message);
28
+ }
29
+ };
30
+ function isNamedError(error, name, code) {
31
+ return error instanceof Error && error.name === name && Reflect.get(error, "code") === code;
32
+ }
33
+ /** Matches by `name` and `code`, so an error from another copy of the module still maps. */
34
+ function isDirectoryUniquenessError(error) {
35
+ return isNamedError(error, "DirectoryUniquenessError", "uniqueness");
36
+ }
37
+ /** Matches by `name` and `code`, so an error from another copy of the module still maps. */
38
+ function isDirectoryNotFoundError(error) {
39
+ return isNamedError(error, "DirectoryNotFoundError", "not-found");
40
+ }
41
+ //#endregion
42
+ //#region src/scim/filter.ts
43
+ const COMPARE = /* @__PURE__ */ new Set([
44
+ "eq",
45
+ "ne",
46
+ "co",
47
+ "sw"
48
+ ]);
49
+ function skipSpace(input, index) {
50
+ let cursor = index;
51
+ while (cursor < input.length && input[cursor] === " ") cursor += 1;
52
+ return cursor;
53
+ }
54
+ function readIdent(input, index) {
55
+ const start = skipSpace(input, index);
56
+ if (!/[A-Za-z]/u.test(input[start] ?? "")) return;
57
+ let cursor = start;
58
+ while (cursor < input.length && /[A-Za-z0-9._]/u.test(input[cursor] ?? "")) cursor += 1;
59
+ return {
60
+ value: input.slice(start, cursor),
61
+ next: cursor
62
+ };
63
+ }
64
+ function readString(input, index) {
65
+ const start = skipSpace(input, index);
66
+ if (input[start] !== "\"") return;
67
+ let cursor = start + 1;
68
+ let value = "";
69
+ while (cursor < input.length) {
70
+ const char = input[cursor];
71
+ if (char === "\\") {
72
+ value += input[cursor + 1] ?? "";
73
+ cursor += 2;
74
+ continue;
75
+ }
76
+ if (char === "\"") return {
77
+ value,
78
+ next: cursor + 1
79
+ };
80
+ value += char;
81
+ cursor += 1;
82
+ }
83
+ }
84
+ function readLiteral(input, index) {
85
+ const quoted = readString(input, index);
86
+ if (quoted !== void 0) return quoted;
87
+ const ident = readIdent(input, index);
88
+ if (ident === void 0) return;
89
+ if (ident.value.toLowerCase() === "true") return {
90
+ value: true,
91
+ next: ident.next
92
+ };
93
+ if (ident.value.toLowerCase() === "false") return {
94
+ value: false,
95
+ next: ident.next
96
+ };
97
+ return {
98
+ value: ident.value,
99
+ next: ident.next
100
+ };
101
+ }
102
+ function parsePrimary(input, index) {
103
+ const start = skipSpace(input, index);
104
+ if (input[start] === "(") {
105
+ const inner = parseOr(input, start + 1);
106
+ if (inner === void 0) return;
107
+ const close = skipSpace(input, inner.next);
108
+ if (input[close] !== ")") return;
109
+ return {
110
+ filter: inner.filter,
111
+ next: close + 1
112
+ };
113
+ }
114
+ const attribute = readIdent(input, start);
115
+ if (attribute === void 0) return;
116
+ const opToken = readIdent(input, attribute.next);
117
+ if (opToken === void 0) return;
118
+ const op = opToken.value.toLowerCase();
119
+ if (op === "pr") return {
120
+ filter: {
121
+ op: "pr",
122
+ attribute: attribute.value
123
+ },
124
+ next: opToken.next
125
+ };
126
+ if (!COMPARE.has(op)) return;
127
+ const value = readLiteral(input, opToken.next);
128
+ if (value === void 0) return;
129
+ return {
130
+ filter: {
131
+ op,
132
+ attribute: attribute.value,
133
+ value: value.value
134
+ },
135
+ next: value.next
136
+ };
137
+ }
138
+ function parseAnd(input, index) {
139
+ const first = parsePrimary(input, index);
140
+ if (first === void 0) return;
141
+ const filters = [first.filter];
142
+ let cursor = first.next;
143
+ for (;;) {
144
+ const nextOp = readIdent(input, cursor);
145
+ if (nextOp?.value.toLowerCase() !== "and") break;
146
+ const next = parsePrimary(input, nextOp.next);
147
+ if (next === void 0) return;
148
+ filters.push(next.filter);
149
+ cursor = next.next;
150
+ }
151
+ if (filters.length === 1) return {
152
+ filter: first.filter,
153
+ next: cursor
154
+ };
155
+ return {
156
+ filter: {
157
+ op: "and",
158
+ filters
159
+ },
160
+ next: cursor
161
+ };
162
+ }
163
+ function parseOr(input, index) {
164
+ const first = parseAnd(input, index);
165
+ if (first === void 0) return;
166
+ const filters = [first.filter];
167
+ let cursor = first.next;
168
+ for (;;) {
169
+ const nextOp = readIdent(input, cursor);
170
+ if (nextOp?.value.toLowerCase() !== "or") break;
171
+ const next = parseAnd(input, nextOp.next);
172
+ if (next === void 0) return;
173
+ filters.push(next.filter);
174
+ cursor = next.next;
175
+ }
176
+ if (filters.length === 1) return {
177
+ filter: first.filter,
178
+ next: cursor
179
+ };
180
+ return {
181
+ filter: {
182
+ op: "or",
183
+ filters
184
+ },
185
+ next: cursor
186
+ };
187
+ }
188
+ function parseScimFilter(input) {
189
+ const trimmed = input.trim();
190
+ if (trimmed === "") return;
191
+ const parsed = parseOr(trimmed, 0);
192
+ if (parsed === void 0) return;
193
+ if (skipSpace(trimmed, parsed.next) !== trimmed.length) return;
194
+ return parsed.filter;
195
+ }
196
+ function readAttribute(target, attribute) {
197
+ if (attribute === "members.value") {
198
+ const members = target["members"];
199
+ if (!Array.isArray(members)) return;
200
+ return members.map((member) => {
201
+ if (member !== null && typeof member === "object" && "value" in member) return member.value;
202
+ });
203
+ }
204
+ const parts = attribute.split(".");
205
+ let current = target;
206
+ for (const part of parts) {
207
+ if (current === null || typeof current !== "object") return;
208
+ current = current[part];
209
+ }
210
+ return current;
211
+ }
212
+ function asString(value) {
213
+ if (typeof value === "boolean") return value ? "true" : "false";
214
+ return String(value);
215
+ }
216
+ function matchCompare(actual, op, expected) {
217
+ if (Array.isArray(actual)) return actual.some((item) => matchCompare(item, op, expected));
218
+ if (actual === void 0 || actual === null) return op === "ne";
219
+ if (typeof expected === "boolean" || typeof actual === "boolean") {
220
+ const left = asString(actual).toLowerCase();
221
+ const right = asString(expected).toLowerCase();
222
+ return op === "eq" ? left === right : op === "ne" ? left !== right : false;
223
+ }
224
+ const left = asString(actual);
225
+ const right = asString(expected);
226
+ switch (op) {
227
+ case "eq": return left === right;
228
+ case "ne": return left !== right;
229
+ case "co": return left.includes(right);
230
+ case "sw": return left.startsWith(right);
231
+ default: return op;
232
+ }
233
+ }
234
+ /** RFC 7644 §3.4.2.2: `pr` needs a non-empty value; a multi-valued one needs an item. */
235
+ function present(value) {
236
+ if (Array.isArray(value)) return value.some(present);
237
+ return value !== void 0 && value !== null && value !== "";
238
+ }
239
+ function matchFilter(target, filter) {
240
+ if (filter === void 0) return true;
241
+ const record = target;
242
+ switch (filter.op) {
243
+ case "and": return filter.filters.every((item) => matchFilter(target, item));
244
+ case "or": return filter.filters.some((item) => matchFilter(target, item));
245
+ case "pr": return present(readAttribute(record, filter.attribute));
246
+ case "eq":
247
+ case "ne":
248
+ case "co":
249
+ case "sw": return matchCompare(readAttribute(record, filter.attribute), filter.op, filter.value);
250
+ default: return filter;
251
+ }
252
+ }
253
+ const SUPPORTED_FILTER_ATTRIBUTES = /* @__PURE__ */ new Set([
254
+ "id",
255
+ "userName",
256
+ "externalId",
257
+ "active",
258
+ "displayName",
259
+ "members.value"
260
+ ]);
261
+ function filterSupported(filter) {
262
+ switch (filter.op) {
263
+ case "and":
264
+ case "or": return filter.filters.every(filterSupported);
265
+ case "pr":
266
+ case "eq":
267
+ case "ne":
268
+ case "co":
269
+ case "sw": return SUPPORTED_FILTER_ATTRIBUTES.has(filter.attribute);
270
+ default: return filter;
271
+ }
272
+ }
273
+ //#endregion
274
+ //#region src/scim/store.ts
275
+ const DEFAULT_COUNT$1 = 100;
276
+ function now() {
277
+ return isoNow();
278
+ }
279
+ function createdAt(at, ...candidates) {
280
+ return candidates.find((value) => value !== void 0 && value !== "") ?? at;
281
+ }
282
+ function randomId$1(prefix) {
283
+ const bytes = /* @__PURE__ */ new Uint8Array(8);
284
+ crypto.getRandomValues(bytes);
285
+ let hex = "";
286
+ for (const byte of bytes) hex += byte.toString(16).padStart(2, "0");
287
+ return `${prefix}${hex}`;
288
+ }
289
+ function directoryKey(tenant, id) {
290
+ return `${tenant}\0${id}`;
291
+ }
292
+ function asError(error) {
293
+ return error instanceof Error ? error : new Error(String(error));
294
+ }
295
+ function pageOf(items, page) {
296
+ const count = page.count ?? DEFAULT_COUNT$1;
297
+ let start = 0;
298
+ if (page.cursor !== void 0 && page.cursor !== "") {
299
+ const decoded = Math.trunc(Number(page.cursor));
300
+ start = Number.isFinite(decoded) && decoded > 0 ? decoded : 0;
301
+ } else if (page.startIndex !== void 0 && page.startIndex > 0) start = page.startIndex - 1;
302
+ const slice = items.slice(start, start + count);
303
+ const nextIndex = start + slice.length;
304
+ return compact({
305
+ Resources: slice,
306
+ totalResults: items.length,
307
+ startIndex: start + 1,
308
+ itemsPerPage: slice.length,
309
+ nextCursor: nextIndex < items.length ? String(nextIndex) : void 0
310
+ });
311
+ }
312
+ function emailsOf(value) {
313
+ if (!Array.isArray(value)) return;
314
+ return value.flatMap((item) => {
315
+ if (item === null || typeof item !== "object") return [];
316
+ const record = item;
317
+ if (typeof record.value !== "string") return [];
318
+ return [compact({
319
+ value: record.value,
320
+ primary: typeof record.primary === "boolean" ? record.primary : void 0,
321
+ type: typeof record.type === "string" ? record.type : void 0
322
+ })];
323
+ });
324
+ }
325
+ function membersOf(value) {
326
+ if (!Array.isArray(value)) return [];
327
+ return value.flatMap((item) => {
328
+ if (item === null || typeof item !== "object") return [];
329
+ const record = item;
330
+ return typeof record.value === "string" ? [{ value: record.value }] : [];
331
+ });
332
+ }
333
+ function rolesOf(value) {
334
+ if (!Array.isArray(value)) return;
335
+ return value.filter((item) => typeof item === "string");
336
+ }
337
+ function memberValues(value) {
338
+ return membersOf(value).map((member) => member.value);
339
+ }
340
+ function applyUserOp(user, op) {
341
+ const path = op.path ?? "";
342
+ if (path === "active" && typeof op.value === "boolean") return {
343
+ ...user,
344
+ active: op.value
345
+ };
346
+ if (path === "userName" && typeof op.value === "string") return {
347
+ ...user,
348
+ userName: op.value
349
+ };
350
+ if (path === "externalId") return compact({
351
+ ...user,
352
+ externalId: typeof op.value === "string" ? op.value : void 0
353
+ });
354
+ if (path === "emails") return compact({
355
+ ...user,
356
+ emails: emailsOf(op.value)
357
+ });
358
+ return user;
359
+ }
360
+ function applyGroupOp(group, op) {
361
+ const path = op.path ?? "";
362
+ if (path === "displayName" && typeof op.value === "string") return {
363
+ ...group,
364
+ displayName: op.value
365
+ };
366
+ if (path === "externalId") return compact({
367
+ ...group,
368
+ externalId: typeof op.value === "string" ? op.value : void 0
369
+ });
370
+ if (path === "roles") return compact({
371
+ ...group,
372
+ roles: rolesOf(op.value)
373
+ });
374
+ if (path !== "members") return group;
375
+ const incoming = memberValues(op.value);
376
+ const current = group.members.map((member) => member.value);
377
+ if (op.op === "replace") return {
378
+ ...group,
379
+ members: incoming.map((value) => ({ value }))
380
+ };
381
+ if (op.op === "add") {
382
+ const next = [...current];
383
+ for (const value of incoming) if (!next.includes(value)) next.push(value);
384
+ return {
385
+ ...group,
386
+ members: next.map((value) => ({ value }))
387
+ };
388
+ }
389
+ return {
390
+ ...group,
391
+ members: current.filter((value) => !incoming.includes(value)).map((value) => ({ value }))
392
+ };
393
+ }
394
+ function stampUser(user, created) {
395
+ const at = now();
396
+ return freezeDeep({
397
+ ...user,
398
+ meta: compact({
399
+ created: createdAt(at, created, user.meta.created),
400
+ lastModified: at,
401
+ resourceType: "User",
402
+ location: user.meta.location
403
+ })
404
+ });
405
+ }
406
+ function stampGroup(group, created) {
407
+ const at = now();
408
+ return freezeDeep({
409
+ ...group,
410
+ meta: compact({
411
+ created: createdAt(at, created, group.meta.created),
412
+ lastModified: at,
413
+ resourceType: "Group",
414
+ location: group.meta.location
415
+ })
416
+ });
417
+ }
418
+ function memoryDirectoryStore() {
419
+ const users = /* @__PURE__ */ new Map();
420
+ const groups = /* @__PURE__ */ new Map();
421
+ function usersIn(tenant) {
422
+ const found = [];
423
+ for (const [key, user] of users) if (key.startsWith(`${tenant}\0`)) found.push(user);
424
+ return found;
425
+ }
426
+ function groupsIn(tenant) {
427
+ const found = [];
428
+ for (const [key, group] of groups) if (key.startsWith(`${tenant}\0`)) found.push(group);
429
+ return found;
430
+ }
431
+ function assertUserUnique(tenant, user, ignoreId) {
432
+ for (const existing of usersIn(tenant)) {
433
+ if (existing.id === ignoreId) continue;
434
+ if (existing.userName === user.userName) throw new DirectoryUniquenessError("userName");
435
+ if (user.externalId !== void 0 && existing.externalId === user.externalId) throw new DirectoryUniquenessError("externalId");
436
+ }
437
+ }
438
+ function assertGroupUnique(tenant, group, ignoreId) {
439
+ for (const existing of groupsIn(tenant)) {
440
+ if (existing.id === ignoreId) continue;
441
+ if (group.externalId !== void 0 && existing.externalId === group.externalId) throw new DirectoryUniquenessError("externalId");
442
+ }
443
+ }
444
+ return {
445
+ getUser(tenant, id) {
446
+ return Promise.resolve(users.get(directoryKey(tenant, id)) ?? null);
447
+ },
448
+ findUsers(tenant, filter, page) {
449
+ const matched = usersIn(tenant).filter((user) => matchFilter(user, filter));
450
+ return Promise.resolve(pageOf(matched, page));
451
+ },
452
+ putUser(tenant, user) {
453
+ try {
454
+ const id = user.id === "" ? randomId$1("u_") : user.id;
455
+ const existing = users.get(directoryKey(tenant, id));
456
+ const next = stampUser({
457
+ ...user,
458
+ id
459
+ }, existing?.meta.created);
460
+ assertUserUnique(tenant, next, id);
461
+ users.set(directoryKey(tenant, id), next);
462
+ return Promise.resolve(next);
463
+ } catch (error) {
464
+ return Promise.reject(asError(error));
465
+ }
466
+ },
467
+ patchUser(tenant, id, ops) {
468
+ try {
469
+ const existing = users.get(directoryKey(tenant, id));
470
+ if (existing === void 0) throw new DirectoryNotFoundError();
471
+ let next = existing;
472
+ for (const op of ops) next = applyUserOp(next, op);
473
+ next = stampUser(next, existing.meta.created);
474
+ assertUserUnique(tenant, next, id);
475
+ users.set(directoryKey(tenant, id), next);
476
+ return Promise.resolve(next);
477
+ } catch (error) {
478
+ return Promise.reject(asError(error));
479
+ }
480
+ },
481
+ deleteUser(tenant, id) {
482
+ if (!users.delete(directoryKey(tenant, id))) return Promise.reject(new DirectoryNotFoundError());
483
+ for (const group of groupsIn(tenant)) {
484
+ if (!group.members.some((member) => member.value === id)) continue;
485
+ groups.set(directoryKey(tenant, group.id), stampGroup({
486
+ ...group,
487
+ members: group.members.filter((member) => member.value !== id)
488
+ }, group.meta.created));
489
+ }
490
+ return Promise.resolve();
491
+ },
492
+ getGroup(tenant, id) {
493
+ return Promise.resolve(groups.get(directoryKey(tenant, id)) ?? null);
494
+ },
495
+ findGroups(tenant, filter, page) {
496
+ const matched = groupsIn(tenant).filter((group) => matchFilter(group, filter));
497
+ return Promise.resolve(pageOf(matched, page));
498
+ },
499
+ putGroup(tenant, group) {
500
+ try {
501
+ const id = group.id === "" ? randomId$1("g_") : group.id;
502
+ const existing = groups.get(directoryKey(tenant, id));
503
+ const next = stampGroup({
504
+ ...group,
505
+ id,
506
+ members: group.members
507
+ }, existing?.meta.created);
508
+ assertGroupUnique(tenant, next, id);
509
+ groups.set(directoryKey(tenant, id), next);
510
+ return Promise.resolve(next);
511
+ } catch (error) {
512
+ return Promise.reject(asError(error));
513
+ }
514
+ },
515
+ patchGroup(tenant, id, ops) {
516
+ try {
517
+ const existing = groups.get(directoryKey(tenant, id));
518
+ if (existing === void 0) throw new DirectoryNotFoundError();
519
+ let next = existing;
520
+ for (const op of ops) next = applyGroupOp(next, op);
521
+ next = stampGroup(next, existing.meta.created);
522
+ assertGroupUnique(tenant, next, id);
523
+ groups.set(directoryKey(tenant, id), next);
524
+ return Promise.resolve(next);
525
+ } catch (error) {
526
+ return Promise.reject(asError(error));
527
+ }
528
+ },
529
+ deleteGroup(tenant, id) {
530
+ if (!groups.delete(directoryKey(tenant, id))) return Promise.reject(new DirectoryNotFoundError());
531
+ return Promise.resolve();
532
+ },
533
+ groupsFor(tenant, userId) {
534
+ return Promise.resolve(groupsIn(tenant).filter((group) => group.members.some((member) => member.value === userId)));
535
+ }
536
+ };
537
+ }
538
+ //#endregion
539
+ //#region src/scim/postgres-store.ts
540
+ /** The tables `permdock scim generate` writes; their names are the contract this store reads. */
541
+ const SCIM_TABLES = {
542
+ users: "scim_users",
543
+ groups: "scim_groups",
544
+ members: "scim_group_members"
545
+ };
546
+ /** The constraints whose violation is a SCIM `409 uniqueness`, by the attribute they cover. */
547
+ const SCIM_UNIQUE = {
548
+ userName: "scim_users_user_name_key",
549
+ userExternalId: "scim_users_external_id_key",
550
+ groupExternalId: "scim_groups_external_id_key"
551
+ };
552
+ const SCIM_SCHEMA = "permdock";
553
+ const DEFAULT_COUNT = 100;
554
+ /** A PATCH re-reads and retries when another write changed the row in between. */
555
+ const PATCH_ATTEMPTS = 8;
556
+ const iso = (column) => `to_char(${column} at time zone 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"')`;
557
+ function userJson(alias) {
558
+ return `jsonb_build_object(
559
+ 'id', ${alias}.id, 'userName', ${alias}.user_name, 'externalId', ${alias}.external_id,
560
+ 'active', ${alias}.active, 'emails', ${alias}.emails, 'x', ${alias}.x,
561
+ 'created', ${iso(`${alias}.created_at`)}, 'lastModified', ${iso(`${alias}.updated_at`)},
562
+ 'revision', ${alias}.revision)`;
563
+ }
564
+ function groupJson(alias, members) {
565
+ return `jsonb_build_object(
566
+ 'id', ${alias}.id, 'displayName', ${alias}.display_name, 'externalId', ${alias}.external_id,
567
+ 'roles', to_jsonb(${alias}.roles), 'x', ${alias}.x, 'members', ${members},
568
+ 'created', ${iso(`${alias}.created_at`)}, 'lastModified', ${iso(`${alias}.updated_at`)},
569
+ 'revision', ${alias}.revision)`;
570
+ }
571
+ function membersOfGroup(tables, alias) {
572
+ return `coalesce((select jsonb_agg(m.user_id order by m.position) from ${tables.members} m
573
+ where m.tenant = ${alias}.tenant and m.group_id = ${alias}.id), '[]'::jsonb)`;
574
+ }
575
+ function parsed(value) {
576
+ return typeof value === "string" ? JSON.parse(value) : value;
577
+ }
578
+ function text(value) {
579
+ return typeof value === "string" ? value : void 0;
580
+ }
581
+ function appData(value) {
582
+ return isRecord(value) ? value : void 0;
583
+ }
584
+ function storedUser(value) {
585
+ const row = parsed(value);
586
+ if (!isRecord(row)) throw new Error("PermDock: postgresDirectoryStore read a malformed user");
587
+ return {
588
+ revision: Number(row["revision"]),
589
+ resource: compact({
590
+ id: String(row["id"]),
591
+ userName: String(row["userName"]),
592
+ externalId: text(row["externalId"]),
593
+ active: row["active"] === true,
594
+ emails: emailsOf(row["emails"]),
595
+ x: appData(row["x"]),
596
+ meta: {
597
+ created: String(row["created"]),
598
+ lastModified: String(row["lastModified"]),
599
+ resourceType: "User"
600
+ }
601
+ })
602
+ };
603
+ }
604
+ function storedGroup(value) {
605
+ const row = parsed(value);
606
+ if (!isRecord(row)) throw new Error("PermDock: postgresDirectoryStore read a malformed group");
607
+ const members = Array.isArray(row["members"]) ? row["members"] : [];
608
+ const roles = row["roles"];
609
+ return {
610
+ revision: Number(row["revision"]),
611
+ resource: compact({
612
+ id: String(row["id"]),
613
+ displayName: String(row["displayName"]),
614
+ externalId: text(row["externalId"]),
615
+ members: members.flatMap((member) => typeof member === "string" ? [{ value: member }] : []),
616
+ roles: Array.isArray(roles) ? roles.filter((role) => typeof role === "string") : void 0,
617
+ x: appData(row["x"]),
618
+ meta: {
619
+ created: String(row["created"]),
620
+ lastModified: String(row["lastModified"]),
621
+ resourceType: "Group"
622
+ }
623
+ })
624
+ };
625
+ }
626
+ /** A stored or IdP-sent `meta.created` the database can read; anything else is "now". */
627
+ function createdParam(created) {
628
+ return created !== "" && !Number.isNaN(Date.parse(created)) ? created : null;
629
+ }
630
+ function json(value) {
631
+ return value === void 0 ? null : JSON.stringify(value);
632
+ }
633
+ function randomId(prefix) {
634
+ const bytes = /* @__PURE__ */ new Uint8Array(8);
635
+ crypto.getRandomValues(bytes);
636
+ let hex = "";
637
+ for (const byte of bytes) hex += byte.toString(16).padStart(2, "0");
638
+ return `${prefix}${hex}`;
639
+ }
640
+ /** Each value once, first occurrence first: one member row per user. */
641
+ function uniqueMembers(group) {
642
+ return [...new Set(group.members.map((member) => member.value))];
643
+ }
644
+ function constraintOf(error) {
645
+ for (const key of [
646
+ "constraint",
647
+ "constraint_name",
648
+ "detail",
649
+ "message"
650
+ ]) {
651
+ const value = error[key];
652
+ if (typeof value === "string" && value !== "") return value;
653
+ }
654
+ return "";
655
+ }
656
+ /** A unique violation (`23505`) as `DirectoryUniquenessError`; any other error is rethrown. */
657
+ function uniqueness(error, kind) {
658
+ if (isRecord(error) && error["code"] === "23505") {
659
+ const constraint = constraintOf(error);
660
+ throw new DirectoryUniquenessError(kind === "user" && (constraint.includes(SCIM_UNIQUE.userName) || constraint.includes("user_name")) ? "userName" : "externalId");
661
+ }
662
+ throw error;
663
+ }
664
+ const COLUMNS = {
665
+ user: {
666
+ id: "u.id",
667
+ userName: "u.user_name",
668
+ externalId: "u.external_id",
669
+ active: "u.active::text"
670
+ },
671
+ group: {
672
+ id: "g.id",
673
+ displayName: "g.display_name",
674
+ externalId: "g.external_id"
675
+ }
676
+ };
677
+ function asText(value) {
678
+ return typeof value === "boolean" ? String(value) : value;
679
+ }
680
+ /**
681
+ * The SQL twin of `matchFilter`: a missing attribute matches only `ne`, and
682
+ * booleans compare case-insensitively and only with `eq` / `ne`.
683
+ */
684
+ function compare(column, op, value, bind, caseless) {
685
+ if (caseless && (op === "co" || op === "sw")) return "false";
686
+ const left = caseless ? `lower(${column})` : column;
687
+ const right = bind(caseless ? asText(value).toLowerCase() : value);
688
+ switch (op) {
689
+ case "eq": return `${left} = ${right}`;
690
+ case "ne": return `${left} is distinct from ${right}`;
691
+ case "co": return `strpos(${left}, ${right}) > 0`;
692
+ case "sw": return `starts_with(${left}, ${right})`;
693
+ default: return op;
694
+ }
695
+ }
696
+ function compileFilter(filter, kind, tables, bind) {
697
+ switch (filter.op) {
698
+ case "and":
699
+ case "or": return `(${filter.filters.map((item) => compileFilter(item, kind, tables, bind)).join(` ${filter.op} `)})`;
700
+ case "pr":
701
+ case "eq":
702
+ case "ne":
703
+ case "co":
704
+ case "sw": {
705
+ if (filter.attribute === "members.value") {
706
+ if (kind !== "group") return filter.op === "ne" ? "true" : "false";
707
+ const member = filter.op === "pr" ? "true" : compare("m.user_id", filter.op, filter.value, bind, false);
708
+ return `exists (select 1 from ${tables.members} m where m.tenant = g.tenant and m.group_id = g.id and ${member})`;
709
+ }
710
+ const column = COLUMNS[kind][filter.attribute];
711
+ if (column === void 0) return filter.op === "ne" ? "true" : "false";
712
+ if (filter.op === "pr") return `coalesce(${column}, '') <> ''`;
713
+ const caseless = typeof filter.value === "boolean" || filter.attribute === "active";
714
+ return compare(column, filter.op, filter.value, bind, caseless);
715
+ }
716
+ default: return filter;
717
+ }
718
+ }
719
+ function where(tenant, filter, kind, tables) {
720
+ const params = [tenant];
721
+ const bind = (value) => {
722
+ params.push(value);
723
+ return `$${String(params.length)}`;
724
+ };
725
+ return {
726
+ sql: `${kind === "group" ? "g" : "u"}.tenant = $1 and ${filter === void 0 ? "true" : compileFilter(filter, kind, tables, bind)}`,
727
+ params
728
+ };
729
+ }
730
+ /** A non-negative safe integer from `value`, or `fallback`. */
731
+ function wholeOr(value, fallback) {
732
+ const whole = value === void 0 ? NaN : Math.trunc(value);
733
+ return Number.isSafeInteger(whole) && whole >= 0 ? whole : fallback;
734
+ }
735
+ function window(page) {
736
+ const count = page.count !== void 0 && page.count < 0 ? 0 : wholeOr(page.count, DEFAULT_COUNT);
737
+ if (page.cursor !== void 0 && page.cursor !== "") return {
738
+ offset: wholeOr(Number(page.cursor), 0),
739
+ count
740
+ };
741
+ return {
742
+ offset: Math.max(0, wholeOr(page.startIndex, 1) - 1),
743
+ count
744
+ };
745
+ }
746
+ function pageResult(items, total, offset) {
747
+ const next = offset + items.length;
748
+ return compact({
749
+ Resources: items,
750
+ totalResults: total,
751
+ startIndex: offset + 1,
752
+ itemsPerPage: items.length,
753
+ nextCursor: next < total ? String(next) : void 0
754
+ });
755
+ }
756
+ function userParams(tenant, user, createdOrRevision, now) {
757
+ return [
758
+ tenant,
759
+ user.id,
760
+ user.userName,
761
+ user.externalId ?? null,
762
+ user.active,
763
+ json(user.emails),
764
+ json(user.x),
765
+ createdOrRevision,
766
+ now
767
+ ];
768
+ }
769
+ function groupParams(tenant, group, createdOrRevision, now) {
770
+ return [
771
+ tenant,
772
+ group.id,
773
+ group.displayName,
774
+ group.externalId ?? null,
775
+ group.roles === void 0 ? null : [...group.roles],
776
+ json(group.x),
777
+ createdOrRevision,
778
+ now,
779
+ uniqueMembers(group)
780
+ ];
781
+ }
782
+ /** Reads the row, applies the operations and writes only if no other write landed in between; `write` answers `null` then. */
783
+ async function patch(read, ops, step, write, label) {
784
+ for (let attempt = 0; attempt < PATCH_ATTEMPTS; attempt += 1) {
785
+ const current = await read();
786
+ if (current === null) throw new DirectoryNotFoundError();
787
+ let next = current.resource;
788
+ for (const op of ops) next = step(next, op);
789
+ const written = await write(next, current.revision);
790
+ if (written !== null) return written;
791
+ }
792
+ throw new Error(`PermDock: postgresDirectoryStore: ${label} kept changing during a PATCH`);
793
+ }
794
+ function statements(tables) {
795
+ const upsertUser = `insert into ${tables.users} as u
796
+ (tenant, id, user_name, external_id, active, emails, x, created_at, updated_at)
797
+ values ($1, $2, $3, $4, $5, $6::jsonb, $7::jsonb, coalesce($8::timestamptz, $9::timestamptz), $9::timestamptz)
798
+ on conflict (tenant, id) do update set
799
+ user_name = excluded.user_name, external_id = excluded.external_id, active = excluded.active,
800
+ emails = excluded.emails, x = excluded.x, updated_at = excluded.updated_at, revision = u.revision + 1
801
+ returning ${userJson("u")} as resource`;
802
+ const updateUser = `update ${tables.users} as u set
803
+ user_name = $3, external_id = $4, active = $5, emails = $6::jsonb, x = $7::jsonb,
804
+ updated_at = $9::timestamptz, revision = u.revision + 1
805
+ where u.tenant = $1 and u.id = $2 and u.revision = $8
806
+ returning ${userJson("u")} as resource`;
807
+ const members = `dropped as (
808
+ delete from ${tables.members} m using g
809
+ where m.tenant = g.tenant and m.group_id = g.id and not (m.user_id = any($9::text[]))
810
+ ),
811
+ kept as (
812
+ insert into ${tables.members} (tenant, group_id, user_id, position)
813
+ select g.tenant, g.id, v.user_id, v.position::integer
814
+ from g cross join unnest($9::text[]) with ordinality as v(user_id, position)
815
+ on conflict (tenant, group_id, user_id) do update set position = excluded.position
816
+ )
817
+ select ${groupJson("g", "to_jsonb($9::text[])")} as resource from g`;
818
+ const upsertGroup = `with g as (
819
+ insert into ${tables.groups} as t
820
+ (tenant, id, display_name, external_id, roles, x, created_at, updated_at)
821
+ values ($1, $2, $3, $4, $5::text[], $6::jsonb, coalesce($7::timestamptz, $8::timestamptz), $8::timestamptz)
822
+ on conflict (tenant, id) do update set
823
+ display_name = excluded.display_name, external_id = excluded.external_id, roles = excluded.roles,
824
+ x = excluded.x, updated_at = excluded.updated_at, revision = t.revision + 1
825
+ returning t.*
826
+ ),
827
+ ${members}`;
828
+ const updateGroup = `with g as (
829
+ update ${tables.groups} as t set
830
+ display_name = $3, external_id = $4, roles = $5::text[], x = $6::jsonb,
831
+ updated_at = $8::timestamptz, revision = t.revision + 1
832
+ where t.tenant = $1 and t.id = $2 and t.revision = $7
833
+ returning t.*
834
+ ),
835
+ ${members}`;
836
+ return {
837
+ getUser: `select ${userJson("u")} as resource from ${tables.users} u where u.tenant = $1 and u.id = $2`,
838
+ getGroup: `select ${groupJson("g", membersOfGroup(tables, "g"))} as resource
839
+ from ${tables.groups} g where g.tenant = $1 and g.id = $2`,
840
+ upsertUser,
841
+ updateUser,
842
+ upsertGroup,
843
+ updateGroup,
844
+ deleteUser: `with d as (
845
+ delete from ${tables.users} where tenant = $1 and id = $2 returning tenant, id
846
+ ),
847
+ m as (
848
+ delete from ${tables.members} mm using d
849
+ where mm.tenant = d.tenant and mm.user_id = d.id returning mm.group_id
850
+ ),
851
+ touched as (
852
+ update ${tables.groups} t set updated_at = $3::timestamptz, revision = t.revision + 1
853
+ where t.tenant = $1 and t.id in (select group_id from m)
854
+ )
855
+ select count(*)::integer as deleted from d`,
856
+ deleteGroup: `delete from ${tables.groups} where tenant = $1 and id = $2 returning id`,
857
+ groupsFor: `select ${groupJson("g", membersOfGroup(tables, "g"))} as resource
858
+ from ${tables.groups} g
859
+ where g.tenant = $1 and exists (
860
+ select 1 from ${tables.members} m where m.tenant = g.tenant and m.group_id = g.id and m.user_id = $2
861
+ )
862
+ order by g.seq`
863
+ };
864
+ }
865
+ function findSql(kind, tables, clause, page) {
866
+ const table = kind === "user" ? tables.users : tables.groups;
867
+ const alias = kind === "user" ? "u" : "g";
868
+ const resource = kind === "user" ? userJson(alias) : groupJson(alias, membersOfGroup(tables, alias));
869
+ return `with matched as (
870
+ select ${alias}.seq from ${table} ${alias} where ${clause}
871
+ ),
872
+ paged as (
873
+ select seq from matched order by seq offset ${page.offset}::bigint limit ${page.count}::bigint
874
+ )
875
+ select (select count(*)::integer from matched) as total,
876
+ coalesce((
877
+ select jsonb_agg(${resource} order by ${alias}.seq)
878
+ from ${table} ${alias} join paged p on p.seq = ${alias}.seq
879
+ ), '[]'::jsonb) as resources`;
880
+ }
881
+ /**
882
+ * A `DirectoryStore` over the tables `permdock scim generate` writes, called
883
+ * through a `SqlQuery` that may read and write them (the table owner, or a
884
+ * role granted on them). Every method is one statement, so a pool needs no
885
+ * transaction: a group and its members change together, and a PATCH that
886
+ * races another write re-reads the row and applies its operations again.
887
+ */
888
+ function postgresDirectoryStore(query, options = {}) {
889
+ const schema = quoteSqlIdent(options.schema ?? "permdock");
890
+ const tables = {
891
+ users: `${schema}.${quoteSqlIdent(SCIM_TABLES.users)}`,
892
+ groups: `${schema}.${quoteSqlIdent(SCIM_TABLES.groups)}`,
893
+ members: `${schema}.${quoteSqlIdent(SCIM_TABLES.members)}`
894
+ };
895
+ const sql = statements(tables);
896
+ const rows = async (statement, values) => sqlRows(await query(statement, values));
897
+ async function readUser(tenant, id) {
898
+ const [row] = await rows(sql.getUser, [tenant, id]);
899
+ return row === void 0 ? null : storedUser(row["resource"]);
900
+ }
901
+ async function readGroup(tenant, id) {
902
+ const [row] = await rows(sql.getGroup, [tenant, id]);
903
+ return row === void 0 ? null : storedGroup(row["resource"]);
904
+ }
905
+ async function find(kind, tenant, filter, page, read) {
906
+ const paging = window(page);
907
+ const clause = where(tenant, filter, kind, tables);
908
+ const next = clause.params.length;
909
+ const [row] = await rows(findSql(kind, tables, clause.sql, {
910
+ offset: `$${String(next + 1)}`,
911
+ count: `$${String(next + 2)}`
912
+ }), [
913
+ ...clause.params,
914
+ paging.offset,
915
+ paging.count
916
+ ]);
917
+ const resources = parsed(row?.["resources"]);
918
+ return pageResult(Array.isArray(resources) ? resources.map((item) => read(item).resource) : [], Number(row?.["total"] ?? 0), paging.offset);
919
+ }
920
+ return {
921
+ name: "postgres",
922
+ async getUser(tenant, id) {
923
+ return (await readUser(tenant, id))?.resource ?? null;
924
+ },
925
+ findUsers(tenant, filter, page) {
926
+ return find("user", tenant, filter, page, storedUser);
927
+ },
928
+ async putUser(tenant, user) {
929
+ const id = user.id === "" ? randomId("u_") : user.id;
930
+ try {
931
+ const [row] = await rows(sql.upsertUser, userParams(tenant, {
932
+ ...user,
933
+ id
934
+ }, createdParam(user.meta.created), isoNow()));
935
+ return storedUser(row?.["resource"]).resource;
936
+ } catch (error) {
937
+ return uniqueness(error, "user");
938
+ }
939
+ },
940
+ patchUser(tenant, id, ops) {
941
+ return patch(() => readUser(tenant, id), ops, applyUserOp, async (next, revision) => {
942
+ try {
943
+ const [row] = await rows(sql.updateUser, userParams(tenant, {
944
+ ...next,
945
+ id
946
+ }, revision, isoNow()));
947
+ return row === void 0 ? null : storedUser(row["resource"]).resource;
948
+ } catch (error) {
949
+ return uniqueness(error, "user");
950
+ }
951
+ }, `user ${id}`);
952
+ },
953
+ async deleteUser(tenant, id) {
954
+ const [row] = await rows(sql.deleteUser, [
955
+ tenant,
956
+ id,
957
+ isoNow()
958
+ ]);
959
+ if (Number(row?.["deleted"] ?? 0) === 0) throw new DirectoryNotFoundError();
960
+ },
961
+ async getGroup(tenant, id) {
962
+ return (await readGroup(tenant, id))?.resource ?? null;
963
+ },
964
+ findGroups(tenant, filter, page) {
965
+ return find("group", tenant, filter, page, storedGroup);
966
+ },
967
+ async putGroup(tenant, group) {
968
+ const id = group.id === "" ? randomId("g_") : group.id;
969
+ try {
970
+ const [row] = await rows(sql.upsertGroup, groupParams(tenant, {
971
+ ...group,
972
+ id
973
+ }, createdParam(group.meta.created), isoNow()));
974
+ return storedGroup(row?.["resource"]).resource;
975
+ } catch (error) {
976
+ return uniqueness(error, "group");
977
+ }
978
+ },
979
+ patchGroup(tenant, id, ops) {
980
+ return patch(() => readGroup(tenant, id), ops, applyGroupOp, async (next, revision) => {
981
+ try {
982
+ const [row] = await rows(sql.updateGroup, groupParams(tenant, {
983
+ ...next,
984
+ id
985
+ }, revision, isoNow()));
986
+ return row === void 0 ? null : storedGroup(row["resource"]).resource;
987
+ } catch (error) {
988
+ return uniqueness(error, "group");
989
+ }
990
+ }, `group ${id}`);
991
+ },
992
+ async deleteGroup(tenant, id) {
993
+ if ((await rows(sql.deleteGroup, [tenant, id])).length === 0) throw new DirectoryNotFoundError();
994
+ },
995
+ async groupsFor(tenant, userId) {
996
+ return (await rows(sql.groupsFor, [tenant, userId])).map((row) => storedGroup(row["resource"]).resource);
997
+ }
998
+ };
999
+ }
1000
+ //#endregion
1001
+ 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 };