permdock 0.1.0 → 0.3.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 (350) hide show
  1. package/README.md +106 -47
  2. package/dist/a2a/index.d.ts +7 -16
  3. package/dist/a2a/index.js +59 -98
  4. package/dist/adapter-context-mlWsVGGg.js +23 -0
  5. package/dist/ai-sdk/index.d.ts +37 -16
  6. package/dist/ai-sdk/index.js +30 -13
  7. package/dist/approvals/index.d.ts +3 -3
  8. package/dist/approvals/index.js +5 -4
  9. package/dist/{approvals-DaxY-Bdg.js → approvals-DbYAuNkG.js} +17 -11
  10. package/dist/approvers-DT4AVyIg.js +52 -0
  11. package/dist/{arazzo-CTeVuXr5.js → arazzo-BAgw9ap6.js} +2 -2
  12. package/dist/{arazzo-aoTkqYsJ.js → arazzo-CKwwqFWz.js} +2 -2
  13. package/dist/authzen/index.d.ts +4 -13
  14. package/dist/authzen/index.js +16 -50
  15. package/dist/better-auth/index.d.ts +20 -3
  16. package/dist/better-auth/index.js +27 -7
  17. package/dist/better-supabase/index.d.ts +223 -0
  18. package/dist/better-supabase/index.js +648 -0
  19. package/dist/bind-C_ob3LKa.d.ts +25 -0
  20. package/dist/bind-CuzGytRf.js +97 -0
  21. package/dist/boundary-BM8a_P6E.js +13 -0
  22. package/dist/boundary-BmHxVH1J.d.ts +15 -0
  23. package/dist/canonical-json-DemiK4Vp.js +26 -0
  24. package/dist/{capability-BDG_nkxt.d.ts → capability-2kYTMWDv.d.ts} +2 -2
  25. package/dist/{capability-B68OFnZx.js → capability-4qPdO9gk.js} +7 -5
  26. package/dist/catalog/index.d.ts +1 -1
  27. package/dist/catalog/index.js +1 -1
  28. package/dist/catalog-CRW5Mx_B.js +2 -0
  29. package/dist/{catalog-H-vFGwWK.js → catalog-DWF5cYqB.js} +4 -4
  30. package/dist/{catalog-B0E6bggc.js → catalog-dFZdWCGN.js} +2 -2
  31. package/dist/{catalog-doc-BSo_Q_-6.js → catalog-doc-DdGm82XT.js} +20 -32
  32. package/dist/claude-agent/index.d.ts +5 -14
  33. package/dist/claude-agent/index.js +4 -10
  34. package/dist/clerk/index.d.ts +12 -3
  35. package/dist/clerk/index.js +26 -5
  36. package/dist/cli/bin.js +1 -1
  37. package/dist/cli/index.d.ts +3 -3
  38. package/dist/cli/index.js +2 -2
  39. package/dist/clients-C7zLFuWT.d.ts +12 -0
  40. package/dist/clients-DjU5ABMy.js +23 -0
  41. package/dist/cloud/index.d.ts +4 -5
  42. package/dist/cloud/index.js +20 -6
  43. package/dist/{cloud-BNQTrmrr.js → cloud-CB_ELYuX.js} +2 -2
  44. package/dist/{cloud-Cuxr6Czw.js → cloud-DWLXO2af.js} +7 -6
  45. package/dist/collect-DClJsheJ.js +83 -0
  46. package/dist/{collect-O-tOtbnk.js → collect-DSTE3ml9.js} +194 -42
  47. package/dist/collect-DSWOk19R.js +2 -0
  48. package/dist/{commands-BMh_Etm2.js → commands-DSxCqG9A.js} +16 -12
  49. package/dist/compile/index.d.ts +3 -0
  50. package/dist/compile/index.js +2 -0
  51. package/dist/{compile-D22iwvuV.js → compile-Ba4blROR.js} +85 -30
  52. package/dist/compile-BkRyBDBw.d.ts +94 -0
  53. package/dist/config-BJiM-xAm.js +157 -0
  54. package/dist/config-Dnszbv-6.js +36 -0
  55. package/dist/config-report-DMvWKUxL.js +44 -0
  56. package/dist/{connection-JvqwHODC.js → connection-CU8MQxRi.js} +1 -1
  57. package/dist/{context-CKEAabd7.js → context-Bcy85rGi.js} +36 -27
  58. package/dist/convex/index.d.ts +9 -4
  59. package/dist/convex/index.js +14 -4
  60. package/dist/create-B1d519XK.d.ts +245 -0
  61. package/dist/create-CMwIl-w2.js +253 -0
  62. package/dist/{credential-B_rkUNlY.js → credential-8P81ff4u.js} +26 -46
  63. package/dist/delegation-D8pUEuce.js +103 -0
  64. package/dist/{describe-Bt1YD5uS.js → describe-B_gVZEVi.js} +10 -15
  65. package/dist/{describe-DernyItf.d.ts → describe-DMYiCjJV.d.ts} +9 -10
  66. package/dist/{diff-x5Il8LVa.js → diff-2VaeChzX.js} +44 -11
  67. package/dist/{diff-BUzf5Poi.js → diff-DBIhz_f2.js} +2 -2
  68. package/dist/{doctor-Bqo6FwUa.js → doctor-BwCAMLx_.js} +2 -2
  69. package/dist/doctor-collect-CHk6XWOA.js +665 -0
  70. package/dist/doctor-igIiM_Hl.js +1194 -0
  71. package/dist/drizzle/index.d.ts +4 -3
  72. package/dist/drizzle/index.js +3 -3
  73. package/dist/elysia/index.d.ts +6 -28
  74. package/dist/elysia/index.js +16 -60
  75. package/dist/{errors-DSMnAVNa.js → errors-CWfoNg9N.js} +8 -4
  76. package/dist/{errors-Iy71s7Oj.js → errors-Cz5zn0mW.js} +17 -71
  77. package/dist/{errors-DbZ1YOnb.d.ts → errors-DPdqI50v.d.ts} +8 -21
  78. package/dist/{errors-m3u9TmDu.js → errors-DRnGZHzF.js} +4 -1
  79. package/dist/evaluation-items-CfCCejQd.js +40 -0
  80. package/dist/{evaluations-DsAU9ppl.js → evaluations-tz6D9A2G.js} +28 -46
  81. package/dist/eve/index.d.ts +6 -15
  82. package/dist/eve/index.js +7 -12
  83. package/dist/expiry-BoBJ8Tvc.js +7 -0
  84. package/dist/express/index.d.ts +6 -29
  85. package/dist/express/index.js +28 -58
  86. package/dist/fastify/index.d.ts +6 -29
  87. package/dist/fastify/index.js +16 -65
  88. package/dist/fields-BMl1RxoX.js +26 -0
  89. package/dist/{files-B_wAGYmt.js → files-DWUN9PzI.js} +5 -1
  90. package/dist/{fixtures-Cvaw0gDG.js → fixtures-ht28Cplr.js} +5 -2
  91. package/dist/{freeze-y1_jQL4v.js → freeze-CrU8nQeX.js} +31 -2
  92. package/dist/{from-snapshot-BMGnhmgv.js → from-snapshot-CTLijvdm.js} +66 -48
  93. package/dist/{grantee-Bv04_Vzf.js → grantee-Cv5Sogfv.js} +88 -7
  94. package/dist/graph-sql-B-dsAT6j.d.ts +29 -0
  95. package/dist/{headers-B5RRv3Xm.js → headers-BZSDieNT.js} +1 -1
  96. package/dist/{headers-C8SHQccD.d.ts → headers-Cf-zWvsO.d.ts} +1 -1
  97. package/dist/helpers-H_KARDVC.js +421 -0
  98. package/dist/hono/index.d.ts +6 -28
  99. package/dist/hono/index.js +11 -43
  100. package/dist/{hosted-BwKQ1BTA.js → hosted-DJQw46hn.js} +6 -5
  101. package/dist/{http-GgVApX1k.js → http-BIhmLfCc.js} +4 -20
  102. package/dist/http-SO7qGttf.js +44 -0
  103. package/dist/ids-DC4V4CFu.js +18 -0
  104. package/dist/index-0nNqHspG.d.ts +6 -0
  105. package/dist/{index-xIxJLwOQ.d.ts → index-BNc7Wer_.d.ts} +75 -7
  106. package/dist/{index-CltcQ4Bf.d.ts → index-C7Tw7MaW.d.ts} +68 -5
  107. package/dist/{index-LF_hS-yn.d.ts → index-C8z4RjQV.d.ts} +1 -1
  108. package/dist/index.d.ts +14 -9
  109. package/dist/index.js +22 -17
  110. package/dist/instance-options-Dhhcnm3y.js +22 -0
  111. package/dist/instance-options-jARdwfPN.d.ts +11 -0
  112. package/dist/{parse-DPfIvFMU.js → json-schema-BsAflUGW.js} +28 -57
  113. package/dist/jwt/index.d.ts +10 -6
  114. package/dist/jwt/index.js +32 -13
  115. package/dist/kernel-_RRHmnMY.js +208 -0
  116. package/dist/kysely/index.d.ts +4 -3
  117. package/dist/kysely/index.js +3 -3
  118. package/dist/live-options-H2eG8dfJ.js +60 -0
  119. package/dist/{load-BZ24CpZP.js → load-DhWEB9P1.js} +16 -10
  120. package/dist/load-DwJUafYN.js +2 -0
  121. package/dist/manifest-iaoBXHKc.js +783 -0
  122. package/dist/manifest-uDS9y5de.d.ts +206 -0
  123. package/dist/{map-DowSO96j.js → map-AcxK9o_D.js} +4 -15
  124. package/dist/{map-claims-B_6I1Rn-.js → map-claims-Z4QZOiFF.js} +13 -4
  125. package/dist/map-error-pgUWNNtG.js +23 -0
  126. package/dist/may-use-DndQ5tQ-.js +77 -0
  127. package/dist/mcp/index.d.ts +54 -22
  128. package/dist/mcp/index.js +218 -178
  129. package/dist/nest/index.d.ts +26 -31
  130. package/dist/nest/index.js +75 -84
  131. package/dist/next/client.d.ts +7 -8
  132. package/dist/next/client.js +11 -9
  133. package/dist/next/index.d.ts +30 -47
  134. package/dist/next/index.js +45 -60
  135. package/dist/next/plugin.d.ts +1 -1
  136. package/dist/next/plugin.js +32 -1
  137. package/dist/node/index.d.ts +9 -28
  138. package/dist/node/index.js +11 -43
  139. package/dist/openai/index.d.ts +6 -15
  140. package/dist/openai/index.js +7 -20
  141. package/dist/openapi/index.d.ts +87 -4
  142. package/dist/openapi/index.js +3 -3
  143. package/dist/{openapi-DcqM8nU7.js → openapi-BqRBvAng.js} +237 -5
  144. package/dist/{openapi-DWD0Uc_4.js → openapi-CqqEbHsL.js} +5 -5
  145. package/dist/{openapi-import-BWRUNNeW.js → openapi-import-cmwetbzw.js} +1 -1
  146. package/dist/{openapi-CwePaF7C.js → openapi-l0xYHkcv.js} +3 -3
  147. package/dist/{openapi-schema-D8j_T9tO.js → openapi-schema--ARjyfQr.js} +2 -2
  148. package/dist/orpc/index.d.ts +15 -28
  149. package/dist/orpc/index.js +74 -117
  150. package/dist/otel/index.d.ts +2 -2
  151. package/dist/parse-BuyjxhZV.js +53 -0
  152. package/dist/parse-local-manifest-BrMozJCo.js +36 -0
  153. package/dist/parse-local-manifest-JLnaBH0S.d.ts +10 -0
  154. package/dist/pdp/index.d.ts +2 -2
  155. package/dist/pdp/index.js +14 -127
  156. package/dist/{permdock-yoZ7EjxX.js → permdock-CbgvLnuo.js} +672 -149
  157. package/dist/{permissions-B8vCg_bI.d.ts → permissions-CDgvKG5L.d.ts} +2 -2
  158. package/dist/{permissions-DC7GROPA.js → permissions-DVoF6dMt.js} +77 -15
  159. package/dist/{permissions-B4apnahQ.d.ts → permissions-DttnqqxC.d.ts} +34 -5
  160. package/dist/{permissions-CofRqesP.js → permissions-RJrovw98.js} +3 -3
  161. package/dist/{pins-CqE1jZuF.js → pins-8ILTftC9.js} +2 -2
  162. package/dist/{policy-Cq2fB8Q5.d.ts → policy-D2W7uv19.d.ts} +2 -2
  163. package/dist/{policy-CInmNGkM.d.ts → policy-IB6yxpC3.d.ts} +351 -42
  164. package/dist/{policy-ANp36PnI.js → policy-xyWg7QdR.js} +173 -22
  165. package/dist/powersync-BylawD_U.js +540 -0
  166. package/dist/powersync-DliZK_-y.js +62 -0
  167. package/dist/powersync-e_AZrKbg.js +2 -0
  168. package/dist/prisma/index.d.ts +3 -2
  169. package/dist/prisma/index.js +45 -20
  170. package/dist/{problem-Cgp9-KZA.js → problem-B43ztKIm.js} +74 -109
  171. package/dist/problem-details-DX075l9V.d.ts +7 -0
  172. package/dist/problem-details-_AMOYz-w.js +144 -0
  173. package/dist/{protected-BuPAycJT.d.ts → protected-BdnIEFkY.d.ts} +5 -4
  174. package/dist/protected-utU-SLuy.js +100 -0
  175. package/dist/protected-xAr24FEC.d.ts +40 -0
  176. package/dist/provider-CSQd7m92.js +52 -0
  177. package/dist/{provider-wTAUda2v.d.ts → provider-DZY281jO.d.ts} +1 -1
  178. package/dist/provider-store-Cfbvo4DE.js +43 -0
  179. package/dist/react/index.d.ts +7 -5
  180. package/dist/react/index.js +5 -4
  181. package/dist/react/provider-client.d.ts +1 -1
  182. package/dist/react/provider-client.js +1 -1
  183. package/dist/react-native/index.d.ts +166 -10
  184. package/dist/react-native/index.js +607 -85
  185. package/dist/{refs-ChLSxbST.js → refs-KYb4ntaz.js} +4 -3
  186. package/dist/{relations-r4soIFZB.js → relations-cjOL01hZ.js} +110 -31
  187. package/dist/replay-BsOyTrdV.js +28 -0
  188. package/dist/replay-CYyiLiwO.d.ts +5 -0
  189. package/dist/resource-ref-CaS9yVPi.js +20 -0
  190. package/dist/revocations-Bhr0aMIC.js +27 -0
  191. package/dist/{rls-BOFU3chG.js → rls-B4ur8nKQ.js} +8 -3
  192. package/dist/rls-DQtdgTHB.js +2521 -0
  193. package/dist/rls-fields-74oZPXWL.js +3582 -0
  194. package/dist/{rls-graph-DxQ39PJj.js → rls-graph-CHwx0V8q.js} +100 -36
  195. package/dist/{rls-import-CXV6LBlS.js → rls-import-BTFVk3jH.js} +7 -6
  196. package/dist/{rls-migrate-DrFPbf8p.js → rls-migrate-CN4TlJTO.js} +6 -5
  197. package/dist/rls-ownership-RuFqaqGz.js +843 -0
  198. package/dist/rls-shared-Cewd_-zI.js +495 -0
  199. package/dist/rls-verify-CVQTHTh5.js +746 -0
  200. package/dist/{row-check-BajTgQZ-.d.ts → row-check-Dt35czLy.d.ts} +12 -15
  201. package/dist/row-conditions-h2HythXQ.js +27 -0
  202. package/dist/rpc-DL9Sqvb1.js +89 -0
  203. package/dist/{run-CJ6UvS3a.js → run-DKDbM4Du.js} +31 -12
  204. package/dist/runtime-CB8gQFvS.js +11 -0
  205. package/dist/{saas-BRrZzJkM.js → saas-DhpJjnBA.js} +17 -7
  206. package/dist/{schema-P8yoma__.js → schema-D3MnDMxa.js} +8 -4
  207. package/dist/scim/index.d.ts +1 -1
  208. package/dist/scim/index.js +1 -1
  209. package/dist/{scim-9NFa0XVZ.js → scim-BFGBBAqR.js} +1 -1
  210. package/dist/{scopes-cKVp_WTw.js → scopes-CVdPrWN-.js} +35 -8
  211. package/dist/server/index.d.ts +22 -11
  212. package/dist/server/index.js +11 -8
  213. package/dist/{credentials-BgRX3WEg.js → server-DlZ28Oz5.js} +1 -1
  214. package/dist/shared-DRu8VFVM.js +123 -0
  215. package/dist/{sink-Cfr9-7YC.d.ts → sink-B1fZzIMf.d.ts} +1 -1
  216. package/dist/skills-Biq5uup3.js +192 -0
  217. package/dist/{skills-C_lpV4Jx.js → skills-Bx-U0irG.js} +10 -4
  218. package/dist/{snapshot-DE8dE_hz.js → snapshot-Enxd0n-s.js} +138 -214
  219. package/dist/snapshot-cache-B-LxUahj.d.ts +45 -0
  220. package/dist/snapshot-cache-D6jLelln.js +44 -0
  221. package/dist/solid/index.d.ts +39 -9
  222. package/dist/solid/index.js +76 -85
  223. package/dist/sources-4p0-4xQm.js +545 -0
  224. package/dist/sources-BdOYLw9j.d.ts +192 -0
  225. package/dist/{sql-Bll1d7y0.js → sql-xdg5f4Fi.js} +6 -1
  226. package/dist/{src-CTNT-PBW.js → src-BDwEZWrZ.js} +149 -11
  227. package/dist/ssf/index.d.ts +3 -2
  228. package/dist/ssf/index.js +3 -29
  229. package/dist/store-DMAWwAJV.js +371 -0
  230. package/dist/{store-Bq90395i.d.ts → store-jOBYpiXC.d.ts} +13 -4
  231. package/dist/store-options-ByhZq1jV.js +716 -0
  232. package/dist/{stores-CkG2HrSg.js → stores-BT2pSCub.js} +10 -63
  233. package/dist/{stores-CvOnu_2T.d.ts → stores-C0IMQrGI.d.ts} +20 -9
  234. package/dist/{stream-BhMfZOwr.d.ts → stream-D1RXubw2.d.ts} +2 -2
  235. package/dist/{stream-Q_xlB6Ko.js → stream-DDpvynSB.js} +16 -2
  236. package/dist/subject-settings-BwBmCdTR.js +128 -0
  237. package/dist/supabase/index.d.ts +133 -6
  238. package/dist/supabase/index.js +4 -3
  239. package/dist/supabase/middleware.d.ts +32 -27
  240. package/dist/supabase/middleware.js +56 -22
  241. package/dist/{supabase-D8UlBA7Z.js → supabase-Boqb9a_Y.js} +3 -3
  242. package/dist/{supabase-DTxGtYdi.js → supabase-C0qESOa-.js} +347 -367
  243. package/dist/supabase-config-BpPXt3x1.js +472 -0
  244. package/dist/supabase-hook-6sYLXg_u.js +2 -0
  245. package/dist/{supabase-hook-D_OqGb_V.js → supabase-hook-CSLQ4zJ3.js} +1037 -705
  246. package/dist/supautils-Cn4R4cJ4.js +91 -0
  247. package/dist/svelte/PermissionBoundary.svelte +37 -0
  248. package/dist/svelte/Protected.svelte +8 -2
  249. package/dist/svelte/index.d.ts +9 -6
  250. package/dist/svelte/index.js +61 -7
  251. package/dist/svelte/runtime.d.ts +4 -3
  252. package/dist/svelte/runtime.js +4 -3
  253. package/dist/svelte/source.d.ts +9 -6
  254. package/dist/svelte/source.js +7 -4
  255. package/dist/terminal/index.d.ts +6 -14
  256. package/dist/terminal/index.js +44 -32
  257. package/dist/testing/index.d.ts +105 -16
  258. package/dist/testing/index.js +504 -40
  259. package/dist/testing/saas/index.d.ts +4 -4
  260. package/dist/testing/saas/index.js +2 -2
  261. package/dist/testing/saas/permissions.d.ts +1 -1
  262. package/dist/testing/saas/permissions.js +1 -1
  263. package/dist/token-CIWxJOCh.js +50 -0
  264. package/dist/trpc/index.d.ts +7 -26
  265. package/dist/trpc/index.js +17 -100
  266. package/dist/types-BnIEz1sU.d.ts +48 -0
  267. package/dist/{types-CxquUByI.d.ts → types-Bvc4oWT6.d.ts} +1 -1
  268. package/dist/{sources-DOpW5Ila.d.ts → types-C97IskBw.d.ts} +86 -127
  269. package/dist/types-CKNSyIf_.d.ts +52 -0
  270. package/dist/types-Cq_H8N_X.d.ts +197 -0
  271. package/dist/{types-D6Z6-rKJ.d.ts → types-DbjRN55U.d.ts} +273 -22
  272. package/dist/{types-BBK-exvJ.d.ts → types-Dnemwd77.d.ts} +7 -1
  273. package/dist/{types-BvBk1wgn.d.ts → types-DxiCGmmd.d.ts} +5 -3
  274. package/dist/{types-B9dmiiab.d.ts → types-QCuYJh4q.d.ts} +1 -1
  275. package/dist/{types-B8w5PFtS.d.ts → types-aqOHTHcp.d.ts} +17 -1
  276. package/dist/unplugin/index.d.ts +1 -1
  277. package/dist/unplugin/index.js +10 -9
  278. package/dist/usage-DorAJiU_.js +2 -0
  279. package/dist/{usage-1ozMubLY.js → usage-GTixvDDU.js} +2 -2
  280. package/dist/{usage-CUnK6Ou9.js → usage-ItS7nLcl.js} +225 -62
  281. package/dist/validation-error-Ba264OaJ.d.ts +26 -0
  282. package/dist/validation-error-CnjZ4t92.js +33 -0
  283. package/dist/{validity-D0uRmJKJ.js → validity-uOp8UpYn.js} +57 -36
  284. package/dist/{verifier-B90agnhl.js → verifier-BxBo6I44.js} +10 -5
  285. package/dist/version-BvacVTZR.js +17 -0
  286. package/dist/views-Soe7bGSC.js +95 -0
  287. package/dist/{vocabulary-Dk0fs-Jk.d.ts → vocabulary-DA8a8zif.d.ts} +1 -1
  288. package/dist/vue/index.d.ts +35 -13
  289. package/dist/vue/index.js +86 -93
  290. package/dist/watch-BwxLTYMZ.js +2 -0
  291. package/dist/watch-DVBJ9cBq.js +128 -0
  292. package/dist/webmcp/index.d.ts +2 -2
  293. package/dist/webmcp/index.js +7 -13
  294. package/package.json +62 -36
  295. package/schemas/approval-request-v1.json +175 -0
  296. package/schemas/catalog-v1.json +29 -1
  297. package/schemas/supabase-claims-v1.json +6 -1
  298. package/schemas/supabase-manifest-v1.json +150 -6
  299. package/skills/permdock/SKILL.md +7 -7
  300. package/skills/permdock-agents/SKILL.md +5 -5
  301. package/skills/permdock-agents/references/runtimes.md +12 -10
  302. package/skills/permdock-approvals/SKILL.md +4 -4
  303. package/skills/permdock-approvals/references/stores-and-resume.md +15 -4
  304. package/skills/permdock-audit/SKILL.md +3 -3
  305. package/skills/permdock-credentials/SKILL.md +4 -4
  306. package/skills/permdock-credentials/references/tokens-keys-links.md +7 -2
  307. package/skills/permdock-data/SKILL.md +4 -4
  308. package/skills/permdock-data/references/queries-and-rls.md +14 -6
  309. package/skills/permdock-data/references/relationships.md +5 -3
  310. package/skills/permdock-tenancy/SKILL.md +9 -6
  311. package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +14 -8
  312. package/skills/permdock-wire/SKILL.md +4 -4
  313. package/skills/permdock-wire/references/adapters.md +42 -30
  314. package/skills/permdock-wire/references/policy-options.md +5 -3
  315. package/dist/approvers-aH0PJkmf.js +0 -20
  316. package/dist/catalog-idsHc0vo.js +0 -2
  317. package/dist/collect-B7_TIfmg.js +0 -49
  318. package/dist/collect-fRPAQIWb.js +0 -2
  319. package/dist/compile-CQbvyIBr.d.ts +0 -30
  320. package/dist/config-BPYmjTOp.js +0 -26
  321. package/dist/context-gtAwAILx.js +0 -6
  322. package/dist/create-BKF3dgFk.d.ts +0 -162
  323. package/dist/create-CSkhDU9T.js +0 -222
  324. package/dist/doctor-BGle8Gqi.js +0 -1314
  325. package/dist/helpers-DnSOrhB9.js +0 -682
  326. package/dist/index-fG6NSXlc.d.ts +0 -9
  327. package/dist/kernel-YOGCWNLf.js +0 -211
  328. package/dist/load-QOOm1z70.js +0 -2
  329. package/dist/manifest-DDQbC6K0.d.ts +0 -118
  330. package/dist/map-error-RJ3ZsUyA.js +0 -16
  331. package/dist/may-use-CnFEjVEp.js +0 -37
  332. package/dist/pg-4GJWDUxG.js +0 -953
  333. package/dist/plugin-4gr7IxFJ.js +0 -65
  334. package/dist/protected-B4K3BKoX.js +0 -138
  335. package/dist/protected-wY7nXhY9.d.ts +0 -23
  336. package/dist/provider-_wx46HpB.js +0 -48
  337. package/dist/rls-CJVja9Ww.js +0 -2119
  338. package/dist/rls-helpers-BxRuif0l.js +0 -1346
  339. package/dist/runtime-DP9ttFh1.js +0 -27
  340. package/dist/skills-Dx3QLnMY.js +0 -110
  341. package/dist/source-DoBBYJi2.js +0 -6
  342. package/dist/sources-DVHM3Mwq.js +0 -284
  343. package/dist/store-C6hFW6ta.js +0 -508
  344. package/dist/subject-settings-xt7V845g.js +0 -82
  345. package/dist/supabase-hook-DW-xP4hU.js +0 -2
  346. package/dist/types-DbWdEfcm.d.ts +0 -87
  347. package/dist/types-bva3i4Gf.d.ts +0 -98
  348. package/dist/types-i4BAOvdb.d.ts +0 -97
  349. package/dist/usage-PyEor6GA.js +0 -2
  350. package/dist/version-CnSh33Fj.js +0 -16
