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
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
import { et as MembershipSource } from "./policy-types-CCiDRZBH.js";
|
|
2
|
+
import { n as RoleMap, r as RoleThrough, x as SupabaseSuspension } from "./types-ah9NlU6j.js";
|
|
3
|
+
import { t as SqlQuery } from "./sql-B80DFdpG.js";
|
|
4
|
+
import { c as SupabaseManifestMembership } from "./manifest-CzzWtnAb.js";
|
|
5
|
+
//#region src/supabase/roles.d.ts
|
|
6
|
+
/** A roles table a role column references, by `schema.table`. */
|
|
7
|
+
type RoleKeys = {
|
|
8
|
+
readonly table: string;
|
|
9
|
+
/** The roles table column the reference points at. */
|
|
10
|
+
readonly id: string;
|
|
11
|
+
/** The roles table column holding the role key. */
|
|
12
|
+
readonly key: string;
|
|
13
|
+
/** The referencing table's column. */
|
|
14
|
+
readonly ref: string;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* One role source of a membership row: a key column, or a reference to a roles
|
|
18
|
+
* table.
|
|
19
|
+
*/
|
|
20
|
+
type RoleSource = string | RoleThrough | RoleMap;
|
|
21
|
+
/** A role source, or several the row holds at once. */
|
|
22
|
+
type RoleSpec = RoleSource | readonly RoleSource[];
|
|
23
|
+
/**
|
|
24
|
+
* A roles table whose tenant rows are written by tenants. A role key read
|
|
25
|
+
* through it from a tenant row that is one of `declared` reads as null, so a
|
|
26
|
+
* tenant cannot claim the grants of a declared role by naming a role after it.
|
|
27
|
+
*/
|
|
28
|
+
type RoleGuard = {
|
|
29
|
+
/** `schema.table`, or `public`. */
|
|
30
|
+
readonly table: string;
|
|
31
|
+
/** The tenant column of the roles table. */
|
|
32
|
+
readonly tenant: string;
|
|
33
|
+
/**
|
|
34
|
+
* A tenant row with this column true is the application's own copy of a
|
|
35
|
+
* declared role.
|
|
36
|
+
*/
|
|
37
|
+
readonly skip?: string | undefined;
|
|
38
|
+
readonly declared: readonly string[];
|
|
39
|
+
};
|
|
40
|
+
//#endregion
|
|
41
|
+
//#region src/supabase/sources.d.ts
|
|
42
|
+
type Common = {
|
|
43
|
+
readonly table: string;
|
|
44
|
+
/**
|
|
45
|
+
* Runs the lookups; without it the source only describes SQL (for `permdock
|
|
46
|
+
* supabase hook generate`).
|
|
47
|
+
*/
|
|
48
|
+
readonly query?: SqlQuery;
|
|
49
|
+
/**
|
|
50
|
+
* Drop suspended users and memberships under suspended instances, like
|
|
51
|
+
* `rls.suspension`.
|
|
52
|
+
*/
|
|
53
|
+
readonly suspension?: SupabaseSuspension;
|
|
54
|
+
};
|
|
55
|
+
type MembershipTableOptions = Common & {
|
|
56
|
+
/**
|
|
57
|
+
* Column names; `user`, `scope`, `id` and `role` default to `user_id`,
|
|
58
|
+
* `scope`, `scope_id`, `role`.
|
|
59
|
+
*/
|
|
60
|
+
readonly columns?: {
|
|
61
|
+
/** The user id column, or a reference to a table that holds the user id. */
|
|
62
|
+
readonly user?: string | RoleThrough;
|
|
63
|
+
readonly scope?: string;
|
|
64
|
+
readonly id?: string;
|
|
65
|
+
/** A `jsonb` column of ancestor ids keyed by scope name. */
|
|
66
|
+
readonly within?: string;
|
|
67
|
+
/**
|
|
68
|
+
* The role key column, a reference to a roles table that holds the key, or
|
|
69
|
+
* several of them: the row holds every non-null key.
|
|
70
|
+
*/
|
|
71
|
+
readonly role?: RoleSpec;
|
|
72
|
+
readonly via?: string;
|
|
73
|
+
readonly expiresAt?: string;
|
|
74
|
+
readonly disabledAt?: string;
|
|
75
|
+
/** The principal id that wrote the membership (`grantedBy`). */
|
|
76
|
+
readonly grantedBy?: string;
|
|
77
|
+
/** Free-text justification recorded on the membership (`reason`). */
|
|
78
|
+
readonly reason?: string;
|
|
79
|
+
/** A subgroup column filling `member.group`. */
|
|
80
|
+
readonly group?: string;
|
|
81
|
+
/**
|
|
82
|
+
* A text column; the value `idp` marks the row as owned by the identity
|
|
83
|
+
* provider.
|
|
84
|
+
*/
|
|
85
|
+
readonly managedBy?: string;
|
|
86
|
+
/** A `text[]` column of seats. */
|
|
87
|
+
readonly seats?: string;
|
|
88
|
+
/** A `jsonb` column of app data (`Membership.x`); never written into claims. */
|
|
89
|
+
readonly x?: string;
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
type MembershipJunctionOptions = Common & {
|
|
93
|
+
/** The declared scope every row is a membership of. */
|
|
94
|
+
readonly scope: string;
|
|
95
|
+
/**
|
|
96
|
+
* The user id column (default `user_id`), or a reference to a table that
|
|
97
|
+
* holds the user id.
|
|
98
|
+
*/
|
|
99
|
+
readonly user?: string | RoleThrough;
|
|
100
|
+
/** The column holding the scope instance id. Default `<scope>_id`. */
|
|
101
|
+
readonly id?: string;
|
|
102
|
+
/** Ancestor id columns keyed by scope name. */
|
|
103
|
+
readonly within?: Readonly<Record<string, string>>;
|
|
104
|
+
/**
|
|
105
|
+
* A role column, a reference to a roles table that holds the key, fixed roles
|
|
106
|
+
* every row holds (a contact table with no role column), or `{ sources }`:
|
|
107
|
+
* several role columns whose non-null keys the row holds.
|
|
108
|
+
*/
|
|
109
|
+
readonly roles: string | RoleThrough | RoleMap | readonly string[] | {
|
|
110
|
+
readonly sources: readonly RoleSource[];
|
|
111
|
+
};
|
|
112
|
+
/** The membership kind every row has (`contact`, `staff`, `partner`). */
|
|
113
|
+
readonly via?: string;
|
|
114
|
+
readonly expiresAt?: string;
|
|
115
|
+
readonly disabledAt?: string;
|
|
116
|
+
/** The principal id that wrote the membership (`grantedBy`). */
|
|
117
|
+
readonly grantedBy?: string;
|
|
118
|
+
/** Free-text justification recorded on the membership (`reason`). */
|
|
119
|
+
readonly reason?: string;
|
|
120
|
+
/** A subgroup filling `member.group`: a fixed name every row has, or a column. */
|
|
121
|
+
readonly group?: string | {
|
|
122
|
+
readonly column: string;
|
|
123
|
+
};
|
|
124
|
+
/**
|
|
125
|
+
* `idp` when the identity provider owns every row, or a text column holding
|
|
126
|
+
* `idp` per row.
|
|
127
|
+
*/
|
|
128
|
+
readonly managedBy?: "idp" | {
|
|
129
|
+
readonly column: string;
|
|
130
|
+
};
|
|
131
|
+
/** A `text[]` column of seats. */
|
|
132
|
+
readonly seats?: string;
|
|
133
|
+
/** A `jsonb` column of app data (`Membership.x`); never written into claims. */
|
|
134
|
+
readonly x?: string;
|
|
135
|
+
};
|
|
136
|
+
/**
|
|
137
|
+
* What `permdock supabase hook generate` compiles; the same SQL the source
|
|
138
|
+
* runs.
|
|
139
|
+
*/
|
|
140
|
+
type MembershipSql = {
|
|
141
|
+
readonly table: string;
|
|
142
|
+
/**
|
|
143
|
+
* The table's user column: the user id, or with `userThrough` the reference
|
|
144
|
+
* to the row holding it.
|
|
145
|
+
*/
|
|
146
|
+
readonly user: string;
|
|
147
|
+
/**
|
|
148
|
+
* The table that holds the user id when `user` references it; a change of
|
|
149
|
+
* that id bumps the old and the new user.
|
|
150
|
+
*/
|
|
151
|
+
readonly userThrough?: RoleKeys;
|
|
152
|
+
/**
|
|
153
|
+
* `<table>.<user>%type`: the PL/pgSQL type of the user id column, for a
|
|
154
|
+
* variable `select` compares with.
|
|
155
|
+
*/
|
|
156
|
+
readonly userType: string;
|
|
157
|
+
/**
|
|
158
|
+
* The `select` of claim rows for one user, with every filter applied. `user`
|
|
159
|
+
* must have the column's type (a `userType` variable, or an untyped `$1`
|
|
160
|
+
* Postgres infers): the column is compared uncast so its index applies.
|
|
161
|
+
* `keep` adds the `keep` column; it defaults to `keeps`, and a `union` with a
|
|
162
|
+
* source that keeps passes `true`.
|
|
163
|
+
*/
|
|
164
|
+
select: (user: string, keep?: boolean) => string;
|
|
165
|
+
/** The `select` of member rows for one scope instance (`$1` scope, `$2` id). */
|
|
166
|
+
list: (keep?: boolean) => string;
|
|
167
|
+
/**
|
|
168
|
+
* A suspended scope on the source keeps permissions: rows of its suspended
|
|
169
|
+
* instances stay, with a `keep` column.
|
|
170
|
+
*/
|
|
171
|
+
readonly keeps: boolean;
|
|
172
|
+
/**
|
|
173
|
+
* A text column holding `idp` for rows the identity provider owns; `''` when
|
|
174
|
+
* every row is owned.
|
|
175
|
+
*/
|
|
176
|
+
readonly managed?: string;
|
|
177
|
+
/** Other tables the `select` reads (suspension tables). */
|
|
178
|
+
readonly reads: readonly string[];
|
|
179
|
+
/**
|
|
180
|
+
* The roles table the role column references; a key change bumps every
|
|
181
|
+
* holder's authorization version.
|
|
182
|
+
*/
|
|
183
|
+
readonly through?: RoleKeys;
|
|
184
|
+
/** Every roles table the role columns reference, `through` first. */
|
|
185
|
+
readonly throughs: readonly RoleKeys[];
|
|
186
|
+
/**
|
|
187
|
+
* Every column that decides who holds which membership: user, scope, id,
|
|
188
|
+
* `within`, role, `via` and expiry.
|
|
189
|
+
*/
|
|
190
|
+
readonly columns: readonly string[];
|
|
191
|
+
/**
|
|
192
|
+
* For a single-scope source: its scope and the scopes whose ids each row
|
|
193
|
+
* carries.
|
|
194
|
+
*/
|
|
195
|
+
readonly scope?: string;
|
|
196
|
+
readonly holds?: readonly string[];
|
|
197
|
+
/** The source's entry in the hook manifest's `memberships`. */
|
|
198
|
+
readonly manifest: SupabaseManifestMembership;
|
|
199
|
+
/** What the ownership triggers count; absent on a source that is not a table. */
|
|
200
|
+
readonly holders?: MembershipHolders;
|
|
201
|
+
/**
|
|
202
|
+
* The rows as plain columns, for Sync Streams and `powerSyncSource`; a source
|
|
203
|
+
* without it does not sync.
|
|
204
|
+
*/
|
|
205
|
+
readonly stream?: MembershipStream;
|
|
206
|
+
};
|
|
207
|
+
/**
|
|
208
|
+
* One membership source as columns a Sync Streams query can filter on. Tables
|
|
209
|
+
* are `schema.table`; a `through` table is qualified in the source's schema
|
|
210
|
+
* when it names none.
|
|
211
|
+
*/
|
|
212
|
+
type MembershipStream = {
|
|
213
|
+
readonly table: string;
|
|
214
|
+
/** The user id column, or the reference to the table that holds the user id. */
|
|
215
|
+
readonly user: string | RoleThrough;
|
|
216
|
+
/** The scope column, or the scope every row is a membership of. */
|
|
217
|
+
readonly scope: {
|
|
218
|
+
readonly column: string;
|
|
219
|
+
} | {
|
|
220
|
+
readonly value: string;
|
|
221
|
+
};
|
|
222
|
+
readonly id: string;
|
|
223
|
+
/**
|
|
224
|
+
* The role sources (the row holds every non-null key), or the fixed roles
|
|
225
|
+
* every row holds.
|
|
226
|
+
*/
|
|
227
|
+
readonly roles: RoleSpec | {
|
|
228
|
+
readonly value: readonly string[];
|
|
229
|
+
};
|
|
230
|
+
/** The membership kind column, or the kind every row has. */
|
|
231
|
+
readonly via?: {
|
|
232
|
+
readonly column: string;
|
|
233
|
+
} | {
|
|
234
|
+
readonly value: string;
|
|
235
|
+
};
|
|
236
|
+
readonly expiresAt?: string;
|
|
237
|
+
readonly disabledAt?: string;
|
|
238
|
+
/**
|
|
239
|
+
* A row may hold no role key: such a row is no membership, and a reader drops
|
|
240
|
+
* it.
|
|
241
|
+
*/
|
|
242
|
+
readonly nullableRoles: boolean;
|
|
243
|
+
/**
|
|
244
|
+
* The guard the source reads its roles table with: a tenant row named like a
|
|
245
|
+
* declared role is no role.
|
|
246
|
+
*/
|
|
247
|
+
readonly guard?: RoleGuard;
|
|
248
|
+
};
|
|
249
|
+
/**
|
|
250
|
+
* The rows of a membership table, for the holder-count and transfer-only
|
|
251
|
+
* triggers `permdock rls generate` puts on it. No suspension filter: a
|
|
252
|
+
* suspended holder still holds the role.
|
|
253
|
+
*/
|
|
254
|
+
type MembershipHolders = {
|
|
255
|
+
/**
|
|
256
|
+
* `<table>.<id column>%type`: the type of a variable `rows` compares the id
|
|
257
|
+
* column with.
|
|
258
|
+
*/
|
|
259
|
+
readonly idType: string;
|
|
260
|
+
/**
|
|
261
|
+
* The instance id of scope `scope` the PL/pgSQL record `row` holds, as text;
|
|
262
|
+
* null on a row of another scope.
|
|
263
|
+
*/
|
|
264
|
+
id: (scope: string, row: string) => string;
|
|
265
|
+
/**
|
|
266
|
+
* `select id, user_id, role, via, live` over the rows of scope `scope` in
|
|
267
|
+
* `from` (default the table): one row per held role key, `live` false once
|
|
268
|
+
* expired. `id` is an expression of `idType` the id column must equal.
|
|
269
|
+
*/
|
|
270
|
+
rows: (scope: string, options?: {
|
|
271
|
+
readonly id?: string;
|
|
272
|
+
readonly from?: string;
|
|
273
|
+
}) => string;
|
|
274
|
+
};
|
|
275
|
+
type SqlMembershipSource = MembershipSource & {
|
|
276
|
+
readonly sql: MembershipSql;
|
|
277
|
+
/**
|
|
278
|
+
* The same source with the role keys of tenant rows of `guard.table` named
|
|
279
|
+
* like a declared role read as null.
|
|
280
|
+
*/
|
|
281
|
+
readonly guarded?: (guard: RoleGuard) => SqlMembershipSource;
|
|
282
|
+
};
|
|
283
|
+
/** The part of `@supabase/server`'s `PostgresApi` a `SqlQuery` needs. */
|
|
284
|
+
type SupabasePostgres = {
|
|
285
|
+
readonly queryRaw: (text: string, params?: unknown[]) => Promise<readonly Record<string, unknown>[]>;
|
|
286
|
+
};
|
|
287
|
+
declare function supabasePostgresQuery(postgres: SupabasePostgres): SqlQuery;
|
|
288
|
+
/**
|
|
289
|
+
* Memberships from one table holding every scope: a row per user, scope,
|
|
290
|
+
* instance and role (`user_id, scope, scope_id, role`), with optional `within`,
|
|
291
|
+
* `via`, expiry, owner and seat columns. Rows of the same instance merge into
|
|
292
|
+
* one membership.
|
|
293
|
+
*/
|
|
294
|
+
declare function tableMembershipSource(options: MembershipTableOptions): SqlMembershipSource;
|
|
295
|
+
/**
|
|
296
|
+
* Memberships from a table of one scope (`customer_contacts`): every row is a
|
|
297
|
+
* membership of `scope`, with roles from a column or fixed (`['contact']`), a
|
|
298
|
+
* fixed `via`, and ancestor ids from `within` columns.
|
|
299
|
+
*/
|
|
300
|
+
declare function junctionMembershipSource(options: MembershipJunctionOptions): SqlMembershipSource;
|
|
301
|
+
declare const AUTHZ_VERSION_TABLE = "permdock_authz_version";
|
|
302
|
+
/**
|
|
303
|
+
* Reads the authorization version `permdock supabase hook generate` keeps in
|
|
304
|
+
* `<schema>.permdock_authz_version`: pass it to `claimsFirst(sources, { version
|
|
305
|
+
* })`.
|
|
306
|
+
*/
|
|
307
|
+
declare function authzVersion(options: {
|
|
308
|
+
readonly query: SqlQuery;
|
|
309
|
+
readonly schema?: string;
|
|
310
|
+
}): NonNullable<MembershipSource["version"]>;
|
|
311
|
+
//#endregion
|
|
312
|
+
export { MembershipStream as a, SupabasePostgres as c, supabasePostgresQuery as d, tableMembershipSource as f, MembershipSql as i, authzVersion as l, MembershipHolders as n, MembershipTableOptions as o, MembershipJunctionOptions as r, SqlMembershipSource as s, AUTHZ_VERSION_TABLE as t, junctionMembershipSource as u };
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { r as isRecord, t as compact } from "./compact-CAf557ZB.js";
|
|
2
|
-
import { i as readAppData } from "./app-data-
|
|
3
|
-
import { a as quoteQualifiedTable, c as quoteSqlTable, i as qualifySqlTable, o as quoteSqlIdent, s as quoteSqlLiteral, u as
|
|
2
|
+
import { i as readAppData } from "./app-data-UNNm07jV.js";
|
|
3
|
+
import { a as quoteQualifiedTable, c as quoteSqlTable, d as sqlTextArray, i as qualifySqlTable, o as quoteSqlIdent, s as quoteSqlLiteral, u as sqlRows } from "./sql-0WjxIp9g.js";
|
|
4
4
|
//#region src/supabase/keep.ts
|
|
5
|
-
/**
|
|
5
|
+
/**
|
|
6
|
+
* The permission keys of a suspended scope's `keep`, references read by `key`,
|
|
7
|
+
* sorted and unique.
|
|
8
|
+
*/
|
|
6
9
|
function keptKeys(row) {
|
|
7
10
|
const keep = row?.keep;
|
|
8
11
|
if (keep === void 0) return [];
|
|
@@ -30,8 +33,8 @@ function activeRow(row, id) {
|
|
|
30
33
|
return `exists (select 1 from ${quoteQualifiedTable(row.table)} s where ${parts.join(" and ")})`;
|
|
31
34
|
}
|
|
32
35
|
/**
|
|
33
|
-
* The suspendable instances on the row's chain whose scope keeps
|
|
34
|
-
*
|
|
36
|
+
* The suspendable instances on the row's chain whose scope keeps permissions:
|
|
37
|
+
* each one's active check and its kept keys.
|
|
35
38
|
*/
|
|
36
39
|
function keeping(shape) {
|
|
37
40
|
const scopes = Object.entries(shape.suspension?.scopes ?? {}).flatMap(([name, row]) => {
|
|
@@ -55,9 +58,8 @@ function keepsDisabled(shape) {
|
|
|
55
58
|
return shape.disabledAt !== void 0 && keptKeys(shape.suspension?.memberships).length > 0;
|
|
56
59
|
}
|
|
57
60
|
/**
|
|
58
|
-
* The keys a row on a suspended chain still grants, as a sorted `jsonb`
|
|
59
|
-
*
|
|
60
|
-
* is kept.
|
|
61
|
+
* The keys a row on a suspended chain still grants, as a sorted `jsonb` array:
|
|
62
|
+
* the keys every suspended instance on it keeps. `null` when nothing is kept.
|
|
61
63
|
*/
|
|
62
64
|
function keptSql(shape) {
|
|
63
65
|
const list = keeping(shape);
|
|
@@ -115,7 +117,8 @@ function selectOf(shape, where, user, keep) {
|
|
|
115
117
|
return `select ${fields.join(", ")}
|
|
116
118
|
from ${quoteQualifiedTable(shape.table)} m${shape.join}
|
|
117
119
|
where ${where.join("\n and ")}
|
|
118
|
-
group by ${group.join(", ")}
|
|
120
|
+
group by ${group.join(", ")}
|
|
121
|
+
having ${shape.roles} is not null`;
|
|
119
122
|
}
|
|
120
123
|
function holdersOf(shape) {
|
|
121
124
|
const id = ident$1(shape.idColumn);
|
|
@@ -166,10 +169,10 @@ function isRoleList(role) {
|
|
|
166
169
|
}
|
|
167
170
|
/**
|
|
168
171
|
* Resolves the role sources of `table` (`schema.table`, or `public`). An
|
|
169
|
-
* unqualified `through` table is in `table`'s schema. `label` names the
|
|
170
|
-
*
|
|
171
|
-
*
|
|
172
|
-
*
|
|
172
|
+
* unqualified `through` table is in `table`'s schema. `label` names the option
|
|
173
|
+
* in the error for an `on` that is not exactly one column; `prefix` starts
|
|
174
|
+
* every error. A row with several sources holds the union of their non-null
|
|
175
|
+
* keys.
|
|
173
176
|
*/
|
|
174
177
|
function roleColumn(role, table, alias, options) {
|
|
175
178
|
if (!isRoleList(role)) return singleRole(role, table, alias, options);
|
|
@@ -191,7 +194,8 @@ function roleColumn(role, table, alias, options) {
|
|
|
191
194
|
lookup: sql,
|
|
192
195
|
columns: [...new Set(parts.map((part) => part.column))],
|
|
193
196
|
throughs: parts.flatMap((part) => part.throughs),
|
|
194
|
-
lateral: true
|
|
197
|
+
lateral: true,
|
|
198
|
+
nullable: false
|
|
195
199
|
};
|
|
196
200
|
}
|
|
197
201
|
function singleRole(role, table, alias, options) {
|
|
@@ -204,8 +208,24 @@ function singleRole(role, table, alias, options) {
|
|
|
204
208
|
lookup: `${alias}.${q(role)}::text`,
|
|
205
209
|
columns: [role],
|
|
206
210
|
throughs: [],
|
|
207
|
-
lateral: false
|
|
211
|
+
lateral: false,
|
|
212
|
+
nullable: false
|
|
208
213
|
};
|
|
214
|
+
if ("map" in role) {
|
|
215
|
+
const arms = Object.entries(role.map).map(([value, key]) => `when ${quoteSqlLiteral(value)} then ${key === null ? "null" : quoteSqlLiteral(key)}`);
|
|
216
|
+
const mapped = `case ${alias}.${q(role.column)}::text ${arms.join(" ")} else null end`;
|
|
217
|
+
return {
|
|
218
|
+
column: role.column,
|
|
219
|
+
sql: mapped,
|
|
220
|
+
join: "",
|
|
221
|
+
lookup: mapped,
|
|
222
|
+
columns: [role.column],
|
|
223
|
+
throughs: [],
|
|
224
|
+
lateral: false,
|
|
225
|
+
map: role.map,
|
|
226
|
+
nullable: true
|
|
227
|
+
};
|
|
228
|
+
}
|
|
209
229
|
const pairs = Object.entries(role.on);
|
|
210
230
|
const [pair] = pairs;
|
|
211
231
|
if (pair === void 0 || pairs.length !== 1) throw new TypeError(`${prefix}: ${options.label}.on must map exactly one column of ${table} to ${role.through}, for example ${options.example ?? "{ role_id: 'id' }"}`);
|
|
@@ -220,19 +240,30 @@ function singleRole(role, table, alias, options) {
|
|
|
220
240
|
key: role.column,
|
|
221
241
|
ref
|
|
222
242
|
};
|
|
243
|
+
const plain = `${keys}.${q(role.column)}::text`;
|
|
244
|
+
const guard = options.guard;
|
|
245
|
+
const key = guard !== void 0 && qualifySqlTable(guard.table) === through ? `case when ${keys}.${q(guard.tenant)} is not null${guard.skip === void 0 ? "" : ` and not coalesce(${keys}.${q(guard.skip)}, false)`} and ${plain} = any(${sqlTextArray(guard.declared)}) then null else ${plain} end` : plain;
|
|
223
246
|
return {
|
|
224
247
|
column: ref,
|
|
225
|
-
sql:
|
|
248
|
+
sql: key,
|
|
226
249
|
join: `${options.indent === void 0 ? " " : `\n${options.indent}`}join ${target} ${keys} on ${keys}.${q(id)} = ${alias}.${q(ref)}`,
|
|
227
|
-
lookup: `(select ${
|
|
250
|
+
lookup: `(select ${key} from ${target} ${keys} where ${keys}.${q(id)} = ${alias}.${q(ref)})`,
|
|
228
251
|
through: keyed,
|
|
229
252
|
columns: [ref],
|
|
230
253
|
throughs: [keyed],
|
|
231
|
-
lateral: false
|
|
254
|
+
lateral: false,
|
|
255
|
+
nullable: false
|
|
232
256
|
};
|
|
233
257
|
}
|
|
234
|
-
/**
|
|
235
|
-
|
|
258
|
+
/**
|
|
259
|
+
* The manifest entry of one role source: the column, and the roles table it
|
|
260
|
+
* references.
|
|
261
|
+
*/
|
|
262
|
+
function sourceManifest(column, through, map) {
|
|
263
|
+
if (map !== void 0) return {
|
|
264
|
+
column,
|
|
265
|
+
map
|
|
266
|
+
};
|
|
236
267
|
return through === void 0 ? { column } : {
|
|
237
268
|
column,
|
|
238
269
|
through: {
|
|
@@ -246,9 +277,12 @@ function sourceManifest(column, through) {
|
|
|
246
277
|
function columnManifest(role) {
|
|
247
278
|
return sourceManifest(role.column, role.through);
|
|
248
279
|
}
|
|
249
|
-
/**
|
|
280
|
+
/**
|
|
281
|
+
* The manifest entry of a role column, or one entry per source of a row with
|
|
282
|
+
* several.
|
|
283
|
+
*/
|
|
250
284
|
function roleManifest(role) {
|
|
251
|
-
if (!role.lateral) return sourceManifest(role.column, role.through);
|
|
285
|
+
if (!role.lateral) return sourceManifest(role.column, role.through, role.map);
|
|
252
286
|
return role.columns.map((column) => sourceManifest(column, role.throughs.find((through) => through.ref === column)));
|
|
253
287
|
}
|
|
254
288
|
//#endregion
|
|
@@ -258,14 +292,21 @@ const literal = quoteSqlLiteral;
|
|
|
258
292
|
function isFixed(roles) {
|
|
259
293
|
return Array.isArray(roles);
|
|
260
294
|
}
|
|
261
|
-
/**
|
|
262
|
-
|
|
295
|
+
/**
|
|
296
|
+
* A role column of the membership table, aliased `m`; a `through` column joins
|
|
297
|
+
* its roles table as `mk`.
|
|
298
|
+
*/
|
|
299
|
+
function memberRole(role, table, label, guard) {
|
|
263
300
|
return roleColumn(role, qualifySqlTable(table), "m", {
|
|
264
301
|
label,
|
|
265
|
-
indent: ""
|
|
302
|
+
indent: "",
|
|
303
|
+
...guard === void 0 ? {} : { guard }
|
|
266
304
|
});
|
|
267
305
|
}
|
|
268
|
-
/**
|
|
306
|
+
/**
|
|
307
|
+
* The user of the membership table, aliased `m`; a `through` user joins its
|
|
308
|
+
* table as `mu`.
|
|
309
|
+
*/
|
|
269
310
|
function memberUser(user, table, label) {
|
|
270
311
|
const column = roleColumn(user, qualifySqlTable(table), "m", {
|
|
271
312
|
label,
|
|
@@ -278,12 +319,30 @@ function memberUser(user, table, label) {
|
|
|
278
319
|
sql: column.through === void 0 ? col(column.column) : `mu.${ident(column.through.key)}`
|
|
279
320
|
};
|
|
280
321
|
}
|
|
281
|
-
|
|
282
|
-
|
|
322
|
+
/** `through` tables qualified in the schema of `table`. */
|
|
323
|
+
function throughIn(through, table) {
|
|
324
|
+
const schema = qualifySqlTable(table).split(".")[0] ?? "public";
|
|
325
|
+
return {
|
|
326
|
+
...through,
|
|
327
|
+
through: through.through.includes(".") ? through.through : `${schema}.${through.through}`
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
function qualifiedThrough(source, table) {
|
|
331
|
+
return typeof source === "string" || "map" in source ? source : throughIn(source, table);
|
|
283
332
|
}
|
|
284
|
-
function
|
|
285
|
-
return
|
|
333
|
+
function streamUser(user, table) {
|
|
334
|
+
return typeof user === "string" ? user : throughIn(user, table);
|
|
335
|
+
}
|
|
336
|
+
function isSourceList(role) {
|
|
337
|
+
return Array.isArray(role);
|
|
286
338
|
}
|
|
339
|
+
function streamRoles(role, table) {
|
|
340
|
+
return isSourceList(role) ? role.map((source) => qualifiedThrough(source, table)) : qualifiedThrough(role, table);
|
|
341
|
+
}
|
|
342
|
+
function roleAgg(role) {
|
|
343
|
+
return `jsonb_agg(distinct ${role.sql} order by ${role.sql}) filter (where ${role.sql} is not null)`;
|
|
344
|
+
}
|
|
345
|
+
const rowsOf = sqlRows;
|
|
287
346
|
function strings(value) {
|
|
288
347
|
return Array.isArray(value) ? value.filter((item) => typeof item === "string" && item !== "") : [];
|
|
289
348
|
}
|
|
@@ -339,9 +398,10 @@ function sourceOf(sql, query) {
|
|
|
339
398
|
}
|
|
340
399
|
/**
|
|
341
400
|
* `ctx.postgres` (from `withPostgresClient`) or `ctx.postgresAdmin` as a
|
|
342
|
-
* `SqlQuery` for `tableMembershipSource`, `junctionMembershipSource` and
|
|
343
|
-
* `ctx.postgres` runs as the caller under RLS, so the
|
|
344
|
-
* be readable by `authenticated`; `ctx.postgresAdmin`
|
|
401
|
+
* `SqlQuery` for `tableMembershipSource`, `junctionMembershipSource` and
|
|
402
|
+
* `supabaseApprovalStore`. `ctx.postgres` runs as the caller under RLS, so the
|
|
403
|
+
* membership tables must be readable by `authenticated`; `ctx.postgresAdmin`
|
|
404
|
+
* bypasses RLS.
|
|
345
405
|
*/
|
|
346
406
|
function optionalColumn(name, cast) {
|
|
347
407
|
return name === void 0 ? `null::${cast}` : `${col(name)}::${cast}`;
|
|
@@ -351,18 +411,21 @@ function supabasePostgresQuery(postgres) {
|
|
|
351
411
|
}
|
|
352
412
|
/**
|
|
353
413
|
* Memberships from one table holding every scope: a row per user, scope,
|
|
354
|
-
* instance and role (`user_id, scope, scope_id, role`), with optional
|
|
355
|
-
* `
|
|
356
|
-
*
|
|
414
|
+
* instance and role (`user_id, scope, scope_id, role`), with optional `within`,
|
|
415
|
+
* `via`, expiry, owner and seat columns. Rows of the same instance merge into
|
|
416
|
+
* one membership.
|
|
357
417
|
*/
|
|
358
418
|
function tableMembershipSource(options) {
|
|
419
|
+
return tableSource(options, void 0);
|
|
420
|
+
}
|
|
421
|
+
function tableSource(options, guard) {
|
|
359
422
|
const c = options.columns ?? {};
|
|
360
423
|
const scope = `${col(c.scope ?? "scope")}::text`;
|
|
361
424
|
const id = `${col(c.id ?? "scope_id")}::text`;
|
|
362
425
|
const within = c.within === void 0 ? "null::jsonb" : col(c.within);
|
|
363
426
|
const user = memberUser(c.user ?? "user_id", options.table, "tableMembershipSource columns.user");
|
|
364
|
-
const role = memberRole(c.role ?? "role", options.table, "tableMembershipSource columns.role");
|
|
365
|
-
|
|
427
|
+
const role = memberRole(c.role ?? "role", options.table, "tableMembershipSource columns.role", guard);
|
|
428
|
+
const shape = {
|
|
366
429
|
table: options.table,
|
|
367
430
|
join: `${user.column.join}${role.join}`,
|
|
368
431
|
through: role.through,
|
|
@@ -427,7 +490,26 @@ function tableMembershipSource(options) {
|
|
|
427
490
|
expiresAt: c.expiresAt === void 0 ? void 0 : { column: c.expiresAt },
|
|
428
491
|
disabledAt: c.disabledAt === void 0 ? void 0 : { column: c.disabledAt }
|
|
429
492
|
})
|
|
430
|
-
}
|
|
493
|
+
};
|
|
494
|
+
const stream = compact({
|
|
495
|
+
table: qualifySqlTable(options.table),
|
|
496
|
+
user: streamUser(c.user ?? "user_id", options.table),
|
|
497
|
+
scope: { column: c.scope ?? "scope" },
|
|
498
|
+
id: c.id ?? "scope_id",
|
|
499
|
+
roles: streamRoles(c.role ?? "role", options.table),
|
|
500
|
+
via: c.via === void 0 ? void 0 : { column: c.via },
|
|
501
|
+
expiresAt: c.expiresAt,
|
|
502
|
+
disabledAt: c.disabledAt,
|
|
503
|
+
nullableRoles: true,
|
|
504
|
+
guard
|
|
505
|
+
});
|
|
506
|
+
return {
|
|
507
|
+
...sourceOf({
|
|
508
|
+
...sqlOf(shape),
|
|
509
|
+
stream
|
|
510
|
+
}, options.query),
|
|
511
|
+
guarded: (next) => tableSource(options, next)
|
|
512
|
+
};
|
|
431
513
|
}
|
|
432
514
|
/**
|
|
433
515
|
* Memberships from a table of one scope (`customer_contacts`): every row is a
|
|
@@ -435,13 +517,16 @@ function tableMembershipSource(options) {
|
|
|
435
517
|
* fixed `via`, and ancestor ids from `within` columns.
|
|
436
518
|
*/
|
|
437
519
|
function junctionMembershipSource(options) {
|
|
520
|
+
return junctionSource(options, void 0);
|
|
521
|
+
}
|
|
522
|
+
function junctionSource(options, guard) {
|
|
438
523
|
if (!/^[a-z][a-z0-9_]*$/u.test(options.scope)) throw new TypeError(`PermDock: unsafe scope name '${options.scope}'`);
|
|
439
524
|
const idColumn = options.id ?? `${options.scope}_id`;
|
|
440
525
|
const withinEntries = Object.entries(options.within ?? {});
|
|
441
526
|
const roles = options.roles;
|
|
442
527
|
const fixed = isFixed(roles) ? roles : void 0;
|
|
443
528
|
if (fixed?.length === 0) throw new TypeError("PermDock: junctionMembershipSource needs at least one role");
|
|
444
|
-
const role = isFixed(roles) ? void 0 : memberRole(typeof roles === "object" && "sources" in roles ? roles.sources : roles, options.table, "junctionMembershipSource roles");
|
|
529
|
+
const role = isFixed(roles) ? void 0 : memberRole(typeof roles === "object" && "sources" in roles ? roles.sources : roles, options.table, "junctionMembershipSource roles", guard);
|
|
445
530
|
const user = memberUser(options.user ?? "user_id", options.table, "junctionMembershipSource user");
|
|
446
531
|
const managedColumn = options.managedBy === void 0 ? void 0 : options.managedBy === "idp" ? "" : options.managedBy.column;
|
|
447
532
|
const groupColumn = options.group === void 0 || typeof options.group === "string" ? void 0 : options.group.column;
|
|
@@ -509,21 +594,40 @@ function junctionMembershipSource(options) {
|
|
|
509
594
|
})
|
|
510
595
|
};
|
|
511
596
|
const sql = sqlOf(shape);
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
597
|
+
const stream = compact({
|
|
598
|
+
table: qualifySqlTable(options.table),
|
|
599
|
+
user: streamUser(options.user ?? "user_id", options.table),
|
|
600
|
+
scope: { value: options.scope },
|
|
601
|
+
id: idColumn,
|
|
602
|
+
roles: fixed === void 0 ? streamRoles(typeof roles === "object" && "sources" in roles ? roles.sources : roles, options.table) : { value: [...fixed] },
|
|
603
|
+
via: options.via === void 0 ? void 0 : { value: options.via },
|
|
604
|
+
expiresAt: options.expiresAt,
|
|
605
|
+
disabledAt: options.disabledAt,
|
|
606
|
+
nullableRoles: fixed === void 0,
|
|
607
|
+
guard
|
|
608
|
+
});
|
|
609
|
+
return {
|
|
610
|
+
...sourceOf({
|
|
611
|
+
...sql,
|
|
612
|
+
stream,
|
|
613
|
+
scope: options.scope,
|
|
614
|
+
holds: [options.scope, ...withinEntries.map(([name]) => name)],
|
|
615
|
+
list: (keep = sql.keeps) => selectOf(shape, filters(shape, `$1::text = ${literal(options.scope)} and ${col(idColumn)}::text = $2::text`), true, keep)
|
|
616
|
+
}, options.query),
|
|
617
|
+
guarded: (next) => junctionSource(options, next)
|
|
618
|
+
};
|
|
518
619
|
}
|
|
519
620
|
const AUTHZ_VERSION_TABLE = "permdock_authz_version";
|
|
520
621
|
/**
|
|
521
|
-
* The default schema of everything PermDock generates: helpers, seeds, the
|
|
522
|
-
*
|
|
523
|
-
*
|
|
622
|
+
* The default schema of everything PermDock generates: helpers, seeds, the RBAC
|
|
623
|
+
* scaffold, the hook and the version table. Keep it out of the Data API's
|
|
624
|
+
* exposed schemas, so the `security definer` functions are not RPCs.
|
|
524
625
|
*/
|
|
525
626
|
const PERMDOCK_SCHEMA = "permdock";
|
|
526
|
-
/**
|
|
627
|
+
/**
|
|
628
|
+
* Where `supabase.hook.api` puts the PostgREST wrappers, and the prefix of
|
|
629
|
+
* their names.
|
|
630
|
+
*/
|
|
527
631
|
const HOOK_API_SCHEMA = "public";
|
|
528
632
|
const HOOK_API_PREFIX = "permdock_";
|
|
529
633
|
/** The wrapper function names of `supabase.hook.api` for `prefix`. */
|
|
@@ -536,7 +640,8 @@ function hookApiNames(prefix = HOOK_API_PREFIX) {
|
|
|
536
640
|
}
|
|
537
641
|
/**
|
|
538
642
|
* Reads the authorization version `permdock supabase hook generate` keeps in
|
|
539
|
-
* `<schema>.permdock_authz_version`: pass it to `claimsFirst(sources, { version
|
|
643
|
+
* `<schema>.permdock_authz_version`: pass it to `claimsFirst(sources, { version
|
|
644
|
+
* })`.
|
|
540
645
|
*/
|
|
541
646
|
function authzVersion(options) {
|
|
542
647
|
const table = quoteQualifiedTable(`${options.schema ?? "permdock"}.${AUTHZ_VERSION_TABLE}`);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
//#region src/cli/sql/sources.ts
|
|
2
|
+
/**
|
|
3
|
+
* The membership sources a project reads: `rls.membershipSources`, else
|
|
4
|
+
* `supabase.hook.memberships`. Every generator, doctor check and verifier
|
|
5
|
+
* resolves them here, so they all read the same tables.
|
|
6
|
+
*/
|
|
7
|
+
function membershipSourcesOf(config) {
|
|
8
|
+
return config.rls?.membershipSources ?? config.supabase?.hook?.memberships ?? [];
|
|
9
|
+
}
|
|
10
|
+
//#endregion
|
|
11
|
+
export { membershipSourcesOf as t };
|