@safegres/test 0.0.1 → 1.30.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (483) hide show
  1. package/README.md +825 -412
  2. package/adapters.d.ts +8 -0
  3. package/adapters.js +18 -0
  4. package/ast/helpers.d.ts +16 -0
  5. package/ast/helpers.js +40 -0
  6. package/ast/parse.d.ts +31 -0
  7. package/ast/parse.js +87 -0
  8. package/ast/walk.d.ts +27 -0
  9. package/ast/walk.js +79 -0
  10. package/callgraph/baseline.d.ts +28 -0
  11. package/callgraph/baseline.js +55 -0
  12. package/callgraph/extract.d.ts +93 -0
  13. package/callgraph/extract.js +340 -0
  14. package/callgraph/graph.d.ts +82 -0
  15. package/callgraph/graph.js +276 -0
  16. package/checks/anti-patterns.d.ts +53 -0
  17. package/checks/anti-patterns.js +247 -0
  18. package/checks/column-grants.d.ts +20 -0
  19. package/checks/column-grants.js +74 -0
  20. package/checks/coverage.d.ts +43 -0
  21. package/checks/coverage.js +110 -0
  22. package/checks/definer-function.d.ts +91 -0
  23. package/checks/definer-function.js +458 -0
  24. package/checks/definer-view.d.ts +167 -0
  25. package/checks/definer-view.js +392 -0
  26. package/checks/indexes.d.ts +82 -0
  27. package/checks/indexes.js +263 -0
  28. package/checks/lattice.d.ts +179 -0
  29. package/checks/lattice.js +487 -0
  30. package/checks/object-acls.d.ts +32 -0
  31. package/checks/object-acls.js +129 -0
  32. package/checks/policy-index.d.ts +78 -0
  33. package/checks/policy-index.js +349 -0
  34. package/checks/revocable-grants.d.ts +140 -0
  35. package/checks/revocable-grants.js +377 -0
  36. package/checks/rls-flags.d.ts +25 -0
  37. package/checks/rls-flags.js +82 -0
  38. package/checks/role-reach.d.ts +329 -0
  39. package/checks/role-reach.js +277 -0
  40. package/checks/role-trust.d.ts +45 -0
  41. package/checks/role-trust.js +91 -0
  42. package/checks/set-role.d.ts +21 -0
  43. package/checks/set-role.js +66 -0
  44. package/checks/stats.d.ts +52 -0
  45. package/checks/stats.js +192 -0
  46. package/checks/view-exposure.d.ts +68 -0
  47. package/checks/view-exposure.js +236 -0
  48. package/checks/view-writes.d.ts +88 -0
  49. package/checks/view-writes.js +350 -0
  50. package/ci/baseline.d.ts +104 -0
  51. package/ci/baseline.js +111 -0
  52. package/ci/github.d.ts +47 -0
  53. package/ci/github.js +197 -0
  54. package/cli/audit.d.ts +3 -0
  55. package/cli/audit.js +560 -0
  56. package/cli/baseline.d.ts +3 -0
  57. package/cli/baseline.js +104 -0
  58. package/cli/commands.d.ts +2 -0
  59. package/cli/commands.js +60 -0
  60. package/cli/doctor.d.ts +3 -0
  61. package/cli/doctor.js +72 -0
  62. package/cli/eval.d.ts +3 -0
  63. package/cli/eval.js +153 -0
  64. package/cli/print-config.d.ts +3 -0
  65. package/cli/print-config.js +54 -0
  66. package/cli/shared.d.ts +43 -0
  67. package/cli/shared.js +153 -0
  68. package/cli.d.ts +2 -0
  69. package/cli.js +69 -0
  70. package/commands/audit.d.ts +65 -0
  71. package/commands/audit.js +779 -0
  72. package/commands/doctor.d.ts +19 -0
  73. package/commands/doctor.js +181 -0
  74. package/commands/eval.d.ts +67 -0
  75. package/commands/eval.js +93 -0
  76. package/config/fingerprint.d.ts +40 -0
  77. package/config/fingerprint.js +71 -0
  78. package/config/loader.d.ts +44 -0
  79. package/config/loader.js +210 -0
  80. package/config/presets.d.ts +95 -0
  81. package/config/presets.js +327 -0
  82. package/config/resolve.d.ts +47 -0
  83. package/config/resolve.js +192 -0
  84. package/config/schema.d.ts +54 -0
  85. package/config/schema.js +269 -0
  86. package/config/types.d.ts +562 -0
  87. package/config/validate.d.ts +14 -0
  88. package/config/validate.js +125 -0
  89. package/corpus/README.md +83 -0
  90. package/corpus/bootstrap.sql +14 -0
  91. package/corpus/cases/01-anon-write-grant/case.json +26 -0
  92. package/corpus/cases/01-anon-write-grant/schema.sql +19 -0
  93. package/corpus/cases/02-grant-to-public/case.json +25 -0
  94. package/corpus/cases/02-grant-to-public/schema.sql +18 -0
  95. package/corpus/cases/03-rls-off-reachable-by-anon/case.json +30 -0
  96. package/corpus/cases/03-rls-off-reachable-by-anon/schema.sql +13 -0
  97. package/corpus/cases/04-permissive-write-policy/case.json +30 -0
  98. package/corpus/cases/04-permissive-write-policy/schema.sql +21 -0
  99. package/corpus/cases/05-public-read-policy/case.json +25 -0
  100. package/corpus/cases/05-public-read-policy/schema.sql +16 -0
  101. package/corpus/cases/06-update-without-with-check/case.json +25 -0
  102. package/corpus/cases/06-update-without-with-check/schema.sql +19 -0
  103. package/corpus/cases/07-rls-enabled-no-policies/case.json +29 -0
  104. package/corpus/cases/07-rls-enabled-no-policies/schema.sql +14 -0
  105. package/corpus/cases/08-select-grant-no-policy/case.json +25 -0
  106. package/corpus/cases/08-select-grant-no-policy/schema.sql +20 -0
  107. package/corpus/cases/09-write-grant-no-policy/case.json +24 -0
  108. package/corpus/cases/09-write-grant-no-policy/schema.sql +18 -0
  109. package/corpus/cases/10-rls-not-forced/case.json +24 -0
  110. package/corpus/cases/10-rls-not-forced/schema.sql +18 -0
  111. package/corpus/cases/11-session-user-in-policy/case.json +24 -0
  112. package/corpus/cases/11-session-user-in-policy/schema.sql +18 -0
  113. package/corpus/cases/12-volatile-function-in-policy/case.json +24 -0
  114. package/corpus/cases/12-volatile-function-in-policy/schema.sql +21 -0
  115. package/corpus/cases/13-security-definer-policy-wrapper/case.json +24 -0
  116. package/corpus/cases/13-security-definer-policy-wrapper/schema.sql +21 -0
  117. package/corpus/cases/14-dead-policy/case.json +24 -0
  118. package/corpus/cases/14-dead-policy/schema.sql +18 -0
  119. package/corpus/cases/15-unreachable-grant/case.json +24 -0
  120. package/corpus/cases/15-unreachable-grant/schema.sql +18 -0
  121. package/corpus/cases/16-anon-permissive-write-policy/case.json +34 -0
  122. package/corpus/cases/16-anon-permissive-write-policy/schema.sql +17 -0
  123. package/corpus/cases/17-foreign-key-without-index/case.json +24 -0
  124. package/corpus/cases/17-foreign-key-without-index/schema.sql +18 -0
  125. package/corpus/cases/18-policy-column-unindexed/case.json +24 -0
  126. package/corpus/cases/18-policy-column-unindexed/schema.sql +23 -0
  127. package/corpus/cases/19-policy-column-cast/case.json +24 -0
  128. package/corpus/cases/19-policy-column-cast/schema.sql +19 -0
  129. package/corpus/cases/20-stable-function-per-row/case.json +24 -0
  130. package/corpus/cases/20-stable-function-per-row/schema.sql +25 -0
  131. package/corpus/cases/21-table-without-primary-key/case.json +24 -0
  132. package/corpus/cases/21-table-without-primary-key/schema.sql +14 -0
  133. package/corpus/cases/22-redundant-index/case.json +24 -0
  134. package/corpus/cases/22-redundant-index/schema.sql +16 -0
  135. package/corpus/cases/23-tsvector-without-index/case.json +24 -0
  136. package/corpus/cases/23-tsvector-without-index/schema.sql +13 -0
  137. package/corpus/cases/24-anon-set-role-escalation/case.json +29 -0
  138. package/corpus/cases/24-anon-set-role-escalation/schema.sql +30 -0
  139. package/corpus/cases/25-definer-view-bypass/case.json +31 -0
  140. package/corpus/cases/25-definer-view-bypass/schema.sql +36 -0
  141. package/corpus/cases/26-invoker-view-no-bypass/case.json +31 -0
  142. package/corpus/cases/26-invoker-view-no-bypass/schema.sql +44 -0
  143. package/corpus/cases/27-definer-view-write/case.json +36 -0
  144. package/corpus/cases/27-definer-view-write/schema.sql +40 -0
  145. package/corpus/cases/28-invoker-view-no-write/case.json +31 -0
  146. package/corpus/cases/28-invoker-view-no-write/schema.sql +37 -0
  147. package/corpus/cases/29-rewrite-rule-bypass/case.json +36 -0
  148. package/corpus/cases/29-rewrite-rule-bypass/schema.sql +52 -0
  149. package/corpus/cases/30-instead-nothing-rule/case.json +31 -0
  150. package/corpus/cases/30-instead-nothing-rule/schema.sql +44 -0
  151. package/corpus/cases/31-matview-snapshot/case.json +32 -0
  152. package/corpus/cases/31-matview-snapshot/schema.sql +36 -0
  153. package/corpus/cases/32-matview-no-rls-no-bypass/case.json +30 -0
  154. package/corpus/cases/32-matview-no-rls-no-bypass/schema.sql +18 -0
  155. package/corpus/cases/33-leaky-filter-view/case.json +36 -0
  156. package/corpus/cases/33-leaky-filter-view/schema.sql +29 -0
  157. package/corpus/cases/34-barrier-view-no-leak/case.json +32 -0
  158. package/corpus/cases/34-barrier-view-no-leak/schema.sql +29 -0
  159. package/corpus/cases/35-column-grant-projection/case.json +27 -0
  160. package/corpus/cases/35-column-grant-projection/schema.sql +21 -0
  161. package/corpus/cases/35-policy-function-not-leakproof/case.json +24 -0
  162. package/corpus/cases/35-policy-function-not-leakproof/schema.sql +27 -0
  163. package/corpus/cases/36-column-grant-rls-mediated/case.json +27 -0
  164. package/corpus/cases/36-column-grant-rls-mediated/schema.sql +32 -0
  165. package/corpus/cases/36-policy-function-leakproof/case.json +24 -0
  166. package/corpus/cases/36-policy-function-leakproof/schema.sql +22 -0
  167. package/corpus/cases/37-sort-column-unindexed/case.json +24 -0
  168. package/corpus/cases/37-sort-column-unindexed/schema.sql +14 -0
  169. package/corpus/cases/37-unaudited-base-relation/case.json +30 -0
  170. package/corpus/cases/37-unaudited-base-relation/schema.sql +45 -0
  171. package/corpus/cases/38-foreign-key-with-index/case.json +22 -0
  172. package/corpus/cases/38-foreign-key-with-index/schema.sql +17 -0
  173. package/corpus/cases/38-invoker-view-unaudited-base/case.json +30 -0
  174. package/corpus/cases/38-invoker-view-unaudited-base/schema.sql +39 -0
  175. package/corpus/cases/39-definer-view-column-subset/case.json +30 -0
  176. package/corpus/cases/39-definer-view-column-subset/schema.sql +29 -0
  177. package/corpus/cases/39-policy-cast-with-expression-index/case.json +23 -0
  178. package/corpus/cases/39-policy-cast-with-expression-index/schema.sql +19 -0
  179. package/corpus/cases/40-definer-view-column-overreach/case.json +27 -0
  180. package/corpus/cases/40-definer-view-column-overreach/schema.sql +29 -0
  181. package/corpus/cases/40-stable-function-hoisted/case.json +23 -0
  182. package/corpus/cases/40-stable-function-hoisted/schema.sql +25 -0
  183. package/corpus/cases/41-index-prefix-not-redundant/case.json +21 -0
  184. package/corpus/cases/41-index-prefix-not-redundant/schema.sql +15 -0
  185. package/corpus/cases/41-unreadable-view-body/case.json +33 -0
  186. package/corpus/cases/41-unreadable-view-body/schema.sql +28 -0
  187. package/corpus/cases/42-invoker-view-unreadable-body/case.json +30 -0
  188. package/corpus/cases/42-invoker-view-unreadable-body/schema.sql +27 -0
  189. package/corpus/cases/42-search-column-indexed/case.json +21 -0
  190. package/corpus/cases/42-search-column-indexed/schema.sql +12 -0
  191. package/corpus/cases/43-anon-sequence-grant/case.json +27 -0
  192. package/corpus/cases/43-anon-sequence-grant/schema.sql +23 -0
  193. package/corpus/cases/44-serial-sequence-usage/case.json +27 -0
  194. package/corpus/cases/44-serial-sequence-usage/schema.sql +25 -0
  195. package/corpus/cases/45-anon-foreign-table/case.json +27 -0
  196. package/corpus/cases/45-anon-foreign-table/schema.sql +23 -0
  197. package/corpus/cases/46-unchecked-writable-view/case.json +41 -0
  198. package/corpus/cases/46-unchecked-writable-view/schema.sql +37 -0
  199. package/corpus/cases/47-checked-writable-view/case.json +37 -0
  200. package/corpus/cases/47-checked-writable-view/schema.sql +38 -0
  201. package/corpus/cases/48-definer-function-reach/case.json +38 -0
  202. package/corpus/cases/48-definer-function-reach/schema.sql +41 -0
  203. package/corpus/cases/49-invoker-function-no-reach/case.json +32 -0
  204. package/corpus/cases/49-invoker-function-no-reach/schema.sql +38 -0
  205. package/corpus/cases/50-instead-of-trigger-write/case.json +38 -0
  206. package/corpus/cases/50-instead-of-trigger-write/schema.sql +58 -0
  207. package/corpus/cases/51-invoker-trigger-no-write/case.json +33 -0
  208. package/corpus/cases/51-invoker-trigger-no-write/schema.sql +54 -0
  209. package/corpus/cases/52-revocable-execute-grant/case.json +30 -0
  210. package/corpus/cases/52-revocable-execute-grant/schema.sql +45 -0
  211. package/corpus/cases/53-policy-predicate-retains-execute/case.json +23 -0
  212. package/corpus/cases/53-policy-predicate-retains-execute/schema.sql +49 -0
  213. package/corpus/index.d.ts +79 -0
  214. package/corpus/index.js +125 -0
  215. package/esm/adapters.d.ts +8 -0
  216. package/esm/adapters.js +6 -0
  217. package/esm/ast/helpers.d.ts +16 -0
  218. package/esm/ast/helpers.js +36 -0
  219. package/esm/ast/parse.d.ts +31 -0
  220. package/esm/ast/parse.js +82 -0
  221. package/esm/ast/walk.d.ts +27 -0
  222. package/esm/ast/walk.js +72 -0
  223. package/esm/callgraph/baseline.d.ts +28 -0
  224. package/esm/callgraph/baseline.js +48 -0
  225. package/esm/callgraph/extract.d.ts +93 -0
  226. package/esm/callgraph/extract.js +333 -0
  227. package/esm/callgraph/graph.d.ts +82 -0
  228. package/esm/callgraph/graph.js +273 -0
  229. package/esm/checks/anti-patterns.d.ts +53 -0
  230. package/esm/checks/anti-patterns.js +240 -0
  231. package/esm/checks/column-grants.d.ts +20 -0
  232. package/esm/checks/column-grants.js +71 -0
  233. package/esm/checks/coverage.d.ts +43 -0
  234. package/esm/checks/coverage.js +104 -0
  235. package/esm/checks/definer-function.d.ts +91 -0
  236. package/esm/checks/definer-function.js +452 -0
  237. package/esm/checks/definer-view.d.ts +167 -0
  238. package/esm/checks/definer-view.js +382 -0
  239. package/esm/checks/indexes.d.ts +82 -0
  240. package/esm/checks/indexes.js +256 -0
  241. package/esm/checks/lattice.d.ts +179 -0
  242. package/esm/checks/lattice.js +475 -0
  243. package/esm/checks/object-acls.d.ts +32 -0
  244. package/esm/checks/object-acls.js +125 -0
  245. package/esm/checks/policy-index.d.ts +78 -0
  246. package/esm/checks/policy-index.js +342 -0
  247. package/esm/checks/revocable-grants.d.ts +140 -0
  248. package/esm/checks/revocable-grants.js +373 -0
  249. package/esm/checks/rls-flags.d.ts +25 -0
  250. package/esm/checks/rls-flags.js +77 -0
  251. package/esm/checks/role-reach.d.ts +329 -0
  252. package/esm/checks/role-reach.js +270 -0
  253. package/esm/checks/role-trust.d.ts +45 -0
  254. package/esm/checks/role-trust.js +86 -0
  255. package/esm/checks/set-role.d.ts +21 -0
  256. package/esm/checks/set-role.js +63 -0
  257. package/esm/checks/stats.d.ts +52 -0
  258. package/esm/checks/stats.js +184 -0
  259. package/esm/checks/view-exposure.d.ts +68 -0
  260. package/esm/checks/view-exposure.js +231 -0
  261. package/esm/checks/view-writes.d.ts +88 -0
  262. package/esm/checks/view-writes.js +344 -0
  263. package/esm/ci/baseline.d.ts +104 -0
  264. package/esm/ci/baseline.js +107 -0
  265. package/esm/ci/github.d.ts +47 -0
  266. package/esm/ci/github.js +161 -0
  267. package/esm/cli/audit.d.ts +3 -0
  268. package/esm/cli/audit.js +525 -0
  269. package/esm/cli/baseline.d.ts +3 -0
  270. package/esm/cli/baseline.js +102 -0
  271. package/esm/cli/commands.d.ts +2 -0
  272. package/esm/cli/commands.js +53 -0
  273. package/esm/cli/doctor.d.ts +3 -0
  274. package/esm/cli/doctor.js +67 -0
  275. package/esm/cli/eval.d.ts +3 -0
  276. package/esm/cli/eval.js +115 -0
  277. package/esm/cli/print-config.d.ts +3 -0
  278. package/esm/cli/print-config.js +52 -0
  279. package/esm/cli/shared.d.ts +43 -0
  280. package/esm/cli/shared.js +112 -0
  281. package/esm/cli.d.ts +2 -0
  282. package/esm/cli.js +67 -0
  283. package/esm/commands/audit.d.ts +65 -0
  284. package/esm/commands/audit.js +776 -0
  285. package/esm/commands/doctor.d.ts +19 -0
  286. package/esm/commands/doctor.js +178 -0
  287. package/esm/commands/eval.d.ts +67 -0
  288. package/esm/commands/eval.js +90 -0
  289. package/esm/config/fingerprint.d.ts +40 -0
  290. package/esm/config/fingerprint.js +68 -0
  291. package/esm/config/loader.d.ts +44 -0
  292. package/esm/config/loader.js +172 -0
  293. package/esm/config/presets.d.ts +95 -0
  294. package/esm/config/presets.js +324 -0
  295. package/esm/config/resolve.d.ts +47 -0
  296. package/esm/config/resolve.js +180 -0
  297. package/esm/config/schema.d.ts +54 -0
  298. package/esm/config/schema.js +265 -0
  299. package/esm/config/types.d.ts +562 -0
  300. package/esm/config/validate.d.ts +14 -0
  301. package/esm/config/validate.js +122 -0
  302. package/esm/corpus/index.d.ts +79 -0
  303. package/esm/corpus/index.js +85 -0
  304. package/esm/exposure/adapters.d.ts +152 -0
  305. package/esm/exposure/adapters.js +463 -0
  306. package/esm/exposure/planes.d.ts +59 -0
  307. package/esm/exposure/planes.js +144 -0
  308. package/esm/exposure/reach.d.ts +78 -0
  309. package/esm/exposure/reach.js +105 -0
  310. package/esm/exposure/routines.d.ts +36 -0
  311. package/esm/exposure/routines.js +54 -0
  312. package/esm/index.d.ts +96 -0
  313. package/esm/index.js +57 -6
  314. package/esm/lint/index.d.ts +11 -0
  315. package/esm/lint/index.js +10 -0
  316. package/esm/perf/baseline.d.ts +40 -0
  317. package/esm/perf/baseline.js +83 -0
  318. package/esm/perf/explain.d.ts +46 -0
  319. package/esm/perf/explain.js +201 -0
  320. package/esm/pg/acl.d.ts +72 -0
  321. package/esm/pg/acl.js +186 -0
  322. package/esm/pg/behaviors.d.ts +114 -0
  323. package/esm/pg/behaviors.js +206 -0
  324. package/esm/pg/exposure.d.ts +74 -0
  325. package/esm/pg/exposure.js +198 -0
  326. package/esm/pg/functions.d.ts +52 -0
  327. package/esm/pg/functions.js +128 -0
  328. package/esm/pg/indexes.d.ts +192 -0
  329. package/esm/pg/indexes.js +395 -0
  330. package/esm/pg/introspect.d.ts +134 -0
  331. package/esm/pg/introspect.js +274 -0
  332. package/esm/pg/objects.d.ts +37 -0
  333. package/esm/pg/objects.js +108 -0
  334. package/esm/pg/paths.d.ts +114 -0
  335. package/esm/pg/paths.js +159 -0
  336. package/esm/pg/proc.d.ts +23 -0
  337. package/esm/pg/proc.js +55 -0
  338. package/esm/pg/reach-inputs.d.ts +47 -0
  339. package/esm/pg/reach-inputs.js +133 -0
  340. package/esm/pg/roles.d.ts +28 -0
  341. package/esm/pg/roles.js +50 -0
  342. package/esm/pg/stats.d.ts +65 -0
  343. package/esm/pg/stats.js +129 -0
  344. package/esm/pgpm-test.d.ts +22 -0
  345. package/esm/pgpm-test.js +39 -0
  346. package/esm/report/callgraph.d.ts +9 -0
  347. package/esm/report/callgraph.js +74 -0
  348. package/esm/report/compare.d.ts +143 -0
  349. package/esm/report/compare.js +195 -0
  350. package/esm/report/github.d.ts +74 -0
  351. package/esm/report/github.js +290 -0
  352. package/esm/report/json.d.ts +4 -0
  353. package/esm/report/json.js +3 -0
  354. package/esm/report/markdown.d.ts +25 -0
  355. package/esm/report/markdown.js +352 -0
  356. package/esm/report/pretty.d.ts +14 -0
  357. package/esm/report/pretty.js +318 -0
  358. package/esm/report/sarif.d.ts +40 -0
  359. package/esm/report/sarif.js +189 -0
  360. package/esm/report/view.d.ts +82 -0
  361. package/esm/report/view.js +126 -0
  362. package/esm/rules/registry.d.ts +66 -0
  363. package/esm/rules/registry.js +562 -0
  364. package/esm/score/score.d.ts +84 -0
  365. package/esm/score/score.js +233 -0
  366. package/esm/score/scorecards.d.ts +68 -0
  367. package/esm/score/scorecards.js +157 -0
  368. package/esm/types.d.ts +292 -0
  369. package/esm/types.js +26 -0
  370. package/esm/version.d.ts +8 -0
  371. package/esm/version.js +9 -0
  372. package/exposure/adapters.d.ts +152 -0
  373. package/exposure/adapters.js +468 -0
  374. package/exposure/planes.d.ts +59 -0
  375. package/exposure/planes.js +151 -0
  376. package/exposure/reach.d.ts +78 -0
  377. package/exposure/reach.js +109 -0
  378. package/exposure/routines.d.ts +36 -0
  379. package/exposure/routines.js +57 -0
  380. package/index.d.ts +96 -6
  381. package/index.js +229 -6
  382. package/lint/index.d.ts +11 -0
  383. package/lint/index.js +19 -0
  384. package/package.json +54 -48
  385. package/perf/baseline.d.ts +40 -0
  386. package/perf/baseline.js +92 -0
  387. package/perf/explain.d.ts +46 -0
  388. package/perf/explain.js +204 -0
  389. package/pg/acl.d.ts +72 -0
  390. package/pg/acl.js +191 -0
  391. package/pg/behaviors.d.ts +114 -0
  392. package/pg/behaviors.js +217 -0
  393. package/pg/exposure.d.ts +74 -0
  394. package/pg/exposure.js +205 -0
  395. package/pg/functions.d.ts +52 -0
  396. package/pg/functions.js +131 -0
  397. package/pg/indexes.d.ts +192 -0
  398. package/pg/indexes.js +400 -0
  399. package/pg/introspect.d.ts +134 -0
  400. package/pg/introspect.js +280 -0
  401. package/pg/objects.d.ts +37 -0
  402. package/pg/objects.js +111 -0
  403. package/pg/paths.d.ts +114 -0
  404. package/pg/paths.js +166 -0
  405. package/pg/proc.d.ts +23 -0
  406. package/pg/proc.js +58 -0
  407. package/pg/reach-inputs.d.ts +47 -0
  408. package/pg/reach-inputs.js +136 -0
  409. package/pg/roles.d.ts +28 -0
  410. package/pg/roles.js +54 -0
  411. package/pg/stats.d.ts +65 -0
  412. package/pg/stats.js +133 -0
  413. package/pgpm-test.d.ts +22 -0
  414. package/pgpm-test.js +42 -0
  415. package/report/callgraph.d.ts +9 -0
  416. package/report/callgraph.js +81 -0
  417. package/report/compare.d.ts +143 -0
  418. package/report/compare.js +205 -0
  419. package/report/github.d.ts +74 -0
  420. package/report/github.js +333 -0
  421. package/report/json.d.ts +4 -0
  422. package/report/json.js +6 -0
  423. package/report/markdown.d.ts +25 -0
  424. package/report/markdown.js +355 -0
  425. package/report/pretty.d.ts +14 -0
  426. package/report/pretty.js +324 -0
  427. package/report/sarif.d.ts +40 -0
  428. package/report/sarif.js +193 -0
  429. package/report/view.d.ts +82 -0
  430. package/report/view.js +132 -0
  431. package/rules/registry.d.ts +66 -0
  432. package/rules/registry.js +569 -0
  433. package/schema/safegres.schema.json +1119 -0
  434. package/score/score.d.ts +84 -0
  435. package/score/score.js +238 -0
  436. package/score/scorecards.d.ts +68 -0
  437. package/score/scorecards.js +162 -0
  438. package/types.d.ts +292 -0
  439. package/types.js +32 -0
  440. package/version.d.ts +8 -0
  441. package/version.js +12 -0
  442. package/LICENSE +0 -23
  443. package/admin.d.ts +0 -26
  444. package/admin.js +0 -182
  445. package/connect.d.ts +0 -19
  446. package/connect.js +0 -83
  447. package/dist/README.md +0 -557
  448. package/dist/package.json +0 -72
  449. package/esm/admin.js +0 -178
  450. package/esm/connect.js +0 -78
  451. package/esm/manager.js +0 -136
  452. package/esm/roles.js +0 -32
  453. package/esm/seed/adapters.js +0 -23
  454. package/esm/seed/csv.js +0 -44
  455. package/esm/seed/index.js +0 -16
  456. package/esm/seed/json.js +0 -18
  457. package/esm/seed/launchql.js +0 -19
  458. package/esm/seed/sqitch.js +0 -17
  459. package/esm/stream.js +0 -43
  460. package/esm/test-client.js +0 -150
  461. package/manager.d.ts +0 -25
  462. package/manager.js +0 -140
  463. package/roles.d.ts +0 -17
  464. package/roles.js +0 -38
  465. package/seed/adapters.d.ts +0 -4
  466. package/seed/adapters.js +0 -28
  467. package/seed/csv.d.ts +0 -9
  468. package/seed/csv.js +0 -49
  469. package/seed/index.d.ts +0 -16
  470. package/seed/index.js +0 -33
  471. package/seed/json.d.ts +0 -6
  472. package/seed/json.js +0 -21
  473. package/seed/launchql.d.ts +0 -2
  474. package/seed/launchql.js +0 -22
  475. package/seed/sqitch.d.ts +0 -2
  476. package/seed/sqitch.js +0 -20
  477. package/seed/types.d.ts +0 -13
  478. package/stream.d.ts +0 -2
  479. package/stream.js +0 -46
  480. package/test-client.d.ts +0 -49
  481. package/test-client.js +0 -154
  482. /package/{seed → config}/types.js +0 -0
  483. /package/esm/{seed → config}/types.js +0 -0
