permdock 0.16.0 → 0.18.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/dist/a2a/index.d.ts +4 -4
- package/dist/a2a/index.js +3 -3
- package/dist/{adapter-context-CIQpQxbE.js → adapter-context-OHikyRqV.js} +1 -1
- package/dist/{adoption-scan-C2BCiUEG.js → adoption-scan-CxExBYSJ.js} +1 -1
- package/dist/agent/index.d.ts +2 -2
- package/dist/agent/index.js +1 -1
- package/dist/ai-sdk/index.d.ts +3 -3
- package/dist/ai-sdk/index.js +3 -3
- package/dist/approval-normalize-CUjgSsOl.js +189 -0
- package/dist/approval-policies-oNnckT12.d.ts +138 -0
- package/dist/{approval-prompt-3BqWczTt.d.ts → approval-prompt-Bg7gDSqd.d.ts} +1 -1
- package/dist/approvals/index.d.ts +5 -4
- package/dist/approvals/index.js +7 -6
- package/dist/{approvals-DnIBTuXE.js → approvals-DGId_hgJ.js} +3 -3
- package/dist/{approvers-B4r0N_Uz.js → approvers-BaNwKYgd.js} +20 -1
- package/dist/{arazzo-ClYz2Z0W.js → arazzo--riLuGY0.js} +4 -4
- package/dist/{arazzo-CHoYnQXO.js → arazzo-CEDbb-uM.js} +2 -2
- package/dist/{args-0FrVs5EH.js → args-iafbHiXn.js} +2 -5
- package/dist/astro/index.d.ts +4 -4
- package/dist/astro/index.js +2 -2
- package/dist/{audience-DTjR8xet.js → audience-B4YR9UpV.js} +1 -1
- package/dist/{auth--yPyZNgr.js → auth-j3Eu-j4h.js} +1 -1
- package/dist/authz-topic-Dbc-HDOS.js +15 -0
- package/dist/authzen/index.d.ts +5 -5
- package/dist/authzen/index.js +2 -2
- package/dist/{automation-C6Jg75xq.d.ts → automation-Bfa_wD1h.d.ts} +1 -1
- package/dist/better-auth/index.d.ts +1 -1
- package/dist/better-auth/index.js +10 -8
- package/dist/better-supabase/index.d.ts +335 -38
- package/dist/better-supabase/index.js +778 -117
- package/dist/{better-supabase-Dirf_8Ec.js → better-supabase-BJtQ-kNf.js} +26 -10
- package/dist/{bind-BNQA9JK9.js → bind-B4pMH9bm.js} +6 -6
- package/dist/{bind-YYjvfpB9.d.ts → bind-DR6ku3A9.d.ts} +7 -7
- package/dist/{budget-BELja5A9.js → budget-BBCPDOGP.js} +1 -1
- package/dist/{budget-hYsPz_yE.d.ts → budget-CNLsV2SL.d.ts} +1 -1
- package/dist/{build-instance-BWXqwQYU.js → build-instance-BFMFQdE_.js} +3 -2
- package/dist/{capability-Di9tiUvi.d.ts → capability-BZ_veK9o.d.ts} +1 -1
- package/dist/{capability-BqX94r07.js → capability-zN6T9fxe.js} +2 -3
- package/dist/{casbin-D_rVQ31U.js → casbin-DCQHkkyj.js} +2 -2
- package/dist/{casbin-C9EvElBb.js → casbin-bKC1FpEx.js} +2 -2
- package/dist/{casl-C4OINZHI.js → casl-CjBVJj8R.js} +2 -2
- package/dist/{casl-CHHoCldP.js → casl-CkBssiB1.js} +1 -1
- package/dist/catalog/index.d.ts +5 -5
- package/dist/catalog/index.js +7 -7
- package/dist/catalog-Caqhbdix.js +1 -0
- package/dist/{catalog-CGlSwU6j.js → catalog-D1fw8qif.js} +5 -5
- package/dist/{catalog-doc-DjMKzJp9.js → catalog-doc-C4DGfJCO.js} +3 -3
- package/dist/{catalog-operations-DeHTrJSV.js → catalog-operations-BD22drQf.js} +4 -4
- package/dist/{catalog-amPDr0JQ.js → catalog-zzNuR3sY.js} +3 -3
- package/dist/{challenge-DImNcR7B.js → challenge-B2O2OLEk.js} +2 -2
- package/dist/chat/index.d.ts +1 -1
- package/dist/chat/index.js +2 -2
- package/dist/chat-sdk/index.d.ts +3 -3
- package/dist/{checks-CGkP3Z7A.js → checks-fyDOhcz0.js} +33 -1
- package/dist/claude-agent/index.d.ts +3 -3
- package/dist/claude-agent/index.js +2 -2
- package/dist/clerk/index.d.ts +2 -2
- package/dist/clerk/index.js +10 -7
- package/dist/cli/bin.js +1 -1
- package/dist/cli/index.d.ts +5 -5
- package/dist/cli/index.js +3 -3
- package/dist/client-CH7vzSAY.d.ts +32 -0
- package/dist/cloud/index.d.ts +8 -8
- package/dist/cloud/index.js +1 -1
- package/dist/{cloud-DdaJ7ILM.js → cloud-C0vXBmLG.js} +4 -4
- package/dist/{codemod-B1USJS7a.js → codemod-C-L0w-u7.js} +3 -3
- package/dist/{codemod-ammy6wv4.js → codemod-eYI1FbeJ.js} +395 -8
- package/dist/{collect-DnXL4B8c.js → collect-CU85z6Ta.js} +4 -4
- package/dist/{collect-WCl8cJQV.js → collect-D878zLDP.js} +4 -4
- package/dist/collect-KCtOigxx.js +1 -0
- package/dist/compile/index.d.ts +1 -1
- package/dist/compile/index.js +1 -1
- package/dist/{compile-EzEMB-7v.js → compile-B_oJqmIg.js} +4 -4
- package/dist/{compile-BEklRUYo.d.ts → compile-DBm0ub4p.d.ts} +2 -2
- package/dist/{completion--Y4YItFZ.js → completion-Dauc6pVT.js} +3 -3
- package/dist/{config-CcLlvEYW.js → config-COHmivz9.js} +4 -4
- package/dist/{config-BQ77xMZk.js → config-DWp2PucY.js} +2 -2
- package/dist/{config-report-DVMOLJ7F.js → config-report-DKpFm5ID.js} +2 -2
- package/dist/{context-BnIzxTNE.js → context-DeammvFl.js} +2 -2
- package/dist/convex/index.d.ts +4 -4
- package/dist/convex/index.js +3 -3
- package/dist/{core-lxoANyai.js → core-B8sLve3z.js} +7 -7
- package/dist/{core-CFepFiDP.d.ts → core-D87h2kpR.d.ts} +2 -2
- package/dist/{create-BLPKnJKa.js → create-3A7J9KRR.js} +6 -5
- package/dist/{create-CDd9c22W.d.ts → create-BrQXL-Wt.d.ts} +6 -6
- package/dist/{create-BPUopdfL.d.ts → create-BzwjZuRS.d.ts} +7 -7
- package/dist/{create-Coq5fIrq.js → create-C-tm3KIF.js} +5 -5
- package/dist/{create-DBvUsgzK.d.ts → create-CtoT1lIQ.d.ts} +4 -4
- package/dist/{credential-CyyyvCsL.js → credential-B3Hj4puZ.js} +4 -3
- package/dist/{credentials-CdDxp7jN.js → credentials-dkycUsY3.js} +1 -1
- package/dist/decision-CaG5_eNJ.js +21 -0
- package/dist/{delegation-CDB6_keF.js → delegation-aK4T_5WU.js} +3 -3
- package/dist/delivery/index.d.ts +4 -4
- package/dist/delivery/index.js +1 -1
- package/dist/{denied-text-DHldhVUv.d.ts → denied-text-DlIxt8fh.d.ts} +1 -1
- package/dist/{describe-BbFPBSms.d.ts → describe-BKtC_8PG.d.ts} +1 -1
- package/dist/{describe-Bb4hGK5d.js → describe-BZAlPHxT.js} +2 -1
- package/dist/{diff-DfmYaIhB.js → diff-BnNHqtHj.js} +8 -8
- package/dist/{diff-CxtbOi2l.js → diff-CBCzOTWM.js} +2 -2
- package/dist/{doctor-D1Xnmy6u.js → doctor-CkYKCuX7.js} +233 -30
- package/dist/{doctor-CwYc2lJb.js → doctor-xUpR5rXg.js} +3 -3
- package/dist/drizzle/index.d.ts +3 -3
- package/dist/drizzle/index.js +1 -1
- package/dist/elysia/index.d.ts +4 -4
- package/dist/elysia/index.js +3 -3
- package/dist/{errors-Vpu6rKHl.js → errors-BhRkoNS7.js} +0 -2
- package/dist/{errors-BIM4MFsJ.d.ts → errors-TpzkEKgJ.d.ts} +1 -1
- package/dist/{evaluate-BAmf_AQd.js → evaluate-Czbj7thS.js} +18 -15
- package/dist/{evaluations-DOWuBpWv.d.ts → evaluations-CisTTURl.d.ts} +3 -3
- package/dist/{evaluations-IBceAeKT.js → evaluations-h3KoJAPa.js} +3 -22
- package/dist/eve/index.d.ts +4 -4
- package/dist/eve/index.js +3 -3
- package/dist/express/index.d.ts +4 -4
- package/dist/express/index.js +3 -3
- package/dist/fastify/index.d.ts +4 -4
- package/dist/fastify/index.js +3 -3
- package/dist/{fetch-adapter-BIbBAtPZ.d.ts → fetch-adapter-BdmfnbJM.d.ts} +2 -2
- package/dist/{fetch-adapter-dPTgJVHd.js → fetch-adapter-DH-NJPbL.js} +2 -2
- package/dist/{fields-DI8s3cPl.js → fields-CrjL6A49.js} +3 -3
- package/dist/{files-B3AA05f1.js → files-CfiRtQ-m.js} +1 -1
- package/dist/{fixtures-Bm4_K1ke.js → fixtures-Cemqurt8.js} +10 -4
- package/dist/{flags-DXjoTVbS.js → flags-BlmpmXoY.js} +2 -2
- package/dist/{from-snapshot-DCakWRsr.js → from-snapshot-DMlSSo9b.js} +14 -12
- package/dist/{gen-DwgCSC6V.js → gen-BEIN-DRM.js} +2 -2
- package/dist/{gen-DuAhghDw.js → gen-mf-MRwVr.js} +9 -9
- package/dist/{generate-CRVV5V7l.js → generate-BqkZq8Dr.js} +2 -2
- package/dist/{grantee-conditions-BrYPe-w0.js → grantee-conditions-DX4K_gGI.js} +1 -1
- package/dist/{grantee-match-7RZZvoT_.js → grantee-match-BP-k4vRJ.js} +2 -2
- package/dist/h3/index.d.ts +4 -4
- package/dist/h3/index.js +3 -3
- package/dist/{helpers-DJicaG6f.js → helpers-DmqGy63f.js} +85 -13
- package/dist/hono/index.d.ts +4 -4
- package/dist/hono/index.js +3 -3
- package/dist/{hosted-DVxlLZMe.d.ts → hosted-BFNXwcjd.d.ts} +1 -1
- package/dist/{hosted-D0IzESu_.js → hosted-waouw2V-.js} +12 -10
- package/dist/{http-DOL33cO0.js → http-DhMWeB_h.js} +1 -1
- package/dist/{import-CNBF96hB.js → import-C1XXpG_m.js} +4 -4
- package/dist/{import-Dfe2unKO.js → import-DObwEota.js} +3 -3
- package/dist/{index-BinlXeU-.d.ts → index-BhnOOnp9.d.ts} +2 -2
- package/dist/{index-ymept53A.d.ts → index-CVGio3cH.d.ts} +4 -4
- package/dist/{index-DJwEgYzA.d.ts → index-CdMOd-GY.d.ts} +17 -11
- package/dist/{index-Cay5-Kvx.d.ts → index-CdUTE6qd.d.ts} +11 -10
- package/dist/{index-Dj2qF9VC.d.ts → index-Dfv9Toct.d.ts} +1 -1
- package/dist/{index-CV-7DWeD.d.ts → index-rFp6X_QP.d.ts} +4 -4
- package/dist/index.d.ts +18 -16
- package/dist/index.js +24 -20
- package/dist/{init-BUo2G-FI.js → init-CNJ8lLjo.js} +5 -5
- package/dist/{init-C6cWP3xW.js → init-DS3PEsCG.js} +5 -5
- package/dist/{instance-options-CoHn-0e8.d.ts → instance-options-2sFGSdsf.d.ts} +2 -2
- package/dist/{instance-snapshot-DuWf1cT3.js → instance-snapshot-BWa71my8.js} +15 -12
- package/dist/jwt/index.d.ts +4 -4
- package/dist/jwt/index.js +3 -3
- package/dist/{kernel-BD8QuMnv.js → kernel-30Z2zM_d.js} +10 -10
- package/dist/kysely/index.d.ts +3 -3
- package/dist/kysely/index.js +1 -1
- package/dist/{load-DjSU5KXO.js → load-BaEamml-.js} +1 -1
- package/dist/load-CjnlPxpL.js +1 -0
- package/dist/{login-D1MHOomI.js → login-BgK5Jloo.js} +4 -4
- package/dist/{login-DCKE5pVy.js → login-DUVzBLh7.js} +4 -4
- package/dist/{manifest-BXTbHNIV.js → manifest-BdzBobNK.js} +1 -1
- package/dist/{manifest-schema-DQkBK2Mr.js → manifest-schema-CsFsYLF-.js} +1 -1
- package/dist/{manifest-Cft51TLK.js → manifest-wclLWBVH.js} +37 -37
- package/dist/{map-claims-C-nv08_n.js → map-claims-PQwHynxV.js} +25 -11
- package/dist/{map-error-pasIGqMT.js → map-error-BH16Ah8P.js} +1 -1
- package/dist/mcp/index.d.ts +8 -8
- package/dist/mcp/index.js +9 -9
- package/dist/{migrate-BJHxQqT5.js → migrate-BbY5-Khy.js} +4 -4
- package/dist/{module-values-B1EVTkHP.js → module-values-B8tNIxdd.js} +2 -2
- package/dist/nest/index.d.ts +4 -4
- package/dist/nest/index.js +3 -3
- package/dist/next/index.d.ts +45 -13
- package/dist/next/index.js +68 -30
- package/dist/next/plugin.d.ts +1 -1
- package/dist/next/plugin.js +2 -2
- package/dist/node/index.d.ts +4 -4
- package/dist/node/index.js +2 -2
- package/dist/openai/index.d.ts +4 -4
- package/dist/openai/index.js +3 -3
- package/dist/openapi/index.d.ts +2 -2
- package/dist/{openapi-BwWkHxvW.js → openapi-C4gFqeRz.js} +4 -4
- package/dist/{openapi-DSzQN7Zu.js → openapi-zMEB9qxn.js} +5 -5
- package/dist/{operation-findings-CXtFzlKJ.js → operation-findings-CVwJHEu_.js} +1 -1
- package/dist/operation-risks-BKOcTv8J.js +13 -0
- package/dist/operations-Bm9HFecz.js +89 -0
- package/dist/orpc/index.d.ts +5 -5
- package/dist/orpc/index.js +3 -3
- package/dist/otel/index.d.ts +3 -3
- package/dist/otel/index.js +1 -1
- package/dist/{output-DlICTjBh.js → output-BFWLER4r.js} +1 -1
- package/dist/output-files-BYscrQl-.js +1 -0
- package/dist/{output-files-BIQ_9pIs.js → output-files-CM0BnH05.js} +1 -1
- package/dist/{ownership-qqBuGJXr.js → ownership-D-mIt-w0.js} +6 -6
- package/dist/{parse-1_ZheTW5.js → parse-UTC-sDrt.js} +2 -2
- package/dist/{parse-local-manifest-DEiCF4ah.js → parse-local-manifest-CxcSMQgl.js} +2 -2
- package/dist/{parse-local-manifest-CCmbhnxP.d.ts → parse-local-manifest-DvjTQNuO.d.ts} +1 -1
- package/dist/{parse-request-CwCZpyjV.js → parse-request-DOBVaeiQ.js} +1 -1
- package/dist/pdp/index.d.ts +3 -3
- package/dist/pdp/index.js +3 -3
- package/dist/{peer-Q0fuZ6hx.js → peer-BuK9F53f.js} +1 -1
- package/dist/{peer-C9LvBCcb.js → peer-n-swIV4H.js} +1 -1
- package/dist/{permdock-BvjivVb9.js → permdock-D-_WrdKu.js} +205 -102
- package/dist/{permdock-CprAPN3w.d.ts → permdock-ffY4CMd9.d.ts} +101 -131
- package/dist/{permissions-CYcHj_w7.js → permissions-B3ggI88M.js} +2 -2
- package/dist/{permissions-CVXmRILq.js → permissions-BaoLxy66.js} +1 -13
- package/dist/{pg-DQTqRrou.js → pg-Ddxsd5ZB.js} +2 -2
- package/dist/{policy-BycVKnXv.d.ts → policy-BtKSApSt.d.ts} +1 -1
- package/dist/{policy-CLQ8__GF.js → policy-cV_wwPb8.js} +5 -4
- package/dist/{policy-from-catalog-CU3An8uP.js → policy-from-catalog-B68hGC0S.js} +9 -8
- package/dist/{policy-types-DGIO_gxq.d.ts → policy-types-D-GwfQTc.d.ts} +72 -19
- package/dist/{postgrest-DAxFltvO.js → postgrest-BrjrckDG.js} +74 -19
- package/dist/{postgrest-D5nUGm-c.d.ts → postgrest-D84p5dbA.d.ts} +12 -7
- package/dist/{powersync-CBhTBhG2.js → powersync-9PYOE1wt.js} +158 -21
- package/dist/{powersync-DAfo0EL5.js → powersync-DStC_g0B.js} +3 -3
- package/dist/powersync-xNRlC4jN.js +1 -0
- package/dist/preset/index.js +1 -1
- package/dist/{preset-BjLzeFpp.js → preset-pPrVyGU5.js} +74 -7
- package/dist/prisma/index.d.ts +2 -2
- package/dist/prisma/index.js +1 -1
- package/dist/{protected-action-QEA8arRB.js → protected-action-B40tU3yP.js} +15 -5
- package/dist/{protected-action-D8x73IGm.d.ts → protected-action-Ds_EUY8B.d.ts} +14 -7
- package/dist/{protected-action-DUYqb-Ma.js → protected-action-OpOxtTsN.js} +1 -1
- package/dist/{provider-C55OGXJ7.js → provider-CY4TSSJo.js} +2 -2
- package/dist/{provider-DfLeek9O.d.ts → provider-OtnIiFWm.d.ts} +1 -1
- package/dist/{provider-store-CaTv00tr.js → provider-store-BQP_pp8s.js} +2 -2
- package/dist/{pull-CQCGy1gv.js → pull-DLP4I1Kl.js} +7 -7
- package/dist/pull-UBjDnf4b.js +1 -0
- package/dist/{push-Dq_ca4-j.js → push-BSb8j1EW.js} +8 -8
- package/dist/{pushed-policy-CDuOL2de.js → pushed-policy-BecMsTtM.js} +1 -1
- package/dist/{pushed-policy-CryQheKq.d.ts → pushed-policy-Ck3FZcoy.d.ts} +1 -1
- package/dist/react/index.d.ts +8 -8
- package/dist/react/index.js +6 -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 -39
- package/dist/react-native/index.js +199 -40
- package/dist/refresh-on-L9UOwATg.d.ts +49 -0
- package/dist/{replay-Bs9Df2fQ.d.ts → replay-E5X9E1lC.d.ts} +1 -1
- package/dist/{request-context-Duzdf0cd.js → request-context-DM6_jY1n.js} +2 -2
- package/dist/{request-schema-DhX7UbfQ.js → request-schema-CMP8Cmxd.js} +5 -0
- package/dist/resend/index.d.ts +4 -4
- package/dist/{resolve-names-Y1Cb22cp.js → resolve-names-CBl4r4_r.js} +6 -6
- package/dist/{rls-tHu7N_Pe.js → rls-DGBL-jDY.js} +20 -20
- package/dist/{rls-C5ZGzR_B.js → rls-pAHGYgTb.js} +4 -4
- package/dist/{role-builder-BK2-T6oD.js → role-builder-CMW4wWzn.js} +3 -157
- package/dist/{rpc-vHIwyXCp.js → rpc-KwX_Jcxz.js} +2 -2
- package/dist/{run-DUq1xU4K.js → run-B7lv3NuK.js} +8 -40
- package/dist/run-UPbacxPg.js +1 -0
- package/dist/{run-ticket-DfnZCh-u.js → run-ticket-CjvXr6wj.js} +1 -1
- package/dist/{run-ticket-ylovhyFQ.d.ts → run-ticket-DPaD27_r.d.ts} +2 -2
- package/dist/{runtime-BGnrOkVH.js → runtime-rf0ZuyF3.js} +1 -1
- package/dist/{saas-DK4V-3Is.js → saas-B8H1MsQ3.js} +13 -10
- package/dist/{scan-C3HRH9Fs.js → scan-0r3OZqqK.js} +1 -1
- package/dist/{schema-DvXvxPhQ.js → schema-B_9tXrbG.js} +1 -1
- package/dist/{schema-BOJjqlWL.js → schema-CuX70xgH.js} +15 -2
- package/dist/scim/index.d.ts +1 -1
- package/dist/scim/index.js +1 -1
- package/dist/{scim-jJBJ7g1Z.js → scim-C30QBBoF.js} +2 -1
- package/dist/{scim-D8YupzX1.js → scim-CovliQUg.js} +2 -2
- package/dist/{scopes-0Up_UA2t.js → scopes-BSdYaGHs.js} +9 -40
- package/dist/server/index.d.ts +11 -11
- package/dist/server/index.js +8 -8
- package/dist/{server-3cVlTLde.js → server-D0PW6ZCw.js} +2 -2
- package/dist/{server-types-CyRN0-Cd.d.ts → server-types-3OnXjZ2D.d.ts} +8 -8
- package/dist/{shared-l0oGGetg.js → shared-BRmCJxDK.js} +2 -2
- package/dist/{shared-DrGLwM3s.js → shared-DyYVEjKC.js} +2 -2
- package/dist/{sink-B5zoUW_O.d.ts → sink-ogbVkyeo.d.ts} +2 -2
- package/dist/{skills-Celu2W6v.js → skills-B4MPRxQd.js} +2 -2
- package/dist/{skills-B2qTbaQa.js → skills-C9sTD70r.js} +2 -2
- package/dist/{snapshot-CXlzi69u.js → snapshot-DN_8J27z.js} +6 -2
- package/dist/{snapshot-cache-BjAWkchD.d.ts → snapshot-cache-B4YvlGG_.d.ts} +20 -6
- package/dist/{snapshot-cache-Bx_4xC_6.js → snapshot-cache-B66h7FBK.js} +25 -8
- package/dist/solid/index.d.ts +7 -7
- package/dist/solid/index.js +6 -6
- package/dist/solid-start/index.d.ts +4 -4
- package/dist/solid-start/index.js +3 -3
- package/dist/{sources-oB1Hg1Fm.d.ts → sources-xdQShLDU.d.ts} +1 -1
- package/dist/{src-C_pi2Rnh.js → src-Brzq_0in.js} +193 -128
- package/dist/ssf/index.d.ts +3 -3
- package/dist/ssf/index.js +1 -1
- package/dist/{standard-webhooks-DOYEuOLx.d.ts → standard-webhooks-BfPaZ6T1.d.ts} +2 -2
- package/dist/{types-tQB2CEnY.d.ts → store-DYeB-_U3.d.ts} +114 -113
- package/dist/{store-RNFvaJJv.js → store-DmVqy74I.js} +13 -7
- package/dist/{store-options-Dil3lraY.js → store-options--zWn48PK.js} +76 -7
- package/dist/{stores-DxZWDXCs.js → stores-BYFopOm1.js} +3 -3
- package/dist/{stores-DZJvxFIZ.d.ts → stores-EPul_8MN.d.ts} +5 -6
- package/dist/{stream-9y9qw51m.d.ts → stream-W2RuUYly.d.ts} +1 -1
- package/dist/{subject-BGoM5o8B.js → subject-C7RddW0G.js} +8 -1
- package/dist/supabase/client.d.ts +2 -0
- package/dist/supabase/client.js +21 -0
- package/dist/supabase/index.d.ts +37 -6
- package/dist/supabase/index.js +6 -5
- package/dist/supabase/middleware.d.ts +8 -7
- package/dist/supabase/middleware.js +6 -6
- package/dist/{supabase-CDHMsDD0.js → supabase-BiViJpQ4.js} +31 -8
- package/dist/{supabase-DYWnT800.js → supabase-CogTyJH2.js} +3 -3
- package/dist/supabase-hook-BN46IrVI.js +1 -0
- package/dist/{supabase-hook-HPgwYb9V.js → supabase-hook-DX38Hj8h.js} +393 -32
- package/dist/{supautils-SwE642N1.js → supautils-BGf6zRvM.js} +12 -12
- package/dist/svelte/index.d.ts +7 -7
- package/dist/svelte/index.js +8 -8
- package/dist/svelte/runtime.d.ts +3 -3
- package/dist/svelte/runtime.js +3 -3
- package/dist/svelte/source.d.ts +7 -7
- package/dist/svelte/source.js +5 -5
- package/dist/sveltekit/index.d.ts +4 -4
- package/dist/sveltekit/index.js +2 -2
- package/dist/{tables-DimBcVWY.js → tables-BfOk0ymL.js} +7 -7
- package/dist/tanstack-start/index.d.ts +4 -4
- package/dist/tanstack-start/index.js +2 -2
- package/dist/{tenancy-5d1zVBvK.js → tenancy-DvOHHk3-.js} +1 -1
- package/dist/terminal/index.d.ts +5 -5
- package/dist/terminal/index.js +6 -6
- package/dist/testing/core.d.ts +1 -1
- package/dist/testing/core.js +1 -1
- package/dist/testing/fixtures/index.d.ts +1 -1
- package/dist/testing/fixtures/index.js +2 -2
- package/dist/testing/index.d.ts +29 -22
- package/dist/testing/index.js +120 -48
- package/dist/testing/saas/index.d.ts +3 -3
- package/dist/testing/saas/index.js +2 -2
- package/dist/testing/saas/permissions.js +1 -1
- package/dist/token-D6pWn8Uj.d.ts +11 -0
- package/dist/{token-DC9EQiet.js → token-DaMnIU9O.js} +24 -8
- package/dist/{tool-refusal-Qpjs_W6M.js → tool-refusal-D4spOJ7I.js} +1 -1
- package/dist/trpc/index.d.ts +5 -5
- package/dist/trpc/index.js +3 -3
- package/dist/{type-helpers-c7Xo_2Cu.d.ts → type-helpers-i1EJ3Eb1.d.ts} +1 -1
- package/dist/{types-Cklw5hJo.d.ts → types-3Y8UpFkF.d.ts} +40 -1
- package/dist/{types-DlelvQk4.d.ts → types-B8qUkGja.d.ts} +2 -2
- package/dist/{types-CN0LsqbK.d.ts → types-CCEeSCMB.d.ts} +3 -3
- package/dist/{types-B2efzoSX.d.ts → types-CDVXR6YD.d.ts} +1 -1
- package/dist/{types-DsHGPtkR.d.ts → types-Ck1KOfug.d.ts} +2 -2
- package/dist/{types-DLvhVm1r.d.ts → types-CqcsNCaN.d.ts} +16 -7
- package/dist/{types-BB-zWDcR.d.ts → types-D-JO7lh8.d.ts} +5 -5
- package/dist/{types-CEinc15V.d.ts → types-D19MK4t-.d.ts} +3 -4
- package/dist/{types-B6ExllNo.d.ts → types-DGf_cpKF.d.ts} +2 -2
- package/dist/{types-rCRV4Ge-.d.ts → types-DmbfLu2p.d.ts} +4 -4
- package/dist/{types-ZzRGoViD.d.ts → types-NYoj8JBm.d.ts} +2 -2
- package/dist/{types-CWBsAwqn.d.ts → types-o1vu6Ks3.d.ts} +4 -4
- package/dist/unplugin/index.d.ts +1 -1
- package/dist/unplugin/index.js +2 -2
- package/dist/usage-Cl5eb-e1.js +1 -0
- package/dist/{usage-CPXeuAdT.js → usage-DC0UKe6C.js} +6 -6
- package/dist/{usage-CfZCQd0F.js → usage-DYtRVkcN.js} +2 -2
- package/dist/{validation-error-uvp-kyfO.d.ts → validation-error-Dx8PipbO.d.ts} +1 -1
- package/dist/{verify-DfT0QYNh.js → verify-Bpj0hauG.js} +19 -19
- package/dist/{version-cache-Df11C2Qp.d.ts → version-cache-DzNKWiI6.d.ts} +9 -3
- package/dist/{views-CD8wuL4Z.js → views-MWmJ6Y4P.js} +1 -1
- package/dist/vue/index.d.ts +7 -7
- package/dist/vue/index.js +6 -6
- package/dist/{waiter-CqUKX6CY.d.ts → waiter-NK_UuZbb.d.ts} +2 -2
- package/dist/{watch-DAkjm75Y.js → watch-CBHADqBH.js} +3 -3
- package/dist/watch-OYwAPCzx.js +1 -0
- package/dist/webmcp/index.d.ts +1 -1
- package/dist/webmcp/index.js +1 -1
- package/dist/{where-scope-DlCdCM_8.js → where-scope-BKrqUDVk.js} +5 -5
- package/dist/{who-can-BoDJm0Nc.js → who-can-KhVWMxtf.js} +4 -4
- package/dist/workflow/index.d.ts +3 -3
- package/dist/workflow/index.js +5 -4
- package/dist/workflow-sdk/index.d.ts +4 -4
- package/dist/{wrap-DxXB54Wu.d.ts → wrap-BHGA-SMM.d.ts} +2 -2
- package/dist/{wrap-B2wziJI_.js → wrap-C5PWzgkq.js} +1 -1
- package/package.json +8 -5
- package/schemas/approval-request-v1.json +5 -0
- package/schemas/catalog-v1.json +18 -2
- package/schemas/cli-result-v1.json +0 -2
- package/schemas/snapshot-v1.json +9 -0
- package/schemas/supabase-manifest-v1.json +1 -1
- package/skills/permdock-approvals/SKILL.md +8 -8
- package/skills/permdock-approvals/references/stores-and-resume.md +7 -3
- package/skills/permdock-audit/SKILL.md +1 -1
- package/skills/permdock-wire/references/adapters.md +3 -1
- package/dist/action-result-BcudBQOF.d.ts +0 -19
- package/dist/catalog-D3oS2GH3.js +0 -1
- package/dist/collect-D-eroIfV.js +0 -1
- package/dist/load-Dm0pSYH3.js +0 -1
- package/dist/output-files-BHOIlrfD.js +0 -1
- package/dist/powersync-0QVP_DuR.js +0 -1
- package/dist/pull-CCAChKuy.js +0 -1
- package/dist/renames-CGj7YwcQ.js +0 -175
- package/dist/run-C5P3x1EI.js +0 -1
- package/dist/supabase-hook-qsewAVZY.js +0 -1
- package/dist/usage-DmmO_xjJ.js +0 -1
- package/dist/watch-CuPz0D2M.js +0 -1
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { r as isRecord, t as compact } from "./compact-CAf557ZB.js";
|
|
2
2
|
import { n as freezeDeep } from "./freeze-jjan0lCv.js";
|
|
3
3
|
import { r as validateRecord } from "./thenable-BNSM1U2R.js";
|
|
4
|
-
import {
|
|
4
|
+
import { f as nowMillis } from "./time-nR1JesoH.js";
|
|
5
|
+
import { t as anonymousSubject } from "./subject-C7RddW0G.js";
|
|
5
6
|
import { t as readClaim } from "./claims-map-CKkoAAYF.js";
|
|
6
7
|
import { t as clientNameOf } from "./clients-DYr3U86j.js";
|
|
7
|
-
import "./budget-
|
|
8
|
+
import "./budget-BBCPDOGP.js";
|
|
8
9
|
import { a as hookApiNames } from "./sources-C4vkzZJV.js";
|
|
9
10
|
//#region src/supabase/subject.ts
|
|
10
11
|
const REGISTERED = /* @__PURE__ */ new Set([
|
|
@@ -79,14 +80,12 @@ function asMembership(item) {
|
|
|
79
80
|
const scope = typeof item["scope"] === "string" ? item["scope"] : void 0;
|
|
80
81
|
const id = typeof item["id"] === "string" ? item["id"] : void 0;
|
|
81
82
|
const within = isRecord(item["within"]) ? Object.fromEntries(Object.entries(item["within"]).filter((entry) => typeof entry[1] === "string")) : void 0;
|
|
82
|
-
const tenant = typeof item["tenant"] === "string" ? item["tenant"] : void 0;
|
|
83
|
-
const team = typeof item["team"] === "string" ? item["team"] : void 0;
|
|
84
83
|
const onRecord = isRecord(item["on"]) ? item["on"] : void 0;
|
|
85
84
|
const on = onRecord !== void 0 && typeof onRecord["resource"] === "string" && typeof onRecord["id"] === "string" ? {
|
|
86
85
|
resource: onRecord["resource"],
|
|
87
86
|
id: onRecord["id"]
|
|
88
87
|
} : void 0;
|
|
89
|
-
if ((scope === void 0 || id === void 0) &&
|
|
88
|
+
if ((scope === void 0 || id === void 0) && on === void 0) return;
|
|
90
89
|
const keep = item["keep"];
|
|
91
90
|
if (keep !== void 0 && (!Array.isArray(keep) || !keep.every((key) => typeof key === "string" && key !== ""))) return;
|
|
92
91
|
return compact({
|
|
@@ -94,8 +93,6 @@ function asMembership(item) {
|
|
|
94
93
|
scope,
|
|
95
94
|
id,
|
|
96
95
|
within,
|
|
97
|
-
tenant,
|
|
98
|
-
team,
|
|
99
96
|
on,
|
|
100
97
|
via: typeof item["via"] === "string" ? item["via"] : void 0,
|
|
101
98
|
expiresAt: typeof item["expires_at"] === "number" ? item["expires_at"] : void 0,
|
|
@@ -487,8 +484,41 @@ function readSubjectRecord(value) {
|
|
|
487
484
|
claims: isRecord(value["claims"]) && Object.keys(value["claims"]).length > 0 ? value["claims"] : void 0
|
|
488
485
|
});
|
|
489
486
|
}
|
|
490
|
-
|
|
491
|
-
|
|
487
|
+
/**
|
|
488
|
+
* Uncached version reads of one principal closer together than this count as
|
|
489
|
+
* one request reading the version more than once.
|
|
490
|
+
*/
|
|
491
|
+
const REPEAT_WINDOW_MS = 1e3;
|
|
492
|
+
const REPEAT_TRACKED = 1e3;
|
|
493
|
+
/** Read through `globalThis` so the entry loads on runtimes without `process`. */
|
|
494
|
+
function isDevelopment() {
|
|
495
|
+
const proc = Reflect.get(globalThis, "process");
|
|
496
|
+
if (typeof proc !== "object" || proc === null) return false;
|
|
497
|
+
const env = Reflect.get(proc, "env");
|
|
498
|
+
return typeof env === "object" && env !== null && Reflect.get(env, "NODE_ENV") === "development";
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* In development, warns once when one principal's version is read twice within
|
|
502
|
+
* `REPEAT_WINDOW_MS`: a request that builds its instance more than once instead
|
|
503
|
+
* of sharing it through `instanceCache` or `permdockFor`.
|
|
504
|
+
*/
|
|
505
|
+
function repeatedVersionReads() {
|
|
506
|
+
if (!isDevelopment()) return () => void 0;
|
|
507
|
+
const last = /* @__PURE__ */ new Map();
|
|
508
|
+
let warned = false;
|
|
509
|
+
return (userId) => {
|
|
510
|
+
if (warned) return;
|
|
511
|
+
const at = nowMillis();
|
|
512
|
+
const previous = last.get(userId);
|
|
513
|
+
if (previous !== void 0 && at - previous < REPEAT_WINDOW_MS) {
|
|
514
|
+
warned = true;
|
|
515
|
+
last.clear();
|
|
516
|
+
console.warn("PermDock: the authorization version of one user was read more than once within a second. Share one instance per request through instanceCache and permdockFor, or pass version: { known }.");
|
|
517
|
+
return;
|
|
518
|
+
}
|
|
519
|
+
if (last.size >= REPEAT_TRACKED) last.clear();
|
|
520
|
+
last.set(userId, at);
|
|
521
|
+
};
|
|
492
522
|
}
|
|
493
523
|
/**
|
|
494
524
|
* Membership, custom-role and subject sources over the `subject_for(p_user)`,
|
|
@@ -496,12 +526,12 @@ function once(memo, key, read) {
|
|
|
496
526
|
* `permdock supabase hook generate` writes, for a backend that reaches Postgres
|
|
497
527
|
* only through PostgREST. `memberships.version` reads only the version, so
|
|
498
528
|
* `claimsFirst` with `onStale: 'reread'` reads the full subject only for a
|
|
499
|
-
* stale token;
|
|
500
|
-
*
|
|
501
|
-
*
|
|
502
|
-
*
|
|
503
|
-
*
|
|
504
|
-
*
|
|
529
|
+
* stale token; a missing version function throws, and `permdock doctor` PD083
|
|
530
|
+
* reports it. With `policy`, a token that claims a custom role has its subject
|
|
531
|
+
* read in one `subject_for` call instead, and custom roles are read only for a
|
|
532
|
+
* subject that holds one. It keeps no answers: create it once at module scope,
|
|
533
|
+
* and `getPermDock` shares each read within one instance. Pass `claimsFirst(…,
|
|
534
|
+
* { versions })` to share version reads across instances.
|
|
505
535
|
*/
|
|
506
536
|
function postgrestSources(client, options = {}) {
|
|
507
537
|
const api = options.api;
|
|
@@ -512,7 +542,29 @@ function postgrestSources(client, options = {}) {
|
|
|
512
542
|
const versionFn = options.versionFn ?? names?.authzVersionFor ?? "authz_version_for";
|
|
513
543
|
const declared = options.policy === void 0 ? void 0 : options.policy.index.declaredRoles;
|
|
514
544
|
const onlyDeclared = (held) => declared !== void 0 && held?.every((name) => declared.has(name)) === true;
|
|
515
|
-
const
|
|
545
|
+
const hook = options.onSourceCall;
|
|
546
|
+
const noteVersionRead = repeatedVersionReads();
|
|
547
|
+
const once = (memo, method, key, read) => {
|
|
548
|
+
let ran = false;
|
|
549
|
+
const started = performance.now();
|
|
550
|
+
const run = () => {
|
|
551
|
+
ran = true;
|
|
552
|
+
return read();
|
|
553
|
+
};
|
|
554
|
+
const answer = memo === void 0 ? run() : memo(key, run);
|
|
555
|
+
if (hook === void 0) return answer;
|
|
556
|
+
return answer.finally(() => {
|
|
557
|
+
try {
|
|
558
|
+
hook({
|
|
559
|
+
source: "postgrest",
|
|
560
|
+
method,
|
|
561
|
+
durationMs: performance.now() - started,
|
|
562
|
+
cached: !ran
|
|
563
|
+
});
|
|
564
|
+
} catch {}
|
|
565
|
+
});
|
|
566
|
+
};
|
|
567
|
+
const members = async (query) => {
|
|
516
568
|
const result = await callRpc(client, schema, membersFn, {
|
|
517
569
|
p_scope: query.scope,
|
|
518
570
|
p_id: query.id
|
|
@@ -520,14 +572,17 @@ function postgrestSources(client, options = {}) {
|
|
|
520
572
|
if (result.error !== null) throw new Error(`PermDock: ${schema}.${membersFn} failed: ${result.error.message}`);
|
|
521
573
|
return readMemberEntries(result.data);
|
|
522
574
|
};
|
|
523
|
-
const
|
|
575
|
+
const list = (query) => once(void 0, `${schema}.${membersFn}`, "", () => members(query));
|
|
576
|
+
const record = (userId, memo) => once(memo, `${schema}.${fn}`, `${schema}.${fn}:${userId}`, async () => {
|
|
524
577
|
const result = await callRpc(client, schema, fn, { p_user: userId });
|
|
525
578
|
if (result.error !== null) throw new Error(`PermDock: ${schema}.${fn} failed: ${result.error.message}`);
|
|
526
579
|
return readSubjectRecord(result.data);
|
|
527
580
|
});
|
|
528
|
-
const version = (userId, memo) => once(memo, `${schema}.${versionFn}:${userId}`, async () => {
|
|
581
|
+
const version = (userId, memo) => once(memo, `${schema}.${versionFn}`, `${schema}.${versionFn}:${userId}`, async () => {
|
|
582
|
+
noteVersionRead(userId);
|
|
529
583
|
const result = await callRpc(client, schema, versionFn, { p_user: userId });
|
|
530
|
-
|
|
584
|
+
if (result.error !== null) throw new Error(`PermDock: ${schema}.${versionFn} failed: ${result.error.message}`);
|
|
585
|
+
return versionOf(result.data);
|
|
531
586
|
});
|
|
532
587
|
const live = async (userId, memo) => {
|
|
533
588
|
const found = await record(userId, memo);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { E as Policy, K as CustomRoleSource, _r as Principal, dr as CustomRole, gr as Membership, nt as MemberEntry, rt as MembershipSource, ut as SourceCall, yr as Subject } from "./policy-types-D-GwfQTc.js";
|
|
2
2
|
//#region src/supabase/postgrest.d.ts
|
|
3
3
|
/**
|
|
4
4
|
* What a supabase-js `rpc` call resolves to: `data` or an `error` with a
|
|
@@ -57,6 +57,11 @@ type PostgrestSourcesOptions = {
|
|
|
57
57
|
* token claims a custom role, which the custom roles need anyway.
|
|
58
58
|
*/
|
|
59
59
|
readonly policy?: Policy;
|
|
60
|
+
/**
|
|
61
|
+
* Called after every function read with its duration and whether the
|
|
62
|
+
* instance's memo answered it. A hook that throws is ignored.
|
|
63
|
+
*/
|
|
64
|
+
readonly onSourceCall?: (call: SourceCall) => void;
|
|
60
65
|
};
|
|
61
66
|
/** One user as `subject_for(p_user)` returns it. */
|
|
62
67
|
type SubjectRecord = {
|
|
@@ -119,12 +124,12 @@ declare function readSubjectRecord(value: unknown): SubjectRecord | undefined;
|
|
|
119
124
|
* `permdock supabase hook generate` writes, for a backend that reaches Postgres
|
|
120
125
|
* only through PostgREST. `memberships.version` reads only the version, so
|
|
121
126
|
* `claimsFirst` with `onStale: 'reread'` reads the full subject only for a
|
|
122
|
-
* stale token;
|
|
123
|
-
*
|
|
124
|
-
*
|
|
125
|
-
*
|
|
126
|
-
*
|
|
127
|
-
*
|
|
127
|
+
* stale token; a missing version function throws, and `permdock doctor` PD083
|
|
128
|
+
* reports it. With `policy`, a token that claims a custom role has its subject
|
|
129
|
+
* read in one `subject_for` call instead, and custom roles are read only for a
|
|
130
|
+
* subject that holds one. It keeps no answers: create it once at module scope,
|
|
131
|
+
* and `getPermDock` shares each read within one instance. Pass `claimsFirst(…,
|
|
132
|
+
* { versions })` to share version reads across instances.
|
|
128
133
|
*/
|
|
129
134
|
declare function postgrestSources(client: SupabaseRpcCaller, options?: PostgrestSourcesOptions): PostgrestSources;
|
|
130
135
|
//#endregion
|
|
@@ -1,26 +1,59 @@
|
|
|
1
1
|
import { r as isRecord, t as compact } from "./compact-CAf557ZB.js";
|
|
2
2
|
import { c as isConditionDate, l as isConditionRef, o as hasConditionOp } from "./refs-C8BKxc_e.js";
|
|
3
|
-
import {
|
|
3
|
+
import { A as memoryCustomRoleSource, g as localSnapshotManifest } from "./src-Brzq_0in.js";
|
|
4
4
|
import { n as findPermission } from "./permission-registry-B8tYxPIt.js";
|
|
5
|
-
import {
|
|
6
|
-
import { l as policyLevels } from "./policy-
|
|
5
|
+
import { d as scopeList, s as resolveScope } from "./scopes-BSdYaGHs.js";
|
|
6
|
+
import { l as policyLevels } from "./policy-cV_wwPb8.js";
|
|
7
7
|
import { t as requiresApproval } from "./approval-required-TzNB9oQA.js";
|
|
8
|
-
import { t as getPermDock } from "./permdock-
|
|
9
|
-
import { u as usageResult } from "./errors-
|
|
10
|
-
import { c as requirePolicy } from "./load-
|
|
8
|
+
import { t as getPermDock } from "./permdock-D-_WrdKu.js";
|
|
9
|
+
import { u as usageResult } from "./errors-BhRkoNS7.js";
|
|
10
|
+
import { c as requirePolicy } from "./load-BaEamml-.js";
|
|
11
11
|
import { s as quoteSqlLiteral, t as SQL_IDENT } from "./sql-0WjxIp9g.js";
|
|
12
|
-
import { a as scopeMembershipTable, i as scopeColumn } from "./compile-
|
|
13
|
-
import { d as keptKeys } from "./sources-C4vkzZJV.js";
|
|
14
|
-
import { t as applyFiles } from "./files-
|
|
15
|
-
import { i as fileDrift } from "./output-files-
|
|
16
|
-
import { n as fixtureSubject, r as loadFixtures, t as fixtureRow } from "./fixtures-
|
|
17
|
-
import { A as quoteQualified, O as quoteIdent, a as customRolesOn, t as CUSTOM_ROLES } from "./shared-
|
|
18
|
-
import { n as tableNameOf, r as tableNames } from "./tables-
|
|
19
|
-
import { d as andConditions, l as collectGrants, o as assignableRoles, p as contextRefs, t as ownershipRules, u as roleNames } from "./ownership-
|
|
12
|
+
import { a as scopeMembershipTable, i as scopeColumn } from "./compile-B_oJqmIg.js";
|
|
13
|
+
import { d as keptKeys, t as AUTHZ_VERSION_TABLE } from "./sources-C4vkzZJV.js";
|
|
14
|
+
import { t as applyFiles } from "./files-CfiRtQ-m.js";
|
|
15
|
+
import { i as fileDrift } from "./output-files-CM0BnH05.js";
|
|
16
|
+
import { n as fixtureSubject, r as loadFixtures, t as fixtureRow } from "./fixtures-Cemqurt8.js";
|
|
17
|
+
import { A as quoteQualified, O as quoteIdent, a as customRolesOn, t as CUSTOM_ROLES } from "./shared-DyYVEjKC.js";
|
|
18
|
+
import { n as tableNameOf, r as tableNames } from "./tables-BfOk0ymL.js";
|
|
19
|
+
import { d as andConditions, l as collectGrants, o as assignableRoles, p as contextRefs, t as ownershipRules, u as roleNames } from "./ownership-D-mIt-w0.js";
|
|
20
20
|
import { t as membershipSourcesOf } from "./sources-qoIJQrJv.js";
|
|
21
|
-
import { n as pgConnector } from "./pg-
|
|
22
|
-
import { m as tableFor, t as canFixture } from "./verify-
|
|
21
|
+
import { n as pgConnector } from "./pg-Ddxsd5ZB.js";
|
|
22
|
+
import { m as tableFor, t as canFixture } from "./verify-Bpj0hauG.js";
|
|
23
23
|
import { resolve } from "node:path";
|
|
24
|
+
//#region src/cli/powersync/claims.ts
|
|
25
|
+
/** The `/docs` section that explains why a claim stream needs a reconnect. */
|
|
26
|
+
const RECONNECT_DOCS = "/docs/adapters/react-native#role-and-tenant-changes";
|
|
27
|
+
/** A dialect that records every claim name a query reads. */
|
|
28
|
+
function claimRecorder(dialect) {
|
|
29
|
+
const names = /* @__PURE__ */ new Set();
|
|
30
|
+
return {
|
|
31
|
+
names,
|
|
32
|
+
dialect: {
|
|
33
|
+
...dialect,
|
|
34
|
+
claim: (name) => {
|
|
35
|
+
names.add(name);
|
|
36
|
+
return dialect.claim(name);
|
|
37
|
+
},
|
|
38
|
+
claims: (name) => {
|
|
39
|
+
names.add(name);
|
|
40
|
+
return dialect.claims(name);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/** The recorded claims the kept queries still read, sorted. */
|
|
46
|
+
function claimsIn(queries, names, dialect) {
|
|
47
|
+
return [...names].filter((name) => queries.some((query) => query.includes(dialect.claim(name)) || query.includes(dialect.claims(name)))).toSorted();
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* One line per stream that reads a token claim: PowerSync keeps the claims a
|
|
51
|
+
* connection started with, so a changed claim needs a reconnect.
|
|
52
|
+
*/
|
|
53
|
+
function claimWarnings(streams) {
|
|
54
|
+
return streams.filter((stream) => stream.claims.length > 0).map((stream) => `stream ${stream.name} reads token claims ${stream.claims.join(", ")}: PowerSync keeps the claims it connected with, so refresh the session and reconnect after a role or tenant change (${RECONNECT_DOCS})`);
|
|
55
|
+
}
|
|
56
|
+
//#endregion
|
|
24
57
|
//#region src/cli/powersync/names.ts
|
|
25
58
|
function ident(name) {
|
|
26
59
|
if (!SQL_IDENT.test(name)) throw new TypeError(`PermDock CLI: '${name}' is not a plain identifier, which Sync Streams need`);
|
|
@@ -217,6 +250,21 @@ function roleTableRows(stream, dialect, keep = false) {
|
|
|
217
250
|
});
|
|
218
251
|
}
|
|
219
252
|
//#endregion
|
|
253
|
+
//#region src/cli/powersync/version.ts
|
|
254
|
+
/** The user column of `permdock_authz_version`. */
|
|
255
|
+
const VERSION_USER = "user_id";
|
|
256
|
+
/** The version column of `permdock_authz_version`. */
|
|
257
|
+
const VERSION_COLUMN = "version";
|
|
258
|
+
/**
|
|
259
|
+
* `<schema>.permdock_authz_version` when `supabase.hook` keeps the version
|
|
260
|
+
* table, the one `supabase hook generate` writes; otherwise `undefined`.
|
|
261
|
+
*/
|
|
262
|
+
function authzVersionTable(config) {
|
|
263
|
+
const hook = config.supabase?.hook;
|
|
264
|
+
if (hook === void 0 || hook.version === false) return;
|
|
265
|
+
return `${hook.schema ?? config.rls?.schema ?? "permdock"}.${AUTHZ_VERSION_TABLE}`;
|
|
266
|
+
}
|
|
267
|
+
//#endregion
|
|
220
268
|
//#region src/cli/powersync/rows.ts
|
|
221
269
|
function throughColumn(through, device) {
|
|
222
270
|
const [pair] = Object.entries(through.on);
|
|
@@ -298,7 +346,13 @@ function localRows(policy, config, devices) {
|
|
|
298
346
|
const schema = rls?.schema ?? "permdock";
|
|
299
347
|
const database = rls?.authorize === "database";
|
|
300
348
|
const global = rls?.roles ?? (database ? { table: `${schema}.user_roles` } : void 0);
|
|
349
|
+
const versionTable = authzVersionTable(config);
|
|
301
350
|
return compact({
|
|
351
|
+
version: versionTable === void 0 ? void 0 : {
|
|
352
|
+
table: device(versionTable),
|
|
353
|
+
user: VERSION_USER,
|
|
354
|
+
version: VERSION_COLUMN
|
|
355
|
+
},
|
|
302
356
|
memberships,
|
|
303
357
|
roles: global === void 0 ? void 0 : {
|
|
304
358
|
table: device(global.table),
|
|
@@ -846,6 +900,11 @@ function subjectStreams(ctx) {
|
|
|
846
900
|
for (const ids of tenantIds) add(table, `SELECT * FROM ${from} WHERE ${tenant} IN (${ids})`);
|
|
847
901
|
}
|
|
848
902
|
}
|
|
903
|
+
const versionTable = authzVersionTable(ctx.config);
|
|
904
|
+
if (versionTable !== void 0) {
|
|
905
|
+
const table = bare(versionTable, dialect);
|
|
906
|
+
add(table, `SELECT * FROM ${fromTable(versionTable, dialect)} WHERE ${dialect.column(table, VERSION_USER)} = ${dialect.user}`, VERSION_USER);
|
|
907
|
+
}
|
|
849
908
|
const out = [];
|
|
850
909
|
const names = /* @__PURE__ */ new Set();
|
|
851
910
|
for (const [table, entry] of tables) {
|
|
@@ -916,13 +975,14 @@ function powersyncPlan(policy, config, dialect = POWERSYNC) {
|
|
|
916
975
|
}
|
|
917
976
|
function planWith(policy, config, dialect) {
|
|
918
977
|
const scopes = scopeList(policy.scopes);
|
|
978
|
+
const recorder = claimRecorder(dialect);
|
|
919
979
|
const grants = collectGrants(policy);
|
|
920
980
|
const ctx = {
|
|
921
981
|
policy,
|
|
922
982
|
config,
|
|
923
983
|
scopes,
|
|
924
984
|
kinds: ownershipRules(policy, scopes)?.kinds ?? {},
|
|
925
|
-
dialect,
|
|
985
|
+
dialect: recorder.dialect,
|
|
926
986
|
sources: guardedSources(policy, config),
|
|
927
987
|
grants,
|
|
928
988
|
depth: 0,
|
|
@@ -1006,7 +1066,8 @@ function planWith(policy, config, dialect) {
|
|
|
1006
1066
|
resource,
|
|
1007
1067
|
table,
|
|
1008
1068
|
id,
|
|
1009
|
-
queries: [...queries]
|
|
1069
|
+
queries: [...queries],
|
|
1070
|
+
claims: claimsIn([...queries], recorder.names, dialect)
|
|
1010
1071
|
});
|
|
1011
1072
|
}
|
|
1012
1073
|
const tables = tableStreams(config.powersync?.tables ?? {}, dialect, new Set(streams.map((stream) => stream.name)), (resource) => ({
|
|
@@ -1034,6 +1095,60 @@ function planWith(policy, config, dialect) {
|
|
|
1034
1095
|
};
|
|
1035
1096
|
}
|
|
1036
1097
|
//#endregion
|
|
1098
|
+
//#region src/cli/powersync/verify-claims.ts
|
|
1099
|
+
function text(row, key) {
|
|
1100
|
+
const value = isRecord(row) ? row[key] : void 0;
|
|
1101
|
+
return typeof value === "string" || typeof value === "number" || typeof value === "bigint" ? String(value) : void 0;
|
|
1102
|
+
}
|
|
1103
|
+
function changedClaims(fixture) {
|
|
1104
|
+
const before = fixture.subject.claims ?? {};
|
|
1105
|
+
const after = fixture.after.claims ?? before;
|
|
1106
|
+
return new Set([...Object.keys(before), ...Object.keys(after)].filter((name) => JSON.stringify(before[name]) !== JSON.stringify(after[name])));
|
|
1107
|
+
}
|
|
1108
|
+
/** The rows the stream syncs to the user with these claims, by id. */
|
|
1109
|
+
async function rowsFor(query, stream, user, claims) {
|
|
1110
|
+
const rows = /* @__PURE__ */ new Map();
|
|
1111
|
+
for (const sql of stream.queries) for (const row of await query(`select q.* from (${sql}) q where $1::text is not null and $2::jsonb is not null`, [user, JSON.stringify(claims)])) {
|
|
1112
|
+
const id = text(row, stream.id);
|
|
1113
|
+
if (id !== void 0) rows.set(id, row);
|
|
1114
|
+
}
|
|
1115
|
+
return rows;
|
|
1116
|
+
}
|
|
1117
|
+
/**
|
|
1118
|
+
* Check a claims change against every stream that reads a changed claim, or the
|
|
1119
|
+
* fixture's `stream`.
|
|
1120
|
+
*/
|
|
1121
|
+
async function verifyClaimsChange(input) {
|
|
1122
|
+
const { fixture, plan, mismatches } = input;
|
|
1123
|
+
const label = `claims change for ${fixture.subject.id}`;
|
|
1124
|
+
const changed = changedClaims(fixture);
|
|
1125
|
+
const streams = fixture.stream === void 0 ? plan.streams.filter((stream) => stream.claims.some((name) => changed.has(name))) : plan.streams.filter((stream) => stream.name === fixture.stream);
|
|
1126
|
+
if (streams.length === 0) {
|
|
1127
|
+
mismatches.push(fixture.stream === void 0 ? `${label}: no stream reads a changed claim` : `${label}: no stream named ${fixture.stream}`);
|
|
1128
|
+
return;
|
|
1129
|
+
}
|
|
1130
|
+
const action = input.config.powersync?.action ?? "read";
|
|
1131
|
+
const subject = {
|
|
1132
|
+
...fixture.subject,
|
|
1133
|
+
...fixture.after
|
|
1134
|
+
};
|
|
1135
|
+
for (const stream of streams) {
|
|
1136
|
+
const before = await rowsFor(input.query, stream, fixture.subject.id, fixture.subject.claims ?? {});
|
|
1137
|
+
const after = await rowsFor(input.query, stream, fixture.subject.id, subject.claims ?? {});
|
|
1138
|
+
if (before.size === after.size && [...before.keys()].every((id) => after.has(id))) mismatches.push(`${label}: stream ${stream.name} syncs the same rows before and after the change`);
|
|
1139
|
+
const permission = findPermission(input.policy.permissions, `${stream.resource}.${action}`);
|
|
1140
|
+
if (permission === void 0) continue;
|
|
1141
|
+
for (const [id, row] of after) {
|
|
1142
|
+
const tenant = input.root === void 0 ? void 0 : text(row, input.root);
|
|
1143
|
+
const permdock = await getPermDock(input.policy, fixtureSubject({
|
|
1144
|
+
...subject,
|
|
1145
|
+
...tenant === void 0 ? {} : { tenant }
|
|
1146
|
+
}), { customRoles: memoryCustomRoleSource(input.customRoles) });
|
|
1147
|
+
if (!canFixture(permdock, permission, row)) mismatches.push(`${label}: stream ${stream.name} syncs ${stream.table} row ${id} after the change, which the policy denies`);
|
|
1148
|
+
}
|
|
1149
|
+
}
|
|
1150
|
+
}
|
|
1151
|
+
//#endregion
|
|
1037
1152
|
//#region src/cli/powersync/verify-followed.ts
|
|
1038
1153
|
/** Check a non-resource row against its own-user rule or readable parents. */
|
|
1039
1154
|
async function verifyFollowedRow(input) {
|
|
@@ -1074,7 +1189,8 @@ async function verifyFollowedRow(input) {
|
|
|
1074
1189
|
const holds = await input.synced({
|
|
1075
1190
|
...stream,
|
|
1076
1191
|
resource: fixture.table,
|
|
1077
|
-
id: "id"
|
|
1192
|
+
id: "id",
|
|
1193
|
+
claims: []
|
|
1078
1194
|
}, fixture);
|
|
1079
1195
|
if (holds === void 0) mismatches.push(`${label}: fixture row needs id`);
|
|
1080
1196
|
else if (holds && !granted) mismatches.push(`${label}: stream ${stream.name} syncs a row the policy denies`);
|
|
@@ -1120,6 +1236,12 @@ function powersyncYaml(plan) {
|
|
|
1120
1236
|
const lines = [
|
|
1121
1237
|
"# Generated by permdock powersync generate from the policy. Do not edit.",
|
|
1122
1238
|
...plan.publication === void 0 ? [] : ["# Tables outside public must be in the powersync publication:", `# ${plan.publication}`],
|
|
1239
|
+
...plan.streams.some((stream) => stream.claims.length > 0) ? [
|
|
1240
|
+
"# Streams that read token claims keep the claims a connection started with:",
|
|
1241
|
+
"# refresh the session and reconnect PowerSync after a role or tenant change.",
|
|
1242
|
+
`# https://permdock.com${RECONNECT_DOCS}`,
|
|
1243
|
+
...plan.streams.filter((stream) => stream.claims.length > 0).map((stream) => `# ${stream.name} reads ${stream.claims.join(", ")}`)
|
|
1244
|
+
] : [],
|
|
1123
1245
|
"config:",
|
|
1124
1246
|
" edition: 3",
|
|
1125
1247
|
"",
|
|
@@ -1175,6 +1297,7 @@ function powersyncFiles(policy, config, out) {
|
|
|
1175
1297
|
return {
|
|
1176
1298
|
files,
|
|
1177
1299
|
warnings: plan.warnings,
|
|
1300
|
+
claims: claimWarnings(plan.streams),
|
|
1178
1301
|
...plan.publication === void 0 ? {} : { publication: plan.publication }
|
|
1179
1302
|
};
|
|
1180
1303
|
}
|
|
@@ -1235,6 +1358,19 @@ async function verifyStreams(input) {
|
|
|
1235
1358
|
for (const stream of [...plan.subject, ...plan.tables]) if (stream.user !== void 0 && await leaks(query, stream, stream.user, fixture)) mismatches.push(`stream ${stream.name} syncs another user's ${stream.table} rows to ${fixture.subject.id}`);
|
|
1236
1359
|
}
|
|
1237
1360
|
for (const fixture of input.fixtures) {
|
|
1361
|
+
if ("after" in fixture) {
|
|
1362
|
+
await verifyClaimsChange({
|
|
1363
|
+
policy: input.policy,
|
|
1364
|
+
config: input.config,
|
|
1365
|
+
customRoles: input.customRoles,
|
|
1366
|
+
plan,
|
|
1367
|
+
fixture,
|
|
1368
|
+
root,
|
|
1369
|
+
query,
|
|
1370
|
+
mismatches
|
|
1371
|
+
});
|
|
1372
|
+
continue;
|
|
1373
|
+
}
|
|
1238
1374
|
if ("table" in fixture) {
|
|
1239
1375
|
await verifyFollowedRow({
|
|
1240
1376
|
policy: input.policy,
|
|
@@ -1320,12 +1456,13 @@ async function runPowerSync(input) {
|
|
|
1320
1456
|
output: [
|
|
1321
1457
|
...files.map((file) => `wrote ${file.path}`),
|
|
1322
1458
|
...compiled.publication === void 0 ? [] : [`add the tables outside public to the powersync publication: ${compiled.publication}`],
|
|
1323
|
-
...warnings
|
|
1459
|
+
...warnings,
|
|
1460
|
+
...compiled.claims.map((line) => `PD084: ${line}`)
|
|
1324
1461
|
].join("\n")
|
|
1325
1462
|
};
|
|
1326
1463
|
}
|
|
1327
1464
|
const mismatches = stale.map((file) => `${file.path} ${file.missing ? "is missing" : "differs from the policy"}: run permdock powersync generate`);
|
|
1328
|
-
const notes = [...warnings];
|
|
1465
|
+
const notes = [...warnings, ...compiled.claims.map((line) => `PD084: ${line}`)];
|
|
1329
1466
|
if (input.db !== void 0) try {
|
|
1330
1467
|
const fixturesPath = input.fixtures ?? input.config.rls?.fixtures ?? "rls.fixtures.json";
|
|
1331
1468
|
const { fixtures, customRoles } = await loadFixtures(input.cwd, fixturesPath, true);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as defineLeaf } from "./command-L8EstFNm.js";
|
|
2
|
-
import { c as given, d as policyFlag, n as dbUrl, o as fileOut, r as dbUrlFlags, t as checkFlag } from "./flags-
|
|
2
|
+
import { c as given, d as policyFlag, n as dbUrl, o as fileOut, r as dbUrlFlags, t as checkFlag } from "./flags-BlmpmXoY.js";
|
|
3
3
|
//#region src/cli/commands/powersync.ts
|
|
4
4
|
const generate = defineLeaf({
|
|
5
5
|
flags: {
|
|
@@ -14,7 +14,7 @@ const generate = defineLeaf({
|
|
|
14
14
|
async run(ctx, { flags }) {
|
|
15
15
|
const out = fileOut("powersync", flags.out);
|
|
16
16
|
const from = given(flags.policy);
|
|
17
|
-
const { runPowerSync } = await import("./powersync-
|
|
17
|
+
const { runPowerSync } = await import("./powersync-xNRlC4jN.js");
|
|
18
18
|
return runPowerSync({
|
|
19
19
|
cwd: ctx.cwd,
|
|
20
20
|
config: ctx.config,
|
|
@@ -45,7 +45,7 @@ const verify = defineLeaf({
|
|
|
45
45
|
const db = await dbUrl(ctx, flags, { required: true });
|
|
46
46
|
const fixtures = given(flags.fixtures);
|
|
47
47
|
const from = given(flags.policy);
|
|
48
|
-
const { runPowerSync } = await import("./powersync-
|
|
48
|
+
const { runPowerSync } = await import("./powersync-xNRlC4jN.js");
|
|
49
49
|
return runPowerSync({
|
|
50
50
|
cwd: ctx.cwd,
|
|
51
51
|
config: ctx.config,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { n as runPowerSync } from "./powersync-9PYOE1wt.js";
|
package/dist/preset/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { s as ARCHETYPES, c as AUTH, l as BACKENDS, u as FEATURES, d as FRAMEWORKS, f as INTEGRATIONS, p as PRESET_DEFAULTS, r as PRESET_FLAGS, m as SERVICES, a as decodePreset, o as encodePreset, n as generatePreset, h as integrationsOf, i as presetFlags, t as presetMatrix, g as resolvePreset } from "../preset-
|
|
1
|
+
export { s as ARCHETYPES, c as AUTH, l as BACKENDS, u as FEATURES, d as FRAMEWORKS, f as INTEGRATIONS, p as PRESET_DEFAULTS, r as PRESET_FLAGS, m as SERVICES, a as decodePreset, o as encodePreset, n as generatePreset, h as integrationsOf, i as presetFlags, t as presetMatrix, g as resolvePreset } from "../preset-pPrVyGU5.js";
|
|
@@ -934,16 +934,80 @@ export async function currentUser(${sessionCall(ctx).takesRequest ? "_request: R
|
|
|
934
934
|
}
|
|
935
935
|
`;
|
|
936
936
|
}
|
|
937
|
+
function supabaseCookieSession() {
|
|
938
|
+
return `import { createServerClient } from "@supabase/ssr";
|
|
939
|
+
import { cookies } from "next/headers";
|
|
940
|
+
import { subjectFromSupabase } from "permdock/supabase";
|
|
941
|
+
|
|
942
|
+
/**
|
|
943
|
+
* The subject the Supabase session cookie proves, verified with getClaims();
|
|
944
|
+
* anonymous without one. proxy.ts refreshes the session before this runs, so
|
|
945
|
+
* setAll has nothing to write.
|
|
946
|
+
*/
|
|
947
|
+
export async function currentSubject() {
|
|
948
|
+
const store = await cookies();
|
|
949
|
+
const supabase = createServerClient(
|
|
950
|
+
${env("SUPABASE_URL")} ?? "",
|
|
951
|
+
${env("SUPABASE_PUBLISHABLE_KEY")} ?? "",
|
|
952
|
+
{ cookies: { getAll: () => store.getAll(), setAll: () => undefined } },
|
|
953
|
+
);
|
|
954
|
+
const { data, error } = await supabase.auth.getClaims();
|
|
955
|
+
return subjectFromSupabase(error ? null : (data?.claims ?? null));
|
|
956
|
+
}
|
|
957
|
+
`;
|
|
958
|
+
}
|
|
959
|
+
/**
|
|
960
|
+
* Next.js 16's `proxy.ts`: refreshes the Supabase session once per request and
|
|
961
|
+
* returns the response `setAll` built, with the cache headers `@supabase/ssr`
|
|
962
|
+
* passes so a CDN never stores a session cookie.
|
|
963
|
+
*/
|
|
964
|
+
function supabaseProxy() {
|
|
965
|
+
return `import { createServerClient } from "@supabase/ssr";
|
|
966
|
+
import { type NextRequest, NextResponse } from "next/server";
|
|
967
|
+
|
|
968
|
+
/** Refreshes the Supabase session; authorization happens in the pages. */
|
|
969
|
+
export async function proxy(request: NextRequest) {
|
|
970
|
+
let response = NextResponse.next({ request });
|
|
971
|
+
const supabase = createServerClient(
|
|
972
|
+
${env("SUPABASE_URL")} ?? "",
|
|
973
|
+
${env("SUPABASE_PUBLISHABLE_KEY")} ?? "",
|
|
974
|
+
{
|
|
975
|
+
cookies: {
|
|
976
|
+
getAll: () => request.cookies.getAll(),
|
|
977
|
+
setAll: (cookiesToSet, headers) => {
|
|
978
|
+
for (const { name, value } of cookiesToSet) {
|
|
979
|
+
request.cookies.set(name, value);
|
|
980
|
+
}
|
|
981
|
+
response = NextResponse.next({ request });
|
|
982
|
+
for (const { name, value, options } of cookiesToSet) {
|
|
983
|
+
response.cookies.set(name, value, options);
|
|
984
|
+
}
|
|
985
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
986
|
+
response.headers.set(key, value);
|
|
987
|
+
}
|
|
988
|
+
},
|
|
989
|
+
},
|
|
990
|
+
},
|
|
991
|
+
);
|
|
992
|
+
await supabase.auth.getClaims();
|
|
993
|
+
return response;
|
|
994
|
+
}
|
|
995
|
+
|
|
996
|
+
export const config = {
|
|
997
|
+
matcher: ["/((?!_next/static|_next/image|favicon.ico).*)"],
|
|
998
|
+
};
|
|
999
|
+
`;
|
|
1000
|
+
}
|
|
937
1001
|
function supabaseSession(ctx) {
|
|
1002
|
+
if (!sessionCall(ctx).takesRequest) return supabaseCookieSession();
|
|
938
1003
|
const h = headersOf(ctx);
|
|
939
|
-
const browser = sessionCall(ctx).takesRequest ? "" : "\n * A browser session keeps the token in cookies: read it there with\n * createServerClient from @supabase/ssr.";
|
|
940
1004
|
return moduleText([
|
|
941
1005
|
`import { createClient } from "@supabase/supabase-js";`,
|
|
942
1006
|
...h.imports,
|
|
943
1007
|
`import { subjectFromSupabase } from "permdock/supabase";`
|
|
944
1008
|
], `/**
|
|
945
1009
|
* The subject the Supabase access token in the Authorization header proves;
|
|
946
|
-
* anonymous without a valid one
|
|
1010
|
+
* anonymous without a valid one.
|
|
947
1011
|
*/
|
|
948
1012
|
export async function currentSubject(${h.param}) {
|
|
949
1013
|
const requestHeaders = ${h.read};
|
|
@@ -1038,7 +1102,7 @@ function sessionFiles(ctx) {
|
|
|
1038
1102
|
const at = (name) => `${ctx.src}/${name}`;
|
|
1039
1103
|
switch (ctx.preset.auth) {
|
|
1040
1104
|
case "custom": return [ownedFile(at("session.ts"), customSession(ctx))];
|
|
1041
|
-
case "supabase": return [ownedFile(at("session.ts"), supabaseSession(ctx))];
|
|
1105
|
+
case "supabase": return [ownedFile(at("session.ts"), supabaseSession(ctx)), ...sessionCall(ctx).takesRequest ? [] : [ownedFile(at("proxy.ts"), supabaseProxy())]];
|
|
1042
1106
|
case "better-auth": return [ownedFile(at("auth.ts"), betterAuthFile()), ownedFile(at("session.ts"), betterAuthSession(ctx))];
|
|
1043
1107
|
case "clerk": return [ownedFile(at("session.ts"), clerkSession(ctx))];
|
|
1044
1108
|
case "jwt": return [ownedFile(at("session.ts"), jwtSession(ctx))];
|
|
@@ -1048,7 +1112,7 @@ function sessionFiles(ctx) {
|
|
|
1048
1112
|
function authDependencies(ctx) {
|
|
1049
1113
|
switch (ctx.preset.auth) {
|
|
1050
1114
|
case "custom": return [];
|
|
1051
|
-
case "supabase": return ["@supabase/supabase-js"];
|
|
1115
|
+
case "supabase": return sessionCall(ctx).takesRequest ? ["@supabase/supabase-js"] : ["@supabase/ssr", "@supabase/supabase-js"];
|
|
1052
1116
|
case "better-auth": return ["better-auth"];
|
|
1053
1117
|
case "clerk": return [sessionCall(ctx).takesRequest ? "@clerk/backend" : "@clerk/nextjs"];
|
|
1054
1118
|
case "jwt": return ["jose"];
|
|
@@ -1489,14 +1553,17 @@ app.patch(
|
|
|
1489
1553
|
);
|
|
1490
1554
|
`)];
|
|
1491
1555
|
case "none":
|
|
1492
|
-
if (current === "currentSubject") return [owned(`${ctx.src}/server.ts`, `import { getPermDock } from "permdock";
|
|
1556
|
+
if (current === "currentSubject") return [owned(`${ctx.src}/server.ts`, `import { getPermDock, instanceCache } from "permdock";
|
|
1493
1557
|
|
|
1494
1558
|
import { app } from "./permdock";
|
|
1495
1559
|
import { currentSubject } from "./session";
|
|
1496
1560
|
|
|
1497
|
-
/**
|
|
1561
|
+
/** Instances reused while a caller's authorization version holds; one per process. */
|
|
1562
|
+
const instances = instanceCache();
|
|
1563
|
+
|
|
1564
|
+
/** The decision object for the caller of \`request\`. */
|
|
1498
1565
|
export async function permdockFor(request: Request) {
|
|
1499
|
-
return getPermDock(app, await currentSubject(request));
|
|
1566
|
+
return getPermDock(app, await currentSubject(request), { instances });
|
|
1500
1567
|
}
|
|
1501
1568
|
`)];
|
|
1502
1569
|
return [owned(`${ctx.src}/server.ts`, `import { getPermDockSync } from "permdock";
|
package/dist/prisma/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { f as WhereResult } from "../permdock-
|
|
1
|
+
import { Kt as Instant, wr as Condition, yr as Subject } from "../policy-types-D-GwfQTc.js";
|
|
2
|
+
import { f as WhereResult } from "../permdock-ffY4CMd9.js";
|
|
3
3
|
import { r as RelationsMapping } from "../graph-sql-BwFC4Qjs.js";
|
|
4
4
|
import { n as RowCheck, t as WithSubjectOptions } from "../subject-settings-vNW8qmUH.js";
|
|
5
5
|
//#region src/prisma/model-fields.d.ts
|
package/dist/prisma/index.js
CHANGED
|
@@ -2,7 +2,7 @@ import { t as compact } from "../compact-CAf557ZB.js";
|
|
|
2
2
|
import { n as freezeDeep } from "../freeze-jjan0lCv.js";
|
|
3
3
|
import { t as assertSafeKey } from "../paths-CUvURzHp.js";
|
|
4
4
|
import { n as PermDockValidationError } from "../validation-error-CYg2kJEw.js";
|
|
5
|
-
import { c as relatedTargetsSql, d as restrictedRowsSql, n as compileWhere, o as relatedRowGuard, r as escapeLike, u as renderGraphSql } from "../compile-
|
|
5
|
+
import { c as relatedTargetsSql, d as restrictedRowsSql, n as compileWhere, o as relatedRowGuard, r as escapeLike, u as renderGraphSql } from "../compile-B_oJqmIg.js";
|
|
6
6
|
import { n as statementText, o as rowCheckOf, r as subjectStatements, s as loadPeer } from "../subject-settings-8sH5HlII.js";
|
|
7
7
|
//#region src/prisma/to-where.ts
|
|
8
8
|
function fieldTests(options) {
|