@safegres/test 0.0.2 → 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/adapters.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `safegres/adapters` — the built-in exposure adapters and the interface a
3
+ * custom one implements. Kept as its own entry point so a config file can
4
+ * import an adapter without pulling in the whole auditor.
5
+ */
6
+ export type { ExposureAdapter, PlaneInput, ReachContext } from './exposure/adapters';
7
+ export { BUILTIN_ADAPTERS, constructiveAdapter, definePlanes, graphileAdapter, hasuraAdapter, postgraphileAdapter, postgrestAdapter, resolveAdapters, supabaseAdapter } from './exposure/adapters';
8
+ export type { ApiReach, UnreachableRelation } from './exposure/reach';
package/adapters.js ADDED
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ /**
3
+ * `safegres/adapters` — the built-in exposure adapters and the interface a
4
+ * custom one implements. Kept as its own entry point so a config file can
5
+ * import an adapter without pulling in the whole auditor.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.supabaseAdapter = exports.resolveAdapters = exports.postgrestAdapter = exports.postgraphileAdapter = exports.hasuraAdapter = exports.graphileAdapter = exports.definePlanes = exports.constructiveAdapter = exports.BUILTIN_ADAPTERS = void 0;
9
+ var adapters_1 = require("./exposure/adapters");
10
+ Object.defineProperty(exports, "BUILTIN_ADAPTERS", { enumerable: true, get: function () { return adapters_1.BUILTIN_ADAPTERS; } });
11
+ Object.defineProperty(exports, "constructiveAdapter", { enumerable: true, get: function () { return adapters_1.constructiveAdapter; } });
12
+ Object.defineProperty(exports, "definePlanes", { enumerable: true, get: function () { return adapters_1.definePlanes; } });
13
+ Object.defineProperty(exports, "graphileAdapter", { enumerable: true, get: function () { return adapters_1.graphileAdapter; } });
14
+ Object.defineProperty(exports, "hasuraAdapter", { enumerable: true, get: function () { return adapters_1.hasuraAdapter; } });
15
+ Object.defineProperty(exports, "postgraphileAdapter", { enumerable: true, get: function () { return adapters_1.postgraphileAdapter; } });
16
+ Object.defineProperty(exports, "postgrestAdapter", { enumerable: true, get: function () { return adapters_1.postgrestAdapter; } });
17
+ Object.defineProperty(exports, "resolveAdapters", { enumerable: true, get: function () { return adapters_1.resolveAdapters; } });
18
+ Object.defineProperty(exports, "supabaseAdapter", { enumerable: true, get: function () { return adapters_1.supabaseAdapter; } });
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Small typed helpers for inspecting `pgsql-parser` AST nodes.
3
+ *
4
+ * Operates on the raw shape returned by `parse()` rather than the typed
5
+ * `@pgsql/types` view, so the runtime cost is just object lookups.
6
+ */
7
+ import type { PgAstNode } from './parse';
8
+ type Obj = Record<string, unknown>;
9
+ /** Extract the single wrapping key (e.g. `A_Expr`, `BoolExpr`) and its payload. */
10
+ export declare function unwrap(node: PgAstNode): {
11
+ kind: string;
12
+ body: Obj;
13
+ } | null;
14
+ /** Returns the boolean literal value, or null if not an `A_Const(bool)`. */
15
+ export declare function boolConst(node: PgAstNode): boolean | null;
16
+ export {};
package/ast/helpers.js ADDED
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ /**
3
+ * Small typed helpers for inspecting `pgsql-parser` AST nodes.
4
+ *
5
+ * Operates on the raw shape returned by `parse()` rather than the typed
6
+ * `@pgsql/types` view, so the runtime cost is just object lookups.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.unwrap = unwrap;
10
+ exports.boolConst = boolConst;
11
+ function isObj(x) {
12
+ return typeof x === 'object' && x !== null;
13
+ }
14
+ /** Extract the single wrapping key (e.g. `A_Expr`, `BoolExpr`) and its payload. */
15
+ function unwrap(node) {
16
+ if (!isObj(node))
17
+ return null;
18
+ const keys = Object.keys(node);
19
+ if (keys.length !== 1)
20
+ return null;
21
+ const body = node[keys[0]];
22
+ if (!isObj(body))
23
+ return null;
24
+ return { kind: keys[0], body };
25
+ }
26
+ /** Returns the boolean literal value, or null if not an `A_Const(bool)`. */
27
+ function boolConst(node) {
28
+ const u = unwrap(node);
29
+ if (!u || u.kind !== 'A_Const')
30
+ return null;
31
+ // `pgsql-parser` represents `true` as `{ boolval: { boolval: true } }` and
32
+ // `false` as `{ boolval: {} }` (the parser elides the default value). The
33
+ // *presence* of the `boolval` key is what identifies a boolean literal.
34
+ if (!('boolval' in u.body))
35
+ return null;
36
+ const boolval = u.body.boolval;
37
+ if (!boolval || typeof boolval !== 'object')
38
+ return null;
39
+ return boolval.boolval === true;
40
+ }
package/ast/parse.d.ts ADDED
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Wrapper around `pgsql-parser` that handles the reality that RLS predicates
3
+ * appearing in `pg_get_expr(polqual, polrelid)` are fragments, not statements.
4
+ *
5
+ * We wrap the fragment in a `SELECT … WHERE <expr>` so the parser accepts it,
6
+ * then pull the `whereClause` out of the resulting AST.
7
+ */
8
+ /** Opaque AST node — intentionally `unknown` to keep us loose against pgsql-parser upgrades. */
9
+ export type PgAstNode = unknown;
10
+ export interface PolicyExpression {
11
+ /** Original text (exactly as returned by pg_get_expr). */
12
+ text: string;
13
+ /** Root AST node of the expression (not the wrapping SELECT). */
14
+ ast: PgAstNode;
15
+ }
16
+ export declare class PolicyParseError extends Error {
17
+ readonly expr: string;
18
+ readonly cause: unknown;
19
+ constructor(expr: string, cause: unknown);
20
+ }
21
+ /**
22
+ * Parse a policy expression fragment.
23
+ *
24
+ * `parse` from pgsql-parser v17 is async (it awaits a WASM load), so this
25
+ * wrapper is async too.
26
+ *
27
+ * @param expr The text from `pg_get_expr(...)`.
28
+ * @returns Parsed AST, or `null` if `expr` is null/empty.
29
+ * @throws `PolicyParseError` on parse failure.
30
+ */
31
+ export declare function parsePolicyExpression(expr: string | null): Promise<PolicyExpression | null>;
package/ast/parse.js ADDED
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ /**
3
+ * Wrapper around `pgsql-parser` that handles the reality that RLS predicates
4
+ * appearing in `pg_get_expr(polqual, polrelid)` are fragments, not statements.
5
+ *
6
+ * We wrap the fragment in a `SELECT … WHERE <expr>` so the parser accepts it,
7
+ * then pull the `whereClause` out of the resulting AST.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.PolicyParseError = void 0;
11
+ exports.parsePolicyExpression = parsePolicyExpression;
12
+ const pgsql_parser_1 = require("pgsql-parser");
13
+ class PolicyParseError extends Error {
14
+ expr;
15
+ cause;
16
+ constructor(expr, cause) {
17
+ super(`Failed to parse policy expression: ${expr}`);
18
+ this.expr = expr;
19
+ this.cause = cause;
20
+ }
21
+ }
22
+ exports.PolicyParseError = PolicyParseError;
23
+ /**
24
+ * Parse a policy expression fragment.
25
+ *
26
+ * `parse` from pgsql-parser v17 is async (it awaits a WASM load), so this
27
+ * wrapper is async too.
28
+ *
29
+ * @param expr The text from `pg_get_expr(...)`.
30
+ * @returns Parsed AST, or `null` if `expr` is null/empty.
31
+ * @throws `PolicyParseError` on parse failure.
32
+ */
33
+ async function parsePolicyExpression(expr) {
34
+ if (expr === null || expr === undefined)
35
+ return null;
36
+ const trimmed = expr.trim();
37
+ if (trimmed === '')
38
+ return null;
39
+ // Strip outer parens that Postgres adds to pg_get_expr output, so the
40
+ // wrapping `WHERE` is cleaner. We only strip *one* pair and only when
41
+ // balanced — otherwise we leave the text alone and let the parser deal.
42
+ const inner = stripOuterParens(trimmed);
43
+ const wrapped = `SELECT 1 FROM __safegres_audit_dummy WHERE (${inner})`;
44
+ let parsed;
45
+ try {
46
+ parsed = await (0, pgsql_parser_1.parse)(wrapped);
47
+ }
48
+ catch (err) {
49
+ throw new PolicyParseError(expr, err);
50
+ }
51
+ const ast = extractWhereClause(parsed);
52
+ if (!ast) {
53
+ throw new PolicyParseError(expr, new Error('no whereClause in parsed SELECT'));
54
+ }
55
+ return { text: expr, ast };
56
+ }
57
+ function stripOuterParens(s) {
58
+ if (s.length < 2 || s[0] !== '(' || s[s.length - 1] !== ')')
59
+ return s;
60
+ let depth = 0;
61
+ for (let i = 0; i < s.length; i++) {
62
+ if (s[i] === '(')
63
+ depth++;
64
+ else if (s[i] === ')') {
65
+ depth--;
66
+ if (depth === 0 && i !== s.length - 1)
67
+ return s;
68
+ }
69
+ }
70
+ return s.slice(1, -1);
71
+ }
72
+ function extractWhereClause(parsed) {
73
+ // pgsql-parser v17 returns `{ stmts: [{ stmt: { SelectStmt: { whereClause: … } } }] }`
74
+ if (!parsed || typeof parsed !== 'object')
75
+ return null;
76
+ const asRecord = parsed;
77
+ const stmts = asRecord.stmts;
78
+ if (!Array.isArray(stmts) || stmts.length === 0)
79
+ return null;
80
+ const first = stmts[0];
81
+ const stmt = (first.stmt ?? first);
82
+ const selectStmt = stmt.SelectStmt;
83
+ if (!selectStmt)
84
+ return null;
85
+ const where = selectStmt.whereClause;
86
+ return where ?? null;
87
+ }
package/ast/walk.d.ts ADDED
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Domain-specific AST helpers for the safegres auditor, layered on top of
3
+ * `@pgsql/traverse`'s `walk` / `NodePath`.
4
+ */
5
+ import type { PgAstNode } from './parse';
6
+ /** Find every node tagged with `tag` (e.g. `FuncCall`, `ColumnRef`). */
7
+ export declare function findAll(root: PgAstNode, tag: string): Record<string, unknown>[];
8
+ /** Visit every tagged node. `visit(node, tag, parent)` matches the old API. */
9
+ export type Visitor = (node: Record<string, unknown>, tag: string, parent: Record<string, unknown> | null) => void;
10
+ export declare function visitAll(root: PgAstNode, visit: Visitor): void;
11
+ /**
12
+ * Extract the printable name of a `FuncCall.funcname` field.
13
+ *
14
+ * `funcname` is an array of `{ String: { sval: "..." } }` nodes — usually one
15
+ * element (bare name) or two (schema-qualified).
16
+ */
17
+ export declare function funcNameParts(funcCall: Record<string, unknown>): {
18
+ schema?: string;
19
+ name: string;
20
+ };
21
+ /** Get the printable qualified name (`schema.name` or `name`). */
22
+ export declare function funcNameQualified(funcCall: Record<string, unknown>): string;
23
+ /**
24
+ * Get a ColumnRef's dotted name path. Example: `s.actor_id` → `['s', 'actor_id']`.
25
+ * Returns `['*']` for `SELECT *`.
26
+ */
27
+ export declare function columnRefPath(columnRef: Record<string, unknown>): string[];
package/ast/walk.js ADDED
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ /**
3
+ * Domain-specific AST helpers for the safegres auditor, layered on top of
4
+ * `@pgsql/traverse`'s `walk` / `NodePath`.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.findAll = findAll;
8
+ exports.visitAll = visitAll;
9
+ exports.funcNameParts = funcNameParts;
10
+ exports.funcNameQualified = funcNameQualified;
11
+ exports.columnRefPath = columnRefPath;
12
+ const traverse_1 = require("@pgsql/traverse");
13
+ /** Find every node tagged with `tag` (e.g. `FuncCall`, `ColumnRef`). */
14
+ function findAll(root, tag) {
15
+ const out = [];
16
+ (0, traverse_1.walk)(root, (path) => {
17
+ if (path.tag === tag) {
18
+ out.push(path.node);
19
+ }
20
+ });
21
+ return out;
22
+ }
23
+ function visitAll(root, visit) {
24
+ (0, traverse_1.walk)(root, (path) => {
25
+ visit(path.node, path.tag, path.parent?.node ?? null);
26
+ });
27
+ }
28
+ /**
29
+ * Extract the printable name of a `FuncCall.funcname` field.
30
+ *
31
+ * `funcname` is an array of `{ String: { sval: "..." } }` nodes — usually one
32
+ * element (bare name) or two (schema-qualified).
33
+ */
34
+ function funcNameParts(funcCall) {
35
+ const funcname = funcCall.funcname;
36
+ if (!Array.isArray(funcname))
37
+ return { name: '<unknown>' };
38
+ const parts = funcname
39
+ .map((n) => {
40
+ const rec = n;
41
+ const str = (rec.String ?? rec.string);
42
+ if (!str)
43
+ return '';
44
+ return String((str.sval ?? str.str) ?? '');
45
+ })
46
+ .filter((s) => s.length > 0);
47
+ if (parts.length >= 2)
48
+ return { schema: parts[0], name: parts[parts.length - 1] };
49
+ if (parts.length === 1)
50
+ return { name: parts[0] };
51
+ return { name: '<unknown>' };
52
+ }
53
+ /** Get the printable qualified name (`schema.name` or `name`). */
54
+ function funcNameQualified(funcCall) {
55
+ const { schema, name } = funcNameParts(funcCall);
56
+ return schema ? `${schema}.${name}` : name;
57
+ }
58
+ /**
59
+ * Get a ColumnRef's dotted name path. Example: `s.actor_id` → `['s', 'actor_id']`.
60
+ * Returns `['*']` for `SELECT *`.
61
+ */
62
+ function columnRefPath(columnRef) {
63
+ const fields = columnRef.fields;
64
+ if (!Array.isArray(fields))
65
+ return [];
66
+ const out = [];
67
+ for (const f of fields) {
68
+ const rec = f;
69
+ const str = (rec.String ?? rec.string);
70
+ if (str) {
71
+ out.push(String((str.sval ?? str.str) ?? ''));
72
+ continue;
73
+ }
74
+ if ('A_Star' in rec) {
75
+ out.push('*');
76
+ }
77
+ }
78
+ return out;
79
+ }
@@ -0,0 +1,28 @@
1
+ import type { CallGraphReport, ChecklistCode, ChecklistItem } from './graph';
2
+ /**
3
+ * A committed snapshot of the call-graph checklist, used by CI to detect
4
+ * *new* trust boundaries introduced by a change. Only the identity of each
5
+ * boundary is stored (code + entry + fn + table) — messages and paths may
6
+ * be reworded between versions without invalidating the baseline.
7
+ */
8
+ export interface CallGraphBaseline {
9
+ version: 1;
10
+ boundaries: BaselineBoundary[];
11
+ }
12
+ export interface BaselineBoundary {
13
+ code: ChecklistCode;
14
+ entry: string;
15
+ fn: string;
16
+ table?: string;
17
+ }
18
+ export interface CallGraphDiff {
19
+ /** Checklist items present now but not in the baseline — require sign-off. */
20
+ added: ChecklistItem[];
21
+ /** Baseline boundaries no longer present — resolved or removed. */
22
+ removed: BaselineBoundary[];
23
+ }
24
+ export declare function boundaryKey(b: BaselineBoundary): string;
25
+ export declare function toBaseline(report: CallGraphReport): CallGraphBaseline;
26
+ export declare function diffCallGraph(report: CallGraphReport, baseline: CallGraphBaseline): CallGraphDiff;
27
+ export declare function parseBaseline(raw: string): CallGraphBaseline;
28
+ export declare function serializeBaseline(baseline: CallGraphBaseline): string;
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.boundaryKey = boundaryKey;
4
+ exports.toBaseline = toBaseline;
5
+ exports.diffCallGraph = diffCallGraph;
6
+ exports.parseBaseline = parseBaseline;
7
+ exports.serializeBaseline = serializeBaseline;
8
+ function boundaryKey(b) {
9
+ return [b.code, b.entry, b.fn, b.table ?? ''].join('|');
10
+ }
11
+ function toBaseline(report) {
12
+ const seen = new Set();
13
+ const boundaries = [];
14
+ for (const item of report.checklist) {
15
+ const b = {
16
+ code: item.code,
17
+ entry: item.entry,
18
+ fn: item.fn,
19
+ ...(item.table ? { table: item.table } : {})
20
+ };
21
+ const key = boundaryKey(b);
22
+ if (seen.has(key))
23
+ continue;
24
+ seen.add(key);
25
+ boundaries.push(b);
26
+ }
27
+ boundaries.sort((a, b) => boundaryKey(a).localeCompare(boundaryKey(b)));
28
+ return { version: 1, boundaries };
29
+ }
30
+ function diffCallGraph(report, baseline) {
31
+ const baseKeys = new Set(baseline.boundaries.map(boundaryKey));
32
+ const current = toBaseline(report);
33
+ const currentKeys = new Set(current.boundaries.map(boundaryKey));
34
+ const addedKeys = new Set();
35
+ const added = [];
36
+ for (const item of report.checklist) {
37
+ const key = boundaryKey({ code: item.code, entry: item.entry, fn: item.fn, table: item.table });
38
+ if (baseKeys.has(key) || addedKeys.has(key))
39
+ continue;
40
+ addedKeys.add(key);
41
+ added.push(item);
42
+ }
43
+ const removed = baseline.boundaries.filter((b) => !currentKeys.has(boundaryKey(b)));
44
+ return { added, removed };
45
+ }
46
+ function parseBaseline(raw) {
47
+ const data = JSON.parse(raw);
48
+ if (data.version !== 1 || !Array.isArray(data.boundaries)) {
49
+ throw new Error('invalid call-graph baseline: expected { version: 1, boundaries: [...] }');
50
+ }
51
+ return { version: 1, boundaries: data.boundaries };
52
+ }
53
+ function serializeBaseline(baseline) {
54
+ return JSON.stringify(baseline, null, 2) + '\n';
55
+ }
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Static body extraction for the call graph.
3
+ *
4
+ * Given a function's source, extract the function calls, table references
5
+ * (read vs write), and auth-context mutations it contains. Dynamic SQL
6
+ * (`EXECUTE format(...)`) and unparseable bodies are surfaced as `opaque`
7
+ * rather than silently dropped — static analysis ends there.
8
+ *
9
+ * A view body is the same question asked of a different object, so
10
+ * {@link extractQuery} exposes the plain-SQL half directly.
11
+ */
12
+ import type { FunctionSnapshot } from '../pg/functions';
13
+ export interface NameRef {
14
+ schema?: string;
15
+ name: string;
16
+ }
17
+ export interface TableRef extends NameRef {
18
+ write: boolean;
19
+ }
20
+ /**
21
+ * A relation reference with the privilege the reference actually exercises,
22
+ * rather than the read/write bit {@link TableRef} carries. `INSERT INTO audit`
23
+ * and `UPDATE audit` are both writes, but they are not the same grant, and a
24
+ * rule action can mix them in one statement.
25
+ */
26
+ export interface RelationAccess extends NameRef {
27
+ privilege: 'SELECT' | 'INSERT' | 'UPDATE' | 'DELETE';
28
+ }
29
+ export interface ExtractedAccess {
30
+ accesses: RelationAccess[];
31
+ opaque: boolean;
32
+ opaqueReason?: string;
33
+ }
34
+ export interface ExtractedBody {
35
+ calls: NameRef[];
36
+ tables: TableRef[];
37
+ /** GUC names written via `set_config(...)` / `SET`, plus `role` for SET ROLE. */
38
+ settings: string[];
39
+ /** True when the body contains dynamic SQL we cannot follow statically. */
40
+ opaque: boolean;
41
+ /** Why the body is (partially) opaque, when it is. */
42
+ opaqueReason?: string;
43
+ /**
44
+ * The body executes SQL this analysis cannot see, *alongside* references it
45
+ * could read: `calls`, `tables` and `settings` are correct but incomplete.
46
+ *
47
+ * This is the distinction {@link opaque} cannot make. `opaque` says the
48
+ * whole body is unknown and its references must be discarded; `tainted`
49
+ * says what was read is real and what was missed is unknowable, which is
50
+ * what a reach model needs in order to report the gap instead of the view
51
+ * disappearing from the analysis altogether.
52
+ */
53
+ tainted?: string;
54
+ }
55
+ export declare function extractBody(fn: FunctionSnapshot): Promise<ExtractedBody>;
56
+ /**
57
+ * {@link extractAccess} asked of a whole function rather than one statement:
58
+ * every relation the body touches, with the privilege the touch exercises.
59
+ *
60
+ * This is what a SECURITY DEFINER function's reach is made of — the body runs
61
+ * as the owner, so each `INSERT INTO t` in it is an INSERT on `t` that the
62
+ * caller never needed a grant for. A body that cannot be read is `opaque`,
63
+ * and an opaque body's access list is a fragment its caller must discard.
64
+ */
65
+ export declare function extractFunctionAccess(fn: FunctionSnapshot): Promise<ExtractedAccess>;
66
+ /**
67
+ * The same extraction over a standalone SQL statement — a view body, a policy
68
+ * predicate, anything that is already plain SQL rather than a function.
69
+ */
70
+ export declare function extractQuery(sql: string): Promise<ExtractedBody>;
71
+ /**
72
+ * The same walk as {@link extractQuery}, but resolving each relation
73
+ * reference to the privilege it exercises instead of a read/write bit.
74
+ *
75
+ * Used for statements whose interesting content is *which grant* a reference
76
+ * needs — a rewrite rule's actions, where `INSERT INTO audit` means the rule
77
+ * needs INSERT on `audit` and nothing else tells you so.
78
+ */
79
+ export declare function extractAccess(sql: string): Promise<ExtractedAccess>;
80
+ /**
81
+ * Does this body restrict which rows come back?
82
+ *
83
+ * `null` when the SQL could not be parsed — "unknown", never "no". A view that
84
+ * filters is a view someone may be relying on as a row-level boundary, which
85
+ * is the precondition for the `security_barrier` question: without a `WHERE`
86
+ * there are no hidden rows for a leaky qual to reach.
87
+ *
88
+ * Only an explicit `WHERE`/`HAVING` counts. Row-limiting through a join,
89
+ * `DISTINCT` or `LIMIT` is real but is not the pattern that gets written as a
90
+ * security boundary, and treating it as one would fire on ordinary reporting
91
+ * views.
92
+ */
93
+ export declare function bodyFiltersRows(sql: string): Promise<boolean | null>;