package/esm/types.d.ts ADDED
@@ -0,0 +1,292 @@
1
+ /**
2
+ * Report types for the safegres audit.
3
+ *
4
+ * Kept intentionally minimal and dependency-free so they can be imported
5
+ * by downstream packages (e.g. `@constructive-db/rls-audit-constructive`)
6
+ * without pulling in `pg` or `pgsql-parser`.
7
+ */
8
+ export type Severity = 'critical' | 'high' | 'medium' | 'low' | 'info';
9
+ /**
10
+ * Which way a finding fails:
11
+ * - `fail-open` — the untrusted side can read/write more than intended (a leak).
12
+ * - `fail-closed` — the operation is denied at runtime; an availability/hygiene
13
+ * concern, not an exposure. Excluded from the score by default.
14
+ * - `neutral` — directionless (performance, meta).
15
+ */
16
+ export type Direction = 'fail-open' | 'fail-closed' | 'neutral';
17
+ /**
18
+ * Which axis a finding is scored on. `security` findings drive `report.score`;
19
+ * `perf` findings drive `report.perf.score`. The two are never mixed — a
20
+ * database can be an A+ on security and a D on index hygiene, and both
21
+ * numbers stay meaningful.
22
+ */
23
+ export type Dimension = 'security' | 'perf';
24
+ export declare const SEVERITY_ORDER: Record<Severity, number>;
25
+ export interface Finding {
26
+ /** Finding code, e.g. `A1`, `P7`. Stable across versions. */
27
+ code: string;
28
+ severity: Severity;
29
+ /** High-level bucket — helps renderers group findings. */
30
+ category: 'flags' | 'coverage' | 'anti-pattern' | 'index' | 'sync' | 'match' | 'meta' | 'convention';
31
+ /** Leak vs deny vs directionless. Stamped from the rule registry. */
32
+ direction?: Direction;
33
+ /** Scoring axis. Stamped from the rule registry; defaults to `security`. */
34
+ dimension?: Dimension;
35
+ /**
36
+ * Whether the finding's table is on the resolved exposure surface — i.e.
37
+ * reachable on the *primary* plane. `undefined` when no exposure surface is
38
+ * known (everything is assumed reachable).
39
+ */
40
+ exposed?: boolean;
41
+ /**
42
+ * Every access plane the finding is reachable on, by name. A relation that
43
+ * is internal to the API can still be reachable by a role holding a direct
44
+ * connection, and this is where that shows up. Not part of a finding's
45
+ * identity: baselines and comparisons key on the finding, not on who can
46
+ * reach it.
47
+ */
48
+ planes?: string[];
49
+ /**
50
+ * The finding is acknowledged by config as intentional (e.g. an open read
51
+ * on a table declared in `public.read`) — reported, but excluded from the
52
+ * score.
53
+ */
54
+ acknowledged?: boolean;
55
+ /** Schema-qualified location, where applicable. */
56
+ schema?: string;
57
+ table?: string;
58
+ policy?: string;
59
+ role?: string;
60
+ privilege?: string;
61
+ /** Human-readable summary. */
62
+ message: string;
63
+ /** Optional remediation hint / pointer to docs. */
64
+ hint?: string;
65
+ /** Optional machine-readable extras (AST nodes, offending function name, …). */
66
+ context?: Record<string, unknown>;
67
+ /**
68
+ * Proof attached by `--explain`: the plan the database produced for the
69
+ * query shape this finding is a claim about.
70
+ */
71
+ evidence?: FindingEvidence;
72
+ }
73
+ /**
74
+ * Planner evidence for a finding. `refuted` means the planner disagreed with
75
+ * the catalog inference — the finding is reported but no longer scored.
76
+ */
77
+ export interface FindingEvidence {
78
+ source: 'explain';
79
+ status: 'confirmed' | 'refuted' | 'inconclusive';
80
+ /** The probe query, with parameters left unbound. */
81
+ probe: string;
82
+ /** Plan node types, outermost first. */
83
+ plan: string;
84
+ /** Why an inconclusive probe was inconclusive. */
85
+ note?: string;
86
+ }
87
+ export interface Summary {
88
+ critical: number;
89
+ high: number;
90
+ medium: number;
91
+ low: number;
92
+ info: number;
93
+ }
94
+ /**
95
+ * One graded access plane: a way into the database, with its own score.
96
+ *
97
+ * The primary plane is the declared API surface, and its score *is*
98
+ * `report.score` — secondary planes never move it. They answer the question
99
+ * the headline cannot: what does this database grade for somebody who does
100
+ * not come through the API?
101
+ */
102
+ export interface PlaneReport {
103
+ name: string;
104
+ kind: 'api' | 'role' | 'schema';
105
+ /** The headline plane. Exactly one plane is primary. */
106
+ primary: boolean;
107
+ /** Adapter name, `config`, or `none`. */
108
+ source: string;
109
+ schemas: string[];
110
+ roles?: string[];
111
+ /** Relations the plane reaches (the density denominator). */
112
+ exposedTables: number;
113
+ /**
114
+ * Relations in the plane's schemas its API cannot address, and which are
115
+ * therefore excluded from `exposedTables`.
116
+ */
117
+ unaddressableTables?: number;
118
+ /** Role planes: the most direct way the reach arrives. */
119
+ reachedVia?: 'grant' | 'PUBLIC' | 'inheritance';
120
+ /** Security score for this plane, same model as the headline. */
121
+ score: import('./score/score').Score;
122
+ /** Severity counts for the findings reachable on this plane. */
123
+ summary: Summary;
124
+ /** Present when the plane was reported but deliberately not graded. */
125
+ skipped?: string;
126
+ }
127
+ /** The resolved exposure surface an audit was scored against. */
128
+ export interface ExposureReport {
129
+ /** True when a surface was configured or auto-resolved. */
130
+ known: boolean;
131
+ /** Where the surface came from: an adapter name, `config`, or `none`. */
132
+ source: string;
133
+ /** Name of the primary plane. */
134
+ plane?: string;
135
+ /** Schemas reachable from the exposed APIs. Empty when unknown. */
136
+ schemas: string[];
137
+ /** API-edge roles, when the resolver can discover them. */
138
+ roles?: string[];
139
+ /**
140
+ * The subset of `roles` an unauthenticated caller arrives as — the answer to
141
+ * "what can someone with no credentials reach?". Omitted when none resolve.
142
+ */
143
+ anonRoles?: string[];
144
+ /** Tables on the exposed surface (the score denominator). */
145
+ exposedTables: number;
146
+ /** All tables the audit introspected. */
147
+ totalTables: number;
148
+ /**
149
+ * Relations in the exposed schemas the generated API cannot address, and
150
+ * which are therefore excluded from `exposedTables`. Present only when an
151
+ * adapter could prove it; listed rather than counted, because a subtraction
152
+ * from the score denominator should be readable.
153
+ */
154
+ unaddressable?: import('./exposure/reach').UnreachableRelation[];
155
+ }
156
+ /**
157
+ * The optional performance dimension (`--perf`): index-hygiene and
158
+ * policy-cost findings, scored on their own 0-100 axis against the same
159
+ * exposure surface.
160
+ */
161
+ export interface PerfReport {
162
+ /** Perf-dimension findings (also present in `report.findings`). */
163
+ findings: Finding[];
164
+ summary: Summary;
165
+ /** Perf score — computed only over perf-dimension findings. */
166
+ score: import('./score/score').Score;
167
+ /**
168
+ * Diff against a committed perf baseline (`--perf-baseline`): which findings
169
+ * are new debt, which were fixed, which are accepted.
170
+ */
171
+ diff?: import('./perf/baseline').PerfDiff;
172
+ /** Runtime-statistics provenance, present when the audit ran with `--stats`. */
173
+ stats?: PerfStatsReport;
174
+ /**
175
+ * Access-path classification: how many foreign keys X1 was not applied to,
176
+ * because nothing reads them. Reported so a suppression this broad is never
177
+ * silent.
178
+ */
179
+ paths?: PerfPathsReport;
180
+ /** Planner-proof summary, present when the audit ran with `--explain`. */
181
+ explain?: import('./perf/explain').ExplainReport;
182
+ }
183
+ /**
184
+ * What the access-path signals found, and what X1 did about it. Reported so
185
+ * the evidence is visible even when — as by default — it changes nothing.
186
+ */
187
+ export interface PerfPathsReport {
188
+ /** Foreign keys examined. */
189
+ total: number;
190
+ /** Keys with a `read` signal: an RLS policy or a view names the column. */
191
+ read: number;
192
+ /** Keys whose only signals are shape: they look like provisioning pointers. */
193
+ writeOnceShaped: number;
194
+ /** Tables carrying enough write-once pointers to look like config records. */
195
+ tables: number;
196
+ /** What X1 did with the write-once-shaped keys. */
197
+ onWriteOncePointer: 'report' | 'demote' | 'suppress';
198
+ /**
199
+ * Keys whose reverse relation an API behavior declares absent. Reported
200
+ * only: one missing path is not proof that nothing traverses the key.
201
+ */
202
+ declaredHidden?: number;
203
+ }
204
+ /** Where the `S*` findings' numbers came from, and how much to trust them. */
205
+ export interface PerfStatsReport {
206
+ source: 'live';
207
+ /** Tables whose cumulative statistics were read. */
208
+ tables: number;
209
+ /** When the counters were last reset — the window the numbers describe. */
210
+ statsReset: string | null;
211
+ /** Whether `S*` findings counted toward the perf score. */
212
+ scored: boolean;
213
+ /** Non-fatal gaps, e.g. `pg_stat_statements` not installed. */
214
+ notes?: string[];
215
+ }
216
+ /**
217
+ * The per-role exposure report: the direct answer to "what can role X
218
+ * access?", computed over effective grants (direct, TO PUBLIC, inherited)
219
+ * for the configured untrusted roles. Present whenever such roles are
220
+ * configured (e.g. L5/R1 options), independent of any findings.
221
+ */
222
+ export interface RoleAccessReport {
223
+ roles: import('./checks/lattice').RoleAccessEntry[];
224
+ }
225
+ export interface Report {
226
+ version: string;
227
+ generatedAt: string;
228
+ /**
229
+ * What ruler this score was measured with: a fingerprint of the resolved
230
+ * configuration, and whether the run refused local config entirely. Two
231
+ * reports are comparable when their fingerprints match.
232
+ */
233
+ provenance?: import('./config/fingerprint').Provenance;
234
+ summary: Summary;
235
+ findings: Finding[];
236
+ /** Config-driven audit score (weighted deductions, 0-100 + grade). */
237
+ score?: import('./score/score').Score;
238
+ /** Performance dimension, present when the audit ran with `perf` enabled. */
239
+ perf?: PerfReport;
240
+ /** The exposure surface the score was computed against. */
241
+ exposure?: ExposureReport;
242
+ /**
243
+ * Every graded access plane, primary first. `planes[0].score` is
244
+ * `report.score`; the rest are advisory unless `failOn.planes` opts them
245
+ * into gating.
246
+ */
247
+ planes?: PlaneReport[];
248
+ /**
249
+ * Named scores over slices of the same findings (`scorecards` config), the
250
+ * reserved `default` and `raw` cards first. Different teams gate on
251
+ * different questions; this is where each one's answer lives, computed
252
+ * from the one set of findings so they can never disagree about the facts.
253
+ */
254
+ scorecards?: import('./score/scorecards').ScorecardReport[];
255
+ /** Effective per-role access, for the configured untrusted roles. */
256
+ roleAccess?: RoleAccessReport;
257
+ /**
258
+ * L21's `granted − reachable` result: per role, the EXECUTE grants that are
259
+ * revocable, the ones retained (each with the reachability path that proves
260
+ * it load-bearing), and the ones suppressed because the closure could not be
261
+ * fully read. The retained-and-suppressed lists are the point of the rule —
262
+ * they are what a human reviews before dropping anything.
263
+ */
264
+ revocableGrants?: import('./checks/revocable-grants').RevocableGrantsReport;
265
+ /**
266
+ * Unscored call-graph audit (`--call-graph`): trust boundaries reachable
267
+ * from the exposed entry points, for human review.
268
+ */
269
+ callGraph?: import('./callgraph/graph').CallGraphReport;
270
+ /**
271
+ * Diff against a committed call-graph baseline (`--baseline`): trust
272
+ * boundaries added since the snapshot (require sign-off) and boundaries
273
+ * that were resolved.
274
+ */
275
+ callGraphDiff?: import('./callgraph/baseline').CallGraphDiff;
276
+ /**
277
+ * Movement against a previous run (`--compare`): score deltas, severity
278
+ * deltas and the rules that changed. A report describes a database; this is
279
+ * the only part that describes a change to one.
280
+ */
281
+ comparison?: import('./report/compare').ReportComparison;
282
+ /**
283
+ * Why there is no `comparison` (`--compare-skipped`): a baseline was looked
284
+ * for and none qualified. Silence would read as "nothing moved", which is
285
+ * how a delta nobody could see went wrong unnoticed; the absolute score and
286
+ * the perf ratchet still gate the run, and this line says so.
287
+ */
288
+ comparisonSkipped?: string;
289
+ }
290
+ export declare function newSummary(): Summary;
291
+ export declare function summarize(findings: Finding[]): Summary;
292
+ export declare function meetsThreshold(sev: Severity, threshold: Severity): boolean;
package/esm/types.js ADDED
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Report types for the safegres audit.
3
+ *
4
+ * Kept intentionally minimal and dependency-free so they can be imported
5
+ * by downstream packages (e.g. `@constructive-db/rls-audit-constructive`)
6
+ * without pulling in `pg` or `pgsql-parser`.
7
+ */
8
+ export const SEVERITY_ORDER = {
9
+ critical: 4,
10
+ high: 3,
11
+ medium: 2,
12
+ low: 1,
13
+ info: 0
14
+ };
15
+ export function newSummary() {
16
+ return { critical: 0, high: 0, medium: 0, low: 0, info: 0 };
17
+ }
18
+ export function summarize(findings) {
19
+ const s = newSummary();
20
+ for (const f of findings)
21
+ s[f.severity] += 1;
22
+ return s;
23
+ }
24
+ export function meetsThreshold(sev, threshold) {
25
+ return SEVERITY_ORDER[sev] >= SEVERITY_ORDER[threshold];
26
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * The analyzer version stamped into every report and into the SARIF tool
3
+ * record. Read from package.json the same way the CLI reads it, rather than
4
+ * held in a generated constant: a constant only stays true if a sync step runs
5
+ * on the same commit lerna bumps the manifest, and it drifted (1.16.1 against a
6
+ * 1.18.0 manifest) precisely because it doesn't.
7
+ */
8
+ export declare const version: string;
package/esm/version.js ADDED
@@ -0,0 +1,9 @@
1
+ import { getPackageVersion } from '@inquirerer/utils';
2
+ /**
3
+ * The analyzer version stamped into every report and into the SARIF tool
4
+ * record. Read from package.json the same way the CLI reads it, rather than
5
+ * held in a generated constant: a constant only stays true if a sync step runs
6
+ * on the same commit lerna bumps the manifest, and it drifted (1.16.1 against a
7
+ * 1.18.0 manifest) precisely because it doesn't.
8
+ */
9
+ export const version = getPackageVersion(__dirname);
@@ -0,0 +1,152 @@
1
+ /**
2
+ * Exposure adapters: how safegres learns what a stack exposes.
3
+ *
4
+ * An adapter is a value, not a module name. Built-ins are named exports of
5
+ * this module, a custom one is an object you construct in your own repo, and
6
+ * both are passed the same way — nothing is resolved by package name, and
7
+ * there is no plugin loader to reason about:
8
+ *
9
+ * ```ts
10
+ * import { constructiveAdapter, definePlanes } from 'safegres/adapters';
11
+ *
12
+ * export default defineConfig({
13
+ * exposure: { adapters: [constructiveAdapter, myAdapter], schemas: ['app_public'] }
14
+ * });
15
+ * ```
16
+ *
17
+ * `detect()` answers "is this stack present in this database?" and `resolve()`
18
+ * returns the planes it exposes — one per API where the stack has more than
19
+ * one, because "the admin API grades A and the public API grades C" is
20
+ * strictly more useful than their union.
21
+ */
22
+ import type { PlaneKind } from '../config/types';
23
+ import type { QueryExecutor } from '../pg/introspect';
24
+ import type { ApiReach } from './reach';
25
+ /** A plane as an adapter reports it, before roles are resolved against the catalog. */
26
+ export interface PlaneInput {
27
+ name: string;
28
+ kind?: PlaneKind;
29
+ primary?: boolean;
30
+ schemas?: string[];
31
+ /** Every role that reaches this plane, anonymous ones included. */
32
+ roles?: string[];
33
+ /**
34
+ * The subset of `roles` an *unauthenticated* caller arrives as. Every stack
35
+ * knows which one this is — Constructive's `apis.anon_role`, PostgREST's
36
+ * `pgrst.db_anon_role`, Supabase's `anon`, graphile's visitor — and the
37
+ * distinction is the difference between "a signed-in user can write this"
38
+ * (usually the point) and "anyone on the internet can" (usually the bug).
39
+ */
40
+ anonRoles?: string[];
41
+ }
42
+ /** What an adapter is asked to compute reach for. */
43
+ export interface ReachContext {
44
+ /** Schemas on the plane. Empty means "the whole database". */
45
+ schemas: string[];
46
+ excludeSchemas?: string[];
47
+ }
48
+ export interface ExposureAdapter {
49
+ /** Stable identifier, reported as the exposure `source`. */
50
+ name: string;
51
+ /** True when this stack is present in the connected database. */
52
+ detect(exec: QueryExecutor): Promise<boolean>;
53
+ /** The planes this stack exposes. An empty array means "present, exposes nothing". */
54
+ resolve(exec: QueryExecutor): Promise<PlaneInput[]>;
55
+ /**
56
+ * Optional relation-level precision *within* a plane's schemas: which
57
+ * relations the stack's generated API cannot address at all.
58
+ *
59
+ * Separate from `resolve` because it answers a different question and most
60
+ * adapters cannot answer it. An adapter that knows the schemas but not the
61
+ * fields simply omits this, and the plane stays schema-granular.
62
+ */
63
+ reach?(exec: QueryExecutor, context: ReachContext): Promise<ApiReach>;
64
+ }
65
+ /**
66
+ * Constructive routing-plane introspection: an API exposes a set of schemas
67
+ * via `routing_public.apis` → `routing_public.api_schemas` →
68
+ * `metaschema_public.schema` (and the platform plane via `platform_apis` →
69
+ * `platform_api_schemas`). API-edge roles come from `apis.role_name` /
70
+ * `apis.anon_role`.
71
+ *
72
+ * Emits one `api` plane per API, plus a primary plane unioning them: the union
73
+ * is what the headline score has always been computed against, and the
74
+ * per-API planes are what let a reader see which API carries the debt.
75
+ */
76
+ export declare const constructiveAdapter: ExposureAdapter;
77
+ /**
78
+ * PostGraphile behaviors as relation-level reach.
79
+ *
80
+ * Deliberately *not* folded into {@link constructiveAdapter}, even though
81
+ * Constructive is a PostGraphile stack: behaviors are a Graphile convention
82
+ * that any Graphile database follows, and each adapter should say one true
83
+ * thing. This one contributes no planes — it has no idea which schemas an API
84
+ * serves — and only narrows the planes another adapter, or the config, already
85
+ * established.
86
+ */
87
+ export declare const postgraphileAdapter: ExposureAdapter;
88
+ /**
89
+ * PostgREST exposure, read from the catalog rather than inferred from a
90
+ * schema name: PostgREST serves exactly `pgrst.db_schemas`, which is set as a
91
+ * role or database GUC (`ALTER ROLE authenticator SET pgrst.db_schemas = …`)
92
+ * and therefore lands in `pg_db_role_setting`. `pgrst.db_anon_role` names the
93
+ * role an unauthenticated request runs as, and the connecting role
94
+ * (`authenticator` by convention) is the one that can `SET ROLE` to it.
95
+ *
96
+ * Supabase is PostgREST underneath, so this covers it too; the difference is
97
+ * the role vocabulary, which the `supabase` preset supplies.
98
+ */
99
+ export declare const postgrestAdapter: ExposureAdapter;
100
+ /**
101
+ * Supabase runs PostgREST, but configures it *outside* the database — the
102
+ * schema list is a platform setting, so `pgrst.db_schemas` is usually absent
103
+ * and `postgrestAdapter` correctly resolves nothing. Hence a separate
104
+ * adapter: it prefers the GUCs when a self-hosted stack sets them, and only
105
+ * falls back to the platform's fixed surface once it has *proved* it is
106
+ * looking at Supabase — `auth.users` plus the three roles every project has.
107
+ *
108
+ * The fallback is deliberately confined here. `postgrestAdapter` never
109
+ * guesses: an unconfigured PostgREST resolves no planes, which surfaces as
110
+ * unknown exposure (a capped score and a W1) rather than a wrong surface
111
+ * presented as fact.
112
+ */
113
+ export declare const supabaseAdapter: ExposureAdapter;
114
+ /**
115
+ * Hasura reads its exposed surface out of its own metadata: v2+ keeps one
116
+ * JSON document in `hdb_catalog.hdb_metadata`, older versions a row per
117
+ * tracked table in `hdb_catalog.hdb_table`. Only *tracked* tables are served,
118
+ * so the schemas that contain them are the surface.
119
+ */
120
+ export declare const hasuraAdapter: ExposureAdapter;
121
+ /**
122
+ * PostGraphile publishes whatever schemas it was started with — a CLI/library
123
+ * argument, invisible from inside the database. So this adapter resolves the
124
+ * `graphile-starter` layout (`app_public` served, `app_hidden`/`app_private`
125
+ * not) and nothing else.
126
+ *
127
+ * That is naming-as-intent, which safegres otherwise refuses. The difference
128
+ * is consent: listing this adapter *is* the declaration that the convention
129
+ * holds here. When it doesn't, list `exposure.schemas` instead — explicit
130
+ * always wins.
131
+ *
132
+ * Reach is a separate question — *which schemas are served* versus *which
133
+ * relations the served schemas expose* — and is delegated to
134
+ * {@link postgraphileAdapter}, which answers it for any Graphile stack
135
+ * regardless of schema layout.
136
+ */
137
+ export declare const graphileAdapter: ExposureAdapter;
138
+ /** Every adapter a config may name with a string. */
139
+ export declare const BUILTIN_ADAPTERS: Record<string, ExposureAdapter>;
140
+ /**
141
+ * Wrap a fixed set of planes as an adapter — the escape hatch for a surface
142
+ * you know but cannot introspect (a schema list your deployment tooling
143
+ * knows, an API gateway's config read at build time).
144
+ */
145
+ export declare function definePlanes(name: string, planes: PlaneInput[]): ExposureAdapter;
146
+ /**
147
+ * Coerce whatever a config carried in `exposure.adapters` into adapters.
148
+ * Strings resolve against the built-in table only — an unknown name is an
149
+ * error rather than a silent no-op, because a typo'd adapter name would
150
+ * otherwise present as an unexposed database.
151
+ */
152
+ export declare function resolveAdapters(entries: Array<string | ExposureAdapter> | undefined): ExposureAdapter[];