permdock 0.6.0 → 0.8.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 +2 -3
- package/dist/{2020-C9VN-x8c.js → 2020-CJbO8Bvz.js} +1 -3
- package/dist/a2a/index.d.ts +7 -7
- package/dist/a2a/index.js +9 -9
- package/dist/action-result-CL-QCITA.d.ts +19 -0
- package/dist/{adapter-context-CRhqyzCk.js → adapter-context-CIQpQxbE.js} +8 -2
- package/dist/{adoption-scan-DCYe60Pi.js → adoption-scan-BLs67P1l.js} +5 -5
- package/dist/agent/index.d.ts +3 -3
- package/dist/agent/index.js +1 -1
- package/dist/ai-sdk/index.d.ts +31 -10
- package/dist/ai-sdk/index.js +22 -12
- package/dist/{app-data-MuyzVqX8.js → app-data-UNNm07jV.js} +10 -7
- package/dist/{approval-header-CJACtHkv.js → approval-header-8QV6MU4H.js} +6 -3
- package/dist/{approval-prompt-Dg5LeAcT.js → approval-prompt-B8hQY69x.js} +5 -6
- package/dist/{approval-prompt-DvSSPQJX.d.ts → approval-prompt-PYagyQUj.d.ts} +13 -11
- package/dist/approvals/index.d.ts +5 -5
- package/dist/approvals/index.js +7 -7
- package/dist/{approvals-p1PGoVjb.js → approvals-DnIBTuXE.js} +128 -78
- package/dist/{approvers-CqPOLD-o.js → approvers-B4r0N_Uz.js} +8 -2
- package/dist/{arazzo-41WuzHou.js → arazzo-3RhGfkAK.js} +2 -2
- package/dist/{arazzo-CaUVBn7D.js → arazzo-B5-ulWif.js} +6 -6
- package/dist/{args-IIolxxKA.js → args-0FrVs5EH.js} +125 -8
- package/dist/astro/index.d.ts +30 -12
- package/dist/astro/index.js +2 -2
- package/dist/{audience-DabClFLQ.js → audience-BAkBDMqn.js} +8 -8
- package/dist/{auth-DRLEizbL.js → auth--yPyZNgr.js} +21 -10
- package/dist/authzen/index.d.ts +171 -25
- package/dist/authzen/index.js +321 -149
- package/dist/{automation-BNM3TtDo.d.ts → automation-DqEoWHBc.d.ts} +42 -32
- package/dist/{automation-DVjOckjV.js → automation-x3KEUusw.js} +22 -21
- package/dist/base-url-BQbddZO5.js +9 -0
- package/dist/better-auth/index.d.ts +2 -2
- package/dist/better-auth/index.js +13 -7
- package/dist/better-supabase/index.d.ts +392 -220
- package/dist/better-supabase/index.js +293 -152
- package/dist/{bind-DOyrv6zi.d.ts → bind-Cp2hBHzP.d.ts} +27 -12
- package/dist/{bind-CAvgUuKs.js → bind-D_sZSVA3.js} +22 -10
- package/dist/{body-CH5of8Ne.js → body-CJQwYVa8.js} +3 -3
- package/dist/{body-text-QcXok_SI.js → body-text-DQhcmqdY.js} +8 -4
- package/dist/{boundary-BM8a_P6E.js → boundary-BV3O1eud.js} +8 -2
- package/dist/{boundary-BmHxVH1J.d.ts → boundary-C9ck-3uK.d.ts} +13 -4
- package/dist/{budget-NbEtbJC_.js → budget-BELja5A9.js} +6 -3
- package/dist/{budget-JqcRqyhK.d.ts → budget-hYsPz_yE.d.ts} +6 -3
- package/dist/{build-instance-Bu_eDqYw.js → build-instance-CNWaYJyr.js} +3 -3
- package/dist/{canonical-json-BC8_nMTw.js → canonical-json-DwilZ1iB.js} +6 -3
- package/dist/{capability-N1K9IpqS.js → capability-BqX94r07.js} +31 -25
- package/dist/{capability-Drg-1YhL.d.ts → capability-ChuiONQU.d.ts} +41 -29
- package/dist/{casbin-Dyu2gnUD.js → casbin-H0rKxBx2.js} +16 -8
- package/dist/{casbin-Cr7RLtA3.js → casbin-cbSbhT_k.js} +2 -2
- package/dist/{casl-64gpT-8x.js → casl-C4OINZHI.js} +2 -2
- package/dist/{casl-DjEDhTCP.js → casl-CHHoCldP.js} +19 -10
- package/dist/catalog/index.d.ts +104 -23
- package/dist/catalog/index.js +117 -8
- package/dist/{catalog-HD2gf5mY.js → catalog-BFpz2EmT.js} +57 -26
- package/dist/{catalog-DZVbrF-z.js → catalog-DCspHDc8.js} +3 -3
- package/dist/{catalog-doc-Cdn7-0pQ.js → catalog-doc-DjMKzJp9.js} +53 -16
- package/dist/{catalog-fingerprint-CCP0-yQS.js → catalog-fingerprint-e6aCWosn.js} +19 -15
- package/dist/catalog-mRQQQhNK.js +1 -0
- package/dist/catalog-operations-Dadrl7Z-.js +60 -0
- package/dist/{create-CQWIpUG-.js → challenge-DImNcR7B.js} +157 -39
- package/dist/chat/index.d.ts +1 -1
- package/dist/chat/index.js +13 -10
- package/dist/chat-sdk/index.d.ts +44 -26
- package/dist/chat-sdk/index.js +17 -17
- package/dist/checks-CGkP3Z7A.js +40 -0
- package/dist/{claims-map-7oQ3ue4X.js → claims-map-CKkoAAYF.js} +5 -2
- package/dist/{claims-map-Ca-QX8C6.d.ts → claims-map-D1Pb5oRq.d.ts} +8 -5
- package/dist/claude-agent/index.d.ts +6 -6
- package/dist/claude-agent/index.js +6 -3
- package/dist/clerk/index.d.ts +11 -7
- package/dist/clerk/index.js +6 -6
- package/dist/cli/bin.js +4 -4
- package/dist/cli/index.d.ts +82 -7
- package/dist/cli/index.js +6 -6
- package/dist/{clients-C7zLFuWT.d.ts → clients-C_NOET3z.d.ts} +5 -5
- package/dist/{clients-DjU5ABMy.js → clients-DYr3U86j.js} +3 -3
- package/dist/cloud/index.d.ts +186 -38
- package/dist/cloud/index.js +293 -31
- package/dist/{cloud-ytQ3uviA.js → cloud-BFlGMaak.js} +5 -6
- package/dist/{codemod-5mpSpnUY.js → codemod-DLQ9Zpo4.js} +3 -4
- package/dist/{codemod-ua2hHy7w.js → codemod-DWSN2erG.js} +523 -201
- package/dist/collect-B5BL3klN.js +1 -0
- package/dist/{collect-mLTY4nwb.js → collect-B7ZFAJU3.js} +36 -64
- package/dist/{collect-Ci6akVwH.js → collect-Bzv3le0A.js} +6 -6
- package/dist/{compare-pfyVnBjE.js → compare-DTfyUunF.js} +2 -2
- package/dist/compile/index.d.ts +2 -2
- package/dist/compile/index.js +1 -1
- package/dist/{compile-1bsAezL0.d.ts → compile-BFzysW3o.d.ts} +36 -12
- package/dist/{compile-CMqMx_IN.js → compile-EzEMB-7v.js} +77 -33
- package/dist/{completion-BTFrHZhX.js → completion-saoYiRFO.js} +17 -8
- package/dist/config-BwPBfN0t.js +108 -0
- package/dist/{config-Bj2Ixq3d.js → config-DBeXXmBF.js} +2 -2
- package/dist/{config-report-DSpsLpCE.js → config-report-BipSWA6V.js} +9 -6
- package/dist/config-shape-ykV0Vm2n.js +134 -0
- package/dist/{connection-DjhIJSs2.js → connection-B72dg5Q2.js} +23 -22
- package/dist/connector-schema-CYLQNMYq.js +434 -0
- package/dist/{context-B_u3_bDJ.js → context-BnIzxTNE.js} +4 -3
- package/dist/convex/index.d.ts +13 -7
- package/dist/convex/index.js +9 -6
- package/dist/core-H-mbhpZc.js +341 -0
- package/dist/core-hWIARPDz.d.ts +206 -0
- package/dist/{create-CBMmFie-.d.ts → create-BSNrVuxh.d.ts} +87 -34
- package/dist/{create-B30OMUOJ.d.ts → create-BVq1lNQE.d.ts} +49 -28
- package/dist/{create-D_NmPOdH.d.ts → create-CM1FciYG.d.ts} +37 -29
- package/dist/{create-CGm28gyI.js → create-Cq4Uox0f.js} +13 -9
- package/dist/{create-DCF2SvoT.js → create-_noSrY1T.js} +15 -21
- package/dist/{credential-BcoiejpY.js → credential-CyyyvCsL.js} +42 -39
- package/dist/{credentials-DPyHmYz5.js → credentials-CdDxp7jN.js} +6 -6
- package/dist/{deciding-columns-Sq12mEA6.js → deciding-columns-NB4wcyBf.js} +13 -2
- package/dist/{delegation-j6-rc37o.js → delegation-CDB6_keF.js} +31 -22
- package/dist/delivery/index.d.ts +5 -5
- package/dist/delivery/index.js +6 -5
- package/dist/{delivery-DCAgNyCn.js → delivery-BupfvJIV.js} +81 -20
- package/dist/{delivery-event-xX4obB8F.js → delivery-event-JioK5YbS.js} +6 -6
- package/dist/denied-text-CHNlVInN.d.ts +22 -0
- package/dist/{describe-BybMRY7A.js → describe-Bb4hGK5d.js} +6 -5
- package/dist/{describe-B5qgDvEW.d.ts → describe-ByS9LgHK.d.ts} +5 -5
- package/dist/{device-BARQ8eYG.js → device-BwbJNmb2.js} +11 -8
- package/dist/{diff-CmuSD3vc.js → diff-CN8IYhC_.js} +2 -2
- package/dist/{diff-3jbx6Rm4.js → diff-iZWV65nC.js} +23 -14
- package/dist/{digest-B3kc_PgQ.d.ts → digest-8Yx2CchM.d.ts} +3 -3
- package/dist/{doctor-BdZw53-k.js → doctor-CHD1M9R5.js} +485 -141
- package/dist/{doctor-3ZqNHX_G.js → doctor-D3wo-yuz.js} +4 -4
- package/dist/drizzle/index.d.ts +33 -19
- package/dist/drizzle/index.js +17 -9
- package/dist/elysia/index.d.ts +17 -11
- package/dist/elysia/index.js +5 -5
- package/dist/{errors-BKy0EfhN.js → errors-B6R_lg2a.js} +13 -4
- package/dist/{errors-BWXBMaKK.d.ts → errors-CHwoRRpB.d.ts} +4 -1
- package/dist/{errors-CWTY6uih.js → errors-Vpu6rKHl.js} +14 -10
- package/dist/{errors-DH5QEGXh.d.ts → errors-zi_4T-rx.d.ts} +22 -6
- package/dist/{evaluate-CNClBvcj.js → evaluate-Dd8Ta0Ie.js} +185 -80
- package/dist/{evaluations-beAooV0n.js → evaluations-IBceAeKT.js} +41 -20
- package/dist/{evaluations-C_1vdSZc.d.ts → evaluations-z8dQFDaN.d.ts} +12 -6
- package/dist/eve/index.d.ts +9 -6
- package/dist/eve/index.js +4 -4
- package/dist/{event-time-CsegxXxB.js → event-time-BGy48400.js} +8 -4
- package/dist/{expiry-D4_YKRKD.js → expiry-6XByK0dm.js} +8 -5
- package/dist/express/index.d.ts +9 -6
- package/dist/express/index.js +9 -6
- package/dist/fastify/index.d.ts +16 -10
- package/dist/fastify/index.js +8 -5
- package/dist/{fetch-adapter-Dw0MTS3D.d.ts → fetch-adapter-C1DCvpqV.d.ts} +9 -6
- package/dist/{fetch-adapter-DD_gfmrC.js → fetch-adapter-JL43jD3E.js} +14 -11
- package/dist/fields-D0vUI6dq.js +498 -0
- package/dist/{files-C5ZI27eV.js → files-B3AA05f1.js} +21 -5
- package/dist/{files-D_JIzUrP.js → files-BSjrtIHw.js} +11 -4
- package/dist/{fixtures-B7XrLeY7.js → fixtures-A1_sp_tR.js} +15 -6
- package/dist/{flags-C3DktBDY.js → flags-DXjoTVbS.js} +2 -2
- package/dist/{freeze-CrU8nQeX.js → freeze-jjan0lCv.js} +4 -1
- package/dist/{from-snapshot-CTCMsFZk.js → from-snapshot-DCakWRsr.js} +26 -16
- package/dist/gen-B5kvbAoZ.js +58 -0
- package/dist/gen-DWCYcMQM.js +827 -0
- package/dist/generate-CRVV5V7l.js +165 -0
- package/dist/generate-CezbCaTI.js +275 -0
- package/dist/{grantee-hxrUsbpM.js → grantee-Dke-9rd1.js} +4 -4
- package/dist/{grantee-conditions-CcXf8hMM.js → grantee-conditions-BrYPe-w0.js} +12 -12
- package/dist/{grantee-match-DbENBHLB.js → grantee-match-7RZZvoT_.js} +12 -6
- package/dist/{graph-sql-B-dsAT6j.d.ts → graph-sql-BwFC4Qjs.d.ts} +3 -3
- package/dist/h3/index.d.ts +10 -7
- package/dist/h3/index.js +3 -3
- package/dist/headers-B9jQxjtW.d.ts +10 -0
- package/dist/{helpers-CBYVMjwh.js → helpers-DJicaG6f.js} +40 -28
- package/dist/hono/index.d.ts +16 -10
- package/dist/hono/index.js +5 -5
- package/dist/{hosted-BPk51-kX.d.ts → hosted-Cmtxogd0.d.ts} +44 -20
- package/dist/{hosted-B46-5LYE.js → hosted-D0IzESu_.js} +68 -25
- package/dist/{http-ujKm0JXE.js → http-DH94eh6f.js} +4 -4
- package/dist/{http-BBoKefeS.js → http-DKLXrFGk.js} +13 -7
- package/dist/{http-DXJ37RDA.js → http-DOL33cO0.js} +11 -8
- package/dist/{import-wyqXUyjm.js → import-CST57XLp.js} +64 -51
- package/dist/{import-CNV7I2Dw.js → import-_YqhhwvX.js} +6 -6
- package/dist/{index-B8YjkEZ4.d.ts → index-B8s204GL.d.ts} +64 -52
- package/dist/{index-Ch8LpNDp.d.ts → index-BT5-1VsX.d.ts} +64 -25
- package/dist/{index-DuWxc5dt.d.ts → index-BW_0MZOS.d.ts} +388 -149
- package/dist/index-BhxEUY9J.d.ts +233 -0
- package/dist/index-Bv5iXPqU.d.ts +210 -0
- package/dist/{index-C-6Letxg.d.ts → index-_9UiQIkt.d.ts} +164 -77
- package/dist/index.d.ts +22 -21
- package/dist/index.js +35 -33
- package/dist/{init-GG6Jh8HD.js → init-Dz_PsHdv.js} +5 -5
- package/dist/{init-DeMYsnYJ.js → init-cE3A8aXq.js} +10 -10
- package/dist/{instance-options-BsVpyGIk.d.ts → instance-options-B0KXqTrJ.d.ts} +4 -4
- package/dist/{instance-snapshot-BOEhcqIF.js → instance-snapshot--JWiTrvO.js} +81 -56
- package/dist/{instant-BluqDvyS.js → instant-DK3Iz83e.js} +2 -2
- package/dist/{internals-Dk8A8fX3.js → internals-B3IgHrvo.js} +6 -3
- package/dist/{json-schema-B-vAwlde.js → json-schema-BPGa-RjQ.js} +9 -3
- package/dist/{json-schema-CN_iLFH2.d.ts → json-schema-BfXgnRNT.d.ts} +4 -4
- package/dist/jwt/index.d.ts +125 -17
- package/dist/jwt/index.js +157 -16
- package/dist/{kernel-D0NVb1cK.js → kernel-C-fYydV2.js} +151 -16
- package/dist/kysely/index.d.ts +49 -33
- package/dist/kysely/index.js +9 -7
- package/dist/{live-options-BaAFCIiu.js → live-options-BBIT68le.js} +2 -2
- package/dist/{load-DFS_ry0W.js → load-DjSU5KXO.js} +6 -6
- package/dist/load-Dm0pSYH3.js +1 -0
- package/dist/{login-Dfe5RlYk.js → login-D-8tMqzo.js} +4 -4
- package/dist/{login-imhuwvn3.js → login-DplQ0s84.js} +18 -15
- package/dist/{manifest-dvL2XEe1.js → manifest-Cgiq5oqc.js} +67 -37
- package/dist/{manifest-mx5ghSFM.d.ts → manifest-CzzWtnAb.d.ts} +144 -28
- package/dist/{manifest-schema-C0kK_8V0.js → manifest-schema-2r37XRhD.js} +80 -9
- package/dist/{manifest-C8IzW3Do.js → manifest-wg8WkkpD.js} +11 -7
- package/dist/{map-claims-D3oRmTk0.js → map-claims-BNWCJtmP.js} +27 -18
- package/dist/{map-error-Dr70oA_3.js → map-error-pasIGqMT.js} +7 -7
- package/dist/{markers-C6joDI3o.js → markers-BeHZ4x9Q.js} +20 -5
- package/dist/mcp/index.d.ts +154 -47
- package/dist/mcp/index.js +200 -41
- package/dist/{migrate-CIq4-E9F.js → migrate-B7oP_sQU.js} +102 -31
- package/dist/module-values-BJTBdo6y.js +107 -0
- package/dist/nest/index.d.ts +23 -13
- package/dist/nest/index.js +18 -11
- package/dist/next/client.d.ts +5 -2
- package/dist/next/client.js +1 -1
- package/dist/next/index.d.ts +72 -26
- package/dist/next/index.js +110 -6
- package/dist/next/plugin.d.ts +1 -1
- package/dist/next/plugin.js +4 -3
- package/dist/node/index.d.ts +5 -5
- package/dist/node/index.js +3 -3
- package/dist/{ocsf-BFp-PZZA.js → ocsf-TcjRBgIs.js} +15 -5
- package/dist/openai/index.d.ts +13 -7
- package/dist/openai/index.js +3 -3
- package/dist/openapi/index.d.ts +61 -30
- package/dist/openapi/index.js +2 -2
- package/dist/{openapi-B7HZ0f-r.js → openapi-BOsx0xn9.js} +34 -24
- package/dist/{openapi-C4dDTVEd.js → openapi-CBZUhA3l.js} +4 -5
- package/dist/{openapi-DD1SV-5-.js → openapi-VeHHU2l9.js} +23 -14
- package/dist/{operation-findings-DgATDpvh.js → operation-findings-CXtFzlKJ.js} +3 -3
- package/dist/{operations-X0VM7F3m.d.ts → operations-Ci_rT6Uo.d.ts} +10 -7
- package/dist/orpc/index.d.ts +68 -14
- package/dist/orpc/index.js +62 -13
- package/dist/otel/index.d.ts +7 -4
- package/dist/otel/index.js +8 -5
- package/dist/output-files-BHOIlrfD.js +1 -0
- package/dist/{output-files-DhRBBE4n.js → output-files-BIQ_9pIs.js} +29 -17
- package/dist/{output-1im__-08.js → output-tkju6U7R.js} +15 -7
- package/dist/ownership-B4L59T9u.js +1054 -0
- package/dist/parse-1_ZheTW5.js +151 -0
- package/dist/parse-local-manifest-BQhTlLQS.d.ts +10 -0
- package/dist/parse-local-manifest-DEiCF4ah.js +69 -0
- package/dist/{parse-request-D_tUXG6M.js → parse-request-CwCZpyjV.js} +7 -8
- package/dist/{paths-DXSHAMIa.js → paths-CUvURzHp.js} +4 -1
- package/dist/pdp/index.d.ts +9 -6
- package/dist/pdp/index.js +23 -12
- package/dist/{peer-CRvC7Hg1.js → peer-C9LvBCcb.js} +1 -1
- package/dist/peer-Q0fuZ6hx.js +982 -0
- package/dist/{permdock-SV8ZINYT.d.ts → permdock-B6Sf4T_S.d.ts} +270 -117
- package/dist/{permdock-BrAscV28.js → permdock-L-_I_3zP.js} +226 -74
- package/dist/{permission-registry-Br4jSNVi.js → permission-registry-B8tYxPIt.js} +24 -11
- package/dist/{vocabulary-CN8H_9UF.d.ts → permission-types-CAY-GU7e.d.ts} +130 -104
- package/dist/{permissions-u_KHg-sN.d.ts → permissions-Bx6UI8n1.d.ts} +6 -2
- package/dist/{permissions-B-wCP5ZC.js → permissions-CVXmRILq.js} +3 -3
- package/dist/{permissions-BPxlwVhN.js → permissions-mDcTWoBs.js} +8 -5
- package/dist/pg-DQTqRrou.js +60 -0
- package/dist/{pins-8ILTftC9.js → pins-nqarl3oE.js} +4 -1
- package/dist/pkce-CnmmYqUZ.js +21 -0
- package/dist/{policy-77FSAq_V.d.ts → policy-Ba4bDhaj.d.ts} +5 -5
- package/dist/{policy-DbM5YYtV.js → policy-CLQ8__GF.js} +49 -20
- package/dist/{policy-from-catalog-C2gMa2Dj.js → policy-from-catalog-CJgOm6aq.js} +28 -25
- package/dist/{policy-module-CTlwMvLI.js → policy-module-xym9fnSq.js} +12 -6
- package/dist/{policy-types-n0uRTsW8.d.ts → policy-types-CCiDRZBH.d.ts} +802 -334
- package/dist/postgres-store-DcyrPS-r.js +1028 -0
- package/dist/{postgrest-DAjUkF9w.js → postgrest-D4nuPXIQ.js} +88 -36
- package/dist/{postgrest-CEgRbefE.d.ts → postgrest-DicQyqm-.d.ts} +60 -30
- package/dist/powersync-DHNQX06W.js +1117 -0
- package/dist/{powersync-DISt6SUe.js → powersync-DXqGuq9A.js} +3 -3
- package/dist/powersync-Djf-zCpB.js +1 -0
- package/dist/preset/index.d.ts +38 -28
- package/dist/preset/index.js +1 -1
- package/dist/{preset-DZdU0tne.js → preset-BjLzeFpp.js} +58 -34
- package/dist/{principal-source-pHneukrx.js → principal-source-C6N60GtM.js} +10 -10
- package/dist/prisma/index.d.ts +69 -41
- package/dist/prisma/index.js +21 -17
- package/dist/{problem-CTviyH5L.js → problem-BVLHFK33.js} +41 -21
- package/dist/{problem-details-cn5X30gZ.js → problem-details-CLDgX1KV.js} +13 -4
- package/dist/{problem-types-CJ2325SZ.js → problem-types-DSsRfONQ.js} +4 -1
- package/dist/prompt-BYc6drYW.js +938 -0
- package/dist/protected-action-BE7N_Luo.d.ts +58 -0
- package/dist/protected-action-DUYqb-Ma.js +80 -0
- package/dist/{protected-BlF0F6wL.js → protected-action-QEA8arRB.js} +48 -14
- package/dist/{provider-B1al-AZz.js → provider-C55OGXJ7.js} +5 -4
- package/dist/{provider-DILL9oPK.d.ts → provider-DXfq5c2d.d.ts} +1 -1
- package/dist/{provider-store-DM6DNcta.js → provider-store-CaTv00tr.js} +13 -9
- package/dist/pull-B65ndFNZ.js +1 -0
- package/dist/{pull-jEwbf80J.js → pull-CwpGaQSi.js} +12 -11
- package/dist/{push-BD4f15co.js → push-DgssgzkK.js} +62 -16
- package/dist/{pushed-policy-DCW91KQU.d.ts → pushed-policy-D1Eoi6NM.d.ts} +12 -6
- package/dist/{pushed-policy-CqtxkV4G.js → pushed-policy-ITwYKvvH.js} +10 -7
- package/dist/react/index.d.ts +9 -8
- package/dist/react/index.js +7 -6
- package/dist/react/provider-client.d.ts +1 -1
- package/dist/react/provider-client.js +1 -1
- package/dist/react-native/index.d.ts +104 -51
- package/dist/react-native/index.js +394 -67
- package/dist/{refs-K6eWUJ0H.js → refs-C8BKxc_e.js} +17 -3
- package/dist/{relation-walk-3OyDBF0S.js → relation-walk-DK_gkgL7.js} +12 -9
- package/dist/{relations-BnCWnJGI.js → relations-BxvRvDHK.js} +3 -3
- package/dist/{replay-Du1tJjG7.js → replay-BU09ad4L.js} +1 -1
- package/dist/{replay-Bkm-Ne4l.d.ts → replay-DNftIb_R.d.ts} +1 -1
- package/dist/{request-context-C81Pip9n.js → request-context-C25ilqiJ.js} +8 -8
- package/dist/{request-schema-CMreVuFM.js → request-schema-DhX7UbfQ.js} +4 -1
- package/dist/resend/index.d.ts +34 -28
- package/dist/resend/index.js +29 -29
- package/dist/resolve-names-CF7xXLSG.js +201 -0
- package/dist/{resource-relations-D_jw0BFx.js → resource-relations-8-pCScBO.js} +18 -9
- package/dist/{retire-CALjIQ7e.js → retire-B2xffQgY.js} +15 -6
- package/dist/{revocations-R07lFBnX.d.ts → revocations-BaUXHM1N.d.ts} +6 -3
- package/dist/{rls-DTvYd-lI.js → rls-CNEH2_BG.js} +743 -624
- package/dist/{rls-BAqP4q66.js → rls-Ca8Jz9b5.js} +41 -10
- package/dist/{role-builder-uWQZ4v84.js → role-builder-BK2-T6oD.js} +41 -20
- package/dist/rolldown-runtime-C3I60J0A.js +4 -0
- package/dist/{row-conditions-h2HythXQ.js → row-conditions-BAGHOmVq.js} +4 -3
- package/dist/{rpc-VSl5ylaQ.js → rpc-fNqAIqQk.js} +8 -5
- package/dist/{run-CUKuz0A8.js → run-Bz26OTfO.js} +26 -23
- package/dist/run-D-JE8QWb.js +1 -0
- package/dist/{run-ticket-DocwaTKn.d.ts → run-ticket-DbWI9f99.d.ts} +33 -13
- package/dist/{run-ticket-sxFI6LAk.js → run-ticket-Dv7aF7Dk.js} +29 -8
- package/dist/{runtime-D3VTAiCA.js → runtime-BGnrOkVH.js} +5 -2
- package/dist/{saas-BCXRuXca.js → saas-iWnUdwCt.js} +42 -29
- package/dist/{scan-qvOe0hS3.js → scan-DCj1KQfn.js} +1 -1
- package/dist/{schema-B4v0Qrac.js → schema-BOJjqlWL.js} +3 -2
- package/dist/{schema-yLuBWWsh.js → schema-Dst9I9Gs.js} +9 -5
- package/dist/scim/index.d.ts +3 -2
- package/dist/scim/index.js +3 -1
- package/dist/scim-D8YupzX1.js +44 -0
- package/dist/{scim-ClHtpyV3.js → scim-jJBJ7g1Z.js} +35 -551
- package/dist/{scopes-CUPSjo9q.js → scopes-0Up_UA2t.js} +42 -24
- package/dist/server/index.d.ts +12 -12
- package/dist/server/index.js +13 -13
- package/dist/{server-C3WXAHZj.js → server-3cVlTLde.js} +31 -31
- package/dist/{server-types-CKQiCnON.d.ts → server-types-CIlpSA2G.d.ts} +81 -46
- package/dist/{sha256-D9ihqmvd.js → sha256-C-4WXKIu.js} +4 -3
- package/dist/{shared-BAK8t4Uo.js → shared-Afctg7B0.js} +100 -61
- package/dist/{shared-DvvFzYXe.js → shared-l0oGGetg.js} +9 -6
- package/dist/{signals-D3NcTKUS.js → signals-B1vHR3fN.js} +2 -2
- package/dist/{sink-BEZSlMS_.js → sink-D9_vh372.js} +32 -21
- package/dist/{sink-4-eQIRWf.d.ts → sink-Dvi7YZG_.d.ts} +44 -20
- package/dist/{skills-B6lVdD_W.js → skills-Bjj7BNEQ.js} +16 -12
- package/dist/{skills-CTYwkl44.js → skills-OuoMR49L.js} +3 -3
- package/dist/{snapshot-B7DkYg6g.js → snapshot-CXlzi69u.js} +21 -18
- package/dist/{snapshot-cache-PXI-vGpY.d.ts → snapshot-cache-BAXZ0KOp.d.ts} +21 -12
- package/dist/{snapshot-cache-DZHQ0KF6.js → snapshot-cache-Bx_4xC_6.js} +14 -11
- package/dist/solid/index.d.ts +55 -15
- package/dist/solid/index.js +46 -12
- package/dist/solid-start/index.d.ts +30 -12
- package/dist/solid-start/index.js +3 -3
- package/dist/sources-B1Os_YUu.d.ts +312 -0
- package/dist/{sources-vs5dGOsS.js → sources-CMAM-2A3.js} +156 -51
- package/dist/sources-qoIJQrJv.js +11 -0
- package/dist/{sql-B5T1IL83.js → sql-0WjxIp9g.js} +32 -7
- package/dist/sql-B80DFdpG.d.ts +10 -0
- package/dist/{src-Cu2m75uo.js → src-DZ0l9UAg.js} +305 -123
- package/dist/ssf/index.d.ts +4 -4
- package/dist/ssf/index.js +665 -224
- package/dist/{standard-webhooks-rbD7LS6h.d.ts → standard-webhooks-C-qX4mJW.d.ts} +7 -7
- package/dist/{standard-webhooks-DgFFD-Ga.js → standard-webhooks-D67a3nzk.js} +5 -5
- package/dist/{store-BDutJkDL.js → store-RNFvaJJv.js} +43 -29
- package/dist/{store-options-u0ycEe8s.js → store-options-Dil3lraY.js} +105 -15
- package/dist/stores-C0Kta5Ft.d.ts +59 -0
- package/dist/{stores-CGhM8BN_.js → stores-DxZWDXCs.js} +42 -5
- package/dist/{stream-CvdUS9V1.js → stream-CDvF0sJm.js} +5 -5
- package/dist/{stream-CeCMJmBB.d.ts → stream-ltuLdtTG.d.ts} +4 -3
- package/dist/{style-DiKWnAvn.js → style-DblOtSga.js} +1 -1
- package/dist/{style-Uao76wO7.js → style-Ds11Hmk4.js} +3 -1
- package/dist/{subject-settings-CkEwrw3W.js → subject-settings-8sH5HlII.js} +8 -4
- package/dist/{row-check-Dt35czLy.d.ts → subject-settings-vNW8qmUH.d.ts} +30 -18
- package/dist/supabase/index.d.ts +48 -37
- package/dist/supabase/index.js +6 -6
- package/dist/supabase/middleware.d.ts +19 -13
- package/dist/supabase/middleware.js +7 -7
- package/dist/{supabase-x5JtR2tc.js → supabase-BL1qJzzY.js} +82 -36
- package/dist/{supabase-By_frk3U.js → supabase-D39cuGPt.js} +3 -3
- package/dist/{supabase-hook-BMoEhZir.js → supabase-hook-B-yXnzUl.js} +1206 -286
- package/dist/supabase-hook-H-MtE9Wd.js +1 -0
- package/dist/supautils-BU-pAEpf.js +808 -0
- package/dist/{support-session-C6xJQYut.js → support-session-BsmPCbz8.js} +22 -22
- package/dist/svelte/PermissionBoundary.svelte +2 -6
- package/dist/svelte/Protected.svelte +2 -8
- package/dist/svelte/index.d.ts +9 -8
- package/dist/svelte/index.js +10 -9
- package/dist/svelte/runtime.d.ts +4 -4
- package/dist/svelte/runtime.js +4 -4
- package/dist/svelte/source.d.ts +9 -8
- package/dist/svelte/source.js +6 -5
- package/dist/sveltekit/index.d.ts +30 -12
- package/dist/sveltekit/index.js +2 -2
- package/dist/{ownership-DqaJNJPn.js → tables-DeMNEy6V.js} +1025 -1085
- package/dist/tanstack-start/index.d.ts +22 -10
- package/dist/tanstack-start/index.js +2 -2
- package/dist/{target-Bw37TFNA.js → target-qdEAnnhU.js} +6 -6
- package/dist/{tenancy-DN2QAx9z.js → tenancy-5d1zVBvK.js} +36 -21
- package/dist/terminal/index.d.ts +23 -14
- package/dist/terminal/index.js +17 -20
- package/dist/testing/core.d.ts +2 -0
- package/dist/testing/core.js +1 -0
- package/dist/testing/fixtures/index.d.ts +15 -0
- package/dist/testing/fixtures/index.js +831 -0
- package/dist/testing/index.d.ts +235 -285
- package/dist/testing/index.js +502 -927
- package/dist/testing/saas/index.d.ts +43 -27
- 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/text-diff-BtfSmdUo.js +444 -0
- package/dist/{thenable-yD7SabqG.js → thenable-BNSM1U2R.js} +12 -3
- package/dist/{time-DkWjdL98.js → time-nR1JesoH.js} +32 -8
- package/dist/{token-BLZcjQgt.js → token-DC9EQiet.js} +15 -13
- package/dist/{tool-refusal-CMLN5xhn.js → tool-refusal-Qpjs_W6M.js} +5 -2
- package/dist/trpc/index.d.ts +11 -8
- package/dist/trpc/index.js +15 -9
- package/dist/type-helpers-BIPIDa6a.d.ts +50 -0
- package/dist/{types-8RnwUAvE.d.ts → types-AMJ5qoU_.d.ts} +49 -30
- package/dist/{types-C_IiEs64.d.ts → types-B2mlGuhW.d.ts} +14 -11
- package/dist/{types-_WhUP7ud.d.ts → types-B4uqKDnp.d.ts} +25 -12
- package/dist/{types-CX7AvRqP.d.ts → types-BJk0BKRX.d.ts} +24 -14
- package/dist/types-B_d_g7T3.d.ts +262 -0
- package/dist/{types-BdtSDbBO.d.ts → types-B_tiYvk8.d.ts} +59 -32
- package/dist/{types-DqzsnlSA.js → types-CcUXciSj.js} +17 -5
- package/dist/{types-Dfv0aTER.d.ts → types-DC1Loeh3.d.ts} +449 -168
- package/dist/{types-lUlG3TVd.d.ts → types-DHKPcqzr.d.ts} +2 -2
- package/dist/{types-C791HFu9.d.ts → types-DjuMBNF9.d.ts} +68 -32
- package/dist/{types-C863OQiR.d.ts → types-HzqOtvsJ.d.ts} +23 -12
- package/dist/{types-Druu9wLM.d.ts → types-ZzRGoViD.d.ts} +77 -24
- package/dist/{types-BzzaHxt3.d.ts → types-ah9NlU6j.d.ts} +137 -48
- package/dist/{types-CVZSNocA.d.ts → types-djVzLlIV.d.ts} +31 -14
- package/dist/{types-BtHtcKMr.d.ts → types-yUuPR5Hy.d.ts} +47 -24
- package/dist/unplugin/index.d.ts +1 -1
- package/dist/unplugin/index.js +2 -2
- package/dist/usage-CYeXek0p.js +1 -0
- package/dist/{usage-SveTRTyr.js → usage-CxEzS4ey.js} +50 -26
- package/dist/{usage-CRVl9V3t.js → usage-ab0PdusX.js} +2 -2
- package/dist/{validation-error-ZfUHbKvf.js → validation-error-CYg2kJEw.js} +4 -1
- package/dist/{validation-error-DHUrAkku.d.ts → validation-error-YGg2mXyH.d.ts} +5 -2
- package/dist/{validity-CZ7-y0Cj.js → validity-Buc7w8E9.js} +13 -10
- package/dist/{verifier-DHuh-okk.js → verifier-DUV6pLqZ.js} +10 -4
- package/dist/{verify-BaAKx7t6.js → verify-DZeqoWu5.js} +417 -489
- package/dist/version-DMQ0dnN5.js +48 -0
- package/dist/version-DizhmD72.js +1 -0
- package/dist/{views-DTIIO-oQ.js → views-CD8wuL4Z.js} +19 -6
- package/dist/vocabulary-DEJ5j4mR.d.ts +70 -0
- package/dist/vue/index.d.ts +71 -21
- package/dist/vue/index.js +50 -13
- package/dist/{waiter-B986w1oK.d.ts → waiter-Bu9zAlE0.d.ts} +13 -10
- package/dist/{waiter-BGUtGYoU.js → waiter-aBLM63_f.js} +1 -1
- package/dist/{watch-vea54PRw.js → watch-Cx_WciLE.js} +8 -8
- package/dist/watch-DB42U1ib.js +1 -0
- package/dist/webmcp/index.d.ts +11 -11
- package/dist/webmcp/index.js +8 -5
- package/dist/{where-scope-C9vfEphl.js → where-scope-DlCdCM_8.js} +56 -30
- package/dist/{who-can-DWBAcaCQ.js → who-can-rI7dCR9Q.js} +23 -20
- package/dist/workflow/index.d.ts +3 -3
- package/dist/workflow/index.js +13 -13
- package/dist/workflow-sdk/index.d.ts +19 -13
- package/dist/workflow-sdk/index.js +6 -6
- package/dist/{wrap-gX61EtpB.js → wrap-B2wziJI_.js} +11 -5
- package/dist/{wrap-C5jC6sKI.d.ts → wrap-DlJE3gS_.d.ts} +8 -5
- package/package.json +25 -14
- package/schemas/catalog-v1.json +3 -0
- package/schemas/cli-result-v1.json +1 -0
- package/schemas/cloud-api-v1.json +152 -7
- package/schemas/connector-v1.json +8 -0
- package/schemas/supabase-claims-v1.json +5 -0
- package/schemas/supabase-manifest-v1.json +308 -75
- package/skills/permdock/SKILL.md +1 -0
- package/skills/permdock-agents/references/runtimes.md +3 -1
- package/skills/permdock-approvals/references/stores-and-resume.md +2 -1
- package/skills/permdock-credentials/references/tokens-keys-links.md +8 -6
- package/skills/permdock-data/references/queries-and-rls.md +6 -2
- package/skills/permdock-tenancy/SKILL.md +1 -1
- package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +2 -1
- package/skills/permdock-wire/references/adapters.md +28 -22
- package/skills/permdock-wire/references/policy-options.md +1 -0
- package/dist/catalog-BoWglDPI.js +0 -1
- package/dist/collect-D7eQDffE.js +0 -1
- package/dist/config-bs_kZeYq.js +0 -162
- package/dist/denied-text-CiFQNuMV.d.ts +0 -19
- package/dist/fields-OYG_JR78.js +0 -203
- package/dist/generate-CNU1pIOo.js +0 -171
- package/dist/headers-BIjfMaoC.js +0 -8
- package/dist/headers-CIbDTUTK.d.ts +0 -7
- package/dist/index-Cp_ilKi1.d.ts +0 -91
- package/dist/index-CueFnxQc.d.ts +0 -110
- package/dist/load-BxEtwlBS.js +0 -1
- package/dist/output-files-B3IZJksC.js +0 -1
- package/dist/package-root-Dk_ETdkp.js +0 -31
- package/dist/parse-Cxq0WxrA.js +0 -53
- package/dist/parse-local-manifest-5ODwqu8b.d.ts +0 -10
- package/dist/parse-local-manifest-CVSs6J9I.js +0 -34
- package/dist/peer-C8swJ2GH.js +0 -50
- package/dist/policies-DP2nqRoF.js +0 -295
- package/dist/powersync-BkWWCS1K.js +0 -538
- package/dist/powersync-MMJ2mI2q.js +0 -1
- package/dist/problem-details-B45V5d2b.d.ts +0 -7
- package/dist/prompt-DfZLJLIn.js +0 -32
- package/dist/protected-RFGpakN9.d.ts +0 -38
- package/dist/pull-CvpINcMK.js +0 -1
- package/dist/run-DDwUaJDU.js +0 -1
- package/dist/sources-Xc4zkszI.d.ts +0 -190
- package/dist/stores-BUGNbJTt.d.ts +0 -30
- package/dist/supabase-hook-CCw5m35C.js +0 -1
- package/dist/supautils-B6HYL9eL.js +0 -91
- package/dist/text-diff-BQcUapOb.js +0 -15
- package/dist/types-B3_ooZgZ.d.ts +0 -172
- package/dist/usage-CZpSQP6L.js +0 -1
- package/dist/version-CEbQ5UeM.js +0 -18
- package/dist/version-DXkYUISx.js +0 -1
- package/dist/watch--ovlPOc0.js +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { n as freezeDeep } from "./freeze-
|
|
2
|
-
import { o as readPath, s as splitPath, t as assertSafeKey } from "./paths-
|
|
1
|
+
import { n as freezeDeep } from "./freeze-jjan0lCv.js";
|
|
2
|
+
import { o as readPath, s as splitPath, t as assertSafeKey } from "./paths-CUvURzHp.js";
|
|
3
3
|
//#region src/conditions/ast.ts
|
|
4
4
|
function parentHop(parent) {
|
|
5
5
|
return typeof parent === "string" ? { field: parent } : parent;
|
|
@@ -68,6 +68,20 @@ function createRef(path) {
|
|
|
68
68
|
}
|
|
69
69
|
const principal = createRef("principal");
|
|
70
70
|
const context = createRef("context");
|
|
71
|
+
/**
|
|
72
|
+
* `principal.claims.<path>` for a dot path such as `team_ids` or
|
|
73
|
+
* `attrs.region`, typed `SubjectRef` under `noUncheckedIndexedAccess` and
|
|
74
|
+
* `noPropertyAccessFromIndexSignature`.
|
|
75
|
+
*/
|
|
76
|
+
function claim(path) {
|
|
77
|
+
const segments = splitPath(path);
|
|
78
|
+
if (segments.length === 0) throw new Error("PermDock: claim() needs a claim path");
|
|
79
|
+
return createRef([
|
|
80
|
+
"principal",
|
|
81
|
+
"claims",
|
|
82
|
+
...segments
|
|
83
|
+
].join("."));
|
|
84
|
+
}
|
|
71
85
|
function isSubjectRef(value) {
|
|
72
86
|
if (value === null || typeof value !== "object" || !("ref" in value) || typeof value.ref !== "string") return false;
|
|
73
87
|
const ref = value.ref;
|
|
@@ -88,4 +102,4 @@ function resolveConditionRef(ref, resolved) {
|
|
|
88
102
|
}
|
|
89
103
|
}
|
|
90
104
|
//#endregion
|
|
91
|
-
export {
|
|
105
|
+
export { resolveConditionRef as a, isConditionDate as c, parentHop as d, principal as i, isConditionRef as l, context as n, hasConditionOp as o, isSubjectRef as r, isCondition as s, claim as t, isSqlFunctionField as u };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { r as isRecord } from "./compact-CAf557ZB.js";
|
|
2
|
-
import { r as ownGet } from "./paths-
|
|
3
|
-
import { n as relationId } from "./relations-
|
|
2
|
+
import { r as ownGet } from "./paths-CUvURzHp.js";
|
|
3
|
+
import { n as relationId } from "./relations-BxvRvDHK.js";
|
|
4
4
|
//#region src/core/relation-walk.ts
|
|
5
5
|
/** Whether the holder's period covers `now`. */
|
|
6
6
|
function activeNow(holder, now) {
|
|
@@ -53,7 +53,10 @@ function restrictedAbove(condition, row, reader) {
|
|
|
53
53
|
if (new Set(ids).size !== ids.length || chain.truncated === true || chain.ancestors.length > above.depth - 1) return "relation-depth";
|
|
54
54
|
return false;
|
|
55
55
|
}
|
|
56
|
-
/**
|
|
56
|
+
/**
|
|
57
|
+
* The instances a graph relation reads: the start, then ancestors until a
|
|
58
|
+
* restricted one or `depth`.
|
|
59
|
+
*/
|
|
57
60
|
function relationWalk(condition, row, reader) {
|
|
58
61
|
if (!isRecord(row)) return;
|
|
59
62
|
const first = relationId(ownGet(row, condition.field));
|
|
@@ -93,10 +96,10 @@ function relationWalk(condition, row, reader) {
|
|
|
93
96
|
};
|
|
94
97
|
}
|
|
95
98
|
/**
|
|
96
|
-
* Whether the subject holds the relation on the row's instance or an
|
|
97
|
-
*
|
|
98
|
-
*
|
|
99
|
-
*
|
|
99
|
+
* Whether the subject holds the relation on the row's instance or an ancestor
|
|
100
|
+
* within `depth`. A cycle is `relation-depth`; so is a chain that goes on past
|
|
101
|
+
* `depth` with no holder below it. Any read the instance could not answer is
|
|
102
|
+
* `relation-unavailable` unless a holder was found elsewhere.
|
|
100
103
|
*/
|
|
101
104
|
function resolveRelated(condition, row, subject, now, reader, permitted) {
|
|
102
105
|
if (condition.permission !== void 0) return resolveInherited(condition, condition.permission, row, reader, permitted);
|
|
@@ -148,8 +151,8 @@ function groupKey(group) {
|
|
|
148
151
|
}
|
|
149
152
|
/**
|
|
150
153
|
* Whether the principal holds `at.relation` on one instance, directly or
|
|
151
|
-
* through a group whose members hold it. Groups of `at`'s own resource nest
|
|
152
|
-
*
|
|
154
|
+
* through a group whose members hold it. Groups of `at`'s own resource nest at
|
|
155
|
+
* most `budget` deep; a group of another resource gets a fresh budget
|
|
153
156
|
* (declarations rule out cycles across resources). A group met twice on one
|
|
154
157
|
* path, or one past the budget, is `relation-depth`. `explored` holds the
|
|
155
158
|
* budget each group was walked with across the whole walk: a group already
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { r as isRecord } from "./compact-CAf557ZB.js";
|
|
2
|
-
import { i as idText } from "./expiry-
|
|
3
|
-
import { n as isThenable } from "./thenable-
|
|
4
|
-
import { a as expandRelation } from "./resource-relations-
|
|
2
|
+
import { i as idText } from "./expiry-6XByK0dm.js";
|
|
3
|
+
import { n as isThenable } from "./thenable-BNSM1U2R.js";
|
|
4
|
+
import { a as expandRelation } from "./resource-relations-8-pCScBO.js";
|
|
5
5
|
//#region src/core/relations.ts
|
|
6
6
|
function isInstant(value) {
|
|
7
7
|
return value === void 0 || typeof value === "number" && Number.isFinite(value);
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { t as assertAppData } from "./app-data-
|
|
2
|
-
import { n as wrapPermDock } from "./wrap-
|
|
3
|
-
import { t as buildInstance } from "./build-instance-
|
|
1
|
+
import { t as assertAppData } from "./app-data-UNNm07jV.js";
|
|
2
|
+
import { n as wrapPermDock } from "./wrap-B2wziJI_.js";
|
|
3
|
+
import { t as buildInstance } from "./build-instance-CNWaYJyr.js";
|
|
4
4
|
//#region src/core/request-context.ts
|
|
5
5
|
/**
|
|
6
|
-
* Errors an adapter raises around one instance (a `context` hook that threw,
|
|
7
|
-
*
|
|
6
|
+
* Errors an adapter raises around one instance (a `context` hook that threw, an
|
|
7
|
+
* `onDenied` that failed), fed to the instance's `on('error')` handlers and
|
|
8
8
|
* replayed to later ones, as core replays its own.
|
|
9
9
|
*/
|
|
10
10
|
function deliver(handler, error) {
|
|
@@ -33,9 +33,9 @@ function errorChannel(queued) {
|
|
|
33
33
|
};
|
|
34
34
|
}
|
|
35
35
|
/**
|
|
36
|
-
* `buildInstance` with an error channel: the instance's `on('error')`
|
|
37
|
-
*
|
|
38
|
-
*
|
|
36
|
+
* `buildInstance` with an error channel: the instance's `on('error')` replays
|
|
37
|
+
* `errors` raised while resolving the request, and `report` adds more. Kept
|
|
38
|
+
* beside `errorChannel`, so adapters without one do not bundle it.
|
|
39
39
|
*/
|
|
40
40
|
async function buildReportingInstance(input) {
|
|
41
41
|
const channel = errorChannel(input.errors);
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
//#region src/approvals/request-schema.ts
|
|
2
|
-
/**
|
|
2
|
+
/**
|
|
3
|
+
* An RFC 3339 instant as `Temporal.Instant` prints it; pg_jsonschema asserts no
|
|
4
|
+
* `format`.
|
|
5
|
+
*/
|
|
3
6
|
const INSTANT = String.raw`^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-]\d{2}:\d{2})$`;
|
|
4
7
|
const STRINGS = {
|
|
5
8
|
type: "array",
|
package/dist/resend/index.d.ts
CHANGED
|
@@ -1,20 +1,23 @@
|
|
|
1
|
-
import { q as DecisionSink } from "../policy-types-
|
|
2
|
-
import { n as ApprovalUrl, t as ApprovalPrompt } from "../approval-prompt-
|
|
3
|
-
import { d as EmailTransport, o as DeliveryResult, u as EmailMessage } from "../types-
|
|
4
|
-
import { l as ReplayStore } from "../types-
|
|
1
|
+
import { q as DecisionSink } from "../policy-types-CCiDRZBH.js";
|
|
2
|
+
import { n as ApprovalUrl, t as ApprovalPrompt } from "../approval-prompt-PYagyQUj.js";
|
|
3
|
+
import { d as EmailTransport, o as DeliveryResult, u as EmailMessage } from "../types-yUuPR5Hy.js";
|
|
4
|
+
import { l as ReplayStore } from "../types-DjuMBNF9.js";
|
|
5
5
|
//#region src/resend/approval-email.d.ts
|
|
6
6
|
type ApprovalEmailOptions = {
|
|
7
|
-
/**
|
|
7
|
+
/**
|
|
8
|
+
* The app's approval page: a base the request id is appended to, or a
|
|
9
|
+
* function of the prompt. Must be https.
|
|
10
|
+
*/
|
|
8
11
|
readonly approvalUrl: ApprovalUrl;
|
|
9
12
|
/** The product name in the footer line. */
|
|
10
13
|
readonly product?: string;
|
|
11
14
|
};
|
|
12
15
|
/**
|
|
13
|
-
* The default approval prompt email: an `approval`-category message whose
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
16
|
+
* The default approval prompt email: an `approval`-category message whose one
|
|
17
|
+
* link opens the app's approval page for the request. It carries no approve or
|
|
18
|
+
* reject link; the signed-in approver decides on that page. Throws a
|
|
19
|
+
* `TypeError` for an approval page that is not https. Replace it with a React
|
|
20
|
+
* Email template by building the same `EmailMessage`.
|
|
18
21
|
*/
|
|
19
22
|
export declare function approvalEmail(prompt: ApprovalPrompt, options: ApprovalEmailOptions): EmailMessage;
|
|
20
23
|
//#endregion
|
|
@@ -48,16 +51,16 @@ type ResendResult<T> = {
|
|
|
48
51
|
/** The part of a `Resend` client the transport calls; a `new Resend(key)` fits. */
|
|
49
52
|
type ResendClient = {
|
|
50
53
|
readonly emails: {
|
|
51
|
-
send(payload: ResendEmailPayload, options?: {
|
|
54
|
+
send: (payload: ResendEmailPayload, options?: {
|
|
52
55
|
readonly idempotencyKey?: string;
|
|
53
|
-
})
|
|
56
|
+
}) => Promise<ResendResult<{
|
|
54
57
|
readonly id: string;
|
|
55
58
|
}>>;
|
|
56
59
|
};
|
|
57
60
|
readonly batch?: {
|
|
58
|
-
send(payloads: ResendEmailPayload[], options?: {
|
|
61
|
+
send: (payloads: ResendEmailPayload[], options?: {
|
|
59
62
|
readonly idempotencyKey?: string;
|
|
60
|
-
})
|
|
63
|
+
}) => Promise<ResendResult<{
|
|
61
64
|
readonly data: readonly {
|
|
62
65
|
readonly id: string;
|
|
63
66
|
}[];
|
|
@@ -69,22 +72,25 @@ type ResendTransportOptions = {
|
|
|
69
72
|
readonly from?: string;
|
|
70
73
|
/** The `replyTo` of an email whose message sets none. */
|
|
71
74
|
readonly replyTo?: string;
|
|
72
|
-
/**
|
|
75
|
+
/**
|
|
76
|
+
* Tags added to every email; names and values are ASCII letters, digits, `_`
|
|
77
|
+
* and `-`.
|
|
78
|
+
*/
|
|
73
79
|
readonly tags?: Readonly<Record<string, string>>;
|
|
74
80
|
};
|
|
75
81
|
/**
|
|
76
|
-
* The failure a Resend error name means. Rate limits, quotas and server
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
82
|
+
* The failure a Resend error name means. Rate limits, quotas and server errors
|
|
83
|
+
* are retryable with the same idempotency key; a key, sender or validation
|
|
84
|
+
* error is final. An unknown name is retryable only for a 5xx or a missing
|
|
85
|
+
* status.
|
|
80
86
|
*/
|
|
81
87
|
export declare function resendFailure(error: ResendError): DeliveryResult;
|
|
82
88
|
/**
|
|
83
89
|
* Sends the email channel of `permdock/delivery` through Resend. The
|
|
84
90
|
* idempotency key is Resend's `idempotencyKey`. The delivery id, key and
|
|
85
|
-
* category travel as tags, so `resendWebhook` can join provider events to
|
|
86
|
-
*
|
|
87
|
-
*
|
|
91
|
+
* category travel as tags, so `resendWebhook` can join provider events to the
|
|
92
|
+
* delivery. Two or more recipients go out through `batch.send`, up to 100 per
|
|
93
|
+
* call. Throws a `TypeError` for a tag outside Resend's charset.
|
|
88
94
|
*/
|
|
89
95
|
export declare function resendTransport(resend: ResendClient, options?: ResendTransportOptions): EmailTransport;
|
|
90
96
|
//#endregion
|
|
@@ -92,7 +98,7 @@ export declare function resendTransport(resend: ResendClient, options?: ResendTr
|
|
|
92
98
|
/** The part of a `Resend` client the webhook calls; a `new Resend(key)` fits. */
|
|
93
99
|
type ResendWebhookClient = {
|
|
94
100
|
readonly webhooks: {
|
|
95
|
-
verify(input: {
|
|
101
|
+
verify: (input: {
|
|
96
102
|
readonly payload: string;
|
|
97
103
|
readonly headers: {
|
|
98
104
|
readonly id: string;
|
|
@@ -100,7 +106,7 @@ type ResendWebhookClient = {
|
|
|
100
106
|
readonly signature: string;
|
|
101
107
|
};
|
|
102
108
|
readonly webhookSecret: string;
|
|
103
|
-
})
|
|
109
|
+
}) => unknown;
|
|
104
110
|
};
|
|
105
111
|
};
|
|
106
112
|
type ResendWebhookOptions = {
|
|
@@ -116,10 +122,10 @@ type ResendWebhookOptions = {
|
|
|
116
122
|
/**
|
|
117
123
|
* A fetch handler for Resend webhooks. It verifies the Standard Webhooks
|
|
118
124
|
* signature through `resend.webhooks.verify` (the `svix-*` and `webhook-*`
|
|
119
|
-
* header names both work), claims the message id, and writes one delivery
|
|
120
|
-
*
|
|
121
|
-
*
|
|
122
|
-
*
|
|
125
|
+
* header names both work), claims the message id, and writes one delivery event
|
|
126
|
+
* for `email.delivered`, `email.bounced`, `email.complained`, `email.failed`
|
|
127
|
+
* and `email.suppressed`. A bad signature is a `401`; a sink failure releases
|
|
128
|
+
* the claim and answers `503`, so Resend retries.
|
|
123
129
|
*/
|
|
124
130
|
export declare function resendWebhook(options: ResendWebhookOptions): (request: Request) => Promise<Response>;
|
|
125
131
|
//#endregion
|
package/dist/resend/index.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { t as compact } from "../compact-CAf557ZB.js";
|
|
2
|
-
import { a as ownRecord } from "../paths-
|
|
3
|
-
import { o as statusProblem } from "../problem-details-
|
|
4
|
-
import { l as isRfc3339, p as nowSeconds } from "../time-
|
|
5
|
-
import { n as sha256, t as bytesToBase64Url } from "../sha256-
|
|
6
|
-
import { t as deliveryEvent } from "../delivery-event-
|
|
7
|
-
import { n as readBodyText } from "../body-text-
|
|
8
|
-
import {
|
|
9
|
-
import { t as bodyTooLarge } from "../body-
|
|
10
|
-
import { n as approvalUrlFor } from "../approval-prompt-
|
|
11
|
-
import { i as isDeliveryTarget } from "../target-
|
|
2
|
+
import { a as ownRecord } from "../paths-CUvURzHp.js";
|
|
3
|
+
import { o as statusProblem } from "../problem-details-CLDgX1KV.js";
|
|
4
|
+
import { l as isRfc3339, p as nowSeconds } from "../time-nR1JesoH.js";
|
|
5
|
+
import { n as sha256, t as bytesToBase64Url } from "../sha256-C-4WXKIu.js";
|
|
6
|
+
import { t as deliveryEvent } from "../delivery-event-JioK5YbS.js";
|
|
7
|
+
import { n as readBodyText } from "../body-text-DQhcmqdY.js";
|
|
8
|
+
import { l as problemResponse, o as methodNotAllowed } from "../problem-BVLHFK33.js";
|
|
9
|
+
import { t as bodyTooLarge } from "../body-CJQwYVa8.js";
|
|
10
|
+
import { n as approvalUrlFor } from "../approval-prompt-B8hQY69x.js";
|
|
11
|
+
import { i as isDeliveryTarget } from "../target-qdEAnnhU.js";
|
|
12
12
|
//#region src/resend/approval-email.ts
|
|
13
13
|
const HTML_ESCAPES = {
|
|
14
14
|
"&": "&",
|
|
@@ -29,11 +29,11 @@ function requesterLine(prompt) {
|
|
|
29
29
|
return actor === void 0 ? `Requested by ${principal}` : `Requested by ${principal} through ${actor.kind} ${actor.id}`;
|
|
30
30
|
}
|
|
31
31
|
/**
|
|
32
|
-
* The default approval prompt email: an `approval`-category message whose
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
32
|
+
* The default approval prompt email: an `approval`-category message whose one
|
|
33
|
+
* link opens the app's approval page for the request. It carries no approve or
|
|
34
|
+
* reject link; the signed-in approver decides on that page. Throws a
|
|
35
|
+
* `TypeError` for an approval page that is not https. Replace it with a React
|
|
36
|
+
* Email template by building the same `EmailMessage`.
|
|
37
37
|
*/
|
|
38
38
|
function approvalEmail(prompt, options) {
|
|
39
39
|
const url = approvalUrlFor(prompt, options.approvalUrl);
|
|
@@ -95,10 +95,10 @@ const FINAL = {
|
|
|
95
95
|
validation_error: "rejected"
|
|
96
96
|
};
|
|
97
97
|
/**
|
|
98
|
-
* The failure a Resend error name means. Rate limits, quotas and server
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
98
|
+
* The failure a Resend error name means. Rate limits, quotas and server errors
|
|
99
|
+
* are retryable with the same idempotency key; a key, sender or validation
|
|
100
|
+
* error is final. An unknown name is retryable only for a 5xx or a missing
|
|
101
|
+
* status.
|
|
102
102
|
*/
|
|
103
103
|
function resendFailure(error) {
|
|
104
104
|
const name = error.name;
|
|
@@ -183,9 +183,9 @@ async function sendBatch(resend, items, payloadOf) {
|
|
|
183
183
|
/**
|
|
184
184
|
* Sends the email channel of `permdock/delivery` through Resend. The
|
|
185
185
|
* idempotency key is Resend's `idempotencyKey`. The delivery id, key and
|
|
186
|
-
* category travel as tags, so `resendWebhook` can join provider events to
|
|
187
|
-
*
|
|
188
|
-
*
|
|
186
|
+
* category travel as tags, so `resendWebhook` can join provider events to the
|
|
187
|
+
* delivery. Two or more recipients go out through `batch.send`, up to 100 per
|
|
188
|
+
* call. Throws a `TypeError` for a tag outside Resend's charset.
|
|
189
189
|
*/
|
|
190
190
|
function resendTransport(resend, options = {}) {
|
|
191
191
|
const tags = checkTags(options.tags ?? {});
|
|
@@ -285,9 +285,9 @@ function outcomeOf(type, data) {
|
|
|
285
285
|
}
|
|
286
286
|
}
|
|
287
287
|
/**
|
|
288
|
-
* The delivery event a verified Resend payload stands for, or `null` for
|
|
289
|
-
*
|
|
290
|
-
*
|
|
288
|
+
* The delivery event a verified Resend payload stands for, or `null` for one
|
|
289
|
+
* that is not about a PermDock delivery: opens and clicks (tracking, not
|
|
290
|
+
* delivery), sends, contact and domain events, and mail without the
|
|
291
291
|
* `permdock_delivery` and `permdock_key` tags.
|
|
292
292
|
*/
|
|
293
293
|
function eventOf(payload, source) {
|
|
@@ -333,10 +333,10 @@ async function claim(replay, key) {
|
|
|
333
333
|
/**
|
|
334
334
|
* A fetch handler for Resend webhooks. It verifies the Standard Webhooks
|
|
335
335
|
* signature through `resend.webhooks.verify` (the `svix-*` and `webhook-*`
|
|
336
|
-
* header names both work), claims the message id, and writes one delivery
|
|
337
|
-
*
|
|
338
|
-
*
|
|
339
|
-
*
|
|
336
|
+
* header names both work), claims the message id, and writes one delivery event
|
|
337
|
+
* for `email.delivered`, `email.bounced`, `email.complained`, `email.failed`
|
|
338
|
+
* and `email.suppressed`. A bad signature is a `401`; a sink failure releases
|
|
339
|
+
* the claim and answers `503`, so Resend retries.
|
|
340
340
|
*/
|
|
341
341
|
function resendWebhook(options) {
|
|
342
342
|
const source = options.source ?? "permdock";
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { n as freezeDeep } from "./freeze-jjan0lCv.js";
|
|
2
|
+
import { c as listPermissions } from "./permission-registry-B8tYxPIt.js";
|
|
3
|
+
import { f as scopeList } from "./scopes-0Up_UA2t.js";
|
|
4
|
+
import { i as configError } from "./errors-Vpu6rKHl.js";
|
|
5
|
+
import "./budget-BELja5A9.js";
|
|
6
|
+
import "./sources-CMAM-2A3.js";
|
|
7
|
+
import { A as quoteQualified, D as qualified, I as scopeTypeOf, O as quoteIdent } from "./shared-Afctg7B0.js";
|
|
8
|
+
import { F as globalRoleRows, Q as graphSqlName, Z as graphHelper, _ as PERMISSION_HELPERS, at as memberForHelper, c as holderSources, ct as memberIdsHelper, dt as permittedForHelper, ft as permittedIdsHelper, ht as scopeTable, lt as memberOfHelper, nt as inheritedRowsHelper, o as graphPlan, pt as restrictedHelper, r as tableNames, rt as isTeamScope, tt as hasPermittedUsers, v as checkName, x as permittedByPermissionHelper } from "./tables-DeMNEy6V.js";
|
|
9
|
+
import { t as FIELD_VIEWS } from "./fields-D0vUI6dq.js";
|
|
10
|
+
//#region src/cli/rls/permission-holders.ts
|
|
11
|
+
/**
|
|
12
|
+
* `permitted_<scope>_users(p_permission, p_id)`. Names are part of the SQL
|
|
13
|
+
* contract.
|
|
14
|
+
*/
|
|
15
|
+
function permittedUsersHelper(scope) {
|
|
16
|
+
return checkName(`permitted_${scope}_users`);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* The users with a membership row on the instance `p_id`, or `undefined` when
|
|
20
|
+
* the scope's memberships are not all in tables.
|
|
21
|
+
*/
|
|
22
|
+
function candidatesSql(ctx, scope, user) {
|
|
23
|
+
const mapped = scopeTable(ctx, scope);
|
|
24
|
+
if (mapped !== void 0) return {
|
|
25
|
+
sql: ` select m.${quoteIdent(mapped.table.user)}::${user}
|
|
26
|
+
from ${quoteQualified(mapped.table.table)} m
|
|
27
|
+
where m.${quoteIdent(mapped.column)} = p_id`,
|
|
28
|
+
keys: []
|
|
29
|
+
};
|
|
30
|
+
const sources = holderSources(ctx, scope);
|
|
31
|
+
if (sources === void 0 || sources === "not-tables") return;
|
|
32
|
+
return {
|
|
33
|
+
sql: sources.map((source, index) => ` select h.user_id::${user}
|
|
34
|
+
from (
|
|
35
|
+
${source.holders.rows(scope, { id: `v_key_${String(index)}` }).replaceAll(/^/gmu, " ")}
|
|
36
|
+
) h`).join("\n union\n"),
|
|
37
|
+
keys: sources.map((source, index) => `v_key_${String(index)} ${source.holders.idType}`)
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* `language sql`, or PL/pgSQL when a source's id column needs `p_id` in a
|
|
42
|
+
* `%type` variable.
|
|
43
|
+
*/
|
|
44
|
+
function functionBody(keys, query) {
|
|
45
|
+
if (keys.length === 0) return `language sql
|
|
46
|
+
stable
|
|
47
|
+
security definer
|
|
48
|
+
set search_path = ''
|
|
49
|
+
as $$
|
|
50
|
+
${query}
|
|
51
|
+
$$;`;
|
|
52
|
+
return `language plpgsql
|
|
53
|
+
stable
|
|
54
|
+
security definer
|
|
55
|
+
set search_path = ''
|
|
56
|
+
as $$
|
|
57
|
+
declare
|
|
58
|
+
${keys.map((key) => ` ${key} := p_id;`).join("\n")}
|
|
59
|
+
begin
|
|
60
|
+
return query
|
|
61
|
+
${query.replaceAll(/^/gmu, " ")};
|
|
62
|
+
end
|
|
63
|
+
$$;`;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* One `permitted_<scope>_users(p_permission, p_id)` per scope in `database`
|
|
67
|
+
* mode: the users who hold a permission key on one instance, read from the
|
|
68
|
+
* scope's membership rows and the global-roles table and kept when
|
|
69
|
+
* `permitted_<scope>_ids_by_permission_for` lists the instance or
|
|
70
|
+
* `permdock_has_permission_for` answers, so denies, custom roles, expiry and
|
|
71
|
+
* suspension apply as for the user. It names other users, so no client role may
|
|
72
|
+
* execute it, and a backend role needs its own grant.
|
|
73
|
+
*/
|
|
74
|
+
function permissionHoldersSql(ctx) {
|
|
75
|
+
if (ctx.authorize !== "database") return "";
|
|
76
|
+
const user = ctx.dialect === "supabase" ? "uuid" : "text";
|
|
77
|
+
const global = globalRoleRows(ctx);
|
|
78
|
+
const hasFor = qualified(ctx, PERMISSION_HELPERS.hasFor);
|
|
79
|
+
return `${ctx.scopes.map(({ name }) => {
|
|
80
|
+
const candidates = hasPermittedUsers(ctx, name) ? candidatesSql(ctx, name, user) : void 0;
|
|
81
|
+
if (candidates === void 0) return `-- ${name}: no memberships table or table source, so permitted_${name}_users is not written`;
|
|
82
|
+
const fn = qualified(ctx, permittedUsersHelper(name));
|
|
83
|
+
const ids = qualified(ctx, checkName(`${permittedByPermissionHelper(name)}_for`));
|
|
84
|
+
const type = scopeTypeOf(ctx, name);
|
|
85
|
+
return `-- the users who hold a permission on one ${name}: its members and the global-role holders for whom the _for helpers answer; no client role may execute it
|
|
86
|
+
create or replace function ${fn}(p_permission text, p_id ${type})
|
|
87
|
+
returns setof ${user}
|
|
88
|
+
${functionBody(candidates.keys, ` select c.user_id
|
|
89
|
+
from (
|
|
90
|
+
${candidates.sql}
|
|
91
|
+
union
|
|
92
|
+
select ${global.userSql}::${user}
|
|
93
|
+
from ${global.from}
|
|
94
|
+
) c(user_id)
|
|
95
|
+
where c.user_id is not null
|
|
96
|
+
and (
|
|
97
|
+
p_id in (select ${ids}(c.user_id, p_permission))
|
|
98
|
+
or ${hasFor}(c.user_id, p_permission)
|
|
99
|
+
)
|
|
100
|
+
order by 1`)}
|
|
101
|
+
revoke execute on function ${fn}(text, ${type}) from public, anon, authenticated;`;
|
|
102
|
+
}).join("\n\n")}\n`;
|
|
103
|
+
}
|
|
104
|
+
//#endregion
|
|
105
|
+
//#region src/cli/sql/resolve-names.ts
|
|
106
|
+
/** Postgres truncates a longer identifier, so two helpers could share one name. */
|
|
107
|
+
const MAX_IDENTIFIER_BYTES = 63;
|
|
108
|
+
const IDENTIFIER = /^[a-z_][a-z0-9_]*$/u;
|
|
109
|
+
function scopeNames(name) {
|
|
110
|
+
return {
|
|
111
|
+
permittedIds: permittedIdsHelper(name),
|
|
112
|
+
permittedIdsFor: permittedForHelper(name),
|
|
113
|
+
memberIds: memberIdsHelper(name),
|
|
114
|
+
memberIdsFor: memberForHelper(name),
|
|
115
|
+
...isTeamScope(name) ? { memberIdsOf: memberOfHelper(name) } : {},
|
|
116
|
+
permittedUsers: permittedUsersHelper(name)
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
function rowHelperSet(setting, resources) {
|
|
120
|
+
if (setting === void 0) return /* @__PURE__ */ new Set();
|
|
121
|
+
return new Set(setting === true ? resources : setting);
|
|
122
|
+
}
|
|
123
|
+
function baseName(table) {
|
|
124
|
+
return table.startsWith("public.") ? table.slice(7) : table.replaceAll(".", "_");
|
|
125
|
+
}
|
|
126
|
+
function resourceNames(resource, input) {
|
|
127
|
+
const sql = graphSqlName(resource);
|
|
128
|
+
const { table } = input;
|
|
129
|
+
return {
|
|
130
|
+
...table === void 0 ? {} : { table },
|
|
131
|
+
...input.graph && sql !== void 0 ? {
|
|
132
|
+
permittedIds: graphHelper(resource),
|
|
133
|
+
restricted: restrictedHelper(resource)
|
|
134
|
+
} : {},
|
|
135
|
+
...input.rows && sql !== void 0 ? {
|
|
136
|
+
rows: inheritedRowsHelper(resource),
|
|
137
|
+
row: `permitted_${sql}_row`
|
|
138
|
+
} : {},
|
|
139
|
+
...input.fields && table !== void 0 ? {
|
|
140
|
+
visible: `${table}${FIELD_VIEWS.view}`,
|
|
141
|
+
visibleFields: `${baseName(table)}${FIELD_VIEWS.companion}`,
|
|
142
|
+
mask: `${baseName(table)}${FIELD_VIEWS.mask}`
|
|
143
|
+
} : {}
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Rejects a helper that is not a lowercase SQL identifier or is longer than
|
|
148
|
+
* Postgres keeps, and two sources that resolve to the same helper.
|
|
149
|
+
*/
|
|
150
|
+
function checkNames(names) {
|
|
151
|
+
const owners = /* @__PURE__ */ new Map();
|
|
152
|
+
const claim = (name, owner) => {
|
|
153
|
+
if (!IDENTIFIER.test(name)) throw configError(`PermDock CLI: ${owner} names the SQL helper '${name}', which is not a lowercase SQL identifier`);
|
|
154
|
+
if (new TextEncoder().encode(name).length > MAX_IDENTIFIER_BYTES) throw configError(`PermDock CLI: ${owner} names the SQL helper '${name}', longer than the ${String(MAX_IDENTIFIER_BYTES)} bytes Postgres keeps; shorten the name`);
|
|
155
|
+
const other = owners.get(name);
|
|
156
|
+
if (other !== void 0 && other !== owner) throw configError(`PermDock CLI: ${other} and ${owner} both name the SQL helper '${name}'; rename one of them`);
|
|
157
|
+
owners.set(name, owner);
|
|
158
|
+
};
|
|
159
|
+
for (const [scope, helpers] of Object.entries(names.scopes)) for (const name of Object.values(helpers)) claim(name, `scope '${scope}'`);
|
|
160
|
+
for (const [resource, helpers] of Object.entries(names.resources)) {
|
|
161
|
+
const { table: _table, visible: _visible, ...functions } = helpers;
|
|
162
|
+
for (const name of Object.values(functions)) claim(name, `resource '${resource}'`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* The SQL names `policy` and `config` give the generated RLS, frozen. Throws
|
|
167
|
+
* `config_invalid` for a helper name Postgres cannot hold or two sources
|
|
168
|
+
* sharing one.
|
|
169
|
+
*/
|
|
170
|
+
function resolveNames(policy, config, options = {}) {
|
|
171
|
+
const rls = config.rls;
|
|
172
|
+
const scopes = scopeList(policy.scopes);
|
|
173
|
+
const resources = [.../* @__PURE__ */ new Set([...listPermissions(policy.vocabulary.permissions).map((leaf) => leaf.resource), ...policy.resources.keys()])];
|
|
174
|
+
const graph = graphPlan(policy);
|
|
175
|
+
const tables = tableNames(rls?.tables) ?? {};
|
|
176
|
+
const rows = rowHelperSet(rls?.rowHelpers, resources);
|
|
177
|
+
const team = scopes.find((scope) => isTeamScope(scope.name));
|
|
178
|
+
const names = {
|
|
179
|
+
schema: options.schema ?? rls?.schema ?? rls?.rbac?.schema ?? "permdock",
|
|
180
|
+
gucPrefix: options.gucPrefix ?? rls?.gucPrefix ?? "app",
|
|
181
|
+
claims: {
|
|
182
|
+
tenant: options.tenantClaim ?? rls?.tenantClaim ?? "tenant_id",
|
|
183
|
+
role: rls?.roleClaim ?? "user_role"
|
|
184
|
+
},
|
|
185
|
+
...team === void 0 ? {} : { teamScope: team.name },
|
|
186
|
+
scopes: Object.fromEntries(scopes.map((scope) => [scope.name, scopeNames(scope.name)])),
|
|
187
|
+
resources: Object.fromEntries(resources.flatMap((resource) => {
|
|
188
|
+
const entry = resourceNames(resource, {
|
|
189
|
+
table: tables[resource],
|
|
190
|
+
graph: graph.has(resource),
|
|
191
|
+
rows: rows.has(resource),
|
|
192
|
+
fields: rls?.fields !== void 0
|
|
193
|
+
});
|
|
194
|
+
return Object.keys(entry).length === 0 ? [] : [[resource, entry]];
|
|
195
|
+
}))
|
|
196
|
+
};
|
|
197
|
+
checkNames(names);
|
|
198
|
+
return freezeDeep(names);
|
|
199
|
+
}
|
|
200
|
+
//#endregion
|
|
201
|
+
export { permissionHoldersSql as n, permittedUsersHelper as r, resolveNames as t };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as assertSafeKey } from "./paths-
|
|
1
|
+
import { t as assertSafeKey } from "./paths-CUvURzHp.js";
|
|
2
2
|
//#region src/core/resource-relations.ts
|
|
3
3
|
/** The edge's group resources with their relation and id column. */
|
|
4
4
|
function groupEntries(spec) {
|
|
@@ -35,8 +35,8 @@ function isComputedRelation(relation) {
|
|
|
35
35
|
return relation !== void 0 && !("field" in relation) && !("edge" in relation) && !("principal" in relation);
|
|
36
36
|
}
|
|
37
37
|
/**
|
|
38
|
-
* The relations whose holders hold `name` on `node`: `name` itself when it
|
|
39
|
-
*
|
|
38
|
+
* The relations whose holders hold `name` on `node`: `name` itself when it has
|
|
39
|
+
* a source, then everything it includes, transitively, each once.
|
|
40
40
|
* `definePermissions` rejects cycles and unknown names, so this terminates.
|
|
41
41
|
*/
|
|
42
42
|
function expandRelation(node, name) {
|
|
@@ -53,12 +53,18 @@ function expandRelation(node, name) {
|
|
|
53
53
|
visit(name);
|
|
54
54
|
return out;
|
|
55
55
|
}
|
|
56
|
-
/**
|
|
56
|
+
/**
|
|
57
|
+
* Whether `node` names itself as its parent (nested folders, sub-teams,
|
|
58
|
+
* reporting lines).
|
|
59
|
+
*/
|
|
57
60
|
function isSelfParented(node) {
|
|
58
61
|
return node?.parent !== void 0 && node.parent.resource === node.name;
|
|
59
62
|
}
|
|
60
63
|
const RESOURCE_NAME = /^[A-Za-z][A-Za-z0-9_-]*$/u;
|
|
61
|
-
/**
|
|
64
|
+
/**
|
|
65
|
+
* Level names ride claims and grant keys (`key@level`), so they stay SQL- and
|
|
66
|
+
* claim-safe.
|
|
67
|
+
*/
|
|
62
68
|
const LEVEL_NAME = /^[a-z][a-z0-9_]*$/u;
|
|
63
69
|
const EDGE_TABLE = /^[A-Za-z_][A-Za-z0-9_]*(\.[A-Za-z_][A-Za-z0-9_]*)?$/u;
|
|
64
70
|
function restrictedStopsOf(name, option, parent, links) {
|
|
@@ -143,7 +149,7 @@ function normaliseMatch(label, match) {
|
|
|
143
149
|
for (const column of columns) {
|
|
144
150
|
assertSafeKey(column, "edge match column");
|
|
145
151
|
const value = match[column];
|
|
146
|
-
if (typeof value !== "string" && typeof value !== "boolean" && !(typeof value === "number" && Number.isFinite(value))) throw new
|
|
152
|
+
if (typeof value !== "string" && typeof value !== "boolean" && !(typeof value === "number" && Number.isFinite(value))) throw new TypeError(`PermDock: ${label} match '${column}' must be a string, a finite number or a boolean`);
|
|
147
153
|
out[column] = value;
|
|
148
154
|
}
|
|
149
155
|
return out;
|
|
@@ -183,7 +189,10 @@ function normaliseGroups(label, groups) {
|
|
|
183
189
|
...groups.direct === void 0 ? {} : { direct: groups.direct }
|
|
184
190
|
};
|
|
185
191
|
}
|
|
186
|
-
/**
|
|
192
|
+
/**
|
|
193
|
+
* An included relation must exist on the same resource, be tenancy-free and
|
|
194
|
+
* never include itself back.
|
|
195
|
+
*/
|
|
187
196
|
function assertIncludes(node) {
|
|
188
197
|
const state = /* @__PURE__ */ new Map();
|
|
189
198
|
const visit = (name, path) => {
|
|
@@ -210,8 +219,8 @@ function assertGroupTarget(registry, node, relationName, spec, target, targetRel
|
|
|
210
219
|
/**
|
|
211
220
|
* Links and group targets name declared resources and relations. Groups may
|
|
212
221
|
* nest within one resource (teams in teams) through the same relation, which
|
|
213
|
-
* then includes nothing, so SQL can walk it with one bounded recursive query;
|
|
214
|
-
*
|
|
222
|
+
* then includes nothing, so SQL can walk it with one bounded recursive query; a
|
|
223
|
+
* group cycle across resources is rejected.
|
|
215
224
|
*/
|
|
216
225
|
function assertGraphTargets(registry) {
|
|
217
226
|
const edges = /* @__PURE__ */ new Map();
|