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,22 +1,9 @@
|
|
|
1
|
-
//#region src/conditions/graph-sql.d.ts
|
|
2
|
-
/** Where the graph lives in the database, as the `toWhere` compilers take it. */
|
|
3
|
-
type RelationsMapping = {
|
|
4
|
-
/** The table of each resource the graph reads; default the resource name. */
|
|
5
|
-
readonly tables?: Readonly<Record<string, string>>;
|
|
6
|
-
/**
|
|
7
|
-
* A closure table (`resource`, `ancestor`, `descendant`, `depth`) such as
|
|
8
|
-
* the one `permdock rls` keeps. Without it, parent walks are a bounded
|
|
9
|
-
* recursive query over the resource's own table.
|
|
10
|
-
*/
|
|
11
|
-
readonly closure?: string;
|
|
12
|
-
};
|
|
13
|
-
//#endregion
|
|
14
1
|
//#region src/conditions/subject-settings.d.ts
|
|
15
2
|
type WithSubjectOptions = {
|
|
16
3
|
/** Which settings the generated policies read; match `rls.dialect`. Default `supabase`. */
|
|
17
4
|
readonly dialect?: "supabase" | "guc" | "neon";
|
|
18
5
|
/**
|
|
19
|
-
*
|
|
6
|
+
* The local `role` setting before the claims: `authenticated` with a principal, `anon` without.
|
|
20
7
|
* `false` keeps the connection's role, for a login role that RLS already applies to.
|
|
21
8
|
*/
|
|
22
9
|
readonly role?: "authenticated" | "anon" | false;
|
|
@@ -29,6 +16,16 @@ type WithSubjectOptions = {
|
|
|
29
16
|
* helpers. `sub`, `role` and the tenant claim always come from the subject.
|
|
30
17
|
*/
|
|
31
18
|
readonly claims?: Readonly<Record<string, unknown>>;
|
|
19
|
+
/**
|
|
20
|
+
* Field names of the API-key claim written for a principal that acts through a credential
|
|
21
|
+
* (`rls.apiKeys`). Default `{ claim: 'api_key', scopes: 'scopes', tenant: 'tenant', roles: 'roles' }`.
|
|
22
|
+
*/
|
|
23
|
+
readonly apiKeys?: {
|
|
24
|
+
readonly claim?: string;
|
|
25
|
+
readonly scopes?: string;
|
|
26
|
+
readonly tenant?: string;
|
|
27
|
+
readonly roles?: string;
|
|
28
|
+
};
|
|
32
29
|
};
|
|
33
30
|
//#endregion
|
|
34
31
|
//#region src/conditions/row-check.d.ts
|
|
@@ -40,4 +37,4 @@ type RowCheck = {
|
|
|
40
37
|
readonly granted: boolean;
|
|
41
38
|
};
|
|
42
39
|
//#endregion
|
|
43
|
-
export { WithSubjectOptions as n,
|
|
40
|
+
export { WithSubjectOptions as n, RowCheck as t };
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { t as compact } from "./compact-y6vfu2_f.js";
|
|
2
|
+
import { o as requestFromContext } from "./http-SO7qGttf.js";
|
|
3
|
+
import { n as tenantScope } from "./adapter-context-mlWsVGGg.js";
|
|
4
|
+
import { t as adapterKernel } from "./bind-VnYn2HKq.js";
|
|
5
|
+
import { n as guardIterable } from "./stream-DDpvynSB.js";
|
|
6
|
+
//#region src/server/rpc.ts
|
|
7
|
+
/** The tRPC and oRPC error code for a Problem Details status. */
|
|
8
|
+
function rpcCode(status) {
|
|
9
|
+
switch (status) {
|
|
10
|
+
case 400: return "BAD_REQUEST";
|
|
11
|
+
case 401: return "UNAUTHORIZED";
|
|
12
|
+
case 404: return "NOT_FOUND";
|
|
13
|
+
case 429: return "TOO_MANY_REQUESTS";
|
|
14
|
+
case 503: return "SERVICE_UNAVAILABLE";
|
|
15
|
+
default: return "FORBIDDEN";
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* The Problem Details body of a PermDock response, or `{ status }` when it has
|
|
20
|
+
* none. An RPC error carries only this body; the response headers are dropped.
|
|
21
|
+
*/
|
|
22
|
+
async function problemBody(response) {
|
|
23
|
+
try {
|
|
24
|
+
return await response.json();
|
|
25
|
+
} catch {
|
|
26
|
+
return { status: response.status };
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* The kernel of an RPC adapter. `contextOf` reads the procedure context from
|
|
31
|
+
* its opts; `path` names the fallback `Request` for a context without one.
|
|
32
|
+
*/
|
|
33
|
+
function bindRpcKernel(policy, options, adapter, contextOf, path) {
|
|
34
|
+
const optsByRequest = /* @__PURE__ */ new WeakMap();
|
|
35
|
+
const requestByCtx = /* @__PURE__ */ new WeakMap();
|
|
36
|
+
const kernel = adapterKernel(policy, options, adapter, (request) => optsByRequest.get(request));
|
|
37
|
+
const requestOf = (ctx) => {
|
|
38
|
+
if (options.request !== void 0) try {
|
|
39
|
+
return options.request(ctx) ?? void 0;
|
|
40
|
+
} catch {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
return requestFromContext(ctx);
|
|
44
|
+
};
|
|
45
|
+
const bind = (opts) => {
|
|
46
|
+
const ctx = contextOf(opts);
|
|
47
|
+
const key = ctx;
|
|
48
|
+
const hit = requestByCtx.get(key);
|
|
49
|
+
if (hit !== void 0) return hit;
|
|
50
|
+
const request = requestOf(ctx) ?? new Request(`http://localhost/${adapter}/${path(opts)}`, { method: "POST" });
|
|
51
|
+
requestByCtx.set(key, request);
|
|
52
|
+
if (!optsByRequest.has(request)) optsByRequest.set(request, opts);
|
|
53
|
+
return request;
|
|
54
|
+
};
|
|
55
|
+
const scopeOf = (opts) => tenantScope(options.tenant, opts);
|
|
56
|
+
const connection = async (opts, connectionOptions) => kernel.connection(bind(opts), connectionOptions, await scopeOf(opts));
|
|
57
|
+
const evaluations = kernel.permdockHandler((request) => {
|
|
58
|
+
const opts = optsByRequest.get(request);
|
|
59
|
+
return opts === void 0 ? { tenant: void 0 } : scopeOf(opts);
|
|
60
|
+
});
|
|
61
|
+
const evaluate = (request, opts) => {
|
|
62
|
+
bind(opts);
|
|
63
|
+
return request.method === "GET" ? evaluations.GET(request) : evaluations.POST(request);
|
|
64
|
+
};
|
|
65
|
+
return {
|
|
66
|
+
kernel,
|
|
67
|
+
bind,
|
|
68
|
+
attach: (ctx, request) => {
|
|
69
|
+
requestByCtx.set(ctx, request);
|
|
70
|
+
},
|
|
71
|
+
scopeOf,
|
|
72
|
+
connection,
|
|
73
|
+
evaluate
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/** Wraps a streamed result so revocation ends it and items the subscriber cannot read drop. */
|
|
77
|
+
async function guardStream(source, open, permission, loadData, protectOptions, guard) {
|
|
78
|
+
const conn = await open(permission === null ? {} : compact({
|
|
79
|
+
permission,
|
|
80
|
+
data: loadData
|
|
81
|
+
}));
|
|
82
|
+
return guardIterable(source, conn, compact({
|
|
83
|
+
items: protectOptions?.items,
|
|
84
|
+
unwrap: guard.unwrap,
|
|
85
|
+
onRevoked: guard.onRevoked
|
|
86
|
+
}));
|
|
87
|
+
}
|
|
88
|
+
//#endregion
|
|
89
|
+
export { rpcCode as i, guardStream as n, problemBody as r, bindRpcKernel as t };
|
|
@@ -1,11 +1,16 @@
|
|
|
1
|
-
import { a as
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { i as
|
|
5
|
-
import { defineCommand, parseArgs, renderUsage, runCommand } from "citty";
|
|
1
|
+
import { a as exitCodeOf, i as describeError, n as cliErrorKind, r as cliProblem } from "./errors-CWfoNg9N.js";
|
|
2
|
+
import { o as cliVersion } from "./version-BvacVTZR.js";
|
|
3
|
+
import { a as resolveCwd, i as readConfig } from "./config-BJiM-xAm.js";
|
|
4
|
+
import { i as globalArgs, n as commands, o as resolveArgs, r as isCommand, s as stringArg, t as COMMAND_DESCRIPTIONS } from "./commands-DWOrSQic.js";
|
|
6
5
|
import { stripVTControlCharacters } from "node:util";
|
|
6
|
+
import { defineCommand, parseArgs, renderUsage, runCommand } from "citty";
|
|
7
7
|
//#region src/cli/run.ts
|
|
8
8
|
const NAMES = Object.keys(commands).filter(isCommand);
|
|
9
|
+
const NO_CONFIG = {
|
|
10
|
+
config: {},
|
|
11
|
+
warnings: [],
|
|
12
|
+
file: void 0
|
|
13
|
+
};
|
|
9
14
|
async function run(argv, options) {
|
|
10
15
|
const stdoutChunks = [];
|
|
11
16
|
const stderrChunks = [];
|
|
@@ -41,9 +46,13 @@ async function run(argv, options) {
|
|
|
41
46
|
const first = globals._[0];
|
|
42
47
|
const name = first === "help" ? globals._[1] : first;
|
|
43
48
|
let result;
|
|
44
|
-
const
|
|
49
|
+
const configFile = stringArg(globals.config);
|
|
50
|
+
const contextFor = (cwd, loaded = NO_CONFIG) => ({
|
|
45
51
|
cwd,
|
|
46
|
-
config,
|
|
52
|
+
config: loaded.config,
|
|
53
|
+
...configFile === void 0 ? {} : { configFile },
|
|
54
|
+
...loaded.file === void 0 ? {} : { configPath: loaded.file },
|
|
55
|
+
configWarnings: loaded.warnings,
|
|
47
56
|
io,
|
|
48
57
|
now: io.now?.() ?? /* @__PURE__ */ new Date(),
|
|
49
58
|
json,
|
|
@@ -66,7 +75,7 @@ async function run(argv, options) {
|
|
|
66
75
|
}
|
|
67
76
|
if (askedHelp || first === "help" || name === void 0) {
|
|
68
77
|
const root = rootCommand();
|
|
69
|
-
const usage = name === void 0 ? await renderUsage(root) : await renderUsage(await load(name, contextFor(options?.cwd ?? process.cwd()
|
|
78
|
+
const usage = name === void 0 ? await renderUsage(root) : await renderUsage(await load(name, contextFor(options?.cwd ?? process.cwd())), root);
|
|
70
79
|
if (name === void 0 && !askedHelp && first !== "help") {
|
|
71
80
|
writeErr(plain(usage));
|
|
72
81
|
return done(2);
|
|
@@ -75,14 +84,15 @@ async function run(argv, options) {
|
|
|
75
84
|
return done(0);
|
|
76
85
|
}
|
|
77
86
|
const cwd = resolveCwd(stringArg(globals.cwd), options?.cwd ?? process.cwd());
|
|
78
|
-
let
|
|
87
|
+
let loaded;
|
|
79
88
|
try {
|
|
80
|
-
|
|
89
|
+
loaded = await readConfig(cwd, configFile);
|
|
81
90
|
} catch (error) {
|
|
82
|
-
return fail(cliErrorKind(error),
|
|
91
|
+
return fail(cliErrorKind(error), describeError(error));
|
|
83
92
|
}
|
|
93
|
+
if (name !== "config") for (const warning of loaded.warnings) writeErr(`permdock: warning: ${warning}`);
|
|
84
94
|
try {
|
|
85
|
-
const command = await load(name, contextFor(cwd,
|
|
95
|
+
const command = await load(name, contextFor(cwd, loaded));
|
|
86
96
|
const rawArgs = withoutCommand(argv, name);
|
|
87
97
|
await runCommand(command, { rawArgs: normaliseValues(rawArgs, await resolveArgs(command)) });
|
|
88
98
|
} catch (error) {
|
|
@@ -91,6 +101,7 @@ async function run(argv, options) {
|
|
|
91
101
|
return fail(cliErrorKind(error), error.message, name);
|
|
92
102
|
}
|
|
93
103
|
if (result === void 0) return done(0);
|
|
104
|
+
if (json && result.code !== 0 && !isJson(result.output)) return fail(result.code === 2 ? "usage" : "failed", result.output, name);
|
|
94
105
|
writeOut(result.output);
|
|
95
106
|
return done(result.code);
|
|
96
107
|
}
|
|
@@ -118,6 +129,14 @@ function rootCommand() {
|
|
|
118
129
|
async function load(name, ctx) {
|
|
119
130
|
return (await commands[name]())(ctx);
|
|
120
131
|
}
|
|
132
|
+
function isJson(text) {
|
|
133
|
+
try {
|
|
134
|
+
JSON.parse(text);
|
|
135
|
+
return true;
|
|
136
|
+
} catch {
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
121
140
|
function lined(text) {
|
|
122
141
|
return text.endsWith("\n") ? text : `${text}\n`;
|
|
123
142
|
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { a as protectedView, s as scopedTenant } from "./views-Soe7bGSC.js";
|
|
2
|
+
//#region src/svelte/protected.ts
|
|
3
|
+
/** The instance for `tenant`, built once per store change rather than once per check. */
|
|
4
|
+
function scopedFor(store, tenant, _generation) {
|
|
5
|
+
return scopedTenant(store.get(), tenant);
|
|
6
|
+
}
|
|
7
|
+
function viewFor(store, reference, data, scoped, _generation) {
|
|
8
|
+
return protectedView(store.permissionState(reference, data), store.get(), reference, data, scoped);
|
|
9
|
+
}
|
|
10
|
+
//#endregion
|
|
11
|
+
export { viewFor as n, scopedFor as t };
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { r as principal } from "./refs-
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { t as memoryRelations } from "./relations-
|
|
6
|
-
import { i as quoteSqlLiteral } from "./sql-
|
|
7
|
-
import { a as saasPlans, i as saasPermissions, o as saasRoles } from "./permissions-
|
|
1
|
+
import { r as principal } from "./refs-KYb4ntaz.js";
|
|
2
|
+
import { _ as memoryLimitStore, a as definePolicy, m as role, o as deny, t as allow } from "./policy-xyWg7QdR.js";
|
|
3
|
+
import { _ as memoryRoleSource } from "./src-CSbUiozF.js";
|
|
4
|
+
import { n as anyone, p as relation } from "./grantee-Cv5Sogfv.js";
|
|
5
|
+
import { t as memoryRelations } from "./relations-cjOL01hZ.js";
|
|
6
|
+
import { i as quoteSqlLiteral } from "./sql-xdg5f4Fi.js";
|
|
7
|
+
import { a as saasPlans, i as saasPermissions, o as saasRoles } from "./permissions-CpZrivYv.js";
|
|
8
8
|
//#region src/testing/saas/policy.ts
|
|
9
9
|
function isSubject(user) {
|
|
10
10
|
return user !== null && "context" in user && "principal" in user;
|
|
@@ -979,6 +979,16 @@ const saasScenarios = Object.freeze([
|
|
|
979
979
|
expected: { outcome: "granted" },
|
|
980
980
|
clientOutcome: "denied"
|
|
981
981
|
},
|
|
982
|
+
{
|
|
983
|
+
name: "team lead does not pass a tenant-level doc check without a row",
|
|
984
|
+
user: "gina",
|
|
985
|
+
tenant: "acme",
|
|
986
|
+
permission: saasPermissions.doc.update,
|
|
987
|
+
expected: {
|
|
988
|
+
outcome: "denied",
|
|
989
|
+
reason: "scope"
|
|
990
|
+
}
|
|
991
|
+
},
|
|
982
992
|
{
|
|
983
993
|
name: "team lead cannot update a locked doc",
|
|
984
994
|
user: "gina",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as freezeDeep } from "./freeze-
|
|
1
|
+
import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
|
|
2
2
|
//#region src/catalog/schema.ts
|
|
3
3
|
const name = {
|
|
4
4
|
type: "string",
|
|
@@ -58,7 +58,7 @@ const approval = { oneOf: [{ const: "human" }, {
|
|
|
58
58
|
/** `schemas/catalog-v1.json`; a test keeps the two equal. */
|
|
59
59
|
const catalogSchema = freezeDeep({
|
|
60
60
|
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
61
|
-
$id: "https://permdock.
|
|
61
|
+
$id: "https://permdock.com/schemas/catalog-v1.json",
|
|
62
62
|
type: "object",
|
|
63
63
|
required: [
|
|
64
64
|
"$schema",
|
|
@@ -85,7 +85,8 @@ const catalogSchema = freezeDeep({
|
|
|
85
85
|
definedIn: { type: "string" },
|
|
86
86
|
relations: { type: "object" },
|
|
87
87
|
version: { type: "string" },
|
|
88
|
-
restricted: { type: "string" }
|
|
88
|
+
restricted: { type: "string" },
|
|
89
|
+
restrictedStops: strings
|
|
89
90
|
}
|
|
90
91
|
}
|
|
91
92
|
},
|
|
@@ -198,6 +199,7 @@ const catalogSchema = freezeDeep({
|
|
|
198
199
|
}
|
|
199
200
|
},
|
|
200
201
|
renamedFrom: strings,
|
|
202
|
+
levels: strings,
|
|
201
203
|
hostable: { const: true },
|
|
202
204
|
rowConditions: { type: "boolean" },
|
|
203
205
|
approvals: {
|
|
@@ -250,6 +252,7 @@ const catalogSchema = freezeDeep({
|
|
|
250
252
|
validity,
|
|
251
253
|
name: { type: "string" },
|
|
252
254
|
purpose: strings,
|
|
255
|
+
requires: { oneOf: [{ type: "string" }, strings] },
|
|
253
256
|
limit: {
|
|
254
257
|
type: "object",
|
|
255
258
|
required: ["count", "per"],
|
|
@@ -282,7 +285,8 @@ const catalogSchema = freezeDeep({
|
|
|
282
285
|
required: ["kind"],
|
|
283
286
|
properties: {
|
|
284
287
|
kind: { type: "string" },
|
|
285
|
-
id: { type: "string" }
|
|
288
|
+
id: { type: "string" },
|
|
289
|
+
client: { type: "string" }
|
|
286
290
|
}
|
|
287
291
|
},
|
|
288
292
|
permissions: strings,
|
package/dist/scim/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { A as ScimPageResult, C as LIST_SCHEMA, D as ScimFilter, E as SCIM_CONTENT_TYPE, M as ScimTokenOptions, N as USER_SCHEMA, O as ScimHandlerOptions, S as GROUP_SCHEMA, T as ROLES_EXTENSION, _ as DirectoryNotFoundError, a as scimHandler, b as DirectoryUser, c as parseScimFilter, d as serviceProviderConfig, f as authenticateScim, g as DirectoryMembershipSourceOptions, h as DirectoryGroup, i as tenantFromPath, j as ScimPatchOp, k as ScimPage, l as resourceTypes, m as DirectoryChange, n as directoryMembershipSource, o as filterSupported, p as sha256Hex, r as normalizePatchOps, s as matchFilter, t as memoryDirectoryStore, u as schemas, v as DirectoryStore, w as PATCH_SCHEMA, x as ERROR_SCHEMA, y as DirectoryUniquenessError } from "../index-
|
|
1
|
+
import { A as ScimPageResult, C as LIST_SCHEMA, D as ScimFilter, E as SCIM_CONTENT_TYPE, M as ScimTokenOptions, N as USER_SCHEMA, O as ScimHandlerOptions, S as GROUP_SCHEMA, T as ROLES_EXTENSION, _ as DirectoryNotFoundError, a as scimHandler, b as DirectoryUser, c as parseScimFilter, d as serviceProviderConfig, f as authenticateScim, g as DirectoryMembershipSourceOptions, h as DirectoryGroup, i as tenantFromPath, j as ScimPatchOp, k as ScimPage, l as resourceTypes, m as DirectoryChange, n as directoryMembershipSource, o as filterSupported, p as sha256Hex, r as normalizePatchOps, s as matchFilter, t as memoryDirectoryStore, u as schemas, v as DirectoryStore, w as PATCH_SCHEMA, x as ERROR_SCHEMA, y as DirectoryUniquenessError } from "../index-A0YNL8jZ.js";
|
|
2
2
|
export { type DirectoryChange, type DirectoryGroup, type DirectoryMembershipSourceOptions, DirectoryNotFoundError, type DirectoryStore, DirectoryUniquenessError, type DirectoryUser, ERROR_SCHEMA, GROUP_SCHEMA, LIST_SCHEMA, PATCH_SCHEMA, ROLES_EXTENSION, SCIM_CONTENT_TYPE, type ScimFilter, type ScimHandlerOptions, type ScimPage, type ScimPageResult, type ScimPatchOp, type ScimTokenOptions, USER_SCHEMA, authenticateScim, directoryMembershipSource, filterSupported, matchFilter, memoryDirectoryStore, normalizePatchOps, parseScimFilter, resourceTypes, schemas, scimHandler, serviceProviderConfig, sha256Hex, tenantFromPath };
|
package/dist/scim/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { S as sha256Hex, _ as PATCH_SCHEMA, a as normalizePatchOps, b as USER_SCHEMA, c as parseScimFilter, d as serviceProviderConfig, f as DirectoryNotFoundError, g as LIST_SCHEMA, h as GROUP_SCHEMA, i as tenantFromPath, l as resourceTypes, m as ERROR_SCHEMA, n as directoryMembershipSource, o as filterSupported, p as DirectoryUniquenessError, r as scimHandler, s as matchFilter, t as memoryDirectoryStore, u as schemas, v as ROLES_EXTENSION, x as authenticateScim, y as SCIM_CONTENT_TYPE } from "../scim-
|
|
1
|
+
import { S as sha256Hex, _ as PATCH_SCHEMA, a as normalizePatchOps, b as USER_SCHEMA, c as parseScimFilter, d as serviceProviderConfig, f as DirectoryNotFoundError, g as LIST_SCHEMA, h as GROUP_SCHEMA, i as tenantFromPath, l as resourceTypes, m as ERROR_SCHEMA, n as directoryMembershipSource, o as filterSupported, p as DirectoryUniquenessError, r as scimHandler, s as matchFilter, t as memoryDirectoryStore, u as schemas, v as ROLES_EXTENSION, x as authenticateScim, y as SCIM_CONTENT_TYPE } from "../scim-BFGBBAqR.js";
|
|
2
2
|
export { DirectoryNotFoundError, DirectoryUniquenessError, ERROR_SCHEMA, GROUP_SCHEMA, LIST_SCHEMA, PATCH_SCHEMA, ROLES_EXTENSION, SCIM_CONTENT_TYPE, USER_SCHEMA, authenticateScim, directoryMembershipSource, filterSupported, matchFilter, memoryDirectoryStore, normalizePatchOps, parseScimFilter, resourceTypes, schemas, scimHandler, serviceProviderConfig, sha256Hex, tenantFromPath };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { n as isReadonlyArray, t as compact } from "./compact-y6vfu2_f.js";
|
|
2
|
-
import { n as freezeDeep } from "./freeze-
|
|
2
|
+
import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
|
|
3
3
|
import { n as sha256 } from "./sha256-BO0swRXL.js";
|
|
4
4
|
import { a as memorySink, i as membershipEvent } from "./sink-Bd9PSyfq.js";
|
|
5
5
|
//#region src/scim/auth.ts
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { T as isForbiddenKey } from "./permissions-DVoF6dMt.js";
|
|
2
|
+
import { t as idText } from "./ids-DC4V4CFu.js";
|
|
2
3
|
//#region src/core/scopes.ts
|
|
3
4
|
const RESERVED = /* @__PURE__ */ new Set(["global", "resource"]);
|
|
4
5
|
const NAME = /^[a-z][a-z0-9_]*$/u;
|
|
@@ -126,17 +127,22 @@ function normalizeMembership(input, scopes) {
|
|
|
126
127
|
const seats = raw["entitlements"].filter((item) => typeof item === "string" && item !== "");
|
|
127
128
|
if (seats.length > 0) extra.entitlements = Object.freeze(seats);
|
|
128
129
|
}
|
|
130
|
+
if (raw["keep"] !== void 0) {
|
|
131
|
+
if (!Array.isArray(raw["keep"]) || !raw["keep"].every((key) => typeof key === "string" && key !== "")) return;
|
|
132
|
+
extra.keep = Object.freeze([...raw["keep"]]);
|
|
133
|
+
}
|
|
129
134
|
const named = raw["scope"] !== void 0 || raw["id"] !== void 0;
|
|
130
135
|
const legacy = raw["tenant"] !== void 0 || raw["team"] !== void 0;
|
|
131
136
|
const on = raw["on"];
|
|
132
137
|
if (on !== void 0) {
|
|
133
138
|
if (named || legacy || on === null || typeof on !== "object") return;
|
|
134
139
|
const target = on;
|
|
135
|
-
|
|
140
|
+
const targetId = idText(target["id"]);
|
|
141
|
+
if (!isId(target["resource"]) || targetId === void 0) return;
|
|
136
142
|
return Object.freeze({
|
|
137
143
|
on: Object.freeze({
|
|
138
144
|
resource: target["resource"],
|
|
139
|
-
id:
|
|
145
|
+
id: targetId
|
|
140
146
|
}),
|
|
141
147
|
roles: Object.freeze([...roles]),
|
|
142
148
|
...extra
|
|
@@ -163,19 +169,20 @@ function normalizeMembership(input, scopes) {
|
|
|
163
169
|
scope = resolveScope(scopes, "tenant");
|
|
164
170
|
id = raw["tenant"];
|
|
165
171
|
}
|
|
166
|
-
|
|
172
|
+
const text = idText(id);
|
|
173
|
+
if (scope === void 0 || text === void 0) return;
|
|
167
174
|
const ancestors = scopeChain(scopes, scope).slice(1);
|
|
168
175
|
const resolved = {};
|
|
169
176
|
for (const key of Object.keys(within)) {
|
|
170
177
|
if (isForbiddenKey(key)) return;
|
|
171
178
|
const name = resolveScope(scopes, key);
|
|
172
|
-
const value = within[key];
|
|
173
|
-
if (name !== void 0 && ancestors.includes(name) &&
|
|
179
|
+
const value = idText(within[key]);
|
|
180
|
+
if (name !== void 0 && ancestors.includes(name) && value !== void 0) resolved[name] = value;
|
|
174
181
|
}
|
|
175
182
|
if (ancestors.some((name) => resolved[name] === void 0)) return;
|
|
176
183
|
return Object.freeze({
|
|
177
184
|
scope,
|
|
178
|
-
id,
|
|
185
|
+
id: text,
|
|
179
186
|
...ancestors.length === 0 ? {} : { within: Object.freeze(resolved) },
|
|
180
187
|
roles: Object.freeze([...roles]),
|
|
181
188
|
...extra
|
|
@@ -208,5 +215,25 @@ function activeFor(membership, scopes, active) {
|
|
|
208
215
|
if (root === void 0 || membership.scope === void 0 || !scopeChain(scopes, membership.scope).includes(root)) return true;
|
|
209
216
|
return active !== void 0 && scopeIdOf(membership, root) === active;
|
|
210
217
|
}
|
|
218
|
+
/** Whether `membership` counts for `key`: always, unless a suspension limits it to `keep`. */
|
|
219
|
+
function keepsPermission(membership, key) {
|
|
220
|
+
return membership.keep === void 0 || membership.keep.includes(key);
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* The subject as it stands for one permission: memberships a suspension
|
|
224
|
+
* limits to other permissions are left out. The same object when none is.
|
|
225
|
+
*/
|
|
226
|
+
function subjectForPermission(subject, key) {
|
|
227
|
+
const principal = subject.principal;
|
|
228
|
+
const memberships = principal?.memberships;
|
|
229
|
+
if (principal === null || memberships === void 0 || memberships.every((membership) => keepsPermission(membership, key))) return subject;
|
|
230
|
+
return {
|
|
231
|
+
...subject,
|
|
232
|
+
principal: {
|
|
233
|
+
...principal,
|
|
234
|
+
memberships: memberships.filter((membership) => keepsPermission(membership, key))
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
}
|
|
211
238
|
//#endregion
|
|
212
|
-
export {
|
|
239
|
+
export { normalizeMemberships as a, rootScope as c, scopeList as d, subjectForPermission as f, keepsPermission as i, scopeChain as l, tenantOf as m, defineScopes as n, resolveScope as o, subjectMemberships as p, findScope as r, rootMembershipId as s, activeFor as t, scopeIdOf as u };
|
package/dist/server/index.d.ts
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
import { $ as
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { $t as CredentialPrincipal, Ct as SettingsSource, Kt as Credential, Nr as Principal, Pr as Subject, Yn as Decision, at as DecisionSink, et as AuthEvent, jt as SubjectResolver, nt as CredentialVerifier } from "../policy-CFZAr_Al.js";
|
|
2
|
+
import { f as Permission, m as PermissionTree } from "../permissions-DttnqqxC.js";
|
|
3
|
+
import { n as PermDockValidationError, t as PROBLEM_BASE } from "../validation-error-CtF23SrC.js";
|
|
4
|
+
import { t as Disclosure } from "../problem-details-CkL50EEf.js";
|
|
5
|
+
import { a as ProblemDetails, i as PermDockRevokedError, n as PermDockApprovalRequiredError, r as PermDockDeniedError, t as ApprovalHint } from "../errors-DAqevpNk.js";
|
|
4
6
|
import { i as memoryRevocationFeed, n as RevocationFeed, t as RevocationEvent } from "../revocations-Cy06JNx2.js";
|
|
5
|
-
import {
|
|
7
|
+
import { A as ConnectionOptions, C as invalidSignatureResponse, D as tenantScope, E as TenantScope, O as Connection, S as invalidSignatureProblem, T as TenantOption, _ as WebBotAuthKeyLookup, a as ScopeGuard, b as WebBotAuthVerifier, c as ServerPermDock, d as createPermDock, f as createServerKernel, g as WebBotAuthJwk, h as InvalidSignatureError, i as ProtectOptions, k as ConnectionData, l as ServerPermDockOptions, m as DiscoverViaSignatureAgentOptions, n as OpenApiHooks, o as ServerKernel, p as createEvaluationsHandler, r as OperationScopes, s as ServerKernelOptions, t as Guard, u as SnapshotQuery, v as WebBotAuthKeys, w as verifyWebBotAuth, x as discoverViaSignatureAgent, y as WebBotAuthOptions } from "../create-BWyx3jua.js";
|
|
8
|
+
import { a as snapshotHeaders, i as cacheLifeFor, n as SnapshotHeaders, o as snapshotTag, r as SnapshotHeadersOptions, t as CacheLifeForOptions } from "../snapshot-cache-DwQH8ufx.js";
|
|
6
9
|
//#region src/server/credentials.d.ts
|
|
7
10
|
/** `on('auth')` causes for an API key that resolves to the anonymous subject. */
|
|
8
11
|
type ApiKeyFailureCause = "malformed" | "unknown-credential" | "invalid-claims" | "expired" | "credential-policy" | "credential-revoked" | "owner-unavailable";
|
|
@@ -100,24 +103,32 @@ type ApiKeySubjectOptions = {
|
|
|
100
103
|
export declare function subjectFromApiKey(options: ApiKeySubjectOptions): SubjectResolver<string | undefined | null, CredentialPrincipal>;
|
|
101
104
|
//#endregion
|
|
102
105
|
//#region src/server/map-error.d.ts
|
|
106
|
+
type ProblemFromErrorOptions = {
|
|
107
|
+
readonly instance?: string;
|
|
108
|
+
/** Whether the request carried credentials, which picks the `401` challenge. */
|
|
109
|
+
readonly credentials?: boolean;
|
|
110
|
+
};
|
|
103
111
|
/**
|
|
104
|
-
* Turns a thrown PermDock error into its Problem Details response
|
|
105
|
-
* `
|
|
112
|
+
* Turns a thrown PermDock error into its Problem Details response, with the
|
|
113
|
+
* status, `WWW-Authenticate` and rate-limit fields `protect` sends for the
|
|
114
|
+
* same decision. Returns `undefined` for anything else so the framework's own
|
|
115
|
+
* error path takes over.
|
|
106
116
|
*/
|
|
107
|
-
export declare function problemFromError(error: unknown): Response | undefined;
|
|
117
|
+
export declare function problemFromError(error: unknown, options?: ProblemFromErrorOptions): Response | undefined;
|
|
108
118
|
//#endregion
|
|
109
119
|
//#region src/server/problem.d.ts
|
|
110
|
-
export declare const PROBLEM_BASE = "https://permdock.dev/problems";
|
|
111
120
|
export declare function wwwAuthenticate(decision: Decision, permission: Permission | undefined, credentials?: boolean): string | undefined;
|
|
112
121
|
export declare function problemResponse(details: ProblemDetails, permission?: Permission, decision?: Decision, extra?: Readonly<Record<string, string>>, credentials?: boolean): Response;
|
|
113
122
|
export declare function validationProblem(detail: string): Response;
|
|
114
|
-
export declare function problemFromDecision(decision: Decision, permission: Permission, subject: Subject, options?: {
|
|
123
|
+
export declare function problemFromDecision(decision: Decision, permission: Permission, subject: Subject | undefined, options?: {
|
|
115
124
|
readonly instance?: string;
|
|
116
125
|
readonly approval?: ApprovalHint;
|
|
117
126
|
/** `'hide'` on a loaded row: a denial answers as `404` `/not-found`. */
|
|
118
|
-
readonly disclosure?:
|
|
127
|
+
readonly disclosure?: Disclosure;
|
|
119
128
|
/** Whether the request carried credentials, which picks the `401` challenge. */
|
|
120
129
|
readonly credentials?: boolean;
|
|
130
|
+
/** The scope an `insufficient_scope` challenge names; the permission's own scope when absent. */
|
|
131
|
+
readonly scope?: string;
|
|
121
132
|
}): Response;
|
|
122
133
|
//#endregion
|
|
123
|
-
export { type ApiKeyFailureCause, type ApiKeyParts, type ApiKeySubjectOptions, type ApprovalHint, type Connection, type ConnectionData, type ConnectionOptions, type DiscoverViaSignatureAgentOptions, type Guard, InvalidSignatureError, type MemoryCredentials, type OpenApiHooks, PermDockApprovalRequiredError, PermDockDeniedError, PermDockRevokedError, PermDockValidationError, type ProtectOptions, type RevocationEvent, type RevocationFeed, type ServerPermDock, type ServerPermDockOptions, type StoredCredential, type WebBotAuthJwk, type WebBotAuthKeyLookup, type WebBotAuthKeys, type WebBotAuthOptions, type WebBotAuthVerifier, createEvaluationsHandler, createPermDock, discoverViaSignatureAgent, invalidSignatureProblem, invalidSignatureResponse, memoryRevocationFeed, verifyWebBotAuth };
|
|
134
|
+
export { type ApiKeyFailureCause, type ApiKeyParts, type ApiKeySubjectOptions, type ApprovalHint, type CacheLifeForOptions, type Connection, type ConnectionData, type ConnectionOptions, type DiscoverViaSignatureAgentOptions, type Guard, InvalidSignatureError, type MemoryCredentials, type OpenApiHooks, type OperationScopes, PROBLEM_BASE, PermDockApprovalRequiredError, PermDockDeniedError, PermDockRevokedError, PermDockValidationError, type ProblemFromErrorOptions, type ProtectOptions, type RevocationEvent, type RevocationFeed, type ScopeGuard, type ServerKernel, type ServerKernelOptions, type ServerPermDock, type ServerPermDockOptions, type SnapshotHeaders, type SnapshotHeadersOptions, type SnapshotQuery, type StoredCredential, type TenantOption, type TenantScope, type WebBotAuthJwk, type WebBotAuthKeyLookup, type WebBotAuthKeys, type WebBotAuthOptions, type WebBotAuthVerifier, cacheLifeFor, createEvaluationsHandler, createPermDock, createServerKernel, discoverViaSignatureAgent, invalidSignatureProblem, invalidSignatureResponse, memoryRevocationFeed, snapshotHeaders, snapshotTag, tenantScope, verifyWebBotAuth };
|
package/dist/server/index.js
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { n as
|
|
6
|
-
import { a as
|
|
7
|
-
import {
|
|
8
|
-
|
|
1
|
+
import { n as PermDockValidationError, t as PROBLEM_BASE } from "../validation-error-CnjZ4t92.js";
|
|
2
|
+
import { n as PermDockDeniedError, r as PermDockRevokedError, t as PermDockApprovalRequiredError } from "../errors-Cz5zn0mW.js";
|
|
3
|
+
import { t as memoryRevocationFeed } from "../revocations-Bhr0aMIC.js";
|
|
4
|
+
import { d as wwwAuthenticate, o as problemFromDecision, s as problemResponse, u as validationProblem } from "../problem-B43ztKIm.js";
|
|
5
|
+
import { n as snapshotHeaders, r as snapshotTag, t as cacheLifeFor } from "../snapshot-cache-D6jLelln.js";
|
|
6
|
+
import { a as invalidSignatureProblem, i as discoverViaSignatureAgent, n as createEvaluationsHandler, o as invalidSignatureResponse, r as InvalidSignatureError, s as verifyWebBotAuth } from "../evaluations-tz6D9A2G.js";
|
|
7
|
+
import { n as tenantScope } from "../adapter-context-mlWsVGGg.js";
|
|
8
|
+
import { n as createServerKernel, t as createPermDock } from "../create-CPhDL6qx.js";
|
|
9
|
+
import { a as parseApiKey, i as memoryCredentials, n as generateApiKey, o as subjectFromApiKey, r as hashApiKey, t as apiKeyVerifier } from "../server-DlZ28Oz5.js";
|
|
10
|
+
import { t as problemFromError } from "../map-error-pgUWNNtG.js";
|
|
11
|
+
export { InvalidSignatureError, PROBLEM_BASE, PermDockApprovalRequiredError, PermDockDeniedError, PermDockRevokedError, PermDockValidationError, apiKeyVerifier, cacheLifeFor, createEvaluationsHandler, createPermDock, createServerKernel, discoverViaSignatureAgent, generateApiKey, hashApiKey, invalidSignatureProblem, invalidSignatureResponse, memoryCredentials, memoryRevocationFeed, parseApiKey, problemFromDecision, problemFromError, problemResponse, snapshotHeaders, snapshotTag, subjectFromApiKey, tenantScope, validationProblem, verifyWebBotAuth, wwwAuthenticate };
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { t as compact } from "./compact-y6vfu2_f.js";
|
|
2
|
-
import { i as credentialTenant, n as credentialPolicyViolation, o as parseCredential, r as credentialSubject } from "./credential-B_rkUNlY.js";
|
|
3
2
|
import { t as bytesToBase64Url } from "./sha256-BO0swRXL.js";
|
|
4
3
|
import { n as isThenable } from "./thenable-okc2xDsj.js";
|
|
5
4
|
import { t as anonymousSubject } from "./subject-C6dLxqHU.js";
|
|
6
5
|
import { r as credentialEvent } from "./sink-Bd9PSyfq.js";
|
|
6
|
+
import { i as credentialTenant, n as credentialPolicyViolation, o as parseCredential, r as credentialSubject } from "./credential-8P81ff4u.js";
|
|
7
7
|
//#region src/server/credentials.ts
|
|
8
8
|
const PREFIX = "pdk_";
|
|
9
9
|
const ID = /^[\w-]{1,128}$/u;
|