dbctx 1.5.0 → 2.0.1

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 (141) hide show
  1. package/dist/app/assemble.d.mts.map +1 -1
  2. package/dist/app/assemble.mjs +20 -4
  3. package/dist/app/list.d.mts +4 -0
  4. package/dist/app/list.d.mts.map +1 -0
  5. package/dist/app/list.mjs +93 -0
  6. package/dist/app/load-introspection.d.mts +26 -0
  7. package/dist/app/load-introspection.d.mts.map +1 -0
  8. package/dist/app/load-introspection.mjs +89 -0
  9. package/dist/app/login.d.mts +2 -0
  10. package/dist/app/login.d.mts.map +1 -0
  11. package/dist/app/login.mjs +69 -0
  12. package/dist/app/open-url.d.mts +2 -0
  13. package/dist/app/open-url.d.mts.map +1 -1
  14. package/dist/app/open-url.mjs +8 -3
  15. package/dist/app/sample.d.mts +24 -0
  16. package/dist/app/sample.d.mts.map +1 -0
  17. package/dist/app/sample.mjs +257 -0
  18. package/dist/app/session.d.mts +1 -0
  19. package/dist/app/session.d.mts.map +1 -1
  20. package/dist/app/session.mjs +44 -4
  21. package/dist/app/tail.d.mts +13 -0
  22. package/dist/app/tail.d.mts.map +1 -0
  23. package/dist/app/tail.mjs +168 -0
  24. package/dist/db/check-constraints.d.mts +9 -0
  25. package/dist/db/check-constraints.d.mts.map +1 -0
  26. package/dist/db/check-constraints.mjs +17 -0
  27. package/dist/db/custom-types.d.mts +26 -0
  28. package/dist/db/custom-types.d.mts.map +1 -0
  29. package/dist/db/custom-types.mjs +61 -0
  30. package/dist/db/extensions.d.mts +8 -0
  31. package/dist/db/extensions.d.mts.map +1 -0
  32. package/dist/db/extensions.mjs +14 -0
  33. package/dist/db/functions.d.mts +11 -0
  34. package/dist/db/functions.d.mts.map +1 -0
  35. package/dist/db/functions.mjs +23 -0
  36. package/dist/db/index.d.mts +9 -0
  37. package/dist/db/index.d.mts.map +1 -1
  38. package/dist/db/index.mjs +10 -1
  39. package/dist/db/planner-stats.d.mts +33 -0
  40. package/dist/db/planner-stats.d.mts.map +1 -0
  41. package/dist/db/planner-stats.mjs +103 -0
  42. package/dist/db/rls.d.mts +21 -0
  43. package/dist/db/rls.d.mts.map +1 -0
  44. package/dist/db/rls.mjs +48 -0
  45. package/dist/db/sample.d.mts +16 -0
  46. package/dist/db/sample.d.mts.map +1 -0
  47. package/dist/db/sample.mjs +73 -0
  48. package/dist/db/sequences.d.mts +15 -0
  49. package/dist/db/sequences.d.mts.map +1 -0
  50. package/dist/db/sequences.mjs +31 -0
  51. package/dist/db/triggers.d.mts +11 -0
  52. package/dist/db/triggers.d.mts.map +1 -0
  53. package/dist/db/triggers.mjs +21 -0
  54. package/dist/flow/events.d.mts +115 -0
  55. package/dist/flow/events.d.mts.map +1 -0
  56. package/dist/flow/events.mjs +2 -0
  57. package/dist/flow/interpreter.d.mts +21 -0
  58. package/dist/flow/interpreter.d.mts.map +1 -0
  59. package/dist/flow/interpreter.mjs +605 -0
  60. package/dist/flow/projection.d.mts +17 -0
  61. package/dist/flow/projection.d.mts.map +1 -0
  62. package/dist/flow/projection.mjs +83 -0
  63. package/dist/flow/projection.test.d.mts +2 -0
  64. package/dist/flow/projection.test.d.mts.map +1 -0
  65. package/dist/flow/projection.test.mjs +162 -0
  66. package/dist/flow/reducer.d.mts +5 -0
  67. package/dist/flow/reducer.d.mts.map +1 -0
  68. package/dist/flow/reducer.mjs +306 -0
  69. package/dist/flow/reducer.test.d.mts +2 -0
  70. package/dist/flow/reducer.test.d.mts.map +1 -0
  71. package/dist/flow/reducer.test.mjs +479 -0
  72. package/dist/flow/run.d.mts +3 -0
  73. package/dist/flow/run.d.mts.map +1 -0
  74. package/dist/flow/run.mjs +89 -0
  75. package/dist/flow/states.d.mts +54 -0
  76. package/dist/flow/states.d.mts.map +1 -0
  77. package/dist/flow/states.mjs +39 -0
  78. package/dist/index.d.mts +7 -1
  79. package/dist/index.d.mts.map +1 -1
  80. package/dist/index.mjs +112 -13
  81. package/dist/lib/atomic-write.d.mts +4 -0
  82. package/dist/lib/atomic-write.d.mts.map +1 -0
  83. package/dist/lib/atomic-write.mjs +75 -0
  84. package/dist/lib/stream-job.d.mts +19 -0
  85. package/dist/lib/stream-job.d.mts.map +1 -0
  86. package/dist/lib/stream-job.mjs +55 -0
  87. package/dist/lib/trpc-url.mjs +2 -2
  88. package/dist/lib/trpc.mjs +2 -2
  89. package/dist/logger.d.mts.map +1 -1
  90. package/dist/logger.mjs +6 -3
  91. package/dist/providers/TrpcProvider.js +3 -3
  92. package/dist/store.d.mts +95 -2
  93. package/dist/store.d.mts.map +1 -1
  94. package/dist/store.mjs +64 -1
  95. package/dist/ui/App.d.ts +1 -1
  96. package/dist/ui/App.d.ts.map +1 -1
  97. package/dist/ui/App.js +22 -4
  98. package/dist/ui/components/Analyze.d.ts +10 -0
  99. package/dist/ui/components/Analyze.d.ts.map +1 -0
  100. package/dist/ui/components/Analyze.js +54 -0
  101. package/dist/ui/components/Billing.d.ts +10 -0
  102. package/dist/ui/components/Billing.d.ts.map +1 -0
  103. package/dist/ui/components/Billing.js +40 -0
  104. package/dist/ui/components/DB.d.ts.map +1 -1
  105. package/dist/ui/components/DB.js +2 -2
  106. package/dist/ui/components/DatabasePicker.d.ts +13 -0
  107. package/dist/ui/components/DatabasePicker.d.ts.map +1 -0
  108. package/dist/ui/components/DatabasePicker.js +79 -0
  109. package/dist/ui/components/Enrich.d.ts +10 -0
  110. package/dist/ui/components/Enrich.d.ts.map +1 -0
  111. package/dist/ui/components/Enrich.js +41 -0
  112. package/dist/ui/components/Gate.js +2 -2
  113. package/dist/ui/components/Introspect.d.ts.map +1 -1
  114. package/dist/ui/components/Introspect.js +2 -2
  115. package/dist/ui/components/IntrospectionUpload.d.ts +10 -0
  116. package/dist/ui/components/IntrospectionUpload.d.ts.map +1 -0
  117. package/dist/ui/components/IntrospectionUpload.js +30 -0
  118. package/dist/ui/components/Login.d.ts +19 -0
  119. package/dist/ui/components/Login.d.ts.map +1 -0
  120. package/dist/ui/components/Login.js +38 -0
  121. package/dist/ui/components/OutputJson.d.ts.map +1 -1
  122. package/dist/ui/components/OutputJson.js +2 -2
  123. package/dist/ui/components/SSH.d.ts.map +1 -1
  124. package/dist/ui/components/SSH.js +2 -2
  125. package/dist/ui/components/SamplesUpload.d.ts +10 -0
  126. package/dist/ui/components/SamplesUpload.d.ts.map +1 -0
  127. package/dist/ui/components/SamplesUpload.js +24 -0
  128. package/dist/ui/components/Sampling.d.ts +10 -0
  129. package/dist/ui/components/Sampling.d.ts.map +1 -0
  130. package/dist/ui/components/Sampling.js +58 -0
  131. package/dist/ui/components/Session.d.ts.map +1 -1
  132. package/dist/ui/components/Session.js +4 -4
  133. package/dist/ui/components/Spinner.d.ts.map +1 -1
  134. package/dist/ui/components/Spinner.js +17 -5
  135. package/dist/validatePaths.d.mts +1 -1
  136. package/dist/validatePaths.d.mts.map +1 -1
  137. package/dist/validatePaths.mjs +5 -1
  138. package/package.json +7 -7
  139. package/dist/app/index.d.mts +0 -3
  140. package/dist/app/index.d.mts.map +0 -1
  141. package/dist/app/index.mjs +0 -156
