permdock 0.1.0 → 0.3.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-CKwwqFWz.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 +223 -0
- package/dist/better-supabase/index.js +648 -0
- package/dist/bind-C_ob3LKa.d.ts +25 -0
- package/dist/bind-CuzGytRf.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-BDG_nkxt.d.ts → capability-2kYTMWDv.d.ts} +2 -2
- package/dist/{capability-B68OFnZx.js → capability-4qPdO9gk.js} +7 -5
- package/dist/catalog/index.d.ts +1 -1
- package/dist/catalog/index.js +1 -1
- package/dist/catalog-CRW5Mx_B.js +2 -0
- package/dist/{catalog-H-vFGwWK.js → catalog-DWF5cYqB.js} +4 -4
- package/dist/{catalog-B0E6bggc.js → catalog-dFZdWCGN.js} +2 -2
- package/dist/{catalog-doc-BSo_Q_-6.js → catalog-doc-DdGm82XT.js} +20 -32
- 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-CB_ELYuX.js} +2 -2
- package/dist/{cloud-Cuxr6Czw.js → cloud-DWLXO2af.js} +7 -6
- package/dist/collect-DClJsheJ.js +83 -0
- package/dist/{collect-O-tOtbnk.js → collect-DSTE3ml9.js} +194 -42
- package/dist/collect-DSWOk19R.js +2 -0
- package/dist/{commands-BMh_Etm2.js → commands-DSxCqG9A.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-BkRyBDBw.d.ts +94 -0
- package/dist/config-BJiM-xAm.js +157 -0
- package/dist/config-Dnszbv-6.js +36 -0
- package/dist/config-report-DMvWKUxL.js +44 -0
- package/dist/{connection-JvqwHODC.js → connection-CU8MQxRi.js} +1 -1
- package/dist/{context-CKEAabd7.js → context-Bcy85rGi.js} +36 -27
- package/dist/convex/index.d.ts +9 -4
- package/dist/convex/index.js +14 -4
- package/dist/create-B1d519XK.d.ts +245 -0
- package/dist/create-CMwIl-w2.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-DMYiCjJV.d.ts} +9 -10
- package/dist/{diff-x5Il8LVa.js → diff-2VaeChzX.js} +44 -11
- package/dist/{diff-BUzf5Poi.js → diff-DBIhz_f2.js} +2 -2
- package/dist/{doctor-Bqo6FwUa.js → doctor-BwCAMLx_.js} +2 -2
- package/dist/doctor-collect-CHk6XWOA.js +665 -0
- package/dist/doctor-igIiM_Hl.js +1194 -0
- 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-DPdqI50v.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-CTLijvdm.js} +66 -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-0nNqHspG.d.ts +6 -0
- package/dist/{index-xIxJLwOQ.d.ts → index-BNc7Wer_.d.ts} +75 -7
- package/dist/{index-CltcQ4Bf.d.ts → index-C7Tw7MaW.d.ts} +68 -5
- package/dist/{index-LF_hS-yn.d.ts → index-C8z4RjQV.d.ts} +1 -1
- package/dist/index.d.ts +14 -9
- package/dist/index.js +22 -17
- package/dist/instance-options-Dhhcnm3y.js +22 -0
- package/dist/instance-options-jARdwfPN.d.ts +11 -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-_RRHmnMY.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-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-CwePaF7C.js → openapi-l0xYHkcv.js} +3 -3
- 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-BrMozJCo.js +36 -0
- package/dist/parse-local-manifest-JLnaBH0S.d.ts +10 -0
- package/dist/pdp/index.d.ts +2 -2
- package/dist/pdp/index.js +14 -127
- package/dist/{permdock-yoZ7EjxX.js → permdock-CbgvLnuo.js} +672 -149
- package/dist/{permissions-B8vCg_bI.d.ts → permissions-CDgvKG5L.d.ts} +2 -2
- package/dist/{permissions-DC7GROPA.js → permissions-DVoF6dMt.js} +77 -15
- package/dist/{permissions-B4apnahQ.d.ts → permissions-DttnqqxC.d.ts} +34 -5
- package/dist/{permissions-CofRqesP.js → permissions-RJrovw98.js} +3 -3
- package/dist/{pins-CqE1jZuF.js → pins-8ILTftC9.js} +2 -2
- package/dist/{policy-Cq2fB8Q5.d.ts → policy-D2W7uv19.d.ts} +2 -2
- package/dist/{policy-CInmNGkM.d.ts → policy-IB6yxpC3.d.ts} +351 -42
- package/dist/{policy-ANp36PnI.js → policy-xyWg7QdR.js} +173 -22
- package/dist/powersync-BylawD_U.js +540 -0
- package/dist/powersync-DliZK_-y.js +62 -0
- package/dist/powersync-e_AZrKbg.js +2 -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-DX075l9V.d.ts +7 -0
- package/dist/problem-details-_AMOYz-w.js +144 -0
- package/dist/{protected-BuPAycJT.d.ts → protected-BdnIEFkY.d.ts} +5 -4
- package/dist/protected-utU-SLuy.js +100 -0
- package/dist/protected-xAr24FEC.d.ts +40 -0
- package/dist/provider-CSQd7m92.js +52 -0
- package/dist/{provider-wTAUda2v.d.ts → provider-DZY281jO.d.ts} +1 -1
- package/dist/provider-store-Cfbvo4DE.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-CYyiLiwO.d.ts +5 -0
- package/dist/resource-ref-CaS9yVPi.js +20 -0
- package/dist/revocations-Bhr0aMIC.js +27 -0
- package/dist/{rls-BOFU3chG.js → rls-B4ur8nKQ.js} +8 -3
- package/dist/rls-DQtdgTHB.js +2521 -0
- package/dist/rls-fields-74oZPXWL.js +3582 -0
- package/dist/{rls-graph-DxQ39PJj.js → rls-graph-CHwx0V8q.js} +100 -36
- package/dist/{rls-import-CXV6LBlS.js → rls-import-BTFVk3jH.js} +7 -6
- package/dist/{rls-migrate-DrFPbf8p.js → rls-migrate-CN4TlJTO.js} +6 -5
- package/dist/rls-ownership-RuFqaqGz.js +843 -0
- package/dist/rls-shared-Cewd_-zI.js +495 -0
- package/dist/rls-verify-CVQTHTh5.js +746 -0
- package/dist/{row-check-BajTgQZ-.d.ts → row-check-Dt35czLy.d.ts} +12 -15
- package/dist/row-conditions-h2HythXQ.js +27 -0
- package/dist/rpc-DL9Sqvb1.js +89 -0
- package/dist/{run-CJ6UvS3a.js → run-DKDbM4Du.js} +31 -12
- package/dist/runtime-CB8gQFvS.js +11 -0
- package/dist/{saas-BRrZzJkM.js → saas-DhpJjnBA.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-B1fZzIMf.d.ts} +1 -1
- package/dist/skills-Biq5uup3.js +192 -0
- package/dist/{skills-C_lpV4Jx.js → skills-Bx-U0irG.js} +10 -4
- package/dist/{snapshot-DE8dE_hz.js → snapshot-Enxd0n-s.js} +138 -214
- package/dist/snapshot-cache-B-LxUahj.d.ts +45 -0
- package/dist/snapshot-cache-D6jLelln.js +44 -0
- package/dist/solid/index.d.ts +39 -9
- package/dist/solid/index.js +76 -85
- package/dist/sources-4p0-4xQm.js +545 -0
- package/dist/sources-BdOYLw9j.d.ts +192 -0
- package/dist/{sql-Bll1d7y0.js → sql-xdg5f4Fi.js} +6 -1
- package/dist/{src-CTNT-PBW.js → src-BDwEZWrZ.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-jOBYpiXC.d.ts} +13 -4
- package/dist/store-options-ByhZq1jV.js +716 -0
- package/dist/{stores-CkG2HrSg.js → stores-BT2pSCub.js} +10 -63
- package/dist/{stores-CvOnu_2T.d.ts → stores-C0IMQrGI.d.ts} +20 -9
- package/dist/{stream-BhMfZOwr.d.ts → stream-D1RXubw2.d.ts} +2 -2
- package/dist/{stream-Q_xlB6Ko.js → stream-DDpvynSB.js} +16 -2
- package/dist/subject-settings-BwBmCdTR.js +128 -0
- package/dist/supabase/index.d.ts +133 -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-Boqb9a_Y.js} +3 -3
- package/dist/{supabase-DTxGtYdi.js → supabase-C0qESOa-.js} +347 -367
- package/dist/supabase-config-BpPXt3x1.js +472 -0
- package/dist/supabase-hook-6sYLXg_u.js +2 -0
- package/dist/{supabase-hook-D_OqGb_V.js → supabase-hook-CSLQ4zJ3.js} +1037 -705
- package/dist/supautils-Cn4R4cJ4.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-BnIEz1sU.d.ts +48 -0
- package/dist/{types-CxquUByI.d.ts → types-Bvc4oWT6.d.ts} +1 -1
- package/dist/{sources-DOpW5Ila.d.ts → types-C97IskBw.d.ts} +86 -127
- package/dist/types-CKNSyIf_.d.ts +52 -0
- package/dist/types-Cq_H8N_X.d.ts +197 -0
- package/dist/{types-D6Z6-rKJ.d.ts → types-DbjRN55U.d.ts} +273 -22
- package/dist/{types-BBK-exvJ.d.ts → types-Dnemwd77.d.ts} +7 -1
- package/dist/{types-BvBk1wgn.d.ts → types-DxiCGmmd.d.ts} +5 -3
- package/dist/{types-B9dmiiab.d.ts → types-QCuYJh4q.d.ts} +1 -1
- package/dist/{types-B8w5PFtS.d.ts → types-aqOHTHcp.d.ts} +17 -1
- package/dist/unplugin/index.d.ts +1 -1
- package/dist/unplugin/index.js +10 -9
- package/dist/usage-DorAJiU_.js +2 -0
- package/dist/{usage-1ozMubLY.js → usage-GTixvDDU.js} +2 -2
- package/dist/{usage-CUnK6Ou9.js → usage-ItS7nLcl.js} +225 -62
- package/dist/validation-error-Ba264OaJ.d.ts +26 -0
- package/dist/validation-error-CnjZ4t92.js +33 -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-BwxLTYMZ.js +2 -0
- package/dist/watch-DVBJ9cBq.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,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { a as SaasProject, c as saasPlans, i as SaasFolderSchema, l as saasRoles, n as SaasDocSchema, o as SaasProjectSchema, r as SaasFolder, s as saasPermissions, t as SaasDoc, u as saasTenantRoleNames } from "../../permissions-
|
|
4
|
-
import { n as saasPolicy, t as SAAS_API_KEY_LIMIT } from "../../policy-
|
|
1
|
+
import { Cr as Actor, Dr as CustomRole, Mr as Membership, Nr as Principal, Pr as Subject, bt as RelationSource, dt as LimitStore, kr as Delegation, un as PermDockOptions } from "../../policy-IB6yxpC3.js";
|
|
2
|
+
import { f as Permission } from "../../permissions-DttnqqxC.js";
|
|
3
|
+
import { a as SaasProject, c as saasPlans, i as SaasFolderSchema, l as saasRoles, n as SaasDocSchema, o as SaasProjectSchema, r as SaasFolder, s as saasPermissions, t as SaasDoc, u as saasTenantRoleNames } from "../../permissions-CDgvKG5L.js";
|
|
4
|
+
import { n as saasPolicy, t as SAAS_API_KEY_LIMIT } from "../../policy-D2W7uv19.js";
|
|
5
5
|
import { StandardSchemaV1 } from "@standard-schema/spec";
|
|
6
6
|
//#region src/testing/saas/schema.d.ts
|
|
7
7
|
type FieldKind = "string" | "boolean" | "nullable-string";
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { a as saasPlans, c as rowSchema, i as saasPermissions, n as SaasFolderSchema, o as saasRoles, r as SaasProjectSchema, s as saasTenantRoleNames, t as SaasDocSchema } from "../../permissions-
|
|
2
|
-
import { C as saasOrg, D as saasUsers, E as saasSeed, O as SAAS_API_KEY_LIMIT, S as saasMemberships, T as saasRelations, _ as verifySaasToken, a as saasProject, b as SAAS_EXPIRED_AT, c as saasUser, d as saasIssuer, f as saasJwks, g as verifySaasSession, h as signSaasToken, i as saasLimitStore, k as saasPolicy, l as SAAS_TOKEN_TTL_SECONDS, m as saasPublicJwk, n as saasFolder, o as saasScenarioOptions, p as saasPrivateJwk, r as saasFolderScenarios, s as saasScenarios, t as saasDoc, u as saasAudience, v as saasSchemaSql, w as saasPrincipal, x as saasCustomRoles, y as saasSeedSql } from "../../saas-
|
|
1
|
+
import { a as saasPlans, c as rowSchema, i as saasPermissions, n as SaasFolderSchema, o as saasRoles, r as SaasProjectSchema, s as saasTenantRoleNames, t as SaasDocSchema } from "../../permissions-RJrovw98.js";
|
|
2
|
+
import { C as saasOrg, D as saasUsers, E as saasSeed, O as SAAS_API_KEY_LIMIT, S as saasMemberships, T as saasRelations, _ as verifySaasToken, a as saasProject, b as SAAS_EXPIRED_AT, c as saasUser, d as saasIssuer, f as saasJwks, g as verifySaasSession, h as signSaasToken, i as saasLimitStore, k as saasPolicy, l as SAAS_TOKEN_TTL_SECONDS, m as saasPublicJwk, n as saasFolder, o as saasScenarioOptions, p as saasPrivateJwk, r as saasFolderScenarios, s as saasScenarios, t as saasDoc, u as saasAudience, v as saasSchemaSql, w as saasPrincipal, x as saasCustomRoles, y as saasSeedSql } from "../../saas-DhpJjnBA.js";
|
|
3
3
|
export { SAAS_API_KEY_LIMIT, SAAS_EXPIRED_AT, SAAS_TOKEN_TTL_SECONDS, SaasDocSchema, SaasFolderSchema, SaasProjectSchema, rowSchema, saasAudience, saasCustomRoles, saasDoc, saasFolder, saasFolderScenarios, saasIssuer, saasJwks, saasLimitStore, saasMemberships, saasOrg, saasPermissions, saasPlans, saasPolicy, saasPrincipal, saasPrivateJwk, saasProject, saasPublicJwk, saasRelations, saasRoles, saasScenarioOptions, saasScenarios, saasSchemaSql, saasSeed, saasSeedSql, saasTenantRoleNames, saasUser, saasUsers, signSaasToken, verifySaasSession, verifySaasToken };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as SaasProject, c as saasPlans, i as SaasFolderSchema, l as saasRoles, n as SaasDocSchema, o as SaasProjectSchema, r as SaasFolder, s as saasPermissions, t as SaasDoc, u as saasTenantRoleNames } from "../../permissions-
|
|
1
|
+
import { a as SaasProject, c as saasPlans, i as SaasFolderSchema, l as saasRoles, n as SaasDocSchema, o as SaasProjectSchema, r as SaasFolder, s as saasPermissions, t as SaasDoc, u as saasTenantRoleNames } from "../../permissions-CDgvKG5L.js";
|
|
2
2
|
export { SaasDoc, SaasDocSchema, SaasFolder, SaasFolderSchema, SaasProject, SaasProjectSchema, saasPermissions, saasPlans, saasRoles, saasTenantRoleNames };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as saasPlans, i as saasPermissions, n as SaasFolderSchema, o as saasRoles, r as SaasProjectSchema, s as saasTenantRoleNames, t as SaasDocSchema } from "../../permissions-
|
|
1
|
+
import { a as saasPlans, i as saasPermissions, n as SaasFolderSchema, o as saasRoles, r as SaasProjectSchema, s as saasTenantRoleNames, t as SaasDocSchema } from "../../permissions-RJrovw98.js";
|
|
2
2
|
export { SaasDocSchema, SaasFolderSchema, SaasProjectSchema, saasPermissions, saasPlans, saasRoles, saasTenantRoleNames };
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { t as canonicalJson } from "./canonical-json-DemiK4Vp.js";
|
|
2
|
+
import { n as sha256, t as bytesToBase64Url } from "./sha256-BO0swRXL.js";
|
|
3
|
+
//#region src/core/token.ts
|
|
4
|
+
/**
|
|
5
|
+
* Only stable identity goes into the token, so refreshing a session (new
|
|
6
|
+
* roles, assurance or claims) does not orphan an outstanding approval.
|
|
7
|
+
*/
|
|
8
|
+
function principalIdentity(principal) {
|
|
9
|
+
if (principal === null) return null;
|
|
10
|
+
return {
|
|
11
|
+
id: principal.id,
|
|
12
|
+
tenant: principal.tenant ?? null,
|
|
13
|
+
issuer: principal.issuer ?? null
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/** A row's `version` field as token input; `null` when it is missing or not a scalar. */
|
|
17
|
+
function versionOf(row, field) {
|
|
18
|
+
if (row === null || typeof row !== "object" || !Object.hasOwn(row, field)) return null;
|
|
19
|
+
const value = row[field];
|
|
20
|
+
if (value instanceof Date) return Number.isNaN(value.getTime()) ? null : value.toISOString();
|
|
21
|
+
return typeof value === "string" || typeof value === "number" || typeof value === "bigint" || typeof value === "boolean" ? String(value) : null;
|
|
22
|
+
}
|
|
23
|
+
/** The digest that binds a token to the call's data when no row id does. */
|
|
24
|
+
function payloadDigest(data) {
|
|
25
|
+
return bytesToBase64Url(sha256(canonicalJson(data)));
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* `version` is set only for an approval that goes stale on a resource
|
|
29
|
+
* change; without it the payload, and so every other token, is unchanged.
|
|
30
|
+
* `payload` is set when `resourceId` is `*` (a collection action or a row
|
|
31
|
+
* without an id), so an approval covers the arguments it was given and no
|
|
32
|
+
* others.
|
|
33
|
+
*/
|
|
34
|
+
function decisionToken(input) {
|
|
35
|
+
const payload = JSON.stringify({
|
|
36
|
+
key: input.key,
|
|
37
|
+
resourceId: input.resourceId,
|
|
38
|
+
principal: principalIdentity(input.principal),
|
|
39
|
+
actor: input.actor === void 0 ? null : {
|
|
40
|
+
id: input.actor.id,
|
|
41
|
+
kind: input.actor.kind
|
|
42
|
+
},
|
|
43
|
+
fingerprint: input.fingerprint,
|
|
44
|
+
...input.version === void 0 ? {} : { version: input.version },
|
|
45
|
+
...input.payload === void 0 ? {} : { payload: input.payload }
|
|
46
|
+
});
|
|
47
|
+
return `pd1.${bytesToBase64Url(sha256(payload))}`;
|
|
48
|
+
}
|
|
49
|
+
//#endregion
|
|
50
|
+
export { payloadDigest as n, versionOf as r, decisionToken as t };
|
package/dist/trpc/index.d.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { f as ApprovalStore } from "../types-B8w5PFtS.js";
|
|
1
|
+
import { C as Policy, Nr as Principal } from "../policy-IB6yxpC3.js";
|
|
2
|
+
import { f as Permission } from "../permissions-DttnqqxC.js";
|
|
4
3
|
import { n as RevocationFeed } from "../revocations-Cy06JNx2.js";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { t as StreamProtectOptions } from "../stream-
|
|
4
|
+
import { A as ConnectionOptions, O as Connection, n as OpenApiHooks } from "../create-B1d519XK.js";
|
|
5
|
+
import { t as ServerAdapterOptions } from "../bind-C_ob3LKa.js";
|
|
6
|
+
import { t as StreamProtectOptions } from "../stream-D1RXubw2.js";
|
|
8
7
|
import { AnyTRPCMiddlewareFunction } from "@trpc/server";
|
|
9
8
|
//#region src/trpc/create.d.ts
|
|
10
9
|
type TrpcMiddlewareOpts<TCtx = object, TInput = unknown> = {
|
|
@@ -17,27 +16,9 @@ type TrpcMiddlewareOpts<TCtx = object, TInput = unknown> = {
|
|
|
17
16
|
}) => Promise<unknown>;
|
|
18
17
|
};
|
|
19
18
|
type TrpcMiddleware = AnyTRPCMiddlewareFunction;
|
|
20
|
-
type TrpcPermDockOptions<TCtx = object, TUser = unknown> = {
|
|
21
|
-
readonly subject: (opts: TrpcMiddlewareOpts<TCtx>) => TUser | Promise<TUser>;
|
|
22
|
-
readonly tenant?: TenantOption<TrpcMiddlewareOpts<TCtx>>;
|
|
19
|
+
type TrpcPermDockOptions<TCtx = object, TUser = unknown> = ServerAdapterOptions<TrpcMiddlewareOpts<TCtx>, TUser> & {
|
|
23
20
|
/** The Web `Request` behind a context; defaults to `ctx.request` or `ctx.req`. */
|
|
24
21
|
readonly request?: (ctx: TCtx) => Request | null | undefined;
|
|
25
|
-
readonly memberships?: MembershipSource | readonly MembershipSource[];
|
|
26
|
-
/** The object graph for relation grants that walk a parent chain; without it they deny. */
|
|
27
|
-
readonly relations?: RelationSource;
|
|
28
|
-
readonly entitlements?: EntitlementSource;
|
|
29
|
-
readonly customRoles?: RoleSource;
|
|
30
|
-
/** Hosted grants, read once per instance; see `PolicySource`. */
|
|
31
|
-
readonly policies?: PolicySource;
|
|
32
|
-
readonly store?: ApprovalStore;
|
|
33
|
-
readonly sink?: DecisionSink;
|
|
34
|
-
readonly limits?: LimitStore;
|
|
35
|
-
/** `createPermDock` from `permdock/pdp`; `protect` then decides delegated permissions remotely. */
|
|
36
|
-
readonly pdp?: PdpFactory;
|
|
37
|
-
/** Accepted for adapter parity; not read by this adapter. */
|
|
38
|
-
readonly snapshots?: SnapshotSource;
|
|
39
|
-
/** `(request) => verifyWebBotAuth(request, options)`; a verified bot becomes the actor. */
|
|
40
|
-
readonly webBotAuth?: WebBotAuthVerifier;
|
|
41
22
|
/** Ends or revalidates open subscriptions. */
|
|
42
23
|
readonly revocations?: RevocationFeed;
|
|
43
24
|
};
|
|
@@ -53,7 +34,7 @@ type TrpcOpenApiHooks = {
|
|
|
53
34
|
};
|
|
54
35
|
type TrpcPermDock<TCtx = object> = {
|
|
55
36
|
readonly permdock: () => TrpcMiddleware;
|
|
56
|
-
readonly protect: (permission: Permission, loadData?: (opts: TrpcMiddlewareOpts<TCtx>) => unknown, protectOptions?: StreamProtectOptions) => TrpcMiddleware;
|
|
37
|
+
readonly protect: (permission: Permission | null, loadData?: (opts: TrpcMiddlewareOpts<TCtx>) => unknown, protectOptions?: StreamProtectOptions) => TrpcMiddleware;
|
|
57
38
|
/** A long-lived connection for the request behind `ctx`. */
|
|
58
39
|
readonly connection: (opts: TrpcMiddlewareOpts<TCtx>, connectionOptions?: ConnectionOptions) => Promise<Connection>;
|
|
59
40
|
readonly permdockHandler: (request: Request) => Promise<Response>;
|
package/dist/trpc/index.js
CHANGED
|
@@ -1,29 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { n as
|
|
1
|
+
import { a as problemMessage } from "../http-SO7qGttf.js";
|
|
2
|
+
import { t as problemFromError } from "../map-error-pgUWNNtG.js";
|
|
3
|
+
import { n as attached } from "../bind-CuzGytRf.js";
|
|
4
|
+
import { a as reloadAfter, r as isAsyncIterable } from "../stream-DDpvynSB.js";
|
|
5
|
+
import { i as rpcCode, n as guardStream, r as problemBody, t as bindRpcKernel } from "../rpc-DL9Sqvb1.js";
|
|
6
6
|
import { TRPCError, isTrackedEnvelope } from "@trpc/server";
|
|
7
7
|
//#region src/trpc/create.ts
|
|
8
|
-
function requestFromCtx(ctx) {
|
|
9
|
-
if ("request" in ctx && ctx.request instanceof Request) return ctx.request;
|
|
10
|
-
if ("req" in ctx && ctx.req instanceof Request) return ctx.req;
|
|
11
|
-
}
|
|
12
|
-
function problemMessage(cause, fallback) {
|
|
13
|
-
if (cause !== null && typeof cause === "object" && "detail" in cause && typeof cause.detail === "string" && cause.detail.length > 0) return cause.detail;
|
|
14
|
-
return fallback;
|
|
15
|
-
}
|
|
16
8
|
const PROBLEM = Symbol.for("permdock.problem");
|
|
17
|
-
function trpcCode(status) {
|
|
18
|
-
switch (status) {
|
|
19
|
-
case 400: return "BAD_REQUEST";
|
|
20
|
-
case 401: return "UNAUTHORIZED";
|
|
21
|
-
case 404: return "NOT_FOUND";
|
|
22
|
-
case 429: return "TOO_MANY_REQUESTS";
|
|
23
|
-
case 503: return "SERVICE_UNAVAILABLE";
|
|
24
|
-
default: return "FORBIDDEN";
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
9
|
/** A `TRPCError` for a revoked subscription; the Problem Details body rides on `cause`. */
|
|
28
10
|
function trpcErrorFrom(error) {
|
|
29
11
|
const problem = error.toProblemDetails();
|
|
@@ -33,23 +15,18 @@ function trpcErrorFrom(error) {
|
|
|
33
15
|
enumerable: true
|
|
34
16
|
});
|
|
35
17
|
return new TRPCError({
|
|
36
|
-
code:
|
|
18
|
+
code: rpcCode(problem.status),
|
|
37
19
|
message: error.code,
|
|
38
20
|
cause
|
|
39
21
|
});
|
|
40
22
|
}
|
|
41
23
|
async function throwTrpcError(response) {
|
|
42
|
-
|
|
43
|
-
try {
|
|
44
|
-
cause = await response.json();
|
|
45
|
-
} catch {
|
|
46
|
-
cause = { status: response.status };
|
|
47
|
-
}
|
|
24
|
+
const cause = await problemBody(response);
|
|
48
25
|
if (cause !== null && typeof cause === "object") Object.defineProperty(cause, PROBLEM, {
|
|
49
26
|
value: true,
|
|
50
27
|
enumerable: true
|
|
51
28
|
});
|
|
52
|
-
const code =
|
|
29
|
+
const code = rpcCode(response.status);
|
|
53
30
|
throw new TRPCError({
|
|
54
31
|
code,
|
|
55
32
|
message: problemMessage(cause, code),
|
|
@@ -80,84 +57,27 @@ function errorFormatter(opts) {
|
|
|
80
57
|
};
|
|
81
58
|
}
|
|
82
59
|
function createPermDock(policy, options) {
|
|
83
|
-
const
|
|
84
|
-
const requestByCtx = /* @__PURE__ */ new WeakMap();
|
|
85
|
-
const kernel = createKernel(policy, compact({
|
|
86
|
-
subject: (request) => {
|
|
87
|
-
const opts = optsByRequest.get(request);
|
|
88
|
-
return opts === void 0 ? null : options.subject(opts);
|
|
89
|
-
},
|
|
90
|
-
memberships: options.memberships,
|
|
91
|
-
relations: options.relations,
|
|
92
|
-
entitlements: options.entitlements,
|
|
93
|
-
customRoles: options.customRoles,
|
|
94
|
-
policies: options.policies,
|
|
95
|
-
store: options.store,
|
|
96
|
-
sink: options.sink,
|
|
97
|
-
limits: options.limits,
|
|
98
|
-
pdp: options.pdp,
|
|
99
|
-
webBotAuth: options.webBotAuth,
|
|
100
|
-
revocations: options.revocations,
|
|
101
|
-
adapter: "trpc"
|
|
102
|
-
}));
|
|
103
|
-
const requestOf = (ctx) => {
|
|
104
|
-
if (options.request !== void 0) try {
|
|
105
|
-
return options.request(ctx) ?? void 0;
|
|
106
|
-
} catch {
|
|
107
|
-
return;
|
|
108
|
-
}
|
|
109
|
-
return requestFromCtx(ctx);
|
|
110
|
-
};
|
|
111
|
-
/**
|
|
112
|
-
* One `Request` per HTTP request, shared by every procedure in a batch. The
|
|
113
|
-
* subject reads the first procedure's opts; the tenant is resolved from each
|
|
114
|
-
* procedure's own opts in `scopeOf`, never through the shared `Request`.
|
|
115
|
-
*/
|
|
116
|
-
const bind = (opts) => {
|
|
117
|
-
const ctx = opts.ctx;
|
|
118
|
-
const hit = requestByCtx.get(ctx);
|
|
119
|
-
if (hit !== void 0) return hit;
|
|
120
|
-
const request = requestOf(opts.ctx) ?? new Request(`http://localhost/trpc/${opts.path}`, { method: "POST" });
|
|
121
|
-
requestByCtx.set(ctx, request);
|
|
122
|
-
if (!optsByRequest.has(request)) optsByRequest.set(request, opts);
|
|
123
|
-
return request;
|
|
124
|
-
};
|
|
125
|
-
const scopeOf = (opts) => tenantScope(options.tenant, opts);
|
|
126
|
-
const attach = (ctx, request) => {
|
|
127
|
-
requestByCtx.set(ctx, request);
|
|
128
|
-
};
|
|
60
|
+
const { kernel, bind, attach, scopeOf, connection, evaluate } = bindRpcKernel(policy, options, "trpc", (opts) => opts.ctx, (opts) => opts.path);
|
|
129
61
|
const permdock = () => (async (opts) => {
|
|
130
62
|
const request = bind(opts);
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
instance = await kernel.permdock(request, await scopeOf(opts));
|
|
134
|
-
} catch (error) {
|
|
135
|
-
const response = invalidSignatureResponse(error);
|
|
136
|
-
if (response !== void 0) return throwTrpcError(response);
|
|
137
|
-
throw error;
|
|
138
|
-
}
|
|
63
|
+
const instance = await attached(async () => kernel.permdock(request, await scopeOf(opts)));
|
|
64
|
+
if (!instance.ok) return throwTrpcError(instance.response);
|
|
139
65
|
const nextCtx = {
|
|
140
66
|
...opts.ctx,
|
|
141
|
-
permdock: instance
|
|
67
|
+
permdock: instance.permdock
|
|
142
68
|
};
|
|
143
69
|
attach(nextCtx, request);
|
|
144
70
|
return mapDownstream(await opts.next({ ctx: nextCtx }));
|
|
145
71
|
});
|
|
146
|
-
const connection = async (opts, connectionOptions) => kernel.connection(bind(opts), connectionOptions, await scopeOf(opts));
|
|
147
72
|
/** Wraps a subscription's iterable so revocation ends it and unreadable items drop. */
|
|
148
73
|
const guardSubscription = async (result, opts, permission, loadData, protectOptions) => {
|
|
149
74
|
if (result === null || typeof result !== "object" || result.ok !== true || !isAsyncIterable(result.data)) return result;
|
|
150
|
-
const conn = await connection(opts, compact({
|
|
151
|
-
permission,
|
|
152
|
-
data: loadData
|
|
153
|
-
}));
|
|
154
75
|
return {
|
|
155
76
|
...result,
|
|
156
|
-
data:
|
|
157
|
-
items: protectOptions?.items,
|
|
77
|
+
data: await guardStream(result.data, (connectionOptions) => connection(opts, connectionOptions), permission, loadData, protectOptions, {
|
|
158
78
|
unwrap: (item) => isTrackedEnvelope(item) ? item[1] : item,
|
|
159
79
|
onRevoked: trpcErrorFrom
|
|
160
|
-
})
|
|
80
|
+
})
|
|
161
81
|
};
|
|
162
82
|
};
|
|
163
83
|
const protect = (permission, loadData, protectOptions) => (async (opts) => {
|
|
@@ -170,20 +90,17 @@ function createPermDock(policy, options) {
|
|
|
170
90
|
permdockData: guard.data
|
|
171
91
|
};
|
|
172
92
|
attach(nextCtx, request);
|
|
173
|
-
return guardSubscription(await mapDownstream(await opts.next({ ctx: nextCtx })), opts, permission, loadData === void 0 ? void 0 : () => loadData(opts), protectOptions);
|
|
93
|
+
return guardSubscription(await mapDownstream(await opts.next({ ctx: nextCtx })), opts, permission, loadData === void 0 ? void 0 : reloadAfter(guard.data, () => loadData(opts)), protectOptions);
|
|
174
94
|
}
|
|
175
95
|
return throwTrpcError(guard.response);
|
|
176
96
|
});
|
|
177
97
|
const permdockHandler = (request) => {
|
|
178
|
-
|
|
98
|
+
return evaluate(request, {
|
|
179
99
|
ctx: { req: request },
|
|
180
100
|
path: "permdock",
|
|
181
101
|
type: "unknown",
|
|
182
102
|
next: (nextOpts) => Promise.resolve(nextOpts ?? { ctx: { req: request } })
|
|
183
|
-
};
|
|
184
|
-
bind(opts);
|
|
185
|
-
const { POST, GET } = kernel.permdockHandler(() => scopeOf(opts));
|
|
186
|
-
return Promise.resolve(request.method === "GET" ? GET(request) : POST(request));
|
|
103
|
+
});
|
|
187
104
|
};
|
|
188
105
|
const kernelOpenApi = kernel.openapi;
|
|
189
106
|
return {
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Ft as TokenVerifier, Tt as Snapshot, Yn as Decision } from "./policy-IB6yxpC3.js";
|
|
2
|
+
import { f as Permission } from "./permissions-DttnqqxC.js";
|
|
3
|
+
import { ReactNode } from "react";
|
|
4
|
+
//#region src/react/types.d.ts
|
|
5
|
+
type PermDockProviderProps = ({
|
|
6
|
+
readonly snapshot: Snapshot | string;
|
|
7
|
+
readonly snapshotPromise?: never;
|
|
8
|
+
} | {
|
|
9
|
+
/**
|
|
10
|
+
* An unawaited snapshot from a Server Component. Hooks never suspend on it: until it
|
|
11
|
+
* resolves they deny with `status: 'pending'`, then re-render. A rejection fails closed
|
|
12
|
+
* (`server-only`). Set `suspend` to suspend readers through `use()` instead.
|
|
13
|
+
*/
|
|
14
|
+
readonly snapshotPromise: PromiseLike<Snapshot | string>;
|
|
15
|
+
readonly snapshot?: never;
|
|
16
|
+
}) & {
|
|
17
|
+
/**
|
|
18
|
+
* With `snapshotPromise`: `true` suspends every hook to the nearest Suspense boundary until it
|
|
19
|
+
* resolves, and a rejection reaches the nearest error boundary. Defaults to `false`.
|
|
20
|
+
*/
|
|
21
|
+
readonly suspend?: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* The AuthZEN evaluations endpoint for checks the snapshot cannot answer. `false` never
|
|
24
|
+
* fetches: those checks answer `denied` with reason `server-only`.
|
|
25
|
+
*/
|
|
26
|
+
readonly endpoint?: string | false;
|
|
27
|
+
/** Where `refresh()` fetches a fresh snapshot. Defaults to `endpoint`. */
|
|
28
|
+
readonly snapshotUrl?: string;
|
|
29
|
+
readonly approvals?: string;
|
|
30
|
+
readonly tenant?: string;
|
|
31
|
+
readonly fetch?: typeof fetch;
|
|
32
|
+
readonly headers?: Readonly<Record<string, string>>;
|
|
33
|
+
readonly maxAge?: number;
|
|
34
|
+
readonly verifier?: TokenVerifier;
|
|
35
|
+
readonly children: ReactNode;
|
|
36
|
+
};
|
|
37
|
+
type ProtectedProps = {
|
|
38
|
+
readonly permission: Permission;
|
|
39
|
+
readonly data?: unknown;
|
|
40
|
+
readonly tenant?: string;
|
|
41
|
+
readonly pending?: ReactNode;
|
|
42
|
+
readonly fallback?: ReactNode | ((decision: Decision) => ReactNode);
|
|
43
|
+
readonly children: ReactNode | ((decision: Extract<Decision, {
|
|
44
|
+
readonly outcome: "granted";
|
|
45
|
+
}>) => ReactNode);
|
|
46
|
+
};
|
|
47
|
+
//#endregion
|
|
48
|
+
export { ProtectedProps as n, PermDockProviderProps as t };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { Nr as Principal, et as AuthEvent } from "./policy-IB6yxpC3.js";
|
|
2
|
+
import { t as ClientNames } from "./clients-C7zLFuWT.js";
|
|
3
3
|
import { StandardSchemaV1 } from "@standard-schema/spec";
|
|
4
4
|
//#region src/supabase/claims.d.ts
|
|
5
5
|
/** One entry of the `memberships` claim, as `schemas/supabase-claims-v1.json` defines it. */
|
|
@@ -27,6 +27,8 @@ type SupabaseMembershipClaim = {
|
|
|
27
27
|
};
|
|
28
28
|
readonly managedBy?: "idp";
|
|
29
29
|
readonly entitlements?: readonly string[];
|
|
30
|
+
/** The instance or an ancestor is suspended: the permission keys the membership still grants. */
|
|
31
|
+
readonly keep?: readonly string[];
|
|
30
32
|
/** Custom roles in compact form, read by the RLS helpers in `jwt` mode. */
|
|
31
33
|
readonly grants?: Readonly<Record<string, unknown>>;
|
|
32
34
|
};
|
|
@@ -96,16 +98,36 @@ type SupabasePrincipal = Principal & {
|
|
|
96
98
|
readonly is_anonymous?: boolean;
|
|
97
99
|
};
|
|
98
100
|
type SupabaseInclude = "email" | "phone" | "is_anonymous";
|
|
101
|
+
/**
|
|
102
|
+
* A column that holds a foreign key: the value is `column` of `through`,
|
|
103
|
+
* joined on `on`. A role reads its key from a roles table
|
|
104
|
+
* (`{ through: 'roles', on: { role_id: 'id' }, column: 'key' }`); a
|
|
105
|
+
* membership source's user can read its user id from a profile table
|
|
106
|
+
* (`{ through: 'contact_profiles', on: { contact_profile_id: 'id' }, column: 'user_id' }`).
|
|
107
|
+
*/
|
|
108
|
+
type RoleThrough = {
|
|
109
|
+
/** The referenced table; unqualified, it is in the schema of the table that references it. */
|
|
110
|
+
readonly through: string;
|
|
111
|
+
/** One entry: the referencing column to the column of `through` it references. */
|
|
112
|
+
readonly on: Readonly<Record<string, string>>;
|
|
113
|
+
/** The column of `through` that holds the value: the role key, or the user id. */
|
|
114
|
+
readonly column: string;
|
|
115
|
+
};
|
|
99
116
|
type SupabaseMembershipTable = {
|
|
100
117
|
readonly table: string;
|
|
101
118
|
readonly user: string;
|
|
102
|
-
|
|
119
|
+
/**
|
|
120
|
+
* The role key column, a reference to a roles table that holds the key, or
|
|
121
|
+
* several of them: the row holds every non-null key.
|
|
122
|
+
*/
|
|
123
|
+
readonly role: string | RoleThrough | readonly (string | RoleThrough)[];
|
|
103
124
|
/** Per scope name, the column holding that scope's id: the table's own scope and its ancestors. */
|
|
104
125
|
readonly columns?: Readonly<Record<string, string>>;
|
|
105
126
|
readonly tenant?: string;
|
|
106
127
|
readonly team?: string;
|
|
107
128
|
readonly id?: string;
|
|
108
129
|
readonly expiresAt?: string;
|
|
130
|
+
readonly disabledAt?: string;
|
|
109
131
|
};
|
|
110
132
|
/** A table whose row says whether a user or a scope instance is active. A missing row counts as suspended. */
|
|
111
133
|
type SupabaseActiveRow = {
|
|
@@ -118,11 +140,28 @@ type SupabaseActiveRow = {
|
|
|
118
140
|
readonly status?: string;
|
|
119
141
|
readonly active?: readonly string[];
|
|
120
142
|
};
|
|
143
|
+
/** A scope's active-row table, with the permissions its suspended instances keep. */
|
|
144
|
+
type SupabaseSuspendedScope = SupabaseActiveRow & {
|
|
145
|
+
/**
|
|
146
|
+
* Permissions (references or keys) members of a suspended instance, and of
|
|
147
|
+
* every instance nested in it, still hold; such a membership carries them
|
|
148
|
+
* as `keep`.
|
|
149
|
+
*/
|
|
150
|
+
readonly keep?: readonly (string | {
|
|
151
|
+
readonly key: string;
|
|
152
|
+
})[];
|
|
153
|
+
};
|
|
154
|
+
type SupabaseSuspendedMembership = {
|
|
155
|
+
readonly keep?: readonly (string | {
|
|
156
|
+
readonly key: string;
|
|
157
|
+
})[];
|
|
158
|
+
};
|
|
121
159
|
type SupabaseSuspension = {
|
|
122
160
|
/** A suspended user holds no role and no membership. */
|
|
123
161
|
readonly users?: SupabaseActiveRow;
|
|
124
|
-
/** Per scope name: a suspended instance voids its memberships and every membership nested under it
|
|
125
|
-
readonly scopes?: Readonly<Record<string,
|
|
162
|
+
/** Per scope name: a suspended instance voids its memberships and every membership nested under it, except for `keep`. */
|
|
163
|
+
readonly scopes?: Readonly<Record<string, SupabaseSuspendedScope>>;
|
|
164
|
+
readonly memberships?: SupabaseSuspendedMembership;
|
|
126
165
|
};
|
|
127
166
|
type SupabaseMemberships = {
|
|
128
167
|
/** The membership table of each named scope. */
|
|
@@ -147,10 +186,38 @@ type AuthorizeSqlOptions = {
|
|
|
147
186
|
*/
|
|
148
187
|
readonly customRoles?: {
|
|
149
188
|
readonly declared: readonly string[];
|
|
189
|
+
/** Stored allows may carry a level (`custom_role_permissions.level`). */
|
|
190
|
+
readonly levels?: true;
|
|
150
191
|
};
|
|
151
192
|
/** A suspended user, or a suspended instance of `scope` for a tenant request, answers `false`. */
|
|
152
193
|
readonly suspension?: SupabaseSuspension;
|
|
153
194
|
};
|
|
195
|
+
/** A permission reference; `rls generate` reads only its `key`. */
|
|
196
|
+
type SupabasePermissionRef = {
|
|
197
|
+
readonly key: string;
|
|
198
|
+
};
|
|
199
|
+
/**
|
|
200
|
+
* Private Realtime channels: topic patterns such as `org:{organization}:chat`,
|
|
201
|
+
* with one `{<scope>}` segment that holds a scope instance id.
|
|
202
|
+
*/
|
|
203
|
+
type SupabaseRealtime = {
|
|
204
|
+
readonly topics: Readonly<Record<string, {
|
|
205
|
+
/** Receive broadcast and presence: `select` on `realtime.messages`. */
|
|
206
|
+
readonly read: SupabasePermissionRef;
|
|
207
|
+
/** Send broadcast and track presence: `insert`. */
|
|
208
|
+
readonly write?: SupabasePermissionRef;
|
|
209
|
+
}>>;
|
|
210
|
+
};
|
|
211
|
+
/** Storage buckets whose object paths hold a scope instance id in folder `folder` (default 1). */
|
|
212
|
+
type SupabaseStorage = {
|
|
213
|
+
readonly buckets: Readonly<Record<string, {
|
|
214
|
+
readonly scope: string;
|
|
215
|
+
readonly folder?: number;
|
|
216
|
+
readonly read?: SupabasePermissionRef;
|
|
217
|
+
readonly write?: SupabasePermissionRef;
|
|
218
|
+
readonly delete?: SupabasePermissionRef;
|
|
219
|
+
}>>;
|
|
220
|
+
};
|
|
154
221
|
type SupabaseRlsOptions = {
|
|
155
222
|
readonly roleClaim?: string;
|
|
156
223
|
readonly tenantClaim?: string;
|
|
@@ -158,6 +225,8 @@ type SupabaseRlsOptions = {
|
|
|
158
225
|
readonly tenantType?: string;
|
|
159
226
|
readonly memberships?: SupabaseMembershipTable | SupabaseMemberships;
|
|
160
227
|
readonly suspension?: SupabaseSuspension;
|
|
228
|
+
readonly realtime?: SupabaseRealtime;
|
|
229
|
+
readonly storage?: SupabaseStorage;
|
|
161
230
|
};
|
|
162
231
|
type SupabaseRlsConfig = {
|
|
163
232
|
readonly dialect: "supabase";
|
|
@@ -166,10 +235,12 @@ type SupabaseRlsConfig = {
|
|
|
166
235
|
readonly tenantType?: string;
|
|
167
236
|
readonly memberships?: SupabaseMemberships;
|
|
168
237
|
readonly suspension?: SupabaseSuspension;
|
|
238
|
+
readonly realtime?: SupabaseRealtime;
|
|
239
|
+
readonly storage?: SupabaseStorage;
|
|
169
240
|
};
|
|
170
241
|
/**
|
|
171
242
|
* The structural shape `subjectFromSupabaseSession` reads: a discriminant and the verified JWT claims.
|
|
172
|
-
* Matches
|
|
243
|
+
* Matches any session object of that shape without importing its library.
|
|
173
244
|
*/
|
|
174
245
|
type SupabaseSessionLike = {
|
|
175
246
|
readonly kind: string;
|
|
@@ -184,8 +255,16 @@ type SupabaseSubjectOptions = {
|
|
|
184
255
|
readonly declared?: readonly string[];
|
|
185
256
|
/** Claim holding plan names per tenant id; the active tenant's entry becomes `principal.plans`. */
|
|
186
257
|
readonly plans?: string;
|
|
258
|
+
/** Names for OAuth client ids: an `oauth-client` actor gets `client` set to the name of its id, which a policy delegation matches with `to: { kind: 'oauth-client', client }`. */
|
|
259
|
+
readonly clients?: ClientNames;
|
|
187
260
|
/** `'deny'` maps a token with `is_anonymous: true` (`signInAnonymously()`) to the anonymous subject, as `rls.anonymousSignIns: 'deny'` does in RLS. */
|
|
188
261
|
readonly anonymousSignIns?: "deny";
|
|
262
|
+
/**
|
|
263
|
+
* `true` once the caller checked the session against the Auth server for this request
|
|
264
|
+
* (`auth.getUser()` or an equivalent session check): a token with a `session_id` gets
|
|
265
|
+
* `subject.liveSession`, which `{ subject: { session: { live: true } } }` requires. Never read from claims.
|
|
266
|
+
*/
|
|
267
|
+
readonly liveSession?: boolean;
|
|
189
268
|
/** Audit hook: `membership-dropped` for a `memberships` entry that could not be read, `invalid-chain` for a malformed `act`. */
|
|
190
269
|
readonly onAuth?: (event: AuthEvent) => void;
|
|
191
270
|
};
|
|
@@ -224,124 +303,4 @@ type SupabaseDelegation = {
|
|
|
224
303
|
readonly scopes: readonly string[];
|
|
225
304
|
};
|
|
226
305
|
//#endregion
|
|
227
|
-
|
|
228
|
-
/**
|
|
229
|
-
* Runs one parameterised statement: `pg`'s `client.query` (which resolves
|
|
230
|
-
* `{ rows }`) and `postgres`'s `sql.unsafe` (which resolves the rows) both fit.
|
|
231
|
-
*/
|
|
232
|
-
type SqlQuery = (text: string, values: readonly unknown[]) => Promise<readonly Record<string, unknown>[] | {
|
|
233
|
-
readonly rows: readonly Record<string, unknown>[];
|
|
234
|
-
}>;
|
|
235
|
-
type Common = {
|
|
236
|
-
readonly table: string;
|
|
237
|
-
/** Runs the lookups; without it the source only describes SQL (for `permdock supabase hook generate`). */
|
|
238
|
-
readonly query?: SqlQuery;
|
|
239
|
-
/** Drop suspended users and memberships under suspended instances, like `rls.suspension`. */
|
|
240
|
-
readonly suspension?: SupabaseSuspension;
|
|
241
|
-
};
|
|
242
|
-
type MembershipTableOptions = Common & {
|
|
243
|
-
/** Column names; `user`, `scope`, `id` and `role` default to `user_id`, `scope`, `scope_id`, `role`. */
|
|
244
|
-
readonly columns?: {
|
|
245
|
-
readonly user?: string;
|
|
246
|
-
readonly scope?: string;
|
|
247
|
-
readonly id?: string;
|
|
248
|
-
/** A `jsonb` column of ancestor ids keyed by scope name. */
|
|
249
|
-
readonly within?: string;
|
|
250
|
-
readonly role?: string;
|
|
251
|
-
readonly via?: string;
|
|
252
|
-
readonly expiresAt?: string;
|
|
253
|
-
/** The principal id that wrote the membership (`grantedBy`). */
|
|
254
|
-
readonly grantedBy?: string;
|
|
255
|
-
/** Free-text justification recorded on the membership (`reason`). */
|
|
256
|
-
readonly reason?: string;
|
|
257
|
-
/** A subgroup column filling `member.group`. */
|
|
258
|
-
readonly group?: string;
|
|
259
|
-
/** A text column; the value `idp` marks the row as owned by the identity provider. */
|
|
260
|
-
readonly managedBy?: string;
|
|
261
|
-
/** A `text[]` column of seats. */
|
|
262
|
-
readonly seats?: string;
|
|
263
|
-
};
|
|
264
|
-
};
|
|
265
|
-
type MembershipJunctionOptions = Common & {
|
|
266
|
-
/** The declared scope every row is a membership of. */
|
|
267
|
-
readonly scope: string;
|
|
268
|
-
/** Default `user_id`. */
|
|
269
|
-
readonly user?: string;
|
|
270
|
-
/** The column holding the scope instance id. Default `<scope>_id`. */
|
|
271
|
-
readonly id?: string;
|
|
272
|
-
/** Ancestor id columns keyed by scope name. */
|
|
273
|
-
readonly within?: Readonly<Record<string, string>>;
|
|
274
|
-
/** A role column, or fixed roles every row holds (a contact table with no role column). */
|
|
275
|
-
readonly roles: string | readonly string[];
|
|
276
|
-
/** The membership kind every row has (`contact`, `staff`, `partner`). */
|
|
277
|
-
readonly via?: string;
|
|
278
|
-
readonly expiresAt?: string;
|
|
279
|
-
/** The principal id that wrote the membership (`grantedBy`). */
|
|
280
|
-
readonly grantedBy?: string;
|
|
281
|
-
/** Free-text justification recorded on the membership (`reason`). */
|
|
282
|
-
readonly reason?: string;
|
|
283
|
-
/** A subgroup filling `member.group`: a fixed name every row has, or a column. */
|
|
284
|
-
readonly group?: string | {
|
|
285
|
-
readonly column: string;
|
|
286
|
-
};
|
|
287
|
-
/** `idp` when the identity provider owns every row, or a text column holding `idp` per row. */
|
|
288
|
-
readonly managedBy?: "idp" | {
|
|
289
|
-
readonly column: string;
|
|
290
|
-
};
|
|
291
|
-
/** A `text[]` column of seats. */
|
|
292
|
-
readonly seats?: string;
|
|
293
|
-
};
|
|
294
|
-
/** What `permdock supabase hook generate` compiles; the same SQL the source runs. */
|
|
295
|
-
type MembershipSql = {
|
|
296
|
-
readonly table: string;
|
|
297
|
-
/** Columns of the table that decide a membership; triggers bump the authorization version on them. */
|
|
298
|
-
readonly user: string;
|
|
299
|
-
/** `<table>.<user>%type`: the PL/pgSQL type of the user column, for a variable `select` compares with. */
|
|
300
|
-
readonly userType: string;
|
|
301
|
-
/**
|
|
302
|
-
* The `select` of claim rows for one user, with every filter applied.
|
|
303
|
-
* `user` must have the column's type (a `userType` variable, or an untyped
|
|
304
|
-
* `$1` Postgres infers): the column is compared uncast so its index applies.
|
|
305
|
-
*/
|
|
306
|
-
select(user: string): string;
|
|
307
|
-
/** The `select` of member rows for one scope instance (`$1` scope, `$2` id). */
|
|
308
|
-
list(): string;
|
|
309
|
-
/** A text column holding `idp` for rows the identity provider owns; `''` when every row is owned. */
|
|
310
|
-
readonly managed?: string;
|
|
311
|
-
/** Other tables the `select` reads (suspension tables). */
|
|
312
|
-
readonly reads: readonly string[];
|
|
313
|
-
/** Every column that decides who holds which membership: user, scope, id, `within`, role, `via` and expiry. */
|
|
314
|
-
readonly columns: readonly string[];
|
|
315
|
-
/** For a single-scope source: its scope and the scopes whose ids each row carries. */
|
|
316
|
-
readonly scope?: string;
|
|
317
|
-
readonly holds?: readonly string[];
|
|
318
|
-
/** The source's entry in the hook manifest's `memberships`. */
|
|
319
|
-
readonly manifest: SupabaseManifestMembership;
|
|
320
|
-
};
|
|
321
|
-
type SqlMembershipSource = MembershipSource & {
|
|
322
|
-
readonly sql: MembershipSql;
|
|
323
|
-
};
|
|
324
|
-
/**
|
|
325
|
-
* Memberships from one table holding every scope: a row per user, scope,
|
|
326
|
-
* instance and role (`user_id, scope, scope_id, role`), with optional
|
|
327
|
-
* `within`, `via`, expiry, owner and seat columns. Rows of the same instance
|
|
328
|
-
* merge into one membership.
|
|
329
|
-
*/
|
|
330
|
-
declare function fromTable(options: MembershipTableOptions): SqlMembershipSource;
|
|
331
|
-
/**
|
|
332
|
-
* Memberships from a table of one scope (`customer_contacts`): every row is a
|
|
333
|
-
* membership of `scope`, with roles from a column or fixed (`['contact']`), a
|
|
334
|
-
* fixed `via`, and ancestor ids from `within` columns.
|
|
335
|
-
*/
|
|
336
|
-
declare function fromJunction(options: MembershipJunctionOptions): SqlMembershipSource;
|
|
337
|
-
declare const AUTHZ_VERSION_TABLE = "permdock_authz_version";
|
|
338
|
-
/**
|
|
339
|
-
* Reads the authorization version `permdock supabase hook generate` keeps in
|
|
340
|
-
* `<schema>.permdock_authz_version`: pass it to `claimsFirst(sources, { version })`.
|
|
341
|
-
*/
|
|
342
|
-
declare function authzVersion(options: {
|
|
343
|
-
readonly query: SqlQuery;
|
|
344
|
-
readonly schema?: string;
|
|
345
|
-
}): NonNullable<MembershipSource["version"]>;
|
|
346
|
-
//#endregion
|
|
347
|
-
export { SupabaseActClaim as C, SupabaseMembershipClaim as D, SupabaseClaimsSchema as E, SupabasePermDockClaims as O, SupabaseSuspension as S, SupabaseClaimsOptions as T, SupabasePrincipal as _, SqlMembershipSource as a, SupabaseSessionLike as b, fromJunction as c, SupabaseActiveRow as d, SupabaseActor as f, SupabaseMembershipTable as g, SupabaseInclude as h, MembershipTableOptions as i, supabaseClaims as k, fromTable as l, SupabaseDelegation as m, MembershipJunctionOptions as n, SqlQuery as o, SupabaseActorResult as p, MembershipSql as r, authzVersion as s, AUTHZ_VERSION_TABLE as t, AuthorizeSqlOptions as u, SupabaseRlsConfig as v, SupabaseClaims as w, SupabaseSubjectOptions as x, SupabaseRlsOptions as y };
|
|
306
|
+
export { SupabaseClaimsSchema as C, supabaseClaims as E, SupabaseClaimsOptions as S, SupabasePermDockClaims as T, SupabaseSuspendedMembership as _, SupabaseActorResult as a, SupabaseActClaim as b, SupabaseMembershipTable as c, SupabaseRealtime as d, SupabaseRlsConfig as f, SupabaseSubjectOptions as g, SupabaseStorage as h, SupabaseActor as i, SupabasePermissionRef as l, SupabaseSessionLike as m, RoleThrough as n, SupabaseDelegation as o, SupabaseRlsOptions as p, SupabaseActiveRow as r, SupabaseInclude as s, AuthorizeSqlOptions as t, SupabasePrincipal as u, SupabaseSuspendedScope as v, SupabaseMembershipClaim as w, SupabaseClaims as x, SupabaseSuspension as y };
|