permdock 0.1.0 → 0.2.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 (349) 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-cmvX2jDe.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 +206 -0
  18. package/dist/better-supabase/index.js +620 -0
  19. package/dist/bind-CVy3Espv.d.ts +25 -0
  20. package/dist/bind-VnYn2HKq.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-B68OFnZx.js → capability-4qPdO9gk.js} +7 -5
  25. package/dist/{capability-BDG_nkxt.d.ts → capability-Dq43tT1u.d.ts} +2 -2
  26. package/dist/catalog/index.d.ts +1 -1
  27. package/dist/catalog/index.js +1 -1
  28. package/dist/catalog-BjZSovXQ.js +2 -0
  29. package/dist/{catalog-doc-BSo_Q_-6.js → catalog-doc-Dsc9y7sd.js} +23 -12
  30. package/dist/{catalog-B0E6bggc.js → catalog-h2tlKFkq.js} +2 -2
  31. package/dist/{catalog-H-vFGwWK.js → catalog-z8q6bi_r.js} +4 -4
  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-BGhHS-lY.js} +2 -2
  44. package/dist/{cloud-Cuxr6Czw.js → cloud-Bo3e9Ak3.js} +7 -6
  45. package/dist/{collect-O-tOtbnk.js → collect-DDDv_ESs.js} +194 -42
  46. package/dist/collect-DLlujdHC.js +83 -0
  47. package/dist/collect-rG2IQ3t0.js +2 -0
  48. package/dist/{commands-BMh_Etm2.js → commands-DWOrSQic.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-CNnl6uIt.d.ts +94 -0
  53. package/dist/config-BJiM-xAm.js +157 -0
  54. package/dist/config-Bn00Z3ks.js +36 -0
  55. package/dist/config-report-Dw_JcUqT.js +44 -0
  56. package/dist/{connection-JvqwHODC.js → connection-CU8MQxRi.js} +1 -1
  57. package/dist/{context-CKEAabd7.js → context-Ttp0ekMT.js} +36 -27
  58. package/dist/convex/index.d.ts +9 -4
  59. package/dist/convex/index.js +14 -4
  60. package/dist/create-BWyx3jua.d.ts +245 -0
  61. package/dist/create-CPhDL6qx.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-PdoqESvg.d.ts} +9 -10
  66. package/dist/{diff-x5Il8LVa.js → diff-B8Tunc3o.js} +44 -11
  67. package/dist/{diff-BUzf5Poi.js → diff-CzqLxZ77.js} +2 -2
  68. package/dist/doctor-WpvG6p4k.js +1194 -0
  69. package/dist/doctor-collect-ByfYlNv1.js +664 -0
  70. package/dist/{doctor-Bqo6FwUa.js → doctor-rOr-4ZfS.js} +2 -2
  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-DAqevpNk.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-C3sHpZNS.js} +65 -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-LF_hS-yn.d.ts → index-A0YNL8jZ.d.ts} +1 -1
  105. package/dist/index-CtE07CBF.d.ts +6 -0
  106. package/dist/{index-xIxJLwOQ.d.ts → index-D3vbkoSI.d.ts} +75 -7
  107. package/dist/{index-CltcQ4Bf.d.ts → index-D6_cSa1z.d.ts} +68 -5
  108. package/dist/index.d.ts +14 -9
  109. package/dist/index.js +22 -17
  110. package/dist/instance-options-BK_rNOSC.d.ts +11 -0
  111. package/dist/instance-options-Dhhcnm3y.js +22 -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-GSQnMz3O.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-CwePaF7C.js → openapi-Bbg4wGVL.js} +3 -3
  144. package/dist/{openapi-DcqM8nU7.js → openapi-BqRBvAng.js} +237 -5
  145. package/dist/{openapi-DWD0Uc_4.js → openapi-CqqEbHsL.js} +5 -5
  146. package/dist/{openapi-import-BWRUNNeW.js → openapi-import-cmwetbzw.js} +1 -1
  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-BkGQNzAh.d.ts +10 -0
  153. package/dist/parse-local-manifest-BrMozJCo.js +36 -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-CzqXjCpU.js} +641 -126
  157. package/dist/{permissions-B8vCg_bI.d.ts → permissions-CDgvKG5L.d.ts} +2 -2
  158. package/dist/{permissions-CofRqesP.js → permissions-CpZrivYv.js} +3 -3
  159. package/dist/{permissions-DC7GROPA.js → permissions-DVoF6dMt.js} +77 -15
  160. package/dist/{permissions-B4apnahQ.d.ts → permissions-DttnqqxC.d.ts} +34 -5
  161. package/dist/{pins-CqE1jZuF.js → pins-8ILTftC9.js} +2 -2
  162. package/dist/{policy-CInmNGkM.d.ts → policy-CFZAr_Al.d.ts} +330 -37
  163. package/dist/{policy-Cq2fB8Q5.d.ts → policy-D8UFyERw.d.ts} +2 -2
  164. package/dist/{policy-ANp36PnI.js → policy-xyWg7QdR.js} +173 -22
  165. package/dist/powersync-A8x_Yyvh.js +2 -0
  166. package/dist/powersync-C7kLglqX.js +540 -0
  167. package/dist/powersync-yW1UUFzp.js +62 -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-CkL50EEf.d.ts +7 -0
  172. package/dist/problem-details-_AMOYz-w.js +144 -0
  173. package/dist/{protected-BuPAycJT.d.ts → protected-CNsMzrVd.d.ts} +5 -4
  174. package/dist/protected-Cs6kTaHo.js +100 -0
  175. package/dist/protected-bZs6rbT1.d.ts +40 -0
  176. package/dist/{provider-wTAUda2v.d.ts → provider-Cjr62YMV.d.ts} +1 -1
  177. package/dist/provider-DLzpb2Xz.js +52 -0
  178. package/dist/provider-store-DNyC1y48.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-sqBGMnNs.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-BMNydpHk.js +2521 -0
  192. package/dist/{rls-BOFU3chG.js → rls-CEvs64Kj.js} +8 -3
  193. package/dist/rls-fields-BMasREhR.js +3502 -0
  194. package/dist/{rls-graph-DxQ39PJj.js → rls-graph-pc9fuXYm.js} +100 -36
  195. package/dist/{rls-import-CXV6LBlS.js → rls-import-D8F7j35Q.js} +7 -6
  196. package/dist/{rls-migrate-DrFPbf8p.js → rls-migrate-7wikfrVI.js} +6 -5
  197. package/dist/rls-ownership-B5Lkq62W.js +843 -0
  198. package/dist/rls-shared-aOQ4hGTO.js +493 -0
  199. package/dist/rls-verify-D8B7dOTh.js +745 -0
  200. package/dist/{row-check-BajTgQZ-.d.ts → row-check-Dt35czLy.d.ts} +12 -15
  201. package/dist/rpc-DOK54_CS.js +89 -0
  202. package/dist/{run-CJ6UvS3a.js → run-YXCJDNYk.js} +31 -12
  203. package/dist/runtime-CB8gQFvS.js +11 -0
  204. package/dist/{saas-BRrZzJkM.js → saas-Bj_FFkjN.js} +17 -7
  205. package/dist/{schema-P8yoma__.js → schema-D3MnDMxa.js} +8 -4
  206. package/dist/scim/index.d.ts +1 -1
  207. package/dist/scim/index.js +1 -1
  208. package/dist/{scim-9NFa0XVZ.js → scim-BFGBBAqR.js} +1 -1
  209. package/dist/{scopes-cKVp_WTw.js → scopes-CVdPrWN-.js} +35 -8
  210. package/dist/server/index.d.ts +22 -11
  211. package/dist/server/index.js +11 -8
  212. package/dist/{credentials-BgRX3WEg.js → server-DlZ28Oz5.js} +1 -1
  213. package/dist/shared-DRu8VFVM.js +123 -0
  214. package/dist/{sink-Cfr9-7YC.d.ts → sink-Gs6TTVa-.d.ts} +1 -1
  215. package/dist/skills-Biq5uup3.js +192 -0
  216. package/dist/{skills-C_lpV4Jx.js → skills-JaymNCdK.js} +10 -4
  217. package/dist/{snapshot-DE8dE_hz.js → snapshot-Enxd0n-s.js} +138 -214
  218. package/dist/snapshot-cache-D6jLelln.js +44 -0
  219. package/dist/snapshot-cache-DwQH8ufx.d.ts +45 -0
  220. package/dist/solid/index.d.ts +39 -9
  221. package/dist/solid/index.js +76 -85
  222. package/dist/sources-B0UvrJ21.js +534 -0
  223. package/dist/sources-BcJgw0lt.d.ts +192 -0
  224. package/dist/{sql-Bll1d7y0.js → sql-xdg5f4Fi.js} +6 -1
  225. package/dist/{src-CTNT-PBW.js → src-CSbUiozF.js} +149 -11
  226. package/dist/ssf/index.d.ts +3 -2
  227. package/dist/ssf/index.js +3 -29
  228. package/dist/store-DMAWwAJV.js +371 -0
  229. package/dist/{store-Bq90395i.d.ts → store-D_pjn91-.d.ts} +13 -4
  230. package/dist/store-options-yO0V6gRn.js +716 -0
  231. package/dist/{stores-CkG2HrSg.js → stores-4_sqiOA1.js} +10 -63
  232. package/dist/{stores-CvOnu_2T.d.ts → stores-DVR5NHLE.d.ts} +20 -9
  233. package/dist/{stream-Q_xlB6Ko.js → stream-DDpvynSB.js} +16 -2
  234. package/dist/{stream-BhMfZOwr.d.ts → stream-DlvG2hs-.d.ts} +2 -2
  235. package/dist/subject-settings-BwBmCdTR.js +128 -0
  236. package/dist/supabase/index.d.ts +122 -6
  237. package/dist/supabase/index.js +4 -3
  238. package/dist/supabase/middleware.d.ts +32 -27
  239. package/dist/supabase/middleware.js +56 -22
  240. package/dist/{supabase-D8UlBA7Z.js → supabase-CwafwxxF.js} +3 -3
  241. package/dist/{supabase-DTxGtYdi.js → supabase-DTBaC20O.js} +345 -367
  242. package/dist/supabase-config-Bs44dare.js +472 -0
  243. package/dist/{supabase-hook-D_OqGb_V.js → supabase-hook-BuxLQLpU.js} +994 -708
  244. package/dist/supabase-hook-D5qVd_D8.js +2 -0
  245. package/dist/supautils-DYZnzRWV.js +91 -0
  246. package/dist/svelte/PermissionBoundary.svelte +37 -0
  247. package/dist/svelte/Protected.svelte +8 -2
  248. package/dist/svelte/index.d.ts +9 -6
  249. package/dist/svelte/index.js +61 -7
  250. package/dist/svelte/runtime.d.ts +4 -3
  251. package/dist/svelte/runtime.js +4 -3
  252. package/dist/svelte/source.d.ts +9 -6
  253. package/dist/svelte/source.js +7 -4
  254. package/dist/terminal/index.d.ts +6 -14
  255. package/dist/terminal/index.js +44 -32
  256. package/dist/testing/index.d.ts +105 -16
  257. package/dist/testing/index.js +504 -40
  258. package/dist/testing/saas/index.d.ts +4 -4
  259. package/dist/testing/saas/index.js +2 -2
  260. package/dist/testing/saas/permissions.d.ts +1 -1
  261. package/dist/testing/saas/permissions.js +1 -1
  262. package/dist/token-CIWxJOCh.js +50 -0
  263. package/dist/trpc/index.d.ts +7 -26
  264. package/dist/trpc/index.js +17 -100
  265. package/dist/types-9AWO9EGt.d.ts +197 -0
  266. package/dist/{types-D6Z6-rKJ.d.ts → types-BPxgszlT.d.ts} +260 -22
  267. package/dist/{types-BvBk1wgn.d.ts → types-BVyImy5I.d.ts} +5 -3
  268. package/dist/{types-CxquUByI.d.ts → types-Bvc4oWT6.d.ts} +1 -1
  269. package/dist/types-C3s9xVJG.d.ts +48 -0
  270. package/dist/{types-BBK-exvJ.d.ts → types-Dnemwd77.d.ts} +7 -1
  271. package/dist/types-kxznc7cn.d.ts +52 -0
  272. package/dist/{types-B8w5PFtS.d.ts → types-vKyAMtcX.d.ts} +17 -1
  273. package/dist/{types-B9dmiiab.d.ts → types-vNSDF7Dq.d.ts} +1 -1
  274. package/dist/{sources-DOpW5Ila.d.ts → types-yF5LmQVD.d.ts} +86 -127
  275. package/dist/unplugin/index.d.ts +1 -1
  276. package/dist/unplugin/index.js +10 -9
  277. package/dist/{usage-1ozMubLY.js → usage-D07N9QJ3.js} +2 -2
  278. package/dist/usage-D82l1CwK.js +2 -0
  279. package/dist/{usage-CUnK6Ou9.js → usage-DG1oeCca.js} +225 -62
  280. package/dist/validation-error-CnjZ4t92.js +33 -0
  281. package/dist/validation-error-CtF23SrC.d.ts +26 -0
  282. package/dist/{validity-D0uRmJKJ.js → validity-uOp8UpYn.js} +57 -36
  283. package/dist/{verifier-B90agnhl.js → verifier-BxBo6I44.js} +10 -5
  284. package/dist/version-BvacVTZR.js +17 -0
  285. package/dist/views-Soe7bGSC.js +95 -0
  286. package/dist/{vocabulary-Dk0fs-Jk.d.ts → vocabulary-DA8a8zif.d.ts} +1 -1
  287. package/dist/vue/index.d.ts +35 -13
  288. package/dist/vue/index.js +86 -93
  289. package/dist/watch-Etoa_Mvr.js +2 -0
  290. package/dist/watch-UihESpsJ.js +128 -0
  291. package/dist/webmcp/index.d.ts +2 -2
  292. package/dist/webmcp/index.js +7 -13
  293. package/package.json +62 -36
  294. package/schemas/approval-request-v1.json +175 -0
  295. package/schemas/catalog-v1.json +29 -1
  296. package/schemas/supabase-claims-v1.json +6 -1
  297. package/schemas/supabase-manifest-v1.json +150 -6
  298. package/skills/permdock/SKILL.md +7 -7
  299. package/skills/permdock-agents/SKILL.md +5 -5
  300. package/skills/permdock-agents/references/runtimes.md +12 -10
  301. package/skills/permdock-approvals/SKILL.md +4 -4
  302. package/skills/permdock-approvals/references/stores-and-resume.md +15 -4
  303. package/skills/permdock-audit/SKILL.md +3 -3
  304. package/skills/permdock-credentials/SKILL.md +4 -4
  305. package/skills/permdock-credentials/references/tokens-keys-links.md +7 -2
  306. package/skills/permdock-data/SKILL.md +4 -4
  307. package/skills/permdock-data/references/queries-and-rls.md +14 -6
  308. package/skills/permdock-data/references/relationships.md +5 -3
  309. package/skills/permdock-tenancy/SKILL.md +9 -6
  310. package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +14 -8
  311. package/skills/permdock-wire/SKILL.md +4 -4
  312. package/skills/permdock-wire/references/adapters.md +42 -30
  313. package/skills/permdock-wire/references/policy-options.md +5 -3
  314. package/dist/approvers-aH0PJkmf.js +0 -20
  315. package/dist/catalog-idsHc0vo.js +0 -2
  316. package/dist/collect-B7_TIfmg.js +0 -49
  317. package/dist/collect-fRPAQIWb.js +0 -2
  318. package/dist/compile-CQbvyIBr.d.ts +0 -30
  319. package/dist/config-BPYmjTOp.js +0 -26
  320. package/dist/context-gtAwAILx.js +0 -6
  321. package/dist/create-BKF3dgFk.d.ts +0 -162
  322. package/dist/create-CSkhDU9T.js +0 -222
  323. package/dist/doctor-BGle8Gqi.js +0 -1314
  324. package/dist/helpers-DnSOrhB9.js +0 -682
  325. package/dist/index-fG6NSXlc.d.ts +0 -9
  326. package/dist/kernel-YOGCWNLf.js +0 -211
  327. package/dist/load-QOOm1z70.js +0 -2
  328. package/dist/manifest-DDQbC6K0.d.ts +0 -118
  329. package/dist/map-error-RJ3ZsUyA.js +0 -16
  330. package/dist/may-use-CnFEjVEp.js +0 -37
  331. package/dist/pg-4GJWDUxG.js +0 -953
  332. package/dist/plugin-4gr7IxFJ.js +0 -65
  333. package/dist/protected-B4K3BKoX.js +0 -138
  334. package/dist/protected-wY7nXhY9.d.ts +0 -23
  335. package/dist/provider-_wx46HpB.js +0 -48
  336. package/dist/rls-CJVja9Ww.js +0 -2119
  337. package/dist/rls-helpers-BxRuif0l.js +0 -1346
  338. package/dist/runtime-DP9ttFh1.js +0 -27
  339. package/dist/skills-Dx3QLnMY.js +0 -110
  340. package/dist/source-DoBBYJi2.js +0 -6
  341. package/dist/sources-DVHM3Mwq.js +0 -284
  342. package/dist/store-C6hFW6ta.js +0 -508
  343. package/dist/subject-settings-xt7V845g.js +0 -82
  344. package/dist/supabase-hook-DW-xP4hU.js +0 -2
  345. package/dist/types-DbWdEfcm.d.ts +0 -87
  346. package/dist/types-bva3i4Gf.d.ts +0 -98
  347. package/dist/types-i4BAOvdb.d.ts +0 -97
  348. package/dist/usage-PyEor6GA.js +0 -2
  349. package/dist/version-CnSh33Fj.js +0 -16
