permdock 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +106 -47
- package/dist/a2a/index.d.ts +7 -16
- package/dist/a2a/index.js +59 -98
- package/dist/adapter-context-mlWsVGGg.js +23 -0
- package/dist/ai-sdk/index.d.ts +37 -16
- package/dist/ai-sdk/index.js +30 -13
- package/dist/approvals/index.d.ts +3 -3
- package/dist/approvals/index.js +5 -4
- package/dist/{approvals-DaxY-Bdg.js → approvals-DbYAuNkG.js} +17 -11
- package/dist/approvers-DT4AVyIg.js +52 -0
- package/dist/{arazzo-CTeVuXr5.js → arazzo-BAgw9ap6.js} +2 -2
- package/dist/{arazzo-aoTkqYsJ.js → arazzo-cmvX2jDe.js} +2 -2
- package/dist/authzen/index.d.ts +4 -13
- package/dist/authzen/index.js +16 -50
- package/dist/better-auth/index.d.ts +20 -3
- package/dist/better-auth/index.js +27 -7
- package/dist/better-supabase/index.d.ts +206 -0
- package/dist/better-supabase/index.js +620 -0
- package/dist/bind-CVy3Espv.d.ts +25 -0
- package/dist/bind-VnYn2HKq.js +97 -0
- package/dist/boundary-BM8a_P6E.js +13 -0
- package/dist/boundary-BmHxVH1J.d.ts +15 -0
- package/dist/canonical-json-DemiK4Vp.js +26 -0
- package/dist/{capability-B68OFnZx.js → capability-4qPdO9gk.js} +7 -5
- package/dist/{capability-BDG_nkxt.d.ts → capability-Dq43tT1u.d.ts} +2 -2
- package/dist/catalog/index.d.ts +1 -1
- package/dist/catalog/index.js +1 -1
- package/dist/catalog-BjZSovXQ.js +2 -0
- package/dist/{catalog-doc-BSo_Q_-6.js → catalog-doc-Dsc9y7sd.js} +23 -12
- package/dist/{catalog-B0E6bggc.js → catalog-h2tlKFkq.js} +2 -2
- package/dist/{catalog-H-vFGwWK.js → catalog-z8q6bi_r.js} +4 -4
- package/dist/claude-agent/index.d.ts +5 -14
- package/dist/claude-agent/index.js +4 -10
- package/dist/clerk/index.d.ts +12 -3
- package/dist/clerk/index.js +26 -5
- package/dist/cli/bin.js +1 -1
- package/dist/cli/index.d.ts +3 -3
- package/dist/cli/index.js +2 -2
- package/dist/clients-C7zLFuWT.d.ts +12 -0
- package/dist/clients-DjU5ABMy.js +23 -0
- package/dist/cloud/index.d.ts +4 -5
- package/dist/cloud/index.js +20 -6
- package/dist/{cloud-BNQTrmrr.js → cloud-BGhHS-lY.js} +2 -2
- package/dist/{cloud-Cuxr6Czw.js → cloud-Bo3e9Ak3.js} +7 -6
- package/dist/{collect-O-tOtbnk.js → collect-DDDv_ESs.js} +194 -42
- package/dist/collect-DLlujdHC.js +83 -0
- package/dist/collect-rG2IQ3t0.js +2 -0
- package/dist/{commands-BMh_Etm2.js → commands-DWOrSQic.js} +16 -12
- package/dist/compile/index.d.ts +3 -0
- package/dist/compile/index.js +2 -0
- package/dist/{compile-D22iwvuV.js → compile-Ba4blROR.js} +85 -30
- package/dist/compile-CNnl6uIt.d.ts +94 -0
- package/dist/config-BJiM-xAm.js +157 -0
- package/dist/config-Bn00Z3ks.js +36 -0
- package/dist/config-report-Dw_JcUqT.js +44 -0
- package/dist/{connection-JvqwHODC.js → connection-CU8MQxRi.js} +1 -1
- package/dist/{context-CKEAabd7.js → context-Ttp0ekMT.js} +36 -27
- package/dist/convex/index.d.ts +9 -4
- package/dist/convex/index.js +14 -4
- package/dist/create-BWyx3jua.d.ts +245 -0
- package/dist/create-CPhDL6qx.js +253 -0
- package/dist/{credential-B_rkUNlY.js → credential-8P81ff4u.js} +26 -46
- package/dist/delegation-D8pUEuce.js +103 -0
- package/dist/{describe-Bt1YD5uS.js → describe-B_gVZEVi.js} +10 -15
- package/dist/{describe-DernyItf.d.ts → describe-PdoqESvg.d.ts} +9 -10
- package/dist/{diff-x5Il8LVa.js → diff-B8Tunc3o.js} +44 -11
- package/dist/{diff-BUzf5Poi.js → diff-CzqLxZ77.js} +2 -2
- package/dist/doctor-WpvG6p4k.js +1194 -0
- package/dist/doctor-collect-ByfYlNv1.js +664 -0
- package/dist/{doctor-Bqo6FwUa.js → doctor-rOr-4ZfS.js} +2 -2
- package/dist/drizzle/index.d.ts +4 -3
- package/dist/drizzle/index.js +3 -3
- package/dist/elysia/index.d.ts +6 -28
- package/dist/elysia/index.js +16 -60
- package/dist/{errors-DSMnAVNa.js → errors-CWfoNg9N.js} +8 -4
- package/dist/{errors-Iy71s7Oj.js → errors-Cz5zn0mW.js} +17 -71
- package/dist/{errors-DbZ1YOnb.d.ts → errors-DAqevpNk.d.ts} +8 -21
- package/dist/{errors-m3u9TmDu.js → errors-DRnGZHzF.js} +4 -1
- package/dist/evaluation-items-CfCCejQd.js +40 -0
- package/dist/{evaluations-DsAU9ppl.js → evaluations-tz6D9A2G.js} +28 -46
- package/dist/eve/index.d.ts +6 -15
- package/dist/eve/index.js +7 -12
- package/dist/expiry-BoBJ8Tvc.js +7 -0
- package/dist/express/index.d.ts +6 -29
- package/dist/express/index.js +28 -58
- package/dist/fastify/index.d.ts +6 -29
- package/dist/fastify/index.js +16 -65
- package/dist/fields-BMl1RxoX.js +26 -0
- package/dist/{files-B_wAGYmt.js → files-DWUN9PzI.js} +5 -1
- package/dist/{fixtures-Cvaw0gDG.js → fixtures-ht28Cplr.js} +5 -2
- package/dist/{freeze-y1_jQL4v.js → freeze-CrU8nQeX.js} +31 -2
- package/dist/{from-snapshot-BMGnhmgv.js → from-snapshot-C3sHpZNS.js} +65 -48
- package/dist/{grantee-Bv04_Vzf.js → grantee-Cv5Sogfv.js} +88 -7
- package/dist/graph-sql-B-dsAT6j.d.ts +29 -0
- package/dist/{headers-B5RRv3Xm.js → headers-BZSDieNT.js} +1 -1
- package/dist/{headers-C8SHQccD.d.ts → headers-Cf-zWvsO.d.ts} +1 -1
- package/dist/helpers-H_KARDVC.js +421 -0
- package/dist/hono/index.d.ts +6 -28
- package/dist/hono/index.js +11 -43
- package/dist/{hosted-BwKQ1BTA.js → hosted-DJQw46hn.js} +6 -5
- package/dist/{http-GgVApX1k.js → http-BIhmLfCc.js} +4 -20
- package/dist/http-SO7qGttf.js +44 -0
- package/dist/ids-DC4V4CFu.js +18 -0
- package/dist/{index-LF_hS-yn.d.ts → index-A0YNL8jZ.d.ts} +1 -1
- package/dist/index-CtE07CBF.d.ts +6 -0
- package/dist/{index-xIxJLwOQ.d.ts → index-D3vbkoSI.d.ts} +75 -7
- package/dist/{index-CltcQ4Bf.d.ts → index-D6_cSa1z.d.ts} +68 -5
- package/dist/index.d.ts +14 -9
- package/dist/index.js +22 -17
- package/dist/instance-options-BK_rNOSC.d.ts +11 -0
- package/dist/instance-options-Dhhcnm3y.js +22 -0
- package/dist/{parse-DPfIvFMU.js → json-schema-BsAflUGW.js} +28 -57
- package/dist/jwt/index.d.ts +10 -6
- package/dist/jwt/index.js +32 -13
- package/dist/kernel-GSQnMz3O.js +208 -0
- package/dist/kysely/index.d.ts +4 -3
- package/dist/kysely/index.js +3 -3
- package/dist/live-options-H2eG8dfJ.js +60 -0
- package/dist/{load-BZ24CpZP.js → load-DhWEB9P1.js} +16 -10
- package/dist/load-DwJUafYN.js +2 -0
- package/dist/manifest-iaoBXHKc.js +783 -0
- package/dist/manifest-uDS9y5de.d.ts +206 -0
- package/dist/{map-DowSO96j.js → map-AcxK9o_D.js} +4 -15
- package/dist/{map-claims-B_6I1Rn-.js → map-claims-Z4QZOiFF.js} +13 -4
- package/dist/map-error-pgUWNNtG.js +23 -0
- package/dist/may-use-DndQ5tQ-.js +77 -0
- package/dist/mcp/index.d.ts +54 -22
- package/dist/mcp/index.js +218 -178
- package/dist/nest/index.d.ts +26 -31
- package/dist/nest/index.js +75 -84
- package/dist/next/client.d.ts +7 -8
- package/dist/next/client.js +11 -9
- package/dist/next/index.d.ts +30 -47
- package/dist/next/index.js +45 -60
- package/dist/next/plugin.d.ts +1 -1
- package/dist/next/plugin.js +32 -1
- package/dist/node/index.d.ts +9 -28
- package/dist/node/index.js +11 -43
- package/dist/openai/index.d.ts +6 -15
- package/dist/openai/index.js +7 -20
- package/dist/openapi/index.d.ts +87 -4
- package/dist/openapi/index.js +3 -3
- package/dist/{openapi-CwePaF7C.js → openapi-Bbg4wGVL.js} +3 -3
- package/dist/{openapi-DcqM8nU7.js → openapi-BqRBvAng.js} +237 -5
- package/dist/{openapi-DWD0Uc_4.js → openapi-CqqEbHsL.js} +5 -5
- package/dist/{openapi-import-BWRUNNeW.js → openapi-import-cmwetbzw.js} +1 -1
- package/dist/{openapi-schema-D8j_T9tO.js → openapi-schema--ARjyfQr.js} +2 -2
- package/dist/orpc/index.d.ts +15 -28
- package/dist/orpc/index.js +74 -117
- package/dist/otel/index.d.ts +2 -2
- package/dist/parse-BuyjxhZV.js +53 -0
- package/dist/parse-local-manifest-BkGQNzAh.d.ts +10 -0
- package/dist/parse-local-manifest-BrMozJCo.js +36 -0
- package/dist/pdp/index.d.ts +2 -2
- package/dist/pdp/index.js +14 -127
- package/dist/{permdock-yoZ7EjxX.js → permdock-CzqXjCpU.js} +641 -126
- package/dist/{permissions-B8vCg_bI.d.ts → permissions-CDgvKG5L.d.ts} +2 -2
- package/dist/{permissions-CofRqesP.js → permissions-CpZrivYv.js} +3 -3
- package/dist/{permissions-DC7GROPA.js → permissions-DVoF6dMt.js} +77 -15
- package/dist/{permissions-B4apnahQ.d.ts → permissions-DttnqqxC.d.ts} +34 -5
- package/dist/{pins-CqE1jZuF.js → pins-8ILTftC9.js} +2 -2
- package/dist/{policy-CInmNGkM.d.ts → policy-CFZAr_Al.d.ts} +330 -37
- package/dist/{policy-Cq2fB8Q5.d.ts → policy-D8UFyERw.d.ts} +2 -2
- package/dist/{policy-ANp36PnI.js → policy-xyWg7QdR.js} +173 -22
- package/dist/powersync-A8x_Yyvh.js +2 -0
- package/dist/powersync-C7kLglqX.js +540 -0
- package/dist/powersync-yW1UUFzp.js +62 -0
- package/dist/prisma/index.d.ts +3 -2
- package/dist/prisma/index.js +45 -20
- package/dist/{problem-Cgp9-KZA.js → problem-B43ztKIm.js} +74 -109
- package/dist/problem-details-CkL50EEf.d.ts +7 -0
- package/dist/problem-details-_AMOYz-w.js +144 -0
- package/dist/{protected-BuPAycJT.d.ts → protected-CNsMzrVd.d.ts} +5 -4
- package/dist/protected-Cs6kTaHo.js +100 -0
- package/dist/protected-bZs6rbT1.d.ts +40 -0
- package/dist/{provider-wTAUda2v.d.ts → provider-Cjr62YMV.d.ts} +1 -1
- package/dist/provider-DLzpb2Xz.js +52 -0
- package/dist/provider-store-DNyC1y48.js +43 -0
- package/dist/react/index.d.ts +7 -5
- package/dist/react/index.js +5 -4
- package/dist/react/provider-client.d.ts +1 -1
- package/dist/react/provider-client.js +1 -1
- package/dist/react-native/index.d.ts +166 -10
- package/dist/react-native/index.js +607 -85
- package/dist/{refs-ChLSxbST.js → refs-KYb4ntaz.js} +4 -3
- package/dist/{relations-r4soIFZB.js → relations-cjOL01hZ.js} +110 -31
- package/dist/replay-BsOyTrdV.js +28 -0
- package/dist/replay-sqBGMnNs.d.ts +5 -0
- package/dist/resource-ref-CaS9yVPi.js +20 -0
- package/dist/revocations-Bhr0aMIC.js +27 -0
- package/dist/rls-BMNydpHk.js +2521 -0
- package/dist/{rls-BOFU3chG.js → rls-CEvs64Kj.js} +8 -3
- package/dist/rls-fields-BMasREhR.js +3502 -0
- package/dist/{rls-graph-DxQ39PJj.js → rls-graph-pc9fuXYm.js} +100 -36
- package/dist/{rls-import-CXV6LBlS.js → rls-import-D8F7j35Q.js} +7 -6
- package/dist/{rls-migrate-DrFPbf8p.js → rls-migrate-7wikfrVI.js} +6 -5
- package/dist/rls-ownership-B5Lkq62W.js +843 -0
- package/dist/rls-shared-aOQ4hGTO.js +493 -0
- package/dist/rls-verify-D8B7dOTh.js +745 -0
- package/dist/{row-check-BajTgQZ-.d.ts → row-check-Dt35czLy.d.ts} +12 -15
- package/dist/rpc-DOK54_CS.js +89 -0
- package/dist/{run-CJ6UvS3a.js → run-YXCJDNYk.js} +31 -12
- package/dist/runtime-CB8gQFvS.js +11 -0
- package/dist/{saas-BRrZzJkM.js → saas-Bj_FFkjN.js} +17 -7
- package/dist/{schema-P8yoma__.js → schema-D3MnDMxa.js} +8 -4
- package/dist/scim/index.d.ts +1 -1
- package/dist/scim/index.js +1 -1
- package/dist/{scim-9NFa0XVZ.js → scim-BFGBBAqR.js} +1 -1
- package/dist/{scopes-cKVp_WTw.js → scopes-CVdPrWN-.js} +35 -8
- package/dist/server/index.d.ts +22 -11
- package/dist/server/index.js +11 -8
- package/dist/{credentials-BgRX3WEg.js → server-DlZ28Oz5.js} +1 -1
- package/dist/shared-DRu8VFVM.js +123 -0
- package/dist/{sink-Cfr9-7YC.d.ts → sink-Gs6TTVa-.d.ts} +1 -1
- package/dist/skills-Biq5uup3.js +192 -0
- package/dist/{skills-C_lpV4Jx.js → skills-JaymNCdK.js} +10 -4
- package/dist/{snapshot-DE8dE_hz.js → snapshot-Enxd0n-s.js} +138 -214
- package/dist/snapshot-cache-D6jLelln.js +44 -0
- package/dist/snapshot-cache-DwQH8ufx.d.ts +45 -0
- package/dist/solid/index.d.ts +39 -9
- package/dist/solid/index.js +76 -85
- package/dist/sources-B0UvrJ21.js +534 -0
- package/dist/sources-BcJgw0lt.d.ts +192 -0
- package/dist/{sql-Bll1d7y0.js → sql-xdg5f4Fi.js} +6 -1
- package/dist/{src-CTNT-PBW.js → src-CSbUiozF.js} +149 -11
- package/dist/ssf/index.d.ts +3 -2
- package/dist/ssf/index.js +3 -29
- package/dist/store-DMAWwAJV.js +371 -0
- package/dist/{store-Bq90395i.d.ts → store-D_pjn91-.d.ts} +13 -4
- package/dist/store-options-yO0V6gRn.js +716 -0
- package/dist/{stores-CkG2HrSg.js → stores-4_sqiOA1.js} +10 -63
- package/dist/{stores-CvOnu_2T.d.ts → stores-DVR5NHLE.d.ts} +20 -9
- package/dist/{stream-Q_xlB6Ko.js → stream-DDpvynSB.js} +16 -2
- package/dist/{stream-BhMfZOwr.d.ts → stream-DlvG2hs-.d.ts} +2 -2
- package/dist/subject-settings-BwBmCdTR.js +128 -0
- package/dist/supabase/index.d.ts +122 -6
- package/dist/supabase/index.js +4 -3
- package/dist/supabase/middleware.d.ts +32 -27
- package/dist/supabase/middleware.js +56 -22
- package/dist/{supabase-D8UlBA7Z.js → supabase-CwafwxxF.js} +3 -3
- package/dist/{supabase-DTxGtYdi.js → supabase-DTBaC20O.js} +345 -367
- package/dist/supabase-config-Bs44dare.js +472 -0
- package/dist/{supabase-hook-D_OqGb_V.js → supabase-hook-BuxLQLpU.js} +994 -708
- package/dist/supabase-hook-D5qVd_D8.js +2 -0
- package/dist/supautils-DYZnzRWV.js +91 -0
- package/dist/svelte/PermissionBoundary.svelte +37 -0
- package/dist/svelte/Protected.svelte +8 -2
- package/dist/svelte/index.d.ts +9 -6
- package/dist/svelte/index.js +61 -7
- package/dist/svelte/runtime.d.ts +4 -3
- package/dist/svelte/runtime.js +4 -3
- package/dist/svelte/source.d.ts +9 -6
- package/dist/svelte/source.js +7 -4
- package/dist/terminal/index.d.ts +6 -14
- package/dist/terminal/index.js +44 -32
- package/dist/testing/index.d.ts +105 -16
- package/dist/testing/index.js +504 -40
- package/dist/testing/saas/index.d.ts +4 -4
- package/dist/testing/saas/index.js +2 -2
- package/dist/testing/saas/permissions.d.ts +1 -1
- package/dist/testing/saas/permissions.js +1 -1
- package/dist/token-CIWxJOCh.js +50 -0
- package/dist/trpc/index.d.ts +7 -26
- package/dist/trpc/index.js +17 -100
- package/dist/types-9AWO9EGt.d.ts +197 -0
- package/dist/{types-D6Z6-rKJ.d.ts → types-BPxgszlT.d.ts} +260 -22
- package/dist/{types-BvBk1wgn.d.ts → types-BVyImy5I.d.ts} +5 -3
- package/dist/{types-CxquUByI.d.ts → types-Bvc4oWT6.d.ts} +1 -1
- package/dist/types-C3s9xVJG.d.ts +48 -0
- package/dist/{types-BBK-exvJ.d.ts → types-Dnemwd77.d.ts} +7 -1
- package/dist/types-kxznc7cn.d.ts +52 -0
- package/dist/{types-B8w5PFtS.d.ts → types-vKyAMtcX.d.ts} +17 -1
- package/dist/{types-B9dmiiab.d.ts → types-vNSDF7Dq.d.ts} +1 -1
- package/dist/{sources-DOpW5Ila.d.ts → types-yF5LmQVD.d.ts} +86 -127
- package/dist/unplugin/index.d.ts +1 -1
- package/dist/unplugin/index.js +10 -9
- package/dist/{usage-1ozMubLY.js → usage-D07N9QJ3.js} +2 -2
- package/dist/usage-D82l1CwK.js +2 -0
- package/dist/{usage-CUnK6Ou9.js → usage-DG1oeCca.js} +225 -62
- package/dist/validation-error-CnjZ4t92.js +33 -0
- package/dist/validation-error-CtF23SrC.d.ts +26 -0
- package/dist/{validity-D0uRmJKJ.js → validity-uOp8UpYn.js} +57 -36
- package/dist/{verifier-B90agnhl.js → verifier-BxBo6I44.js} +10 -5
- package/dist/version-BvacVTZR.js +17 -0
- package/dist/views-Soe7bGSC.js +95 -0
- package/dist/{vocabulary-Dk0fs-Jk.d.ts → vocabulary-DA8a8zif.d.ts} +1 -1
- package/dist/vue/index.d.ts +35 -13
- package/dist/vue/index.js +86 -93
- package/dist/watch-Etoa_Mvr.js +2 -0
- package/dist/watch-UihESpsJ.js +128 -0
- package/dist/webmcp/index.d.ts +2 -2
- package/dist/webmcp/index.js +7 -13
- package/package.json +62 -36
- package/schemas/approval-request-v1.json +175 -0
- package/schemas/catalog-v1.json +29 -1
- package/schemas/supabase-claims-v1.json +6 -1
- package/schemas/supabase-manifest-v1.json +150 -6
- package/skills/permdock/SKILL.md +7 -7
- package/skills/permdock-agents/SKILL.md +5 -5
- package/skills/permdock-agents/references/runtimes.md +12 -10
- package/skills/permdock-approvals/SKILL.md +4 -4
- package/skills/permdock-approvals/references/stores-and-resume.md +15 -4
- package/skills/permdock-audit/SKILL.md +3 -3
- package/skills/permdock-credentials/SKILL.md +4 -4
- package/skills/permdock-credentials/references/tokens-keys-links.md +7 -2
- package/skills/permdock-data/SKILL.md +4 -4
- package/skills/permdock-data/references/queries-and-rls.md +14 -6
- package/skills/permdock-data/references/relationships.md +5 -3
- package/skills/permdock-tenancy/SKILL.md +9 -6
- package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +14 -8
- package/skills/permdock-wire/SKILL.md +4 -4
- package/skills/permdock-wire/references/adapters.md +42 -30
- package/skills/permdock-wire/references/policy-options.md +5 -3
- package/dist/approvers-aH0PJkmf.js +0 -20
- package/dist/catalog-idsHc0vo.js +0 -2
- package/dist/collect-B7_TIfmg.js +0 -49
- package/dist/collect-fRPAQIWb.js +0 -2
- package/dist/compile-CQbvyIBr.d.ts +0 -30
- package/dist/config-BPYmjTOp.js +0 -26
- package/dist/context-gtAwAILx.js +0 -6
- package/dist/create-BKF3dgFk.d.ts +0 -162
- package/dist/create-CSkhDU9T.js +0 -222
- package/dist/doctor-BGle8Gqi.js +0 -1314
- package/dist/helpers-DnSOrhB9.js +0 -682
- package/dist/index-fG6NSXlc.d.ts +0 -9
- package/dist/kernel-YOGCWNLf.js +0 -211
- package/dist/load-QOOm1z70.js +0 -2
- package/dist/manifest-DDQbC6K0.d.ts +0 -118
- package/dist/map-error-RJ3ZsUyA.js +0 -16
- package/dist/may-use-CnFEjVEp.js +0 -37
- package/dist/pg-4GJWDUxG.js +0 -953
- package/dist/plugin-4gr7IxFJ.js +0 -65
- package/dist/protected-B4K3BKoX.js +0 -138
- package/dist/protected-wY7nXhY9.d.ts +0 -23
- package/dist/provider-_wx46HpB.js +0 -48
- package/dist/rls-CJVja9Ww.js +0 -2119
- package/dist/rls-helpers-BxRuif0l.js +0 -1346
- package/dist/runtime-DP9ttFh1.js +0 -27
- package/dist/skills-Dx3QLnMY.js +0 -110
- package/dist/source-DoBBYJi2.js +0 -6
- package/dist/sources-DVHM3Mwq.js +0 -284
- package/dist/store-C6hFW6ta.js +0 -508
- package/dist/subject-settings-xt7V845g.js +0 -82
- package/dist/supabase-hook-DW-xP4hU.js +0 -2
- package/dist/types-DbWdEfcm.d.ts +0 -87
- package/dist/types-bva3i4Gf.d.ts +0 -98
- package/dist/types-i4BAOvdb.d.ts +0 -97
- package/dist/usage-PyEor6GA.js +0 -2
- package/dist/version-CnSh33Fj.js +0 -16
|
@@ -1,29 +1,35 @@
|
|
|
1
1
|
import { t as compact } from "./compact-y6vfu2_f.js";
|
|
2
|
-
import { n as freezeDeep } from "./freeze-
|
|
3
|
-
import {
|
|
4
|
-
import { a as
|
|
5
|
-
import {
|
|
6
|
-
import { a as
|
|
7
|
-
import { a as whereFromGrants,
|
|
8
|
-
import {
|
|
2
|
+
import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
|
|
3
|
+
import { _ as listPermissions } from "./permissions-DVoF6dMt.js";
|
|
4
|
+
import { a as deniedMessage, i as approvalMessage, n as PermDockDeniedError, t as PermDockApprovalRequiredError } from "./errors-Cz5zn0mW.js";
|
|
5
|
+
import { n as sameId } from "./ids-DC4V4CFu.js";
|
|
6
|
+
import { a as normalizeMemberships, d as scopeList, m as tenantOf, o as resolveScope, t as activeFor } from "./scopes-CVdPrWN-.js";
|
|
7
|
+
import { a as whereFromGrants, c as rowIdOf, d as isArazzoSimulateInput, f as simulateArazzo, i as signSnapshot, l as rowValues, p as evaluateCondition } from "./snapshot-Enxd0n-s.js";
|
|
8
|
+
import { D as synthesiseRole, E as listRoles, S as findRole, d as matchGrantee } from "./grantee-Cv5Sogfv.js";
|
|
9
|
+
import { n as pickVisible, t as grantCoversField } from "./fields-BMl1RxoX.js";
|
|
10
|
+
import { a as isMembershipExpired, i as inTeam, l as nestedAppliesWithoutRow, m as rowInScope, p as resolveActiveTenant, t as isActive, u as nowSeconds } from "./validity-uOp8UpYn.js";
|
|
9
11
|
import { t as requiresApproval } from "./approval-required-TzNB9oQA.js";
|
|
12
|
+
import { t as coveredByDelegation } from "./delegation-D8pUEuce.js";
|
|
13
|
+
import { t as resourceIdOf } from "./resource-ref-CaS9yVPi.js";
|
|
14
|
+
import { n as payloadDigest, t as decisionToken } from "./token-CIWxJOCh.js";
|
|
10
15
|
//#region src/core/snapshot-evaluate.ts
|
|
11
|
-
function isRowPair(value) {
|
|
12
|
-
return value !== null && typeof value === "object" && "current" in value && "next" in value;
|
|
13
|
-
}
|
|
14
16
|
function coveredByInclude(snapshot, permission) {
|
|
15
17
|
const include = snapshot.include;
|
|
16
18
|
if (include === void 0 || include.length === 0) return true;
|
|
17
19
|
return include.some((prefix) => permission.key === prefix || permission.key.startsWith(`${prefix}.`) || permission.resource === prefix);
|
|
18
20
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const
|
|
22
|
-
return
|
|
21
|
+
/** The field of `resource` that holds scope `name`'s id in a snapshot: its `fields` entry, else the scope's key. */
|
|
22
|
+
function snapshotField(snapshot, name, resource) {
|
|
23
|
+
const entry = snapshot.scopes?.find((item) => item.name === name);
|
|
24
|
+
return entry?.fields?.[resource] ?? entry?.key;
|
|
23
25
|
}
|
|
24
|
-
function scopeOk(snapshot, grant, permission, subject, data, team, now) {
|
|
26
|
+
function scopeOk(snapshot, grant, permission, subject, data, team, now, only) {
|
|
25
27
|
const scope = grant.scope;
|
|
26
28
|
if (scope === void 0) return { ok: true };
|
|
29
|
+
if (only !== void 0 && scope !== only) return {
|
|
30
|
+
ok: false,
|
|
31
|
+
reason: "scope"
|
|
32
|
+
};
|
|
27
33
|
const principal = subject.principal;
|
|
28
34
|
const membership = grant.membership;
|
|
29
35
|
if (principal === null || membership === void 0) return {
|
|
@@ -48,16 +54,19 @@ function scopeOk(snapshot, grant, permission, subject, data, team, now) {
|
|
|
48
54
|
ok: false,
|
|
49
55
|
reason: "scope"
|
|
50
56
|
};
|
|
51
|
-
if (
|
|
57
|
+
if (data === null || typeof data !== "object") return permission.kind !== "instance" || nestedAppliesWithoutRow(membership, scopes, data, team) ? { ok: true } : {
|
|
58
|
+
ok: false,
|
|
59
|
+
reason: "scope"
|
|
60
|
+
};
|
|
52
61
|
const partitioned = (name) => snapshot.scopes?.find((entry) => entry.name === name)?.resources?.includes(permission.resource) === true;
|
|
53
|
-
return rowInScope(membership, scopes, data
|
|
62
|
+
return rowInScope(membership, scopes, data, partitioned, (name) => snapshotField(snapshot, name, permission.resource));
|
|
54
63
|
}
|
|
55
64
|
const on = membership.on;
|
|
56
65
|
if (on === void 0 || on.resource !== scope.resource || on.resource !== permission.resource) return {
|
|
57
66
|
ok: false,
|
|
58
67
|
reason: "scope"
|
|
59
68
|
};
|
|
60
|
-
if (on.id !==
|
|
69
|
+
if (on.id !== rowIdOf(data, snapshot.ids?.[permission.resource])) return {
|
|
61
70
|
ok: false,
|
|
62
71
|
reason: "scope"
|
|
63
72
|
};
|
|
@@ -123,15 +132,16 @@ function matchedOf(grant) {
|
|
|
123
132
|
approval: grant.approval
|
|
124
133
|
});
|
|
125
134
|
}
|
|
126
|
-
function evaluateSnapshot(snapshot, subject, permission, data, team, options) {
|
|
127
|
-
|
|
135
|
+
function evaluateSnapshot(snapshot, subject, permission, data, team, options, outcomeOnly = false) {
|
|
136
|
+
let clock = options.now;
|
|
137
|
+
const now = () => clock ??= nowSeconds();
|
|
128
138
|
const tracer = options.explain === true ? {
|
|
129
139
|
evaluated: 0,
|
|
130
140
|
allows: [],
|
|
131
141
|
denies: [],
|
|
132
142
|
skipped: []
|
|
133
143
|
} : void 0;
|
|
134
|
-
const done = (decision) => freezeDeep(tracer === void 0 ? decision : {
|
|
144
|
+
const done = (decision) => outcomeOnly ? decision : freezeDeep(tracer === void 0 ? decision : {
|
|
135
145
|
...decision,
|
|
136
146
|
trace: {
|
|
137
147
|
evaluated: tracer.evaluated,
|
|
@@ -156,22 +166,14 @@ function evaluateSnapshot(snapshot, subject, permission, data, team, options) {
|
|
|
156
166
|
}],
|
|
157
167
|
alternatives: []
|
|
158
168
|
});
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
if (permission.kind === "instance" && isRowPair(data)) {
|
|
162
|
-
current = data.current;
|
|
163
|
-
next = data.next;
|
|
164
|
-
}
|
|
165
|
-
if (permission.kind === "collection") {
|
|
166
|
-
current = void 0;
|
|
167
|
-
next = data;
|
|
168
|
-
}
|
|
169
|
+
const { current, next } = rowValues(permission, data);
|
|
170
|
+
const scopes = scopeList(snapshot.scopes);
|
|
169
171
|
const denials = [];
|
|
170
172
|
const allows = [];
|
|
171
173
|
for (const grant of snapshot.grants) {
|
|
172
174
|
if (grant.permission !== permission.key) continue;
|
|
173
175
|
if (tracer !== void 0) tracer.evaluated += 1;
|
|
174
|
-
const match = matchGrantee(grant.to, subject, now, void 0,
|
|
176
|
+
const match = matchGrantee(grant.to, subject, now(), void 0, scopes, void 0, grant.effect === "deny");
|
|
175
177
|
if (!match.matched) {
|
|
176
178
|
denials.push(compact({
|
|
177
179
|
role: grant.role,
|
|
@@ -180,8 +182,8 @@ function evaluateSnapshot(snapshot, subject, permission, data, team, options) {
|
|
|
180
182
|
}));
|
|
181
183
|
continue;
|
|
182
184
|
}
|
|
183
|
-
let scoped = scopeOk(snapshot, grant, permission, subject, permission.kind === "instance" ? current : next, team, now);
|
|
184
|
-
if (scoped.ok && permission.kind === "instance" && next !== current) scoped = scopeOk(snapshot, grant, permission, subject, next, team, now);
|
|
185
|
+
let scoped = scopeOk(snapshot, grant, permission, subject, permission.kind === "instance" ? current : next, team, now(), options.scope);
|
|
186
|
+
if (scoped.ok && permission.kind === "instance" && next !== current) scoped = scopeOk(snapshot, grant, permission, subject, next, team, now(), options.scope);
|
|
185
187
|
if (!scoped.ok) {
|
|
186
188
|
denials.push(compact({
|
|
187
189
|
role: grant.role,
|
|
@@ -190,7 +192,7 @@ function evaluateSnapshot(snapshot, subject, permission, data, team, options) {
|
|
|
190
192
|
}));
|
|
191
193
|
continue;
|
|
192
194
|
}
|
|
193
|
-
if (!isActive(grant.validity, now)) {
|
|
195
|
+
if (!isActive(grant.validity, now())) {
|
|
194
196
|
if (grant.effect === "allow") denials.push({
|
|
195
197
|
role: grant.role,
|
|
196
198
|
reason: "inactive-grant",
|
|
@@ -214,7 +216,7 @@ function evaluateSnapshot(snapshot, subject, permission, data, team, options) {
|
|
|
214
216
|
alternatives: []
|
|
215
217
|
});
|
|
216
218
|
}
|
|
217
|
-
const condition = conditionOk(grant, permission, current, next, subject, now,
|
|
219
|
+
const condition = conditionOk(grant, permission, current, next, subject, now(), scopes);
|
|
218
220
|
if (!condition.matched && grant.effect === "deny" && condition.reason === "opaque-condition" && grantCoversField(grant.fields, options.field, grant.effect)) {
|
|
219
221
|
tracer?.denies.push(matchedOf(grant));
|
|
220
222
|
return done({
|
|
@@ -284,8 +286,8 @@ function evaluateSnapshot(snapshot, subject, permission, data, team, options) {
|
|
|
284
286
|
}],
|
|
285
287
|
alternatives: []
|
|
286
288
|
});
|
|
287
|
-
const resourceId = permission.kind === "collection" ? "*" :
|
|
288
|
-
const token = decisionToken({
|
|
289
|
+
const resourceId = permission.kind === "collection" ? "*" : rowIdOf(current, snapshot.ids?.[permission.resource]);
|
|
290
|
+
const token = outcomeOnly ? "" : decisionToken({
|
|
289
291
|
key: permission.key,
|
|
290
292
|
resourceId,
|
|
291
293
|
principal: subject.principal,
|
|
@@ -312,6 +314,7 @@ function whereFromSnapshot(snapshot, subject, permission, team) {
|
|
|
312
314
|
resource: permission.resource,
|
|
313
315
|
scopes: scopeList(snapshot.scopes),
|
|
314
316
|
partitioned: (name) => snapshot.scopes?.find((entry) => entry.name === name)?.resources?.includes(permission.resource) === true,
|
|
317
|
+
fieldOf: (name) => snapshotField(snapshot, name, permission.resource),
|
|
315
318
|
tenant: subject.principal?.tenant,
|
|
316
319
|
team,
|
|
317
320
|
now: nowSeconds(),
|
|
@@ -346,7 +349,7 @@ function heldRoleNames(subject, tenant, scopes, only, now) {
|
|
|
346
349
|
const names = new Set(scope === void 0 ? subject.principal?.roles ?? [] : []);
|
|
347
350
|
for (const membership of subject.principal?.memberships ?? []) {
|
|
348
351
|
if (isMembershipExpired(membership, now)) continue;
|
|
349
|
-
if (!(scope === void 0 ? tenantOf(membership, scopes) === tenant : membership.scope === scope && (only?.id === void 0 || membership.id
|
|
352
|
+
if (!(scope === void 0 ? tenantOf(membership, scopes) === tenant : membership.scope === scope && (only?.id === void 0 || sameId(membership.id, only.id)))) continue;
|
|
350
353
|
for (const role of membership.roles) names.add(role);
|
|
351
354
|
}
|
|
352
355
|
const rank = only?.rank ?? [];
|
|
@@ -358,8 +361,8 @@ function heldRoleNames(subject, tenant, scopes, only, now) {
|
|
|
358
361
|
}
|
|
359
362
|
//#endregion
|
|
360
363
|
//#region src/core/from-snapshot.ts
|
|
361
|
-
function resourceRef(permission, data) {
|
|
362
|
-
const id = permission.kind === "collection" ? void 0 :
|
|
364
|
+
function resourceRef(snapshot, permission, data) {
|
|
365
|
+
const id = permission.kind === "collection" ? void 0 : rowIdOf(data, snapshot.ids?.[permission.resource]);
|
|
363
366
|
return id === void 0 || id === "*" ? { type: permission.resource } : {
|
|
364
367
|
type: permission.resource,
|
|
365
368
|
id
|
|
@@ -374,7 +377,13 @@ function fromSnapshot(snapshot, options = {}) {
|
|
|
374
377
|
const team = options.team;
|
|
375
378
|
const run = (permission, data, decideOptions = {}) => evaluateSnapshot(snapshot, subject, permission, data, team, decideOptions);
|
|
376
379
|
const decide = ((permission, data, decideOptions = {}) => run(permission, data, decideOptions));
|
|
377
|
-
const can = ((permission, data, decideOptions) =>
|
|
380
|
+
const can = ((permission, data, decideOptions) => {
|
|
381
|
+
try {
|
|
382
|
+
return evaluateSnapshot(snapshot, subject, permission, data, team, decideOptions ?? {}, true).outcome === "granted";
|
|
383
|
+
} catch {
|
|
384
|
+
return false;
|
|
385
|
+
}
|
|
386
|
+
});
|
|
378
387
|
const assert = ((permission, data, decideOptions) => {
|
|
379
388
|
const decision = run(permission, data, decideOptions);
|
|
380
389
|
if (decision.outcome === "granted") return decision;
|
|
@@ -382,14 +391,14 @@ function fromSnapshot(snapshot, options = {}) {
|
|
|
382
391
|
decision,
|
|
383
392
|
permission: permission.key,
|
|
384
393
|
scope: permission.scope,
|
|
385
|
-
resource: resourceRef(permission, data),
|
|
394
|
+
resource: resourceRef(snapshot, permission, data),
|
|
386
395
|
message: approvalMessage(permission.key, decision.reason, decision.token)
|
|
387
396
|
});
|
|
388
397
|
throw new PermDockDeniedError({
|
|
389
398
|
decision,
|
|
390
399
|
permission: permission.key,
|
|
391
400
|
scope: permission.scope,
|
|
392
|
-
resource: resourceRef(permission, data),
|
|
401
|
+
resource: resourceRef(snapshot, permission, data),
|
|
393
402
|
subject,
|
|
394
403
|
message: deniedMessage(permission.key, subject.principal?.id, decision.denials, [])
|
|
395
404
|
});
|
|
@@ -446,9 +455,7 @@ function fromSnapshot(snapshot, options = {}) {
|
|
|
446
455
|
}
|
|
447
456
|
}), options);
|
|
448
457
|
}),
|
|
449
|
-
snapshot()
|
|
450
|
-
return snapshot;
|
|
451
|
-
},
|
|
458
|
+
snapshot: ((signing) => signing?.signer === void 0 ? snapshot : signSnapshot(snapshot, signing.signer, signing.audience)),
|
|
452
459
|
on() {
|
|
453
460
|
return () => void 0;
|
|
454
461
|
},
|
|
@@ -510,6 +517,9 @@ function fromSnapshot(snapshot, options = {}) {
|
|
|
510
517
|
}]
|
|
511
518
|
});
|
|
512
519
|
},
|
|
520
|
+
derive() {
|
|
521
|
+
return instance;
|
|
522
|
+
},
|
|
513
523
|
activate() {
|
|
514
524
|
return freezeDeep({
|
|
515
525
|
outcome: "denied",
|
|
@@ -531,6 +541,13 @@ function fromSnapshot(snapshot, options = {}) {
|
|
|
531
541
|
if (query?.scope === "global") return [];
|
|
532
542
|
return assignableEntry(snapshot, query?.tenant ?? subject.principal?.tenant)?.permissions ?? [];
|
|
533
543
|
},
|
|
544
|
+
assignableLevels(permission, query) {
|
|
545
|
+
if (query?.scope === "global") return [];
|
|
546
|
+
const levels = assignableEntry(snapshot, query?.tenant ?? subject.principal?.tenant)?.levels;
|
|
547
|
+
if (levels === void 0 || !Object.hasOwn(levels, permission.key)) return [];
|
|
548
|
+
const names = levels[permission.key];
|
|
549
|
+
return Array.isArray(names) ? names.filter((name) => typeof name === "string") : [];
|
|
550
|
+
},
|
|
534
551
|
subject
|
|
535
552
|
};
|
|
536
553
|
return Object.freeze(instance);
|
|
@@ -549,4 +566,4 @@ function emptySnapshot() {
|
|
|
549
566
|
});
|
|
550
567
|
}
|
|
551
568
|
//#endregion
|
|
552
|
-
export { fromSnapshot as n, emptySnapshot as t };
|
|
569
|
+
export { fromSnapshot as n, heldRoleNames as r, emptySnapshot as t };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { r as sole, t as compact } from "./compact-y6vfu2_f.js";
|
|
2
|
-
import { n as freezeDeep } from "./freeze-
|
|
3
|
-
import { S as isForbiddenKey, d as
|
|
4
|
-
import {
|
|
2
|
+
import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
|
|
3
|
+
import { C as restrictedStops, D as ownKeys, S as restrictedFor, T as isForbiddenKey, _ as listPermissions, d as isEdgeRelation, f as isFieldRelation, g as isSelfParented, m as isPrincipalRelation, p as isPermission, r as expandRelation, u as isComputedRelation, w as assertSafeKey } from "./permissions-DVoF6dMt.js";
|
|
4
|
+
import { c as rootScope, d as scopeList, o as resolveScope, t as activeFor } from "./scopes-CVdPrWN-.js";
|
|
5
5
|
//#region src/core/vocabulary.ts
|
|
6
6
|
const ROLE_KIND = "role";
|
|
7
7
|
const PLAN_KIND = "plan";
|
|
@@ -127,6 +127,18 @@ function relation(resource, name, options) {
|
|
|
127
127
|
depth
|
|
128
128
|
}));
|
|
129
129
|
}
|
|
130
|
+
function inherit(permission, options) {
|
|
131
|
+
if (!isPermission(permission) || permission.kind === "collection") throw new Error("PermDock: inherit() takes an instance permission leaf");
|
|
132
|
+
const through = options.through;
|
|
133
|
+
const links = Array.isArray(through) ? through : void 0;
|
|
134
|
+
if (through !== "parent" && (links === void 0 || links.length === 0 || !links.every((link) => typeof link === "string" && link !== "" && link !== "parent"))) throw new Error("PermDock: inherit() through must be 'parent' or a non-empty list of link names");
|
|
135
|
+
return freezeDeep({
|
|
136
|
+
kind: "inherit",
|
|
137
|
+
permission: permission.key,
|
|
138
|
+
resource: permission.resource,
|
|
139
|
+
through: links === void 0 ? "parent" : links.map(String)
|
|
140
|
+
});
|
|
141
|
+
}
|
|
130
142
|
function plan(name) {
|
|
131
143
|
return freezeDeep({
|
|
132
144
|
kind: "plan",
|
|
@@ -233,9 +245,29 @@ function resourceRoleCondition(resource, membershipResource, ids, resources) {
|
|
|
233
245
|
field: start.field,
|
|
234
246
|
depth: DEFAULT_RELATION_DEPTH,
|
|
235
247
|
parent: start.parent ? true : void 0,
|
|
236
|
-
restricted: resource
|
|
248
|
+
restricted: restrictedFor(resource, "parent"),
|
|
249
|
+
passRestricted: passesRestricted(resources.get(membershipResource))
|
|
237
250
|
});
|
|
238
251
|
}
|
|
252
|
+
function passesRestricted(node) {
|
|
253
|
+
return node?.restricted !== void 0 && !restrictedStops(node, "parent") ? true : void 0;
|
|
254
|
+
}
|
|
255
|
+
function linkStop(resource, link) {
|
|
256
|
+
const restricted = restrictedFor(resource, link);
|
|
257
|
+
if (restricted === void 0) return {};
|
|
258
|
+
const parent = resource.parent;
|
|
259
|
+
if (parent === void 0 || !isSelfParented(resource)) return { restricted };
|
|
260
|
+
return {
|
|
261
|
+
restricted,
|
|
262
|
+
restrictedAncestors: {
|
|
263
|
+
resource: resource.name,
|
|
264
|
+
id: resource.id,
|
|
265
|
+
parent: parent.field,
|
|
266
|
+
field: restricted,
|
|
267
|
+
depth: 32
|
|
268
|
+
}
|
|
269
|
+
};
|
|
270
|
+
}
|
|
239
271
|
/**
|
|
240
272
|
* The link path from the row to the grantee's resource: the row field of
|
|
241
273
|
* the first link and each hop. `undefined` when a link is not declared or
|
|
@@ -320,7 +352,8 @@ function relationCondition(grantee, resource, scopes = scopeList(void 0), option
|
|
|
320
352
|
field: path.field,
|
|
321
353
|
depth: path.depth,
|
|
322
354
|
hops: path.hops,
|
|
323
|
-
|
|
355
|
+
...resource === void 0 ? {} : linkStop(resource, firstLink(path)),
|
|
356
|
+
passRestricted: path.depth > 0 ? passesRestricted(target) : void 0
|
|
324
357
|
});
|
|
325
358
|
}
|
|
326
359
|
const start = relationStart(grantee, resource, target);
|
|
@@ -332,7 +365,8 @@ function relationCondition(grantee, resource, scopes = scopeList(void 0), option
|
|
|
332
365
|
field: start.field,
|
|
333
366
|
depth: start.depth,
|
|
334
367
|
parent: start.parent ? true : void 0,
|
|
335
|
-
restricted: start.parent || start.depth > 0 ? resource
|
|
368
|
+
restricted: start.parent || start.depth > 0 ? restrictedFor(resource, "parent") : void 0,
|
|
369
|
+
passRestricted: start.depth > 0 ? passesRestricted(target) : void 0
|
|
336
370
|
});
|
|
337
371
|
}
|
|
338
372
|
const spec = resource?.relations?.[grantee.relation];
|
|
@@ -390,6 +424,43 @@ function relationCondition(grantee, resource, scopes = scopeList(void 0), option
|
|
|
390
424
|
value: { ref: "principal.id" }
|
|
391
425
|
};
|
|
392
426
|
}
|
|
427
|
+
function inheritCondition(grantee, resource, resources) {
|
|
428
|
+
if (resource === void 0) return;
|
|
429
|
+
if (grantee.through === "parent") {
|
|
430
|
+
const parent = resource.parent;
|
|
431
|
+
if (parent === void 0 || parent.resource !== grantee.resource) return;
|
|
432
|
+
return compact({
|
|
433
|
+
op: "related",
|
|
434
|
+
resource: grantee.resource,
|
|
435
|
+
relation: "",
|
|
436
|
+
permission: grantee.permission,
|
|
437
|
+
field: parent.field,
|
|
438
|
+
depth: 0,
|
|
439
|
+
parent: true,
|
|
440
|
+
restricted: restrictedFor(resource, "parent")
|
|
441
|
+
});
|
|
442
|
+
}
|
|
443
|
+
const path = relationHops({
|
|
444
|
+
kind: "relation",
|
|
445
|
+
resource: grantee.resource,
|
|
446
|
+
relation: "",
|
|
447
|
+
through: grantee.through
|
|
448
|
+
}, resource, resources);
|
|
449
|
+
if (path === void 0) return;
|
|
450
|
+
return compact({
|
|
451
|
+
op: "related",
|
|
452
|
+
resource: grantee.resource,
|
|
453
|
+
relation: "",
|
|
454
|
+
permission: grantee.permission,
|
|
455
|
+
field: path.field,
|
|
456
|
+
depth: 0,
|
|
457
|
+
hops: path.hops,
|
|
458
|
+
...linkStop(resource, firstLink(path))
|
|
459
|
+
});
|
|
460
|
+
}
|
|
461
|
+
function firstLink(path) {
|
|
462
|
+
return path.hops[0]?.link ?? "";
|
|
463
|
+
}
|
|
393
464
|
function targetMap(target) {
|
|
394
465
|
return target === void 0 ? void 0 : /* @__PURE__ */ new Map([[target.name, target]]);
|
|
395
466
|
}
|
|
@@ -480,6 +551,16 @@ function matchOne(grantee, subject, now, resource, scopes, resources) {
|
|
|
480
551
|
where
|
|
481
552
|
});
|
|
482
553
|
}
|
|
554
|
+
case "inherit": {
|
|
555
|
+
const where = inheritCondition(grantee, resource, resources);
|
|
556
|
+
return where === void 0 ? {
|
|
557
|
+
matched: false,
|
|
558
|
+
reason: "condition"
|
|
559
|
+
} : {
|
|
560
|
+
matched: true,
|
|
561
|
+
where
|
|
562
|
+
};
|
|
563
|
+
}
|
|
483
564
|
case "role":
|
|
484
565
|
if (subject.principal === null) return {
|
|
485
566
|
matched: false,
|
|
@@ -518,4 +599,4 @@ function matchGrantee(to, subject, now, resource, scopes, resources, unknownMatc
|
|
|
518
599
|
});
|
|
519
600
|
}
|
|
520
601
|
//#endregion
|
|
521
|
-
export {
|
|
602
|
+
export { isPlan as C, synthesiseRole as D, listRoles as E, findRole as S, listPlans as T, resourceRoleCondition as _, authenticated as a, definePlans as b, inherit as c, matchGrantee as d, plan as f, relationStart as g, relationHops as h, assurance as i, inheritCondition as l, relationCondition as m, anyone as n, combineWhere as o, relation as p, asGrantee as r, flattenGrantee as s, actor as t, isGraphRelation as u, roleNameOf as v, isRole as w, defineRoles as x, roleScopeOf as y };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
//#region src/conditions/graph-sql.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Postgres SQL as parts, so each compiler binds values and names columns its
|
|
4
|
+
* own way: literal `text`, a bound `value`, the subject's id as text, or a
|
|
5
|
+
* `column` of the row being filtered.
|
|
6
|
+
*/
|
|
7
|
+
type GraphSqlPart = {
|
|
8
|
+
readonly text: string;
|
|
9
|
+
} | {
|
|
10
|
+
readonly value: string | number | boolean;
|
|
11
|
+
} | {
|
|
12
|
+
readonly subject: true;
|
|
13
|
+
} | {
|
|
14
|
+
readonly column: string;
|
|
15
|
+
};
|
|
16
|
+
type GraphSql = readonly GraphSqlPart[];
|
|
17
|
+
/** Where the graph lives in the database, as the `toWhere` compilers take it. */
|
|
18
|
+
type RelationsMapping = {
|
|
19
|
+
/** The table of each resource the graph reads; default the resource name. */
|
|
20
|
+
readonly tables?: Readonly<Record<string, string>>;
|
|
21
|
+
/**
|
|
22
|
+
* A closure table (`resource`, `ancestor`, `descendant`, `depth`) such as
|
|
23
|
+
* the one `permdock rls` keeps. Without it, parent walks are a bounded
|
|
24
|
+
* recursive query over the resource's own table.
|
|
25
|
+
*/
|
|
26
|
+
readonly closure?: string;
|
|
27
|
+
};
|
|
28
|
+
//#endregion
|
|
29
|
+
export { GraphSqlPart as n, RelationsMapping as r, GraphSql as t };
|