permdock 0.7.0 → 0.9.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.
Files changed (483) hide show
  1. package/README.md +1 -3
  2. package/dist/a2a/index.d.ts +7 -7
  3. package/dist/a2a/index.js +8 -8
  4. package/dist/action-result-BcudBQOF.d.ts +19 -0
  5. package/dist/{adapter-context-CRhqyzCk.js → adapter-context-CIQpQxbE.js} +8 -2
  6. package/dist/{adoption-scan-D-feE7BE.js → adoption-scan-Ch07MdxN.js} +5 -5
  7. package/dist/agent/index.d.ts +2 -2
  8. package/dist/agent/index.js +1 -1
  9. package/dist/ai-sdk/index.d.ts +19 -13
  10. package/dist/ai-sdk/index.js +6 -6
  11. package/dist/{app-data-MuyzVqX8.js → app-data-UNNm07jV.js} +10 -7
  12. package/dist/{approval-header-CJACtHkv.js → approval-header-8QV6MU4H.js} +6 -3
  13. package/dist/{approval-prompt-K0faOLFp.d.ts → approval-prompt-3BqWczTt.d.ts} +13 -11
  14. package/dist/{approval-prompt-Dg5LeAcT.js → approval-prompt-B8hQY69x.js} +5 -6
  15. package/dist/approvals/index.d.ts +4 -4
  16. package/dist/approvals/index.js +6 -6
  17. package/dist/{approvals-CMRfsbBh.js → approvals-DnIBTuXE.js} +66 -42
  18. package/dist/{approvers-CqPOLD-o.js → approvers-B4r0N_Uz.js} +8 -2
  19. package/dist/{arazzo-ClrF3PVb.js → arazzo-BpS7LnV0.js} +2 -2
  20. package/dist/{arazzo-rdeJ8n1J.js → arazzo-CmQaGPkM.js} +6 -6
  21. package/dist/{args-CC3OwyHW.js → args-0FrVs5EH.js} +14 -7
  22. package/dist/astro/index.d.ts +30 -12
  23. package/dist/astro/index.js +2 -2
  24. package/dist/{audience-BrMs8c4o.js → audience-DTjR8xet.js} +8 -8
  25. package/dist/{auth-CscUX8Sy.js → auth--yPyZNgr.js} +19 -7
  26. package/dist/authzen/index.d.ts +34 -28
  27. package/dist/authzen/index.js +23 -20
  28. package/dist/{automation-DOtAFWdy.d.ts → automation-C6Jg75xq.d.ts} +42 -32
  29. package/dist/{automation-ySsxp_Yp.js → automation-x3KEUusw.js} +22 -21
  30. package/dist/better-auth/index.d.ts +2 -2
  31. package/dist/better-auth/index.js +13 -7
  32. package/dist/better-supabase/index.d.ts +357 -227
  33. package/dist/better-supabase/index.js +219 -140
  34. package/dist/{bind-D1nO6fiC.js → bind-BNQA9JK9.js} +26 -10
  35. package/dist/{bind-JDuvxjuW.d.ts → bind-YYjvfpB9.d.ts} +32 -12
  36. package/dist/{body-CH5of8Ne.js → body-CJQwYVa8.js} +3 -3
  37. package/dist/{body-text-QcXok_SI.js → body-text-DQhcmqdY.js} +8 -4
  38. package/dist/{boundary-BM8a_P6E.js → boundary-BV3O1eud.js} +8 -2
  39. package/dist/{boundary-BmHxVH1J.d.ts → boundary-C9ck-3uK.d.ts} +13 -4
  40. package/dist/{budget-NbEtbJC_.js → budget-BELja5A9.js} +6 -3
  41. package/dist/{budget-JqcRqyhK.d.ts → budget-hYsPz_yE.d.ts} +6 -3
  42. package/dist/{build-instance-DxE7czo9.js → build-instance-BWXqwQYU.js} +3 -3
  43. package/dist/{capability-L7NnfhiE.js → capability-BqX94r07.js} +31 -25
  44. package/dist/{capability-D4UC9TTW.d.ts → capability-Di9tiUvi.d.ts} +41 -29
  45. package/dist/{casbin-BHijLuHY.js → casbin-B7_yS-oo.js} +2 -2
  46. package/dist/{casbin-BW9pS47J.js → casbin-bHyIxTNQ.js} +16 -8
  47. package/dist/{casl-CmJlgziS.js → casl-C4OINZHI.js} +2 -2
  48. package/dist/{casl-UbI8v-Wq.js → casl-CHHoCldP.js} +19 -10
  49. package/dist/catalog/index.d.ts +51 -30
  50. package/dist/catalog/index.js +18 -15
  51. package/dist/{catalog-D69WhFii.js → catalog-CGlSwU6j.js} +20 -19
  52. package/dist/catalog-D3oS2GH3.js +1 -0
  53. package/dist/{catalog-BaMQfQ6Y.js → catalog-amPDr0JQ.js} +3 -3
  54. package/dist/{catalog-doc-CV9s6B1S.js → catalog-doc-DjMKzJp9.js} +28 -14
  55. package/dist/{catalog-fingerprint-C144oW4M.js → catalog-fingerprint-e6aCWosn.js} +18 -14
  56. package/dist/catalog-operations-DeHTrJSV.js +60 -0
  57. package/dist/{challenge-nGWma08S.js → challenge-DImNcR7B.js} +48 -27
  58. package/dist/chat/index.d.ts +1 -1
  59. package/dist/chat/index.js +13 -10
  60. package/dist/chat-sdk/index.d.ts +44 -26
  61. package/dist/chat-sdk/index.js +17 -17
  62. package/dist/{checks-BC_0mPIq.js → checks-CGkP3Z7A.js} +4 -1
  63. package/dist/{claims-map-7oQ3ue4X.js → claims-map-CKkoAAYF.js} +5 -2
  64. package/dist/{claims-map-Ca-QX8C6.d.ts → claims-map-D1Pb5oRq.d.ts} +8 -5
  65. package/dist/claude-agent/index.d.ts +6 -6
  66. package/dist/claude-agent/index.js +6 -3
  67. package/dist/clerk/index.d.ts +11 -7
  68. package/dist/clerk/index.js +6 -6
  69. package/dist/cli/bin.js +4 -4
  70. package/dist/cli/index.d.ts +82 -7
  71. package/dist/cli/index.js +6 -6
  72. package/dist/{clients-C7zLFuWT.d.ts → clients-C_NOET3z.d.ts} +5 -5
  73. package/dist/{clients-DjU5ABMy.js → clients-DYr3U86j.js} +3 -3
  74. package/dist/cloud/index.d.ts +84 -52
  75. package/dist/cloud/index.js +53 -39
  76. package/dist/{cloud-CO8pYtwr.js → cloud-3kWfjnYy.js} +4 -5
  77. package/dist/{codemod-BP6n8N9L.js → codemod-Bv5i-Mzo.js} +523 -201
  78. package/dist/{codemod-i4N2BhDc.js → codemod-D9Aiii1r.js} +3 -4
  79. package/dist/{collect-DNm3oKOk.js → collect-B80GYEot.js} +4 -5
  80. package/dist/collect-D-eroIfV.js +1 -0
  81. package/dist/{collect-BaWeMjwV.js → collect-WCl8cJQV.js} +26 -63
  82. package/dist/{compare-pfyVnBjE.js → compare-DTfyUunF.js} +2 -2
  83. package/dist/compile/index.d.ts +2 -2
  84. package/dist/compile/index.js +1 -1
  85. package/dist/{compile-COM2VKuN.d.ts → compile-BEklRUYo.d.ts} +36 -12
  86. package/dist/{compile-BAEO5bOk.js → compile-EzEMB-7v.js} +77 -33
  87. package/dist/{completion-BNdVf7X2.js → completion-_bc0OUQ-.js} +17 -8
  88. package/dist/config-BwPBfN0t.js +108 -0
  89. package/dist/{config-DGZzMV1B.js → config-D5XrLWpk.js} +2 -2
  90. package/dist/{config-report-Cm7UITNA.js → config-report-BmWIskD7.js} +9 -6
  91. package/dist/config-shape-ykV0Vm2n.js +134 -0
  92. package/dist/{connection-DjhIJSs2.js → connection-B72dg5Q2.js} +23 -22
  93. package/dist/{connector-schema-_VCSsdtD.js → connector-schema-CYLQNMYq.js} +3 -2
  94. package/dist/{context--uM9V3Ui.js → context-BnIzxTNE.js} +4 -3
  95. package/dist/convex/index.d.ts +13 -7
  96. package/dist/convex/index.js +9 -6
  97. package/dist/{core-CQkE8Esr.d.ts → core-CFepFiDP.d.ts} +49 -22
  98. package/dist/{core-B5-w6Kw9.js → core-DzVINFbU.js} +26 -20
  99. package/dist/{create-Cb86Z8Im.js → create-6EwRQlig.js} +10 -7
  100. package/dist/{create-DJrlhEp9.js → create-BLPKnJKa.js} +35 -25
  101. package/dist/{create-UTnUVETj.d.ts → create-BPUopdfL.d.ts} +70 -37
  102. package/dist/{create-QHuuPw3q.d.ts → create-BamXmeob.d.ts} +37 -29
  103. package/dist/{create-B2-CQqCI.d.ts → create-DBvUsgzK.d.ts} +49 -28
  104. package/dist/{credential-CIM7wHwA.js → credential-CyyyvCsL.js} +41 -38
  105. package/dist/{credentials-BpuTwd7a.js → credentials-CdDxp7jN.js} +6 -6
  106. package/dist/{deciding-columns-DRo2QM6E.js → deciding-columns-NB4wcyBf.js} +2 -2
  107. package/dist/{delegation-C5rOdTp5.js → delegation-CDB6_keF.js} +31 -22
  108. package/dist/delivery/index.d.ts +4 -4
  109. package/dist/delivery/index.js +5 -5
  110. package/dist/{delivery-rwOKLWRm.js → delivery-BupfvJIV.js} +34 -22
  111. package/dist/{delivery-event-xX4obB8F.js → delivery-event-JioK5YbS.js} +6 -6
  112. package/dist/denied-text-DHldhVUv.d.ts +22 -0
  113. package/dist/{describe-DZlnEtLy.js → describe-Bb4hGK5d.js} +5 -5
  114. package/dist/{describe-O0SwYIK8.d.ts → describe-BbFPBSms.d.ts} +5 -5
  115. package/dist/{device-BARQ8eYG.js → device-BwbJNmb2.js} +11 -8
  116. package/dist/{diff-Btr1c1Ow.js → diff-BwR1JdP2.js} +2 -2
  117. package/dist/{diff-DzT-xD13.js → diff-CQegtBAo.js} +22 -13
  118. package/dist/{digest-B3kc_PgQ.d.ts → digest-8Yx2CchM.d.ts} +3 -3
  119. package/dist/{doctor-BU1szn63.js → doctor-ClRVAtXQ.js} +287 -135
  120. package/dist/{doctor-BoK_y0KO.js → doctor-LPMYjSqO.js} +4 -4
  121. package/dist/drizzle/index.d.ts +33 -19
  122. package/dist/drizzle/index.js +17 -9
  123. package/dist/elysia/index.d.ts +17 -11
  124. package/dist/elysia/index.js +5 -5
  125. package/dist/{errors-BKy0EfhN.js → errors-B6R_lg2a.js} +13 -4
  126. package/dist/{errors-B_Qg9D3e.d.ts → errors-BIM4MFsJ.d.ts} +22 -6
  127. package/dist/{errors-BWXBMaKK.d.ts → errors-CHwoRRpB.d.ts} +4 -1
  128. package/dist/{errors-DpP_U6Bf.js → errors-Vpu6rKHl.js} +13 -10
  129. package/dist/{evaluate-B_oqFbWC.js → evaluate-BAmf_AQd.js} +153 -82
  130. package/dist/{evaluations-BCddEOfO.d.ts → evaluations-DOWuBpWv.d.ts} +11 -5
  131. package/dist/{evaluations-DReoiVBw.js → evaluations-IBceAeKT.js} +40 -19
  132. package/dist/eve/index.d.ts +9 -6
  133. package/dist/eve/index.js +4 -4
  134. package/dist/{event-time-CsegxXxB.js → event-time-BGy48400.js} +8 -4
  135. package/dist/{expiry-D4_YKRKD.js → expiry-6XByK0dm.js} +8 -5
  136. package/dist/express/index.d.ts +9 -6
  137. package/dist/express/index.js +9 -6
  138. package/dist/fastify/index.d.ts +16 -10
  139. package/dist/fastify/index.js +8 -5
  140. package/dist/{fetch-adapter-CuhyYwC1.d.ts → fetch-adapter-BIbBAtPZ.d.ts} +9 -6
  141. package/dist/{fetch-adapter-De-u6vhJ.js → fetch-adapter-dPTgJVHd.js} +14 -11
  142. package/dist/fields-D0vUI6dq.js +498 -0
  143. package/dist/{files-acUbNwWt.js → files-B3AA05f1.js} +8 -5
  144. package/dist/{files-D_JIzUrP.js → files-BSjrtIHw.js} +11 -4
  145. package/dist/{fixtures-BTMW6zgU.js → fixtures-A1_sp_tR.js} +15 -6
  146. package/dist/{flags-aaeRAdiD.js → flags-DXjoTVbS.js} +2 -2
  147. package/dist/{freeze-CrU8nQeX.js → freeze-jjan0lCv.js} +4 -1
  148. package/dist/{from-snapshot-Bz469dIh.js → from-snapshot-DCakWRsr.js} +18 -15
  149. package/dist/gen-BFfzZSLH.js +58 -0
  150. package/dist/gen-BtfFWGbz.js +827 -0
  151. package/dist/{generate-3FNO5P5Q.js → generate-CRVV5V7l.js} +14 -8
  152. package/dist/generate-CezbCaTI.js +275 -0
  153. package/dist/{grantee-BrRANrpT.js → grantee-Dke-9rd1.js} +4 -4
  154. package/dist/{grantee-conditions-C6P1Tvol.js → grantee-conditions-BrYPe-w0.js} +12 -12
  155. package/dist/{grantee-match-0RtHWQDx.js → grantee-match-7RZZvoT_.js} +12 -6
  156. package/dist/{graph-sql-B-dsAT6j.d.ts → graph-sql-BwFC4Qjs.d.ts} +3 -3
  157. package/dist/h3/index.d.ts +10 -7
  158. package/dist/h3/index.js +3 -3
  159. package/dist/headers-B9jQxjtW.d.ts +10 -0
  160. package/dist/{helpers-DY3vXuGs.js → helpers-DJicaG6f.js} +40 -28
  161. package/dist/hono/index.d.ts +16 -10
  162. package/dist/hono/index.js +5 -5
  163. package/dist/{hosted-XBgU6RGT.js → hosted-D0IzESu_.js} +42 -21
  164. package/dist/{hosted-BmjzxQhp.d.ts → hosted-DVxlLZMe.d.ts} +33 -21
  165. package/dist/{http-ujKm0JXE.js → http-DH94eh6f.js} +4 -4
  166. package/dist/{http-BBoKefeS.js → http-DKLXrFGk.js} +13 -7
  167. package/dist/{http-Ca3Sr5x1.js → http-DOL33cO0.js} +11 -8
  168. package/dist/{import-DB2EG_iy.js → import-ACkOrv6g.js} +6 -6
  169. package/dist/{import-Bz0GefWg.js → import-CST57XLp.js} +64 -51
  170. package/dist/{index-CMiPH2Tv.d.ts → index-BinlXeU-.d.ts} +64 -37
  171. package/dist/{index-BSfRl0hZ.d.ts → index-CV-7DWeD.d.ts} +64 -52
  172. package/dist/{index-BE8y3moU.d.ts → index-DJwEgYzA.d.ts} +127 -82
  173. package/dist/{index-DH9DUDEM.d.ts → index-Dj2qF9VC.d.ts} +54 -30
  174. package/dist/{index-BTkwrK7v.d.ts → index-vYjMrXyK.d.ts} +336 -173
  175. package/dist/{index-DLwcuCN_.d.ts → index-ymept53A.d.ts} +51 -30
  176. package/dist/index.d.ts +22 -22
  177. package/dist/index.js +34 -34
  178. package/dist/{init-B-4t1NzC.js → init-BjuFDYT1.js} +10 -10
  179. package/dist/{init-5TXNji88.js → init-txYTuW9u.js} +5 -5
  180. package/dist/{instance-options-CU0YQCLH.d.ts → instance-options-CoHn-0e8.d.ts} +4 -4
  181. package/dist/{instance-snapshot-CjcwnEiV.js → instance-snapshot-DuWf1cT3.js} +86 -61
  182. package/dist/{instant-BluqDvyS.js → instant-DK3Iz83e.js} +2 -2
  183. package/dist/{internals-Dk8A8fX3.js → internals-B3IgHrvo.js} +6 -3
  184. package/dist/{json-schema-B-vAwlde.js → json-schema-BPGa-RjQ.js} +9 -3
  185. package/dist/{json-schema-CN_iLFH2.d.ts → json-schema-BfXgnRNT.d.ts} +4 -4
  186. package/dist/jwt/index.d.ts +57 -27
  187. package/dist/jwt/index.js +24 -21
  188. package/dist/{kernel-DVExUwkp.js → kernel-qv4cr9w8.js} +32 -23
  189. package/dist/kysely/index.d.ts +49 -33
  190. package/dist/kysely/index.js +9 -7
  191. package/dist/{live-options-BaAFCIiu.js → live-options-BBIT68le.js} +2 -2
  192. package/dist/{load-DxroEzH1.js → load-DjSU5KXO.js} +6 -6
  193. package/dist/load-Dm0pSYH3.js +1 -0
  194. package/dist/{login-ClSJh5t5.js → login-CfImTJGb.js} +4 -4
  195. package/dist/{login-WC9HPJpU.js → login-CgfCTO3F.js} +16 -9
  196. package/dist/{manifest-Dv6q4i5s.js → manifest-B2QPh19C.js} +49 -38
  197. package/dist/{manifest-BVhExYhw.d.ts → manifest-CzzWtnAb.d.ts} +126 -31
  198. package/dist/{manifest-schema-Cv492Qev.js → manifest-schema-2r37XRhD.js} +44 -3
  199. package/dist/{manifest-B79YuF2T.js → manifest-wg8WkkpD.js} +6 -6
  200. package/dist/{map-claims-etGIS_Dv.js → map-claims-C-nv08_n.js} +16 -9
  201. package/dist/{map-error-BQGyDm_M.js → map-error-pasIGqMT.js} +7 -7
  202. package/dist/{markers-C6joDI3o.js → markers-BeHZ4x9Q.js} +20 -5
  203. package/dist/mcp/index.d.ts +114 -61
  204. package/dist/mcp/index.js +70 -40
  205. package/dist/{migrate-Dodel0IJ.js → migrate-B7oP_sQU.js} +35 -17
  206. package/dist/module-values-BJTBdo6y.js +107 -0
  207. package/dist/nest/index.d.ts +23 -13
  208. package/dist/nest/index.js +18 -11
  209. package/dist/next/client.d.ts +5 -2
  210. package/dist/next/client.js +1 -1
  211. package/dist/next/index.d.ts +79 -26
  212. package/dist/next/index.js +121 -10
  213. package/dist/next/plugin.d.ts +1 -1
  214. package/dist/next/plugin.js +4 -3
  215. package/dist/node/index.d.ts +5 -5
  216. package/dist/node/index.js +3 -3
  217. package/dist/{ocsf-BFp-PZZA.js → ocsf-TcjRBgIs.js} +15 -5
  218. package/dist/openai/index.d.ts +13 -7
  219. package/dist/openai/index.js +3 -3
  220. package/dist/openapi/index.d.ts +51 -30
  221. package/dist/openapi/index.js +2 -2
  222. package/dist/{openapi-ztVaux6j.js → openapi-BGeuunWC.js} +23 -14
  223. package/dist/{openapi-DMocl1bh.js → openapi-BIpw3Mb7.js} +4 -5
  224. package/dist/{openapi-Ddb4628T.js → openapi-BOsx0xn9.js} +33 -18
  225. package/dist/{operation-findings-kRcEp8lE.js → operation-findings-CXtFzlKJ.js} +3 -3
  226. package/dist/{operations-BNLes61x.d.ts → operations-Ci_rT6Uo.d.ts} +10 -7
  227. package/dist/orpc/index.d.ts +68 -14
  228. package/dist/orpc/index.js +62 -13
  229. package/dist/otel/index.d.ts +7 -4
  230. package/dist/otel/index.js +8 -5
  231. package/dist/{output-DgSDLrta.js → output-DV5dwOTs.js} +9 -5
  232. package/dist/output-files-BHOIlrfD.js +1 -0
  233. package/dist/{output-files-CCMdcFWb.js → output-files-BIQ_9pIs.js} +29 -17
  234. package/dist/ownership-DA5YdYTm.js +1059 -0
  235. package/dist/{parse-Ddhz2xf4.js → parse-1_ZheTW5.js} +16 -13
  236. package/dist/parse-local-manifest-CCmbhnxP.d.ts +10 -0
  237. package/dist/{parse-local-manifest-T1Q8X3A2.js → parse-local-manifest-DEiCF4ah.js} +19 -7
  238. package/dist/{parse-request-D_tUXG6M.js → parse-request-CwCZpyjV.js} +7 -8
  239. package/dist/{paths-DXSHAMIa.js → paths-CUvURzHp.js} +4 -1
  240. package/dist/pdp/index.d.ts +9 -6
  241. package/dist/pdp/index.js +20 -13
  242. package/dist/{peer-DOzzMfZL.js → peer-C9LvBCcb.js} +1 -1
  243. package/dist/{peer-12Q5I_RH.js → peer-Q0fuZ6hx.js} +9 -3
  244. package/dist/{permdock-BfWEeMqk.js → permdock-BvjivVb9.js} +200 -140
  245. package/dist/{permdock-Dco6dyCK.d.ts → permdock-CprAPN3w.d.ts} +260 -129
  246. package/dist/{permission-registry-DpPtSKNZ.js → permission-registry-B8tYxPIt.js} +23 -10
  247. package/dist/{permission-types-DhNEmoRG.d.ts → permission-types-CAY-GU7e.d.ts} +127 -41
  248. package/dist/{permissions-CoqCOfJ3.d.ts → permissions-Bx6UI8n1.d.ts} +6 -3
  249. package/dist/{permissions-CyH2MV_B.js → permissions-CVXmRILq.js} +3 -3
  250. package/dist/{permissions-DArULThq.js → permissions-CYcHj_w7.js} +8 -5
  251. package/dist/pg-DQTqRrou.js +60 -0
  252. package/dist/{pins-8ILTftC9.js → pins-nqarl3oE.js} +4 -1
  253. package/dist/{pkce-5h8NgMQJ.js → pkce-CnmmYqUZ.js} +1 -1
  254. package/dist/{policy-B7dg_yzu.d.ts → policy-BycVKnXv.d.ts} +5 -5
  255. package/dist/{policy-DaJy4nK4.js → policy-CLQ8__GF.js} +43 -23
  256. package/dist/{policy-from-catalog-DFWYkNdu.js → policy-from-catalog-CU3An8uP.js} +28 -25
  257. package/dist/{policy-module-CTlwMvLI.js → policy-module-xym9fnSq.js} +12 -6
  258. package/dist/{policy-types-B-F-qAZk.d.ts → policy-types-DGIO_gxq.d.ts} +782 -357
  259. package/dist/{postgres-store-BL9M_CA1.js → postgres-store-DcyrPS-r.js} +43 -16
  260. package/dist/{postgrest-r5faDIzD.js → postgrest-5Dr3W64L.js} +84 -86
  261. package/dist/{postgrest-CYacM_u7.d.ts → postgrest-D5nUGm-c.d.ts} +55 -35
  262. package/dist/powersync-B701tvhE.js +1 -0
  263. package/dist/{powersync-13odBwiM.js → powersync-Bg8u-JcR.js} +3 -3
  264. package/dist/{powersync-53ryOZip.js → powersync-CJrT1DSc.js} +127 -69
  265. package/dist/preset/index.d.ts +38 -28
  266. package/dist/preset/index.js +1 -1
  267. package/dist/{preset-CHTbd-DQ.js → preset-BjLzeFpp.js} +56 -32
  268. package/dist/{principal-source-pHneukrx.js → principal-source-C6N60GtM.js} +10 -10
  269. package/dist/prisma/index.d.ts +69 -41
  270. package/dist/prisma/index.js +21 -17
  271. package/dist/{problem-CTviyH5L.js → problem-BVLHFK33.js} +41 -21
  272. package/dist/{problem-details-cn5X30gZ.js → problem-details-CLDgX1KV.js} +13 -4
  273. package/dist/{problem-types-CJ2325SZ.js → problem-types-DSsRfONQ.js} +4 -1
  274. package/dist/{prompt-DwtVemER.js → prompt-BYc6drYW.js} +4 -1
  275. package/dist/protected-action-D8x73IGm.d.ts +58 -0
  276. package/dist/protected-action-DUYqb-Ma.js +80 -0
  277. package/dist/{protected-DXE3cQYg.js → protected-action-QEA8arRB.js} +48 -14
  278. package/dist/{provider-BQsTYYy0.js → provider-C55OGXJ7.js} +5 -4
  279. package/dist/{provider-Csk-THAn.d.ts → provider-DfLeek9O.d.ts} +1 -1
  280. package/dist/{provider-store-IgqQipCO.js → provider-store-CaTv00tr.js} +13 -9
  281. package/dist/{pull-CN5OLxrF.js → pull-2nJr0qg_.js} +12 -11
  282. package/dist/pull-C3EEGzSw.js +1 -0
  283. package/dist/{push-tVdG8dUL.js → push-Bn-lMEmI.js} +19 -13
  284. package/dist/{pushed-policy-CmYeSQqq.js → pushed-policy-CDuOL2de.js} +10 -7
  285. package/dist/{pushed-policy-BbcY9r_4.d.ts → pushed-policy-CryQheKq.d.ts} +12 -6
  286. package/dist/react/index.d.ts +9 -8
  287. package/dist/react/index.js +7 -6
  288. package/dist/react/provider-client.d.ts +1 -1
  289. package/dist/react/provider-client.js +1 -1
  290. package/dist/react-native/index.d.ts +94 -55
  291. package/dist/react-native/index.js +200 -61
  292. package/dist/{refs-CNJBiTFo.js → refs-C8BKxc_e.js} +2 -2
  293. package/dist/{relation-walk-3OyDBF0S.js → relation-walk-DK_gkgL7.js} +12 -9
  294. package/dist/{relations-BnCWnJGI.js → relations-BxvRvDHK.js} +3 -3
  295. package/dist/{replay-Du1tJjG7.js → replay-BU09ad4L.js} +1 -1
  296. package/dist/{replay-DCDD_ZfL.d.ts → replay-Bs9Df2fQ.d.ts} +1 -1
  297. package/dist/{request-context-BykKLmyE.js → request-context-Duzdf0cd.js} +8 -8
  298. package/dist/{request-schema-CMreVuFM.js → request-schema-DhX7UbfQ.js} +4 -1
  299. package/dist/resend/index.d.ts +34 -28
  300. package/dist/resend/index.js +29 -29
  301. package/dist/resolve-names-ConCSj1y.js +201 -0
  302. package/dist/{resource-relations-D_jw0BFx.js → resource-relations-8-pCScBO.js} +18 -9
  303. package/dist/{retire-Wj6dkyDE.js → retire-B2xffQgY.js} +15 -6
  304. package/dist/{revocations-R07lFBnX.d.ts → revocations-BaUXHM1N.d.ts} +6 -3
  305. package/dist/{rls-Ck_PocSp.js → rls-Ba9wN0SP.js} +13 -6
  306. package/dist/{rls-CxBZb4rZ.js → rls-Cx0dtsB7.js} +310 -128
  307. package/dist/{role-builder-C1VJzvcr.js → role-builder-BK2-T6oD.js} +41 -20
  308. package/dist/{row-conditions-h2HythXQ.js → row-conditions-BAGHOmVq.js} +4 -3
  309. package/dist/{rpc-Bk1bE-ch.js → rpc-vHIwyXCp.js} +8 -5
  310. package/dist/run-Ck22anC2.js +1 -0
  311. package/dist/{run-uLD2aWuO.js → run-PbRlXTfh.js} +26 -23
  312. package/dist/{run-ticket-BpNi7BCi.d.ts → run-ticket-B2o2Kxz8.d.ts} +29 -14
  313. package/dist/{run-ticket-B5d_63Ma.js → run-ticket-Dv7aF7Dk.js} +9 -9
  314. package/dist/{runtime-Vif3_-zf.js → runtime-BGnrOkVH.js} +5 -2
  315. package/dist/{saas-Az_Kz-4D.js → saas-DK4V-3Is.js} +42 -29
  316. package/dist/{scan-DSljDE1Y.js → scan-CRTj6fke.js} +1 -1
  317. package/dist/{schema-B4v0Qrac.js → schema-BOJjqlWL.js} +3 -2
  318. package/dist/{schema-gIcCx7zM.js → schema-BTsE1WRT.js} +8 -4
  319. package/dist/scim/index.d.ts +2 -2
  320. package/dist/scim/index.js +2 -2
  321. package/dist/{scim-C7JYhySg.js → scim-D8YupzX1.js} +2 -2
  322. package/dist/{scim-YNieBO1U.js → scim-jJBJ7g1Z.js} +33 -15
  323. package/dist/{scopes-BHsc-wp-.js → scopes-0Up_UA2t.js} +41 -23
  324. package/dist/server/index.d.ts +11 -11
  325. package/dist/server/index.js +12 -12
  326. package/dist/{server-Bnga6I50.js → server-3cVlTLde.js} +31 -31
  327. package/dist/{server-types-C4gZUEZy.d.ts → server-types-CyRN0-Cd.d.ts} +88 -46
  328. package/dist/{sha256-D9ihqmvd.js → sha256-C-4WXKIu.js} +4 -3
  329. package/dist/{shared-fMKOv8hP.js → shared-Afctg7B0.js} +65 -32
  330. package/dist/{shared-C8LjUdVU.js → shared-l0oGGetg.js} +9 -6
  331. package/dist/{signals-D3NcTKUS.js → signals-B1vHR3fN.js} +2 -2
  332. package/dist/{sink-Cp_Eot9W.d.ts → sink-B5zoUW_O.d.ts} +44 -20
  333. package/dist/{sink-BEZSlMS_.js → sink-D9_vh372.js} +32 -21
  334. package/dist/{skills-g_3BS9NC.js → skills-C9uKfSF5.js} +3 -3
  335. package/dist/{skills-Dcjw9_1C.js → skills-CQQcuGBi.js} +12 -8
  336. package/dist/{snapshot-CbGmYiJx.js → snapshot-CXlzi69u.js} +21 -18
  337. package/dist/{snapshot-cache-Pahd3IYJ.d.ts → snapshot-cache-BjAWkchD.d.ts} +21 -12
  338. package/dist/{snapshot-cache-DT2Kx1F8.js → snapshot-cache-Bx_4xC_6.js} +14 -11
  339. package/dist/solid/index.d.ts +55 -16
  340. package/dist/solid/index.js +46 -12
  341. package/dist/solid-start/index.d.ts +30 -12
  342. package/dist/solid-start/index.js +3 -3
  343. package/dist/{sources-B-zYB4GS.js → sources-CMAM-2A3.js} +46 -27
  344. package/dist/{sources-DEEuGb8S.d.ts → sources-CWG32C0G.d.ts} +126 -53
  345. package/dist/{sql-B96movIM.js → sql-0WjxIp9g.js} +28 -7
  346. package/dist/{sql-CDEPCA0g.d.ts → sql-B80DFdpG.d.ts} +2 -2
  347. package/dist/{src-DLFrtrrC.js → src-C_pi2Rnh.js} +292 -101
  348. package/dist/ssf/index.d.ts +3 -3
  349. package/dist/ssf/index.js +47 -35
  350. package/dist/{standard-webhooks-DgFFD-Ga.js → standard-webhooks-D67a3nzk.js} +5 -5
  351. package/dist/{standard-webhooks-B_qRg0ws.d.ts → standard-webhooks-DOYEuOLx.d.ts} +7 -7
  352. package/dist/{store-DSP9oGvh.js → store-RNFvaJJv.js} +32 -26
  353. package/dist/{store-options-B_poyYvg.js → store-options-Dil3lraY.js} +105 -15
  354. package/dist/stores-DZJvxFIZ.d.ts +59 -0
  355. package/dist/{stores-BqEuHC05.js → stores-DxZWDXCs.js} +42 -5
  356. package/dist/{stream-2Vwhl7Er.d.ts → stream-9y9qw51m.d.ts} +4 -3
  357. package/dist/{stream-CvdUS9V1.js → stream-CDvF0sJm.js} +5 -5
  358. package/dist/{style-Ds1gNm77.js → style-DblOtSga.js} +1 -1
  359. package/dist/{style-Cqo7-73x.js → style-Ds11Hmk4.js} +2 -1
  360. package/dist/{subject-settings-CkEwrw3W.js → subject-settings-8sH5HlII.js} +8 -4
  361. package/dist/{row-check-Dt35czLy.d.ts → subject-settings-vNW8qmUH.d.ts} +30 -18
  362. package/dist/supabase/index.d.ts +48 -38
  363. package/dist/supabase/index.js +5 -5
  364. package/dist/supabase/middleware.d.ts +19 -13
  365. package/dist/supabase/middleware.js +7 -7
  366. package/dist/{supabase--0aJdLEd.js → supabase-DnMMg5Fn.js} +79 -35
  367. package/dist/{supabase-Bqp7iIY2.js → supabase-SBs3MYUE.js} +3 -3
  368. package/dist/supabase-hook-C0FyEACZ.js +1 -0
  369. package/dist/{supabase-hook-Dg0SrQWR.js → supabase-hook-CrgU06WH.js} +175 -196
  370. package/dist/{supautils-MESd81bF.js → supautils-ByezN3b8.js} +385 -219
  371. package/dist/{support-session-Cna49-3f.js → support-session-BsmPCbz8.js} +21 -21
  372. package/dist/svelte/PermissionBoundary.svelte +2 -6
  373. package/dist/svelte/Protected.svelte +2 -8
  374. package/dist/svelte/index.d.ts +9 -8
  375. package/dist/svelte/index.js +10 -9
  376. package/dist/svelte/runtime.d.ts +4 -4
  377. package/dist/svelte/runtime.js +4 -4
  378. package/dist/svelte/source.d.ts +9 -8
  379. package/dist/svelte/source.js +6 -5
  380. package/dist/sveltekit/index.d.ts +30 -12
  381. package/dist/sveltekit/index.js +2 -2
  382. package/dist/{ownership-Z2LpxsGa.js → tables-BqrxBCir.js} +641 -1104
  383. package/dist/tanstack-start/index.d.ts +22 -10
  384. package/dist/tanstack-start/index.js +2 -2
  385. package/dist/{target-Bw37TFNA.js → target-qdEAnnhU.js} +6 -6
  386. package/dist/{tenancy-CmeBQ6Nv.js → tenancy-5d1zVBvK.js} +25 -19
  387. package/dist/terminal/index.d.ts +23 -14
  388. package/dist/terminal/index.js +17 -20
  389. package/dist/testing/core.d.ts +1 -1
  390. package/dist/testing/core.js +1 -1
  391. package/dist/testing/fixtures/index.d.ts +8 -5
  392. package/dist/testing/fixtures/index.js +78 -17
  393. package/dist/testing/index.d.ts +225 -141
  394. package/dist/testing/index.js +352 -234
  395. package/dist/testing/saas/index.d.ts +43 -27
  396. package/dist/testing/saas/index.js +2 -2
  397. package/dist/testing/saas/permissions.d.ts +1 -1
  398. package/dist/testing/saas/permissions.js +1 -1
  399. package/dist/{text-diff-DhITNCnD.js → text-diff-BtfSmdUo.js} +2 -2
  400. package/dist/{thenable-yD7SabqG.js → thenable-BNSM1U2R.js} +12 -3
  401. package/dist/{time-DkWjdL98.js → time-nR1JesoH.js} +32 -8
  402. package/dist/{token-2qYDvXz2.js → token-DC9EQiet.js} +14 -12
  403. package/dist/{tool-refusal-reAhIzdl.js → tool-refusal-Qpjs_W6M.js} +5 -2
  404. package/dist/trpc/index.d.ts +11 -8
  405. package/dist/trpc/index.js +15 -9
  406. package/dist/type-helpers-c7Xo_2Cu.d.ts +50 -0
  407. package/dist/{types-CfiKC5aN.d.ts → types-B2efzoSX.d.ts} +14 -11
  408. package/dist/{types-CIeZcG8v.d.ts → types-B6ExllNo.d.ts} +2 -2
  409. package/dist/{types-DBHftjgS.d.ts → types-BB-zWDcR.d.ts} +45 -33
  410. package/dist/{types-BfVmNJO5.d.ts → types-BMVDHvI0.d.ts} +128 -50
  411. package/dist/{types-DXmwu78Z.d.ts → types-CEinc15V.d.ts} +31 -14
  412. package/dist/{types-g7Oy6Zg4.d.ts → types-CN0LsqbK.d.ts} +47 -24
  413. package/dist/{types-CeIscIKp.d.ts → types-CWBsAwqn.d.ts} +23 -12
  414. package/dist/{types-DqzsnlSA.js → types-CcUXciSj.js} +17 -5
  415. package/dist/{types-BWZybqs9.d.ts → types-CzOeVvcC.d.ts} +384 -203
  416. package/dist/{types-DC44-hqb.d.ts → types-DLvhVm1r.d.ts} +59 -32
  417. package/dist/{types-D3A19w4A.d.ts → types-DlelvQk4.d.ts} +22 -13
  418. package/dist/{types-cTos-H7p.d.ts → types-DsHGPtkR.d.ts} +68 -32
  419. package/dist/{types-BXMYB7BY.d.ts → types-ZzRGoViD.d.ts} +77 -24
  420. package/dist/{types-CQVEQawv.d.ts → types-rCRV4Ge-.d.ts} +24 -14
  421. package/dist/types-tQB2CEnY.d.ts +262 -0
  422. package/dist/unplugin/index.d.ts +1 -1
  423. package/dist/unplugin/index.js +2 -2
  424. package/dist/usage-0hjZPIRX.js +1 -0
  425. package/dist/{usage-Bybmck7f.js → usage-B9EtHWLa.js} +50 -26
  426. package/dist/{usage-CDaLXCfL.js → usage-CBzgwfIs.js} +2 -2
  427. package/dist/{validation-error-ZfUHbKvf.js → validation-error-CYg2kJEw.js} +4 -1
  428. package/dist/{validation-error-CQpoquwj.d.ts → validation-error-uvp-kyfO.d.ts} +5 -2
  429. package/dist/{validity-CZ7-y0Cj.js → validity-Buc7w8E9.js} +13 -10
  430. package/dist/{verifier-DHuh-okk.js → verifier-DUV6pLqZ.js} +10 -4
  431. package/dist/{verify-pe8rL_Qw.js → verify-DlUcTDBz.js} +148 -487
  432. package/dist/version-DMQ0dnN5.js +48 -0
  433. package/dist/version-DizhmD72.js +1 -0
  434. package/dist/{views-BB8E9dTP.js → views-CD8wuL4Z.js} +19 -6
  435. package/dist/{vocabulary-Bg3eeT2H.d.ts → vocabulary-DEJ5j4mR.d.ts} +7 -4
  436. package/dist/vue/index.d.ts +71 -22
  437. package/dist/vue/index.js +50 -13
  438. package/dist/{waiter-DwEyouan.d.ts → waiter-CqUKX6CY.d.ts} +13 -10
  439. package/dist/{waiter-BGUtGYoU.js → waiter-aBLM63_f.js} +1 -1
  440. package/dist/{watch-C-4VmFlL.js → watch-BFDKqmUa.js} +8 -8
  441. package/dist/watch-ClLuO2TL.js +1 -0
  442. package/dist/webmcp/index.d.ts +11 -11
  443. package/dist/webmcp/index.js +8 -5
  444. package/dist/{where-scope-wq2coopv.js → where-scope-DlCdCM_8.js} +24 -18
  445. package/dist/{who-can-BwNsI_Js.js → who-can-BoDJm0Nc.js} +23 -20
  446. package/dist/workflow/index.d.ts +3 -3
  447. package/dist/workflow/index.js +13 -13
  448. package/dist/workflow-sdk/index.d.ts +19 -13
  449. package/dist/workflow-sdk/index.js +6 -6
  450. package/dist/{wrap-CiSc_KCq.js → wrap-B2wziJI_.js} +4 -4
  451. package/dist/{wrap-B6R0cMRL.d.ts → wrap-DxXB54Wu.d.ts} +8 -5
  452. package/package.json +8 -8
  453. package/schemas/catalog-v1.json +3 -0
  454. package/schemas/supabase-manifest-v1.json +33 -1
  455. package/skills/permdock-credentials/references/tokens-keys-links.md +8 -6
  456. package/skills/permdock-data/references/queries-and-rls.md +2 -1
  457. package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +2 -2
  458. package/skills/permdock-wire/references/adapters.md +16 -23
  459. package/dist/catalog-BCCjSAdH.js +0 -1
  460. package/dist/collect-k_Dulxr5.js +0 -1
  461. package/dist/config-CoQHDrDi.js +0 -166
  462. package/dist/denied-text-D4qkEtFz.d.ts +0 -19
  463. package/dist/fields-ClcQLrVc.js +0 -238
  464. package/dist/generate-CNU1pIOo.js +0 -171
  465. package/dist/headers-BIjfMaoC.js +0 -8
  466. package/dist/headers-CIbDTUTK.d.ts +0 -7
  467. package/dist/load-DrMHXzgN.js +0 -1
  468. package/dist/output-files-DPAY7-GX.js +0 -1
  469. package/dist/package-root-Dk_ETdkp.js +0 -31
  470. package/dist/parse-local-manifest-e4mdwAKd.d.ts +0 -10
  471. package/dist/policies-B2lZIurj.js +0 -295
  472. package/dist/powersync-CExtTLyA.js +0 -1
  473. package/dist/problem-details-Tcfmj3bV.d.ts +0 -7
  474. package/dist/protected-BwZYL1X_.d.ts +0 -39
  475. package/dist/pull-Cty6Ovyu.js +0 -1
  476. package/dist/run-Bz7DXGEv.js +0 -1
  477. package/dist/stores-BAZwSYZA.d.ts +0 -31
  478. package/dist/supabase-hook-DJxC4PoP.js +0 -1
  479. package/dist/types-CKV71kKh.d.ts +0 -172
  480. package/dist/usage-y-kBNdqs.js +0 -1
  481. package/dist/version-CEbQ5UeM.js +0 -18
  482. package/dist/version-DXkYUISx.js +0 -1
  483. package/dist/watch-Bd9mx3rd.js +0 -1