@@ -0,0 +1,7 @@
1
+ //#region src/core/expiry.ts
2
+ /** `expiresAt` is Unix seconds; a membership with none never expires. */
3
+ function expiredAt(item, now) {
4
+ return item.expiresAt !== void 0 && item.expiresAt <= now;
5
+ }
6
+ //#endregion
7
+ export { expiredAt as t };
@@ -1,41 +1,18 @@
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";
4
- import { o as OtelWrap } from "../types-B9dmiiab.js";
5
- import { r as PdpFactory } from "../types-BvBk1wgn.js";
6
- import { g as discoverViaSignatureAgent, h as WebBotAuthVerifier, n as OpenApiHooks, o as TenantOption, r as ProtectOptions, u as InvalidSignatureError, y as verifyWebBotAuth } from "../create-BKF3dgFk.js";
1
+ import { C as Policy, D as PolicyVocabulary, Nr as Principal, ln as PermDock } from "../policy-CFZAr_Al.js";
2
+ import { f as Permission } from "../permissions-DttnqqxC.js";
3
+ import { h as InvalidSignatureError, i as ProtectOptions, n as OpenApiHooks, w as verifyWebBotAuth, x as discoverViaSignatureAgent } from "../create-BWyx3jua.js";
4
+ import { t as ServerAdapterOptions } from "../bind-CVy3Espv.js";
7
5
  import { a as toRequest, i as sendResponse } from "../http-DPuDaChb.js";
