permdock 0.4.0 → 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/{schema-Bol6gqXA.js → 2020-C9VN-x8c.js} +5 -130
- package/dist/a2a/index.d.ts +6 -6
- package/dist/a2a/index.js +14 -17
- 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 -35
- package/dist/ai-sdk/index.js +37 -23
- package/dist/{app-data-CV8pqqMi.js → app-data-MuyzVqX8.js} +2 -1
- 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/arazzo-B6lebmiQ.js +36 -0
- package/dist/{arazzo-C4BcskbX.js → arazzo-BWhNF-k0.js} +20 -14
- 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 +94 -79
- 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 +9 -8
- package/dist/better-supabase/index.d.ts +357 -30
- package/dist/better-supabase/index.js +936 -194
- package/dist/{bind-BzqG8SMb.d.ts → bind--9EFVYWF.d.ts} +12 -10
- package/dist/{bind-kk-uyCwH.js → bind-CZzhx-Vj.js} +14 -10
- package/dist/body-CH5of8Ne.js +10 -0
- package/dist/body-text-QcXok_SI.js +52 -0
- package/dist/{build-instance-DIIV9DbC.js → build-instance-BMnAudHn.js} +4 -3
- package/dist/{canonical-json-CFKyFOke.js → canonical-json-BC8_nMTw.js} +5 -3
- package/dist/{capability-CksyCWDH.d.ts → capability-BSslw1QV.d.ts} +44 -25
- package/dist/{capability-txATtKV4.js → capability-N1K9IpqS.js} +68 -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-tZUyOfOv.js → catalog-BECMPrwc.js} +51 -6
- package/dist/catalog-DjhMYYCq.js +1 -0
- package/dist/catalog-R_A__RsH.js +52 -0
- package/dist/{catalog-doc-DWtg0gGR.js → catalog-doc-C9wjsfNY.js} +45 -23
- 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 +24 -27
- package/dist/clerk/index.d.ts +9 -8
- package/dist/clerk/index.js +9 -14
- package/dist/cli/bin.js +36 -17
- package/dist/cli/index.d.ts +19 -5
- package/dist/cli/index.js +164 -4
- package/dist/cloud/index.d.ts +102 -63
- package/dist/cloud/index.js +239 -340
- package/dist/cloud-CIoHNevm.js +87 -0
- package/dist/codemod-Bmj9dWMH.js +37 -0
- package/dist/codemod-Cxvvc70T.js +2084 -0
- package/dist/{collect-2SrB7lfk.js → collect-CrZJJnEF.js} +75 -11
- package/dist/collect-DloHbDVa.js +55 -0
- package/dist/collect-FlXJlhus.js +1 -0
- package/dist/command-L8EstFNm.js +6 -0
- package/dist/compile/index.d.ts +1 -1
- package/dist/compile/index.js +1 -2
- package/dist/{compile-CcEu2ZQ1.js → compile-CMqMx_IN.js} +11 -8
- package/dist/{compile-CtTP7eur.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-BIjREpyE.js → config-bs_kZeYq.js} +12 -7
- package/dist/{config-report--Xb9APJS.js → config-report-DUgj62Ai.js} +15 -5
- package/dist/{connection-DUsczpB5.js → connection-DjhIJSs2.js} +6 -5
- package/dist/{context-DieZVJXu.js → context-bbFHR-0D.js} +2 -2
- package/dist/convex/index.d.ts +11 -10
- package/dist/convex/index.js +6 -4
- 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-BBO24vj6.js → create-DnrmLnLW.js} +31 -32
- package/dist/{credential-kue0qpbm.js → credential-DM2um3ha.js} +152 -31
- package/dist/credentials-DPyHmYz5.js +74 -0
- package/dist/delegation-DaXVdDhM.js +286 -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-DfRk15uw.d.ts → denied-text-D8jDHgsl.d.ts} +5 -5
- package/dist/{describe-C3ldA9os.d.ts → describe-BZUsixiL.d.ts} +2 -2
- package/dist/{describe-Cgkp7eP0.js → describe-BybMRY7A.js} +6 -2
- package/dist/device-BARQ8eYG.js +193 -0
- package/dist/diff-CxZo9pTq.js +37 -0
- package/dist/{diff-rpqoe7Ag.js → diff-DCePiN6M.js} +60 -54
- package/dist/doctor-CxiwSfqH.js +44 -0
- package/dist/{doctor-owlv6ddh.js → doctor-DFjUxf2f.js} +245 -50
- package/dist/drizzle/index.d.ts +5 -3
- package/dist/drizzle/index.js +2 -2
- package/dist/elysia/index.d.ts +16 -13
- package/dist/elysia/index.js +13 -12
- package/dist/env-DJZrPjRi.js +8 -0
- package/dist/errors-BDUwg2qC.js +27 -0
- package/dist/{errors-drnfxYtm.js → errors-BKy0EfhN.js} +5 -9
- package/dist/errors-BWXBMaKK.d.ts +11 -0
- package/dist/{errors-OD_4c__H.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-C9YJsv3H.js → evaluations-DZ2CbV5k.js} +145 -34
- package/dist/eve/index.d.ts +12 -16
- package/dist/eve/index.js +22 -28
- 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 +12 -11
- package/dist/fastify/index.d.ts +25 -22
- package/dist/fastify/index.js +13 -12
- 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/{fixtures-h2eG2OZV.js → fixtures-B7XrLeY7.js} +8 -7
- package/dist/flags-C3DktBDY.js +86 -0
- package/dist/{from-snapshot-7REQZe0H.js → from-snapshot-D2lZt4Dd.js} +55 -52
- package/dist/{grantee-CXY-0C87.js → grantee-Cn1HyUsI.js} +3 -3
- package/dist/{grantee-conditions-MQs5NIuX.js → grantee-conditions-CcXf8hMM.js} +4 -3
- package/dist/{grantee-match-fxYp9Nmt.js → grantee-match-DHArqY82.js} +5 -4
- 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-C9YmyBIa.js → helpers-DTcZOzhF.js} +45 -38
- package/dist/hono/index.d.ts +12 -9
- package/dist/hono/index.js +13 -12
- package/dist/hosted-BZIAYvon.js +315 -0
- package/dist/hosted-DBDX0M-P.d.ts +78 -0
- package/dist/{http-DPuDaChb.d.ts → http-B_LphE5Y.d.ts} +1 -2
- package/dist/http-DXJ37RDA.js +46 -0
- package/dist/{http-BEbdMZ05.js → http-ujKm0JXE.js} +1 -2
- package/dist/{import-UHk1N7vH.js → import-CNV7I2Dw.js} +25 -20
- package/dist/{import-BFIlhetD.js → import-DMmOG27O.js} +190 -53
- 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-UdVQgq48.d.ts → index-DOVf7RJv.d.ts} +431 -81
- package/dist/{index-BwMe94Xq.d.ts → index-SGdIQyzc.d.ts} +34 -16
- package/dist/index.d.ts +19 -15
- package/dist/index.js +31 -21
- package/dist/init-DeMYsnYJ.js +96 -0
- package/dist/init-GG6Jh8HD.js +95 -0
- package/dist/{instance-options-plkrsAog.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-DBkdUuCO.js → json-schema-B-vAwlde.js} +45 -6
- package/dist/json-schema-CN_iLFH2.d.ts +40 -0
- package/dist/jwt/index.d.ts +18 -11
- package/dist/jwt/index.js +156 -135
- package/dist/{kernel-CB3LrIJM.js → kernel-5JatXyND.js} +52 -24
- package/dist/kysely/index.d.ts +5 -3
- package/dist/kysely/index.js +2 -2
- package/dist/load-BxEtwlBS.js +1 -0
- package/dist/{load-C3_oTHyO.js → load-DFS_ry0W.js} +22 -6
- 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-AVlBaJoa.js → map-claims-D3oRmTk0.js} +13 -10
- package/dist/{map-error-BE27PYkE.js → map-error-TCAdw-eW.js} +3 -3
- package/dist/{markers-CiwAOZtO.js → markers-C6joDI3o.js} +2 -1
- package/dist/mcp/index.d.ts +22 -12
- package/dist/mcp/index.js +57 -39
- package/dist/{migrate-BwlB5-Wk.js → migrate-BShP7Vf4.js} +53 -14
- package/dist/nest/index.d.ts +12 -9
- package/dist/nest/index.js +15 -14
- package/dist/next/index.d.ts +18 -21
- package/dist/next/index.js +13 -11
- 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-uYFXGVw2.js → ocsf-BFp-PZZA.js} +22 -11
- package/dist/openai/index.d.ts +9 -16
- package/dist/openai/index.js +17 -24
- package/dist/openapi/index.d.ts +3 -3
- package/dist/openapi/index.js +1 -1
- package/dist/{openapi-DBzHQbov.js → openapi-B7HZ0f-r.js} +8 -8
- package/dist/{openapi-BJdBmYDG.js → openapi-DTaEmTSW.js} +10 -9
- 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 +20 -15
- package/dist/otel/index.d.ts +3 -2
- package/dist/otel/index.js +30 -7
- package/dist/output-Dyw8fyPF.js +88 -0
- package/dist/output-files-B3IZJksC.js +1 -0
- package/dist/{output-files-CgIsvdSa.js → output-files-DhRBBE4n.js} +24 -26
- package/dist/{permission-keys-B26jeyUv.js → ownership-BatFgAA4.js} +1698 -869
- package/dist/{package-root-DtNnpmUd.js → package-root-Dk_ETdkp.js} +1 -1
- package/dist/{parse-CVFQHk6c.js → parse-Cxq0WxrA.js} +2 -2
- package/dist/{parse-local-manifest-C-q02Pal.js → parse-local-manifest-CVSs6J9I.js} +1 -1
- package/dist/{parse-local-manifest-DvYUR0QL.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 +45 -26
- 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-BsblpB-z.js → permission-registry-Br4jSNVi.js} +3 -3
- package/dist/permissions-B-wCP5ZC.js +30 -0
- package/dist/{permissions-CCJ6lmxB.js → permissions-CZKiUfFM.js} +4 -3
- package/dist/{permissions-COH-KRgT.d.ts → permissions-oEWfl-kl.d.ts} +1 -2
- package/dist/policies-CO1oOymN.js +295 -0
- package/dist/{policy-ur0BBK_e.d.ts → policy-Czo4n3Hs.d.ts} +2 -2
- package/dist/{hosted-CBHgkzDl.js → policy-DLZJ5gAp.js} +17 -273
- package/dist/policy-from-catalog-DzhEc3Y9.js +450 -0
- package/dist/policy-module-CTlwMvLI.js +89 -0
- package/dist/{policy-types-sp9P1iIV.d.ts → policy-types-DzwivBgR.d.ts} +434 -631
- 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-cZe4kzhL.js → powersync-bYUDLOAO.js} +23 -24
- 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 +2 -2
- package/dist/{problem-CnWraVhC.js → problem-CTviyH5L.js} +13 -23
- package/dist/{problem-details-rIIo8B2C.d.ts → problem-details-DXlt-vks.d.ts} +1 -1
- package/dist/{problem-details-DECUnXAn.js → problem-details-cn5X30gZ.js} +43 -40
- package/dist/problem-types-CJ2325SZ.js +5 -0
- package/dist/{prompt-CXYhLfsS.js → prompt-DfZLJLIn.js} +2 -2
- package/dist/{protected-B3_P7xuw.d.ts → protected-DEPHc2xV.d.ts} +16 -8
- package/dist/{protected-BN7BUdY1.js → protected-DfjY5mLA.js} +21 -4
- package/dist/{provider-Bi-0HNL3.js → provider-CC-u3bYP.js} +2 -2
- package/dist/{provider-kwHC9CZD.d.ts → provider-DMVt6yYn.d.ts} +1 -1
- package/dist/{provider-store-Ctt-81Ni.js → provider-store-B5Yrkhzr.js} +2 -2
- 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 -72
- package/dist/react-native/index.js +24 -22
- package/dist/{refs-f3imMjNW.js → refs-K6eWUJ0H.js} +1 -1
- package/dist/{relation-walk-BXnlLtg2.js → relation-walk-3OyDBF0S.js} +2 -2
- package/dist/{relations-CvmSpG67.js → relations-BnCWnJGI.js} +3 -3
- package/dist/renames-CGj7YwcQ.js +175 -0
- package/dist/{replay-COpmZUfx.d.ts → replay-D7iKcLFe.d.ts} +1 -1
- package/dist/{replay-BsOyTrdV.js → replay-Du1tJjG7.js} +2 -1
- package/dist/{request-context-BVM7aWNs.js → request-context-BTRTG7OT.js} +3 -3
- 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-D1Un3pcz.js → resource-relations-D_jw0BFx.js} +1 -1
- package/dist/{retire-BFcxL6un.js → retire-CALjIQ7e.js} +2 -2
- package/dist/{revocations-Cy06JNx2.d.ts → revocations-R07lFBnX.d.ts} +2 -0
- package/dist/rls-BA8an5Ap.js +336 -0
- package/dist/{rls-BEktUaqg.js → rls-j6t43t7n.js} +287 -689
- package/dist/{role-builder-B4GbKM-i.js → role-builder-CXbis5-X.js} +14 -207
- package/dist/{rpc-nYC3cR_u.js → rpc-aPyNi6tA.js} +7 -7
- 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-D_tMXnsq.js → runtime-D3VTAiCA.js} +1 -1
- package/dist/{saas-DtaA4JuW.js → saas-FO-Q8oj0.js} +16 -14
- package/dist/scan-BOI5tJ-6.js +29 -0
- package/dist/{schema-DjQBcAP9.js → schema-B4v0Qrac.js} +102 -8
- 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-vFR1O5oG.js → scim-ClHtpyV3.js} +208 -76
- package/dist/{scopes-tvpa34ep.js → scopes-CUPSjo9q.js} +12 -7
- package/dist/server/index.d.ts +12 -143
- package/dist/server/index.js +12 -9
- package/dist/server-DqCT4CgZ.js +453 -0
- package/dist/{server-types-DdqBwZN_.d.ts → server-types-BLd4MnBX.d.ts} +51 -68
- package/dist/{sha256-BO0swRXL.js → sha256-D9ihqmvd.js} +8 -1
- package/dist/{shared-1uhI-e-b.js → shared-CD11nBbC.js} +18 -8
- package/dist/{shared-JhMeOsDF.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-BZdRQkxs.js → skills-B6lVdD_W.js} +13 -6
- package/dist/skills-CTYwkl44.js +51 -0
- package/dist/snapshot-CXUWfsNy.js +269 -0
- package/dist/{snapshot-cache-Cod40D-X.js → snapshot-cache-DZHQ0KF6.js} +11 -5
- package/dist/{snapshot-cache-J5T7t_vD.d.ts → snapshot-cache-DqK9eDmM.d.ts} +7 -5
- package/dist/solid/index.d.ts +11 -12
- package/dist/solid/index.js +7 -7
- package/dist/solid-start/index.d.ts +52 -0
- package/dist/solid-start/index.js +49 -0
- package/dist/{sources-Dljy06zL.d.ts → sources-BV9j0DeZ.d.ts} +7 -13
- package/dist/{sources-B1-b-R0t.js → sources-vs5dGOsS.js} +125 -119
- package/dist/{sql-t8teWOfo.js → sql-B5T1IL83.js} +13 -1
- package/dist/src-DLfUWFAI.js +1851 -0
- package/dist/ssf/index.d.ts +4 -4
- package/dist/ssf/index.js +384 -47
- 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-ILkLUj_o.js → store-4u_hxjWa.js} +40 -53
- package/dist/{store-options-CbUHDoSe.js → store-options-BqEakYRa.js} +26 -21
- package/dist/{stores-BHXdSbw9.js → stores-BbsD4fAR.js} +2 -2
- package/dist/{stores-Cxz_80g-.d.ts → stores-ClZUgeoP.d.ts} +7 -8
- package/dist/{stream-Dwsg6WwE.d.ts → stream-7-xmnf3U.d.ts} +2 -2
- package/dist/{stream-BMui98KK.js → stream-CvdUS9V1.js} +9 -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/supabase/index.d.ts +23 -106
- package/dist/supabase/index.js +5 -4
- package/dist/supabase/middleware.d.ts +7 -6
- package/dist/supabase/middleware.js +13 -11
- package/dist/supabase-9pqI57pW.js +92 -0
- package/dist/{supabase-C1TWlnYt.js → supabase-Dxlp8A94.js} +98 -205
- package/dist/supabase-hook-CXcGpHqq.js +1 -0
- package/dist/{supabase-hook-Cva3ikXz.js → supabase-hook-DdDQhMlw.js} +951 -60
- package/dist/support-session-C6xJQYut.js +158 -0
- package/dist/svelte/Protected.svelte +4 -4
- package/dist/svelte/index.d.ts +7 -7
- package/dist/svelte/index.js +10 -10
- package/dist/svelte/runtime.d.ts +3 -3
- package/dist/svelte/runtime.js +3 -3
- package/dist/svelte/source.d.ts +7 -7
- package/dist/svelte/source.js +4 -4
- 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/{tenancy-DshjqY0n.js → tenancy-DN2QAx9z.js} +5 -5
- package/dist/terminal/index.d.ts +11 -9
- package/dist/terminal/index.js +23 -287
- package/dist/testing/index.d.ts +311 -38
- package/dist/testing/index.js +3475 -201
- 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-Bx9qy30p.js → token-BLZcjQgt.js} +15 -6
- package/dist/{tool-refusal-CQ7OEia9.js → tool-refusal-CMLN5xhn.js} +2 -2
- package/dist/trpc/index.d.ts +12 -9
- package/dist/trpc/index.js +16 -14
- package/dist/{types-7rJVLWe5.d.ts → types-5Ut_pbKy.d.ts} +61 -11
- package/dist/{store-9KO4BlkB.d.ts → types-BNORmDM8.d.ts} +100 -75
- package/dist/types-BjV-fqcA.d.ts +57 -0
- package/dist/{types-CUcFZfpU.d.ts → types-BqAKcRNW.d.ts} +2 -1
- package/dist/types-C8-KNsFf.d.ts +107 -0
- package/dist/{types-Br9IXUBG.d.ts → types-CCpc2Dcv.d.ts} +77 -17
- package/dist/{types-DpWfQdSh.d.ts → types-CZTnPFzM.d.ts} +46 -11
- package/dist/{types-CqrjB9o6.d.ts → types-CdlxsYQh.d.ts} +23 -11
- package/dist/{types-CIlTojhq.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-ByUo56un.d.ts → types-fbZ7JEXr.d.ts} +23 -22
- package/dist/{types-DHrmBJLH.d.ts → types-tIgIeIKJ.d.ts} +7 -7
- 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-CG9nOYZw.js → usage-T5mXq98v.js} +54 -11
- package/dist/{validation-error-BSSw0l_8.d.ts → validation-error-Bg5Tpluk.d.ts} +1 -1
- package/dist/{validity-dVrUEPJt.js → validity-CZ7-y0Cj.js} +32 -15
- package/dist/{verifier-DMr_Zmb_.js → verifier-DHuh-okk.js} +18 -7
- package/dist/{verify-BztUB3GX.js → verify-DbCL9bnB.js} +645 -50
- package/dist/{version-BEogC-rB.js → version-CEbQ5UeM.js} +4 -3
- package/dist/version-DXkYUISx.js +1 -0
- package/dist/{views-CJsrBS1f.js → views-DTIIO-oQ.js} +22 -5
- package/dist/{permission-types-Dg39z9Kv.d.ts → vocabulary-D6lPdb4Z.d.ts} +65 -2
- package/dist/vue/index.d.ts +9 -10
- package/dist/vue/index.js +8 -8
- 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-zeucB7eF.js → watch-CszoTJMq.js} +44 -5
- package/dist/webmcp/index.d.ts +2 -2
- package/dist/webmcp/index.js +3 -3
- 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-Cr93qqdP.d.ts → wrap-Bd1Tejur.d.ts} +2 -1
- package/dist/{wrap-DWsU_5Bd.js → wrap-gX61EtpB.js} +7 -6
- package/package.json +136 -37
- 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 +123 -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 +14 -10
- package/skills/permdock-data/SKILL.md +6 -6
- package/skills/permdock-data/references/queries-and-rls.md +9 -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 +5 -4
- package/skills/permdock-wire/SKILL.md +17 -11
- package/skills/permdock-wire/references/adapters.md +139 -51
- package/skills/permdock-wire/references/policy-options.md +5 -5
- package/skills/permdock-wire/references/presets-and-recipes.md +58 -0
- package/dist/approvals-DZL76lKW.js +0 -240
- package/dist/arazzo-CD8d0WLb.js +0 -54
- package/dist/catalog-6yWAX6Ps.js +0 -2
- package/dist/catalog-WHG4kBq7.js +0 -48
- package/dist/cloud-C7bSDgX4.js +0 -50
- package/dist/cloud-PeBN3IEn.js +0 -118
- package/dist/collect-Bw2Jdq1q.js +0 -2
- package/dist/collect-CQx4hX4N.js +0 -83
- package/dist/commands-Cpip4ULx.js +0 -97
- package/dist/config-DLt6BvV7.js +0 -36
- package/dist/diff-Cnghh_Ip.js +0 -48
- package/dist/doctor-CuVJvhV_.js +0 -53
- package/dist/duration-xK2jGFVc.js +0 -25
- package/dist/errors-CWfoNg9N.js +0 -47
- package/dist/errors-DRnGZHzF.js +0 -30
- package/dist/expiry-BoBJ8Tvc.js +0 -7
- package/dist/fields-fwfXN01n.js +0 -1016
- 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-DgM7w96K.d.ts +0 -6
- package/dist/index-Dz7didpC.d.ts +0 -201
- package/dist/load-B_shHrmd.js +0 -2
- package/dist/manifest-BngWKryL.js +0 -770
- package/dist/may-use-BOn_dR_w.js +0 -78
- package/dist/openapi-DcQ1Kg40.js +0 -164
- package/dist/ownership-BgnbOJFT.js +0 -851
- package/dist/permdock-L26udHSk.js +0 -3646
- package/dist/powersync-BFSbSElQ.js +0 -62
- package/dist/powersync-DCDgZgfZ.js +0 -2
- package/dist/rls-55DQTuf5.js +0 -250
- package/dist/run-DMcNW_8T.js +0 -174
- package/dist/server-ZYEHtNHS.js +0 -268
- package/dist/sink-BTtmfPnE.js +0 -141
- package/dist/sink-CPN4zLfs.d.ts +0 -104
- package/dist/skills-Dle4ZoLF.js +0 -56
- package/dist/snapshot-Dc9CHPME.js +0 -1078
- package/dist/src-Bb7no-hS.js +0 -639
- package/dist/subject-C6dLxqHU.js +0 -24
- package/dist/supabase-Dbqr141s.js +0 -83
- package/dist/supabase-hook-BULg7Ut_.js +0 -2
- package/dist/thenable-QSmvt-vZ.js +0 -65
- package/dist/types-C0dee0Qf.d.ts +0 -197
- package/dist/types-DvupZE0w.d.ts +0 -9
- package/dist/usage-4G6t643F.js +0 -42
- package/dist/usage-iFLJ0-rr.js +0 -2
- package/dist/vocabulary-hhEFLFoL.d.ts +0 -65
- package/dist/watch-C8TpsAl4.js +0 -2
|
@@ -0,0 +1,566 @@
|
|
|
1
|
+
import { r as isRecord, t as compact } from "./compact-CAf557ZB.js";
|
|
2
|
+
import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
|
|
3
|
+
import { r as validateRecord } from "./thenable-yD7SabqG.js";
|
|
4
|
+
import { t as anonymousSubject } from "./subject-BGoM5o8B.js";
|
|
5
|
+
import { t as readClaim } from "./claims-map-7oQ3ue4X.js";
|
|
6
|
+
import { t as clientNameOf } from "./clients-DjU5ABMy.js";
|
|
7
|
+
import "./budget-NbEtbJC_.js";
|
|
8
|
+
import { a as hookApiNames } from "./sources-vs5dGOsS.js";
|
|
9
|
+
//#region src/supabase/subject.ts
|
|
10
|
+
const REGISTERED = /* @__PURE__ */ new Set([
|
|
11
|
+
"sub",
|
|
12
|
+
"role",
|
|
13
|
+
"iss",
|
|
14
|
+
"aud",
|
|
15
|
+
"exp",
|
|
16
|
+
"iat",
|
|
17
|
+
"nbf",
|
|
18
|
+
"aal",
|
|
19
|
+
"amr",
|
|
20
|
+
"acr",
|
|
21
|
+
"session_id",
|
|
22
|
+
"email",
|
|
23
|
+
"phone",
|
|
24
|
+
"is_anonymous",
|
|
25
|
+
"app_metadata",
|
|
26
|
+
"user_metadata",
|
|
27
|
+
"act",
|
|
28
|
+
"client_id",
|
|
29
|
+
"scope"
|
|
30
|
+
]);
|
|
31
|
+
/** Top-level first, then `app_metadata`. `null` counts as absent: the RBAC hook writes `null` for a user with no role row. */
|
|
32
|
+
function claimNamed(claims, name) {
|
|
33
|
+
const top = Object.hasOwn(claims, name) ? claims[name] : void 0;
|
|
34
|
+
if (top !== void 0 && top !== null) return top;
|
|
35
|
+
const meta = claims["app_metadata"];
|
|
36
|
+
if (isRecord(meta) && Object.hasOwn(meta, name)) return meta[name] ?? void 0;
|
|
37
|
+
}
|
|
38
|
+
/** A `ClaimPath`: a name read at the top level, then in `app_metadata`; or a function over the claims. */
|
|
39
|
+
function claimAt(claims, path) {
|
|
40
|
+
return typeof path === "string" ? claimNamed(claims, path) : readClaim(claims, path);
|
|
41
|
+
}
|
|
42
|
+
function asRoles(value, declared) {
|
|
43
|
+
const raw = typeof value === "string" ? value === "" ? [] : [value] : Array.isArray(value) ? value.filter((item) => typeof item === "string") : [];
|
|
44
|
+
if (declared === void 0) return raw;
|
|
45
|
+
const allowed = new Set(declared);
|
|
46
|
+
return raw.filter((role) => allowed.has(role));
|
|
47
|
+
}
|
|
48
|
+
/** Reads the `memberships` claim; an entry it cannot read is dropped and its index reported. */
|
|
49
|
+
function readMemberships(value) {
|
|
50
|
+
if (!Array.isArray(value)) return {
|
|
51
|
+
memberships: [],
|
|
52
|
+
dropped: []
|
|
53
|
+
};
|
|
54
|
+
const out = [];
|
|
55
|
+
const dropped = [];
|
|
56
|
+
for (const [index, item] of value.entries()) {
|
|
57
|
+
const membership = asMembership(item);
|
|
58
|
+
if (membership === void 0) dropped.push(index);
|
|
59
|
+
else out.push(membership);
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
memberships: out,
|
|
63
|
+
dropped
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function asMembership(item) {
|
|
67
|
+
if (!isRecord(item) || !Array.isArray(item["roles"])) return;
|
|
68
|
+
const roles = item["roles"].filter((role) => typeof role === "string");
|
|
69
|
+
if (roles.length === 0) return;
|
|
70
|
+
const scope = typeof item["scope"] === "string" ? item["scope"] : void 0;
|
|
71
|
+
const id = typeof item["id"] === "string" ? item["id"] : void 0;
|
|
72
|
+
const within = isRecord(item["within"]) ? Object.fromEntries(Object.entries(item["within"]).filter((entry) => typeof entry[1] === "string")) : void 0;
|
|
73
|
+
const tenant = typeof item["tenant"] === "string" ? item["tenant"] : void 0;
|
|
74
|
+
const team = typeof item["team"] === "string" ? item["team"] : void 0;
|
|
75
|
+
const onRecord = isRecord(item["on"]) ? item["on"] : void 0;
|
|
76
|
+
const on = onRecord !== void 0 && typeof onRecord["resource"] === "string" && typeof onRecord["id"] === "string" ? {
|
|
77
|
+
resource: onRecord["resource"],
|
|
78
|
+
id: onRecord["id"]
|
|
79
|
+
} : void 0;
|
|
80
|
+
if ((scope === void 0 || id === void 0) && tenant === void 0 && team === void 0 && on === void 0) return;
|
|
81
|
+
const keep = item["keep"];
|
|
82
|
+
if (keep !== void 0 && (!Array.isArray(keep) || !keep.every((key) => typeof key === "string" && key !== ""))) return;
|
|
83
|
+
return compact({
|
|
84
|
+
roles,
|
|
85
|
+
scope,
|
|
86
|
+
id,
|
|
87
|
+
within,
|
|
88
|
+
tenant,
|
|
89
|
+
team,
|
|
90
|
+
on,
|
|
91
|
+
via: typeof item["via"] === "string" ? item["via"] : void 0,
|
|
92
|
+
expiresAt: typeof item["expires_at"] === "number" ? item["expires_at"] : void 0,
|
|
93
|
+
grantedBy: typeof item["granted_by"] === "string" ? item["granted_by"] : void 0,
|
|
94
|
+
reason: typeof item["reason"] === "string" ? item["reason"] : void 0,
|
|
95
|
+
member: memberOf(item["member"]),
|
|
96
|
+
managedBy: item["managed_by"] === "idp" ? "idp" : void 0,
|
|
97
|
+
entitlements: Array.isArray(item["entitlements"]) ? item["entitlements"].filter((seat) => typeof seat === "string") : void 0,
|
|
98
|
+
keep: keep === void 0 ? void 0 : asStrings(keep)
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
function memberOf(value) {
|
|
102
|
+
if (value === null || typeof value !== "object" || !Object.hasOwn(value, "group")) return;
|
|
103
|
+
const group = value.group;
|
|
104
|
+
return typeof group === "string" && group !== "" ? { group } : void 0;
|
|
105
|
+
}
|
|
106
|
+
function asStrings(value) {
|
|
107
|
+
return Array.isArray(value) ? value.filter((item) => typeof item === "string") : [];
|
|
108
|
+
}
|
|
109
|
+
/** `claims[plans][tenant]`: only the active tenant's entry, never another tenant's. */
|
|
110
|
+
function plansFor(claims, name, tenant) {
|
|
111
|
+
if (name === void 0 || tenant === void 0) return [];
|
|
112
|
+
const byTenant = claimAt(claims, name);
|
|
113
|
+
if (!isRecord(byTenant) || !Object.hasOwn(byTenant, tenant)) return [];
|
|
114
|
+
return asStrings(byTenant[tenant]);
|
|
115
|
+
}
|
|
116
|
+
const INVALID_CHAIN = Object.freeze({
|
|
117
|
+
ok: false,
|
|
118
|
+
reason: "invalid-chain"
|
|
119
|
+
});
|
|
120
|
+
const NO_ACTOR = Object.freeze({ ok: true });
|
|
121
|
+
/** Own entries of one `act` level, with the nested `act` copied the same way. */
|
|
122
|
+
function copyAct(level) {
|
|
123
|
+
const entries = Object.entries(level).map(([key, value]) => [key, key === "act" && isRecord(value) ? copyAct(value) : value]);
|
|
124
|
+
return Object.fromEntries(entries);
|
|
125
|
+
}
|
|
126
|
+
function isToolList(value) {
|
|
127
|
+
return Array.isArray(value) && value.every((tool) => typeof tool === "string" && tool !== "");
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* The outer `act` level by its `kind`, the marker a support tool writes: none is an OAuth client
|
|
131
|
+
* or agent chain, `support` a support session (with `session_id`), `impersonation` an admin acting
|
|
132
|
+
* as the user, `agent` an agent run with the `tools` it may call. Any other `kind`, a support level
|
|
133
|
+
* without `session_id`, and an agent level with `session_id`, `tools` that are not non-empty
|
|
134
|
+
* strings or a `read_only` that is not a boolean are invalid, as better-supabase reads them.
|
|
135
|
+
*/
|
|
136
|
+
function actingParty(outer, id) {
|
|
137
|
+
const marked = Object.hasOwn(outer, "kind") ? outer["kind"] : void 0;
|
|
138
|
+
const kind = marked === void 0 && Object.hasOwn(outer, "session_id") ? "support" : marked;
|
|
139
|
+
const chain = copyAct(outer);
|
|
140
|
+
const reason = typeof outer["reason"] === "string" ? outer["reason"] : void 0;
|
|
141
|
+
switch (kind) {
|
|
142
|
+
case void 0: return freezeDeep({
|
|
143
|
+
ok: true,
|
|
144
|
+
actor: {
|
|
145
|
+
id,
|
|
146
|
+
kind: "oauth-client",
|
|
147
|
+
chain
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
case "support": {
|
|
151
|
+
const session = outer["session_id"];
|
|
152
|
+
const readOnly = Object.hasOwn(outer, "read_only") ? outer["read_only"] : true;
|
|
153
|
+
if (typeof session !== "string" || session === "" || typeof readOnly !== "boolean") return INVALID_CHAIN;
|
|
154
|
+
return freezeDeep({
|
|
155
|
+
ok: true,
|
|
156
|
+
actor: compact({
|
|
157
|
+
id,
|
|
158
|
+
kind: "support",
|
|
159
|
+
sessionId: session,
|
|
160
|
+
readOnly,
|
|
161
|
+
reason,
|
|
162
|
+
chain
|
|
163
|
+
})
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
case "impersonation": return freezeDeep({
|
|
167
|
+
ok: true,
|
|
168
|
+
actor: compact({
|
|
169
|
+
id,
|
|
170
|
+
kind: "impersonation",
|
|
171
|
+
reason,
|
|
172
|
+
chain
|
|
173
|
+
})
|
|
174
|
+
});
|
|
175
|
+
case "agent": {
|
|
176
|
+
const tools = Object.hasOwn(outer, "tools") ? outer["tools"] : void 0;
|
|
177
|
+
const readOnly = Object.hasOwn(outer, "read_only") ? outer["read_only"] : false;
|
|
178
|
+
if (Object.hasOwn(outer, "session_id") || tools !== void 0 && !isToolList(tools) || typeof readOnly !== "boolean") return INVALID_CHAIN;
|
|
179
|
+
return freezeDeep({
|
|
180
|
+
ok: true,
|
|
181
|
+
actor: compact({
|
|
182
|
+
id,
|
|
183
|
+
kind: "agent",
|
|
184
|
+
tools,
|
|
185
|
+
readOnly,
|
|
186
|
+
chain
|
|
187
|
+
})
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
default: return INVALID_CHAIN;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
function readActor(claims) {
|
|
194
|
+
if (Object.hasOwn(claims, "act") && claims["act"] !== void 0) {
|
|
195
|
+
let current = claims["act"];
|
|
196
|
+
while (current !== void 0) {
|
|
197
|
+
const level = isRecord(current) ? current["sub"] : void 0;
|
|
198
|
+
if (!isRecord(current) || typeof level !== "string" || level === "") return INVALID_CHAIN;
|
|
199
|
+
current = Object.hasOwn(current, "act") ? current["act"] : void 0;
|
|
200
|
+
}
|
|
201
|
+
const outer = claims["act"];
|
|
202
|
+
const sub = isRecord(outer) ? outer["sub"] : void 0;
|
|
203
|
+
if (!isRecord(outer) || typeof sub !== "string") return INVALID_CHAIN;
|
|
204
|
+
return actingParty(outer, sub);
|
|
205
|
+
}
|
|
206
|
+
const client = Object.hasOwn(claims, "client_id") ? claims["client_id"] : void 0;
|
|
207
|
+
if (typeof client === "string" && client !== "") return freezeDeep({
|
|
208
|
+
ok: true,
|
|
209
|
+
actor: {
|
|
210
|
+
id: client,
|
|
211
|
+
kind: "oauth-client"
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
return NO_ACTOR;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Who acts for the user: the outermost `sub` of an RFC 8693 `act` chain (the current
|
|
218
|
+
* actor; nested levels are prior actors, kept on `chain` for audit), else the
|
|
219
|
+
* OAuth `client_id` of a third-party app. The outer level's `kind` names the actor:
|
|
220
|
+
* none is `oauth-client`, `support` a support session, `impersonation` an admin acting as the
|
|
221
|
+
* user. Reads only `act` and `client_id`; the caller applies the role rule first (`anon` and
|
|
222
|
+
* `service_role` are anonymous and carry no actor). An `act` that is not a chain of objects each
|
|
223
|
+
* with a non-empty `sub`, that names another `kind`, or a support level without `session_id`,
|
|
224
|
+
* is `{ ok: false }` and must deny.
|
|
225
|
+
*/
|
|
226
|
+
function actorOf(claims) {
|
|
227
|
+
try {
|
|
228
|
+
return isRecord(claims) ? readActor(claims) : NO_ACTOR;
|
|
229
|
+
} catch {
|
|
230
|
+
return INVALID_CHAIN;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
const IDENTITY_SCOPES = /* @__PURE__ */ new Set([
|
|
234
|
+
"openid",
|
|
235
|
+
"profile",
|
|
236
|
+
"email",
|
|
237
|
+
"address",
|
|
238
|
+
"phone",
|
|
239
|
+
"offline_access"
|
|
240
|
+
]);
|
|
241
|
+
/**
|
|
242
|
+
* The OAuth `scope` claim (a space-separated string or a list) as `scopes`,
|
|
243
|
+
* without the OpenID Connect identity scopes; `undefined` when none is left.
|
|
244
|
+
*/
|
|
245
|
+
function delegationOf(claims) {
|
|
246
|
+
try {
|
|
247
|
+
if (!isRecord(claims) || !Object.hasOwn(claims, "scope")) return;
|
|
248
|
+
const scope = claims["scope"];
|
|
249
|
+
const scopes = (typeof scope === "string" ? scope.split(/\s+/u).filter(Boolean) : asStrings(scope)).filter((name) => !IDENTITY_SCOPES.has(name));
|
|
250
|
+
return scopes.length > 0 ? freezeDeep({ scopes }) : void 0;
|
|
251
|
+
} catch {
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
function subjectDelegation(claims, chain) {
|
|
256
|
+
const delegation = compact({
|
|
257
|
+
scopes: delegationOf(claims)?.scopes,
|
|
258
|
+
chain
|
|
259
|
+
});
|
|
260
|
+
return Object.keys(delegation).length === 0 ? void 0 : delegation;
|
|
261
|
+
}
|
|
262
|
+
function emit(options, reason, cause) {
|
|
263
|
+
try {
|
|
264
|
+
options.onAuth?.({
|
|
265
|
+
reason,
|
|
266
|
+
cause,
|
|
267
|
+
source: "supabase"
|
|
268
|
+
});
|
|
269
|
+
} catch {}
|
|
270
|
+
}
|
|
271
|
+
function extraClaims(claims) {
|
|
272
|
+
const extra = {};
|
|
273
|
+
const meta = claims["app_metadata"];
|
|
274
|
+
if (isRecord(meta)) for (const [key, value] of Object.entries(meta)) extra[key] = value;
|
|
275
|
+
for (const [key, value] of Object.entries(claims)) {
|
|
276
|
+
if (REGISTERED.has(key) || key === "user_metadata") continue;
|
|
277
|
+
extra[key] = value;
|
|
278
|
+
}
|
|
279
|
+
return extra;
|
|
280
|
+
}
|
|
281
|
+
function subjectActor(actor, options) {
|
|
282
|
+
switch (actor.kind) {
|
|
283
|
+
case "support": return {
|
|
284
|
+
id: actor.id,
|
|
285
|
+
kind: actor.kind,
|
|
286
|
+
sessionId: actor.sessionId,
|
|
287
|
+
readOnly: actor.readOnly
|
|
288
|
+
};
|
|
289
|
+
case "oauth-client": return compact({
|
|
290
|
+
id: actor.id,
|
|
291
|
+
kind: actor.kind,
|
|
292
|
+
client: clientNameOf(options.clients, actor.id)
|
|
293
|
+
});
|
|
294
|
+
case "impersonation": return {
|
|
295
|
+
id: actor.id,
|
|
296
|
+
kind: actor.kind
|
|
297
|
+
};
|
|
298
|
+
case "agent": return compact({
|
|
299
|
+
id: actor.id,
|
|
300
|
+
kind: actor.kind,
|
|
301
|
+
tools: actor.tools,
|
|
302
|
+
readOnly: actor.readOnly
|
|
303
|
+
});
|
|
304
|
+
default: return actor;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
function mapClaims(claims, options) {
|
|
308
|
+
const role = claims["role"];
|
|
309
|
+
if (role === "anon" || role === "service_role") return anonymousSubject();
|
|
310
|
+
const id = claims["sub"];
|
|
311
|
+
if (typeof id !== "string" || id === "") return anonymousSubject();
|
|
312
|
+
const act = readActor(claims);
|
|
313
|
+
if (!act.ok) {
|
|
314
|
+
emit(options, "invalid-token", act.reason);
|
|
315
|
+
return anonymousSubject();
|
|
316
|
+
}
|
|
317
|
+
if (options.anonymousSignIns === "deny" && claims["is_anonymous"] === true) return anonymousSubject();
|
|
318
|
+
const actor = act.actor === void 0 ? void 0 : subjectActor(act.actor, options);
|
|
319
|
+
const roleClaim = options.claims?.roles ?? "user_role";
|
|
320
|
+
const tenantClaim = options.claims?.tenant ?? "tenant_id";
|
|
321
|
+
const membershipsClaim = options.claims?.memberships ?? "memberships";
|
|
322
|
+
let extra = extraClaims(claims);
|
|
323
|
+
if (options.schema !== void 0) extra = validateRecord(options.schema, extra) ?? {};
|
|
324
|
+
const include = new Set(options.include ?? []);
|
|
325
|
+
const tenantValue = claimAt(claims, tenantClaim);
|
|
326
|
+
const version = claimAt(claims, "authz_ver");
|
|
327
|
+
const tenant = typeof tenantValue === "string" ? tenantValue : void 0;
|
|
328
|
+
const { memberships, dropped } = readMemberships(claimAt(claims, membershipsClaim));
|
|
329
|
+
if (dropped.length > 0) emit(options, "schema", "membership-dropped");
|
|
330
|
+
const plans = plansFor(claims, options.claims?.plans, tenant);
|
|
331
|
+
const principal = compact({
|
|
332
|
+
id,
|
|
333
|
+
kind: "user",
|
|
334
|
+
roles: asRoles(claimAt(claims, roleClaim), options.declared),
|
|
335
|
+
tenant,
|
|
336
|
+
plans: plans.length > 0 ? plans : void 0,
|
|
337
|
+
memberships,
|
|
338
|
+
membershipsTruncated: claimAt(claims, "memberships_truncated") === true ? true : void 0,
|
|
339
|
+
authzVersion: typeof version === "number" && Number.isInteger(version) ? version : void 0,
|
|
340
|
+
issuer: typeof claims["iss"] === "string" ? claims["iss"] : void 0,
|
|
341
|
+
assurance: typeof claims["aal"] === "string" ? { acr: claims["aal"] } : void 0,
|
|
342
|
+
claims: Object.keys(extra).length === 0 ? void 0 : extra,
|
|
343
|
+
email: include.has("email") && typeof claims["email"] === "string" ? claims["email"] : void 0,
|
|
344
|
+
phone: include.has("phone") && typeof claims["phone"] === "string" ? claims["phone"] : void 0,
|
|
345
|
+
is_anonymous: include.has("is_anonymous") && typeof claims["is_anonymous"] === "boolean" ? claims["is_anonymous"] : void 0
|
|
346
|
+
});
|
|
347
|
+
const session = typeof claims["session_id"] === "string" ? claims["session_id"] : void 0;
|
|
348
|
+
const expiresAt = typeof claims["exp"] === "number" ? claims["exp"] : void 0;
|
|
349
|
+
return freezeDeep(compact({
|
|
350
|
+
principal,
|
|
351
|
+
actor,
|
|
352
|
+
delegation: act.actor?.kind === "oauth-client" || act.actor?.kind === "agent" ? subjectDelegation(claims, act.actor.chain) : void 0,
|
|
353
|
+
context: {},
|
|
354
|
+
session,
|
|
355
|
+
expiresAt,
|
|
356
|
+
liveSession: options.liveSession === true && session !== void 0 ? true : void 0
|
|
357
|
+
}));
|
|
358
|
+
}
|
|
359
|
+
function subjectFromSupabase(claims, options = {}) {
|
|
360
|
+
try {
|
|
361
|
+
if (!isRecord(claims)) return anonymousSubject();
|
|
362
|
+
const rest = {};
|
|
363
|
+
for (const [key, value] of Object.entries(claims)) {
|
|
364
|
+
if (key === "user_metadata") continue;
|
|
365
|
+
rest[key] = value;
|
|
366
|
+
}
|
|
367
|
+
return mapClaims(rest, options);
|
|
368
|
+
} catch {
|
|
369
|
+
return anonymousSubject();
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* A verified session object (`{ kind, claims }`) in, `Subject` out.
|
|
374
|
+
* Only `kind: 'user'` sessions map; `anon`, `service`, `invalid` and anything else are anonymous.
|
|
375
|
+
*/
|
|
376
|
+
function subjectFromSupabaseSession(session, options = {}) {
|
|
377
|
+
try {
|
|
378
|
+
if (session === null || session === void 0 || session.kind !== "user") return anonymousSubject();
|
|
379
|
+
return subjectFromSupabase(session.claims, options);
|
|
380
|
+
} catch {
|
|
381
|
+
return anonymousSubject();
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
//#endregion
|
|
385
|
+
//#region src/supabase/postgrest.ts
|
|
386
|
+
function callRpc(client, schema, fn, args) {
|
|
387
|
+
return client.schema(schema).rpc(fn, args);
|
|
388
|
+
}
|
|
389
|
+
function strings(value) {
|
|
390
|
+
return Array.isArray(value) ? value.filter((item) => typeof item === "string") : [];
|
|
391
|
+
}
|
|
392
|
+
function grantOf(value) {
|
|
393
|
+
if (!isRecord(value) || typeof value["permission"] !== "string") return;
|
|
394
|
+
return compact({
|
|
395
|
+
permission: value["permission"],
|
|
396
|
+
effect: value["effect"] === "deny" ? "deny" : "allow",
|
|
397
|
+
level: typeof value["level"] === "string" ? value["level"] : void 0
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
function customRoleOf(value) {
|
|
401
|
+
if (!isRecord(value) || typeof value["name"] !== "string") return;
|
|
402
|
+
const grants = Array.isArray(value["grants"]) ? value["grants"].flatMap((item) => {
|
|
403
|
+
const grant = grantOf(item);
|
|
404
|
+
return grant === void 0 ? [] : [grant];
|
|
405
|
+
}) : [];
|
|
406
|
+
const includes = strings(value["includes"]);
|
|
407
|
+
const body = {
|
|
408
|
+
name: value["name"],
|
|
409
|
+
grants,
|
|
410
|
+
...includes.length === 0 ? {} : { includes }
|
|
411
|
+
};
|
|
412
|
+
if (value["scope"] === "global") return value["tenant"] === void 0 ? {
|
|
413
|
+
...body,
|
|
414
|
+
scope: "global"
|
|
415
|
+
} : void 0;
|
|
416
|
+
if (typeof value["tenant"] !== "string") return;
|
|
417
|
+
return compact({
|
|
418
|
+
...body,
|
|
419
|
+
tenant: value["tenant"],
|
|
420
|
+
scope: typeof value["scope"] === "string" ? value["scope"] : void 0,
|
|
421
|
+
id: typeof value["id"] === "string" ? value["id"] : void 0
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
function readMemberEntries(value) {
|
|
425
|
+
if (!Array.isArray(value)) return [];
|
|
426
|
+
return value.flatMap((item) => {
|
|
427
|
+
if (!isRecord(item) || !isRecord(item["principal"])) return [];
|
|
428
|
+
const id = item["principal"]["id"];
|
|
429
|
+
const [membership] = readMemberships([item["membership"]]).memberships;
|
|
430
|
+
return typeof id === "string" && id !== "" && membership !== void 0 ? [{
|
|
431
|
+
principal: { id },
|
|
432
|
+
membership
|
|
433
|
+
}] : [];
|
|
434
|
+
});
|
|
435
|
+
}
|
|
436
|
+
function versionOf(value) {
|
|
437
|
+
const version = typeof value === "string" ? Number(value) : value;
|
|
438
|
+
return typeof version === "number" && Number.isFinite(version) ? version : void 0;
|
|
439
|
+
}
|
|
440
|
+
/** Reads `subject_for`'s JSON; anything it cannot read is left out, and a malformed record is no record. */
|
|
441
|
+
function readSubjectRecord(value) {
|
|
442
|
+
if (!isRecord(value) || typeof value["id"] !== "string") return;
|
|
443
|
+
if (value["active"] !== true) return {
|
|
444
|
+
id: value["id"],
|
|
445
|
+
active: false,
|
|
446
|
+
roles: [],
|
|
447
|
+
memberships: [],
|
|
448
|
+
customRoles: []
|
|
449
|
+
};
|
|
450
|
+
const version = value["authzVersion"];
|
|
451
|
+
return compact({
|
|
452
|
+
id: value["id"],
|
|
453
|
+
active: true,
|
|
454
|
+
roles: strings(value["roles"]),
|
|
455
|
+
memberships: readMemberships(value["memberships"]).memberships,
|
|
456
|
+
customRoles: Array.isArray(value["customRoles"]) ? value["customRoles"].flatMap((item) => {
|
|
457
|
+
const role = customRoleOf(item);
|
|
458
|
+
return role === void 0 ? [] : [role];
|
|
459
|
+
}) : [],
|
|
460
|
+
authzVersion: typeof version === "number" && Number.isFinite(version) ? version : void 0
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* Membership, custom-role and subject sources over the `subject_for(p_user)`,
|
|
465
|
+
* `authz_version_for(p_user)` and `members_of(p_scope, p_id)` functions
|
|
466
|
+
* `permdock supabase hook generate` writes, for a backend that reaches
|
|
467
|
+
* Postgres only through PostgREST. `memberships.version` reads only the
|
|
468
|
+
* version, so `claimsFirst` with `onStale: 'reread'` reads the full subject
|
|
469
|
+
* only for a stale token; when the version function is missing it falls back
|
|
470
|
+
* to `subject_for`. With `policy`, a token that claims a custom role has its
|
|
471
|
+
* subject read in one `subject_for` call instead, and custom roles are read
|
|
472
|
+
* only for a subject that holds one. Each user and each instance is read once per
|
|
473
|
+
* `postgrestSources` call, so create it per request or per job.
|
|
474
|
+
*/
|
|
475
|
+
function postgrestSources(client, options = {}) {
|
|
476
|
+
const api = options.api;
|
|
477
|
+
const names = api === void 0 ? void 0 : hookApiNames(api.prefix);
|
|
478
|
+
const schema = options.schema ?? (api === void 0 ? "permdock" : api.schema ?? "public");
|
|
479
|
+
const fn = options.fn ?? names?.subjectFor ?? "subject_for";
|
|
480
|
+
const membersFn = options.membersFn ?? names?.membersOf ?? "members_of";
|
|
481
|
+
const versionFn = options.versionFn ?? names?.authzVersionFor ?? "authz_version_for";
|
|
482
|
+
const declared = options.policy === void 0 ? void 0 : options.policy.index.declaredRoles;
|
|
483
|
+
const onlyDeclared = (held) => declared !== void 0 && held?.every((name) => declared.has(name)) === true;
|
|
484
|
+
const loaded = /* @__PURE__ */ new Map();
|
|
485
|
+
const versions = /* @__PURE__ */ new Map();
|
|
486
|
+
const listed = /* @__PURE__ */ new Map();
|
|
487
|
+
const list = (query) => {
|
|
488
|
+
const key = JSON.stringify([query.scope, query.id]);
|
|
489
|
+
const cached = listed.get(key);
|
|
490
|
+
if (cached !== void 0) return cached.then((entries) => [...entries]);
|
|
491
|
+
const pending = Promise.resolve(callRpc(client, schema, membersFn, {
|
|
492
|
+
p_scope: query.scope,
|
|
493
|
+
p_id: query.id
|
|
494
|
+
})).then((result) => {
|
|
495
|
+
if (result.error !== null) throw new Error(`PermDock: ${schema}.${membersFn} failed: ${result.error.message}`);
|
|
496
|
+
return readMemberEntries(result.data);
|
|
497
|
+
});
|
|
498
|
+
listed.set(key, pending);
|
|
499
|
+
return pending.then((entries) => [...entries]);
|
|
500
|
+
};
|
|
501
|
+
const record = (userId) => {
|
|
502
|
+
const cached = loaded.get(userId);
|
|
503
|
+
if (cached !== void 0) return cached;
|
|
504
|
+
const pending = Promise.resolve(callRpc(client, schema, fn, { p_user: userId })).then((result) => {
|
|
505
|
+
if (result.error !== null) throw new Error(`PermDock: ${schema}.${fn} failed: ${result.error.message}`);
|
|
506
|
+
return readSubjectRecord(result.data);
|
|
507
|
+
});
|
|
508
|
+
loaded.set(userId, pending);
|
|
509
|
+
return pending;
|
|
510
|
+
};
|
|
511
|
+
const version = (userId) => {
|
|
512
|
+
const read = loaded.get(userId);
|
|
513
|
+
if (read !== void 0) return read.then((found) => found?.authzVersion);
|
|
514
|
+
const cached = versions.get(userId);
|
|
515
|
+
if (cached !== void 0) return cached;
|
|
516
|
+
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));
|
|
517
|
+
versions.set(userId, pending);
|
|
518
|
+
return pending;
|
|
519
|
+
};
|
|
520
|
+
const live = async (userId) => {
|
|
521
|
+
const found = await record(userId);
|
|
522
|
+
return found?.active === true ? found : void 0;
|
|
523
|
+
};
|
|
524
|
+
return {
|
|
525
|
+
memberships: {
|
|
526
|
+
async membershipsFor(principal) {
|
|
527
|
+
return [...(await live(principal.id))?.memberships ?? []];
|
|
528
|
+
},
|
|
529
|
+
version(principal) {
|
|
530
|
+
return declared !== void 0 && !onlyDeclared([...principal.roles ?? [], ...(principal.memberships ?? []).flatMap((membership) => membership.roles)]) ? record(principal.id).then((found) => found?.authzVersion) : version(principal.id);
|
|
531
|
+
},
|
|
532
|
+
list
|
|
533
|
+
},
|
|
534
|
+
customRoles(principal) {
|
|
535
|
+
return {
|
|
536
|
+
async rolesFor(tenant, context) {
|
|
537
|
+
if (onlyDeclared(context?.held)) return [];
|
|
538
|
+
return ((await live(principal.id))?.customRoles ?? []).filter((role) => role.tenant === tenant);
|
|
539
|
+
},
|
|
540
|
+
async globalRoles(context) {
|
|
541
|
+
if (onlyDeclared(context?.held)) return [];
|
|
542
|
+
return ((await live(principal.id))?.customRoles ?? []).filter((role) => role.scope === "global");
|
|
543
|
+
}
|
|
544
|
+
};
|
|
545
|
+
},
|
|
546
|
+
async subject(userId) {
|
|
547
|
+
const found = await live(userId);
|
|
548
|
+
if (found === void 0) return {
|
|
549
|
+
principal: null,
|
|
550
|
+
context: {}
|
|
551
|
+
};
|
|
552
|
+
return {
|
|
553
|
+
principal: compact({
|
|
554
|
+
id: found.id,
|
|
555
|
+
roles: found.roles,
|
|
556
|
+
memberships: found.memberships,
|
|
557
|
+
authzVersion: found.authzVersion
|
|
558
|
+
}),
|
|
559
|
+
context: {}
|
|
560
|
+
};
|
|
561
|
+
},
|
|
562
|
+
record
|
|
563
|
+
};
|
|
564
|
+
}
|
|
565
|
+
//#endregion
|
|
566
|
+
export { delegationOf as a, subjectFromSupabaseSession as c, actorOf as i, postgrestSources as n, readMemberships as o, readSubjectRecord as r, subjectFromSupabase as s, callRpc as t };
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { $ as MemberEntry, T as Policy, W as CustomRoleSource, Zn as CustomRole, et as MembershipSource, ir as Subject, nr as Membership } from "./policy-types-DzwivBgR.js";
|
|
2
|
+
//#region src/supabase/postgrest.d.ts
|
|
3
|
+
/** What a supabase-js `rpc` call resolves to: `data` or an `error` with a message. */
|
|
4
|
+
type SupabaseRpcResult = {
|
|
5
|
+
readonly data: unknown;
|
|
6
|
+
readonly error: {
|
|
7
|
+
readonly message: string;
|
|
8
|
+
} | null;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* The part of a supabase-js client `postgrestSources` calls:
|
|
12
|
+
* `client.schema(name).rpc(fn, args)`. Pass a client that may execute the
|
|
13
|
+
* function, such as a `service_role` client after the grant the docs show.
|
|
14
|
+
*/
|
|
15
|
+
type SupabaseRpcClient = {
|
|
16
|
+
schema(name: string): {
|
|
17
|
+
rpc(fn: string, args: Readonly<Record<string, unknown>>): PromiseLike<SupabaseRpcResult>;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
type SupabaseRpcCaller = {
|
|
21
|
+
schema(name: never): {
|
|
22
|
+
rpc(fn: never, args: never): PromiseLike<SupabaseRpcResult>;
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
type PostgrestSourcesOptions = {
|
|
26
|
+
/**
|
|
27
|
+
* The `supabase.hook.api` setting the hook file was generated with: the
|
|
28
|
+
* wrappers live in `schema` (default `public`) as `<prefix>subject_for`,
|
|
29
|
+
* `<prefix>members_of` and `<prefix>authz_version_for` (default prefix
|
|
30
|
+
* `permdock_`). It sets the defaults of `schema`, `fn`, `membersFn` and
|
|
31
|
+
* `versionFn`, which still override it.
|
|
32
|
+
*/
|
|
33
|
+
readonly api?: {
|
|
34
|
+
readonly schema?: string;
|
|
35
|
+
readonly prefix?: string;
|
|
36
|
+
};
|
|
37
|
+
/** Schema of the functions. Default `permdock`, where the hook generates `subject_for` and `members_of`. */
|
|
38
|
+
readonly schema?: string;
|
|
39
|
+
/** Function name, for a wrapper in an exposed schema. Default `subject_for`. */
|
|
40
|
+
readonly fn?: string;
|
|
41
|
+
readonly membersFn?: string;
|
|
42
|
+
/** The version-only function `memberships.version` calls. Default `authz_version_for`. */
|
|
43
|
+
readonly versionFn?: string;
|
|
44
|
+
/**
|
|
45
|
+
* The policy whose declared roles tell custom roles apart. With it,
|
|
46
|
+
* `customRoles` reads nothing while every role the subject holds is
|
|
47
|
+
* declared, and `memberships.version` reads the whole subject in one call
|
|
48
|
+
* when the token claims a custom role, which the custom roles need anyway.
|
|
49
|
+
*/
|
|
50
|
+
readonly policy?: Policy;
|
|
51
|
+
};
|
|
52
|
+
/** One user as `subject_for(p_user)` returns it. */
|
|
53
|
+
type SubjectRecord = {
|
|
54
|
+
readonly id: string;
|
|
55
|
+
/** `false` for a suspended user, who holds no roles or memberships. */
|
|
56
|
+
readonly active: boolean;
|
|
57
|
+
readonly roles: readonly string[];
|
|
58
|
+
readonly memberships: readonly Membership[];
|
|
59
|
+
readonly customRoles: readonly CustomRole[];
|
|
60
|
+
readonly authzVersion?: number;
|
|
61
|
+
};
|
|
62
|
+
type PostgrestSources = {
|
|
63
|
+
/**
|
|
64
|
+
* Memberships and the authorization version of any principal, and `list`,
|
|
65
|
+
* the live members of one scope instance through `members_of`, for
|
|
66
|
+
* `countHolders` and `whoCan`. Wrap it in `claimsFirst` to read only when
|
|
67
|
+
* the token was truncated.
|
|
68
|
+
*/
|
|
69
|
+
readonly memberships: MembershipSource & {
|
|
70
|
+
list(query: {
|
|
71
|
+
readonly scope: string;
|
|
72
|
+
readonly id: string;
|
|
73
|
+
}): Promise<MemberEntry[]>;
|
|
74
|
+
};
|
|
75
|
+
/** The custom roles `principal` holds, for `createPermDock`'s `customRoles`. */
|
|
76
|
+
customRoles(principal: {
|
|
77
|
+
readonly id: string;
|
|
78
|
+
}): CustomRoleSource;
|
|
79
|
+
/** The subject the hook would mint for `userId`: anonymous when the user is unknown or suspended. */
|
|
80
|
+
subject(userId: string): Promise<Subject>;
|
|
81
|
+
/** The raw record, `undefined` for an unknown user. */
|
|
82
|
+
record(userId: string): Promise<SubjectRecord | undefined>;
|
|
83
|
+
};
|
|
84
|
+
/** Reads `subject_for`'s JSON; anything it cannot read is left out, and a malformed record is no record. */
|
|
85
|
+
declare function readSubjectRecord(value: unknown): SubjectRecord | undefined;
|
|
86
|
+
/**
|
|
87
|
+
* Membership, custom-role and subject sources over the `subject_for(p_user)`,
|
|
88
|
+
* `authz_version_for(p_user)` and `members_of(p_scope, p_id)` functions
|
|
89
|
+
* `permdock supabase hook generate` writes, for a backend that reaches
|
|
90
|
+
* Postgres only through PostgREST. `memberships.version` reads only the
|
|
91
|
+
* version, so `claimsFirst` with `onStale: 'reread'` reads the full subject
|
|
92
|
+
* only for a stale token; when the version function is missing it falls back
|
|
93
|
+
* to `subject_for`. With `policy`, a token that claims a custom role has its
|
|
94
|
+
* subject read in one `subject_for` call instead, and custom roles are read
|
|
95
|
+
* only for a subject that holds one. Each user and each instance is read once per
|
|
96
|
+
* `postgrestSources` call, so create it per request or per job.
|
|
97
|
+
*/
|
|
98
|
+
declare function postgrestSources(client: SupabaseRpcCaller, options?: PostgrestSourcesOptions): PostgrestSources;
|
|
99
|
+
//#endregion
|
|
100
|
+
export { SupabaseRpcClient as a, readSubjectRecord as c, SupabaseRpcCaller as i, PostgrestSourcesOptions as n, SupabaseRpcResult as o, SubjectRecord as r, postgrestSources as s, PostgrestSources as t };
|