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,24 +1,28 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { t as compact } from "../compact-CAf557ZB.js";
|
|
3
|
-
import { n as freezeDeep } from "../freeze-
|
|
4
|
-
import { r as requiredPlans } from "../problem-details-
|
|
5
|
-
import {
|
|
6
|
-
import { n as isThenable } from "../thenable-
|
|
7
|
-
import { h as secondsAt, m as rfc3339 } from "../time-
|
|
8
|
-
import {
|
|
9
|
-
import { o as flattenGrantee } from "../grantee-
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import { t as
|
|
14
|
-
import { t as
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import { a as
|
|
2
|
+
import { r as isRecord, t as compact } from "../compact-CAf557ZB.js";
|
|
3
|
+
import { n as freezeDeep } from "../freeze-jjan0lCv.js";
|
|
4
|
+
import { r as requiredPlans } from "../problem-details-CLDgX1KV.js";
|
|
5
|
+
import { n as describe } from "../describe-Bb4hGK5d.js";
|
|
6
|
+
import { n as isThenable } from "../thenable-BNSM1U2R.js";
|
|
7
|
+
import { h as secondsAt, m as rfc3339 } from "../time-nR1JesoH.js";
|
|
8
|
+
import { f as scopeList, h as tenantOf$1, o as normalizeMemberships, s as resolveScope } from "../scopes-0Up_UA2t.js";
|
|
9
|
+
import { o as flattenGrantee } from "../grantee-Dke-9rd1.js";
|
|
10
|
+
import { t as byCodePoint } from "../compare-DTfyUunF.js";
|
|
11
|
+
import { d as resolveActiveTenant, r as isMembershipExpired } from "../tenancy-5d1zVBvK.js";
|
|
12
|
+
import { a as bindConditionRefs, n as parseSnapshot } from "../snapshot-CXlzi69u.js";
|
|
13
|
+
import { r as heldRoleNames, t as emptySnapshot } from "../from-snapshot-DCakWRsr.js";
|
|
14
|
+
import { t as parseLocalSnapshotManifest } from "../parse-local-manifest-DEiCF4ah.js";
|
|
15
|
+
import { r as approvalHeaders } from "../protected-action-DUYqb-Ma.js";
|
|
16
|
+
import { i as isJws, n as storeOf, r as eventSourceRefresh, t as adapterStore } from "../store-options-Dil3lraY.js";
|
|
17
|
+
import { a as PermDockUiContext, i as PermDockStoreContext, n as useKeyed, t as useLiveOptions } from "../live-options-BBIT68le.js";
|
|
18
|
+
import { a as useAssignableRoles, c as useGate, d as usePermission, f as usePermissions, h as useTenant, i as useAssignablePermissions, l as useMemberships, m as useSubject, n as Protected, o as useDescribe, p as useRoles, r as useApproval, s as useFilter, t as useProtectedAction, u as usePermDock } from "../protected-action-QEA8arRB.js";
|
|
18
19
|
import { useEffect, useMemo, useRef } from "react";
|
|
19
20
|
import { jsx } from "react/jsx-runtime";
|
|
20
21
|
//#region src/react-native/guards.ts
|
|
21
|
-
/**
|
|
22
|
+
/**
|
|
23
|
+
* `true` once the provider has a snapshot to answer from: storage was read or a
|
|
24
|
+
* seed was given. Hide the splash screen on it.
|
|
25
|
+
*/
|
|
22
26
|
function useSnapshotReady() {
|
|
23
27
|
return usePermDock().status() !== "pending";
|
|
24
28
|
}
|
|
@@ -41,6 +45,71 @@ function usePermissionGuard(permission, data) {
|
|
|
41
45
|
]);
|
|
42
46
|
}
|
|
43
47
|
//#endregion
|
|
48
|
+
//#region src/react-native/local-assignable.ts
|
|
49
|
+
/**
|
|
50
|
+
* The levels a holder of `level` on `key` may hand out; `undefined` when the
|
|
51
|
+
* table does not know the entry.
|
|
52
|
+
*/
|
|
53
|
+
function entryReach(table, key, level) {
|
|
54
|
+
const row = Object.hasOwn(table.permissions, key) ? table.permissions[key] : void 0;
|
|
55
|
+
if (row === void 0) return;
|
|
56
|
+
if (level === void 0) return row.reach;
|
|
57
|
+
return row.levelReach !== void 0 && Object.hasOwn(row.levelReach, level) ? row.levelReach[level] : void 0;
|
|
58
|
+
}
|
|
59
|
+
/** The levels a holder of `role`'s included grants on `key` may hand out. */
|
|
60
|
+
function includeReach(table, role, key) {
|
|
61
|
+
const byKey = table.includeReach !== void 0 && Object.hasOwn(table.includeReach, role) ? table.includeReach[role] : void 0;
|
|
62
|
+
return byKey !== void 0 && Object.hasOwn(byKey, key) ? byKey[key] : void 0;
|
|
63
|
+
}
|
|
64
|
+
function listOf(record, key) {
|
|
65
|
+
return record !== void 0 && Object.hasOwn(record, key) ? record[key] ?? [] : [];
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* What the subject may hand out in `tenant`, by the rules of `assignableIn`:
|
|
69
|
+
* declared assignable roles and the tenant's custom roles, intersected with the
|
|
70
|
+
* permissions and levels the subject holds there. Holding a `meta.manageRoles`
|
|
71
|
+
* role, or an unconditioned allow of a `meta.manageRoles` permission, lifts the
|
|
72
|
+
* intersection.
|
|
73
|
+
*/
|
|
74
|
+
function localAssignableFor(input) {
|
|
75
|
+
const { rules, custom, tenant, heldNames } = input;
|
|
76
|
+
const allows = input.held.filter((item) => item.grant.effect === "allow");
|
|
77
|
+
const heldKeys = new Set(allows.map((item) => item.grant.permission));
|
|
78
|
+
const unconditioned = (effect, key) => input.held.some(({ grant }) => grant.effect === effect && grant.permission === key && grant.where === void 0 && grant.check === void 0 && grant.approval === void 0 && grant.validity === void 0);
|
|
79
|
+
const manage = heldNames.some((name) => rules.manage.roles.includes(name)) || rules.manage.permissions.some((key) => unconditioned("allow", key) && !unconditioned("deny", key));
|
|
80
|
+
const held = new Set(heldNames);
|
|
81
|
+
const listed = rules.assigns === void 0 ? void 0 : new Set(heldNames.flatMap((name) => listOf(rules.assigns, name)));
|
|
82
|
+
const roles = rules.roles.filter((item) => {
|
|
83
|
+
if (manage) return true;
|
|
84
|
+
if (listed !== void 0) return listed.has(item.name);
|
|
85
|
+
return held.has(item.name) || item.allows.length > 0 && item.allows.every((key) => heldKeys.has(key));
|
|
86
|
+
});
|
|
87
|
+
const permissions = rules.permissions.filter((leaf) => manage || heldKeys.has(leaf.key));
|
|
88
|
+
const offered = (key) => {
|
|
89
|
+
const names = listOf(rules.levels, key);
|
|
90
|
+
if (manage) return names;
|
|
91
|
+
const reached = new Set(allows.filter((item) => item.grant.permission === key).flatMap((item) => item.reach ?? []));
|
|
92
|
+
return names.filter((name) => reached.has(name));
|
|
93
|
+
};
|
|
94
|
+
const levels = {};
|
|
95
|
+
for (const leaf of permissions) if (listOf(rules.levels, leaf.key).length > 0) levels[leaf.key] = offered(leaf.key);
|
|
96
|
+
const assignsAt = manage ? void 0 : new Set(roles.map((item) => item.on));
|
|
97
|
+
const mayHandOut = (scope, allow) => {
|
|
98
|
+
const table = Object.hasOwn(custom, scope) ? custom[scope] : void 0;
|
|
99
|
+
if (table === void 0 || !Object.hasOwn(table.permissions, allow.key) || !(manage || heldKeys.has(allow.key))) return false;
|
|
100
|
+
if (listOf(rules.levels, allow.key).length === 0) return true;
|
|
101
|
+
const can = offered(allow.key);
|
|
102
|
+
return (allow.reach ?? []).every((name) => can.includes(name));
|
|
103
|
+
};
|
|
104
|
+
const customNames = input.customRoles.filter((role) => (assignsAt === void 0 || assignsAt.has(role.scope)) && role.allows.length > 0 && role.allows.every((allow) => mayHandOut(role.scope, allow))).toSorted((a, b) => Number(!a.shared) - Number(!b.shared) || byCodePoint(a.name, b.name)).map((role) => role.name);
|
|
105
|
+
return compact({
|
|
106
|
+
tenant,
|
|
107
|
+
roles: [...roles.map((item) => item.name), ...new Set(customNames)],
|
|
108
|
+
permissions,
|
|
109
|
+
levels: Object.keys(levels).length === 0 ? void 0 : levels
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
//#endregion
|
|
44
113
|
//#region src/react-native/local.ts
|
|
45
114
|
const CARRIED = /* @__PURE__ */ new Set([
|
|
46
115
|
"id",
|
|
@@ -75,8 +144,8 @@ function renamed(grant, name) {
|
|
|
75
144
|
};
|
|
76
145
|
}
|
|
77
146
|
/**
|
|
78
|
-
* The grants a custom role holds, from the entries the server resolved one
|
|
79
|
-
*
|
|
147
|
+
* The grants a custom role holds, from the entries the server resolved one by
|
|
148
|
+
* one: an entry the table does not know grants nothing.
|
|
80
149
|
*/
|
|
81
150
|
function customGrants(table, role) {
|
|
82
151
|
const entries = Array.isArray(role.grants) ? role.grants : [];
|
|
@@ -102,22 +171,38 @@ function customGrants(table, role) {
|
|
|
102
171
|
});
|
|
103
172
|
}
|
|
104
173
|
const out = [];
|
|
174
|
+
const reached = [];
|
|
105
175
|
const included = /* @__PURE__ */ new Set();
|
|
106
176
|
const names = Array.isArray(role.includes) ? role.includes : [];
|
|
107
177
|
for (const name of names) {
|
|
108
178
|
const list = typeof name === "string" && Object.hasOwn(table.includes, name) ? table.includes[name] : void 0;
|
|
109
179
|
for (const grant of list ?? []) {
|
|
110
180
|
if (grant.effect === "deny" || !removed.has(grant.permission)) out.push(grant);
|
|
111
|
-
if (grant.effect === "allow")
|
|
181
|
+
if (grant.effect === "allow") {
|
|
182
|
+
included.add(grant.permission);
|
|
183
|
+
if (!removed.has(grant.permission) && typeof name === "string") reached.push({
|
|
184
|
+
key: grant.permission,
|
|
185
|
+
reach: includeReach(table, name, grant.permission)
|
|
186
|
+
});
|
|
187
|
+
}
|
|
112
188
|
}
|
|
113
189
|
}
|
|
114
190
|
for (const { key, level } of allows) {
|
|
115
191
|
if (removed.has(key) || included.has(key)) continue;
|
|
116
192
|
const row = Object.hasOwn(table.permissions, key) ? table.permissions[key] : void 0;
|
|
117
193
|
const grants = typeof level === "string" ? row?.levels?.[level] : row?.all;
|
|
118
|
-
|
|
194
|
+
if (grants !== void 0 && grants.length > 0) {
|
|
195
|
+
out.push(...grants);
|
|
196
|
+
reached.push({
|
|
197
|
+
key,
|
|
198
|
+
reach: entryReach(table, key, typeof level === "string" ? level : void 0)
|
|
199
|
+
});
|
|
200
|
+
}
|
|
119
201
|
}
|
|
120
|
-
return
|
|
202
|
+
return {
|
|
203
|
+
grants: out.map((grant) => renamed(grant, role.name)),
|
|
204
|
+
allows: reached
|
|
205
|
+
};
|
|
121
206
|
}
|
|
122
207
|
function isList(value) {
|
|
123
208
|
return Array.isArray(value);
|
|
@@ -158,39 +243,60 @@ function buildLocalSnapshot(manifest, data, at) {
|
|
|
158
243
|
const declared = new Set(manifest.roles);
|
|
159
244
|
const globalRoles = new Set(input?.roles ?? []);
|
|
160
245
|
const grants = [];
|
|
161
|
-
const
|
|
162
|
-
|
|
246
|
+
const held = [];
|
|
247
|
+
const attach = (grant, membership, reach) => {
|
|
248
|
+
const bound = bindGrant(membership === void 0 ? grant : {
|
|
163
249
|
...grant,
|
|
164
250
|
membership
|
|
165
|
-
}, subject)
|
|
251
|
+
}, subject);
|
|
252
|
+
grants.push(bound);
|
|
253
|
+
if (membership === void 0 || tenantOf$1(membership, scopes) === tenant && !isMembershipExpired(membership, now)) held.push({
|
|
254
|
+
grant: bound,
|
|
255
|
+
reach
|
|
256
|
+
});
|
|
166
257
|
};
|
|
167
|
-
|
|
258
|
+
const grantReach = manifest.assignable?.grants;
|
|
259
|
+
for (const [index, grant] of manifest.grants.entries()) {
|
|
260
|
+
const reach = grantReach !== void 0 && Object.hasOwn(grantReach, String(index)) ? grantReach[String(index)] : void 0;
|
|
168
261
|
const roleItems = flattenGrantee(grant.to).filter((item) => item.kind === "role");
|
|
169
262
|
if (roleItems.length > 0 && principal === null) continue;
|
|
170
263
|
if (!roleItems.every((item) => item.scope !== "global" || declared.has(item.role) && globalRoles.has(item.role))) continue;
|
|
171
264
|
const scoped = roleItems.filter((item) => item.scope !== "global");
|
|
172
265
|
if (scoped.length === 0) {
|
|
173
|
-
attach(grant);
|
|
266
|
+
attach(grant, void 0, reach);
|
|
174
267
|
continue;
|
|
175
268
|
}
|
|
176
|
-
for (const membership of memberships) if (scoped.every((item) => declared.has(item.role) && membership.roles.includes(item.role) && (typeof item.scope === "string" ? membership.scope === item.scope : membership.on !== void 0))) attach(grant, membership);
|
|
269
|
+
for (const membership of memberships) if (scoped.every((item) => declared.has(item.role) && membership.roles.includes(item.role) && (typeof item.scope === "string" ? membership.scope === item.scope : membership.on !== void 0))) attach(grant, membership, reach);
|
|
177
270
|
}
|
|
178
271
|
const formed = (data.customRoles ?? []).filter((role) => role !== null && typeof role === "object" && typeof role.name === "string" && !declared.has(role.name));
|
|
179
272
|
const sharedNames = new Set(formed.filter((role) => role.shared === true).map((role) => role.name));
|
|
180
273
|
const custom = formed.filter((role) => role.shared === true || role.scope === "global" || !sharedNames.has(role.name));
|
|
274
|
+
const tenantCustom = [];
|
|
275
|
+
const tenantRoles = /* @__PURE__ */ new Set();
|
|
181
276
|
for (const role of custom) {
|
|
182
277
|
const scope = customScope(role, scopes);
|
|
183
278
|
const table = scope !== void 0 && Object.hasOwn(manifest.custom, scope) ? manifest.custom[scope] : void 0;
|
|
184
279
|
if (scope === void 0 || table === void 0) continue;
|
|
185
|
-
const resolved = customGrants(table, role);
|
|
280
|
+
const { grants: resolved, allows } = customGrants(table, role);
|
|
281
|
+
const reachOf = (permission) => [...new Set(allows.filter((allow) => allow.key === permission).flatMap((allow) => allow.reach ?? []))];
|
|
186
282
|
if (scope === "global") {
|
|
187
|
-
if (role.tenant === void 0 && globalRoles.has(role.name)) for (const grant of resolved) attach(grant);
|
|
283
|
+
if (role.tenant === void 0 && globalRoles.has(role.name)) for (const grant of resolved) attach(grant, void 0, reachOf(grant.permission));
|
|
188
284
|
continue;
|
|
189
285
|
}
|
|
286
|
+
if (tenant !== void 0 && (role.shared === true ? role.tenant === void 0 : role.tenant === tenant) && !tenantRoles.has(role.name)) {
|
|
287
|
+
tenantRoles.add(role.name);
|
|
288
|
+
tenantCustom.push({
|
|
289
|
+
name: role.name,
|
|
290
|
+
scope,
|
|
291
|
+
shared: role.shared === true,
|
|
292
|
+
allows
|
|
293
|
+
});
|
|
294
|
+
}
|
|
190
295
|
const id = role.team ?? role.id;
|
|
191
|
-
for (const membership of memberships) if (membership.scope === scope && (role.shared === true ? role.tenant === void 0 && id === void 0 && tenantOf$1(membership, scopes) !== void 0 : typeof role.tenant === "string" && tenantOf$1(membership, scopes) === role.tenant) && (id === void 0 || membership.id === id) && membership.roles.includes(role.name)) for (const grant of resolved) attach(grant, membership);
|
|
296
|
+
for (const membership of memberships) if (membership.scope === scope && (role.shared === true ? role.tenant === void 0 && id === void 0 && tenantOf$1(membership, scopes) !== void 0 : typeof role.tenant === "string" && tenantOf$1(membership, scopes) === role.tenant) && (id === void 0 || membership.id === id) && membership.roles.includes(role.name)) for (const grant of resolved) attach(grant, membership, reachOf(grant.permission));
|
|
192
297
|
}
|
|
193
298
|
const roles = subject.principal === null ? [] : heldRoleNames(subject, tenant, scopes, { rank: manifest.rank ?? [] }, now);
|
|
299
|
+
const rules = manifest.assignable;
|
|
194
300
|
return freezeDeep(compact({
|
|
195
301
|
v: 1,
|
|
196
302
|
issuedAt: rfc3339(now),
|
|
@@ -201,13 +307,21 @@ function buildLocalSnapshot(manifest, data, at) {
|
|
|
201
307
|
roles,
|
|
202
308
|
grants,
|
|
203
309
|
tenants: tenant === void 0 ? [] : [tenant],
|
|
310
|
+
assignable: tenant === void 0 || rules === void 0 ? void 0 : [localAssignableFor({
|
|
311
|
+
rules,
|
|
312
|
+
custom: manifest.custom,
|
|
313
|
+
tenant,
|
|
314
|
+
heldNames: roles,
|
|
315
|
+
held,
|
|
316
|
+
customRoles: tenantCustom
|
|
317
|
+
})],
|
|
204
318
|
scopes: manifest.scopes,
|
|
205
319
|
vocabulary: manifest.vocabulary
|
|
206
320
|
}));
|
|
207
321
|
}
|
|
208
322
|
/**
|
|
209
|
-
* A snapshot source over the device's own membership rows (SQLite, a
|
|
210
|
-
*
|
|
323
|
+
* A snapshot source over the device's own membership rows (SQLite, a PowerSync
|
|
324
|
+
* or Electric replica): offline, the UI guards answer from them.
|
|
211
325
|
*/
|
|
212
326
|
function localSnapshot(options) {
|
|
213
327
|
return compact({
|
|
@@ -216,33 +330,232 @@ function localSnapshot(options) {
|
|
|
216
330
|
});
|
|
217
331
|
}
|
|
218
332
|
//#endregion
|
|
333
|
+
//#region src/react-native/powersync-rows.ts
|
|
334
|
+
function isColumns(roles) {
|
|
335
|
+
return Array.isArray(roles);
|
|
336
|
+
}
|
|
337
|
+
function quoted(name) {
|
|
338
|
+
return `"${name.replaceAll("\"", "\"\"")}"`;
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* The synced tables `rows` names, each read whole: the subject streams sync
|
|
342
|
+
* only the user's own rows.
|
|
343
|
+
*/
|
|
344
|
+
function rowTables(rows) {
|
|
345
|
+
const tables = /* @__PURE__ */ new Set();
|
|
346
|
+
const column = (item) => {
|
|
347
|
+
if ("through" in item) tables.add(item.through.table);
|
|
348
|
+
};
|
|
349
|
+
for (const source of rows.memberships) {
|
|
350
|
+
tables.add(source.table);
|
|
351
|
+
column(source.user);
|
|
352
|
+
if (isColumns(source.roles)) for (const item of source.roles) column(item);
|
|
353
|
+
}
|
|
354
|
+
if (rows.roles !== void 0) {
|
|
355
|
+
tables.add(rows.roles.table);
|
|
356
|
+
for (const item of rows.roles.roles) column(item);
|
|
357
|
+
}
|
|
358
|
+
if (rows.customRoles !== void 0) {
|
|
359
|
+
tables.add(rows.customRoles.permissions);
|
|
360
|
+
tables.add(rows.customRoles.includes);
|
|
361
|
+
}
|
|
362
|
+
return [...tables];
|
|
363
|
+
}
|
|
364
|
+
function rowQuery(table) {
|
|
365
|
+
return `SELECT * FROM ${quoted(table)}`;
|
|
366
|
+
}
|
|
367
|
+
function text(value) {
|
|
368
|
+
if (typeof value === "string") return value === "" ? void 0 : value;
|
|
369
|
+
return typeof value === "number" || typeof value === "bigint" ? String(value) : void 0;
|
|
370
|
+
}
|
|
371
|
+
function isSet(row, column) {
|
|
372
|
+
const value = column === void 0 ? void 0 : row[column];
|
|
373
|
+
return value !== void 0 && value !== null;
|
|
374
|
+
}
|
|
375
|
+
function rowsOf(tables, table) {
|
|
376
|
+
return (tables[table] ?? []).filter(isRecord);
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* The value a column holds, read through its referenced table or map;
|
|
380
|
+
* `undefined` for none.
|
|
381
|
+
*/
|
|
382
|
+
function columnValue(row, column, tables) {
|
|
383
|
+
const raw = text(row[column.column]);
|
|
384
|
+
if (raw === void 0) return;
|
|
385
|
+
if ("through" in column) {
|
|
386
|
+
const { through } = column;
|
|
387
|
+
const target = rowsOf(tables, through.table).find((item) => text(item[through.id]) === raw);
|
|
388
|
+
return target === void 0 ? void 0 : text(target[through.column]);
|
|
389
|
+
}
|
|
390
|
+
if ("map" in column) return Object.hasOwn(column.map, raw) ? column.map[raw] ?? void 0 : void 0;
|
|
391
|
+
return raw;
|
|
392
|
+
}
|
|
393
|
+
function membershipsOf(source, tables, user) {
|
|
394
|
+
const byInstance = /* @__PURE__ */ new Map();
|
|
395
|
+
for (const row of rowsOf(tables, source.table)) {
|
|
396
|
+
if (columnValue(row, source.user, tables) !== user || isSet(row, source.expiresAt) || isSet(row, source.disabledAt)) continue;
|
|
397
|
+
const scope = "value" in source.scope ? source.scope.value : text(row[source.scope.column]);
|
|
398
|
+
const id = text(row[source.id]);
|
|
399
|
+
const via = source.via === void 0 ? void 0 : "value" in source.via ? source.via.value : text(row[source.via.column]);
|
|
400
|
+
const roles = isColumns(source.roles) ? source.roles.flatMap((column) => {
|
|
401
|
+
const key = columnValue(row, column, tables);
|
|
402
|
+
return key === void 0 ? [] : [key];
|
|
403
|
+
}) : source.roles.value;
|
|
404
|
+
if (scope === void 0 || id === void 0 || roles.length === 0) continue;
|
|
405
|
+
const key = JSON.stringify([
|
|
406
|
+
scope,
|
|
407
|
+
id,
|
|
408
|
+
via ?? null
|
|
409
|
+
]);
|
|
410
|
+
const entry = byInstance.get(key) ?? {
|
|
411
|
+
scope,
|
|
412
|
+
id,
|
|
413
|
+
via,
|
|
414
|
+
roles: /* @__PURE__ */ new Set()
|
|
415
|
+
};
|
|
416
|
+
for (const role of roles) entry.roles.add(role);
|
|
417
|
+
byInstance.set(key, entry);
|
|
418
|
+
}
|
|
419
|
+
return [...byInstance.values()].map((entry) => compact({
|
|
420
|
+
scope: entry.scope,
|
|
421
|
+
id: entry.id,
|
|
422
|
+
roles: [...entry.roles].toSorted(),
|
|
423
|
+
via: entry.via
|
|
424
|
+
}));
|
|
425
|
+
}
|
|
426
|
+
function roleKeyOf(row) {
|
|
427
|
+
const name = text(row["role"]);
|
|
428
|
+
const scope = text(row["scope"]);
|
|
429
|
+
return name === void 0 || scope === void 0 ? void 0 : {
|
|
430
|
+
tenant: text(row["tenant_id"]),
|
|
431
|
+
scope,
|
|
432
|
+
id: text(row["scope_id"]),
|
|
433
|
+
name
|
|
434
|
+
};
|
|
435
|
+
}
|
|
436
|
+
function customRoleOf({ key, grants, includes }) {
|
|
437
|
+
const body = {
|
|
438
|
+
name: key.name,
|
|
439
|
+
grants,
|
|
440
|
+
includes
|
|
441
|
+
};
|
|
442
|
+
if (key.scope === "global") return {
|
|
443
|
+
...body,
|
|
444
|
+
scope: "global"
|
|
445
|
+
};
|
|
446
|
+
if (key.tenant === void 0) return {
|
|
447
|
+
...body,
|
|
448
|
+
shared: true,
|
|
449
|
+
scope: key.scope
|
|
450
|
+
};
|
|
451
|
+
return compact({
|
|
452
|
+
...body,
|
|
453
|
+
tenant: key.tenant,
|
|
454
|
+
scope: key.scope,
|
|
455
|
+
id: key.id
|
|
456
|
+
});
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* Custom roles from the custom-role rows: a tenant role, a shared role (no
|
|
460
|
+
* tenant) or a global role.
|
|
461
|
+
*/
|
|
462
|
+
function customRolesOf(permissions, includes) {
|
|
463
|
+
const roles = /* @__PURE__ */ new Map();
|
|
464
|
+
const entry = (key) => {
|
|
465
|
+
const id = JSON.stringify([
|
|
466
|
+
key.tenant ?? null,
|
|
467
|
+
key.scope,
|
|
468
|
+
key.id ?? null,
|
|
469
|
+
key.name
|
|
470
|
+
]);
|
|
471
|
+
const found = roles.get(id) ?? {
|
|
472
|
+
key,
|
|
473
|
+
grants: [],
|
|
474
|
+
includes: []
|
|
475
|
+
};
|
|
476
|
+
roles.set(id, found);
|
|
477
|
+
return found;
|
|
478
|
+
};
|
|
479
|
+
for (const row of permissions) {
|
|
480
|
+
const key = roleKeyOf(row);
|
|
481
|
+
const permission = text(row["permission"]);
|
|
482
|
+
const effect = row["effect"] === "deny" ? "deny" : "allow";
|
|
483
|
+
const level = text(row["level"]);
|
|
484
|
+
if (key !== void 0 && permission !== void 0) entry(key).grants.push(compact({
|
|
485
|
+
permission,
|
|
486
|
+
effect,
|
|
487
|
+
level
|
|
488
|
+
}));
|
|
489
|
+
}
|
|
490
|
+
for (const row of includes) {
|
|
491
|
+
const key = roleKeyOf(row);
|
|
492
|
+
const include = text(row["include_role"]);
|
|
493
|
+
if (key !== void 0 && include !== void 0) entry(key).includes.push(include);
|
|
494
|
+
}
|
|
495
|
+
return [...roles.values()].map(customRoleOf);
|
|
496
|
+
}
|
|
497
|
+
/**
|
|
498
|
+
* The user's memberships, global roles and custom roles from the rows of the
|
|
499
|
+
* tables `rows` names.
|
|
500
|
+
*/
|
|
501
|
+
function readRows(rows, tables, principal) {
|
|
502
|
+
const { id: user, tenant, attributes } = principal;
|
|
503
|
+
const memberships = rows.memberships.flatMap((source) => membershipsOf(source, tables, user));
|
|
504
|
+
const global = rows.roles;
|
|
505
|
+
const roles = global === void 0 ? [] : rowsOf(tables, global.table).flatMap((row) => text(row[global.user]) === user ? global.roles.flatMap((column) => {
|
|
506
|
+
const key = columnValue(row, column, tables);
|
|
507
|
+
return key === void 0 ? [] : [key];
|
|
508
|
+
}) : []);
|
|
509
|
+
const custom = rows.customRoles;
|
|
510
|
+
return {
|
|
511
|
+
principal: {
|
|
512
|
+
id: user,
|
|
513
|
+
roles: [...new Set(roles)].toSorted(),
|
|
514
|
+
memberships,
|
|
515
|
+
...tenant === void 0 ? {} : { tenant },
|
|
516
|
+
...attributes === void 0 ? {} : { attributes }
|
|
517
|
+
},
|
|
518
|
+
...custom === void 0 ? {} : { customRoles: customRolesOf(rowsOf(tables, custom.permissions), rowsOf(tables, custom.includes)) }
|
|
519
|
+
};
|
|
520
|
+
}
|
|
521
|
+
//#endregion
|
|
219
522
|
//#region src/react-native/powersync.ts
|
|
523
|
+
function planOf(options) {
|
|
524
|
+
if (!("user" in options)) return options;
|
|
525
|
+
const { rows } = options.manifest;
|
|
526
|
+
if (rows === void 0) throw new TypeError("PermDock: powerSyncSource needs queries and read, or a manifest with rows (run permdock powersync generate with powersync.manifest)");
|
|
527
|
+
const principal = compact({
|
|
528
|
+
id: options.user,
|
|
529
|
+
tenant: options.tenant,
|
|
530
|
+
attributes: options.attributes
|
|
531
|
+
});
|
|
532
|
+
return {
|
|
533
|
+
queries: Object.fromEntries(rowTables(rows).map((table) => [table, { sql: rowQuery(table) }])),
|
|
534
|
+
read: (tables) => readRows(rows, tables, principal)
|
|
535
|
+
};
|
|
536
|
+
}
|
|
220
537
|
/**
|
|
221
538
|
* A `localSnapshot` source over a PowerSync database: `get` runs every query
|
|
222
|
-
* with `db.getAll`, and a `db.watch` per query reports changes.
|
|
223
|
-
*
|
|
224
|
-
*
|
|
225
|
-
*
|
|
539
|
+
* with `db.getAll`, and a `db.watch` per query reports changes. Without
|
|
540
|
+
* `queries` and `read`, it reads the tables `manifest.rows` names: the
|
|
541
|
+
* memberships of every source with null roles dropped, the global roles and the
|
|
542
|
+
* custom roles with their levels. A watch result with unchanged content
|
|
543
|
+
* re-renders nothing (`connectSource`). The source takes the database as an
|
|
544
|
+
* argument; `permdock/react-native` never imports `@powersync/*`.
|
|
226
545
|
*/
|
|
227
546
|
function powerSyncSource(db, options) {
|
|
228
|
-
const
|
|
547
|
+
const plan = planOf(options);
|
|
229
548
|
return localSnapshot({
|
|
230
549
|
manifest: options.manifest,
|
|
231
550
|
read: async () => {
|
|
232
|
-
const results = await Promise.all(
|
|
233
|
-
const query = options.queries[name];
|
|
551
|
+
const results = await Promise.all(Object.entries(plan.queries).map(async ([name, query]) => {
|
|
234
552
|
return [name, await db.getAll(query.sql, [...query.parameters ?? []])];
|
|
235
553
|
}));
|
|
236
|
-
|
|
237
|
-
for (const [name, list] of results) rows[name] = list;
|
|
238
|
-
return options.read(rows);
|
|
554
|
+
return plan.read(Object.fromEntries(results));
|
|
239
555
|
},
|
|
240
556
|
subscribe: (listener) => {
|
|
241
557
|
const controller = new AbortController();
|
|
242
|
-
for (const
|
|
243
|
-
const query = options.queries[name];
|
|
244
|
-
db.watch(query.sql, [...query.parameters ?? []], { onResult: listener }, { signal: controller.signal });
|
|
245
|
-
}
|
|
558
|
+
for (const query of Object.values(plan.queries)) db.watch(query.sql, [...query.parameters ?? []], { onResult: listener }, { signal: controller.signal });
|
|
246
559
|
return () => {
|
|
247
560
|
controller.abort();
|
|
248
561
|
};
|
|
@@ -337,7 +650,10 @@ function guardStorage(storage) {
|
|
|
337
650
|
fail
|
|
338
651
|
};
|
|
339
652
|
}
|
|
340
|
-
/**
|
|
653
|
+
/**
|
|
654
|
+
* `undefined` when the storage answers asynchronously; any failure reads as
|
|
655
|
+
* empty.
|
|
656
|
+
*/
|
|
341
657
|
function readStoredSync(storage, subjectId, signed) {
|
|
342
658
|
if (subjectId === null) return NOTHING;
|
|
343
659
|
const raw = storage.read(SNAPSHOT_KEY);
|
|
@@ -374,8 +690,8 @@ function contentKey(snapshot) {
|
|
|
374
690
|
});
|
|
375
691
|
}
|
|
376
692
|
/**
|
|
377
|
-
* Whether a source read changes nothing: same content as the snapshot the
|
|
378
|
-
*
|
|
693
|
+
* Whether a source read changes nothing: same content as the snapshot the store
|
|
694
|
+
* holds, and the store already settled on it.
|
|
379
695
|
*/
|
|
380
696
|
function unchanged(store, next) {
|
|
381
697
|
if (typeof next === "string" || store.get().status() === "stale") return false;
|
|
@@ -387,9 +703,9 @@ function unchanged(store, next) {
|
|
|
387
703
|
}
|
|
388
704
|
/**
|
|
389
705
|
* Hydrates `store` from `source` now, on every change it reports and on each
|
|
390
|
-
* return to the foreground. Only the latest read applies; a read with
|
|
391
|
-
*
|
|
392
|
-
*
|
|
706
|
+
* return to the foreground. Only the latest read applies; a read with unchanged
|
|
707
|
+
* content re-renders nothing, and a failed read keeps the current snapshot.
|
|
708
|
+
* Returns the unsubscribe.
|
|
393
709
|
*/
|
|
394
710
|
function connectSource(store, source, subscribeForeground) {
|
|
395
711
|
let active = true;
|
|
@@ -397,8 +713,8 @@ function connectSource(store, source, subscribeForeground) {
|
|
|
397
713
|
const pull = () => {
|
|
398
714
|
seq += 1;
|
|
399
715
|
const mine = seq;
|
|
400
|
-
Promise.resolve().then(() => source.get()).then((
|
|
401
|
-
if (active && mine === seq && !unchanged(store,
|
|
716
|
+
Promise.resolve().then(() => source.get()).then((snapshot) => {
|
|
717
|
+
if (active && mine === seq && !unchanged(store, snapshot)) store.replace(snapshot);
|
|
402
718
|
}, () => void 0);
|
|
403
719
|
};
|
|
404
720
|
pull();
|
|
@@ -454,7 +770,8 @@ function nativeStore(options) {
|
|
|
454
770
|
passCache: true,
|
|
455
771
|
onSnapshot: options.onSnapshot,
|
|
456
772
|
onClear: options.onClear,
|
|
457
|
-
approvalInterval: options.approvalInterval
|
|
773
|
+
approvalInterval: options.approvalInterval,
|
|
774
|
+
refreshOn: options.refreshOn
|
|
458
775
|
}), snapshot, {
|
|
459
776
|
server: false,
|
|
460
777
|
stale: revalidates && (fromStorage !== void 0 || waiting),
|
|
@@ -508,6 +825,7 @@ function PermDockProvider(props) {
|
|
|
508
825
|
onSnapshot: live.onSnapshot,
|
|
509
826
|
onClear: live.onClear,
|
|
510
827
|
approvalInterval: props.approvalInterval,
|
|
828
|
+
refreshOn: props.refreshOn,
|
|
511
829
|
previous: shown.current ?? void 0
|
|
512
830
|
})), [
|
|
513
831
|
props.storage,
|
|
@@ -549,9 +867,9 @@ function PermDockProvider(props) {
|
|
|
549
867
|
const refresh = () => {
|
|
550
868
|
if (inFlight || !online) return;
|
|
551
869
|
inFlight = true;
|
|
552
|
-
store.get().refresh().
|
|
870
|
+
store.get().refresh().finally(() => {
|
|
553
871
|
inFlight = false;
|
|
554
|
-
});
|
|
872
|
+
}).catch(() => void 0);
|
|
555
873
|
};
|
|
556
874
|
const startTimer = () => {
|
|
557
875
|
if (typeof mode === "number" && timer === void 0) timer = setInterval(refresh, mode * 1e3);
|
|
@@ -605,7 +923,10 @@ function PermDockProvider(props) {
|
|
|
605
923
|
}
|
|
606
924
|
//#endregion
|
|
607
925
|
//#region src/react-native/storage-adapters.ts
|
|
608
|
-
/**
|
|
926
|
+
/**
|
|
927
|
+
* SecureStore warns above 2048 bytes and may refuse larger values on some
|
|
928
|
+
* devices.
|
|
929
|
+
*/
|
|
609
930
|
const SECURE_STORE_CHUNK_BYTES = 2048;
|
|
610
931
|
const INDEX_PREFIX = "permdock-chunks:";
|
|
611
932
|
function utf8Length(char) {
|
|
@@ -640,9 +961,9 @@ function chunkKey(key, index) {
|
|
|
640
961
|
return `${key}.${index}`;
|
|
641
962
|
}
|
|
642
963
|
/**
|
|
643
|
-
* A `SnapshotStorage` over `expo-secure-store`. Values are split into chunks
|
|
644
|
-
*
|
|
645
|
-
*
|
|
964
|
+
* A `SnapshotStorage` over `expo-secure-store`. Values are split into chunks of
|
|
965
|
+
* at most 2048 bytes under `<key>.<n>`; `<key>` holds the chunk count and is
|
|
966
|
+
* written last, so an interrupted write reads as absent.
|
|
646
967
|
*/
|
|
647
968
|
function secureStoreStorage(store, options) {
|
|
648
969
|
const removeChunks = async (key, from, to) => {
|
|
@@ -675,7 +996,10 @@ function secureStoreStorage(store, options) {
|
|
|
675
996
|
}
|
|
676
997
|
};
|
|
677
998
|
}
|
|
678
|
-
/**
|
|
999
|
+
/**
|
|
1000
|
+
* A synchronous `SnapshotStorage` over a `react-native-mmkv` instance: the
|
|
1001
|
+
* first frame already has the snapshot.
|
|
1002
|
+
*/
|
|
679
1003
|
function mmkvStorage(mmkv) {
|
|
680
1004
|
return {
|
|
681
1005
|
getItem: (key) => mmkv.getString(key) ?? null,
|
|
@@ -691,8 +1015,8 @@ function mmkvStorage(mmkv) {
|
|
|
691
1015
|
//#endregion
|
|
692
1016
|
//#region src/react-native/subscriptions.ts
|
|
693
1017
|
/**
|
|
694
|
-
* `subscribeForeground` over `AppState`: `active` returns to the foreground
|
|
695
|
-
*
|
|
1018
|
+
* `subscribeForeground` over `AppState`: `active` returns to the foreground and
|
|
1019
|
+
* `background` leaves it. iOS `inactive` (a system sheet over the app) is
|
|
696
1020
|
* neither.
|
|
697
1021
|
*/
|
|
698
1022
|
function appStateForeground(appState) {
|
|
@@ -706,11 +1030,14 @@ function appStateForeground(appState) {
|
|
|
706
1030
|
};
|
|
707
1031
|
};
|
|
708
1032
|
}
|
|
709
|
-
/**
|
|
1033
|
+
/**
|
|
1034
|
+
* `subscribeOnline` over NetInfo. An unknown (`null`) connection counts as
|
|
1035
|
+
* online.
|
|
1036
|
+
*/
|
|
710
1037
|
function netInfoOnline(netInfo) {
|
|
711
1038
|
return (listener) => netInfo.addEventListener((state) => {
|
|
712
1039
|
listener(state.isConnected !== false && state.isInternetReachable !== false);
|
|
713
1040
|
});
|
|
714
1041
|
}
|
|
715
1042
|
//#endregion
|
|
716
|
-
export { PermDockProvider, Protected, appStateForeground, approvalHeaders, buildLocalSnapshot, connectSource, describe, localSnapshot, memorySnapshotStorage, mmkvStorage, nativeStore, netInfoOnline, parseLocalSnapshotManifest, powerSyncSource, requiredPlans, secureStoreStorage, useApproval, useAssignablePermissions, useAssignableRoles, useDescribe, useFilter, useGate, useMemberships, usePermDock, usePermission, usePermissionGuard, usePermissions, useRoles, useSnapshotReady, useSubject, useTenant };
|
|
1043
|
+
export { PermDockProvider, Protected, appStateForeground, approvalHeaders, buildLocalSnapshot, connectSource, describe, eventSourceRefresh, localSnapshot, memorySnapshotStorage, mmkvStorage, nativeStore, netInfoOnline, parseLocalSnapshotManifest, powerSyncSource, requiredPlans, secureStoreStorage, useApproval, useAssignablePermissions, useAssignableRoles, useDescribe, useFilter, useGate, useMemberships, usePermDock, usePermission, usePermissionGuard, usePermissions, useProtectedAction, useRoles, useSnapshotReady, useSubject, useTenant };
|