8
6
  import { ErrorRequestHandler, Request, RequestHandler, Response, Router } from "express";
9
7
  //#region src/express/create.d.ts
10
- type ExpressPermDockOptions<TUser = unknown> = {
11
- readonly subject: (req: Request) => TUser | Promise<TUser>;
12
- readonly tenant?: TenantOption<Request>;
13
- readonly memberships?: MembershipSource | readonly MembershipSource[];
14
- /** The object graph for relation grants that walk a parent chain; without it they deny. */
15
- readonly relations?: RelationSource;
16
- readonly entitlements?: EntitlementSource;
17
- readonly customRoles?: RoleSource;
18
- /** Hosted grants, read once per instance; see `PolicySource`. */
19
- readonly policies?: PolicySource;
20
- readonly store?: ApprovalStore;
21
- readonly sink?: DecisionSink;
22
- readonly limits?: LimitStore;
23
- /** `createPermDock` from `permdock/pdp`; `protect` then decides delegated permissions remotely. */
24
- readonly pdp?: PdpFactory;
25
- /** Accepted for adapter parity; not read by this adapter. */
26
- readonly snapshots?: SnapshotSource;
27
- /** `(permdock) => withOtel(permdock, options)` from `permdock/otel`. */
28
- readonly otel?: OtelWrap;
29
- /** `(request) => verifyWebBotAuth(request, options)`; a verified bot becomes the actor. */
30
- readonly webBotAuth?: WebBotAuthVerifier;
31
- };
8
+ type ExpressPermDockOptions<TUser = unknown> = ServerAdapterOptions<Request, TUser>;
32
9
  type PermDockRequest<T = unknown, V extends PolicyVocabulary = PolicyVocabulary> = Request & {
33
10
  permdock: PermDock<V>;
34
11
  permdockData?: T;
35
12
  };