@@ -0,0 +1,103 @@
1
+ // pg_stats exposes most_common_vals/histogram_bounds as anyarray which pg cannot
2
+ // serialize over the wire; cast to text[] so values come back as strings. On the
3
+ // replay side we cast back to the target column type before injecting.
4
+ export const fetchPublicPlannerStatistics = async (pool) => {
5
+ const [relationsResult, attributesResult, extendedResult] = await Promise.all([
6
+ pool.query(`
7
+ SELECT
8
+ c.relname AS relation_name,
9
+ c.reltuples::float8 AS reltuples,
10
+ c.relpages::int AS relpages,
11
+ c.relallvisible::int AS relallvisible
12
+ FROM pg_catalog.pg_class c
13
+ JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
14
+ WHERE n.nspname = 'public'
15
+ AND c.relkind IN ('r', 'p', 'm')
16
+ ORDER BY c.relname
17
+ `),
18
+ pool.query(`
19
+ SELECT
20
+ s.tablename AS relation_name,
21
+ s.attname AS attribute_name,
22
+ s.inherited AS inherited,
23
+ s.null_frac::float8 AS null_frac,
24
+ s.avg_width::int AS avg_width,
25
+ s.n_distinct::float8 AS n_distinct,
26
+ s.most_common_vals::text::text[] AS most_common_vals,
27
+ s.most_common_freqs AS most_common_freqs,
28
+ s.histogram_bounds::text::text[] AS histogram_bounds,
29
+ s.correlation::float8 AS correlation,
30
+ s.most_common_elems::text::text[] AS most_common_elems,
31
+ s.most_common_elem_freqs AS most_common_elem_freqs,
32
+ s.elem_count_histogram AS elem_count_histogram
33
+ FROM pg_catalog.pg_stats s
34
+ WHERE s.schemaname = 'public'
35
+ ORDER BY s.tablename, s.attname, s.inherited
36
+ `),
37
+ // pg_stats_ext exposes the column list under `attnames` (name[]),
38
+ // not `columns`. Kinds come back as `"char"[]`, which pg cannot
39
+ // serialize over the wire without an explicit cast to text[].
40
+ // This query is non-fatal: any catalog shape mismatch (e.g. older
41
+ // Postgres) falls through to empty extended stats rather than
42
+ // blocking the introspection upload.
43
+ pool
44
+ .query(`
45
+ SELECT
46
+ c.relname AS relation_name,
47
+ e.statistics_name AS name,
48
+ e.kinds::text::text[] AS kind,
49
+ e.attnames::text::text[] AS columns,
50
+ e.n_distinct::text AS ndistinct,
51
+ e.dependencies::text AS dependencies,
52
+ e.most_common_vals::text AS mcv
53
+ FROM pg_catalog.pg_stats_ext e
54
+ JOIN pg_catalog.pg_class c ON c.relname = e.tablename
55
+ JOIN pg_catalog.pg_namespace n
56
+ ON n.oid = c.relnamespace AND n.nspname = e.schemaname
57
+ WHERE e.schemaname = 'public'
58
+ ORDER BY c.relname, e.statistics_name
59
+ `)
60
+ .catch(() => ({ rows: [] })),
61
+ ]);
62
+ const attrsByRelation = new Map();
63
+ attributesResult.rows.forEach((r) => {
64
+ const bucket = attrsByRelation.get(r.relation_name) ?? [];
65
+ bucket.push({
66
+ attribute_name: r.attribute_name,
67
+ inherited: r.inherited,
68
+ null_frac: Number(r.null_frac),
69
+ avg_width: Number(r.avg_width),
70
+ n_distinct: Number(r.n_distinct),
71
+ most_common_vals: r.most_common_vals,
72
+ most_common_freqs: r.most_common_freqs,
73
+ histogram_bounds: r.histogram_bounds,
74
+ correlation: r.correlation === null ? null : Number(r.correlation),
75
+ most_common_elems: r.most_common_elems,
76
+ most_common_elem_freqs: r.most_common_elem_freqs,
77
+ elem_count_histogram: r.elem_count_histogram,
78
+ });
79
+ attrsByRelation.set(r.relation_name, bucket);
80
+ });
81
+ const extendedByRelation = new Map();
82
+ extendedResult.rows.forEach((r) => {
83
+ const bucket = extendedByRelation.get(r.relation_name) ?? [];
84
+ bucket.push({
85
+ name: r.name,
86
+ kind: r.kind,
87
+ columns: r.columns,
88
+ ndistinct: r.ndistinct,
89
+ dependencies: r.dependencies,
90
+ mcv: r.mcv,
91
+ });
92
+ extendedByRelation.set(r.relation_name, bucket);
93
+ });
94
+ return relationsResult.rows.map((r) => ({
95
+ relation_name: r.relation_name,
96
+ reltuples: Number(r.reltuples),
97
+ relpages: Number(r.relpages),
98
+ relallvisible: Number(r.relallvisible),
99
+ attributes: attrsByRelation.get(r.relation_name) ?? [],
100
+ extended: extendedByRelation.get(r.relation_name) ?? [],
101
+ }));
102
+ };
103
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhbm5lci1zdGF0cy5tanMiLCJzb3VyY2VSb290IjoiLi9zcmMvIiwic291cmNlcyI6WyJkYi9wbGFubmVyLXN0YXRzLm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFvRUEsaUZBQWlGO0FBQ2pGLGlGQUFpRjtBQUNqRix1RUFBdUU7QUFDdkUsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsS0FBSyxFQUM3QyxJQUFVLEVBQytCLEVBQUU7SUFDM0MsTUFBTSxDQUFDLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLENBQUMsR0FDckQsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQ2QsSUFBSSxDQUFDLEtBQUssQ0FBZTs7Ozs7Ozs7Ozs7YUFXeEIsQ0FBQztRQUNGLElBQUksQ0FBQyxLQUFLLENBQWdCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7YUFrQnpCLENBQUM7UUFDRixrRUFBa0U7UUFDbEUsZ0VBQWdFO1FBQ2hFLDhEQUE4RDtRQUM5RCxrRUFBa0U7UUFDbEUsOERBQThEO1FBQzlELHFDQUFxQztRQUNyQyxJQUFJO2FBQ0MsS0FBSyxDQUNGOzs7Ozs7Ozs7Ozs7Ozs7YUFlUCxDQUNJO2FBQ0EsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBQyxJQUFJLEVBQUUsRUFBb0IsRUFBQyxDQUFDLENBQUM7S0FDbkQsQ0FBQyxDQUFDO0lBRVAsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQW9DLENBQUM7SUFDcEUsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1FBQ2hDLE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMxRCxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ1IsY0FBYyxFQUFFLENBQUMsQ0FBQyxjQUFjO1lBQ2hDLFNBQVMsRUFBRSxDQUFDLENBQUMsU0FBUztZQUN0QixTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDOUIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzlCLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztZQUNoQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsZ0JBQWdCO1lBQ3BDLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxpQkFBaUI7WUFDdEMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLGdCQUFnQjtZQUNwQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLFdBQVcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7WUFDbEUsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLGlCQUFpQjtZQUN0QyxzQkFBc0IsRUFBRSxDQUFDLENBQUMsc0JBQXNCO1lBQ2hELG9CQUFvQixFQUFFLENBQUMsQ0FBQyxvQkFBb0I7U0FDL0MsQ0FBQyxDQUFDO1FBQ0gsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2pELENBQUMsQ0FBQyxDQUFDO0lBRUgsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFBZ0MsQ0FBQztJQUNuRSxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1FBQzlCLE1BQU0sTUFBTSxHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzdELE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDUixJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUk7WUFDWixJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUk7WUFDWixPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU87WUFDbEIsU0FBUyxFQUFFLENBQUMsQ0FBQyxTQUFTO1lBQ3RCLFlBQVksRUFBRSxDQUFDLENBQUMsWUFBWTtZQUM1QixHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUc7U0FDYixDQUFDLENBQUM7UUFDSCxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNwRCxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDcEMsYUFBYSxFQUFFLENBQUMsQ0FBQyxhQUFhO1FBQzlCLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUM5QixRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7UUFDNUIsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDO1FBQ3RDLFVBQVUsRUFBRSxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFO1FBQ3RELFFBQVEsRUFBRSxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUU7S0FDMUQsQ0FBQyxDQUFDLENBQUM7QUFDUixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7UG9vbH0gZnJvbSAncGcnO1xuXG5leHBvcnQgdHlwZSBUQXR0cmlidXRlUGxhbm5lclN0YXRzID0ge1xuICAgIGF0dHJpYnV0ZV9uYW1lOiBzdHJpbmc7XG4gICAgaW5oZXJpdGVkOiBib29sZWFuO1xuICAgIG51bGxfZnJhYzogbnVtYmVyO1xuICAgIGF2Z193aWR0aDogbnVtYmVyO1xuICAgIG5fZGlzdGluY3Q6IG51bWJlcjtcbiAgICBtb3N0X2NvbW1vbl92YWxzOiByZWFkb25seSBzdHJpbmdbXSB8IG51bGw7XG4gICAgbW9zdF9jb21tb25fZnJlcXM6IHJlYWRvbmx5IG51bWJlcltdIHwgbnVsbDtcbiAgICBoaXN0b2dyYW1fYm91bmRzOiByZWFkb25seSBzdHJpbmdbXSB8IG51bGw7XG4gICAgY29ycmVsYXRpb246IG51bWJlciB8IG51bGw7XG4gICAgbW9zdF9jb21tb25fZWxlbXM6IHJlYWRvbmx5IHN0cmluZ1tdIHwgbnVsbDtcbiAgICBtb3N0X2NvbW1vbl9lbGVtX2ZyZXFzOiByZWFkb25seSBudW1iZXJbXSB8IG51bGw7XG4gICAgZWxlbV9jb3VudF9oaXN0b2dyYW06IHJlYWRvbmx5IG51bWJlcltdIHwgbnVsbDtcbn07XG5cbmV4cG9ydCB0eXBlIFRFeHRlbmRlZFN0YXRpc3RpYyA9IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAga2luZDogcmVhZG9ubHkgc3RyaW5nW107XG4gICAgY29sdW1uczogcmVhZG9ubHkgc3RyaW5nW107XG4gICAgbmRpc3RpbmN0OiBzdHJpbmcgfCBudWxsO1xuICAgIGRlcGVuZGVuY2llczogc3RyaW5nIHwgbnVsbDtcbiAgICBtY3Y6IHN0cmluZyB8IG51bGw7XG59O1xuXG5leHBvcnQgdHlwZSBUUmVsYXRpb25QbGFubmVyU3RhdHMgPSB7XG4gICAgcmVsYXRpb25fbmFtZTogc3RyaW5nO1xuICAgIHJlbHR1cGxlczogbnVtYmVyO1xuICAgIHJlbHBhZ2VzOiBudW1iZXI7XG4gICAgcmVsYWxsdmlzaWJsZTogbnVtYmVyO1xuICAgIGF0dHJpYnV0ZXM6IHJlYWRvbmx5IFRBdHRyaWJ1dGVQbGFubmVyU3RhdHNbXTtcbiAgICBleHRlbmRlZDogcmVhZG9ubHkgVEV4dGVuZGVkU3RhdGlzdGljW107XG59O1xuXG50eXBlIFRSZWxhdGlvblJvdyA9IHtcbiAgICByZWxhdGlvbl9uYW1lOiBzdHJpbmc7XG4gICAgcmVsdHVwbGVzOiBudW1iZXI7XG4gICAgcmVscGFnZXM6IG51bWJlcjtcbiAgICByZWxhbGx2aXNpYmxlOiBudW1iZXI7XG59O1xuXG50eXBlIFRBdHRyaWJ1dGVSb3cgPSB7XG4gICAgcmVsYXRpb25fbmFtZTogc3RyaW5nO1xuICAgIGF0dHJpYnV0ZV9uYW1lOiBzdHJpbmc7XG4gICAgaW5oZXJpdGVkOiBib29sZWFuO1xuICAgIG51bGxfZnJhYzogbnVtYmVyO1xuICAgIGF2Z193aWR0aDogbnVtYmVyO1xuICAgIG5fZGlzdGluY3Q6IG51bWJlcjtcbiAgICBtb3N0X2NvbW1vbl92YWxzOiByZWFkb25seSBzdHJpbmdbXSB8IG51bGw7XG4gICAgbW9zdF9jb21tb25fZnJlcXM6IHJlYWRvbmx5IG51bWJlcltdIHwgbnVsbDtcbiAgICBoaXN0b2dyYW1fYm91bmRzOiByZWFkb25seSBzdHJpbmdbXSB8IG51bGw7XG4gICAgY29ycmVsYXRpb246IG51bWJlciB8IG51bGw7XG4gICAgbW9zdF9jb21tb25fZWxlbXM6IHJlYWRvbmx5IHN0cmluZ1tdIHwgbnVsbDtcbiAgICBtb3N0X2NvbW1vbl9lbGVtX2ZyZXFzOiByZWFkb25seSBudW1iZXJbXSB8IG51bGw7XG4gICAgZWxlbV9jb3VudF9oaXN0b2dyYW06IHJlYWRvbmx5IG51bWJlcltdIHwgbnVsbDtcbn07XG5cbnR5cGUgVEV4dGVuZGVkUm93ID0ge1xuICAgIHJlbGF0aW9uX25hbWU6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAga2luZDogcmVhZG9ubHkgc3RyaW5nW107XG4gICAgY29sdW1uczogcmVhZG9ubHkgc3RyaW5nW107XG4gICAgbmRpc3RpbmN0OiBzdHJpbmcgfCBudWxsO1xuICAgIGRlcGVuZGVuY2llczogc3RyaW5nIHwgbnVsbDtcbiAgICBtY3Y6IHN0cmluZyB8IG51bGw7XG59O1xuXG4vLyBwZ19zdGF0cyBleHBvc2VzIG1vc3RfY29tbW9uX3ZhbHMvaGlzdG9ncmFtX2JvdW5kcyBhcyBhbnlhcnJheSB3aGljaCBwZyBjYW5ub3Rcbi8vIHNlcmlhbGl6ZSBvdmVyIHRoZSB3aXJlOyBjYXN0IHRvIHRleHRbXSBzbyB2YWx1ZXMgY29tZSBiYWNrIGFzIHN0cmluZ3MuIE9uIHRoZVxuLy8gcmVwbGF5IHNpZGUgd2UgY2FzdCBiYWNrIHRvIHRoZSB0YXJnZXQgY29sdW1uIHR5cGUgYmVmb3JlIGluamVjdGluZy5cbmV4cG9ydCBjb25zdCBmZXRjaFB1YmxpY1BsYW5uZXJTdGF0aXN0aWNzID0gYXN5bmMgKFxuICAgIHBvb2w6IFBvb2wsXG4pOiBQcm9taXNlPHJlYWRvbmx5IFRSZWxhdGlvblBsYW5uZXJTdGF0c1tdPiA9PiB7XG4gICAgY29uc3QgW3JlbGF0aW9uc1Jlc3VsdCwgYXR0cmlidXRlc1Jlc3VsdCwgZXh0ZW5kZWRSZXN1bHRdID1cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgcG9vbC5xdWVyeTxUUmVsYXRpb25Sb3c+KGBcbiAgICAgICAgICAgICAgICBTRUxFQ1RcbiAgICAgICAgICAgICAgICAgICAgYy5yZWxuYW1lIEFTIHJlbGF0aW9uX25hbWUsXG4gICAgICAgICAgICAgICAgICAgIGMucmVsdHVwbGVzOjpmbG9hdDggQVMgcmVsdHVwbGVzLFxuICAgICAgICAgICAgICAgICAgICBjLnJlbHBhZ2VzOjppbnQgQVMgcmVscGFnZXMsXG4gICAgICAgICAgICAgICAgICAgIGMucmVsYWxsdmlzaWJsZTo6aW50IEFTIHJlbGFsbHZpc2libGVcbiAgICAgICAgICAgICAgICBGUk9NIHBnX2NhdGFsb2cucGdfY2xhc3MgY1xuICAgICAgICAgICAgICAgIEpPSU4gcGdfY2F0YWxvZy5wZ19uYW1lc3BhY2UgbiBPTiBuLm9pZCA9IGMucmVsbmFtZXNwYWNlXG4gICAgICAgICAgICAgICAgV0hFUkUgbi5uc3BuYW1lID0gJ3B1YmxpYydcbiAgICAgICAgICAgICAgICAgICAgQU5EIGMucmVsa2luZCBJTiAoJ3InLCAncCcsICdtJylcbiAgICAgICAgICAgICAgICBPUkRFUiBCWSBjLnJlbG5hbWVcbiAgICAgICAgICAgIGApLFxuICAgICAgICAgICAgcG9vbC5xdWVyeTxUQXR0cmlidXRlUm93PihgXG4gICAgICAgICAgICAgICAgU0VMRUNUXG4gICAgICAgICAgICAgICAgICAgIHMudGFibGVuYW1lIEFTIHJlbGF0aW9uX25hbWUsXG4gICAgICAgICAgICAgICAgICAgIHMuYXR0bmFtZSBBUyBhdHRyaWJ1dGVfbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgcy5pbmhlcml0ZWQgQVMgaW5oZXJpdGVkLFxuICAgICAgICAgICAgICAgICAgICBzLm51bGxfZnJhYzo6ZmxvYXQ4IEFTIG51bGxfZnJhYyxcbiAgICAgICAgICAgICAgICAgICAgcy5hdmdfd2lkdGg6OmludCBBUyBhdmdfd2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIHMubl9kaXN0aW5jdDo6ZmxvYXQ4IEFTIG5fZGlzdGluY3QsXG4gICAgICAgICAgICAgICAgICAgIHMubW9zdF9jb21tb25fdmFsczo6dGV4dDo6dGV4dFtdIEFTIG1vc3RfY29tbW9uX3ZhbHMsXG4gICAgICAgICAgICAgICAgICAgIHMubW9zdF9jb21tb25fZnJlcXMgQVMgbW9zdF9jb21tb25fZnJlcXMsXG4gICAgICAgICAgICAgICAgICAgIHMuaGlzdG9ncmFtX2JvdW5kczo6dGV4dDo6dGV4dFtdIEFTIGhpc3RvZ3JhbV9ib3VuZHMsXG4gICAgICAgICAgICAgICAgICAgIHMuY29ycmVsYXRpb246OmZsb2F0OCBBUyBjb3JyZWxhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgcy5tb3N0X2NvbW1vbl9lbGVtczo6dGV4dDo6dGV4dFtdIEFTIG1vc3RfY29tbW9uX2VsZW1zLFxuICAgICAgICAgICAgICAgICAgICBzLm1vc3RfY29tbW9uX2VsZW1fZnJlcXMgQVMgbW9zdF9jb21tb25fZWxlbV9mcmVxcyxcbiAgICAgICAgICAgICAgICAgICAgcy5lbGVtX2NvdW50X2hpc3RvZ3JhbSBBUyBlbGVtX2NvdW50X2hpc3RvZ3JhbVxuICAgICAgICAgICAgICAgIEZST00gcGdfY2F0YWxvZy5wZ19zdGF0cyBzXG4gICAgICAgICAgICAgICAgV0hFUkUgcy5zY2hlbWFuYW1lID0gJ3B1YmxpYydcbiAgICAgICAgICAgICAgICBPUkRFUiBCWSBzLnRhYmxlbmFtZSwgcy5hdHRuYW1lLCBzLmluaGVyaXRlZFxuICAgICAgICAgICAgYCksXG4gICAgICAgICAgICAvLyBwZ19zdGF0c19leHQgZXhwb3NlcyB0aGUgY29sdW1uIGxpc3QgdW5kZXIgYGF0dG5hbWVzYCAobmFtZVtdKSxcbiAgICAgICAgICAgIC8vIG5vdCBgY29sdW1uc2AuIEtpbmRzIGNvbWUgYmFjayBhcyBgXCJjaGFyXCJbXWAsIHdoaWNoIHBnIGNhbm5vdFxuICAgICAgICAgICAgLy8gc2VyaWFsaXplIG92ZXIgdGhlIHdpcmUgd2l0aG91dCBhbiBleHBsaWNpdCBjYXN0IHRvIHRleHRbXS5cbiAgICAgICAgICAgIC8vIFRoaXMgcXVlcnkgaXMgbm9uLWZhdGFsOiBhbnkgY2F0YWxvZyBzaGFwZSBtaXNtYXRjaCAoZS5nLiBvbGRlclxuICAgICAgICAgICAgLy8gUG9zdGdyZXMpIGZhbGxzIHRocm91Z2ggdG8gZW1wdHkgZXh0ZW5kZWQgc3RhdHMgcmF0aGVyIHRoYW5cbiAgICAgICAgICAgIC8vIGJsb2NraW5nIHRoZSBpbnRyb3NwZWN0aW9uIHVwbG9hZC5cbiAgICAgICAgICAgIHBvb2xcbiAgICAgICAgICAgICAgICAucXVlcnk8VEV4dGVuZGVkUm93PihcbiAgICAgICAgICAgICAgICAgICAgYFxuICAgICAgICAgICAgICAgIFNFTEVDVFxuICAgICAgICAgICAgICAgICAgICBjLnJlbG5hbWUgQVMgcmVsYXRpb25fbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZS5zdGF0aXN0aWNzX25hbWUgQVMgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZS5raW5kczo6dGV4dDo6dGV4dFtdIEFTIGtpbmQsXG4gICAgICAgICAgICAgICAgICAgIGUuYXR0bmFtZXM6OnRleHQ6OnRleHRbXSBBUyBjb2x1bW5zLFxuICAgICAgICAgICAgICAgICAgICBlLm5fZGlzdGluY3Q6OnRleHQgQVMgbmRpc3RpbmN0LFxuICAgICAgICAgICAgICAgICAgICBlLmRlcGVuZGVuY2llczo6dGV4dCBBUyBkZXBlbmRlbmNpZXMsXG4gICAgICAgICAgICAgICAgICAgIGUubW9zdF9jb21tb25fdmFsczo6dGV4dCBBUyBtY3ZcbiAgICAgICAgICAgICAgICBGUk9NIHBnX2NhdGFsb2cucGdfc3RhdHNfZXh0IGVcbiAgICAgICAgICAgICAgICBKT0lOIHBnX2NhdGFsb2cucGdfY2xhc3MgYyBPTiBjLnJlbG5hbWUgPSBlLnRhYmxlbmFtZVxuICAgICAgICAgICAgICAgIEpPSU4gcGdfY2F0YWxvZy5wZ19uYW1lc3BhY2UgblxuICAgICAgICAgICAgICAgICAgICBPTiBuLm9pZCA9IGMucmVsbmFtZXNwYWNlIEFORCBuLm5zcG5hbWUgPSBlLnNjaGVtYW5hbWVcbiAgICAgICAgICAgICAgICBXSEVSRSBlLnNjaGVtYW5hbWUgPSAncHVibGljJ1xuICAgICAgICAgICAgICAgIE9SREVSIEJZIGMucmVsbmFtZSwgZS5zdGF0aXN0aWNzX25hbWVcbiAgICAgICAgICAgIGAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiAoe3Jvd3M6IFtdIGFzIFRFeHRlbmRlZFJvd1tdfSkpLFxuICAgICAgICBdKTtcblxuICAgIGNvbnN0IGF0dHJzQnlSZWxhdGlvbiA9IG5ldyBNYXA8c3RyaW5nLCBUQXR0cmlidXRlUGxhbm5lclN0YXRzW10+KCk7XG4gICAgYXR0cmlidXRlc1Jlc3VsdC5yb3dzLmZvckVhY2goKHIpID0+IHtcbiAgICAgICAgY29uc3QgYnVja2V0ID0gYXR0cnNCeVJlbGF0aW9uLmdldChyLnJlbGF0aW9uX25hbWUpID8/IFtdO1xuICAgICAgICBidWNrZXQucHVzaCh7XG4gICAgICAgICAgICBhdHRyaWJ1dGVfbmFtZTogci5hdHRyaWJ1dGVfbmFtZSxcbiAgICAgICAgICAgIGluaGVyaXRlZDogci5pbmhlcml0ZWQsXG4gICAgICAgICAgICBudWxsX2ZyYWM6IE51bWJlcihyLm51bGxfZnJhYyksXG4gICAgICAgICAgICBhdmdfd2lkdGg6IE51bWJlcihyLmF2Z193aWR0aCksXG4gICAgICAgICAgICBuX2Rpc3RpbmN0OiBOdW1iZXIoci5uX2Rpc3RpbmN0KSxcbiAgICAgICAgICAgIG1vc3RfY29tbW9uX3ZhbHM6IHIubW9zdF9jb21tb25fdmFscyxcbiAgICAgICAgICAgIG1vc3RfY29tbW9uX2ZyZXFzOiByLm1vc3RfY29tbW9uX2ZyZXFzLFxuICAgICAgICAgICAgaGlzdG9ncmFtX2JvdW5kczogci5oaXN0b2dyYW1fYm91bmRzLFxuICAgICAgICAgICAgY29ycmVsYXRpb246IHIuY29ycmVsYXRpb24gPT09IG51bGwgPyBudWxsIDogTnVtYmVyKHIuY29ycmVsYXRpb24pLFxuICAgICAgICAgICAgbW9zdF9jb21tb25fZWxlbXM6IHIubW9zdF9jb21tb25fZWxlbXMsXG4gICAgICAgICAgICBtb3N0X2NvbW1vbl9lbGVtX2ZyZXFzOiByLm1vc3RfY29tbW9uX2VsZW1fZnJlcXMsXG4gICAgICAgICAgICBlbGVtX2NvdW50X2hpc3RvZ3JhbTogci5lbGVtX2NvdW50X2hpc3RvZ3JhbSxcbiAgICAgICAgfSk7XG4gICAgICAgIGF0dHJzQnlSZWxhdGlvbi5zZXQoci5yZWxhdGlvbl9uYW1lLCBidWNrZXQpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZXh0ZW5kZWRCeVJlbGF0aW9uID0gbmV3IE1hcDxzdHJpbmcsIFRFeHRlbmRlZFN0YXRpc3RpY1tdPigpO1xuICAgIGV4dGVuZGVkUmVzdWx0LnJvd3MuZm9yRWFjaCgocikgPT4ge1xuICAgICAgICBjb25zdCBidWNrZXQgPSBleHRlbmRlZEJ5UmVsYXRpb24uZ2V0KHIucmVsYXRpb25fbmFtZSkgPz8gW107XG4gICAgICAgIGJ1Y2tldC5wdXNoKHtcbiAgICAgICAgICAgIG5hbWU6IHIubmFtZSxcbiAgICAgICAgICAgIGtpbmQ6IHIua2luZCxcbiAgICAgICAgICAgIGNvbHVtbnM6IHIuY29sdW1ucyxcbiAgICAgICAgICAgIG5kaXN0aW5jdDogci5uZGlzdGluY3QsXG4gICAgICAgICAgICBkZXBlbmRlbmNpZXM6IHIuZGVwZW5kZW5jaWVzLFxuICAgICAgICAgICAgbWN2OiByLm1jdixcbiAgICAgICAgfSk7XG4gICAgICAgIGV4dGVuZGVkQnlSZWxhdGlvbi5zZXQoci5yZWxhdGlvbl9uYW1lLCBidWNrZXQpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlbGF0aW9uc1Jlc3VsdC5yb3dzLm1hcCgocikgPT4gKHtcbiAgICAgICAgcmVsYXRpb25fbmFtZTogci5yZWxhdGlvbl9uYW1lLFxuICAgICAgICByZWx0dXBsZXM6IE51bWJlcihyLnJlbHR1cGxlcyksXG4gICAgICAgIHJlbHBhZ2VzOiBOdW1iZXIoci5yZWxwYWdlcyksXG4gICAgICAgIHJlbGFsbHZpc2libGU6IE51bWJlcihyLnJlbGFsbHZpc2libGUpLFxuICAgICAgICBhdHRyaWJ1dGVzOiBhdHRyc0J5UmVsYXRpb24uZ2V0KHIucmVsYXRpb25fbmFtZSkgPz8gW10sXG4gICAgICAgIGV4dGVuZGVkOiBleHRlbmRlZEJ5UmVsYXRpb24uZ2V0KHIucmVsYXRpb25fbmFtZSkgPz8gW10sXG4gICAgfSkpO1xufTtcbiJdfQ==
@@ -0,0 +1,21 @@
1
+ import type { Pool } from 'pg';
2
+ export type TPolicyCommand = 'ALL' | 'SELECT' | 'INSERT' | 'UPDATE' | 'DELETE';
3
+ export type TRelationRLS = {
4
+ relation_name: string;
5
+ rls_enabled: boolean;
6
+ rls_forced: boolean;
7
+ };
8
+ export type TPolicyInfo = {
9
+ relation_name: string;
10
+ name: string;
11
+ permissive: boolean;
12
+ roles: readonly string[];
13
+ command: TPolicyCommand;
14
+ using_expression: string | null;
15
+ with_check_expression: string | null;
16
+ };
17
+ export declare const fetchPublicRLS: (pool: Pool) => Promise<{
18
+ readonly relations: readonly TRelationRLS[];
19
+ readonly policies: readonly TPolicyInfo[];
20
+ }>;
21
+ //# sourceMappingURL=rls.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rls.d.mts","sourceRoot":"./src/","sources":["db/rls.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,IAAI,CAAC;AAE7B,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE/E,MAAM,MAAM,YAAY,GAAG;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,OAAO,EAAE,cAAc,CAAC;IACxB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;CACxC,CAAC;AAEF,eAAO,MAAM,cAAc,GACvB,MAAM,IAAI,KACX,OAAO,CAAC;IACP,QAAQ,CAAC,SAAS,EAAE,SAAS,YAAY,EAAE,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;CAC7C,CA+CA,CAAC"}
@@ -0,0 +1,48 @@
1
+ export const fetchPublicRLS = async (pool) => {
2
+ const [relations, policies] = await Promise.all([
3
+ pool.query(`
4
+ SELECT
5
+ c.relname AS relation_name,
6
+ c.relrowsecurity AS rls_enabled,
7
+ c.relforcerowsecurity AS rls_forced
8
+ FROM pg_catalog.pg_class c
9
+ JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
10
+ WHERE n.nspname = 'public'
11
+ AND c.relkind IN ('r', 'p')
12
+ AND (c.relrowsecurity OR c.relforcerowsecurity)
13
+ ORDER BY c.relname
14
+ `),
15
+ pool.query(`
16
+ SELECT
17
+ t.relname AS relation_name,
18
+ pol.polname AS name,
19
+ pol.polpermissive AS permissive,
20
+ COALESCE(
21
+ (
22
+ SELECT array_agg(
23
+ CASE WHEN r = 0 THEN 'public' ELSE pg_get_userbyid(r) END
24
+ ORDER BY r
25
+ )
26
+ FROM unnest(pol.polroles) AS r
27
+ ),
28
+ ARRAY[]::text[]
29
+ ) AS roles,
30
+ CASE pol.polcmd
31
+ WHEN '*' THEN 'ALL'
32
+ WHEN 'r' THEN 'SELECT'
33
+ WHEN 'a' THEN 'INSERT'
34
+ WHEN 'w' THEN 'UPDATE'
35
+ WHEN 'd' THEN 'DELETE'
36
+ END AS command,
37
+ pg_get_expr(pol.polqual, pol.polrelid) AS using_expression,
38
+ pg_get_expr(pol.polwithcheck, pol.polrelid) AS with_check_expression
39
+ FROM pg_catalog.pg_policy pol
40
+ JOIN pg_catalog.pg_class t ON t.oid = pol.polrelid
41
+ JOIN pg_catalog.pg_namespace n ON n.oid = t.relnamespace
42
+ WHERE n.nspname = 'public'
43
+ ORDER BY t.relname, pol.polname
44
+ `),
45
+ ]);
46
+ return { relations: relations.rows, policies: policies.rows };
47
+ };
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmxzLm1qcyIsInNvdXJjZVJvb3QiOiIuL3NyYy8iLCJzb3VyY2VzIjpbImRiL3Jscy5tdHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBb0JBLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxLQUFLLEVBQy9CLElBQVUsRUFJWCxFQUFFO0lBQ0QsTUFBTSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFDNUMsSUFBSSxDQUFDLEtBQUssQ0FBZTs7Ozs7Ozs7Ozs7U0FXeEIsQ0FBQztRQUNGLElBQUksQ0FBQyxLQUFLLENBQWM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1NBNkJ2QixDQUFDO0tBQ0wsQ0FBQyxDQUFDO0lBRUgsT0FBTyxFQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFDLENBQUM7QUFDaEUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1Bvb2x9IGZyb20gJ3BnJztcblxuZXhwb3J0IHR5cGUgVFBvbGljeUNvbW1hbmQgPSAnQUxMJyB8ICdTRUxFQ1QnIHwgJ0lOU0VSVCcgfCAnVVBEQVRFJyB8ICdERUxFVEUnO1xuXG5leHBvcnQgdHlwZSBUUmVsYXRpb25STFMgPSB7XG4gICAgcmVsYXRpb25fbmFtZTogc3RyaW5nO1xuICAgIHJsc19lbmFibGVkOiBib29sZWFuO1xuICAgIHJsc19mb3JjZWQ6IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBUUG9saWN5SW5mbyA9IHtcbiAgICByZWxhdGlvbl9uYW1lOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHBlcm1pc3NpdmU6IGJvb2xlYW47XG4gICAgcm9sZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAgIGNvbW1hbmQ6IFRQb2xpY3lDb21tYW5kO1xuICAgIHVzaW5nX2V4cHJlc3Npb246IHN0cmluZyB8IG51bGw7XG4gICAgd2l0aF9jaGVja19leHByZXNzaW9uOiBzdHJpbmcgfCBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGZldGNoUHVibGljUkxTID0gYXN5bmMgKFxuICAgIHBvb2w6IFBvb2wsXG4pOiBQcm9taXNlPHtcbiAgICByZWFkb25seSByZWxhdGlvbnM6IHJlYWRvbmx5IFRSZWxhdGlvblJMU1tdO1xuICAgIHJlYWRvbmx5IHBvbGljaWVzOiByZWFkb25seSBUUG9saWN5SW5mb1tdO1xufT4gPT4ge1xuICAgIGNvbnN0IFtyZWxhdGlvbnMsIHBvbGljaWVzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgcG9vbC5xdWVyeTxUUmVsYXRpb25STFM+KGBcbiAgICAgICAgICAgIFNFTEVDVFxuICAgICAgICAgICAgICAgIGMucmVsbmFtZSBBUyByZWxhdGlvbl9uYW1lLFxuICAgICAgICAgICAgICAgIGMucmVscm93c2VjdXJpdHkgQVMgcmxzX2VuYWJsZWQsXG4gICAgICAgICAgICAgICAgYy5yZWxmb3JjZXJvd3NlY3VyaXR5IEFTIHJsc19mb3JjZWRcbiAgICAgICAgICAgIEZST00gcGdfY2F0YWxvZy5wZ19jbGFzcyBjXG4gICAgICAgICAgICBKT0lOIHBnX2NhdGFsb2cucGdfbmFtZXNwYWNlIG4gT04gbi5vaWQgPSBjLnJlbG5hbWVzcGFjZVxuICAgICAgICAgICAgV0hFUkUgbi5uc3BuYW1lID0gJ3B1YmxpYydcbiAgICAgICAgICAgICAgICBBTkQgYy5yZWxraW5kIElOICgncicsICdwJylcbiAgICAgICAgICAgICAgICBBTkQgKGMucmVscm93c2VjdXJpdHkgT1IgYy5yZWxmb3JjZXJvd3NlY3VyaXR5KVxuICAgICAgICAgICAgT1JERVIgQlkgYy5yZWxuYW1lXG4gICAgICAgIGApLFxuICAgICAgICBwb29sLnF1ZXJ5PFRQb2xpY3lJbmZvPihgXG4gICAgICAgICAgICBTRUxFQ1RcbiAgICAgICAgICAgICAgICB0LnJlbG5hbWUgQVMgcmVsYXRpb25fbmFtZSxcbiAgICAgICAgICAgICAgICBwb2wucG9sbmFtZSBBUyBuYW1lLFxuICAgICAgICAgICAgICAgIHBvbC5wb2xwZXJtaXNzaXZlIEFTIHBlcm1pc3NpdmUsXG4gICAgICAgICAgICAgICAgQ09BTEVTQ0UoXG4gICAgICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBhcnJheV9hZ2coXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FTRSBXSEVOIHIgPSAwIFRIRU4gJ3B1YmxpYycgRUxTRSBwZ19nZXRfdXNlcmJ5aWQocikgRU5EXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgT1JERVIgQlkgclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSB1bm5lc3QocG9sLnBvbHJvbGVzKSBBUyByXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIEFSUkFZW106OnRleHRbXVxuICAgICAgICAgICAgICAgICkgQVMgcm9sZXMsXG4gICAgICAgICAgICAgICAgQ0FTRSBwb2wucG9sY21kXG4gICAgICAgICAgICAgICAgICAgIFdIRU4gJyonIFRIRU4gJ0FMTCdcbiAgICAgICAgICAgICAgICAgICAgV0hFTiAncicgVEhFTiAnU0VMRUNUJ1xuICAgICAgICAgICAgICAgICAgICBXSEVOICdhJyBUSEVOICdJTlNFUlQnXG4gICAgICAgICAgICAgICAgICAgIFdIRU4gJ3cnIFRIRU4gJ1VQREFURSdcbiAgICAgICAgICAgICAgICAgICAgV0hFTiAnZCcgVEhFTiAnREVMRVRFJ1xuICAgICAgICAgICAgICAgIEVORCBBUyBjb21tYW5kLFxuICAgICAgICAgICAgICAgIHBnX2dldF9leHByKHBvbC5wb2xxdWFsLCBwb2wucG9scmVsaWQpIEFTIHVzaW5nX2V4cHJlc3Npb24sXG4gICAgICAgICAgICAgICAgcGdfZ2V0X2V4cHIocG9sLnBvbHdpdGhjaGVjaywgcG9sLnBvbHJlbGlkKSBBUyB3aXRoX2NoZWNrX2V4cHJlc3Npb25cbiAgICAgICAgICAgIEZST00gcGdfY2F0YWxvZy5wZ19wb2xpY3kgcG9sXG4gICAgICAgICAgICBKT0lOIHBnX2NhdGFsb2cucGdfY2xhc3MgdCBPTiB0Lm9pZCA9IHBvbC5wb2xyZWxpZFxuICAgICAgICAgICAgSk9JTiBwZ19jYXRhbG9nLnBnX25hbWVzcGFjZSBuIE9OIG4ub2lkID0gdC5yZWxuYW1lc3BhY2VcbiAgICAgICAgICAgIFdIRVJFIG4ubnNwbmFtZSA9ICdwdWJsaWMnXG4gICAgICAgICAgICBPUkRFUiBCWSB0LnJlbG5hbWUsIHBvbC5wb2xuYW1lXG4gICAgICAgIGApLFxuICAgIF0pO1xuXG4gICAgcmV0dXJuIHtyZWxhdGlvbnM6IHJlbGF0aW9ucy5yb3dzLCBwb2xpY2llczogcG9saWNpZXMucm93c307XG59O1xuIl19
@@ -0,0 +1,16 @@
1
+ import type { Pool } from 'pg';
2
+ export type TSampleStrategy = 'distinct' | 'random';
3
+ export type TColumnSample = {
4
+ readonly column_name: string;
5
+ readonly strategy: TSampleStrategy;
6
+ readonly values: readonly string[];
7
+ };
8
+ export type TCompositeSubField = {
9
+ readonly name: string;
10
+ readonly data_type: string;
11
+ };
12
+ export type TRelationKind = 'table' | 'partitioned_table' | 'view' | 'materialized_view';
13
+ export declare const sampleColumn: (pool: Pool, tableName: string, columnName: string, estimatedDistinct: number, estimatedRowCount: number, relationKind: TRelationKind) => Promise<TColumnSample>;
14
+ export declare const sampleCompositeSubField: (pool: Pool, tableName: string, columnName: string, subFieldName: string, estimatedDistinct: number, estimatedRowCount: number, relationKind: TRelationKind) => Promise<TColumnSample>;
15
+ export declare const fetchCompositeSubFields: (pool: Pool, typeName: string) => Promise<readonly TCompositeSubField[]>;
16
+ //# sourceMappingURL=sample.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sample.d.mts","sourceRoot":"./src/","sources":["db/sample.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,IAAI,CAAC;AAE7B,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,QAAQ,CAAC;AAEpD,MAAM,MAAM,aAAa,GAAG;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC9B,CAAC;AAiDF,MAAM,MAAM,aAAa,GACnB,OAAO,GACP,mBAAmB,GACnB,MAAM,GACN,mBAAmB,CAAC;AAO1B,eAAO,MAAM,YAAY,GACrB,MAAM,IAAI,EACV,WAAW,MAAM,EACjB,YAAY,MAAM,EAClB,mBAAmB,MAAM,EACzB,mBAAmB,MAAM,EACzB,cAAc,aAAa,KAC5B,OAAO,CAAC,aAAa,CA6BvB,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAChC,MAAM,IAAI,EACV,WAAW,MAAM,EACjB,YAAY,MAAM,EAClB,cAAc,MAAM,EACpB,mBAAmB,MAAM,EACzB,mBAAmB,MAAM,EACzB,cAAc,aAAa,KAC5B,OAAO,CAAC,aAAa,CAqCvB,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAChC,MAAM,IAAI,EACV,UAAU,MAAM,KACjB,OAAO,CAAC,SAAS,kBAAkB,EAAE,CAcvC,CAAC"}
@@ -0,0 +1,73 @@
1
+ const quoteIdent = (name) => `"${name.replace(/"/g, '""')}"`;
2
+ const LOW_CARDINALITY_THRESHOLD = 256;
3
+ const LOW_CARDINALITY_LIMIT = 256;
4
+ const HIGH_CARDINALITY_LIMIT = 64;
5
+ const BERNOULLI_OVERSAMPLE_FACTOR = 10;
6
+ const sampleDistinct = async (pool, tableName, columnExpr, limit) => {
7
+ const sql = `SELECT DISTINCT ${columnExpr}::text AS val FROM ${quoteIdent(tableName)} WHERE ${columnExpr} IS NOT NULL LIMIT $1`;
8
+ const result = await pool.query(sql, [limit]);
9
+ return result.rows.map((r) => r.val);
10
+ };
11
+ const sampleBernoulli = async (pool, tableName, columnExpr, estimatedRowCount, limit) => {
12
+ const percentage = Math.min(100, (limit / Math.max(estimatedRowCount, 1)) *
13
+ 100 *
14
+ BERNOULLI_OVERSAMPLE_FACTOR);
15
+ const sql = `SELECT DISTINCT ${columnExpr}::text AS val FROM ${quoteIdent(tableName)} TABLESAMPLE BERNOULLI($1) WHERE ${columnExpr} IS NOT NULL LIMIT $2`;
16
+ const result = await pool.query(sql, [percentage, limit]);
17
+ return result.rows.map((r) => r.val);
18
+ };
19
+ const samplePlainLimit = async (pool, tableName, columnExpr, limit) => {
20
+ const sql = `SELECT ${columnExpr}::text AS val FROM ${quoteIdent(tableName)} WHERE ${columnExpr} IS NOT NULL LIMIT $1`;
21
+ const result = await pool.query(sql, [limit]);
22
+ return result.rows.map((r) => r.val);
23
+ };
24
+ const supportsTableSample = (kind) => kind === 'table' ||
25
+ kind === 'partitioned_table' ||
26
+ kind === 'materialized_view';
27
+ export const sampleColumn = async (pool, tableName, columnName, estimatedDistinct, estimatedRowCount, relationKind) => {
28
+ const columnExpr = quoteIdent(columnName);
29
+ const isLowCardinality = estimatedDistinct > 0 && estimatedDistinct < LOW_CARDINALITY_THRESHOLD;
30
+ if (isLowCardinality) {
31
+ const values = await sampleDistinct(pool, tableName, columnExpr, LOW_CARDINALITY_LIMIT);
32
+ return { column_name: columnName, strategy: 'distinct', values };
33
+ }
34
+ const limit = HIGH_CARDINALITY_LIMIT;
35
+ const values = supportsTableSample(relationKind) && estimatedRowCount > 0
36
+ ? await sampleBernoulli(pool, tableName, columnExpr, estimatedRowCount, limit)
37
+ : await samplePlainLimit(pool, tableName, columnExpr, limit);
38
+ return { column_name: columnName, strategy: 'random', values };
39
+ };
40
+ export const sampleCompositeSubField = async (pool, tableName, columnName, subFieldName, estimatedDistinct, estimatedRowCount, relationKind) => {
41
+ const columnExpr = `(${quoteIdent(columnName)}).${quoteIdent(subFieldName)}`;
42
+ const isLowCardinality = estimatedDistinct > 0 && estimatedDistinct < LOW_CARDINALITY_THRESHOLD;
43
+ if (isLowCardinality) {
44
+ const values = await sampleDistinct(pool, tableName, columnExpr, LOW_CARDINALITY_LIMIT);
45
+ return {
46
+ column_name: `${columnName}.${subFieldName}`,
47
+ strategy: 'distinct',
48
+ values,
49
+ };
50
+ }
51
+ const limit = HIGH_CARDINALITY_LIMIT;
52
+ const values = supportsTableSample(relationKind) && estimatedRowCount > 0
53
+ ? await sampleBernoulli(pool, tableName, columnExpr, estimatedRowCount, limit)
54
+ : await samplePlainLimit(pool, tableName, columnExpr, limit);
55
+ return {
56
+ column_name: `${columnName}.${subFieldName}`,
57
+ strategy: 'random',
58
+ values,
59
+ };
60
+ };
61
+ export const fetchCompositeSubFields = async (pool, typeName) => {
62
+ const result = await pool.query(`
63
+ SELECT a.attname AS name, format_type(a.atttypid, a.atttypmod) AS data_type
64
+ FROM pg_type t
65
+ JOIN pg_attribute a ON a.attrelid = t.typrelid
66
+ WHERE t.typname = $1
67
+ AND a.attnum > 0
68
+ AND NOT a.attisdropped
69
+ ORDER BY a.attnum
70
+ `, [typeName]);
71
+ return result.rows;
72
+ };
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FtcGxlLm1qcyIsInNvdXJjZVJvb3QiOiIuL3NyYy8iLCJzb3VyY2VzIjpbImRiL3NhbXBsZS5tdHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBZUEsTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFZLEVBQVUsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQztBQUU3RSxNQUFNLHlCQUF5QixHQUFHLEdBQUcsQ0FBQztBQUN0QyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQztBQUNsQyxNQUFNLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztBQUNsQyxNQUFNLDJCQUEyQixHQUFHLEVBQUUsQ0FBQztBQUV2QyxNQUFNLGNBQWMsR0FBRyxLQUFLLEVBQ3hCLElBQVUsRUFDVixTQUFpQixFQUNqQixVQUFrQixFQUNsQixLQUFhLEVBQ2EsRUFBRTtJQUM1QixNQUFNLEdBQUcsR0FBRyxtQkFBbUIsVUFBVSxzQkFBc0IsVUFBVSxDQUFDLFNBQVMsQ0FBQyxVQUFVLFVBQVUsdUJBQXVCLENBQUM7SUFDaEksTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFnQixHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzdELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN6QyxDQUFDLENBQUM7QUFFRixNQUFNLGVBQWUsR0FBRyxLQUFLLEVBQ3pCLElBQVUsRUFDVixTQUFpQixFQUNqQixVQUFrQixFQUNsQixpQkFBeUIsRUFDekIsS0FBYSxFQUNhLEVBQUU7SUFDNUIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDdkIsR0FBRyxFQUNILENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFD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LENBQUMsSUFBSSxpQkFBaUIsR0FBRyx5QkFBeUIsQ0FBQztJQUUzRSxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDbkIsTUFBTSxNQUFNLEdBQUcsTUFBTSxjQUFjLENBQy9CLElBQUksRUFDSixTQUFTLEVBQ1QsVUFBVSxFQUNWLHFCQUFxQixDQUN4QixDQUFDO1FBQ0YsT0FBTztZQUNILFdBQVcsRUFBRSxHQUFHLFVBQVUsSUFBSSxZQUFZLEVBQUU7WUFDNUMsUUFBUSxFQUFFLFVBQVU7WUFDcEIsTUFBTTtTQUNULENBQUM7SUFDTixDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQUcsc0JBQXNCLENBQUM7SUFFckMsTUFBTSxNQUFNLEdBQ1IsbUJBQW1CLENBQUMsWUFBWSxDQUFDLElBQUksaUJBQWlCLEdBQUcsQ0FBQztRQUN0RCxDQUFDLENBQUMsTUFBTSxlQUFlLENBQ2pCLElBQUksRUFDSixTQUFTLEVBQ1QsVUFBVSxFQUNWLGlCQUFpQixFQUNqQixLQUFLLENBQ1I7UUFDSCxDQUFDLENBQUMsTUFBTSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUVyRSxPQUFPO1FBQ0gsV0FBVyxFQUFFLEdBQUcsVUFBVSxJQUFJLFlBQVksRUFBRTtRQUM1QyxRQUFRLEVBQUUsUUFBUTtRQUNsQixNQUFNO0tBQ1QsQ0FBQztBQUNOLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLEtBQUssRUFDeEMsSUFBVSxFQUNWLFFBQWdCLEVBQ3NCLEVBQUU7SUFDeEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUMzQjs7Ozs7Ozs7U0FRQyxFQUNELENBQUMsUUFBUSxDQUFDLENBQ2IsQ0FBQztJQUNGLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQztBQUN2QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7UG9vbH0gZnJvbSAncGcnO1xuXG5leHBvcnQgdHlwZSBUU2FtcGxlU3RyYXRlZ3kgPSAnZGlzdGluY3QnIHwgJ3JhbmRvbSc7XG5cbmV4cG9ydCB0eXBlIFRDb2x1bW5TYW1wbGUgPSB7XG4gICAgcmVhZG9ubHkgY29sdW1uX25hbWU6IHN0cmluZztcbiAgICByZWFkb25seSBzdHJhdGVneTogVFNhbXBsZVN0cmF0ZWd5O1xuICAgIHJlYWRvbmx5IHZhbHVlczogcmVhZG9ubHkgc3RyaW5nW107XG59O1xuXG5leHBvcnQgdHlwZSBUQ29tcG9zaXRlU3ViRmllbGQgPSB7XG4gICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGRhdGFfdHlwZTogc3RyaW5nO1xufTtcblxuY29uc3QgcXVvdGVJZGVudCA9IChuYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4gYFwiJHtuYW1lLnJlcGxhY2UoL1wiL2csICdcIlwiJyl9XCJgO1xuXG5jb25zdCBMT1dfQ0FSRElOQUxJVFlfVEhSRVNIT0xEID0gMjU2O1xuY29uc3QgTE9XX0NBUkRJTkFMSVRZX0xJTUlUID0gMjU2O1xuY29uc3QgSElHSF9DQVJESU5BTElUWV9MSU1JVCA9IDY0O1xuY29uc3QgQkVSTk9VTExJX09WRVJTQU1QTEVfRkFDVE9SID0gMTA7XG5cbmNvbnN0IHNhbXBsZURpc3RpbmN0ID0gYXN5bmMgKFxuICAgIHBvb2w6IFBvb2wsXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgY29sdW1uRXhwcjogc3RyaW5nLFxuICAgIGxpbWl0OiBudW1iZXIsXG4pOiBQcm9taXNlPHJlYWRvbmx5IHN0cmluZ1tdPiA9PiB7XG4gICAgY29uc3Qgc3FsID0gYFNFTEVDVCBESVNUSU5DVCAke2NvbHVtbkV4cHJ9Ojp0ZXh0IEFTIHZhbCBGUk9NICR7cXVvdGVJZGVudCh0YWJsZU5hbWUpfSBXSEVSRSAke2NvbHVtbkV4cHJ9IElTIE5PVCBOVUxMIExJTUlUICQxYDtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwb29sLnF1ZXJ5PHt2YWw6IHN0cmluZ30+KHNxbCwgW2xpbWl0XSk7XG4gICAgcmV0dXJuIHJlc3VsdC5yb3dzLm1hcCgocikgPT4gci52YWwpO1xufTtcblxuY29uc3Qgc2FtcGxlQmVybm91bGxpID0gYXN5bmMgKFxuICAgIHBvb2w6IFBvb2wsXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgY29sdW1uRXhwcjogc3RyaW5nLFxuICAgIGVzdGltYXRlZFJvd0NvdW50OiBudW1iZXIsXG4gICAgbGltaXQ6IG51bWJlcixcbik6IFByb21pc2U8cmVhZG9ubHkgc3RyaW5nW10+ID0+IHtcbiAgICBjb25zdCBwZXJjZW50YWdlID0gTWF0aC5taW4oXG4gICAgICAgIDEwMCxcbiAgICAgICAgKGxpbWl0IC8gTWF0aC5tYXgoZXN0aW1hdGVkUm93Q291bnQsIDEpKSAqXG4gICAgICAgICAgICAxMDAgKlxuICAgICAgICAgICAgQkVSTk9VTExJX09WRVJTQU1QTEVfRkFDVE9SLFxuICAgICk7XG4gICAgY29uc3Qgc3FsID0gYFNFTEVDVCBESVNUSU5DVCAke2NvbHVtbkV4cHJ9Ojp0ZXh0IEFTIHZhbCBGUk9NICR7cXVvdGVJZGVudCh0YWJsZU5hbWUpfSBUQUJMRVNBTVBMRSBCRVJOT1VMTEkoJDEpIFdIRVJFICR7Y29sdW1uRXhwcn0gSVMgTk9UIE5VTEwgTElNSVQgJDJgO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBvb2wucXVlcnk8e3ZhbDogc3RyaW5nfT4oc3FsLCBbcGVyY2VudGFnZSwgbGltaXRdKTtcbiAgICByZXR1cm4gcmVzdWx0LnJvd3MubWFwKChyKSA9PiByLnZhbCk7XG59O1xuXG5jb25zdCBzYW1wbGVQbGFpbkxpbWl0ID0gYXN5bmMgKFxuICAgIHBvb2w6IFBvb2wsXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgY29sdW1uRXhwcjogc3RyaW5nLFxuICAgIGxpbWl0OiBudW1iZXIsXG4pOiBQcm9taXNlPHJlYWRvbmx5IHN0cmluZ1tdPiA9PiB7XG4gICAgY29uc3Qgc3FsID0gYFNFTEVDVCAke2NvbHVtbkV4cHJ9Ojp0ZXh0IEFTIHZhbCBGUk9NICR7cXVvdGVJZGVudCh0YWJsZU5hbWUpfSBXSEVSRSAke2NvbHVtbkV4cHJ9IElTIE5PVCBOVUxMIExJTUlUICQxYDtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwb29sLnF1ZXJ5PHt2YWw6IHN0cmluZ30+KHNxbCwgW2xpbWl0XSk7XG4gICAgcmV0dXJuIHJlc3VsdC5yb3dzLm1hcCgocikgPT4gci52YWwpO1xufTtcblxuZXhwb3J0IHR5cGUgVFJlbGF0aW9uS2luZCA9XG4gICAgfCAndGFibGUnXG4gICAgfCAncGFydGl0aW9uZWRfdGFibGUnXG4gICAgfCAndmlldydcbiAgICB8ICdtYXRlcmlhbGl6ZWRfdmlldyc7XG5cbmNvbnN0IHN1cHBvcnRzVGFibGVTYW1wbGUgPSAoa2luZDogVFJlbGF0aW9uS2luZCk6IGJvb2xlYW4gPT5cbiAgICBraW5kID09PSAndGFibGUnIHx8XG4gICAga2luZCA9PT0gJ3BhcnRpdGlvbmVkX3RhYmxlJyB8fFxuICAgIGtpbmQgPT09ICdtYXRlcmlhbGl6ZWRfdmlldyc7XG5cbmV4cG9ydCBjb25zdCBzYW1wbGVDb2x1bW4gPSBhc3luYyAoXG4gICAgcG9vbDogUG9vbCxcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBjb2x1bW5OYW1lOiBzdHJpbmcsXG4gICAgZXN0aW1hdGVkRGlzdGluY3Q6IG51bWJlcixcbiAgICBlc3RpbWF0ZWRSb3dDb3VudDogbnVtYmVyLFxuICAgIHJlbGF0aW9uS2luZDogVFJlbGF0aW9uS2luZCxcbik6IFByb21pc2U8VENvbHVtblNhbXBsZT4gPT4ge1xuICAgIGNvbnN0IGNvbHVtbkV4cHIgPSBxdW90ZUlkZW50KGNvbHVtbk5hbWUpO1xuICAgIGNvbnN0IGlzTG93Q2FyZGluYWxpdHkgPVxuICAgICAgICBlc3RpbWF0ZWREaXN0aW5jdCA+IDAgJiYgZXN0aW1hdGVkRGlzdGluY3QgPCBMT1dfQ0FSRElOQUxJVFlfVEhSRVNIT0xEO1xuXG4gICAgaWYgKGlzTG93Q2FyZGluYWxpdHkpIHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gYXdhaXQgc2FtcGxlRGlzdGluY3QoXG4gICAgICAgICAgICBwb29sLFxuICAgICAgICAgICAgdGFibGVOYW1lLFxuICAgICAgICAgICAgY29sdW1uRXhwcixcbiAgICAgICAgICAgIExPV19DQVJESU5BTElUWV9MSU1JVCxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHtjb2x1bW5fbmFtZTogY29sdW1uTmFtZSwgc3RyYXRlZ3k6ICdkaXN0aW5jdCcsIHZhbHVlc307XG4gICAgfVxuXG4gICAgY29uc3QgbGltaXQgPSBISUdIX0NBUkRJTkFMSVRZX0xJTUlUO1xuXG4gICAgY29uc3QgdmFsdWVzID1cbiAgICAgICAgc3VwcG9ydHNUYWJsZVNhbXBsZShyZWxhdGlvbktpbmQpICYmIGVzdGltYXRlZFJvd0NvdW50ID4gMFxuICAgICAgICAgICAgPyBhd2FpdCBzYW1wbGVCZXJub3VsbGkoXG4gICAgICAgICAgICAgICAgICBwb29sLFxuICAgICAgICAgICAgICAgICAgdGFibGVOYW1lLFxuICAgICAgICAgICAgICAgICAgY29sdW1uRXhwcixcbiAgICAgICAgICAgICAgICAgIGVzdGltYXRlZFJvd0NvdW50LFxuICAgICAgICAgICAgICAgICAgbGltaXQsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIDogYXdhaXQgc2FtcGxlUGxhaW5MaW1pdChwb29sLCB0YWJsZU5hbWUsIGNvbHVtbkV4cHIsIGxpbWl0KTtcblxuICAgIHJldHVybiB7Y29sdW1uX25hbWU6IGNvbHVtbk5hbWUsIHN0cmF0ZWd5OiAncmFuZG9tJywgdmFsdWVzfTtcbn07XG5cbmV4cG9ydCBjb25zdCBzYW1wbGVDb21wb3NpdGVTdWJGaWVsZCA9IGFzeW5jIChcbiAgICBwb29sOiBQb29sLFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGNvbHVtbk5hbWU6IHN0cmluZyxcbiAgICBzdWJGaWVsZE5hbWU6IHN0cmluZyxcbiAgICBlc3RpbWF0ZWREaXN0aW5jdDogbnVtYmVyLFxuICAgIGVzdGltYXRlZFJvd0NvdW50OiBudW1iZXIsXG4gICAgcmVsYXRpb25LaW5kOiBUUmVsYXRpb25LaW5kLFxuKTogUHJvbWlzZTxUQ29sdW1uU2FtcGxlPiA9PiB7XG4gICAgY29uc3QgY29sdW1uRXhwciA9IGAoJHtxdW90ZUlkZW50KGNvbHVtbk5hbWUpfSkuJHtxdW90ZUlkZW50KHN1YkZpZWxkTmFtZSl9YDtcbiAgICBjb25zdCBpc0xvd0NhcmRpbmFsaXR5ID1cbiAgICAgICAgZXN0aW1hdGVkRGlzdGluY3QgPiAwICYmIGVzdGltYXRlZERpc3RpbmN0IDwgTE9XX0NBUkRJTkFMSVRZX1RIUkVTSE9MRDtcblxuICAgIGlmIChpc0xvd0NhcmRpbmFsaXR5KSB7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IGF3YWl0IHNhbXBsZURpc3RpbmN0KFxuICAgICAgICAgICAgcG9vbCxcbiAgICAgICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgICAgIGNvbHVtbkV4cHIsXG4gICAgICAgICAgICBMT1dfQ0FSRElOQUxJVFlfTElNSVQsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb2x1bW5fbmFtZTogYCR7Y29sdW1uTmFtZX0uJHtzdWJGaWVsZE5hbWV9YCxcbiAgICAgICAgICAgIHN0cmF0ZWd5OiAnZGlzdGluY3QnLFxuICAgICAgICAgICAgdmFsdWVzLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGxpbWl0ID0gSElHSF9DQVJESU5BTElUWV9MSU1JVDtcblxuICAgIGNvbnN0IHZhbHVlcyA9XG4gICAgICAgIHN1cHBvcnRzVGFibGVTYW1wbGUocmVsYXRpb25LaW5kKSAmJiBlc3RpbWF0ZWRSb3dDb3VudCA+IDBcbiAgICAgICAgICAgID8gYXdhaXQgc2FtcGxlQmVybm91bGxpKFxuICAgICAgICAgICAgICAgICAgcG9vbCxcbiAgICAgICAgICAgICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICAgIGNvbHVtbkV4cHIsXG4gICAgICAgICAgICAgICAgICBlc3RpbWF0ZWRSb3dDb3VudCxcbiAgICAgICAgICAgICAgICAgIGxpbWl0LFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6IGF3YWl0IHNhbXBsZVBsYWluTGltaXQocG9vbCwgdGFibGVOYW1lLCBjb2x1bW5FeHByLCBsaW1pdCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBjb2x1bW5fbmFtZTogYCR7Y29sdW1uTmFtZX0uJHtzdWJGaWVsZE5hbWV9YCxcbiAgICAgICAgc3RyYXRlZ3k6ICdyYW5kb20nLFxuICAgICAgICB2YWx1ZXMsXG4gICAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBmZXRjaENvbXBvc2l0ZVN1YkZpZWxkcyA9IGFzeW5jIChcbiAgICBwb29sOiBQb29sLFxuICAgIHR5cGVOYW1lOiBzdHJpbmcsXG4pOiBQcm9taXNlPHJlYWRvbmx5IFRDb21wb3NpdGVTdWJGaWVsZFtdPiA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcG9vbC5xdWVyeTx7bmFtZTogc3RyaW5nOyBkYXRhX3R5cGU6IHN0cmluZ30+KFxuICAgICAgICBgXG4gICAgICAgIFNFTEVDVCBhLmF0dG5hbWUgQVMgbmFtZSwgZm9ybWF0X3R5cGUoYS5hdHR0eXBpZCwgYS5hdHR0eXBtb2QpIEFTIGRhdGFfdHlwZVxuICAgICAgICBGUk9NIHBnX3R5cGUgdFxuICAgICAgICBKT0lOIHBnX2F0dHJpYnV0ZSBhIE9OIGEuYXR0cmVsaWQgPSB0LnR5cHJlbGlkXG4gICAgICAgIFdIRVJFIHQudHlwbmFtZSA9ICQxXG4gICAgICAgICAgICBBTkQgYS5hdHRudW0gPiAwXG4gICAgICAgICAgICBBTkQgTk9UIGEuYXR0aXNkcm9wcGVkXG4gICAgICAgIE9SREVSIEJZIGEuYXR0bnVtXG4gICAgICAgIGAsXG4gICAgICAgIFt0eXBlTmFtZV0sXG4gICAgKTtcbiAgICByZXR1cm4gcmVzdWx0LnJvd3M7XG59O1xuIl19
@@ -0,0 +1,15 @@
1
+ import type { Pool } from 'pg';
2
+ export type TSequenceInfo = {
3
+ name: string;
4
+ data_type: string;
5
+ start_value: string;
6
+ min_value: string;
7
+ max_value: string;
8
+ increment: string;
9
+ cycle: boolean;
10
+ cache_size: string;
11
+ owned_by_table: string | null;
12
+ owned_by_column: string | null;
13
+ };
14
+ export declare const fetchPublicSequences: (pool: Pool) => Promise<TSequenceInfo[]>;
15
+ //# sourceMappingURL=sequences.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sequences.d.mts","sourceRoot":"./src/","sources":["db/sequences.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,IAAI,CAAC;AAE7B,MAAM,MAAM,aAAa,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC7B,MAAM,IAAI,KACX,OAAO,CAAC,aAAa,EAAE,CA8BzB,CAAC"}
@@ -0,0 +1,31 @@
1
+ export const fetchPublicSequences = async (pool) => {
2
+ const result = await pool.query(`
3
+ SELECT
4
+ s.sequencename AS name,
5
+ s.data_type::text AS data_type,
6
+ s.start_value::text AS start_value,
7
+ s.min_value::text AS min_value,
8
+ s.max_value::text AS max_value,
9
+ s.increment_by::text AS increment,
10
+ s.cycle AS cycle,
11
+ s.cache_size::text AS cache_size,
12
+ t.relname AS owned_by_table,
13
+ a.attname AS owned_by_column
14
+ FROM pg_catalog.pg_sequences s
15
+ JOIN pg_catalog.pg_class c
16
+ ON c.relname = s.sequencename
17
+ AND c.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = s.schemaname)
18
+ LEFT JOIN pg_catalog.pg_depend d
19
+ ON d.objid = c.oid
20
+ AND d.classid = 'pg_class'::regclass
21
+ AND d.refclassid = 'pg_class'::regclass
22
+ AND d.deptype = 'a'
23
+ LEFT JOIN pg_catalog.pg_class t ON t.oid = d.refobjid
24
+ LEFT JOIN pg_catalog.pg_attribute a
25
+ ON a.attrelid = d.refobjid AND a.attnum = d.refobjsubid
26
+ WHERE s.schemaname = 'public'
27
+ ORDER BY s.sequencename
28
+ `);
29
+ return result.rows;
30
+ };
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxdWVuY2VzLm1qcyIsInNvdXJjZVJvb3QiOiIuL3NyYy8iLCJzb3VyY2VzIjpbImRiL3NlcXVlbmNlcy5tdHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBZUEsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsS0FBSyxFQUNyQyxJQUFVLEVBQ2MsRUFBRTtJQUMxQixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQWdCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQTBCOUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDO0FBQ3ZCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtQb29sfSBmcm9tICdwZyc7XG5cbmV4cG9ydCB0eXBlIFRTZXF1ZW5jZUluZm8gPSB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRhdGFfdHlwZTogc3RyaW5nO1xuICAgIHN0YXJ0X3ZhbHVlOiBzdHJpbmc7XG4gICAgbWluX3ZhbHVlOiBzdHJpbmc7XG4gICAgbWF4X3ZhbHVlOiBzdHJpbmc7XG4gICAgaW5jcmVtZW50OiBzdHJpbmc7XG4gICAgY3ljbGU6IGJvb2xlYW47XG4gICAgY2FjaGVfc2l6ZTogc3RyaW5nO1xuICAgIG93bmVkX2J5X3RhYmxlOiBzdHJpbmcgfCBudWxsO1xuICAgIG93bmVkX2J5X2NvbHVtbjogc3RyaW5nIHwgbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBmZXRjaFB1YmxpY1NlcXVlbmNlcyA9IGFzeW5jIChcbiAgICBwb29sOiBQb29sLFxuKTogUHJvbWlzZTxUU2VxdWVuY2VJbmZvW10+ID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwb29sLnF1ZXJ5PFRTZXF1ZW5jZUluZm8+KGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgICBzLnNlcXVlbmNlbmFtZSBBUyBuYW1lLFxuICAgICAgICAgICAgcy5kYXRhX3R5cGU6OnRleHQgQVMgZGF0YV90eXBlLFxuICAgICAgICAgICAgcy5zdGFydF92YWx1ZTo6dGV4dCBBUyBzdGFydF92YWx1ZSxcbiAgICAgICAgICAgIHMubWluX3ZhbHVlOjp0ZXh0IEFTIG1pbl92YWx1ZSxcbiAgICAgICAgICAgIHMubWF4X3ZhbHVlOjp0ZXh0IEFTIG1heF92YWx1ZSxcbiAgICAgICAgICAgIHMuaW5jcmVtZW50X2J5Ojp0ZXh0IEFTIGluY3JlbWVudCxcbiAgICAgICAgICAgIHMuY3ljbGUgQVMgY3ljbGUsXG4gICAgICAgICAgICBzLmNhY2hlX3NpemU6OnRleHQgQVMgY2FjaGVfc2l6ZSxcbiAgICAgICAgICAgIHQucmVsbmFtZSBBUyBvd25lZF9ieV90YWJsZSxcbiAgICAgICAgICAgIGEuYXR0bmFtZSBBUyBvd25lZF9ieV9jb2x1bW5cbiAgICAgICAgRlJPTSBwZ19jYXRhbG9nLnBnX3NlcXVlbmNlcyBzXG4gICAgICAgIEpPSU4gcGdfY2F0YWxvZy5wZ19jbGFzcyBjXG4gICAgICAgICAgICBPTiBjLnJlbG5hbWUgPSBzLnNlcXVlbmNlbmFtZVxuICAgICAgICAgICAgQU5EIGMucmVsbmFtZXNwYWNlID0gKFNFTEVDVCBvaWQgRlJPTSBwZ19uYW1lc3BhY2UgV0hFUkUgbnNwbmFtZSA9IHMuc2NoZW1hbmFtZSlcbiAgICAgICAgTEVGVCBKT0lOIHBnX2NhdGFsb2cucGdfZGVwZW5kIGRcbiAgICAgICAgICAgIE9OIGQub2JqaWQgPSBjLm9pZFxuICAgICAgICAgICAgQU5EIGQuY2xhc3NpZCA9ICdwZ19jbGFzcyc6OnJlZ2NsYXNzXG4gICAgICAgICAgICBBTkQgZC5yZWZjbGFzc2lkID0gJ3BnX2NsYXNzJzo6cmVnY2xhc3NcbiAgICAgICAgICAgIEFORCBkLmRlcHR5cGUgPSAnYSdcbiAgICAgICAgTEVGVCBKT0lOIHBnX2NhdGFsb2cucGdfY2xhc3MgdCBPTiB0Lm9pZCA9IGQucmVmb2JqaWRcbiAgICAgICAgTEVGVCBKT0lOIHBnX2NhdGFsb2cucGdfYXR0cmlidXRlIGFcbiAgICAgICAgICAgIE9OIGEuYXR0cmVsaWQgPSBkLnJlZm9iamlkIEFORCBhLmF0dG51bSA9IGQucmVmb2Jqc3ViaWRcbiAgICAgICAgV0hFUkUgcy5zY2hlbWFuYW1lID0gJ3B1YmxpYydcbiAgICAgICAgT1JERVIgQlkgcy5zZXF1ZW5jZW5hbWVcbiAgICBgKTtcblxuICAgIHJldHVybiByZXN1bHQucm93cztcbn07XG4iXX0=
@@ -0,0 +1,11 @@
1
+ import type { Pool } from 'pg';
2
+ export type TTriggerInfo = {
3
+ relation_name: string;
4
+ name: string;
5
+ definition: string;
6
+ function_schema: string;
7
+ function_name: string;
8
+ is_enabled: boolean;
9
+ };
10
+ export declare const fetchPublicTriggers: (pool: Pool) => Promise<TTriggerInfo[]>;
11
+ //# sourceMappingURL=triggers.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triggers.d.mts","sourceRoot":"./src/","sources":["db/triggers.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,IAAI,CAAC;AAE7B,MAAM,MAAM,YAAY,GAAG;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC5B,MAAM,IAAI,KACX,OAAO,CAAC,YAAY,EAAE,CAoBxB,CAAC"}
@@ -0,0 +1,21 @@
1
+ export const fetchPublicTriggers = async (pool) => {
2
+ const result = await pool.query(`
3
+ SELECT
4
+ t.relname AS relation_name,
5
+ tg.tgname AS name,
6
+ pg_get_triggerdef(tg.oid, true) AS definition,
7
+ fn_ns.nspname AS function_schema,
8
+ fn.proname AS function_name,
9
+ tg.tgenabled <> 'D' AS is_enabled
10
+ FROM pg_catalog.pg_trigger tg
11
+ JOIN pg_catalog.pg_class t ON t.oid = tg.tgrelid
12
+ JOIN pg_catalog.pg_namespace n ON n.oid = t.relnamespace
13
+ JOIN pg_catalog.pg_proc fn ON fn.oid = tg.tgfoid
14
+ JOIN pg_catalog.pg_namespace fn_ns ON fn_ns.oid = fn.pronamespace
15
+ WHERE n.nspname = 'public'
16
+ AND NOT tg.tgisinternal
17
+ ORDER BY t.relname, tg.tgname
18
+ `);
19
+ return result.rows;
20
+ };
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJpZ2dlcnMubWpzIiwic291cmNlUm9vdCI6Ii4vc3JjLyIsInNvdXJjZXMiOlsiZGIvdHJpZ2dlcnMubXRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVdBLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLEtBQUssRUFDcEMsSUFBVSxFQUNhLEVBQUU7SUFDekIsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFlOzs7Ozs7Ozs7Ozs7Ozs7O0tBZ0I3QyxDQUFDLENBQUM7SUFFSCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFDdkIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1Bvb2x9IGZyb20gJ3BnJztcblxuZXhwb3J0IHR5cGUgVFRyaWdnZXJJbmZvID0ge1xuICAgIHJlbGF0aW9uX25hbWU6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZGVmaW5pdGlvbjogc3RyaW5nO1xuICAgIGZ1bmN0aW9uX3NjaGVtYTogc3RyaW5nO1xuICAgIGZ1bmN0aW9uX25hbWU6IHN0cmluZztcbiAgICBpc19lbmFibGVkOiBib29sZWFuO1xufTtcblxuZXhwb3J0IGNvbnN0IGZldGNoUHVibGljVHJpZ2dlcnMgPSBhc3luYyAoXG4gICAgcG9vbDogUG9vbCxcbik6IFByb21pc2U8VFRyaWdnZXJJbmZvW10+ID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwb29sLnF1ZXJ5PFRUcmlnZ2VySW5mbz4oYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICAgIHQucmVsbmFtZSBBUyByZWxhdGlvbl9uYW1lLFxuICAgICAgICAgICAgdGcudGduYW1lIEFTIG5hbWUsXG4gICAgICAgICAgICBwZ19nZXRfdHJpZ2dlcmRlZih0Zy5vaWQsIHRydWUpIEFTIGRlZmluaXRpb24sXG4gICAgICAgICAgICBmbl9ucy5uc3BuYW1lIEFTIGZ1bmN0aW9uX3NjaGVtYSxcbiAgICAgICAgICAgIGZuLnByb25hbWUgQVMgZnVuY3Rpb25fbmFtZSxcbiAgICAgICAgICAgIHRnLnRnZW5hYmxlZCA8PiAnRCcgQVMgaXNfZW5hYmxlZFxuICAgICAgICBGUk9NIHBnX2NhdGFsb2cucGdfdHJpZ2dlciB0Z1xuICAgICAgICBKT0lOIHBnX2NhdGFsb2cucGdfY2xhc3MgdCBPTiB0Lm9pZCA9IHRnLnRncmVsaWRcbiAgICAgICAgSk9JTiBwZ19jYXRhbG9nLnBnX25hbWVzcGFjZSBuIE9OIG4ub2lkID0gdC5yZWxuYW1lc3BhY2VcbiAgICAgICAgSk9JTiBwZ19jYXRhbG9nLnBnX3Byb2MgZm4gT04gZm4ub2lkID0gdGcudGdmb2lkXG4gICAgICAgIEpPSU4gcGdfY2F0YWxvZy5wZ19uYW1lc3BhY2UgZm5fbnMgT04gZm5fbnMub2lkID0gZm4ucHJvbmFtZXNwYWNlXG4gICAgICAgIFdIRVJFIG4ubnNwbmFtZSA9ICdwdWJsaWMnXG4gICAgICAgICAgICBBTkQgTk9UIHRnLnRnaXNpbnRlcm5hbFxuICAgICAgICBPUkRFUiBCWSB0LnJlbG5hbWUsIHRnLnRnbmFtZVxuICAgIGApO1xuXG4gICAgcmV0dXJuIHJlc3VsdC5yb3dzO1xufTtcbiJdfQ==
@@ -0,0 +1,115 @@
1
+ import type { TPostIntrospectionStage } from '@dbctx/common';
2
+ import type { TSensitiveMask, TTableSampleEvent } from '../app/sample.mjs';
3
+ export type TFlowEvent = {
4
+ readonly kind: 'start';
5
+ } | {
6
+ readonly kind: 'stop-after-reached';
7
+ } | {
8
+ readonly kind: 'ssh-connected';
9
+ } | {
10
+ readonly kind: 'ssh-failed';
11
+ readonly error: string;
12
+ } | {
13
+ readonly kind: 'ssh-not-needed';
14
+ } | {
15
+ readonly kind: 'db-connected';
16
+ } | {
17
+ readonly kind: 'db-failed';
18
+ readonly error: string;
19
+ } | {
20
+ readonly kind: 'introspection-loaded';
21
+ } | {
22
+ readonly kind: 'introspection-failed';
23
+ readonly error: string;
24
+ } | {
25
+ readonly kind: 'output-json-written';
26
+ } | {
27
+ readonly kind: 'output-json-skipped';
28
+ } | {
29
+ readonly kind: 'output-json-failed';
30
+ readonly error: string;
31
+ } | {
32
+ readonly kind: 'output-json-not-requested';
33
+ } | {
34
+ readonly kind: 'session-created';
35
+ readonly sessionId: string;
36
+ } | {
37
+ readonly kind: 'session-failed';
38
+ readonly error: string;
39
+ } | {
40
+ readonly kind: 'auth-confirmed';
41
+ readonly token: string;
42
+ } | {
43
+ readonly kind: 'auth-failed';
44
+ readonly error: string;
45
+ } | {
46
+ readonly kind: 'auth-not-needed';
47
+ } | {
48
+ readonly kind: 'fast-path-completed';
49
+ readonly sessionId: string;
50
+ readonly token: string;
51
+ } | {
52
+ readonly kind: 'explanation-given';
53
+ readonly value: string;
54
+ } | {
55
+ readonly kind: 'check-introspection-hit';
56
+ readonly revisionId: string;
57
+ readonly samplesExist: boolean;
58
+ readonly tablesNeedingSamples: readonly string[];
59
+ readonly postIntrospectionJobId: string | null;
60
+ } | {
61
+ readonly kind: 'check-introspection-miss';
62
+ } | {
63
+ readonly kind: 'introspection-ingested';
64
+ readonly revisionId: string;
65
+ readonly samplesExist: boolean;
66
+ readonly tablesNeedingSamples: readonly string[];
67
+ readonly postIntrospectionJobId: string | null;
68
+ } | {
69
+ readonly kind: 'ingest-failed';
70
+ readonly error: string;
71
+ } | {
72
+ readonly kind: 'mask-loaded';
73
+ readonly mask: TSensitiveMask;
74
+ } | {
75
+ readonly kind: 'mask-fetch-failed';
76
+ readonly error: string;
77
+ } | {
78
+ readonly kind: 'sample-table-yielded';
79
+ readonly event: TTableSampleEvent;
80
+ } | {
81
+ readonly kind: 'sampling-completed';
82
+ } | {
83
+ readonly kind: 'sampling-failed';
84
+ readonly error: string;
85
+ } | {
86
+ readonly kind: 'sampling-not-needed';
87
+ } | {
88
+ readonly kind: 'sample-chunk-uploaded';
89
+ readonly chunkSize: number;
90
+ } | {
91
+ readonly kind: 'samples-upload-completed';
92
+ } | {
93
+ readonly kind: 'samples-upload-failed';
94
+ readonly error: string;
95
+ } | {
96
+ readonly kind: 'samples-upload-not-needed';
97
+ } | {
98
+ readonly kind: 'post-introspection-progress';
99
+ readonly stage: TPostIntrospectionStage;
100
+ readonly tokensIn: number | null;
101
+ readonly tokensOut: number | null;
102
+ readonly columnsDone: number | null;
103
+ readonly columnsTotal: number | null;
104
+ } | {
105
+ readonly kind: 'post-introspection-completed';
106
+ } | {
107
+ readonly kind: 'post-introspection-failed';
108
+ readonly error: string;
109
+ } | {
110
+ readonly kind: 'post-sampling-completed';
111
+ } | {
112
+ readonly kind: 'post-sampling-failed';
113
+ readonly error: string;
114
+ };
115
+ //# sourceMappingURL=events.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.mts","sourceRoot":"./src/","sources":["flow/events.mts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLm1qcyIsInNvdXJjZVJvb3QiOiIuL3NyYy8iLCJzb3VyY2VzIjpbImZsb3cvZXZlbnRzLm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1RQb3N0SW50cm9zcGVjdGlvblN0YWdlfSBmcm9tICdAZGJjdHgvY29tbW9uJztcbmltcG9ydCB0eXBlIHtUU2Vuc2l0aXZlTWFzaywgVFRhYmxlU2FtcGxlRXZlbnR9IGZyb20gJy4uL2FwcC9zYW1wbGUubWpzJztcblxuLy8gRGlzY3JpbWluYXRlZCB1bmlvbiBvZiBldmVyeSBldmVudCB0aGF0IGNhbiBkcml2ZSBhIHN0YXRlIHRyYW5zaXRpb24uXG4vLyBJTyBjb21wbGV0aW9ucywgSU8gZmFpbHVyZXMsIHVzZXIgYWN0aW9ucywgc3RvcC1hZnRlciB0cmlnZ2Vycy5cblxuZXhwb3J0IHR5cGUgVEZsb3dFdmVudCA9XG4gICAgLy8gTGlmZWN5Y2xlIC8gZHJpdmVyc1xuICAgIHwge3JlYWRvbmx5IGtpbmQ6ICdzdGFydCd9XG4gICAgfCB7cmVhZG9ubHkga2luZDogJ3N0b3AtYWZ0ZXItcmVhY2hlZCd9XG5cbiAgICAvLyBTU0hcbiAgICB8IHtyZWFkb25seSBraW5kOiAnc3NoLWNvbm5lY3RlZCd9XG4gICAgfCB7cmVhZG9ubHkga2luZDogJ3NzaC1mYWlsZWQnOyByZWFkb25seSBlcnJvcjogc3RyaW5nfVxuICAgIHwge3JlYWRvbmx5IGtpbmQ6ICdzc2gtbm90LW5lZWRlZCd9XG5cbiAgICAvLyBEQlxuICAgIHwge3JlYWRvbmx5IGtpbmQ6ICdkYi1jb25uZWN0ZWQnfVxuICAgIHwge3JlYWRvbmx5IGtpbmQ6ICdkYi1mYWlsZWQnOyByZWFkb25seSBlcnJvcjogc3RyaW5nfVxuXG4gICAgLy8gSW50cm9zcGVjdGlvblxuICAgIHwge3JlYWRvbmx5IGtpbmQ6ICdpbnRyb3NwZWN0aW9uLWxvYWRlZCd9XG4gICAgfCB7cmVhZG9ubHkga2luZDogJ2ludHJvc3BlY3Rpb24tZmFpbGVkJzsgcmVhZG9ubHkgZXJyb3I6IHN0cmluZ31cblxuICAgIC8vIE91dHB1dCBKU09OXG4gICAgfCB7cmVhZG9ubHkga2luZDogJ291dHB1dC1qc29uLXdyaXR0ZW4nfVxuICAgIHwge3JlYWRvbmx5IGtpbmQ6ICdvdXRwdXQtanNvbi1za2lwcGVkJ30gLy8gdXNlciBkZWNsaW5lZCBvdmVyd3JpdGVcbiAgICB8IHtyZWFkb25seSBraW5kOiAnb3V0cHV0LWpzb24tZmFpbGVkJzsgcmVhZG9ubHkgZXJyb3I6IHN0cmluZ31cbiAgICB8IHtyZWFkb25seSBraW5kOiAnb3V0cHV0LWpzb24tbm90LXJlcXVlc3RlZCd9XG5cbiAgICAvLyBTZXNzaW9uICsgYXV0aFxuICAgIHwge3JlYWRvbmx5IGtpbmQ6ICdzZXNzaW9uLWNyZWF0ZWQnOyByZWFkb25seSBzZXNzaW9uSWQ6IHN0cmluZ31cbiAgICB8IHtyZWFkb25seSBraW5kOiAnc2Vzc2lvbi1mYWlsZWQnOyByZWFkb25seSBlcnJvcjogc3RyaW5nfVxuICAgIHwge3JlYWRvbmx5IGtpbmQ6ICdhdXRoLWNvbmZpcm1lZCc7IHJlYWRvbmx5IHRva2VuOiBzdHJpbmd9XG4gICAgfCB7cmVhZG9ubHkga2luZDogJ2F1dGgtZmFpbGVkJzsgcmVhZG9ubHkgZXJyb3I6IHN0cmluZ31cbiAgICB8IHtyZWFkb25seSBraW5kOiAnYXV0aC1ub3QtbmVlZGVkJ30gLy8gbm8gYXV0aGVkIGZsb3cgYXQgYWxsIChubyBzZXJ2ZXIpXG4gICAgfCB7XG4gICAgICAgICAgLy8gQ2FjaGVkLXRva2VuIGZhc3QgcGF0aDogc2tpcCBhd2FpdGluZy1hdXRob3JpemF0aW9uIGVudGlyZWx5LlxuICAgICAgICAgIC8vIENhcnJpZXMgYm90aCBzZXNzaW9uSWQgYW5kIHRva2VuIHNvIHJlZHVjZXIgbGFuZHMgaW5cbiAgICAgICAgICAvLyBwcmVmbGlnaHQvYXdhaXRpbmctZXhwbGFuYXRpb24gaW4gYSBzaW5nbGUgdHJhbnNpdGlvbi5cbiAgICAgICAgICByZWFkb25seSBraW5kOiAnZmFzdC1wYXRoLWNvbXBsZXRlZCc7XG4gICAgICAgICAgcmVhZG9ubHkgc2Vzc2lvbklkOiBzdHJpbmc7XG4gICAgICAgICAgcmVhZG9ubHkgdG9rZW46IHN0cmluZztcbiAgICAgIH1cblxuICAgIC8vIEV4cGxhbmF0aW9uXG4gICAgfCB7cmVhZG9ubHkga2luZDogJ2V4cGxhbmF0aW9uLWdpdmVuJzsgcmVhZG9ubHkgdmFsdWU6IHN0cmluZ31cblxuICAgIC8vIFByZWZsaWdodCArIGluZ2VzdFxuICAgIHwge1xuICAgICAgICAgIHJlYWRvbmx5IGtpbmQ6ICdjaGVjay1pbnRyb3NwZWN0aW9uLWhpdCc7XG4gICAgICAgICAgcmVhZG9ubHkgcmV2aXNpb25JZDogc3RyaW5nO1xuICAgICAgICAgIHJlYWRvbmx5IHNhbXBsZXNFeGlzdDogYm9vbGVhbjtcbiAgICAgICAgICByZWFkb25seSB0YWJsZXNOZWVkaW5nU2FtcGxlczogcmVhZG9ubHkgc3RyaW5nW107XG4gICAgICAgICAgcmVhZG9ubHkgcG9zdEludHJvc3BlY3Rpb25Kb2JJZDogc3RyaW5nIHwgbnVsbDtcbiAgICAgIH1cbiAgICB8IHtyZWFkb25seSBraW5kOiAnY2hlY2staW50cm9zcGVjdGlvbi1taXNzJ31cbiAgICB8IHtcbiAgICAgICAgICByZWFkb25seSBraW5kOiAnaW50cm9zcGVjdGlvbi1pbmdlc3RlZCc7XG4gICAgICAgICAgcmVhZG9ubHkgcmV2aXNpb25JZDogc3RyaW5nO1xuICAgICAgICAgIHJlYWRvbmx5IHNhbXBsZXNFeGlzdDogYm9vbGVhbjtcbiAgICAgICAgICByZWFkb25seSB0YWJsZXNOZWVkaW5nU2FtcGxlczogcmVhZG9ubHkgc3RyaW5nW107XG4gICAgICAgICAgcmVhZG9ubHkgcG9zdEludHJvc3BlY3Rpb25Kb2JJZDogc3RyaW5nIHwgbnVsbDtcbiAgICAgIH1cbiAgICB8IHtyZWFkb25seSBraW5kOiAnaW5nZXN0LWZhaWxlZCc7IHJlYWRvbmx5IGVycm9yOiBzdHJpbmd9XG5cbiAgICAvLyBNYXNrIHJlc29sdXRpb25cbiAgICB8IHtyZWFkb25seSBraW5kOiAnbWFzay1sb2FkZWQnOyByZWFkb25seSBtYXNrOiBUU2Vuc2l0aXZlTWFza31cbiAgICB8IHtyZWFkb25seSBraW5kOiAnbWFzay1mZXRjaC1mYWlsZWQnOyByZWFkb25seSBlcnJvcjogc3RyaW5nfVxuXG4gICAgLy8gU2FtcGxpbmdcbiAgICB8IHtcbiAgICAgICAgICByZWFkb25seSBraW5kOiAnc2FtcGxlLXRhYmxlLXlpZWxkZWQnO1xuICAgICAgICAgIHJlYWRvbmx5IGV2ZW50OiBUVGFibGVTYW1wbGVFdmVudDtcbiAgICAgIH1cbiAgICB8IHtyZWFkb25seSBraW5kOiAnc2FtcGxpbmctY29tcGxldGVkJ31cbiAgICB8IHtyZWFkb25seSBraW5kOiAnc2FtcGxpbmctZmFpbGVkJzsgcmVhZG9ubHkgZXJyb3I6IHN0cmluZ31cbiAgICB8IHtyZWFkb25seSBraW5kOiAnc2FtcGxpbmctbm90LW5lZWRlZCd9IC8vIHNhbXBsZXMgYWxyZWFkeSBpbmdlc3RlZFxuXG4gICAgLy8gU2FtcGxlIHVwbG9hZFxuICAgIHwge1xuICAgICAgICAgIHJlYWRvbmx5IGtpbmQ6ICdzYW1wbGUtY2h1bmstdXBsb2FkZWQnO1xuICAgICAgICAgIHJlYWRvbmx5IGNodW5rU2l6ZTogbnVtYmVyO1xuICAgICAgfVxuICAgIHwge3JlYWRvbmx5IGtpbmQ6ICdzYW1wbGVzLXVwbG9hZC1jb21wbGV0ZWQnfVxuICAgIHwge3JlYWRvbmx5IGtpbmQ6ICdzYW1wbGVzLXVwbG9hZC1mYWlsZWQnOyByZWFkb25seSBlcnJvcjogc3RyaW5nfVxuICAgIHwge3JlYWRvbmx5IGtpbmQ6ICdzYW1wbGVzLXVwbG9hZC1ub3QtbmVlZGVkJ31cblxuICAgIC8vIFBvc3QtaW50cm9zcGVjdGlvbiAoYmFja2dyb3VuZDsgY2FuIHJlc29sdmUgaW4gYW55IHBoYXNlKVxuICAgIHwge1xuICAgICAgICAgIHJlYWRvbmx5IGtpbmQ6ICdwb3N0LWludHJvc3BlY3Rpb24tcHJvZ3Jlc3MnO1xuICAgICAgICAgIHJlYWRvbmx5IHN0YWdlOiBUUG9zdEludHJvc3BlY3Rpb25TdGFnZTtcbiAgICAgICAgICByZWFkb25seSB0b2tlbnNJbjogbnVtYmVyIHwgbnVsbDtcbiAgICAgICAgICByZWFkb25seSB0b2tlbnNPdXQ6IG51bWJlciB8IG51bGw7XG4gICAgICAgICAgcmVhZG9ubHkgY29sdW1uc0RvbmU6IG51bWJlciB8IG51bGw7XG4gICAgICAgICAgcmVhZG9ubHkgY29sdW1uc1RvdGFsOiBudW1iZXIgfCBudWxsO1xuICAgICAgfVxuICAgIHwge3JlYWRvbmx5IGtpbmQ6ICdwb3N0LWludHJvc3BlY3Rpb24tY29tcGxldGVkJ31cbiAgICB8IHtyZWFkb25seSBraW5kOiAncG9zdC1pbnRyb3NwZWN0aW9uLWZhaWxlZCc7IHJlYWRvbmx5IGVycm9yOiBzdHJpbmd9XG5cbiAgICAvLyBQb3N0LXNhbXBsaW5nXG4gICAgfCB7cmVhZG9ubHkga2luZDogJ3Bvc3Qtc2FtcGxpbmctY29tcGxldGVkJ31cbiAgICB8IHtyZWFkb25seSBraW5kOiAncG9zdC1zYW1wbGluZy1mYWlsZWQnOyByZWFkb25seSBlcnJvcjogc3RyaW5nfTtcbiJdfQ==
@@ -0,0 +1,21 @@
1
+ import type { TRPCClient } from '@trpc/client';
2
+ import type { TAppRouter } from '@dbctx/core';
3
+ import { type TDBConnection } from '../app/db.mjs';
4
+ import { assembleDatabase } from '../app/assemble.mjs';
5
+ import type { TStore } from '../store.mjs';
6
+ import type { TFlowEvent } from './events.mjs';
7
+ import type { TFlowState } from './states.mjs';
8
+ export type TInterpreterContext = {
9
+ cleanupSSH: (() => void) | null;
10
+ db: TDBConnection | null;
11
+ introspection: Awaited<ReturnType<typeof assembleDatabase>> | null;
12
+ authed: TRPCClient<TAppRouter> | null;
13
+ postIntrospectionPoll: Promise<void> | null;
14
+ explanation: string | null;
15
+ };
16
+ export declare const initialContext: () => TInterpreterContext;
17
+ type TDispatch = (event: TFlowEvent) => void;
18
+ export declare const driveSide: (prev: TFlowState | null, curr: TFlowState, store: TStore, ctx: TInterpreterContext, dispatch: TDispatch) => Promise<void>;
19
+ export declare const cleanup: (ctx: TInterpreterContext) => void;
20
+ export {};
21
+ //# sourceMappingURL=interpreter.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interpreter.d.mts","sourceRoot":"./src/","sources":["flow/interpreter.mts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,cAAc,CAAC;AAC7C,OAAO,KAAK,EAAC,UAAU,EAAiB,MAAM,aAAa,CAAC;AAK5D,OAAO,EAAY,KAAK,aAAa,EAAC,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAC,gBAAgB,EAAC,MAAM,qBAAqB,CAAC;AA8BrD,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,cAAc,CAAC;AAC7C,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,cAAc,CAAC;AAM7C,MAAM,MAAM,mBAAmB,GAAG;IAC9B,UAAU,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC;IAChC,EAAE,EAAE,aAAa,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,GAAG,IAAI,CAAC;IACnE,MAAM,EAAE,UAAU,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;IACtC,qBAAqB,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC5C,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,CAAC;AAEF,eAAO,MAAM,cAAc,QAAO,mBAOhC,CAAC;AAEH,KAAK,SAAS,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;AAqC7C,eAAO,MAAM,SAAS,GAClB,MAAM,UAAU,GAAG,IAAI,EACvB,MAAM,UAAU,EAChB,OAAO,MAAM,EACb,KAAK,mBAAmB,EACxB,UAAU,SAAS,KACpB,OAAO,CAAC,IAAI,CA0lBd,CAAC;AAgCF,eAAO,MAAM,OAAO,GAAI,KAAK,mBAAmB,KAAG,IASlD,CAAC"}