permdock 0.4.0 → 0.5.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-B4R5fnMU.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-Djo_PyZc.d.ts +57 -0
- package/dist/approvals/index.d.ts +5 -3
- package/dist/approvals/index.js +8 -5
- package/dist/approvals-DJ6Yd5z1.js +995 -0
- package/dist/arazzo-B6lebmiQ.js +36 -0
- package/dist/{arazzo-C4BcskbX.js → arazzo-BWhNF-k0.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-Dg8XsRaO.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-BMZPIVUM.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-BzqG8SMb.d.ts → bind--9EFVYWF.d.ts} +12 -10
- package/dist/{bind-kk-uyCwH.js → bind-CZzhx-Vj.js} +14 -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-BMnAudHn.js} +4 -3
- package/dist/{canonical-json-CFKyFOke.js → canonical-json-BC8_nMTw.js} +5 -3
- package/dist/{capability-CksyCWDH.d.ts → capability-BSslw1QV.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-tZUyOfOv.js → catalog-BECMPrwc.js} +51 -6
- package/dist/catalog-DjhMYYCq.js +1 -0
- package/dist/catalog-R_A__RsH.js +52 -0
- package/dist/{catalog-doc-DWtg0gGR.js → catalog-doc-C9wjsfNY.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-CIoHNevm.js +87 -0
- package/dist/codemod-Bmj9dWMH.js +37 -0
- package/dist/codemod-Cxvvc70T.js +2084 -0
- package/dist/{collect-2SrB7lfk.js → collect-CrZJJnEF.js} +75 -11
- package/dist/collect-DloHbDVa.js +55 -0
- package/dist/collect-FlXJlhus.js +1 -0
- 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-CcEu2ZQ1.js → compile-CMqMx_IN.js} +11 -8
- package/dist/{compile-CtTP7eur.d.ts → compile-Ckm2HqBZ.d.ts} +5 -3
- package/dist/completion-BqhRBJD8.js +143 -0
- package/dist/config-B46rm9sc.js +26 -0
- package/dist/{config-BIjREpyE.js → config-bs_kZeYq.js} +12 -7
- package/dist/{config-report--Xb9APJS.js → config-report-DUgj62Ai.js} +15 -5
- package/dist/{connection-DUsczpB5.js → connection-DjhIJSs2.js} +6 -5
- package/dist/{context-DieZVJXu.js → context-bbFHR-0D.js} +2 -2
- package/dist/convex/index.d.ts +11 -10
- package/dist/convex/index.js +6 -4
- package/dist/create-0VZ7Pdiu.d.ts +107 -0
- package/dist/create-BDS7wc3y.d.ts +138 -0
- package/dist/create-BFfm17UA.d.ts +110 -0
- package/dist/create-BWRSXgOF.js +403 -0
- package/dist/create-C3b4B5eF.js +130 -0
- package/dist/{create-BBO24vj6.js → create-DnrmLnLW.js} +31 -32
- package/dist/{credential-kue0qpbm.js → credential-DM2um3ha.js} +152 -31
- package/dist/credentials-DPyHmYz5.js +74 -0
- package/dist/delegation-DaXVdDhM.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-D8jDHgsl.d.ts} +5 -5
- package/dist/{describe-C3ldA9os.d.ts → describe-BZUsixiL.d.ts} +2 -2
- package/dist/{describe-Cgkp7eP0.js → describe-BybMRY7A.js} +6 -2
- package/dist/device-BARQ8eYG.js +193 -0
- package/dist/diff-CxZo9pTq.js +37 -0
- package/dist/{diff-rpqoe7Ag.js → diff-DCePiN6M.js} +60 -54
- package/dist/doctor-CxiwSfqH.js +44 -0
- package/dist/{doctor-owlv6ddh.js → doctor-DFjUxf2f.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-OD_4c__H.d.ts → errors-C2PXIv4c.d.ts} +2 -2
- package/dist/errors-CWTY6uih.js +143 -0
- package/dist/evaluate-_R8QkWaf.js +1732 -0
- package/dist/evaluations-16UqqQ6W.d.ts +32 -0
- package/dist/{evaluations-C9YJsv3H.js → evaluations-DZ2CbV5k.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-g0ypLkID.js +120 -0
- package/dist/fetch-adapter-qKJBuRqy.d.ts +31 -0
- package/dist/fields-D9tPVUUS.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-D2lZt4Dd.js} +55 -52
- package/dist/{grantee-CXY-0C87.js → grantee-Cn1HyUsI.js} +3 -3
- package/dist/{grantee-conditions-MQs5NIuX.js → grantee-conditions-CcXf8hMM.js} +4 -3
- package/dist/{grantee-match-fxYp9Nmt.js → grantee-match-DHArqY82.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-DTcZOzhF.js} +45 -38
- package/dist/hono/index.d.ts +12 -9
- package/dist/hono/index.js +13 -12
- package/dist/hosted-BZIAYvon.js +315 -0
- package/dist/hosted-DBDX0M-P.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-DMmOG27O.js} +190 -53
- package/dist/index-BcHcPyIo.d.ts +110 -0
- package/dist/index-CaxrMD1A.d.ts +1 -0
- package/dist/index-Chrs5fQ-.d.ts +210 -0
- package/dist/index-CxGUswIC.d.ts +431 -0
- package/dist/index-D8EovfsP.d.ts +91 -0
- package/dist/{index-UdVQgq48.d.ts → index-DOVf7RJv.d.ts} +431 -81
- package/dist/{index-BwMe94Xq.d.ts → index-SGdIQyzc.d.ts} +34 -16
- 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-Omfd793B.d.ts} +2 -2
- package/dist/instance-snapshot-Cxq4ygFc.js +600 -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-5JatXyND.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-CtKR3GXL.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-TCAdw-eW.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-BShP7Vf4.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-BJdBmYDG.js → openapi-DTaEmTSW.js} +10 -9
- package/dist/openapi-ahr8rHu3.js +138 -0
- package/dist/operation-findings-DgATDpvh.js +36 -0
- package/dist/operations-CxybZErY.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-Dyw8fyPF.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-BatFgAA4.js} +1698 -869
- 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-C-q02Pal.js → parse-local-manifest-CVSs6J9I.js} +1 -1
- package/dist/{parse-local-manifest-DvYUR0QL.d.ts → parse-local-manifest-DgqtruPn.d.ts} +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-B9JxkBwC.js +868 -0
- package/dist/permdock-D7eeLJER.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-CZKiUfFM.js} +4 -3
- package/dist/{permissions-COH-KRgT.d.ts → permissions-oEWfl-kl.d.ts} +1 -2
- package/dist/policies-CO1oOymN.js +295 -0
- package/dist/{policy-ur0BBK_e.d.ts → policy-Czo4n3Hs.d.ts} +2 -2
- package/dist/{hosted-CBHgkzDl.js → policy-DLZJ5gAp.js} +17 -273
- package/dist/policy-from-catalog-DzhEc3Y9.js +450 -0
- package/dist/policy-module-CTlwMvLI.js +89 -0
- package/dist/{policy-types-sp9P1iIV.d.ts → policy-types-DzwivBgR.d.ts} +434 -631
- package/dist/postgrest-CW0IqC-U.js +566 -0
- package/dist/postgrest-NUqZT-RB.d.ts +100 -0
- package/dist/powersync-BHfuehf3.js +62 -0
- package/dist/powersync-CbzkqL_M.js +1 -0
- package/dist/{powersync-cZe4kzhL.js → powersync-bYUDLOAO.js} +23 -24
- 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-DXlt-vks.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-B3_P7xuw.d.ts → protected-DEPHc2xV.d.ts} +16 -8
- package/dist/{protected-BN7BUdY1.js → protected-DfjY5mLA.js} +21 -4
- package/dist/{provider-Bi-0HNL3.js → provider-CC-u3bYP.js} +2 -2
- package/dist/{provider-kwHC9CZD.d.ts → provider-DMVt6yYn.d.ts} +1 -1
- package/dist/{provider-store-Ctt-81Ni.js → provider-store-B5Yrkhzr.js} +2 -2
- package/dist/pull-BgIfno6w.js +256 -0
- package/dist/pull-ByOks_Tg.js +1 -0
- package/dist/push-CmFVBOeI.js +116 -0
- package/dist/pushed-policy-BImMTTIM.d.ts +57 -0
- package/dist/pushed-policy-DobP7AHI.js +238 -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 +24 -22
- 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-D7iKcLFe.d.ts} +1 -1
- package/dist/{replay-BsOyTrdV.js → replay-Du1tJjG7.js} +2 -1
- package/dist/{request-context-BVM7aWNs.js → request-context-BTRTG7OT.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-BA8an5Ap.js +336 -0
- package/dist/{rls-BEktUaqg.js → rls-j6t43t7n.js} +287 -689
- package/dist/{role-builder-B4GbKM-i.js → role-builder-CXbis5-X.js} +14 -207
- package/dist/{rpc-nYC3cR_u.js → rpc-aPyNi6tA.js} +7 -7
- package/dist/run-CNsApDpd.js +1 -0
- package/dist/run-DOfMtc9V.js +723 -0
- package/dist/run-ticket-BjhTOi6u.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-FO-Q8oj0.js} +16 -14
- package/dist/scan-BOI5tJ-6.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-DqCT4CgZ.js +453 -0
- package/dist/{server-types-DdqBwZN_.d.ts → server-types-BLd4MnBX.d.ts} +51 -68
- package/dist/{sha256-BO0swRXL.js → sha256-D9ihqmvd.js} +8 -1
- package/dist/{shared-1uhI-e-b.js → shared-CD11nBbC.js} +18 -8
- package/dist/{shared-JhMeOsDF.js → shared-DvvFzYXe.js} +8 -9
- package/dist/signals-D3NcTKUS.js +32 -0
- package/dist/sink-BEZSlMS_.js +957 -0
- package/dist/sink-Bj_lDUDq.d.ts +225 -0
- package/dist/{skills-BZdRQkxs.js → skills-B6lVdD_W.js} +13 -6
- package/dist/skills-CTYwkl44.js +51 -0
- package/dist/snapshot-CXUWfsNy.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-DqK9eDmM.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-BV9j0DeZ.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-DLfUWFAI.js +1851 -0
- package/dist/ssf/index.d.ts +4 -4
- package/dist/ssf/index.js +384 -47
- package/dist/standard-webhooks-6lg8v_is.d.ts +88 -0
- package/dist/standard-webhooks-DgFFD-Ga.js +228 -0
- package/dist/storage-C2bWdvJH.js +132 -0
- package/dist/{store-ILkLUj_o.js → store-4u_hxjWa.js} +40 -53
- package/dist/{store-options-CbUHDoSe.js → store-options-BqEakYRa.js} +26 -21
- package/dist/{stores-BHXdSbw9.js → stores-BbsD4fAR.js} +2 -2
- package/dist/{stores-Cxz_80g-.d.ts → stores-ClZUgeoP.d.ts} +7 -8
- package/dist/{stream-Dwsg6WwE.d.ts → stream-7-xmnf3U.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-9pqI57pW.js +92 -0
- package/dist/{supabase-C1TWlnYt.js → supabase-Dxlp8A94.js} +98 -205
- package/dist/supabase-hook-CXcGpHqq.js +1 -0
- package/dist/{supabase-hook-Cva3ikXz.js → supabase-hook-DdDQhMlw.js} +951 -60
- 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-7rJVLWe5.d.ts → types-5Ut_pbKy.d.ts} +61 -11
- package/dist/{store-9KO4BlkB.d.ts → types-BNORmDM8.d.ts} +100 -75
- package/dist/types-BjV-fqcA.d.ts +57 -0
- package/dist/{types-CUcFZfpU.d.ts → types-BqAKcRNW.d.ts} +2 -1
- package/dist/types-C8-KNsFf.d.ts +107 -0
- package/dist/{types-Br9IXUBG.d.ts → types-CCpc2Dcv.d.ts} +77 -17
- package/dist/{types-DpWfQdSh.d.ts → types-CZTnPFzM.d.ts} +46 -11
- package/dist/{types-CqrjB9o6.d.ts → types-CdlxsYQh.d.ts} +23 -11
- package/dist/{types-CIlTojhq.d.ts → types-ClZaWzfb.d.ts} +9 -6
- package/dist/types-DX0LaKTb.d.ts +157 -0
- package/dist/types-DiQjupG2.d.ts +332 -0
- package/dist/types-DqzsnlSA.js +67 -0
- package/dist/types-_sHy8BQf.d.ts +65 -0
- package/dist/{types-ByUo56un.d.ts → types-fbZ7JEXr.d.ts} +23 -22
- package/dist/{types-DHrmBJLH.d.ts → types-tIgIeIKJ.d.ts} +7 -7
- package/dist/unplugin/index.d.ts +1 -1
- package/dist/unplugin/index.js +2 -2
- package/dist/usage-CHOtwL19.js +1 -0
- package/dist/usage-DHtE8j4E.js +32 -0
- package/dist/{usage-CG9nOYZw.js → usage-T5mXq98v.js} +54 -11
- package/dist/{validation-error-BSSw0l_8.d.ts → validation-error-Bg5Tpluk.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-DbCL9bnB.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-D6lPdb4Z.d.ts} +65 -2
- package/dist/vue/index.d.ts +9 -10
- package/dist/vue/index.js +8 -8
- package/dist/waiter-BGUtGYoU.js +67 -0
- package/dist/waiter-CKy4MQSY.d.ts +36 -0
- package/dist/watch-Cb-NcaUw.js +1 -0
- package/dist/{watch-zeucB7eF.js → watch-CszoTJMq.js} +44 -5
- package/dist/webmcp/index.d.ts +2 -2
- package/dist/webmcp/index.js +3 -3
- package/dist/where-scope-Dv-WTP-w.js +306 -0
- package/dist/who-can-D0QoYbEb.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-Bd1Tejur.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 +9 -8
- 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 +5 -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/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,600 @@
|
|
|
1
|
+
import { t as compact } from "./compact-CAf557ZB.js";
|
|
2
|
+
import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
|
|
3
|
+
import { a as hasConditionOp } from "./refs-K6eWUJ0H.js";
|
|
4
|
+
import { o as sameId } from "./expiry-D4_YKRKD.js";
|
|
5
|
+
import { a as getResource, c as listPermissions } from "./permission-registry-Br4jSNVi.js";
|
|
6
|
+
import { n as isThenable } from "./thenable-yD7SabqG.js";
|
|
7
|
+
import { u as isPrincipalRelation } from "./resource-relations-D_jw0BFx.js";
|
|
8
|
+
import { p as nowSeconds, s as instantAt } from "./time-DkWjdL98.js";
|
|
9
|
+
import { t as canonicalJson } from "./canonical-json-BC8_nMTw.js";
|
|
10
|
+
import { c as rootScope, d as scopeList, i as keepsPermission, m as tenantOf, o as resolveScope } from "./scopes-CUPSjo9q.js";
|
|
11
|
+
import { a as readOnlyActorRefuses, i as delegatedPermissions, r as coversRequirements } from "./delegation-DaXVdDhM.js";
|
|
12
|
+
import { b as synthesiseRole, m as findRole, o as flattenGrantee, v as listRoles, x as treeXSchema, y as sourceRoleMeta } from "./grantee-Cn1HyUsI.js";
|
|
13
|
+
import { c as nowSeconds$1, d as resolveActiveTenant, l as partitionsOf, p as scopeField, r as isMembershipExpired } from "./tenancy-DN2QAx9z.js";
|
|
14
|
+
import { a as levelCondition, o as levelNames, r as grantList, t as declaredRoleNames } from "./policy-DLZJ5gAp.js";
|
|
15
|
+
import { t as byCodePoint } from "./compare-pfyVnBjE.js";
|
|
16
|
+
import { C as emptyListeners, O as contactMayUse, a as expandRoleNames, b as tenantCustomRoles, h as holdsGlobalCustomRole, l as ceilingGrants, m as holdsCustomRole, n as requirementCondition, p as customRoleScope, t as evaluate, u as customGrantsFor, v as resolveCustomRole, y as roleAllowKeys } from "./evaluate-_R8QkWaf.js";
|
|
17
|
+
import { n as matchGrantee, t as combineWhere } from "./grantee-match-DHArqY82.js";
|
|
18
|
+
import { t as buildSnapshot } from "./snapshot-CXUWfsNy.js";
|
|
19
|
+
//#region src/core/memberships.ts
|
|
20
|
+
/** Two memberships are the same row when everything but `roles` matches. */
|
|
21
|
+
function identity(membership) {
|
|
22
|
+
const within = Object.entries(membership.within ?? {}).toSorted(([a], [b]) => byCodePoint(a, b));
|
|
23
|
+
return JSON.stringify([
|
|
24
|
+
membership.scope ?? null,
|
|
25
|
+
membership.id ?? null,
|
|
26
|
+
within,
|
|
27
|
+
membership.on ?? null,
|
|
28
|
+
membership.tenant ?? null,
|
|
29
|
+
membership.team ?? null,
|
|
30
|
+
membership.via ?? null,
|
|
31
|
+
membership.expiresAt ?? null,
|
|
32
|
+
membership.grantedBy ?? null,
|
|
33
|
+
membership.reason ?? null,
|
|
34
|
+
membership.member?.group ?? null,
|
|
35
|
+
[...membership.eligible ?? []].toSorted(),
|
|
36
|
+
membership.managedBy ?? null,
|
|
37
|
+
[...membership.entitlements ?? []].toSorted(),
|
|
38
|
+
membership.keep === void 0 ? null : [...membership.keep].toSorted()
|
|
39
|
+
]);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Merges memberships from several sources: entries naming the same instance
|
|
43
|
+
* with the same `via`, expiry, owner and seats become one entry with the union
|
|
44
|
+
* of their roles. Entries that differ in any of those stay separate, so a
|
|
45
|
+
* staff role and a contact role in one instance keep their own `via`.
|
|
46
|
+
*/
|
|
47
|
+
function mergeMemberships(lists) {
|
|
48
|
+
const merged = /* @__PURE__ */ new Map();
|
|
49
|
+
for (const list of lists) for (const membership of list) {
|
|
50
|
+
const key = identity(membership);
|
|
51
|
+
const found = merged.get(key);
|
|
52
|
+
merged.set(key, found === void 0 ? membership : {
|
|
53
|
+
...found,
|
|
54
|
+
roles: [.../* @__PURE__ */ new Set([...found.roles, ...membership.roles])]
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
return [...merged.values()];
|
|
58
|
+
}
|
|
59
|
+
function all(values) {
|
|
60
|
+
return values.some((value) => isThenable(value)) ? Promise.all(values) : values;
|
|
61
|
+
}
|
|
62
|
+
function then(value, next) {
|
|
63
|
+
return isThenable(value) ? Promise.resolve(value).then(next) : next(value);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* One `MembershipSource` over several: memberships are merged and
|
|
67
|
+
* de-duplicated, `list` concatenates the sources that can list, and `version`
|
|
68
|
+
* is the highest version any source reports. A source that throws makes the
|
|
69
|
+
* whole lookup throw, which the subject resolver turns into no memberships.
|
|
70
|
+
*/
|
|
71
|
+
function composeMemberships(sources) {
|
|
72
|
+
const listing = sources.filter((source) => source.list !== void 0);
|
|
73
|
+
const versioned = sources.filter((source) => source.version !== void 0);
|
|
74
|
+
return {
|
|
75
|
+
membershipsFor(principal, options) {
|
|
76
|
+
return then(all(sources.map((source) => source.membershipsFor(principal, options))), (lists) => mergeMemberships(lists));
|
|
77
|
+
},
|
|
78
|
+
...listing.length === 0 ? {} : { list(query) {
|
|
79
|
+
return then(all(listing.map((source) => source.list?.(query) ?? [])), (lists) => {
|
|
80
|
+
const seen = /* @__PURE__ */ new Map();
|
|
81
|
+
for (const entry of lists.flat()) {
|
|
82
|
+
const key = `${entry.principal.id}\u0000${identity(entry.membership)}`;
|
|
83
|
+
const found = seen.get(key);
|
|
84
|
+
seen.set(key, found === void 0 ? entry : {
|
|
85
|
+
principal: entry.principal,
|
|
86
|
+
membership: {
|
|
87
|
+
...found.membership,
|
|
88
|
+
roles: [.../* @__PURE__ */ new Set([...found.membership.roles, ...entry.membership.roles])]
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
return [...seen.values()];
|
|
93
|
+
});
|
|
94
|
+
} },
|
|
95
|
+
...versioned.length === 0 ? {} : { version(principal) {
|
|
96
|
+
return then(all(versioned.map((source) => source.version?.(principal))), (versions) => {
|
|
97
|
+
const known = versions.filter((value) => typeof value === "number" && Number.isFinite(value));
|
|
98
|
+
return known.length === 0 ? void 0 : Math.max(...known);
|
|
99
|
+
});
|
|
100
|
+
} }
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
/** A single source, or several composed. */
|
|
104
|
+
function asMembershipSource(input) {
|
|
105
|
+
return Array.isArray(input) ? composeMemberships(input) : input;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Trust the memberships the verified token carries, and read `source` only
|
|
109
|
+
* when the token marks them truncated. With `version`, a token minted before
|
|
110
|
+
* the latest membership change is stale for the policy's `fresh` permissions,
|
|
111
|
+
* or with `onStale: 'reread'` has its memberships read from `source` instead.
|
|
112
|
+
*/
|
|
113
|
+
function claimsFirst(source, options = {}) {
|
|
114
|
+
const inner = asMembershipSource(source);
|
|
115
|
+
const version = options.version ?? (inner.version === void 0 ? void 0 : (principal) => inner.version?.(principal));
|
|
116
|
+
return {
|
|
117
|
+
membershipsFor: (principal, query) => inner.membershipsFor(principal, query),
|
|
118
|
+
...inner.list === void 0 ? {} : { list: (query) => inner.list?.(query) ?? [] },
|
|
119
|
+
...version === void 0 ? {} : { version },
|
|
120
|
+
...options.onStale === "reread" ? { onStale: "reread" } : {},
|
|
121
|
+
claimsFirst: true
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
/** Whether the identity provider owns `membership`: the application must not add, change or remove it. */
|
|
125
|
+
function isExternallyManaged(membership) {
|
|
126
|
+
return membership.managedBy === "idp";
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* How many principals hold `role` in one scope instance now, from the
|
|
130
|
+
* source's member list (`MembershipSource.list`): live memberships of exactly
|
|
131
|
+
* that scope and instance, each principal counted once. The `holders` a
|
|
132
|
+
* `decideRoleChange` with `min`, `max` or `transferOnly` needs. `undefined`
|
|
133
|
+
* when the source cannot list or the read fails, which that check denies.
|
|
134
|
+
*/
|
|
135
|
+
async function countHolders(source, query) {
|
|
136
|
+
const composed = asMembershipSource(source);
|
|
137
|
+
if (composed.list === void 0) return;
|
|
138
|
+
const role = typeof query.role === "string" ? query.role : query.role.key;
|
|
139
|
+
try {
|
|
140
|
+
const entries = await composed.list({
|
|
141
|
+
scope: query.scope,
|
|
142
|
+
id: query.id
|
|
143
|
+
});
|
|
144
|
+
const now = nowSeconds();
|
|
145
|
+
const holders = /* @__PURE__ */ new Set();
|
|
146
|
+
for (const entry of entries) {
|
|
147
|
+
const membership = entry.membership;
|
|
148
|
+
if (membership.scope === query.scope && membership.id === query.id && membership.roles.includes(role) && (membership.expiresAt === void 0 || membership.expiresAt > now)) holders.add(entry.principal.id);
|
|
149
|
+
}
|
|
150
|
+
return holders.size;
|
|
151
|
+
} catch {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
//#endregion
|
|
156
|
+
//#region src/core/role-rank.ts
|
|
157
|
+
function bindingOf(policy, name) {
|
|
158
|
+
return policy.rolesByName.get(name);
|
|
159
|
+
}
|
|
160
|
+
function roleMeta(policy, name) {
|
|
161
|
+
return bindingOf(policy, name)?.meta ?? findRole(policy.vocabulary?.roles, name)?.meta;
|
|
162
|
+
}
|
|
163
|
+
/** A role with `for` is held only through a membership of one of those kinds. */
|
|
164
|
+
function mayHoldVia(policy, role, via) {
|
|
165
|
+
const kinds = bindingOf(policy, role)?.for;
|
|
166
|
+
return kinds === void 0 || via !== void 0 && kinds.includes(via);
|
|
167
|
+
}
|
|
168
|
+
function sameList(a, b) {
|
|
169
|
+
return a.length === b.length && a.every((item, index) => item === b[index]);
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* The identity provider may only hand out what the application could: a
|
|
173
|
+
* declared role with `assignable: false` (an owner, a platform role) never
|
|
174
|
+
* rides in on a `managedBy: 'idp'` membership. A name the policy does not
|
|
175
|
+
* declare stays, because only a tenant's custom role can give it meaning.
|
|
176
|
+
*/
|
|
177
|
+
function mayHoldManaged(policy, role, membership) {
|
|
178
|
+
return !isExternallyManaged(membership) || bindingOf(policy, role)?.assignable !== false;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Drops every role a membership's kind may not hold (fail-closed: a missing
|
|
182
|
+
* `via` is no kind) and every non-assignable role on an identity-provider
|
|
183
|
+
* membership. Global roles have no kind, so a role with `for` held globally
|
|
184
|
+
* is dropped too.
|
|
185
|
+
*/
|
|
186
|
+
function applyRoleKinds(policy, roles, memberships) {
|
|
187
|
+
const kinds = policy.roles.some((binding) => binding.for !== void 0);
|
|
188
|
+
if (!kinds && !memberships.some(isExternallyManaged)) return {
|
|
189
|
+
roles,
|
|
190
|
+
memberships
|
|
191
|
+
};
|
|
192
|
+
return {
|
|
193
|
+
roles: kinds ? roles?.filter((name) => mayHoldVia(policy, name, void 0)) ?? roles : roles,
|
|
194
|
+
memberships: memberships.map((membership) => {
|
|
195
|
+
const allowed = membership.roles.filter((name) => mayHoldVia(policy, name, membership.via) && mayHoldManaged(policy, name, membership));
|
|
196
|
+
return sameList(allowed, membership.roles) ? membership : freezeDeep({
|
|
197
|
+
...membership,
|
|
198
|
+
roles: allowed
|
|
199
|
+
});
|
|
200
|
+
})
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
function usesAssigns(policy) {
|
|
204
|
+
return policy.roles.some((binding) => binding.assigns !== void 0);
|
|
205
|
+
}
|
|
206
|
+
/** Declared role names in declaration order: bindings first, then vocabulary-only leaves. */
|
|
207
|
+
function declarationOrder(policy) {
|
|
208
|
+
const names = policy.roles.map((binding) => binding.name);
|
|
209
|
+
const seen = new Set(names);
|
|
210
|
+
for (const leaf of listRoles(policy.vocabulary?.roles)) if (!seen.has(leaf.key)) {
|
|
211
|
+
names.push(leaf.key);
|
|
212
|
+
seen.add(leaf.key);
|
|
213
|
+
}
|
|
214
|
+
return names;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Each role's depth in the `assigns` graph: a role nobody else assigns is 0,
|
|
218
|
+
* a role another assigns sits one below its deepest assigner. Cycles stop
|
|
219
|
+
* after one pass per role.
|
|
220
|
+
*/
|
|
221
|
+
function assignDepths(policy) {
|
|
222
|
+
const names = declarationOrder(policy);
|
|
223
|
+
const depth = new Map(names.map((name) => [name, 0]));
|
|
224
|
+
for (let pass = 0; pass < names.length; pass += 1) {
|
|
225
|
+
let changed = false;
|
|
226
|
+
for (const binding of policy.roles) {
|
|
227
|
+
const from = depth.get(binding.name) ?? 0;
|
|
228
|
+
for (const target of binding.assigns ?? []) if (target !== binding.name && (depth.get(target) ?? 0) < from + 1) {
|
|
229
|
+
depth.set(target, from + 1);
|
|
230
|
+
changed = true;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
if (!changed) break;
|
|
234
|
+
}
|
|
235
|
+
return depth;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* `names` ordered by rank: assigners before the roles they assign, then
|
|
239
|
+
* declaration order. Without an `assigns` graph the order is kept.
|
|
240
|
+
*/
|
|
241
|
+
function rankRoles(policy, names) {
|
|
242
|
+
if (!usesAssigns(policy)) return names;
|
|
243
|
+
const order = declarationOrder(policy);
|
|
244
|
+
const depth = assignDepths(policy);
|
|
245
|
+
const index = (name) => {
|
|
246
|
+
const found = order.indexOf(name);
|
|
247
|
+
return found === -1 ? order.length : found;
|
|
248
|
+
};
|
|
249
|
+
return [...names].toSorted((a, b) => (depth.get(a) ?? Number.MAX_SAFE_INTEGER) - (depth.get(b) ?? Number.MAX_SAFE_INTEGER) || index(a) - index(b));
|
|
250
|
+
}
|
|
251
|
+
/** The distinct `meta.audience` values of `names`, in rank order. */
|
|
252
|
+
function audiencesOf(policy, names) {
|
|
253
|
+
const out = [];
|
|
254
|
+
for (const name of rankRoles(policy, names)) {
|
|
255
|
+
const audience = roleMeta(policy, name)?.audience;
|
|
256
|
+
if (typeof audience === "string" && !out.includes(audience)) out.push(audience);
|
|
257
|
+
}
|
|
258
|
+
return out;
|
|
259
|
+
}
|
|
260
|
+
/** Whether `membership` is the instance itself or one of its ancestors named in `within`. */
|
|
261
|
+
//#endregion
|
|
262
|
+
//#region src/core/held-roles.ts
|
|
263
|
+
/**
|
|
264
|
+
* Role names held in `tenant` on live memberships, global roles included, in
|
|
265
|
+
* rank order. With `scope`, only the roles of that scope's memberships (and
|
|
266
|
+
* instance `id`).
|
|
267
|
+
*/
|
|
268
|
+
function heldRoleNames(policy, subject, tenant, only, now) {
|
|
269
|
+
if (subject.principal === null) return [];
|
|
270
|
+
const scopes = scopeList(policy.scopes);
|
|
271
|
+
const scope = only?.scope === void 0 ? void 0 : resolveScope(scopes, only.scope);
|
|
272
|
+
if (only?.scope !== void 0 && scope === void 0) return [];
|
|
273
|
+
const names = new Set(scope === void 0 ? subject.principal.roles ?? [] : []);
|
|
274
|
+
for (const membership of subject.principal.memberships ?? []) {
|
|
275
|
+
if (isMembershipExpired(membership, now) || membership.keep !== void 0) continue;
|
|
276
|
+
if (!(scope === void 0 ? tenantOf(membership, scopes) === tenant : membership.scope === scope && (only?.id === void 0 || sameId(membership.id, only.id)))) continue;
|
|
277
|
+
for (const role of membership.roles) names.add(role);
|
|
278
|
+
}
|
|
279
|
+
return rankRoles(policy, [...names]);
|
|
280
|
+
}
|
|
281
|
+
function roleLeaf(policy, name) {
|
|
282
|
+
const binding = policy.rolesByName.get(name);
|
|
283
|
+
return findRole(policy.vocabulary?.roles, name) ?? synthesiseRole(name, compact({
|
|
284
|
+
on: typeof binding?.on === "string" ? binding.on : void 0,
|
|
285
|
+
assignable: binding?.assignable,
|
|
286
|
+
meta: binding?.meta
|
|
287
|
+
}));
|
|
288
|
+
}
|
|
289
|
+
//#endregion
|
|
290
|
+
//#region src/core/snapshot-grants.ts
|
|
291
|
+
/** A grant on a relation with a `period` is decided on the server, where the clock is. */
|
|
292
|
+
function periodBound(policy, grant) {
|
|
293
|
+
const relations = policy.resources.get(grant.permission.resource)?.relations;
|
|
294
|
+
return flattenGrantee(grant.to).some((item) => {
|
|
295
|
+
if (item.kind !== "relation") return false;
|
|
296
|
+
const spec = relations?.[item.relation];
|
|
297
|
+
return isPrincipalRelation(spec) && spec.period !== void 0;
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
function includePrefixes(include) {
|
|
301
|
+
if (include === void 0) return;
|
|
302
|
+
return include.map((item) => {
|
|
303
|
+
if ("key" in item && typeof item.key === "string") return item.key;
|
|
304
|
+
const first = listPermissions(item)[0];
|
|
305
|
+
if (first === void 0) return "";
|
|
306
|
+
const parts = first.key.split(".");
|
|
307
|
+
parts.pop();
|
|
308
|
+
return parts.join(".");
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* The grant with its grantee's row condition. A graph relation needs the
|
|
313
|
+
* `RelationSource`, which snapshots and `where()` do not carry, so the grant
|
|
314
|
+
* becomes server-only (`portable: false`) there.
|
|
315
|
+
*/
|
|
316
|
+
function graphAware(grant, where) {
|
|
317
|
+
const combined = combineWhere(grant.where, where);
|
|
318
|
+
const graph = hasConditionOp(combined, "related");
|
|
319
|
+
const inherits = flattenGrantee(grant.to).some((item) => item.kind === "inherit");
|
|
320
|
+
return freezeDeep(compact({
|
|
321
|
+
...grant,
|
|
322
|
+
where: combined,
|
|
323
|
+
portable: graph ? false : grant.portable,
|
|
324
|
+
graph: graph && grant.portable && !inherits ? true : void 0
|
|
325
|
+
}));
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* `where()` keeps a grant that is server-only because it reads the graph:
|
|
329
|
+
* its `related` nodes compile to subqueries given relation mappings.
|
|
330
|
+
*/
|
|
331
|
+
function whereGrant(grant) {
|
|
332
|
+
return grant.graph === true ? freezeDeep({
|
|
333
|
+
...grant,
|
|
334
|
+
portable: true
|
|
335
|
+
}) : grant;
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Every grant the subject may reach, once per membership that holds all of
|
|
339
|
+
* its scoped roles, so a client can check that membership's tenant, team or
|
|
340
|
+
* resource. A scoped role held only globally reaches nothing.
|
|
341
|
+
*/
|
|
342
|
+
function collectSnapshotGrants(policy, subject, customRoles, now = nowSeconds$1(), customGrants = customGrantsFor(policy, customRoles), mode = "held") {
|
|
343
|
+
const skip = (grant, match) => mode === "held" ? !match.matched : match.matched || match.reason !== "not-entitled" || grant.effect !== "allow";
|
|
344
|
+
const scopes = scopeList(policy.scopes);
|
|
345
|
+
const declared = declaredRoleNames(policy);
|
|
346
|
+
const global = expandRoleNames(subject.principal?.roles ?? [], declared, customRoles, subject.principal?.tenant);
|
|
347
|
+
const held = (subject.principal?.memberships ?? []).map((membership) => ({
|
|
348
|
+
membership,
|
|
349
|
+
roles: new Set(expandRoleNames(membership.roles, declared, customRoles, tenantOf(membership, scopes)).roles)
|
|
350
|
+
}));
|
|
351
|
+
const holds = (entry, item) => entry.roles.has(item.role) && (typeof item.scope === "string" ? entry.membership.scope === item.scope : entry.membership.on !== void 0);
|
|
352
|
+
const requirementOf = (grant, resource) => grant.requires === void 0 || grant.effect !== "allow" ? void 0 : requirementCondition(policy, subject, grant.requires, resource, now, customRoles, customGrants);
|
|
353
|
+
const out = [];
|
|
354
|
+
for (const grant of grantList(policy)) {
|
|
355
|
+
if (!contactMayUse(policy, subject, grant)) continue;
|
|
356
|
+
if (mode === "held" && !coversRequirements(policy.permissions, grant.requires, subject.delegation)) continue;
|
|
357
|
+
const resource = getResource(policy.permissions, grant.permission.resource);
|
|
358
|
+
const match = matchGrantee(grant.to, subject, now, resource, scopes, policy.resources);
|
|
359
|
+
if (skip(grant, match)) continue;
|
|
360
|
+
const roleItems = flattenGrantee(grant.to).filter((item) => item.kind === "role");
|
|
361
|
+
if (roleItems.length > 0 && subject.principal === null) continue;
|
|
362
|
+
if (!roleItems.every((item) => item.scope !== "global" || global.roles.includes(item.role))) continue;
|
|
363
|
+
const merged = graphAware(grant, combineWhere(match.where, requirementOf(grant, resource)));
|
|
364
|
+
const scoped = roleItems.filter((item) => item.scope !== "global");
|
|
365
|
+
if (scoped.length === 0) {
|
|
366
|
+
out.push({ grant: merged });
|
|
367
|
+
continue;
|
|
368
|
+
}
|
|
369
|
+
for (const entry of held) if (keepsPermission(entry.membership, grant.permission.key) && scoped.every((item) => item.kind === "role" && holds(entry, item))) out.push({
|
|
370
|
+
grant: merged,
|
|
371
|
+
membership: entry.membership
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
for (const { grant, role } of customGrants) {
|
|
375
|
+
if (!contactMayUse(policy, subject, grant)) continue;
|
|
376
|
+
const globalHeld = holdsGlobalCustomRole(subject.principal?.roles, role);
|
|
377
|
+
const holders = held.filter((entry) => keepsPermission(entry.membership, grant.permission.key) && holdsCustomRole(entry.membership, role, scopes));
|
|
378
|
+
if (holders.length === 0 && !globalHeld) continue;
|
|
379
|
+
const resource = getResource(policy.permissions, grant.permission.resource);
|
|
380
|
+
const match = matchGrantee(grant.to, subject, now, resource, scopes, policy.resources);
|
|
381
|
+
if (skip(grant, match)) continue;
|
|
382
|
+
const merged = graphAware(grant, combineWhere(match.where, requirementOf(grant, resource)));
|
|
383
|
+
if (globalHeld) out.push({ grant: merged });
|
|
384
|
+
for (const entry of holders) out.push({
|
|
385
|
+
grant: merged,
|
|
386
|
+
membership: entry.membership
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
const fresh = policy.fresh ?? [];
|
|
390
|
+
if (mode === "held" && subject.stale === true && fresh.length > 0) return out.filter(({ grant }) => grant.effect === "deny" || !fresh.includes(grant.permission.key));
|
|
391
|
+
return out;
|
|
392
|
+
}
|
|
393
|
+
//#endregion
|
|
394
|
+
//#region src/core/assignable.ts
|
|
395
|
+
/**
|
|
396
|
+
* Declared roles a tenant admin may hand out or compose, before any
|
|
397
|
+
* intersection: `assignable` roles, plus every role some `assigns` lists.
|
|
398
|
+
*/
|
|
399
|
+
function assignableCandidates(policy) {
|
|
400
|
+
const listed = new Set(policy.roles.flatMap((binding) => binding.assigns ?? []));
|
|
401
|
+
const names = [...listRoles(policy.vocabulary?.roles).filter((leaf) => leaf.assignable || listed.has(leaf.key)).map((leaf) => leaf.key), ...policy.roles.filter((binding) => binding.assignable || listed.has(binding.name)).map((binding) => binding.name)];
|
|
402
|
+
return rankRoles(policy, [...new Set(names)]).map((name) => roleLeaf(policy, name));
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* The levels a held allow of a permission covers: its own `level`, every
|
|
406
|
+
* level when it has no row condition, or the levels whose condition equals
|
|
407
|
+
* its condition.
|
|
408
|
+
*/
|
|
409
|
+
function heldLevels(policy, grant, names) {
|
|
410
|
+
if (grant.level !== void 0) return [grant.level];
|
|
411
|
+
if (grant.where === void 0) return names;
|
|
412
|
+
const held = canonicalJson(grant.where);
|
|
413
|
+
return names.filter((name) => {
|
|
414
|
+
const condition = levelCondition(policy, grant.permission.resource, name);
|
|
415
|
+
return condition !== void 0 && canonicalJson(condition) === held;
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* What the subject may hand out in `tenant`: declared assignable roles and the
|
|
420
|
+
* tenant custom-role ceiling, narrowed by `allowed` (`CustomRoleSource.assignable`),
|
|
421
|
+
* then intersected with the permissions the subject holds there. Holding a
|
|
422
|
+
* role or a granted permission with `meta.manageRoles` lifts the intersection.
|
|
423
|
+
*/
|
|
424
|
+
function assignableIn(policy, subject, customRoles, customGrants, tenant, allowed, now = nowSeconds$1(), global = false) {
|
|
425
|
+
const principal = subject.principal;
|
|
426
|
+
if (principal === null) return {
|
|
427
|
+
roles: [],
|
|
428
|
+
permissions: [],
|
|
429
|
+
levels: {},
|
|
430
|
+
manage: false,
|
|
431
|
+
inert: []
|
|
432
|
+
};
|
|
433
|
+
const scopes = scopeList(policy.scopes);
|
|
434
|
+
const scoped = tenant === void 0 ? subject : freezeDeep(compact({
|
|
435
|
+
...subject,
|
|
436
|
+
principal: compact({
|
|
437
|
+
...principal,
|
|
438
|
+
tenant: resolveActiveTenant(principal, tenant, scopes, now)
|
|
439
|
+
})
|
|
440
|
+
}));
|
|
441
|
+
const heldGrants = collectSnapshotGrants(policy, scoped, customRoles, now, customGrants).filter((item) => item.grant.effect === "allow" && (item.membership === void 0 || !global && tenantOf(item.membership, scopes) === tenant && !isMembershipExpired(item.membership, now))).map((item) => item.grant);
|
|
442
|
+
const heldKeys = new Set(heldGrants.map((grant) => grant.permission.key));
|
|
443
|
+
const heldNames = heldRoleNames(policy, subject, tenant, void 0, now);
|
|
444
|
+
const quiet = {
|
|
445
|
+
emit: false,
|
|
446
|
+
simulated: true,
|
|
447
|
+
skipAlternatives: true,
|
|
448
|
+
customRoles,
|
|
449
|
+
customGrants,
|
|
450
|
+
listeners: emptyListeners(),
|
|
451
|
+
sink: void 0,
|
|
452
|
+
limits: void 0,
|
|
453
|
+
limitCache: /* @__PURE__ */ new Map(),
|
|
454
|
+
team: void 0
|
|
455
|
+
};
|
|
456
|
+
const manage = heldNames.some((name) => roleMeta(policy, name)?.manageRoles === true) || listPermissions(policy.permissions).some((leaf) => leaf.meta.manageRoles === true && evaluate(policy, scoped, leaf, void 0, {
|
|
457
|
+
call: "simulate",
|
|
458
|
+
trusted: true,
|
|
459
|
+
now: instantAt(now)
|
|
460
|
+
}, quiet).outcome === "granted");
|
|
461
|
+
const narrowed = allowed === void 0 ? void 0 : new Set(allowed);
|
|
462
|
+
const candidates = assignableCandidates(policy).filter((leaf) => narrowed === void 0 || narrowed.has(leaf.key));
|
|
463
|
+
const held = new Set(heldNames);
|
|
464
|
+
const listed = usesAssigns(policy) ? new Set(heldNames.flatMap((name) => policy.rolesByName.get(name)?.assigns ?? [])) : void 0;
|
|
465
|
+
const roles = manage ? candidates : candidates.filter((leaf) => {
|
|
466
|
+
if (listed !== void 0) return listed.has(leaf.key);
|
|
467
|
+
if (held.has(leaf.key)) return true;
|
|
468
|
+
const keys = [...roleAllowKeys(policy, leaf.key)];
|
|
469
|
+
return keys.length > 0 && keys.every((key) => heldKeys.has(key));
|
|
470
|
+
});
|
|
471
|
+
const root = global ? "global" : rootScope(scopes);
|
|
472
|
+
const ceiling = new Set((root === void 0 ? [] : ceilingGrants(policy, root, allowed)).map((grant) => grant.permission.key));
|
|
473
|
+
const permissions = listPermissions(policy.permissions).filter((leaf) => ceiling.has(leaf.key) && (manage || heldKeys.has(leaf.key)));
|
|
474
|
+
const offeredLevels = (key, names) => {
|
|
475
|
+
if (manage) return names;
|
|
476
|
+
const reached = new Set(heldGrants.filter((grant) => grant.permission.key === key).flatMap((grant) => heldLevels(policy, grant, names)));
|
|
477
|
+
return names.filter((name) => reached.has(name));
|
|
478
|
+
};
|
|
479
|
+
const levels = {};
|
|
480
|
+
for (const leaf of permissions) {
|
|
481
|
+
const names = leaf.kind === "instance" ? levelNames(policy, leaf.resource) : [];
|
|
482
|
+
if (names.length > 0) levels[leaf.key] = offeredLevels(leaf.key, names);
|
|
483
|
+
}
|
|
484
|
+
const ceilingKeys = /* @__PURE__ */ new Map();
|
|
485
|
+
const mayHandOut = (scope, grant) => {
|
|
486
|
+
const key = grant.permission.key;
|
|
487
|
+
let keys = ceilingKeys.get(scope);
|
|
488
|
+
if (keys === void 0) {
|
|
489
|
+
keys = new Set(ceilingGrants(policy, scope, allowed).map((item) => item.permission.key));
|
|
490
|
+
ceilingKeys.set(scope, keys);
|
|
491
|
+
}
|
|
492
|
+
if (!keys.has(key) || !(manage || heldKeys.has(key))) return false;
|
|
493
|
+
const names = grant.permission.kind === "instance" ? levelNames(policy, grant.permission.resource) : [];
|
|
494
|
+
if (names.length === 0) return true;
|
|
495
|
+
const offered = offeredLevels(key, names);
|
|
496
|
+
return heldLevels(policy, grant, names).every((name) => offered.includes(name));
|
|
497
|
+
};
|
|
498
|
+
const custom = global || tenant === void 0 ? {
|
|
499
|
+
roles: [],
|
|
500
|
+
inert: []
|
|
501
|
+
} : assignableCustomRoles(policy, customRoles, tenant, manage ? void 0 : roles, mayHandOut);
|
|
502
|
+
return {
|
|
503
|
+
roles: [...roles, ...custom.roles],
|
|
504
|
+
permissions,
|
|
505
|
+
levels,
|
|
506
|
+
manage,
|
|
507
|
+
inert: custom.inert
|
|
508
|
+
};
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* The tenant's custom roles the subject may hand out: held at a scope it may
|
|
512
|
+
* assign declared roles at (any scope with `meta.manageRoles`), allowing at
|
|
513
|
+
* least one permission after the ceiling, and only permissions and levels it
|
|
514
|
+
* may hand out at that scope. A role that allows nothing is `inert`.
|
|
515
|
+
*/
|
|
516
|
+
function assignableCustomRoles(policy, customRoles, tenant, declared, mayHandOut) {
|
|
517
|
+
const scopes = scopeList(policy.scopes);
|
|
518
|
+
const root = rootScope(scopes);
|
|
519
|
+
const assignsAt = declared === void 0 ? void 0 : new Set(declared.map((leaf) => leaf.on === void 0 ? root : resolveScope(scopes, leaf.on)));
|
|
520
|
+
const out = /* @__PURE__ */ new Map();
|
|
521
|
+
const inert = /* @__PURE__ */ new Set();
|
|
522
|
+
for (const role of tenantCustomRoles(policy, customRoles)) {
|
|
523
|
+
if (role.tenant !== tenant || out.has(role.name)) continue;
|
|
524
|
+
const at = customRoleScope(role, scopes);
|
|
525
|
+
if (at === void 0 || assignsAt !== void 0 && !assignsAt.has(at)) continue;
|
|
526
|
+
const { grants } = resolveCustomRole(policy, role);
|
|
527
|
+
if (!grants.some((grant) => grant.effect === "allow")) {
|
|
528
|
+
inert.add(role.name);
|
|
529
|
+
continue;
|
|
530
|
+
}
|
|
531
|
+
if (grants.every((grant) => grant.effect === "deny" || mayHandOut(at, grant))) out.set(role.name, synthesiseRole(role.name, compact({
|
|
532
|
+
on: at,
|
|
533
|
+
assignable: true,
|
|
534
|
+
meta: sourceRoleMeta(role.meta, treeXSchema(policy.vocabulary?.roles))
|
|
535
|
+
})));
|
|
536
|
+
}
|
|
537
|
+
return {
|
|
538
|
+
roles: [...out.values()].toSorted((a, b) => byCodePoint(a.key, b.key)),
|
|
539
|
+
inert: [...inert].filter((name) => !out.has(name)).toSorted()
|
|
540
|
+
};
|
|
541
|
+
}
|
|
542
|
+
//#endregion
|
|
543
|
+
//#region src/core/instance-snapshot.ts
|
|
544
|
+
/** The one path from a resolved subject to a `Snapshot`; pure apart from the default clock. */
|
|
545
|
+
function snapshotOf(policy, subject, options) {
|
|
546
|
+
const now = options.now ?? nowSeconds$1();
|
|
547
|
+
const customGrants = options.customGrants ?? customGrantsFor(policy, options.customRoles);
|
|
548
|
+
const roles = heldRoleNames(policy, subject, subject.principal?.tenant, void 0, now);
|
|
549
|
+
const audiences = audiencesOf(policy, roles);
|
|
550
|
+
const delegated = delegatedPermissions(policy.delegations, subject, new Set(roles), now);
|
|
551
|
+
return buildSnapshot(compact({
|
|
552
|
+
subject,
|
|
553
|
+
roles,
|
|
554
|
+
audiences: audiences.length === 0 ? void 0 : audiences,
|
|
555
|
+
notEntitled: collectSnapshotGrants(policy, subject, options.customRoles, now, customGrants, "not-entitled"),
|
|
556
|
+
grants: collectSnapshotGrants(policy, subject, options.customRoles, now, customGrants).filter((item) => delegated !== void 0 || item.grant.effect === "deny" || !readOnlyActorRefuses(subject.actor, item.grant.permission)).map((item) => periodBound(policy, item.grant) ? Object.assign({}, item, { grant: freezeDeep({
|
|
557
|
+
...item.grant,
|
|
558
|
+
portable: false
|
|
559
|
+
}) }) : item),
|
|
560
|
+
include: includePrefixes(options.include),
|
|
561
|
+
tenants: options.tenants,
|
|
562
|
+
simulated: options.simulated,
|
|
563
|
+
now: Math.floor(now),
|
|
564
|
+
vocabulary: policy.vocabulary,
|
|
565
|
+
scopes: snapshotScopes(policy),
|
|
566
|
+
idOf: (name) => getResource(policy.permissions, name)?.id,
|
|
567
|
+
delegated,
|
|
568
|
+
assignable: (tenant) => {
|
|
569
|
+
const found = assignableIn(policy, subject, options.customRoles, customGrants, tenant, options.assignable?.get(tenant), now);
|
|
570
|
+
return compact({
|
|
571
|
+
tenant,
|
|
572
|
+
roles: found.roles.map((leaf) => leaf.key),
|
|
573
|
+
permissions: found.permissions,
|
|
574
|
+
levels: Object.keys(found.levels).length === 0 ? void 0 : found.levels
|
|
575
|
+
});
|
|
576
|
+
}
|
|
577
|
+
}));
|
|
578
|
+
}
|
|
579
|
+
/** The policy's scopes as snapshots and `permdock cloud push` carry them, with the resources each partitions. */
|
|
580
|
+
function snapshotScopes(policy) {
|
|
581
|
+
if (policy.scopes.length === 0) return;
|
|
582
|
+
const resources = [...policy.resources.values()];
|
|
583
|
+
return policy.scopes.map((scope) => {
|
|
584
|
+
const nodes = resources.filter((node) => partitionsOf(node, policy.scopes).includes(scope.name));
|
|
585
|
+
const partitioned = nodes.map((node) => node.name);
|
|
586
|
+
const fields = Object.fromEntries(nodes.flatMap((node) => {
|
|
587
|
+
const field = scopeField(node, scope.name, policy.scopes);
|
|
588
|
+
return field === void 0 || field === scope.key ? [] : [[node.name, field]];
|
|
589
|
+
}));
|
|
590
|
+
return compact({
|
|
591
|
+
name: scope.name,
|
|
592
|
+
key: scope.key ?? "",
|
|
593
|
+
within: scope.within,
|
|
594
|
+
resources: partitioned.length === 0 ? void 0 : partitioned,
|
|
595
|
+
fields: Object.keys(fields).length === 0 ? void 0 : fields
|
|
596
|
+
});
|
|
597
|
+
});
|
|
598
|
+
}
|
|
599
|
+
//#endregion
|
|
600
|
+
export { isExternallyManaged as _, whereGrant as a, applyRoleKinds as c, rankRoles as d, usesAssigns as f, countHolders as g, composeMemberships as h, collectSnapshotGrants as i, audiencesOf as l, claimsFirst as m, snapshotScopes as n, heldRoleNames as o, asMembershipSource as p, assignableIn as r, roleLeaf as s, snapshotOf as t, bindingOf as u };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//#region src/conditions/instant.ts
|
|
2
|
+
const ISO_INSTANT = /^(\d{4}-\d{2}-\d{2})(?:[T ](\d{2}:\d{2}(?::\d{2}(?:\.\d{1,9})?)?)(Z|[+-]\d{2}(?::?\d{2})?)?)?$/u;
|
|
3
|
+
/**
|
|
4
|
+
* Milliseconds since the epoch for an ISO 8601 date or date-time, or
|
|
5
|
+
* `undefined`. A date-time without a zone and a bare date are UTC, the same
|
|
6
|
+
* in memory, in the ORM compilers and in generated SQL.
|
|
7
|
+
*/
|
|
8
|
+
function isoInstant(value) {
|
|
9
|
+
const match = ISO_INSTANT.exec(value);
|
|
10
|
+
if (match === null) return;
|
|
11
|
+
const [, day, time, zone] = match;
|
|
12
|
+
let offset = zone ?? (time === void 0 ? "" : "Z");
|
|
13
|
+
if (/^[+-]\d{2}$/u.test(offset)) offset = `${offset}:00`;
|
|
14
|
+
else if (/^[+-]\d{4}$/u.test(offset)) offset = `${offset.slice(0, 3)}:${offset.slice(3)}`;
|
|
15
|
+
const parsed = Date.parse(time === void 0 ? `${day}` : `${day}T${time}${offset}`);
|
|
16
|
+
return Number.isNaN(parsed) ? void 0 : parsed;
|
|
17
|
+
}
|
|
18
|
+
//#endregion
|
|
19
|
+
export { isoInstant as t };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
//#region src/core/internals.ts
|
|
2
|
+
const INTERNALS = Symbol.for("permdock.internals");
|
|
3
|
+
/** Attaches `internals` to `instance` as a non-enumerable member; call before freezing. */
|
|
4
|
+
function attachInternals(instance, internals) {
|
|
5
|
+
Object.defineProperty(instance, INTERNALS, { value: internals });
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* The internals of a server instance, or `undefined` for an instance built
|
|
9
|
+
* from a snapshot or one that is not PermDock's. A feature function treats
|
|
10
|
+
* `undefined` as a check it cannot answer and denies with `unsupported`.
|
|
11
|
+
*/
|
|
12
|
+
function internalsOf(permdock) {
|
|
13
|
+
const value = Reflect.get(permdock, INTERNALS);
|
|
14
|
+
return value === void 0 ? void 0 : value;
|
|
15
|
+
}
|
|
16
|
+
//#endregion
|
|
17
|
+
export { internalsOf as n, attachInternals as t };
|