@@ -1,8 +1,8 @@
1
1
  import { t as compact } from "./compact-y6vfu2_f.js";
2
- import { f as isPermission, g as listPermissions } from "./permissions-DC7GROPA.js";
2
+ import { _ as listPermissions, i as findPermission, p as isPermission } from "./permissions-DVoF6dMt.js";
3
3
  import { n as sha256 } from "./sha256-BO0swRXL.js";
4
4
  import { t as requiresApproval } from "./approval-required-TzNB9oQA.js";
5
- import { i as PROFILE_PARAMETERS, n as GNAP_RESERVED, r as PROFILE_NAMES, t as DRAFT_PINS } from "./pins-CqE1jZuF.js";
5
+ import { i as PROFILE_PARAMETERS, n as GNAP_RESERVED, r as PROFILE_NAMES, t as DRAFT_PINS } from "./pins-8ILTftC9.js";
6
6
  //#region src/openapi/emit.ts
7
7
  function assertScheme(options) {
8
8
  if (options.scheme.type === "gnap") throw new TypeError(GNAP_RESERVED);
@@ -28,7 +28,7 @@ function mergeRecord(base, extra) {
28
28
  for (const [key, value] of Object.entries(extra)) result[key] = value;
29
29
  return result;
30
30
  }
31
- function scopesOf(policy) {
31
+ function scopesOf$1(policy) {
32
32
  const scopes = {};
33
33
  for (const leaf of listPermissions(policy.permissions)) scopes[leaf.scope] = leaf.meta.description ?? leaf.meta.title ?? leaf.key;
34
34
  return scopes;
@@ -39,7 +39,7 @@ function flowWithScopes(flow, scopes) {
39
39
  function securitySchemesOf(policy, options) {
40
40
  assertScheme(options);
41
41
  const target = options.target ?? "3.2";
42
- const scopes = scopesOf(policy);
42
+ const scopes = scopesOf$1(policy);
43
43
  const name = options.scheme.name;
44
44
  if (options.scheme.ref !== void 0 && target !== "3.1") return { [name]: { $ref: options.scheme.ref } };
45
45
  const flowsIn = options.scheme.flows ?? { authorizationCode: {} };
@@ -303,4 +303,236 @@ const createPermDock = (policy, options) => {
303
303
  };
304
304
  };
305
305
  //#endregion
306
- export { securitySchemesOf as i, catalogOf as n, openapiVersion as r, createPermDock as t };
306
+ //#region src/openapi/operations.ts
307
+ const METHODS = /* @__PURE__ */ new Set([
308
+ "GET",
309
+ "PUT",
310
+ "POST",
311
+ "DELETE",
312
+ "OPTIONS",
313
+ "HEAD",
314
+ "PATCH",
315
+ "TRACE",
316
+ "QUERY"
317
+ ]);
318
+ function segmentsOf(path) {
319
+ return path.split("/").filter((segment) => segment !== "");
320
+ }
321
+ function isParam(segment) {
322
+ return segment.startsWith("{") && segment.endsWith("}");
323
+ }
324
+ /** The number of literal segments that match, or -1 when the template does not match. */
325
+ function score(route, segments) {
326
+ if (route.segments.length !== segments.length) return -1;
327
+ let literal = 0;
328
+ for (const [index, segment] of route.segments.entries()) {
329
+ if (isParam(segment)) continue;
330
+ if (segment !== segments[index]) return -1;
331
+ literal += 1;
332
+ }
333
+ return literal;
334
+ }
335
+ function isEntryObject(entry) {
336
+ return !isPermission(entry);
337
+ }
338
+ function scopesOf(key, entry) {
339
+ if (!isEntryObject(entry) || entry.oauthScopes === void 0) return;
340
+ const scopes = entry.oauthScopes;
341
+ if (scopes.length === 0 || !scopes.every((scope) => typeof scope === "string" && scope !== "")) throw new TypeError(`PermDock: operation '${key}' sets oauthScopes, which must be a non-empty list of scope names`);
342
+ return Object.freeze([...entry.oauthScopes]);
343
+ }
344
+ /**
345
+ * Operations as `"METHOD /path/{param}"` keys, the OpenAPI path template, to
346
+ * a permission. `base` is a prefix requests carry and the keys do not
347
+ * (`/api/v1`). A key that is not a method and a path throws.
348
+ */
349
+ function operationPermissions(operations, options = {}) {
350
+ const routes = [];
351
+ const byId = /* @__PURE__ */ new Map();
352
+ for (const [key, entry] of Object.entries(operations)) {
353
+ const space = key.indexOf(" ");
354
+ const method = key.slice(0, space).toUpperCase();
355
+ const path = key.slice(space + 1).trim();
356
+ if (space <= 0 || !METHODS.has(method) || !path.startsWith("/")) throw new TypeError(`PermDock: operation '${key}' must be a method and a path, such as 'GET /customers/{id}'`);
357
+ const oauthScopes = scopesOf(key, entry);
358
+ if (isEntryObject(entry) && (entry.permission === void 0 ? oauthScopes === void 0 : !isPermission(entry.permission))) throw new TypeError(`PermDock: operation '${key}' needs a permission, oauthScopes or both`);
359
+ const route = {
360
+ method,
361
+ segments: segmentsOf(path),
362
+ permission: isEntryObject(entry) ? entry.permission : entry,
363
+ ...oauthScopes === void 0 ? {} : { oauthScopes }
364
+ };
365
+ routes.push(route);
366
+ if (isEntryObject(entry) && entry.operationId !== void 0) byId.set(entry.operationId, route);
367
+ }
368
+ const base = segmentsOf(options.base ?? "");
369
+ const matchMethod = (upper, path) => {
370
+ const full = segmentsOf(path.split("?")[0] ?? "");
371
+ if (base.some((segment, index) => full[index] !== segment)) return;
372
+ const segments = full.slice(base.length);
373
+ let best;
374
+ let bestScore = -1;
375
+ for (const route of routes) {
376
+ if (route.method !== upper) continue;
377
+ const value = score(route, segments);
378
+ if (value > bestScore) {
379
+ best = route;
380
+ bestScore = value;
381
+ }
382
+ }
383
+ return best;
384
+ };
385
+ const match = (method, path) => {
386
+ const upper = method.toUpperCase();
387
+ const route = matchMethod(upper, path);
388
+ return route === void 0 && upper === "HEAD" ? matchMethod("GET", path) : route;
389
+ };
390
+ return {
391
+ forRequest(method, path) {
392
+ return match(method, path)?.permission;
393
+ },
394
+ forOperation(id) {
395
+ return byId.get(id)?.permission;
396
+ },
397
+ oauthScopesForRequest(method, path) {
398
+ return match(method, path)?.oauthScopes;
399
+ },
400
+ oauthScopesForOperation(id) {
401
+ return byId.get(id)?.oauthScopes;
402
+ }
403
+ };
404
+ }
405
+ function isRecord(value) {
406
+ return value !== null && typeof value === "object" && !Array.isArray(value);
407
+ }
408
+ /**
409
+ * The operation permissions an OpenAPI document declares: every operation
410
+ * whose `x-permdock-permissions` names exactly one permission of `tree`, keyed
411
+ * by its method, path and `operationId`. An operation naming none, several or
412
+ * an unknown key is left out, so a gate denies it.
413
+ */
414
+ function operationPermissionsFromOpenApi(document, tree, options = {}) {
415
+ const operations = {};
416
+ const paths = isRecord(document) && isRecord(document["paths"]) ? document["paths"] : {};
417
+ for (const [path, item] of Object.entries(paths)) {
418
+ if (!isRecord(item)) continue;
419
+ for (const [method, operation] of Object.entries(item)) {
420
+ if (!METHODS.has(method.toUpperCase()) || !isRecord(operation)) continue;
421
+ const keys = operation["x-permdock-permissions"];
422
+ if (!Array.isArray(keys) || keys.length !== 1 || typeof keys[0] !== "string") continue;
423
+ const permission = findPermission(tree, keys[0]);
424
+ if (permission === void 0) continue;
425
+ const operationId = operation["operationId"];
426
+ operations[`${method.toUpperCase()} ${path}`] = typeof operationId === "string" ? {
427
+ permission,
428
+ operationId
429
+ } : permission;
430
+ }
431
+ }
432
+ return operationPermissions(operations, options);
433
+ }
434
+ //#endregion
435
+ //#region src/openapi/problem-details.ts
436
+ const TARGETS = /* @__PURE__ */ new Set([
437
+ "draft-2020-12",
438
+ "draft-07",
439
+ "openapi-3.0"
440
+ ]);
441
+ const JSON_SCHEMA = Object.freeze({
442
+ type: "object",
443
+ description: "RFC 9457 Problem Details for a PermDock denial",
444
+ required: [
445
+ "type",
446
+ "title",
447
+ "status",
448
+ "detail"
449
+ ],
450
+ properties: {
451
+ type: {
452
+ type: "string",
453
+ format: "uri-reference"
454
+ },
455
+ title: { type: "string" },
456
+ status: {
457
+ type: "integer",
458
+ minimum: 400,
459
+ maximum: 599
460
+ },
461
+ detail: { type: "string" },
462
+ instance: { type: "string" },
463
+ permission: { type: "string" },
464
+ scope: { type: "string" },
465
+ reason: { type: "string" }
466
+ },
467
+ additionalProperties: true
468
+ });
469
+ const REQUIRED_STRINGS = [
470
+ "type",
471
+ "title",
472
+ "detail"
473
+ ];
474
+ function issuesOf(value) {
475
+ if (value === null || typeof value !== "object" || Array.isArray(value)) return [{ message: "Expected a Problem Details object" }];
476
+ const issues = [];
477
+ const fields = new Map(Object.entries(value));
478
+ for (const key of REQUIRED_STRINGS) if (typeof fields.get(key) !== "string") issues.push({
479
+ message: `Expected a string`,
480
+ path: [key]
481
+ });
482
+ const status = fields.get("status");
483
+ if (typeof status !== "number" || !Number.isInteger(status) || status < 400 || status > 599) issues.push({
484
+ message: "Expected an HTTP error status",
485
+ path: ["status"]
486
+ });
487
+ return issues;
488
+ }
489
+ function isProblem(value) {
490
+ return issuesOf(value).length === 0;
491
+ }
492
+ function jsonSchema(options) {
493
+ if (!TARGETS.has(options.target)) throw new TypeError(`PermDock: problemDetails has no JSON Schema for target ${options.target}`);
494
+ return structuredClone(JSON_SCHEMA);
495
+ }
496
+ /**
497
+ * The Problem Details body the adapters send on a denial, as a Standard
498
+ * Schema with a JSON Schema, for `oc.errors({ FORBIDDEN: { data: problemDetails } })`.
499
+ * Extension members pass through: RFC 9457 lets a problem type add them.
500
+ */
501
+ const problemDetails = Object.freeze({ "~standard": Object.freeze({
502
+ version: 1,
503
+ vendor: "permdock",
504
+ validate: (value) => isProblem(value) ? { value } : { issues: issuesOf(value) },
505
+ jsonSchema: Object.freeze({
506
+ input: jsonSchema,
507
+ output: jsonSchema
508
+ })
509
+ }) });
510
+ //#endregion
511
+ //#region src/openapi/security.ts
512
+ function isList(permission) {
513
+ return Array.isArray(permission);
514
+ }
515
+ function listOf(permission) {
516
+ return isList(permission) ? permission : [permission];
517
+ }
518
+ /** The `x-permdock-permissions` value: the permission keys an operation enforces. */
519
+ function permissionsExtension(permissions) {
520
+ return Object.freeze(listOf(permissions).map((leaf) => leaf.key));
521
+ }
522
+ /**
523
+ * An operation's `security` and `x-permdock-permissions`, from permission
524
+ * references alone. Needs no policy, so a contract package can import it.
525
+ * Unlike `permdock openapi emit`, it never drops `security` for a public
526
+ * permission: that needs the policy.
527
+ */
528
+ function securityFor(permission, options = {}) {
529
+ const leaves = listOf(permission);
530
+ const scheme = options.scheme ?? "oauth2";
531
+ const security = options.anyOf === true && leaves.length > 0 ? leaves.map((leaf) => ({ [scheme]: [leaf.scope] })) : [{ [scheme]: leaves.map((leaf) => leaf.scope) }];
532
+ return Object.freeze({
533
+ security,
534
+ "x-permdock-permissions": permissionsExtension(leaves)
535
+ });
536
+ }
537
+ //#endregion
538
+ export { operationPermissionsFromOpenApi as a, openapiVersion as c, operationPermissions as i, securitySchemesOf as l, securityFor as n, createPermDock as o, problemDetails as r, catalogOf as s, permissionsExtension as t };
@@ -1,9 +1,9 @@
1
- import { n as validateOverlay, t as validateOpenapi } from "./openapi-schema-D8j_T9tO.js";
2
- import { c as getResource, i as findPermission } from "./permissions-DC7GROPA.js";
3
- import { a as definePolicy } from "./policy-ANp36PnI.js";
4
- import { a as loadModule, n as asPolicy, o as pickNamed, t as asPermissionTree } from "./load-BZ24CpZP.js";
1
+ import { n as validateOverlay, t as validateOpenapi } from "./openapi-schema--ARjyfQr.js";
2
+ import { c as getResource, i as findPermission } from "./permissions-DVoF6dMt.js";
3
+ import { a as definePolicy } from "./policy-xyWg7QdR.js";
4
+ import { a as loadModule, n as asPolicy, o as pickNamed, t as asPermissionTree } from "./load-DhWEB9P1.js";
5
5
  import { t as shortDiff } from "./text-diff-BdkkYSbi.js";
6
- import { r as openapiVersion, t as createPermDock } from "./openapi-DcqM8nU7.js";
6
+ import { c as openapiVersion, o as createPermDock } from "./openapi-BqRBvAng.js";
7
7
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
8
8
  import { dirname, resolve } from "node:path";
9
9
  //#region src/cli/openapi.ts
@@ -1,4 +1,4 @@
1
- import { t as validateOpenapi } from "./openapi-schema-D8j_T9tO.js";
1
+ import { t as validateOpenapi } from "./openapi-schema--ARjyfQr.js";
2
2
  import { t as byCodePoint } from "./compare-pfyVnBjE.js";
3
3
  import { i as schemaExpression, t as emitPermissionsModule } from "./generate-CH7ThJ14.js";
4
4
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
@@ -1,4 +1,4 @@
1
- import { a as listArg, i as globalArgs, s as stringArg, t as COMMAND_DESCRIPTIONS } from "./commands-BMh_Etm2.js";
1
+ import { a as listArg, i as globalArgs, s as stringArg, t as COMMAND_DESCRIPTIONS } from "./commands-DSxCqG9A.js";
2
2
  import { defineCommand } from "citty";
3
3
  //#region src/cli/commands/openapi.ts
4
4
  function openapi(ctx) {
@@ -122,7 +122,7 @@ function openapi(ctx) {
122
122
  const doc = listArg(rawArgs, "doc")[0];
123
123
  if (parsed._[0] === "import") {
124
124
  if (doc === void 0) throw new Error("openapi --doc is required");
125
- const { runOpenapiImport } = await import("./openapi-import-BWRUNNeW.js");
125
+ const { runOpenapiImport } = await import("./openapi-import-cmwetbzw.js");
126
126
  ctx.report(await runOpenapiImport({
127
127
  cwd: ctx.cwd,
128
128
  doc,
@@ -134,7 +134,7 @@ function openapi(ctx) {
134
134
  }));
135
135
  return;
136
136
  }
137
- const result = await (await import("./openapi-DWD0Uc_4.js")).runOpenapi({
137
+ const result = await (await import("./openapi-CqqEbHsL.js")).runOpenapi({
138
138
  cwd: ctx.cwd,
139
139
  config: ctx.config,
140
140
  rest: parsed._,
@@ -1,5 +1,5 @@
1
1
  import { t as packageRoot } from "./package-root-zGkxO3oN.js";
2
- import { t as DRAFT_PINS } from "./pins-CqE1jZuF.js";
2
+ import { t as DRAFT_PINS } from "./pins-8ILTftC9.js";
3
3
  import { readFileSync } from "node:fs";
4
4
  import { join } from "node:path";
5
5
  //#region \0rolldown/runtime.js
@@ -6810,7 +6810,7 @@ const STRINGS = {
6810
6810
  * `components.securityProfileRequirements`). Mutates and returns `schema`.
6811
6811
  */
6812
6812
  function patchOas33(schema) {
6813
- schema["$id"] = `https://permdock.dev/schemas/openapi/oas-3.3/${DRAFT_PINS.oas}`;
6813
+ schema["$id"] = `https://permdock.com/schemas/openapi/oas-3.3/${DRAFT_PINS.oas}`;
6814
6814
  child(schema, "properties", "openapi")["pattern"] = String.raw`^3\.3\.\d+(-.+)?$`;
6815
6815
  const defs = child(schema, "$defs");
6816
6816
  const scheme = child(defs, "security-scheme");
@@ -1,10 +1,9 @@
1
- import { $ as DecisionSink, C as Policy, E as PolicyVocabulary, Zt as PermDock, at as LimitStore, ct as MembershipSource, ft as RelationSource, mr as Principal, pt as RoleSource, sn as PolicySource, tt as EntitlementSource, xt as SnapshotSource } from "../policy-CInmNGkM.js";
2
- import { d as Permission } from "../permissions-B4apnahQ.js";
3
- import { f as ApprovalStore } from "../types-B8w5PFtS.js";
1
+ import { C as Policy, D as PolicyVocabulary, Nr as Principal, ln as PermDock } from "../policy-IB6yxpC3.js";
2
+ import { f as Permission } from "../permissions-DttnqqxC.js";
4
3
  import { n as RevocationFeed } from "../revocations-Cy06JNx2.js";
5
- import { r as PdpFactory } from "../types-BvBk1wgn.js";
6
- import { S as ConnectionOptions, b as Connection, h as WebBotAuthVerifier, n as OpenApiHooks, o as TenantOption } from "../create-BKF3dgFk.js";
7
- import { t as StreamProtectOptions } from "../stream-BhMfZOwr.js";
4
+ import { A as ConnectionOptions, O as Connection, n as OpenApiHooks } from "../create-B1d519XK.js";
5
+ import { t as ServerAdapterOptions } from "../bind-C_ob3LKa.js";
6
+ import { t as StreamProtectOptions } from "../stream-D1RXubw2.js";
8
7
  import { Middleware } from "@orpc/server";
9
8
  //#region src/orpc/create.d.ts
10
9
  type OrpcMiddlewareOpts<TCtx extends object = object, TInput = unknown> = {
@@ -18,33 +17,15 @@ type OrpcMiddlewareOpts<TCtx extends object = object, TInput = unknown> = {
18
17
  type OrpcMiddleware<TCtx extends object = object, TInput = unknown, V extends PolicyVocabulary = PolicyVocabulary> = Middleware<TCtx, TCtx & {
19
18
  readonly permdock: PermDock<V>;
20
19
  readonly permdockData?: unknown;
21
- }, TInput, unknown, Record<never, never>>;
22
- type OrpcPermDockOptions<TCtx extends object = object, TUser = unknown> = {
23
- readonly subject: (opts: OrpcMiddlewareOpts<TCtx>) => TUser | Promise<TUser>;
24
- readonly tenant?: TenantOption<OrpcMiddlewareOpts<TCtx>>;
20
+ }, TInput, any, Record<never, never>>;
21
+ type OrpcPermDockOptions<TCtx extends object = object, TUser = unknown> = ServerAdapterOptions<OrpcMiddlewareOpts<TCtx>, TUser> & {
25
22
  /** The Web `Request` behind a context; defaults to `context.request` or `context.req`. */
26
23
  readonly request?: (context: TCtx) => Request | null | undefined;
27
- readonly memberships?: MembershipSource | readonly MembershipSource[];
28
- /** The object graph for relation grants that walk a parent chain; without it they deny. */
29
- readonly relations?: RelationSource;
30
- readonly entitlements?: EntitlementSource;
31
- readonly customRoles?: RoleSource;
32
- /** Hosted grants, read once per instance; see `PolicySource`. */
33
- readonly policies?: PolicySource;
34
- readonly store?: ApprovalStore;
35
- readonly sink?: DecisionSink;
36
- readonly limits?: LimitStore;
37
- /** `createPermDock` from `permdock/pdp`; `protect` then decides delegated permissions remotely. */
38
- readonly pdp?: PdpFactory;
39
- /** Accepted for adapter parity; not read by this adapter. */
40
- readonly snapshots?: SnapshotSource;
41
- /** `(request) => verifyWebBotAuth(request, options)`; a verified bot becomes the actor. */
42
- readonly webBotAuth?: WebBotAuthVerifier;
43
24
  /** Ends or revalidates open event iterators. */
44
25
  readonly revocations?: RevocationFeed;
45
26
  };
46
27
  type OrpcOpenApiHooks<TCtx extends object = object, V extends PolicyVocabulary = PolicyVocabulary> = {
47
- readonly protect: (permission: Permission, loadData?: (opts: OrpcMiddlewareOpts<TCtx>) => unknown, protectOptions?: StreamProtectOptions) => OrpcMiddleware<TCtx, unknown, V>;
28
+ readonly protect: (permission: Permission | null, loadData?: (opts: OrpcMiddlewareOpts<TCtx>) => unknown, protectOptions?: StreamProtectOptions) => OrpcMiddleware<TCtx, unknown, V>;
48
29
  readonly security: (permission: Permission) => {
49
30
  readonly security: readonly Record<string, readonly string[]>[];
50
31
  readonly "x-permdock-permissions": readonly string[];
@@ -53,12 +34,18 @@ type OrpcOpenApiHooks<TCtx extends object = object, V extends PolicyVocabulary =
53
34
  };
54
35
  type OrpcPermDock<TCtx extends object = object, V extends PolicyVocabulary = PolicyVocabulary> = {
55
36
  readonly permdock: () => OrpcMiddleware<TCtx, unknown, V>;
56
- readonly protect: (permission: Permission, loadData?: (opts: OrpcMiddlewareOpts<TCtx>) => unknown, protectOptions?: StreamProtectOptions) => OrpcMiddleware<TCtx, unknown, V>;
37
+ readonly protect: (permission: Permission | null, loadData?: (opts: OrpcMiddlewareOpts<TCtx>) => unknown, protectOptions?: StreamProtectOptions) => OrpcMiddleware<TCtx, unknown, V>;
57
38
  /** A long-lived connection for the request behind `context`. */
58
39
  readonly connection: (opts: OrpcMiddlewareOpts<TCtx>, connectionOptions?: ConnectionOptions) => Promise<Connection>;
59
40
  readonly permdockHandler: (request: Request) => Promise<Response>;
60
41
  readonly openapi: OrpcOpenApiHooks<TCtx, V>;
61
42
  };
43
+ /**
44
+ * The permission the procedure's first `protect` decides, or `undefined`
45
+ * when no `protect` is attached. Reads the procedure definition only and
46
+ * never decides.
47
+ */
48
+ export declare function permissionOf(procedure: unknown): Permission | undefined;
62
49
  export declare function createPermDock<TCtx extends object = object, TUser = unknown, TPrincipal extends Principal = Principal, V extends PolicyVocabulary = PolicyVocabulary>(policy: Policy<TUser, TPrincipal, V>, options: OrpcPermDockOptions<TCtx, TUser>): OrpcPermDock<TCtx, V>;
63
50
  //#endregion
64
51
  export type { OrpcMiddleware, OrpcMiddlewareOpts, OrpcOpenApiHooks, OrpcPermDock, OrpcPermDockOptions };
@@ -1,17 +1,12 @@
1
1
  import { t as compact } from "../compact-y6vfu2_f.js";
2
- import { o as invalidSignatureResponse } from "../evaluations-DsAU9ppl.js";
3
- import { r as tenantScope, t as createKernel } from "../create-CSkhDU9T.js";
4
- import { t as problemFromError } from "../map-error-RJ3ZsUyA.js";
5
- import { n as guardIterable, r as isAsyncIterable } from "../stream-Q_xlB6Ko.js";
2
+ import { p as isPermission } from "../permissions-DVoF6dMt.js";
3
+ import { a as problemMessage } from "../http-SO7qGttf.js";
4
+ import { t as problemFromError } from "../map-error-pgUWNNtG.js";
5
+ import { n as attached } from "../bind-CuzGytRf.js";
6
+ import { a as reloadAfter, r as isAsyncIterable } from "../stream-DDpvynSB.js";
7
+ import { i as rpcCode, n as guardStream, r as problemBody, t as bindRpcKernel } from "../rpc-DL9Sqvb1.js";
6
8
  import { ORPCError } from "@orpc/server";
7
9
  //#region src/orpc/create.ts
8
- function hasBoundPermDock(context) {
9
- return context !== null && typeof context === "object" && "permdock" in context && context.permdock !== void 0;
10
- }
11
- function requestFromCtx(ctx) {
12
- if ("request" in ctx && ctx.request instanceof Request) return ctx.request;
13
- if ("req" in ctx && ctx.req instanceof Request) return ctx.req;
14
- }
15
10
  function toOpts(mw, input, next) {
16
11
  return compact({
17
12
  context: mw.context,
@@ -20,156 +15,118 @@ function toOpts(mw, input, next) {
20
15
  next
21
16
  });
22
17
  }
23
- function problemMessage(cause, fallback) {
24
- if (cause !== null && typeof cause === "object" && "detail" in cause && typeof cause.detail === "string" && cause.detail.length > 0) return cause.detail;
25
- return fallback;
18
+ function isErrorConstructor(value) {
19
+ return typeof value === "function";
26
20
  }
27
- function orpcCode(status) {
28
- switch (status) {
29
- case 400: return "BAD_REQUEST";
30
- case 401: return "UNAUTHORIZED";
31
- case 404: return "NOT_FOUND";
32
- case 429: return "TOO_MANY_REQUESTS";
33
- case 503: return "SERVICE_UNAVAILABLE";
34
- default: return "FORBIDDEN";
35
- }
21
+ /** Uses the procedure's own constructor when it declares the code, so the declared status and `defined` apply. */
22
+ function orpcError(code, message, data, errors) {
23
+ const declared = errors !== void 0 && Object.hasOwn(errors, code) ? errors[code] : void 0;
24
+ return isErrorConstructor(declared) ? declared({
25
+ message,
26
+ data
27
+ }) : new ORPCError(code, {
28
+ message,
29
+ data
30
+ });
36
31
  }
37
- function orpcErrorFrom(error) {
32
+ function orpcErrorFrom(error, errors) {
38
33
  const problem = error.toProblemDetails();
39
- return new ORPCError(orpcCode(problem.status), {
40
- message: error.code,
41
- data: problem
42
- });
34
+ return orpcError(rpcCode(problem.status), error.code, problem, errors);
43
35
  }
44
- async function throwOrpcError(response) {
45
- let data;
46
- try {
47
- data = await response.json();
48
- } catch {
49
- data = { status: response.status };
50
- }
51
- const code = orpcCode(response.status);
52
- throw new ORPCError(code, {
53
- message: problemMessage(data, code),
54
- data
55
- });
36
+ async function throwOrpcError(response, errors) {
37
+ const data = await problemBody(response);
38
+ const code = rpcCode(response.status);
39
+ throw orpcError(code, problemMessage(data, code), data, errors);
56
40
  }
57
41
  /** A PermDock error thrown further down (an `assert` in a handler) becomes the ORPCError `protect` throws. */
58
- function mapDownstream(run) {
42
+ function mapDownstream(run, errors) {
59
43
  return new Promise((resolve) => {
60
44
  resolve(run());
61
45
  }).catch((error) => {
62
46
  const mapped = problemFromError(error);
63
47
  if (mapped === void 0) throw error;
64
- return throwOrpcError(mapped);
48
+ return throwOrpcError(mapped, errors);
65
49
  });
66
50
  }
51
+ /** Registered, so a second copy of `permdock` in the bundle reads the same tag. */
52
+ const PERMISSION = Symbol.for("permdock.orpc.permission");
53
+ function tagged(permission, middleware) {
54
+ if (permission !== null) Object.defineProperty(middleware, PERMISSION, { value: permission });
55
+ return middleware;
56
+ }
57
+ function readOwn(value, key) {
58
+ return (typeof value === "object" || typeof value === "function") && value !== null && Object.hasOwn(value, key) ? Reflect.get(value, key) : void 0;
59
+ }
60
+ /**
61
+ * The permission the procedure's first `protect` decides, or `undefined`
62
+ * when no `protect` is attached. Reads the procedure definition only and
63
+ * never decides.
64
+ */
65
+ function permissionOf(procedure) {
66
+ const ordered = readOwn(readOwn(procedure, "~orpc"), "orderedMiddlewares");
67
+ if (!Array.isArray(ordered)) return;
68
+ for (const entry of ordered) {
69
+ const permission = readOwn(readOwn(entry, "middleware"), PERMISSION);
70
+ if (isPermission(permission)) return permission;
71
+ }
72
+ }
67
73
  function createPermDock(policy, options) {
68
- const optsByRequest = /* @__PURE__ */ new WeakMap();
69
- const requestByCtx = /* @__PURE__ */ new WeakMap();
70
- const kernel = createKernel(policy, compact({
71
- subject: (request) => {
72
- const opts = optsByRequest.get(request);
73
- return opts === void 0 ? null : options.subject(opts);
74
- },
75
- memberships: options.memberships,
76
- relations: options.relations,
77
- entitlements: options.entitlements,
78
- customRoles: options.customRoles,
79
- policies: options.policies,
80
- store: options.store,
81
- sink: options.sink,
82
- limits: options.limits,
83
- pdp: options.pdp,
84
- webBotAuth: options.webBotAuth,
85
- revocations: options.revocations,
86
- adapter: "orpc"
87
- }));
88
- const requestOf = (ctx) => {
89
- if (options.request !== void 0) try {
90
- return options.request(ctx) ?? void 0;
91
- } catch {
92
- return;
93
- }
94
- return requestFromCtx(ctx);
74
+ const { kernel, bind, attach, scopeOf, connection, evaluate } = bindRpcKernel(policy, options, "orpc", (opts) => opts.context, (opts) => opts.path?.join(".") ?? "orpc");
75
+ /** Instances this factory built, with the tenant each was built for. */
76
+ const issued = /* @__PURE__ */ new WeakMap();
77
+ const issue = (instance, scope) => {
78
+ issued.set(instance, scope.tenant);
79
+ return instance;
95
80
  };
96
- /**
97
- * One `Request` per HTTP request, shared by every procedure in a batch. The
98
- * subject reads the first procedure's opts; the tenant is resolved from each
99
- * procedure's own opts in `scopeOf`, never through the shared `Request`.
100
- */
101
- const bind = (opts) => {
102
- const ctx = opts.context;
103
- const hit = requestByCtx.get(ctx);
104
- if (hit !== void 0) return hit;
105
- const path = opts.path?.join(".") ?? "orpc";
106
- const request = requestOf(opts.context) ?? new Request(`http://localhost/orpc/${path}`, { method: "POST" });
107
- requestByCtx.set(ctx, request);
108
- if (!optsByRequest.has(request)) optsByRequest.set(request, opts);
109
- return request;
110
- };
111
- const scopeOf = (opts) => tenantScope(options.tenant, opts);
112
- const attach = (ctx, request) => {
113
- requestByCtx.set(ctx, request);
81
+ const boundFor = (context, scope) => {
82
+ const bound = Reflect.get(context, "permdock");
83
+ if (typeof bound !== "object" || bound === null || !issued.has(bound) || issued.get(bound) !== scope.tenant) return;
84
+ return bound;
114
85
  };
115
86
  const permdock = () => ((mwOptions, input) => {
116
87
  const opts = toOpts(mwOptions, input, mwOptions.next);
117
- if (hasBoundPermDock(opts.context)) return mwOptions.next({ context: opts.context });
118
88
  const request = bind(opts);
119
- return scopeOf(opts).then((scope) => kernel.permdock(request, scope)).then((instance) => {
89
+ return scopeOf(opts).then((scope) => attached(async () => boundFor(opts.context, scope) ?? issue(await kernel.permdock(request, scope), scope))).then((instance) => {
90
+ if (!instance.ok) return throwOrpcError(instance.response, mwOptions.errors);
120
91
  const nextCtx = {
121
92
  ...opts.context,
122
- permdock: instance
93
+ permdock: instance.permdock
123
94
  };
124
95
  attach(nextCtx, request);
125
- return mapDownstream(() => mwOptions.next({ context: nextCtx }));
126
- }, (error) => {
127
- const response = invalidSignatureResponse(error);
128
- if (response !== void 0) return throwOrpcError(response);
129
- throw error;
96
+ return mapDownstream(() => mwOptions.next({ context: nextCtx }), mwOptions.errors);
130
97
  });
131
98
  });
132
- const connection = async (opts, connectionOptions) => kernel.connection(bind(opts), connectionOptions, await scopeOf(opts));
133
99
  /** Wraps an event iterator so revocation ends it and unreadable items drop. */
134
- const guardOutput = async (result, opts, permission, loadData, protectOptions) => {
100
+ const guardOutput = async (result, opts, permission, loadData, protectOptions, errors) => {
135
101
  const output = result !== null && typeof result === "object" && "output" in result ? result.output : void 0;
136
102
  if (!isAsyncIterable(output)) return result;
137
- const conn = await connection(opts, compact({
138
- permission,
139
- data: loadData
140
- }));
141
103
  return {
142
104
  ...result,
143
- output: guardIterable(output, conn, compact({
144
- items: protectOptions?.items,
145
- onRevoked: orpcErrorFrom
146
- }))
105
+ output: await guardStream(output, (connectionOptions) => connection(opts, connectionOptions), permission, loadData, protectOptions, { onRevoked: (error) => orpcErrorFrom(error, errors) })
147
106
  };
148
107
  };
149
- const protect = (permission, loadData, protectOptions) => (async (mwOptions, input) => {
108
+ const protect = (permission, loadData, protectOptions) => tagged(permission, (async (mwOptions, input) => {
150
109
  const opts = toOpts(mwOptions, input, mwOptions.next);
151
110
  const request = bind(opts);
152
- const guard = await kernel.protect(permission, loadData === void 0 ? void 0 : () => loadData(opts), protectOptions)(request, await scopeOf(opts));
111
+ const scope = await scopeOf(opts);
112
+ const guard = await kernel.protect(permission, loadData === void 0 ? void 0 : () => loadData(opts), protectOptions)(request, scope);
153
113
  if (guard.ok) {
154
114
  const nextCtx = {
155
115
  ...opts.context,
156
- permdock: guard.permdock,
116
+ permdock: issue(guard.permdock, scope),
157
117
  permdockData: guard.data
158
118
  };
159
119
  attach(nextCtx, request);
160
- return guardOutput(await mapDownstream(() => mwOptions.next({ context: nextCtx })), opts, permission, loadData === void 0 ? void 0 : () => loadData(opts), protectOptions);
120
+ return guardOutput(await mapDownstream(() => mwOptions.next({ context: nextCtx }), mwOptions.errors), opts, permission, loadData === void 0 ? void 0 : reloadAfter(guard.data, () => loadData(opts)), protectOptions, mwOptions.errors);
161
121
  }
162
- return throwOrpcError(guard.response);
163
- });
122
+ return throwOrpcError(guard.response, mwOptions.errors);
123
+ }));
164
124
  const permdockHandler = (request) => {
165
- const opts = {
125
+ return evaluate(request, {
166
126
  context: { req: request },
167
127
  path: ["permdock"],
168
128
  next: (nextOpts) => Promise.resolve(nextOpts ?? { context: { req: request } })
169
- };
170
- bind(opts);
171
- const { POST, GET } = kernel.permdockHandler(() => scopeOf(opts));
172
- return Promise.resolve(request.method === "GET" ? GET(request) : POST(request));
129
+ });
173
130
  };
174
131
  const kernelOpenApi = kernel.openapi;
175
132
  return {
@@ -185,4 +142,4 @@ function createPermDock(policy, options) {
185
142
  };
186
143
  }
187
144
  //#endregion
188
- export { createPermDock };
145
+ export { createPermDock, permissionOf };