permdock 0.0.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 (344) hide show
  1. package/README.md +327 -1
  2. package/dist/a2a/index.d.ts +169 -0
  3. package/dist/a2a/index.js +232 -0
  4. package/dist/adapter-context-mlWsVGGg.js +23 -0
  5. package/dist/ai-sdk/index.d.ts +95 -0
  6. package/dist/ai-sdk/index.js +154 -0
  7. package/dist/approval-required-TzNB9oQA.js +6 -0
  8. package/dist/approvals/index.d.ts +3 -0
  9. package/dist/approvals/index.js +5 -0
  10. package/dist/approvals-DbYAuNkG.js +224 -0
  11. package/dist/approvers-DT4AVyIg.js +52 -0
  12. package/dist/arazzo-BAgw9ap6.js +70 -0
  13. package/dist/arazzo-cmvX2jDe.js +54 -0
  14. package/dist/authzen/index.d.ts +39 -0
  15. package/dist/authzen/index.js +302 -0
  16. package/dist/better-auth/index.d.ts +109 -0
  17. package/dist/better-auth/index.js +344 -0
  18. package/dist/better-supabase/index.d.ts +206 -0
  19. package/dist/better-supabase/index.js +620 -0
  20. package/dist/bind-CVy3Espv.d.ts +25 -0
  21. package/dist/bind-VnYn2HKq.js +97 -0
  22. package/dist/boundary-BM8a_P6E.js +13 -0
  23. package/dist/boundary-BmHxVH1J.d.ts +15 -0
  24. package/dist/budget-JqcRqyhK.d.ts +11 -0
  25. package/dist/budget-NbEtbJC_.js +11 -0
  26. package/dist/canonical-json-DemiK4Vp.js +26 -0
  27. package/dist/capability-4qPdO9gk.js +173 -0
  28. package/dist/capability-Dq43tT1u.d.ts +99 -0
  29. package/dist/catalog/index.d.ts +12 -0
  30. package/dist/catalog/index.js +2 -0
  31. package/dist/catalog-BjZSovXQ.js +2 -0
  32. package/dist/catalog-doc-Dsc9y7sd.js +309 -0
  33. package/dist/catalog-h2tlKFkq.js +48 -0
  34. package/dist/catalog-path-CnI0XTFK.js +12 -0
  35. package/dist/catalog-z8q6bi_r.js +55 -0
  36. package/dist/claude-agent/index.d.ts +72 -0
  37. package/dist/claude-agent/index.js +77 -0
  38. package/dist/clerk/index.d.ts +65 -0
  39. package/dist/clerk/index.js +301 -0
  40. package/dist/cli/bin.d.ts +1 -0
  41. package/dist/cli/bin.js +20 -0
  42. package/dist/cli/index.d.ts +46 -0
  43. package/dist/cli/index.js +5 -0
  44. package/dist/clients-C7zLFuWT.d.ts +12 -0
  45. package/dist/clients-DjU5ABMy.js +23 -0
  46. package/dist/cloud/index.d.ts +90 -0
  47. package/dist/cloud/index.js +404 -0
  48. package/dist/cloud-BGhHS-lY.js +50 -0
  49. package/dist/cloud-Bo3e9Ak3.js +118 -0
  50. package/dist/collect-DDDv_ESs.js +502 -0
  51. package/dist/collect-DLlujdHC.js +83 -0
  52. package/dist/collect-rG2IQ3t0.js +2 -0
  53. package/dist/commands-DWOrSQic.js +97 -0
  54. package/dist/compact-y6vfu2_f.js +19 -0
  55. package/dist/compare-pfyVnBjE.js +12 -0
  56. package/dist/compile/index.d.ts +3 -0
  57. package/dist/compile/index.js +2 -0
  58. package/dist/compile-Ba4blROR.js +613 -0
  59. package/dist/compile-CNnl6uIt.d.ts +94 -0
  60. package/dist/config-BJiM-xAm.js +157 -0
  61. package/dist/config-Bn00Z3ks.js +36 -0
  62. package/dist/config-report-Dw_JcUqT.js +44 -0
  63. package/dist/connection-CU8MQxRi.js +194 -0
  64. package/dist/context-Ttp0ekMT.js +82 -0
  65. package/dist/convex/index.d.ts +45 -0
  66. package/dist/convex/index.js +65 -0
  67. package/dist/create-BWyx3jua.d.ts +245 -0
  68. package/dist/create-CPhDL6qx.js +253 -0
  69. package/dist/credential-8P81ff4u.js +306 -0
  70. package/dist/delegation-D8pUEuce.js +103 -0
  71. package/dist/describe-B_gVZEVi.js +94 -0
  72. package/dist/describe-PdoqESvg.d.ts +36 -0
  73. package/dist/diff-B8Tunc3o.js +451 -0
  74. package/dist/diff-CzqLxZ77.js +48 -0
  75. package/dist/digest-B3kc_PgQ.d.ts +19 -0
  76. package/dist/digest-BI-6aa6d.js +27 -0
  77. package/dist/doctor-WpvG6p4k.js +1194 -0
  78. package/dist/doctor-collect-ByfYlNv1.js +664 -0
  79. package/dist/doctor-rOr-4ZfS.js +53 -0
  80. package/dist/drizzle/index.d.ts +73 -0
  81. package/dist/drizzle/index.js +160 -0
  82. package/dist/duration-xK2jGFVc.js +25 -0
  83. package/dist/elysia/index.d.ts +49 -0
  84. package/dist/elysia/index.js +59 -0
  85. package/dist/errors-CWfoNg9N.js +47 -0
  86. package/dist/errors-Cz5zn0mW.js +123 -0
  87. package/dist/errors-DAqevpNk.d.ts +125 -0
  88. package/dist/errors-DRnGZHzF.js +30 -0
  89. package/dist/evaluation-items-CfCCejQd.js +40 -0
  90. package/dist/evaluations-tz6D9A2G.js +461 -0
  91. package/dist/eve/index.d.ts +86 -0
  92. package/dist/eve/index.js +176 -0
  93. package/dist/expiry-BoBJ8Tvc.js +7 -0
  94. package/dist/express/index.d.ts +23 -0
  95. package/dist/express/index.js +78 -0
  96. package/dist/fastify/index.d.ts +33 -0
  97. package/dist/fastify/index.js +92 -0
  98. package/dist/fields-BMl1RxoX.js +26 -0
  99. package/dist/files-DWUN9PzI.js +125 -0
  100. package/dist/fixtures-ht28Cplr.js +67 -0
  101. package/dist/freeze-CrU8nQeX.js +60 -0
  102. package/dist/from-snapshot-C3sHpZNS.js +569 -0
  103. package/dist/generate-CH7ThJ14.js +173 -0
  104. package/dist/grantee-Cv5Sogfv.js +602 -0
  105. package/dist/graph-sql-B-dsAT6j.d.ts +29 -0
  106. package/dist/headers-BZSDieNT.js +6 -0
  107. package/dist/headers-Cf-zWvsO.d.ts +6 -0
  108. package/dist/helpers-H_KARDVC.js +421 -0
  109. package/dist/hono/index.d.ts +48 -0
  110. package/dist/hono/index.js +99 -0
  111. package/dist/hosted-DJQw46hn.js +266 -0
  112. package/dist/http-BIhmLfCc.js +95 -0
  113. package/dist/http-DPuDaChb.d.ts +13 -0
  114. package/dist/http-SO7qGttf.js +44 -0
  115. package/dist/ids-DC4V4CFu.js +18 -0
  116. package/dist/index-A0YNL8jZ.d.ts +177 -0
  117. package/dist/index-CtE07CBF.d.ts +6 -0
  118. package/dist/index-D3vbkoSI.d.ts +483 -0
  119. package/dist/index-D6_cSa1z.d.ts +201 -0
  120. package/dist/index.d.ts +16 -0
  121. package/dist/index.js +26 -0
  122. package/dist/instance-options-BK_rNOSC.d.ts +11 -0
  123. package/dist/instance-options-Dhhcnm3y.js +22 -0
  124. package/dist/json-schema-BsAflUGW.js +106 -0
  125. package/dist/jwt/index.d.ts +91 -0
  126. package/dist/jwt/index.js +590 -0
  127. package/dist/kernel-GSQnMz3O.js +208 -0
  128. package/dist/kysely/index.d.ts +78 -0
  129. package/dist/kysely/index.js +129 -0
  130. package/dist/live-options-H2eG8dfJ.js +60 -0
  131. package/dist/load-DhWEB9P1.js +75 -0
  132. package/dist/load-DwJUafYN.js +2 -0
  133. package/dist/load-jose-BL6LH4bL.js +11 -0
  134. package/dist/lru-8q4WZjBV.js +28 -0
  135. package/dist/manifest-iaoBXHKc.js +783 -0
  136. package/dist/manifest-uDS9y5de.d.ts +206 -0
  137. package/dist/map-AcxK9o_D.js +147 -0
  138. package/dist/map-claims-Z4QZOiFF.js +369 -0
  139. package/dist/map-error-pgUWNNtG.js +23 -0
  140. package/dist/markers-B0hYLvMD.js +60 -0
  141. package/dist/may-use-DndQ5tQ-.js +77 -0
  142. package/dist/mcp/index.d.ts +159 -0
  143. package/dist/mcp/index.js +603 -0
  144. package/dist/nest/index.d.ts +75 -0
  145. package/dist/nest/index.js +261 -0
  146. package/dist/next/client.d.ts +23 -0
  147. package/dist/next/client.js +33 -0
  148. package/dist/next/index.d.ts +93 -0
  149. package/dist/next/index.js +180 -0
  150. package/dist/next/plugin.d.ts +14 -0
  151. package/dist/next/plugin.js +33 -0
  152. package/dist/node/index.d.ts +24 -0
  153. package/dist/node/index.js +34 -0
  154. package/dist/openai/index.d.ts +62 -0
  155. package/dist/openai/index.js +92 -0
  156. package/dist/openapi/index.d.ts +176 -0
  157. package/dist/openapi/index.js +3 -0
  158. package/dist/openapi-Bbg4wGVL.js +164 -0
  159. package/dist/openapi-BqRBvAng.js +538 -0
  160. package/dist/openapi-CqqEbHsL.js +250 -0
  161. package/dist/openapi-import-cmwetbzw.js +5959 -0
  162. package/dist/openapi-schema--ARjyfQr.js +6902 -0
  163. package/dist/orpc/index.d.ts +51 -0
  164. package/dist/orpc/index.js +145 -0
  165. package/dist/otel/index.d.ts +13 -0
  166. package/dist/otel/index.js +202 -0
  167. package/dist/package-root-zGkxO3oN.js +30 -0
  168. package/dist/parse-BuyjxhZV.js +53 -0
  169. package/dist/parse-local-manifest-BkGQNzAh.d.ts +10 -0
  170. package/dist/parse-local-manifest-BrMozJCo.js +36 -0
  171. package/dist/pdp/index.d.ts +22 -0
  172. package/dist/pdp/index.js +682 -0
  173. package/dist/peer-BOr_kJE1.js +31 -0
  174. package/dist/permdock-CzqXjCpU.js +3471 -0
  175. package/dist/permissions-CDgvKG5L.d.ts +52 -0
  176. package/dist/permissions-CpZrivYv.js +142 -0
  177. package/dist/permissions-DVoF6dMt.js +662 -0
  178. package/dist/permissions-DttnqqxC.d.ts +214 -0
  179. package/dist/pins-8ILTftC9.js +12 -0
  180. package/dist/policy-CFZAr_Al.d.ts +2252 -0
  181. package/dist/policy-D8UFyERw.d.ts +20 -0
  182. package/dist/policy-xyWg7QdR.js +1122 -0
  183. package/dist/powersync-A8x_Yyvh.js +2 -0
  184. package/dist/powersync-C7kLglqX.js +540 -0
  185. package/dist/powersync-yW1UUFzp.js +62 -0
  186. package/dist/prisma/index.d.ts +136 -0
  187. package/dist/prisma/index.js +455 -0
  188. package/dist/problem-B43ztKIm.js +191 -0
  189. package/dist/problem-details-CkL50EEf.d.ts +7 -0
  190. package/dist/problem-details-_AMOYz-w.js +144 -0
  191. package/dist/prompt-CXYhLfsS.js +32 -0
  192. package/dist/protected-CNsMzrVd.d.ts +27 -0
  193. package/dist/protected-Cs6kTaHo.js +100 -0
  194. package/dist/protected-bZs6rbT1.d.ts +40 -0
  195. package/dist/provider-Cjr62YMV.d.ts +6 -0
  196. package/dist/provider-DLzpb2Xz.js +52 -0
  197. package/dist/provider-store-DNyC1y48.js +43 -0
  198. package/dist/react/index.d.ts +8 -0
  199. package/dist/react/index.js +7 -0
  200. package/dist/react/provider-client.d.ts +2 -0
  201. package/dist/react/provider-client.js +3 -0
  202. package/dist/react-native/index.d.ts +198 -0
  203. package/dist/react-native/index.js +696 -0
  204. package/dist/refs-KYb4ntaz.js +91 -0
  205. package/dist/relations-cjOL01hZ.js +505 -0
  206. package/dist/replay-BsOyTrdV.js +28 -0
  207. package/dist/replay-sqBGMnNs.d.ts +5 -0
  208. package/dist/resource-ref-CaS9yVPi.js +20 -0
  209. package/dist/revocations-Bhr0aMIC.js +27 -0
  210. package/dist/revocations-Cy06JNx2.d.ts +21 -0
  211. package/dist/rls-BMNydpHk.js +2521 -0
  212. package/dist/rls-CEvs64Kj.js +238 -0
  213. package/dist/rls-fields-BMasREhR.js +3502 -0
  214. package/dist/rls-graph-pc9fuXYm.js +435 -0
  215. package/dist/rls-import-D8F7j35Q.js +943 -0
  216. package/dist/rls-migrate-7wikfrVI.js +367 -0
  217. package/dist/rls-ownership-B5Lkq62W.js +843 -0
  218. package/dist/rls-shared-aOQ4hGTO.js +493 -0
  219. package/dist/rls-verify-D8B7dOTh.js +745 -0
  220. package/dist/row-check-Dt35czLy.d.ts +40 -0
  221. package/dist/rpc-DOK54_CS.js +89 -0
  222. package/dist/run-YXCJDNYk.js +174 -0
  223. package/dist/runtime-CB8gQFvS.js +11 -0
  224. package/dist/saas-Bj_FFkjN.js +1203 -0
  225. package/dist/schema-D3MnDMxa.js +300 -0
  226. package/dist/scim/index.d.ts +2 -0
  227. package/dist/scim/index.js +2 -0
  228. package/dist/scim-BFGBBAqR.js +1445 -0
  229. package/dist/scopes-CVdPrWN-.js +239 -0
  230. package/dist/server/index.d.ts +134 -0
  231. package/dist/server/index.js +11 -0
  232. package/dist/server-DlZ28Oz5.js +268 -0
  233. package/dist/sha256-BO0swRXL.js +150 -0
  234. package/dist/shared-DRu8VFVM.js +123 -0
  235. package/dist/sink-Bd9PSyfq.js +141 -0
  236. package/dist/sink-Gs6TTVa-.d.ts +104 -0
  237. package/dist/skills-Biq5uup3.js +192 -0
  238. package/dist/skills-JaymNCdK.js +56 -0
  239. package/dist/snapshot-Enxd0n-s.js +975 -0
  240. package/dist/snapshot-cache-D6jLelln.js +44 -0
  241. package/dist/snapshot-cache-DwQH8ufx.d.ts +45 -0
  242. package/dist/solid/index.d.ts +93 -0
  243. package/dist/solid/index.js +188 -0
  244. package/dist/sources-B0UvrJ21.js +534 -0
  245. package/dist/sources-BcJgw0lt.d.ts +192 -0
  246. package/dist/sql-xdg5f4Fi.js +27 -0
  247. package/dist/src-CSbUiozF.js +568 -0
  248. package/dist/ssf/index.d.ts +4 -0
  249. package/dist/ssf/index.js +596 -0
  250. package/dist/store-DMAWwAJV.js +371 -0
  251. package/dist/store-D_pjn91-.d.ts +36 -0
  252. package/dist/store-options-yO0V6gRn.js +716 -0
  253. package/dist/stores-4_sqiOA1.js +87 -0
  254. package/dist/stores-DVR5NHLE.d.ts +52 -0
  255. package/dist/stream-DDpvynSB.js +66 -0
  256. package/dist/stream-DlvG2hs-.d.ts +12 -0
  257. package/dist/style-CTm1AXDT.js +22 -0
  258. package/dist/subject-C6dLxqHU.js +24 -0
  259. package/dist/subject-settings-BwBmCdTR.js +128 -0
  260. package/dist/supabase/index.d.ts +183 -0
  261. package/dist/supabase/index.js +5 -0
  262. package/dist/supabase/middleware.d.ts +82 -0
  263. package/dist/supabase/middleware.js +102 -0
  264. package/dist/supabase-CwafwxxF.js +83 -0
  265. package/dist/supabase-DTBaC20O.js +774 -0
  266. package/dist/supabase-config-Bs44dare.js +472 -0
  267. package/dist/supabase-hook-BuxLQLpU.js +1814 -0
  268. package/dist/supabase-hook-D5qVd_D8.js +2 -0
  269. package/dist/supautils-DYZnzRWV.js +91 -0
  270. package/dist/svelte/PermissionBoundary.svelte +37 -0
  271. package/dist/svelte/Protected.svelte +40 -0
  272. package/dist/svelte/index.d.ts +13 -0
  273. package/dist/svelte/index.js +107 -0
  274. package/dist/svelte/runtime.d.ts +7 -0
  275. package/dist/svelte/runtime.js +4 -0
  276. package/dist/svelte/source.d.ts +13 -0
  277. package/dist/svelte/source.js +11 -0
  278. package/dist/terminal/index.d.ts +163 -0
  279. package/dist/terminal/index.js +833 -0
  280. package/dist/testing/index.d.ts +745 -0
  281. package/dist/testing/index.js +3672 -0
  282. package/dist/testing/saas/index.d.ts +194 -0
  283. package/dist/testing/saas/index.js +3 -0
  284. package/dist/testing/saas/permissions.d.ts +2 -0
  285. package/dist/testing/saas/permissions.js +2 -0
  286. package/dist/text-diff-BdkkYSbi.js +15 -0
  287. package/dist/thenable-okc2xDsj.js +10 -0
  288. package/dist/timeout-D51niuQP.js +8 -0
  289. package/dist/token-CIWxJOCh.js +50 -0
  290. package/dist/trpc/index.d.ts +61 -0
  291. package/dist/trpc/index.js +122 -0
  292. package/dist/types-9AWO9EGt.d.ts +197 -0
  293. package/dist/types-BPxgszlT.d.ts +550 -0
  294. package/dist/types-BVyImy5I.d.ts +120 -0
  295. package/dist/types-Bvc4oWT6.d.ts +9 -0
  296. package/dist/types-C3s9xVJG.d.ts +48 -0
  297. package/dist/types-Dnemwd77.d.ts +183 -0
  298. package/dist/types-kxznc7cn.d.ts +52 -0
  299. package/dist/types-vKyAMtcX.d.ts +157 -0
  300. package/dist/types-vNSDF7Dq.d.ts +66 -0
  301. package/dist/types-yF5LmQVD.d.ts +306 -0
  302. package/dist/unplugin/index.d.ts +7 -0
  303. package/dist/unplugin/index.js +31 -0
  304. package/dist/usage-D07N9QJ3.js +42 -0
  305. package/dist/usage-D82l1CwK.js +2 -0
  306. package/dist/usage-DG1oeCca.js +693 -0
  307. package/dist/validation-error-CnjZ4t92.js +33 -0
  308. package/dist/validation-error-CtF23SrC.d.ts +26 -0
  309. package/dist/validity-uOp8UpYn.js +245 -0
  310. package/dist/verifier-BxBo6I44.js +466 -0
  311. package/dist/version-BvacVTZR.js +17 -0
  312. package/dist/views-Soe7bGSC.js +95 -0
  313. package/dist/vocabulary-DA8a8zif.d.ts +56 -0
  314. package/dist/vue/index.d.ts +79 -0
  315. package/dist/vue/index.js +196 -0
  316. package/dist/watch-Etoa_Mvr.js +2 -0
  317. package/dist/watch-UihESpsJ.js +128 -0
  318. package/dist/webmcp/index.d.ts +75 -0
  319. package/dist/webmcp/index.js +307 -0
  320. package/package.json +450 -5
  321. package/rulesets/permdock.yaml +29 -0
  322. package/schemas/approval-request-v1.json +175 -0
  323. package/schemas/catalog-v1.json +535 -0
  324. package/schemas/openapi/oas-3.1.json +1298 -0
  325. package/schemas/openapi/oas-3.2.json +1516 -0
  326. package/schemas/openapi/overlay-1.1.json +79 -0
  327. package/schemas/supabase-claims-v1.json +144 -0
  328. package/schemas/supabase-manifest-v1.json +361 -0
  329. package/skills/permdock/SKILL.md +66 -0
  330. package/skills/permdock-agents/SKILL.md +77 -0
  331. package/skills/permdock-agents/references/runtimes.md +213 -0
  332. package/skills/permdock-approvals/SKILL.md +80 -0
  333. package/skills/permdock-approvals/references/stores-and-resume.md +94 -0
  334. package/skills/permdock-audit/SKILL.md +67 -0
  335. package/skills/permdock-credentials/SKILL.md +55 -0
  336. package/skills/permdock-credentials/references/tokens-keys-links.md +132 -0
  337. package/skills/permdock-data/SKILL.md +57 -0
  338. package/skills/permdock-data/references/queries-and-rls.md +62 -0
  339. package/skills/permdock-data/references/relationships.md +67 -0
  340. package/skills/permdock-tenancy/SKILL.md +80 -0
  341. package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +89 -0
  342. package/skills/permdock-wire/SKILL.md +116 -0
  343. package/skills/permdock-wire/references/adapters.md +492 -0
  344. package/skills/permdock-wire/references/policy-options.md +45 -0
