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,5 +1,5 @@
|
|
|
1
|
-
import { C as Policy,
|
|
2
|
-
import { c as saasPlans, l as saasRoles, s as saasPermissions } from "./permissions-
|
|
1
|
+
import { C as Policy, Nr as Principal, Pr as Subject } from "./policy-CFZAr_Al.js";
|
|
2
|
+
import { c as saasPlans, l as saasRoles, s as saasPermissions } from "./permissions-CDgvKG5L.js";
|
|
3
3
|
//#region src/testing/saas/policy.d.ts
|
|
4
4
|
/** Daily API-key quota per subject; the bucket should be per tenant too. */
|
|
5
5
|
declare const SAAS_API_KEY_LIMIT = 5;
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { n as isReadonlyArray, r as sole, t as compact } from "./compact-y6vfu2_f.js";
|
|
2
|
-
import { n as freezeDeep } from "./freeze-
|
|
3
|
-
import {
|
|
4
|
-
import { c as isConditionRef, l as isSqlFunctionField, n as isSubjectRef, o as isCondition, s as isConditionDate } from "./refs-
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { S as isRole, _ as roleScopeOf, a as authenticated, c as isGraphRelation, g as roleNameOf, m as relationStart, p as relationHops, r as asGrantee, s as flattenGrantee, w as listRoles } from "./grantee-Bv04_Vzf.js";
|
|
2
|
+
import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
|
|
3
|
+
import { D as ownKeys, T as isForbiddenKey, _ as listPermissions, f as isFieldRelation, g as isSelfParented, h as isRegistryTree, i as findPermission, p as isPermission, s as getRegistry, t as annotationsFor, w as assertSafeKey } from "./permissions-DVoF6dMt.js";
|
|
4
|
+
import { c as isConditionRef, l as isSqlFunctionField, n as isSubjectRef, o as isCondition, s as isConditionDate } from "./refs-KYb4ntaz.js";
|
|
5
|
+
import { c as isUserApprover, i as flattenApprovers, l as user, o as isAnyOfInput, r as approverLeaves, s as isPermissionApprover } from "./approvers-DT4AVyIg.js";
|
|
6
|
+
import { n as defineScopes, o as resolveScope } from "./scopes-CVdPrWN-.js";
|
|
8
7
|
import { t as parseDuration } from "./duration-xK2jGFVc.js";
|
|
9
|
-
import { g as
|
|
8
|
+
import { E as listRoles, a as authenticated, g as relationStart, h as relationHops, l as inheritCondition, r as asGrantee, s as flattenGrantee, u as isGraphRelation, v as roleNameOf, w as isRole, y as roleScopeOf } from "./grantee-Cv5Sogfv.js";
|
|
9
|
+
import { t as canonicalJson } from "./canonical-json-DemiK4Vp.js";
|
|
10
|
+
import { i as sanitizeFields } from "./fields-BMl1RxoX.js";
|
|
10
11
|
import { n as sha256, t as bytesToBase64Url } from "./sha256-BO0swRXL.js";
|
|
12
|
+
import { f as relatesTo, h as scopeField, n as normalizeValidity, s as memberOfFields } from "./validity-uOp8UpYn.js";
|
|
11
13
|
//#region src/conditions/opaque.ts
|
|
12
14
|
function opaque(input) {
|
|
13
15
|
return freezeDeep({
|
|
@@ -151,6 +153,15 @@ function normalizeSqlFunction(input) {
|
|
|
151
153
|
twin
|
|
152
154
|
});
|
|
153
155
|
}
|
|
156
|
+
/** `{ session: … }` under `subject`; any other value is a comparison on a `subject` field. */
|
|
157
|
+
function isSubjectCondition(value) {
|
|
158
|
+
return value !== null && typeof value === "object" && !Array.isArray(value) && Object.hasOwn(value, "session");
|
|
159
|
+
}
|
|
160
|
+
function subjectCondition(value) {
|
|
161
|
+
const session = value["session"];
|
|
162
|
+
if (ownKeys(value).length !== 1 || session === null || typeof session !== "object" || ownKeys(session).length !== 1 || Reflect.get(session, "live") !== true) throw new TypeError("PermDock: a subject condition is { subject: { session: { live: true } } }");
|
|
163
|
+
return freezeDeep({ op: "liveSession" });
|
|
164
|
+
}
|
|
154
165
|
function normalizeWhere(input) {
|
|
155
166
|
if (isCondition(input)) {
|
|
156
167
|
if (input.op === "sqlFunction") return collapse(normalizeSqlFunction(input));
|
|
@@ -187,6 +198,10 @@ function normalizeWhere(input) {
|
|
|
187
198
|
}));
|
|
188
199
|
continue;
|
|
189
200
|
}
|
|
201
|
+
if (key === "subject" && isSubjectCondition(value)) {
|
|
202
|
+
parts.push(subjectCondition(value));
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
190
205
|
parts.push(fieldCondition(key, value));
|
|
191
206
|
}
|
|
192
207
|
if (parts.length === 0) throw new Error("PermDock: empty condition");
|
|
@@ -413,15 +428,36 @@ function applyQuota(input) {
|
|
|
413
428
|
}
|
|
414
429
|
//#endregion
|
|
415
430
|
//#region src/core/policy.ts
|
|
416
|
-
/** Every approver a requirement names: `by`, each stage and `escalation.to
|
|
431
|
+
/** Every approver a requirement names: `by`, each stage and its escalation, and `escalation.to`, inside `anyOf` groups too. */
|
|
417
432
|
function approversOf(requirement) {
|
|
418
433
|
return [
|
|
419
|
-
...
|
|
420
|
-
...(requirement.stages ?? []).flatMap((stage) =>
|
|
421
|
-
...
|
|
434
|
+
...approverLeaves(requirement.by),
|
|
435
|
+
...(requirement.stages ?? []).flatMap((stage) => approverLeaves(stage.by).concat(approverLeaves(stage.escalation?.to))),
|
|
436
|
+
...approverLeaves(requirement.escalation?.to)
|
|
422
437
|
];
|
|
423
438
|
}
|
|
424
439
|
function asApprover(input) {
|
|
440
|
+
if (isPermissionApprover(input)) {
|
|
441
|
+
if (typeof input.permission !== "string" || input.permission === "") throw new Error("PermDock: a permission approver needs a permission key");
|
|
442
|
+
return Object.freeze({
|
|
443
|
+
kind: "permission",
|
|
444
|
+
permission: input.permission
|
|
445
|
+
});
|
|
446
|
+
}
|
|
447
|
+
if (isAnyOfInput(input)) {
|
|
448
|
+
if (!Array.isArray(input.of) || input.of.length === 0) throw new Error("PermDock: anyOf() needs at least one approver");
|
|
449
|
+
const of = input.of.map((item) => {
|
|
450
|
+
const normalized = asApprover(item);
|
|
451
|
+
const items = flattenApprovers(normalized);
|
|
452
|
+
if (items.length === 0) throw new Error("PermDock: an anyOf() item names no approver");
|
|
453
|
+
const [first] = items;
|
|
454
|
+
return isReadonlyArray(normalized) || first === void 0 ? items : first;
|
|
455
|
+
});
|
|
456
|
+
return Object.freeze({
|
|
457
|
+
kind: "any-of",
|
|
458
|
+
of: Object.freeze(of)
|
|
459
|
+
});
|
|
460
|
+
}
|
|
425
461
|
if (isReadonlyArray(input)) {
|
|
426
462
|
const items = [];
|
|
427
463
|
for (const item of input) items.push(...flattenApprovers(asApprover(item)));
|
|
@@ -491,7 +527,8 @@ function normalizeStages(approval, mode, label) {
|
|
|
491
527
|
if (flattenApprovers(by).length === 0) throw new Error(`PermDock: approval.stages[${index}].by on '${label}' names no approver`);
|
|
492
528
|
return compact({
|
|
493
529
|
by,
|
|
494
|
-
quorum: stage.quorum
|
|
530
|
+
quorum: stage.quorum,
|
|
531
|
+
escalation: normalizeEscalation(stage.escalation, label)
|
|
495
532
|
});
|
|
496
533
|
});
|
|
497
534
|
}
|
|
@@ -516,10 +553,13 @@ function delegationTarget(to, index) {
|
|
|
516
553
|
if ("actor" in to) return { kind: to.actor };
|
|
517
554
|
const target = compact({
|
|
518
555
|
kind: to.kind,
|
|
519
|
-
id: to.id
|
|
556
|
+
id: to.id,
|
|
557
|
+
client: to.client
|
|
520
558
|
});
|
|
521
559
|
if (typeof target.kind !== "string" || target.kind === "") throw new Error(`PermDock: delegations[${index}].to needs an actor kind, such as actor('eve')`);
|
|
522
560
|
if (target.id !== void 0 && (typeof target.id !== "string" || target.id === "")) throw new Error(`PermDock: delegations[${index}].to.id must be a non-empty string`);
|
|
561
|
+
if (target.client !== void 0 && (typeof target.client !== "string" || target.client === "")) throw new Error(`PermDock: delegations[${index}].to.client must be a non-empty string`);
|
|
562
|
+
if (target.id !== void 0 && target.client !== void 0) throw new Error(`PermDock: delegations[${index}].to names both an id and a client; name one`);
|
|
523
563
|
return target;
|
|
524
564
|
}
|
|
525
565
|
function normalizeDelegation(input, index, tree) {
|
|
@@ -527,7 +567,7 @@ function normalizeDelegation(input, index, tree) {
|
|
|
527
567
|
const from = asGrantee(input.from);
|
|
528
568
|
const items = flattenGrantee(from);
|
|
529
569
|
if (items.length === 0) throw new Error(`PermDock: ${label}.from names nobody`);
|
|
530
|
-
if (items.some((item) => item.kind === "relation")) throw new Error(`PermDock: ${label}.from names a relation; a delegation is matched without a row, so name a role or another subject-only grantee`);
|
|
570
|
+
if (items.some((item) => item.kind === "relation" || item.kind === "inherit")) throw new Error(`PermDock: ${label}.from names a relation or inherit(); a delegation is matched without a row, so name a role or another subject-only grantee`);
|
|
531
571
|
if (items.some((item) => item.kind === "actor")) throw new Error(`PermDock: ${label}.from names an actor; the principal hands over, the actor is \`to\``);
|
|
532
572
|
const leaves = /* @__PURE__ */ new Map();
|
|
533
573
|
for (const leaf of input.permissions.flatMap((item) => flattenPermissions(item))) {
|
|
@@ -544,6 +584,30 @@ function normalizeDelegation(input, index, tree) {
|
|
|
544
584
|
validity: normalizeValidity(input, label)
|
|
545
585
|
});
|
|
546
586
|
}
|
|
587
|
+
/** RFC 6749 section 3.3 `scope-token`: printable ASCII without space, `"` or `\`. */
|
|
588
|
+
function isScopeToken(value) {
|
|
589
|
+
return /^[!#-[\]-~]+$/u.test(value);
|
|
590
|
+
}
|
|
591
|
+
function normalizeOAuthScopes(input, tree) {
|
|
592
|
+
if (input === void 0) return [];
|
|
593
|
+
const own = new Set(listPermissions(tree).map((leaf) => leaf.scope));
|
|
594
|
+
return Object.entries(input).map(([scope, items]) => {
|
|
595
|
+
if (!isScopeToken(scope)) throw new Error(`PermDock: oauthScopes key '${scope}' is not an OAuth scope token`);
|
|
596
|
+
if (own.has(scope)) throw new Error(`PermDock: oauthScopes key '${scope}' is a permission's own scope`);
|
|
597
|
+
const leaves = /* @__PURE__ */ new Map();
|
|
598
|
+
for (const leaf of (Array.isArray(items) ? items : []).flatMap((item) => flattenPermissions(item))) {
|
|
599
|
+
if (findPermission(tree, leaf.key) === void 0) throw new Error(`PermDock: oauthScopes '${scope}' names unknown permission '${leaf.key}'`);
|
|
600
|
+
leaves.set(leaf.key, leaf);
|
|
601
|
+
}
|
|
602
|
+
if (leaves.size === 0) throw new Error(`PermDock: oauthScopes '${scope}' covers no permission`);
|
|
603
|
+
const sorted = [...leaves.values()].toSorted((a, b) => a.key.localeCompare(b.key));
|
|
604
|
+
return {
|
|
605
|
+
scope,
|
|
606
|
+
permissions: sorted.map((leaf) => leaf.key),
|
|
607
|
+
scopes: sorted.map((leaf) => leaf.scope)
|
|
608
|
+
};
|
|
609
|
+
});
|
|
610
|
+
}
|
|
547
611
|
function resolveRoleScope(on) {
|
|
548
612
|
if (on === void 0) return "global";
|
|
549
613
|
if (typeof on === "string") {
|
|
@@ -556,6 +620,12 @@ function resolveRoleScope(on) {
|
|
|
556
620
|
if (names.size !== 1 || resource === void 0) throw new Error("PermDock: role on: resource must name exactly one resource");
|
|
557
621
|
return { resource };
|
|
558
622
|
}
|
|
623
|
+
const GROUP = /^[a-z][a-z0-9_-]*$/u;
|
|
624
|
+
function grantGroup(group, key) {
|
|
625
|
+
if (group === void 0) return;
|
|
626
|
+
if (typeof group !== "string" || !GROUP.test(group) || group === "break-glass") throw new Error(`PermDock: group '${String(group)}' on ${key} must be lower case letters, digits, _ or -, start with a letter, and not be break-glass`);
|
|
627
|
+
return group;
|
|
628
|
+
}
|
|
559
629
|
function makeGrant(permission, effect, condition) {
|
|
560
630
|
const toInput = isClosure(condition) ? void 0 : condition?.to;
|
|
561
631
|
const to = toInput === void 0 ? {
|
|
@@ -578,6 +648,7 @@ function makeGrant(permission, effect, condition) {
|
|
|
578
648
|
assertLimit(condition?.limit, permission.key);
|
|
579
649
|
const purpose = condition?.purpose === void 0 || condition.purpose.length === 0 ? void 0 : Object.freeze([...new Set(condition.purpose)]);
|
|
580
650
|
const portable = condition?.limit === void 0 && purpose === void 0;
|
|
651
|
+
const requires = requiredKey(condition?.requires, permission, effect);
|
|
581
652
|
return compact({
|
|
582
653
|
permission,
|
|
583
654
|
effect,
|
|
@@ -589,10 +660,20 @@ function makeGrant(permission, effect, condition) {
|
|
|
589
660
|
limit: normalizeLimit(condition?.limit),
|
|
590
661
|
fields: sanitizeFields(condition?.fields),
|
|
591
662
|
name: condition?.name,
|
|
663
|
+
group: grantGroup(condition?.group, permission.key),
|
|
592
664
|
purpose,
|
|
593
|
-
validity: normalizeValidity(condition ?? {}, permission.key)
|
|
665
|
+
validity: normalizeValidity(condition ?? {}, permission.key),
|
|
666
|
+
requires
|
|
594
667
|
});
|
|
595
668
|
}
|
|
669
|
+
function requiredKey(input, permission, effect) {
|
|
670
|
+
if (input === void 0) return;
|
|
671
|
+
if (effect !== "allow") throw new Error(`PermDock: requires is allowed on an allow only; '${permission.key}' is a deny`);
|
|
672
|
+
if (permission.kind !== "instance") throw new Error(`PermDock: requires on '${permission.key}' needs an instance action; a collection action has no row whose scope it can check`);
|
|
673
|
+
const list = Array.isArray(input) ? input : [input];
|
|
674
|
+
if (list.length === 0 || !list.every(isPermission)) throw new TypeError(`PermDock: requires on '${permission.key}' must be a permission leaf or a non-empty list of them`);
|
|
675
|
+
return Object.freeze([...new Set(list.map((leaf) => leaf.key))]);
|
|
676
|
+
}
|
|
596
677
|
function allow(permission, condition) {
|
|
597
678
|
const grants = flattenPermissions(permission).map((leaf) => makeGrant(leaf, "allow", condition));
|
|
598
679
|
return sole(grants) ?? grants;
|
|
@@ -702,10 +783,41 @@ function roleRules(roleName, scope, options) {
|
|
|
702
783
|
for: nameList(roleName, "for", options?.for)
|
|
703
784
|
});
|
|
704
785
|
}
|
|
705
|
-
function canonicalPolicy(grants, delegations) {
|
|
786
|
+
function canonicalPolicy(grants, delegations, levels) {
|
|
706
787
|
const payload = canonicalGrants(grants);
|
|
707
|
-
|
|
708
|
-
return `${
|
|
788
|
+
const withDelegations = delegations.length === 0 ? payload : `${payload}\n${JSON.stringify(delegations)}`;
|
|
789
|
+
return levels === void 0 ? withDelegations : `${withDelegations}\nlevels:${canonicalJson(levels)}`;
|
|
790
|
+
}
|
|
791
|
+
function normalizeLevels(resources) {
|
|
792
|
+
const out = {};
|
|
793
|
+
for (const node of resources.values()) {
|
|
794
|
+
const entries = Object.entries({ ...node.levels });
|
|
795
|
+
if (entries.length === 0) continue;
|
|
796
|
+
const levels = {};
|
|
797
|
+
for (const [name, input] of entries) try {
|
|
798
|
+
levels[name] = Object.keys(input).length === 0 ? {
|
|
799
|
+
op: "and",
|
|
800
|
+
conditions: []
|
|
801
|
+
} : normalizeWhere(input);
|
|
802
|
+
} catch (error) {
|
|
803
|
+
throw new Error(`PermDock: level '${name}' on '${node.name}' is not a valid condition`, { cause: error });
|
|
804
|
+
}
|
|
805
|
+
out[node.name] = levels;
|
|
806
|
+
}
|
|
807
|
+
return Object.keys(out).length === 0 ? void 0 : freezeDeep(out);
|
|
808
|
+
}
|
|
809
|
+
/** Declared levels of `resource` with their conditions, in declaration order. */
|
|
810
|
+
function policyLevels(policy, resource) {
|
|
811
|
+
const levels = policy.levels;
|
|
812
|
+
return levels !== void 0 && Object.hasOwn(levels, resource) ? Object.entries({ ...levels[resource] }) : [];
|
|
813
|
+
}
|
|
814
|
+
/** The condition of `level` on `resource`, if the policy declares it. */
|
|
815
|
+
function levelCondition(policy, resource, level) {
|
|
816
|
+
return policyLevels(policy, resource).find(([name]) => name === level)?.[1];
|
|
817
|
+
}
|
|
818
|
+
/** Declared level names of `resource`, in declaration order. */
|
|
819
|
+
function levelNames(policy, resource) {
|
|
820
|
+
return policyLevels(policy, resource).map(([name]) => name);
|
|
709
821
|
}
|
|
710
822
|
function canonicalGrants(grants) {
|
|
711
823
|
const payload = grants.map((grant) => ({
|
|
@@ -723,7 +835,8 @@ function canonicalGrants(grants) {
|
|
|
723
835
|
purpose: grant.purpose,
|
|
724
836
|
breakGlass: grant.breakGlass,
|
|
725
837
|
viaOnly: grant.viaOnly,
|
|
726
|
-
validity: grant.validity
|
|
838
|
+
validity: grant.validity,
|
|
839
|
+
requires: grant.requires
|
|
727
840
|
}));
|
|
728
841
|
return JSON.stringify(payload);
|
|
729
842
|
}
|
|
@@ -755,6 +868,29 @@ function assertRelationGrants(grants, resources) {
|
|
|
755
868
|
if (relationStart(item, row, target) === void 0) throw new Error(item.through === void 0 ? `PermDock: ${label} is on ${target.name}, not ${grant.permission.resource}; add through: 'parent'` : `PermDock: ${label}: ${grant.permission.resource} has no parent on ${target.name}`);
|
|
756
869
|
}
|
|
757
870
|
}
|
|
871
|
+
function assertInheritGrants(grants, resources, tree) {
|
|
872
|
+
const keys = new Set(listPermissions(tree).map((leaf) => leaf.key));
|
|
873
|
+
const edges = /* @__PURE__ */ new Map();
|
|
874
|
+
for (const grant of grants) for (const item of flattenGrantee(grant.to)) {
|
|
875
|
+
if (item.kind !== "inherit") continue;
|
|
876
|
+
const label = `grant ${grant.permission.key} inherit '${item.permission}'`;
|
|
877
|
+
if (grant.effect !== "allow") throw new Error(`PermDock: ${label}: inherit() is allowed on an allow only`);
|
|
878
|
+
if (grant.permission.kind !== "instance") throw new Error(`PermDock: ${label}: inherit() needs an instance action; a collection action has no row to follow`);
|
|
879
|
+
if (!keys.has(item.permission)) throw new Error(`PermDock: ${label}: the policy does not declare it`);
|
|
880
|
+
if (inheritCondition(item, resources.get(grant.permission.resource), resources) === void 0) throw new Error(item.through === "parent" ? `PermDock: ${label}: ${grant.permission.resource} has no parent on ${item.resource}` : `PermDock: ${label}: the links [${item.through.join(", ")}] from ${grant.permission.resource} do not end on ${item.resource}`);
|
|
881
|
+
const next = edges.get(grant.permission.key) ?? /* @__PURE__ */ new Set();
|
|
882
|
+
next.add(item.permission);
|
|
883
|
+
edges.set(grant.permission.key, next);
|
|
884
|
+
}
|
|
885
|
+
const done = /* @__PURE__ */ new Set();
|
|
886
|
+
const visit = (key, path) => {
|
|
887
|
+
if (path.includes(key)) throw new Error(`PermDock: inherit() grants form a cycle: ${[...path.slice(path.indexOf(key)), key].join(" -> ")}`);
|
|
888
|
+
if (done.has(key)) return;
|
|
889
|
+
for (const target of edges.get(key) ?? []) visit(target, [...path, key]);
|
|
890
|
+
done.add(key);
|
|
891
|
+
};
|
|
892
|
+
for (const key of edges.keys()) visit(key, []);
|
|
893
|
+
}
|
|
758
894
|
function scopeOfGrant(scope, declared) {
|
|
759
895
|
if (typeof scope !== "string" || scope === "global") return scope;
|
|
760
896
|
const resolved = resolveScope(declared, scope);
|
|
@@ -803,10 +939,19 @@ function assertScopeKeys(grants, scopes, resources) {
|
|
|
803
939
|
if (typeof grant.scope !== "string" || grant.scope === "global" || grant.permission.kind !== "instance") continue;
|
|
804
940
|
const key = scopes.find((scope) => scope.name === grant.scope)?.key;
|
|
805
941
|
const node = resources.get(grant.permission.resource);
|
|
806
|
-
if (key === void 0 || node === void 0
|
|
942
|
+
if (key === void 0 || node === void 0) continue;
|
|
943
|
+
const fields = memberOfFields(node, grant.scope, scopes);
|
|
944
|
+
if (fields.length > 1 && !fields.includes(key)) throw new Error(`PermDock: resource '${node.name}' declares several memberOf relations to '${grant.scope}' (${fields.join(", ")}); name the one holding the instance with the scope's key '${key}'`);
|
|
945
|
+
const field = scopeField(node, grant.scope, scopes);
|
|
946
|
+
if (field !== void 0 && relatesTo(node, field, grant.scope, scopes)) continue;
|
|
807
947
|
throw new Error(`PermDock: resource '${node.name}' needs relations: { <name>: { field: '${key}', memberOf: '${grant.scope}' } } for ${grant.permission.key} on '${grant.scope}' roles`);
|
|
808
948
|
}
|
|
809
949
|
}
|
|
950
|
+
/** A `requires` names a permission the policy declares. */
|
|
951
|
+
function assertRequires(grants, tree) {
|
|
952
|
+
const keys = new Set(listPermissions(tree).map((leaf) => leaf.key));
|
|
953
|
+
for (const grant of grants) for (const key of grant.requires ?? []) if (!keys.has(key)) throw new Error(`PermDock: '${grant.permission.key}' requires '${key}', which the policy does not declare`);
|
|
954
|
+
}
|
|
810
955
|
/**
|
|
811
956
|
* A stale-on-change approval needs a row to version: an instance permission
|
|
812
957
|
* whose resource declares `version`.
|
|
@@ -909,8 +1054,12 @@ function definePolicy(permissions, options) {
|
|
|
909
1054
|
assertApprovalVersions(grants, resources);
|
|
910
1055
|
assertApprovalRelations(grants, resources);
|
|
911
1056
|
assertRelationGrants(grants, resources);
|
|
1057
|
+
assertRequires(grants, tree);
|
|
1058
|
+
assertInheritGrants(grants, resources, tree);
|
|
912
1059
|
const delegations = (options.delegations ?? []).map((item, index) => normalizeDelegation(item, index, tree));
|
|
913
|
-
const
|
|
1060
|
+
const levels = normalizeLevels(resources);
|
|
1061
|
+
const oauthScopes = normalizeOAuthScopes(options.oauthScopes, tree);
|
|
1062
|
+
const fingerprint = bytesToBase64Url(sha256(oauthScopes.length === 0 ? canonicalPolicy(grants, delegations, levels) : `${canonicalPolicy(grants, delegations, levels)}\noauthScopes:${canonicalJson(oauthScopes)}`));
|
|
914
1063
|
const hostable = [...new Set((options.hostable ?? []).flatMap((item) => flattenPermissions(item).map((leaf) => leaf.key)))].toSorted();
|
|
915
1064
|
const fresh = [...new Set((options.fresh ?? []).flatMap((item) => flattenPermissions(item).map((leaf) => leaf.key)))].toSorted();
|
|
916
1065
|
return freezeDeep({
|
|
@@ -931,6 +1080,8 @@ function definePolicy(permissions, options) {
|
|
|
931
1080
|
hostable,
|
|
932
1081
|
fresh,
|
|
933
1082
|
delegations: delegations.length === 0 ? void 0 : delegations,
|
|
1083
|
+
levels,
|
|
1084
|
+
oauthScopes: oauthScopes.length === 0 ? void 0 : oauthScopes,
|
|
934
1085
|
index: indexPolicy(roles, grants, vocabulary)
|
|
935
1086
|
});
|
|
936
1087
|
}
|
|
@@ -968,4 +1119,4 @@ function separationConflicts(policy, memberships) {
|
|
|
968
1119
|
return conflicts;
|
|
969
1120
|
}
|
|
970
1121
|
//#endregion
|
|
971
|
-
export {
|
|
1122
|
+
export { opaque as S, memoryLimitStore as _, definePolicy as a, assertSqlFunctionArg as b, indexPolicy as c, normalizeApproval as d, normalizeAssurance as f, applyQuota as g, separationConflicts as h, declaredRoleNames as i, levelCondition as l, role as m, assertApprovalRelations as n, deny as o, policyLevels as p, completeGrant as r, grantList as s, allow as t, levelNames as u, normalizeWhere as v, assertSqlFunctionName as x, assertPortableTwin as y };
|