permdock 0.1.0 → 0.2.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 +106 -47
- package/dist/a2a/index.d.ts +7 -16
- package/dist/a2a/index.js +59 -98
- package/dist/adapter-context-mlWsVGGg.js +23 -0
- package/dist/ai-sdk/index.d.ts +37 -16
- package/dist/ai-sdk/index.js +30 -13
- package/dist/approvals/index.d.ts +3 -3
- package/dist/approvals/index.js +5 -4
- package/dist/{approvals-DaxY-Bdg.js → approvals-DbYAuNkG.js} +17 -11
- package/dist/approvers-DT4AVyIg.js +52 -0
- package/dist/{arazzo-CTeVuXr5.js → arazzo-BAgw9ap6.js} +2 -2
- package/dist/{arazzo-aoTkqYsJ.js → arazzo-cmvX2jDe.js} +2 -2
- package/dist/authzen/index.d.ts +4 -13
- package/dist/authzen/index.js +16 -50
- package/dist/better-auth/index.d.ts +20 -3
- package/dist/better-auth/index.js +27 -7
- package/dist/better-supabase/index.d.ts +206 -0
- package/dist/better-supabase/index.js +620 -0
- package/dist/bind-CVy3Espv.d.ts +25 -0
- package/dist/bind-VnYn2HKq.js +97 -0
- package/dist/boundary-BM8a_P6E.js +13 -0
- package/dist/boundary-BmHxVH1J.d.ts +15 -0
- package/dist/canonical-json-DemiK4Vp.js +26 -0
- package/dist/{capability-B68OFnZx.js → capability-4qPdO9gk.js} +7 -5
- package/dist/{capability-BDG_nkxt.d.ts → capability-Dq43tT1u.d.ts} +2 -2
- package/dist/catalog/index.d.ts +1 -1
- package/dist/catalog/index.js +1 -1
- package/dist/catalog-BjZSovXQ.js +2 -0
- package/dist/{catalog-doc-BSo_Q_-6.js → catalog-doc-Dsc9y7sd.js} +23 -12
- package/dist/{catalog-B0E6bggc.js → catalog-h2tlKFkq.js} +2 -2
- package/dist/{catalog-H-vFGwWK.js → catalog-z8q6bi_r.js} +4 -4
- package/dist/claude-agent/index.d.ts +5 -14
- package/dist/claude-agent/index.js +4 -10
- package/dist/clerk/index.d.ts +12 -3
- package/dist/clerk/index.js +26 -5
- package/dist/cli/bin.js +1 -1
- package/dist/cli/index.d.ts +3 -3
- package/dist/cli/index.js +2 -2
- package/dist/clients-C7zLFuWT.d.ts +12 -0
- package/dist/clients-DjU5ABMy.js +23 -0
- package/dist/cloud/index.d.ts +4 -5
- package/dist/cloud/index.js +20 -6
- package/dist/{cloud-BNQTrmrr.js → cloud-BGhHS-lY.js} +2 -2
- package/dist/{cloud-Cuxr6Czw.js → cloud-Bo3e9Ak3.js} +7 -6
- package/dist/{collect-O-tOtbnk.js → collect-DDDv_ESs.js} +194 -42
- package/dist/collect-DLlujdHC.js +83 -0
- package/dist/collect-rG2IQ3t0.js +2 -0
- package/dist/{commands-BMh_Etm2.js → commands-DWOrSQic.js} +16 -12
- package/dist/compile/index.d.ts +3 -0
- package/dist/compile/index.js +2 -0
- package/dist/{compile-D22iwvuV.js → compile-Ba4blROR.js} +85 -30
- package/dist/compile-CNnl6uIt.d.ts +94 -0
- package/dist/config-BJiM-xAm.js +157 -0
- package/dist/config-Bn00Z3ks.js +36 -0
- package/dist/config-report-Dw_JcUqT.js +44 -0
- package/dist/{connection-JvqwHODC.js → connection-CU8MQxRi.js} +1 -1
- package/dist/{context-CKEAabd7.js → context-Ttp0ekMT.js} +36 -27
- package/dist/convex/index.d.ts +9 -4
- package/dist/convex/index.js +14 -4
- package/dist/create-BWyx3jua.d.ts +245 -0
- package/dist/create-CPhDL6qx.js +253 -0
- package/dist/{credential-B_rkUNlY.js → credential-8P81ff4u.js} +26 -46
- package/dist/delegation-D8pUEuce.js +103 -0
- package/dist/{describe-Bt1YD5uS.js → describe-B_gVZEVi.js} +10 -15
- package/dist/{describe-DernyItf.d.ts → describe-PdoqESvg.d.ts} +9 -10
- package/dist/{diff-x5Il8LVa.js → diff-B8Tunc3o.js} +44 -11
- package/dist/{diff-BUzf5Poi.js → diff-CzqLxZ77.js} +2 -2
- package/dist/doctor-WpvG6p4k.js +1194 -0
- package/dist/doctor-collect-ByfYlNv1.js +664 -0
- package/dist/{doctor-Bqo6FwUa.js → doctor-rOr-4ZfS.js} +2 -2
- package/dist/drizzle/index.d.ts +4 -3
- package/dist/drizzle/index.js +3 -3
- package/dist/elysia/index.d.ts +6 -28
- package/dist/elysia/index.js +16 -60
- package/dist/{errors-DSMnAVNa.js → errors-CWfoNg9N.js} +8 -4
- package/dist/{errors-Iy71s7Oj.js → errors-Cz5zn0mW.js} +17 -71
- package/dist/{errors-DbZ1YOnb.d.ts → errors-DAqevpNk.d.ts} +8 -21
- package/dist/{errors-m3u9TmDu.js → errors-DRnGZHzF.js} +4 -1
- package/dist/evaluation-items-CfCCejQd.js +40 -0
- package/dist/{evaluations-DsAU9ppl.js → evaluations-tz6D9A2G.js} +28 -46
- package/dist/eve/index.d.ts +6 -15
- package/dist/eve/index.js +7 -12
- package/dist/expiry-BoBJ8Tvc.js +7 -0
- package/dist/express/index.d.ts +6 -29
- package/dist/express/index.js +28 -58
- package/dist/fastify/index.d.ts +6 -29
- package/dist/fastify/index.js +16 -65
- package/dist/fields-BMl1RxoX.js +26 -0
- package/dist/{files-B_wAGYmt.js → files-DWUN9PzI.js} +5 -1
- package/dist/{fixtures-Cvaw0gDG.js → fixtures-ht28Cplr.js} +5 -2
- package/dist/{freeze-y1_jQL4v.js → freeze-CrU8nQeX.js} +31 -2
- package/dist/{from-snapshot-BMGnhmgv.js → from-snapshot-C3sHpZNS.js} +65 -48
- package/dist/{grantee-Bv04_Vzf.js → grantee-Cv5Sogfv.js} +88 -7
- package/dist/graph-sql-B-dsAT6j.d.ts +29 -0
- package/dist/{headers-B5RRv3Xm.js → headers-BZSDieNT.js} +1 -1
- package/dist/{headers-C8SHQccD.d.ts → headers-Cf-zWvsO.d.ts} +1 -1
- package/dist/helpers-H_KARDVC.js +421 -0
- package/dist/hono/index.d.ts +6 -28
- package/dist/hono/index.js +11 -43
- package/dist/{hosted-BwKQ1BTA.js → hosted-DJQw46hn.js} +6 -5
- package/dist/{http-GgVApX1k.js → http-BIhmLfCc.js} +4 -20
- package/dist/http-SO7qGttf.js +44 -0
- package/dist/ids-DC4V4CFu.js +18 -0
- package/dist/{index-LF_hS-yn.d.ts → index-A0YNL8jZ.d.ts} +1 -1
- package/dist/index-CtE07CBF.d.ts +6 -0
- package/dist/{index-xIxJLwOQ.d.ts → index-D3vbkoSI.d.ts} +75 -7
- package/dist/{index-CltcQ4Bf.d.ts → index-D6_cSa1z.d.ts} +68 -5
- package/dist/index.d.ts +14 -9
- package/dist/index.js +22 -17
- package/dist/instance-options-BK_rNOSC.d.ts +11 -0
- package/dist/instance-options-Dhhcnm3y.js +22 -0
- package/dist/{parse-DPfIvFMU.js → json-schema-BsAflUGW.js} +28 -57
- package/dist/jwt/index.d.ts +10 -6
- package/dist/jwt/index.js +32 -13
- package/dist/kernel-GSQnMz3O.js +208 -0
- package/dist/kysely/index.d.ts +4 -3
- package/dist/kysely/index.js +3 -3
- package/dist/live-options-H2eG8dfJ.js +60 -0
- package/dist/{load-BZ24CpZP.js → load-DhWEB9P1.js} +16 -10
- package/dist/load-DwJUafYN.js +2 -0
- package/dist/manifest-iaoBXHKc.js +783 -0
- package/dist/manifest-uDS9y5de.d.ts +206 -0
- package/dist/{map-DowSO96j.js → map-AcxK9o_D.js} +4 -15
- package/dist/{map-claims-B_6I1Rn-.js → map-claims-Z4QZOiFF.js} +13 -4
- package/dist/map-error-pgUWNNtG.js +23 -0
- package/dist/may-use-DndQ5tQ-.js +77 -0
- package/dist/mcp/index.d.ts +54 -22
- package/dist/mcp/index.js +218 -178
- package/dist/nest/index.d.ts +26 -31
- package/dist/nest/index.js +75 -84
- package/dist/next/client.d.ts +7 -8
- package/dist/next/client.js +11 -9
- package/dist/next/index.d.ts +30 -47
- package/dist/next/index.js +45 -60
- package/dist/next/plugin.d.ts +1 -1
- package/dist/next/plugin.js +32 -1
- package/dist/node/index.d.ts +9 -28
- package/dist/node/index.js +11 -43
- package/dist/openai/index.d.ts +6 -15
- package/dist/openai/index.js +7 -20
- package/dist/openapi/index.d.ts +87 -4
- package/dist/openapi/index.js +3 -3
- package/dist/{openapi-CwePaF7C.js → openapi-Bbg4wGVL.js} +3 -3
- package/dist/{openapi-DcqM8nU7.js → openapi-BqRBvAng.js} +237 -5
- package/dist/{openapi-DWD0Uc_4.js → openapi-CqqEbHsL.js} +5 -5
- package/dist/{openapi-import-BWRUNNeW.js → openapi-import-cmwetbzw.js} +1 -1
- package/dist/{openapi-schema-D8j_T9tO.js → openapi-schema--ARjyfQr.js} +2 -2
- package/dist/orpc/index.d.ts +15 -28
- package/dist/orpc/index.js +74 -117
- package/dist/otel/index.d.ts +2 -2
- package/dist/parse-BuyjxhZV.js +53 -0
- package/dist/parse-local-manifest-BkGQNzAh.d.ts +10 -0
- package/dist/parse-local-manifest-BrMozJCo.js +36 -0
- package/dist/pdp/index.d.ts +2 -2
- package/dist/pdp/index.js +14 -127
- package/dist/{permdock-yoZ7EjxX.js → permdock-CzqXjCpU.js} +641 -126
- package/dist/{permissions-B8vCg_bI.d.ts → permissions-CDgvKG5L.d.ts} +2 -2
- package/dist/{permissions-CofRqesP.js → permissions-CpZrivYv.js} +3 -3
- package/dist/{permissions-DC7GROPA.js → permissions-DVoF6dMt.js} +77 -15
- package/dist/{permissions-B4apnahQ.d.ts → permissions-DttnqqxC.d.ts} +34 -5
- package/dist/{pins-CqE1jZuF.js → pins-8ILTftC9.js} +2 -2
- package/dist/{policy-CInmNGkM.d.ts → policy-CFZAr_Al.d.ts} +330 -37
- package/dist/{policy-Cq2fB8Q5.d.ts → policy-D8UFyERw.d.ts} +2 -2
- package/dist/{policy-ANp36PnI.js → policy-xyWg7QdR.js} +173 -22
- package/dist/powersync-A8x_Yyvh.js +2 -0
- package/dist/powersync-C7kLglqX.js +540 -0
- package/dist/powersync-yW1UUFzp.js +62 -0
- package/dist/prisma/index.d.ts +3 -2
- package/dist/prisma/index.js +45 -20
- package/dist/{problem-Cgp9-KZA.js → problem-B43ztKIm.js} +74 -109
- package/dist/problem-details-CkL50EEf.d.ts +7 -0
- package/dist/problem-details-_AMOYz-w.js +144 -0
- package/dist/{protected-BuPAycJT.d.ts → protected-CNsMzrVd.d.ts} +5 -4
- package/dist/protected-Cs6kTaHo.js +100 -0
- package/dist/protected-bZs6rbT1.d.ts +40 -0
- package/dist/{provider-wTAUda2v.d.ts → provider-Cjr62YMV.d.ts} +1 -1
- package/dist/provider-DLzpb2Xz.js +52 -0
- package/dist/provider-store-DNyC1y48.js +43 -0
- package/dist/react/index.d.ts +7 -5
- package/dist/react/index.js +5 -4
- package/dist/react/provider-client.d.ts +1 -1
- package/dist/react/provider-client.js +1 -1
- package/dist/react-native/index.d.ts +166 -10
- package/dist/react-native/index.js +607 -85
- package/dist/{refs-ChLSxbST.js → refs-KYb4ntaz.js} +4 -3
- package/dist/{relations-r4soIFZB.js → relations-cjOL01hZ.js} +110 -31
- package/dist/replay-BsOyTrdV.js +28 -0
- package/dist/replay-sqBGMnNs.d.ts +5 -0
- package/dist/resource-ref-CaS9yVPi.js +20 -0
- package/dist/revocations-Bhr0aMIC.js +27 -0
- package/dist/rls-BMNydpHk.js +2521 -0
- package/dist/{rls-BOFU3chG.js → rls-CEvs64Kj.js} +8 -3
- package/dist/rls-fields-BMasREhR.js +3502 -0
- package/dist/{rls-graph-DxQ39PJj.js → rls-graph-pc9fuXYm.js} +100 -36
- package/dist/{rls-import-CXV6LBlS.js → rls-import-D8F7j35Q.js} +7 -6
- package/dist/{rls-migrate-DrFPbf8p.js → rls-migrate-7wikfrVI.js} +6 -5
- package/dist/rls-ownership-B5Lkq62W.js +843 -0
- package/dist/rls-shared-aOQ4hGTO.js +493 -0
- package/dist/rls-verify-D8B7dOTh.js +745 -0
- package/dist/{row-check-BajTgQZ-.d.ts → row-check-Dt35czLy.d.ts} +12 -15
- package/dist/rpc-DOK54_CS.js +89 -0
- package/dist/{run-CJ6UvS3a.js → run-YXCJDNYk.js} +31 -12
- package/dist/runtime-CB8gQFvS.js +11 -0
- package/dist/{saas-BRrZzJkM.js → saas-Bj_FFkjN.js} +17 -7
- package/dist/{schema-P8yoma__.js → schema-D3MnDMxa.js} +8 -4
- package/dist/scim/index.d.ts +1 -1
- package/dist/scim/index.js +1 -1
- package/dist/{scim-9NFa0XVZ.js → scim-BFGBBAqR.js} +1 -1
- package/dist/{scopes-cKVp_WTw.js → scopes-CVdPrWN-.js} +35 -8
- package/dist/server/index.d.ts +22 -11
- package/dist/server/index.js +11 -8
- package/dist/{credentials-BgRX3WEg.js → server-DlZ28Oz5.js} +1 -1
- package/dist/shared-DRu8VFVM.js +123 -0
- package/dist/{sink-Cfr9-7YC.d.ts → sink-Gs6TTVa-.d.ts} +1 -1
- package/dist/skills-Biq5uup3.js +192 -0
- package/dist/{skills-C_lpV4Jx.js → skills-JaymNCdK.js} +10 -4
- package/dist/{snapshot-DE8dE_hz.js → snapshot-Enxd0n-s.js} +138 -214
- package/dist/snapshot-cache-D6jLelln.js +44 -0
- package/dist/snapshot-cache-DwQH8ufx.d.ts +45 -0
- package/dist/solid/index.d.ts +39 -9
- package/dist/solid/index.js +76 -85
- package/dist/sources-B0UvrJ21.js +534 -0
- package/dist/sources-BcJgw0lt.d.ts +192 -0
- package/dist/{sql-Bll1d7y0.js → sql-xdg5f4Fi.js} +6 -1
- package/dist/{src-CTNT-PBW.js → src-CSbUiozF.js} +149 -11
- package/dist/ssf/index.d.ts +3 -2
- package/dist/ssf/index.js +3 -29
- package/dist/store-DMAWwAJV.js +371 -0
- package/dist/{store-Bq90395i.d.ts → store-D_pjn91-.d.ts} +13 -4
- package/dist/store-options-yO0V6gRn.js +716 -0
- package/dist/{stores-CkG2HrSg.js → stores-4_sqiOA1.js} +10 -63
- package/dist/{stores-CvOnu_2T.d.ts → stores-DVR5NHLE.d.ts} +20 -9
- package/dist/{stream-Q_xlB6Ko.js → stream-DDpvynSB.js} +16 -2
- package/dist/{stream-BhMfZOwr.d.ts → stream-DlvG2hs-.d.ts} +2 -2
- package/dist/subject-settings-BwBmCdTR.js +128 -0
- package/dist/supabase/index.d.ts +122 -6
- package/dist/supabase/index.js +4 -3
- package/dist/supabase/middleware.d.ts +32 -27
- package/dist/supabase/middleware.js +56 -22
- package/dist/{supabase-D8UlBA7Z.js → supabase-CwafwxxF.js} +3 -3
- package/dist/{supabase-DTxGtYdi.js → supabase-DTBaC20O.js} +345 -367
- package/dist/supabase-config-Bs44dare.js +472 -0
- package/dist/{supabase-hook-D_OqGb_V.js → supabase-hook-BuxLQLpU.js} +994 -708
- package/dist/supabase-hook-D5qVd_D8.js +2 -0
- package/dist/supautils-DYZnzRWV.js +91 -0
- package/dist/svelte/PermissionBoundary.svelte +37 -0
- package/dist/svelte/Protected.svelte +8 -2
- package/dist/svelte/index.d.ts +9 -6
- package/dist/svelte/index.js +61 -7
- package/dist/svelte/runtime.d.ts +4 -3
- package/dist/svelte/runtime.js +4 -3
- package/dist/svelte/source.d.ts +9 -6
- package/dist/svelte/source.js +7 -4
- package/dist/terminal/index.d.ts +6 -14
- package/dist/terminal/index.js +44 -32
- package/dist/testing/index.d.ts +105 -16
- package/dist/testing/index.js +504 -40
- package/dist/testing/saas/index.d.ts +4 -4
- package/dist/testing/saas/index.js +2 -2
- package/dist/testing/saas/permissions.d.ts +1 -1
- package/dist/testing/saas/permissions.js +1 -1
- package/dist/token-CIWxJOCh.js +50 -0
- package/dist/trpc/index.d.ts +7 -26
- package/dist/trpc/index.js +17 -100
- package/dist/types-9AWO9EGt.d.ts +197 -0
- package/dist/{types-D6Z6-rKJ.d.ts → types-BPxgszlT.d.ts} +260 -22
- package/dist/{types-BvBk1wgn.d.ts → types-BVyImy5I.d.ts} +5 -3
- package/dist/{types-CxquUByI.d.ts → types-Bvc4oWT6.d.ts} +1 -1
- package/dist/types-C3s9xVJG.d.ts +48 -0
- package/dist/{types-BBK-exvJ.d.ts → types-Dnemwd77.d.ts} +7 -1
- package/dist/types-kxznc7cn.d.ts +52 -0
- package/dist/{types-B8w5PFtS.d.ts → types-vKyAMtcX.d.ts} +17 -1
- package/dist/{types-B9dmiiab.d.ts → types-vNSDF7Dq.d.ts} +1 -1
- package/dist/{sources-DOpW5Ila.d.ts → types-yF5LmQVD.d.ts} +86 -127
- package/dist/unplugin/index.d.ts +1 -1
- package/dist/unplugin/index.js +10 -9
- package/dist/{usage-1ozMubLY.js → usage-D07N9QJ3.js} +2 -2
- package/dist/usage-D82l1CwK.js +2 -0
- package/dist/{usage-CUnK6Ou9.js → usage-DG1oeCca.js} +225 -62
- package/dist/validation-error-CnjZ4t92.js +33 -0
- package/dist/validation-error-CtF23SrC.d.ts +26 -0
- package/dist/{validity-D0uRmJKJ.js → validity-uOp8UpYn.js} +57 -36
- package/dist/{verifier-B90agnhl.js → verifier-BxBo6I44.js} +10 -5
- package/dist/version-BvacVTZR.js +17 -0
- package/dist/views-Soe7bGSC.js +95 -0
- package/dist/{vocabulary-Dk0fs-Jk.d.ts → vocabulary-DA8a8zif.d.ts} +1 -1
- package/dist/vue/index.d.ts +35 -13
- package/dist/vue/index.js +86 -93
- package/dist/watch-Etoa_Mvr.js +2 -0
- package/dist/watch-UihESpsJ.js +128 -0
- package/dist/webmcp/index.d.ts +2 -2
- package/dist/webmcp/index.js +7 -13
- package/package.json +62 -36
- package/schemas/approval-request-v1.json +175 -0
- package/schemas/catalog-v1.json +29 -1
- package/schemas/supabase-claims-v1.json +6 -1
- package/schemas/supabase-manifest-v1.json +150 -6
- package/skills/permdock/SKILL.md +7 -7
- package/skills/permdock-agents/SKILL.md +5 -5
- package/skills/permdock-agents/references/runtimes.md +12 -10
- package/skills/permdock-approvals/SKILL.md +4 -4
- package/skills/permdock-approvals/references/stores-and-resume.md +15 -4
- package/skills/permdock-audit/SKILL.md +3 -3
- package/skills/permdock-credentials/SKILL.md +4 -4
- package/skills/permdock-credentials/references/tokens-keys-links.md +7 -2
- package/skills/permdock-data/SKILL.md +4 -4
- package/skills/permdock-data/references/queries-and-rls.md +14 -6
- package/skills/permdock-data/references/relationships.md +5 -3
- package/skills/permdock-tenancy/SKILL.md +9 -6
- package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +14 -8
- package/skills/permdock-wire/SKILL.md +4 -4
- package/skills/permdock-wire/references/adapters.md +42 -30
- package/skills/permdock-wire/references/policy-options.md +5 -3
- package/dist/approvers-aH0PJkmf.js +0 -20
- package/dist/catalog-idsHc0vo.js +0 -2
- package/dist/collect-B7_TIfmg.js +0 -49
- package/dist/collect-fRPAQIWb.js +0 -2
- package/dist/compile-CQbvyIBr.d.ts +0 -30
- package/dist/config-BPYmjTOp.js +0 -26
- package/dist/context-gtAwAILx.js +0 -6
- package/dist/create-BKF3dgFk.d.ts +0 -162
- package/dist/create-CSkhDU9T.js +0 -222
- package/dist/doctor-BGle8Gqi.js +0 -1314
- package/dist/helpers-DnSOrhB9.js +0 -682
- package/dist/index-fG6NSXlc.d.ts +0 -9
- package/dist/kernel-YOGCWNLf.js +0 -211
- package/dist/load-QOOm1z70.js +0 -2
- package/dist/manifest-DDQbC6K0.d.ts +0 -118
- package/dist/map-error-RJ3ZsUyA.js +0 -16
- package/dist/may-use-CnFEjVEp.js +0 -37
- package/dist/pg-4GJWDUxG.js +0 -953
- package/dist/plugin-4gr7IxFJ.js +0 -65
- package/dist/protected-B4K3BKoX.js +0 -138
- package/dist/protected-wY7nXhY9.d.ts +0 -23
- package/dist/provider-_wx46HpB.js +0 -48
- package/dist/rls-CJVja9Ww.js +0 -2119
- package/dist/rls-helpers-BxRuif0l.js +0 -1346
- package/dist/runtime-DP9ttFh1.js +0 -27
- package/dist/skills-Dx3QLnMY.js +0 -110
- package/dist/source-DoBBYJi2.js +0 -6
- package/dist/sources-DVHM3Mwq.js +0 -284
- package/dist/store-C6hFW6ta.js +0 -508
- package/dist/subject-settings-xt7V845g.js +0 -82
- package/dist/supabase-hook-DW-xP4hU.js +0 -2
- package/dist/types-DbWdEfcm.d.ts +0 -87
- package/dist/types-bva3i4Gf.d.ts +0 -98
- package/dist/types-i4BAOvdb.d.ts +0 -97
- package/dist/usage-PyEor6GA.js +0 -2
- package/dist/version-CnSh33Fj.js +0 -16
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { n as
|
|
1
|
+
import { c as subjectView, i as permissionSet, l as tenantView, n as filterResult, o as rolesView, r as livePermDock, t as approvalHandle } from "./views-Soe7bGSC.js";
|
|
2
|
+
import { n as providePermDock, t as getStore } from "./context-Ttp0ekMT.js";
|
|
2
3
|
import { readable, toStore } from "svelte/store";
|
|
3
4
|
//#region src/svelte/stores.ts
|
|
4
5
|
function fromStore(store, compute) {
|
|
@@ -14,9 +15,7 @@ function fromStore(store, compute) {
|
|
|
14
15
|
});
|
|
15
16
|
}
|
|
16
17
|
function sveltePermDock(store) {
|
|
17
|
-
return
|
|
18
|
-
return Reflect.get(store.get(), prop);
|
|
19
|
-
} });
|
|
18
|
+
return livePermDock(() => store.get());
|
|
20
19
|
}
|
|
21
20
|
function setPermDock(options) {
|
|
22
21
|
return sveltePermDock(providePermDock(options));
|
|
@@ -34,49 +33,19 @@ function permissions(references, data) {
|
|
|
34
33
|
return permissionsFor(getStore(), references, data);
|
|
35
34
|
}
|
|
36
35
|
function permissionsFor(store, references, data) {
|
|
37
|
-
return fromStore(store, () =>
|
|
38
|
-
const granted = [];
|
|
39
|
-
const byKey = {};
|
|
40
|
-
for (const reference of references()) {
|
|
41
|
-
const next = store.permissionState(reference, data?.());
|
|
42
|
-
byKey[reference.key] = next;
|
|
43
|
-
if (next.allowed) granted.push(reference);
|
|
44
|
-
}
|
|
45
|
-
return new Proxy({
|
|
46
|
-
granted,
|
|
47
|
-
get(reference) {
|
|
48
|
-
return byKey[reference.key];
|
|
49
|
-
}
|
|
50
|
-
}, { get(target, prop, receiver) {
|
|
51
|
-
if (typeof prop === "string" && Object.hasOwn(byKey, prop)) return byKey[prop];
|
|
52
|
-
return Reflect.get(target, prop, receiver);
|
|
53
|
-
} });
|
|
54
|
-
});
|
|
36
|
+
return fromStore(store, () => permissionSet(store, references(), data?.()));
|
|
55
37
|
}
|
|
56
38
|
function filtered(reference, rows) {
|
|
57
39
|
return filteredFor(getStore(), reference, rows);
|
|
58
40
|
}
|
|
59
41
|
function filteredFor(store, reference, rows) {
|
|
60
|
-
return fromStore(store, () =>
|
|
61
|
-
const permdock = store.get();
|
|
62
|
-
const next = permdock.filter(reference, rows());
|
|
63
|
-
next.partial = permdock.where(reference).partial;
|
|
64
|
-
return next;
|
|
65
|
-
});
|
|
42
|
+
return fromStore(store, () => filterResult(store.get(), reference, rows()));
|
|
66
43
|
}
|
|
67
44
|
function tenant() {
|
|
68
45
|
return tenantFor(getStore());
|
|
69
46
|
}
|
|
70
47
|
function tenantFor(store) {
|
|
71
|
-
return fromStore(store, () =>
|
|
72
|
-
const permdock = store.get();
|
|
73
|
-
return {
|
|
74
|
-
tenant: permdock.subject.principal?.tenant ?? null,
|
|
75
|
-
tenants: permdock.tenants(),
|
|
76
|
-
switchTo: (id) => permdock.refresh({ tenant: id }),
|
|
77
|
-
status: permdock.status()
|
|
78
|
-
};
|
|
79
|
-
});
|
|
48
|
+
return fromStore(store, () => tenantView(store.get()));
|
|
80
49
|
}
|
|
81
50
|
function memberships() {
|
|
82
51
|
return membershipsFor(getStore());
|
|
@@ -88,11 +57,7 @@ function roles(options = () => ({})) {
|
|
|
88
57
|
return rolesFor(getStore(), options);
|
|
89
58
|
}
|
|
90
59
|
function rolesFor(store, options = () => ({})) {
|
|
91
|
-
return fromStore(store, () =>
|
|
92
|
-
const next = options();
|
|
93
|
-
const permdock = store.get();
|
|
94
|
-
return { roles: (next.team === void 0 ? permdock : permdock.team(next.team)).heldRoles(next.tenant === void 0 ? void 0 : { tenant: next.tenant }) };
|
|
95
|
-
});
|
|
60
|
+
return fromStore(store, () => rolesView(store.get(), options()));
|
|
96
61
|
}
|
|
97
62
|
function assignable() {
|
|
98
63
|
return assignableFor(getStore());
|
|
@@ -104,37 +69,19 @@ function assignablePermissions(options = {}) {
|
|
|
104
69
|
return assignablePermissionsFor(getStore(), options);
|
|
105
70
|
}
|
|
106
71
|
function assignablePermissionsFor(store, options = {}) {
|
|
107
|
-
return fromStore(store, () => store.get().assignablePermissions(options));
|
|
72
|
+
return fromStore(store, () => store.get().assignablePermissions(typeof options === "function" ? options() : options));
|
|
108
73
|
}
|
|
109
74
|
function subject() {
|
|
110
75
|
return subjectFor(getStore());
|
|
111
76
|
}
|
|
112
77
|
function subjectFor(store) {
|
|
113
|
-
return fromStore(store, () =>
|
|
114
|
-
const permdock = store.get();
|
|
115
|
-
const snapshot = permdock.snapshot();
|
|
116
|
-
const simulated = typeof snapshot === "object" && snapshot !== null && "simulated" in snapshot && snapshot.simulated === true;
|
|
117
|
-
return {
|
|
118
|
-
principal: permdock.subject.principal,
|
|
119
|
-
actor: permdock.subject.actor,
|
|
120
|
-
delegation: permdock.subject.delegation,
|
|
121
|
-
expiresAt: permdock.subject.expiresAt,
|
|
122
|
-
simulated
|
|
123
|
-
};
|
|
124
|
-
});
|
|
78
|
+
return fromStore(store, () => subjectView(store.get()));
|
|
125
79
|
}
|
|
126
80
|
function approval(decision) {
|
|
127
81
|
return approvalFor(getStore(), decision);
|
|
128
82
|
}
|
|
129
83
|
function approvalFor(store, decision) {
|
|
130
|
-
return fromStore(store, () =>
|
|
131
|
-
const next = decision();
|
|
132
|
-
return {
|
|
133
|
-
state: store.approvalState(next),
|
|
134
|
-
token: next.outcome === "approval-required" ? next.token : void 0,
|
|
135
|
-
request: (note) => store.requestApproval(next, note)
|
|
136
|
-
};
|
|
137
|
-
});
|
|
84
|
+
return fromStore(store, () => approvalHandle(store, decision()));
|
|
138
85
|
}
|
|
139
86
|
//#endregion
|
|
140
87
|
export { getPermDock as a, permissions as c, subject as d, tenant as f, filtered as i, roles as l, assignable as n, memberships as o, assignablePermissions as r, permission as s, approval as t, setPermDock as u };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { r as Role } from "./vocabulary-
|
|
4
|
-
import { a as FilterResult, c as
|
|
1
|
+
import { Ft as TokenVerifier, Mr as Membership, Tt as Snapshot, Yn as Decision } from "./policy-CFZAr_Al.js";
|
|
2
|
+
import { f as Permission } from "./permissions-DttnqqxC.js";
|
|
3
|
+
import { r as Role } from "./vocabulary-DA8a8zif.js";
|
|
4
|
+
import { a as FilterResult, c as SubjectView, l as TenantView, o as PermissionSet, r as ClientPermDock, s as PermissionState, t as ApprovalHandle, u as UseRolesOptions } from "./types-kxznc7cn.js";
|
|
5
5
|
import { Readable } from "svelte/store";
|
|
6
6
|
//#region src/svelte/types.d.ts
|
|
7
7
|
type PermDockSvelteOptions = {
|
|
@@ -11,11 +11,19 @@ type PermDockSvelteOptions = {
|
|
|
11
11
|
* settles (render the same promise with `{#await}`).
|
|
12
12
|
*/
|
|
13
13
|
readonly snapshot: Snapshot | string | (() => Snapshot | string) | Readable<Snapshot | string> | PromiseLike<Snapshot | string>;
|
|
14
|
-
|
|
14
|
+
/**
|
|
15
|
+
* The AuthZEN evaluations endpoint for checks the snapshot cannot answer.
|
|
16
|
+
* `false` never calls one: such a check is denied with reason `server-only`.
|
|
17
|
+
*/
|
|
18
|
+
readonly endpoint?: string | false;
|
|
19
|
+
/** Where `refresh()` fetches a fresh snapshot. Defaults to `endpoint`. */
|
|
20
|
+
readonly snapshotUrl?: string;
|
|
15
21
|
readonly approvals?: string;
|
|
16
|
-
|
|
22
|
+
/** A getter (`() => page.params.org`) switches the active tenant (`refresh({ tenant })`) when it changes. */
|
|
23
|
+
readonly tenant?: string | (() => string | undefined);
|
|
17
24
|
readonly fetch?: typeof fetch;
|
|
18
|
-
|
|
25
|
+
/** A getter is read on every request, so a rotated token applies without a new store. */
|
|
26
|
+
readonly headers?: Readonly<Record<string, string>> | (() => Readonly<Record<string, string>> | undefined);
|
|
19
27
|
readonly maxAge?: number;
|
|
20
28
|
readonly verifier?: TokenVerifier;
|
|
21
29
|
};
|
|
@@ -32,9 +40,12 @@ declare function roles(options?: () => UseRolesOptions): Readable<{
|
|
|
32
40
|
readonly roles: readonly Role[];
|
|
33
41
|
}>;
|
|
34
42
|
declare function assignable(): Readable<readonly Role[]>;
|
|
35
|
-
|
|
43
|
+
type AssignableOptions = {
|
|
44
|
+
readonly tenant?: string;
|
|
45
|
+
} | (() => {
|
|
36
46
|
readonly tenant?: string;
|
|
37
|
-
})
|
|
47
|
+
});
|
|
48
|
+
declare function assignablePermissions(options?: AssignableOptions): Readable<readonly Permission[]>;
|
|
38
49
|
declare function subject(): Readable<SubjectView>;
|
|
39
50
|
declare function approval(decision: () => Decision): Readable<ApprovalHandle>;
|
|
40
51
|
//#endregion
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { r as PermDockRevokedError } from "./errors-
|
|
1
|
+
import { r as PermDockRevokedError } from "./errors-Cz5zn0mW.js";
|
|
2
2
|
//#region src/server/stream.ts
|
|
3
3
|
function isAsyncIterable(value) {
|
|
4
4
|
return value !== null && typeof value === "object" && typeof value[Symbol.asyncIterator] === "function";
|
|
@@ -33,6 +33,20 @@ async function* guardIterable(source, connection, options) {
|
|
|
33
33
|
if (closing !== void 0) Promise.resolve(closing).catch(() => void 0);
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* The connection loader for a stream `protect` already admitted: the first
|
|
38
|
+
* read returns the row `protect` loaded, and each revalidation reloads it.
|
|
39
|
+
*/
|
|
40
|
+
function reloadAfter(loaded, load) {
|
|
41
|
+
let first = true;
|
|
42
|
+
return () => {
|
|
43
|
+
if (first) {
|
|
44
|
+
first = false;
|
|
45
|
+
return loaded;
|
|
46
|
+
}
|
|
47
|
+
return load();
|
|
48
|
+
};
|
|
49
|
+
}
|
|
36
50
|
/** WebSocket close code for a policy violation (RFC 6455 section 7.4.1). */
|
|
37
51
|
const POLICY_VIOLATION = 1008;
|
|
38
52
|
/** The Problem Details for an aborted connection signal. */
|
|
@@ -49,4 +63,4 @@ function onRevoked(connection, end) {
|
|
|
49
63
|
else connection.signal.addEventListener("abort", fire, { once: true });
|
|
50
64
|
}
|
|
51
65
|
//#endregion
|
|
52
|
-
export { onRevoked as i, guardIterable as n, isAsyncIterable as r, POLICY_VIOLATION as t };
|
|
66
|
+
export { reloadAfter as a, onRevoked as i, guardIterable as n, isAsyncIterable as r, POLICY_VIOLATION as t };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { f as Permission } from "./permissions-DttnqqxC.js";
|
|
2
|
+
import { i as ProtectOptions } from "./create-BWyx3jua.js";
|
|
3
3
|
//#region src/server/stream.d.ts
|
|
4
4
|
type StreamProtectOptions = ProtectOptions & {
|
|
5
5
|
/**
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
//#region src/conditions/row-check.ts
|
|
2
|
+
const MISSING = Object.freeze({ found: false });
|
|
3
|
+
const GRANTED = Object.freeze({
|
|
4
|
+
found: true,
|
|
5
|
+
granted: true
|
|
6
|
+
});
|
|
7
|
+
const DENIED = Object.freeze({
|
|
8
|
+
found: true,
|
|
9
|
+
granted: false
|
|
10
|
+
});
|
|
11
|
+
function rowCheckOf(found, granted) {
|
|
12
|
+
return found ? granted ? GRANTED : DENIED : MISSING;
|
|
13
|
+
}
|
|
14
|
+
/** Reads `select <filter> as granted ... where <key> limit 2`; only a boolean `true` or `1` grants. */
|
|
15
|
+
function rowCheckFrom(rows) {
|
|
16
|
+
if (rows.length > 1) throw new Error("PermDock: checkRow key matches more than one row");
|
|
17
|
+
const [row] = rows;
|
|
18
|
+
return rowCheckOf(row !== void 0, row?.granted === true || row?.granted === 1);
|
|
19
|
+
}
|
|
20
|
+
//#endregion
|
|
21
|
+
//#region src/conditions/subject-settings.ts
|
|
22
|
+
const NAME = /^[a-z_][a-z0-9_]*$/u;
|
|
23
|
+
function settingName(name, what) {
|
|
24
|
+
if (!NAME.test(name)) throw new Error(`PermDock: unsafe ${what} '${name}'`);
|
|
25
|
+
return name;
|
|
26
|
+
}
|
|
27
|
+
function isRecord(value) {
|
|
28
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
29
|
+
}
|
|
30
|
+
function strings(value) {
|
|
31
|
+
return Array.isArray(value) ? value.filter((item) => typeof item === "string") : [];
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* The credential a principal acts through. Entries limited to `ids` are left
|
|
35
|
+
* out of `scopes`: the claim has no per-row form, so the database allows less.
|
|
36
|
+
*/
|
|
37
|
+
function heldCredential(principal) {
|
|
38
|
+
const credential = Reflect.get(principal, "credential");
|
|
39
|
+
if (!isRecord(credential) || typeof credential["id"] !== "string" || credential["kind"] !== "user" && credential["kind"] !== "service" || !Array.isArray(credential["permissions"])) return;
|
|
40
|
+
const scopes = credential["permissions"].flatMap((entry) => isRecord(entry) && typeof entry["permission"] === "string" && entry["ids"] === void 0 ? [entry["permission"]] : []);
|
|
41
|
+
const tenant = credential["tenant"];
|
|
42
|
+
return {
|
|
43
|
+
id: credential["id"],
|
|
44
|
+
kind: credential["kind"],
|
|
45
|
+
tenant: typeof tenant === "string" && tenant !== "" ? tenant : void 0,
|
|
46
|
+
roles: strings(credential["roles"]),
|
|
47
|
+
scopes
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function field(name, fallback) {
|
|
51
|
+
return settingName(name ?? fallback, "API-key claim field");
|
|
52
|
+
}
|
|
53
|
+
function apiKeyClaim(held, options = {}) {
|
|
54
|
+
const claim = {
|
|
55
|
+
id: held.id,
|
|
56
|
+
[field(options.scopes, "scopes")]: held.scopes
|
|
57
|
+
};
|
|
58
|
+
if (held.tenant !== void 0) claim[field(options.tenant, "tenant")] = held.tenant;
|
|
59
|
+
if (held.kind === "service") claim[field(options.roles, "roles")] = held.roles;
|
|
60
|
+
return [field(options.claim, "api_key"), claim];
|
|
61
|
+
}
|
|
62
|
+
function setConfigs(settings) {
|
|
63
|
+
if (settings.length === 0) return [];
|
|
64
|
+
const parts = [];
|
|
65
|
+
let open = "select ";
|
|
66
|
+
for (const [name] of settings) {
|
|
67
|
+
parts.push(`${open}set_config('${name}', `);
|
|
68
|
+
open = ", true), ";
|
|
69
|
+
}
|
|
70
|
+
parts.push(", true)");
|
|
71
|
+
return [{
|
|
72
|
+
strings: parts,
|
|
73
|
+
values: settings.map(([, value]) => value)
|
|
74
|
+
}];
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* The transaction preamble that makes Postgres see `permdock.subject`: one `select set_config(…)`
|
|
78
|
+
* that sets the role, then the claims the generated policies read. Runs inside the caller's
|
|
79
|
+
* transaction, so every setting is local to it.
|
|
80
|
+
*/
|
|
81
|
+
function subjectStatements(permdock, options = {}) {
|
|
82
|
+
const principal = permdock.subject.principal;
|
|
83
|
+
const role = options.role ?? (principal === null ? "anon" : "authenticated");
|
|
84
|
+
if (role !== false && role !== "authenticated" && role !== "anon") throw new Error(`PermDock: withSubject sets role authenticated or anon, not '${String(role)}'`);
|
|
85
|
+
const tenantClaim = settingName(options.tenantClaim ?? "tenant_id", "tenant claim");
|
|
86
|
+
const claims = Object.fromEntries(Object.entries(options.claims ?? {}).filter(([name]) => name !== "sub" && name !== "role" && name !== tenantClaim));
|
|
87
|
+
if (principal !== null) {
|
|
88
|
+
const held = heldCredential(principal);
|
|
89
|
+
claims["sub"] = held?.kind === "service" ? "" : principal.id;
|
|
90
|
+
if (principal.tenant !== void 0) claims[tenantClaim] = principal.tenant;
|
|
91
|
+
if (held !== void 0) {
|
|
92
|
+
const [name, value] = apiKeyClaim(held, options.apiKeys);
|
|
93
|
+
claims[name] = value;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (role !== false) claims["role"] = role;
|
|
97
|
+
const subjectId = typeof claims["sub"] === "string" ? claims["sub"] : "";
|
|
98
|
+
const settings = role === false ? [] : [["role", role]];
|
|
99
|
+
const dialect = options.dialect ?? "supabase";
|
|
100
|
+
switch (dialect) {
|
|
101
|
+
case "supabase":
|
|
102
|
+
case "neon":
|
|
103
|
+
settings.push(["request.jwt.claims", JSON.stringify(claims)]);
|
|
104
|
+
return setConfigs(settings);
|
|
105
|
+
case "guc": {
|
|
106
|
+
const prefix = settingName(options.gucPrefix ?? "app", "setting prefix");
|
|
107
|
+
settings.push([`${prefix}.user_id`, subjectId]);
|
|
108
|
+
for (const [name, value] of Object.entries(claims)) {
|
|
109
|
+
if (name === "sub") continue;
|
|
110
|
+
settings.push([`${prefix}.${settingName(name, "claim name")}`, typeof value === "string" ? value : JSON.stringify(value)]);
|
|
111
|
+
}
|
|
112
|
+
return setConfigs(settings);
|
|
113
|
+
}
|
|
114
|
+
default: return dialect;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/** A statement as text with `$1`, `$2` placeholders, for raw executors. */
|
|
118
|
+
function statementText(statement) {
|
|
119
|
+
let text = "";
|
|
120
|
+
for (const [index, part] of statement.strings.entries()) text = index === 0 ? part : `${text}$${String(index)}${part}`;
|
|
121
|
+
return text;
|
|
122
|
+
}
|
|
123
|
+
/** A statement as a template-strings array, for `sql` tags. */
|
|
124
|
+
function statementTemplate(statement) {
|
|
125
|
+
return Object.assign([...statement.strings], { raw: [...statement.strings] });
|
|
126
|
+
}
|
|
127
|
+
//#endregion
|
|
128
|
+
export { rowCheckOf as a, rowCheckFrom as i, statementText as n, subjectStatements as r, statementTemplate as t };
|
package/dist/supabase/index.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { C as
|
|
1
|
+
import { C as Policy, Dr as CustomRole, Mr as Membership, Pr as Subject, gt as MembershipSource, mt as MemberEntry, xt as RoleSource } from "../policy-CFZAr_Al.js";
|
|
2
|
+
import { c as ApprovalRequest, f as ApprovalStore } from "../types-vKyAMtcX.js";
|
|
3
|
+
import { C as SupabaseClaimsSchema, E as supabaseClaims, S as SupabaseClaimsOptions, T as SupabasePermDockClaims, _ as SupabaseSuspendedMembership, a as SupabaseActorResult, b as SupabaseActClaim, c as SupabaseMembershipTable, d as SupabaseRealtime, f as SupabaseRlsConfig, g as SupabaseSubjectOptions, h as SupabaseStorage, i as SupabaseActor, l as SupabasePermissionRef, m as SupabaseSessionLike, n as RoleThrough, o as SupabaseDelegation, p as SupabaseRlsOptions, r as SupabaseActiveRow, s as SupabaseInclude, t as AuthorizeSqlOptions, u as SupabasePrincipal, v as SupabaseSuspendedScope, w as SupabaseMembershipClaim, x as SupabaseClaims, y as SupabaseSuspension } from "../types-yF5LmQVD.js";
|
|
4
|
+
import { a as SupabaseManifestHelper, c as SupabaseManifestRls, d as SupabaseManifestValue, f as parseSupabaseManifest, i as SupabaseManifestColumn, l as SupabaseManifestRole, n as SupabaseHookManifest, o as SupabaseManifestMembership, r as SupabaseManifestActiveRow, s as SupabaseManifestRequires, t as SupabaseHookClaim, u as SupabaseManifestThrough } from "../manifest-uDS9y5de.js";
|
|
5
|
+
import { a as MembershipTableOptions, c as SupabasePostgres, d as fromSupabasePostgres, f as fromTable, i as MembershipSql, l as authzVersion, n as MembershipHolders, o as SqlMembershipSource, r as MembershipJunctionOptions, s as SqlQuery, t as AUTHZ_VERSION_TABLE, u as fromJunction } from "../sources-BcJgw0lt.js";
|
|
4
6
|
import { n as supabaseTenantClaim, t as supabaseMembershipsBudget } from "../budget-JqcRqyhK.js";
|
|
5
7
|
//#region src/supabase/capability.d.ts
|
|
6
8
|
type ExchangeCapabilityOptions = {
|
|
@@ -28,6 +30,117 @@ type ExchangeCapabilityOptions = {
|
|
|
28
30
|
*/
|
|
29
31
|
export declare function exchangeCapability(subject: Subject, options: ExchangeCapabilityOptions): Promise<string | undefined>;
|
|
30
32
|
//#endregion
|
|
33
|
+
//#region src/supabase/postgrest.d.ts
|
|
34
|
+
/** What a supabase-js `rpc` call resolves to: `data` or an `error` with a message. */
|
|
35
|
+
type SupabaseRpcResult = {
|
|
36
|
+
readonly data: unknown;
|
|
37
|
+
readonly error: {
|
|
38
|
+
readonly message: string;
|
|
39
|
+
} | null;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* The part of a supabase-js client `postgrestSources` calls:
|
|
43
|
+
* `client.schema(name).rpc(fn, args)`. Pass a client that may execute the
|
|
44
|
+
* function, such as a `service_role` client after the grant the docs show.
|
|
45
|
+
*/
|
|
46
|
+
type SupabaseRpcClient = {
|
|
47
|
+
schema(name: string): {
|
|
48
|
+
rpc(fn: string, args: Readonly<Record<string, unknown>>): PromiseLike<SupabaseRpcResult>;
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
type SupabaseRpcCaller = {
|
|
52
|
+
schema(name: never): {
|
|
53
|
+
rpc(fn: never, args: never): PromiseLike<SupabaseRpcResult>;
|
|
54
|
+
};
|
|
55
|
+
};
|
|
56
|
+
type PostgrestSourcesOptions = {
|
|
57
|
+
/** Schema of the functions. Default `permdock`, where the hook generates `subject_for` and `members_of`. */
|
|
58
|
+
readonly schema?: string;
|
|
59
|
+
/** Function name, for a wrapper in an exposed schema. Default `subject_for`. */
|
|
60
|
+
readonly fn?: string;
|
|
61
|
+
readonly membersFn?: string;
|
|
62
|
+
/** The version-only function `memberships.version` calls. Default `authz_version_for`. */
|
|
63
|
+
readonly versionFn?: string;
|
|
64
|
+
/**
|
|
65
|
+
* The policy whose declared roles tell custom roles apart. With it,
|
|
66
|
+
* `customRoles` reads nothing while every role the subject holds is
|
|
67
|
+
* declared, and `memberships.version` reads the whole subject in one call
|
|
68
|
+
* when the token claims a custom role, which the custom roles need anyway.
|
|
69
|
+
*/
|
|
70
|
+
readonly policy?: Policy;
|
|
71
|
+
};
|
|
72
|
+
/** One user as `subject_for(p_user)` returns it. */
|
|
73
|
+
type SubjectRecord = {
|
|
74
|
+
readonly id: string;
|
|
75
|
+
/** `false` for a suspended user, who holds no roles or memberships. */
|
|
76
|
+
readonly active: boolean;
|
|
77
|
+
readonly roles: readonly string[];
|
|
78
|
+
readonly memberships: readonly Membership[];
|
|
79
|
+
readonly customRoles: readonly CustomRole[];
|
|
80
|
+
readonly authzVersion?: number;
|
|
81
|
+
};
|
|
82
|
+
type PostgrestSources = {
|
|
83
|
+
/**
|
|
84
|
+
* Memberships and the authorization version of any principal, and `list`,
|
|
85
|
+
* the live members of one scope instance through `members_of`, for
|
|
86
|
+
* `countHolders` and `whoCan`. Wrap it in `claimsFirst` to read only when
|
|
87
|
+
* the token was truncated.
|
|
88
|
+
*/
|
|
89
|
+
readonly memberships: MembershipSource & {
|
|
90
|
+
list(query: {
|
|
91
|
+
readonly scope: string;
|
|
92
|
+
readonly id: string;
|
|
93
|
+
}): Promise<MemberEntry[]>;
|
|
94
|
+
};
|
|
95
|
+
/** The custom roles `principal` holds, for `createPermDock`'s `customRoles`. */
|
|
96
|
+
customRoles(principal: {
|
|
97
|
+
readonly id: string;
|
|
98
|
+
}): RoleSource;
|
|
99
|
+
/** The subject the hook would mint for `userId`: anonymous when the user is unknown or suspended. */
|
|
100
|
+
subject(userId: string): Promise<Subject>;
|
|
101
|
+
/** The raw record, `undefined` for an unknown user. */
|
|
102
|
+
record(userId: string): Promise<SubjectRecord | undefined>;
|
|
103
|
+
};
|
|
104
|
+
/** Reads `subject_for`'s JSON; anything it cannot read is left out, and a malformed record is no record. */
|
|
105
|
+
export declare function readSubjectRecord(value: unknown): SubjectRecord | undefined;
|
|
106
|
+
/**
|
|
107
|
+
* Membership, custom-role and subject sources over the `subject_for(p_user)`,
|
|
108
|
+
* `authz_version_for(p_user)` and `members_of(p_scope, p_id)` functions
|
|
109
|
+
* `permdock supabase hook generate` writes, for a backend that reaches
|
|
110
|
+
* Postgres only through PostgREST. `memberships.version` reads only the
|
|
111
|
+
* version, so `claimsFirst` with `onStale: 'reread'` reads the full subject
|
|
112
|
+
* only for a stale token; when the version function is missing it falls back
|
|
113
|
+
* to `subject_for`. With `policy`, a token that claims a custom role has its
|
|
114
|
+
* subject read in one `subject_for` call instead, and custom roles are read
|
|
115
|
+
* only for a subject that holds one. Each user and each instance is read once per
|
|
116
|
+
* `postgrestSources` call, so create it per request or per job.
|
|
117
|
+
*/
|
|
118
|
+
export declare function postgrestSources(client: SupabaseRpcCaller, options?: PostgrestSourcesOptions): PostgrestSources;
|
|
119
|
+
//#endregion
|
|
120
|
+
//#region src/supabase/approval-store.d.ts
|
|
121
|
+
type SupabaseApprovalStoreOptions = {
|
|
122
|
+
/** Schema of the generated store functions (`rls.schema`). Default `permdock`. */
|
|
123
|
+
readonly schema?: string;
|
|
124
|
+
/** How long a request stays open when the caller sets no `ttl`, in milliseconds. */
|
|
125
|
+
readonly ttl?: number;
|
|
126
|
+
/**
|
|
127
|
+
* Runs once per stored request, after the call that stored it, with the
|
|
128
|
+
* stored request: notify the approvers, or cancel the requests this one
|
|
129
|
+
* replaces. A repeated ask that finds the request still open does not run
|
|
130
|
+
* it again. A throw fails the open, so the caller does not run the action.
|
|
131
|
+
*/
|
|
132
|
+
readonly onOpen?: (request: ApprovalRequest) => void | Promise<void>;
|
|
133
|
+
};
|
|
134
|
+
/**
|
|
135
|
+
* An `ApprovalStore` over the table and functions `rls.approvals` generates,
|
|
136
|
+
* called through supabase-js (`client.schema(schema).rpc(...)`) with a
|
|
137
|
+
* client that may execute them, such as a `service_role` client. Each method
|
|
138
|
+
* is one atomic statement in the database: a repeated ask keeps the open
|
|
139
|
+
* request, two racing approvers both count towards a quorum, and two racing
|
|
140
|
+
* resumes never both consume an approval.
|
|
141
|
+
*/
|
|
142
|
+
export declare function supabaseApprovalStore(client: SupabaseRpcCaller, options?: SupabaseApprovalStoreOptions): ApprovalStore;
|
|
143
|
+
//#endregion
|
|
31
144
|
//#region src/supabase/rls.d.ts
|
|
32
145
|
export declare function supabaseRls(options?: SupabaseRlsOptions): SupabaseRlsConfig;
|
|
33
146
|
/**
|
|
@@ -55,13 +168,16 @@ export declare function authorizeSql(options?: AuthorizeSqlOptions): string;
|
|
|
55
168
|
* is `{ ok: false }` and must deny.
|
|
56
169
|
*/
|
|
57
170
|
export declare function actorOf(claims: unknown): SupabaseActorResult;
|
|
58
|
-
/**
|
|
171
|
+
/**
|
|
172
|
+
* The OAuth `scope` claim (a space-separated string or a list) as `scopes`,
|
|
173
|
+
* without the OpenID Connect identity scopes; `undefined` when none is left.
|
|
174
|
+
*/
|
|
59
175
|
export declare function delegationOf(claims: unknown): SupabaseDelegation | undefined;
|
|
60
176
|
export declare function subjectFromSupabase(claims: unknown, options?: SupabaseSubjectOptions): Subject<SupabasePrincipal>;
|
|
61
177
|
/**
|
|
62
|
-
* A verified session object (
|
|
178
|
+
* A verified session object (`{ kind, claims }`) in, `Subject` out.
|
|
63
179
|
* Only `kind: 'user'` sessions map; `anon`, `service`, `invalid` and anything else are anonymous.
|
|
64
180
|
*/
|
|
65
181
|
export declare function subjectFromSupabaseSession(session: SupabaseSessionLike | null | undefined, options?: SupabaseSubjectOptions): Subject<SupabasePrincipal>;
|
|
66
182
|
//#endregion
|
|
67
|
-
export { AUTHZ_VERSION_TABLE, type AuthorizeSqlOptions, type ExchangeCapabilityOptions, type MembershipJunctionOptions, type MembershipSql, type MembershipTableOptions, type SqlMembershipSource, type SqlQuery, type SupabaseActClaim, type SupabaseActiveRow, type SupabaseActor, type SupabaseActorResult, type SupabaseClaims, type SupabaseClaimsOptions, type SupabaseClaimsSchema, type SupabaseDelegation, type SupabaseHookClaim, type SupabaseHookManifest, type SupabaseInclude, type SupabaseManifestColumn, type SupabaseManifestHelper, type SupabaseManifestMembership, type SupabaseManifestRls, type SupabaseManifestValue, type SupabaseMembershipClaim, type SupabaseMembershipTable, type SupabasePermDockClaims, type SupabasePrincipal, type SupabaseRlsConfig, type SupabaseRlsOptions, type SupabaseSessionLike, type SupabaseSubjectOptions, type SupabaseSuspension, authzVersion, fromJunction, fromTable, supabaseClaims, supabaseMembershipsBudget, supabaseTenantClaim };
|
|
183
|
+
export { AUTHZ_VERSION_TABLE, type AuthorizeSqlOptions, type ExchangeCapabilityOptions, type MembershipHolders, type MembershipJunctionOptions, type MembershipSql, type MembershipTableOptions, type PostgrestSources, type PostgrestSourcesOptions, type RoleThrough, type SqlMembershipSource, type SqlQuery, type SubjectRecord, type SupabaseActClaim, type SupabaseActiveRow, type SupabaseActor, type SupabaseActorResult, type SupabaseApprovalStoreOptions, type SupabaseClaims, type SupabaseClaimsOptions, type SupabaseClaimsSchema, type SupabaseDelegation, type SupabaseHookClaim, type SupabaseHookManifest, type SupabaseInclude, type SupabaseManifestActiveRow, type SupabaseManifestColumn, type SupabaseManifestHelper, type SupabaseManifestMembership, type SupabaseManifestRequires, type SupabaseManifestRls, type SupabaseManifestRole, type SupabaseManifestThrough, type SupabaseManifestValue, type SupabaseMembershipClaim, type SupabaseMembershipTable, type SupabasePermDockClaims, type SupabasePermissionRef, type SupabasePostgres, type SupabasePrincipal, type SupabaseRealtime, type SupabaseRlsConfig, type SupabaseRlsOptions, type SupabaseRpcCaller, type SupabaseRpcClient, type SupabaseRpcResult, type SupabaseSessionLike, type SupabaseStorage, type SupabaseSubjectOptions, type SupabaseSuspendedMembership, type SupabaseSuspendedScope, type SupabaseSuspension, authzVersion, fromJunction, fromSupabasePostgres, fromTable, parseSupabaseManifest, supabaseClaims, supabaseMembershipsBudget, supabaseTenantClaim };
|
package/dist/supabase/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { a as
|
|
1
|
+
import { a as readSubjectRecord, i as postgrestSources, n as supabaseRls, o as supabaseClaims, r as supabaseApprovalStore, s as exchangeCapability, t as authorizeSql } from "../supabase-DTBaC20O.js";
|
|
2
2
|
import { n as supabaseTenantClaim, t as supabaseMembershipsBudget } from "../budget-NbEtbJC_.js";
|
|
3
|
-
import { a as
|
|
4
|
-
|
|
3
|
+
import { a as fromSupabasePostgres, i as fromJunction, o as fromTable, r as authzVersion, t as AUTHZ_VERSION_TABLE } from "../sources-B0UvrJ21.js";
|
|
4
|
+
import { a as subjectFromSupabase, n as actorOf, o as subjectFromSupabaseSession, r as delegationOf, t as parseSupabaseManifest } from "../manifest-iaoBXHKc.js";
|
|
5
|
+
export { AUTHZ_VERSION_TABLE, actorOf, authorizeSql, authzVersion, delegationOf, exchangeCapability, fromJunction, fromSupabasePostgres, fromTable, parseSupabaseManifest, postgrestSources, readSubjectRecord, subjectFromSupabase, subjectFromSupabaseSession, supabaseApprovalStore, supabaseClaims, supabaseMembershipsBudget, supabaseRls, supabaseTenantClaim };
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { h as WebBotAuthVerifier, n as OpenApiHooks } from "../create-BKF3dgFk.js";
|
|
1
|
+
import { C as Policy, D as PolicyVocabulary, Nr as Principal, Pr as Subject, ln as PermDock } from "../policy-CFZAr_Al.js";
|
|
2
|
+
import { f as Permission } from "../permissions-DttnqqxC.js";
|
|
3
|
+
import { t as InstanceOptions } from "../instance-options-BK_rNOSC.js";
|
|
4
|
+
import { n as OpenApiHooks } from "../create-BWyx3jua.js";
|
|
5
|
+
import { n as ServerAdapterServices } from "../bind-CVy3Espv.js";
|
|
7
6
|
import { Middleware } from "@supabase/middleware";
|
|
8
7
|
//#region src/supabase/middleware.d.ts
|
|
9
8
|
/**
|
|
@@ -26,37 +25,43 @@ export type SupabaseJwtClaims = {
|
|
|
26
25
|
/**
|
|
27
26
|
* What `withPermDock` requires upstream: a `jwtClaims` contribution. Supabase's
|
|
28
27
|
* `withClaims`, `withRequiredClaims` and `withSupabase` all provide it; `null`
|
|
29
|
-
* is the anonymous caller (no bearer token
|
|
30
|
-
*
|
|
28
|
+
* is the anonymous caller (no bearer token or an `sb_*` API key), unless
|
|
29
|
+
* `secretKeys` names the secret key `withSupabase` matched.
|
|
31
30
|
*/
|
|
32
31
|
export type SupabaseMiddlewareContext = {
|
|
33
32
|
readonly jwtClaims: SupabaseJwtClaims | null;
|
|
34
33
|
};
|
|
35
|
-
|
|
34
|
+
/**
|
|
35
|
+
* A Supabase secret key that acts as a tenant service principal. `id` is the
|
|
36
|
+
* principal id, `roles` are held in `tenant` only, and `permissions` caps
|
|
37
|
+
* what the key may do, as a `service` credential does.
|
|
38
|
+
*/
|
|
39
|
+
export type SupabaseSecretKey = {
|
|
40
|
+
readonly id: string;
|
|
41
|
+
readonly tenant: string;
|
|
42
|
+
readonly roles: readonly string[];
|
|
43
|
+
readonly permissions: readonly Permission[];
|
|
44
|
+
};
|
|
45
|
+
export type SupabaseMiddlewarePermDockOptions<TUser = unknown> = InstanceOptions & ServerAdapterServices & {
|
|
46
|
+
/**
|
|
47
|
+
* Named secret keys (`SUPABASE_SECRET_KEYS`) that act as service
|
|
48
|
+
* principals when `withSupabase` matched one (`authMode: 'secret'` with
|
|
49
|
+
* that `authKeyName`). Any other key, an unnamed `secret` and every
|
|
50
|
+
* `publishable` key stay anonymous.
|
|
51
|
+
*/
|
|
52
|
+
readonly secretKeys?: Readonly<Record<string, SupabaseSecretKey>>;
|
|
36
53
|
readonly subject: (ctx: SupabaseMiddlewareContext, request: Request) => TUser | Subject | null | Promise<TUser | Subject | null>;
|
|
37
54
|
readonly tenant?: string | ((ctx: SupabaseMiddlewareContext, request: Request) => string | undefined | Promise<string | undefined>);
|
|
38
|
-
readonly memberships?: MembershipSource | readonly MembershipSource[];
|
|
39
|
-
/** The object graph for relation grants that walk a parent chain; without it they deny. */
|
|
40
|
-
readonly relations?: RelationSource;
|
|
41
|
-
readonly entitlements?: EntitlementSource;
|
|
42
|
-
readonly customRoles?: RoleSource;
|
|
43
|
-
/** Hosted grants, read once per instance; see `PolicySource`. */
|
|
44
|
-
readonly policies?: PolicySource;
|
|
45
|
-
readonly store?: ApprovalStore;
|
|
46
|
-
readonly sink?: DecisionSink;
|
|
47
|
-
readonly limits?: LimitStore;
|
|
48
|
-
/** `createPermDock` from `permdock/pdp`; `protect` then decides delegated permissions remotely. */
|
|
49
|
-
readonly pdp?: PdpFactory;
|
|
50
|
-
/** Accepted for adapter parity; not read by this adapter. */
|
|
51
|
-
readonly snapshots?: SnapshotSource;
|
|
52
|
-
/** `(permdock) => withOtel(permdock, options)` from `permdock/otel`. */
|
|
53
|
-
readonly otel?: OtelWrap;
|
|
54
|
-
/** `(request) => verifyWebBotAuth(request, options)`; a verified bot becomes the actor. */
|
|
55
|
-
readonly webBotAuth?: WebBotAuthVerifier;
|
|
56
55
|
};
|
|
57
56
|
export type WithPermDockConfig = {
|
|
58
57
|
/** Run `protect` before the handler; a denial short-circuits with Problem Details. */
|
|
59
58
|
readonly protect?: Permission;
|
|
59
|
+
/**
|
|
60
|
+
* The OAuth scopes that reach the handler: a delegated token holding none
|
|
61
|
+
* of them is refused with `insufficient_scope`. Without `protect`, the
|
|
62
|
+
* handler needs a signed-in principal and checks no permission.
|
|
63
|
+
*/
|
|
64
|
+
readonly oauthScopes?: readonly string[];
|
|
60
65
|
/** Load the row `protect` decides on; `null` or `undefined` yields 404. */
|
|
61
66
|
readonly data?: (ctx: SupabaseMiddlewareContext, request: Request) => unknown;
|
|
62
67
|
/** `true` when `data` returns a row the server loaded; anything else is validated before the check. */
|