permdock 0.3.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -35
- package/dist/{openapi-schema--ARjyfQr.js → 2020-C9VN-x8c.js} +5 -132
- package/dist/a2a/index.d.ts +8 -6
- package/dist/a2a/index.js +21 -31
- package/dist/{adapter-context-mlWsVGGg.js → adapter-context-CRhqyzCk.js} +1 -1
- package/dist/adoption-scan-B4R5fnMU.js +107 -0
- package/dist/agent/index.d.ts +3 -0
- package/dist/agent/index.js +1 -0
- package/dist/ai-sdk/index.d.ts +18 -23
- package/dist/ai-sdk/index.js +38 -21
- package/dist/app-data-MuyzVqX8.js +60 -0
- package/dist/approval-header-CJACtHkv.js +23 -0
- package/dist/approval-prompt-Dg5LeAcT.js +62 -0
- package/dist/approval-prompt-Djo_PyZc.d.ts +57 -0
- package/dist/approvals/index.d.ts +5 -3
- package/dist/approvals/index.js +8 -5
- package/dist/approvals-DJ6Yd5z1.js +995 -0
- package/dist/{approvers-DT4AVyIg.js → approvers-CqPOLD-o.js} +1 -1
- package/dist/arazzo-B6lebmiQ.js +36 -0
- package/dist/{arazzo-BAgw9ap6.js → arazzo-BWhNF-k0.js} +24 -17
- package/dist/args-IIolxxKA.js +197 -0
- package/dist/astro/index.d.ts +43 -0
- package/dist/astro/index.js +27 -0
- package/dist/audience-Dg8XsRaO.js +55 -0
- package/dist/auth-DRLEizbL.js +178 -0
- package/dist/authzen/index.d.ts +26 -6
- package/dist/authzen/index.js +228 -75
- package/dist/automation-BMZPIVUM.d.ts +114 -0
- package/dist/automation-DVjOckjV.js +157 -0
- package/dist/better-auth/index.d.ts +8 -6
- package/dist/better-auth/index.js +11 -23
- package/dist/better-supabase/index.d.ts +438 -86
- package/dist/better-supabase/index.js +1027 -184
- package/dist/bind--9EFVYWF.d.ts +38 -0
- package/dist/{bind-CuzGytRf.js → bind-CZzhx-Vj.js} +22 -10
- package/dist/body-CH5of8Ne.js +10 -0
- package/dist/body-text-QcXok_SI.js +52 -0
- package/dist/build-instance-BMnAudHn.js +52 -0
- package/dist/{canonical-json-DemiK4Vp.js → canonical-json-BC8_nMTw.js} +6 -6
- package/dist/{capability-2kYTMWDv.d.ts → capability-BSslw1QV.d.ts} +44 -25
- package/dist/{capability-4qPdO9gk.js → capability-N1K9IpqS.js} +69 -42
- package/dist/casbin-Cr7RLtA3.js +30 -0
- package/dist/casbin-Dyu2gnUD.js +234 -0
- package/dist/casl-64gpT-8x.js +24 -0
- package/dist/casl-DjEDhTCP.js +299 -0
- package/dist/catalog/index.d.ts +74 -2
- package/dist/catalog/index.js +51 -2
- package/dist/catalog-BECMPrwc.js +100 -0
- package/dist/catalog-DjhMYYCq.js +1 -0
- package/dist/catalog-R_A__RsH.js +52 -0
- package/dist/{catalog-doc-DdGm82XT.js → catalog-doc-C9wjsfNY.js} +54 -25
- package/dist/catalog-fingerprint-CCP0-yQS.js +153 -0
- package/dist/chat/index.d.ts +2 -0
- package/dist/chat/index.js +224 -0
- package/dist/chat-sdk/index.d.ts +87 -0
- package/dist/chat-sdk/index.js +197 -0
- package/dist/claims-map-7oQ3ue4X.js +13 -0
- package/dist/claims-map-Ca-QX8C6.d.ts +32 -0
- package/dist/claude-agent/index.d.ts +7 -14
- package/dist/claude-agent/index.js +26 -30
- package/dist/clerk/index.d.ts +9 -8
- package/dist/clerk/index.js +15 -45
- package/dist/cli/bin.js +36 -17
- package/dist/cli/index.d.ts +20 -6
- package/dist/cli/index.js +164 -4
- package/dist/cloud/index.d.ts +102 -63
- package/dist/cloud/index.js +240 -347
- package/dist/cloud-CIoHNevm.js +87 -0
- package/dist/codemod-Bmj9dWMH.js +37 -0
- package/dist/codemod-Cxvvc70T.js +2084 -0
- package/dist/{collect-DSTE3ml9.js → collect-CrZJJnEF.js} +79 -17
- package/dist/collect-DloHbDVa.js +55 -0
- package/dist/collect-FlXJlhus.js +1 -0
- package/dist/command-L8EstFNm.js +6 -0
- package/dist/{compact-y6vfu2_f.js → compact-CAf557ZB.js} +11 -1
- package/dist/compile/index.d.ts +1 -1
- package/dist/compile/index.js +1 -2
- package/dist/{compile-Ba4blROR.js → compile-CMqMx_IN.js} +13 -9
- package/dist/{compile-BkRyBDBw.d.ts → compile-Ckm2HqBZ.d.ts} +5 -3
- package/dist/completion-BqhRBJD8.js +143 -0
- package/dist/config-B46rm9sc.js +26 -0
- package/dist/{config-BJiM-xAm.js → config-bs_kZeYq.js} +15 -10
- package/dist/{config-report-CdCgbRnV.js → config-report-DUgj62Ai.js} +17 -8
- package/dist/{connection-CU8MQxRi.js → connection-DjhIJSs2.js} +8 -6
- package/dist/constants-DcJABbLW.js +20 -0
- package/dist/{context-Bcy85rGi.js → context-bbFHR-0D.js} +16 -5
- package/dist/convex/index.d.ts +11 -10
- package/dist/convex/index.js +18 -18
- package/dist/create-0VZ7Pdiu.d.ts +107 -0
- package/dist/create-BDS7wc3y.d.ts +138 -0
- package/dist/create-BFfm17UA.d.ts +110 -0
- package/dist/create-BWRSXgOF.js +403 -0
- package/dist/create-C3b4B5eF.js +130 -0
- package/dist/create-DnrmLnLW.js +323 -0
- package/dist/{credential-8P81ff4u.js → credential-DM2um3ha.js} +153 -32
- package/dist/credentials-DPyHmYz5.js +74 -0
- package/dist/deciding-columns-Sq12mEA6.js +123 -0
- package/dist/delegation-DaXVdDhM.js +286 -0
- package/dist/delegation-input-FTxMK3ji.js +19 -0
- package/dist/delivery/index.d.ts +5 -0
- package/dist/delivery/index.js +5 -0
- package/dist/delivery-DCAgNyCn.js +499 -0
- package/dist/delivery-event-xX4obB8F.js +40 -0
- package/dist/denied-text-D8jDHgsl.d.ts +19 -0
- package/dist/{describe-DMYiCjJV.d.ts → describe-BZUsixiL.d.ts} +11 -2
- package/dist/{describe-B_gVZEVi.js → describe-BybMRY7A.js} +10 -5
- package/dist/device-BARQ8eYG.js +193 -0
- package/dist/diff-CxZo9pTq.js +37 -0
- package/dist/{diff-2VaeChzX.js → diff-DCePiN6M.js} +61 -55
- package/dist/doctor-CxiwSfqH.js +44 -0
- package/dist/doctor-DFjUxf2f.js +2361 -0
- package/dist/drizzle/index.d.ts +5 -3
- package/dist/drizzle/index.js +6 -14
- package/dist/elysia/index.d.ts +16 -13
- package/dist/elysia/index.js +14 -13
- package/dist/env-DJZrPjRi.js +8 -0
- package/dist/errors-BDUwg2qC.js +27 -0
- package/dist/{errors-Cz5zn0mW.js → errors-BKy0EfhN.js} +6 -10
- package/dist/errors-BWXBMaKK.d.ts +11 -0
- package/dist/{errors-DPdqI50v.d.ts → errors-C2PXIv4c.d.ts} +2 -2
- package/dist/errors-CWTY6uih.js +143 -0
- package/dist/evaluate-_R8QkWaf.js +1732 -0
- package/dist/evaluations-16UqqQ6W.d.ts +32 -0
- package/dist/{evaluations-tz6D9A2G.js → evaluations-DZ2CbV5k.js} +181 -32
- package/dist/eve/index.d.ts +12 -16
- package/dist/eve/index.js +23 -29
- package/dist/event-time-CsegxXxB.js +23 -0
- package/dist/expiry-D4_YKRKD.js +52 -0
- package/dist/express/index.d.ts +13 -10
- package/dist/express/index.js +14 -12
- package/dist/fastify/index.d.ts +26 -13
- package/dist/fastify/index.js +17 -36
- package/dist/fetch-adapter-g0ypLkID.js +120 -0
- package/dist/fetch-adapter-qKJBuRqy.d.ts +31 -0
- package/dist/fields-D9tPVUUS.js +203 -0
- package/dist/files-C5ZI27eV.js +124 -0
- package/dist/{files-DWUN9PzI.js → files-D_JIzUrP.js} +12 -3
- package/dist/{fixtures-ht28Cplr.js → fixtures-B7XrLeY7.js} +12 -12
- package/dist/flags-C3DktBDY.js +86 -0
- package/dist/{from-snapshot-CTLijvdm.js → from-snapshot-D2lZt4Dd.js} +78 -65
- package/dist/{generate-CH7ThJ14.js → generate-CNU1pIOo.js} +1 -3
- package/dist/grantee-Cn1HyUsI.js +254 -0
- package/dist/grantee-conditions-CcXf8hMM.js +271 -0
- package/dist/grantee-match-DHArqY82.js +142 -0
- package/dist/h3/index.d.ts +37 -0
- package/dist/h3/index.js +35 -0
- package/dist/headers-BIjfMaoC.js +8 -0
- package/dist/headers-CIbDTUTK.d.ts +7 -0
- package/dist/{helpers-H_KARDVC.js → helpers-DTcZOzhF.js} +47 -39
- package/dist/hono/index.d.ts +12 -9
- package/dist/hono/index.js +14 -13
- package/dist/{hosted-DJQw46hn.js → hosted-BZIAYvon.js} +64 -15
- package/dist/hosted-DBDX0M-P.d.ts +78 -0
- package/dist/{http-SO7qGttf.js → http-BBoKefeS.js} +35 -2
- package/dist/{http-DPuDaChb.d.ts → http-B_LphE5Y.d.ts} +1 -2
- package/dist/http-DXJ37RDA.js +46 -0
- package/dist/{http-BIhmLfCc.js → http-ujKm0JXE.js} +3 -26
- package/dist/{openapi-import-cmwetbzw.js → import-CNV7I2Dw.js} +30 -26
- package/dist/{rls-import-4lLW_pbb.js → import-DMmOG27O.js} +271 -128
- package/dist/index-BcHcPyIo.d.ts +110 -0
- package/dist/index-CaxrMD1A.d.ts +1 -0
- package/dist/index-Chrs5fQ-.d.ts +210 -0
- package/dist/index-CxGUswIC.d.ts +431 -0
- package/dist/index-D8EovfsP.d.ts +91 -0
- package/dist/index-DOVf7RJv.d.ts +900 -0
- package/dist/{index-C8z4RjQV.d.ts → index-SGdIQyzc.d.ts} +34 -16
- package/dist/index.d.ts +20 -14
- package/dist/index.js +33 -23
- package/dist/init-DeMYsnYJ.js +96 -0
- package/dist/init-GG6Jh8HD.js +95 -0
- package/dist/{instance-options-jARdwfPN.d.ts → instance-options-Omfd793B.d.ts} +2 -2
- package/dist/instance-snapshot-Cxq4ygFc.js +600 -0
- package/dist/instant-BluqDvyS.js +19 -0
- package/dist/internals-Dk8A8fX3.js +17 -0
- package/dist/{json-schema-BsAflUGW.js → json-schema-B-vAwlde.js} +46 -9
- package/dist/json-schema-CN_iLFH2.d.ts +40 -0
- package/dist/jwt/index.d.ts +18 -11
- package/dist/jwt/index.js +166 -145
- package/dist/{kernel-_RRHmnMY.js → kernel-5JatXyND.js} +120 -43
- package/dist/kysely/index.d.ts +5 -3
- package/dist/kysely/index.js +6 -14
- package/dist/{live-options-H2eG8dfJ.js → live-options-BaAFCIiu.js} +16 -3
- package/dist/load-BxEtwlBS.js +1 -0
- package/dist/{load-DhWEB9P1.js → load-DFS_ry0W.js} +31 -7
- package/dist/{load-jose-BL6LH4bL.js → load-jose-DZ4dnjri.js} +1 -4
- package/dist/login-Dfe5RlYk.js +68 -0
- package/dist/login-imhuwvn3.js +254 -0
- package/dist/manifest-C8IzW3Do.js +42 -0
- package/dist/manifest-CtKR3GXL.js +370 -0
- package/dist/manifest-json-CAGzls-C.js +9 -0
- package/dist/{manifest-uDS9y5de.d.ts → manifest-mx5ghSFM.d.ts} +9 -2
- package/dist/manifest-schema-C0kK_8V0.js +399 -0
- package/dist/{map-claims-Z4QZOiFF.js → map-claims-D3oRmTk0.js} +19 -25
- package/dist/{map-error-pgUWNNtG.js → map-error-TCAdw-eW.js} +5 -5
- package/dist/{markers-B0hYLvMD.js → markers-C6joDI3o.js} +8 -3
- package/dist/mcp/index.d.ts +36 -9
- package/dist/mcp/index.js +476 -448
- package/dist/{rls-migrate-CN4TlJTO.js → migrate-BShP7Vf4.js} +119 -20
- package/dist/nest/index.d.ts +12 -9
- package/dist/nest/index.js +20 -20
- package/dist/next/index.d.ts +40 -20
- package/dist/next/index.js +37 -39
- package/dist/next/plugin.d.ts +1 -1
- package/dist/next/plugin.js +2 -2
- package/dist/node/index.d.ts +10 -10
- package/dist/node/index.js +7 -9
- package/dist/ocsf-BFp-PZZA.js +126 -0
- package/dist/openai/index.d.ts +9 -16
- package/dist/openai/index.js +18 -25
- package/dist/openapi/index.d.ts +3 -3
- package/dist/openapi/index.js +1 -1
- package/dist/{openapi-BqRBvAng.js → openapi-B7HZ0f-r.js} +9 -12
- package/dist/{openapi-CqqEbHsL.js → openapi-DTaEmTSW.js} +23 -26
- package/dist/openapi-ahr8rHu3.js +138 -0
- package/dist/operation-findings-DgATDpvh.js +36 -0
- package/dist/operations-CxybZErY.d.ts +59 -0
- package/dist/orpc/index.d.ts +13 -10
- package/dist/orpc/index.js +23 -20
- package/dist/otel/index.d.ts +3 -2
- package/dist/otel/index.js +53 -27
- package/dist/output-Dyw8fyPF.js +88 -0
- package/dist/output-files-B3IZJksC.js +1 -0
- package/dist/output-files-DhRBBE4n.js +138 -0
- package/dist/{rls-fields-CZOMlwHl.js → ownership-BatFgAA4.js} +2393 -2349
- package/dist/{package-root-zGkxO3oN.js → package-root-Dk_ETdkp.js} +4 -3
- package/dist/{parse-BuyjxhZV.js → parse-Cxq0WxrA.js} +3 -3
- package/dist/{parse-local-manifest-BrMozJCo.js → parse-local-manifest-CVSs6J9I.js} +2 -4
- package/dist/{parse-local-manifest-JLnaBH0S.d.ts → parse-local-manifest-DgqtruPn.d.ts} +1 -1
- package/dist/parse-request-D_tUXG6M.js +26 -0
- package/dist/paths-DXSHAMIa.js +42 -0
- package/dist/pdp/index.d.ts +7 -3
- package/dist/pdp/index.js +47 -29
- package/dist/{peer-BOr_kJE1.js → peer-C8swJ2GH.js} +23 -4
- package/dist/peer-CRvC7Hg1.js +1 -0
- package/dist/permdock-B9JxkBwC.js +868 -0
- package/dist/permdock-D7eeLJER.d.ts +502 -0
- package/dist/permission-registry-Br4jSNVi.js +385 -0
- package/dist/permissions-B-wCP5ZC.js +30 -0
- package/dist/{permissions-RJrovw98.js → permissions-CZKiUfFM.js} +4 -3
- package/dist/{permissions-CDgvKG5L.d.ts → permissions-oEWfl-kl.d.ts} +1 -2
- package/dist/policies-CO1oOymN.js +295 -0
- package/dist/{policy-D2W7uv19.d.ts → policy-Czo4n3Hs.d.ts} +2 -2
- package/dist/policy-DLZJ5gAp.js +399 -0
- package/dist/policy-from-catalog-DzhEc3Y9.js +450 -0
- package/dist/policy-module-CTlwMvLI.js +89 -0
- package/dist/{policy-IB6yxpC3.d.ts → policy-types-DzwivBgR.d.ts} +939 -1057
- package/dist/postgrest-CW0IqC-U.js +566 -0
- package/dist/postgrest-NUqZT-RB.d.ts +100 -0
- package/dist/powersync-BHfuehf3.js +62 -0
- package/dist/powersync-CbzkqL_M.js +1 -0
- package/dist/{powersync-Dv1_aWF7.js → powersync-bYUDLOAO.js} +30 -32
- package/dist/preset/index.d.ts +146 -0
- package/dist/preset/index.js +1 -0
- package/dist/preset-DZdU0tne.js +1768 -0
- package/dist/principal-source-pHneukrx.js +103 -0
- package/dist/prisma/index.d.ts +6 -3
- package/dist/prisma/index.js +6 -12
- package/dist/{problem-B43ztKIm.js → problem-CTviyH5L.js} +18 -27
- package/dist/{problem-details-DX075l9V.d.ts → problem-details-DXlt-vks.d.ts} +1 -1
- package/dist/{problem-details-_AMOYz-w.js → problem-details-cn5X30gZ.js} +45 -42
- package/dist/problem-types-CJ2325SZ.js +5 -0
- package/dist/{prompt-CXYhLfsS.js → prompt-DfZLJLIn.js} +2 -2
- package/dist/protected-DEPHc2xV.d.ts +38 -0
- package/dist/{protected-utU-SLuy.js → protected-DfjY5mLA.js} +37 -8
- package/dist/{provider-CSQd7m92.js → provider-CC-u3bYP.js} +23 -10
- package/dist/{provider-DZY281jO.d.ts → provider-DMVt6yYn.d.ts} +1 -1
- package/dist/{provider-store-Cfbvo4DE.js → provider-store-B5Yrkhzr.js} +6 -3
- package/dist/pull-BgIfno6w.js +256 -0
- package/dist/pull-ByOks_Tg.js +1 -0
- package/dist/push-CmFVBOeI.js +116 -0
- package/dist/pushed-policy-BImMTTIM.d.ts +57 -0
- package/dist/pushed-policy-DobP7AHI.js +238 -0
- package/dist/react/index.d.ts +8 -8
- package/dist/react/index.js +6 -6
- package/dist/react/provider-client.d.ts +1 -1
- package/dist/react/provider-client.js +1 -2
- package/dist/react-native/index.d.ts +24 -63
- package/dist/react-native/index.js +45 -27
- package/dist/{refs-KYb4ntaz.js → refs-K6eWUJ0H.js} +1 -1
- package/dist/relation-walk-3OyDBF0S.js +186 -0
- package/dist/relations-BnCWnJGI.js +163 -0
- package/dist/renames-CGj7YwcQ.js +175 -0
- package/dist/{replay-CYyiLiwO.d.ts → replay-D7iKcLFe.d.ts} +1 -1
- package/dist/{replay-BsOyTrdV.js → replay-Du1tJjG7.js} +2 -1
- package/dist/request-context-BTRTG7OT.js +71 -0
- package/dist/request-context-C2_1lchh.d.ts +5 -0
- package/dist/request-schema-CMreVuFM.js +148 -0
- package/dist/resend/index.d.ts +126 -0
- package/dist/resend/index.js +379 -0
- package/dist/resource-relations-D_jw0BFx.js +243 -0
- package/dist/retire-CALjIQ7e.js +240 -0
- package/dist/{revocations-Cy06JNx2.d.ts → revocations-R07lFBnX.d.ts} +2 -0
- package/dist/rls-BA8an5Ap.js +336 -0
- package/dist/{rls-DiinlRML.js → rls-j6t43t7n.js} +1066 -1068
- package/dist/role-builder-CXbis5-X.js +623 -0
- package/dist/{rpc-DL9Sqvb1.js → rpc-aPyNi6tA.js} +18 -8
- package/dist/run-CNsApDpd.js +1 -0
- package/dist/run-DOfMtc9V.js +723 -0
- package/dist/run-ticket-BjhTOi6u.d.ts +124 -0
- package/dist/run-ticket-sxFI6LAk.js +337 -0
- package/dist/{runtime-CB8gQFvS.js → runtime-D3VTAiCA.js} +1 -1
- package/dist/{saas-DhpJjnBA.js → saas-FO-Q8oj0.js} +18 -15
- package/dist/scan-BOI5tJ-6.js +29 -0
- package/dist/{schema-D3MnDMxa.js → schema-B4v0Qrac.js} +106 -10
- package/dist/schema-yLuBWWsh.js +130 -0
- package/dist/scim/index.d.ts +2 -2
- package/dist/scim/index.js +1 -2
- package/dist/{scim-BFGBBAqR.js → scim-ClHtpyV3.js} +213 -87
- package/dist/{scopes-CVdPrWN-.js → scopes-CUPSjo9q.js} +20 -7
- package/dist/server/index.d.ts +13 -134
- package/dist/server/index.js +13 -10
- package/dist/server-DqCT4CgZ.js +453 -0
- package/dist/{create-B1d519XK.d.ts → server-types-BLd4MnBX.d.ts} +89 -70
- package/dist/{sha256-BO0swRXL.js → sha256-D9ihqmvd.js} +8 -1
- package/dist/shared-CD11nBbC.js +304 -0
- package/dist/{shared-DRu8VFVM.js → shared-DvvFzYXe.js} +8 -9
- package/dist/signals-D3NcTKUS.js +32 -0
- package/dist/sink-BEZSlMS_.js +957 -0
- package/dist/sink-Bj_lDUDq.d.ts +225 -0
- package/dist/{skills-Biq5uup3.js → skills-B6lVdD_W.js} +16 -8
- package/dist/skills-CTYwkl44.js +51 -0
- package/dist/snapshot-CXUWfsNy.js +269 -0
- package/dist/{snapshot-cache-D6jLelln.js → snapshot-cache-DZHQ0KF6.js} +11 -5
- package/dist/{snapshot-cache-B-LxUahj.d.ts → snapshot-cache-DqK9eDmM.d.ts} +7 -5
- package/dist/solid/index.d.ts +24 -25
- package/dist/solid/index.js +41 -11
- package/dist/solid-start/index.d.ts +52 -0
- package/dist/solid-start/index.js +49 -0
- package/dist/{sources-BdOYLw9j.d.ts → sources-BV9j0DeZ.d.ts} +11 -13
- package/dist/{sources-4p0-4xQm.js → sources-vs5dGOsS.js} +147 -142
- package/dist/sql-B5T1IL83.js +55 -0
- package/dist/src-DLfUWFAI.js +1851 -0
- package/dist/ssf/index.d.ts +4 -4
- package/dist/ssf/index.js +440 -106
- package/dist/standard-webhooks-6lg8v_is.d.ts +88 -0
- package/dist/standard-webhooks-DgFFD-Ga.js +228 -0
- package/dist/storage-C2bWdvJH.js +132 -0
- package/dist/{store-DMAWwAJV.js → store-4u_hxjWa.js} +42 -55
- package/dist/{store-options-ByhZq1jV.js → store-options-BqEakYRa.js} +38 -24
- package/dist/{stores-BT2pSCub.js → stores-BbsD4fAR.js} +7 -3
- package/dist/stores-ClZUgeoP.d.ts +30 -0
- package/dist/{stream-D1RXubw2.d.ts → stream-7-xmnf3U.d.ts} +2 -2
- package/dist/{stream-DDpvynSB.js → stream-CvdUS9V1.js} +10 -2
- package/dist/style-DiKWnAvn.js +1 -0
- package/dist/{style-CTm1AXDT.js → style-Uao76wO7.js} +3 -2
- package/dist/subject-BGoM5o8B.js +17 -0
- package/dist/{subject-settings-BwBmCdTR.js → subject-settings-CkEwrw3W.js} +23 -5
- package/dist/supabase/index.d.ts +23 -106
- package/dist/supabase/index.js +5 -4
- package/dist/supabase/middleware.d.ts +13 -6
- package/dist/supabase/middleware.js +16 -11
- package/dist/supabase-9pqI57pW.js +92 -0
- package/dist/{supabase-C0qESOa-.js → supabase-Dxlp8A94.js} +124 -247
- package/dist/supabase-hook-CXcGpHqq.js +1 -0
- package/dist/{supabase-hook-ntETYCQu.js → supabase-hook-DdDQhMlw.js} +1659 -819
- package/dist/{supautils-u8jXTGrt.js → supautils-B6HYL9eL.js} +2 -2
- package/dist/support-session-C6xJQYut.js +158 -0
- package/dist/svelte/Protected.svelte +11 -4
- package/dist/svelte/index.d.ts +7 -7
- package/dist/svelte/index.js +26 -12
- package/dist/svelte/runtime.d.ts +10 -3
- package/dist/svelte/runtime.js +4 -3
- package/dist/svelte/source.d.ts +7 -7
- package/dist/svelte/source.js +5 -5
- package/dist/sveltekit/index.d.ts +51 -0
- package/dist/sveltekit/index.js +27 -0
- package/dist/tanstack-start/index.d.ts +51 -0
- package/dist/tanstack-start/index.js +40 -0
- package/dist/target-Bw37TFNA.js +51 -0
- package/dist/{validity-uOp8UpYn.js → tenancy-DN2QAx9z.js} +6 -42
- package/dist/terminal/index.d.ts +11 -9
- package/dist/terminal/index.js +36 -316
- package/dist/testing/index.d.ts +391 -106
- package/dist/testing/index.js +4574 -1286
- package/dist/testing/saas/index.d.ts +9 -8
- package/dist/testing/saas/index.js +2 -2
- package/dist/testing/saas/permissions.d.ts +1 -1
- package/dist/testing/saas/permissions.js +1 -2
- package/dist/text-BMFRfBqc.js +8 -0
- package/dist/{text-diff-BdkkYSbi.js → text-diff-BQcUapOb.js} +1 -1
- package/dist/thenable-yD7SabqG.js +31 -0
- package/dist/time-DkWjdL98.js +71 -0
- package/dist/{token-CIWxJOCh.js → token-BLZcjQgt.js} +15 -6
- package/dist/tool-refusal-CMLN5xhn.js +41 -0
- package/dist/trpc/index.d.ts +12 -9
- package/dist/trpc/index.js +18 -17
- package/dist/{types-DbjRN55U.d.ts → types-5Ut_pbKy.d.ts} +141 -13
- package/dist/types-BNORmDM8.d.ts +172 -0
- package/dist/types-BjV-fqcA.d.ts +57 -0
- package/dist/{types-QCuYJh4q.d.ts → types-BqAKcRNW.d.ts} +2 -1
- package/dist/types-C8-KNsFf.d.ts +107 -0
- package/dist/{types-aqOHTHcp.d.ts → types-CCpc2Dcv.d.ts} +77 -17
- package/dist/{types-Dnemwd77.d.ts → types-CZTnPFzM.d.ts} +50 -11
- package/dist/{types-C97IskBw.d.ts → types-CdlxsYQh.d.ts} +23 -11
- package/dist/{types-DxiCGmmd.d.ts → types-ClZaWzfb.d.ts} +9 -6
- package/dist/types-DX0LaKTb.d.ts +157 -0
- package/dist/types-DiQjupG2.d.ts +332 -0
- package/dist/types-DqzsnlSA.js +67 -0
- package/dist/types-_sHy8BQf.d.ts +65 -0
- package/dist/types-fbZ7JEXr.d.ts +89 -0
- package/dist/types-tIgIeIKJ.d.ts +66 -0
- package/dist/unplugin/index.d.ts +1 -1
- package/dist/unplugin/index.js +2 -2
- package/dist/usage-CHOtwL19.js +1 -0
- package/dist/usage-DHtE8j4E.js +32 -0
- package/dist/{usage-ItS7nLcl.js → usage-T5mXq98v.js} +56 -13
- package/dist/{validation-error-Ba264OaJ.d.ts → validation-error-Bg5Tpluk.d.ts} +1 -1
- package/dist/{validation-error-CnjZ4t92.js → validation-error-ZfUHbKvf.js} +1 -1
- package/dist/validity-CZ7-y0Cj.js +79 -0
- package/dist/{verifier-BxBo6I44.js → verifier-DHuh-okk.js} +68 -21
- package/dist/verify-DbCL9bnB.js +1770 -0
- package/dist/{version-BvacVTZR.js → version-CEbQ5UeM.js} +4 -3
- package/dist/version-DXkYUISx.js +1 -0
- package/dist/{views-Soe7bGSC.js → views-DTIIO-oQ.js} +41 -2
- package/dist/{permissions-DttnqqxC.d.ts → vocabulary-D6lPdb4Z.d.ts} +120 -29
- package/dist/vue/index.d.ts +25 -21
- package/dist/vue/index.js +25 -9
- package/dist/waiter-BGUtGYoU.js +67 -0
- package/dist/waiter-CKy4MQSY.d.ts +36 -0
- package/dist/watch-Cb-NcaUw.js +1 -0
- package/dist/{watch-DVBJ9cBq.js → watch-CszoTJMq.js} +47 -8
- package/dist/webmcp/index.d.ts +2 -2
- package/dist/webmcp/index.js +13 -37
- package/dist/where-scope-Dv-WTP-w.js +306 -0
- package/dist/who-can-D0QoYbEb.js +364 -0
- package/dist/wire-delegation-Cv3W2eaM.js +36 -0
- package/dist/wire-denial-C7PaVYEM.js +27 -0
- package/dist/workflow/index.d.ts +5 -0
- package/dist/workflow/index.js +223 -0
- package/dist/workflow-sdk/index.d.ts +56 -0
- package/dist/workflow-sdk/index.js +78 -0
- package/dist/wrap-Bd1Tejur.d.ts +15 -0
- package/dist/wrap-gX61EtpB.js +27 -0
- package/package.json +140 -41
- package/schemas/access-event-v1.json +118 -0
- package/schemas/approval-request-v1.json +34 -1
- package/schemas/approval-signature-v1.json +94 -0
- package/schemas/automation-event-v1.json +113 -0
- package/schemas/capability-v1.json +84 -0
- package/schemas/catalog-event-v1.json +87 -0
- package/schemas/catalog-v1.json +129 -12
- package/schemas/cli-commands-v1.json +164 -0
- package/schemas/cli-result-v1.json +96 -0
- package/schemas/cloud-api-v1.json +5407 -0
- package/schemas/connector-v1.json +408 -0
- package/schemas/credential-event-v1.json +81 -0
- package/schemas/credential-v1.json +134 -0
- package/schemas/decision-event-v1.json +288 -0
- package/schemas/delivery-event-v1.json +117 -0
- package/schemas/directory-event-v1.json +85 -0
- package/schemas/evidence-export-v1.json +54 -0
- package/schemas/membership-event-v1.json +93 -0
- package/schemas/policy-v1.json +68 -0
- package/schemas/pushed-policy-v1.json +236 -0
- package/schemas/run-v1.json +162 -0
- package/schemas/snapshot-v1.json +138 -0
- package/schemas/supabase-claims-v1.json +4 -4
- package/schemas/supabase-manifest-v1.json +5 -1
- package/schemas/support-session-v1.json +111 -0
- package/skills/permdock/SKILL.md +16 -12
- package/skills/permdock-agents/SKILL.md +40 -23
- package/skills/permdock-agents/references/operations-automations-chat.md +221 -0
- package/skills/permdock-agents/references/runtimes.md +22 -18
- package/skills/permdock-approvals/SKILL.md +29 -13
- package/skills/permdock-approvals/references/delivery-and-waiters.md +172 -0
- package/skills/permdock-approvals/references/stores-and-resume.md +21 -7
- package/skills/permdock-audit/SKILL.md +3 -3
- package/skills/permdock-credentials/SKILL.md +5 -5
- package/skills/permdock-credentials/references/tokens-keys-links.md +19 -10
- package/skills/permdock-data/SKILL.md +6 -6
- package/skills/permdock-data/references/queries-and-rls.md +13 -8
- package/skills/permdock-data/references/relationships.md +3 -3
- package/skills/permdock-tenancy/SKILL.md +20 -7
- package/skills/permdock-tenancy/references/contacts-and-support-sessions.md +122 -0
- package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +6 -4
- package/skills/permdock-wire/SKILL.md +18 -12
- package/skills/permdock-wire/references/adapters.md +146 -50
- package/skills/permdock-wire/references/policy-options.md +15 -6
- package/skills/permdock-wire/references/presets-and-recipes.md +58 -0
- package/dist/approvals-DbYAuNkG.js +0 -224
- package/dist/arazzo-C9chp3ST.js +0 -54
- package/dist/bind-C_ob3LKa.d.ts +0 -25
- package/dist/catalog-CRW5Mx_B.js +0 -2
- package/dist/catalog-CYj-mX2O.js +0 -48
- package/dist/catalog-DWF5cYqB.js +0 -55
- package/dist/cloud-CfwZ39Rl.js +0 -50
- package/dist/cloud-DWLXO2af.js +0 -118
- package/dist/collect-CHB22Sx4.js +0 -83
- package/dist/collect-DSWOk19R.js +0 -2
- package/dist/commands-BeaGNj_o.js +0 -97
- package/dist/config-ir40y8m0.js +0 -36
- package/dist/create-CMwIl-w2.js +0 -253
- package/dist/delegation-D8pUEuce.js +0 -103
- package/dist/diff-C9RDjjhs.js +0 -48
- package/dist/doctor-Djh6JDEk.js +0 -53
- package/dist/doctor-DvH0IQff.js +0 -1194
- package/dist/doctor-collect-CjdO0wQX.js +0 -665
- package/dist/duration-xK2jGFVc.js +0 -25
- package/dist/errors-CWfoNg9N.js +0 -47
- package/dist/errors-DRnGZHzF.js +0 -30
- package/dist/evaluation-items-CfCCejQd.js +0 -40
- package/dist/expiry-BoBJ8Tvc.js +0 -7
- package/dist/fields-BMl1RxoX.js +0 -26
- package/dist/grantee-Cv5Sogfv.js +0 -602
- package/dist/headers-BZSDieNT.js +0 -6
- package/dist/headers-Cf-zWvsO.d.ts +0 -6
- package/dist/ids-DC4V4CFu.js +0 -18
- package/dist/index-0nNqHspG.d.ts +0 -6
- package/dist/index-BNc7Wer_.d.ts +0 -483
- package/dist/index-C7Tw7MaW.d.ts +0 -201
- package/dist/instance-options-Dhhcnm3y.js +0 -22
- package/dist/load-DwJUafYN.js +0 -2
- package/dist/manifest-iaoBXHKc.js +0 -783
- package/dist/map-AcxK9o_D.js +0 -147
- package/dist/may-use-DndQ5tQ-.js +0 -77
- package/dist/openapi-CQTsgKoB.js +0 -164
- package/dist/permdock-CbgvLnuo.js +0 -3479
- package/dist/permissions-DVoF6dMt.js +0 -662
- package/dist/policy-xyWg7QdR.js +0 -1122
- package/dist/powersync-CrBX8hY6.js +0 -2
- package/dist/powersync-DE19b9dT.js +0 -62
- package/dist/protected-BdnIEFkY.d.ts +0 -27
- package/dist/protected-xAr24FEC.d.ts +0 -40
- package/dist/relations-cjOL01hZ.js +0 -505
- package/dist/rls-P-BeBx0n.js +0 -238
- package/dist/rls-graph-CHwx0V8q.js +0 -435
- package/dist/rls-ownership-DcYlZ09B.js +0 -843
- package/dist/rls-shared-Cewd_-zI.js +0 -495
- package/dist/rls-verify-CMv9H3wV.js +0 -746
- package/dist/run-BWc9qqvE.js +0 -174
- package/dist/server-DlZ28Oz5.js +0 -268
- package/dist/sink-B1fZzIMf.d.ts +0 -104
- package/dist/sink-Bd9PSyfq.js +0 -141
- package/dist/skills-C5CbhhpG.js +0 -56
- package/dist/snapshot-Enxd0n-s.js +0 -975
- package/dist/sql-xdg5f4Fi.js +0 -27
- package/dist/src-BDwEZWrZ.js +0 -568
- package/dist/store-jOBYpiXC.d.ts +0 -36
- package/dist/stores-C0IMQrGI.d.ts +0 -52
- package/dist/subject-C6dLxqHU.js +0 -24
- package/dist/supabase-config-Bj3iDH2I.js +0 -472
- package/dist/supabase-hook-gd3s8bxB.js +0 -2
- package/dist/supabase-s4o9s1O1.js +0 -83
- package/dist/thenable-okc2xDsj.js +0 -10
- package/dist/types-BnIEz1sU.d.ts +0 -48
- package/dist/types-Bvc4oWT6.d.ts +0 -9
- package/dist/types-CKNSyIf_.d.ts +0 -52
- package/dist/types-Cq_H8N_X.d.ts +0 -197
- package/dist/usage-B0YuTQRO.js +0 -42
- package/dist/usage-DorAJiU_.js +0 -2
- package/dist/vocabulary-DA8a8zif.d.ts +0 -56
- package/dist/watch-BwxLTYMZ.js +0 -2
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { t as defineLeaf } from "./command-L8EstFNm.js";
|
|
2
|
+
import { c as given, n as dbUrl, o as fileOut, r as dbUrlFlags, t as checkFlag } from "./flags-C3DktBDY.js";
|
|
3
|
+
//#region src/cli/commands/supabase.ts
|
|
4
|
+
const hookGenerate = defineLeaf({
|
|
5
|
+
flags: {
|
|
6
|
+
out: {
|
|
7
|
+
type: "string",
|
|
8
|
+
description: "File to write",
|
|
9
|
+
valueHint: "file"
|
|
10
|
+
},
|
|
11
|
+
...checkFlag,
|
|
12
|
+
...dbUrlFlags,
|
|
13
|
+
"active-from": {
|
|
14
|
+
type: "string",
|
|
15
|
+
description: "Where the hook reads the active tenant",
|
|
16
|
+
valueHint: "source"
|
|
17
|
+
},
|
|
18
|
+
budget: {
|
|
19
|
+
type: "string",
|
|
20
|
+
description: "Byte budget for the memberships claim",
|
|
21
|
+
valueHint: "bytes"
|
|
22
|
+
},
|
|
23
|
+
schema: {
|
|
24
|
+
type: "string",
|
|
25
|
+
description: "Schema for the hook function",
|
|
26
|
+
valueHint: "name"
|
|
27
|
+
},
|
|
28
|
+
schemas: {
|
|
29
|
+
type: "enum",
|
|
30
|
+
options: [
|
|
31
|
+
"pg-delta",
|
|
32
|
+
"migra",
|
|
33
|
+
"migrations"
|
|
34
|
+
],
|
|
35
|
+
description: "Schema workflow (default supabase.schemas, else pg-delta)"
|
|
36
|
+
},
|
|
37
|
+
"grants-out": {
|
|
38
|
+
type: "string",
|
|
39
|
+
description: "migra: file for the privileges supabase db diff drops",
|
|
40
|
+
valueHint: "file"
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
async run(ctx, { flags }) {
|
|
44
|
+
const out = fileOut("supabase hook generate", flags.out);
|
|
45
|
+
const db = await dbUrl(ctx, flags);
|
|
46
|
+
const activeFrom = given(flags["active-from"]);
|
|
47
|
+
const budget = given(flags.budget);
|
|
48
|
+
const schema = given(flags.schema);
|
|
49
|
+
const grantsOut = given(flags["grants-out"]);
|
|
50
|
+
const { runSupabase } = await import("./supabase-hook-CXcGpHqq.js");
|
|
51
|
+
return runSupabase({
|
|
52
|
+
cwd: ctx.cwd,
|
|
53
|
+
config: ctx.config,
|
|
54
|
+
rest: ["hook", "generate"],
|
|
55
|
+
check: flags.check,
|
|
56
|
+
json: ctx.json,
|
|
57
|
+
io: ctx.io,
|
|
58
|
+
...out === void 0 ? {} : { out },
|
|
59
|
+
...db === void 0 ? {} : { db },
|
|
60
|
+
...activeFrom === void 0 ? {} : { activeFrom },
|
|
61
|
+
...budget === void 0 ? {} : { budget },
|
|
62
|
+
...schema === void 0 ? {} : { schema },
|
|
63
|
+
...grantsOut === void 0 ? {} : { grantsOut },
|
|
64
|
+
...flags.schemas === void 0 ? {} : { schemas: flags.schemas }
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
const inspect = defineLeaf({
|
|
69
|
+
flags: {
|
|
70
|
+
out: {
|
|
71
|
+
type: "string",
|
|
72
|
+
description: "File to write; a bare --out writes permdock.manifest.json",
|
|
73
|
+
valueHint: "file"
|
|
74
|
+
},
|
|
75
|
+
...checkFlag
|
|
76
|
+
},
|
|
77
|
+
async run(ctx, { flags }) {
|
|
78
|
+
const out = flags.out === "" ? true : flags.out === "-" ? void 0 : flags.out;
|
|
79
|
+
const { runSupabase } = await import("./supabase-hook-CXcGpHqq.js");
|
|
80
|
+
return runSupabase({
|
|
81
|
+
cwd: ctx.cwd,
|
|
82
|
+
config: ctx.config,
|
|
83
|
+
rest: ["inspect"],
|
|
84
|
+
check: flags.check,
|
|
85
|
+
json: ctx.json,
|
|
86
|
+
io: ctx.io,
|
|
87
|
+
...out === void 0 ? {} : { out }
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
//#endregion
|
|
92
|
+
export { hookGenerate, inspect };
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import { t as compact } from "./compact-
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { a as
|
|
6
|
-
import {
|
|
1
|
+
import { r as isRecord, t as compact } from "./compact-CAf557ZB.js";
|
|
2
|
+
import { d as isoNow, i as dateAt, p as nowSeconds, u as isoAt } from "./time-DkWjdL98.js";
|
|
3
|
+
import { t as canonicalJson } from "./canonical-json-BC8_nMTw.js";
|
|
4
|
+
import { s as ApprovalError } from "./types-DqzsnlSA.js";
|
|
5
|
+
import { a as approvalPageSize, o as decodeApprovalCursor, s as encodeApprovalCursor, t as applyApprovalVerdict } from "./store-4u_hxjWa.js";
|
|
6
|
+
import { a as parseCapability } from "./capability-N1K9IpqS.js";
|
|
7
|
+
import { t as loadJose } from "./load-jose-DZ4dnjri.js";
|
|
7
8
|
import "./budget-NbEtbJC_.js";
|
|
8
|
-
import { a as quoteSqlTable, i as
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
9
|
+
import { a as quoteQualifiedTable, c as quoteSqlTable, i as qualifySqlTable, o as quoteSqlIdent, s as quoteSqlLiteral, u as sqlTextArray } from "./sql-B5T1IL83.js";
|
|
10
|
+
import { d as keptKeys, l as roleColumn } from "./sources-vs5dGOsS.js";
|
|
11
|
+
import { t as callRpc } from "./postgrest-CW0IqC-U.js";
|
|
11
12
|
//#region src/supabase/capability.ts
|
|
12
13
|
const DEFAULT_TTL = 300;
|
|
13
14
|
const MAX_TTL = 3600;
|
|
@@ -29,15 +30,19 @@ async function exchangeCapability(subject, options) {
|
|
|
29
30
|
if (principal === null || principal.kind !== "link") return;
|
|
30
31
|
const capability = parseCapability(principal["capability"]);
|
|
31
32
|
if (capability?.holder !== "link" || capability.id !== principal.id) return;
|
|
32
|
-
const now =
|
|
33
|
+
const now = nowSeconds(options.now);
|
|
33
34
|
const ttl = Math.min(Math.max(1, options.ttl ?? DEFAULT_TTL), MAX_TTL);
|
|
34
35
|
const exp = Math.min(now + ttl, Math.floor(capability.expiresAt));
|
|
35
36
|
if (exp <= now) return;
|
|
37
|
+
const { id: _id, expiresAt: _expiresAt, cnf: _cnf, ...claim } = capability;
|
|
36
38
|
const jose = await loadJose();
|
|
37
39
|
const key = isSecret(options.key) ? new TextEncoder().encode(options.key.secret) : await jose.importJWK(options.key, alg);
|
|
38
40
|
const jwt = new jose.SignJWT({
|
|
39
41
|
role: "anon",
|
|
40
|
-
capability
|
|
42
|
+
capability: {
|
|
43
|
+
...claim,
|
|
44
|
+
expires_at: exp
|
|
45
|
+
}
|
|
41
46
|
}).setProtectedHeader(secret ? {
|
|
42
47
|
alg: "HS256",
|
|
43
48
|
typ: "JWT"
|
|
@@ -63,9 +68,6 @@ const KNOWN = /* @__PURE__ */ new Set([
|
|
|
63
68
|
"act",
|
|
64
69
|
"app_metadata"
|
|
65
70
|
]);
|
|
66
|
-
function isRecord$2(value) {
|
|
67
|
-
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
68
|
-
}
|
|
69
71
|
function own(record, key) {
|
|
70
72
|
return Object.hasOwn(record, key) ? record[key] : void 0;
|
|
71
73
|
}
|
|
@@ -84,7 +86,7 @@ function optional(record, key, path, issues, check, expected) {
|
|
|
84
86
|
}
|
|
85
87
|
const isString = (value) => typeof value === "string";
|
|
86
88
|
function checkMembership(item, path, issues) {
|
|
87
|
-
if (!isRecord
|
|
89
|
+
if (!isRecord(item)) {
|
|
88
90
|
issue(issues, path, "Expected a membership object");
|
|
89
91
|
return;
|
|
90
92
|
}
|
|
@@ -96,17 +98,17 @@ function checkMembership(item, path, issues) {
|
|
|
96
98
|
"tenant",
|
|
97
99
|
"team",
|
|
98
100
|
"via",
|
|
99
|
-
"
|
|
101
|
+
"granted_by",
|
|
100
102
|
"reason"
|
|
101
103
|
]) optional(item, key, path, issues, isString, "a string");
|
|
102
|
-
optional(item, "within", path, issues, (value) => isRecord
|
|
103
|
-
optional(item, "on", path, issues, (value) => isRecord
|
|
104
|
-
optional(item, "
|
|
105
|
-
optional(item, "member", path, issues, (value) => isRecord
|
|
106
|
-
optional(item, "
|
|
104
|
+
optional(item, "within", path, issues, (value) => isRecord(value) && Object.values(value).every((id) => typeof id === "string"), "an object of string ids");
|
|
105
|
+
optional(item, "on", path, issues, (value) => isRecord(value) && typeof own(value, "resource") === "string" && typeof own(value, "id") === "string", "an object with string resource and id");
|
|
106
|
+
optional(item, "expires_at", path, issues, (value) => typeof value === "number" && Number.isFinite(value), "a number of seconds since the epoch");
|
|
107
|
+
optional(item, "member", path, issues, (value) => isRecord(value) && typeof own(value, "group") === "string" && own(value, "group") !== "", "an object with a non-empty string group");
|
|
108
|
+
optional(item, "managed_by", path, issues, (value) => value === "idp", "'idp'");
|
|
107
109
|
optional(item, "entitlements", path, issues, isStrings, "an array of strings");
|
|
108
110
|
optional(item, "keep", path, issues, isStrings, "an array of strings");
|
|
109
|
-
optional(item, "grants", path, issues, isRecord
|
|
111
|
+
optional(item, "grants", path, issues, isRecord, "an object");
|
|
110
112
|
if (!(own(item, "scope") !== void 0 && own(item, "id") !== void 0 || own(item, "tenant") !== void 0 || own(item, "team") !== void 0 || own(item, "on") !== void 0)) issue(issues, path, "Expected scope and id, tenant, team or on");
|
|
111
113
|
}
|
|
112
114
|
function checkPermDockClaims(record, tenantClaim, path, issues) {
|
|
@@ -123,17 +125,23 @@ function checkPermDockClaims(record, tenantClaim, path, issues) {
|
|
|
123
125
|
}
|
|
124
126
|
optional(record, "memberships_truncated", path, issues, (value) => typeof value === "boolean", "a boolean");
|
|
125
127
|
optional(record, tenantClaim, path, issues, isString, "a string");
|
|
126
|
-
optional(record, "attrs", path, issues, isRecord
|
|
128
|
+
optional(record, "attrs", path, issues, isRecord, "an object");
|
|
127
129
|
optional(record, "authz_ver", path, issues, (value) => Number.isInteger(value), "an integer");
|
|
128
130
|
}
|
|
129
|
-
/** The outer level's `kind`: none, `support` with a `session_id`, or `
|
|
131
|
+
/** The outer level's `kind`: none, `support` with a `session_id`, `impersonation`, or `agent` with optional `tools` and `read_only` and no `session_id`. */
|
|
130
132
|
function checkActKind(level, path, issues) {
|
|
131
133
|
const marked = own(level, "kind");
|
|
132
134
|
const kind = marked === void 0 && own(level, "session_id") !== void 0 ? "support" : marked;
|
|
133
135
|
optional(level, "reason", path, issues, isString, "a string");
|
|
134
136
|
if (kind === void 0 || kind === "impersonation") return;
|
|
137
|
+
if (kind === "agent") {
|
|
138
|
+
if (own(level, "session_id") !== void 0) issue(issues, [...path, "session_id"], "Expected no session_id on an agent level");
|
|
139
|
+
optional(level, "tools", path, issues, (value) => isStrings(value) && value.every((tool) => tool !== ""), "an array of non-empty strings");
|
|
140
|
+
optional(level, "read_only", path, issues, (value) => typeof value === "boolean", "a boolean");
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
135
143
|
if (kind !== "support") {
|
|
136
|
-
issue(issues, [...path, "kind"], "Expected 'support' or '
|
|
144
|
+
issue(issues, [...path, "kind"], "Expected 'support', 'impersonation' or 'agent'");
|
|
137
145
|
return;
|
|
138
146
|
}
|
|
139
147
|
const session = own(level, "session_id");
|
|
@@ -144,7 +152,7 @@ function checkAct(value, issues) {
|
|
|
144
152
|
let current = value;
|
|
145
153
|
const path = ["act"];
|
|
146
154
|
while (current !== void 0) {
|
|
147
|
-
if (!isRecord
|
|
155
|
+
if (!isRecord(current)) {
|
|
148
156
|
issue(issues, path, "Expected an object");
|
|
149
157
|
return;
|
|
150
158
|
}
|
|
@@ -157,7 +165,7 @@ function checkAct(value, issues) {
|
|
|
157
165
|
}
|
|
158
166
|
function checkClaims(value, tenantClaim) {
|
|
159
167
|
const issues = [];
|
|
160
|
-
if (!isRecord
|
|
168
|
+
if (!isRecord(value)) {
|
|
161
169
|
issue(issues, [], "Expected a claims object");
|
|
162
170
|
return issues;
|
|
163
171
|
}
|
|
@@ -168,7 +176,7 @@ function checkClaims(value, tenantClaim) {
|
|
|
168
176
|
if (act !== void 0) checkAct(act, issues);
|
|
169
177
|
const meta = own(value, "app_metadata");
|
|
170
178
|
if (meta !== void 0) {
|
|
171
|
-
if (isRecord
|
|
179
|
+
if (isRecord(meta)) checkPermDockClaims(meta, tenantClaim, ["app_metadata"], issues);
|
|
172
180
|
else issue(issues, ["app_metadata"], "Expected an object");
|
|
173
181
|
}
|
|
174
182
|
return issues;
|
|
@@ -178,8 +186,8 @@ function merge(base, app) {
|
|
|
178
186
|
if (issues.length > 0) return { issues };
|
|
179
187
|
const baseValue = base.value;
|
|
180
188
|
const appValue = app.value;
|
|
181
|
-
if (!isRecord
|
|
182
|
-
return { value: isRecord
|
|
189
|
+
if (!isRecord(appValue)) return { issues: [{ message: "Expected the extension to output an object" }] };
|
|
190
|
+
return { value: isRecord(baseValue) ? {
|
|
183
191
|
...baseValue,
|
|
184
192
|
...appValue
|
|
185
193
|
} : appValue };
|
|
@@ -192,9 +200,9 @@ function schemaOf(validate) {
|
|
|
192
200
|
validate
|
|
193
201
|
}),
|
|
194
202
|
extend(app) {
|
|
195
|
-
if (!isRecord
|
|
203
|
+
if (!isRecord(app) && typeof app !== "function") throw new TypeError("PermDock: supabaseClaims().extend needs a Standard Schema");
|
|
196
204
|
const props = Reflect.get(app, "~standard");
|
|
197
|
-
if (!isRecord
|
|
205
|
+
if (!isRecord(props) || typeof props["validate"] !== "function") throw new TypeError("PermDock: supabaseClaims().extend needs a Standard Schema");
|
|
198
206
|
const run = app["~standard"].validate.bind(app["~standard"]);
|
|
199
207
|
return schemaOf((value) => {
|
|
200
208
|
const base = validate(value);
|
|
@@ -225,194 +233,7 @@ function supabaseClaims(options = {}) {
|
|
|
225
233
|
});
|
|
226
234
|
}
|
|
227
235
|
//#endregion
|
|
228
|
-
//#region src/supabase/postgrest.ts
|
|
229
|
-
function callRpc(client, schema, fn, args) {
|
|
230
|
-
return client.schema(schema).rpc(fn, args);
|
|
231
|
-
}
|
|
232
|
-
function isRecord$1(value) {
|
|
233
|
-
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
234
|
-
}
|
|
235
|
-
function strings(value) {
|
|
236
|
-
return Array.isArray(value) ? value.filter((item) => typeof item === "string") : [];
|
|
237
|
-
}
|
|
238
|
-
function grantOf(value) {
|
|
239
|
-
if (!isRecord$1(value) || typeof value["permission"] !== "string") return;
|
|
240
|
-
return compact({
|
|
241
|
-
permission: value["permission"],
|
|
242
|
-
effect: value["effect"] === "deny" ? "deny" : "allow",
|
|
243
|
-
level: typeof value["level"] === "string" ? value["level"] : void 0
|
|
244
|
-
});
|
|
245
|
-
}
|
|
246
|
-
function customRoleOf(value) {
|
|
247
|
-
if (!isRecord$1(value) || typeof value["name"] !== "string") return;
|
|
248
|
-
const grants = Array.isArray(value["grants"]) ? value["grants"].flatMap((item) => {
|
|
249
|
-
const grant = grantOf(item);
|
|
250
|
-
return grant === void 0 ? [] : [grant];
|
|
251
|
-
}) : [];
|
|
252
|
-
const includes = strings(value["includes"]);
|
|
253
|
-
const body = {
|
|
254
|
-
name: value["name"],
|
|
255
|
-
grants,
|
|
256
|
-
...includes.length === 0 ? {} : { includes }
|
|
257
|
-
};
|
|
258
|
-
if (value["scope"] === "global") return value["tenant"] === void 0 ? {
|
|
259
|
-
...body,
|
|
260
|
-
scope: "global"
|
|
261
|
-
} : void 0;
|
|
262
|
-
if (typeof value["tenant"] !== "string") return;
|
|
263
|
-
return compact({
|
|
264
|
-
...body,
|
|
265
|
-
tenant: value["tenant"],
|
|
266
|
-
scope: typeof value["scope"] === "string" ? value["scope"] : void 0,
|
|
267
|
-
id: typeof value["id"] === "string" ? value["id"] : void 0
|
|
268
|
-
});
|
|
269
|
-
}
|
|
270
|
-
function readMemberEntries(value) {
|
|
271
|
-
if (!Array.isArray(value)) return [];
|
|
272
|
-
return value.flatMap((item) => {
|
|
273
|
-
if (!isRecord$1(item) || !isRecord$1(item["principal"])) return [];
|
|
274
|
-
const id = item["principal"]["id"];
|
|
275
|
-
const [membership] = readMemberships([item["membership"]]).memberships;
|
|
276
|
-
return typeof id === "string" && id !== "" && membership !== void 0 ? [{
|
|
277
|
-
principal: { id },
|
|
278
|
-
membership
|
|
279
|
-
}] : [];
|
|
280
|
-
});
|
|
281
|
-
}
|
|
282
|
-
function versionOf(value) {
|
|
283
|
-
const version = typeof value === "string" ? Number(value) : value;
|
|
284
|
-
return typeof version === "number" && Number.isFinite(version) ? version : void 0;
|
|
285
|
-
}
|
|
286
|
-
/** Reads `subject_for`'s JSON; anything it cannot read is left out, and a malformed record is no record. */
|
|
287
|
-
function readSubjectRecord(value) {
|
|
288
|
-
if (!isRecord$1(value) || typeof value["id"] !== "string") return;
|
|
289
|
-
if (value["active"] !== true) return {
|
|
290
|
-
id: value["id"],
|
|
291
|
-
active: false,
|
|
292
|
-
roles: [],
|
|
293
|
-
memberships: [],
|
|
294
|
-
customRoles: []
|
|
295
|
-
};
|
|
296
|
-
const version = value["authzVersion"];
|
|
297
|
-
return compact({
|
|
298
|
-
id: value["id"],
|
|
299
|
-
active: true,
|
|
300
|
-
roles: strings(value["roles"]),
|
|
301
|
-
memberships: readMemberships(value["memberships"]).memberships,
|
|
302
|
-
customRoles: Array.isArray(value["customRoles"]) ? value["customRoles"].flatMap((item) => {
|
|
303
|
-
const role = customRoleOf(item);
|
|
304
|
-
return role === void 0 ? [] : [role];
|
|
305
|
-
}) : [],
|
|
306
|
-
authzVersion: typeof version === "number" && Number.isFinite(version) ? version : void 0
|
|
307
|
-
});
|
|
308
|
-
}
|
|
309
|
-
/**
|
|
310
|
-
* Membership, custom-role and subject sources over the `subject_for(p_user)`,
|
|
311
|
-
* `authz_version_for(p_user)` and `members_of(p_scope, p_id)` functions
|
|
312
|
-
* `permdock supabase hook generate` writes, for a backend that reaches
|
|
313
|
-
* Postgres only through PostgREST. `memberships.version` reads only the
|
|
314
|
-
* version, so `claimsFirst` with `onStale: 'reread'` reads the full subject
|
|
315
|
-
* only for a stale token; when the version function is missing it falls back
|
|
316
|
-
* to `subject_for`. With `policy`, a token that claims a custom role has its
|
|
317
|
-
* subject read in one `subject_for` call instead, and custom roles are read
|
|
318
|
-
* only for a subject that holds one. Each user and each instance is read once per
|
|
319
|
-
* `postgrestSources` call, so create it per request or per job.
|
|
320
|
-
*/
|
|
321
|
-
function postgrestSources(client, options = {}) {
|
|
322
|
-
const api = options.api;
|
|
323
|
-
const names = api === void 0 ? void 0 : hookApiNames(api.prefix);
|
|
324
|
-
const schema = options.schema ?? (api === void 0 ? "permdock" : api.schema ?? "public");
|
|
325
|
-
const fn = options.fn ?? names?.subjectFor ?? "subject_for";
|
|
326
|
-
const membersFn = options.membersFn ?? names?.membersOf ?? "members_of";
|
|
327
|
-
const versionFn = options.versionFn ?? names?.authzVersionFor ?? "authz_version_for";
|
|
328
|
-
const declared = options.policy === void 0 ? void 0 : options.policy.index.declaredRoles;
|
|
329
|
-
const onlyDeclared = (held) => declared !== void 0 && held?.every((name) => declared.has(name)) === true;
|
|
330
|
-
const loaded = /* @__PURE__ */ new Map();
|
|
331
|
-
const versions = /* @__PURE__ */ new Map();
|
|
332
|
-
const listed = /* @__PURE__ */ new Map();
|
|
333
|
-
const list = (query) => {
|
|
334
|
-
const key = JSON.stringify([query.scope, query.id]);
|
|
335
|
-
const cached = listed.get(key);
|
|
336
|
-
if (cached !== void 0) return cached.then((entries) => [...entries]);
|
|
337
|
-
const pending = Promise.resolve(callRpc(client, schema, membersFn, {
|
|
338
|
-
p_scope: query.scope,
|
|
339
|
-
p_id: query.id
|
|
340
|
-
})).then((result) => {
|
|
341
|
-
if (result.error !== null) throw new Error(`PermDock: ${schema}.${membersFn} failed: ${result.error.message}`);
|
|
342
|
-
return readMemberEntries(result.data);
|
|
343
|
-
});
|
|
344
|
-
listed.set(key, pending);
|
|
345
|
-
return pending.then((entries) => [...entries]);
|
|
346
|
-
};
|
|
347
|
-
const record = (userId) => {
|
|
348
|
-
const cached = loaded.get(userId);
|
|
349
|
-
if (cached !== void 0) return cached;
|
|
350
|
-
const pending = Promise.resolve(callRpc(client, schema, fn, { p_user: userId })).then((result) => {
|
|
351
|
-
if (result.error !== null) throw new Error(`PermDock: ${schema}.${fn} failed: ${result.error.message}`);
|
|
352
|
-
return readSubjectRecord(result.data);
|
|
353
|
-
});
|
|
354
|
-
loaded.set(userId, pending);
|
|
355
|
-
return pending;
|
|
356
|
-
};
|
|
357
|
-
const version = (userId) => {
|
|
358
|
-
const read = loaded.get(userId);
|
|
359
|
-
if (read !== void 0) return read.then((found) => found?.authzVersion);
|
|
360
|
-
const cached = versions.get(userId);
|
|
361
|
-
if (cached !== void 0) return cached;
|
|
362
|
-
const pending = Promise.resolve(callRpc(client, schema, versionFn, { p_user: userId })).then((result) => result.error === null ? versionOf(result.data) : record(userId).then((found) => found?.authzVersion));
|
|
363
|
-
versions.set(userId, pending);
|
|
364
|
-
return pending;
|
|
365
|
-
};
|
|
366
|
-
const live = async (userId) => {
|
|
367
|
-
const found = await record(userId);
|
|
368
|
-
return found?.active === true ? found : void 0;
|
|
369
|
-
};
|
|
370
|
-
return {
|
|
371
|
-
memberships: {
|
|
372
|
-
async membershipsFor(principal) {
|
|
373
|
-
return [...(await live(principal.id))?.memberships ?? []];
|
|
374
|
-
},
|
|
375
|
-
version(principal) {
|
|
376
|
-
return declared !== void 0 && !onlyDeclared([...principal.roles ?? [], ...(principal.memberships ?? []).flatMap((membership) => membership.roles)]) ? record(principal.id).then((found) => found?.authzVersion) : version(principal.id);
|
|
377
|
-
},
|
|
378
|
-
list
|
|
379
|
-
},
|
|
380
|
-
customRoles(principal) {
|
|
381
|
-
return {
|
|
382
|
-
async rolesFor(tenant, context) {
|
|
383
|
-
if (onlyDeclared(context?.held)) return [];
|
|
384
|
-
return ((await live(principal.id))?.customRoles ?? []).filter((role) => role.tenant === tenant);
|
|
385
|
-
},
|
|
386
|
-
async globalRoles(context) {
|
|
387
|
-
if (onlyDeclared(context?.held)) return [];
|
|
388
|
-
return ((await live(principal.id))?.customRoles ?? []).filter((role) => role.scope === "global");
|
|
389
|
-
}
|
|
390
|
-
};
|
|
391
|
-
},
|
|
392
|
-
async subject(userId) {
|
|
393
|
-
const found = await live(userId);
|
|
394
|
-
if (found === void 0) return {
|
|
395
|
-
principal: null,
|
|
396
|
-
context: {}
|
|
397
|
-
};
|
|
398
|
-
return {
|
|
399
|
-
principal: compact({
|
|
400
|
-
id: found.id,
|
|
401
|
-
roles: found.roles,
|
|
402
|
-
memberships: found.memberships,
|
|
403
|
-
authzVersion: found.authzVersion
|
|
404
|
-
}),
|
|
405
|
-
context: {}
|
|
406
|
-
};
|
|
407
|
-
},
|
|
408
|
-
record
|
|
409
|
-
};
|
|
410
|
-
}
|
|
411
|
-
//#endregion
|
|
412
236
|
//#region src/supabase/approval-store.ts
|
|
413
|
-
function isRecord(value) {
|
|
414
|
-
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
415
|
-
}
|
|
416
237
|
/** A stored body as the request it is; the store wrote it from an `ApprovalRequest`. */
|
|
417
238
|
function requestOf(value) {
|
|
418
239
|
if (!isRecord(value) || value["v"] !== 1 || typeof value["token"] !== "string") return null;
|
|
@@ -465,10 +286,10 @@ function supabaseApprovalStore(client, options = {}) {
|
|
|
465
286
|
if (written === null) throw new ApprovalError("approval-not-pending", "approval is not pending");
|
|
466
287
|
return written;
|
|
467
288
|
},
|
|
468
|
-
async consume(token, now
|
|
289
|
+
async consume(token, now) {
|
|
469
290
|
return requestOf(await call("permdock_approval_consume", {
|
|
470
291
|
p_token: token,
|
|
471
|
-
p_now: now.toISOString()
|
|
292
|
+
p_now: dateAt(now).toISOString()
|
|
472
293
|
}));
|
|
473
294
|
},
|
|
474
295
|
async list(query) {
|
|
@@ -492,8 +313,8 @@ function supabaseApprovalStore(client, options = {}) {
|
|
|
492
313
|
next: encodeApprovalCursor(last)
|
|
493
314
|
} : { items };
|
|
494
315
|
},
|
|
495
|
-
async expire(now
|
|
496
|
-
const count = await call("permdock_approval_expire", { p_now: now.toISOString() });
|
|
316
|
+
async expire(now) {
|
|
317
|
+
const count = await call("permdock_approval_expire", { p_now: dateAt(now).toISOString() });
|
|
497
318
|
return typeof count === "number" ? count : 0;
|
|
498
319
|
},
|
|
499
320
|
async cancel(filter, meta) {
|
|
@@ -501,13 +322,76 @@ function supabaseApprovalStore(client, options = {}) {
|
|
|
501
322
|
p_filter: filterOf(filter),
|
|
502
323
|
p_by: meta.by,
|
|
503
324
|
p_note: meta.note ?? null,
|
|
504
|
-
p_now: (
|
|
325
|
+
p_now: isoNow()
|
|
505
326
|
});
|
|
506
327
|
return typeof count === "number" ? count : 0;
|
|
507
328
|
}
|
|
508
329
|
};
|
|
509
330
|
}
|
|
510
331
|
//#endregion
|
|
332
|
+
//#region src/supabase/approval-delegations.ts
|
|
333
|
+
function rowsOf(result) {
|
|
334
|
+
return Array.isArray(result) ? result : result.rows;
|
|
335
|
+
}
|
|
336
|
+
function instant(value) {
|
|
337
|
+
if (value instanceof Date) return Number.isNaN(value.getTime()) ? void 0 : value.toISOString();
|
|
338
|
+
if (typeof value !== "string") return;
|
|
339
|
+
const ms = Date.parse(value);
|
|
340
|
+
return Number.isNaN(ms) ? void 0 : isoAt(ms);
|
|
341
|
+
}
|
|
342
|
+
function list(value) {
|
|
343
|
+
if (value === null || value === void 0) return;
|
|
344
|
+
if (!Array.isArray(value)) return false;
|
|
345
|
+
const items = [];
|
|
346
|
+
for (const item of value) {
|
|
347
|
+
if (typeof item !== "string") return false;
|
|
348
|
+
items.push(item);
|
|
349
|
+
}
|
|
350
|
+
return items;
|
|
351
|
+
}
|
|
352
|
+
function delegationOf(row) {
|
|
353
|
+
const { id, delegator, delegate, tenant } = row;
|
|
354
|
+
const from = instant(row["from"]);
|
|
355
|
+
const until = instant(row["until"]);
|
|
356
|
+
const permissions = list(row["permissions"]);
|
|
357
|
+
const resources = list(row["resources"]);
|
|
358
|
+
if (typeof id !== "string" || typeof delegator !== "string" || typeof delegate !== "string" || tenant !== null && typeof tenant !== "string" || from === void 0 || until === void 0 || permissions === false || resources === false) return;
|
|
359
|
+
return {
|
|
360
|
+
id,
|
|
361
|
+
delegator,
|
|
362
|
+
delegate,
|
|
363
|
+
...typeof tenant === "string" ? { tenant } : {},
|
|
364
|
+
...permissions === void 0 ? {} : { permissions },
|
|
365
|
+
...resources === void 0 ? {} : { resources },
|
|
366
|
+
from,
|
|
367
|
+
until
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Approval delegations (out-of-office covers) from the table
|
|
372
|
+
* `rls.approvals.delegations` generates, so `approvalsHandler` and
|
|
373
|
+
* `permdock_is_approver` read the same rows. A cover without a tenant
|
|
374
|
+
* applies everywhere; a malformed row is skipped.
|
|
375
|
+
*/
|
|
376
|
+
function tableApprovalDelegationSource(options) {
|
|
377
|
+
const table = quoteQualifiedTable(options.table ?? "permdock.approval_delegations");
|
|
378
|
+
return {
|
|
379
|
+
name: "table",
|
|
380
|
+
async delegationsFor(query) {
|
|
381
|
+
const values = [query.delegate, query.at];
|
|
382
|
+
let tenant = "d.tenant is null";
|
|
383
|
+
if (query.tenant !== void 0) {
|
|
384
|
+
values.push(query.tenant);
|
|
385
|
+
tenant = "(d.tenant is null or d.tenant = $3)";
|
|
386
|
+
}
|
|
387
|
+
return rowsOf(await options.query(`select d.id::text as id, d.delegator::text as delegator, d.delegate::text as delegate, d.tenant::text as tenant, d.permissions, d.resources, d."from", d."until" from ${table} d where d.delegate::text = $1 and d."from" <= $2::timestamptz and $2::timestamptz < d."until" and ${tenant} order by d.id`, values)).flatMap((row) => {
|
|
388
|
+
const entry = delegationOf(row);
|
|
389
|
+
return entry === void 0 ? [] : [entry];
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
//#endregion
|
|
511
395
|
//#region src/supabase/rls.ts
|
|
512
396
|
function isTable(value) {
|
|
513
397
|
return value !== null && typeof value === "object" && "table" in value && typeof value.table === "string";
|
|
@@ -527,30 +411,23 @@ function supabaseRls(options = {}) {
|
|
|
527
411
|
});
|
|
528
412
|
}
|
|
529
413
|
const ident = (name) => quoteSqlIdent(name);
|
|
530
|
-
const table = (name) => quoteSqlTable(name);
|
|
531
414
|
const literal = quoteSqlLiteral;
|
|
532
|
-
function qualifiedTable(name) {
|
|
533
|
-
return table(name.includes(".") ? name : `public.${name}`);
|
|
534
|
-
}
|
|
535
415
|
/** The memberships table's role key over alias `m`, joined to its roles table when it holds a reference. */
|
|
536
416
|
function tenantRole(memberships) {
|
|
537
|
-
return roleColumn(memberships.role, memberships.table
|
|
417
|
+
return roleColumn(memberships.role, qualifySqlTable(memberships.table), "m", {
|
|
538
418
|
label: "authorizeSql tenant.role",
|
|
539
419
|
indent: " "
|
|
540
420
|
});
|
|
541
421
|
}
|
|
542
|
-
function textArray(values) {
|
|
543
|
-
return values.length === 0 ? `'{}'::text[]` : `array[${values.map(literal).join(", ")}]::text[]`;
|
|
544
|
-
}
|
|
545
422
|
function activeRow(row, id, text = false) {
|
|
546
423
|
const parts = [`s.${ident(row.id)}${text ? "::text" : ""} = ${id}`];
|
|
547
424
|
if (row.disabledAt !== void 0) parts.push(`s.${ident(row.disabledAt)} is null`);
|
|
548
425
|
if (row.status !== void 0) {
|
|
549
426
|
if (row.active === void 0 || row.active.length === 0) throw new TypeError("PermDock: a suspension status column needs its active values");
|
|
550
|
-
parts.push(`s.${ident(row.status)}::text = any(${
|
|
427
|
+
parts.push(`s.${ident(row.status)}::text = any(${sqlTextArray(row.active)})`);
|
|
551
428
|
}
|
|
552
429
|
if (row.disabledAt === void 0 && row.status === void 0) throw new TypeError("PermDock: a suspension table needs disabledAt or status");
|
|
553
|
-
return `exists (select 1 from ${
|
|
430
|
+
return `exists (select 1 from ${quoteQualifiedTable(row.table)} s where ${parts.join(" and ")})`;
|
|
554
431
|
}
|
|
555
432
|
/**
|
|
556
433
|
* Early `return false` for a suspended user, or a tenant request for a
|
|
@@ -565,7 +442,7 @@ function suspendedGuards(suspension, scope, uid) {
|
|
|
565
442
|
const tenant = suspension?.scopes?.[scope];
|
|
566
443
|
if (tenant !== void 0) {
|
|
567
444
|
const keep = keptKeys(tenant);
|
|
568
|
-
const kept = keep.length === 0 ? "" : ` and not (requested_permission::text = any(${
|
|
445
|
+
const kept = keep.length === 0 ? "" : ` and not (requested_permission::text = any(${sqlTextArray(keep)}))`;
|
|
569
446
|
lines.push(` if requested_tenant is not null and not ${activeRow(tenant, "requested_tenant", true)}${kept} then
|
|
570
447
|
return false; -- suspended ${scope}
|
|
571
448
|
end if;`);
|
|
@@ -594,7 +471,7 @@ function disabledLine(memberships, suspension) {
|
|
|
594
471
|
if (memberships.disabledAt === void 0) return "";
|
|
595
472
|
const column = `m.${ident(memberships.disabledAt)}`;
|
|
596
473
|
const keep = keptKeys(suspension?.memberships);
|
|
597
|
-
return keep.length === 0 ? `\n and ${column} is null` : `\n and (${column} is null or requested_permission::text = any(${
|
|
474
|
+
return keep.length === 0 ? `\n and ${column} is null` : `\n and (${column} is null or requested_permission::text = any(${sqlTextArray(keep)}))`;
|
|
598
475
|
}
|
|
599
476
|
function claimKept(suspension) {
|
|
600
477
|
return keptKeys(suspension?.memberships).length === 0 ? "" : `\n and case coalesce(jsonb_typeof(m -> 'keep'), 'null') when 'null' then true when 'array' then m -> 'keep' @> jsonb_build_array(requested_permission::text) else false end`;
|
|
@@ -605,10 +482,10 @@ function customDatabaseBranch(q, scope, memberships, declared, levels, suspensio
|
|
|
605
482
|
const rows = (source, value, extra) => `array(select c.${value} from ${q(source)} c where ${match}${extra})`;
|
|
606
483
|
return ` or exists (
|
|
607
484
|
select 1
|
|
608
|
-
from ${
|
|
485
|
+
from ${quoteQualifiedTable(memberships.table)} m${role.join}
|
|
609
486
|
where m.${ident(memberships.user)} = v_member_user
|
|
610
487
|
and m.${ident(memberships.tenant)} = v_member_tenant
|
|
611
|
-
and not (${role.sql} = any(${
|
|
488
|
+
and not (${role.sql} = any(${sqlTextArray(declared)}))${memberships.expiresAt === void 0 ? "" : `\n and (m.${ident(memberships.expiresAt)} is null or m.${ident(memberships.expiresAt)} > now())`}${disabledLine(memberships, suspension)}
|
|
612
489
|
and ${customHolds(q, scope, rows("custom_role_permissions", levels ? "permission || coalesce('@' || c.level, '')" : "permission", " and c.effect = 'allow'"), rows("custom_role_permissions", "permission", " and c.effect = 'deny'"), rows("custom_role_includes", "include_role", ""))}
|
|
613
490
|
)`;
|
|
614
491
|
}
|
|
@@ -638,7 +515,7 @@ function databaseBody(q, scope, memberships, custom, suspension) {
|
|
|
638
515
|
const role = tenantRole(memberships);
|
|
639
516
|
const held = (effect) => `exists (
|
|
640
517
|
select 1
|
|
641
|
-
from ${
|
|
518
|
+
from ${quoteQualifiedTable(memberships.table)} m${role.join}
|
|
642
519
|
join ${q("role_permissions")} rp on rp.role = ${role.sql}
|
|
643
520
|
where m.${ident(memberships.user)} = v_member_user
|
|
644
521
|
and m.${ident(tenantColumn)} = v_member_tenant
|
|
@@ -661,8 +538,8 @@ function databaseBody(q, scope, memberships, custom, suspension) {
|
|
|
661
538
|
}
|
|
662
539
|
return `declare
|
|
663
540
|
uid uuid := (select auth.uid());${memberships !== void 0 && tenantColumn !== void 0 ? `
|
|
664
|
-
v_member_user ${
|
|
665
|
-
v_member_tenant ${
|
|
541
|
+
v_member_user ${quoteQualifiedTable(memberships.table)}.${ident(memberships.user)}%type;
|
|
542
|
+
v_member_tenant ${quoteQualifiedTable(memberships.table)}.${ident(tenantColumn)}%type;` : ""}
|
|
666
543
|
begin
|
|
667
544
|
if uid is null then
|
|
668
545
|
return false;
|
|
@@ -672,9 +549,9 @@ ${tenantBranch}
|
|
|
672
549
|
and not ${global("deny")};
|
|
673
550
|
end;`;
|
|
674
551
|
}
|
|
675
|
-
/** A claim membership whose `
|
|
676
|
-
const CLAIM_UNEXPIRED = `case jsonb_typeof(m -> '
|
|
677
|
-
when 'number' then (m ->> '
|
|
552
|
+
/** A claim membership whose `expires_at` (epoch seconds) has passed no longer holds its roles. */
|
|
553
|
+
const CLAIM_UNEXPIRED = `case jsonb_typeof(m -> 'expires_at')
|
|
554
|
+
when 'number' then (m ->> 'expires_at')::numeric > extract(epoch from now())
|
|
678
555
|
else true
|
|
679
556
|
end`;
|
|
680
557
|
function jwtBody(q, scope, custom, suspension) {
|
|
@@ -695,7 +572,7 @@ function jwtBody(q, scope, custom, suspension) {
|
|
|
695
572
|
and m ->> 'id' = requested_tenant
|
|
696
573
|
and ${CLAIM_UNEXPIRED}${claimKept(suspension)}
|
|
697
574
|
and jsonb_typeof(cg.g) = 'array'
|
|
698
|
-
and not (r.role = any(${
|
|
575
|
+
and not (r.role = any(${sqlTextArray(custom.declared)}))
|
|
699
576
|
and ${customHolds(q, scope, claimEntries("left(e, 1) not in ('-', '@')", "e"), claimEntries("left(e, 1) = '-'", "substr(e, 2)"), claimEntries("left(e, 1) = '@'", "substr(e, 2)"))}
|
|
700
577
|
)`;
|
|
701
578
|
const held = (effect) => `exists (
|
|
@@ -750,7 +627,7 @@ end;`;
|
|
|
750
627
|
*/
|
|
751
628
|
function authorizeSql(options = {}) {
|
|
752
629
|
const schema = options.schema ?? "permdock";
|
|
753
|
-
const q = (name) =>
|
|
630
|
+
const q = (name) => quoteSqlTable(`${schema}.${name}`);
|
|
754
631
|
const memberships = typeof options.tenant === "object" ? options.tenant : void 0;
|
|
755
632
|
const scope = options.scope ?? "tenant";
|
|
756
633
|
if (!/^[a-z][a-z0-9_]*$/u.test(scope)) throw new TypeError(`PermDock: unsafe scope name '${scope}'`);
|
|
@@ -773,4 +650,4 @@ grant execute on function ${signature} to authenticated;
|
|
|
773
650
|
`;
|
|
774
651
|
}
|
|
775
652
|
//#endregion
|
|
776
|
-
export {
|
|
653
|
+
export { supabaseClaims as a, supabaseApprovalStore as i, supabaseRls as n, exchangeCapability as o, tableApprovalDelegationSource as r, authorizeSql as t };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { i as runSupabase } from "./supabase-hook-DdDQhMlw.js";
|