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,10 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { t as
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
1
|
+
import { Nn as Decision, Rt as Instant, Vt as Snapshot, ir as Subject, j as PolicyVocabulary, qn as Actor, tr as JsonWebKeyLike } from "./policy-types-DzwivBgR.js";
|
|
2
|
+
import { w as Permission } from "./vocabulary-D6lPdb4Z.js";
|
|
3
|
+
import { r as PermDock, s as SnapshotOptions } from "./permdock-D7eeLJER.js";
|
|
4
|
+
import { m as ApprovalStore } from "./types-CCpc2Dcv.js";
|
|
5
|
+
import { a as ProblemDetails, t as ApprovalHint } from "./errors-C2PXIv4c.js";
|
|
6
|
+
import { t as InstanceOptions } from "./instance-options-Omfd793B.js";
|
|
7
|
+
import { t as RequestContext } from "./request-context-C2_1lchh.js";
|
|
8
|
+
import { n as PermDockWrap } from "./wrap-Bd1Tejur.js";
|
|
9
|
+
import { n as RevocationFeed } from "./revocations-R07lFBnX.js";
|
|
10
|
+
import { r as PdpFactory } from "./types-ClZaWzfb.js";
|
|
11
|
+
import { i as evaluationsHandler } from "./evaluations-16UqqQ6W.js";
|
|
8
12
|
//#region src/server/connection.d.ts
|
|
9
13
|
type ConnectionData<T> = T | (() => T | null | undefined | Promise<T | null | undefined>);
|
|
10
14
|
type ConnectionOptions<T = unknown> = {
|
|
@@ -12,7 +16,7 @@ type ConnectionOptions<T = unknown> = {
|
|
|
12
16
|
readonly permission?: Permission;
|
|
13
17
|
/** The row for `permission`, or a loader re-run on every revalidation. */
|
|
14
18
|
readonly data?: ConnectionData<T>;
|
|
15
|
-
/**
|
|
19
|
+
/** Seconds between periodic revalidations; off by default. */
|
|
16
20
|
readonly revalidate?: number;
|
|
17
21
|
};
|
|
18
22
|
type Connection = {
|
|
@@ -28,6 +32,11 @@ type Connection = {
|
|
|
28
32
|
readonly trusted?: boolean;
|
|
29
33
|
}) => Decision;
|
|
30
34
|
readonly filter: <T>(permission: Permission<string, T, "instance">, items: readonly T[]) => T[];
|
|
35
|
+
/**
|
|
36
|
+
* Resolves once every revalidation queued so far has finished, so a message
|
|
37
|
+
* checked after a revocation event is checked against the rebuilt instance.
|
|
38
|
+
*/
|
|
39
|
+
readonly settled: () => Promise<void>;
|
|
31
40
|
/** Stops timers and the feed subscription. Call it when the transport closes. */
|
|
32
41
|
readonly close: () => void;
|
|
33
42
|
};
|
|
@@ -62,14 +71,18 @@ type WebBotAuthOptions = {
|
|
|
62
71
|
readonly keys: WebBotAuthKeys | WebBotAuthKeyLookup;
|
|
63
72
|
readonly required?: boolean;
|
|
64
73
|
readonly maxAge?: number;
|
|
65
|
-
/**
|
|
66
|
-
readonly now?: () =>
|
|
74
|
+
/** The clock; defaults to the system clock. */
|
|
75
|
+
readonly now?: () => Instant;
|
|
67
76
|
};
|
|
68
77
|
/**
|
|
69
|
-
* An adapter's `webBotAuth` option: `(
|
|
78
|
+
* An adapter's `webBotAuth` option: `webBotAuthVerifier(options)`,
|
|
70
79
|
* so an app without it does not bundle RFC 9421 verification.
|
|
71
80
|
*/
|
|
72
|
-
type WebBotAuthVerifier =
|
|
81
|
+
type WebBotAuthVerifier = {
|
|
82
|
+
readonly name?: string;
|
|
83
|
+
/** The verified signer as an actor, `undefined` for an unsigned request; throws `InvalidSignatureError` for a bad signature. */
|
|
84
|
+
verify(request: Request): Promise<Actor | undefined>;
|
|
85
|
+
};
|
|
73
86
|
type DiscoverViaSignatureAgentOptions = {
|
|
74
87
|
readonly allow: readonly string[];
|
|
75
88
|
readonly fetch?: typeof fetch;
|
|
@@ -82,37 +95,26 @@ declare class InvalidSignatureError extends Error {
|
|
|
82
95
|
declare function invalidSignatureResponse(error: unknown): Response | undefined;
|
|
83
96
|
declare function invalidSignatureProblem(detail: string): Response;
|
|
84
97
|
declare function discoverViaSignatureAgent(options: DiscoverViaSignatureAgentOptions): WebBotAuthKeys;
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
readonly getPermDock?: (query?: {
|
|
92
|
-
readonly tenant?: string;
|
|
93
|
-
}) => Promise<PermDock>;
|
|
94
|
-
readonly store?: ApprovalStore;
|
|
95
|
-
readonly adapter?: string;
|
|
96
|
-
/** The most evaluations one POST may carry; a larger batch is a 413 before any instance is resolved. */
|
|
97
|
-
readonly maxEvaluations?: number;
|
|
98
|
-
}): {
|
|
99
|
-
readonly POST: (request: Request) => Promise<Response>;
|
|
100
|
-
readonly GET: (request: Request) => Promise<Response>;
|
|
101
|
-
};
|
|
98
|
+
/**
|
|
99
|
+
* Verifies Web Bot Auth requests: an RFC 9421 signature tagged `web-bot-auth`
|
|
100
|
+
* that covers `@authority`, and `signature-agent` when the request sends
|
|
101
|
+
* `Signature-Agent` (draft-meunier-webbotauth-httpsig-protocol).
|
|
102
|
+
*/
|
|
103
|
+
declare function webBotAuthVerifier(options?: WebBotAuthOptions): WebBotAuthVerifier;
|
|
102
104
|
//#endregion
|
|
103
|
-
//#region src/server/
|
|
105
|
+
//#region src/server/server-types.d.ts
|
|
104
106
|
type ServerPermDockOptions<TUser = unknown> = InstanceOptions & {
|
|
105
107
|
/** The user, or a full `Subject` (core then skips `policy.subject`); `null` is anonymous. */
|
|
106
108
|
readonly subject: (request: Request) => TUser | Subject | null | Promise<TUser | Subject | null>;
|
|
107
109
|
readonly actor?: (request: Request) => unknown;
|
|
108
|
-
/** `(
|
|
110
|
+
/** `webBotAuthVerifier(options)`; a verified bot becomes the actor. */
|
|
109
111
|
readonly webBotAuth?: WebBotAuthVerifier;
|
|
110
112
|
readonly tenant?: string | ((request: Request) => string | undefined | Promise<string | undefined>);
|
|
111
113
|
readonly store?: ApprovalStore;
|
|
112
114
|
/** Ends or revalidates open connections; never a decision input. */
|
|
113
115
|
readonly revocations?: RevocationFeed;
|
|
114
116
|
/**
|
|
115
|
-
* `
|
|
117
|
+
* `getPermDock` from `permdock/pdp`: `protect` then decides delegated
|
|
116
118
|
* permissions through the remote PDP. The instance handlers receive stays
|
|
117
119
|
* synchronous and keeps denying delegated permissions (`pdp-unavailable`).
|
|
118
120
|
*/
|
|
@@ -120,7 +122,33 @@ type ServerPermDockOptions<TUser = unknown> = InstanceOptions & {
|
|
|
120
122
|
/** Added as `approval` to every `approval-required` problem. */
|
|
121
123
|
readonly approval?: ApprovalHint;
|
|
122
124
|
readonly operations?: OperationScopes;
|
|
125
|
+
/**
|
|
126
|
+
* Replaces the response of a refused guard. A status below 300, or a
|
|
127
|
+
* throw, keeps the default response and reports through `on('error')`.
|
|
128
|
+
*/
|
|
129
|
+
readonly deniedResponse?: DeniedResponse;
|
|
130
|
+
/**
|
|
131
|
+
* Request values merged into `subject.context`, under `policy.context`.
|
|
132
|
+
* Only values the server derived belong here, never client input. A throw
|
|
133
|
+
* or a value that is not a JSON object adds nothing and reports through
|
|
134
|
+
* `on('error')`.
|
|
135
|
+
*/
|
|
136
|
+
readonly context?: (request: Request) => RequestContext | undefined | Promise<RequestContext | undefined>;
|
|
137
|
+
/** Wraps each instance the factory builds; build it with `wrapPermDock` to cover derived instances. */
|
|
138
|
+
readonly wrap?: PermDockWrap;
|
|
139
|
+
/** The `adapter` label on decision events, revocations and approvals. Defaults to `server`. */
|
|
140
|
+
readonly adapter?: string;
|
|
123
141
|
};
|
|
142
|
+
/** What `deniedResponse` receives: the refusal and the default Problem Details for it. */
|
|
143
|
+
type DeniedResponseEvent = {
|
|
144
|
+
readonly decision: Exclude<Decision, {
|
|
145
|
+
readonly outcome: "granted";
|
|
146
|
+
}>;
|
|
147
|
+
readonly problem: ProblemDetails;
|
|
148
|
+
readonly request: Request | undefined;
|
|
149
|
+
};
|
|
150
|
+
/** Returns Problem Details with extra members, a `Response`, or nothing for the default. */
|
|
151
|
+
type DeniedResponse = (event: DeniedResponseEvent) => ProblemDetails | Response | undefined | Promise<ProblemDetails | Response | undefined>;
|
|
124
152
|
type OperationScopes = {
|
|
125
153
|
oauthScopesForRequest(method: string, path: string): readonly string[] | undefined;
|
|
126
154
|
};
|
|
@@ -134,6 +162,10 @@ type Guard<T = unknown, V extends PolicyVocabulary = PolicyVocabulary> = {
|
|
|
134
162
|
} | {
|
|
135
163
|
readonly ok: false;
|
|
136
164
|
readonly response: Response;
|
|
165
|
+
/** The refusal behind `response`; absent for a missing row or a bad signature. */
|
|
166
|
+
readonly decision?: Exclude<Decision, {
|
|
167
|
+
readonly outcome: "granted";
|
|
168
|
+
}>;
|
|
137
169
|
};
|
|
138
170
|
/**
|
|
139
171
|
* What `protect(null, …)` resolves to: the route declares OAuth scopes and no
|
|
@@ -147,17 +179,21 @@ type ScopeGuard<T = unknown, V extends PolicyVocabulary = PolicyVocabulary> = {
|
|
|
147
179
|
} | {
|
|
148
180
|
readonly ok: false;
|
|
149
181
|
readonly response: Response;
|
|
182
|
+
/** The refusal behind `response`; absent for a missing row or a bad signature. */
|
|
183
|
+
readonly decision?: Exclude<Decision, {
|
|
184
|
+
readonly outcome: "granted";
|
|
185
|
+
}>;
|
|
150
186
|
};
|
|
151
187
|
type Loader<T> = (request: Request) => T | null | undefined | Promise<T | null | undefined>;
|
|
152
188
|
/**
|
|
153
|
-
* `protect(permission,
|
|
189
|
+
* `protect(permission, data?, options?)`, or `protect(null, data?,
|
|
154
190
|
* { oauthScopes })` for a route that needs a signed-in principal and, from a
|
|
155
191
|
* delegated token, one of the OAuth scopes it declares, but no permission.
|
|
156
192
|
*/
|
|
157
193
|
type Protect<V extends PolicyVocabulary = PolicyVocabulary, TArgs extends unknown[] = []> = {
|
|
158
|
-
<T = unknown>(permission: Permission,
|
|
159
|
-
<T = unknown>(permission: null,
|
|
160
|
-
<T = unknown>(permission: Permission | null,
|
|
194
|
+
<T = unknown>(permission: Permission, data?: Loader<T>, protectOptions?: ProtectOptions): (request: Request, ...args: TArgs) => Promise<Guard<T, V>>;
|
|
195
|
+
<T = unknown>(permission: null, data?: Loader<T>, protectOptions?: ProtectOptions): (request: Request, ...args: TArgs) => Promise<ScopeGuard<T, V>>;
|
|
196
|
+
<T = unknown>(permission: Permission | null, data?: Loader<T>, protectOptions?: ProtectOptions): (request: Request, ...args: TArgs) => Promise<Guard<T, V> | ScopeGuard<T, V>>;
|
|
161
197
|
};
|
|
162
198
|
type OpenApiHooks = {
|
|
163
199
|
readonly security: (permission: Permission) => {
|
|
@@ -168,7 +204,7 @@ type OpenApiHooks = {
|
|
|
168
204
|
};
|
|
169
205
|
type ProtectOptions = {
|
|
170
206
|
/**
|
|
171
|
-
* `true` when `
|
|
207
|
+
* `true` when `data` returns a row the server loaded itself, to skip
|
|
172
208
|
* schema validation. Anything else is validated against the resource
|
|
173
209
|
* schema before the check.
|
|
174
210
|
*/
|
|
@@ -179,26 +215,24 @@ type ProtectOptions = {
|
|
|
179
215
|
* for the request. Required, here or there, for `protect(null)`.
|
|
180
216
|
*/
|
|
181
217
|
readonly oauthScopes?: readonly string[];
|
|
218
|
+
/** The field being read or written; only grants whose `fields` cover it match. */
|
|
219
|
+
readonly field?: string;
|
|
220
|
+
/** Adds the evaluation `trace` to the guard's decision. */
|
|
221
|
+
readonly explain?: boolean;
|
|
182
222
|
};
|
|
183
|
-
type ServerKernelOptions<TUser, V extends PolicyVocabulary = PolicyVocabulary> = ServerPermDockOptions<TUser> & {
|
|
184
|
-
/** Wraps each instance the kernel builds, as `withOtel` does. */
|
|
185
|
-
readonly wrap?: (permdock: PermDock<V>) => PermDock<V>;
|
|
186
|
-
/** The `adapter` label on decision events, revocations and approvals. Defaults to `server`. */
|
|
187
|
-
readonly adapter?: string;
|
|
188
|
-
};
|
|
189
|
-
/**
|
|
190
|
-
* What an HTTP adapter builds on: `ServerPermDock` plus an explicit
|
|
191
|
-
* `TenantScope` on every call, so the adapter resolves the tenant from its
|
|
192
|
-
* own framework context.
|
|
193
|
-
*/
|
|
194
223
|
type SnapshotQuery = {
|
|
195
224
|
/** The active tenant; defaults to the `tenant` option resolved from the request. */
|
|
196
225
|
readonly tenant?: string;
|
|
197
226
|
readonly include?: SnapshotOptions["include"];
|
|
198
227
|
readonly tenants?: "all";
|
|
199
228
|
};
|
|
200
|
-
|
|
201
|
-
|
|
229
|
+
/**
|
|
230
|
+
* What `createPermDock` from `permdock/server` returns. Every member takes an
|
|
231
|
+
* optional `TenantScope`, so an adapter resolves the tenant from its own
|
|
232
|
+
* framework context.
|
|
233
|
+
*/
|
|
234
|
+
type ServerPermDock<V extends PolicyVocabulary = PolicyVocabulary> = {
|
|
235
|
+
readonly getPermDock: (request: Request, scope?: TenantScope) => Promise<PermDock<V>>;
|
|
202
236
|
/**
|
|
203
237
|
* The JSON snapshot for a loader (React Router, TanStack Start, SvelteKit, Nuxt), built from the
|
|
204
238
|
* request's cached subject. Send it with `snapshotHeaders(snapshot)`.
|
|
@@ -208,8 +242,10 @@ type ServerKernel<V extends PolicyVocabulary = PolicyVocabulary> = {
|
|
|
208
242
|
/**
|
|
209
243
|
* `protect` against an instance the adapter already holds, such as a gateway
|
|
210
244
|
* connection's: the same OAuth scope check, loader, decision and approval resume.
|
|
245
|
+
* A method, so a `ServerPermDock<V>` stays assignable to `ServerPermDock`.
|
|
211
246
|
*/
|
|
212
|
-
|
|
247
|
+
protectOn<T = unknown>(instance: PermDock<V>, permission: Permission | null, data?: () => T | null | undefined | Promise<T | null | undefined>, protectOptions?: ProtectOptions, request?: Request): Promise<Guard<T, V> | ScopeGuard<T, V>>;
|
|
248
|
+
/** A long-lived connection for a stream or socket opened by `request`. */
|
|
213
249
|
readonly connection: <T = unknown>(request: Request, options?: ConnectionOptions<T>, scope?: TenantScope) => Promise<Connection>;
|
|
214
250
|
/**
|
|
215
251
|
* Lets `to`, a second `Request` an adapter built for the same incoming
|
|
@@ -217,29 +253,12 @@ type ServerKernel<V extends PolicyVocabulary = PolicyVocabulary> = {
|
|
|
217
253
|
* actor already resolved for `from`.
|
|
218
254
|
*/
|
|
219
255
|
readonly shareSubject: (from: Request, to: Request) => void;
|
|
220
|
-
readonly problem: ServerPermDock<V>["problem"];
|
|
221
|
-
readonly openapi: OpenApiHooks;
|
|
222
|
-
readonly permdockHandler: (scope?: (request: Request) => TenantScope | Promise<TenantScope>) => ReturnType<typeof createEvaluationsHandler>;
|
|
223
|
-
};
|
|
224
|
-
type ServerPermDock<V extends PolicyVocabulary = PolicyVocabulary> = {
|
|
225
|
-
readonly permdock: (request: Request) => Promise<PermDock<V>>;
|
|
226
|
-
readonly getSnapshot: ServerKernel<V>["getSnapshot"];
|
|
227
|
-
readonly protect: Protect<V>;
|
|
228
|
-
/** A long-lived connection for a stream or socket opened by `request`. */
|
|
229
|
-
readonly connection: <T = unknown>(request: Request, options?: ConnectionOptions<T>) => Promise<Connection>;
|
|
230
256
|
readonly problem: (decision: Decision, init?: {
|
|
231
257
|
readonly permission?: Permission;
|
|
232
258
|
readonly instance?: string;
|
|
233
259
|
}) => Response;
|
|
234
260
|
readonly openapi: OpenApiHooks;
|
|
235
|
-
readonly permdockHandler: () => ReturnType<typeof
|
|
261
|
+
readonly permdockHandler: (scope?: (request: Request) => TenantScope | Promise<TenantScope>) => ReturnType<typeof evaluationsHandler>;
|
|
236
262
|
};
|
|
237
|
-
declare function createPermDock<TUser, TPrincipal extends Principal = Principal, V extends PolicyVocabulary = PolicyVocabulary>(policy: Policy<TUser, TPrincipal, V>, options: ServerPermDockOptions<TUser>): ServerPermDock<V>;
|
|
238
|
-
/**
|
|
239
|
-
* The kernel behind every HTTP adapter. The subject and actor are resolved
|
|
240
|
-
* once per `Request`; one instance is cached per `(Request, tenant)`, so a
|
|
241
|
-
* global middleware and a later tenant-scoped `protect` never share a tenant.
|
|
242
|
-
*/
|
|
243
|
-
declare function createServerKernel<TUser, TPrincipal extends Principal = Principal, V extends PolicyVocabulary = PolicyVocabulary>(policy: Policy<TUser, TPrincipal, V>, options: ServerKernelOptions<TUser, V>): ServerKernel<V>;
|
|
244
263
|
//#endregion
|
|
245
|
-
export {
|
|
264
|
+
export { TenantScope as C, ConnectionOptions as D, ConnectionData as E, TenantOption as S, Connection as T, WebBotAuthVerifier as _, OperationScopes as a, invalidSignatureResponse as b, ServerPermDock as c, DiscoverViaSignatureAgentOptions as d, InvalidSignatureError as f, WebBotAuthOptions as g, WebBotAuthKeys as h, OpenApiHooks as i, ServerPermDockOptions as l, WebBotAuthKeyLookup as m, DeniedResponseEvent as n, ProtectOptions as o, WebBotAuthJwk as p, Guard as r, ScopeGuard as s, DeniedResponse as t, SnapshotQuery as u, discoverViaSignatureAgent as v, tenantScope as w, webBotAuthVerifier as x, invalidSignatureProblem as y };
|
|
@@ -141,10 +141,17 @@ function sha256(message) {
|
|
|
141
141
|
outView.setInt32(28, h7, false);
|
|
142
142
|
return out;
|
|
143
143
|
}
|
|
144
|
+
/**
|
|
145
|
+
* The one digest notation: `sha-256:` plus the unpadded base64url SHA-256
|
|
146
|
+
* of `text`. An RFC 9651 sf-token, so it fits a structured header as is.
|
|
147
|
+
*/
|
|
148
|
+
function sha256Digest(text) {
|
|
149
|
+
return `sha-256:${bytesToBase64Url(sha256(text))}`;
|
|
150
|
+
}
|
|
144
151
|
function bytesToBase64Url(bytes) {
|
|
145
152
|
let binary = "";
|
|
146
153
|
for (const byte of bytes) binary += String.fromCodePoint(byte);
|
|
147
154
|
return btoa(binary).replaceAll("+", "-").replaceAll("/", "_").replaceAll("=", "");
|
|
148
155
|
}
|
|
149
156
|
//#endregion
|
|
150
|
-
export { sha256 as n, bytesToBase64Url as t };
|
|
157
|
+
export { sha256 as n, sha256Digest as r, bytesToBase64Url as t };
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
import { r as isRecord } from "./compact-CAf557ZB.js";
|
|
2
|
+
import { n as isForbiddenKey } from "./paths-DXSHAMIa.js";
|
|
3
|
+
import { t as byCodePoint } from "./compare-pfyVnBjE.js";
|
|
4
|
+
import { i as configError } from "./errors-CWTY6uih.js";
|
|
5
|
+
import { a as quoteQualifiedTable, c as quoteSqlTable, o as quoteSqlIdent, s as quoteSqlLiteral, t as SQL_IDENT } from "./sql-B5T1IL83.js";
|
|
6
|
+
import "./sources-vs5dGOsS.js";
|
|
7
|
+
//#region src/cli/sql/quote.ts
|
|
8
|
+
function quoteIdent(name) {
|
|
9
|
+
return quoteSqlIdent(name, CLI);
|
|
10
|
+
}
|
|
11
|
+
function quoteTable(name) {
|
|
12
|
+
return quoteSqlTable(name, CLI);
|
|
13
|
+
}
|
|
14
|
+
/** A table name with `public.` added when it names no schema, quoted. */
|
|
15
|
+
function quoteQualified(name) {
|
|
16
|
+
return quoteQualifiedTable(name, CLI);
|
|
17
|
+
}
|
|
18
|
+
function helperSchema(ctx) {
|
|
19
|
+
return ctx.schema ?? "permdock";
|
|
20
|
+
}
|
|
21
|
+
function qualified(ctx, name) {
|
|
22
|
+
return `${quoteIdent(helperSchema(ctx))}.${name}`;
|
|
23
|
+
}
|
|
24
|
+
function quoteLiteral(value) {
|
|
25
|
+
return quoteSqlLiteral(value);
|
|
26
|
+
}
|
|
27
|
+
const CLI = "PermDock CLI";
|
|
28
|
+
function declaredArray(values) {
|
|
29
|
+
return values.length === 0 ? `'{}'::text[]` : `array[${values.map(quoteLiteral).join(", ")}]::text[]`;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* A text array as a Postgres literal (`'{admin,owner}'`). An element that
|
|
33
|
+
* holds a delimiter, a brace, a quote, a backslash, whitespace, or that
|
|
34
|
+
* reads as `NULL`, is double-quoted and escaped, so one element can never
|
|
35
|
+
* split into several.
|
|
36
|
+
*/
|
|
37
|
+
function textArrayLiteral(values) {
|
|
38
|
+
return quoteLiteral(`{${values.map((value) => value === "" || /[\s,{}"\\]/u.test(value) || /^null$/iu.test(value) ? `"${value.replaceAll("\\", "\\\\").replaceAll("\"", "\\\"")}"` : value).join(",")}}`);
|
|
39
|
+
}
|
|
40
|
+
//#endregion
|
|
41
|
+
//#region src/cli/sql/columns.ts
|
|
42
|
+
/** The Postgres type a JSON Schema property compares as; `undefined` for text or an unknown shape. */
|
|
43
|
+
function columnTypeOf(property) {
|
|
44
|
+
if (!isRecord(property)) return;
|
|
45
|
+
const variants = [property["anyOf"], property["oneOf"]].find(Array.isArray);
|
|
46
|
+
if (variants !== void 0) {
|
|
47
|
+
const present = variants.filter((item) => !(isRecord(item) && item["type"] === "null"));
|
|
48
|
+
return present.length === 1 ? columnTypeOf(present[0]) : void 0;
|
|
49
|
+
}
|
|
50
|
+
const types = (Array.isArray(property["type"]) ? property["type"] : [property["type"]]).filter((item) => item !== "null");
|
|
51
|
+
if (types.length !== 1) return;
|
|
52
|
+
switch (types[0]) {
|
|
53
|
+
case "integer":
|
|
54
|
+
case "number": return "numeric";
|
|
55
|
+
case "boolean": return "boolean";
|
|
56
|
+
case "string": switch (property["format"]) {
|
|
57
|
+
case "date-time": return "timestamptz";
|
|
58
|
+
case "date": return "date";
|
|
59
|
+
case "uuid": return "uuid";
|
|
60
|
+
default: return;
|
|
61
|
+
}
|
|
62
|
+
default: return;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Column types from a resource's JSON Schema (`~standard.jsonSchema`): numbers
|
|
67
|
+
* compare as `numeric`, booleans as `boolean`, and `date-time`, `date` and
|
|
68
|
+
* `uuid` strings as `timestamptz`, `date` and `uuid`. Other columns are left
|
|
69
|
+
* out and compare as text.
|
|
70
|
+
*/
|
|
71
|
+
function columnTypesOf(schema) {
|
|
72
|
+
const properties = isRecord(schema) ? schema["properties"] : void 0;
|
|
73
|
+
if (!isRecord(properties)) return {};
|
|
74
|
+
const types = {};
|
|
75
|
+
for (const [name, property] of Object.entries(properties)) {
|
|
76
|
+
const type = isForbiddenKey(name) ? void 0 : columnTypeOf(property);
|
|
77
|
+
if (type !== void 0) types[name] = type;
|
|
78
|
+
}
|
|
79
|
+
return types;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Array columns from a resource's JSON Schema, each with the type its items
|
|
83
|
+
* compare as (`text` when `columnTypesOf` would leave the item out).
|
|
84
|
+
*/
|
|
85
|
+
function arrayColumnsOf(schema) {
|
|
86
|
+
const properties = isRecord(schema) ? schema["properties"] : void 0;
|
|
87
|
+
if (!isRecord(properties)) return {};
|
|
88
|
+
const arrays = {};
|
|
89
|
+
for (const [name, property] of Object.entries(properties)) {
|
|
90
|
+
if (isForbiddenKey(name) || !isRecord(property)) continue;
|
|
91
|
+
const types = (Array.isArray(property["type"]) ? property["type"] : [property["type"]]).filter((item) => item !== "null");
|
|
92
|
+
if (types.length === 1 && types[0] === "array") arrays[name] = columnTypeOf(property["items"]) ?? "text";
|
|
93
|
+
}
|
|
94
|
+
return arrays;
|
|
95
|
+
}
|
|
96
|
+
const SQL_TYPE = /^[A-Za-z_][A-Za-z0-9_]*( [A-Za-z_][A-Za-z0-9_]*)*(\[\])?$/u;
|
|
97
|
+
function sqlType(name) {
|
|
98
|
+
if (!SQL_TYPE.test(name)) throw configError(`PermDock CLI: unsafe SQL type '${name}'`);
|
|
99
|
+
return name;
|
|
100
|
+
}
|
|
101
|
+
function tenantTypeOf(ctx) {
|
|
102
|
+
return sqlType(ctx.tenantType ?? "uuid");
|
|
103
|
+
}
|
|
104
|
+
function teamTypeOf(ctx) {
|
|
105
|
+
return sqlType(ctx.teamType ?? ctx.tenantType ?? "uuid");
|
|
106
|
+
}
|
|
107
|
+
/** Postgres type of scope `name`'s id: `scopeTypes`, then the tenant / team type by position. */
|
|
108
|
+
function scopeTypeOf(ctx, name) {
|
|
109
|
+
const declared = ctx.scopeTypes?.[name];
|
|
110
|
+
if (declared !== void 0) return sqlType(declared);
|
|
111
|
+
return name === ctx.scopes[1]?.name ? teamTypeOf(ctx) : tenantTypeOf(ctx);
|
|
112
|
+
}
|
|
113
|
+
//#endregion
|
|
114
|
+
//#region src/cli/sql/context.ts
|
|
115
|
+
const CLAIM = SQL_IDENT;
|
|
116
|
+
function parseMembershipsFlag(raw) {
|
|
117
|
+
if (raw === void 0 || raw === "") return;
|
|
118
|
+
const colon = raw.indexOf(":");
|
|
119
|
+
const table = colon === -1 ? raw : raw.slice(0, colon);
|
|
120
|
+
const cols = (colon === -1 ? "" : raw.slice(colon + 1)).split(",").map((item) => item.trim()).filter((item) => item !== "");
|
|
121
|
+
return { tenant: {
|
|
122
|
+
table,
|
|
123
|
+
tenant: cols[0] ?? "tenant_id",
|
|
124
|
+
user: cols[1] ?? "user_id",
|
|
125
|
+
role: cols[2] ?? "role",
|
|
126
|
+
...cols[3] === void 0 ? {} : { expiresAt: cols[3] }
|
|
127
|
+
} };
|
|
128
|
+
}
|
|
129
|
+
//#endregion
|
|
130
|
+
//#region src/cli/sql/subject.ts
|
|
131
|
+
/**
|
|
132
|
+
* A role with `for` counts only on a membership of one of those kinds:
|
|
133
|
+
* `case role when 'admin' then via = any(...) ... else true end`. A missing
|
|
134
|
+
* kind (`viaExpr` null) holds none of them. A constant kind folds into the
|
|
135
|
+
* roles it excludes, or no filter. `undefined` when nothing is filtered.
|
|
136
|
+
*/
|
|
137
|
+
function kindFilterSql(ctx, roleExpr, viaExpr) {
|
|
138
|
+
const kinds = Object.entries(ctx.ownership?.kinds ?? {}).toSorted(([a], [b]) => byCodePoint(a, b));
|
|
139
|
+
if (kinds.length === 0) return;
|
|
140
|
+
if (typeof viaExpr !== "string") {
|
|
141
|
+
const excluded = kinds.filter(([, allowed]) => !viaAllowed(viaExpr.value, allowed)).map(([role]) => role);
|
|
142
|
+
return excluded.length === 0 ? void 0 : `not (${roleExpr} = any(array[${excluded.map(quoteLiteral).join(", ")}]::text[]))`;
|
|
143
|
+
}
|
|
144
|
+
return `case ${roleExpr} ${kinds.map(([role, allowed]) => `when ${quoteLiteral(role)} then coalesce(${viaExpr}, '') = any(array[${allowed.map(quoteLiteral).join(", ")}]::text[])`).join(" ")} else true end`;
|
|
145
|
+
}
|
|
146
|
+
/** The kind check for one known role; `undefined` when it has no `for` or a constant kind it allows. */
|
|
147
|
+
function roleKindSql(ctx, role, viaExpr) {
|
|
148
|
+
const allowed = ctx.ownership?.kinds[role];
|
|
149
|
+
if (allowed === void 0) return;
|
|
150
|
+
if (typeof viaExpr !== "string") return viaAllowed(viaExpr.value, allowed) ? void 0 : "false";
|
|
151
|
+
return `coalesce(${viaExpr}, '') = any(array[${allowed.map(quoteLiteral).join(", ")}]::text[])`;
|
|
152
|
+
}
|
|
153
|
+
/** Roles with `for` held globally (no membership, so no kind) grant nothing. */
|
|
154
|
+
function globalKindFilterSql(ctx, roleExpr) {
|
|
155
|
+
const roles = Object.keys(ctx.ownership?.kinds ?? {}).toSorted();
|
|
156
|
+
return roles.length === 0 ? void 0 : `not (${roleExpr} = any(array[${roles.map(quoteLiteral).join(", ")}]::text[]))`;
|
|
157
|
+
}
|
|
158
|
+
function keyTenantSql(ctx, tenant) {
|
|
159
|
+
const keys = ctx.apiKeys;
|
|
160
|
+
if (keys === void 0) return;
|
|
161
|
+
const named = `nullif(${subjectClaimJsonSql(ctx, keys.claim)} ->> ${quoteLiteral(keys.tenant)}, '')`;
|
|
162
|
+
return tenant === void 0 ? `${named} is null` : `(${named} is null or (${tenant})::text = ${named})`;
|
|
163
|
+
}
|
|
164
|
+
/** The active-tenant claim cast to the tenant column's type, so the comparison uses the column's index. */
|
|
165
|
+
function tenantClaimSql(ctx) {
|
|
166
|
+
return `${subjectClaimSql(ctx, ctx.tenantClaim)}::${tenantTypeOf(ctx)}`;
|
|
167
|
+
}
|
|
168
|
+
const USER_ID_HELPER = "permdock_user_id";
|
|
169
|
+
function userIdHelperSql(ctx) {
|
|
170
|
+
return qualified(ctx, USER_ID_HELPER);
|
|
171
|
+
}
|
|
172
|
+
const SESSION_LIVE_HELPER = "permdock_session_live";
|
|
173
|
+
/** `{ subject: { session: { live: true } } }` in a policy; only Supabase has `auth.sessions`. */
|
|
174
|
+
function liveSessionSql(ctx) {
|
|
175
|
+
if (ctx.dialect !== "supabase") throw configError(`PermDock CLI: { subject: { session: { live: true } } } reads auth.sessions, which only the supabase dialect has (got ${ctx.dialect})`);
|
|
176
|
+
return `(select ${qualified(ctx, SESSION_LIVE_HELPER)}())`;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* `permdock_session_live()`: the token's `session_id` names a session of its
|
|
180
|
+
* user that is still in `auth.sessions`, so a signed-out or revoked session
|
|
181
|
+
* stops passing before the token's `exp`. A token without one, such as a
|
|
182
|
+
* service key's, is never live.
|
|
183
|
+
*/
|
|
184
|
+
function sessionLiveHelperSql(ctx) {
|
|
185
|
+
const name = qualified(ctx, SESSION_LIVE_HELPER);
|
|
186
|
+
return `create or replace function ${name}()
|
|
187
|
+
returns boolean
|
|
188
|
+
language plpgsql
|
|
189
|
+
stable
|
|
190
|
+
security definer
|
|
191
|
+
set search_path = ''
|
|
192
|
+
as $$
|
|
193
|
+
declare
|
|
194
|
+
v_session uuid;
|
|
195
|
+
begin
|
|
196
|
+
begin
|
|
197
|
+
v_session := nullif((select auth.jwt()) ->> 'session_id', '')::uuid;
|
|
198
|
+
exception when invalid_text_representation then
|
|
199
|
+
return false;
|
|
200
|
+
end;
|
|
201
|
+
if v_session is null then
|
|
202
|
+
return false;
|
|
203
|
+
end if;
|
|
204
|
+
return exists (
|
|
205
|
+
select 1
|
|
206
|
+
from auth.sessions s
|
|
207
|
+
where s.id = v_session
|
|
208
|
+
and s.user_id::text = ${subjectIdSql(ctx)}::text
|
|
209
|
+
and (s.not_after is null or s.not_after > now())
|
|
210
|
+
);
|
|
211
|
+
end;
|
|
212
|
+
$$;
|
|
213
|
+
revoke execute on function ${name}() from public, anon;
|
|
214
|
+
grant execute on function ${name}() to authenticated;
|
|
215
|
+
`;
|
|
216
|
+
}
|
|
217
|
+
function subjectIdSql(ctx) {
|
|
218
|
+
if (ctx.subjectId !== void 0) return ctx.subjectId;
|
|
219
|
+
switch (ctx.dialect) {
|
|
220
|
+
case "supabase": return `(select ${userIdHelperSql(ctx)}())`;
|
|
221
|
+
case "neon": return "(select auth.user_id())";
|
|
222
|
+
case "guc": return `(select current_setting(${quoteLiteral(`${ctx.gucPrefix}.user_id`)}, true))`;
|
|
223
|
+
default: return ctx.dialect;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
function subjectClaimSql(ctx, claim) {
|
|
227
|
+
if (!CLAIM.test(claim)) throw configError(`PermDock CLI: unsafe claim name '${claim}'`);
|
|
228
|
+
switch (ctx.dialect) {
|
|
229
|
+
case "supabase": return `((select auth.jwt()) ->> ${quoteLiteral(claim)})`;
|
|
230
|
+
case "neon": return `((select auth.session()) ->> ${quoteLiteral(claim)})`;
|
|
231
|
+
case "guc": return `(select current_setting(${quoteLiteral(`${ctx.gucPrefix}.${claim}`)}, true))`;
|
|
232
|
+
default: return ctx.dialect;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/** A claim as `jsonb`; the `guc` dialect stores JSON text in `<prefix>.<claim>`. */
|
|
236
|
+
function subjectClaimJsonSql(ctx, claim) {
|
|
237
|
+
if (!CLAIM.test(claim)) throw configError(`PermDock CLI: unsafe claim name '${claim}'`);
|
|
238
|
+
switch (ctx.dialect) {
|
|
239
|
+
case "supabase": return `((select auth.jwt()) -> ${quoteLiteral(claim)})`;
|
|
240
|
+
case "neon": return `((select auth.session()) -> ${quoteLiteral(claim)})`;
|
|
241
|
+
case "guc": return `nullif((select current_setting(${quoteLiteral(`${ctx.gucPrefix}.${claim}`)}, true)), '')::jsonb`;
|
|
242
|
+
default: return ctx.dialect;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
function viaAllowed(value, allowed) {
|
|
246
|
+
return allowed.includes(value ?? "");
|
|
247
|
+
}
|
|
248
|
+
/** The membership kind of a row `m` of `table`: its column as text, or its constant (`null` without one). */
|
|
249
|
+
function memberVia(table) {
|
|
250
|
+
const via = table.via;
|
|
251
|
+
if (via === void 0) return { value: null };
|
|
252
|
+
return typeof via === "string" ? `m.${quoteIdent(via)}::text` : { value: via.value };
|
|
253
|
+
}
|
|
254
|
+
//#endregion
|
|
255
|
+
//#region src/cli/sql/shared.ts
|
|
256
|
+
/** `rls.customRoles` turns custom roles on as `true` or as an object. */
|
|
257
|
+
function customRolesOn(rls) {
|
|
258
|
+
const custom = rls?.customRoles;
|
|
259
|
+
return custom === true || typeof custom === "object" && custom !== null;
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* The per-statement helpers every generated policy calls: `permdock_has` for
|
|
263
|
+
* global roles and one `permitted_<scope>_ids` per scope
|
|
264
|
+
* (`permittedIdsHelper`). Names are part of the SQL contract.
|
|
265
|
+
*/
|
|
266
|
+
const HELPERS = {
|
|
267
|
+
has: "permdock_has",
|
|
268
|
+
hasFor: "permdock_has_for"
|
|
269
|
+
};
|
|
270
|
+
/** Objects `--custom-roles` adds next to the helpers. Names are part of the SQL contract. */
|
|
271
|
+
const CUSTOM_ROLES = {
|
|
272
|
+
permissions: "custom_role_permissions",
|
|
273
|
+
includes: "custom_role_includes",
|
|
274
|
+
ceiling: "permdock_ceiling",
|
|
275
|
+
keys: "permdock_custom_keys",
|
|
276
|
+
beyond: "permdock_custom_role_beyond",
|
|
277
|
+
guard: "permdock_custom_role_guard",
|
|
278
|
+
beyondFor: "permdock_custom_role_beyond_for",
|
|
279
|
+
guardFor: "permdock_custom_role_guard_for",
|
|
280
|
+
shape: "permdock_custom_role_shape",
|
|
281
|
+
entries: "permdock_custom_role_entries",
|
|
282
|
+
replace: "permdock_replace_custom_role_grants",
|
|
283
|
+
rename: "permdock_rename_custom_role_grants",
|
|
284
|
+
remove: "permdock_delete_custom_role_grants",
|
|
285
|
+
trustedReplace: "permdock_trusted_replace_custom_role_grants",
|
|
286
|
+
trustedRename: "permdock_trusted_rename_custom_role_grants",
|
|
287
|
+
trustedRemove: "permdock_trusted_delete_custom_role_grants",
|
|
288
|
+
cascade: "permdock_cascade_custom_role"
|
|
289
|
+
};
|
|
290
|
+
/** The function `rls.roles` adds. The name is part of the SQL contract. */
|
|
291
|
+
const GLOBAL_ROLES = { replace: "permdock_replace_global_roles" };
|
|
292
|
+
/** `user` is the SQL for the user id: the dialect's (the default) or the `p_user` parameter of a `_for` helper. */
|
|
293
|
+
function signedIn(ctx, user = subjectIdSql(ctx)) {
|
|
294
|
+
return `coalesce(${user}::text, '') <> ''`;
|
|
295
|
+
}
|
|
296
|
+
function rootName(ctx) {
|
|
297
|
+
return ctx.scopes[0]?.name ?? "tenant";
|
|
298
|
+
}
|
|
299
|
+
/** The stored allow as `permissions` hands it to `permdock_custom_keys`: `key`, or `key@level` with levels. */
|
|
300
|
+
function allowEntry(ctx) {
|
|
301
|
+
return ctx.customRoles?.levels === true ? "permission || coalesce('@' || c.level, '')" : "permission";
|
|
302
|
+
}
|
|
303
|
+
//#endregion
|
|
304
|
+
export { declaredArray as A, parseMembershipsFlag as C, sqlType as D, scopeTypeOf as E, quoteQualified as F, quoteTable as I, textArrayLiteral as L, qualified as M, quoteIdent as N, tenantTypeOf as O, quoteLiteral as P, CLAIM as S, columnTypesOf as T, subjectClaimJsonSql as _, customRolesOn as a, tenantClaimSql as b, SESSION_LIVE_HELPER as c, keyTenantSql as d, kindFilterSql as f, sessionLiveHelperSql as g, roleKindSql as h, allowEntry as i, helperSchema as j, CLI as k, USER_ID_HELPER as l, memberVia as m, GLOBAL_ROLES as n, rootName as o, liveSessionSql as p, HELPERS as r, signedIn as s, CUSTOM_ROLES as t, globalKindFilterSql as u, subjectClaimSql as v, arrayColumnsOf as w, userIdHelperSql as x, subjectIdSql as y };
|
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { a as durationOf, f as nowMillis } from "./time-DkWjdL98.js";
|
|
2
|
+
import { t as decisionToken } from "./token-BLZcjQgt.js";
|
|
2
3
|
//#region src/pdp/shared.ts
|
|
3
|
-
const
|
|
4
|
+
const MAX_CACHE_TTL = 30;
|
|
4
5
|
const CACHE_MAX = 1e3;
|
|
5
|
-
/** Milliseconds, clamped to `
|
|
6
|
+
/** Milliseconds from `ttl` seconds, clamped to 30 s; a `ttl` that is not a whole number of seconds above 0 disables the cache. */
|
|
6
7
|
function ttlMs(cache) {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
if (!Number.isFinite(raw) || raw <= 0) return 0;
|
|
10
|
-
return Math.min(raw, MAX_CACHE_TTL_MS);
|
|
8
|
+
const ttl = durationOf(cache?.ttl);
|
|
9
|
+
return ttl === void 0 ? 0 : Math.min(ttl, MAX_CACHE_TTL) * 1e3;
|
|
11
10
|
}
|
|
12
11
|
function denied(reason) {
|
|
13
12
|
return {
|
|
@@ -68,13 +67,13 @@ function ttlCache(ttl) {
|
|
|
68
67
|
get(key) {
|
|
69
68
|
if (ttl <= 0) return;
|
|
70
69
|
const hit = entries.get(key);
|
|
71
|
-
if (hit !== void 0 &&
|
|
70
|
+
if (hit !== void 0 && nowMillis() - hit.at < ttl) return hit.value;
|
|
72
71
|
entries.delete(key);
|
|
73
72
|
},
|
|
74
73
|
set(key, value) {
|
|
75
74
|
if (ttl <= 0) return;
|
|
76
75
|
entries.set(key, {
|
|
77
|
-
at:
|
|
76
|
+
at: nowMillis(),
|
|
78
77
|
value
|
|
79
78
|
});
|
|
80
79
|
if (entries.size > CACHE_MAX) {
|