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
|
@@ -1,662 +0,0 @@
|
|
|
1
|
-
import { n as isReadonlyArray, t as compact } from "./compact-y6vfu2_f.js";
|
|
2
|
-
import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
|
|
3
|
-
//#region src/core/paths.ts
|
|
4
|
-
const FORBIDDEN_KEYS = /* @__PURE__ */ new Set([
|
|
5
|
-
"__proto__",
|
|
6
|
-
"constructor",
|
|
7
|
-
"prototype"
|
|
8
|
-
]);
|
|
9
|
-
function isForbiddenKey(key) {
|
|
10
|
-
return FORBIDDEN_KEYS.has(key);
|
|
11
|
-
}
|
|
12
|
-
function assertSafeKey(key, context) {
|
|
13
|
-
if (key.length === 0 || key.split(".").some(isForbiddenKey)) throw new Error(`PermDock: forbidden ${context} key '${key}'`);
|
|
14
|
-
}
|
|
15
|
-
function ownGet(object, key) {
|
|
16
|
-
if (isForbiddenKey(key)) return;
|
|
17
|
-
if (!Object.hasOwn(object, key)) return;
|
|
18
|
-
return object[key];
|
|
19
|
-
}
|
|
20
|
-
function ownKeys(object) {
|
|
21
|
-
return Object.keys(object).filter((key) => !isForbiddenKey(key));
|
|
22
|
-
}
|
|
23
|
-
function splitPath(path) {
|
|
24
|
-
return path.split(".").filter((segment) => segment.length > 0);
|
|
25
|
-
}
|
|
26
|
-
function readPath(root, path) {
|
|
27
|
-
const segments = splitPath(path);
|
|
28
|
-
let current = root;
|
|
29
|
-
for (const segment of segments) {
|
|
30
|
-
if (isForbiddenKey(segment)) return;
|
|
31
|
-
if (current === null || current === void 0 || typeof current !== "object") return;
|
|
32
|
-
current = ownGet(current, segment);
|
|
33
|
-
}
|
|
34
|
-
return current;
|
|
35
|
-
}
|
|
36
|
-
//#endregion
|
|
37
|
-
//#region src/core/permissions.ts
|
|
38
|
-
const RESOURCE_BRAND = Symbol.for("permdock.resource");
|
|
39
|
-
const TREE_REGISTRY = Symbol.for("permdock.registry");
|
|
40
|
-
const NODE_RESOURCE = Symbol.for("permdock.resource");
|
|
41
|
-
const TREE_LEAVES = Symbol.for("permdock.leaves");
|
|
42
|
-
const LEAF_FORMER = Symbol.for("permdock.former");
|
|
43
|
-
/** The edge's group resources with their relation and id column. */
|
|
44
|
-
function groupEntries(spec) {
|
|
45
|
-
const groups = spec.groups;
|
|
46
|
-
if (groups === void 0) return [];
|
|
47
|
-
return Object.entries(groups.resources).map(([resource, group]) => typeof group === "string" ? {
|
|
48
|
-
resource,
|
|
49
|
-
relation: group,
|
|
50
|
-
subject: spec.subject ?? "user_id",
|
|
51
|
-
typed: false
|
|
52
|
-
} : {
|
|
53
|
-
resource,
|
|
54
|
-
relation: group.relation,
|
|
55
|
-
subject: group.subject ?? spec.subject ?? "user_id",
|
|
56
|
-
typed: group.subject !== void 0
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
function restrictedStops(node, path) {
|
|
60
|
-
return node?.restricted !== void 0 && (node.restrictedStops === void 0 || node.restrictedStops.includes(path));
|
|
61
|
-
}
|
|
62
|
-
function restrictedFor(node, path) {
|
|
63
|
-
return restrictedStops(node, path) ? node?.restricted : void 0;
|
|
64
|
-
}
|
|
65
|
-
function isFieldRelation(relation) {
|
|
66
|
-
return relation !== void 0 && "field" in relation;
|
|
67
|
-
}
|
|
68
|
-
function isEdgeRelation(relation) {
|
|
69
|
-
return relation !== void 0 && "edge" in relation;
|
|
70
|
-
}
|
|
71
|
-
function isPrincipalRelation(relation) {
|
|
72
|
-
return relation !== void 0 && "principal" in relation;
|
|
73
|
-
}
|
|
74
|
-
function isComputedRelation(relation) {
|
|
75
|
-
return relation !== void 0 && !("field" in relation) && !("edge" in relation) && !("principal" in relation);
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* The relations whose holders hold `name` on `node`: `name` itself when it
|
|
79
|
-
* has a source, then everything it includes, transitively, each once.
|
|
80
|
-
* `definePermissions` rejects cycles and unknown names, so this terminates.
|
|
81
|
-
*/
|
|
82
|
-
function expandRelation(node, name) {
|
|
83
|
-
const out = [];
|
|
84
|
-
const seen = /* @__PURE__ */ new Set();
|
|
85
|
-
const visit = (current) => {
|
|
86
|
-
if (seen.has(current)) return;
|
|
87
|
-
seen.add(current);
|
|
88
|
-
const spec = node?.relations[current];
|
|
89
|
-
if (spec === void 0) return;
|
|
90
|
-
if (!isComputedRelation(spec)) out.push(current);
|
|
91
|
-
for (const included of spec.includes ?? []) visit(included);
|
|
92
|
-
};
|
|
93
|
-
visit(name);
|
|
94
|
-
return out;
|
|
95
|
-
}
|
|
96
|
-
/** Whether `node` names itself as its parent (nested folders, sub-teams, reporting lines). */
|
|
97
|
-
function isSelfParented(node) {
|
|
98
|
-
return node?.parent !== void 0 && node.parent.resource === node.name;
|
|
99
|
-
}
|
|
100
|
-
function isStandardSchema(value) {
|
|
101
|
-
return value !== null && typeof value === "object" && "~standard" in value && typeof value["~standard"]?.version === "number";
|
|
102
|
-
}
|
|
103
|
-
function isResourceInit(value) {
|
|
104
|
-
return value !== null && typeof value === "object" && RESOURCE_BRAND in value && value[RESOURCE_BRAND] === true;
|
|
105
|
-
}
|
|
106
|
-
function isResourceOptions(value) {
|
|
107
|
-
return value !== null && typeof value === "object" && !Array.isArray(value) && !isStandardSchema(value);
|
|
108
|
-
}
|
|
109
|
-
function metaFor(list, action) {
|
|
110
|
-
if (list === void 0 || Array.isArray(list)) return freezeDeep({});
|
|
111
|
-
const meta = list[action];
|
|
112
|
-
if (meta?.x !== void 0) {
|
|
113
|
-
assertMetaValue(meta.x, `meta.x of action '${action}'`, 0);
|
|
114
|
-
if (Array.isArray(meta.x)) throw new TypeError(`PermDock: meta.x of action '${action}' must be a JSON object`);
|
|
115
|
-
}
|
|
116
|
-
return freezeDeep({ ...meta });
|
|
117
|
-
}
|
|
118
|
-
const MAX_META_DEPTH = 8;
|
|
119
|
-
function assertMetaValue(value, label, depth) {
|
|
120
|
-
if (depth > MAX_META_DEPTH) throw new Error(`PermDock: ${label} nests deeper than ${MAX_META_DEPTH}`);
|
|
121
|
-
if (value === null || typeof value === "string" || typeof value === "boolean" || typeof value === "number" && Number.isFinite(value)) return;
|
|
122
|
-
if (Array.isArray(value)) {
|
|
123
|
-
for (const item of value) assertMetaValue(item, label, depth + 1);
|
|
124
|
-
return;
|
|
125
|
-
}
|
|
126
|
-
if (typeof value === "object" && Object.getPrototypeOf(value) === Object.prototype) {
|
|
127
|
-
for (const key of Object.keys(value)) {
|
|
128
|
-
assertSafeKey(key, "meta.x key");
|
|
129
|
-
assertMetaValue(Reflect.get(value, key), label, depth + 1);
|
|
130
|
-
}
|
|
131
|
-
return;
|
|
132
|
-
}
|
|
133
|
-
throw new Error(`PermDock: ${label} must be plain JSON`);
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* MCP and WebMCP tool hints from a permission's `meta`. Hints only inform the
|
|
137
|
-
* client; every call is still decided on the server.
|
|
138
|
-
*/
|
|
139
|
-
function annotationsFor(permission) {
|
|
140
|
-
const { meta } = permission;
|
|
141
|
-
const readOnlyHint = meta.readOnly ?? (permission.action === "read" || permission.action === "list");
|
|
142
|
-
return compact({
|
|
143
|
-
readOnlyHint,
|
|
144
|
-
destructiveHint: readOnlyHint ? void 0 : meta.destructive,
|
|
145
|
-
idempotentHint: meta.idempotent
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
function actionNames(list) {
|
|
149
|
-
if (list === void 0) return [];
|
|
150
|
-
if (isReadonlyArray(list)) return list;
|
|
151
|
-
return Object.keys(list);
|
|
152
|
-
}
|
|
153
|
-
function keyToScope(key) {
|
|
154
|
-
return key.replaceAll(".", ":");
|
|
155
|
-
}
|
|
156
|
-
function makeLeaf(key, resourceName, action, meta, kind, former) {
|
|
157
|
-
const leaf = {
|
|
158
|
-
key,
|
|
159
|
-
scope: keyToScope(key),
|
|
160
|
-
resource: resourceName,
|
|
161
|
-
action,
|
|
162
|
-
meta
|
|
163
|
-
};
|
|
164
|
-
Object.defineProperty(leaf, "kind", {
|
|
165
|
-
value: kind,
|
|
166
|
-
enumerable: false,
|
|
167
|
-
writable: false,
|
|
168
|
-
configurable: false
|
|
169
|
-
});
|
|
170
|
-
if (former !== void 0 && former.length > 0) Object.defineProperty(leaf, LEAF_FORMER, {
|
|
171
|
-
value: Object.freeze([...former].toSorted()),
|
|
172
|
-
enumerable: false,
|
|
173
|
-
writable: false,
|
|
174
|
-
configurable: false
|
|
175
|
-
});
|
|
176
|
-
return Object.freeze(leaf);
|
|
177
|
-
}
|
|
178
|
-
/**
|
|
179
|
-
* The keys `permission` was renamed from, sorted. Empty for a leaf without
|
|
180
|
-
* renames and for one that crossed a serialisation boundary.
|
|
181
|
-
*/
|
|
182
|
-
function formerKeys(permission) {
|
|
183
|
-
if (!Object.hasOwn(permission, LEAF_FORMER)) return [];
|
|
184
|
-
const value = Reflect.get(permission, LEAF_FORMER);
|
|
185
|
-
return isReadonlyArray(value) ? value.filter((item) => typeof item === "string") : [];
|
|
186
|
-
}
|
|
187
|
-
/** The OAuth scope strings `permission` used to have: each former key with `.` as `:`. */
|
|
188
|
-
function formerScopes(permission) {
|
|
189
|
-
return formerKeys(permission).map(keyToScope);
|
|
190
|
-
}
|
|
191
|
-
/** Former key to current key, for every leaf of `tree`. */
|
|
192
|
-
function renamedKeys(tree) {
|
|
193
|
-
const map = /* @__PURE__ */ new Map();
|
|
194
|
-
for (const leaf of listPermissions(tree)) for (const old of formerKeys(leaf)) map.set(old, leaf.key);
|
|
195
|
-
return map;
|
|
196
|
-
}
|
|
197
|
-
function resource(schemaOrOptions, options) {
|
|
198
|
-
if (schemaOrOptions === void 0 && options === void 0) throw new Error("PermDock: resource() requires a schema or options");
|
|
199
|
-
if (isStandardSchema(schemaOrOptions)) return {
|
|
200
|
-
[RESOURCE_BRAND]: true,
|
|
201
|
-
schema: schemaOrOptions,
|
|
202
|
-
options: options ?? {}
|
|
203
|
-
};
|
|
204
|
-
if (isResourceOptions(schemaOrOptions) && options === void 0) return {
|
|
205
|
-
[RESOURCE_BRAND]: true,
|
|
206
|
-
schema: void 0,
|
|
207
|
-
options: schemaOrOptions
|
|
208
|
-
};
|
|
209
|
-
throw new Error("PermDock: resource() first argument must be a schema or options");
|
|
210
|
-
}
|
|
211
|
-
const RESOURCE_NAME = /^[A-Za-z][A-Za-z0-9_-]*$/u;
|
|
212
|
-
/** Level names ride claims and grant keys (`key@level`), so they stay SQL- and claim-safe. */
|
|
213
|
-
const LEVEL_NAME = /^[a-z][a-z0-9_]*$/u;
|
|
214
|
-
const EDGE_TABLE = /^[A-Za-z_][A-Za-z0-9_]*(\.[A-Za-z_][A-Za-z0-9_]*)?$/u;
|
|
215
|
-
function restrictedStopsOf(name, option, parent, links) {
|
|
216
|
-
if (option.stops === void 0) return;
|
|
217
|
-
if (!Array.isArray(option.stops) || option.stops.length === 0) throw new Error(`PermDock: resource "${name}" restricted.stops must list 'parent' or link names`);
|
|
218
|
-
const stops = /* @__PURE__ */ new Set();
|
|
219
|
-
for (const path of option.stops) {
|
|
220
|
-
if (typeof path !== "string") throw new TypeError(`PermDock: resource "${name}" restricted.stops must list 'parent' or link names`);
|
|
221
|
-
if (path === "parent" ? parent === void 0 : !Object.hasOwn(links, path)) throw new Error(`PermDock: resource "${name}" restricted.stops names '${path}', which it does not declare`);
|
|
222
|
-
stops.add(path);
|
|
223
|
-
}
|
|
224
|
-
return Object.freeze([...stops].toSorted());
|
|
225
|
-
}
|
|
226
|
-
function normaliseRelation(resourceName, relationName, spec) {
|
|
227
|
-
if (typeof spec === "string") {
|
|
228
|
-
assertSafeKey(spec, "relation field");
|
|
229
|
-
return { field: spec };
|
|
230
|
-
}
|
|
231
|
-
const label = `relation '${relationName}' on '${resourceName}'`;
|
|
232
|
-
const includes = normaliseIncludes(label, spec.includes);
|
|
233
|
-
const kinds = [
|
|
234
|
-
"field",
|
|
235
|
-
"edge",
|
|
236
|
-
"principal"
|
|
237
|
-
].filter((kind) => kind in spec);
|
|
238
|
-
if (kinds.length === 0 && includes !== void 0) return { includes };
|
|
239
|
-
if (kinds.length !== 1) throw new Error(`PermDock: ${label} needs exactly one of field, edge, principal or includes`);
|
|
240
|
-
const withIncludes = includes === void 0 ? {} : { includes };
|
|
241
|
-
if (isEdgeRelation(spec)) {
|
|
242
|
-
if (!EDGE_TABLE.test(spec.edge)) throw new Error(`PermDock: ${label} has an unsafe edge table '${spec.edge}'`);
|
|
243
|
-
for (const column of [
|
|
244
|
-
spec.object,
|
|
245
|
-
spec.subject,
|
|
246
|
-
spec.expiresAt
|
|
247
|
-
]) if (column !== void 0) assertSafeKey(column, "edge column");
|
|
248
|
-
return {
|
|
249
|
-
edge: spec.edge,
|
|
250
|
-
...spec.object === void 0 ? {} : { object: spec.object },
|
|
251
|
-
...spec.subject === void 0 ? {} : { subject: spec.subject },
|
|
252
|
-
...spec.expiresAt === void 0 ? {} : { expiresAt: spec.expiresAt },
|
|
253
|
-
...spec.match === void 0 ? {} : { match: normaliseMatch(label, spec.match) },
|
|
254
|
-
...spec.groups === void 0 ? {} : { groups: normaliseGroups(label, spec.groups) },
|
|
255
|
-
...withIncludes
|
|
256
|
-
};
|
|
257
|
-
}
|
|
258
|
-
if (isPrincipalRelation(spec)) {
|
|
259
|
-
assertSafeKey(spec.principal, "relation principal");
|
|
260
|
-
for (const column of [spec.period?.startsAt, spec.period?.expiresAt]) if (column !== void 0) assertSafeKey(column, "relation period");
|
|
261
|
-
return spec.period === void 0 ? {
|
|
262
|
-
principal: spec.principal,
|
|
263
|
-
...withIncludes
|
|
264
|
-
} : {
|
|
265
|
-
principal: spec.principal,
|
|
266
|
-
period: { ...spec.period },
|
|
267
|
-
...withIncludes
|
|
268
|
-
};
|
|
269
|
-
}
|
|
270
|
-
const field = spec;
|
|
271
|
-
assertSafeKey(field.field, "relation field");
|
|
272
|
-
if (field.memberOf !== void 0 && includes !== void 0) throw new Error(`PermDock: ${label} is a memberOf relation and cannot include others`);
|
|
273
|
-
return field.memberOf === void 0 ? {
|
|
274
|
-
field: field.field,
|
|
275
|
-
...withIncludes
|
|
276
|
-
} : {
|
|
277
|
-
field: field.field,
|
|
278
|
-
memberOf: field.memberOf
|
|
279
|
-
};
|
|
280
|
-
}
|
|
281
|
-
function normaliseIncludes(label, includes) {
|
|
282
|
-
if (includes === void 0) return;
|
|
283
|
-
if (!Array.isArray(includes) || includes.length === 0) throw new Error(`PermDock: ${label} includes must be a non-empty list of relation names`);
|
|
284
|
-
for (const name of includes) {
|
|
285
|
-
if (typeof name !== "string") throw new TypeError(`PermDock: ${label} includes a non-string name`);
|
|
286
|
-
assertSafeKey(name, "included relation");
|
|
287
|
-
}
|
|
288
|
-
return [...new Set(includes)];
|
|
289
|
-
}
|
|
290
|
-
function normaliseMatch(label, match) {
|
|
291
|
-
const out = {};
|
|
292
|
-
const columns = Object.keys(match);
|
|
293
|
-
if (columns.length === 0) throw new Error(`PermDock: ${label} match needs at least one column`);
|
|
294
|
-
for (const column of columns) {
|
|
295
|
-
assertSafeKey(column, "edge match column");
|
|
296
|
-
const value = match[column];
|
|
297
|
-
if (typeof value !== "string" && typeof value !== "boolean" && !(typeof value === "number" && Number.isFinite(value))) throw new Error(`PermDock: ${label} match '${column}' must be a string, a finite number or a boolean`);
|
|
298
|
-
out[column] = value;
|
|
299
|
-
}
|
|
300
|
-
return out;
|
|
301
|
-
}
|
|
302
|
-
function normaliseGroups(label, groups) {
|
|
303
|
-
if (groups.column !== void 0) assertSafeKey(groups.column, "edge groups column");
|
|
304
|
-
const resources = {};
|
|
305
|
-
const names = Object.keys(groups.resources);
|
|
306
|
-
if (names.length === 0) throw new Error(`PermDock: ${label} groups needs at least one resource`);
|
|
307
|
-
for (const name of names) {
|
|
308
|
-
assertSafeKey(name, "group resource");
|
|
309
|
-
const group = groups.resources[name];
|
|
310
|
-
if (typeof group === "string") {
|
|
311
|
-
assertSafeKey(group, "group relation");
|
|
312
|
-
if (groups.column === void 0) throw new Error(`PermDock: ${label} groups '${name}' needs its own subject column, or groups needs a column naming the resource`);
|
|
313
|
-
resources[name] = group;
|
|
314
|
-
continue;
|
|
315
|
-
}
|
|
316
|
-
if (group === null || typeof group !== "object") throw new TypeError(`PermDock: ${label} groups '${name}' must name a relation`);
|
|
317
|
-
const relationName = "relation" in group ? group.relation : void 0;
|
|
318
|
-
if (typeof relationName !== "string") throw new TypeError(`PermDock: ${label} groups '${name}' must name a relation`);
|
|
319
|
-
assertSafeKey(relationName, "group relation");
|
|
320
|
-
const subject = "subject" in group ? group.subject : void 0;
|
|
321
|
-
if (subject !== void 0 && typeof subject !== "string") throw new TypeError(`PermDock: ${label} groups '${name}' subject must be a column name`);
|
|
322
|
-
if (subject !== void 0) assertSafeKey(subject, "group subject column");
|
|
323
|
-
else if (groups.column === void 0) throw new Error(`PermDock: ${label} groups '${name}' needs its own subject column, or groups needs a column naming the resource`);
|
|
324
|
-
resources[name] = subject === void 0 ? { relation: relationName } : {
|
|
325
|
-
relation: relationName,
|
|
326
|
-
subject
|
|
327
|
-
};
|
|
328
|
-
}
|
|
329
|
-
if (groups.direct !== void 0 && groups.column === void 0) throw new Error(`PermDock: ${label} groups direct needs a column to compare it with`);
|
|
330
|
-
if (groups.direct !== void 0 && groups.direct in resources) throw new Error(`PermDock: ${label} groups direct '${groups.direct}' is also a group resource`);
|
|
331
|
-
return {
|
|
332
|
-
...groups.column === void 0 ? {} : { column: groups.column },
|
|
333
|
-
resources,
|
|
334
|
-
...groups.direct === void 0 ? {} : { direct: groups.direct }
|
|
335
|
-
};
|
|
336
|
-
}
|
|
337
|
-
/** An included relation must exist on the same resource, be tenancy-free and never include itself back. */
|
|
338
|
-
function assertIncludes(node) {
|
|
339
|
-
const state = /* @__PURE__ */ new Map();
|
|
340
|
-
const visit = (name, path) => {
|
|
341
|
-
if (state.get(name) === "done") return;
|
|
342
|
-
if (state.get(name) === "visiting") throw new Error(`PermDock: relation includes on '${node.name}' form a cycle: ${[...path, name].join(" -> ")}`);
|
|
343
|
-
state.set(name, "visiting");
|
|
344
|
-
for (const included of node.relations[name]?.includes ?? []) {
|
|
345
|
-
const target = node.relations[included];
|
|
346
|
-
if (target === void 0) throw new Error(`PermDock: relation '${name}' on '${node.name}' includes '${included}', which '${node.name}' does not declare`);
|
|
347
|
-
if (isFieldRelation(target) && target.memberOf !== void 0) throw new Error(`PermDock: relation '${name}' on '${node.name}' includes the memberOf relation '${included}'; scopes are tenancy, not the object graph`);
|
|
348
|
-
visit(included, [...path, name]);
|
|
349
|
-
}
|
|
350
|
-
state.set(name, "done");
|
|
351
|
-
};
|
|
352
|
-
for (const name of Object.keys(node.relations)) visit(name, []);
|
|
353
|
-
}
|
|
354
|
-
function assertGroupTarget(registry, node, relationName, spec, target, targetRelation) {
|
|
355
|
-
const label = `relation '${relationName}' on '${node.name}' groups '${target}'`;
|
|
356
|
-
const targetSpec = registry.get(target)?.relations[targetRelation];
|
|
357
|
-
if (targetSpec === void 0) throw new Error(`PermDock: ${label} names '${target}#${targetRelation}', which is not declared`);
|
|
358
|
-
if (isFieldRelation(targetSpec) && targetSpec.memberOf !== void 0) throw new Error(`PermDock: ${label} names a memberOf relation; scopes are tenancy, not the object graph`);
|
|
359
|
-
if (target === node.name && (targetRelation !== relationName || spec.includes !== void 0)) throw new Error(`PermDock: ${label}: a group on its own resource must name the same relation, which includes nothing`);
|
|
360
|
-
}
|
|
361
|
-
/**
|
|
362
|
-
* Links and group targets name declared resources and relations. Groups may
|
|
363
|
-
* nest within one resource (teams in teams) through the same relation, which
|
|
364
|
-
* then includes nothing, so SQL can walk it with one bounded recursive query;
|
|
365
|
-
* a group cycle across resources is rejected.
|
|
366
|
-
*/
|
|
367
|
-
function assertGraphTargets(registry) {
|
|
368
|
-
const edges = /* @__PURE__ */ new Map();
|
|
369
|
-
for (const node of registry.values()) {
|
|
370
|
-
for (const [linkName, link] of Object.entries(node.links)) if (!registry.has(link.resource)) throw new Error(`PermDock: link '${linkName}' on '${node.name}' names the undeclared resource '${link.resource}'`);
|
|
371
|
-
for (const [relationName, spec] of Object.entries(node.relations)) {
|
|
372
|
-
if (!isEdgeRelation(spec) || spec.groups === void 0) continue;
|
|
373
|
-
for (const { resource: target, relation: targetRelation } of groupEntries(spec)) {
|
|
374
|
-
assertGroupTarget(registry, node, relationName, spec, target, targetRelation);
|
|
375
|
-
if (target !== node.name) {
|
|
376
|
-
const out = edges.get(node.name) ?? /* @__PURE__ */ new Set();
|
|
377
|
-
out.add(target);
|
|
378
|
-
edges.set(node.name, out);
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
const state = /* @__PURE__ */ new Map();
|
|
384
|
-
const visit = (name) => {
|
|
385
|
-
if (state.get(name) === "done") return;
|
|
386
|
-
if (state.get(name) === "visiting") throw new Error(`PermDock: edge groups form a cycle across resources through '${name}'`);
|
|
387
|
-
state.set(name, "visiting");
|
|
388
|
-
for (const next of edges.get(name) ?? []) visit(next);
|
|
389
|
-
state.set(name, "done");
|
|
390
|
-
};
|
|
391
|
-
for (const name of edges.keys()) visit(name);
|
|
392
|
-
}
|
|
393
|
-
function materialiseResource(init, path, registry, leaves, former) {
|
|
394
|
-
const segment = path.at(-1);
|
|
395
|
-
if (segment === void 0) throw new Error("PermDock: resource() cannot be the root of definePermissions");
|
|
396
|
-
const name = init.options.name ?? segment;
|
|
397
|
-
assertSafeKey(name, "resource");
|
|
398
|
-
if (init.options.name !== void 0 && !RESOURCE_NAME.test(name)) throw new Error(`PermDock: resource name '${name}' must start with a letter and hold only letters, digits, '_' and '-'`);
|
|
399
|
-
if (registry.has(name)) throw new Error(`PermDock: duplicate resource name '${name}'`);
|
|
400
|
-
const prefix = path.join(".");
|
|
401
|
-
const instanceNames = actionNames(init.options.actions);
|
|
402
|
-
const collectionNames = actionNames(init.options.collection);
|
|
403
|
-
if (instanceNames.length === 0 && collectionNames.length === 0) throw new Error(`PermDock: resource '${name}' has no actions or collection`);
|
|
404
|
-
const instanceSet = /* @__PURE__ */ new Set();
|
|
405
|
-
const collectionSet = /* @__PURE__ */ new Set();
|
|
406
|
-
const node = {};
|
|
407
|
-
for (const action of instanceNames) {
|
|
408
|
-
assertSafeKey(action, "action");
|
|
409
|
-
if (instanceSet.has(action)) throw new Error(`PermDock: duplicate action '${action}' on '${name}'`);
|
|
410
|
-
instanceSet.add(action);
|
|
411
|
-
const key = `${prefix}.${action}`;
|
|
412
|
-
const leaf = makeLeaf(key, name, action, metaFor(init.options.actions, action), "instance", former.get(key));
|
|
413
|
-
node[action] = leaf;
|
|
414
|
-
leaves.push(leaf);
|
|
415
|
-
}
|
|
416
|
-
for (const action of collectionNames) {
|
|
417
|
-
assertSafeKey(action, "action");
|
|
418
|
-
if (instanceSet.has(action) || collectionSet.has(action)) throw new Error(`PermDock: duplicate action '${action}' on '${name}'`);
|
|
419
|
-
collectionSet.add(action);
|
|
420
|
-
const key = `${prefix}.${action}`;
|
|
421
|
-
const leaf = makeLeaf(key, name, action, metaFor(init.options.collection, action), "collection", former.get(key));
|
|
422
|
-
node[action] = leaf;
|
|
423
|
-
leaves.push(leaf);
|
|
424
|
-
}
|
|
425
|
-
const parent = init.options.parent;
|
|
426
|
-
if (parent !== void 0) {
|
|
427
|
-
assertSafeKey(parent.field, "parent field");
|
|
428
|
-
assertSafeKey(parent.resource, "parent resource");
|
|
429
|
-
}
|
|
430
|
-
const version = init.options.version;
|
|
431
|
-
if (version !== void 0) assertSafeKey(version, "version field");
|
|
432
|
-
const restrictedOption = init.options.restricted;
|
|
433
|
-
const restricted = typeof restrictedOption === "string" ? restrictedOption : restrictedOption?.field;
|
|
434
|
-
if (restrictedOption !== void 0) {
|
|
435
|
-
if (typeof restricted !== "string") throw new TypeError(`PermDock: resource "${name}" restricted must name a field`);
|
|
436
|
-
assertSafeKey(restricted, "restricted field");
|
|
437
|
-
}
|
|
438
|
-
const disclosure = init.options.disclosure ?? "reveal";
|
|
439
|
-
if (disclosure !== "hide" && disclosure !== "reveal") throw new Error(`PermDock: resource "${name}" disclosure must be 'hide' or 'reveal'`);
|
|
440
|
-
const relations = {};
|
|
441
|
-
for (const [relationName, spec] of Object.entries(init.options.relations ?? {})) {
|
|
442
|
-
assertSafeKey(relationName, "relation");
|
|
443
|
-
relations[relationName] = freezeDeep(normaliseRelation(name, relationName, spec));
|
|
444
|
-
}
|
|
445
|
-
const links = {};
|
|
446
|
-
for (const [linkName, link] of Object.entries(init.options.links ?? {})) {
|
|
447
|
-
assertSafeKey(linkName, "link");
|
|
448
|
-
if (linkName === "parent") throw new Error(`PermDock: link 'parent' on '${name}' is reserved; declare it as parent`);
|
|
449
|
-
assertSafeKey(link.field, "link field");
|
|
450
|
-
assertSafeKey(link.resource, "link resource");
|
|
451
|
-
links[linkName] = freezeDeep({
|
|
452
|
-
field: link.field,
|
|
453
|
-
resource: link.resource
|
|
454
|
-
});
|
|
455
|
-
}
|
|
456
|
-
const restrictedStopList = typeof restrictedOption === "object" ? restrictedStopsOf(name, restrictedOption, parent, links) : void 0;
|
|
457
|
-
const levels = {};
|
|
458
|
-
for (const [levelName, condition] of Object.entries(init.options.levels ?? {})) {
|
|
459
|
-
if (!LEVEL_NAME.test(levelName)) throw new Error(`PermDock: level '${levelName}' on '${name}' must match ^[a-z][a-z0-9_]*$`);
|
|
460
|
-
if (condition === null || typeof condition !== "object" || Array.isArray(condition)) throw new Error(`PermDock: level '${levelName}' on '${name}' must be a condition object`);
|
|
461
|
-
levels[levelName] = freezeDeep({ ...condition });
|
|
462
|
-
}
|
|
463
|
-
if (Object.keys(levels).length > 0 && instanceSet.size === 0) throw new Error(`PermDock: resource '${name}' declares levels but no instance actions`);
|
|
464
|
-
const resourceNode = Object.freeze({
|
|
465
|
-
name,
|
|
466
|
-
path: prefix,
|
|
467
|
-
schema: init.schema,
|
|
468
|
-
id: init.options.id ?? "id",
|
|
469
|
-
parent: parent === void 0 ? void 0 : freezeDeep({ ...parent }),
|
|
470
|
-
links: freezeDeep(links),
|
|
471
|
-
relations: freezeDeep(relations),
|
|
472
|
-
version,
|
|
473
|
-
restricted,
|
|
474
|
-
...restrictedStopList === void 0 ? {} : { restrictedStops: restrictedStopList },
|
|
475
|
-
disclosure,
|
|
476
|
-
instanceActions: instanceSet,
|
|
477
|
-
collectionActions: collectionSet,
|
|
478
|
-
levels: Object.freeze(levels)
|
|
479
|
-
});
|
|
480
|
-
assertIncludes(resourceNode);
|
|
481
|
-
registry.set(name, resourceNode);
|
|
482
|
-
Object.defineProperty(node, NODE_RESOURCE, {
|
|
483
|
-
value: resourceNode,
|
|
484
|
-
enumerable: false,
|
|
485
|
-
writable: false,
|
|
486
|
-
configurable: false
|
|
487
|
-
});
|
|
488
|
-
return freezeDeep(node);
|
|
489
|
-
}
|
|
490
|
-
/** The resource a `definePermissions` resource node was built from, read from the node itself. */
|
|
491
|
-
function resourceOfNode(node) {
|
|
492
|
-
if (!Object.hasOwn(node, NODE_RESOURCE)) return;
|
|
493
|
-
const value = Reflect.get(node, NODE_RESOURCE);
|
|
494
|
-
return isResourceNode(value) ? value : void 0;
|
|
495
|
-
}
|
|
496
|
-
function isResourceNode(value) {
|
|
497
|
-
return value !== null && typeof value === "object" && "name" in value && "instanceActions" in value;
|
|
498
|
-
}
|
|
499
|
-
function walk(input, path, registry, leaves, depth, former) {
|
|
500
|
-
if (depth > 10) throw new Error(`PermDock: permission group nesting exceeds 10`);
|
|
501
|
-
if (isResourceInit(input)) return materialiseResource(input, path, registry, leaves, former);
|
|
502
|
-
if (input === null || typeof input !== "object" || Array.isArray(input)) throw new Error(`PermDock: definePermissions expected a group or resource at '${path.join(".")}'`);
|
|
503
|
-
const group = {};
|
|
504
|
-
for (const key of Object.keys(input)) {
|
|
505
|
-
assertSafeKey(key, "group");
|
|
506
|
-
group[key] = walk(input[key], [...path, key], registry, leaves, depth + 1, former);
|
|
507
|
-
}
|
|
508
|
-
return group;
|
|
509
|
-
}
|
|
510
|
-
function attachRegistry(tree, registry, leaves) {
|
|
511
|
-
const attached = tree;
|
|
512
|
-
Object.defineProperty(attached, TREE_REGISTRY, {
|
|
513
|
-
value: registry,
|
|
514
|
-
enumerable: false,
|
|
515
|
-
writable: false,
|
|
516
|
-
configurable: false
|
|
517
|
-
});
|
|
518
|
-
Object.defineProperty(attached, TREE_LEAVES, {
|
|
519
|
-
value: Object.freeze([...leaves]),
|
|
520
|
-
enumerable: false,
|
|
521
|
-
writable: false,
|
|
522
|
-
configurable: false
|
|
523
|
-
});
|
|
524
|
-
return attached;
|
|
525
|
-
}
|
|
526
|
-
function isRegistryTree(tree) {
|
|
527
|
-
return TREE_REGISTRY in tree;
|
|
528
|
-
}
|
|
529
|
-
function getRegistry(tree) {
|
|
530
|
-
if (!isRegistryTree(tree)) throw new Error("PermDock: permission tree is missing its registry");
|
|
531
|
-
return tree[TREE_REGISTRY];
|
|
532
|
-
}
|
|
533
|
-
function getResource(tree, name) {
|
|
534
|
-
if (isForbiddenKey(name)) return;
|
|
535
|
-
return getRegistry(tree).get(name);
|
|
536
|
-
}
|
|
537
|
-
const RENAMED_KEY = /^\S+$/u;
|
|
538
|
-
/** Current key to its former keys, from the `renamed` option; targets are checked once leaves exist. */
|
|
539
|
-
function formerByKey(renamed) {
|
|
540
|
-
const former = /* @__PURE__ */ new Map();
|
|
541
|
-
if (renamed === void 0) return former;
|
|
542
|
-
if (renamed === null || typeof renamed !== "object") throw new TypeError("PermDock: renamed must map old keys to current keys");
|
|
543
|
-
for (const [old, current] of Object.entries(renamed)) {
|
|
544
|
-
if (!RENAMED_KEY.test(old) || old.split(".").some(isForbiddenKey)) throw new Error(`PermDock: renamed key '${old}' is not a valid key`);
|
|
545
|
-
if (typeof current !== "string") throw new TypeError(`PermDock: renamed key '${old}' must map to a current key`);
|
|
546
|
-
former.set(current, [...former.get(current) ?? [], old]);
|
|
547
|
-
}
|
|
548
|
-
return former;
|
|
549
|
-
}
|
|
550
|
-
/**
|
|
551
|
-
* Every current key is unique, every former key names exactly one leaf, and
|
|
552
|
-
* no former key is also a current key, so a string resolves to one leaf.
|
|
553
|
-
*/
|
|
554
|
-
function assertKeys(leaves, former) {
|
|
555
|
-
const current = /* @__PURE__ */ new Set();
|
|
556
|
-
for (const leaf of leaves) {
|
|
557
|
-
if (current.has(leaf.key))
|
|
558
|
-
/* v8 ignore next */
|
|
559
|
-
throw new Error(`PermDock: duplicate permission key '${leaf.key}'`);
|
|
560
|
-
current.add(leaf.key);
|
|
561
|
-
}
|
|
562
|
-
for (const target of former?.keys() ?? []) if (!current.has(target)) throw new Error(`PermDock: renamed target '${target}' is not a permission key`);
|
|
563
|
-
const olds = /* @__PURE__ */ new Map();
|
|
564
|
-
for (const leaf of leaves) for (const old of formerKeys(leaf)) {
|
|
565
|
-
if (current.has(old)) throw new Error(`PermDock: renamed key '${old}' is still a permission key`);
|
|
566
|
-
const other = olds.get(old);
|
|
567
|
-
if (other !== void 0 && other !== leaf.key) throw new Error(`PermDock: renamed key '${old}' maps to both '${other}' and '${leaf.key}'`);
|
|
568
|
-
olds.set(old, leaf.key);
|
|
569
|
-
}
|
|
570
|
-
}
|
|
571
|
-
function definePermissions(input, options) {
|
|
572
|
-
const registry = /* @__PURE__ */ new Map();
|
|
573
|
-
const leaves = [];
|
|
574
|
-
const former = formerByKey(options?.renamed);
|
|
575
|
-
const tree = walk(input, [], registry, leaves, 0, former);
|
|
576
|
-
assertKeys(leaves, former);
|
|
577
|
-
assertGraphTargets(registry);
|
|
578
|
-
return freezeDeep(attachRegistry(tree, registry, leaves));
|
|
579
|
-
}
|
|
580
|
-
function collectLeaves(node) {
|
|
581
|
-
if ("key" in node && "scope" in node && "action" in node) return [node];
|
|
582
|
-
const out = [];
|
|
583
|
-
for (const key of ownKeys(node)) {
|
|
584
|
-
const child = node[key];
|
|
585
|
-
if (child !== void 0) out.push(...collectLeaves(child));
|
|
586
|
-
}
|
|
587
|
-
return out;
|
|
588
|
-
}
|
|
589
|
-
function listPermissions(tree) {
|
|
590
|
-
if (isRegistryTree(tree)) return tree[TREE_LEAVES];
|
|
591
|
-
return collectLeaves(tree);
|
|
592
|
-
}
|
|
593
|
-
function findPermission(tree, keyOrScope) {
|
|
594
|
-
if (isForbiddenKey(keyOrScope)) return;
|
|
595
|
-
const leaves = listPermissions(tree);
|
|
596
|
-
for (const leaf of leaves) if (leaf.key === keyOrScope || leaf.scope === keyOrScope) return leaf;
|
|
597
|
-
for (const leaf of leaves) if (formerKeys(leaf).includes(keyOrScope) || formerScopes(leaf).includes(keyOrScope)) return leaf;
|
|
598
|
-
}
|
|
599
|
-
/**
|
|
600
|
-
* A permission leaf: string `key`, `scope`, `resource` and `action` plus an
|
|
601
|
-
* object `meta`. `kind` is non-enumerable and does not survive
|
|
602
|
-
* `JSON.stringify`, so a leaf that crossed a serialisation boundary passes
|
|
603
|
-
* without it; when present it must be `instance` or `collection`.
|
|
604
|
-
*/
|
|
605
|
-
function isPermission(value) {
|
|
606
|
-
if (value === null || typeof value !== "object" || Array.isArray(value)) return false;
|
|
607
|
-
for (const field of [
|
|
608
|
-
"key",
|
|
609
|
-
"scope",
|
|
610
|
-
"resource",
|
|
611
|
-
"action"
|
|
612
|
-
]) if (!Object.hasOwn(value, field) || typeof Reflect.get(value, field) !== "string") return false;
|
|
613
|
-
const meta = Object.hasOwn(value, "meta") ? Reflect.get(value, "meta") : void 0;
|
|
614
|
-
if (meta === null || typeof meta !== "object" || Array.isArray(meta)) return false;
|
|
615
|
-
if (!Object.hasOwn(value, "kind")) return true;
|
|
616
|
-
const kind = Reflect.get(value, "kind");
|
|
617
|
-
return kind === "instance" || kind === "collection";
|
|
618
|
-
}
|
|
619
|
-
function mergeNodes(target, source, keys, registry, sourceRegistry) {
|
|
620
|
-
for (const key of ownKeys(source)) {
|
|
621
|
-
assertSafeKey(key, "group");
|
|
622
|
-
const incoming = source[key];
|
|
623
|
-
if (incoming === void 0)
|
|
624
|
-
/* v8 ignore next */
|
|
625
|
-
continue;
|
|
626
|
-
const existing = target[key];
|
|
627
|
-
if (existing === void 0) {
|
|
628
|
-
target[key] = incoming;
|
|
629
|
-
if (isPermission(incoming)) {
|
|
630
|
-
if (keys.has(incoming.key))
|
|
631
|
-
/* v8 ignore next */
|
|
632
|
-
throw new Error(`PermDock: duplicate permission key '${incoming.key}'`);
|
|
633
|
-
keys.add(incoming.key);
|
|
634
|
-
}
|
|
635
|
-
continue;
|
|
636
|
-
}
|
|
637
|
-
if (isPermission(existing) || isPermission(incoming)) {
|
|
638
|
-
const keyName = isPermission(incoming) ? incoming.key : isPermission(existing) ? existing.key : key;
|
|
639
|
-
throw new Error(`PermDock: duplicate permission key '${keyName}'`);
|
|
640
|
-
}
|
|
641
|
-
const nested = { ...existing };
|
|
642
|
-
mergeNodes(nested, incoming, keys, registry, sourceRegistry);
|
|
643
|
-
target[key] = freezeDeep(nested);
|
|
644
|
-
}
|
|
645
|
-
if (sourceRegistry !== void 0) for (const [name, node] of sourceRegistry) {
|
|
646
|
-
if (registry.has(name) && registry.get(name) !== node) throw new Error(`PermDock: duplicate resource name '${name}'`);
|
|
647
|
-
registry.set(name, node);
|
|
648
|
-
}
|
|
649
|
-
}
|
|
650
|
-
function mergePermissions(...trees) {
|
|
651
|
-
if (trees.length === 0) throw new Error("PermDock: mergePermissions() requires at least one tree");
|
|
652
|
-
const merged = {};
|
|
653
|
-
const keys = /* @__PURE__ */ new Set();
|
|
654
|
-
const registry = /* @__PURE__ */ new Map();
|
|
655
|
-
for (const tree of trees) mergeNodes(merged, tree, keys, registry, isRegistryTree(tree) ? tree[TREE_REGISTRY] : void 0);
|
|
656
|
-
assertGraphTargets(registry);
|
|
657
|
-
const leaves = collectLeaves(merged);
|
|
658
|
-
assertKeys(leaves);
|
|
659
|
-
return freezeDeep(attachRegistry(merged, registry, leaves));
|
|
660
|
-
}
|
|
661
|
-
//#endregion
|
|
662
|
-
export { restrictedStops as C, ownKeys as D, ownGet as E, readPath as O, restrictedFor as S, isForbiddenKey as T, listPermissions as _, formerKeys as a, resource as b, getResource as c, isEdgeRelation as d, isFieldRelation as f, isSelfParented as g, isRegistryTree as h, findPermission as i, splitPath as k, groupEntries as l, isPrincipalRelation as m, definePermissions as n, formerScopes as o, isPermission as p, expandRelation as r, getRegistry as s, annotationsFor as t, isComputedRelation as u, mergePermissions as v, assertSafeKey as w, resourceOfNode as x, renamedKeys as y };
|