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,9 @@
|
|
|
1
1
|
import { n as isReadonlyArray, r as sole, t as compact } from "./compact-y6vfu2_f.js";
|
|
2
|
-
import { d as isFieldRelation,
|
|
3
|
-
import { c as isConditionRef, i as resolveConditionRef, s as isConditionDate, u as parentHop } from "./refs-
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
2
|
+
import { S as restrictedFor, d as isEdgeRelation, f as isFieldRelation, g as isSelfParented, l as groupEntries, m as isPrincipalRelation, r as expandRelation, w as assertSafeKey } from "./permissions-DVoF6dMt.js";
|
|
3
|
+
import { c as isConditionRef, i as resolveConditionRef, s as isConditionDate, u as parentHop } from "./refs-KYb4ntaz.js";
|
|
4
|
+
import { n as PermDockValidationError } from "./validation-error-CnjZ4t92.js";
|
|
5
|
+
import { t as expiredAt } from "./expiry-BoBJ8Tvc.js";
|
|
6
|
+
import { c as rootScope, d as scopeList, l as scopeChain, m as tenantOf, o as resolveScope, p as subjectMemberships } from "./scopes-CVdPrWN-.js";
|
|
6
7
|
//#region src/conditions/graph-sql.ts
|
|
7
8
|
/** A Postgres identifier, schema-qualified names split on `.`. */
|
|
8
9
|
function quoteSqlName(name) {
|
|
@@ -48,25 +49,38 @@ function groupHolders(build, resource, relation) {
|
|
|
48
49
|
/** Who a row of the edge names, when it is not a group of the edge's own resource. */
|
|
49
50
|
function edgeHolderFilter(build, node, spec, alias) {
|
|
50
51
|
const holder = col(alias, spec.subject ?? "user_id");
|
|
51
|
-
const subject = `${holder}::text`;
|
|
52
52
|
const groups = spec.groups;
|
|
53
53
|
if (groups === void 0) return [text(`${holder} = `), { subject: true }];
|
|
54
|
-
const kind = col(alias, groups.column);
|
|
55
|
-
const direct =
|
|
56
|
-
|
|
54
|
+
const kind = groups.column === void 0 ? void 0 : col(alias, groups.column);
|
|
55
|
+
const direct = kind === void 0 ? [
|
|
56
|
+
text(`(${holder} = `),
|
|
57
|
+
{ subject: true },
|
|
58
|
+
text(")")
|
|
59
|
+
] : [
|
|
57
60
|
text("(("),
|
|
58
|
-
...direct,
|
|
61
|
+
...groups.direct === void 0 ? [text(`${kind} is null`)] : [text(`${kind} is null or ${kind} = `), { value: groups.direct }],
|
|
59
62
|
text(`) and ${holder} = `),
|
|
60
63
|
{ subject: true },
|
|
61
64
|
text(")")
|
|
62
65
|
];
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
+
const parts = [text("("), ...direct];
|
|
67
|
+
for (const group of groupEntries(spec)) {
|
|
68
|
+
if (group.resource === node.name) continue;
|
|
69
|
+
const id = `${col(alias, group.subject)}::text in (`;
|
|
70
|
+
parts.push(...kind === void 0 ? [text(` or (${id}`)] : [
|
|
71
|
+
text(` or (${kind} = `),
|
|
72
|
+
{ value: group.resource },
|
|
73
|
+
text(` and ${id}`)
|
|
74
|
+
], ...groupHolders(build, group.resource, group.relation), text("))"));
|
|
66
75
|
}
|
|
67
76
|
parts.push(text(")"));
|
|
68
77
|
return parts;
|
|
69
78
|
}
|
|
79
|
+
/** The nested-group step of an edge whose groups include its own resource: the row names a group of `node`. */
|
|
80
|
+
function selfGroupWhere(spec, node, subject, alias) {
|
|
81
|
+
const column = spec.groups?.column;
|
|
82
|
+
return column === void 0 ? [text(`${subject} is not null`)] : [text(`${col(alias, column)} = `), { value: node.name }];
|
|
83
|
+
}
|
|
70
84
|
/**
|
|
71
85
|
* One concrete relation's arm: `select <id>::text as id ...` for every
|
|
72
86
|
* instance of `node` the subject holds `relation` on, through groups too.
|
|
@@ -82,14 +96,16 @@ function relationArm(build, node, relation) {
|
|
|
82
96
|
...edgeHolderFilter(build, node, spec, e),
|
|
83
97
|
...edgeRowFilter(spec, e)
|
|
84
98
|
];
|
|
85
|
-
|
|
99
|
+
const self = groupEntries(spec).find((group) => group.resource === node.name);
|
|
100
|
+
if (self === void 0) return base;
|
|
86
101
|
const g = nextAlias(build, "g");
|
|
87
102
|
const n = nextAlias(build, "e");
|
|
103
|
+
const subject = col(n, self.subject);
|
|
88
104
|
return [
|
|
89
105
|
text(`select ${g}.id from (with recursive ${g}(id, level) as (select b.id, 0 from (`),
|
|
90
106
|
...base,
|
|
91
|
-
text(`) b union select ${col(n, object)}::text, ${g}.level + 1 from ${edge} ${n} join ${g} on ${
|
|
92
|
-
|
|
107
|
+
text(`) b union select ${col(n, object)}::text, ${g}.level + 1 from ${edge} ${n} join ${g} on ${subject}::text = ${g}.id where `),
|
|
108
|
+
...selfGroupWhere(spec, node, subject, n),
|
|
93
109
|
text(` and ${g}.level < ${String(16)}`),
|
|
94
110
|
...edgeRowFilter(spec, n),
|
|
95
111
|
text(`) select ${g}.id from ${g}) ${g}`)
|
|
@@ -132,6 +148,11 @@ function relationArmSql(resource, relation, options) {
|
|
|
132
148
|
return relationArm(build, nodeOf(build, resource), relation);
|
|
133
149
|
}
|
|
134
150
|
function heldIds(build, condition) {
|
|
151
|
+
if (condition.permission !== void 0) {
|
|
152
|
+
const permitted = build.options.permitted;
|
|
153
|
+
if (permitted === void 0) throw new Error(`PermDock: inherit(${condition.permission}) has no query form outside generated RLS`);
|
|
154
|
+
return permitted(condition.resource, condition.permission);
|
|
155
|
+
}
|
|
135
156
|
if (condition.ids === void 0) return groupHolders(build, condition.resource, condition.relation);
|
|
136
157
|
if (condition.ids.length === 0) return [text("select null::text as id where false")];
|
|
137
158
|
const parts = [text("select v.id from (values ")];
|
|
@@ -160,7 +181,8 @@ function reached(build, condition) {
|
|
|
160
181
|
}
|
|
161
182
|
const d = nextAlias(build, "d");
|
|
162
183
|
const t = nextAlias(build, "t");
|
|
163
|
-
const
|
|
184
|
+
const stop = restrictedFor(node, "parent");
|
|
185
|
+
const restricted = stop === void 0 ? "" : ` and ${col(t, stop)} is not true`;
|
|
164
186
|
return [
|
|
165
187
|
text(`select ${d}.id from (with recursive ${d}(id, level) as (select h.id, 0 from (`),
|
|
166
188
|
...held,
|
|
@@ -201,6 +223,38 @@ function relatedTargetsSql(condition, options) {
|
|
|
201
223
|
alias: 0
|
|
202
224
|
}, condition);
|
|
203
225
|
}
|
|
226
|
+
function closedRows(build, above) {
|
|
227
|
+
const custom = build.options.restrictedRows?.(above.resource);
|
|
228
|
+
if (custom !== void 0) return custom;
|
|
229
|
+
const table = tableOf(build, nodeOf(build, above.resource).name);
|
|
230
|
+
const span = above.depth - 1;
|
|
231
|
+
const { closure, closureDepths } = build.options;
|
|
232
|
+
const cap = closureDepths?.[above.resource];
|
|
233
|
+
if (closure !== void 0 && (closureDepths === void 0 || cap !== void 0 && cap >= span)) {
|
|
234
|
+
const c = nextAlias(build, "c");
|
|
235
|
+
const a = nextAlias(build, "a");
|
|
236
|
+
const q = nextAlias(build, "q");
|
|
237
|
+
return [
|
|
238
|
+
text(`select ${c}.descendant as id from ${quoteSqlName(closure)} ${c} join ${table} ${a} on ${col(a, above.id)}::text = ${c}.ancestor where ${c}.resource = `),
|
|
239
|
+
{ value: above.resource },
|
|
240
|
+
text(` and ${c}.depth <= ${String(span)} and (${col(a, above.field)} is true or (${c}.depth = ${String(span)} and exists (select 1 from ${table} ${q} where ${col(q, above.id)} = ${col(a, above.parent)})))`)
|
|
241
|
+
];
|
|
242
|
+
}
|
|
243
|
+
const d = nextAlias(build, "d");
|
|
244
|
+
const r = nextAlias(build, "r");
|
|
245
|
+
const t = nextAlias(build, "t");
|
|
246
|
+
const u = nextAlias(build, "t");
|
|
247
|
+
const v = nextAlias(build, "t");
|
|
248
|
+
const w = nextAlias(build, "t");
|
|
249
|
+
const q = nextAlias(build, "q");
|
|
250
|
+
return [text(`select ${d}.id from (with recursive ${d}(id, level) as (select ${col(t, above.id)}::text, 0 from ${table} ${t} where ${col(t, above.field)} is true union select ${col(u, above.id)}::text, ${d}.level + 1 from ${table} ${u} join ${d} on ${col(u, above.parent)}::text = ${d}.id where ${d}.level < ${String(span)}) select ${d}.id from ${d}) ${d} union select ${col(w, above.id)}::text from ${table} ${w} where ${col(w, above.id)}::text not in (select ${r}.id from (with recursive ${r}(id, level) as (select ${col(v, above.id)}::text, 0 from ${table} ${v} where ${col(v, above.parent)} is null or not exists (select 1 from ${table} ${q} where ${col(q, above.id)} = ${col(v, above.parent)}) union select ${col(t, above.id)}::text, ${r}.level + 1 from ${table} ${t} join ${r} on ${col(t, above.parent)}::text = ${r}.id where ${r}.level < ${String(span)}) select ${r}.id from ${r}) ${r})`)];
|
|
251
|
+
}
|
|
252
|
+
function restrictedRowsSql(above, options) {
|
|
253
|
+
return closedRows({
|
|
254
|
+
options,
|
|
255
|
+
alias: 0
|
|
256
|
+
}, above);
|
|
257
|
+
}
|
|
204
258
|
/** Whether the row's restricted column keeps it out of `condition` whatever the graph says. */
|
|
205
259
|
function relatedRowGuard(condition) {
|
|
206
260
|
const hopped = condition.hops !== void 0 && condition.hops.length > 0;
|
|
@@ -212,22 +266,25 @@ function relatedRowGuard(condition) {
|
|
|
212
266
|
* is not restricted.
|
|
213
267
|
*/
|
|
214
268
|
function relatedSql(condition, options) {
|
|
269
|
+
const build = {
|
|
270
|
+
options,
|
|
271
|
+
alias: 0
|
|
272
|
+
};
|
|
215
273
|
const parts = [
|
|
216
274
|
text("coalesce("),
|
|
217
275
|
{ column: condition.field },
|
|
218
276
|
text("::text in ("),
|
|
219
|
-
...
|
|
277
|
+
...targets(build, condition),
|
|
220
278
|
text("), false)")
|
|
221
279
|
];
|
|
222
280
|
const guard = relatedRowGuard(condition);
|
|
223
|
-
|
|
224
|
-
return
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
];
|
|
281
|
+
const above = condition.restrictedAncestors;
|
|
282
|
+
if (guard === void 0 && above === void 0) return parts;
|
|
283
|
+
const out = [text("("), ...parts];
|
|
284
|
+
if (guard !== void 0) out.push(text(" and "), { column: guard }, text(" is not true"));
|
|
285
|
+
if (above !== void 0) out.push(text(" and ("), { column: above.parent }, text(" is null or "), { column: above.parent }, text("::text not in ("), ...closedRows(build, above), text("))"));
|
|
286
|
+
out.push(text(")"));
|
|
287
|
+
return out;
|
|
231
288
|
}
|
|
232
289
|
/**
|
|
233
290
|
* Renders parts to one SQL string: `placeholder(n)` names the n-th bound
|
|
@@ -266,9 +323,6 @@ function scopeColumn(table, scopes, name) {
|
|
|
266
323
|
}
|
|
267
324
|
const NEVER = { kind: "never" };
|
|
268
325
|
const ALWAYS = { kind: "always" };
|
|
269
|
-
function isExpired(membership, now) {
|
|
270
|
-
return membership.expiresAt !== void 0 && membership.expiresAt <= now;
|
|
271
|
-
}
|
|
272
326
|
function isScalar(value) {
|
|
273
327
|
return typeof value === "string" || typeof value === "number" || typeof value === "boolean" || value instanceof Date;
|
|
274
328
|
}
|
|
@@ -363,7 +417,7 @@ function matchingMemberships(condition, subject, now, scopes) {
|
|
|
363
417
|
const memberships = subjectMemberships(subject?.principal?.memberships, scopes);
|
|
364
418
|
const wanted = new Set(condition.roles);
|
|
365
419
|
return memberships.filter((membership) => {
|
|
366
|
-
if (
|
|
420
|
+
if (expiredAt(membership, now)) return false;
|
|
367
421
|
if (wanted.size === 0) return true;
|
|
368
422
|
return membership.roles.some((role) => wanted.has(role));
|
|
369
423
|
});
|
|
@@ -521,6 +575,7 @@ function compileNode(condition, options) {
|
|
|
521
575
|
case "sqlFunction": return compileNode(condition.twin, options);
|
|
522
576
|
case "memberOf": return compileMemberOf(condition, options);
|
|
523
577
|
case "related": return compileRelated(condition, options);
|
|
578
|
+
case "liveSession": return options.subject?.liveSession === true ? ALWAYS : NEVER;
|
|
524
579
|
case "eq":
|
|
525
580
|
case "ne":
|
|
526
581
|
case "gt":
|
|
@@ -555,4 +610,4 @@ function compileWhere(input, options = {}) {
|
|
|
555
610
|
}));
|
|
556
611
|
}
|
|
557
612
|
//#endregion
|
|
558
|
-
export { relatedRowGuard as a, relationArmSql as c, scopeMembershipTable as i, renderGraphSql as l, escapeLike as n, relatedSql as o, scopeColumn as r, relatedTargetsSql as s, compileWhere as t };
|
|
613
|
+
export { relatedRowGuard as a, relationArmSql as c, scopeMembershipTable as i, renderGraphSql as l, escapeLike as n, relatedSql as o, scopeColumn as r, relatedTargetsSql as s, compileWhere as t, restrictedRowsSql as u };
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { Ir as Condition, Pr as Subject, br as Scope, mn as WhereResult } from "./policy-CFZAr_Al.js";
|
|
2
|
+
import { y as ResourceNode } from "./permissions-DttnqqxC.js";
|
|
3
|
+
import { r as RelationsMapping, t as GraphSql } from "./graph-sql-B-dsAT6j.js";
|
|
4
|
+
//#region src/conditions/compile.d.ts
|
|
5
|
+
type MembershipTable = {
|
|
6
|
+
readonly table: string;
|
|
7
|
+
readonly user: string;
|
|
8
|
+
readonly role: string;
|
|
9
|
+
/** Per scope name, the column holding that scope's id (the row's own scope and its ancestors). */
|
|
10
|
+
readonly columns?: Readonly<Record<string, string>>;
|
|
11
|
+
/** Column of the first scope's id; shorthand for `columns[<first scope>]`. */
|
|
12
|
+
readonly tenant?: string;
|
|
13
|
+
/** Column of the second scope's id; shorthand for `columns[<second scope>]`. */
|
|
14
|
+
readonly team?: string;
|
|
15
|
+
readonly id?: string;
|
|
16
|
+
/** Column naming the membership's resource, when one table holds several kinds. */
|
|
17
|
+
readonly resource?: string;
|
|
18
|
+
/** Column holding the membership kind (`Membership.via`); roles with `for` need it. */
|
|
19
|
+
readonly via?: string;
|
|
20
|
+
/** Unix seconds, like `Membership.expiresAt`; `null` never expires. */
|
|
21
|
+
readonly expiresAt?: string;
|
|
22
|
+
};
|
|
23
|
+
type MembershipsMapping = {
|
|
24
|
+
/** The membership table of each named scope. */
|
|
25
|
+
readonly scopes?: Readonly<Record<string, MembershipTable>>;
|
|
26
|
+
/** The first scope's table; shorthand for `scopes[<first scope>]`. */
|
|
27
|
+
readonly tenant?: MembershipTable;
|
|
28
|
+
/** The second scope's table; shorthand for `scopes[<second scope>]`. */
|
|
29
|
+
readonly team?: MembershipTable;
|
|
30
|
+
readonly resource?: Readonly<Record<string, MembershipTable>>;
|
|
31
|
+
};
|
|
32
|
+
type CompileWhereOptions = {
|
|
33
|
+
readonly subject?: Subject;
|
|
34
|
+
readonly memberships?: MembershipsMapping;
|
|
35
|
+
readonly now?: number;
|
|
36
|
+
/** The policy's scopes; `where()` results carry them. Defaults to the implicit `tenant` / `team` pair. */
|
|
37
|
+
readonly scopes?: readonly Scope[];
|
|
38
|
+
/** Where the relation graph lives; without it a `related` node is refused. */
|
|
39
|
+
readonly relations?: RelationsMapping;
|
|
40
|
+
/** The policy's resource graph; `where()` results carry it. */
|
|
41
|
+
readonly resources?: ReadonlyMap<string, ResourceNode>;
|
|
42
|
+
};
|
|
43
|
+
type CompiledCompare = {
|
|
44
|
+
readonly kind: "compare";
|
|
45
|
+
readonly op: "eq" | "ne" | "gt" | "gte" | "lt" | "lte" | "contains" | "in" | "notIn";
|
|
46
|
+
readonly field: string;
|
|
47
|
+
readonly value: unknown;
|
|
48
|
+
};
|
|
49
|
+
type CompiledExists = {
|
|
50
|
+
readonly kind: "exists";
|
|
51
|
+
readonly table: string;
|
|
52
|
+
readonly user: string;
|
|
53
|
+
readonly userValue: string;
|
|
54
|
+
readonly role: string;
|
|
55
|
+
/** Empty means any role. */
|
|
56
|
+
readonly roles: readonly string[];
|
|
57
|
+
readonly rowColumn: string;
|
|
58
|
+
readonly rowField: string;
|
|
59
|
+
readonly expiresAt?: string;
|
|
60
|
+
/** Unix seconds the `expiresAt` column is compared against. */
|
|
61
|
+
readonly now: number;
|
|
62
|
+
/** A membership row matches when this column is `null` or equals `tenantValue`. */
|
|
63
|
+
readonly tenantColumn?: string;
|
|
64
|
+
readonly tenantValue?: string;
|
|
65
|
+
readonly resourceColumn?: string;
|
|
66
|
+
readonly resourceValue?: string;
|
|
67
|
+
};
|
|
68
|
+
type CompiledWhere = {
|
|
69
|
+
readonly kind: "never";
|
|
70
|
+
} | {
|
|
71
|
+
readonly kind: "always";
|
|
72
|
+
} | CompiledCompare | {
|
|
73
|
+
readonly kind: "isNull";
|
|
74
|
+
readonly field: string;
|
|
75
|
+
readonly negated: boolean;
|
|
76
|
+
} | {
|
|
77
|
+
readonly kind: "and" | "or";
|
|
78
|
+
readonly items: readonly CompiledWhere[];
|
|
79
|
+
} | {
|
|
80
|
+
readonly kind: "not";
|
|
81
|
+
readonly item: CompiledWhere;
|
|
82
|
+
} | CompiledExists | CompiledSql;
|
|
83
|
+
/** A Postgres boolean over the row that is never NULL: a `related` node's subquery. */
|
|
84
|
+
type CompiledSql = {
|
|
85
|
+
readonly kind: "sql";
|
|
86
|
+
readonly parts: GraphSql;
|
|
87
|
+
/** What a `{ subject: true }` part binds. */
|
|
88
|
+
readonly subject: string;
|
|
89
|
+
};
|
|
90
|
+
/** A `contains` pattern for `LIKE`: `%`, `_` and the escape itself match literally. */
|
|
91
|
+
declare function escapeLike(value: string): string;
|
|
92
|
+
declare function compileWhere(input: Condition | WhereResult, options?: CompileWhereOptions): CompiledWhere;
|
|
93
|
+
//#endregion
|
|
94
|
+
export { CompiledWhere as a, compileWhere as c, CompiledSql as i, escapeLike as l, CompiledCompare as n, MembershipTable as o, CompiledExists as r, MembershipsMapping as s, CompileWhereOptions as t };
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { t as CliError } from "./errors-CWfoNg9N.js";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { relative, resolve } from "node:path";
|
|
4
|
+
//#region src/cli/config-schema.ts
|
|
5
|
+
const SECTIONS = {
|
|
6
|
+
collect: {
|
|
7
|
+
srcPath: true,
|
|
8
|
+
out: true,
|
|
9
|
+
barrel: true
|
|
10
|
+
},
|
|
11
|
+
catalog: { out: true },
|
|
12
|
+
openapi: { doc: true },
|
|
13
|
+
rls: {
|
|
14
|
+
tables: true,
|
|
15
|
+
dialect: true,
|
|
16
|
+
memberships: true,
|
|
17
|
+
membershipSources: true,
|
|
18
|
+
suspension: true,
|
|
19
|
+
functions: true,
|
|
20
|
+
inlineFunctions: true,
|
|
21
|
+
force: true,
|
|
22
|
+
fixtures: true,
|
|
23
|
+
tenantClaim: true,
|
|
24
|
+
tenantType: true,
|
|
25
|
+
teamType: true,
|
|
26
|
+
scopeTypes: true,
|
|
27
|
+
roleClaim: true,
|
|
28
|
+
gucPrefix: true,
|
|
29
|
+
out: true,
|
|
30
|
+
drizzle: true,
|
|
31
|
+
prisma: true,
|
|
32
|
+
schema: true,
|
|
33
|
+
authorize: true,
|
|
34
|
+
policyPerRole: true,
|
|
35
|
+
customRoles: true,
|
|
36
|
+
capabilities: true,
|
|
37
|
+
anonymousSignIns: true,
|
|
38
|
+
fields: true,
|
|
39
|
+
revokeColumns: true,
|
|
40
|
+
policyName: true,
|
|
41
|
+
rbac: true,
|
|
42
|
+
roles: true,
|
|
43
|
+
actions: true,
|
|
44
|
+
helpersOnly: true,
|
|
45
|
+
rowHelpers: true,
|
|
46
|
+
treeValues: true,
|
|
47
|
+
trustedReaders: true,
|
|
48
|
+
migrate: true,
|
|
49
|
+
shims: true,
|
|
50
|
+
tenants: true,
|
|
51
|
+
customRoleWrites: true,
|
|
52
|
+
anonExecute: true,
|
|
53
|
+
assignments: true,
|
|
54
|
+
approvals: true,
|
|
55
|
+
jsonSchema: true,
|
|
56
|
+
ownershipTriggers: true,
|
|
57
|
+
readOnlyActors: true,
|
|
58
|
+
apiKeys: true,
|
|
59
|
+
realtime: true,
|
|
60
|
+
storage: true
|
|
61
|
+
},
|
|
62
|
+
supabase: { hook: true },
|
|
63
|
+
powersync: {
|
|
64
|
+
out: true,
|
|
65
|
+
resources: true,
|
|
66
|
+
action: true,
|
|
67
|
+
manifest: true
|
|
68
|
+
},
|
|
69
|
+
doctor: {
|
|
70
|
+
sensitiveActions: true,
|
|
71
|
+
memberships: true,
|
|
72
|
+
credentials: true,
|
|
73
|
+
clientEntries: true,
|
|
74
|
+
migrations: true,
|
|
75
|
+
claims: true,
|
|
76
|
+
srcPath: true
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
const TOP_LEVEL = /* @__PURE__ */ new Set([
|
|
80
|
+
"permissions",
|
|
81
|
+
"policy",
|
|
82
|
+
...Object.keys(SECTIONS)
|
|
83
|
+
]);
|
|
84
|
+
function isRecord(value) {
|
|
85
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
86
|
+
}
|
|
87
|
+
function isSection(key) {
|
|
88
|
+
return Object.hasOwn(SECTIONS, key);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Checks the shape a command relies on before it reads the config: module
|
|
92
|
+
* paths are strings and each section is an object. A key PermDock does not
|
|
93
|
+
* read is a warning, so a config written for a newer version still loads.
|
|
94
|
+
*/
|
|
95
|
+
function parseConfig(value, file) {
|
|
96
|
+
if (value === void 0) return {
|
|
97
|
+
config: {},
|
|
98
|
+
warnings: []
|
|
99
|
+
};
|
|
100
|
+
if (!isRecord(value)) throw new CliError("usage", `PermDock CLI: ${file} must export a config object as default (use defineConfig)`);
|
|
101
|
+
const warnings = [];
|
|
102
|
+
const unknown = (path, known) => `${file}: unknown key ${path}; PermDock reads ${[...known].join(", ")}`;
|
|
103
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
104
|
+
if (key === "permissions" || key === "policy") {
|
|
105
|
+
if (entry !== void 0 && typeof entry !== "string") throw new CliError("usage", `PermDock CLI: ${file}: ${key} must be a module path string`);
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
if (!isSection(key)) {
|
|
109
|
+
warnings.push(unknown(key, TOP_LEVEL));
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
if (entry === void 0) continue;
|
|
113
|
+
if (!isRecord(entry)) throw new CliError("usage", `PermDock CLI: ${file}: ${key} must be an object`);
|
|
114
|
+
const known = SECTIONS[key];
|
|
115
|
+
for (const child of Object.keys(entry)) if (!Object.hasOwn(known, child)) warnings.push(unknown(`${key}.${child}`, Object.keys(known)));
|
|
116
|
+
}
|
|
117
|
+
return {
|
|
118
|
+
config: value,
|
|
119
|
+
warnings
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
//#endregion
|
|
123
|
+
//#region src/cli/config.ts
|
|
124
|
+
const CONFIG_FILES = [
|
|
125
|
+
"permdock.config.ts",
|
|
126
|
+
"permdock.config.mts",
|
|
127
|
+
"permdock.config.js",
|
|
128
|
+
"permdock.config.mjs"
|
|
129
|
+
];
|
|
130
|
+
function defineConfig(config) {
|
|
131
|
+
return config;
|
|
132
|
+
}
|
|
133
|
+
function isConfigFile(name) {
|
|
134
|
+
return CONFIG_FILES.some((file) => file === name);
|
|
135
|
+
}
|
|
136
|
+
async function readConfig(cwd, fromFlag, options) {
|
|
137
|
+
const path = fromFlag ? resolve(cwd, fromFlag) : CONFIG_FILES.map((name) => resolve(cwd, name)).find((file) => existsSync(file));
|
|
138
|
+
if (path === void 0) return {
|
|
139
|
+
config: {},
|
|
140
|
+
warnings: [],
|
|
141
|
+
file: void 0
|
|
142
|
+
};
|
|
143
|
+
if (!existsSync(path)) throw new Error(`PermDock CLI: config file not found: ${path}`);
|
|
144
|
+
const { loadModule, pickNamed } = await import("./load-DwJUafYN.js");
|
|
145
|
+
return {
|
|
146
|
+
...parseConfig(pickNamed(await loadModule(path, options), ["default"]), relative(cwd, path).replaceAll("\\", "/")),
|
|
147
|
+
file: path
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
async function loadConfig(cwd, fromFlag, options) {
|
|
151
|
+
return (await readConfig(cwd, fromFlag, options)).config;
|
|
152
|
+
}
|
|
153
|
+
function resolveCwd(cwd, fallback) {
|
|
154
|
+
return cwd === void 0 ? fallback : resolve(fallback, cwd);
|
|
155
|
+
}
|
|
156
|
+
//#endregion
|
|
157
|
+
export { resolveCwd as a, readConfig as i, isConfigFile as n, loadConfig as r, defineConfig as t };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { i as globalArgs, t as COMMAND_DESCRIPTIONS } from "./commands-DWOrSQic.js";
|
|
2
|
+
import { defineCommand } from "citty";
|
|
3
|
+
//#region src/cli/commands/config.ts
|
|
4
|
+
function config(ctx) {
|
|
5
|
+
return defineCommand({
|
|
6
|
+
meta: {
|
|
7
|
+
name: "config",
|
|
8
|
+
description: COMMAND_DESCRIPTIONS.config
|
|
9
|
+
},
|
|
10
|
+
args: {
|
|
11
|
+
...globalArgs,
|
|
12
|
+
print: {
|
|
13
|
+
type: "boolean",
|
|
14
|
+
description: "Print the effective config as JSON: the file, as written, and each default"
|
|
15
|
+
},
|
|
16
|
+
strict: {
|
|
17
|
+
type: "boolean",
|
|
18
|
+
description: "Exit 1 on warnings"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
async run({ args: parsed }) {
|
|
22
|
+
const { runConfig } = await import("./config-report-Dw_JcUqT.js");
|
|
23
|
+
ctx.report(runConfig({
|
|
24
|
+
cwd: ctx.cwd,
|
|
25
|
+
config: ctx.config,
|
|
26
|
+
file: ctx.configPath,
|
|
27
|
+
warnings: ctx.configWarnings,
|
|
28
|
+
print: parsed.print === true,
|
|
29
|
+
json: ctx.json,
|
|
30
|
+
strict: parsed.strict === true
|
|
31
|
+
}));
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
//#endregion
|
|
36
|
+
export { config };
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { n as CONFIG_REPORT_SCHEMA } from "./version-BvacVTZR.js";
|
|
2
|
+
import { t as catalogPath } from "./catalog-path-CnI0XTFK.js";
|
|
3
|
+
import { i as rel, t as defaultSrcPath } from "./files-DWUN9PzI.js";
|
|
4
|
+
import { n as guessPermissions, t as barrelFile } from "./collect-DDDv_ESs.js";
|
|
5
|
+
import "./sources-B0UvrJ21.js";
|
|
6
|
+
import { r as MIGRATION_DIRS } from "./supabase-config-Bs44dare.js";
|
|
7
|
+
import { t as DEFAULT_SENSITIVE_ACTIONS } from "./doctor-collect-ByfYlNv1.js";
|
|
8
|
+
//#region src/cli/config-report.ts
|
|
9
|
+
function configReport(input) {
|
|
10
|
+
const { cwd, config } = input;
|
|
11
|
+
const srcPath = config.collect?.srcPath ?? defaultSrcPath();
|
|
12
|
+
const barrel = config.collect?.barrel;
|
|
13
|
+
return {
|
|
14
|
+
$schema: CONFIG_REPORT_SCHEMA,
|
|
15
|
+
file: input.file === void 0 ? null : rel(cwd, input.file),
|
|
16
|
+
config,
|
|
17
|
+
resolved: {
|
|
18
|
+
permissions: config.permissions ?? guessPermissions(cwd, srcPath) ?? null,
|
|
19
|
+
policy: config.policy ?? null,
|
|
20
|
+
srcPath,
|
|
21
|
+
catalog: rel(cwd, catalogPath(config, cwd)),
|
|
22
|
+
barrel: barrel === void 0 || barrel === false ? false : barrelFile(barrel),
|
|
23
|
+
migrations: config.doctor?.migrations ?? MIGRATION_DIRS,
|
|
24
|
+
sensitiveActions: config.doctor?.sensitiveActions ?? DEFAULT_SENSITIVE_ACTIONS,
|
|
25
|
+
rlsSchema: config.rls?.schema ?? config.rls?.rbac?.schema ?? "permdock"
|
|
26
|
+
},
|
|
27
|
+
warnings: input.warnings
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/** `permdock config`: the config's warnings, or with `--print` or `--json` the effective config. */
|
|
31
|
+
function runConfig(input) {
|
|
32
|
+
const report = configReport(input);
|
|
33
|
+
const code = input.strict && report.warnings.length > 0 ? 1 : 0;
|
|
34
|
+
if (input.print || input.json) return {
|
|
35
|
+
code,
|
|
36
|
+
output: `${JSON.stringify(report, null, 2)}\n`
|
|
37
|
+
};
|
|
38
|
+
return {
|
|
39
|
+
code,
|
|
40
|
+
output: `${[report.file === null ? "no permdock.config file; every option takes its default" : `${report.file}: ${report.warnings.length === 0 ? "ok" : `${String(report.warnings.length)} warning${report.warnings.length === 1 ? "" : "s"}`}`, ...report.warnings.map((warning) => ` warn ${warning}`)].join("\n")}\n`
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//#endregion
|
|
44
|
+
export { runConfig };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as compact } from "./compact-y6vfu2_f.js";
|
|
2
|
-
import { r as PermDockRevokedError } from "./errors-
|
|
2
|
+
import { r as PermDockRevokedError } from "./errors-Cz5zn0mW.js";
|
|
3
3
|
//#region src/server/connection.ts
|
|
4
4
|
/** `setTimeout` stores delays in a signed 32-bit integer. */
|
|
5
5
|
const MAX_DELAY = 2147483647;
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { t as compact } from "./compact-y6vfu2_f.js";
|
|
2
|
-
import {
|
|
3
|
-
import { t as
|
|
4
|
-
import { t as isPromiseLike } from "./source-DoBBYJi2.js";
|
|
2
|
+
import { i as isPromiseLike } from "./store-options-yO0V6gRn.js";
|
|
3
|
+
import { n as switchTenant, t as providerStore } from "./provider-store-DNyC1y48.js";
|
|
5
4
|
import { getContext, onDestroy, setContext } from "svelte";
|
|
6
5
|
import { toStore } from "svelte/store";
|
|
7
6
|
//#region src/svelte/context.ts
|
|
@@ -21,46 +20,56 @@ function connectSvelteStore(options) {
|
|
|
21
20
|
const source = options.snapshot;
|
|
22
21
|
const promised = isPromiseLike(source);
|
|
23
22
|
const reactive = promised ? void 0 : reactiveSource(source);
|
|
24
|
-
let initial
|
|
23
|
+
let initial;
|
|
25
24
|
if (reactive !== void 0) reactive.subscribe((value) => {
|
|
26
25
|
initial = value;
|
|
27
26
|
})();
|
|
28
27
|
else if (!promised) initial = source;
|
|
29
|
-
const
|
|
30
|
-
|
|
28
|
+
const tenant = options.tenant;
|
|
29
|
+
const headers = options.headers;
|
|
30
|
+
const store = providerStore(compact({
|
|
31
31
|
endpoint: options.endpoint,
|
|
32
|
+
snapshotUrl: options.snapshotUrl,
|
|
32
33
|
approvals: options.approvals,
|
|
33
|
-
tenant:
|
|
34
|
+
tenant: typeof tenant === "function" ? tenant() : tenant,
|
|
35
|
+
maxAge: options.maxAge
|
|
36
|
+
}), () => ({
|
|
37
|
+
headers: typeof headers === "function" ? headers() : headers,
|
|
34
38
|
fetch: options.fetch,
|
|
35
|
-
headers: options.headers,
|
|
36
|
-
maxAge: options.maxAge,
|
|
37
39
|
verifier: options.verifier
|
|
38
|
-
}));
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
stop: () => void 0
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
if (reactive === void 0) return {
|
|
47
|
-
store,
|
|
48
|
-
stop: () => void 0
|
|
49
|
-
};
|
|
50
|
-
let current = initial;
|
|
51
|
-
return {
|
|
52
|
-
store,
|
|
53
|
-
stop: reactive.subscribe((value) => {
|
|
40
|
+
}), promised ? source : initial);
|
|
41
|
+
const stops = [];
|
|
42
|
+
if (reactive !== void 0) {
|
|
43
|
+
let current = initial;
|
|
44
|
+
stops.push(reactive.subscribe((value) => {
|
|
54
45
|
if (value !== current) {
|
|
55
46
|
current = value;
|
|
56
47
|
store.replace(value);
|
|
57
48
|
}
|
|
58
|
-
})
|
|
49
|
+
}));
|
|
50
|
+
}
|
|
51
|
+
if (typeof tenant === "function") {
|
|
52
|
+
let active = tenant();
|
|
53
|
+
stops.push(toStore(tenant).subscribe((next) => {
|
|
54
|
+
if (next !== void 0 && next !== active) {
|
|
55
|
+
active = next;
|
|
56
|
+
switchTenant(store, next);
|
|
57
|
+
}
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
store,
|
|
62
|
+
stop: () => {
|
|
63
|
+
for (const stop of stops) stop();
|
|
64
|
+
}
|
|
59
65
|
};
|
|
60
66
|
}
|
|
61
67
|
function providePermDock(options) {
|
|
62
68
|
const { store, stop } = connectSvelteStore(options);
|
|
63
|
-
onDestroy(
|
|
69
|
+
onDestroy(() => {
|
|
70
|
+
stop();
|
|
71
|
+
store.dispose();
|
|
72
|
+
});
|
|
64
73
|
setContext(permDockKey, store);
|
|
65
74
|
return store;
|
|
66
75
|
}
|
package/dist/convex/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { C as Policy,
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
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";
|
|
3
|
+
import { a as ProblemDetails, r as PermDockDeniedError } from "../errors-DAqevpNk.js";
|
|
4
|
+
import { t as InstanceOptions } from "../instance-options-BK_rNOSC.js";
|
|
4
5
|
//#region src/convex/types.d.ts
|
|
5
6
|
type ConvexCtxLike = {
|
|
6
7
|
readonly auth?: {
|
|
@@ -16,8 +17,12 @@ type ConvexQueryBuilder = (definition: {
|
|
|
16
17
|
readonly args: Record<string, never>;
|
|
17
18
|
readonly handler: (ctx: ConvexCtxLike, args: Record<string, never>) => unknown;
|
|
18
19
|
}) => unknown;
|
|
19
|
-
type ConvexPermDockOptions<TCtx, TUser = unknown> = {
|
|
20
|
+
type ConvexPermDockOptions<TCtx, TUser = unknown> = InstanceOptions & {
|
|
20
21
|
readonly subject: ConvexSubject<TCtx, TUser>;
|
|
22
|
+
/** The active tenant: a fixed id or a function of the Convex context; a throw is no tenant. */
|
|
23
|
+
readonly tenant?: string | ((ctx: TCtx) => string | undefined | Promise<string | undefined>);
|
|
24
|
+
/** The agent or service acting for the subject; anything but an `Actor` is ignored. */
|
|
25
|
+
readonly actor?: (ctx: TCtx) => unknown;
|
|
21
26
|
readonly query?: ConvexQueryBuilder;
|
|
22
27
|
};
|
|
23
28
|
type ConvexHandler<TCtx, TArgs, TResult, V extends PolicyVocabulary = PolicyVocabulary> = (ctx: ConvexPermDockCtx<TCtx, V>, args: TArgs) => TResult | Promise<TResult>;
|