permdock 0.4.0 → 0.6.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 +37 -35
- package/dist/{schema-Bol6gqXA.js → 2020-C9VN-x8c.js} +5 -130
- package/dist/a2a/index.d.ts +6 -6
- package/dist/a2a/index.js +14 -17
- package/dist/{adapter-context-mlWsVGGg.js → adapter-context-CRhqyzCk.js} +1 -1
- package/dist/adoption-scan-DCYe60Pi.js +107 -0
- package/dist/agent/index.d.ts +3 -0
- package/dist/agent/index.js +1 -0
- package/dist/ai-sdk/index.d.ts +18 -35
- package/dist/ai-sdk/index.js +37 -23
- package/dist/{app-data-CV8pqqMi.js → app-data-MuyzVqX8.js} +2 -1
- package/dist/approval-header-CJACtHkv.js +23 -0
- package/dist/approval-prompt-Dg5LeAcT.js +62 -0
- package/dist/approval-prompt-DvSSPQJX.d.ts +57 -0
- package/dist/approvals/index.d.ts +5 -3
- package/dist/approvals/index.js +8 -5
- package/dist/approvals-p1PGoVjb.js +995 -0
- package/dist/arazzo-41WuzHou.js +36 -0
- package/dist/{arazzo-C4BcskbX.js → arazzo-CaUVBn7D.js} +20 -14
- package/dist/args-IIolxxKA.js +197 -0
- package/dist/astro/index.d.ts +43 -0
- package/dist/astro/index.js +27 -0
- package/dist/audience-DabClFLQ.js +55 -0
- package/dist/auth-DRLEizbL.js +178 -0
- package/dist/authzen/index.d.ts +26 -6
- package/dist/authzen/index.js +94 -79
- package/dist/automation-BNM3TtDo.d.ts +114 -0
- package/dist/automation-DVjOckjV.js +157 -0
- package/dist/better-auth/index.d.ts +8 -6
- package/dist/better-auth/index.js +9 -8
- package/dist/better-supabase/index.d.ts +357 -30
- package/dist/better-supabase/index.js +936 -194
- package/dist/{bind-kk-uyCwH.js → bind-CAvgUuKs.js} +14 -10
- package/dist/{bind-BzqG8SMb.d.ts → bind-DOyrv6zi.d.ts} +12 -10
- package/dist/body-CH5of8Ne.js +10 -0
- package/dist/body-text-QcXok_SI.js +52 -0
- package/dist/{build-instance-DIIV9DbC.js → build-instance-Bu_eDqYw.js} +4 -3
- package/dist/{canonical-json-CFKyFOke.js → canonical-json-BC8_nMTw.js} +5 -3
- package/dist/{capability-CksyCWDH.d.ts → capability-Drg-1YhL.d.ts} +44 -25
- package/dist/{capability-txATtKV4.js → capability-N1K9IpqS.js} +68 -42
- package/dist/casbin-Cr7RLtA3.js +30 -0
- package/dist/casbin-Dyu2gnUD.js +234 -0
- package/dist/casl-64gpT-8x.js +24 -0
- package/dist/casl-DjEDhTCP.js +299 -0
- package/dist/catalog/index.d.ts +74 -2
- package/dist/catalog/index.js +51 -2
- package/dist/catalog-BoWglDPI.js +1 -0
- package/dist/catalog-DZVbrF-z.js +52 -0
- package/dist/{catalog-tZUyOfOv.js → catalog-HD2gf5mY.js} +51 -6
- package/dist/{catalog-doc-DWtg0gGR.js → catalog-doc-Cdn7-0pQ.js} +45 -23
- package/dist/catalog-fingerprint-CCP0-yQS.js +153 -0
- package/dist/chat/index.d.ts +2 -0
- package/dist/chat/index.js +224 -0
- package/dist/chat-sdk/index.d.ts +87 -0
- package/dist/chat-sdk/index.js +197 -0
- package/dist/claims-map-7oQ3ue4X.js +13 -0
- package/dist/claims-map-Ca-QX8C6.d.ts +32 -0
- package/dist/claude-agent/index.d.ts +7 -14
- package/dist/claude-agent/index.js +24 -27
- package/dist/clerk/index.d.ts +9 -8
- package/dist/clerk/index.js +9 -14
- package/dist/cli/bin.js +36 -17
- package/dist/cli/index.d.ts +19 -5
- package/dist/cli/index.js +164 -4
- package/dist/cloud/index.d.ts +102 -63
- package/dist/cloud/index.js +239 -340
- package/dist/cloud-ytQ3uviA.js +87 -0
- package/dist/codemod-5mpSpnUY.js +37 -0
- package/dist/codemod-ua2hHy7w.js +2084 -0
- package/dist/collect-Ci6akVwH.js +55 -0
- package/dist/collect-D7eQDffE.js +1 -0
- package/dist/{collect-2SrB7lfk.js → collect-mLTY4nwb.js} +75 -11
- package/dist/command-L8EstFNm.js +6 -0
- package/dist/compile/index.d.ts +1 -1
- package/dist/compile/index.js +1 -2
- package/dist/{compile-CtTP7eur.d.ts → compile-1bsAezL0.d.ts} +5 -3
- package/dist/{compile-CcEu2ZQ1.js → compile-CMqMx_IN.js} +11 -8
- package/dist/completion-BTFrHZhX.js +143 -0
- package/dist/config-Bj2Ixq3d.js +26 -0
- package/dist/{config-BIjREpyE.js → config-bs_kZeYq.js} +12 -7
- package/dist/{config-report--Xb9APJS.js → config-report-DSpsLpCE.js} +15 -5
- package/dist/{connection-DUsczpB5.js → connection-DjhIJSs2.js} +6 -5
- package/dist/{context-DieZVJXu.js → context-B_u3_bDJ.js} +2 -2
- package/dist/convex/index.d.ts +11 -10
- package/dist/convex/index.js +6 -4
- package/dist/create-B30OMUOJ.d.ts +107 -0
- package/dist/create-CBMmFie-.d.ts +138 -0
- package/dist/create-CGm28gyI.js +130 -0
- package/dist/create-CQWIpUG-.js +403 -0
- package/dist/{create-BBO24vj6.js → create-DCF2SvoT.js} +31 -32
- package/dist/create-D_NmPOdH.d.ts +110 -0
- package/dist/{credential-kue0qpbm.js → credential-BcoiejpY.js} +152 -31
- package/dist/credentials-DPyHmYz5.js +74 -0
- package/dist/delegation-j6-rc37o.js +286 -0
- package/dist/delivery/index.d.ts +5 -0
- package/dist/delivery/index.js +5 -0
- package/dist/delivery-DCAgNyCn.js +499 -0
- package/dist/delivery-event-xX4obB8F.js +40 -0
- package/dist/{denied-text-DfRk15uw.d.ts → denied-text-CiFQNuMV.d.ts} +5 -5
- package/dist/{describe-C3ldA9os.d.ts → describe-B5qgDvEW.d.ts} +2 -2
- package/dist/{describe-Cgkp7eP0.js → describe-BybMRY7A.js} +6 -2
- package/dist/device-BARQ8eYG.js +193 -0
- package/dist/{diff-rpqoe7Ag.js → diff-3jbx6Rm4.js} +60 -54
- package/dist/diff-CmuSD3vc.js +37 -0
- package/dist/doctor-3ZqNHX_G.js +44 -0
- package/dist/{doctor-owlv6ddh.js → doctor-BdZw53-k.js} +245 -50
- package/dist/drizzle/index.d.ts +5 -3
- package/dist/drizzle/index.js +2 -2
- package/dist/elysia/index.d.ts +16 -13
- package/dist/elysia/index.js +13 -12
- package/dist/env-DJZrPjRi.js +8 -0
- package/dist/errors-BDUwg2qC.js +27 -0
- package/dist/{errors-drnfxYtm.js → errors-BKy0EfhN.js} +5 -9
- package/dist/errors-BWXBMaKK.d.ts +11 -0
- package/dist/errors-CWTY6uih.js +143 -0
- package/dist/{errors-OD_4c__H.d.ts → errors-DH5QEGXh.d.ts} +2 -2
- package/dist/evaluate-CNClBvcj.js +1785 -0
- package/dist/evaluations-C_1vdSZc.d.ts +32 -0
- package/dist/{evaluations-C9YJsv3H.js → evaluations-beAooV0n.js} +145 -34
- package/dist/eve/index.d.ts +12 -16
- package/dist/eve/index.js +22 -28
- package/dist/event-time-CsegxXxB.js +23 -0
- package/dist/expiry-D4_YKRKD.js +52 -0
- package/dist/express/index.d.ts +13 -10
- package/dist/express/index.js +12 -11
- package/dist/fastify/index.d.ts +25 -22
- package/dist/fastify/index.js +13 -12
- package/dist/fetch-adapter-DD_gfmrC.js +120 -0
- package/dist/fetch-adapter-Dw0MTS3D.d.ts +31 -0
- package/dist/fields-OYG_JR78.js +203 -0
- package/dist/files-C5ZI27eV.js +124 -0
- package/dist/{fixtures-h2eG2OZV.js → fixtures-B7XrLeY7.js} +8 -7
- package/dist/flags-C3DktBDY.js +86 -0
- package/dist/{from-snapshot-7REQZe0H.js → from-snapshot-CTCMsFZk.js} +55 -52
- package/dist/{grantee-conditions-MQs5NIuX.js → grantee-conditions-CcXf8hMM.js} +4 -3
- package/dist/{grantee-CXY-0C87.js → grantee-hxrUsbpM.js} +16 -6
- package/dist/{grantee-match-fxYp9Nmt.js → grantee-match-DbENBHLB.js} +5 -4
- package/dist/h3/index.d.ts +37 -0
- package/dist/h3/index.js +35 -0
- package/dist/headers-BIjfMaoC.js +8 -0
- package/dist/headers-CIbDTUTK.d.ts +7 -0
- package/dist/{helpers-C9YmyBIa.js → helpers-CBYVMjwh.js} +45 -38
- package/dist/hono/index.d.ts +12 -9
- package/dist/hono/index.js +13 -12
- package/dist/hosted-B46-5LYE.js +315 -0
- package/dist/hosted-BPk51-kX.d.ts +78 -0
- package/dist/{http-DPuDaChb.d.ts → http-B_LphE5Y.d.ts} +1 -2
- package/dist/http-DXJ37RDA.js +46 -0
- package/dist/{http-BEbdMZ05.js → http-ujKm0JXE.js} +1 -2
- package/dist/{import-UHk1N7vH.js → import-CNV7I2Dw.js} +25 -20
- package/dist/{import-BFIlhetD.js → import-wyqXUyjm.js} +190 -53
- package/dist/index-B8YjkEZ4.d.ts +210 -0
- package/dist/index-C-6Letxg.d.ts +431 -0
- package/dist/index-CaxrMD1A.d.ts +1 -0
- package/dist/{index-BwMe94Xq.d.ts → index-Ch8LpNDp.d.ts} +34 -16
- package/dist/index-Cp_ilKi1.d.ts +91 -0
- package/dist/index-CueFnxQc.d.ts +110 -0
- package/dist/index-DuWxc5dt.d.ts +909 -0
- package/dist/index.d.ts +19 -15
- package/dist/index.js +31 -21
- package/dist/init-DeMYsnYJ.js +96 -0
- package/dist/init-GG6Jh8HD.js +95 -0
- package/dist/{instance-options-plkrsAog.d.ts → instance-options-BsVpyGIk.d.ts} +2 -2
- package/dist/instance-snapshot-BOEhcqIF.js +601 -0
- package/dist/instant-BluqDvyS.js +19 -0
- package/dist/internals-Dk8A8fX3.js +17 -0
- package/dist/{json-schema-DBkdUuCO.js → json-schema-B-vAwlde.js} +45 -6
- package/dist/json-schema-CN_iLFH2.d.ts +40 -0
- package/dist/jwt/index.d.ts +18 -11
- package/dist/jwt/index.js +156 -135
- package/dist/{kernel-CB3LrIJM.js → kernel-D0NVb1cK.js} +52 -24
- package/dist/kysely/index.d.ts +5 -3
- package/dist/kysely/index.js +2 -2
- package/dist/load-BxEtwlBS.js +1 -0
- package/dist/{load-C3_oTHyO.js → load-DFS_ry0W.js} +22 -6
- package/dist/{load-jose-BL6LH4bL.js → load-jose-DZ4dnjri.js} +1 -4
- package/dist/login-Dfe5RlYk.js +68 -0
- package/dist/login-imhuwvn3.js +254 -0
- package/dist/manifest-C8IzW3Do.js +42 -0
- package/dist/manifest-dvL2XEe1.js +370 -0
- package/dist/manifest-json-CAGzls-C.js +9 -0
- package/dist/{manifest-uDS9y5de.d.ts → manifest-mx5ghSFM.d.ts} +9 -2
- package/dist/manifest-schema-C0kK_8V0.js +399 -0
- package/dist/{map-claims-AVlBaJoa.js → map-claims-D3oRmTk0.js} +13 -10
- package/dist/{map-error-BE27PYkE.js → map-error-Dr70oA_3.js} +3 -3
- package/dist/{markers-CiwAOZtO.js → markers-C6joDI3o.js} +2 -1
- package/dist/mcp/index.d.ts +22 -12
- package/dist/mcp/index.js +57 -39
- package/dist/{migrate-BwlB5-Wk.js → migrate-CIq4-E9F.js} +53 -14
- package/dist/nest/index.d.ts +12 -9
- package/dist/nest/index.js +15 -14
- package/dist/next/index.d.ts +18 -21
- package/dist/next/index.js +13 -11
- package/dist/next/plugin.d.ts +1 -1
- package/dist/next/plugin.js +2 -2
- package/dist/node/index.d.ts +10 -10
- package/dist/node/index.js +7 -9
- package/dist/{ocsf-uYFXGVw2.js → ocsf-BFp-PZZA.js} +22 -11
- package/dist/openai/index.d.ts +9 -16
- package/dist/openai/index.js +17 -24
- package/dist/openapi/index.d.ts +3 -3
- package/dist/openapi/index.js +1 -1
- package/dist/{openapi-DBzHQbov.js → openapi-B7HZ0f-r.js} +8 -8
- package/dist/openapi-C4dDTVEd.js +138 -0
- package/dist/{openapi-BJdBmYDG.js → openapi-DD1SV-5-.js} +10 -9
- package/dist/operation-findings-DgATDpvh.js +36 -0
- package/dist/operations-X0VM7F3m.d.ts +59 -0
- package/dist/orpc/index.d.ts +13 -10
- package/dist/orpc/index.js +20 -15
- package/dist/otel/index.d.ts +3 -2
- package/dist/otel/index.js +30 -7
- package/dist/output-1im__-08.js +88 -0
- package/dist/output-files-B3IZJksC.js +1 -0
- package/dist/{output-files-CgIsvdSa.js → output-files-DhRBBE4n.js} +24 -26
- package/dist/{permission-keys-B26jeyUv.js → ownership-DqaJNJPn.js} +1045 -153
- package/dist/{package-root-DtNnpmUd.js → package-root-Dk_ETdkp.js} +1 -1
- package/dist/{parse-CVFQHk6c.js → parse-Cxq0WxrA.js} +2 -2
- package/dist/{parse-local-manifest-DvYUR0QL.d.ts → parse-local-manifest-5ODwqu8b.d.ts} +1 -1
- package/dist/{parse-local-manifest-C-q02Pal.js → parse-local-manifest-CVSs6J9I.js} +1 -1
- package/dist/parse-request-D_tUXG6M.js +26 -0
- package/dist/paths-DXSHAMIa.js +42 -0
- package/dist/pdp/index.d.ts +7 -3
- package/dist/pdp/index.js +45 -26
- package/dist/{peer-BOr_kJE1.js → peer-C8swJ2GH.js} +23 -4
- package/dist/peer-CRvC7Hg1.js +1 -0
- package/dist/permdock-BrAscV28.js +868 -0
- package/dist/permdock-SV8ZINYT.d.ts +502 -0
- package/dist/{permission-registry-BsblpB-z.js → permission-registry-Br4jSNVi.js} +3 -3
- package/dist/permissions-B-wCP5ZC.js +30 -0
- package/dist/{permissions-CCJ6lmxB.js → permissions-BPxlwVhN.js} +4 -3
- package/dist/{permissions-COH-KRgT.d.ts → permissions-u_KHg-sN.d.ts} +1 -2
- package/dist/policies-DP2nqRoF.js +295 -0
- package/dist/{policy-ur0BBK_e.d.ts → policy-77FSAq_V.d.ts} +2 -2
- package/dist/{hosted-CBHgkzDl.js → policy-DbM5YYtV.js} +17 -273
- package/dist/policy-from-catalog-C2gMa2Dj.js +450 -0
- package/dist/policy-module-CTlwMvLI.js +89 -0
- package/dist/{policy-types-sp9P1iIV.d.ts → policy-types-n0uRTsW8.d.ts} +460 -632
- package/dist/postgrest-CEgRbefE.d.ts +100 -0
- package/dist/postgrest-DAjUkF9w.js +575 -0
- package/dist/{powersync-cZe4kzhL.js → powersync-BkWWCS1K.js} +23 -24
- package/dist/powersync-DISt6SUe.js +62 -0
- package/dist/powersync-MMJ2mI2q.js +1 -0
- package/dist/preset/index.d.ts +146 -0
- package/dist/preset/index.js +1 -0
- package/dist/preset-DZdU0tne.js +1768 -0
- package/dist/principal-source-pHneukrx.js +103 -0
- package/dist/prisma/index.d.ts +6 -3
- package/dist/prisma/index.js +2 -2
- package/dist/{problem-CnWraVhC.js → problem-CTviyH5L.js} +13 -23
- package/dist/{problem-details-rIIo8B2C.d.ts → problem-details-B45V5d2b.d.ts} +1 -1
- package/dist/{problem-details-DECUnXAn.js → problem-details-cn5X30gZ.js} +43 -40
- package/dist/problem-types-CJ2325SZ.js +5 -0
- package/dist/{prompt-CXYhLfsS.js → prompt-DfZLJLIn.js} +2 -2
- package/dist/{protected-BN7BUdY1.js → protected-BlF0F6wL.js} +21 -4
- package/dist/{protected-B3_P7xuw.d.ts → protected-RFGpakN9.d.ts} +16 -8
- package/dist/{provider-Bi-0HNL3.js → provider-B1al-AZz.js} +2 -2
- package/dist/{provider-kwHC9CZD.d.ts → provider-DILL9oPK.d.ts} +1 -1
- package/dist/{provider-store-Ctt-81Ni.js → provider-store-DM6DNcta.js} +2 -2
- package/dist/pull-CvpINcMK.js +1 -0
- package/dist/pull-jEwbf80J.js +256 -0
- package/dist/push-BD4f15co.js +116 -0
- package/dist/pushed-policy-CqtxkV4G.js +238 -0
- package/dist/pushed-policy-DCW91KQU.d.ts +57 -0
- package/dist/react/index.d.ts +8 -8
- package/dist/react/index.js +6 -6
- package/dist/react/provider-client.d.ts +1 -1
- package/dist/react/provider-client.js +1 -2
- package/dist/react-native/index.d.ts +24 -72
- package/dist/react-native/index.js +29 -25
- package/dist/{refs-f3imMjNW.js → refs-K6eWUJ0H.js} +1 -1
- package/dist/{relation-walk-BXnlLtg2.js → relation-walk-3OyDBF0S.js} +2 -2
- package/dist/{relations-CvmSpG67.js → relations-BnCWnJGI.js} +3 -3
- package/dist/renames-CGj7YwcQ.js +175 -0
- package/dist/{replay-COpmZUfx.d.ts → replay-Bkm-Ne4l.d.ts} +1 -1
- package/dist/{replay-BsOyTrdV.js → replay-Du1tJjG7.js} +2 -1
- package/dist/{request-context-BVM7aWNs.js → request-context-C81Pip9n.js} +3 -3
- package/dist/request-schema-CMreVuFM.js +148 -0
- package/dist/resend/index.d.ts +126 -0
- package/dist/resend/index.js +379 -0
- package/dist/{resource-relations-D1Un3pcz.js → resource-relations-D_jw0BFx.js} +1 -1
- package/dist/{retire-BFcxL6un.js → retire-CALjIQ7e.js} +2 -2
- package/dist/{revocations-Cy06JNx2.d.ts → revocations-R07lFBnX.d.ts} +2 -0
- package/dist/rls-BAqP4q66.js +336 -0
- package/dist/{rls-BEktUaqg.js → rls-DTvYd-lI.js} +288 -690
- package/dist/{role-builder-B4GbKM-i.js → role-builder-uWQZ4v84.js} +14 -207
- package/dist/{rpc-nYC3cR_u.js → rpc-VSl5ylaQ.js} +7 -7
- package/dist/run-CUKuz0A8.js +723 -0
- package/dist/run-DDwUaJDU.js +1 -0
- package/dist/run-ticket-DocwaTKn.d.ts +124 -0
- package/dist/run-ticket-sxFI6LAk.js +337 -0
- package/dist/{runtime-D_tMXnsq.js → runtime-D3VTAiCA.js} +1 -1
- package/dist/{saas-DtaA4JuW.js → saas-BCXRuXca.js} +16 -14
- package/dist/scan-qvOe0hS3.js +29 -0
- package/dist/{schema-DjQBcAP9.js → schema-B4v0Qrac.js} +102 -8
- package/dist/schema-yLuBWWsh.js +130 -0
- package/dist/scim/index.d.ts +2 -2
- package/dist/scim/index.js +1 -2
- package/dist/{scim-vFR1O5oG.js → scim-ClHtpyV3.js} +208 -76
- package/dist/{scopes-tvpa34ep.js → scopes-CUPSjo9q.js} +12 -7
- package/dist/server/index.d.ts +12 -143
- package/dist/server/index.js +12 -9
- package/dist/server-C3WXAHZj.js +453 -0
- package/dist/{server-types-DdqBwZN_.d.ts → server-types-CKQiCnON.d.ts} +51 -68
- package/dist/{sha256-BO0swRXL.js → sha256-D9ihqmvd.js} +8 -1
- package/dist/{shared-1uhI-e-b.js → shared-BAK8t4Uo.js} +20 -9
- package/dist/{shared-JhMeOsDF.js → shared-DvvFzYXe.js} +8 -9
- package/dist/signals-D3NcTKUS.js +32 -0
- package/dist/sink-4-eQIRWf.d.ts +225 -0
- package/dist/sink-BEZSlMS_.js +957 -0
- package/dist/{skills-BZdRQkxs.js → skills-B6lVdD_W.js} +13 -6
- package/dist/skills-CTYwkl44.js +51 -0
- package/dist/snapshot-B7DkYg6g.js +269 -0
- package/dist/{snapshot-cache-Cod40D-X.js → snapshot-cache-DZHQ0KF6.js} +11 -5
- package/dist/{snapshot-cache-J5T7t_vD.d.ts → snapshot-cache-PXI-vGpY.d.ts} +7 -5
- package/dist/solid/index.d.ts +11 -12
- package/dist/solid/index.js +7 -7
- package/dist/solid-start/index.d.ts +52 -0
- package/dist/solid-start/index.js +49 -0
- package/dist/{sources-Dljy06zL.d.ts → sources-Xc4zkszI.d.ts} +7 -13
- package/dist/{sources-B1-b-R0t.js → sources-vs5dGOsS.js} +125 -119
- package/dist/{sql-t8teWOfo.js → sql-B5T1IL83.js} +13 -1
- package/dist/src-Cu2m75uo.js +1860 -0
- package/dist/ssf/index.d.ts +4 -4
- package/dist/ssf/index.js +384 -47
- package/dist/standard-webhooks-DgFFD-Ga.js +228 -0
- package/dist/standard-webhooks-rbD7LS6h.d.ts +88 -0
- package/dist/storage-C2bWdvJH.js +132 -0
- package/dist/{store-ILkLUj_o.js → store-BDutJkDL.js} +40 -53
- package/dist/{store-options-CbUHDoSe.js → store-options-u0ycEe8s.js} +26 -21
- package/dist/{stores-Cxz_80g-.d.ts → stores-BUGNbJTt.d.ts} +7 -8
- package/dist/{stores-BHXdSbw9.js → stores-CGhM8BN_.js} +2 -2
- package/dist/{stream-Dwsg6WwE.d.ts → stream-CeCMJmBB.d.ts} +2 -2
- package/dist/{stream-BMui98KK.js → stream-CvdUS9V1.js} +9 -2
- package/dist/style-DiKWnAvn.js +1 -0
- package/dist/{style-CTm1AXDT.js → style-Uao76wO7.js} +3 -2
- package/dist/subject-BGoM5o8B.js +17 -0
- package/dist/supabase/index.d.ts +23 -106
- package/dist/supabase/index.js +5 -4
- package/dist/supabase/middleware.d.ts +7 -6
- package/dist/supabase/middleware.js +13 -11
- package/dist/supabase-By_frk3U.js +92 -0
- package/dist/{supabase-hook-Cva3ikXz.js → supabase-hook-BMoEhZir.js} +960 -64
- package/dist/supabase-hook-CCw5m35C.js +1 -0
- package/dist/{supabase-C1TWlnYt.js → supabase-x5JtR2tc.js} +99 -206
- package/dist/support-session-C6xJQYut.js +158 -0
- package/dist/svelte/Protected.svelte +4 -4
- package/dist/svelte/index.d.ts +7 -7
- package/dist/svelte/index.js +10 -10
- package/dist/svelte/runtime.d.ts +3 -3
- package/dist/svelte/runtime.js +3 -3
- package/dist/svelte/source.d.ts +7 -7
- package/dist/svelte/source.js +4 -4
- package/dist/sveltekit/index.d.ts +51 -0
- package/dist/sveltekit/index.js +27 -0
- package/dist/tanstack-start/index.d.ts +51 -0
- package/dist/tanstack-start/index.js +40 -0
- package/dist/target-Bw37TFNA.js +51 -0
- package/dist/{tenancy-DshjqY0n.js → tenancy-DN2QAx9z.js} +5 -5
- package/dist/terminal/index.d.ts +11 -9
- package/dist/terminal/index.js +23 -287
- package/dist/testing/index.d.ts +311 -38
- package/dist/testing/index.js +3475 -201
- package/dist/testing/saas/index.d.ts +9 -8
- package/dist/testing/saas/index.js +2 -2
- package/dist/testing/saas/permissions.d.ts +1 -1
- package/dist/testing/saas/permissions.js +1 -2
- package/dist/text-BMFRfBqc.js +8 -0
- package/dist/{text-diff-BdkkYSbi.js → text-diff-BQcUapOb.js} +1 -1
- package/dist/thenable-yD7SabqG.js +31 -0
- package/dist/time-DkWjdL98.js +71 -0
- package/dist/{token-Bx9qy30p.js → token-BLZcjQgt.js} +15 -6
- package/dist/{tool-refusal-CQ7OEia9.js → tool-refusal-CMLN5xhn.js} +2 -2
- package/dist/trpc/index.d.ts +12 -9
- package/dist/trpc/index.js +16 -14
- package/dist/types-8RnwUAvE.d.ts +107 -0
- package/dist/{store-9KO4BlkB.d.ts → types-B3_ooZgZ.d.ts} +100 -75
- package/dist/{types-Br9IXUBG.d.ts → types-BdtSDbBO.d.ts} +77 -17
- package/dist/types-BtHtcKMr.d.ts +157 -0
- package/dist/{types-CqrjB9o6.d.ts → types-BzzaHxt3.d.ts} +23 -11
- package/dist/types-C791HFu9.d.ts +332 -0
- package/dist/types-C863OQiR.d.ts +57 -0
- package/dist/{types-ByUo56un.d.ts → types-CVZSNocA.d.ts} +23 -22
- package/dist/{types-DHrmBJLH.d.ts → types-CX7AvRqP.d.ts} +7 -7
- package/dist/types-C_IiEs64.d.ts +65 -0
- package/dist/{types-7rJVLWe5.d.ts → types-Dfv0aTER.d.ts} +63 -11
- package/dist/types-DqzsnlSA.js +67 -0
- package/dist/{types-DpWfQdSh.d.ts → types-Druu9wLM.d.ts} +46 -11
- package/dist/{types-CIlTojhq.d.ts → types-_WhUP7ud.d.ts} +9 -6
- package/dist/{types-CUcFZfpU.d.ts → types-lUlG3TVd.d.ts} +2 -1
- package/dist/unplugin/index.d.ts +1 -1
- package/dist/unplugin/index.js +2 -2
- package/dist/usage-CRVl9V3t.js +32 -0
- package/dist/usage-CZpSQP6L.js +1 -0
- package/dist/{usage-CG9nOYZw.js → usage-SveTRTyr.js} +54 -11
- package/dist/{validation-error-BSSw0l_8.d.ts → validation-error-DHUrAkku.d.ts} +1 -1
- package/dist/{validity-dVrUEPJt.js → validity-CZ7-y0Cj.js} +32 -15
- package/dist/{verifier-DMr_Zmb_.js → verifier-DHuh-okk.js} +18 -7
- package/dist/{verify-BztUB3GX.js → verify-BaAKx7t6.js} +645 -50
- package/dist/{version-BEogC-rB.js → version-CEbQ5UeM.js} +4 -3
- package/dist/version-DXkYUISx.js +1 -0
- package/dist/{views-CJsrBS1f.js → views-DTIIO-oQ.js} +22 -5
- package/dist/{permission-types-Dg39z9Kv.d.ts → vocabulary-CN8H_9UF.d.ts} +67 -2
- package/dist/vue/index.d.ts +9 -10
- package/dist/vue/index.js +8 -8
- package/dist/waiter-B986w1oK.d.ts +36 -0
- package/dist/waiter-BGUtGYoU.js +67 -0
- package/dist/watch--ovlPOc0.js +1 -0
- package/dist/{watch-zeucB7eF.js → watch-vea54PRw.js} +44 -5
- package/dist/webmcp/index.d.ts +2 -2
- package/dist/webmcp/index.js +3 -3
- package/dist/where-scope-C9vfEphl.js +306 -0
- package/dist/who-can-DWBAcaCQ.js +364 -0
- package/dist/wire-delegation-Cv3W2eaM.js +36 -0
- package/dist/wire-denial-C7PaVYEM.js +27 -0
- package/dist/workflow/index.d.ts +5 -0
- package/dist/workflow/index.js +223 -0
- package/dist/workflow-sdk/index.d.ts +56 -0
- package/dist/workflow-sdk/index.js +78 -0
- package/dist/{wrap-Cr93qqdP.d.ts → wrap-C5jC6sKI.d.ts} +2 -1
- package/dist/{wrap-DWsU_5Bd.js → wrap-gX61EtpB.js} +7 -6
- package/package.json +136 -37
- package/schemas/access-event-v1.json +118 -0
- package/schemas/approval-request-v1.json +34 -1
- package/schemas/approval-signature-v1.json +94 -0
- package/schemas/automation-event-v1.json +113 -0
- package/schemas/capability-v1.json +84 -0
- package/schemas/catalog-event-v1.json +87 -0
- package/schemas/catalog-v1.json +123 -12
- package/schemas/cli-commands-v1.json +164 -0
- package/schemas/cli-result-v1.json +96 -0
- package/schemas/cloud-api-v1.json +5407 -0
- package/schemas/connector-v1.json +408 -0
- package/schemas/credential-event-v1.json +81 -0
- package/schemas/credential-v1.json +134 -0
- package/schemas/decision-event-v1.json +288 -0
- package/schemas/delivery-event-v1.json +117 -0
- package/schemas/directory-event-v1.json +85 -0
- package/schemas/evidence-export-v1.json +54 -0
- package/schemas/membership-event-v1.json +93 -0
- package/schemas/policy-v1.json +68 -0
- package/schemas/pushed-policy-v1.json +236 -0
- package/schemas/run-v1.json +162 -0
- package/schemas/snapshot-v1.json +138 -0
- package/schemas/supabase-claims-v1.json +4 -4
- package/schemas/supabase-manifest-v1.json +5 -1
- package/schemas/support-session-v1.json +111 -0
- package/skills/permdock/SKILL.md +16 -12
- package/skills/permdock-agents/SKILL.md +40 -23
- package/skills/permdock-agents/references/operations-automations-chat.md +221 -0
- package/skills/permdock-agents/references/runtimes.md +22 -18
- package/skills/permdock-approvals/SKILL.md +29 -13
- package/skills/permdock-approvals/references/delivery-and-waiters.md +172 -0
- package/skills/permdock-approvals/references/stores-and-resume.md +21 -7
- package/skills/permdock-audit/SKILL.md +3 -3
- package/skills/permdock-credentials/SKILL.md +5 -5
- package/skills/permdock-credentials/references/tokens-keys-links.md +14 -10
- package/skills/permdock-data/SKILL.md +6 -6
- package/skills/permdock-data/references/queries-and-rls.md +10 -9
- package/skills/permdock-data/references/relationships.md +3 -3
- package/skills/permdock-tenancy/SKILL.md +20 -7
- package/skills/permdock-tenancy/references/contacts-and-support-sessions.md +122 -0
- package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +6 -4
- package/skills/permdock-wire/SKILL.md +17 -11
- package/skills/permdock-wire/references/adapters.md +139 -51
- package/skills/permdock-wire/references/policy-options.md +5 -5
- package/skills/permdock-wire/references/presets-and-recipes.md +58 -0
- package/dist/approvals-DZL76lKW.js +0 -240
- package/dist/arazzo-CD8d0WLb.js +0 -54
- package/dist/catalog-6yWAX6Ps.js +0 -2
- package/dist/catalog-WHG4kBq7.js +0 -48
- package/dist/cloud-C7bSDgX4.js +0 -50
- package/dist/cloud-PeBN3IEn.js +0 -118
- package/dist/collect-Bw2Jdq1q.js +0 -2
- package/dist/collect-CQx4hX4N.js +0 -83
- package/dist/commands-Cpip4ULx.js +0 -97
- package/dist/config-DLt6BvV7.js +0 -36
- package/dist/diff-Cnghh_Ip.js +0 -48
- package/dist/doctor-CuVJvhV_.js +0 -53
- package/dist/duration-xK2jGFVc.js +0 -25
- package/dist/errors-CWfoNg9N.js +0 -47
- package/dist/errors-DRnGZHzF.js +0 -30
- package/dist/expiry-BoBJ8Tvc.js +0 -7
- package/dist/fields-fwfXN01n.js +0 -1016
- package/dist/headers-BZSDieNT.js +0 -6
- package/dist/headers-Cf-zWvsO.d.ts +0 -6
- package/dist/ids-DC4V4CFu.js +0 -18
- package/dist/index-DgM7w96K.d.ts +0 -6
- package/dist/index-Dz7didpC.d.ts +0 -201
- package/dist/index-UdVQgq48.d.ts +0 -550
- package/dist/load-B_shHrmd.js +0 -2
- package/dist/manifest-BngWKryL.js +0 -770
- package/dist/may-use-BOn_dR_w.js +0 -78
- package/dist/openapi-DcQ1Kg40.js +0 -164
- package/dist/ownership-BgnbOJFT.js +0 -851
- package/dist/permdock-L26udHSk.js +0 -3646
- package/dist/powersync-BFSbSElQ.js +0 -62
- package/dist/powersync-DCDgZgfZ.js +0 -2
- package/dist/rls-55DQTuf5.js +0 -250
- package/dist/run-DMcNW_8T.js +0 -174
- package/dist/server-ZYEHtNHS.js +0 -268
- package/dist/sink-BTtmfPnE.js +0 -141
- package/dist/sink-CPN4zLfs.d.ts +0 -104
- package/dist/skills-Dle4ZoLF.js +0 -56
- package/dist/snapshot-Dc9CHPME.js +0 -1078
- package/dist/src-Bb7no-hS.js +0 -639
- package/dist/subject-C6dLxqHU.js +0 -24
- package/dist/supabase-Dbqr141s.js +0 -83
- package/dist/supabase-hook-BULg7Ut_.js +0 -2
- package/dist/thenable-QSmvt-vZ.js +0 -65
- package/dist/types-C0dee0Qf.d.ts +0 -197
- package/dist/types-DvupZE0w.d.ts +0 -9
- package/dist/usage-4G6t643F.js +0 -42
- package/dist/usage-iFLJ0-rr.js +0 -2
- package/dist/vocabulary-hhEFLFoL.d.ts +0 -65
- package/dist/watch-C8TpsAl4.js +0 -2
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
import { a as sole } from "./compact-CAf557ZB.js";
|
|
2
|
+
import { i as configError, n as CliError } from "./errors-CWTY6uih.js";
|
|
3
|
+
import { i as requirePeer } from "./peer-C8swJ2GH.js";
|
|
4
|
+
import { M as qualified, _ as subjectClaimJsonSql } from "./shared-BAK8t4Uo.js";
|
|
5
|
+
//#region src/cli/pg.ts
|
|
6
|
+
const CONNECT_TIMEOUT_MS = 1e4;
|
|
7
|
+
const STATEMENT_TIMEOUT_MS = 6e4;
|
|
8
|
+
function loadPg(command, cwd) {
|
|
9
|
+
return requirePeer(() => import("pg"), "pg", command, cwd);
|
|
10
|
+
}
|
|
11
|
+
function options(db) {
|
|
12
|
+
return {
|
|
13
|
+
connectionString: db,
|
|
14
|
+
connectionTimeoutMillis: CONNECT_TIMEOUT_MS,
|
|
15
|
+
statement_timeout: STATEMENT_TIMEOUT_MS
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function unreachable(command, cause) {
|
|
19
|
+
return new CliError("unavailable", `PermDock CLI: ${command.replace(/^permdock /u, "")} could not connect`, {
|
|
20
|
+
cause,
|
|
21
|
+
code: "database_unreachable"
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
/** The default `connect` of a command: one connection, failing with a message that names `command`. */
|
|
25
|
+
function pgConnector(command, cwd = process.cwd()) {
|
|
26
|
+
return (db) => connectPg(db, command, cwd);
|
|
27
|
+
}
|
|
28
|
+
/** One connection, for commands that run a transaction. */
|
|
29
|
+
async function connectPg(db, command, cwd) {
|
|
30
|
+
const client = new (await (loadPg(command, cwd))).Client(options(db));
|
|
31
|
+
try {
|
|
32
|
+
await client.connect();
|
|
33
|
+
} catch (cause) {
|
|
34
|
+
throw unreachable(command, cause);
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
query: (sql, values) => client.query(sql, values),
|
|
38
|
+
end: () => client.end()
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/** A small pool, for independent catalog reads that can run in parallel. */
|
|
42
|
+
async function connectPgPool(db, command, cwd = process.cwd()) {
|
|
43
|
+
const pool = new (await (loadPg(command, cwd))).Pool({
|
|
44
|
+
...options(db),
|
|
45
|
+
max: 4
|
|
46
|
+
});
|
|
47
|
+
try {
|
|
48
|
+
(await pool.connect()).release();
|
|
49
|
+
} catch (cause) {
|
|
50
|
+
await pool.end();
|
|
51
|
+
throw unreachable(command, cause);
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
query: (sql, values) => pool.query(sql, values),
|
|
55
|
+
end: () => pool.end()
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//#endregion
|
|
59
|
+
//#region src/cli/sql/clauses.ts
|
|
60
|
+
/** True when `sql` is one parenthesised expression, so AND / OR need not wrap it again. */
|
|
61
|
+
function isWrapped(sql) {
|
|
62
|
+
if (!sql.startsWith("(") || !sql.endsWith(")")) return false;
|
|
63
|
+
let depth = 0;
|
|
64
|
+
let quoted = false;
|
|
65
|
+
for (let index = 0; index < sql.length; index += 1) {
|
|
66
|
+
const ch = sql[index];
|
|
67
|
+
if (ch === "'") quoted = !quoted;
|
|
68
|
+
else if (!quoted && ch === "(") depth += 1;
|
|
69
|
+
else if (!quoted && ch === ")") {
|
|
70
|
+
depth -= 1;
|
|
71
|
+
if (depth === 0 && index < sql.length - 1) return false;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return depth === 0;
|
|
75
|
+
}
|
|
76
|
+
function wrapSql(sql) {
|
|
77
|
+
return isWrapped(sql) ? sql : `(${sql})`;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* The grant's `validFrom` / `validUntil` as a clock check: `from` inclusive,
|
|
81
|
+
* `until` exclusive, matching the in-process evaluator.
|
|
82
|
+
*/
|
|
83
|
+
function validitySql(validity) {
|
|
84
|
+
if (validity === void 0) return;
|
|
85
|
+
return andSql(validity.from === void 0 ? void 0 : `now() >= to_timestamp(${validity.from})`, validity.until === void 0 ? void 0 : `now() < to_timestamp(${validity.until})`);
|
|
86
|
+
}
|
|
87
|
+
function andSql(...parts) {
|
|
88
|
+
const present = parts.filter((part) => part !== void 0 && part !== "true");
|
|
89
|
+
if (present.length === 0) return;
|
|
90
|
+
return present.length === 1 ? present[0] : present.map(wrapSql).join(" and ");
|
|
91
|
+
}
|
|
92
|
+
/** `USING` and `WITH CHECK` for a branch: its access check ANDed with its row conditions. */
|
|
93
|
+
function branchClauses(branch) {
|
|
94
|
+
const using = branch.command === "insert" ? void 0 : andSql(branch.access, branch.using) ?? "true";
|
|
95
|
+
const check = branch.command === "insert" || branch.command === "update" ? andSql(branch.access, branch.check) ?? "true" : void 0;
|
|
96
|
+
return {
|
|
97
|
+
...using === void 0 ? {} : { using },
|
|
98
|
+
...check === void 0 ? {} : { check }
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
//#endregion
|
|
102
|
+
//#region src/cli/rls/policies.ts
|
|
103
|
+
/** Each database role gets its own policy, so no role sees two permissive policies for one command. */
|
|
104
|
+
const AUDIENCES = ["authenticated", "anon"];
|
|
105
|
+
const DEFAULT_POLICY_NAME = "{table}_{op}";
|
|
106
|
+
const DEFAULT_PER_ROLE_NAME = "{role}_{permission}";
|
|
107
|
+
const PLACEHOLDER = /\{(table|op|role|permission)\}/gu;
|
|
108
|
+
function sanitize(name) {
|
|
109
|
+
return name.replaceAll(/[^A-Za-z0-9_]/g, "_");
|
|
110
|
+
}
|
|
111
|
+
function render(template, values) {
|
|
112
|
+
return sanitize(template.replaceAll(PLACEHOLDER, (_match, key) => values[key]));
|
|
113
|
+
}
|
|
114
|
+
/** Rejects a template that cannot name every policy of the chosen shape uniquely. */
|
|
115
|
+
function assertPolicyName(template, perRole) {
|
|
116
|
+
if (!perRole && /\{(role|permission)\}/u.test(template)) throw configError("PermDock CLI: --policy-name {role} and {permission} need --policy-per-role; a collapsed policy covers several roles");
|
|
117
|
+
if (!perRole && !(template.includes("{table}") && template.includes("{op}"))) throw configError("PermDock CLI: --policy-name needs {table} and {op} so each table and command gets its own policy");
|
|
118
|
+
}
|
|
119
|
+
function orSql(parts) {
|
|
120
|
+
const distinct = [...new Set(parts)];
|
|
121
|
+
if (distinct.includes("true")) return "true";
|
|
122
|
+
return sole(distinct) ?? distinct.map(wrapSql).join(" or ");
|
|
123
|
+
}
|
|
124
|
+
function negate(sql) {
|
|
125
|
+
return sql === void 0 ? void 0 : `(${sql}) is not true`;
|
|
126
|
+
}
|
|
127
|
+
function policyOf(name, branch, using, check) {
|
|
128
|
+
const deny = branch.effect === "deny";
|
|
129
|
+
const policy = {
|
|
130
|
+
name,
|
|
131
|
+
table: branch.table,
|
|
132
|
+
command: branch.command,
|
|
133
|
+
effect: branch.effect,
|
|
134
|
+
roles: branch.roles
|
|
135
|
+
};
|
|
136
|
+
const finalUsing = deny ? negate(using) : using;
|
|
137
|
+
const finalCheck = deny ? negate(check) : check;
|
|
138
|
+
if (finalUsing !== void 0) policy.using = finalUsing;
|
|
139
|
+
if (finalCheck !== void 0) policy.check = finalCheck;
|
|
140
|
+
return policy;
|
|
141
|
+
}
|
|
142
|
+
function uniqueName(names, name) {
|
|
143
|
+
const seen = names.get(name) ?? 0;
|
|
144
|
+
names.set(name, seen + 1);
|
|
145
|
+
return seen === 0 ? name : `${name}_${seen + 1}`;
|
|
146
|
+
}
|
|
147
|
+
function perRolePolicies(branches, template) {
|
|
148
|
+
const names = /* @__PURE__ */ new Map();
|
|
149
|
+
return branches.map((branch) => {
|
|
150
|
+
const clauses = branchClauses(branch);
|
|
151
|
+
const deny = branch.effect === "deny";
|
|
152
|
+
const base = render(template, {
|
|
153
|
+
table: branch.table,
|
|
154
|
+
op: branch.command,
|
|
155
|
+
role: branch.label,
|
|
156
|
+
permission: branch.permissionKey
|
|
157
|
+
});
|
|
158
|
+
const name = `${deny ? "deny_" : ""}${base}${branch.coverage === true ? "_select_coverage" : ""}`;
|
|
159
|
+
return policyOf(uniqueName(names, name), branch, clauses.using, clauses.check);
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Branches of one grant-key group share their row condition, so the group
|
|
164
|
+
* becomes one OR branch whose access ORs the helper calls of each scope.
|
|
165
|
+
*/
|
|
166
|
+
function mergeGroups(branches) {
|
|
167
|
+
const merged = [];
|
|
168
|
+
const byKey = /* @__PURE__ */ new Map();
|
|
169
|
+
for (const branch of branches) {
|
|
170
|
+
const id = branch.grantKey === void 0 ? void 0 : `${branch.table}\u0000${branch.command}\u0000${branch.grantKey}\u0000${branch.coverage === true}`;
|
|
171
|
+
const entry = id === void 0 ? void 0 : byKey.get(id);
|
|
172
|
+
if (entry === void 0) {
|
|
173
|
+
const created = {
|
|
174
|
+
branch,
|
|
175
|
+
accesses: branch.access === void 0 ? [] : [branch.access]
|
|
176
|
+
};
|
|
177
|
+
if (id !== void 0) byKey.set(id, created);
|
|
178
|
+
merged.push(created);
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
if (branch.access !== void 0 && !entry.accesses.includes(branch.access)) entry.accesses.push(branch.access);
|
|
182
|
+
}
|
|
183
|
+
return merged.map(({ branch, accesses }) => accesses.length <= 1 ? branch : withAccess(branch, orSql(accesses)));
|
|
184
|
+
}
|
|
185
|
+
function withAccess(branch, access) {
|
|
186
|
+
return {
|
|
187
|
+
...branch,
|
|
188
|
+
access
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
function collapsedPolicies(branches, template) {
|
|
192
|
+
const groups = /* @__PURE__ */ new Map();
|
|
193
|
+
for (const branch of mergeGroups(branches)) {
|
|
194
|
+
const id = `${branch.table}\u0000${branch.command}\u0000${branch.effect}`;
|
|
195
|
+
groups.set(id, [...groups.get(id) ?? [], branch]);
|
|
196
|
+
}
|
|
197
|
+
const names = /* @__PURE__ */ new Map();
|
|
198
|
+
return [...groups.values()].flatMap((group) => AUDIENCES.flatMap((audience) => {
|
|
199
|
+
const members = group.filter((branch) => branch.roles.includes(audience));
|
|
200
|
+
const [first] = members;
|
|
201
|
+
if (first === void 0) return [];
|
|
202
|
+
const deny = first.effect === "deny";
|
|
203
|
+
const clauses = members.map(branchClauses);
|
|
204
|
+
const usings = clauses.flatMap((item) => item.using === void 0 ? [] : [item.using]);
|
|
205
|
+
const checks = clauses.flatMap((item) => item.check === void 0 ? [] : [item.check]);
|
|
206
|
+
const base = render(template, {
|
|
207
|
+
table: first.table,
|
|
208
|
+
op: first.command,
|
|
209
|
+
role: first.label,
|
|
210
|
+
permission: first.permissionKey
|
|
211
|
+
});
|
|
212
|
+
return [policyOf(uniqueName(names, `${deny ? "deny_" : ""}${base}${audience === "anon" ? "_anon" : ""}`), {
|
|
213
|
+
...first,
|
|
214
|
+
roles: [audience]
|
|
215
|
+
}, usings.length === 0 ? void 0 : orSql(usings), checks.length === 0 ? void 0 : orSql(checks))];
|
|
216
|
+
}));
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Assembles policies. The default is one PERMISSIVE policy per table,
|
|
220
|
+
* command and database role (Splinter `multiple_permissive_policies` stays
|
|
221
|
+
* quiet), with denies in one RESTRICTIVE policy per table, command and role.
|
|
222
|
+
*/
|
|
223
|
+
function assemblePolicies(branches, shape) {
|
|
224
|
+
const template = shape.name ?? (shape.perRole ? DEFAULT_PER_ROLE_NAME : DEFAULT_POLICY_NAME);
|
|
225
|
+
assertPolicyName(template, shape.perRole);
|
|
226
|
+
return shape.perRole ? perRolePolicies(branches, template) : collapsedPolicies(branches, template);
|
|
227
|
+
}
|
|
228
|
+
const DEFAULT_READ_ONLY_ACTORS = ["support", "impersonation"];
|
|
229
|
+
const ACTOR_KIND = /^[a-z][a-z0-9_-]*$/u;
|
|
230
|
+
/** The actor kinds `rls.readOnlyActors` names, or `undefined` when it is off. */
|
|
231
|
+
function readOnlyActorKinds(setting) {
|
|
232
|
+
if (setting === void 0 || setting === false) return;
|
|
233
|
+
const kinds = setting === true ? DEFAULT_READ_ONLY_ACTORS : setting;
|
|
234
|
+
if (kinds.length === 0 || kinds.some((kind) => !ACTOR_KIND.test(kind))) throw configError("PermDock CLI: rls.readOnlyActors must be true or a non-empty list of actor kinds such as 'support'");
|
|
235
|
+
return [...new Set(kinds)];
|
|
236
|
+
}
|
|
237
|
+
/** `permdock_actor_may_write()`, for hand-written write policies. Names are part of the SQL contract. */
|
|
238
|
+
const ACTOR_MAY_WRITE = "permdock_actor_may_write";
|
|
239
|
+
/**
|
|
240
|
+
* True unless the token's `act` claim (`act`, as SQL `jsonb`) is a session
|
|
241
|
+
* of one of `kinds` that is not `read_only: false`, or an agent with
|
|
242
|
+
* `read_only: true` (agents default to writable, as better-supabase reads them).
|
|
243
|
+
*/
|
|
244
|
+
function readOnlyActorPasses(act, kinds) {
|
|
245
|
+
const list = `array[${kinds.map((kind) => `'${kind}'`).join(", ")}]::text[]`;
|
|
246
|
+
const passes = `(not coalesce(${kinds.includes("support") ? `(${act} ->> 'kind') = any(${list}) or ((${act} ->> 'kind') is null and ${act} ? 'session_id')` : `(${act} ->> 'kind') = any(${list})`}, false) or coalesce((${act} ->> 'read_only') = 'false', false))`;
|
|
247
|
+
return kinds.includes("agent") ? passes : `${passes} and not coalesce((${act} ->> 'kind') = 'agent' and (${act} ->> 'read_only') = 'true', false)`;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* `permdock_actor_may_write()`: {@link readOnlyActorPasses} as a function, so
|
|
251
|
+
* hand-written write policies apply the same read-only default.
|
|
252
|
+
*/
|
|
253
|
+
function actorMayWriteSql(ctx, kinds) {
|
|
254
|
+
const fn = qualified(ctx, ACTOR_MAY_WRITE);
|
|
255
|
+
return `-- rls.readOnlyActors: false for a token whose act claim is a read-only ${kinds.join(" or ")} session; hand-written write policies call it
|
|
256
|
+
create or replace function ${fn}()
|
|
257
|
+
returns boolean
|
|
258
|
+
language sql
|
|
259
|
+
stable
|
|
260
|
+
set search_path = ''
|
|
261
|
+
as $$
|
|
262
|
+
select ${readOnlyActorPasses(subjectClaimJsonSql(ctx, "act"), kinds)}
|
|
263
|
+
$$;
|
|
264
|
+
revoke execute on function ${fn}() from public, anon;
|
|
265
|
+
grant execute on function ${fn}() to authenticated;
|
|
266
|
+
`;
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* One restrictive policy per table and write command the allow policies
|
|
270
|
+
* grant to `authenticated`: the write passes unless the token's `act` claim
|
|
271
|
+
* (`act`, as SQL `jsonb`) is a session of one of `kinds` that is not
|
|
272
|
+
* `read_only: false`. Reads are never touched.
|
|
273
|
+
*/
|
|
274
|
+
function readOnlyActorPolicies(policies, act, kinds) {
|
|
275
|
+
const passes = readOnlyActorPasses(act, kinds);
|
|
276
|
+
const seen = /* @__PURE__ */ new Set();
|
|
277
|
+
const out = [];
|
|
278
|
+
for (const policy of policies) {
|
|
279
|
+
const key = `${policy.table}\u0000${policy.command}`;
|
|
280
|
+
if (policy.effect !== "allow" || policy.command === "select" || !policy.roles.includes("authenticated") || seen.has(key)) continue;
|
|
281
|
+
seen.add(key);
|
|
282
|
+
out.push({
|
|
283
|
+
name: sanitize(`${policy.table}_${policy.command}_read_only_actors`),
|
|
284
|
+
table: policy.table,
|
|
285
|
+
command: policy.command,
|
|
286
|
+
effect: "deny",
|
|
287
|
+
roles: ["authenticated"],
|
|
288
|
+
...policy.command === "insert" ? {} : { using: passes },
|
|
289
|
+
...policy.command === "delete" ? {} : { check: passes }
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
return out;
|
|
293
|
+
}
|
|
294
|
+
//#endregion
|
|
295
|
+
export { readOnlyActorKinds as a, branchClauses as c, connectPgPool as d, pgConnector as f, orSql as i, validitySql as l, actorMayWriteSql as n, readOnlyActorPolicies as o, assemblePolicies as r, andSql as s, ACTOR_MAY_WRITE as t, wrapSql as u };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { c as saasPlans, l as saasRoles, s as saasPermissions } from "./permissions-
|
|
1
|
+
import { T as Policy, ar as Subject, rr as Principal } from "./policy-types-n0uRTsW8.js";
|
|
2
|
+
import { c as saasPlans, l as saasRoles, s as saasPermissions } from "./permissions-u_KHg-sN.js";
|
|
3
3
|
//#region src/testing/saas/policy.d.ts
|
|
4
4
|
/** Daily API-key quota per subject; the bucket should be per tenant too. */
|
|
5
5
|
declare const SAAS_API_KEY_LIMIT = 5;
|
|
@@ -1,17 +1,16 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { t as compact } from "./compact-CAf557ZB.js";
|
|
2
2
|
import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
|
|
3
|
-
import { o as
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { t as
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import { n as normalizeValidity } from "./validity-
|
|
11
|
-
import { t as
|
|
12
|
-
import { a as
|
|
13
|
-
import {
|
|
14
|
-
import { n as sha256, t as bytesToBase64Url } from "./sha256-BO0swRXL.js";
|
|
3
|
+
import { c as withGrantSchema, d as assertApprovalVersions, i as completeGrant, o as flattenGrants, p as normalizeWhere, s as flattenPermissions, u as assertApprovalRelations } from "./role-builder-uWQZ4v84.js";
|
|
4
|
+
import { c as listPermissions, i as getRegistry, m as annotationsFor, n as findPermission, s as isRegistryTree } from "./permission-registry-Br4jSNVi.js";
|
|
5
|
+
import { d as isSelfParented, l as isFieldRelation } from "./resource-relations-D_jw0BFx.js";
|
|
6
|
+
import { t as canonicalJson } from "./canonical-json-BC8_nMTw.js";
|
|
7
|
+
import { r as sha256Digest } from "./sha256-D9ihqmvd.js";
|
|
8
|
+
import { n as defineScopes, o as resolveScope } from "./scopes-CUPSjo9q.js";
|
|
9
|
+
import { o as flattenGrantee, r as asGrantee, v as listRoles } from "./grantee-hxrUsbpM.js";
|
|
10
|
+
import { n as normalizeValidity } from "./validity-CZ7-y0Cj.js";
|
|
11
|
+
import { a as relationStart, i as relationHops, n as isGraphRelation, t as inheritCondition } from "./grantee-conditions-CcXf8hMM.js";
|
|
12
|
+
import { a as memberOfFields, p as scopeField, u as relatesTo } from "./tenancy-DN2QAx9z.js";
|
|
13
|
+
import { t as byCodePoint } from "./compare-pfyVnBjE.js";
|
|
15
14
|
//#region src/core/policy-assertions.ts
|
|
16
15
|
function assertParentGraph(resources) {
|
|
17
16
|
for (const node of resources.values()) {
|
|
@@ -179,7 +178,7 @@ function normalizeOAuthScopes(input, tree) {
|
|
|
179
178
|
leaves.set(leaf.key, leaf);
|
|
180
179
|
}
|
|
181
180
|
if (leaves.size === 0) throw new Error(`PermDock: oauthScopes '${scope}' covers no permission`);
|
|
182
|
-
const sorted = [...leaves.values()].toSorted((a, b) => a.key
|
|
181
|
+
const sorted = [...leaves.values()].toSorted((a, b) => byCodePoint(a.key, b.key));
|
|
183
182
|
return {
|
|
184
183
|
scope,
|
|
185
184
|
permissions: sorted.map((leaf) => leaf.key),
|
|
@@ -307,8 +306,8 @@ function mergeBindings(items) {
|
|
|
307
306
|
function definePolicy(permissions, options) {
|
|
308
307
|
const vocabulary = isVocabularyInput(permissions) ? permissions : { permissions };
|
|
309
308
|
const tree = vocabulary.permissions;
|
|
310
|
-
const mapper = options.
|
|
311
|
-
if (mapper
|
|
309
|
+
const mapper = options.subject;
|
|
310
|
+
if (typeof mapper !== "function") throw new TypeError("PermDock: definePolicy requires a subject function");
|
|
312
311
|
const resources = getRegistry(tree);
|
|
313
312
|
assertParentGraph(resources);
|
|
314
313
|
const scopes = defineScopes(options.scopes);
|
|
@@ -336,7 +335,7 @@ function definePolicy(permissions, options) {
|
|
|
336
335
|
const delegations = (options.delegations ?? []).map((item, index) => normalizeDelegation(item, index, tree));
|
|
337
336
|
const levels = normalizeLevels(resources);
|
|
338
337
|
const oauthScopes = normalizeOAuthScopes(options.oauthScopes, tree);
|
|
339
|
-
const fingerprint =
|
|
338
|
+
const fingerprint = sha256Digest(oauthScopes.length === 0 ? canonicalPolicy(grants, delegations, levels) : `${canonicalPolicy(grants, delegations, levels)}\noauthScopes:${canonicalJson(oauthScopes)}`);
|
|
340
339
|
const hostable = [...new Set((options.hostable ?? []).flatMap((item) => flattenPermissions(item).map((leaf) => leaf.key)))].toSorted();
|
|
341
340
|
const fresh = [...new Set((options.fresh ?? []).flatMap((item) => flattenPermissions(item).map((leaf) => leaf.key)))].toSorted();
|
|
342
341
|
return freezeDeep({
|
|
@@ -397,259 +396,4 @@ function separationConflicts(policy, memberships) {
|
|
|
397
396
|
return conflicts;
|
|
398
397
|
}
|
|
399
398
|
//#endregion
|
|
400
|
-
|
|
401
|
-
function memoryPolicySource(document = null) {
|
|
402
|
-
const current = document === null ? null : parsePolicyDocument(document);
|
|
403
|
-
return Object.freeze({
|
|
404
|
-
current: () => current,
|
|
405
|
-
refresh: () => Promise.resolve()
|
|
406
|
-
});
|
|
407
|
-
}
|
|
408
|
-
function rejectUnsafe(value) {
|
|
409
|
-
if (value === null || typeof value !== "object") return;
|
|
410
|
-
if (Array.isArray(value)) {
|
|
411
|
-
for (const item of value) rejectUnsafe(item);
|
|
412
|
-
return;
|
|
413
|
-
}
|
|
414
|
-
for (const key of Object.keys(value)) {
|
|
415
|
-
if (isForbiddenKey(key)) throw new Error(`PermDock: unsafe policy document key '${key}'`);
|
|
416
|
-
rejectUnsafe(value[key]);
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
/** Validates the document envelope; per-grant checks happen at merge time. */
|
|
420
|
-
function parsePolicyDocument(json) {
|
|
421
|
-
const input = typeof json === "string" ? JSON.parse(json) : json;
|
|
422
|
-
if (!isRecord(input)) throw new TypeError("PermDock: policy document must be an object");
|
|
423
|
-
const copy = JSON.parse(JSON.stringify(input));
|
|
424
|
-
rejectUnsafe(copy);
|
|
425
|
-
if (copy["v"] !== 1) throw new Error(`PermDock: unsupported policy document version '${String(copy["v"])}'`);
|
|
426
|
-
if (typeof copy["id"] !== "string" || typeof copy["fingerprint"] !== "string" || typeof copy["catalog"] !== "string" || typeof copy["issuedAt"] !== "number" || !Array.isArray(copy["grants"])) throw new TypeError("PermDock: malformed policy document");
|
|
427
|
-
return freezeDeep(copy);
|
|
428
|
-
}
|
|
429
|
-
const COMPARISONS = /* @__PURE__ */ new Set([
|
|
430
|
-
"eq",
|
|
431
|
-
"ne",
|
|
432
|
-
"gt",
|
|
433
|
-
"gte",
|
|
434
|
-
"lt",
|
|
435
|
-
"lte",
|
|
436
|
-
"contains"
|
|
437
|
-
]);
|
|
438
|
-
function safePath(path) {
|
|
439
|
-
if (typeof path !== "string" || path.length === 0) return false;
|
|
440
|
-
return splitPath(path).every((segment) => !isForbiddenKey(segment));
|
|
441
|
-
}
|
|
442
|
-
function portableValue(value) {
|
|
443
|
-
if (value === null || typeof value === "string" || typeof value === "boolean" || typeof value === "number" && Number.isFinite(value)) return true;
|
|
444
|
-
if (Array.isArray(value)) return value.every(portableValue);
|
|
445
|
-
if (!isRecord(value)) return false;
|
|
446
|
-
const keys = Object.keys(value);
|
|
447
|
-
if (keys.length !== 1) return false;
|
|
448
|
-
if (keys[0] === "ref") return safePath(value["ref"]);
|
|
449
|
-
return keys[0] === "date" && typeof value["date"] === "string";
|
|
450
|
-
}
|
|
451
|
-
/** True for the portable subset only: no `opaque`, no `sqlFunction`, no unknown op. */
|
|
452
|
-
function isPortableCondition(value) {
|
|
453
|
-
if (!isRecord(value) || typeof value["op"] !== "string") return false;
|
|
454
|
-
const op = value["op"];
|
|
455
|
-
if (COMPARISONS.has(op)) return safePath(value["field"]) && portableValue(value["value"]);
|
|
456
|
-
switch (op) {
|
|
457
|
-
case "in":
|
|
458
|
-
case "notIn": return safePath(value["field"]) && (Array.isArray(value["value"]) || isRecord(value["value"])) && portableValue(value["value"]);
|
|
459
|
-
case "isNull": return safePath(value["field"]) && typeof value["value"] === "boolean";
|
|
460
|
-
case "and":
|
|
461
|
-
case "or": return Array.isArray(value["conditions"]) && value["conditions"].every(isPortableCondition);
|
|
462
|
-
case "not": return isPortableCondition(value["condition"]);
|
|
463
|
-
case "memberOf": return (value["scope"] === "tenant" || value["scope"] === "team" || value["scope"] === "resource") && safePath(value["field"]) && Array.isArray(value["roles"]) && value["roles"].every((item) => typeof item === "string") && (value["resource"] === void 0 || typeof value["resource"] === "string") && (value["parents"] === void 0 || Array.isArray(value["parents"]) && value["parents"].every((parent) => safePath(parent) || isRecord(parent) && safePath(parent["field"]) && typeof parent["resource"] === "string"));
|
|
464
|
-
default: return false;
|
|
465
|
-
}
|
|
466
|
-
}
|
|
467
|
-
function approvalRank(approval) {
|
|
468
|
-
if (approval === void 0) return;
|
|
469
|
-
if (approval === "human") return {
|
|
470
|
-
distinct: true,
|
|
471
|
-
stale: false,
|
|
472
|
-
quorum: 1,
|
|
473
|
-
ttl: Number.POSITIVE_INFINITY,
|
|
474
|
-
escalates: false
|
|
475
|
-
};
|
|
476
|
-
return {
|
|
477
|
-
by: approval.stages === void 0 ? JSON.stringify(approval.by) : JSON.stringify([approval.mode, approval.stages]),
|
|
478
|
-
distinct: approval.distinct !== false,
|
|
479
|
-
stale: approval.staleOn === "resource-change",
|
|
480
|
-
quorum: approval.quorum ?? 1,
|
|
481
|
-
ttl: parseDuration(approval.ttl) ?? Number.POSITIVE_INFINITY,
|
|
482
|
-
escalates: approval.escalation !== void 0
|
|
483
|
-
};
|
|
484
|
-
}
|
|
485
|
-
/** A hosted approval must meet every approval a code allow requires on the permission. */
|
|
486
|
-
function approvalAtLeast(hosted, code) {
|
|
487
|
-
const mine = approvalRank(hosted);
|
|
488
|
-
for (const required of code) {
|
|
489
|
-
const theirs = approvalRank(required);
|
|
490
|
-
if (theirs === void 0) continue;
|
|
491
|
-
if (mine === void 0) return false;
|
|
492
|
-
if (theirs.distinct && !mine.distinct) return false;
|
|
493
|
-
if (theirs.stale && !mine.stale) return false;
|
|
494
|
-
if (theirs.by !== void 0 && mine.by !== theirs.by) return false;
|
|
495
|
-
if (mine.quorum < theirs.quorum || mine.ttl > theirs.ttl) return false;
|
|
496
|
-
if (mine.escalates && !theirs.escalates) return false;
|
|
497
|
-
}
|
|
498
|
-
return true;
|
|
499
|
-
}
|
|
500
|
-
/** A grantee kind this build does not know is never declared, so the hosted grant is dropped. */
|
|
501
|
-
function undeclaredKind(_grantee) {
|
|
502
|
-
return false;
|
|
503
|
-
}
|
|
504
|
-
function declaredGrantee(policy, grantee, permissionResource) {
|
|
505
|
-
switch (grantee.kind) {
|
|
506
|
-
case "role": return declaredRoleNames(policy).has(grantee.role);
|
|
507
|
-
case "plan": return listPlans(policy.vocabulary.plans).some((leaf) => leaf.key === grantee.plan);
|
|
508
|
-
case "relation": return grantee.resource === permissionResource && getResource(policy.permissions, grantee.resource)?.relations[grantee.relation] !== void 0 && (grantee.through === void 0 || grantee.through === "parent" && isSelfParented(getResource(policy.permissions, grantee.resource))) && (grantee.depth === void 0 || grantee.through === "parent" && Number.isInteger(grantee.depth) && grantee.depth >= 0 && grantee.depth <= 32);
|
|
509
|
-
case "anyone":
|
|
510
|
-
case "authenticated":
|
|
511
|
-
case "actor":
|
|
512
|
-
case "assurance":
|
|
513
|
-
case "inherit": return false;
|
|
514
|
-
default: return undeclaredKind(grantee);
|
|
515
|
-
}
|
|
516
|
-
}
|
|
517
|
-
/** Approvers are declared roles, plans or relations, or any authenticated human. */
|
|
518
|
-
function approvalAcceptable(policy, approval, permissionResource) {
|
|
519
|
-
if (approval === void 0 || approval === "human") return true;
|
|
520
|
-
if (!isRecord(approval)) return false;
|
|
521
|
-
if (approval["mode"] !== void 0 || approval["stages"] !== void 0) return false;
|
|
522
|
-
if (approval["distinct"] !== void 0 && typeof approval["distinct"] !== "boolean") return false;
|
|
523
|
-
if (approval["staleOn"] !== void 0 && (approval["staleOn"] !== "resource-change" || getResource(policy.permissions, permissionResource)?.version === void 0)) return false;
|
|
524
|
-
if (approval["quorum"] !== void 0 && (!Number.isInteger(approval["quorum"]) || approval["quorum"] < 1)) return false;
|
|
525
|
-
if (approval["ttl"] !== void 0 && (typeof approval["ttl"] !== "string" || parseDuration(approval["ttl"]) === void 0)) return false;
|
|
526
|
-
const escalation = approval["escalation"];
|
|
527
|
-
if (escalation !== void 0 && (!isRecord(escalation) || typeof escalation["after"] !== "string" || parseDuration(escalation["after"]) === void 0 || !granteesAcceptable(policy, escalation["to"], permissionResource))) return false;
|
|
528
|
-
if (approval["by"] === void 0) return true;
|
|
529
|
-
return granteesAcceptable(policy, approval["by"], permissionResource);
|
|
530
|
-
}
|
|
531
|
-
function granteesAcceptable(policy, raw, permissionResource) {
|
|
532
|
-
if (raw === void 0) return false;
|
|
533
|
-
const items = flattenGrantee(raw);
|
|
534
|
-
return items.length > 0 && items.every((item) => isRecord(item) && item.kind !== "relation" && (item.kind === "authenticated" || declaredGrantee(policy, item, permissionResource)));
|
|
535
|
-
}
|
|
536
|
-
function buildGrant(policy, document, raw) {
|
|
537
|
-
if (!isRecord(raw) || typeof raw["id"] !== "string" || typeof raw["permission"] !== "string" || raw["effect"] !== void 0 && raw["effect"] !== "allow" && raw["effect"] !== "deny" || raw["to"] === void 0) return {
|
|
538
|
-
ok: false,
|
|
539
|
-
reason: "invalid"
|
|
540
|
-
};
|
|
541
|
-
const permission = findPermission(policy.permissions, raw["permission"]);
|
|
542
|
-
if (permission === void 0) return {
|
|
543
|
-
ok: false,
|
|
544
|
-
reason: "unknown-permission"
|
|
545
|
-
};
|
|
546
|
-
if (!policy.hostable.includes(permission.key)) return {
|
|
547
|
-
ok: false,
|
|
548
|
-
reason: "not-hostable"
|
|
549
|
-
};
|
|
550
|
-
const to = flattenGrantee(raw["to"]);
|
|
551
|
-
if (to.length === 0 || !to.every((item) => isRecord(item) && declaredGrantee(policy, item, permission.resource))) return {
|
|
552
|
-
ok: false,
|
|
553
|
-
reason: "unknown-grantee"
|
|
554
|
-
};
|
|
555
|
-
for (const condition of [raw["where"], raw["check"]]) if (condition !== void 0 && !isPortableCondition(condition)) return {
|
|
556
|
-
ok: false,
|
|
557
|
-
reason: "non-portable"
|
|
558
|
-
};
|
|
559
|
-
if (!approvalAcceptable(policy, raw["approval"], permission.resource)) return {
|
|
560
|
-
ok: false,
|
|
561
|
-
reason: "invalid"
|
|
562
|
-
};
|
|
563
|
-
if (raw["fields"] !== void 0 && !(Array.isArray(raw["fields"]) && raw["fields"].every((field) => typeof field === "string"))) return {
|
|
564
|
-
ok: false,
|
|
565
|
-
reason: "invalid"
|
|
566
|
-
};
|
|
567
|
-
const effect = raw["effect"] ?? "allow";
|
|
568
|
-
const options = compact({
|
|
569
|
-
where: raw["where"] === void 0 ? void 0 : normalizeWhere(raw["where"]),
|
|
570
|
-
check: raw["check"] === void 0 ? void 0 : normalizeWhere(raw["check"]),
|
|
571
|
-
approval: raw["approval"],
|
|
572
|
-
fields: raw["fields"]
|
|
573
|
-
});
|
|
574
|
-
let built;
|
|
575
|
-
try {
|
|
576
|
-
const roleItem = to.length === 1 && to[0]?.kind === "role" ? to[0] : null;
|
|
577
|
-
if (roleItem === null) {
|
|
578
|
-
const partial = (effect === "allow" ? allow : deny)(permission, {
|
|
579
|
-
...options,
|
|
580
|
-
to
|
|
581
|
-
});
|
|
582
|
-
built = completeGrant(partial);
|
|
583
|
-
} else {
|
|
584
|
-
const binding = policy.rolesByName.get(roleItem.role);
|
|
585
|
-
const leaf = findRole(policy.vocabulary.roles, roleItem.role);
|
|
586
|
-
const [first] = role(leaf ?? roleItem.role, [(effect === "allow" ? allow : deny)(permission, options)], binding?.on === void 0 ? {} : { on: binding.on }).grants;
|
|
587
|
-
if (first === void 0) throw new TypeError("PermDock: role produced no grant");
|
|
588
|
-
built = first;
|
|
589
|
-
}
|
|
590
|
-
} catch {
|
|
591
|
-
return {
|
|
592
|
-
ok: false,
|
|
593
|
-
reason: "invalid"
|
|
594
|
-
};
|
|
595
|
-
}
|
|
596
|
-
if (effect === "allow") {
|
|
597
|
-
const codeApprovals = policy.grants.filter((grant) => grant.effect === "allow" && grant.hosted === void 0 && grant.permission.key === permission.key).map((grant) => grant.approval);
|
|
598
|
-
if (!approvalAtLeast(built.approval, codeApprovals)) return {
|
|
599
|
-
ok: false,
|
|
600
|
-
reason: "weaker-approval"
|
|
601
|
-
};
|
|
602
|
-
}
|
|
603
|
-
return {
|
|
604
|
-
ok: true,
|
|
605
|
-
grant: freezeDeep({
|
|
606
|
-
...built,
|
|
607
|
-
hosted: {
|
|
608
|
-
document: document.fingerprint,
|
|
609
|
-
grant: raw["id"]
|
|
610
|
-
}
|
|
611
|
-
})
|
|
612
|
-
};
|
|
613
|
-
}
|
|
614
|
-
/**
|
|
615
|
-
* The code policy plus the hosted grants that pass every rule. Hosted
|
|
616
|
-
* allows OR with code allows and any deny still wins, so a hosted grant can
|
|
617
|
-
* never override a code deny; one that fails a rule is dropped, not thrown.
|
|
618
|
-
*/
|
|
619
|
-
function mergeHostedGrants(policy, document) {
|
|
620
|
-
if (document === null || document.grants.length === 0) return {
|
|
621
|
-
policy,
|
|
622
|
-
dropped: []
|
|
623
|
-
};
|
|
624
|
-
const merged = [];
|
|
625
|
-
const dropped = [];
|
|
626
|
-
for (const raw of document.grants) {
|
|
627
|
-
const result = buildGrant(policy, document, raw);
|
|
628
|
-
if (result.ok) {
|
|
629
|
-
merged.push(result.grant);
|
|
630
|
-
continue;
|
|
631
|
-
}
|
|
632
|
-
dropped.push(freezeDeep({
|
|
633
|
-
kind: "hosted-grant-dropped",
|
|
634
|
-
document: document.fingerprint,
|
|
635
|
-
grant: isRecord(raw) && typeof raw.id === "string" ? raw.id : "",
|
|
636
|
-
reason: result.reason
|
|
637
|
-
}));
|
|
638
|
-
}
|
|
639
|
-
if (merged.length === 0) return {
|
|
640
|
-
policy,
|
|
641
|
-
dropped
|
|
642
|
-
};
|
|
643
|
-
const grants = [...policy.grants, ...merged];
|
|
644
|
-
return {
|
|
645
|
-
policy: freezeDeep({
|
|
646
|
-
...policy,
|
|
647
|
-
grants,
|
|
648
|
-
index: indexPolicy(policy.roles, grants, policy.vocabulary),
|
|
649
|
-
fingerprint: bytesToBase64Url(sha256(`${policy.fingerprint}:${document.fingerprint}`))
|
|
650
|
-
}),
|
|
651
|
-
dropped
|
|
652
|
-
};
|
|
653
|
-
}
|
|
654
|
-
//#endregion
|
|
655
|
-
export { declaredRoleNames as a, levelCondition as c, separationConflicts as d, policyX as f, parsePolicyDocument as i, levelNames as l, memoryPolicySource as n, definePolicy as o, mergeHostedGrants as r, grantList as s, isPortableCondition as t, policyLevels as u };
|
|
399
|
+
export { levelCondition as a, separationConflicts as c, indexPolicy as i, policyX as l, definePolicy as n, levelNames as o, grantList as r, policyLevels as s, declaredRoleNames as t, normalizeDelegation as u };
|