@@ -0,0 +1,827 @@
1
+ import { r as isRecord } from "./compact-CAf557ZB.js";
2
+ import { t as DESCRIBE_TITLES } from "./describe-Bb4hGK5d.js";
3
+ import { c as listPermissions } from "./permission-registry-B8tYxPIt.js";
4
+ import { f as scopeList } from "./scopes-0Up_UA2t.js";
5
+ import { v as listRoles } from "./grantee-Dke-9rd1.js";
6
+ import { t as byCodePoint } from "./compare-DTfyUunF.js";
7
+ import { i as configError, n as CliError } from "./errors-Vpu6rKHl.js";
8
+ import { c as jsonSchemaOf } from "./catalog-doc-DjMKzJp9.js";
9
+ import { c as requirePolicy } from "./load-DjSU5KXO.js";
10
+ import { t as loadConfiguredOperations } from "./catalog-operations-DeHTrJSV.js";
11
+ import { n as fileSummary, r as planFiles } from "./files-B3AA05f1.js";
12
+ import { f as writeOutputFiles, r as driftOf } from "./output-files-BIQ_9pIs.js";
13
+ import { t as resolveNames } from "./resolve-names-ConCSj1y.js";
14
+ import { i as schemaExpression } from "./generate-CezbCaTI.js";
15
+ import { existsSync, readFileSync } from "node:fs";
16
+ import { dirname, extname, relative, resolve } from "node:path";
17
+ //#region src/cli/gen/model.ts
18
+ /** `org.post` to `orgPost`, `quote-files` to `quoteFiles`. */
19
+ function camelCase(name) {
20
+ const joined = name.split(/[^A-Za-z0-9]+/u).filter((word) => word !== "").map((word, index) => index === 0 ? `${word.charAt(0).toLowerCase()}${word.slice(1)}` : `${word.charAt(0).toUpperCase()}${word.slice(1)}`).join("");
21
+ return /^[0-9]/u.test(joined) ? `_${joined}` : joined;
22
+ }
23
+ function pascalCase(name) {
24
+ const camel = camelCase(name);
25
+ return `${camel.charAt(0).toUpperCase()}${camel.slice(1)}`;
26
+ }
27
+ function unique(kind, items) {
28
+ const seen = /* @__PURE__ */ new Map();
29
+ for (const item of items) {
30
+ const other = seen.get(item.ident);
31
+ if (other !== void 0) throw configError(`PermDock CLI: ${kind} '${other}' and '${item.name}' both generate the name '${item.ident}'; rename one of them`);
32
+ if (item.ident === "") throw configError(`PermDock CLI: ${kind} '${item.name}' has no letters or digits to name it by`);
33
+ seen.set(item.ident, item.name);
34
+ }
35
+ return items;
36
+ }
37
+ function isNullType(value) {
38
+ return isRecord(value) && value["type"] === "null";
39
+ }
40
+ /**
41
+ * `anyOf: [T, { type: 'null' }]`, which Zod and Valibot write for a nullable
42
+ * field, folded into `T` with `null` in `type` (and `enum`), so every kind
43
+ * reads one shape.
44
+ */
45
+ function foldNullable(schema) {
46
+ const options = schema["anyOf"];
47
+ let node = schema;
48
+ if (Array.isArray(options) && options.length === 2) {
49
+ const other = options.find((option) => !isNullType(option));
50
+ if (options.some(isNullType) && isRecord(other)) {
51
+ const { anyOf: _, ...rest } = schema;
52
+ const type = other["type"];
53
+ const values = other["enum"];
54
+ node = {
55
+ ...rest,
56
+ ...other,
57
+ ...typeof type === "string" ? { type: [type, "null"] } : {},
58
+ ...Array.isArray(values) ? { enum: [...values, null] } : {}
59
+ };
60
+ }
61
+ }
62
+ const properties = node["properties"];
63
+ const items = node["items"];
64
+ return {
65
+ ...node,
66
+ ...isRecord(properties) ? { properties: Object.fromEntries(Object.entries(properties).map(([name, child]) => [name, isRecord(child) ? foldNullable(child) : child])) } : {},
67
+ ...isRecord(items) ? { items: foldNullable(items) } : {}
68
+ };
69
+ }
70
+ function schemaOf(value) {
71
+ return isRecord(value) ? foldNullable(value) : void 0;
72
+ }
73
+ function genResource(node) {
74
+ const title = node.meta?.title;
75
+ return {
76
+ name: node.name,
77
+ ident: camelCase(node.name),
78
+ schema: schemaOf(jsonSchemaOf(node)),
79
+ ...node.parent === void 0 ? {} : { parent: {
80
+ field: node.parent.field,
81
+ resource: node.parent.resource
82
+ } },
83
+ ...title === void 0 ? {} : { title }
84
+ };
85
+ }
86
+ function genOperation(operation, resourceOf) {
87
+ const results = operation.results === void 0 ? void 0 : resourceOf.get(operation.results);
88
+ return {
89
+ name: operation.name,
90
+ ident: camelCase(operation.name),
91
+ ...results === void 0 ? {} : { results }
92
+ };
93
+ }
94
+ function genModel(input) {
95
+ const { policy, config } = input;
96
+ const leaves = listPermissions(policy.vocabulary.permissions);
97
+ const resourceOf = new Map(leaves.map((leaf) => [leaf.key, leaf.resource]));
98
+ const declaredRoles = listRoles(policy.vocabulary.roles);
99
+ const roleTitles = new Map(declaredRoles.map((role) => [role.key, role.meta.title ?? role.key]));
100
+ const resources = [...policy.resources.values()].map(genResource).toSorted((a, b) => byCodePoint(a.name, b.name));
101
+ const operations = (input.operations ?? []).map((operation) => genOperation(operation, resourceOf)).toSorted((a, b) => byCodePoint(a.name, b.name));
102
+ const roles = [.../* @__PURE__ */ new Set([...policy.roles.map((binding) => binding.name), ...declaredRoles.map((role) => role.key)])].toSorted(byCodePoint);
103
+ return {
104
+ resources: unique("resource", resources),
105
+ operations: unique("operation", operations),
106
+ scopes: scopeList(policy.scopes),
107
+ roles,
108
+ names: resolveNames(policy, config),
109
+ topics: Object.keys(config.rls?.realtime?.topics ?? {}).toSorted(byCodePoint),
110
+ buckets: Object.entries(config.rls?.storage?.buckets ?? {}).toSorted(([a], [b]) => byCodePoint(a, b)),
111
+ labels: {
112
+ permissions: leaves.map((leaf) => [leaf.key, leaf.meta.title ?? leaf.key]).toSorted(([a], [b]) => byCodePoint(a, b)),
113
+ roles: roles.map((role) => [role, roleTitles.get(role) ?? role])
114
+ }
115
+ };
116
+ }
117
+ //#endregion
118
+ //#region src/cli/gen/schemas.ts
119
+ const GENERATED = "// @generated by permdock gen; do not edit";
120
+ const IDENTIFIER$2 = /^[A-Za-z_$][A-Za-z0-9_$]*$/u;
121
+ const MAX_DEPTH = 6;
122
+ const FIELD_BOUNDS = [
123
+ "minimum",
124
+ "maximum",
125
+ "exclusiveMinimum",
126
+ "exclusiveMaximum",
127
+ "minLength",
128
+ "maxLength",
129
+ "minItems",
130
+ "maxItems"
131
+ ];
132
+ function typed(model) {
133
+ return model.resources.filter((resource) => resource.schema !== void 0);
134
+ }
135
+ function propertyKey(name) {
136
+ return IDENTIFIER$2.test(name) ? name : JSON.stringify(name);
137
+ }
138
+ /** `createdAt` and `created_at` read as `Created at`. */
139
+ function labelOf(name) {
140
+ const sentence = name.replaceAll(/([a-z0-9])([A-Z])/gu, "$1 $2").split(/[^A-Za-z0-9]+/u).filter((word) => word !== "").map((word) => word.toLowerCase()).join(" ");
141
+ return `${sentence.charAt(0).toUpperCase()}${sentence.slice(1)}`;
142
+ }
143
+ function properties(schema) {
144
+ const required = new Set(Array.isArray(schema["required"]) ? schema["required"] : []);
145
+ const props = isRecord(schema["properties"]) ? schema["properties"] : {};
146
+ return Object.entries(props).filter((entry) => isRecord(entry[1])).map(([name, child]) => [
147
+ name,
148
+ child,
149
+ required.has(name)
150
+ ]);
151
+ }
152
+ /** Per field: label, required, enum options, format and bounds, for forms. */
153
+ function fieldMeta(schema) {
154
+ return Object.fromEntries(properties(schema).map(([name, child, required]) => {
155
+ const title = child["title"];
156
+ const options = child["enum"];
157
+ const format = child["format"];
158
+ const meta = {
159
+ label: typeof title === "string" ? title : labelOf(name),
160
+ required
161
+ };
162
+ const type = child["type"];
163
+ if (Array.isArray(type) && type.includes("null")) meta["nullable"] = true;
164
+ if (Array.isArray(options)) meta["options"] = options.filter((option) => option !== null);
165
+ if (typeof format === "string") meta["format"] = format;
166
+ for (const key of FIELD_BOUNDS) {
167
+ const value = child[key];
168
+ if (typeof value === "number") meta[key] = value;
169
+ }
170
+ return [name, meta];
171
+ }));
172
+ }
173
+ function fieldsExport(resource) {
174
+ return `export const ${resource.ident}Fields = ${JSON.stringify(fieldMeta(resource.schema), null, 2)} as const;`;
175
+ }
176
+ const IMPORTS = {
177
+ zod: "import { z } from \"zod\";",
178
+ valibot: "import * as v from \"valibot\";",
179
+ arktype: "import { type } from \"arktype\";"
180
+ };
181
+ function inferType(kind, ident) {
182
+ switch (kind) {
183
+ case "zod": return `z.infer<typeof ${ident}>`;
184
+ case "valibot": return `v.InferOutput<typeof ${ident}>`;
185
+ case "arktype": return `typeof ${ident}.infer`;
186
+ default: return kind;
187
+ }
188
+ }
189
+ function arrayOf(kind, ident) {
190
+ switch (kind) {
191
+ case "zod": return `z.array(${ident})`;
192
+ case "valibot": return `v.array(${ident})`;
193
+ case "arktype": return `${ident}.array()`;
194
+ default: return kind;
195
+ }
196
+ }
197
+ function resultsOf(model) {
198
+ const byName = new Map(typed(model).map((resource) => [resource.name, resource]));
199
+ return model.operations.flatMap((operation) => {
200
+ const resource = operation.results === void 0 ? void 0 : byName.get(operation.results);
201
+ return resource === void 0 ? [] : [[operation.ident, resource]];
202
+ });
203
+ }
204
+ /**
205
+ * `zod`, `valibot` or `arktype`: a row schema per resource and a result schema
206
+ * per operation.
207
+ */
208
+ function validatorModule(kind, model, options) {
209
+ const blocks = typed(model).map((resource) => {
210
+ const ident = `${resource.ident}Row`;
211
+ const lines = [`export const ${ident} = ${schemaExpression(kind, resource.schema, void 0, { constraints: true })};`, `export type ${pascalCase(resource.name)}Row = ${inferType(kind, ident)};`];
212
+ return options.fieldMeta ? [
213
+ ...lines,
214
+ "",
215
+ fieldsExport(resource)
216
+ ].join("\n") : lines.join("\n");
217
+ });
218
+ const results = resultsOf(model).map(([operation, resource]) => `export const ${operation}Result = ${arrayOf(kind, `${resource.ident}Row`)};`);
219
+ return `${[
220
+ GENERATED,
221
+ IMPORTS[kind],
222
+ ...blocks,
223
+ ...results
224
+ ].join("\n\n")}\n`;
225
+ }
226
+ function literalType(value) {
227
+ return value === null || typeof value === "string" || typeof value === "number" || typeof value === "boolean" ? JSON.stringify(value) : "unknown";
228
+ }
229
+ /** A TypeScript type for the portable JSON Schema core. */
230
+ function typeOf(schema, depth = 0) {
231
+ const values = schema["enum"];
232
+ if (Array.isArray(values) && values.length > 0) return values.map(literalType).join(" | ");
233
+ const raw = schema["type"];
234
+ const types = Array.isArray(raw) ? raw : [raw];
235
+ const nullable = types.includes("null");
236
+ const named = types.filter((type) => typeof type === "string" && type !== "null");
237
+ const base = depth > MAX_DEPTH || named.length !== 1 ? isRecord(schema["properties"]) && named.length === 0 ? objectType(schema, depth) : "unknown" : primitiveType(schema, named[0], depth);
238
+ return nullable && base !== "unknown" ? `${base} | null` : base;
239
+ }
240
+ function objectType(schema, depth) {
241
+ const fields = properties(schema).map(([name, child, required]) => `readonly ${propertyKey(name)}${required ? "" : "?"}: ${typeOf(child, depth + 1)}`);
242
+ return fields.length === 0 ? "{}" : `{ ${fields.join("; ")} }`;
243
+ }
244
+ function primitiveType(schema, type, depth) {
245
+ switch (type) {
246
+ case "string": return "string";
247
+ case "number":
248
+ case "integer": return "number";
249
+ case "boolean": return "boolean";
250
+ case "array": return `readonly (${isRecord(schema["items"]) ? typeOf(schema["items"], depth + 1) : "unknown"})[]`;
251
+ case "object": return objectType(schema, depth);
252
+ default: return "unknown";
253
+ }
254
+ }
255
+ /**
256
+ * `standard-schema`: validators over the JSON Schema core through
257
+ * `permdock/catalog`, so the project needs no schema library.
258
+ */
259
+ function standardSchemaModule(model, options) {
260
+ const blocks = typed(model).map((resource) => {
261
+ const lines = [`export type ${pascalCase(resource.name)}Row = ${typeOf(resource.schema)};`, `export const ${resource.ident}Row = resourceSchemaFromJson(${JSON.stringify(resource.schema)});`];
262
+ return options.fieldMeta ? [
263
+ ...lines,
264
+ "",
265
+ fieldsExport(resource)
266
+ ].join("\n") : lines.join("\n");
267
+ });
268
+ const results = resultsOf(model).map(([operation, resource]) => `export const ${operation}Result = resourceSchemaFromJson(${JSON.stringify({
269
+ type: "array",
270
+ items: resource.schema
271
+ })});`);
272
+ return `${[
273
+ GENERATED,
274
+ "import { resourceSchemaFromJson } from \"permdock/catalog\";",
275
+ ...blocks,
276
+ ...results
277
+ ].join("\n\n")}\n`;
278
+ }
279
+ /** `json-schema`: the row documents as they are, results as `$ref` arrays. */
280
+ function jsonSchemaDocument(model) {
281
+ const document = {
282
+ $comment: "@generated by permdock gen; do not edit",
283
+ resources: Object.fromEntries(typed(model).map((resource) => [resource.name, resource.schema])),
284
+ operations: Object.fromEntries(resultsOf(model).map(([operation, resource]) => [operation, { results: {
285
+ type: "array",
286
+ items: { $ref: `#/resources/${resource.name.replaceAll("~", "~0").replaceAll("/", "~1")}` }
287
+ } }]))
288
+ };
289
+ return `${JSON.stringify(document, null, 2)}\n`;
290
+ }
291
+ //#endregion
292
+ //#region src/cli/gen/constants.ts
293
+ const IDENTIFIER$1 = /^[A-Za-z_$][A-Za-z0-9_$]*$/u;
294
+ const PLACEHOLDER = /\{([^{}]+)\}/gu;
295
+ function key$1(name) {
296
+ return IDENTIFIER$1.test(name) ? name : JSON.stringify(name);
297
+ }
298
+ function read(name) {
299
+ return IDENTIFIER$1.test(name) ? `params.${name}` : `params[${JSON.stringify(name)}]`;
300
+ }
301
+ /** Text for inside a template literal. */
302
+ function templateText(text) {
303
+ return text.replaceAll("\\", "\\\\").replaceAll("`", "\\`").replaceAll("${", "\\${");
304
+ }
305
+ function builder(params, body) {
306
+ return `(params: { ${params.map((name) => `readonly ${key$1(name)}: string`).join("; ")} }): string => \`${body}\``;
307
+ }
308
+ function distinct(kind, entries) {
309
+ const seen = /* @__PURE__ */ new Map();
310
+ const lines = [];
311
+ for (const [ident, source, code] of entries) {
312
+ const other = seen.get(ident);
313
+ if (other !== void 0) throw configError(`PermDock CLI: ${kind} '${other}' and '${source}' both generate the builder '${ident}'; rename one of them`);
314
+ seen.set(ident, source);
315
+ lines.push(` ${key$1(ident)}: ${code},`);
316
+ }
317
+ return lines.length === 0 ? "{}" : `{\n${lines.join("\n")}\n}`;
318
+ }
319
+ /**
320
+ * `org:{organization}:quotes` to `orgQuotes`, building
321
+ * `org:${organization}:quotes`.
322
+ */
323
+ function topicBuilder(topic) {
324
+ const params = [...topic.matchAll(PLACEHOLDER)].map((match) => String(match[1]));
325
+ const camel = camelCase(topic.replaceAll(PLACEHOLDER, " "));
326
+ const ident = camel === "" ? camelCase(topic) : camel;
327
+ let body = "";
328
+ let last = 0;
329
+ for (const match of topic.matchAll(PLACEHOLDER)) {
330
+ body += `${templateText(topic.slice(last, match.index))}\${${read(String(match[1]))}}`;
331
+ last = match.index + match[0].length;
332
+ }
333
+ body += templateText(topic.slice(last));
334
+ return [
335
+ ident,
336
+ topic,
337
+ builder([...new Set(params)], body)
338
+ ];
339
+ }
340
+ /**
341
+ * A bucket's object path: `folder - 1` leading segments, the scope id, then
342
+ * `name`, as `storage.foldername(name)` reads it.
343
+ */
344
+ function pathBuilder(bucket, config) {
345
+ const params = [
346
+ ...Array.from({ length: Math.max(0, (config.folder ?? 1) - 1) }, (_, index) => `segment${String(index + 1)}`),
347
+ config.scope,
348
+ "name"
349
+ ];
350
+ const body = params.map((name) => `\${${read(name)}}`).join("/");
351
+ return [
352
+ camelCase(bucket),
353
+ bucket,
354
+ builder(params, body)
355
+ ];
356
+ }
357
+ function qualify(schema, name) {
358
+ return name.includes(".") ? name : `${schema}.${name}`;
359
+ }
360
+ /** Every helper name schema-qualified; tables and views keep their own schema. */
361
+ function sqlNames(names) {
362
+ const fn = (name) => qualify(names.schema, name);
363
+ const map = (entries, keep) => Object.fromEntries(Object.entries(entries).map(([name, helpers]) => [name, Object.fromEntries(Object.entries(helpers).map(([field, value]) => [field, keep.has(field) ? value : fn(value)]))]));
364
+ return {
365
+ schema: names.schema,
366
+ claims: names.claims,
367
+ scopes: map(names.scopes, /* @__PURE__ */ new Set()),
368
+ resources: map(names.resources, /* @__PURE__ */ new Set(["table", "visible"]))
369
+ };
370
+ }
371
+ function list(name, type, values) {
372
+ return `export const ${name} = ${JSON.stringify(values)} as const;
373
+ export type ${type} = (typeof ${name})[number];`;
374
+ }
375
+ /** `constants`: scope and role names, topic and path builders, SQL names. */
376
+ function constantsModule(model) {
377
+ return `${[
378
+ GENERATED,
379
+ list("scopes", "ScopeName", model.scopes.map((scope) => scope.name)),
380
+ list("roles", "RoleName", model.roles),
381
+ `/** \`rls.realtime.topics\`: the channel names the realtime policies match. */
382
+ export const topics = ${distinct("topic", model.topics.map(topicBuilder))} as const;`,
383
+ `/** \`rls.storage.buckets\`: object paths that start with a scope id. */
384
+ export const paths = ${distinct("bucket", model.buckets.map(([bucket, config]) => pathBuilder(bucket, config)))} as const;`,
385
+ `/** The SQL helpers \`rls generate\` writes. */
386
+ export const sqlNames = ${JSON.stringify(sqlNames(model.names), null, 2)} as const;`
387
+ ].join("\n\n")}\n`;
388
+ }
389
+ //#endregion
390
+ //#region src/cli/gen/factories.ts
391
+ const IDENTIFIER = /^[A-Za-z_$][A-Za-z0-9_$]*$/u;
392
+ function key(name) {
393
+ return IDENTIFIER.test(name) ? name : JSON.stringify(name);
394
+ }
395
+ function number(schema, name) {
396
+ const value = schema[name];
397
+ return typeof value === "number" && Number.isFinite(value) ? value : void 0;
398
+ }
399
+ function typeName(schema) {
400
+ const raw = schema["type"];
401
+ return (Array.isArray(raw) ? raw : [raw]).find((type) => typeof type === "string" && type !== "null") ?? (isRecord(schema["properties"]) ? "object" : void 0);
402
+ }
403
+ function numberValue(schema, integer) {
404
+ const step = integer ? 1 : .5;
405
+ const exclusive = number(schema, "exclusiveMinimum");
406
+ const minimum = number(schema, "minimum") ?? (exclusive === void 0 ? void 0 : exclusive + step);
407
+ const maximum = number(schema, "maximum");
408
+ const value = minimum ?? (maximum === void 0 ? 0 : Math.min(0, maximum));
409
+ return String(integer ? Math.ceil(value) : value);
410
+ }
411
+ /**
412
+ * A valid value for a required field: the first enum value, the lower bound, a
413
+ * sequence id.
414
+ */
415
+ function valueOf(schema, field, depth) {
416
+ const values = schema["enum"];
417
+ if (Array.isArray(values) && values.length > 0) return JSON.stringify(values[0]);
418
+ switch (typeName(schema) ?? "unknown") {
419
+ case "string": return stringValue(schema, field);
420
+ case "integer": return numberValue(schema, true);
421
+ case "number": return numberValue(schema, false);
422
+ case "boolean": return "false";
423
+ case "array": return "[]";
424
+ case "object": return depth > 4 ? "{}" : objectValue(schema, depth + 1, /* @__PURE__ */ new Map());
425
+ default: return "null";
426
+ }
427
+ }
428
+ function stringValue(schema, field) {
429
+ switch (schema["format"]) {
430
+ case "uuid": return "uuid()";
431
+ case "email": return "`user${String(next())}@example.com`";
432
+ case "date-time": return "\"2026-01-01T00:00:00.000Z\"";
433
+ case "date": return "\"2026-01-01\"";
434
+ case "uri": return "`https://example.com/${String(next())}`";
435
+ default: return `text(${JSON.stringify(field)}, ${String(number(schema, "minLength") ?? 0)}, ${String(number(schema, "maxLength") ?? 255)})`;
436
+ }
437
+ }
438
+ function objectValue(schema, depth, refs) {
439
+ const required = new Set(Array.isArray(schema["required"]) ? schema["required"] : []);
440
+ const properties = isRecord(schema["properties"]) ? schema["properties"] : {};
441
+ const fields = Object.entries(properties).filter((entry) => isRecord(entry[1])).filter(([name]) => required.has(name)).map(([name, child]) => {
442
+ const ref = typeName(child) === "string" ? refs.get(name) : void 0;
443
+ const fill = valueOf(child, name, depth);
444
+ return `${key(name)}: ${ref === void 0 ? fill : `refs.${ref} === undefined ? ${fill} : idOf(refs.${ref})`}`;
445
+ });
446
+ return fields.length === 0 ? "{}" : `{ ${fields.join(", ")} }`;
447
+ }
448
+ function requiredFields(schema) {
449
+ const required = Array.isArray(schema["required"]) ? schema["required"] : [];
450
+ const properties = isRecord(schema["properties"]) ? schema["properties"] : {};
451
+ return new Set(required.filter((name) => typeof name === "string" && isRecord(properties[name])));
452
+ }
453
+ /**
454
+ * Required field to the `refs` key that fills it: the parent resource, then
455
+ * each scope by its key.
456
+ */
457
+ function refsOf(resource, model) {
458
+ const fields = requiredFields(resource.schema);
459
+ const refs = /* @__PURE__ */ new Map();
460
+ if (resource.parent !== void 0 && fields.has(resource.parent.field)) refs.set(resource.parent.field, "parent");
461
+ for (const scope of model.scopes) if (scope.key !== void 0 && fields.has(scope.key) && IDENTIFIER.test(scope.name)) refs.set(scope.key, scope.name);
462
+ return refs;
463
+ }
464
+ function factory(resource, model) {
465
+ const row = `${pascalCase(resource.name)}Row`;
466
+ const refs = refsOf(resource, model);
467
+ const used = [...new Set(refs.values())].map((name) => `readonly ${name}?: Ref`);
468
+ const fill = objectValue(resource.schema, 0, refs);
469
+ const params = [`overrides: Partial<${row}> = {}`, ...used.length === 0 ? [] : [`refs: { ${used.join("; ")} } = {}`]];
470
+ return ` ${key(resource.ident)}: (${params.join(", ")}): ${row} => (${fill === "{}" ? "{ ...overrides }" : `{ ...${fill}, ...overrides }`}),`;
471
+ }
472
+ const RUNTIME = `let sequence = 0;
473
+
474
+ /** Restarts the ids and names, so a test reads the same rows on every run. */
475
+ export function resetFactories(): void {
476
+ sequence = 0;
477
+ }
478
+
479
+ function next(): number {
480
+ sequence += 1;
481
+ return sequence;
482
+ }
483
+
484
+ function uuid(): string {
485
+ return \`00000000-0000-4000-8000-\${String(next()).padStart(12, "0")}\`;
486
+ }
487
+
488
+ function text(field: string, min: number, max: number): string {
489
+ return \`\${field}-\${String(next())}\`.padEnd(min, "x").slice(0, max);
490
+ }
491
+
492
+ type Ref = string | { readonly id: string };
493
+
494
+ function idOf(ref: Ref): string {
495
+ return typeof ref === "string" ? ref : ref.id;
496
+ }`;
497
+ /**
498
+ * `factories`: a row builder per resource that fills the required fields with
499
+ * valid values, plus `subject` for a principal with typed roles and
500
+ * memberships.
501
+ */
502
+ function factoriesModule(model) {
503
+ const resources = model.resources.filter((resource) => resource.schema !== void 0);
504
+ const types = resources.map((resource) => `export type ${pascalCase(resource.name)}Row = ${typeOf(resource.schema)};`);
505
+ const roles = model.roles.map((role) => JSON.stringify(role)).join(" | ");
506
+ const scopes = model.scopes.map((scope) => JSON.stringify(scope.name)).join(" | ");
507
+ const subject = `export type FactoryMembership = {
508
+ readonly scope: ${scopes === "" ? "string" : scopes};
509
+ readonly id: string;
510
+ readonly roles: readonly (${roles === "" ? "string" : roles})[];
511
+ };
512
+
513
+ export type FactorySubject = Principal & {
514
+ readonly roles: readonly (${roles === "" ? "string" : roles})[];
515
+ readonly memberships: readonly FactoryMembership[];
516
+ };`;
517
+ const body = [...resources.map((resource) => factory(resource, model)), ` subject: (input: Partial<FactorySubject> = {}): FactorySubject => ({ id: uuid(), roles: [], memberships: [], ...input }),`];
518
+ return `${[
519
+ GENERATED,
520
+ "import type { Principal } from \"permdock\";",
521
+ RUNTIME,
522
+ ...types,
523
+ subject,
524
+ `export const factories = {\n${body.join("\n")}\n};`
525
+ ].join("\n\n")}\n`;
526
+ }
527
+ //#endregion
528
+ //#region src/cli/gen/hooks.ts
529
+ const BINDINGS = {
530
+ react: {
531
+ entry: "permdock/react",
532
+ instance: "usePermDock",
533
+ roles: "useRoles",
534
+ rolesParam: "AppRolesOptions"
535
+ },
536
+ vue: {
537
+ entry: "permdock/vue",
538
+ instance: "usePermDock",
539
+ roles: "useRoles",
540
+ rolesParam: "MaybeRefOrGetter<AppRolesOptions>",
541
+ frameworkType: "import type { MaybeRefOrGetter } from \"vue\";"
542
+ },
543
+ svelte: {
544
+ entry: "permdock/svelte",
545
+ instance: "getPermDock",
546
+ roles: "roles",
547
+ rolesParam: "() => AppRolesOptions"
548
+ },
549
+ solid: {
550
+ entry: "permdock/solid",
551
+ instance: "usePermDock",
552
+ roles: "useRoles",
553
+ rolesParam: "Accessor<AppRolesOptions>",
554
+ frameworkType: "import type { Accessor } from \"solid-js\";"
555
+ }
556
+ };
557
+ const JS_EXTENSION = {
558
+ ".ts": ".js",
559
+ ".tsx": ".js",
560
+ ".mts": ".mjs",
561
+ ".cts": ".cjs"
562
+ };
563
+ /**
564
+ * The specifier from the generated file to the policy module. A `.ts` source is
565
+ * named by its `.js` output, which both `bundler` and `nodenext` resolution map
566
+ * back to the source.
567
+ */
568
+ function policySpecifier(outFile, policy) {
569
+ const extension = extname(policy);
570
+ const target = `${policy.slice(0, policy.length - extension.length)}${JS_EXTENSION[extension] ?? extension}`;
571
+ const path = relative(dirname(outFile), target).split("\\").join("/");
572
+ return path.startsWith(".") ? path : `./${path}`;
573
+ }
574
+ /** One line when it fits the formatter's 80 columns, else a wrapped tail. */
575
+ function fitted(head, tail) {
576
+ const line = `${head} ${tail}`;
577
+ return line.length <= 80 ? line : `${head}\n ${tail}`;
578
+ }
579
+ /**
580
+ * A typed hook file for a UI adapter: the instance getter bound to
581
+ * `VocabularyOf<typeof policy>` and the roles reader narrowed to its scopes, so
582
+ * call sites need no generic; every other export passes through. It reaches the
583
+ * policy through `import type` only, so the client bundle never includes it.
584
+ */
585
+ function hooksModule(kind, specifier) {
586
+ const binding = BINDINGS[kind];
587
+ return `${[
588
+ GENERATED,
589
+ `import type { ScopeNameOf, VocabularyOf } from "permdock";
590
+ import type { ClientPermDock, RolesOptions } from "${binding.entry}";${binding.frameworkType === void 0 ? "" : `\n${binding.frameworkType}`}
591
+
592
+ import {
593
+ ${binding.instance} as ${binding.instance}Of,
594
+ ${binding.roles} as ${binding.roles}Of,
595
+ } from "${binding.entry}";
596
+
597
+ import type * as source from ${JSON.stringify(specifier)};`,
598
+ `type AppPolicy = typeof source extends { readonly policy: infer P }
599
+ ? P
600
+ : typeof source extends { readonly default: infer P }
601
+ ? P
602
+ : never;`,
603
+ `/** The configured policy's vocabulary: its permissions, roles and plans. */
604
+ export type AppVocabulary = VocabularyOf<AppPolicy>;`,
605
+ `/** A scope the configured policy declares. */
606
+ export type AppScope = ScopeNameOf<AppPolicy>;`,
607
+ `export type AppRolesOptions = Omit<RolesOptions, "scope"> & {
608
+ readonly scope?: AppScope;
609
+ };`,
610
+ fitted(`export const ${binding.instance}: () => ClientPermDock<AppVocabulary> =`, `${binding.instance}Of;`),
611
+ `export const ${binding.roles}: (
612
+ options?: ${binding.rolesParam},
613
+ ) => ReturnType<typeof ${binding.roles}Of> = ${binding.roles}Of;`,
614
+ `export * from "${binding.entry}";`
615
+ ].join("\n\n")}\n`;
616
+ }
617
+ //#endregion
618
+ //#region src/cli/gen/messages.ts
619
+ const REASONS = {
620
+ "no-grant": "No role grants this",
621
+ condition: "A condition did not match",
622
+ deny: "A deny rule applies",
623
+ "inactive-grant": "The grant is not active now",
624
+ "closure-error": "A condition failed to evaluate",
625
+ "opaque-condition": "Checked on the server",
626
+ "server-only": "Checked on the server",
627
+ anonymous: "Sign in first",
628
+ "not-delegated": "Not delegated to this agent",
629
+ "no-delegation": "The agent has no delegation",
630
+ "agent-tool-not-delegated": "This tool is not delegated to the agent",
631
+ "insufficient-user-authentication": "Verify your identity again",
632
+ "not-entitled": "Your plan does not include this",
633
+ purpose: "The stated purpose does not allow this",
634
+ "reason-required": "A reason is required",
635
+ "actor-required": "An actor is required",
636
+ limit: "The limit is reached",
637
+ "limit-unavailable": "The limit could not be checked",
638
+ "relation-depth": "The relation is too deep to check",
639
+ "relation-unavailable": "The relation could not be checked",
640
+ validation: "The input is not valid",
641
+ "tenant-mismatch": "This belongs to another workspace",
642
+ "no-membership": "You are not a member",
643
+ "no-tenant": "No workspace is selected",
644
+ scope: "Not available in this scope",
645
+ "expired-membership": "Your membership has expired",
646
+ "stale-credentials": "Your session is out of date",
647
+ "unknown-role": "The role is not known",
648
+ "last-holder": "The last holder cannot be removed",
649
+ "max-holders": "The role has its maximum holders",
650
+ "transfer-only": "The role can only be transferred",
651
+ "not-assignable-by": "You cannot assign this role",
652
+ "self-demotion": "You cannot demote yourself",
653
+ "externally-managed": "Managed by your identity provider",
654
+ "not-allowed-for-membership": "Not allowed for this membership",
655
+ "conflicting-role": "Conflicts with a role already held",
656
+ approval: "Approval is required",
657
+ "stale-approval": "The approval is out of date",
658
+ "pdp-denied": "The policy service denied this",
659
+ "pdp-unavailable": "The policy service is unavailable",
660
+ "pdp-invalid-response": "The policy service gave an invalid answer",
661
+ undocumented: "Not documented in the policy",
662
+ unsupported: "Not supported",
663
+ "exceeds-creator": "Exceeds your own access",
664
+ "credential-policy": "The credential policy does not allow this"
665
+ };
666
+ function kept(defaults, previous) {
667
+ const existing = isRecord(previous) ? previous : {};
668
+ return Object.fromEntries(Object.entries(defaults).map(([key, text]) => {
669
+ const translated = Object.hasOwn(existing, key) ? existing[key] : void 0;
670
+ return [key, typeof translated === "string" ? translated : text];
671
+ }));
672
+ }
673
+ function parsePrevious(rel, previous) {
674
+ if (previous === void 0) return {};
675
+ try {
676
+ return JSON.parse(previous);
677
+ } catch {
678
+ throw configError(`PermDock CLI: ${rel} is not valid JSON; fix or delete it before permdock gen rewrites it`);
679
+ }
680
+ }
681
+ /**
682
+ * A `DescribeMessages` skeleton: every `describe` title and denial reason, plus
683
+ * each permission's and role's title. A value already in the file is kept, so a
684
+ * translated file only gains the keys it lacks and loses the ones the policy
685
+ * dropped; `--check` reports both.
686
+ */
687
+ function messagesDocument(model, rel, previous) {
688
+ const parsed = parsePrevious(rel, previous);
689
+ const existing = isRecord(parsed) ? parsed : {};
690
+ const sections = {
691
+ titles: kept(DESCRIBE_TITLES, existing["titles"]),
692
+ reasons: kept(REASONS, existing["reasons"]),
693
+ permissions: kept(Object.fromEntries(model.labels.permissions), existing["permissions"]),
694
+ roles: kept(Object.fromEntries(model.labels.roles), existing["roles"])
695
+ };
696
+ return `${JSON.stringify(sections, null, 2)}\n`;
697
+ }
698
+ //#endregion
699
+ //#region src/cli/gen/gen.ts
700
+ const GEN_KINDS = [
701
+ "constants",
702
+ "zod",
703
+ "valibot",
704
+ "arktype",
705
+ "json-schema",
706
+ "standard-schema",
707
+ "factories",
708
+ "react",
709
+ "vue",
710
+ "svelte",
711
+ "solid",
712
+ "messages"
713
+ ];
714
+ const DEFAULT_GEN_OUT = "src/generated";
715
+ const FILE_NAMES = {
716
+ constants: "permdock.generated.ts",
717
+ zod: "permdock.zod.ts",
718
+ valibot: "permdock.valibot.ts",
719
+ arktype: "permdock.arktype.ts",
720
+ "json-schema": "permdock.schemas.json",
721
+ "standard-schema": "permdock.schemas.ts",
722
+ factories: "permdock.factories.ts",
723
+ react: "permdock.react.ts",
724
+ vue: "permdock.vue.ts",
725
+ svelte: "permdock.svelte-stores.ts",
726
+ solid: "permdock.solid.ts",
727
+ messages: "permdock.messages.json"
728
+ };
729
+ function isGenKind(value) {
730
+ return GEN_KINDS.some((kind) => kind === value);
731
+ }
732
+ function kindsOf(flags, config) {
733
+ if (flags.length > 0) return [...new Set(flags)];
734
+ const configured = config.gen?.kinds;
735
+ if (configured === void 0) return ["constants"];
736
+ for (const kind of configured) if (!isGenKind(kind)) throw configError(`PermDock CLI: gen.kinds has '${String(kind)}'; use ${GEN_KINDS.join(", ")}`);
737
+ return [...new Set(configured)];
738
+ }
739
+ function readIfExists(file) {
740
+ return existsSync(file) ? readFileSync(file, "utf8") : void 0;
741
+ }
742
+ function render(kind, model, context) {
743
+ switch (kind) {
744
+ case "constants": return constantsModule(model);
745
+ case "zod":
746
+ case "valibot":
747
+ case "arktype": return validatorModule(kind, model, context);
748
+ case "json-schema": return jsonSchemaDocument(model);
749
+ case "standard-schema": return standardSchemaModule(model, context);
750
+ case "factories": return factoriesModule(model);
751
+ case "react":
752
+ case "vue":
753
+ case "svelte":
754
+ case "solid": return hooksModule(kind, policySpecifier(context.file, context.policy));
755
+ case "messages": return messagesDocument(model, context.rel, context.previous);
756
+ default: return kind;
757
+ }
758
+ }
759
+ /** The files `permdock gen` writes: one per kind under the output directory. */
760
+ async function genFiles(input) {
761
+ const kinds = kindsOf(input.kinds, input.config);
762
+ if (input.out !== void 0 && kinds.length > 1) throw new CliError("usage", `gen: --out names one file; ${String(kinds.length)} kinds need --out-dir`, {
763
+ code: "invalid_value",
764
+ extensions: { flag: "--out" }
765
+ });
766
+ const policyPath = input.from ?? input.config.policy ?? "";
767
+ const policy = await requirePolicy(input.cwd, input.from ?? input.config.policy, "gen needs policy in the config or --policy");
768
+ const operations = await loadConfiguredOperations(input.cwd, input.config.operations);
769
+ const model = genModel({
770
+ policy,
771
+ config: input.config,
772
+ operations
773
+ });
774
+ const dir = input.outDir ?? input.config.gen?.out ?? DEFAULT_GEN_OUT;
775
+ const fieldMeta = input.config.gen?.fieldMeta === true;
776
+ return kinds.map((kind) => {
777
+ const rel = input.out ?? `${dir}/${FILE_NAMES[kind]}`;
778
+ const file = resolve(input.cwd, rel === "-" ? `${dir}/${FILE_NAMES[kind]}` : rel);
779
+ return {
780
+ part: kind,
781
+ rel,
782
+ text: render(kind, model, {
783
+ fieldMeta,
784
+ rel,
785
+ file,
786
+ policy: resolve(input.cwd, policyPath),
787
+ previous: rel === "-" ? void 0 : readIfExists(file)
788
+ })
789
+ };
790
+ });
791
+ }
792
+ async function runGen(input) {
793
+ const files = await genFiles(input);
794
+ if (input.check) {
795
+ const drift = driftOf(input.cwd, files);
796
+ return drift.length === 0 ? {
797
+ code: 0,
798
+ output: files.map((file) => `${file.rel} is current`).join("\n"),
799
+ data: { stale: [] }
800
+ } : {
801
+ code: 1,
802
+ output: `${drift.join("\n")}\nrun permdock gen to refresh`,
803
+ data: { stale: drift }
804
+ };
805
+ }
806
+ const onDisk = files.filter((file) => file.rel !== "-").map((file) => ({
807
+ path: file.rel,
808
+ text: file.text
809
+ }));
810
+ if (input.dryRun) {
811
+ const planned = planFiles(input.cwd, onDisk);
812
+ return {
813
+ code: 0,
814
+ output: fileSummary(planned, true),
815
+ data: { files: planned }
816
+ };
817
+ }
818
+ const planned = planFiles(input.cwd, onDisk);
819
+ const { printed } = writeOutputFiles(input.cwd, files);
820
+ return {
821
+ code: 0,
822
+ output: printed === "" ? fileSummary(planned, false) : printed,
823
+ data: { files: planned }
824
+ };
825
+ }
826
+ //#endregion
827
+ export { runGen };