36
13
  type ExpressPermDock<V extends PolicyVocabulary = PolicyVocabulary> = {
37
14
  readonly permdock: () => RequestHandler;
38
- readonly protect: (permission: Permission, loadData?: (req: Request) => unknown, protectOptions?: ProtectOptions) => RequestHandler;
15
+ readonly protect: (permission: Permission | null, loadData?: (req: Request) => unknown, protectOptions?: ProtectOptions) => RequestHandler;
39
16
  readonly errorHandler: () => ErrorRequestHandler;
40
17
  readonly permdockHandler: () => Router;
41
18
  readonly withPermDock: (fn: (req: PermDockRequest<unknown, V>, res: Response) => unknown) => RequestHandler;
@@ -1,15 +1,14 @@
1
- import { t as compact } from "../compact-y6vfu2_f.js";
2
- import { i as discoverViaSignatureAgent, r as InvalidSignatureError, s as verifyWebBotAuth } 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 { i as toRequest, r as sendResponse } from "../http-GgVApX1k.js";
1
+ import { i as discoverViaSignatureAgent, r as InvalidSignatureError, s as verifyWebBotAuth } from "../evaluations-tz6D9A2G.js";
2
+ import { t as problemFromError } from "../map-error-pgUWNNtG.js";
3
+ import { i as decorate, r as bindKernel } from "../bind-VnYn2HKq.js";
4
+ import { i as toRequest, r as sendResponse } from "../http-BIhmLfCc.js";
6
5
  import express from "express";
7
6
  //#region src/express/create.ts
8
7
  function run(work, next) {
9
8
  work().catch(next);
10
9
  }
11
- const errorHandler = () => (err, _req, res, next) => {
12
- const problem = problemFromError(err);
10
+ function sendProblem(err, req, res, next) {
11
+ const problem = problemFromError(err, { credentials: req.headers.authorization !== void 0 });
13
12
  if (problem === void 0) {
14
13
  next(err);
15
14
  return;
@@ -17,81 +16,52 @@ const errorHandler = () => (err, _req, res, next) => {
17
16
  run(async () => {
18
17
  await sendResponse(res, problem);
19
18
  }, next);
19
+ }
20
+ /** Answers a PermDock error with Problem Details; anything else reaches the app's error middleware. */
21
+ function respond(req, res, next, work) {
22
+ work().catch((err) => {
23
+ sendProblem(err, req, res, next);
24
+ });
25
+ }
26
+ const errorHandler = () => (err, req, res, next) => {
27
+ sendProblem(err, req, res, next);
20
28
  };
21
29
  const withPermDock = (fn) => (req, res, next) => {
22
30
  run(async () => {
23
31
  await fn(req, res);
24
32
  }, next);
25
33
  };
26
- /** Runs `use` on the Express request bound to `request`; `fallback` for a request this adapter never bound. */
27
- function withBound(contexts, request, use, fallback) {
28
- const req = contexts.get(request);
29
- return req === void 0 ? fallback : use(req);
30
- }
31
34
  function createPermDock(policy, options) {
32
- const contexts = /* @__PURE__ */ new WeakMap();
33
- const bound = /* @__PURE__ */ new WeakMap();
34
- const kernel = createKernel(policy, compact({
35
- subject: (request) => withBound(contexts, request, options.subject, null),
36
- memberships: options.memberships,
37
- relations: options.relations,
38
- entitlements: options.entitlements,
39
- customRoles: options.customRoles,
40
- policies: options.policies,
41
- store: options.store,
42
- sink: options.sink,
43
- limits: options.limits,
44
- pdp: options.pdp,
45
- webBotAuth: options.webBotAuth,
46
- adapter: "express",
47
- wrap: options.otel
48
- }));
49
- const bind = (req) => {
50
- const hit = bound.get(req);
51
- if (hit !== void 0) return hit;
52
- const request = toRequest(req);
53
- bound.set(req, request);
54
- contexts.set(request, req);
55
- return request;
56
- };
57
- const scopeOf = (req) => tenantScope(options.tenant, req);
58
- /** The decision endpoint reads the body a parser may have consumed since `bind`. */
59
- const rebind = (req) => {
60
- const request = toRequest(req);
61
- contexts.set(request, req);
62
- return request;
63
- };
64
- const permdock = () => (req, _res, next) => {
65
- run(async () => {
66
- req.permdock = await kernel.permdock(bind(req), await scopeOf(req));
35
+ const { kernel, bind, rebind, scopeOf, handlerScope } = bindKernel(policy, options, "express", toRequest);
36
+ const permdock = () => (req, res, next) => {
37
+ respond(req, res, next, async () => {
38
+ decorate(req, await kernel.permdock(bind(req), await scopeOf(req)));
67
39
  next();
68
- }, next);
40
+ });
69
41
  };
70
42
  const protect = (permission, loadData, protectOptions) => (req, res, next) => {
71
- run(async () => {
43
+ respond(req, res, next, async () => {
72
44
  const guard = await kernel.protect(permission, loadData === void 0 ? void 0 : () => loadData(req), protectOptions)(bind(req), await scopeOf(req));
73
45
  if (!guard.ok) {
74
46
  await sendResponse(res, guard.response);
75
47
  return;
76
48
  }
77
- const scoped = req;
78
- scoped.permdock = guard.permdock;
79
- scoped.permdockData = guard.data;
49
+ decorate(req, guard.permdock, guard.data);
80
50
  next();
81
- }, next);
51
+ });
82
52
  };
83
53
  const permdockHandler = () => {
84
- const { POST, GET } = kernel.permdockHandler((request) => withBound(contexts, request, scopeOf, { tenant: void 0 }));
54
+ const { POST, GET } = kernel.permdockHandler(handlerScope);
85
55
  const router = express.Router({ mergeParams: true });
86
56
  router.post("/", (req, res, next) => {
87
- run(async () => {
57
+ respond(req, res, next, async () => {
88
58
  await sendResponse(res, await POST(rebind(req)));
89
- }, next);
59
+ });
90
60
  });
91
61
  router.get("/", (req, res, next) => {
92
- run(async () => {
62
+ respond(req, res, next, async () => {
93
63
  await sendResponse(res, await GET(bind(req)));
94
- }, next);
64
+ });
95
65
  });
96
66
  return router;
97
67
  };
@@ -1,33 +1,10 @@
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";
4
- import { o as OtelWrap } from "../types-B9dmiiab.js";
5
- import { r as PdpFactory } from "../types-BvBk1wgn.js";
6
- import { g as discoverViaSignatureAgent, h as WebBotAuthVerifier, n as OpenApiHooks, o as TenantOption, r as ProtectOptions, u as InvalidSignatureError, y as verifyWebBotAuth } from "../create-BKF3dgFk.js";
1
+ import { C as Policy, D as PolicyVocabulary, Nr as Principal, ln as PermDock } from "../policy-CFZAr_Al.js";
2
+ import { f as Permission } from "../permissions-DttnqqxC.js";
3
+ import { h as InvalidSignatureError, i as ProtectOptions, n as OpenApiHooks, w as verifyWebBotAuth, x as discoverViaSignatureAgent } from "../create-BWyx3jua.js";
4
+ import { t as ServerAdapterOptions } from "../bind-CVy3Espv.js";
7
5
  import { FastifyPluginAsync, FastifyReply, FastifyRequest, FastifySchema, FastifyTypeProvider, FastifyTypeProviderDefault, RawRequestDefaultExpression, RawServerDefault, RouteGenericInterface } from "fastify";
8
6
  //#region src/fastify/create.d.ts
9
- type FastifyPermDockOptions<TUser = unknown> = {
10
- readonly subject: (request: FastifyRequest) => TUser | Promise<TUser>;
11
- readonly tenant?: TenantOption<FastifyRequest>;
12
- readonly memberships?: MembershipSource | readonly MembershipSource[];
13
- /** The object graph for relation grants that walk a parent chain; without it they deny. */
14
- readonly relations?: RelationSource;
15
- readonly entitlements?: EntitlementSource;
16
- readonly customRoles?: RoleSource;
17
- /** Hosted grants, read once per instance; see `PolicySource`. */
18
- readonly policies?: PolicySource;
19
- readonly store?: ApprovalStore;
20
- readonly sink?: DecisionSink;
21
- readonly limits?: LimitStore;
22
- /** `createPermDock` from `permdock/pdp`; `protect` then decides delegated permissions remotely. */
23
- readonly pdp?: PdpFactory;
24
- /** Accepted for adapter parity; not read by this adapter. */
25
- readonly snapshots?: SnapshotSource;
26
- /** `(permdock) => withOtel(permdock, options)` from `permdock/otel`. */
27
- readonly otel?: OtelWrap;
28
- /** `(request) => verifyWebBotAuth(request, options)`; a verified bot becomes the actor. */
29
- readonly webBotAuth?: WebBotAuthVerifier;
30
- };
7
+ type FastifyPermDockOptions<TUser = unknown> = ServerAdapterOptions<FastifyRequest, TUser>;
31
8
  type PermDockRequest<Route extends RouteGenericInterface = RouteGenericInterface, V extends PolicyVocabulary = PolicyVocabulary> = FastifyRequest<Route> & {
32
9
  permdock: PermDock<V>;
33
10
  permdockData?: unknown;
@@ -38,7 +15,7 @@ type ProtectRequest<Route extends RouteGenericInterface = RouteGenericInterface,
38
15
  * Generic over the route, schema and type provider so a `preHandler` slot
39
16
  * infers them: `loadData` sees the same typed `request.body` as the handler.
40
17
  */
41
- type FastifyProtect = <Route extends RouteGenericInterface = RouteGenericInterface, Schema extends FastifySchema = FastifySchema, Provider extends FastifyTypeProvider = FastifyTypeProviderDefault>(permission: Permission, loadData?: (request: ProtectRequest<Route, Schema, Provider>) => unknown, protectOptions?: ProtectOptions) => (request: ProtectRequest<Route, Schema, Provider>, reply: FastifyReply) => Promise<void>;
18
+ type FastifyProtect = <Route extends RouteGenericInterface = RouteGenericInterface, Schema extends FastifySchema = FastifySchema, Provider extends FastifyTypeProvider = FastifyTypeProviderDefault>(permission: Permission | null, loadData?: (request: ProtectRequest<Route, Schema, Provider>) => unknown, protectOptions?: ProtectOptions) => (request: ProtectRequest<Route, Schema, Provider>, reply: FastifyReply) => Promise<void>;
42
19
  type FastifyPermDock<V extends PolicyVocabulary = PolicyVocabulary> = {
43
20
  readonly permdock: FastifyPluginAsync;
44
21
  readonly protect: FastifyProtect;
@@ -1,25 +1,18 @@
1
- import { t as compact } from "../compact-y6vfu2_f.js";
2
- import { i as discoverViaSignatureAgent, r as InvalidSignatureError, s as verifyWebBotAuth } 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";
1
+ import { i as parsedBody, r as headersFrom, t as firstHeader } from "../http-SO7qGttf.js";
2
+ import { i as discoverViaSignatureAgent, r as InvalidSignatureError, s as verifyWebBotAuth } from "../evaluations-tz6D9A2G.js";
3
+ import { t as problemFromError } from "../map-error-pgUWNNtG.js";
4
+ import { i as decorate, r as bindKernel } from "../bind-VnYn2HKq.js";
5
5
  //#region src/fastify/http.ts
6
6
  function toRequest(request) {
7
- const host = headerValue(request.headers.host) ?? "localhost";
7
+ const host = firstHeader(request.headers.host) ?? "localhost";
8
8
  const url = `${request.protocol}://${host}${request.url}`;
9
- const headers = new Headers();
10
- for (const [key, value] of Object.entries(request.headers)) {
11
- if (typeof value === "string") {
12
- headers.set(key, value);
13
- continue;
14
- }
15
- if (Array.isArray(value)) for (const item of value) headers.append(key, item);
16
- }
9
+ const headers = headersFrom(request.headers);
17
10
  const method = request.method;
18
11
  if (method === "GET" || method === "HEAD") return new Request(url, {
19
12
  method,
20
13
  headers
21
14
  });
22
- const body = bodyOf(request, headers);
15
+ const body = parsedBody(request.body, headers);
23
16
  if (body === void 0) return new Request(url, {
24
17
  method,
25
18
  headers
@@ -30,16 +23,6 @@ function toRequest(request) {
30
23
  body
31
24
  });
32
25
  }
33
- function headerValue(value) {
34
- if (typeof value === "string" && value.length > 0) return value;
35
- if (Array.isArray(value) && typeof value[0] === "string") return value[0];
36
- }
37
- function bodyOf(request, headers) {
38
- if (request.body === void 0) return;
39
- if (typeof request.body === "string") return request.body;
40
- if (!headers.has("content-type")) headers.set("content-type", "application/json");
41
- return JSON.stringify(request.body);
42
- }
43
26
  async function sendReply(reply, response) {
44
27
  reply.code(response.status);
45
28
  for (const [key, value] of response.headers.entries()) reply.header(key, value);
@@ -52,50 +35,23 @@ function breakEncapsulation(plugin) {
52
35
  Object.defineProperty(plugin, SKIP_OVERRIDE, { value: true });
53
36
  return plugin;
54
37
  }
55
- function decorate(request, instance, data) {
56
- const scoped = request;
57
- scoped.permdock = instance;
58
- if (data !== void 0) scoped.permdockData = data;
38
+ /** A route registered with `config: { permdock: false }`, such as a health check, gets no instance. */
39
+ function skipped(request) {
40
+ const config = request.routeOptions.config;
41
+ return typeof config === "object" && config !== null && Reflect.get(config, "permdock") === false;
59
42
  }
60
43
  function createPermDock(policy, options) {
61
- const contexts = /* @__PURE__ */ new WeakMap();
62
- const bound = /* @__PURE__ */ new WeakMap();
63
- const kernel = createKernel(policy, compact({
64
- subject: (request) => {
65
- const req = contexts.get(request);
66
- return req === void 0 ? null : options.subject(req);
67
- },
68
- memberships: options.memberships,
69
- relations: options.relations,
70
- entitlements: options.entitlements,
71
- customRoles: options.customRoles,
72
- policies: options.policies,
73
- store: options.store,
74
- sink: options.sink,
75
- limits: options.limits,
76
- pdp: options.pdp,
77
- webBotAuth: options.webBotAuth,
78
- adapter: "fastify",
79
- wrap: options.otel
80
- }));
81
- const bind = (request) => {
82
- const hit = bound.get(request);
83
- if (hit !== void 0) return hit;
84
- const next = toRequest(request);
85
- bound.set(request, next);
86
- contexts.set(next, request);
87
- return next;
88
- };
89
- const scopeOf = (request) => tenantScope(options.tenant, request);
44
+ const { kernel, bind, rebind, scopeOf, handlerScope } = bindKernel(policy, options, "fastify", toRequest);
90
45
  const permdock = breakEncapsulation((app) => {
91
46
  app.decorateRequest("permdock", null);
92
47
  app.decorateRequest("permdockData", null);
93
48
  app.addHook("onRequest", async (request) => {
49
+ if (skipped(request)) return;
94
50
  decorate(request, await kernel.permdock(bind(request), await scopeOf(request)));
95
51
  });
96
52
  const previous = app.errorHandler;
97
53
  app.setErrorHandler(async function permdockErrors(err, request, reply) {
98
- const problem = problemFromError(err);
54
+ const problem = problemFromError(err, { credentials: request.headers.authorization !== void 0 });
99
55
  if (problem === void 0) {
100
56
  await previous.call(this, err, request, reply);
101
57
  return;
@@ -114,14 +70,9 @@ function createPermDock(policy, options) {
114
70
  decorate(plain, guard.permdock, guard.data);
115
71
  };
116
72
  const permdockHandler = (app) => {
117
- const { POST, GET } = kernel.permdockHandler((request) => {
118
- const req = contexts.get(request);
119
- return req === void 0 ? { tenant: void 0 } : scopeOf(req);
120
- });
73
+ const { POST, GET } = kernel.permdockHandler(handlerScope);
121
74
  app.post("/", async (request, reply) => {
122
- const parsed = toRequest(request);
123
- contexts.set(parsed, request);
124
- await sendReply(reply, await POST(parsed));
75
+ await sendReply(reply, await POST(rebind(request)));
125
76
  });
126
77
  app.get("/", async (request, reply) => {
127
78
  await sendReply(reply, await GET(bind(request)));
@@ -0,0 +1,26 @@
1
+ import { n as freezeDeep } from "./freeze-CrU8nQeX.js";
2
+ import { D as ownKeys, E as ownGet, T as isForbiddenKey } from "./permissions-DVoF6dMt.js";
3
+ //#region src/core/fields.ts
4
+ function sanitizeFields(fields) {
5
+ if (fields === void 0) return;
6
+ return fields.filter((field) => field.length > 0 && !isForbiddenKey(field));
7
+ }
8
+ function grantCoversField(fields, field, effect) {
9
+ if (fields === void 0) return true;
10
+ if (fields.length === 0) return false;
11
+ if (field === void 0) return effect === "allow";
12
+ return fields.includes(field);
13
+ }
14
+ function pickVisible(row, canField) {
15
+ const out = {};
16
+ for (const key of ownKeys(row)) if (canField(key)) out[key] = ownGet(row, key);
17
+ return freezeDeep(out);
18
+ }
19
+ function sanitizeContext(value) {
20
+ if (value === null || typeof value !== "object" || Array.isArray(value)) return {};
21
+ const out = {};
22
+ for (const key of ownKeys(value)) out[key] = ownGet(value, key);
23
+ return out;
24
+ }
25
+ //#endregion
26
+ export { sanitizeFields as i, pickVisible as n, sanitizeContext as r, grantCoversField as t };
@@ -117,5 +117,9 @@ function rel(cwd, abs) {
117
117
  function defaultSrcPath() {
118
118
  return ["./src"];
119
119
  }
120
+ /** Where `doctor` reads source files: `doctor.srcPath`, else `collect.srcPath`, else `./src`. */
121
+ function doctorSrcPath(config) {
122
+ return config.doctor?.srcPath ?? config.collect?.srcPath ?? defaultSrcPath();
123
+ }
120
124
  //#endregion
121
- export { sqlFiles as i, listSourceFiles as n, rel as r, defaultSrcPath as t };
125
+ export { sqlFiles as a, rel as i, doctorSrcPath as n, listSourceFiles as r, defaultSrcPath as t };
@@ -1,4 +1,4 @@
1
- import { a as loadModule, o as pickNamed } from "./load-BZ24CpZP.js";
1
+ import { a as loadModule, o as pickNamed } from "./load-DhWEB9P1.js";
2
2
  import { existsSync, readFileSync } from "node:fs";
3
3
  import { resolve } from "node:path";
4
4
  //#region src/cli/fixtures.ts
@@ -16,6 +16,8 @@ function asFixtures(value) {
16
16
  if (memberships !== void 0 && !Array.isArray(memberships)) throw new Error(`PermDock CLI: fixture ${index} subject.memberships must be an array`);
17
17
  const tenant = item["subject"]["tenant"];
18
18
  if (tenant !== void 0 && typeof tenant !== "string") throw new Error(`PermDock CLI: fixture ${index} subject.tenant must be a string`);
19
+ const claims = item["subject"]["claims"];
20
+ if (claims !== void 0 && !isRecord(claims)) throw new Error(`PermDock CLI: fixture ${index} subject.claims must be an object`);
19
21
  return item;
20
22
  });
21
23
  }
@@ -48,7 +50,8 @@ function fixtureSubject(fixture) {
48
50
  id: fixture.id,
49
51
  roles: fixture.roles ?? [],
50
52
  ...fixture.tenant === void 0 ? {} : { tenant: fixture.tenant },
51
- memberships: fixture.memberships ?? []
53
+ memberships: fixture.memberships ?? [],
54
+ ...fixture.claims === void 0 ? {} : { claims: fixture.claims }
52
55
  },
53
56
  context: {}
54
57
  };
@@ -1,11 +1,40 @@
1
1
  //#region src/core/freeze.ts
2
+ function refuse() {
3
+ throw new TypeError("PermDock: this collection is frozen");
4
+ }
5
+ const LOCKED = {
6
+ value: refuse,
7
+ writable: false,
8
+ enumerable: false
9
+ };
10
+ /**
11
+ * `Object.freeze` leaves a `Map` or `Set` writable through `set`, `add`,
12
+ * `delete` and `clear`, so those are shadowed on the instance with a method
13
+ * that throws. Identity and `instanceof` stay as they were.
14
+ */
15
+ function freezeCollection(value) {
16
+ Object.defineProperties(value, value instanceof Map ? {
17
+ set: LOCKED,
18
+ delete: LOCKED,
19
+ clear: LOCKED
20
+ } : {
21
+ add: LOCKED,
22
+ delete: LOCKED,
23
+ clear: LOCKED
24
+ });
25
+ Object.freeze(value);
26
+ for (const [key, item] of value.entries()) {
27
+ freezeDeep(key);
28
+ freezeDeep(item);
29
+ }
30
+ }
2
31
  function freezeDeep(value) {
3
32
  if (value === null || typeof value !== "object") return value;
33
+ if (Object.isFrozen(value)) return value;
4
34
  if (value instanceof Map || value instanceof Set) {
5
- Object.freeze(value);
35
+ freezeCollection(value);
6
36
  return value;
7
37
  }
8
- if (Object.isFrozen(value)) return value;
9
38
  Object.freeze(value);
10
39
  if (Array.isArray(value)) {
11
40
  for (const item of value) freezeDeep(item);