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,234 @@
|
|
|
1
|
+
import { t as applyFiles } from "./files-C5ZI27eV.js";
|
|
2
|
+
import { n as isIdentifier, t as emitPolicyModule } from "./policy-module-CTlwMvLI.js";
|
|
3
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
4
|
+
import { resolve } from "node:path";
|
|
5
|
+
//#region src/cli/importers/casbin.ts
|
|
6
|
+
const MATCHER_TERMS = /* @__PURE__ */ new Set([
|
|
7
|
+
"g(r.sub,p.sub)",
|
|
8
|
+
"g(r.sub,p.sub,r.dom)",
|
|
9
|
+
"r.obj==p.obj",
|
|
10
|
+
"r.act==p.act",
|
|
11
|
+
"r.dom==p.dom"
|
|
12
|
+
]);
|
|
13
|
+
function sections(text) {
|
|
14
|
+
const found = /* @__PURE__ */ new Map();
|
|
15
|
+
let current;
|
|
16
|
+
for (const raw of text.split("\n")) {
|
|
17
|
+
const line = raw.trim();
|
|
18
|
+
if (line === "" || line.startsWith("#")) continue;
|
|
19
|
+
const header = /^\[(\w+)\]$/u.exec(line)?.[1];
|
|
20
|
+
if (header !== void 0) {
|
|
21
|
+
current = /* @__PURE__ */ new Map();
|
|
22
|
+
found.set(header, current);
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
const at = line.indexOf("=");
|
|
26
|
+
if (current !== void 0 && at > 0) current.set(line.slice(0, at).trim(), line.slice(at + 1).trim());
|
|
27
|
+
}
|
|
28
|
+
return found;
|
|
29
|
+
}
|
|
30
|
+
function fieldsOf(value) {
|
|
31
|
+
return (value ?? "").split(",").map((item) => item.trim());
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* The model, when it is RBAC (optionally with domains) under the standard
|
|
35
|
+
* matcher; otherwise the terms that are not. Deny rows need `p.eft` and an
|
|
36
|
+
* effect that lets a deny override an allow, as PermDock always does.
|
|
37
|
+
*/
|
|
38
|
+
function readCasbinModel(text) {
|
|
39
|
+
const model = sections(text);
|
|
40
|
+
const request = fieldsOf(model.get("request_definition")?.get("r"));
|
|
41
|
+
const policy = fieldsOf(model.get("policy_definition")?.get("p"));
|
|
42
|
+
const domains = request.includes("dom");
|
|
43
|
+
const expected = domains ? [
|
|
44
|
+
"sub",
|
|
45
|
+
"dom",
|
|
46
|
+
"obj",
|
|
47
|
+
"act"
|
|
48
|
+
] : [
|
|
49
|
+
"sub",
|
|
50
|
+
"obj",
|
|
51
|
+
"act"
|
|
52
|
+
];
|
|
53
|
+
if (request.join(",") !== expected.join(",")) return { refused: `r = ${request.join(", ")}: casbin import reads r = ${expected.join(", ")}` };
|
|
54
|
+
const withEffect = policy.length === expected.length + 1 && policy.at(-1) === "eft";
|
|
55
|
+
if (policy.slice(0, expected.length).join(",") !== expected.join(",") || policy.length !== expected.length && !withEffect) return { refused: `p = ${policy.join(", ")}: casbin import reads p = ${expected.join(", ")}[, eft]` };
|
|
56
|
+
const terms = (model.get("matchers")?.get("m") ?? "").replaceAll(/\s+/gu, "").split("&&").filter((term) => term !== "");
|
|
57
|
+
const unsupported = terms.filter((term) => !MATCHER_TERMS.has(term));
|
|
58
|
+
if (terms.length === 0 || unsupported.length > 0) return { refused: `the matcher has terms casbin import cannot read: ${unsupported.join(" && ") || "(empty)"}; it reads g(r.sub, p.sub[, r.dom]), r.dom == p.dom, r.obj == p.obj and r.act == p.act` };
|
|
59
|
+
const effect = (model.get("policy_effect")?.get("e") ?? "").replaceAll(/\s+/gu, "");
|
|
60
|
+
const allowOnly = effect === "some(where(p.eft==allow))";
|
|
61
|
+
const denyOverrides = effect === "some(where(p.eft==allow))&&!some(where(p.eft==deny))";
|
|
62
|
+
if (!allowOnly && !denyOverrides) return { refused: `e = ${effect}: casbin import reads allow-only or deny-override effects; PermDock's deny always overrides an allow` };
|
|
63
|
+
return {
|
|
64
|
+
domains,
|
|
65
|
+
roles: model.get("role_definition")?.get("g") !== void 0,
|
|
66
|
+
denies: withEffect && denyOverrides
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function policyLines(text) {
|
|
70
|
+
const lines = [];
|
|
71
|
+
for (const [index, raw] of text.split("\n").entries()) {
|
|
72
|
+
const line = raw.trim();
|
|
73
|
+
if (line !== "" && !line.startsWith("#")) lines.push({
|
|
74
|
+
number: index + 1,
|
|
75
|
+
text: line,
|
|
76
|
+
cells: line.split(",").map((cell) => cell.trim())
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
return lines;
|
|
80
|
+
}
|
|
81
|
+
/** Every grant `role` holds through `g` role-to-role lines, its own included; a cycle stops. */
|
|
82
|
+
function inherited(role, own, parents) {
|
|
83
|
+
const seen = /* @__PURE__ */ new Set();
|
|
84
|
+
const grants = [];
|
|
85
|
+
const visit = (name) => {
|
|
86
|
+
if (seen.has(name)) return;
|
|
87
|
+
seen.add(name);
|
|
88
|
+
grants.push(...own.get(name) ?? []);
|
|
89
|
+
for (const parent of parents.get(name) ?? []) visit(parent);
|
|
90
|
+
};
|
|
91
|
+
visit(role);
|
|
92
|
+
return grants;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Casbin RBAC policy lines as PermDock roles. A `p` line whose subject is a
|
|
96
|
+
* role becomes a grant; a role that inherits another (`g, editor, viewer`)
|
|
97
|
+
* holds its grants too, flattened, because code roles do not nest. A `g` line
|
|
98
|
+
* for a user becomes an assignment the application loads as a membership.
|
|
99
|
+
*/
|
|
100
|
+
function importCasbin(model, policy) {
|
|
101
|
+
const lines = policyLines(policy);
|
|
102
|
+
const skipped = [];
|
|
103
|
+
const width = model.domains ? 4 : 3;
|
|
104
|
+
const roleNames = /* @__PURE__ */ new Set();
|
|
105
|
+
for (const line of lines) if (line.cells[0] === "g" && line.cells[2] !== void 0) roleNames.add(line.cells[2]);
|
|
106
|
+
const parents = /* @__PURE__ */ new Map();
|
|
107
|
+
const assignments = [];
|
|
108
|
+
for (const line of lines.filter((item) => item.cells[0] === "g")) {
|
|
109
|
+
const [, member, role, domain] = line.cells;
|
|
110
|
+
if (member === void 0 || role === void 0) {
|
|
111
|
+
skipped.push({
|
|
112
|
+
line: line.number,
|
|
113
|
+
text: line.text,
|
|
114
|
+
reason: "malformed",
|
|
115
|
+
detail: "a g line names a member and a role"
|
|
116
|
+
});
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
if (roleNames.has(member)) parents.set(member, [...parents.get(member) ?? [], role]);
|
|
120
|
+
else assignments.push({
|
|
121
|
+
user: member,
|
|
122
|
+
role,
|
|
123
|
+
...domain === void 0 || domain === "" ? {} : { domain }
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
const own = /* @__PURE__ */ new Map();
|
|
127
|
+
const actions = /* @__PURE__ */ new Map();
|
|
128
|
+
for (const line of lines.filter((item) => item.cells[0] === "p")) {
|
|
129
|
+
const cells = line.cells.slice(1);
|
|
130
|
+
const subject = cells[0] ?? "";
|
|
131
|
+
const domain = model.domains ? cells[1] : void 0;
|
|
132
|
+
const [object, action] = cells.slice(model.domains ? 2 : 1);
|
|
133
|
+
const eft = cells[width];
|
|
134
|
+
const skip = (reason, detail) => {
|
|
135
|
+
skipped.push({
|
|
136
|
+
line: line.number,
|
|
137
|
+
text: line.text,
|
|
138
|
+
reason,
|
|
139
|
+
detail,
|
|
140
|
+
...eft === "deny" ? { deny: true } : {}
|
|
141
|
+
});
|
|
142
|
+
};
|
|
143
|
+
if (object === void 0 || action === void 0) {
|
|
144
|
+
skip("malformed", `a p line has ${String(width)} fields`);
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
if (!roleNames.has(subject)) {
|
|
148
|
+
skip("user-grant", `${subject} is not a role any g line names; PermDock grants roles, never users`);
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
if (domain !== void 0 && domain !== "*") {
|
|
152
|
+
skip("domain-grant", `the grant holds only in domain ${domain}; a per-tenant grant is a custom role (CustomRoleSource)`);
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
if (eft === "deny" && !model.denies) {
|
|
156
|
+
skip("deny-without-effect", "the model's effect never applies a deny");
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
if (!isIdentifier(object) || !isIdentifier(action)) {
|
|
160
|
+
skip("not-an-identifier", `${object}.${action} is not a permission key; patterns and paths do not import`);
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
const set = actions.get(object) ?? /* @__PURE__ */ new Set();
|
|
164
|
+
actions.set(object, set);
|
|
165
|
+
set.add(action);
|
|
166
|
+
own.set(subject, [...own.get(subject) ?? [], {
|
|
167
|
+
effect: eft === "deny" ? "deny" : "allow",
|
|
168
|
+
resource: object,
|
|
169
|
+
action
|
|
170
|
+
}]);
|
|
171
|
+
}
|
|
172
|
+
return {
|
|
173
|
+
actions,
|
|
174
|
+
roles: [...roleNames].map((name) => ({
|
|
175
|
+
name,
|
|
176
|
+
grants: inherited(name, own, parents)
|
|
177
|
+
})),
|
|
178
|
+
assignments,
|
|
179
|
+
skipped
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
function readText(cwd, flag, path) {
|
|
183
|
+
if (path === void 0) return { error: `casbin import needs ${flag} <file>` };
|
|
184
|
+
const full = resolve(cwd, path);
|
|
185
|
+
return existsSync(full) ? readFileSync(full, "utf8") : { error: `casbin import ${flag}: ${path} does not exist` };
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* `permdock casbin import`: an RBAC model and its policy CSV into a
|
|
189
|
+
* `permissions` and `policy` module, with user assignments as data. Exits 1
|
|
190
|
+
* when a deny line did not import, because leaving one out would widen access.
|
|
191
|
+
*/
|
|
192
|
+
function runCasbinImport(input) {
|
|
193
|
+
if (input.out === void 0) return {
|
|
194
|
+
code: 2,
|
|
195
|
+
output: "casbin import needs --out <file>"
|
|
196
|
+
};
|
|
197
|
+
const modelText = readText(input.cwd, "--model", input.model);
|
|
198
|
+
const policyText = readText(input.cwd, "--policy", input.policy);
|
|
199
|
+
for (const read of [modelText, policyText]) if (typeof read !== "string") return {
|
|
200
|
+
code: 2,
|
|
201
|
+
output: read.error
|
|
202
|
+
};
|
|
203
|
+
const model = readCasbinModel(String(modelText));
|
|
204
|
+
if ("refused" in model) return {
|
|
205
|
+
code: 2,
|
|
206
|
+
output: `casbin import --model: ${model.refused}`
|
|
207
|
+
};
|
|
208
|
+
const imported = importCasbin(model, String(policyText));
|
|
209
|
+
applyFiles(input.cwd, [{
|
|
210
|
+
path: input.out,
|
|
211
|
+
text: emitPolicyModule({
|
|
212
|
+
generator: "casbin import",
|
|
213
|
+
actions: imported.actions,
|
|
214
|
+
roles: imported.roles,
|
|
215
|
+
exports: { assignments: imported.assignments }
|
|
216
|
+
})
|
|
217
|
+
}]);
|
|
218
|
+
const droppedDeny = imported.skipped.some((item) => item.deny === true);
|
|
219
|
+
const code = droppedDeny ? 1 : 0;
|
|
220
|
+
if (input.json) return {
|
|
221
|
+
code,
|
|
222
|
+
output: JSON.stringify({
|
|
223
|
+
out: input.out,
|
|
224
|
+
assignments: imported.assignments.length,
|
|
225
|
+
skipped: imported.skipped
|
|
226
|
+
})
|
|
227
|
+
};
|
|
228
|
+
return {
|
|
229
|
+
code,
|
|
230
|
+
output: [...imported.skipped.map((item) => `${item.reason}: line ${String(item.line)} (${item.text}): ${item.detail}`), `casbin import: wrote ${String(imported.roles.length)} role(s) and ${String(imported.assignments.length)} assignment(s) to ${input.out}, skipped ${String(imported.skipped.length)}${droppedDeny ? "; a deny line did not import, so the policy allows more than the model: map it by hand" : ""}`].join("\n")
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
//#endregion
|
|
234
|
+
export { runCasbinImport };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { t as defineLeaf } from "./command-L8EstFNm.js";
|
|
2
|
+
import { c as given, l as outFlag, o as fileOut } from "./flags-C3DktBDY.js";
|
|
3
|
+
//#region src/cli/commands/casl.ts
|
|
4
|
+
const caslImport = defineLeaf({
|
|
5
|
+
flags: {
|
|
6
|
+
rules: {
|
|
7
|
+
type: "string",
|
|
8
|
+
description: "JSON of { [role]: rules }, each role's ability.rules or packRules output",
|
|
9
|
+
valueHint: "file"
|
|
10
|
+
},
|
|
11
|
+
...outFlag
|
|
12
|
+
},
|
|
13
|
+
async run(ctx, { flags }) {
|
|
14
|
+
const { runCaslImport } = await import("./casl-DjEDhTCP.js");
|
|
15
|
+
return runCaslImport({
|
|
16
|
+
cwd: ctx.cwd,
|
|
17
|
+
rules: given(flags.rules),
|
|
18
|
+
out: fileOut("casl import", flags.out),
|
|
19
|
+
json: ctx.json
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
//#endregion
|
|
24
|
+
export { caslImport };
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import { r as isRecord } from "./compact-CAf557ZB.js";
|
|
2
|
+
import { t as applyFiles } from "./files-C5ZI27eV.js";
|
|
3
|
+
import { n as isIdentifier, t as emitPolicyModule } from "./policy-module-CTlwMvLI.js";
|
|
4
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
5
|
+
import { resolve } from "node:path";
|
|
6
|
+
//#region src/cli/importers/casl.ts
|
|
7
|
+
const CRUD = [
|
|
8
|
+
"create",
|
|
9
|
+
"read",
|
|
10
|
+
"update",
|
|
11
|
+
"delete"
|
|
12
|
+
];
|
|
13
|
+
const OPERATORS = {
|
|
14
|
+
$eq: "eq",
|
|
15
|
+
$ne: "ne",
|
|
16
|
+
$gt: "gt",
|
|
17
|
+
$gte: "gte",
|
|
18
|
+
$lt: "lt",
|
|
19
|
+
$lte: "lte",
|
|
20
|
+
$in: "in",
|
|
21
|
+
$nin: "notIn"
|
|
22
|
+
};
|
|
23
|
+
const PRINCIPAL_TEMPLATE = /^\$\{user\.([A-Za-z_$][A-Za-z0-9_$]*)\}$/u;
|
|
24
|
+
function list(value) {
|
|
25
|
+
if (value === void 0) return [];
|
|
26
|
+
return typeof value === "string" ? [value] : value;
|
|
27
|
+
}
|
|
28
|
+
function isStrings(value) {
|
|
29
|
+
return typeof value === "string" || Array.isArray(value) && value.every((item) => typeof item === "string");
|
|
30
|
+
}
|
|
31
|
+
/** `packRules` joins a list into one comma-separated string. */
|
|
32
|
+
function split(item) {
|
|
33
|
+
return typeof item === "string" && item.includes(",") ? item.split(",") : item;
|
|
34
|
+
}
|
|
35
|
+
/** A rule in either shape: the object form, or `packRules`' `[action, subject, conditions, inverted, fields]`. */
|
|
36
|
+
function readRule(value) {
|
|
37
|
+
if (Array.isArray(value)) {
|
|
38
|
+
const [action, subject, conditions, inverted, fields] = value;
|
|
39
|
+
return readRule({
|
|
40
|
+
action: split(action),
|
|
41
|
+
subject: split(subject),
|
|
42
|
+
...isRecord(conditions) ? { conditions } : {},
|
|
43
|
+
...inverted === 1 || inverted === true ? { inverted: true } : {},
|
|
44
|
+
...fields === void 0 || fields === 0 ? {} : { fields: split(fields) }
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
if (!isRecord(value) || !isStrings(value["action"])) return;
|
|
48
|
+
const { subject, fields, conditions, inverted } = value;
|
|
49
|
+
if (subject !== void 0 && !isStrings(subject) || fields !== void 0 && !isStrings(fields) || conditions !== void 0 && !isRecord(conditions) || inverted !== void 0 && typeof inverted !== "boolean") return;
|
|
50
|
+
return {
|
|
51
|
+
action: value["action"],
|
|
52
|
+
...subject === void 0 ? {} : { subject },
|
|
53
|
+
...fields === void 0 ? {} : { fields },
|
|
54
|
+
...conditions === void 0 ? {} : { conditions },
|
|
55
|
+
...inverted === true ? { inverted: true } : {}
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/** A CASL subject type as a resource key: `BlogPost` becomes `blogPost`. */
|
|
59
|
+
function resourceKey(subject) {
|
|
60
|
+
return `${subject.slice(0, 1).toLowerCase()}${subject.slice(1)}`;
|
|
61
|
+
}
|
|
62
|
+
function isUnsupported(read) {
|
|
63
|
+
return "unsupported" in read;
|
|
64
|
+
}
|
|
65
|
+
function readValue(value) {
|
|
66
|
+
if (typeof value === "string") {
|
|
67
|
+
const principal = PRINCIPAL_TEMPLATE.exec(value)?.[1];
|
|
68
|
+
return { value: principal === void 0 ? value : { principal } };
|
|
69
|
+
}
|
|
70
|
+
if (value === null || typeof value === "number" || typeof value === "boolean") return { value };
|
|
71
|
+
if (Array.isArray(value)) {
|
|
72
|
+
const items = [];
|
|
73
|
+
for (const item of value) {
|
|
74
|
+
const read = readValue(item);
|
|
75
|
+
if (isUnsupported(read)) return read;
|
|
76
|
+
items.push(read.value);
|
|
77
|
+
}
|
|
78
|
+
return { value: items };
|
|
79
|
+
}
|
|
80
|
+
return { unsupported: "a nested object value" };
|
|
81
|
+
}
|
|
82
|
+
/** The Mongo-query subset CASL conditions use, as a `where`; anything else is reported by name. */
|
|
83
|
+
function readConditions(conditions) {
|
|
84
|
+
const parts = [];
|
|
85
|
+
for (const [key, value] of Object.entries(conditions)) {
|
|
86
|
+
if (key === "$and" || key === "$or" || key === "$nor") {
|
|
87
|
+
if (!Array.isArray(value)) return { unsupported: `${key} without a list` };
|
|
88
|
+
const items = [];
|
|
89
|
+
for (const item of value) {
|
|
90
|
+
const read = isRecord(item) ? readConditions(item) : { unsupported: `${key} item` };
|
|
91
|
+
if (isUnsupported(read)) return read;
|
|
92
|
+
items.push(read);
|
|
93
|
+
}
|
|
94
|
+
parts.push(key === "$and" ? { and: items } : key === "$or" ? { or: items } : { not: { or: items } });
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
if (key.startsWith("$")) return { unsupported: key };
|
|
98
|
+
if (key.includes(".")) return { unsupported: `the nested field ${key}` };
|
|
99
|
+
const read = readField(key, value);
|
|
100
|
+
if (isUnsupported(read)) return read;
|
|
101
|
+
parts.push(read);
|
|
102
|
+
}
|
|
103
|
+
return parts.length === 1 && parts[0] !== void 0 ? parts[0] : { and: parts };
|
|
104
|
+
}
|
|
105
|
+
function readField(field, value) {
|
|
106
|
+
if (!isRecord(value)) {
|
|
107
|
+
const read = readValue(value);
|
|
108
|
+
return isUnsupported(read) ? read : {
|
|
109
|
+
field,
|
|
110
|
+
op: "eq",
|
|
111
|
+
value: read.value
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
const parts = [];
|
|
115
|
+
for (const [operator, operand] of Object.entries(value)) {
|
|
116
|
+
if (operator === "$exists") {
|
|
117
|
+
parts.push({
|
|
118
|
+
field,
|
|
119
|
+
op: "isNull",
|
|
120
|
+
value: operand !== true
|
|
121
|
+
});
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
const op = OPERATORS[operator];
|
|
125
|
+
if (op === void 0) return { unsupported: operator };
|
|
126
|
+
const read = readValue(operand);
|
|
127
|
+
if (isUnsupported(read)) return read;
|
|
128
|
+
parts.push({
|
|
129
|
+
field,
|
|
130
|
+
op,
|
|
131
|
+
value: read.value
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
return parts.length === 1 && parts[0] !== void 0 ? parts[0] : { and: parts };
|
|
135
|
+
}
|
|
136
|
+
/** The subjects and the actions each is named with, `all` and `manage` aside. */
|
|
137
|
+
function collectActions(rule, subjects, actionsBySubject) {
|
|
138
|
+
for (const subject of list(rule.subject).filter((item) => item !== "all")) {
|
|
139
|
+
subjects.add(subject);
|
|
140
|
+
const actions = actionsBySubject.get(subject) ?? /* @__PURE__ */ new Set();
|
|
141
|
+
actionsBySubject.set(subject, actions);
|
|
142
|
+
for (const action of list(rule.action)) if (action !== "manage") actions.add(action);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* CASL rules per role, as PermDock roles: `inverted` rules are denies,
|
|
147
|
+
* `manage` and `all` expand to every action and subject the rules name, and
|
|
148
|
+
* conditions in the portable Mongo-query subset become `where`. A deny whose
|
|
149
|
+
* condition does not import keeps its effect without the condition, so the
|
|
150
|
+
* import can only deny more, never less.
|
|
151
|
+
*/
|
|
152
|
+
function importCasl(rulesByRole) {
|
|
153
|
+
const parsed = [];
|
|
154
|
+
const skipped = [];
|
|
155
|
+
const subjects = /* @__PURE__ */ new Set();
|
|
156
|
+
const actionsBySubject = /* @__PURE__ */ new Map();
|
|
157
|
+
for (const [role, rules] of Object.entries(rulesByRole)) for (const [index, raw] of rules.entries()) {
|
|
158
|
+
const rule = readRule(raw);
|
|
159
|
+
if (rule === void 0) {
|
|
160
|
+
skipped.push({
|
|
161
|
+
role,
|
|
162
|
+
rule: index,
|
|
163
|
+
reason: "not-a-rule",
|
|
164
|
+
detail: "not a CASL raw rule"
|
|
165
|
+
});
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
parsed.push({
|
|
169
|
+
role,
|
|
170
|
+
index,
|
|
171
|
+
rule
|
|
172
|
+
});
|
|
173
|
+
collectActions(rule, subjects, actionsBySubject);
|
|
174
|
+
}
|
|
175
|
+
const actionsOf = (subject) => {
|
|
176
|
+
const named = [...actionsBySubject.get(subject) ?? []].filter(isIdentifier);
|
|
177
|
+
return named.length === 0 ? CRUD : named;
|
|
178
|
+
};
|
|
179
|
+
const resources = /* @__PURE__ */ new Map();
|
|
180
|
+
const roles = /* @__PURE__ */ new Map();
|
|
181
|
+
for (const { role, index, rule } of parsed) {
|
|
182
|
+
const grants = roles.get(role) ?? [];
|
|
183
|
+
roles.set(role, grants);
|
|
184
|
+
const named = list(rule.subject);
|
|
185
|
+
if (named.length === 0) {
|
|
186
|
+
skipped.push({
|
|
187
|
+
role,
|
|
188
|
+
rule: index,
|
|
189
|
+
reason: "no-subject",
|
|
190
|
+
detail: "a claim-only rule (no subject) has no resource to grant on"
|
|
191
|
+
});
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
const effect = rule.inverted === true ? "deny" : "allow";
|
|
195
|
+
let where;
|
|
196
|
+
if (rule.conditions !== void 0) {
|
|
197
|
+
const read = readConditions(rule.conditions);
|
|
198
|
+
if (isUnsupported(read)) {
|
|
199
|
+
if (effect === "allow") {
|
|
200
|
+
skipped.push({
|
|
201
|
+
role,
|
|
202
|
+
rule: index,
|
|
203
|
+
reason: "unsupported-condition",
|
|
204
|
+
detail: `${read.unsupported} has no portable condition; the allow is left out`
|
|
205
|
+
});
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
skipped.push({
|
|
209
|
+
role,
|
|
210
|
+
rule: index,
|
|
211
|
+
reason: "deny-widened",
|
|
212
|
+
detail: `${read.unsupported} has no portable condition; the deny applies without it`
|
|
213
|
+
});
|
|
214
|
+
} else where = read;
|
|
215
|
+
}
|
|
216
|
+
const fields = list(rule.fields);
|
|
217
|
+
const expanded = named.includes("all") ? [.../* @__PURE__ */ new Set([...named.filter((item) => item !== "all"), ...subjects])] : named;
|
|
218
|
+
for (const subject of expanded) {
|
|
219
|
+
const key = resourceKey(subject);
|
|
220
|
+
for (const action of list(rule.action).flatMap((item) => item === "manage" ? actionsOf(subject) : [item])) {
|
|
221
|
+
if (!isIdentifier(key) || !isIdentifier(action)) {
|
|
222
|
+
skipped.push({
|
|
223
|
+
role,
|
|
224
|
+
rule: index,
|
|
225
|
+
reason: "not-an-identifier",
|
|
226
|
+
detail: `${subject}.${action} is not a permission key`
|
|
227
|
+
});
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
const actions = resources.get(key) ?? /* @__PURE__ */ new Set();
|
|
231
|
+
resources.set(key, actions);
|
|
232
|
+
actions.add(action);
|
|
233
|
+
grants.push({
|
|
234
|
+
effect,
|
|
235
|
+
resource: key,
|
|
236
|
+
action,
|
|
237
|
+
...where === void 0 ? {} : { where },
|
|
238
|
+
...fields.length === 0 ? {} : { fields }
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
return {
|
|
244
|
+
actions: resources,
|
|
245
|
+
roles: [...roles.entries()].map(([name, grants]) => ({
|
|
246
|
+
name,
|
|
247
|
+
grants
|
|
248
|
+
})),
|
|
249
|
+
skipped
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
/** `permdock casl import`: CASL rules per role into a `permissions` and `policy` module. */
|
|
253
|
+
function runCaslImport(input) {
|
|
254
|
+
if (input.rules === void 0 || input.out === void 0) return {
|
|
255
|
+
code: 2,
|
|
256
|
+
output: "casl import needs --rules <file> and --out <file>"
|
|
257
|
+
};
|
|
258
|
+
const path = resolve(input.cwd, input.rules);
|
|
259
|
+
if (!existsSync(path)) return {
|
|
260
|
+
code: 2,
|
|
261
|
+
output: `casl import --rules: ${input.rules} does not exist`
|
|
262
|
+
};
|
|
263
|
+
let parsed;
|
|
264
|
+
try {
|
|
265
|
+
parsed = JSON.parse(readFileSync(path, "utf8"));
|
|
266
|
+
} catch {
|
|
267
|
+
return {
|
|
268
|
+
code: 2,
|
|
269
|
+
output: `casl import --rules: ${input.rules} is not JSON`
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
if (!isRecord(parsed) || !Object.values(parsed).every((rules) => Array.isArray(rules))) return {
|
|
273
|
+
code: 2,
|
|
274
|
+
output: "casl import --rules: expected { [role]: rules }, each role's ability.rules or packRules output"
|
|
275
|
+
};
|
|
276
|
+
const imported = importCasl(parsed);
|
|
277
|
+
applyFiles(input.cwd, [{
|
|
278
|
+
path: input.out,
|
|
279
|
+
text: emitPolicyModule({
|
|
280
|
+
generator: "casl import",
|
|
281
|
+
actions: imported.actions,
|
|
282
|
+
roles: imported.roles
|
|
283
|
+
})
|
|
284
|
+
}]);
|
|
285
|
+
if (input.json) return {
|
|
286
|
+
code: 0,
|
|
287
|
+
output: JSON.stringify({
|
|
288
|
+
out: input.out,
|
|
289
|
+
skipped: imported.skipped
|
|
290
|
+
})
|
|
291
|
+
};
|
|
292
|
+
const grants = imported.roles.reduce((total, role) => total + role.grants.length, 0);
|
|
293
|
+
return {
|
|
294
|
+
code: 0,
|
|
295
|
+
output: [...imported.skipped.map((item) => `${item.reason}: role ${item.role}, rule ${String(item.rule)}: ${item.detail}`), `casl import: wrote ${String(imported.roles.length)} role(s) with ${String(grants)} grant(s) to ${input.out}, skipped ${String(imported.skipped.filter((item) => item.reason !== "deny-widened").length)}`].join("\n")
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
//#endregion
|
|
299
|
+
export { runCaslImport };
|
package/dist/catalog/index.d.ts
CHANGED
|
@@ -1,4 +1,56 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { T as Policy, rr as Principal } from "../policy-types-DzwivBgR.js";
|
|
2
|
+
import { a as PolicyDocument } from "../hosted-DBDX0M-P.js";
|
|
3
|
+
import { a as CatalogDocument, c as CatalogOperation, d as CatalogRole, f as CatalogScope, h as CatalogValidity, i as CatalogDelegation, l as CatalogPermission, m as CatalogUsage, n as CatalogApproval, o as CatalogGrant, p as CatalogSupportAccess, r as CatalogBreakGlass, s as CatalogOAuthScope, t as CatalogActivation, u as CatalogResource } from "../types-CZTnPFzM.js";
|
|
4
|
+
import { a as CatalogFinding, i as CatalogEventData } from "../sink-Bj_lDUDq.js";
|
|
5
|
+
import { a as pushedPolicy, i as parsePushedPolicy, n as PushedGrant, r as PushedPolicy, t as PUSHED_POLICY_SCHEMA } from "../pushed-policy-BImMTTIM.js";
|
|
6
|
+
import { StandardSchemaV1 } from "@standard-schema/spec";
|
|
7
|
+
//#region src/catalog/drift.d.ts
|
|
8
|
+
/**
|
|
9
|
+
* The hosted grants of `document` that `policy` no longer accepts, as drift
|
|
10
|
+
* findings with the grant id set. A grant dropped for a reason the catalog
|
|
11
|
+
* cannot cause (`non-portable`, `invalid`) is not a finding.
|
|
12
|
+
*/
|
|
13
|
+
export declare function hostedGrantFindings(policy: Policy, document: PolicyDocument | null): readonly CatalogFinding[];
|
|
14
|
+
type CatalogDriftInput = {
|
|
15
|
+
readonly previous: CatalogDocument;
|
|
16
|
+
readonly next: CatalogDocument;
|
|
17
|
+
/** The policy rebuilt from `next` (`policyFromCatalog`), which live hosted grants must still pass. */
|
|
18
|
+
readonly policy: Policy;
|
|
19
|
+
/** The live hosted grants; absent or `null` when the environment has none. */
|
|
20
|
+
readonly document?: PolicyDocument | null;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* The `data` of a `com.permdock.catalog.drifted` event: the hosted grants
|
|
24
|
+
* `next` breaks, then the operations whose risk rose or whose approval was
|
|
25
|
+
* removed between `previous` and `next`.
|
|
26
|
+
*/
|
|
27
|
+
export declare function catalogDrift(input: CatalogDriftInput): CatalogEventData;
|
|
28
|
+
//#endregion
|
|
29
|
+
//#region src/catalog/json-schema-validator.d.ts
|
|
30
|
+
/**
|
|
31
|
+
* A Standard Schema that validates against a catalog resource's JSON Schema.
|
|
32
|
+
* `null` (no JSON Schema in the catalog) gives `undefined`. A schema that uses
|
|
33
|
+
* a keyword outside the supported subset rejects every value, so a hosted
|
|
34
|
+
* check never validates less than the code did.
|
|
35
|
+
*/
|
|
36
|
+
export declare function resourceSchemaFromJson(json: unknown): StandardSchemaV1 | undefined;
|
|
37
|
+
//#endregion
|
|
38
|
+
//#region src/catalog/operation-findings.d.ts
|
|
39
|
+
/** What `operationFindings` reads of a catalog: a `CatalogDocument` fits. */
|
|
40
|
+
type OperationCatalog = {
|
|
41
|
+
readonly permissions: readonly {
|
|
42
|
+
readonly key: string;
|
|
43
|
+
readonly approvals?: readonly unknown[];
|
|
44
|
+
}[];
|
|
45
|
+
readonly operations?: readonly CatalogOperation[];
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Operations, matched by name, whose `meta.risk` rose or whose permission
|
|
49
|
+
* stopped requiring approval between two catalogs. A new or removed
|
|
50
|
+
* operation is not a finding.
|
|
51
|
+
*/
|
|
52
|
+
export declare function operationFindings(previous: OperationCatalog, next: OperationCatalog): readonly CatalogFinding[];
|
|
53
|
+
//#endregion
|
|
2
54
|
//#region src/catalog/parse.d.ts
|
|
3
55
|
/**
|
|
4
56
|
* Reads a `permissions.catalog.json` document (parsed, or the JSON text) and
|
|
@@ -9,4 +61,24 @@ export declare function parseCatalog(json: unknown): CatalogDocument;
|
|
|
9
61
|
/** Keys of the permissions the catalog marks `rowConditions: true`: the SQL helpers alone cannot enforce them. */
|
|
10
62
|
export declare function rowConditionKeys(catalog: CatalogDocument): ReadonlySet<string>;
|
|
11
63
|
//#endregion
|
|
12
|
-
|
|
64
|
+
//#region src/catalog/policy-from-catalog.d.ts
|
|
65
|
+
type PolicyFromCatalogOptions<TUser = unknown> = {
|
|
66
|
+
/** Maps the request's user to the subject; the identity function when absent. */
|
|
67
|
+
readonly subject?: (user: TUser) => Principal | null;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Rebuilds an evaluable `Policy` from a catalog (`permissions.catalog.json`)
|
|
71
|
+
* and the policy `permdock cloud push` sent with it, for a service that holds
|
|
72
|
+
* no application code: the hosted AuthZEN endpoint or a `mergeHostedGrants`
|
|
73
|
+
* pre-check. Throws `PermDockValidationError` when either input is malformed
|
|
74
|
+
* or the two disagree.
|
|
75
|
+
*
|
|
76
|
+
* What only code can answer fails closed: an allow whose condition is a
|
|
77
|
+
* closure never grants and such a deny always applies; a resource schema
|
|
78
|
+
* keyword outside the supported JSON Schema subset rejects every value; a
|
|
79
|
+
* support role has no one who may consent. Grant levels and OAuth scopes
|
|
80
|
+
* are not in a catalog, so the rebuilt policy has none.
|
|
81
|
+
*/
|
|
82
|
+
export declare function policyFromCatalog<TUser = unknown>(catalogInput: unknown, pushedInput: unknown, options?: PolicyFromCatalogOptions<TUser>): Policy<TUser>;
|
|
83
|
+
//#endregion
|
|
84
|
+
export { type CatalogActivation, type CatalogApproval, type CatalogBreakGlass, type CatalogDelegation, type CatalogDocument, type CatalogDriftInput, type CatalogGrant, type CatalogOAuthScope, type CatalogOperation, type CatalogPermission, type CatalogResource, type CatalogRole, type CatalogScope, type CatalogSupportAccess, type CatalogUsage, type CatalogValidity, PUSHED_POLICY_SCHEMA, type PolicyFromCatalogOptions, type PushedGrant, type PushedPolicy, parsePushedPolicy, pushedPolicy };
|