@@ -0,0 +1,192 @@
1
+ import { gt as MembershipSource } from "./policy-CFZAr_Al.js";
2
+ import { n as RoleThrough, y as SupabaseSuspension } from "./types-yF5LmQVD.js";
3
+ import { o as SupabaseManifestMembership } from "./manifest-uDS9y5de.js";
4
+ //#region src/supabase/roles.d.ts
5
+ /** A roles table a role column references, by `schema.table`. */
6
+ type RoleKeys = {
7
+ readonly table: string;
8
+ /** The roles table column the reference points at. */
9
+ readonly id: string;
10
+ /** The roles table column holding the role key. */
11
+ readonly key: string;
12
+ /** The referencing table's column. */
13
+ readonly ref: string;
14
+ };
15
+ //#endregion
16
+ //#region src/supabase/sources.d.ts
17
+ /**
18
+ * Runs one parameterised statement: `pg`'s `client.query` (which resolves
19
+ * `{ rows }`) and `postgres`'s `sql.unsafe` (which resolves the rows) both fit.
20
+ */
21
+ type SqlQuery = (text: string, values: readonly unknown[]) => Promise<readonly Record<string, unknown>[] | {
22
+ readonly rows: readonly Record<string, unknown>[];
23
+ }>;
24
+ type Common = {
25
+ readonly table: string;
26
+ /** Runs the lookups; without it the source only describes SQL (for `permdock supabase hook generate`). */
27
+ readonly query?: SqlQuery;
28
+ /** Drop suspended users and memberships under suspended instances, like `rls.suspension`. */
29
+ readonly suspension?: SupabaseSuspension;
30
+ };
31
+ type MembershipTableOptions = Common & {
32
+ /** Column names; `user`, `scope`, `id` and `role` default to `user_id`, `scope`, `scope_id`, `role`. */
33
+ readonly columns?: {
34
+ /** The user id column, or a reference to a table that holds the user id. */
35
+ readonly user?: string | RoleThrough;
36
+ readonly scope?: string;
37
+ readonly id?: string;
38
+ /** A `jsonb` column of ancestor ids keyed by scope name. */
39
+ readonly within?: string;
40
+ /**
41
+ * The role key column, a reference to a roles table that holds the key,
42
+ * or several of them: the row holds every non-null key.
43
+ */
44
+ readonly role?: string | RoleThrough | readonly (string | RoleThrough)[];
45
+ readonly via?: string;
46
+ readonly expiresAt?: string;
47
+ readonly disabledAt?: string;
48
+ /** The principal id that wrote the membership (`grantedBy`). */
49
+ readonly grantedBy?: string;
50
+ /** Free-text justification recorded on the membership (`reason`). */
51
+ readonly reason?: string;
52
+ /** A subgroup column filling `member.group`. */
53
+ readonly group?: string;
54
+ /** A text column; the value `idp` marks the row as owned by the identity provider. */
55
+ readonly managedBy?: string;
56
+ /** A `text[]` column of seats. */
57
+ readonly seats?: string;
58
+ };
59
+ };
60
+ type MembershipJunctionOptions = Common & {
61
+ /** The declared scope every row is a membership of. */
62
+ readonly scope: string;
63
+ /** The user id column (default `user_id`), or a reference to a table that holds the user id. */
64
+ readonly user?: string | RoleThrough;
65
+ /** The column holding the scope instance id. Default `<scope>_id`. */
66
+ readonly id?: string;
67
+ /** Ancestor id columns keyed by scope name. */
68
+ readonly within?: Readonly<Record<string, string>>;
69
+ /**
70
+ * A role column, a reference to a roles table that holds the key, fixed
71
+ * roles every row holds (a contact table with no role column), or
72
+ * `{ sources }`: several role columns whose non-null keys the row holds.
73
+ */
74
+ readonly roles: string | RoleThrough | readonly string[] | {
75
+ readonly sources: readonly (string | RoleThrough)[];
76
+ };
77
+ /** The membership kind every row has (`contact`, `staff`, `partner`). */
78
+ readonly via?: string;
79
+ readonly expiresAt?: string;
80
+ readonly disabledAt?: string;
81
+ /** The principal id that wrote the membership (`grantedBy`). */
82
+ readonly grantedBy?: string;
83
+ /** Free-text justification recorded on the membership (`reason`). */
84
+ readonly reason?: string;
85
+ /** A subgroup filling `member.group`: a fixed name every row has, or a column. */
86
+ readonly group?: string | {
87
+ readonly column: string;
88
+ };
89
+ /** `idp` when the identity provider owns every row, or a text column holding `idp` per row. */
90
+ readonly managedBy?: "idp" | {
91
+ readonly column: string;
92
+ };
93
+ /** A `text[]` column of seats. */
94
+ readonly seats?: string;
95
+ };
96
+ /** What `permdock supabase hook generate` compiles; the same SQL the source runs. */
97
+ type MembershipSql = {
98
+ readonly table: string;
99
+ /** The table's user column: the user id, or with `userThrough` the reference to the row holding it. */
100
+ readonly user: string;
101
+ /** The table that holds the user id when `user` references it; a change of that id bumps the old and the new user. */
102
+ readonly userThrough?: RoleKeys;
103
+ /** `<table>.<user>%type`: the PL/pgSQL type of the user id column, for a variable `select` compares with. */
104
+ readonly userType: string;
105
+ /**
106
+ * The `select` of claim rows for one user, with every filter applied.
107
+ * `user` must have the column's type (a `userType` variable, or an untyped
108
+ * `$1` Postgres infers): the column is compared uncast so its index applies.
109
+ * `keep` adds the `keep` column; it defaults to `keeps`, and a `union`
110
+ * with a source that keeps passes `true`.
111
+ */
112
+ select(user: string, keep?: boolean): string;
113
+ /** The `select` of member rows for one scope instance (`$1` scope, `$2` id). */
114
+ list(keep?: boolean): string;
115
+ /** A suspended scope on the source keeps permissions: rows of its suspended instances stay, with a `keep` column. */
116
+ readonly keeps: boolean;
117
+ /** A text column holding `idp` for rows the identity provider owns; `''` when every row is owned. */
118
+ readonly managed?: string;
119
+ /** Other tables the `select` reads (suspension tables). */
120
+ readonly reads: readonly string[];
121
+ /** The roles table the role column references; a key change bumps every holder's authorization version. */
122
+ readonly through?: RoleKeys;
123
+ /** Every roles table the role columns reference, `through` first. */
124
+ readonly throughs: readonly RoleKeys[];
125
+ /** Every column that decides who holds which membership: user, scope, id, `within`, role, `via` and expiry. */
126
+ readonly columns: readonly string[];
127
+ /** For a single-scope source: its scope and the scopes whose ids each row carries. */
128
+ readonly scope?: string;
129
+ readonly holds?: readonly string[];
130
+ /** The source's entry in the hook manifest's `memberships`. */
131
+ readonly manifest: SupabaseManifestMembership;
132
+ /** What the ownership triggers count; absent on a source that is not a table. */
133
+ readonly holders?: MembershipHolders;
134
+ };
135
+ /**
136
+ * The rows of a membership table, for the holder-count and transfer-only
137
+ * triggers `permdock rls generate` puts on it. No suspension filter: a
138
+ * suspended holder still holds the role.
139
+ */
140
+ type MembershipHolders = {
141
+ /** `<table>.<id column>%type`: the type of a variable `rows` compares the id column with. */
142
+ readonly idType: string;
143
+ /** The instance id of scope `scope` the PL/pgSQL record `row` holds, as text; null on a row of another scope. */
144
+ id(scope: string, row: string): string;
145
+ /**
146
+ * `select id, user_id, role, via, live` over the rows of scope `scope`
147
+ * in `from` (default the table): one row per held role key, `live` false
148
+ * once expired. `id` is an expression of `idType` the id column must equal.
149
+ */
150
+ rows(scope: string, options?: {
151
+ readonly id?: string;
152
+ readonly from?: string;
153
+ }): string;
154
+ };
155
+ type SqlMembershipSource = MembershipSource & {
156
+ readonly sql: MembershipSql;
157
+ };
158
+ /** The part of `@supabase/server`'s `PostgresApi` a `SqlQuery` needs. */
159
+ type SupabasePostgres = {
160
+ readonly queryRaw: (text: string, params?: unknown[]) => Promise<readonly Record<string, unknown>[]>;
161
+ };
162
+ /**
163
+ * `ctx.postgres` (from `withPostgresClient`) or `ctx.postgresAdmin` as a
164
+ * `SqlQuery` for `fromTable`, `fromJunction` and `supabaseApprovalStore`.
165
+ * `ctx.postgres` runs as the caller under RLS, so the membership tables must
166
+ * be readable by `authenticated`; `ctx.postgresAdmin` bypasses RLS.
167
+ */
168
+ declare function fromSupabasePostgres(postgres: SupabasePostgres): SqlQuery;
169
+ /**
170
+ * Memberships from one table holding every scope: a row per user, scope,
171
+ * instance and role (`user_id, scope, scope_id, role`), with optional
172
+ * `within`, `via`, expiry, owner and seat columns. Rows of the same instance
173
+ * merge into one membership.
174
+ */
175
+ declare function fromTable(options: MembershipTableOptions): SqlMembershipSource;
176
+ /**
177
+ * Memberships from a table of one scope (`customer_contacts`): every row is a
178
+ * membership of `scope`, with roles from a column or fixed (`['contact']`), a
179
+ * fixed `via`, and ancestor ids from `within` columns.
180
+ */
181
+ declare function fromJunction(options: MembershipJunctionOptions): SqlMembershipSource;
182
+ declare const AUTHZ_VERSION_TABLE = "permdock_authz_version";
183
+ /**
184
+ * Reads the authorization version `permdock supabase hook generate` keeps in
185
+ * `<schema>.permdock_authz_version`: pass it to `claimsFirst(sources, { version })`.
186
+ */
187
+ declare function authzVersion(options: {
188
+ readonly query: SqlQuery;
189
+ readonly schema?: string;
190
+ }): NonNullable<MembershipSource["version"]>;
191
+ //#endregion
192
+ export { MembershipTableOptions as a, SupabasePostgres as c, fromSupabasePostgres as d, fromTable as f, MembershipSql as i, authzVersion as l, MembershipHolders as n, SqlMembershipSource as o, MembershipJunctionOptions as r, SqlQuery as s, AUTHZ_VERSION_TABLE as t, fromJunction as u };
@@ -0,0 +1,27 @@
1
+ //#region src/core/sql.ts
2
+ /** A bare Postgres identifier PermDock emits unquoted-safe: letters, digits and `_`, not starting with a digit. */
3
+ const SQL_IDENT = /^[A-Za-z_][A-Za-z0-9_]*$/u;
4
+ /** A validated, double-quoted identifier; anything outside `SQL_IDENT` throws. */
5
+ function quoteSqlIdent(name, prefix = "PermDock") {
6
+ if (!SQL_IDENT.test(name)) throw new TypeError(`${prefix}: unsafe SQL identifier '${name}'`);
7
+ return `"${name}"`;
8
+ }
9
+ /** A schema-qualified name, each part validated by `quoteSqlIdent`. */
10
+ function quoteSqlTable(name, prefix = "PermDock") {
11
+ return name.split(".").map((part) => quoteSqlIdent(part, prefix)).join(".");
12
+ }
13
+ /** A single-quoted string literal with embedded quotes doubled. */
14
+ function quoteSqlLiteral(value) {
15
+ return `'${value.replaceAll("'", "''")}'`;
16
+ }
17
+ /** A double-quoted identifier read back from a database, embedded quotes doubled rather than refused. */
18
+ function escapeSqlIdent(name) {
19
+ return `"${name.replaceAll("\"", "\"\"")}"`;
20
+ }
21
+ const PLAIN_IDENT = /^[a-z_][a-z0-9_]*$/u;
22
+ /** An identifier left bare when it is already lower snake case, otherwise quoted by `escapeSqlIdent`. */
23
+ function sqlIdent(name) {
24
+ return PLAIN_IDENT.test(name) ? name : escapeSqlIdent(name);
25
+ }
26
+ //#endregion
27
+ export { quoteSqlTable as a, quoteSqlLiteral as i, escapeSqlIdent as n, sqlIdent as o, quoteSqlIdent as r, SQL_IDENT as t };