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
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { gt as MembershipSource } from "./policy-CFZAr_Al.js";
|
|
2
|
+
import { n as RoleThrough, y as SupabaseSuspension } from "./types-yF5LmQVD.js";
|
|
3
|
+
import { o as SupabaseManifestMembership } from "./manifest-uDS9y5de.js";
|
|
4
|
+
//#region src/supabase/roles.d.ts
|
|
5
|
+
/** A roles table a role column references, by `schema.table`. */
|
|
6
|
+
type RoleKeys = {
|
|
7
|
+
readonly table: string;
|
|
8
|
+
/** The roles table column the reference points at. */
|
|
9
|
+
readonly id: string;
|
|
10
|
+
/** The roles table column holding the role key. */
|
|
11
|
+
readonly key: string;
|
|
12
|
+
/** The referencing table's column. */
|
|
13
|
+
readonly ref: string;
|
|
14
|
+
};
|
|
15
|
+
//#endregion
|
|
16
|
+
//#region src/supabase/sources.d.ts
|
|
17
|
+
/**
|
|
18
|
+
* Runs one parameterised statement: `pg`'s `client.query` (which resolves
|
|
19
|
+
* `{ rows }`) and `postgres`'s `sql.unsafe` (which resolves the rows) both fit.
|
|
20
|
+
*/
|
|
21
|
+
type SqlQuery = (text: string, values: readonly unknown[]) => Promise<readonly Record<string, unknown>[] | {
|
|
22
|
+
readonly rows: readonly Record<string, unknown>[];
|
|
23
|
+
}>;
|
|
24
|
+
type Common = {
|
|
25
|
+
readonly table: string;
|
|
26
|
+
/** Runs the lookups; without it the source only describes SQL (for `permdock supabase hook generate`). */
|
|
27
|
+
readonly query?: SqlQuery;
|
|
28
|
+
/** Drop suspended users and memberships under suspended instances, like `rls.suspension`. */
|
|
29
|
+
readonly suspension?: SupabaseSuspension;
|
|
30
|
+
};
|
|
31
|
+
type MembershipTableOptions = Common & {
|
|
32
|
+
/** Column names; `user`, `scope`, `id` and `role` default to `user_id`, `scope`, `scope_id`, `role`. */
|
|
33
|
+
readonly columns?: {
|
|
34
|
+
/** The user id column, or a reference to a table that holds the user id. */
|
|
35
|
+
readonly user?: string | RoleThrough;
|
|
36
|
+
readonly scope?: string;
|
|
37
|
+
readonly id?: string;
|
|
38
|
+
/** A `jsonb` column of ancestor ids keyed by scope name. */
|
|
39
|
+
readonly within?: string;
|
|
40
|
+
/**
|
|
41
|
+
* The role key column, a reference to a roles table that holds the key,
|
|
42
|
+
* or several of them: the row holds every non-null key.
|
|
43
|
+
*/
|
|
44
|
+
readonly role?: string | RoleThrough | readonly (string | RoleThrough)[];
|
|
45
|
+
readonly via?: string;
|
|
46
|
+
readonly expiresAt?: string;
|
|
47
|
+
readonly disabledAt?: string;
|
|
48
|
+
/** The principal id that wrote the membership (`grantedBy`). */
|
|
49
|
+
readonly grantedBy?: string;
|
|
50
|
+
/** Free-text justification recorded on the membership (`reason`). */
|
|
51
|
+
readonly reason?: string;
|
|
52
|
+
/** A subgroup column filling `member.group`. */
|
|
53
|
+
readonly group?: string;
|
|
54
|
+
/** A text column; the value `idp` marks the row as owned by the identity provider. */
|
|
55
|
+
readonly managedBy?: string;
|
|
56
|
+
/** A `text[]` column of seats. */
|
|
57
|
+
readonly seats?: string;
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
type MembershipJunctionOptions = Common & {
|
|
61
|
+
/** The declared scope every row is a membership of. */
|
|
62
|
+
readonly scope: string;
|
|
63
|
+
/** The user id column (default `user_id`), or a reference to a table that holds the user id. */
|
|
64
|
+
readonly user?: string | RoleThrough;
|
|
65
|
+
/** The column holding the scope instance id. Default `<scope>_id`. */
|
|
66
|
+
readonly id?: string;
|
|
67
|
+
/** Ancestor id columns keyed by scope name. */
|
|
68
|
+
readonly within?: Readonly<Record<string, string>>;
|
|
69
|
+
/**
|
|
70
|
+
* A role column, a reference to a roles table that holds the key, fixed
|
|
71
|
+
* roles every row holds (a contact table with no role column), or
|
|
72
|
+
* `{ sources }`: several role columns whose non-null keys the row holds.
|
|
73
|
+
*/
|
|
74
|
+
readonly roles: string | RoleThrough | readonly string[] | {
|
|
75
|
+
readonly sources: readonly (string | RoleThrough)[];
|
|
76
|
+
};
|
|
77
|
+
/** The membership kind every row has (`contact`, `staff`, `partner`). */
|
|
78
|
+
readonly via?: string;
|
|
79
|
+
readonly expiresAt?: string;
|
|
80
|
+
readonly disabledAt?: string;
|
|
81
|
+
/** The principal id that wrote the membership (`grantedBy`). */
|
|
82
|
+
readonly grantedBy?: string;
|
|
83
|
+
/** Free-text justification recorded on the membership (`reason`). */
|
|
84
|
+
readonly reason?: string;
|
|
85
|
+
/** A subgroup filling `member.group`: a fixed name every row has, or a column. */
|
|
86
|
+
readonly group?: string | {
|
|
87
|
+
readonly column: string;
|
|
88
|
+
};
|
|
89
|
+
/** `idp` when the identity provider owns every row, or a text column holding `idp` per row. */
|
|
90
|
+
readonly managedBy?: "idp" | {
|
|
91
|
+
readonly column: string;
|
|
92
|
+
};
|
|
93
|
+
/** A `text[]` column of seats. */
|
|
94
|
+
readonly seats?: string;
|
|
95
|
+
};
|
|
96
|
+
/** What `permdock supabase hook generate` compiles; the same SQL the source runs. */
|
|
97
|
+
type MembershipSql = {
|
|
98
|
+
readonly table: string;
|
|
99
|
+
/** The table's user column: the user id, or with `userThrough` the reference to the row holding it. */
|
|
100
|
+
readonly user: string;
|
|
101
|
+
/** The table that holds the user id when `user` references it; a change of that id bumps the old and the new user. */
|
|
102
|
+
readonly userThrough?: RoleKeys;
|
|
103
|
+
/** `<table>.<user>%type`: the PL/pgSQL type of the user id column, for a variable `select` compares with. */
|
|
104
|
+
readonly userType: string;
|
|
105
|
+
/**
|
|
106
|
+
* The `select` of claim rows for one user, with every filter applied.
|
|
107
|
+
* `user` must have the column's type (a `userType` variable, or an untyped
|
|
108
|
+
* `$1` Postgres infers): the column is compared uncast so its index applies.
|
|
109
|
+
* `keep` adds the `keep` column; it defaults to `keeps`, and a `union`
|
|
110
|
+
* with a source that keeps passes `true`.
|
|
111
|
+
*/
|
|
112
|
+
select(user: string, keep?: boolean): string;
|
|
113
|
+
/** The `select` of member rows for one scope instance (`$1` scope, `$2` id). */
|
|
114
|
+
list(keep?: boolean): string;
|
|
115
|
+
/** A suspended scope on the source keeps permissions: rows of its suspended instances stay, with a `keep` column. */
|
|
116
|
+
readonly keeps: boolean;
|
|
117
|
+
/** A text column holding `idp` for rows the identity provider owns; `''` when every row is owned. */
|
|
118
|
+
readonly managed?: string;
|
|
119
|
+
/** Other tables the `select` reads (suspension tables). */
|
|
120
|
+
readonly reads: readonly string[];
|
|
121
|
+
/** The roles table the role column references; a key change bumps every holder's authorization version. */
|
|
122
|
+
readonly through?: RoleKeys;
|
|
123
|
+
/** Every roles table the role columns reference, `through` first. */
|
|
124
|
+
readonly throughs: readonly RoleKeys[];
|
|
125
|
+
/** Every column that decides who holds which membership: user, scope, id, `within`, role, `via` and expiry. */
|
|
126
|
+
readonly columns: readonly string[];
|
|
127
|
+
/** For a single-scope source: its scope and the scopes whose ids each row carries. */
|
|
128
|
+
readonly scope?: string;
|
|
129
|
+
readonly holds?: readonly string[];
|
|
130
|
+
/** The source's entry in the hook manifest's `memberships`. */
|
|
131
|
+
readonly manifest: SupabaseManifestMembership;
|
|
132
|
+
/** What the ownership triggers count; absent on a source that is not a table. */
|
|
133
|
+
readonly holders?: MembershipHolders;
|
|
134
|
+
};
|
|
135
|
+
/**
|
|
136
|
+
* The rows of a membership table, for the holder-count and transfer-only
|
|
137
|
+
* triggers `permdock rls generate` puts on it. No suspension filter: a
|
|
138
|
+
* suspended holder still holds the role.
|
|
139
|
+
*/
|
|
140
|
+
type MembershipHolders = {
|
|
141
|
+
/** `<table>.<id column>%type`: the type of a variable `rows` compares the id column with. */
|
|
142
|
+
readonly idType: string;
|
|
143
|
+
/** The instance id of scope `scope` the PL/pgSQL record `row` holds, as text; null on a row of another scope. */
|
|
144
|
+
id(scope: string, row: string): string;
|
|
145
|
+
/**
|
|
146
|
+
* `select id, user_id, role, via, live` over the rows of scope `scope`
|
|
147
|
+
* in `from` (default the table): one row per held role key, `live` false
|
|
148
|
+
* once expired. `id` is an expression of `idType` the id column must equal.
|
|
149
|
+
*/
|
|
150
|
+
rows(scope: string, options?: {
|
|
151
|
+
readonly id?: string;
|
|
152
|
+
readonly from?: string;
|
|
153
|
+
}): string;
|
|
154
|
+
};
|
|
155
|
+
type SqlMembershipSource = MembershipSource & {
|
|
156
|
+
readonly sql: MembershipSql;
|
|
157
|
+
};
|
|
158
|
+
/** The part of `@supabase/server`'s `PostgresApi` a `SqlQuery` needs. */
|
|
159
|
+
type SupabasePostgres = {
|
|
160
|
+
readonly queryRaw: (text: string, params?: unknown[]) => Promise<readonly Record<string, unknown>[]>;
|
|
161
|
+
};
|
|
162
|
+
/**
|
|
163
|
+
* `ctx.postgres` (from `withPostgresClient`) or `ctx.postgresAdmin` as a
|
|
164
|
+
* `SqlQuery` for `fromTable`, `fromJunction` and `supabaseApprovalStore`.
|
|
165
|
+
* `ctx.postgres` runs as the caller under RLS, so the membership tables must
|
|
166
|
+
* be readable by `authenticated`; `ctx.postgresAdmin` bypasses RLS.
|
|
167
|
+
*/
|
|
168
|
+
declare function fromSupabasePostgres(postgres: SupabasePostgres): SqlQuery;
|
|
169
|
+
/**
|
|
170
|
+
* Memberships from one table holding every scope: a row per user, scope,
|
|
171
|
+
* instance and role (`user_id, scope, scope_id, role`), with optional
|
|
172
|
+
* `within`, `via`, expiry, owner and seat columns. Rows of the same instance
|
|
173
|
+
* merge into one membership.
|
|
174
|
+
*/
|
|
175
|
+
declare function fromTable(options: MembershipTableOptions): SqlMembershipSource;
|
|
176
|
+
/**
|
|
177
|
+
* Memberships from a table of one scope (`customer_contacts`): every row is a
|
|
178
|
+
* membership of `scope`, with roles from a column or fixed (`['contact']`), a
|
|
179
|
+
* fixed `via`, and ancestor ids from `within` columns.
|
|
180
|
+
*/
|
|
181
|
+
declare function fromJunction(options: MembershipJunctionOptions): SqlMembershipSource;
|
|
182
|
+
declare const AUTHZ_VERSION_TABLE = "permdock_authz_version";
|
|
183
|
+
/**
|
|
184
|
+
* Reads the authorization version `permdock supabase hook generate` keeps in
|
|
185
|
+
* `<schema>.permdock_authz_version`: pass it to `claimsFirst(sources, { version })`.
|
|
186
|
+
*/
|
|
187
|
+
declare function authzVersion(options: {
|
|
188
|
+
readonly query: SqlQuery;
|
|
189
|
+
readonly schema?: string;
|
|
190
|
+
}): NonNullable<MembershipSource["version"]>;
|
|
191
|
+
//#endregion
|
|
192
|
+
export { MembershipTableOptions as a, SupabasePostgres as c, fromSupabasePostgres as d, fromTable as f, MembershipSql as i, authzVersion as l, MembershipHolders as n, SqlMembershipSource as o, MembershipJunctionOptions as r, SqlQuery as s, AUTHZ_VERSION_TABLE as t, fromJunction as u };
|
|
@@ -18,5 +18,10 @@ function quoteSqlLiteral(value) {
|
|
|
18
18
|
function escapeSqlIdent(name) {
|
|
19
19
|
return `"${name.replaceAll("\"", "\"\"")}"`;
|
|
20
20
|
}
|
|
21
|
+
const PLAIN_IDENT = /^[a-z_][a-z0-9_]*$/u;
|
|
22
|
+
/** An identifier left bare when it is already lower snake case, otherwise quoted by `escapeSqlIdent`. */
|
|
23
|
+
function sqlIdent(name) {
|
|
24
|
+
return PLAIN_IDENT.test(name) ? name : escapeSqlIdent(name);
|
|
25
|
+
}
|
|
21
26
|
//#endregion
|
|
22
|
-
export { quoteSqlTable as a, quoteSqlLiteral as i, escapeSqlIdent as n, quoteSqlIdent as r, SQL_IDENT as t };
|
|
27
|
+
export { quoteSqlTable as a, quoteSqlLiteral as i, escapeSqlIdent as n, sqlIdent as o, quoteSqlIdent as r, SQL_IDENT as t };
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import { t as compact } from "./compact-y6vfu2_f.js";
|
|
2
|
-
import { n as freezeDeep } from "./freeze-
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
2
|
+
import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
|
|
3
|
+
import { i as findPermission } from "./permissions-DVoF6dMt.js";
|
|
4
|
+
import { b as assertSqlFunctionArg, i as declaredRoleNames, s as grantList, u as levelNames, v as normalizeWhere, x as assertSqlFunctionName, y as assertPortableTwin } from "./policy-xyWg7QdR.js";
|
|
5
|
+
import { d as scopeList, m as tenantOf } from "./scopes-CVdPrWN-.js";
|
|
6
|
+
import { r as snapshotGrant, t as buildSnapshot } from "./snapshot-Enxd0n-s.js";
|
|
7
|
+
import { T as listPlans, s as flattenGrantee } from "./grantee-Cv5Sogfv.js";
|
|
8
|
+
import { t as canonicalJson } from "./canonical-json-DemiK4Vp.js";
|
|
8
9
|
import { n as sha256, t as bytesToBase64Url } from "./sha256-BO0swRXL.js";
|
|
10
|
+
import { g as tenantsOf } from "./validity-uOp8UpYn.js";
|
|
9
11
|
import { n as isThenable } from "./thenable-okc2xDsj.js";
|
|
10
|
-
import {
|
|
12
|
+
import { a as collectSnapshotGrants, c as rankRoles, l as usesAssigns, m as ceilingGrants, n as resolveSubject, o as snapshotOf, s as snapshotScopes, u as declaredRoleNames$1, y as resolveCustomRole } from "./permdock-CzqXjCpU.js";
|
|
13
|
+
import { n as LOCAL_CUSTOM_ROLE } from "./parse-local-manifest-BrMozJCo.js";
|
|
11
14
|
//#region src/conditions/sql-function.ts
|
|
12
15
|
function sqlFunction(name, options) {
|
|
13
16
|
assertSqlFunctionName(name);
|
|
@@ -35,6 +38,41 @@ function memorySettings(settings) {
|
|
|
35
38
|
return byTenant.get(tenant);
|
|
36
39
|
} });
|
|
37
40
|
}
|
|
41
|
+
/** Memberships keyed by principal id; `tenant` is not a filter, as for a database source. */
|
|
42
|
+
function memoryMembershipSource(entries) {
|
|
43
|
+
const byPrincipal = new Map(Object.entries(entries));
|
|
44
|
+
return Object.freeze({
|
|
45
|
+
membershipsFor(principal) {
|
|
46
|
+
return [...byPrincipal.get(principal.id) ?? []];
|
|
47
|
+
},
|
|
48
|
+
list(query) {
|
|
49
|
+
const members = [];
|
|
50
|
+
for (const [id, memberships] of byPrincipal) for (const membership of memberships) if (membership.scope === query.scope && membership.id === query.id) members.push({
|
|
51
|
+
principal: { id },
|
|
52
|
+
membership
|
|
53
|
+
});
|
|
54
|
+
return members;
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
/** A snapshot held in memory; `set` replaces it and notifies every subscriber. */
|
|
59
|
+
function memorySnapshotSource(initial) {
|
|
60
|
+
let current = initial;
|
|
61
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
62
|
+
return Object.freeze({
|
|
63
|
+
get: () => current,
|
|
64
|
+
subscribe(listener) {
|
|
65
|
+
listeners.add(listener);
|
|
66
|
+
return () => {
|
|
67
|
+
listeners.delete(listener);
|
|
68
|
+
};
|
|
69
|
+
},
|
|
70
|
+
set(snapshot) {
|
|
71
|
+
current = snapshot;
|
|
72
|
+
for (const listener of listeners) listener();
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
}
|
|
38
76
|
function memoryRoleSource(customRoles) {
|
|
39
77
|
const byTenant = /* @__PURE__ */ new Map();
|
|
40
78
|
const global = [];
|
|
@@ -49,10 +87,10 @@ function memoryRoleSource(customRoles) {
|
|
|
49
87
|
}
|
|
50
88
|
return {
|
|
51
89
|
rolesFor(tenant) {
|
|
52
|
-
return byTenant.get(tenant) ?? [];
|
|
90
|
+
return [...byTenant.get(tenant) ?? []];
|
|
53
91
|
},
|
|
54
92
|
globalRoles() {
|
|
55
|
-
return global;
|
|
93
|
+
return [...global];
|
|
56
94
|
}
|
|
57
95
|
};
|
|
58
96
|
}
|
|
@@ -91,6 +129,83 @@ function fromStripeEntitlements(options) {
|
|
|
91
129
|
} };
|
|
92
130
|
}
|
|
93
131
|
//#endregion
|
|
132
|
+
//#region src/core/local-manifest.ts
|
|
133
|
+
/** A relation grantee needs the relation graph, which a device does not hold: the grant decides on the server only. */
|
|
134
|
+
function localGrant(grant) {
|
|
135
|
+
const relational = flattenGrantee(grant.to).some((item) => item.kind === "relation");
|
|
136
|
+
return snapshotGrant(relational ? {
|
|
137
|
+
...grant,
|
|
138
|
+
portable: false
|
|
139
|
+
} : grant, void 0);
|
|
140
|
+
}
|
|
141
|
+
function customTable(policy, scope, roles) {
|
|
142
|
+
const keys = [...new Set(ceilingGrants(policy, scope).map((grant) => grant.permission.key))];
|
|
143
|
+
if (keys.length === 0) return;
|
|
144
|
+
const resolve = (body) => resolveCustomRole(policy, scope === "global" ? {
|
|
145
|
+
name: LOCAL_CUSTOM_ROLE,
|
|
146
|
+
scope: "global",
|
|
147
|
+
...body
|
|
148
|
+
} : {
|
|
149
|
+
name: LOCAL_CUSTOM_ROLE,
|
|
150
|
+
tenant: LOCAL_CUSTOM_ROLE,
|
|
151
|
+
scope,
|
|
152
|
+
...body
|
|
153
|
+
}).grants.map(localGrant);
|
|
154
|
+
const permissions = {};
|
|
155
|
+
for (const key of keys) {
|
|
156
|
+
const leaf = findPermission(policy.permissions, key);
|
|
157
|
+
const names = leaf?.kind === "instance" ? levelNames(policy, leaf.resource) : [];
|
|
158
|
+
permissions[key] = compact({
|
|
159
|
+
all: resolve({ grants: [{ permission: key }] }),
|
|
160
|
+
levels: names.length === 0 ? void 0 : Object.fromEntries(names.map((level) => [level, resolve({ grants: [{
|
|
161
|
+
permission: key,
|
|
162
|
+
level
|
|
163
|
+
}] })]))
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
const includes = {};
|
|
167
|
+
for (const role of roles) {
|
|
168
|
+
const grants = resolve({ includes: [role] });
|
|
169
|
+
if (grants.length > 0) includes[role] = grants;
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
permissions,
|
|
173
|
+
includes
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* What the policy grants, as JSON a device turns into snapshots from its own
|
|
178
|
+
* membership rows (`localSnapshot` in `permdock/react-native`). Write it at
|
|
179
|
+
* build time; the policy itself never ships to the client.
|
|
180
|
+
*/
|
|
181
|
+
function localSnapshotManifest(policy) {
|
|
182
|
+
const roles = [...declaredRoleNames(policy)].toSorted();
|
|
183
|
+
const custom = {};
|
|
184
|
+
for (const scope of [...scopeList(policy.scopes).map((item) => item.name), "global"]) {
|
|
185
|
+
const table = customTable(policy, scope, roles);
|
|
186
|
+
if (table !== void 0) custom[scope] = table;
|
|
187
|
+
}
|
|
188
|
+
const scopes = snapshotScopes(policy);
|
|
189
|
+
const { vocabulary } = buildSnapshot({
|
|
190
|
+
subject: {
|
|
191
|
+
principal: null,
|
|
192
|
+
context: {}
|
|
193
|
+
},
|
|
194
|
+
roles: [],
|
|
195
|
+
grants: [],
|
|
196
|
+
vocabulary: policy.vocabulary
|
|
197
|
+
});
|
|
198
|
+
return freezeDeep(compact({
|
|
199
|
+
v: 1,
|
|
200
|
+
scopes,
|
|
201
|
+
vocabulary,
|
|
202
|
+
roles,
|
|
203
|
+
rank: usesAssigns(policy) ? rankRoles(policy, roles) : void 0,
|
|
204
|
+
grants: grantList(policy).map(localGrant),
|
|
205
|
+
custom
|
|
206
|
+
}));
|
|
207
|
+
}
|
|
208
|
+
//#endregion
|
|
94
209
|
//#region src/core/may-access.ts
|
|
95
210
|
function policyPlans(policy) {
|
|
96
211
|
const names = new Set(listPlans(policy.vocabulary?.plans).map((p) => p.key));
|
|
@@ -114,7 +229,7 @@ function mayAccess(policy, user, permission, options = {}) {
|
|
|
114
229
|
const principal = resolved.principal;
|
|
115
230
|
const relevant = policy.index.grantsByKey.get(permission.key) ?? [];
|
|
116
231
|
if (principal !== null) {
|
|
117
|
-
const declared = declaredRoleNames(policy);
|
|
232
|
+
const declared = declaredRoleNames$1(policy);
|
|
118
233
|
if (heldRoleNames(principal).some((name) => !declared.has(name))) return true;
|
|
119
234
|
if ((principal.memberships ?? []).length === 0 && relevant.some((grant) => grant.scope !== "global")) return true;
|
|
120
235
|
}
|
|
@@ -138,6 +253,29 @@ function mayAccess(policy, user, permission, options = {}) {
|
|
|
138
253
|
}
|
|
139
254
|
}
|
|
140
255
|
//#endregion
|
|
256
|
+
//#region src/core/custom-role-source.ts
|
|
257
|
+
function ofTenant(tenant, roles) {
|
|
258
|
+
return Array.isArray(roles) ? roles.filter((role) => role !== null && typeof role === "object" && Reflect.get(role, "tenant") === tenant) : [];
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* A `RoleSource` over a reader that returns every custom role of a tenant.
|
|
262
|
+
* It keeps only the roles of the requested tenant. With `read: 'held'` it
|
|
263
|
+
* skips a tenant's read, and `globalRoles`, when the subject holds only
|
|
264
|
+
* declared roles there.
|
|
265
|
+
*/
|
|
266
|
+
function customRoleSource(reader, options = {}) {
|
|
267
|
+
const declared = options.read === "held" ? declaredRoleNames(options.policy) : void 0;
|
|
268
|
+
return Object.freeze({
|
|
269
|
+
rolesFor(tenant, context) {
|
|
270
|
+
if (declared !== void 0 && context?.held.every((name) => declared.has(name)) === true) return [];
|
|
271
|
+
const roles = reader.rolesOf(tenant);
|
|
272
|
+
return isThenable(roles) ? roles.then((list) => ofTenant(tenant, list)) : ofTenant(tenant, roles);
|
|
273
|
+
},
|
|
274
|
+
...reader.assignable === void 0 ? {} : { assignable: (tenant) => reader.assignable?.(tenant) ?? [] },
|
|
275
|
+
...reader.globalRoles === void 0 ? {} : { globalRoles: (context) => declared !== void 0 && context?.held.every((name) => declared.has(name)) === true ? [] : reader.globalRoles?.() ?? [] }
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
//#endregion
|
|
141
279
|
//#region src/core/snapshot-for.ts
|
|
142
280
|
function withPlans(subject, plans) {
|
|
143
281
|
if (plans === void 0 || subject.principal === null) return subject;
|
|
@@ -427,4 +565,4 @@ function catalogFingerprint(catalog) {
|
|
|
427
565
|
return bytesToBase64Url(sha256(canonicalJson(fingerprintInput(catalog))));
|
|
428
566
|
}
|
|
429
567
|
//#endregion
|
|
430
|
-
export { accessToOcsf as a, readable as c,
|
|
568
|
+
export { memoryRoleSource as _, accessToOcsf as a, sqlFunction as b, readable as c, customRoleSource as d, mayAccess as f, memoryMembershipSource as g, memoryEntitlementSource as h, OCSF_VERSION as i, writable as l, fromStripeEntitlements as m, CSV_COLUMNS as n, toOcsf as o, localSnapshotManifest as p, toCsvRow as r, crud as s, catalogFingerprint as t, snapshotFor as u, memorySettings as v, memorySnapshotSource as y };
|
package/dist/ssf/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { C as SsfPermDock, D as SsfSubjectMapper, E as SsfSubject, S as SsfOnEvent, T as SsfReceiver, _ as SetSubject, b as SsfEventInput, f as CaepEventName, g as ReplayStore, h as PollResult, m as PollOptions, p as PollHandle, v as SsfAuditEvent, w as SsfPermDockOptions, x as SsfEventListener, y as SsfEventHandler } from "../types-9AWO9EGt.js";
|
|
2
|
+
import { t as memoryReplayStore } from "../replay-sqBGMnNs.js";
|
|
3
|
+
import { t as createPermDock } from "../index-CtE07CBF.js";
|
|
3
4
|
export { type CaepEventName, type PollHandle, type PollOptions, type PollResult, type ReplayStore, type SetSubject, type SsfAuditEvent, type SsfEventHandler, type SsfEventInput, type SsfEventListener, type SsfOnEvent, type SsfPermDock, type SsfPermDockOptions, type SsfReceiver, type SsfSubject, type SsfSubjectMapper, createPermDock, memoryReplayStore };
|
package/dist/ssf/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { t as compact } from "../compact-y6vfu2_f.js";
|
|
2
|
-
import { t as cancelApprovals } from "../helpers-
|
|
3
|
-
import { i as issuerFromDiscovery, t as joseTokenVerifier } from "../verifier-
|
|
2
|
+
import { t as cancelApprovals } from "../helpers-H_KARDVC.js";
|
|
3
|
+
import { i as issuerFromDiscovery, t as joseTokenVerifier } from "../verifier-BxBo6I44.js";
|
|
4
|
+
import { t as memoryReplayStore } from "../replay-BsOyTrdV.js";
|
|
4
5
|
import { t as timeoutSignal } from "../timeout-D51niuQP.js";
|
|
5
6
|
//#region src/ssf/wire.ts
|
|
6
7
|
const SET_TYP = "secevent+jwt";
|
|
@@ -564,33 +565,6 @@ function createReceiver(config) {
|
|
|
564
565
|
};
|
|
565
566
|
}
|
|
566
567
|
//#endregion
|
|
567
|
-
//#region src/ssf/replay.ts
|
|
568
|
-
function memoryReplayStore() {
|
|
569
|
-
const seen = /* @__PURE__ */ new Map();
|
|
570
|
-
function evict(now = Date.now() / 1e3) {
|
|
571
|
-
for (const [jti, expiresAt] of seen) if (expiresAt !== void 0 && expiresAt <= now) seen.delete(jti);
|
|
572
|
-
}
|
|
573
|
-
return {
|
|
574
|
-
seen(jti) {
|
|
575
|
-
evict();
|
|
576
|
-
return seen.has(jti);
|
|
577
|
-
},
|
|
578
|
-
remember(jti, expiresAt) {
|
|
579
|
-
evict();
|
|
580
|
-
seen.set(jti, expiresAt);
|
|
581
|
-
},
|
|
582
|
-
claim(key, expiresAt) {
|
|
583
|
-
evict();
|
|
584
|
-
if (seen.has(key)) return false;
|
|
585
|
-
seen.set(key, expiresAt);
|
|
586
|
-
return true;
|
|
587
|
-
},
|
|
588
|
-
release(key) {
|
|
589
|
-
seen.delete(key);
|
|
590
|
-
}
|
|
591
|
-
};
|
|
592
|
-
}
|
|
593
|
-
//#endregion
|
|
594
568
|
//#region src/ssf/create.ts
|
|
595
569
|
function createPermDock(policy, options) {
|
|
596
570
|
if (typeof options.subject !== "function") throw new TypeError("PermDock: permdock/ssf requires subject.");
|