permdock 0.3.1 → 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/{openapi-schema--ARjyfQr.js → 2020-C9VN-x8c.js} +5 -132
- package/dist/a2a/index.d.ts +8 -6
- package/dist/a2a/index.js +21 -31
- 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 -23
- package/dist/ai-sdk/index.js +38 -21
- package/dist/app-data-MuyzVqX8.js +60 -0
- 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/{approvers-DT4AVyIg.js → approvers-CqPOLD-o.js} +1 -1
- package/dist/arazzo-B6lebmiQ.js +36 -0
- package/dist/{arazzo-BAgw9ap6.js → arazzo-BWhNF-k0.js} +24 -17
- 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 +228 -75
- 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 +11 -23
- package/dist/better-supabase/index.d.ts +438 -86
- package/dist/better-supabase/index.js +1027 -184
- package/dist/bind--9EFVYWF.d.ts +38 -0
- package/dist/{bind-CuzGytRf.js → bind-CZzhx-Vj.js} +22 -10
- package/dist/body-CH5of8Ne.js +10 -0
- package/dist/body-text-QcXok_SI.js +52 -0
- package/dist/build-instance-BMnAudHn.js +52 -0
- package/dist/{canonical-json-DemiK4Vp.js → canonical-json-BC8_nMTw.js} +6 -6
- package/dist/{capability-2kYTMWDv.d.ts → capability-BSslw1QV.d.ts} +44 -25
- package/dist/{capability-4qPdO9gk.js → capability-N1K9IpqS.js} +69 -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-BECMPrwc.js +100 -0
- package/dist/catalog-DjhMYYCq.js +1 -0
- package/dist/catalog-R_A__RsH.js +52 -0
- package/dist/{catalog-doc-DdGm82XT.js → catalog-doc-C9wjsfNY.js} +54 -25
- 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 +26 -30
- package/dist/clerk/index.d.ts +9 -8
- package/dist/clerk/index.js +15 -45
- package/dist/cli/bin.js +36 -17
- package/dist/cli/index.d.ts +20 -6
- package/dist/cli/index.js +164 -4
- package/dist/cloud/index.d.ts +102 -63
- package/dist/cloud/index.js +240 -347
- package/dist/cloud-CIoHNevm.js +87 -0
- package/dist/codemod-Bmj9dWMH.js +37 -0
- package/dist/codemod-Cxvvc70T.js +2084 -0
- package/dist/{collect-DSTE3ml9.js → collect-CrZJJnEF.js} +79 -17
- package/dist/collect-DloHbDVa.js +55 -0
- package/dist/collect-FlXJlhus.js +1 -0
- package/dist/command-L8EstFNm.js +6 -0
- package/dist/{compact-y6vfu2_f.js → compact-CAf557ZB.js} +11 -1
- package/dist/compile/index.d.ts +1 -1
- package/dist/compile/index.js +1 -2
- package/dist/{compile-Ba4blROR.js → compile-CMqMx_IN.js} +13 -9
- package/dist/{compile-BkRyBDBw.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-BJiM-xAm.js → config-bs_kZeYq.js} +15 -10
- package/dist/{config-report-CdCgbRnV.js → config-report-DUgj62Ai.js} +17 -8
- package/dist/{connection-CU8MQxRi.js → connection-DjhIJSs2.js} +8 -6
- package/dist/constants-DcJABbLW.js +20 -0
- package/dist/{context-Bcy85rGi.js → context-bbFHR-0D.js} +16 -5
- package/dist/convex/index.d.ts +11 -10
- package/dist/convex/index.js +18 -18
- 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-DnrmLnLW.js +323 -0
- package/dist/{credential-8P81ff4u.js → credential-DM2um3ha.js} +153 -32
- package/dist/credentials-DPyHmYz5.js +74 -0
- package/dist/deciding-columns-Sq12mEA6.js +123 -0
- package/dist/delegation-DaXVdDhM.js +286 -0
- package/dist/delegation-input-FTxMK3ji.js +19 -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-D8jDHgsl.d.ts +19 -0
- package/dist/{describe-DMYiCjJV.d.ts → describe-BZUsixiL.d.ts} +11 -2
- package/dist/{describe-B_gVZEVi.js → describe-BybMRY7A.js} +10 -5
- package/dist/device-BARQ8eYG.js +193 -0
- package/dist/diff-CxZo9pTq.js +37 -0
- package/dist/{diff-2VaeChzX.js → diff-DCePiN6M.js} +61 -55
- package/dist/doctor-CxiwSfqH.js +44 -0
- package/dist/doctor-DFjUxf2f.js +2361 -0
- package/dist/drizzle/index.d.ts +5 -3
- package/dist/drizzle/index.js +6 -14
- package/dist/elysia/index.d.ts +16 -13
- package/dist/elysia/index.js +14 -13
- package/dist/env-DJZrPjRi.js +8 -0
- package/dist/errors-BDUwg2qC.js +27 -0
- package/dist/{errors-Cz5zn0mW.js → errors-BKy0EfhN.js} +6 -10
- package/dist/errors-BWXBMaKK.d.ts +11 -0
- package/dist/{errors-DPdqI50v.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-tz6D9A2G.js → evaluations-DZ2CbV5k.js} +181 -32
- package/dist/eve/index.d.ts +12 -16
- package/dist/eve/index.js +23 -29
- 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 +14 -12
- package/dist/fastify/index.d.ts +26 -13
- package/dist/fastify/index.js +17 -36
- 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/{files-DWUN9PzI.js → files-D_JIzUrP.js} +12 -3
- package/dist/{fixtures-ht28Cplr.js → fixtures-B7XrLeY7.js} +12 -12
- package/dist/flags-C3DktBDY.js +86 -0
- package/dist/{from-snapshot-CTLijvdm.js → from-snapshot-D2lZt4Dd.js} +78 -65
- package/dist/{generate-CH7ThJ14.js → generate-CNU1pIOo.js} +1 -3
- package/dist/grantee-Cn1HyUsI.js +254 -0
- package/dist/grantee-conditions-CcXf8hMM.js +271 -0
- package/dist/grantee-match-DHArqY82.js +142 -0
- 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-H_KARDVC.js → helpers-DTcZOzhF.js} +47 -39
- package/dist/hono/index.d.ts +12 -9
- package/dist/hono/index.js +14 -13
- package/dist/{hosted-DJQw46hn.js → hosted-BZIAYvon.js} +64 -15
- package/dist/hosted-DBDX0M-P.d.ts +78 -0
- package/dist/{http-SO7qGttf.js → http-BBoKefeS.js} +35 -2
- package/dist/{http-DPuDaChb.d.ts → http-B_LphE5Y.d.ts} +1 -2
- package/dist/http-DXJ37RDA.js +46 -0
- package/dist/{http-BIhmLfCc.js → http-ujKm0JXE.js} +3 -26
- package/dist/{openapi-import-cmwetbzw.js → import-CNV7I2Dw.js} +30 -26
- package/dist/{rls-import-4lLW_pbb.js → import-DMmOG27O.js} +271 -128
- 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-DOVf7RJv.d.ts +900 -0
- package/dist/{index-C8z4RjQV.d.ts → index-SGdIQyzc.d.ts} +34 -16
- package/dist/index.d.ts +20 -14
- package/dist/index.js +33 -23
- package/dist/init-DeMYsnYJ.js +96 -0
- package/dist/init-GG6Jh8HD.js +95 -0
- package/dist/{instance-options-jARdwfPN.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-BsAflUGW.js → json-schema-B-vAwlde.js} +46 -9
- package/dist/json-schema-CN_iLFH2.d.ts +40 -0
- package/dist/jwt/index.d.ts +18 -11
- package/dist/jwt/index.js +166 -145
- package/dist/{kernel-_RRHmnMY.js → kernel-5JatXyND.js} +120 -43
- package/dist/kysely/index.d.ts +5 -3
- package/dist/kysely/index.js +6 -14
- package/dist/{live-options-H2eG8dfJ.js → live-options-BaAFCIiu.js} +16 -3
- package/dist/load-BxEtwlBS.js +1 -0
- package/dist/{load-DhWEB9P1.js → load-DFS_ry0W.js} +31 -7
- 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-Z4QZOiFF.js → map-claims-D3oRmTk0.js} +19 -25
- package/dist/{map-error-pgUWNNtG.js → map-error-TCAdw-eW.js} +5 -5
- package/dist/{markers-B0hYLvMD.js → markers-C6joDI3o.js} +8 -3
- package/dist/mcp/index.d.ts +36 -9
- package/dist/mcp/index.js +476 -448
- package/dist/{rls-migrate-CN4TlJTO.js → migrate-BShP7Vf4.js} +119 -20
- package/dist/nest/index.d.ts +12 -9
- package/dist/nest/index.js +20 -20
- package/dist/next/index.d.ts +40 -20
- package/dist/next/index.js +37 -39
- 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-BFp-PZZA.js +126 -0
- package/dist/openai/index.d.ts +9 -16
- package/dist/openai/index.js +18 -25
- package/dist/openapi/index.d.ts +3 -3
- package/dist/openapi/index.js +1 -1
- package/dist/{openapi-BqRBvAng.js → openapi-B7HZ0f-r.js} +9 -12
- package/dist/{openapi-CqqEbHsL.js → openapi-DTaEmTSW.js} +23 -26
- 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 +23 -20
- package/dist/otel/index.d.ts +3 -2
- package/dist/otel/index.js +53 -27
- package/dist/output-Dyw8fyPF.js +88 -0
- package/dist/output-files-B3IZJksC.js +1 -0
- package/dist/output-files-DhRBBE4n.js +138 -0
- package/dist/{rls-fields-CZOMlwHl.js → ownership-BatFgAA4.js} +2393 -2349
- package/dist/{package-root-zGkxO3oN.js → package-root-Dk_ETdkp.js} +4 -3
- package/dist/{parse-BuyjxhZV.js → parse-Cxq0WxrA.js} +3 -3
- package/dist/{parse-local-manifest-BrMozJCo.js → parse-local-manifest-CVSs6J9I.js} +2 -4
- package/dist/{parse-local-manifest-JLnaBH0S.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 +47 -29
- 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-Br4jSNVi.js +385 -0
- package/dist/permissions-B-wCP5ZC.js +30 -0
- package/dist/{permissions-RJrovw98.js → permissions-CZKiUfFM.js} +4 -3
- package/dist/{permissions-CDgvKG5L.d.ts → permissions-oEWfl-kl.d.ts} +1 -2
- package/dist/policies-CO1oOymN.js +295 -0
- package/dist/{policy-D2W7uv19.d.ts → policy-Czo4n3Hs.d.ts} +2 -2
- package/dist/policy-DLZJ5gAp.js +399 -0
- package/dist/policy-from-catalog-DzhEc3Y9.js +450 -0
- package/dist/policy-module-CTlwMvLI.js +89 -0
- package/dist/{policy-IB6yxpC3.d.ts → policy-types-DzwivBgR.d.ts} +939 -1057
- 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-Dv1_aWF7.js → powersync-bYUDLOAO.js} +30 -32
- 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 +6 -12
- package/dist/{problem-B43ztKIm.js → problem-CTviyH5L.js} +18 -27
- package/dist/{problem-details-DX075l9V.d.ts → problem-details-DXlt-vks.d.ts} +1 -1
- package/dist/{problem-details-_AMOYz-w.js → problem-details-cn5X30gZ.js} +45 -42
- package/dist/problem-types-CJ2325SZ.js +5 -0
- package/dist/{prompt-CXYhLfsS.js → prompt-DfZLJLIn.js} +2 -2
- package/dist/protected-DEPHc2xV.d.ts +38 -0
- package/dist/{protected-utU-SLuy.js → protected-DfjY5mLA.js} +37 -8
- package/dist/{provider-CSQd7m92.js → provider-CC-u3bYP.js} +23 -10
- package/dist/{provider-DZY281jO.d.ts → provider-DMVt6yYn.d.ts} +1 -1
- package/dist/{provider-store-Cfbvo4DE.js → provider-store-B5Yrkhzr.js} +6 -3
- 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 -63
- package/dist/react-native/index.js +45 -27
- package/dist/{refs-KYb4ntaz.js → refs-K6eWUJ0H.js} +1 -1
- package/dist/relation-walk-3OyDBF0S.js +186 -0
- package/dist/relations-BnCWnJGI.js +163 -0
- package/dist/renames-CGj7YwcQ.js +175 -0
- package/dist/{replay-CYyiLiwO.d.ts → replay-D7iKcLFe.d.ts} +1 -1
- package/dist/{replay-BsOyTrdV.js → replay-Du1tJjG7.js} +2 -1
- package/dist/request-context-BTRTG7OT.js +71 -0
- package/dist/request-context-C2_1lchh.d.ts +5 -0
- 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-D_jw0BFx.js +243 -0
- package/dist/retire-CALjIQ7e.js +240 -0
- package/dist/{revocations-Cy06JNx2.d.ts → revocations-R07lFBnX.d.ts} +2 -0
- package/dist/rls-BA8an5Ap.js +336 -0
- package/dist/{rls-DiinlRML.js → rls-j6t43t7n.js} +1066 -1068
- package/dist/role-builder-CXbis5-X.js +623 -0
- package/dist/{rpc-DL9Sqvb1.js → rpc-aPyNi6tA.js} +18 -8
- 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-CB8gQFvS.js → runtime-D3VTAiCA.js} +1 -1
- package/dist/{saas-DhpJjnBA.js → saas-FO-Q8oj0.js} +18 -15
- package/dist/scan-BOI5tJ-6.js +29 -0
- package/dist/{schema-D3MnDMxa.js → schema-B4v0Qrac.js} +106 -10
- 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-BFGBBAqR.js → scim-ClHtpyV3.js} +213 -87
- package/dist/{scopes-CVdPrWN-.js → scopes-CUPSjo9q.js} +20 -7
- package/dist/server/index.d.ts +13 -134
- package/dist/server/index.js +13 -10
- package/dist/server-DqCT4CgZ.js +453 -0
- package/dist/{create-B1d519XK.d.ts → server-types-BLd4MnBX.d.ts} +89 -70
- package/dist/{sha256-BO0swRXL.js → sha256-D9ihqmvd.js} +8 -1
- package/dist/shared-CD11nBbC.js +304 -0
- package/dist/{shared-DRu8VFVM.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-Biq5uup3.js → skills-B6lVdD_W.js} +16 -8
- package/dist/skills-CTYwkl44.js +51 -0
- package/dist/snapshot-CXUWfsNy.js +269 -0
- package/dist/{snapshot-cache-D6jLelln.js → snapshot-cache-DZHQ0KF6.js} +11 -5
- package/dist/{snapshot-cache-B-LxUahj.d.ts → snapshot-cache-DqK9eDmM.d.ts} +7 -5
- package/dist/solid/index.d.ts +24 -25
- package/dist/solid/index.js +41 -11
- package/dist/solid-start/index.d.ts +52 -0
- package/dist/solid-start/index.js +49 -0
- package/dist/{sources-BdOYLw9j.d.ts → sources-BV9j0DeZ.d.ts} +11 -13
- package/dist/{sources-4p0-4xQm.js → sources-vs5dGOsS.js} +147 -142
- package/dist/sql-B5T1IL83.js +55 -0
- package/dist/src-DLfUWFAI.js +1851 -0
- package/dist/ssf/index.d.ts +4 -4
- package/dist/ssf/index.js +440 -106
- 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-DMAWwAJV.js → store-4u_hxjWa.js} +42 -55
- package/dist/{store-options-ByhZq1jV.js → store-options-BqEakYRa.js} +38 -24
- package/dist/{stores-BT2pSCub.js → stores-BbsD4fAR.js} +7 -3
- package/dist/stores-ClZUgeoP.d.ts +30 -0
- package/dist/{stream-D1RXubw2.d.ts → stream-7-xmnf3U.d.ts} +2 -2
- package/dist/{stream-DDpvynSB.js → stream-CvdUS9V1.js} +10 -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/{subject-settings-BwBmCdTR.js → subject-settings-CkEwrw3W.js} +23 -5
- package/dist/supabase/index.d.ts +23 -106
- package/dist/supabase/index.js +5 -4
- package/dist/supabase/middleware.d.ts +13 -6
- package/dist/supabase/middleware.js +16 -11
- package/dist/supabase-9pqI57pW.js +92 -0
- package/dist/{supabase-C0qESOa-.js → supabase-Dxlp8A94.js} +124 -247
- package/dist/supabase-hook-CXcGpHqq.js +1 -0
- package/dist/{supabase-hook-ntETYCQu.js → supabase-hook-DdDQhMlw.js} +1659 -819
- package/dist/{supautils-u8jXTGrt.js → supautils-B6HYL9eL.js} +2 -2
- package/dist/support-session-C6xJQYut.js +158 -0
- package/dist/svelte/Protected.svelte +11 -4
- package/dist/svelte/index.d.ts +7 -7
- package/dist/svelte/index.js +26 -12
- package/dist/svelte/runtime.d.ts +10 -3
- package/dist/svelte/runtime.js +4 -3
- package/dist/svelte/source.d.ts +7 -7
- package/dist/svelte/source.js +5 -5
- 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/{validity-uOp8UpYn.js → tenancy-DN2QAx9z.js} +6 -42
- package/dist/terminal/index.d.ts +11 -9
- package/dist/terminal/index.js +36 -316
- package/dist/testing/index.d.ts +391 -106
- package/dist/testing/index.js +4574 -1286
- 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-CIWxJOCh.js → token-BLZcjQgt.js} +15 -6
- package/dist/tool-refusal-CMLN5xhn.js +41 -0
- package/dist/trpc/index.d.ts +12 -9
- package/dist/trpc/index.js +18 -17
- package/dist/{types-DbjRN55U.d.ts → types-5Ut_pbKy.d.ts} +141 -13
- package/dist/types-BNORmDM8.d.ts +172 -0
- package/dist/types-BjV-fqcA.d.ts +57 -0
- package/dist/{types-QCuYJh4q.d.ts → types-BqAKcRNW.d.ts} +2 -1
- package/dist/types-C8-KNsFf.d.ts +107 -0
- package/dist/{types-aqOHTHcp.d.ts → types-CCpc2Dcv.d.ts} +77 -17
- package/dist/{types-Dnemwd77.d.ts → types-CZTnPFzM.d.ts} +50 -11
- package/dist/{types-C97IskBw.d.ts → types-CdlxsYQh.d.ts} +23 -11
- package/dist/{types-DxiCGmmd.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-fbZ7JEXr.d.ts +89 -0
- package/dist/types-tIgIeIKJ.d.ts +66 -0
- 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-ItS7nLcl.js → usage-T5mXq98v.js} +56 -13
- package/dist/{validation-error-Ba264OaJ.d.ts → validation-error-Bg5Tpluk.d.ts} +1 -1
- package/dist/{validation-error-CnjZ4t92.js → validation-error-ZfUHbKvf.js} +1 -1
- package/dist/validity-CZ7-y0Cj.js +79 -0
- package/dist/{verifier-BxBo6I44.js → verifier-DHuh-okk.js} +68 -21
- package/dist/verify-DbCL9bnB.js +1770 -0
- package/dist/{version-BvacVTZR.js → version-CEbQ5UeM.js} +4 -3
- package/dist/version-DXkYUISx.js +1 -0
- package/dist/{views-Soe7bGSC.js → views-DTIIO-oQ.js} +41 -2
- package/dist/{permissions-DttnqqxC.d.ts → vocabulary-D6lPdb4Z.d.ts} +120 -29
- package/dist/vue/index.d.ts +25 -21
- package/dist/vue/index.js +25 -9
- 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-DVBJ9cBq.js → watch-CszoTJMq.js} +47 -8
- package/dist/webmcp/index.d.ts +2 -2
- package/dist/webmcp/index.js +13 -37
- 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-Bd1Tejur.d.ts +15 -0
- package/dist/wrap-gX61EtpB.js +27 -0
- package/package.json +140 -41
- 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 +129 -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 +19 -10
- package/skills/permdock-data/SKILL.md +6 -6
- package/skills/permdock-data/references/queries-and-rls.md +13 -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 +6 -4
- package/skills/permdock-wire/SKILL.md +18 -12
- package/skills/permdock-wire/references/adapters.md +146 -50
- package/skills/permdock-wire/references/policy-options.md +15 -6
- package/skills/permdock-wire/references/presets-and-recipes.md +58 -0
- package/dist/approvals-DbYAuNkG.js +0 -224
- package/dist/arazzo-C9chp3ST.js +0 -54
- package/dist/bind-C_ob3LKa.d.ts +0 -25
- package/dist/catalog-CRW5Mx_B.js +0 -2
- package/dist/catalog-CYj-mX2O.js +0 -48
- package/dist/catalog-DWF5cYqB.js +0 -55
- package/dist/cloud-CfwZ39Rl.js +0 -50
- package/dist/cloud-DWLXO2af.js +0 -118
- package/dist/collect-CHB22Sx4.js +0 -83
- package/dist/collect-DSWOk19R.js +0 -2
- package/dist/commands-BeaGNj_o.js +0 -97
- package/dist/config-ir40y8m0.js +0 -36
- package/dist/create-CMwIl-w2.js +0 -253
- package/dist/delegation-D8pUEuce.js +0 -103
- package/dist/diff-C9RDjjhs.js +0 -48
- package/dist/doctor-Djh6JDEk.js +0 -53
- package/dist/doctor-DvH0IQff.js +0 -1194
- package/dist/doctor-collect-CjdO0wQX.js +0 -665
- package/dist/duration-xK2jGFVc.js +0 -25
- package/dist/errors-CWfoNg9N.js +0 -47
- package/dist/errors-DRnGZHzF.js +0 -30
- package/dist/evaluation-items-CfCCejQd.js +0 -40
- package/dist/expiry-BoBJ8Tvc.js +0 -7
- package/dist/fields-BMl1RxoX.js +0 -26
- package/dist/grantee-Cv5Sogfv.js +0 -602
- 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-0nNqHspG.d.ts +0 -6
- package/dist/index-BNc7Wer_.d.ts +0 -483
- package/dist/index-C7Tw7MaW.d.ts +0 -201
- package/dist/instance-options-Dhhcnm3y.js +0 -22
- package/dist/load-DwJUafYN.js +0 -2
- package/dist/manifest-iaoBXHKc.js +0 -783
- package/dist/map-AcxK9o_D.js +0 -147
- package/dist/may-use-DndQ5tQ-.js +0 -77
- package/dist/openapi-CQTsgKoB.js +0 -164
- package/dist/permdock-CbgvLnuo.js +0 -3479
- package/dist/permissions-DVoF6dMt.js +0 -662
- package/dist/policy-xyWg7QdR.js +0 -1122
- package/dist/powersync-CrBX8hY6.js +0 -2
- package/dist/powersync-DE19b9dT.js +0 -62
- package/dist/protected-BdnIEFkY.d.ts +0 -27
- package/dist/protected-xAr24FEC.d.ts +0 -40
- package/dist/relations-cjOL01hZ.js +0 -505
- package/dist/rls-P-BeBx0n.js +0 -238
- package/dist/rls-graph-CHwx0V8q.js +0 -435
- package/dist/rls-ownership-DcYlZ09B.js +0 -843
- package/dist/rls-shared-Cewd_-zI.js +0 -495
- package/dist/rls-verify-CMv9H3wV.js +0 -746
- package/dist/run-BWc9qqvE.js +0 -174
- package/dist/server-DlZ28Oz5.js +0 -268
- package/dist/sink-B1fZzIMf.d.ts +0 -104
- package/dist/sink-Bd9PSyfq.js +0 -141
- package/dist/skills-C5CbhhpG.js +0 -56
- package/dist/snapshot-Enxd0n-s.js +0 -975
- package/dist/sql-xdg5f4Fi.js +0 -27
- package/dist/src-BDwEZWrZ.js +0 -568
- package/dist/store-jOBYpiXC.d.ts +0 -36
- package/dist/stores-C0IMQrGI.d.ts +0 -52
- package/dist/subject-C6dLxqHU.js +0 -24
- package/dist/supabase-config-Bj3iDH2I.js +0 -472
- package/dist/supabase-hook-gd3s8bxB.js +0 -2
- package/dist/supabase-s4o9s1O1.js +0 -83
- package/dist/thenable-okc2xDsj.js +0 -10
- package/dist/types-BnIEz1sU.d.ts +0 -48
- package/dist/types-Bvc4oWT6.d.ts +0 -9
- package/dist/types-CKNSyIf_.d.ts +0 -52
- package/dist/types-Cq_H8N_X.d.ts +0 -197
- package/dist/usage-B0YuTQRO.js +0 -42
- package/dist/usage-DorAJiU_.js +0 -2
- package/dist/vocabulary-DA8a8zif.d.ts +0 -56
- package/dist/watch-BwxLTYMZ.js +0 -2
|
@@ -0,0 +1,623 @@
|
|
|
1
|
+
import { a as sole, n as isReadonlyArray, t as compact } from "./compact-CAf557ZB.js";
|
|
2
|
+
import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
|
|
3
|
+
import { i as ownKeys, n as isForbiddenKey, t as assertSafeKey } from "./paths-DXSHAMIa.js";
|
|
4
|
+
import { c as isConditionRef, l as isSqlFunctionField, n as isSubjectRef, o as isCondition, s as isConditionDate } from "./refs-K6eWUJ0H.js";
|
|
5
|
+
import { c as isUserApprover, i as flattenApprovers, l as user, o as isAnyOfInput, r as approverLeaves, s as isPermissionApprover } from "./approvers-CqPOLD-o.js";
|
|
6
|
+
import { c as listPermissions, o as isPermission } from "./permission-registry-Br4jSNVi.js";
|
|
7
|
+
import { n as assertMetaValue, r as parseAppData, t as assertAppData } from "./app-data-MuyzVqX8.js";
|
|
8
|
+
import { d as isSelfParented } from "./resource-relations-D_jw0BFx.js";
|
|
9
|
+
import { a as durationOf, r as assertDuration } from "./time-DkWjdL98.js";
|
|
10
|
+
import { a as authenticated, d as roleScopeOf, g as isRole, o as flattenGrantee, r as asGrantee, u as roleNameOf } from "./grantee-Cn1HyUsI.js";
|
|
11
|
+
import { c as sanitizeFields, n as normalizeValidity } from "./validity-CZ7-y0Cj.js";
|
|
12
|
+
//#region src/conditions/opaque.ts
|
|
13
|
+
function opaque(input) {
|
|
14
|
+
return freezeDeep({
|
|
15
|
+
op: "opaque",
|
|
16
|
+
sql: input.sql,
|
|
17
|
+
fingerprint: input.fingerprint
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
//#endregion
|
|
21
|
+
//#region src/conditions/sql-function-assert.ts
|
|
22
|
+
const IDENT = /^[A-Za-z_][A-Za-z0-9_]*$/u;
|
|
23
|
+
function assertSqlFunctionName(name) {
|
|
24
|
+
const parts = name.split(".");
|
|
25
|
+
if (parts.length === 0 || parts.length > 2) throw new Error(`PermDock: sqlFunction name '${name}' is not a SQL identifier`);
|
|
26
|
+
for (const part of parts) {
|
|
27
|
+
if (!IDENT.test(part)) throw new Error(`PermDock: sqlFunction name '${name}' is not a SQL identifier`);
|
|
28
|
+
assertSafeKey(part, "sqlFunction name");
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function assertSqlFunctionArg(arg) {
|
|
32
|
+
if (isSqlFunctionField(arg)) assertSafeKey(arg.field, "sqlFunction argument field");
|
|
33
|
+
}
|
|
34
|
+
function assertPortableTwin(condition, depth = 0) {
|
|
35
|
+
/* v8 ignore next 3 */
|
|
36
|
+
if (depth > 32) throw new Error("PermDock: sqlFunction twin is nested too deeply");
|
|
37
|
+
switch (condition.op) {
|
|
38
|
+
case "opaque": throw new Error("PermDock: sqlFunction twin must not be opaque");
|
|
39
|
+
case "sqlFunction": throw new Error("PermDock: sqlFunction twin must not nest sqlFunction");
|
|
40
|
+
case "related": throw new Error("PermDock: sqlFunction twin must not read the relation graph");
|
|
41
|
+
case "and":
|
|
42
|
+
case "or":
|
|
43
|
+
for (const child of condition.conditions) assertPortableTwin(child, depth + 1);
|
|
44
|
+
break;
|
|
45
|
+
case "not": assertPortableTwin(condition.condition, depth + 1);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//#endregion
|
|
49
|
+
//#region src/conditions/normalize.ts
|
|
50
|
+
const FIELD_OPS = /* @__PURE__ */ new Set([
|
|
51
|
+
"eq",
|
|
52
|
+
"ne",
|
|
53
|
+
"gt",
|
|
54
|
+
"gte",
|
|
55
|
+
"lt",
|
|
56
|
+
"lte",
|
|
57
|
+
"contains",
|
|
58
|
+
"in",
|
|
59
|
+
"notIn",
|
|
60
|
+
"isNull"
|
|
61
|
+
]);
|
|
62
|
+
function toValue(raw) {
|
|
63
|
+
if (isSubjectRef(raw) || isConditionRef(raw)) return freezeDeep({ ref: raw.ref });
|
|
64
|
+
if (raw instanceof Date) return freezeDeep({ date: raw.toISOString() });
|
|
65
|
+
if (isConditionDate(raw)) return freezeDeep({ date: raw.date });
|
|
66
|
+
if (Array.isArray(raw)) return raw.map((item) => toValue(item));
|
|
67
|
+
if (raw === null || typeof raw === "string" || typeof raw === "number" || typeof raw === "boolean") return raw;
|
|
68
|
+
throw new Error("PermDock: unsupported condition value");
|
|
69
|
+
}
|
|
70
|
+
function flatten(op, conditions) {
|
|
71
|
+
const out = [];
|
|
72
|
+
for (const condition of conditions) if (condition.op === op) out.push(...condition.conditions);
|
|
73
|
+
else out.push(condition);
|
|
74
|
+
return out;
|
|
75
|
+
}
|
|
76
|
+
function collapse(condition) {
|
|
77
|
+
if (condition.op === "and" || condition.op === "or") {
|
|
78
|
+
const flat = flatten(condition.op, condition.conditions).map(collapse);
|
|
79
|
+
if (flat.length === 0) throw new Error(`PermDock: empty ${condition.op} condition`);
|
|
80
|
+
const single = sole(flat);
|
|
81
|
+
if (single !== void 0) return single;
|
|
82
|
+
return freezeDeep({
|
|
83
|
+
op: condition.op,
|
|
84
|
+
conditions: flat
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
if (condition.op === "not") return freezeDeep({
|
|
88
|
+
op: "not",
|
|
89
|
+
condition: collapse(condition.condition)
|
|
90
|
+
});
|
|
91
|
+
if (condition.op === "sqlFunction") return freezeDeep({
|
|
92
|
+
op: "sqlFunction",
|
|
93
|
+
name: condition.name,
|
|
94
|
+
args: condition.args,
|
|
95
|
+
twin: collapse(condition.twin)
|
|
96
|
+
});
|
|
97
|
+
return freezeDeep(condition);
|
|
98
|
+
}
|
|
99
|
+
function fieldCondition(field, raw) {
|
|
100
|
+
assertSafeKey(field, "condition field");
|
|
101
|
+
if (isCondition(raw) && (raw.op === "opaque" || raw.op === "sqlFunction")) return raw.op === "sqlFunction" ? normalizeSqlFunction(raw) : raw;
|
|
102
|
+
if (raw !== null && typeof raw === "object" && !isSubjectRef(raw) && !isConditionRef(raw) && !isConditionDate(raw) && !Array.isArray(raw) && !(raw instanceof Date)) {
|
|
103
|
+
const keys = ownKeys(raw);
|
|
104
|
+
if (keys.length === 1 && keys[0] !== void 0 && FIELD_OPS.has(keys[0])) {
|
|
105
|
+
const op = keys[0];
|
|
106
|
+
const value = raw[op];
|
|
107
|
+
if (op === "isNull") {
|
|
108
|
+
if (typeof value !== "boolean") throw new TypeError("PermDock: isNull requires a boolean");
|
|
109
|
+
return collapse({
|
|
110
|
+
op: "isNull",
|
|
111
|
+
field,
|
|
112
|
+
value
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
if (op === "in" || op === "notIn") {
|
|
116
|
+
if (isSubjectRef(value) || isConditionRef(value)) return collapse({
|
|
117
|
+
op,
|
|
118
|
+
field,
|
|
119
|
+
value: { ref: value.ref }
|
|
120
|
+
});
|
|
121
|
+
if (!Array.isArray(value)) throw new TypeError(`PermDock: ${op} requires an array or subject reference`);
|
|
122
|
+
return collapse({
|
|
123
|
+
op,
|
|
124
|
+
field,
|
|
125
|
+
value: value.map((item) => toValue(item))
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
return collapse({
|
|
129
|
+
op,
|
|
130
|
+
field,
|
|
131
|
+
value: toValue(value)
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return collapse({
|
|
136
|
+
op: "eq",
|
|
137
|
+
field,
|
|
138
|
+
value: toValue(raw)
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
function normalizeSqlFunction(input) {
|
|
142
|
+
assertSqlFunctionName(input.name);
|
|
143
|
+
const args = input.args ?? [];
|
|
144
|
+
for (const arg of args) assertSqlFunctionArg(arg);
|
|
145
|
+
if (isCondition(input.twin) && input.twin.op === "sqlFunction") throw new Error("PermDock: sqlFunction twin must not nest sqlFunction");
|
|
146
|
+
const twin = isCondition(input.twin) ? collapse(input.twin) : normalizeWhere(input.twin);
|
|
147
|
+
assertPortableTwin(twin);
|
|
148
|
+
return freezeDeep({
|
|
149
|
+
op: "sqlFunction",
|
|
150
|
+
name: input.name,
|
|
151
|
+
args,
|
|
152
|
+
twin
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
/** `{ session: … }` under `subject`; any other value is a comparison on a `subject` field. */
|
|
156
|
+
function isSubjectCondition(value) {
|
|
157
|
+
return value !== null && typeof value === "object" && !Array.isArray(value) && Object.hasOwn(value, "session");
|
|
158
|
+
}
|
|
159
|
+
function subjectCondition(value) {
|
|
160
|
+
const session = value["session"];
|
|
161
|
+
if (ownKeys(value).length !== 1 || session === null || typeof session !== "object" || ownKeys(session).length !== 1 || Reflect.get(session, "live") !== true) throw new TypeError("PermDock: a subject condition is { subject: { session: { live: true } } }");
|
|
162
|
+
return freezeDeep({ op: "liveSession" });
|
|
163
|
+
}
|
|
164
|
+
function normalizeWhere(input) {
|
|
165
|
+
if (isCondition(input)) {
|
|
166
|
+
if (input.op === "sqlFunction") return collapse(normalizeSqlFunction(input));
|
|
167
|
+
return collapse(input);
|
|
168
|
+
}
|
|
169
|
+
if (input !== null && typeof input === "object" && "sql" in input && "fingerprint" in input && typeof input.sql === "string") return opaque({
|
|
170
|
+
sql: input.sql,
|
|
171
|
+
fingerprint: input.fingerprint
|
|
172
|
+
});
|
|
173
|
+
if (input === null || typeof input !== "object" || Array.isArray(input)) throw new Error("PermDock: condition must be an object");
|
|
174
|
+
const parts = [];
|
|
175
|
+
for (const key of Object.keys(input)) {
|
|
176
|
+
const value = input[key];
|
|
177
|
+
if (key === "and") {
|
|
178
|
+
if (!Array.isArray(value)) throw new TypeError("PermDock: and requires an array");
|
|
179
|
+
parts.push(collapse({
|
|
180
|
+
op: "and",
|
|
181
|
+
conditions: value.map(normalizeWhere)
|
|
182
|
+
}));
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
if (key === "or") {
|
|
186
|
+
if (!Array.isArray(value)) throw new TypeError("PermDock: or requires an array");
|
|
187
|
+
parts.push(collapse({
|
|
188
|
+
op: "or",
|
|
189
|
+
conditions: value.map(normalizeWhere)
|
|
190
|
+
}));
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
if (key === "not") {
|
|
194
|
+
parts.push(collapse({
|
|
195
|
+
op: "not",
|
|
196
|
+
condition: normalizeWhere(value)
|
|
197
|
+
}));
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
if (key === "subject" && isSubjectCondition(value)) {
|
|
201
|
+
parts.push(subjectCondition(value));
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
parts.push(fieldCondition(key, value));
|
|
205
|
+
}
|
|
206
|
+
if (parts.length === 0) throw new Error("PermDock: empty condition");
|
|
207
|
+
const single = sole(parts);
|
|
208
|
+
if (single !== void 0) return single;
|
|
209
|
+
return collapse({
|
|
210
|
+
op: "and",
|
|
211
|
+
conditions: parts
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
//#endregion
|
|
215
|
+
//#region src/core/approval-normalize.ts
|
|
216
|
+
/** Every approver a requirement names: `by`, each stage and its escalation, and `escalation.to`, inside `anyOf` groups too. */
|
|
217
|
+
function approversOf(requirement) {
|
|
218
|
+
return [
|
|
219
|
+
...approverLeaves(requirement.by),
|
|
220
|
+
...(requirement.stages ?? []).flatMap((stage) => approverLeaves(stage.by).concat(approverLeaves(stage.escalation?.to))),
|
|
221
|
+
...approverLeaves(requirement.escalation?.to)
|
|
222
|
+
];
|
|
223
|
+
}
|
|
224
|
+
function asApprover(input) {
|
|
225
|
+
if (isPermissionApprover(input)) {
|
|
226
|
+
if (typeof input.permission !== "string" || input.permission === "") throw new Error("PermDock: a permission approver needs a permission key");
|
|
227
|
+
return Object.freeze({
|
|
228
|
+
kind: "permission",
|
|
229
|
+
permission: input.permission
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
if (isAnyOfInput(input)) {
|
|
233
|
+
if (!Array.isArray(input.of) || input.of.length === 0) throw new Error("PermDock: anyOf() needs at least one approver");
|
|
234
|
+
const of = input.of.map((item) => {
|
|
235
|
+
const normalized = asApprover(item);
|
|
236
|
+
const items = flattenApprovers(normalized);
|
|
237
|
+
if (items.length === 0) throw new Error("PermDock: an anyOf() item names no approver");
|
|
238
|
+
const [first] = items;
|
|
239
|
+
return isReadonlyArray(normalized) || first === void 0 ? items : first;
|
|
240
|
+
});
|
|
241
|
+
return Object.freeze({
|
|
242
|
+
kind: "any-of",
|
|
243
|
+
of: Object.freeze(of)
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
if (isReadonlyArray(input)) {
|
|
247
|
+
const items = [];
|
|
248
|
+
for (const item of input) items.push(...flattenApprovers(asApprover(item)));
|
|
249
|
+
return items;
|
|
250
|
+
}
|
|
251
|
+
if (isUserApprover(input)) return user(input.id);
|
|
252
|
+
return asGrantee(input);
|
|
253
|
+
}
|
|
254
|
+
function normalizeApproval(approval, permission) {
|
|
255
|
+
if (approval === void 0) return;
|
|
256
|
+
if (approval === "human") return "human";
|
|
257
|
+
if (approval.staleOn !== void 0 && approval.staleOn !== "resource-change") throw new Error(`PermDock: approval staleOn must be 'resource-change', got '${String(approval.staleOn)}'`);
|
|
258
|
+
const label = permission ?? "a grant";
|
|
259
|
+
assertQuorum(approval.quorum, "approval.quorum", label);
|
|
260
|
+
if (approval.ttl !== void 0) assertDuration(approval.ttl, `approval.ttl on '${label}'`);
|
|
261
|
+
const escalation = normalizeEscalation(approval.escalation, label);
|
|
262
|
+
const mode = approval.mode ?? "any";
|
|
263
|
+
if (mode !== "any") return compact({
|
|
264
|
+
mode,
|
|
265
|
+
stages: normalizeStages(approval, mode, label),
|
|
266
|
+
distinct: approval.distinct,
|
|
267
|
+
staleOn: approval.staleOn,
|
|
268
|
+
ttl: approval.ttl,
|
|
269
|
+
escalation
|
|
270
|
+
});
|
|
271
|
+
if (approval.stages !== void 0) throw new Error(`PermDock: approval.stages on '${label}' needs mode: 'all' or 'sequential'`);
|
|
272
|
+
const by = approval.by === void 0 ? void 0 : asApprover(approval.by);
|
|
273
|
+
if (by === void 0 && approval.distinct === void 0 && approval.staleOn === void 0 && approval.quorum === void 0 && approval.ttl === void 0 && escalation === void 0) return "human";
|
|
274
|
+
return compact({
|
|
275
|
+
by: by ?? authenticated(),
|
|
276
|
+
distinct: approval.distinct,
|
|
277
|
+
staleOn: approval.staleOn,
|
|
278
|
+
quorum: approval.quorum,
|
|
279
|
+
ttl: approval.ttl,
|
|
280
|
+
escalation
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
function assertQuorum(quorum, name, label) {
|
|
284
|
+
if (quorum !== void 0 && (!Number.isInteger(quorum) || quorum < 1)) throw new Error(`PermDock: ${name} on '${label}' must be an integer of at least 1, got ${String(quorum)}`);
|
|
285
|
+
}
|
|
286
|
+
function normalizeStages(approval, mode, label) {
|
|
287
|
+
if (mode !== "all" && mode !== "sequential") throw new Error(`PermDock: approval.mode on '${label}' must be 'any', 'all' or 'sequential', got '${mode}'`);
|
|
288
|
+
if (approval.by !== void 0 || approval.quorum !== void 0) throw new Error(`PermDock: approval on '${label}' sets mode '${mode}': put by and quorum on each stage`);
|
|
289
|
+
const stages = approval.stages ?? [];
|
|
290
|
+
if (stages.length === 0) throw new Error(`PermDock: approval mode '${mode}' on '${label}' needs at least one stage`);
|
|
291
|
+
return stages.map((stage, index) => {
|
|
292
|
+
assertQuorum(stage.quorum, `approval.stages[${index}].quorum`, label);
|
|
293
|
+
const by = asApprover(stage.by);
|
|
294
|
+
if (flattenApprovers(by).length === 0) throw new Error(`PermDock: approval.stages[${index}].by on '${label}' names no approver`);
|
|
295
|
+
return compact({
|
|
296
|
+
by,
|
|
297
|
+
quorum: stage.quorum,
|
|
298
|
+
escalation: normalizeEscalation(stage.escalation, label)
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
function normalizeEscalation(escalation, label) {
|
|
303
|
+
if (escalation === void 0) return;
|
|
304
|
+
assertDuration(escalation.after, `approval.escalation.after on '${label}'`);
|
|
305
|
+
return {
|
|
306
|
+
after: escalation.after,
|
|
307
|
+
to: asApprover(escalation.to)
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* A role with `activation` is eligible-only: it needs a positive `maxDuration`
|
|
312
|
+
* (Doctor PD033 warns without one). `justification` defaults to `'optional'`.
|
|
313
|
+
*/
|
|
314
|
+
function activationApproval(option, roleName) {
|
|
315
|
+
const label = `activation of '${roleName}'`;
|
|
316
|
+
const approval = normalizeApproval(option, label);
|
|
317
|
+
if (approval !== void 0 && approval !== "human" && approversOf(approval).some((item) => item.kind === "relation")) throw new Error(`PermDock: approval on ${label} names a relation; an activation has no row to read it on`);
|
|
318
|
+
return approval;
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* A stale-on-change approval needs a row to version: an instance permission
|
|
322
|
+
* whose resource declares `version`.
|
|
323
|
+
*/
|
|
324
|
+
function assertApprovalVersions(grants, resources) {
|
|
325
|
+
for (const grant of grants) {
|
|
326
|
+
const approval = grant.approval;
|
|
327
|
+
if (approval === void 0 || approval === "human" || approval.staleOn === void 0) continue;
|
|
328
|
+
if (grant.permission.kind !== "instance") throw new Error(`PermDock: approval staleOn on '${grant.permission.key}' needs an instance action; a collection action has no row to version`);
|
|
329
|
+
if (resources.get(grant.permission.resource)?.version === void 0) throw new Error(`PermDock: approval staleOn on '${grant.permission.key}' needs resource(..., { version: '<field>' }) on '${grant.permission.resource}'`);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* A relation approver is checked by id, from the requested row: the
|
|
334
|
+
* relation lives on the permission's own resource (optionally up its parent
|
|
335
|
+
* chain), or at the end of a list of links from it.
|
|
336
|
+
*/
|
|
337
|
+
function assertApprovalRelations(grants, resources) {
|
|
338
|
+
for (const grant of grants) {
|
|
339
|
+
const approval = grant.approval;
|
|
340
|
+
if (approval === void 0 || approval === "human") continue;
|
|
341
|
+
for (const item of approversOf(approval)) {
|
|
342
|
+
if (item.kind !== "relation") continue;
|
|
343
|
+
const label = `${grant.permission.key}: approver relation '${item.relation}'`;
|
|
344
|
+
if (grant.permission.kind !== "instance") throw new Error(`PermDock: ${label} needs an instance action; a collection action has no row to read it on`);
|
|
345
|
+
if (approverRelationResource(grant.permission.resource, item.through, resources) !== item.resource) throw new Error(`PermDock: ${label} must live on '${grant.permission.resource}' or at the end of its through links`);
|
|
346
|
+
if (resources.get(item.resource)?.relations[item.relation] === void 0) throw new Error(`PermDock: ${label} is not declared on '${item.resource}'`);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
/** The resource a relation approver's `through` reaches from `start`, or `undefined`. */
|
|
351
|
+
function approverRelationResource(start, through, resources) {
|
|
352
|
+
if (through === void 0) return start;
|
|
353
|
+
if (through === "parent") return isSelfParented(resources.get(start)) ? start : void 0;
|
|
354
|
+
let current = start;
|
|
355
|
+
for (const name of through) {
|
|
356
|
+
const node = current === void 0 ? void 0 : resources.get(current);
|
|
357
|
+
current = node !== void 0 && Object.hasOwn(node.links, name) ? node.links[name]?.resource : void 0;
|
|
358
|
+
}
|
|
359
|
+
return current;
|
|
360
|
+
}
|
|
361
|
+
//#endregion
|
|
362
|
+
//#region src/core/limit-grants.ts
|
|
363
|
+
/** Throws at definition time for a `limit` no store could count. */
|
|
364
|
+
function assertLimit(limit, permissionKey) {
|
|
365
|
+
if (limit === void 0) return;
|
|
366
|
+
if (!Number.isSafeInteger(limit.count) || limit.count <= 0) throw new Error(`PermDock: limit count on '${permissionKey}' must be a positive integer`);
|
|
367
|
+
if (durationOf(limit.per) === void 0) throw new Error(`PermDock: limit per on '${permissionKey}' must be a whole number of seconds above 0 (3600 for an hour), got ${JSON.stringify(limit.per)}`);
|
|
368
|
+
if (limit.mode !== void 0 && limit.mode !== "hard" && limit.mode !== "soft") throw new Error(`PermDock: limit mode on '${permissionKey}' must be 'hard' or 'soft'`);
|
|
369
|
+
if (limit.alertAt !== void 0 && (typeof limit.alertAt !== "number" || !(limit.alertAt > 0 && limit.alertAt <= 1))) throw new Error(`PermDock: limit alertAt on '${permissionKey}' must be a fraction above 0 and at most 1`);
|
|
370
|
+
}
|
|
371
|
+
/** The declared fields of a validated `limit`, so extra keys never reach the grant. */
|
|
372
|
+
function normalizeLimit(limit) {
|
|
373
|
+
if (limit === void 0) return;
|
|
374
|
+
return {
|
|
375
|
+
count: limit.count,
|
|
376
|
+
per: limit.per,
|
|
377
|
+
...limit.mode === void 0 ? {} : { mode: limit.mode },
|
|
378
|
+
...limit.alertAt === void 0 ? {} : { alertAt: limit.alertAt }
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
//#endregion
|
|
382
|
+
//#region src/core/grant-builders.ts
|
|
383
|
+
function isClosure(value) {
|
|
384
|
+
return typeof value === "function";
|
|
385
|
+
}
|
|
386
|
+
function flattenPermissions(input) {
|
|
387
|
+
if (isPermission(input)) return [input];
|
|
388
|
+
if (isReadonlyArray(input)) return input.flatMap((item) => flattenPermissions(item));
|
|
389
|
+
return [...listPermissions(input)];
|
|
390
|
+
}
|
|
391
|
+
const GROUP = /^[a-z][a-z0-9_-]*$/u;
|
|
392
|
+
function grantGroup(group, key) {
|
|
393
|
+
if (group === void 0) return;
|
|
394
|
+
if (typeof group !== "string" || !GROUP.test(group) || group === "break-glass") throw new Error(`PermDock: group '${String(group)}' on ${key} must be lower case letters, digits, _ or -, start with a letter, and not be break-glass`);
|
|
395
|
+
return group;
|
|
396
|
+
}
|
|
397
|
+
function makeGrant(permission, effect, condition) {
|
|
398
|
+
const toInput = isClosure(condition) ? void 0 : condition?.to;
|
|
399
|
+
const to = toInput === void 0 ? {
|
|
400
|
+
kind: "role",
|
|
401
|
+
role: "",
|
|
402
|
+
scope: "global"
|
|
403
|
+
} : asGrantee(toInput);
|
|
404
|
+
if (isClosure(condition)) return {
|
|
405
|
+
permission,
|
|
406
|
+
effect,
|
|
407
|
+
to,
|
|
408
|
+
portable: false,
|
|
409
|
+
closure: condition
|
|
410
|
+
};
|
|
411
|
+
const whereInput = condition?.where;
|
|
412
|
+
const checkInput = condition?.check;
|
|
413
|
+
if (whereInput !== void 0 && permission.kind === "collection") throw new Error(`PermDock: where is not allowed on collection action '${permission.key}'`);
|
|
414
|
+
const where = whereInput === void 0 ? void 0 : normalizeWhere(whereInput);
|
|
415
|
+
const check = checkInput === void 0 ? void 0 : normalizeWhere(checkInput);
|
|
416
|
+
assertLimit(condition?.limit, permission.key);
|
|
417
|
+
const purpose = condition?.purpose === void 0 || condition.purpose.length === 0 ? void 0 : Object.freeze([...new Set(condition.purpose)]);
|
|
418
|
+
const portable = condition?.limit === void 0 && purpose === void 0;
|
|
419
|
+
const requires = requiredKey(condition?.requires, permission, effect);
|
|
420
|
+
return compact({
|
|
421
|
+
permission,
|
|
422
|
+
effect,
|
|
423
|
+
to,
|
|
424
|
+
where,
|
|
425
|
+
check,
|
|
426
|
+
approval: normalizeApproval(condition?.approval, permission.key),
|
|
427
|
+
portable,
|
|
428
|
+
limit: normalizeLimit(condition?.limit),
|
|
429
|
+
fields: sanitizeFields(condition?.fields),
|
|
430
|
+
name: condition?.name,
|
|
431
|
+
group: grantGroup(condition?.group, permission.key),
|
|
432
|
+
meta: grantMeta(condition?.meta, permission.key, void 0),
|
|
433
|
+
obligations: appObligations(condition?.obligations, permission.key, effect),
|
|
434
|
+
purpose,
|
|
435
|
+
validity: normalizeValidity(condition ?? {}, permission.key),
|
|
436
|
+
requires
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
/** Checks a grant's `meta`: plain JSON, string `description`, `x` through the schema when given. */
|
|
440
|
+
function grantMeta(meta, key, schema) {
|
|
441
|
+
if (meta === void 0) return;
|
|
442
|
+
assertAppData(meta, `meta of a grant on ${key}`);
|
|
443
|
+
const { description, x } = meta;
|
|
444
|
+
if (description !== void 0 && typeof description !== "string") throw new TypeError(`PermDock: meta.description of a grant on ${key} must be a string`);
|
|
445
|
+
return freezeDeep(compact({
|
|
446
|
+
description,
|
|
447
|
+
x: x === void 0 ? void 0 : parseAppData(schema, x, `meta.x of a grant on ${key}`)
|
|
448
|
+
}));
|
|
449
|
+
}
|
|
450
|
+
function appObligations(input, key, effect) {
|
|
451
|
+
if (input === void 0) return;
|
|
452
|
+
if (effect !== "allow") throw new Error(`PermDock: obligations are allowed on an allow only; '${key}' is a deny`);
|
|
453
|
+
const list = input;
|
|
454
|
+
if (!Array.isArray(list)) throw new TypeError(`PermDock: obligations on '${key}' must be a list`);
|
|
455
|
+
const items = list;
|
|
456
|
+
const seen = /* @__PURE__ */ new Set();
|
|
457
|
+
const out = [];
|
|
458
|
+
for (const item of items) {
|
|
459
|
+
const entry = typeof item === "object" && item !== null ? item : void 0;
|
|
460
|
+
const name = typeof item === "string" ? item : entry === void 0 ? void 0 : Reflect.get(entry, "name");
|
|
461
|
+
if (typeof name !== "string" || !GROUP.test(name)) throw new Error(`PermDock: obligation '${String(name)}' on '${key}' must be lower case letters, digits, _ or -, starting with a letter`);
|
|
462
|
+
if (seen.has(name)) throw new Error(`PermDock: obligation '${name}' is listed twice on '${key}'`);
|
|
463
|
+
seen.add(name);
|
|
464
|
+
const detail = entry === void 0 ? void 0 : Reflect.get(entry, "detail");
|
|
465
|
+
if (detail === void 0) {
|
|
466
|
+
out.push({
|
|
467
|
+
kind: "app",
|
|
468
|
+
name
|
|
469
|
+
});
|
|
470
|
+
continue;
|
|
471
|
+
}
|
|
472
|
+
assertMetaValue(detail, `detail of obligation '${name}' on '${key}'`);
|
|
473
|
+
out.push({
|
|
474
|
+
kind: "app",
|
|
475
|
+
name,
|
|
476
|
+
detail
|
|
477
|
+
});
|
|
478
|
+
}
|
|
479
|
+
return out.length === 0 ? void 0 : freezeDeep(out);
|
|
480
|
+
}
|
|
481
|
+
/** Re-checks every grant's `meta.x` with the policy's grant schema, keeping the schema output. */
|
|
482
|
+
function withGrantSchema(grant, schema) {
|
|
483
|
+
const meta = grant.meta;
|
|
484
|
+
if (schema === void 0 || meta?.x === void 0) return grant;
|
|
485
|
+
return freezeDeep({
|
|
486
|
+
...grant,
|
|
487
|
+
meta: grantMeta(meta, grant.permission.key, schema) ?? meta
|
|
488
|
+
});
|
|
489
|
+
}
|
|
490
|
+
function requiredKey(input, permission, effect) {
|
|
491
|
+
if (input === void 0) return;
|
|
492
|
+
if (effect !== "allow") throw new Error(`PermDock: requires is allowed on an allow only; '${permission.key}' is a deny`);
|
|
493
|
+
if (permission.kind !== "instance") throw new Error(`PermDock: requires on '${permission.key}' needs an instance action; a collection action has no row whose scope it can check`);
|
|
494
|
+
const list = Array.isArray(input) ? input : [input];
|
|
495
|
+
if (list.length === 0 || !list.every(isPermission)) throw new TypeError(`PermDock: requires on '${permission.key}' must be a permission leaf or a non-empty list of them`);
|
|
496
|
+
return Object.freeze([...new Set(list.map((leaf) => leaf.key))]);
|
|
497
|
+
}
|
|
498
|
+
function allow(permission, condition) {
|
|
499
|
+
const grants = flattenPermissions(permission).map((leaf) => makeGrant(leaf, "allow", condition));
|
|
500
|
+
return sole(grants) ?? grants;
|
|
501
|
+
}
|
|
502
|
+
function deny(permission, condition) {
|
|
503
|
+
const grants = flattenPermissions(permission).map((leaf) => makeGrant(leaf, "deny", condition));
|
|
504
|
+
return sole(grants) ?? grants;
|
|
505
|
+
}
|
|
506
|
+
function flattenGrants(grants) {
|
|
507
|
+
const out = [];
|
|
508
|
+
for (const grant of grants) if (Array.isArray(grant)) out.push(...grant);
|
|
509
|
+
else out.push(grant);
|
|
510
|
+
return out;
|
|
511
|
+
}
|
|
512
|
+
function completeGrant(grant) {
|
|
513
|
+
const to = flattenGrantee(grant.to);
|
|
514
|
+
const first = to[0];
|
|
515
|
+
if (to.length === 1 && first?.kind === "role" && first.role === "") throw new Error("PermDock: grant is missing to");
|
|
516
|
+
return freezeDeep({
|
|
517
|
+
...grant,
|
|
518
|
+
role: roleNameOf(grant.to),
|
|
519
|
+
scope: roleScopeOf(grant.to)
|
|
520
|
+
});
|
|
521
|
+
}
|
|
522
|
+
//#endregion
|
|
523
|
+
//#region src/core/role-builder.ts
|
|
524
|
+
function resolveRoleScope(on) {
|
|
525
|
+
if (on === void 0) return "global";
|
|
526
|
+
if (typeof on === "string") {
|
|
527
|
+
if (on === "global" || on === "resource") throw new Error(`PermDock: role on: '${on}' is not a scope name`);
|
|
528
|
+
return on;
|
|
529
|
+
}
|
|
530
|
+
const permissions = flattenPermissions(on);
|
|
531
|
+
const names = new Set(permissions.map((permission) => permission.resource));
|
|
532
|
+
const [resource] = names;
|
|
533
|
+
if (names.size !== 1 || resource === void 0) throw new Error("PermDock: role on: resource must name exactly one resource");
|
|
534
|
+
return { resource };
|
|
535
|
+
}
|
|
536
|
+
function role(name, grants, options) {
|
|
537
|
+
if (options !== void 0 && Object.hasOwn(options, "restricted")) throw new Error(`PermDock: role option 'restricted' is reserved`);
|
|
538
|
+
const leaf = isRole(name) ? name : void 0;
|
|
539
|
+
const roleName = leaf?.key ?? name;
|
|
540
|
+
const scope = resolveRoleScope(options?.on ?? leaf?.on);
|
|
541
|
+
const assignable = options?.assignable ?? leaf?.assignable ?? scope !== "global";
|
|
542
|
+
const rules = roleRules(roleName, scope, options);
|
|
543
|
+
const activation = normalizeActivation(roleName, options?.activation);
|
|
544
|
+
const roleGrantee = asGrantee(freezeDeep({
|
|
545
|
+
kind: "role",
|
|
546
|
+
role: roleName,
|
|
547
|
+
scope
|
|
548
|
+
}));
|
|
549
|
+
const normalised = flattenGrants(grants).map((grant) => {
|
|
550
|
+
const items = flattenGrantee(grant.to);
|
|
551
|
+
const first = items[0];
|
|
552
|
+
const to = items.length === 1 && first?.kind === "role" ? roleGrantee : grant.to;
|
|
553
|
+
return freezeDeep({
|
|
554
|
+
...grant,
|
|
555
|
+
to,
|
|
556
|
+
role: roleName,
|
|
557
|
+
scope: roleScopeOf(to, scope)
|
|
558
|
+
});
|
|
559
|
+
});
|
|
560
|
+
return freezeDeep(compact({
|
|
561
|
+
name: roleName,
|
|
562
|
+
grants: normalised,
|
|
563
|
+
on: options?.on ?? leaf?.on,
|
|
564
|
+
assignable,
|
|
565
|
+
exclusiveWith: options?.exclusiveWith,
|
|
566
|
+
...rules,
|
|
567
|
+
meta: options?.meta ?? leaf?.meta,
|
|
568
|
+
activation
|
|
569
|
+
}));
|
|
570
|
+
}
|
|
571
|
+
function normalizeActivation(roleName, option) {
|
|
572
|
+
if (option === void 0) return;
|
|
573
|
+
const justification = option.justification ?? "optional";
|
|
574
|
+
if (justification !== "required" && justification !== "optional") throw new Error(`PermDock: role '${roleName}' activation justification must be 'required' or 'optional'`);
|
|
575
|
+
if (option.maxDuration !== void 0) assertDuration(option.maxDuration, `activation.maxDuration on role '${roleName}'`);
|
|
576
|
+
return compact({
|
|
577
|
+
maxDuration: option.maxDuration,
|
|
578
|
+
justification,
|
|
579
|
+
approval: activationApproval(option.approval, roleName),
|
|
580
|
+
assurance: normalizeAssurance(option.assurance)
|
|
581
|
+
});
|
|
582
|
+
}
|
|
583
|
+
function normalizeAssurance(input) {
|
|
584
|
+
if (input === void 0) return;
|
|
585
|
+
const acr = input.acr === void 0 || input.acr.length === 0 ? void 0 : Object.freeze([...input.acr]);
|
|
586
|
+
const amr = input.amr === void 0 || input.amr.length === 0 ? void 0 : Object.freeze([...input.amr]);
|
|
587
|
+
const maxAge = typeof input.maxAge === "number" && input.maxAge >= 0 ? input.maxAge : void 0;
|
|
588
|
+
if (acr === void 0 && amr === void 0 && maxAge === void 0) return;
|
|
589
|
+
return compact({
|
|
590
|
+
maxAge,
|
|
591
|
+
acr,
|
|
592
|
+
amr
|
|
593
|
+
});
|
|
594
|
+
}
|
|
595
|
+
function nameList(roleName, option, value) {
|
|
596
|
+
if (value === void 0) return;
|
|
597
|
+
if (!Array.isArray(value) || value.some((item) => typeof item !== "string" || item === "" || isForbiddenKey(item))) throw new Error(`PermDock: role '${roleName}' ${option} must be a list of names`);
|
|
598
|
+
return [...new Set(value)];
|
|
599
|
+
}
|
|
600
|
+
function holderCount(roleName, option, value) {
|
|
601
|
+
if (value === void 0) return;
|
|
602
|
+
if (typeof value !== "number" || !Number.isInteger(value) || value < 0) throw new Error(`PermDock: role '${roleName}' ${option} must be a whole number of holders`);
|
|
603
|
+
return value;
|
|
604
|
+
}
|
|
605
|
+
/** Ownership rules count holders per scope instance, so they need a named-scope role. */
|
|
606
|
+
function roleRules(roleName, scope, options) {
|
|
607
|
+
const min = holderCount(roleName, "min", options?.min);
|
|
608
|
+
const max = holderCount(roleName, "max", options?.max);
|
|
609
|
+
const transferOnly = options?.transferOnly;
|
|
610
|
+
if (transferOnly !== void 0 && typeof transferOnly !== "boolean") throw new Error(`PermDock: role '${roleName}' transferOnly must be a boolean`);
|
|
611
|
+
if (max !== void 0 && max < 1) throw new Error(`PermDock: role '${roleName}' max must be at least 1`);
|
|
612
|
+
if (min !== void 0 && max !== void 0 && min > max) throw new Error(`PermDock: role '${roleName}' min must not exceed max`);
|
|
613
|
+
if ((min !== void 0 && min > 0 || max !== void 0 || transferOnly === true) && (typeof scope !== "string" || scope === "global")) throw new Error(`PermDock: role '${roleName}' min, max and transferOnly need on: '<scope>'`);
|
|
614
|
+
return compact({
|
|
615
|
+
min,
|
|
616
|
+
max,
|
|
617
|
+
transferOnly,
|
|
618
|
+
assigns: nameList(roleName, "assigns", options?.assigns),
|
|
619
|
+
for: nameList(roleName, "for", options?.for)
|
|
620
|
+
});
|
|
621
|
+
}
|
|
622
|
+
//#endregion
|
|
623
|
+
export { opaque as _, deny as a, withGrantSchema as c, assertApprovalVersions as d, normalizeApproval as f, assertSqlFunctionName as g, assertSqlFunctionArg as h, completeGrant as i, asApprover as l, assertPortableTwin as m, role as n, flattenGrants as o, normalizeWhere as p, allow as r, flattenPermissions as s, normalizeAssurance as t, assertApprovalRelations as u };
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { t as compact } from "./compact-
|
|
2
|
-
import {
|
|
3
|
-
import { n as tenantScope } from "./adapter-context-
|
|
4
|
-
import { t as adapterKernel } from "./bind-
|
|
5
|
-
import {
|
|
1
|
+
import { t as compact } from "./compact-CAf557ZB.js";
|
|
2
|
+
import { s as requestFromContext } from "./http-BBoKefeS.js";
|
|
3
|
+
import { n as tenantScope } from "./adapter-context-CRhqyzCk.js";
|
|
4
|
+
import { t as adapterKernel } from "./bind-CZzhx-Vj.js";
|
|
5
|
+
import { r as guardIterable } from "./stream-CvdUS9V1.js";
|
|
6
6
|
//#region src/server/rpc.ts
|
|
7
7
|
/** The tRPC and oRPC error code for a Problem Details status. */
|
|
8
8
|
function rpcCode(status) {
|
|
@@ -58,6 +58,15 @@ function bindRpcKernel(policy, options, adapter, contextOf, path) {
|
|
|
58
58
|
const opts = optsByRequest.get(request);
|
|
59
59
|
return opts === void 0 ? { tenant: void 0 } : scopeOf(opts);
|
|
60
60
|
});
|
|
61
|
+
const guard = async (permission, data, opts, protectOptions) => {
|
|
62
|
+
const request = bind(opts);
|
|
63
|
+
const scope = await scopeOf(opts);
|
|
64
|
+
return {
|
|
65
|
+
request,
|
|
66
|
+
scope,
|
|
67
|
+
guard: await kernel.protect(permission, data === void 0 ? void 0 : () => data(opts), protectOptions)(request, scope)
|
|
68
|
+
};
|
|
69
|
+
};
|
|
61
70
|
const evaluate = (request, opts) => {
|
|
62
71
|
bind(opts);
|
|
63
72
|
return request.method === "GET" ? evaluations.GET(request) : evaluations.POST(request);
|
|
@@ -70,14 +79,15 @@ function bindRpcKernel(policy, options, adapter, contextOf, path) {
|
|
|
70
79
|
},
|
|
71
80
|
scopeOf,
|
|
72
81
|
connection,
|
|
73
|
-
evaluate
|
|
82
|
+
evaluate,
|
|
83
|
+
guard
|
|
74
84
|
};
|
|
75
85
|
}
|
|
76
86
|
/** Wraps a streamed result so revocation ends it and items the subscriber cannot read drop. */
|
|
77
|
-
async function guardStream(source, open, permission,
|
|
87
|
+
async function guardStream(source, open, permission, data, protectOptions, guard) {
|
|
78
88
|
const conn = await open(permission === null ? {} : compact({
|
|
79
89
|
permission,
|
|
80
|
-
data
|
|
90
|
+
data
|
|
81
91
|
}));
|
|
82
92
|
return guardIterable(source, conn, compact({
|
|
83
93
|
items: protectOptions?.items,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { t as run } from "./run-DOfMtc9V.js";
|