permdock 0.1.0 → 0.3.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-CKwwqFWz.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 +223 -0
- package/dist/better-supabase/index.js +648 -0
- package/dist/bind-C_ob3LKa.d.ts +25 -0
- package/dist/bind-CuzGytRf.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-BDG_nkxt.d.ts → capability-2kYTMWDv.d.ts} +2 -2
- package/dist/{capability-B68OFnZx.js → capability-4qPdO9gk.js} +7 -5
- package/dist/catalog/index.d.ts +1 -1
- package/dist/catalog/index.js +1 -1
- package/dist/catalog-CRW5Mx_B.js +2 -0
- package/dist/{catalog-H-vFGwWK.js → catalog-DWF5cYqB.js} +4 -4
- package/dist/{catalog-B0E6bggc.js → catalog-dFZdWCGN.js} +2 -2
- package/dist/{catalog-doc-BSo_Q_-6.js → catalog-doc-DdGm82XT.js} +20 -32
- 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-CB_ELYuX.js} +2 -2
- package/dist/{cloud-Cuxr6Czw.js → cloud-DWLXO2af.js} +7 -6
- package/dist/collect-DClJsheJ.js +83 -0
- package/dist/{collect-O-tOtbnk.js → collect-DSTE3ml9.js} +194 -42
- package/dist/collect-DSWOk19R.js +2 -0
- package/dist/{commands-BMh_Etm2.js → commands-DSxCqG9A.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-BkRyBDBw.d.ts +94 -0
- package/dist/config-BJiM-xAm.js +157 -0
- package/dist/config-Dnszbv-6.js +36 -0
- package/dist/config-report-DMvWKUxL.js +44 -0
- package/dist/{connection-JvqwHODC.js → connection-CU8MQxRi.js} +1 -1
- package/dist/{context-CKEAabd7.js → context-Bcy85rGi.js} +36 -27
- package/dist/convex/index.d.ts +9 -4
- package/dist/convex/index.js +14 -4
- package/dist/create-B1d519XK.d.ts +245 -0
- package/dist/create-CMwIl-w2.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-DMYiCjJV.d.ts} +9 -10
- package/dist/{diff-x5Il8LVa.js → diff-2VaeChzX.js} +44 -11
- package/dist/{diff-BUzf5Poi.js → diff-DBIhz_f2.js} +2 -2
- package/dist/{doctor-Bqo6FwUa.js → doctor-BwCAMLx_.js} +2 -2
- package/dist/doctor-collect-CHk6XWOA.js +665 -0
- package/dist/doctor-igIiM_Hl.js +1194 -0
- 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-DPdqI50v.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-CTLijvdm.js} +66 -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-0nNqHspG.d.ts +6 -0
- package/dist/{index-xIxJLwOQ.d.ts → index-BNc7Wer_.d.ts} +75 -7
- package/dist/{index-CltcQ4Bf.d.ts → index-C7Tw7MaW.d.ts} +68 -5
- package/dist/{index-LF_hS-yn.d.ts → index-C8z4RjQV.d.ts} +1 -1
- package/dist/index.d.ts +14 -9
- package/dist/index.js +22 -17
- package/dist/instance-options-Dhhcnm3y.js +22 -0
- package/dist/instance-options-jARdwfPN.d.ts +11 -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-_RRHmnMY.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-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-CwePaF7C.js → openapi-l0xYHkcv.js} +3 -3
- 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-BrMozJCo.js +36 -0
- package/dist/parse-local-manifest-JLnaBH0S.d.ts +10 -0
- package/dist/pdp/index.d.ts +2 -2
- package/dist/pdp/index.js +14 -127
- package/dist/{permdock-yoZ7EjxX.js → permdock-CbgvLnuo.js} +672 -149
- package/dist/{permissions-B8vCg_bI.d.ts → permissions-CDgvKG5L.d.ts} +2 -2
- package/dist/{permissions-DC7GROPA.js → permissions-DVoF6dMt.js} +77 -15
- package/dist/{permissions-B4apnahQ.d.ts → permissions-DttnqqxC.d.ts} +34 -5
- package/dist/{permissions-CofRqesP.js → permissions-RJrovw98.js} +3 -3
- package/dist/{pins-CqE1jZuF.js → pins-8ILTftC9.js} +2 -2
- package/dist/{policy-Cq2fB8Q5.d.ts → policy-D2W7uv19.d.ts} +2 -2
- package/dist/{policy-CInmNGkM.d.ts → policy-IB6yxpC3.d.ts} +351 -42
- package/dist/{policy-ANp36PnI.js → policy-xyWg7QdR.js} +173 -22
- package/dist/powersync-BylawD_U.js +540 -0
- package/dist/powersync-DliZK_-y.js +62 -0
- package/dist/powersync-e_AZrKbg.js +2 -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-DX075l9V.d.ts +7 -0
- package/dist/problem-details-_AMOYz-w.js +144 -0
- package/dist/{protected-BuPAycJT.d.ts → protected-BdnIEFkY.d.ts} +5 -4
- package/dist/protected-utU-SLuy.js +100 -0
- package/dist/protected-xAr24FEC.d.ts +40 -0
- package/dist/provider-CSQd7m92.js +52 -0
- package/dist/{provider-wTAUda2v.d.ts → provider-DZY281jO.d.ts} +1 -1
- package/dist/provider-store-Cfbvo4DE.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-CYyiLiwO.d.ts +5 -0
- package/dist/resource-ref-CaS9yVPi.js +20 -0
- package/dist/revocations-Bhr0aMIC.js +27 -0
- package/dist/{rls-BOFU3chG.js → rls-B4ur8nKQ.js} +8 -3
- package/dist/rls-DQtdgTHB.js +2521 -0
- package/dist/rls-fields-74oZPXWL.js +3582 -0
- package/dist/{rls-graph-DxQ39PJj.js → rls-graph-CHwx0V8q.js} +100 -36
- package/dist/{rls-import-CXV6LBlS.js → rls-import-BTFVk3jH.js} +7 -6
- package/dist/{rls-migrate-DrFPbf8p.js → rls-migrate-CN4TlJTO.js} +6 -5
- package/dist/rls-ownership-RuFqaqGz.js +843 -0
- package/dist/rls-shared-Cewd_-zI.js +495 -0
- package/dist/rls-verify-CVQTHTh5.js +746 -0
- package/dist/{row-check-BajTgQZ-.d.ts → row-check-Dt35czLy.d.ts} +12 -15
- package/dist/row-conditions-h2HythXQ.js +27 -0
- package/dist/rpc-DL9Sqvb1.js +89 -0
- package/dist/{run-CJ6UvS3a.js → run-DKDbM4Du.js} +31 -12
- package/dist/runtime-CB8gQFvS.js +11 -0
- package/dist/{saas-BRrZzJkM.js → saas-DhpJjnBA.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-B1fZzIMf.d.ts} +1 -1
- package/dist/skills-Biq5uup3.js +192 -0
- package/dist/{skills-C_lpV4Jx.js → skills-Bx-U0irG.js} +10 -4
- package/dist/{snapshot-DE8dE_hz.js → snapshot-Enxd0n-s.js} +138 -214
- package/dist/snapshot-cache-B-LxUahj.d.ts +45 -0
- package/dist/snapshot-cache-D6jLelln.js +44 -0
- package/dist/solid/index.d.ts +39 -9
- package/dist/solid/index.js +76 -85
- package/dist/sources-4p0-4xQm.js +545 -0
- package/dist/sources-BdOYLw9j.d.ts +192 -0
- package/dist/{sql-Bll1d7y0.js → sql-xdg5f4Fi.js} +6 -1
- package/dist/{src-CTNT-PBW.js → src-BDwEZWrZ.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-jOBYpiXC.d.ts} +13 -4
- package/dist/store-options-ByhZq1jV.js +716 -0
- package/dist/{stores-CkG2HrSg.js → stores-BT2pSCub.js} +10 -63
- package/dist/{stores-CvOnu_2T.d.ts → stores-C0IMQrGI.d.ts} +20 -9
- package/dist/{stream-BhMfZOwr.d.ts → stream-D1RXubw2.d.ts} +2 -2
- package/dist/{stream-Q_xlB6Ko.js → stream-DDpvynSB.js} +16 -2
- package/dist/subject-settings-BwBmCdTR.js +128 -0
- package/dist/supabase/index.d.ts +133 -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-Boqb9a_Y.js} +3 -3
- package/dist/{supabase-DTxGtYdi.js → supabase-C0qESOa-.js} +347 -367
- package/dist/supabase-config-BpPXt3x1.js +472 -0
- package/dist/supabase-hook-6sYLXg_u.js +2 -0
- package/dist/{supabase-hook-D_OqGb_V.js → supabase-hook-CSLQ4zJ3.js} +1037 -705
- package/dist/supautils-Cn4R4cJ4.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-BnIEz1sU.d.ts +48 -0
- package/dist/{types-CxquUByI.d.ts → types-Bvc4oWT6.d.ts} +1 -1
- package/dist/{sources-DOpW5Ila.d.ts → types-C97IskBw.d.ts} +86 -127
- package/dist/types-CKNSyIf_.d.ts +52 -0
- package/dist/types-Cq_H8N_X.d.ts +197 -0
- package/dist/{types-D6Z6-rKJ.d.ts → types-DbjRN55U.d.ts} +273 -22
- package/dist/{types-BBK-exvJ.d.ts → types-Dnemwd77.d.ts} +7 -1
- package/dist/{types-BvBk1wgn.d.ts → types-DxiCGmmd.d.ts} +5 -3
- package/dist/{types-B9dmiiab.d.ts → types-QCuYJh4q.d.ts} +1 -1
- package/dist/{types-B8w5PFtS.d.ts → types-aqOHTHcp.d.ts} +17 -1
- package/dist/unplugin/index.d.ts +1 -1
- package/dist/unplugin/index.js +10 -9
- package/dist/usage-DorAJiU_.js +2 -0
- package/dist/{usage-1ozMubLY.js → usage-GTixvDDU.js} +2 -2
- package/dist/{usage-CUnK6Ou9.js → usage-ItS7nLcl.js} +225 -62
- package/dist/validation-error-Ba264OaJ.d.ts +26 -0
- package/dist/validation-error-CnjZ4t92.js +33 -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-BwxLTYMZ.js +2 -0
- package/dist/watch-DVBJ9cBq.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,25 +1,35 @@
|
|
|
1
|
-
import { d as isFieldRelation,
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { c as relationArmSql } from "./compile-
|
|
5
|
-
import "./sources-
|
|
6
|
-
import {
|
|
1
|
+
import { S as restrictedFor, d as isEdgeRelation, f as isFieldRelation, g as isSelfParented, l as groupEntries, m as isPrincipalRelation, r as expandRelation } from "./permissions-DVoF6dMt.js";
|
|
2
|
+
import { d as scopeList } from "./scopes-CVdPrWN-.js";
|
|
3
|
+
import { l as inheritCondition, m as relationCondition, s as flattenGrantee } from "./grantee-Cv5Sogfv.js";
|
|
4
|
+
import { c as relationArmSql, u as restrictedRowsSql } from "./compile-Ba4blROR.js";
|
|
5
|
+
import "./sources-4p0-4xQm.js";
|
|
6
|
+
import { E as graphSqlText, G as quoteIdent, J as restrictedHelper, K as quoteLiteral, N as linkHelper, T as graphSqlName, W as qualifiedTable, _ as activeUserSql, d as CLOSURE, q as quoteTable, r as HELPERS, w as graphHelper } from "./rls-shared-Cewd_-zI.js";
|
|
7
7
|
//#region src/cli/helper-calls.ts
|
|
8
8
|
/**
|
|
9
|
-
* Tables whose policies other packages write
|
|
10
|
-
*
|
|
9
|
+
* Tables whose policies other packages write by calling the SQL helpers
|
|
10
|
+
* directly (storage buckets and realtime topics).
|
|
11
11
|
*/
|
|
12
12
|
const HELPER_TABLES = ["storage.objects", "realtime.messages"];
|
|
13
|
-
const HELPER_CALL = new RegExp(String.raw`\b(
|
|
14
|
-
const ANY_HELPER = new RegExp(String.raw`\b(?:${HELPERS.has}
|
|
13
|
+
const HELPER_CALL = new RegExp(String.raw`\b(${HELPERS.has}(?:_permission)?|permitted_[a-z][a-z0-9_]*_ids(?:_by_permission)?)\s*\(\s*'((?:[^']|'')+)'(\s*,\s*(false\b)?)?`, "giu");
|
|
14
|
+
const ANY_HELPER = new RegExp(String.raw`\b(?:${HELPERS.has}(?:_permission)?(?:_for)?|permitted_[a-z][a-z0-9_]*_ids(?:_by_permission)?(?:_for)?|member_[a-z][a-z0-9_]*_ids(?:_for)?)\s*\(`, "iu");
|
|
15
15
|
/** Whether a policy expression calls any generated helper, the key-less `member_<scope>_ids` included. */
|
|
16
16
|
function callsHelper(sql) {
|
|
17
17
|
return ANY_HELPER.test(sql);
|
|
18
18
|
}
|
|
19
|
-
/**
|
|
20
|
-
|
|
19
|
+
/**
|
|
20
|
+
* The permission keys a policy expression passes to `permdock_has`,
|
|
21
|
+
* `permitted_<scope>_ids` or their permission-key forms, `#n` stripped. With
|
|
22
|
+
* `blind`, only the calls that ignore row conditions: the grant-key forms,
|
|
23
|
+
* and a permission-key form asked for conditioned allows. A plain
|
|
24
|
+
* `permdock_has_permission(key)` or `permitted_<scope>_ids_by_permission(key)`
|
|
25
|
+
* counts only allows without a row condition, so it never grants more than
|
|
26
|
+
* the application does.
|
|
27
|
+
*/
|
|
28
|
+
function helperCallKeys(sql, blind = false) {
|
|
21
29
|
const keys = /* @__PURE__ */ new Set();
|
|
22
|
-
for (const [, literal = ""] of sql.matchAll(HELPER_CALL)) {
|
|
30
|
+
for (const [, name = "", literal = "", extra, falsy] of sql.matchAll(HELPER_CALL)) {
|
|
31
|
+
const byPermission = /_permission$/iu.test(name);
|
|
32
|
+
if (blind && byPermission && (extra === void 0 || falsy !== void 0)) continue;
|
|
23
33
|
const key = literal.replaceAll("''", "'").split("#")[0] ?? "";
|
|
24
34
|
if (key !== "") keys.add(key);
|
|
25
35
|
}
|
|
@@ -33,13 +43,13 @@ function helperTable(name) {
|
|
|
33
43
|
const table = tableName(name);
|
|
34
44
|
return HELPER_TABLES.find((candidate) => candidate === table);
|
|
35
45
|
}
|
|
36
|
-
/** `create policy` statements on {@link HELPER_TABLES} in migration SQL, with the keys their helper calls pass. */
|
|
46
|
+
/** `create policy` statements on {@link HELPER_TABLES} in migration SQL, with the keys their condition-blind helper calls pass. */
|
|
37
47
|
function helperTablePolicies(sql) {
|
|
38
48
|
const text = sql.replaceAll(/--[^\n]*/gu, "").replaceAll(/\/\*[\s\S]*?\*\//gu, "");
|
|
39
49
|
const found = [];
|
|
40
50
|
for (const [, name = "", target = "", body = ""] of text.matchAll(CREATE_POLICY)) {
|
|
41
51
|
const table = helperTable(target);
|
|
42
|
-
const keys = helperCallKeys(body);
|
|
52
|
+
const keys = helperCallKeys(body, true);
|
|
43
53
|
if (table !== void 0 && keys.length > 0) found.push({
|
|
44
54
|
table,
|
|
45
55
|
name: name.replaceAll("\"", ""),
|
|
@@ -57,7 +67,7 @@ function helperTablePoliciesFromRows(rows) {
|
|
|
57
67
|
const found = [];
|
|
58
68
|
for (const row of rows) {
|
|
59
69
|
const table = helperTable(String(row["target"] ?? ""));
|
|
60
|
-
const keys = helperCallKeys(String(row["body"] ?? ""));
|
|
70
|
+
const keys = helperCallKeys(String(row["body"] ?? ""), true);
|
|
61
71
|
if (table !== void 0 && keys.length > 0) found.push({
|
|
62
72
|
table,
|
|
63
73
|
name: String(row["policyname"] ?? ""),
|
|
@@ -70,7 +80,7 @@ function helperTablePoliciesFromRows(rows) {
|
|
|
70
80
|
function rowConditionMessage(policy, keys) {
|
|
71
81
|
return `${policy.table} policy '${policy.name}' calls the SQL helpers with ${keys.join(", ")}, whose grants carry row conditions the helpers do not check: the policy grants more than the application does`;
|
|
72
82
|
}
|
|
73
|
-
const ROW_CONDITION_FIX = "
|
|
83
|
+
const ROW_CONDITION_FIX = "call permitted_<scope>_ids_by_permission('<key>') or permdock_has_permission('<key>'), which count only the allows without a row condition (a relationship grant never reaches a topic or a folder), or use a permission whose catalog entry has rowConditions: false";
|
|
74
84
|
//#endregion
|
|
75
85
|
//#region src/cli/rls-graph.ts
|
|
76
86
|
function qualified(ctx, name) {
|
|
@@ -99,15 +109,35 @@ function graphPlan(policy) {
|
|
|
99
109
|
for (const name of expandRelation(node, relation)) {
|
|
100
110
|
const spec = node.relations[name];
|
|
101
111
|
if (!isEdgeRelation(spec) || spec.groups === void 0) continue;
|
|
102
|
-
for (const
|
|
112
|
+
for (const { resource, relation: groupRelation } of groupEntries(spec)) {
|
|
103
113
|
const target = policy.resources.get(resource);
|
|
104
114
|
if (target !== void 0 && target.name !== node.name) addRelation(target, groupRelation);
|
|
105
115
|
}
|
|
106
116
|
}
|
|
107
117
|
};
|
|
118
|
+
const addLinks = (hops) => {
|
|
119
|
+
for (let index = 1; index < hops.length; index += 1) {
|
|
120
|
+
const from = policy.resources.get(hops[index - 1]?.resource ?? "");
|
|
121
|
+
const hop = hops[index];
|
|
122
|
+
if (from !== void 0 && hop !== void 0) entryFor(from).links.add(hop.link);
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
const addAbove = (above) => {
|
|
126
|
+
const node = above === void 0 ? void 0 : policy.resources.get(above.resource);
|
|
127
|
+
if (above === void 0 || node === void 0) return;
|
|
128
|
+
const entry = entryFor(node);
|
|
129
|
+
entry.closure = Math.max(entry.closure ?? 0, above.depth);
|
|
130
|
+
entry.restrictedAncestors = above;
|
|
131
|
+
};
|
|
108
132
|
for (const grant of policy.grants) {
|
|
109
133
|
const row = policy.resources.get(grant.permission.resource);
|
|
110
134
|
for (const item of flattenGrantee(grant.to)) {
|
|
135
|
+
if (item.kind === "inherit") {
|
|
136
|
+
const inherited = inheritCondition(item, row, policy.resources);
|
|
137
|
+
addLinks(inherited?.hops ?? []);
|
|
138
|
+
addAbove(inherited?.restrictedAncestors);
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
111
141
|
if (item.kind !== "relation") continue;
|
|
112
142
|
const condition = relationCondition(item, row, scopes, { resources: policy.resources });
|
|
113
143
|
if (condition?.op !== "related") continue;
|
|
@@ -116,12 +146,8 @@ function graphPlan(policy) {
|
|
|
116
146
|
addRelation(node, condition.relation);
|
|
117
147
|
const entry = entryFor(node);
|
|
118
148
|
if (condition.depth > 0 && isSelfParented(node)) entry.closure = Math.max(entry.closure ?? 0, condition.depth);
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
const from = policy.resources.get(hops[index - 1]?.resource ?? "");
|
|
122
|
-
const hop = hops[index];
|
|
123
|
-
if (from !== void 0 && hop !== void 0) entryFor(from).links.add(hop.link);
|
|
124
|
-
}
|
|
149
|
+
addLinks(condition.hops ?? []);
|
|
150
|
+
addAbove(condition.restrictedAncestors);
|
|
125
151
|
}
|
|
126
152
|
}
|
|
127
153
|
return plan;
|
|
@@ -210,20 +236,22 @@ function closureObjectsSql(ctx, entry, depth, tables) {
|
|
|
210
236
|
const parent = node.parent;
|
|
211
237
|
if (parent === void 0) return "";
|
|
212
238
|
const name = node.name;
|
|
239
|
+
const sqlName = graphSqlName(name) ?? name;
|
|
213
240
|
const closure = qualified(ctx, CLOSURE.table);
|
|
214
241
|
const table = tableSql(tableFor(name, tables));
|
|
215
242
|
const id = quoteIdent(node.id);
|
|
216
243
|
const up = quoteIdent(parent.field);
|
|
217
|
-
const
|
|
218
|
-
const
|
|
219
|
-
const
|
|
220
|
-
const
|
|
244
|
+
const restricted = restrictedFor(node, "parent");
|
|
245
|
+
const stop = restricted === void 0 ? "false" : `coalesce(t.${quoteIdent(restricted)}, false)`;
|
|
246
|
+
const stopParent = restricted === void 0 ? "false" : `coalesce(p.${quoteIdent(restricted)}, false)`;
|
|
247
|
+
const refresh = qualified(ctx, `${CLOSURE.table}_${sqlName}`);
|
|
248
|
+
const changed = qualified(ctx, `${CLOSURE.table}_${sqlName}_changed`);
|
|
221
249
|
const literal = quoteLiteral(name);
|
|
222
|
-
const restrictedChanged =
|
|
223
|
-
const trigger = (suffix) => quoteIdent(`${CLOSURE.table}_${
|
|
224
|
-
return `-- ${name}: rows reach their ancestors up to depth ${String(depth)}, stopping at a restricted row
|
|
225
|
-
drop policy if exists ${quoteIdent(`${CLOSURE.table}_${
|
|
226
|
-
create policy ${quoteIdent(`${CLOSURE.table}_${
|
|
250
|
+
const restrictedChanged = restricted === void 0 ? "" : ` or n.${quoteIdent(restricted)} is distinct from o.${quoteIdent(restricted)}`;
|
|
251
|
+
const trigger = (suffix) => quoteIdent(`${CLOSURE.table}_${sqlName}_${suffix}`);
|
|
252
|
+
return `-- ${name}: ${restricted === void 0 ? `rows reach their ancestors up to depth ${String(depth)}` : `rows reach their ancestors up to depth ${String(depth)}, stopping at a restricted row`}
|
|
253
|
+
drop policy if exists ${quoteIdent(`${CLOSURE.table}_${sqlName}`)} on ${closure};
|
|
254
|
+
create policy ${quoteIdent(`${CLOSURE.table}_${sqlName}`)} on ${closure}
|
|
227
255
|
for select to authenticated
|
|
228
256
|
using (resource = ${literal} and ancestor in (select ${qualified(ctx, graphHelper(name))}(null)));
|
|
229
257
|
create or replace function ${refresh}(p_ids text[])
|
|
@@ -326,12 +354,36 @@ create trigger ${trigger("truncate")} after truncate on ${table}
|
|
|
326
354
|
for each statement execute function ${changed}();
|
|
327
355
|
select ${refresh}(array(select t.${id}::text from ${table} t));`;
|
|
328
356
|
}
|
|
357
|
+
function restrictedRowsHelperSql(ctx, plan, entry, tables) {
|
|
358
|
+
const above = entry.restrictedAncestors;
|
|
359
|
+
if (above === void 0) return "";
|
|
360
|
+
const fn = qualified(ctx, restrictedHelper(entry.node.name));
|
|
361
|
+
const body = graphSqlText(restrictedRowsSql(above, {
|
|
362
|
+
resources: new Map([...plan].map(([name, item]) => [name, item.node])),
|
|
363
|
+
...tables === void 0 ? {} : { tables },
|
|
364
|
+
qualify: qualifiedTable,
|
|
365
|
+
closure: `${ctx.schema ?? "permdock"}.${CLOSURE.table}`,
|
|
366
|
+
closureDepths: closureDepths(plan)
|
|
367
|
+
}), ctx);
|
|
368
|
+
return `-- ${entry.node.name}: rows a stopped link does not reach below: restricted, under a restricted row within ${String(above.depth - 1)} levels, or deeper
|
|
369
|
+
create or replace function ${fn}()
|
|
370
|
+
returns setof text
|
|
371
|
+
language sql
|
|
372
|
+
stable
|
|
373
|
+
security definer
|
|
374
|
+
set search_path = ''
|
|
375
|
+
as $$
|
|
376
|
+
${body}
|
|
377
|
+
$$;
|
|
378
|
+
revoke execute on function ${fn}() from public, anon;
|
|
379
|
+
grant execute on function ${fn}() to authenticated;`;
|
|
380
|
+
}
|
|
329
381
|
/** Group resources a resource's asked relations name, other than itself. */
|
|
330
382
|
function groupTargets(entry) {
|
|
331
383
|
const out = /* @__PURE__ */ new Set();
|
|
332
384
|
for (const asked of entry.relations) for (const name of expandRelation(entry.node, asked)) {
|
|
333
385
|
const spec = entry.node.relations[name];
|
|
334
|
-
const resources = isEdgeRelation(spec) ?
|
|
386
|
+
const resources = isEdgeRelation(spec) ? groupEntries(spec).map((group) => group.resource) : [];
|
|
335
387
|
for (const resource of resources) if (resource !== entry.node.name) out.add(resource);
|
|
336
388
|
}
|
|
337
389
|
return [...out].toSorted();
|
|
@@ -357,13 +409,25 @@ function dependencyOrder(plan) {
|
|
|
357
409
|
*/
|
|
358
410
|
function graphSql(ctx, plan, tables) {
|
|
359
411
|
if (plan.size === 0) return "";
|
|
360
|
-
|
|
412
|
+
const sqlNames = /* @__PURE__ */ new Map();
|
|
413
|
+
for (const name of plan.keys()) {
|
|
414
|
+
const helper = graphHelper(name);
|
|
415
|
+
const sql = graphSqlName(name) ?? name;
|
|
416
|
+
if (ctx.scopes.some((scope) => scope.name === sql)) throw new Error(`PermDock CLI: resource '${name}' has graph relations and shares its SQL name with the ${sql} scope, so ${helper} would replace the scope helper; rename the resource (permdock doctor PD032)`);
|
|
417
|
+
const other = sqlNames.get(sql);
|
|
418
|
+
if (other !== void 0) throw new Error(`PermDock CLI: resources '${other}' and '${name}' both name the SQL helper ${helper}; rename one (permdock doctor PD032)`);
|
|
419
|
+
sqlNames.set(sql, name);
|
|
420
|
+
}
|
|
361
421
|
const entries = dependencyOrder(plan);
|
|
362
|
-
const chunks = entries.flatMap((entry) => [...entry.relations.size === 0 ? [] : [permittedSql(ctx, plan, entry, tables)], ...[...entry.links].toSorted().map((link) => linkSql(ctx, entry.node, link, tables))]);
|
|
422
|
+
const chunks = entries.flatMap((entry) => [...entry.relations.size === 0 && entry.closure === void 0 ? [] : [permittedSql(ctx, plan, entry, tables)], ...[...entry.links].toSorted().map((link) => linkSql(ctx, entry.node, link, tables))]);
|
|
363
423
|
const walked = entries.filter((entry) => entry.closure !== void 0);
|
|
364
424
|
if (walked.length > 0) {
|
|
365
425
|
chunks.push(closureTableSql(ctx));
|
|
366
426
|
for (const entry of walked) chunks.push(closureObjectsSql(ctx, entry, entry.closure ?? 0, tables));
|
|
427
|
+
for (const entry of walked) {
|
|
428
|
+
const helper = restrictedRowsHelperSql(ctx, plan, entry, tables);
|
|
429
|
+
if (helper !== "") chunks.push(helper);
|
|
430
|
+
}
|
|
367
431
|
}
|
|
368
432
|
return `${chunks.join("\n\n")}\n`;
|
|
369
433
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
import { o as usageResult } from "./errors-CWfoNg9N.js";
|
|
2
|
+
import { i as quoteSqlLiteral, n as escapeSqlIdent } from "./sql-xdg5f4Fi.js";
|
|
3
|
+
import { V as parseMembershipsFlag, r as HELPERS } from "./rls-shared-Cewd_-zI.js";
|
|
4
|
+
import { t as FIELD_VIEWS, w as connectPg } from "./rls-fields-74oZPXWL.js";
|
|
5
5
|
import { n as emptySchema, r as isSchemaKind, t as emitPermissionsModule } from "./generate-CH7ThJ14.js";
|
|
6
6
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
7
7
|
import { dirname, resolve } from "node:path";
|
|
@@ -49,7 +49,7 @@ function isAuthUid(value) {
|
|
|
49
49
|
const inner = scalarSubselect(value);
|
|
50
50
|
if (inner !== void 0) return isAuthUid(inner);
|
|
51
51
|
const name = funcName(value);
|
|
52
|
-
return name === "auth.uid" || name === "auth.user_id" || name === "uid" || name === "user_id";
|
|
52
|
+
return name === "auth.uid" || name === "auth.user_id" || name === "uid" || name === "user_id" || name?.split(".").at(-1) === "permdock_user_id";
|
|
53
53
|
}
|
|
54
54
|
function isCurrentSettingUserId(value) {
|
|
55
55
|
const inner = scalarSubselect(value);
|
|
@@ -326,7 +326,7 @@ async function helperGrants(sql, memberships, functions, seeds) {
|
|
|
326
326
|
conditions: rest
|
|
327
327
|
};
|
|
328
328
|
for (const call of calls) {
|
|
329
|
-
const permission = seeds.find((seed) => seed.grantKey === call.key)?.permission ?? call.key.replace(
|
|
329
|
+
const permission = seeds.find((seed) => seed.grantKey === call.key)?.permission ?? call.key.replace(/#[a-z0-9][a-z0-9_-]*$/u, "");
|
|
330
330
|
grants.push({
|
|
331
331
|
key: call.key,
|
|
332
332
|
permission,
|
|
@@ -404,6 +404,7 @@ function mapNode(value, ctx) {
|
|
|
404
404
|
};
|
|
405
405
|
const helper = helperCall(node);
|
|
406
406
|
if (helper !== void 0) return helperCondition(helper, ctx.seeds);
|
|
407
|
+
if (funcName(scalarSubselect(node) ?? node)?.split(".").at(-1) === "permdock_session_live") return { op: "liveSession" };
|
|
407
408
|
const nullTest = asNode$1(node["NullTest"]);
|
|
408
409
|
if (nullTest !== void 0) {
|
|
409
410
|
const field = columnName(nullTest["arg"]);
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { i as
|
|
2
|
-
import {
|
|
3
|
-
import "./
|
|
4
|
-
import
|
|
1
|
+
import { i as describeError } from "./errors-CWfoNg9N.js";
|
|
2
|
+
import { a as sqlFiles } from "./files-DWUN9PzI.js";
|
|
3
|
+
import { i as quoteSqlLiteral, n as escapeSqlIdent } from "./sql-xdg5f4Fi.js";
|
|
4
|
+
import "./sources-4p0-4xQm.js";
|
|
5
|
+
import { r as HELPERS } from "./rls-shared-Cewd_-zI.js";
|
|
5
6
|
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
6
7
|
import { relative, resolve } from "node:path";
|
|
7
8
|
import { parse } from "pgsql-parser";
|
|
@@ -241,7 +242,7 @@ async function migrateSql(file, text, config, target) {
|
|
|
241
242
|
line: 1,
|
|
242
243
|
call: "",
|
|
243
244
|
reason: "unparsed",
|
|
244
|
-
detail: `the file does not parse: ${
|
|
245
|
+
detail: `the file does not parse: ${describeError(cause)}`
|
|
245
246
|
});
|
|
246
247
|
return {
|
|
247
248
|
rewrites,
|