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.
- package/README.md +2 -3
- package/dist/{2020-C9VN-x8c.js → 2020-CJbO8Bvz.js} +1 -3
- package/dist/a2a/index.d.ts +7 -7
- package/dist/a2a/index.js +9 -9
- package/dist/action-result-CL-QCITA.d.ts +19 -0
- package/dist/{adapter-context-CRhqyzCk.js → adapter-context-CIQpQxbE.js} +8 -2
- package/dist/{adoption-scan-DCYe60Pi.js → adoption-scan-BLs67P1l.js} +5 -5
- package/dist/agent/index.d.ts +3 -3
- package/dist/agent/index.js +1 -1
- package/dist/ai-sdk/index.d.ts +31 -10
- package/dist/ai-sdk/index.js +22 -12
- package/dist/{app-data-MuyzVqX8.js → app-data-UNNm07jV.js} +10 -7
- package/dist/{approval-header-CJACtHkv.js → approval-header-8QV6MU4H.js} +6 -3
- package/dist/{approval-prompt-Dg5LeAcT.js → approval-prompt-B8hQY69x.js} +5 -6
- package/dist/{approval-prompt-DvSSPQJX.d.ts → approval-prompt-PYagyQUj.d.ts} +13 -11
- package/dist/approvals/index.d.ts +5 -5
- package/dist/approvals/index.js +7 -7
- package/dist/{approvals-p1PGoVjb.js → approvals-DnIBTuXE.js} +128 -78
- package/dist/{approvers-CqPOLD-o.js → approvers-B4r0N_Uz.js} +8 -2
- package/dist/{arazzo-41WuzHou.js → arazzo-3RhGfkAK.js} +2 -2
- package/dist/{arazzo-CaUVBn7D.js → arazzo-B5-ulWif.js} +6 -6
- package/dist/{args-IIolxxKA.js → args-0FrVs5EH.js} +125 -8
- package/dist/astro/index.d.ts +30 -12
- package/dist/astro/index.js +2 -2
- package/dist/{audience-DabClFLQ.js → audience-BAkBDMqn.js} +8 -8
- package/dist/{auth-DRLEizbL.js → auth--yPyZNgr.js} +21 -10
- package/dist/authzen/index.d.ts +171 -25
- package/dist/authzen/index.js +321 -149
- package/dist/{automation-BNM3TtDo.d.ts → automation-DqEoWHBc.d.ts} +42 -32
- package/dist/{automation-DVjOckjV.js → automation-x3KEUusw.js} +22 -21
- package/dist/base-url-BQbddZO5.js +9 -0
- package/dist/better-auth/index.d.ts +2 -2
- package/dist/better-auth/index.js +13 -7
- package/dist/better-supabase/index.d.ts +392 -220
- package/dist/better-supabase/index.js +293 -152
- package/dist/{bind-DOyrv6zi.d.ts → bind-Cp2hBHzP.d.ts} +27 -12
- package/dist/{bind-CAvgUuKs.js → bind-D_sZSVA3.js} +22 -10
- package/dist/{body-CH5of8Ne.js → body-CJQwYVa8.js} +3 -3
- package/dist/{body-text-QcXok_SI.js → body-text-DQhcmqdY.js} +8 -4
- package/dist/{boundary-BM8a_P6E.js → boundary-BV3O1eud.js} +8 -2
- package/dist/{boundary-BmHxVH1J.d.ts → boundary-C9ck-3uK.d.ts} +13 -4
- package/dist/{budget-NbEtbJC_.js → budget-BELja5A9.js} +6 -3
- package/dist/{budget-JqcRqyhK.d.ts → budget-hYsPz_yE.d.ts} +6 -3
- package/dist/{build-instance-Bu_eDqYw.js → build-instance-CNWaYJyr.js} +3 -3
- package/dist/{canonical-json-BC8_nMTw.js → canonical-json-DwilZ1iB.js} +6 -3
- package/dist/{capability-N1K9IpqS.js → capability-BqX94r07.js} +31 -25
- package/dist/{capability-Drg-1YhL.d.ts → capability-ChuiONQU.d.ts} +41 -29
- package/dist/{casbin-Dyu2gnUD.js → casbin-H0rKxBx2.js} +16 -8
- package/dist/{casbin-Cr7RLtA3.js → casbin-cbSbhT_k.js} +2 -2
- package/dist/{casl-64gpT-8x.js → casl-C4OINZHI.js} +2 -2
- package/dist/{casl-DjEDhTCP.js → casl-CHHoCldP.js} +19 -10
- package/dist/catalog/index.d.ts +104 -23
- package/dist/catalog/index.js +117 -8
- package/dist/{catalog-HD2gf5mY.js → catalog-BFpz2EmT.js} +57 -26
- package/dist/{catalog-DZVbrF-z.js → catalog-DCspHDc8.js} +3 -3
- package/dist/{catalog-doc-Cdn7-0pQ.js → catalog-doc-DjMKzJp9.js} +53 -16
- package/dist/{catalog-fingerprint-CCP0-yQS.js → catalog-fingerprint-e6aCWosn.js} +19 -15
- package/dist/catalog-mRQQQhNK.js +1 -0
- package/dist/catalog-operations-Dadrl7Z-.js +60 -0
- package/dist/{create-CQWIpUG-.js → challenge-DImNcR7B.js} +157 -39
- package/dist/chat/index.d.ts +1 -1
- package/dist/chat/index.js +13 -10
- package/dist/chat-sdk/index.d.ts +44 -26
- package/dist/chat-sdk/index.js +17 -17
- package/dist/checks-CGkP3Z7A.js +40 -0
- package/dist/{claims-map-7oQ3ue4X.js → claims-map-CKkoAAYF.js} +5 -2
- package/dist/{claims-map-Ca-QX8C6.d.ts → claims-map-D1Pb5oRq.d.ts} +8 -5
- package/dist/claude-agent/index.d.ts +6 -6
- package/dist/claude-agent/index.js +6 -3
- package/dist/clerk/index.d.ts +11 -7
- package/dist/clerk/index.js +6 -6
- package/dist/cli/bin.js +4 -4
- package/dist/cli/index.d.ts +82 -7
- package/dist/cli/index.js +6 -6
- package/dist/{clients-C7zLFuWT.d.ts → clients-C_NOET3z.d.ts} +5 -5
- package/dist/{clients-DjU5ABMy.js → clients-DYr3U86j.js} +3 -3
- package/dist/cloud/index.d.ts +186 -38
- package/dist/cloud/index.js +293 -31
- package/dist/{cloud-ytQ3uviA.js → cloud-BFlGMaak.js} +5 -6
- package/dist/{codemod-5mpSpnUY.js → codemod-DLQ9Zpo4.js} +3 -4
- package/dist/{codemod-ua2hHy7w.js → codemod-DWSN2erG.js} +523 -201
- package/dist/collect-B5BL3klN.js +1 -0
- package/dist/{collect-mLTY4nwb.js → collect-B7ZFAJU3.js} +36 -64
- package/dist/{collect-Ci6akVwH.js → collect-Bzv3le0A.js} +6 -6
- package/dist/{compare-pfyVnBjE.js → compare-DTfyUunF.js} +2 -2
- package/dist/compile/index.d.ts +2 -2
- package/dist/compile/index.js +1 -1
- package/dist/{compile-1bsAezL0.d.ts → compile-BFzysW3o.d.ts} +36 -12
- package/dist/{compile-CMqMx_IN.js → compile-EzEMB-7v.js} +77 -33
- package/dist/{completion-BTFrHZhX.js → completion-saoYiRFO.js} +17 -8
- package/dist/config-BwPBfN0t.js +108 -0
- package/dist/{config-Bj2Ixq3d.js → config-DBeXXmBF.js} +2 -2
- package/dist/{config-report-DSpsLpCE.js → config-report-BipSWA6V.js} +9 -6
- package/dist/config-shape-ykV0Vm2n.js +134 -0
- package/dist/{connection-DjhIJSs2.js → connection-B72dg5Q2.js} +23 -22
- package/dist/connector-schema-CYLQNMYq.js +434 -0
- package/dist/{context-B_u3_bDJ.js → context-BnIzxTNE.js} +4 -3
- package/dist/convex/index.d.ts +13 -7
- package/dist/convex/index.js +9 -6
- package/dist/core-H-mbhpZc.js +341 -0
- package/dist/core-hWIARPDz.d.ts +206 -0
- package/dist/{create-CBMmFie-.d.ts → create-BSNrVuxh.d.ts} +87 -34
- package/dist/{create-B30OMUOJ.d.ts → create-BVq1lNQE.d.ts} +49 -28
- package/dist/{create-D_NmPOdH.d.ts → create-CM1FciYG.d.ts} +37 -29
- package/dist/{create-CGm28gyI.js → create-Cq4Uox0f.js} +13 -9
- package/dist/{create-DCF2SvoT.js → create-_noSrY1T.js} +15 -21
- package/dist/{credential-BcoiejpY.js → credential-CyyyvCsL.js} +42 -39
- package/dist/{credentials-DPyHmYz5.js → credentials-CdDxp7jN.js} +6 -6
- package/dist/{deciding-columns-Sq12mEA6.js → deciding-columns-NB4wcyBf.js} +13 -2
- package/dist/{delegation-j6-rc37o.js → delegation-CDB6_keF.js} +31 -22
- package/dist/delivery/index.d.ts +5 -5
- package/dist/delivery/index.js +6 -5
- package/dist/{delivery-DCAgNyCn.js → delivery-BupfvJIV.js} +81 -20
- package/dist/{delivery-event-xX4obB8F.js → delivery-event-JioK5YbS.js} +6 -6
- package/dist/denied-text-CHNlVInN.d.ts +22 -0
- package/dist/{describe-BybMRY7A.js → describe-Bb4hGK5d.js} +6 -5
- package/dist/{describe-B5qgDvEW.d.ts → describe-ByS9LgHK.d.ts} +5 -5
- package/dist/{device-BARQ8eYG.js → device-BwbJNmb2.js} +11 -8
- package/dist/{diff-CmuSD3vc.js → diff-CN8IYhC_.js} +2 -2
- package/dist/{diff-3jbx6Rm4.js → diff-iZWV65nC.js} +23 -14
- package/dist/{digest-B3kc_PgQ.d.ts → digest-8Yx2CchM.d.ts} +3 -3
- package/dist/{doctor-BdZw53-k.js → doctor-CHD1M9R5.js} +485 -141
- package/dist/{doctor-3ZqNHX_G.js → doctor-D3wo-yuz.js} +4 -4
- package/dist/drizzle/index.d.ts +33 -19
- package/dist/drizzle/index.js +17 -9
- package/dist/elysia/index.d.ts +17 -11
- package/dist/elysia/index.js +5 -5
- package/dist/{errors-BKy0EfhN.js → errors-B6R_lg2a.js} +13 -4
- package/dist/{errors-BWXBMaKK.d.ts → errors-CHwoRRpB.d.ts} +4 -1
- package/dist/{errors-CWTY6uih.js → errors-Vpu6rKHl.js} +14 -10
- package/dist/{errors-DH5QEGXh.d.ts → errors-zi_4T-rx.d.ts} +22 -6
- package/dist/{evaluate-CNClBvcj.js → evaluate-Dd8Ta0Ie.js} +185 -80
- package/dist/{evaluations-beAooV0n.js → evaluations-IBceAeKT.js} +41 -20
- package/dist/{evaluations-C_1vdSZc.d.ts → evaluations-z8dQFDaN.d.ts} +12 -6
- package/dist/eve/index.d.ts +9 -6
- package/dist/eve/index.js +4 -4
- package/dist/{event-time-CsegxXxB.js → event-time-BGy48400.js} +8 -4
- package/dist/{expiry-D4_YKRKD.js → expiry-6XByK0dm.js} +8 -5
- package/dist/express/index.d.ts +9 -6
- package/dist/express/index.js +9 -6
- package/dist/fastify/index.d.ts +16 -10
- package/dist/fastify/index.js +8 -5
- package/dist/{fetch-adapter-Dw0MTS3D.d.ts → fetch-adapter-C1DCvpqV.d.ts} +9 -6
- package/dist/{fetch-adapter-DD_gfmrC.js → fetch-adapter-JL43jD3E.js} +14 -11
- package/dist/fields-D0vUI6dq.js +498 -0
- package/dist/{files-C5ZI27eV.js → files-B3AA05f1.js} +21 -5
- package/dist/{files-D_JIzUrP.js → files-BSjrtIHw.js} +11 -4
- package/dist/{fixtures-B7XrLeY7.js → fixtures-A1_sp_tR.js} +15 -6
- package/dist/{flags-C3DktBDY.js → flags-DXjoTVbS.js} +2 -2
- package/dist/{freeze-CrU8nQeX.js → freeze-jjan0lCv.js} +4 -1
- package/dist/{from-snapshot-CTCMsFZk.js → from-snapshot-DCakWRsr.js} +26 -16
- package/dist/gen-B5kvbAoZ.js +58 -0
- package/dist/gen-DWCYcMQM.js +827 -0
- package/dist/generate-CRVV5V7l.js +165 -0
- package/dist/generate-CezbCaTI.js +275 -0
- package/dist/{grantee-hxrUsbpM.js → grantee-Dke-9rd1.js} +4 -4
- package/dist/{grantee-conditions-CcXf8hMM.js → grantee-conditions-BrYPe-w0.js} +12 -12
- package/dist/{grantee-match-DbENBHLB.js → grantee-match-7RZZvoT_.js} +12 -6
- package/dist/{graph-sql-B-dsAT6j.d.ts → graph-sql-BwFC4Qjs.d.ts} +3 -3
- package/dist/h3/index.d.ts +10 -7
- package/dist/h3/index.js +3 -3
- package/dist/headers-B9jQxjtW.d.ts +10 -0
- package/dist/{helpers-CBYVMjwh.js → helpers-DJicaG6f.js} +40 -28
- package/dist/hono/index.d.ts +16 -10
- package/dist/hono/index.js +5 -5
- package/dist/{hosted-BPk51-kX.d.ts → hosted-Cmtxogd0.d.ts} +44 -20
- package/dist/{hosted-B46-5LYE.js → hosted-D0IzESu_.js} +68 -25
- package/dist/{http-ujKm0JXE.js → http-DH94eh6f.js} +4 -4
- package/dist/{http-BBoKefeS.js → http-DKLXrFGk.js} +13 -7
- package/dist/{http-DXJ37RDA.js → http-DOL33cO0.js} +11 -8
- package/dist/{import-wyqXUyjm.js → import-CST57XLp.js} +64 -51
- package/dist/{import-CNV7I2Dw.js → import-_YqhhwvX.js} +6 -6
- package/dist/{index-B8YjkEZ4.d.ts → index-B8s204GL.d.ts} +64 -52
- package/dist/{index-Ch8LpNDp.d.ts → index-BT5-1VsX.d.ts} +64 -25
- package/dist/{index-DuWxc5dt.d.ts → index-BW_0MZOS.d.ts} +388 -149
- package/dist/index-BhxEUY9J.d.ts +233 -0
- package/dist/index-Bv5iXPqU.d.ts +210 -0
- package/dist/{index-C-6Letxg.d.ts → index-_9UiQIkt.d.ts} +164 -77
- package/dist/index.d.ts +22 -21
- package/dist/index.js +35 -33
- package/dist/{init-GG6Jh8HD.js → init-Dz_PsHdv.js} +5 -5
- package/dist/{init-DeMYsnYJ.js → init-cE3A8aXq.js} +10 -10
- package/dist/{instance-options-BsVpyGIk.d.ts → instance-options-B0KXqTrJ.d.ts} +4 -4
- package/dist/{instance-snapshot-BOEhcqIF.js → instance-snapshot--JWiTrvO.js} +81 -56
- package/dist/{instant-BluqDvyS.js → instant-DK3Iz83e.js} +2 -2
- package/dist/{internals-Dk8A8fX3.js → internals-B3IgHrvo.js} +6 -3
- package/dist/{json-schema-B-vAwlde.js → json-schema-BPGa-RjQ.js} +9 -3
- package/dist/{json-schema-CN_iLFH2.d.ts → json-schema-BfXgnRNT.d.ts} +4 -4
- package/dist/jwt/index.d.ts +125 -17
- package/dist/jwt/index.js +157 -16
- package/dist/{kernel-D0NVb1cK.js → kernel-C-fYydV2.js} +151 -16
- package/dist/kysely/index.d.ts +49 -33
- package/dist/kysely/index.js +9 -7
- package/dist/{live-options-BaAFCIiu.js → live-options-BBIT68le.js} +2 -2
- package/dist/{load-DFS_ry0W.js → load-DjSU5KXO.js} +6 -6
- package/dist/load-Dm0pSYH3.js +1 -0
- package/dist/{login-Dfe5RlYk.js → login-D-8tMqzo.js} +4 -4
- package/dist/{login-imhuwvn3.js → login-DplQ0s84.js} +18 -15
- package/dist/{manifest-dvL2XEe1.js → manifest-Cgiq5oqc.js} +67 -37
- package/dist/{manifest-mx5ghSFM.d.ts → manifest-CzzWtnAb.d.ts} +144 -28
- package/dist/{manifest-schema-C0kK_8V0.js → manifest-schema-2r37XRhD.js} +80 -9
- package/dist/{manifest-C8IzW3Do.js → manifest-wg8WkkpD.js} +11 -7
- package/dist/{map-claims-D3oRmTk0.js → map-claims-BNWCJtmP.js} +27 -18
- package/dist/{map-error-Dr70oA_3.js → map-error-pasIGqMT.js} +7 -7
- package/dist/{markers-C6joDI3o.js → markers-BeHZ4x9Q.js} +20 -5
- package/dist/mcp/index.d.ts +154 -47
- package/dist/mcp/index.js +200 -41
- package/dist/{migrate-CIq4-E9F.js → migrate-B7oP_sQU.js} +102 -31
- package/dist/module-values-BJTBdo6y.js +107 -0
- package/dist/nest/index.d.ts +23 -13
- package/dist/nest/index.js +18 -11
- package/dist/next/client.d.ts +5 -2
- package/dist/next/client.js +1 -1
- package/dist/next/index.d.ts +72 -26
- package/dist/next/index.js +110 -6
- package/dist/next/plugin.d.ts +1 -1
- package/dist/next/plugin.js +4 -3
- package/dist/node/index.d.ts +5 -5
- package/dist/node/index.js +3 -3
- package/dist/{ocsf-BFp-PZZA.js → ocsf-TcjRBgIs.js} +15 -5
- package/dist/openai/index.d.ts +13 -7
- package/dist/openai/index.js +3 -3
- package/dist/openapi/index.d.ts +61 -30
- package/dist/openapi/index.js +2 -2
- package/dist/{openapi-B7HZ0f-r.js → openapi-BOsx0xn9.js} +34 -24
- package/dist/{openapi-C4dDTVEd.js → openapi-CBZUhA3l.js} +4 -5
- package/dist/{openapi-DD1SV-5-.js → openapi-VeHHU2l9.js} +23 -14
- package/dist/{operation-findings-DgATDpvh.js → operation-findings-CXtFzlKJ.js} +3 -3
- package/dist/{operations-X0VM7F3m.d.ts → operations-Ci_rT6Uo.d.ts} +10 -7
- package/dist/orpc/index.d.ts +68 -14
- package/dist/orpc/index.js +62 -13
- package/dist/otel/index.d.ts +7 -4
- package/dist/otel/index.js +8 -5
- package/dist/output-files-BHOIlrfD.js +1 -0
- package/dist/{output-files-DhRBBE4n.js → output-files-BIQ_9pIs.js} +29 -17
- package/dist/{output-1im__-08.js → output-tkju6U7R.js} +15 -7
- package/dist/ownership-B4L59T9u.js +1054 -0
- package/dist/parse-1_ZheTW5.js +151 -0
- package/dist/parse-local-manifest-BQhTlLQS.d.ts +10 -0
- package/dist/parse-local-manifest-DEiCF4ah.js +69 -0
- package/dist/{parse-request-D_tUXG6M.js → parse-request-CwCZpyjV.js} +7 -8
- package/dist/{paths-DXSHAMIa.js → paths-CUvURzHp.js} +4 -1
- package/dist/pdp/index.d.ts +9 -6
- package/dist/pdp/index.js +23 -12
- package/dist/{peer-CRvC7Hg1.js → peer-C9LvBCcb.js} +1 -1
- package/dist/peer-Q0fuZ6hx.js +982 -0
- package/dist/{permdock-SV8ZINYT.d.ts → permdock-B6Sf4T_S.d.ts} +270 -117
- package/dist/{permdock-BrAscV28.js → permdock-L-_I_3zP.js} +226 -74
- package/dist/{permission-registry-Br4jSNVi.js → permission-registry-B8tYxPIt.js} +24 -11
- package/dist/{vocabulary-CN8H_9UF.d.ts → permission-types-CAY-GU7e.d.ts} +130 -104
- package/dist/{permissions-u_KHg-sN.d.ts → permissions-Bx6UI8n1.d.ts} +6 -2
- package/dist/{permissions-B-wCP5ZC.js → permissions-CVXmRILq.js} +3 -3
- package/dist/{permissions-BPxlwVhN.js → permissions-mDcTWoBs.js} +8 -5
- package/dist/pg-DQTqRrou.js +60 -0
- package/dist/{pins-8ILTftC9.js → pins-nqarl3oE.js} +4 -1
- package/dist/pkce-CnmmYqUZ.js +21 -0
- package/dist/{policy-77FSAq_V.d.ts → policy-Ba4bDhaj.d.ts} +5 -5
- package/dist/{policy-DbM5YYtV.js → policy-CLQ8__GF.js} +49 -20
- package/dist/{policy-from-catalog-C2gMa2Dj.js → policy-from-catalog-CJgOm6aq.js} +28 -25
- package/dist/{policy-module-CTlwMvLI.js → policy-module-xym9fnSq.js} +12 -6
- package/dist/{policy-types-n0uRTsW8.d.ts → policy-types-CCiDRZBH.d.ts} +802 -334
- package/dist/postgres-store-DcyrPS-r.js +1028 -0
- package/dist/{postgrest-DAjUkF9w.js → postgrest-D4nuPXIQ.js} +88 -36
- package/dist/{postgrest-CEgRbefE.d.ts → postgrest-DicQyqm-.d.ts} +60 -30
- package/dist/powersync-DHNQX06W.js +1117 -0
- package/dist/{powersync-DISt6SUe.js → powersync-DXqGuq9A.js} +3 -3
- package/dist/powersync-Djf-zCpB.js +1 -0
- package/dist/preset/index.d.ts +38 -28
- package/dist/preset/index.js +1 -1
- package/dist/{preset-DZdU0tne.js → preset-BjLzeFpp.js} +58 -34
- package/dist/{principal-source-pHneukrx.js → principal-source-C6N60GtM.js} +10 -10
- package/dist/prisma/index.d.ts +69 -41
- package/dist/prisma/index.js +21 -17
- package/dist/{problem-CTviyH5L.js → problem-BVLHFK33.js} +41 -21
- package/dist/{problem-details-cn5X30gZ.js → problem-details-CLDgX1KV.js} +13 -4
- package/dist/{problem-types-CJ2325SZ.js → problem-types-DSsRfONQ.js} +4 -1
- package/dist/prompt-BYc6drYW.js +938 -0
- package/dist/protected-action-BE7N_Luo.d.ts +58 -0
- package/dist/protected-action-DUYqb-Ma.js +80 -0
- package/dist/{protected-BlF0F6wL.js → protected-action-QEA8arRB.js} +48 -14
- package/dist/{provider-B1al-AZz.js → provider-C55OGXJ7.js} +5 -4
- package/dist/{provider-DILL9oPK.d.ts → provider-DXfq5c2d.d.ts} +1 -1
- package/dist/{provider-store-DM6DNcta.js → provider-store-CaTv00tr.js} +13 -9
- package/dist/pull-B65ndFNZ.js +1 -0
- package/dist/{pull-jEwbf80J.js → pull-CwpGaQSi.js} +12 -11
- package/dist/{push-BD4f15co.js → push-DgssgzkK.js} +62 -16
- package/dist/{pushed-policy-DCW91KQU.d.ts → pushed-policy-D1Eoi6NM.d.ts} +12 -6
- package/dist/{pushed-policy-CqtxkV4G.js → pushed-policy-ITwYKvvH.js} +10 -7
- package/dist/react/index.d.ts +9 -8
- package/dist/react/index.js +7 -6
- package/dist/react/provider-client.d.ts +1 -1
- package/dist/react/provider-client.js +1 -1
- package/dist/react-native/index.d.ts +104 -51
- package/dist/react-native/index.js +394 -67
- package/dist/{refs-K6eWUJ0H.js → refs-C8BKxc_e.js} +17 -3
- package/dist/{relation-walk-3OyDBF0S.js → relation-walk-DK_gkgL7.js} +12 -9
- package/dist/{relations-BnCWnJGI.js → relations-BxvRvDHK.js} +3 -3
- package/dist/{replay-Du1tJjG7.js → replay-BU09ad4L.js} +1 -1
- package/dist/{replay-Bkm-Ne4l.d.ts → replay-DNftIb_R.d.ts} +1 -1
- package/dist/{request-context-C81Pip9n.js → request-context-C25ilqiJ.js} +8 -8
- package/dist/{request-schema-CMreVuFM.js → request-schema-DhX7UbfQ.js} +4 -1
- package/dist/resend/index.d.ts +34 -28
- package/dist/resend/index.js +29 -29
- package/dist/resolve-names-CF7xXLSG.js +201 -0
- package/dist/{resource-relations-D_jw0BFx.js → resource-relations-8-pCScBO.js} +18 -9
- package/dist/{retire-CALjIQ7e.js → retire-B2xffQgY.js} +15 -6
- package/dist/{revocations-R07lFBnX.d.ts → revocations-BaUXHM1N.d.ts} +6 -3
- package/dist/{rls-DTvYd-lI.js → rls-CNEH2_BG.js} +743 -624
- package/dist/{rls-BAqP4q66.js → rls-Ca8Jz9b5.js} +41 -10
- package/dist/{role-builder-uWQZ4v84.js → role-builder-BK2-T6oD.js} +41 -20
- package/dist/rolldown-runtime-C3I60J0A.js +4 -0
- package/dist/{row-conditions-h2HythXQ.js → row-conditions-BAGHOmVq.js} +4 -3
- package/dist/{rpc-VSl5ylaQ.js → rpc-fNqAIqQk.js} +8 -5
- package/dist/{run-CUKuz0A8.js → run-Bz26OTfO.js} +26 -23
- package/dist/run-D-JE8QWb.js +1 -0
- package/dist/{run-ticket-DocwaTKn.d.ts → run-ticket-DbWI9f99.d.ts} +33 -13
- package/dist/{run-ticket-sxFI6LAk.js → run-ticket-Dv7aF7Dk.js} +29 -8
- package/dist/{runtime-D3VTAiCA.js → runtime-BGnrOkVH.js} +5 -2
- package/dist/{saas-BCXRuXca.js → saas-iWnUdwCt.js} +42 -29
- package/dist/{scan-qvOe0hS3.js → scan-DCj1KQfn.js} +1 -1
- package/dist/{schema-B4v0Qrac.js → schema-BOJjqlWL.js} +3 -2
- package/dist/{schema-yLuBWWsh.js → schema-Dst9I9Gs.js} +9 -5
- package/dist/scim/index.d.ts +3 -2
- package/dist/scim/index.js +3 -1
- package/dist/scim-D8YupzX1.js +44 -0
- package/dist/{scim-ClHtpyV3.js → scim-jJBJ7g1Z.js} +35 -551
- package/dist/{scopes-CUPSjo9q.js → scopes-0Up_UA2t.js} +42 -24
- package/dist/server/index.d.ts +12 -12
- package/dist/server/index.js +13 -13
- package/dist/{server-C3WXAHZj.js → server-3cVlTLde.js} +31 -31
- package/dist/{server-types-CKQiCnON.d.ts → server-types-CIlpSA2G.d.ts} +81 -46
- package/dist/{sha256-D9ihqmvd.js → sha256-C-4WXKIu.js} +4 -3
- package/dist/{shared-BAK8t4Uo.js → shared-Afctg7B0.js} +100 -61
- package/dist/{shared-DvvFzYXe.js → shared-l0oGGetg.js} +9 -6
- package/dist/{signals-D3NcTKUS.js → signals-B1vHR3fN.js} +2 -2
- package/dist/{sink-BEZSlMS_.js → sink-D9_vh372.js} +32 -21
- package/dist/{sink-4-eQIRWf.d.ts → sink-Dvi7YZG_.d.ts} +44 -20
- package/dist/{skills-B6lVdD_W.js → skills-Bjj7BNEQ.js} +16 -12
- package/dist/{skills-CTYwkl44.js → skills-OuoMR49L.js} +3 -3
- package/dist/{snapshot-B7DkYg6g.js → snapshot-CXlzi69u.js} +21 -18
- package/dist/{snapshot-cache-PXI-vGpY.d.ts → snapshot-cache-BAXZ0KOp.d.ts} +21 -12
- package/dist/{snapshot-cache-DZHQ0KF6.js → snapshot-cache-Bx_4xC_6.js} +14 -11
- package/dist/solid/index.d.ts +55 -15
- package/dist/solid/index.js +46 -12
- package/dist/solid-start/index.d.ts +30 -12
- package/dist/solid-start/index.js +3 -3
- package/dist/sources-B1Os_YUu.d.ts +312 -0
- package/dist/{sources-vs5dGOsS.js → sources-CMAM-2A3.js} +156 -51
- package/dist/sources-qoIJQrJv.js +11 -0
- package/dist/{sql-B5T1IL83.js → sql-0WjxIp9g.js} +32 -7
- package/dist/sql-B80DFdpG.d.ts +10 -0
- package/dist/{src-Cu2m75uo.js → src-DZ0l9UAg.js} +305 -123
- package/dist/ssf/index.d.ts +4 -4
- package/dist/ssf/index.js +665 -224
- package/dist/{standard-webhooks-rbD7LS6h.d.ts → standard-webhooks-C-qX4mJW.d.ts} +7 -7
- package/dist/{standard-webhooks-DgFFD-Ga.js → standard-webhooks-D67a3nzk.js} +5 -5
- package/dist/{store-BDutJkDL.js → store-RNFvaJJv.js} +43 -29
- package/dist/{store-options-u0ycEe8s.js → store-options-Dil3lraY.js} +105 -15
- package/dist/stores-C0Kta5Ft.d.ts +59 -0
- package/dist/{stores-CGhM8BN_.js → stores-DxZWDXCs.js} +42 -5
- package/dist/{stream-CvdUS9V1.js → stream-CDvF0sJm.js} +5 -5
- package/dist/{stream-CeCMJmBB.d.ts → stream-ltuLdtTG.d.ts} +4 -3
- package/dist/{style-DiKWnAvn.js → style-DblOtSga.js} +1 -1
- package/dist/{style-Uao76wO7.js → style-Ds11Hmk4.js} +3 -1
- package/dist/{subject-settings-CkEwrw3W.js → subject-settings-8sH5HlII.js} +8 -4
- package/dist/{row-check-Dt35czLy.d.ts → subject-settings-vNW8qmUH.d.ts} +30 -18
- package/dist/supabase/index.d.ts +48 -37
- package/dist/supabase/index.js +6 -6
- package/dist/supabase/middleware.d.ts +19 -13
- package/dist/supabase/middleware.js +7 -7
- package/dist/{supabase-x5JtR2tc.js → supabase-BL1qJzzY.js} +82 -36
- package/dist/{supabase-By_frk3U.js → supabase-D39cuGPt.js} +3 -3
- package/dist/{supabase-hook-BMoEhZir.js → supabase-hook-B-yXnzUl.js} +1206 -286
- package/dist/supabase-hook-H-MtE9Wd.js +1 -0
- package/dist/supautils-BU-pAEpf.js +808 -0
- package/dist/{support-session-C6xJQYut.js → support-session-BsmPCbz8.js} +22 -22
- package/dist/svelte/PermissionBoundary.svelte +2 -6
- package/dist/svelte/Protected.svelte +2 -8
- package/dist/svelte/index.d.ts +9 -8
- package/dist/svelte/index.js +10 -9
- package/dist/svelte/runtime.d.ts +4 -4
- package/dist/svelte/runtime.js +4 -4
- package/dist/svelte/source.d.ts +9 -8
- package/dist/svelte/source.js +6 -5
- package/dist/sveltekit/index.d.ts +30 -12
- package/dist/sveltekit/index.js +2 -2
- package/dist/{ownership-DqaJNJPn.js → tables-DeMNEy6V.js} +1025 -1085
- package/dist/tanstack-start/index.d.ts +22 -10
- package/dist/tanstack-start/index.js +2 -2
- package/dist/{target-Bw37TFNA.js → target-qdEAnnhU.js} +6 -6
- package/dist/{tenancy-DN2QAx9z.js → tenancy-5d1zVBvK.js} +36 -21
- package/dist/terminal/index.d.ts +23 -14
- package/dist/terminal/index.js +17 -20
- package/dist/testing/core.d.ts +2 -0
- package/dist/testing/core.js +1 -0
- package/dist/testing/fixtures/index.d.ts +15 -0
- package/dist/testing/fixtures/index.js +831 -0
- package/dist/testing/index.d.ts +235 -285
- package/dist/testing/index.js +502 -927
- package/dist/testing/saas/index.d.ts +43 -27
- package/dist/testing/saas/index.js +2 -2
- package/dist/testing/saas/permissions.d.ts +1 -1
- package/dist/testing/saas/permissions.js +1 -1
- package/dist/text-diff-BtfSmdUo.js +444 -0
- package/dist/{thenable-yD7SabqG.js → thenable-BNSM1U2R.js} +12 -3
- package/dist/{time-DkWjdL98.js → time-nR1JesoH.js} +32 -8
- package/dist/{token-BLZcjQgt.js → token-DC9EQiet.js} +15 -13
- package/dist/{tool-refusal-CMLN5xhn.js → tool-refusal-Qpjs_W6M.js} +5 -2
- package/dist/trpc/index.d.ts +11 -8
- package/dist/trpc/index.js +15 -9
- package/dist/type-helpers-BIPIDa6a.d.ts +50 -0
- package/dist/{types-8RnwUAvE.d.ts → types-AMJ5qoU_.d.ts} +49 -30
- package/dist/{types-C_IiEs64.d.ts → types-B2mlGuhW.d.ts} +14 -11
- package/dist/{types-_WhUP7ud.d.ts → types-B4uqKDnp.d.ts} +25 -12
- package/dist/{types-CX7AvRqP.d.ts → types-BJk0BKRX.d.ts} +24 -14
- package/dist/types-B_d_g7T3.d.ts +262 -0
- package/dist/{types-BdtSDbBO.d.ts → types-B_tiYvk8.d.ts} +59 -32
- package/dist/{types-DqzsnlSA.js → types-CcUXciSj.js} +17 -5
- package/dist/{types-Dfv0aTER.d.ts → types-DC1Loeh3.d.ts} +449 -168
- package/dist/{types-lUlG3TVd.d.ts → types-DHKPcqzr.d.ts} +2 -2
- package/dist/{types-C791HFu9.d.ts → types-DjuMBNF9.d.ts} +68 -32
- package/dist/{types-C863OQiR.d.ts → types-HzqOtvsJ.d.ts} +23 -12
- package/dist/{types-Druu9wLM.d.ts → types-ZzRGoViD.d.ts} +77 -24
- package/dist/{types-BzzaHxt3.d.ts → types-ah9NlU6j.d.ts} +137 -48
- package/dist/{types-CVZSNocA.d.ts → types-djVzLlIV.d.ts} +31 -14
- package/dist/{types-BtHtcKMr.d.ts → types-yUuPR5Hy.d.ts} +47 -24
- package/dist/unplugin/index.d.ts +1 -1
- package/dist/unplugin/index.js +2 -2
- package/dist/usage-CYeXek0p.js +1 -0
- package/dist/{usage-SveTRTyr.js → usage-CxEzS4ey.js} +50 -26
- package/dist/{usage-CRVl9V3t.js → usage-ab0PdusX.js} +2 -2
- package/dist/{validation-error-ZfUHbKvf.js → validation-error-CYg2kJEw.js} +4 -1
- package/dist/{validation-error-DHUrAkku.d.ts → validation-error-YGg2mXyH.d.ts} +5 -2
- package/dist/{validity-CZ7-y0Cj.js → validity-Buc7w8E9.js} +13 -10
- package/dist/{verifier-DHuh-okk.js → verifier-DUV6pLqZ.js} +10 -4
- package/dist/{verify-BaAKx7t6.js → verify-DZeqoWu5.js} +417 -489
- package/dist/version-DMQ0dnN5.js +48 -0
- package/dist/version-DizhmD72.js +1 -0
- package/dist/{views-DTIIO-oQ.js → views-CD8wuL4Z.js} +19 -6
- package/dist/vocabulary-DEJ5j4mR.d.ts +70 -0
- package/dist/vue/index.d.ts +71 -21
- package/dist/vue/index.js +50 -13
- package/dist/{waiter-B986w1oK.d.ts → waiter-Bu9zAlE0.d.ts} +13 -10
- package/dist/{waiter-BGUtGYoU.js → waiter-aBLM63_f.js} +1 -1
- package/dist/{watch-vea54PRw.js → watch-Cx_WciLE.js} +8 -8
- package/dist/watch-DB42U1ib.js +1 -0
- package/dist/webmcp/index.d.ts +11 -11
- package/dist/webmcp/index.js +8 -5
- package/dist/{where-scope-C9vfEphl.js → where-scope-DlCdCM_8.js} +56 -30
- package/dist/{who-can-DWBAcaCQ.js → who-can-rI7dCR9Q.js} +23 -20
- package/dist/workflow/index.d.ts +3 -3
- package/dist/workflow/index.js +13 -13
- package/dist/workflow-sdk/index.d.ts +19 -13
- package/dist/workflow-sdk/index.js +6 -6
- package/dist/{wrap-gX61EtpB.js → wrap-B2wziJI_.js} +11 -5
- package/dist/{wrap-C5jC6sKI.d.ts → wrap-DlJE3gS_.d.ts} +8 -5
- package/package.json +25 -14
- package/schemas/catalog-v1.json +3 -0
- package/schemas/cli-result-v1.json +1 -0
- package/schemas/cloud-api-v1.json +152 -7
- package/schemas/connector-v1.json +8 -0
- package/schemas/supabase-claims-v1.json +5 -0
- package/schemas/supabase-manifest-v1.json +308 -75
- package/skills/permdock/SKILL.md +1 -0
- package/skills/permdock-agents/references/runtimes.md +3 -1
- package/skills/permdock-approvals/references/stores-and-resume.md +2 -1
- package/skills/permdock-credentials/references/tokens-keys-links.md +8 -6
- package/skills/permdock-data/references/queries-and-rls.md +6 -2
- package/skills/permdock-tenancy/SKILL.md +1 -1
- package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +2 -1
- package/skills/permdock-wire/references/adapters.md +28 -22
- package/skills/permdock-wire/references/policy-options.md +1 -0
- package/dist/catalog-BoWglDPI.js +0 -1
- package/dist/collect-D7eQDffE.js +0 -1
- package/dist/config-bs_kZeYq.js +0 -162
- package/dist/denied-text-CiFQNuMV.d.ts +0 -19
- package/dist/fields-OYG_JR78.js +0 -203
- package/dist/generate-CNU1pIOo.js +0 -171
- package/dist/headers-BIjfMaoC.js +0 -8
- package/dist/headers-CIbDTUTK.d.ts +0 -7
- package/dist/index-Cp_ilKi1.d.ts +0 -91
- package/dist/index-CueFnxQc.d.ts +0 -110
- package/dist/load-BxEtwlBS.js +0 -1
- package/dist/output-files-B3IZJksC.js +0 -1
- package/dist/package-root-Dk_ETdkp.js +0 -31
- package/dist/parse-Cxq0WxrA.js +0 -53
- package/dist/parse-local-manifest-5ODwqu8b.d.ts +0 -10
- package/dist/parse-local-manifest-CVSs6J9I.js +0 -34
- package/dist/peer-C8swJ2GH.js +0 -50
- package/dist/policies-DP2nqRoF.js +0 -295
- package/dist/powersync-BkWWCS1K.js +0 -538
- package/dist/powersync-MMJ2mI2q.js +0 -1
- package/dist/problem-details-B45V5d2b.d.ts +0 -7
- package/dist/prompt-DfZLJLIn.js +0 -32
- package/dist/protected-RFGpakN9.d.ts +0 -38
- package/dist/pull-CvpINcMK.js +0 -1
- package/dist/run-DDwUaJDU.js +0 -1
- package/dist/sources-Xc4zkszI.d.ts +0 -190
- package/dist/stores-BUGNbJTt.d.ts +0 -30
- package/dist/supabase-hook-CCw5m35C.js +0 -1
- package/dist/supautils-B6HYL9eL.js +0 -91
- package/dist/text-diff-BQcUapOb.js +0 -15
- package/dist/types-B3_ooZgZ.d.ts +0 -172
- package/dist/usage-CZpSQP6L.js +0 -1
- package/dist/version-CEbQ5UeM.js +0 -18
- package/dist/version-DXkYUISx.js +0 -1
- 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 };
|