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,8 +1,8 @@
|
|
|
1
1
|
import { t as compact } from "./compact-y6vfu2_f.js";
|
|
2
|
-
import {
|
|
2
|
+
import { _ as listPermissions, i as findPermission, p as isPermission } from "./permissions-DVoF6dMt.js";
|
|
3
3
|
import { n as sha256 } from "./sha256-BO0swRXL.js";
|
|
4
4
|
import { t as requiresApproval } from "./approval-required-TzNB9oQA.js";
|
|
5
|
-
import { i as PROFILE_PARAMETERS, n as GNAP_RESERVED, r as PROFILE_NAMES, t as DRAFT_PINS } from "./pins-
|
|
5
|
+
import { i as PROFILE_PARAMETERS, n as GNAP_RESERVED, r as PROFILE_NAMES, t as DRAFT_PINS } from "./pins-8ILTftC9.js";
|
|
6
6
|
//#region src/openapi/emit.ts
|
|
7
7
|
function assertScheme(options) {
|
|
8
8
|
if (options.scheme.type === "gnap") throw new TypeError(GNAP_RESERVED);
|
|
@@ -28,7 +28,7 @@ function mergeRecord(base, extra) {
|
|
|
28
28
|
for (const [key, value] of Object.entries(extra)) result[key] = value;
|
|
29
29
|
return result;
|
|
30
30
|
}
|
|
31
|
-
function scopesOf(policy) {
|
|
31
|
+
function scopesOf$1(policy) {
|
|
32
32
|
const scopes = {};
|
|
33
33
|
for (const leaf of listPermissions(policy.permissions)) scopes[leaf.scope] = leaf.meta.description ?? leaf.meta.title ?? leaf.key;
|
|
34
34
|
return scopes;
|
|
@@ -39,7 +39,7 @@ function flowWithScopes(flow, scopes) {
|
|
|
39
39
|
function securitySchemesOf(policy, options) {
|
|
40
40
|
assertScheme(options);
|
|
41
41
|
const target = options.target ?? "3.2";
|
|
42
|
-
const scopes = scopesOf(policy);
|
|
42
|
+
const scopes = scopesOf$1(policy);
|
|
43
43
|
const name = options.scheme.name;
|
|
44
44
|
if (options.scheme.ref !== void 0 && target !== "3.1") return { [name]: { $ref: options.scheme.ref } };
|
|
45
45
|
const flowsIn = options.scheme.flows ?? { authorizationCode: {} };
|
|
@@ -303,4 +303,236 @@ const createPermDock = (policy, options) => {
|
|
|
303
303
|
};
|
|
304
304
|
};
|
|
305
305
|
//#endregion
|
|
306
|
-
|
|
306
|
+
//#region src/openapi/operations.ts
|
|
307
|
+
const METHODS = /* @__PURE__ */ new Set([
|
|
308
|
+
"GET",
|
|
309
|
+
"PUT",
|
|
310
|
+
"POST",
|
|
311
|
+
"DELETE",
|
|
312
|
+
"OPTIONS",
|
|
313
|
+
"HEAD",
|
|
314
|
+
"PATCH",
|
|
315
|
+
"TRACE",
|
|
316
|
+
"QUERY"
|
|
317
|
+
]);
|
|
318
|
+
function segmentsOf(path) {
|
|
319
|
+
return path.split("/").filter((segment) => segment !== "");
|
|
320
|
+
}
|
|
321
|
+
function isParam(segment) {
|
|
322
|
+
return segment.startsWith("{") && segment.endsWith("}");
|
|
323
|
+
}
|
|
324
|
+
/** The number of literal segments that match, or -1 when the template does not match. */
|
|
325
|
+
function score(route, segments) {
|
|
326
|
+
if (route.segments.length !== segments.length) return -1;
|
|
327
|
+
let literal = 0;
|
|
328
|
+
for (const [index, segment] of route.segments.entries()) {
|
|
329
|
+
if (isParam(segment)) continue;
|
|
330
|
+
if (segment !== segments[index]) return -1;
|
|
331
|
+
literal += 1;
|
|
332
|
+
}
|
|
333
|
+
return literal;
|
|
334
|
+
}
|
|
335
|
+
function isEntryObject(entry) {
|
|
336
|
+
return !isPermission(entry);
|
|
337
|
+
}
|
|
338
|
+
function scopesOf(key, entry) {
|
|
339
|
+
if (!isEntryObject(entry) || entry.oauthScopes === void 0) return;
|
|
340
|
+
const scopes = entry.oauthScopes;
|
|
341
|
+
if (scopes.length === 0 || !scopes.every((scope) => typeof scope === "string" && scope !== "")) throw new TypeError(`PermDock: operation '${key}' sets oauthScopes, which must be a non-empty list of scope names`);
|
|
342
|
+
return Object.freeze([...entry.oauthScopes]);
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Operations as `"METHOD /path/{param}"` keys, the OpenAPI path template, to
|
|
346
|
+
* a permission. `base` is a prefix requests carry and the keys do not
|
|
347
|
+
* (`/api/v1`). A key that is not a method and a path throws.
|
|
348
|
+
*/
|
|
349
|
+
function operationPermissions(operations, options = {}) {
|
|
350
|
+
const routes = [];
|
|
351
|
+
const byId = /* @__PURE__ */ new Map();
|
|
352
|
+
for (const [key, entry] of Object.entries(operations)) {
|
|
353
|
+
const space = key.indexOf(" ");
|
|
354
|
+
const method = key.slice(0, space).toUpperCase();
|
|
355
|
+
const path = key.slice(space + 1).trim();
|
|
356
|
+
if (space <= 0 || !METHODS.has(method) || !path.startsWith("/")) throw new TypeError(`PermDock: operation '${key}' must be a method and a path, such as 'GET /customers/{id}'`);
|
|
357
|
+
const oauthScopes = scopesOf(key, entry);
|
|
358
|
+
if (isEntryObject(entry) && (entry.permission === void 0 ? oauthScopes === void 0 : !isPermission(entry.permission))) throw new TypeError(`PermDock: operation '${key}' needs a permission, oauthScopes or both`);
|
|
359
|
+
const route = {
|
|
360
|
+
method,
|
|
361
|
+
segments: segmentsOf(path),
|
|
362
|
+
permission: isEntryObject(entry) ? entry.permission : entry,
|
|
363
|
+
...oauthScopes === void 0 ? {} : { oauthScopes }
|
|
364
|
+
};
|
|
365
|
+
routes.push(route);
|
|
366
|
+
if (isEntryObject(entry) && entry.operationId !== void 0) byId.set(entry.operationId, route);
|
|
367
|
+
}
|
|
368
|
+
const base = segmentsOf(options.base ?? "");
|
|
369
|
+
const matchMethod = (upper, path) => {
|
|
370
|
+
const full = segmentsOf(path.split("?")[0] ?? "");
|
|
371
|
+
if (base.some((segment, index) => full[index] !== segment)) return;
|
|
372
|
+
const segments = full.slice(base.length);
|
|
373
|
+
let best;
|
|
374
|
+
let bestScore = -1;
|
|
375
|
+
for (const route of routes) {
|
|
376
|
+
if (route.method !== upper) continue;
|
|
377
|
+
const value = score(route, segments);
|
|
378
|
+
if (value > bestScore) {
|
|
379
|
+
best = route;
|
|
380
|
+
bestScore = value;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
return best;
|
|
384
|
+
};
|
|
385
|
+
const match = (method, path) => {
|
|
386
|
+
const upper = method.toUpperCase();
|
|
387
|
+
const route = matchMethod(upper, path);
|
|
388
|
+
return route === void 0 && upper === "HEAD" ? matchMethod("GET", path) : route;
|
|
389
|
+
};
|
|
390
|
+
return {
|
|
391
|
+
forRequest(method, path) {
|
|
392
|
+
return match(method, path)?.permission;
|
|
393
|
+
},
|
|
394
|
+
forOperation(id) {
|
|
395
|
+
return byId.get(id)?.permission;
|
|
396
|
+
},
|
|
397
|
+
oauthScopesForRequest(method, path) {
|
|
398
|
+
return match(method, path)?.oauthScopes;
|
|
399
|
+
},
|
|
400
|
+
oauthScopesForOperation(id) {
|
|
401
|
+
return byId.get(id)?.oauthScopes;
|
|
402
|
+
}
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
function isRecord(value) {
|
|
406
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* The operation permissions an OpenAPI document declares: every operation
|
|
410
|
+
* whose `x-permdock-permissions` names exactly one permission of `tree`, keyed
|
|
411
|
+
* by its method, path and `operationId`. An operation naming none, several or
|
|
412
|
+
* an unknown key is left out, so a gate denies it.
|
|
413
|
+
*/
|
|
414
|
+
function operationPermissionsFromOpenApi(document, tree, options = {}) {
|
|
415
|
+
const operations = {};
|
|
416
|
+
const paths = isRecord(document) && isRecord(document["paths"]) ? document["paths"] : {};
|
|
417
|
+
for (const [path, item] of Object.entries(paths)) {
|
|
418
|
+
if (!isRecord(item)) continue;
|
|
419
|
+
for (const [method, operation] of Object.entries(item)) {
|
|
420
|
+
if (!METHODS.has(method.toUpperCase()) || !isRecord(operation)) continue;
|
|
421
|
+
const keys = operation["x-permdock-permissions"];
|
|
422
|
+
if (!Array.isArray(keys) || keys.length !== 1 || typeof keys[0] !== "string") continue;
|
|
423
|
+
const permission = findPermission(tree, keys[0]);
|
|
424
|
+
if (permission === void 0) continue;
|
|
425
|
+
const operationId = operation["operationId"];
|
|
426
|
+
operations[`${method.toUpperCase()} ${path}`] = typeof operationId === "string" ? {
|
|
427
|
+
permission,
|
|
428
|
+
operationId
|
|
429
|
+
} : permission;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
return operationPermissions(operations, options);
|
|
433
|
+
}
|
|
434
|
+
//#endregion
|
|
435
|
+
//#region src/openapi/problem-details.ts
|
|
436
|
+
const TARGETS = /* @__PURE__ */ new Set([
|
|
437
|
+
"draft-2020-12",
|
|
438
|
+
"draft-07",
|
|
439
|
+
"openapi-3.0"
|
|
440
|
+
]);
|
|
441
|
+
const JSON_SCHEMA = Object.freeze({
|
|
442
|
+
type: "object",
|
|
443
|
+
description: "RFC 9457 Problem Details for a PermDock denial",
|
|
444
|
+
required: [
|
|
445
|
+
"type",
|
|
446
|
+
"title",
|
|
447
|
+
"status",
|
|
448
|
+
"detail"
|
|
449
|
+
],
|
|
450
|
+
properties: {
|
|
451
|
+
type: {
|
|
452
|
+
type: "string",
|
|
453
|
+
format: "uri-reference"
|
|
454
|
+
},
|
|
455
|
+
title: { type: "string" },
|
|
456
|
+
status: {
|
|
457
|
+
type: "integer",
|
|
458
|
+
minimum: 400,
|
|
459
|
+
maximum: 599
|
|
460
|
+
},
|
|
461
|
+
detail: { type: "string" },
|
|
462
|
+
instance: { type: "string" },
|
|
463
|
+
permission: { type: "string" },
|
|
464
|
+
scope: { type: "string" },
|
|
465
|
+
reason: { type: "string" }
|
|
466
|
+
},
|
|
467
|
+
additionalProperties: true
|
|
468
|
+
});
|
|
469
|
+
const REQUIRED_STRINGS = [
|
|
470
|
+
"type",
|
|
471
|
+
"title",
|
|
472
|
+
"detail"
|
|
473
|
+
];
|
|
474
|
+
function issuesOf(value) {
|
|
475
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) return [{ message: "Expected a Problem Details object" }];
|
|
476
|
+
const issues = [];
|
|
477
|
+
const fields = new Map(Object.entries(value));
|
|
478
|
+
for (const key of REQUIRED_STRINGS) if (typeof fields.get(key) !== "string") issues.push({
|
|
479
|
+
message: `Expected a string`,
|
|
480
|
+
path: [key]
|
|
481
|
+
});
|
|
482
|
+
const status = fields.get("status");
|
|
483
|
+
if (typeof status !== "number" || !Number.isInteger(status) || status < 400 || status > 599) issues.push({
|
|
484
|
+
message: "Expected an HTTP error status",
|
|
485
|
+
path: ["status"]
|
|
486
|
+
});
|
|
487
|
+
return issues;
|
|
488
|
+
}
|
|
489
|
+
function isProblem(value) {
|
|
490
|
+
return issuesOf(value).length === 0;
|
|
491
|
+
}
|
|
492
|
+
function jsonSchema(options) {
|
|
493
|
+
if (!TARGETS.has(options.target)) throw new TypeError(`PermDock: problemDetails has no JSON Schema for target ${options.target}`);
|
|
494
|
+
return structuredClone(JSON_SCHEMA);
|
|
495
|
+
}
|
|
496
|
+
/**
|
|
497
|
+
* The Problem Details body the adapters send on a denial, as a Standard
|
|
498
|
+
* Schema with a JSON Schema, for `oc.errors({ FORBIDDEN: { data: problemDetails } })`.
|
|
499
|
+
* Extension members pass through: RFC 9457 lets a problem type add them.
|
|
500
|
+
*/
|
|
501
|
+
const problemDetails = Object.freeze({ "~standard": Object.freeze({
|
|
502
|
+
version: 1,
|
|
503
|
+
vendor: "permdock",
|
|
504
|
+
validate: (value) => isProblem(value) ? { value } : { issues: issuesOf(value) },
|
|
505
|
+
jsonSchema: Object.freeze({
|
|
506
|
+
input: jsonSchema,
|
|
507
|
+
output: jsonSchema
|
|
508
|
+
})
|
|
509
|
+
}) });
|
|
510
|
+
//#endregion
|
|
511
|
+
//#region src/openapi/security.ts
|
|
512
|
+
function isList(permission) {
|
|
513
|
+
return Array.isArray(permission);
|
|
514
|
+
}
|
|
515
|
+
function listOf(permission) {
|
|
516
|
+
return isList(permission) ? permission : [permission];
|
|
517
|
+
}
|
|
518
|
+
/** The `x-permdock-permissions` value: the permission keys an operation enforces. */
|
|
519
|
+
function permissionsExtension(permissions) {
|
|
520
|
+
return Object.freeze(listOf(permissions).map((leaf) => leaf.key));
|
|
521
|
+
}
|
|
522
|
+
/**
|
|
523
|
+
* An operation's `security` and `x-permdock-permissions`, from permission
|
|
524
|
+
* references alone. Needs no policy, so a contract package can import it.
|
|
525
|
+
* Unlike `permdock openapi emit`, it never drops `security` for a public
|
|
526
|
+
* permission: that needs the policy.
|
|
527
|
+
*/
|
|
528
|
+
function securityFor(permission, options = {}) {
|
|
529
|
+
const leaves = listOf(permission);
|
|
530
|
+
const scheme = options.scheme ?? "oauth2";
|
|
531
|
+
const security = options.anyOf === true && leaves.length > 0 ? leaves.map((leaf) => ({ [scheme]: [leaf.scope] })) : [{ [scheme]: leaves.map((leaf) => leaf.scope) }];
|
|
532
|
+
return Object.freeze({
|
|
533
|
+
security,
|
|
534
|
+
"x-permdock-permissions": permissionsExtension(leaves)
|
|
535
|
+
});
|
|
536
|
+
}
|
|
537
|
+
//#endregion
|
|
538
|
+
export { operationPermissionsFromOpenApi as a, openapiVersion as c, operationPermissions as i, securitySchemesOf as l, securityFor as n, createPermDock as o, problemDetails as r, catalogOf as s, permissionsExtension as t };
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { n as validateOverlay, t as validateOpenapi } from "./openapi-schema
|
|
2
|
-
import { c as getResource, i as findPermission } from "./permissions-
|
|
3
|
-
import { a as definePolicy } from "./policy-
|
|
4
|
-
import { a as loadModule, n as asPolicy, o as pickNamed, t as asPermissionTree } from "./load-
|
|
1
|
+
import { n as validateOverlay, t as validateOpenapi } from "./openapi-schema--ARjyfQr.js";
|
|
2
|
+
import { c as getResource, i as findPermission } from "./permissions-DVoF6dMt.js";
|
|
3
|
+
import { a as definePolicy } from "./policy-xyWg7QdR.js";
|
|
4
|
+
import { a as loadModule, n as asPolicy, o as pickNamed, t as asPermissionTree } from "./load-DhWEB9P1.js";
|
|
5
5
|
import { t as shortDiff } from "./text-diff-BdkkYSbi.js";
|
|
6
|
-
import {
|
|
6
|
+
import { c as openapiVersion, o as createPermDock } from "./openapi-BqRBvAng.js";
|
|
7
7
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
8
8
|
import { dirname, resolve } from "node:path";
|
|
9
9
|
//#region src/cli/openapi.ts
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as validateOpenapi } from "./openapi-schema
|
|
1
|
+
import { t as validateOpenapi } from "./openapi-schema--ARjyfQr.js";
|
|
2
2
|
import { t as byCodePoint } from "./compare-pfyVnBjE.js";
|
|
3
3
|
import { i as schemaExpression, t as emitPermissionsModule } from "./generate-CH7ThJ14.js";
|
|
4
4
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as packageRoot } from "./package-root-zGkxO3oN.js";
|
|
2
|
-
import { t as DRAFT_PINS } from "./pins-
|
|
2
|
+
import { t as DRAFT_PINS } from "./pins-8ILTftC9.js";
|
|
3
3
|
import { readFileSync } from "node:fs";
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
//#region \0rolldown/runtime.js
|
|
@@ -6810,7 +6810,7 @@ const STRINGS = {
|
|
|
6810
6810
|
* `components.securityProfileRequirements`). Mutates and returns `schema`.
|
|
6811
6811
|
*/
|
|
6812
6812
|
function patchOas33(schema) {
|
|
6813
|
-
schema["$id"] = `https://permdock.
|
|
6813
|
+
schema["$id"] = `https://permdock.com/schemas/openapi/oas-3.3/${DRAFT_PINS.oas}`;
|
|
6814
6814
|
child(schema, "properties", "openapi")["pattern"] = String.raw`^3\.3\.\d+(-.+)?$`;
|
|
6815
6815
|
const defs = child(schema, "$defs");
|
|
6816
6816
|
const scheme = child(defs, "security-scheme");
|
package/dist/orpc/index.d.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { f as ApprovalStore } from "../types-B8w5PFtS.js";
|
|
1
|
+
import { C as Policy, D as PolicyVocabulary, Nr as Principal, ln as PermDock } from "../policy-CFZAr_Al.js";
|
|
2
|
+
import { f as Permission } from "../permissions-DttnqqxC.js";
|
|
4
3
|
import { n as RevocationFeed } from "../revocations-Cy06JNx2.js";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { t as StreamProtectOptions } from "../stream-
|
|
4
|
+
import { A as ConnectionOptions, O as Connection, n as OpenApiHooks } from "../create-BWyx3jua.js";
|
|
5
|
+
import { t as ServerAdapterOptions } from "../bind-CVy3Espv.js";
|
|
6
|
+
import { t as StreamProtectOptions } from "../stream-DlvG2hs-.js";
|
|
8
7
|
import { Middleware } from "@orpc/server";
|
|
9
8
|
//#region src/orpc/create.d.ts
|
|
10
9
|
type OrpcMiddlewareOpts<TCtx extends object = object, TInput = unknown> = {
|
|
@@ -18,33 +17,15 @@ type OrpcMiddlewareOpts<TCtx extends object = object, TInput = unknown> = {
|
|
|
18
17
|
type OrpcMiddleware<TCtx extends object = object, TInput = unknown, V extends PolicyVocabulary = PolicyVocabulary> = Middleware<TCtx, TCtx & {
|
|
19
18
|
readonly permdock: PermDock<V>;
|
|
20
19
|
readonly permdockData?: unknown;
|
|
21
|
-
}, TInput,
|
|
22
|
-
type OrpcPermDockOptions<TCtx extends object = object, TUser = unknown> = {
|
|
23
|
-
readonly subject: (opts: OrpcMiddlewareOpts<TCtx>) => TUser | Promise<TUser>;
|
|
24
|
-
readonly tenant?: TenantOption<OrpcMiddlewareOpts<TCtx>>;
|
|
20
|
+
}, TInput, any, Record<never, never>>;
|
|
21
|
+
type OrpcPermDockOptions<TCtx extends object = object, TUser = unknown> = ServerAdapterOptions<OrpcMiddlewareOpts<TCtx>, TUser> & {
|
|
25
22
|
/** The Web `Request` behind a context; defaults to `context.request` or `context.req`. */
|
|
26
23
|
readonly request?: (context: TCtx) => Request | null | undefined;
|
|
27
|
-
readonly memberships?: MembershipSource | readonly MembershipSource[];
|
|
28
|
-
/** The object graph for relation grants that walk a parent chain; without it they deny. */
|
|
29
|
-
readonly relations?: RelationSource;
|
|
30
|
-
readonly entitlements?: EntitlementSource;
|
|
31
|
-
readonly customRoles?: RoleSource;
|
|
32
|
-
/** Hosted grants, read once per instance; see `PolicySource`. */
|
|
33
|
-
readonly policies?: PolicySource;
|
|
34
|
-
readonly store?: ApprovalStore;
|
|
35
|
-
readonly sink?: DecisionSink;
|
|
36
|
-
readonly limits?: LimitStore;
|
|
37
|
-
/** `createPermDock` from `permdock/pdp`; `protect` then decides delegated permissions remotely. */
|
|
38
|
-
readonly pdp?: PdpFactory;
|
|
39
|
-
/** Accepted for adapter parity; not read by this adapter. */
|
|
40
|
-
readonly snapshots?: SnapshotSource;
|
|
41
|
-
/** `(request) => verifyWebBotAuth(request, options)`; a verified bot becomes the actor. */
|
|
42
|
-
readonly webBotAuth?: WebBotAuthVerifier;
|
|
43
24
|
/** Ends or revalidates open event iterators. */
|
|
44
25
|
readonly revocations?: RevocationFeed;
|
|
45
26
|
};
|
|
46
27
|
type OrpcOpenApiHooks<TCtx extends object = object, V extends PolicyVocabulary = PolicyVocabulary> = {
|
|
47
|
-
readonly protect: (permission: Permission, loadData?: (opts: OrpcMiddlewareOpts<TCtx>) => unknown, protectOptions?: StreamProtectOptions) => OrpcMiddleware<TCtx, unknown, V>;
|
|
28
|
+
readonly protect: (permission: Permission | null, loadData?: (opts: OrpcMiddlewareOpts<TCtx>) => unknown, protectOptions?: StreamProtectOptions) => OrpcMiddleware<TCtx, unknown, V>;
|
|
48
29
|
readonly security: (permission: Permission) => {
|
|
49
30
|
readonly security: readonly Record<string, readonly string[]>[];
|
|
50
31
|
readonly "x-permdock-permissions": readonly string[];
|
|
@@ -53,12 +34,18 @@ type OrpcOpenApiHooks<TCtx extends object = object, V extends PolicyVocabulary =
|
|
|
53
34
|
};
|
|
54
35
|
type OrpcPermDock<TCtx extends object = object, V extends PolicyVocabulary = PolicyVocabulary> = {
|
|
55
36
|
readonly permdock: () => OrpcMiddleware<TCtx, unknown, V>;
|
|
56
|
-
readonly protect: (permission: Permission, loadData?: (opts: OrpcMiddlewareOpts<TCtx>) => unknown, protectOptions?: StreamProtectOptions) => OrpcMiddleware<TCtx, unknown, V>;
|
|
37
|
+
readonly protect: (permission: Permission | null, loadData?: (opts: OrpcMiddlewareOpts<TCtx>) => unknown, protectOptions?: StreamProtectOptions) => OrpcMiddleware<TCtx, unknown, V>;
|
|
57
38
|
/** A long-lived connection for the request behind `context`. */
|
|
58
39
|
readonly connection: (opts: OrpcMiddlewareOpts<TCtx>, connectionOptions?: ConnectionOptions) => Promise<Connection>;
|
|
59
40
|
readonly permdockHandler: (request: Request) => Promise<Response>;
|
|
60
41
|
readonly openapi: OrpcOpenApiHooks<TCtx, V>;
|
|
61
42
|
};
|
|
43
|
+
/**
|
|
44
|
+
* The permission the procedure's first `protect` decides, or `undefined`
|
|
45
|
+
* when no `protect` is attached. Reads the procedure definition only and
|
|
46
|
+
* never decides.
|
|
47
|
+
*/
|
|
48
|
+
export declare function permissionOf(procedure: unknown): Permission | undefined;
|
|
62
49
|
export declare function createPermDock<TCtx extends object = object, TUser = unknown, TPrincipal extends Principal = Principal, V extends PolicyVocabulary = PolicyVocabulary>(policy: Policy<TUser, TPrincipal, V>, options: OrpcPermDockOptions<TCtx, TUser>): OrpcPermDock<TCtx, V>;
|
|
63
50
|
//#endregion
|
|
64
51
|
export type { OrpcMiddleware, OrpcMiddlewareOpts, OrpcOpenApiHooks, OrpcPermDock, OrpcPermDockOptions };
|
package/dist/orpc/index.js
CHANGED
|
@@ -1,17 +1,12 @@
|
|
|
1
1
|
import { t as compact } from "../compact-y6vfu2_f.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { t as problemFromError } from "../map-error-
|
|
5
|
-
import { n as
|
|
2
|
+
import { p as isPermission } from "../permissions-DVoF6dMt.js";
|
|
3
|
+
import { a as problemMessage } from "../http-SO7qGttf.js";
|
|
4
|
+
import { t as problemFromError } from "../map-error-pgUWNNtG.js";
|
|
5
|
+
import { n as attached } from "../bind-VnYn2HKq.js";
|
|
6
|
+
import { a as reloadAfter, r as isAsyncIterable } from "../stream-DDpvynSB.js";
|
|
7
|
+
import { i as rpcCode, n as guardStream, r as problemBody, t as bindRpcKernel } from "../rpc-DOK54_CS.js";
|
|
6
8
|
import { ORPCError } from "@orpc/server";
|
|
7
9
|
//#region src/orpc/create.ts
|
|
8
|
-
function hasBoundPermDock(context) {
|
|
9
|
-
return context !== null && typeof context === "object" && "permdock" in context && context.permdock !== void 0;
|
|
10
|
-
}
|
|
11
|
-
function requestFromCtx(ctx) {
|
|
12
|
-
if ("request" in ctx && ctx.request instanceof Request) return ctx.request;
|
|
13
|
-
if ("req" in ctx && ctx.req instanceof Request) return ctx.req;
|
|
14
|
-
}
|
|
15
10
|
function toOpts(mw, input, next) {
|
|
16
11
|
return compact({
|
|
17
12
|
context: mw.context,
|
|
@@ -20,156 +15,118 @@ function toOpts(mw, input, next) {
|
|
|
20
15
|
next
|
|
21
16
|
});
|
|
22
17
|
}
|
|
23
|
-
function
|
|
24
|
-
|
|
25
|
-
return fallback;
|
|
18
|
+
function isErrorConstructor(value) {
|
|
19
|
+
return typeof value === "function";
|
|
26
20
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
21
|
+
/** Uses the procedure's own constructor when it declares the code, so the declared status and `defined` apply. */
|
|
22
|
+
function orpcError(code, message, data, errors) {
|
|
23
|
+
const declared = errors !== void 0 && Object.hasOwn(errors, code) ? errors[code] : void 0;
|
|
24
|
+
return isErrorConstructor(declared) ? declared({
|
|
25
|
+
message,
|
|
26
|
+
data
|
|
27
|
+
}) : new ORPCError(code, {
|
|
28
|
+
message,
|
|
29
|
+
data
|
|
30
|
+
});
|
|
36
31
|
}
|
|
37
|
-
function orpcErrorFrom(error) {
|
|
32
|
+
function orpcErrorFrom(error, errors) {
|
|
38
33
|
const problem = error.toProblemDetails();
|
|
39
|
-
return
|
|
40
|
-
message: error.code,
|
|
41
|
-
data: problem
|
|
42
|
-
});
|
|
34
|
+
return orpcError(rpcCode(problem.status), error.code, problem, errors);
|
|
43
35
|
}
|
|
44
|
-
async function throwOrpcError(response) {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
} catch {
|
|
49
|
-
data = { status: response.status };
|
|
50
|
-
}
|
|
51
|
-
const code = orpcCode(response.status);
|
|
52
|
-
throw new ORPCError(code, {
|
|
53
|
-
message: problemMessage(data, code),
|
|
54
|
-
data
|
|
55
|
-
});
|
|
36
|
+
async function throwOrpcError(response, errors) {
|
|
37
|
+
const data = await problemBody(response);
|
|
38
|
+
const code = rpcCode(response.status);
|
|
39
|
+
throw orpcError(code, problemMessage(data, code), data, errors);
|
|
56
40
|
}
|
|
57
41
|
/** A PermDock error thrown further down (an `assert` in a handler) becomes the ORPCError `protect` throws. */
|
|
58
|
-
function mapDownstream(run) {
|
|
42
|
+
function mapDownstream(run, errors) {
|
|
59
43
|
return new Promise((resolve) => {
|
|
60
44
|
resolve(run());
|
|
61
45
|
}).catch((error) => {
|
|
62
46
|
const mapped = problemFromError(error);
|
|
63
47
|
if (mapped === void 0) throw error;
|
|
64
|
-
return throwOrpcError(mapped);
|
|
48
|
+
return throwOrpcError(mapped, errors);
|
|
65
49
|
});
|
|
66
50
|
}
|
|
51
|
+
/** Registered, so a second copy of `permdock` in the bundle reads the same tag. */
|
|
52
|
+
const PERMISSION = Symbol.for("permdock.orpc.permission");
|
|
53
|
+
function tagged(permission, middleware) {
|
|
54
|
+
if (permission !== null) Object.defineProperty(middleware, PERMISSION, { value: permission });
|
|
55
|
+
return middleware;
|
|
56
|
+
}
|
|
57
|
+
function readOwn(value, key) {
|
|
58
|
+
return (typeof value === "object" || typeof value === "function") && value !== null && Object.hasOwn(value, key) ? Reflect.get(value, key) : void 0;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* The permission the procedure's first `protect` decides, or `undefined`
|
|
62
|
+
* when no `protect` is attached. Reads the procedure definition only and
|
|
63
|
+
* never decides.
|
|
64
|
+
*/
|
|
65
|
+
function permissionOf(procedure) {
|
|
66
|
+
const ordered = readOwn(readOwn(procedure, "~orpc"), "orderedMiddlewares");
|
|
67
|
+
if (!Array.isArray(ordered)) return;
|
|
68
|
+
for (const entry of ordered) {
|
|
69
|
+
const permission = readOwn(readOwn(entry, "middleware"), PERMISSION);
|
|
70
|
+
if (isPermission(permission)) return permission;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
67
73
|
function createPermDock(policy, options) {
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
const
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
},
|
|
75
|
-
memberships: options.memberships,
|
|
76
|
-
relations: options.relations,
|
|
77
|
-
entitlements: options.entitlements,
|
|
78
|
-
customRoles: options.customRoles,
|
|
79
|
-
policies: options.policies,
|
|
80
|
-
store: options.store,
|
|
81
|
-
sink: options.sink,
|
|
82
|
-
limits: options.limits,
|
|
83
|
-
pdp: options.pdp,
|
|
84
|
-
webBotAuth: options.webBotAuth,
|
|
85
|
-
revocations: options.revocations,
|
|
86
|
-
adapter: "orpc"
|
|
87
|
-
}));
|
|
88
|
-
const requestOf = (ctx) => {
|
|
89
|
-
if (options.request !== void 0) try {
|
|
90
|
-
return options.request(ctx) ?? void 0;
|
|
91
|
-
} catch {
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
return requestFromCtx(ctx);
|
|
74
|
+
const { kernel, bind, attach, scopeOf, connection, evaluate } = bindRpcKernel(policy, options, "orpc", (opts) => opts.context, (opts) => opts.path?.join(".") ?? "orpc");
|
|
75
|
+
/** Instances this factory built, with the tenant each was built for. */
|
|
76
|
+
const issued = /* @__PURE__ */ new WeakMap();
|
|
77
|
+
const issue = (instance, scope) => {
|
|
78
|
+
issued.set(instance, scope.tenant);
|
|
79
|
+
return instance;
|
|
95
80
|
};
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
*/
|
|
101
|
-
const bind = (opts) => {
|
|
102
|
-
const ctx = opts.context;
|
|
103
|
-
const hit = requestByCtx.get(ctx);
|
|
104
|
-
if (hit !== void 0) return hit;
|
|
105
|
-
const path = opts.path?.join(".") ?? "orpc";
|
|
106
|
-
const request = requestOf(opts.context) ?? new Request(`http://localhost/orpc/${path}`, { method: "POST" });
|
|
107
|
-
requestByCtx.set(ctx, request);
|
|
108
|
-
if (!optsByRequest.has(request)) optsByRequest.set(request, opts);
|
|
109
|
-
return request;
|
|
110
|
-
};
|
|
111
|
-
const scopeOf = (opts) => tenantScope(options.tenant, opts);
|
|
112
|
-
const attach = (ctx, request) => {
|
|
113
|
-
requestByCtx.set(ctx, request);
|
|
81
|
+
const boundFor = (context, scope) => {
|
|
82
|
+
const bound = Reflect.get(context, "permdock");
|
|
83
|
+
if (typeof bound !== "object" || bound === null || !issued.has(bound) || issued.get(bound) !== scope.tenant) return;
|
|
84
|
+
return bound;
|
|
114
85
|
};
|
|
115
86
|
const permdock = () => ((mwOptions, input) => {
|
|
116
87
|
const opts = toOpts(mwOptions, input, mwOptions.next);
|
|
117
|
-
if (hasBoundPermDock(opts.context)) return mwOptions.next({ context: opts.context });
|
|
118
88
|
const request = bind(opts);
|
|
119
|
-
return scopeOf(opts).then((scope) => kernel.permdock(request, scope)).then((instance) => {
|
|
89
|
+
return scopeOf(opts).then((scope) => attached(async () => boundFor(opts.context, scope) ?? issue(await kernel.permdock(request, scope), scope))).then((instance) => {
|
|
90
|
+
if (!instance.ok) return throwOrpcError(instance.response, mwOptions.errors);
|
|
120
91
|
const nextCtx = {
|
|
121
92
|
...opts.context,
|
|
122
|
-
permdock: instance
|
|
93
|
+
permdock: instance.permdock
|
|
123
94
|
};
|
|
124
95
|
attach(nextCtx, request);
|
|
125
|
-
return mapDownstream(() => mwOptions.next({ context: nextCtx }));
|
|
126
|
-
}, (error) => {
|
|
127
|
-
const response = invalidSignatureResponse(error);
|
|
128
|
-
if (response !== void 0) return throwOrpcError(response);
|
|
129
|
-
throw error;
|
|
96
|
+
return mapDownstream(() => mwOptions.next({ context: nextCtx }), mwOptions.errors);
|
|
130
97
|
});
|
|
131
98
|
});
|
|
132
|
-
const connection = async (opts, connectionOptions) => kernel.connection(bind(opts), connectionOptions, await scopeOf(opts));
|
|
133
99
|
/** Wraps an event iterator so revocation ends it and unreadable items drop. */
|
|
134
|
-
const guardOutput = async (result, opts, permission, loadData, protectOptions) => {
|
|
100
|
+
const guardOutput = async (result, opts, permission, loadData, protectOptions, errors) => {
|
|
135
101
|
const output = result !== null && typeof result === "object" && "output" in result ? result.output : void 0;
|
|
136
102
|
if (!isAsyncIterable(output)) return result;
|
|
137
|
-
const conn = await connection(opts, compact({
|
|
138
|
-
permission,
|
|
139
|
-
data: loadData
|
|
140
|
-
}));
|
|
141
103
|
return {
|
|
142
104
|
...result,
|
|
143
|
-
output:
|
|
144
|
-
items: protectOptions?.items,
|
|
145
|
-
onRevoked: orpcErrorFrom
|
|
146
|
-
}))
|
|
105
|
+
output: await guardStream(output, (connectionOptions) => connection(opts, connectionOptions), permission, loadData, protectOptions, { onRevoked: (error) => orpcErrorFrom(error, errors) })
|
|
147
106
|
};
|
|
148
107
|
};
|
|
149
|
-
const protect = (permission, loadData, protectOptions) => (async (mwOptions, input) => {
|
|
108
|
+
const protect = (permission, loadData, protectOptions) => tagged(permission, (async (mwOptions, input) => {
|
|
150
109
|
const opts = toOpts(mwOptions, input, mwOptions.next);
|
|
151
110
|
const request = bind(opts);
|
|
152
|
-
const
|
|
111
|
+
const scope = await scopeOf(opts);
|
|
112
|
+
const guard = await kernel.protect(permission, loadData === void 0 ? void 0 : () => loadData(opts), protectOptions)(request, scope);
|
|
153
113
|
if (guard.ok) {
|
|
154
114
|
const nextCtx = {
|
|
155
115
|
...opts.context,
|
|
156
|
-
permdock: guard.permdock,
|
|
116
|
+
permdock: issue(guard.permdock, scope),
|
|
157
117
|
permdockData: guard.data
|
|
158
118
|
};
|
|
159
119
|
attach(nextCtx, request);
|
|
160
|
-
return guardOutput(await mapDownstream(() => mwOptions.next({ context: nextCtx })), opts, permission, loadData === void 0 ? void 0 : () => loadData(opts), protectOptions);
|
|
120
|
+
return guardOutput(await mapDownstream(() => mwOptions.next({ context: nextCtx }), mwOptions.errors), opts, permission, loadData === void 0 ? void 0 : reloadAfter(guard.data, () => loadData(opts)), protectOptions, mwOptions.errors);
|
|
161
121
|
}
|
|
162
|
-
return throwOrpcError(guard.response);
|
|
163
|
-
});
|
|
122
|
+
return throwOrpcError(guard.response, mwOptions.errors);
|
|
123
|
+
}));
|
|
164
124
|
const permdockHandler = (request) => {
|
|
165
|
-
|
|
125
|
+
return evaluate(request, {
|
|
166
126
|
context: { req: request },
|
|
167
127
|
path: ["permdock"],
|
|
168
128
|
next: (nextOpts) => Promise.resolve(nextOpts ?? { context: { req: request } })
|
|
169
|
-
};
|
|
170
|
-
bind(opts);
|
|
171
|
-
const { POST, GET } = kernel.permdockHandler(() => scopeOf(opts));
|
|
172
|
-
return Promise.resolve(request.method === "GET" ? GET(request) : POST(request));
|
|
129
|
+
});
|
|
173
130
|
};
|
|
174
131
|
const kernelOpenApi = kernel.openapi;
|
|
175
132
|
return {
|
|
@@ -185,4 +142,4 @@ function createPermDock(policy, options) {
|
|
|
185
142
|
};
|
|
186
143
|
}
|
|
187
144
|
//#endregion
|
|
188
|
-
export { createPermDock };
|
|
145
|
+
export { createPermDock, permissionOf };
|
package/dist/otel/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { a as OtelOptions, i as OtelApi, n as GEN_AI_TOOL_CALL_ID, o as OtelWrap, r as GEN_AI_TOOL_NAME, s as StructuralLogger, t as GENAI_SEMCONV_PIN } from "../types-
|
|
1
|
+
import { D as PolicyVocabulary, ln as PermDock } from "../policy-CFZAr_Al.js";
|
|
2
|
+
import { a as OtelOptions, i as OtelApi, n as GEN_AI_TOOL_CALL_ID, o as OtelWrap, r as GEN_AI_TOOL_NAME, s as StructuralLogger, t as GENAI_SEMCONV_PIN } from "../types-vNSDF7Dq.js";
|
|
3
3
|
//#region src/otel/instrument.d.ts
|
|
4
4
|
/**
|
|
5
5
|
* Listens on one instance. Spans carry no duration and no histogram is
|