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.
- package/dist/app/assemble.d.mts.map +1 -1
- package/dist/app/assemble.mjs +20 -4
- package/dist/app/list.d.mts +4 -0
- package/dist/app/list.d.mts.map +1 -0
- package/dist/app/list.mjs +93 -0
- package/dist/app/load-introspection.d.mts +26 -0
- package/dist/app/load-introspection.d.mts.map +1 -0
- package/dist/app/load-introspection.mjs +89 -0
- package/dist/app/login.d.mts +2 -0
- package/dist/app/login.d.mts.map +1 -0
- package/dist/app/login.mjs +69 -0
- package/dist/app/open-url.d.mts +2 -0
- package/dist/app/open-url.d.mts.map +1 -1
- package/dist/app/open-url.mjs +8 -3
- package/dist/app/sample.d.mts +24 -0
- package/dist/app/sample.d.mts.map +1 -0
- package/dist/app/sample.mjs +257 -0
- package/dist/app/session.d.mts +1 -0
- package/dist/app/session.d.mts.map +1 -1
- package/dist/app/session.mjs +44 -4
- package/dist/app/tail.d.mts +13 -0
- package/dist/app/tail.d.mts.map +1 -0
- package/dist/app/tail.mjs +168 -0
- package/dist/db/check-constraints.d.mts +9 -0
- package/dist/db/check-constraints.d.mts.map +1 -0
- package/dist/db/check-constraints.mjs +17 -0
- package/dist/db/custom-types.d.mts +26 -0
- package/dist/db/custom-types.d.mts.map +1 -0
- package/dist/db/custom-types.mjs +61 -0
- package/dist/db/extensions.d.mts +8 -0
- package/dist/db/extensions.d.mts.map +1 -0
- package/dist/db/extensions.mjs +14 -0
- package/dist/db/functions.d.mts +11 -0
- package/dist/db/functions.d.mts.map +1 -0
- package/dist/db/functions.mjs +23 -0
- package/dist/db/index.d.mts +9 -0
- package/dist/db/index.d.mts.map +1 -1
- package/dist/db/index.mjs +10 -1
- package/dist/db/planner-stats.d.mts +33 -0
- package/dist/db/planner-stats.d.mts.map +1 -0
- package/dist/db/planner-stats.mjs +103 -0
- package/dist/db/rls.d.mts +21 -0
- package/dist/db/rls.d.mts.map +1 -0
- package/dist/db/rls.mjs +48 -0
- package/dist/db/sample.d.mts +16 -0
- package/dist/db/sample.d.mts.map +1 -0
- package/dist/db/sample.mjs +73 -0
- package/dist/db/sequences.d.mts +15 -0
- package/dist/db/sequences.d.mts.map +1 -0
- package/dist/db/sequences.mjs +31 -0
- package/dist/db/triggers.d.mts +11 -0
- package/dist/db/triggers.d.mts.map +1 -0
- package/dist/db/triggers.mjs +21 -0
- package/dist/flow/events.d.mts +115 -0
- package/dist/flow/events.d.mts.map +1 -0
- package/dist/flow/events.mjs +2 -0
- package/dist/flow/interpreter.d.mts +21 -0
- package/dist/flow/interpreter.d.mts.map +1 -0
- package/dist/flow/interpreter.mjs +605 -0
- package/dist/flow/projection.d.mts +17 -0
- package/dist/flow/projection.d.mts.map +1 -0
- package/dist/flow/projection.mjs +83 -0
- package/dist/flow/projection.test.d.mts +2 -0
- package/dist/flow/projection.test.d.mts.map +1 -0
- package/dist/flow/projection.test.mjs +162 -0
- package/dist/flow/reducer.d.mts +5 -0
- package/dist/flow/reducer.d.mts.map +1 -0
- package/dist/flow/reducer.mjs +306 -0
- package/dist/flow/reducer.test.d.mts +2 -0
- package/dist/flow/reducer.test.d.mts.map +1 -0
- package/dist/flow/reducer.test.mjs +479 -0
- package/dist/flow/run.d.mts +3 -0
- package/dist/flow/run.d.mts.map +1 -0
- package/dist/flow/run.mjs +89 -0
- package/dist/flow/states.d.mts +54 -0
- package/dist/flow/states.d.mts.map +1 -0
- package/dist/flow/states.mjs +39 -0
- package/dist/index.d.mts +7 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +112 -13
- package/dist/lib/atomic-write.d.mts +4 -0
- package/dist/lib/atomic-write.d.mts.map +1 -0
- package/dist/lib/atomic-write.mjs +75 -0
- package/dist/lib/stream-job.d.mts +19 -0
- package/dist/lib/stream-job.d.mts.map +1 -0
- package/dist/lib/stream-job.mjs +55 -0
- package/dist/lib/trpc-url.mjs +2 -2
- package/dist/lib/trpc.mjs +2 -2
- package/dist/logger.d.mts.map +1 -1
- package/dist/logger.mjs +6 -3
- package/dist/providers/TrpcProvider.js +3 -3
- package/dist/store.d.mts +95 -2
- package/dist/store.d.mts.map +1 -1
- package/dist/store.mjs +64 -1
- package/dist/ui/App.d.ts +1 -1
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/App.js +22 -4
- package/dist/ui/components/Analyze.d.ts +10 -0
- package/dist/ui/components/Analyze.d.ts.map +1 -0
- package/dist/ui/components/Analyze.js +54 -0
- package/dist/ui/components/Billing.d.ts +10 -0
- package/dist/ui/components/Billing.d.ts.map +1 -0
- package/dist/ui/components/Billing.js +40 -0
- package/dist/ui/components/DB.d.ts.map +1 -1
- package/dist/ui/components/DB.js +2 -2
- package/dist/ui/components/DatabasePicker.d.ts +13 -0
- package/dist/ui/components/DatabasePicker.d.ts.map +1 -0
- package/dist/ui/components/DatabasePicker.js +79 -0
- package/dist/ui/components/Enrich.d.ts +10 -0
- package/dist/ui/components/Enrich.d.ts.map +1 -0
- package/dist/ui/components/Enrich.js +41 -0
- package/dist/ui/components/Gate.js +2 -2
- package/dist/ui/components/Introspect.d.ts.map +1 -1
- package/dist/ui/components/Introspect.js +2 -2
- package/dist/ui/components/IntrospectionUpload.d.ts +10 -0
- package/dist/ui/components/IntrospectionUpload.d.ts.map +1 -0
- package/dist/ui/components/IntrospectionUpload.js +30 -0
- package/dist/ui/components/Login.d.ts +19 -0
- package/dist/ui/components/Login.d.ts.map +1 -0
- package/dist/ui/components/Login.js +38 -0
- package/dist/ui/components/OutputJson.d.ts.map +1 -1
- package/dist/ui/components/OutputJson.js +2 -2
- package/dist/ui/components/SSH.d.ts.map +1 -1
- package/dist/ui/components/SSH.js +2 -2
- package/dist/ui/components/SamplesUpload.d.ts +10 -0
- package/dist/ui/components/SamplesUpload.d.ts.map +1 -0
- package/dist/ui/components/SamplesUpload.js +24 -0
- package/dist/ui/components/Sampling.d.ts +10 -0
- package/dist/ui/components/Sampling.d.ts.map +1 -0
- package/dist/ui/components/Sampling.js +58 -0
- package/dist/ui/components/Session.d.ts.map +1 -1
- package/dist/ui/components/Session.js +4 -4
- package/dist/ui/components/Spinner.d.ts.map +1 -1
- package/dist/ui/components/Spinner.js +17 -5
- package/dist/validatePaths.d.mts +1 -1
- package/dist/validatePaths.d.mts.map +1 -1
- package/dist/validatePaths.mjs +5 -1
- package/package.json +7 -7
- package/dist/app/index.d.mts +0 -3
- package/dist/app/index.d.mts.map +0 -1
- package/dist/app/index.mjs +0 -156
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { runInAction } from 'mobx';
|
|
2
|
+
import { parsePostIntrospectionStage, parsePostSamplingLabel, } from '@dbctx/common';
|
|
3
|
+
import { streamJob } from '../lib/stream-job.mjs';
|
|
4
|
+
import { logger } from '../logger.mjs';
|
|
5
|
+
// Streams a post-introspection job to completion and binds progress + terminal state
|
|
6
|
+
// onto store.steps.ingestion.postIntrospection. Returns the final snapshot so callers
|
|
7
|
+
// can react to success/failure.
|
|
8
|
+
export const streamPostIntrospection = async (authed, jobId, store) => {
|
|
9
|
+
try {
|
|
10
|
+
const snapshot = await streamJob(authed, jobId, {
|
|
11
|
+
onProgress: (snap) => {
|
|
12
|
+
runInAction(() => {
|
|
13
|
+
store.steps.ingestion.postIntrospection.state = 'running';
|
|
14
|
+
store.steps.ingestion.postIntrospection.stage =
|
|
15
|
+
parsePostIntrospectionStage(snap.progressLabel);
|
|
16
|
+
store.steps.ingestion.postIntrospection.tokensIn =
|
|
17
|
+
snap.tokensIn ?? null;
|
|
18
|
+
store.steps.ingestion.postIntrospection.tokensOut =
|
|
19
|
+
snap.tokensOut ?? null;
|
|
20
|
+
store.steps.ingestion.postIntrospection.columnsDone =
|
|
21
|
+
snap.columnsDone ?? null;
|
|
22
|
+
store.steps.ingestion.postIntrospection.columnsTotal =
|
|
23
|
+
snap.columnsTotal ?? null;
|
|
24
|
+
});
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
runInAction(() => {
|
|
28
|
+
if (snapshot.status === 'failed') {
|
|
29
|
+
store.steps.ingestion.postIntrospection.state = 'error';
|
|
30
|
+
store.steps.ingestion.postIntrospection.error =
|
|
31
|
+
snapshot.error ?? 'post-introspection failed';
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
store.steps.ingestion.postIntrospection.state = 'done';
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
return snapshot;
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
41
|
+
runInAction(() => {
|
|
42
|
+
store.steps.ingestion.postIntrospection.state = 'error';
|
|
43
|
+
store.steps.ingestion.postIntrospection.error = msg;
|
|
44
|
+
});
|
|
45
|
+
throw err;
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
// Triggers post-sampling (server skips re-enqueue if already analyzed) and binds
|
|
49
|
+
// progress + terminal state onto store.steps.ingestion.postSampling.
|
|
50
|
+
export const dispatchAndStreamPostSampling = async (authed, revisionId, store) => {
|
|
51
|
+
runInAction(() => {
|
|
52
|
+
if (store.steps.ingestion.postSampling.state === 'idle') {
|
|
53
|
+
store.steps.ingestion.postSampling.state = 'queued';
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
const result = await authed.revisions.runPostSampling.mutate({ revisionId });
|
|
57
|
+
if (result.alreadyAnalyzed) {
|
|
58
|
+
runInAction(() => {
|
|
59
|
+
const c = store.steps.ingestion.postSampling;
|
|
60
|
+
c.state = 'done';
|
|
61
|
+
c.jobId = null;
|
|
62
|
+
c.reused = true;
|
|
63
|
+
c.counts.totalTables = result.counts.totalTables;
|
|
64
|
+
c.counts.foreignKeysFound = result.counts.foreignKeys;
|
|
65
|
+
});
|
|
66
|
+
logger.info(`post-sampling reused for revision=${revisionId} (tables=${result.counts.totalTables} fks=${result.counts.foreignKeys})`);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const { jobId } = result;
|
|
70
|
+
runInAction(() => {
|
|
71
|
+
store.steps.ingestion.postSampling.jobId = jobId;
|
|
72
|
+
store.steps.ingestion.postSampling.state = 'running';
|
|
73
|
+
});
|
|
74
|
+
const snapshot = await streamJob(authed, jobId, {
|
|
75
|
+
onProgress: (snap) => {
|
|
76
|
+
runInAction(() => {
|
|
77
|
+
const c = store.steps.ingestion.postSampling;
|
|
78
|
+
const next = parsePostSamplingLabel(snap.progressLabel, {
|
|
79
|
+
stage: c.stage,
|
|
80
|
+
totalTables: c.counts.totalTables,
|
|
81
|
+
describedTables: c.counts.describedTables,
|
|
82
|
+
embeddedTables: c.counts.embeddedTables,
|
|
83
|
+
totalEmbeddings: c.counts.totalEmbeddings,
|
|
84
|
+
scannedTables: c.counts.scannedTables,
|
|
85
|
+
foreignKeysFound: c.counts.foreignKeysFound,
|
|
86
|
+
});
|
|
87
|
+
if (next.stage !== null) {
|
|
88
|
+
c.stage = next.stage;
|
|
89
|
+
}
|
|
90
|
+
if (next.totalTables !== undefined) {
|
|
91
|
+
c.counts.totalTables = next.totalTables;
|
|
92
|
+
}
|
|
93
|
+
if (next.describedTables !== undefined) {
|
|
94
|
+
c.counts.describedTables = next.describedTables;
|
|
95
|
+
}
|
|
96
|
+
if (next.embeddedTables !== undefined) {
|
|
97
|
+
c.counts.embeddedTables = next.embeddedTables;
|
|
98
|
+
}
|
|
99
|
+
if (next.totalEmbeddings !== undefined) {
|
|
100
|
+
c.counts.totalEmbeddings = next.totalEmbeddings;
|
|
101
|
+
}
|
|
102
|
+
if (next.scannedTables !== undefined) {
|
|
103
|
+
c.counts.scannedTables = next.scannedTables;
|
|
104
|
+
}
|
|
105
|
+
if (next.foreignKeysFound !== undefined) {
|
|
106
|
+
c.counts.foreignKeysFound = next.foreignKeysFound;
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
runInAction(() => {
|
|
112
|
+
if (snapshot.status === 'failed') {
|
|
113
|
+
store.steps.ingestion.postSampling.state = 'error';
|
|
114
|
+
store.steps.ingestion.postSampling.error =
|
|
115
|
+
snapshot.error ?? 'post-sampling job failed';
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
store.steps.ingestion.postSampling.state = 'done';
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
if (snapshot.status === 'failed') {
|
|
122
|
+
logger.error(`post-sampling job failed: ${snapshot.error ?? 'unknown'}`);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
logger.info(`post-sampling done for revision=${revisionId}`);
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
// Sequential tail of a server-side revision: post-introspection first if still running,
|
|
129
|
+
// then post-sampling. Used by the list-subcommand flow after the user picks a
|
|
130
|
+
// database to monitor. Caller is responsible for pre-filling the upstream
|
|
131
|
+
// store steps (introspection/sampling/samples) to their 'skipped' states.
|
|
132
|
+
//
|
|
133
|
+
// Always calls dispatchAndStreamPostSampling even when post-sampling is already complete
|
|
134
|
+
// server-side — runPostSampling is idempotent (`alreadyAnalyzed: true` short-circuit)
|
|
135
|
+
// and is the only way to populate the relations/foreign-keys counts the UI
|
|
136
|
+
// renders. Skipping it here would leave the analyze line showing "0 tables,
|
|
137
|
+
// 0 foreign keys".
|
|
138
|
+
export const tailRevision = async (args) => {
|
|
139
|
+
const { authed, revisionId, store, postIntrospectionDone } = args;
|
|
140
|
+
if (!postIntrospectionDone) {
|
|
141
|
+
// Funnel through ensurePostIntrospection (rather than deriving the deterministic
|
|
142
|
+
// job ID inline) so the server can wipe any prior failed post-introspection and
|
|
143
|
+
// hand back a fresh job ID. Without this, a failed post-introspection caught by
|
|
144
|
+
// the list flow would just stream back the same dead snapshot.
|
|
145
|
+
const result = await authed.revisions.ensurePostIntrospection.mutate({
|
|
146
|
+
revisionId,
|
|
147
|
+
});
|
|
148
|
+
if (result.alreadyEnriched) {
|
|
149
|
+
runInAction(() => {
|
|
150
|
+
store.steps.ingestion.postIntrospection.state = 'done';
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
runInAction(() => {
|
|
155
|
+
store.steps.ingestion.postIntrospection.jobId = result.jobId;
|
|
156
|
+
if (store.steps.ingestion.postIntrospection.state === 'idle') {
|
|
157
|
+
store.steps.ingestion.postIntrospection.state = 'queued';
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
const snap = await streamPostIntrospection(authed, result.jobId, store);
|
|
161
|
+
if (snap.status === 'failed') {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
await dispatchAndStreamPostSampling(authed, revisionId, store);
|
|
167
|
+
};
|
|
168
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFpbC5tanMiLCJzb3VyY2VSb290IjoiLi9zcmMvIiwic291cmNlcyI6WyJhcHAvdGFpbC5tdHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUdqQyxPQUFPLEVBQ0gsMkJBQTJCLEVBQzNCLHNCQUFzQixHQUN6QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsU0FBUyxFQUFvQixNQUFNLHVCQUF1QixDQUFDO0FBRW5FLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFckMscUZBQXFGO0FBQ3JGLHNGQUFzRjtBQUN0RixnQ0FBZ0M7QUFDaEMsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsS0FBSyxFQUN4QyxNQUE4QixFQUM5QixLQUFhLEVBQ2IsS0FBYSxFQUNRLEVBQUU7SUFDdkIsSUFBSSxDQUFDO1FBQ0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRTtZQUM1QyxVQUFVLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDakIsV0FBVyxDQUFDLEdBQUcsRUFBRTtvQkFDYixLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDO29CQUMxRCxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLO3dCQUN6QywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7b0JBQ3BELEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFFBQVE7d0JBQzVDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDO29CQUMxQixLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTO3dCQUM3QyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQztvQkFDM0IsS0FBSyxD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WUFDekIsV0FBVyxDQUFDLEdBQUcsRUFBRTtnQkFDYixLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO1lBQzNELENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQzthQUFNLENBQUM7WUFDSixXQUFXLENBQUMsR0FBRyxFQUFFO2dCQUNiLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO2dCQUM3RCxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLEtBQUssS0FBSyxNQUFNLEVBQUUsQ0FBQztvQkFDM0QsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztnQkFDN0QsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxJQUFJLEdBQUcsTUFBTSx1QkFBdUIsQ0FDdEMsTUFBTSxFQUNOLE1BQU0sQ0FBQyxLQUFLLEVBQ1osS0FBSyxDQUNSLENBQUM7WUFDRixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzNCLE9BQU87WUFDWCxDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFFRCxNQUFNLDZCQUE2QixDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDbkUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtydW5JbkFjdGlvbn0gZnJvbSAnbW9ieCc7XG5pbXBvcnQgdHlwZSB7VFJQQ0NsaWVudH0gZnJvbSAnQHRycGMvY2xpZW50JztcbmltcG9ydCB0eXBlIHtUQXBwUm91dGVyfSBmcm9tICdAZGJjdHgvY29yZSc7XG5pbXBvcnQge1xuICAgIHBhcnNlUG9zdEludHJvc3BlY3Rpb25TdGFnZSxcbiAgICBwYXJzZVBvc3RTYW1wbGluZ0xhYmVsLFxufSBmcm9tICdAZGJjdHgvY29tbW9uJztcbmltcG9ydCB7c3RyZWFtSm9iLCB0eXBlIFRKb2JTbmFwc2hvdH0gZnJvbSAnLi4vbGliL3N0cmVhbS1qb2IubWpzJztcbmltcG9ydCB0eXBlIHtUU3RvcmV9IGZyb20gJy4uL3N0b3JlLm1qcyc7XG5pbXBvcnQge2xvZ2dlcn0gZnJvbSAnLi4vbG9nZ2VyLm1qcyc7XG5cbi8vIFN0cmVhbXMgYSBwb3N0LWludHJvc3BlY3Rpb24gam9iIHRvIGNvbXBsZXRpb24gYW5kIGJpbmRzIHByb2dyZXNzICsgdGVybWluYWwgc3RhdGVcbi8vIG9udG8gc3RvcmUuc3RlcHMuaW5nZXN0aW9uLnBvc3RJbnRyb3NwZWN0aW9uLiBSZXR1cm5zIHRoZSBmaW5hbCBzbmFwc2hvdCBzbyBjYWxsZXJzXG4vLyBjYW4gcmVhY3QgdG8gc3VjY2Vzcy9mYWlsdXJlLlxuZXhwb3J0IGNvbnN0IHN0cmVhbVBvc3RJbnRyb3NwZWN0aW9uID0gYXN5bmMgKFxuICAgIGF1dGhlZDogVFJQQ0NsaWVudDxUQXBwUm91dGVyPixcbiAgICBqb2JJZDogc3RyaW5nLFxuICAgIHN0b3JlOiBUU3RvcmUsXG4pOiBQcm9taXNlPFRKb2JTbmFwc2hvdD4gPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgc3RyZWFtSm9iKGF1dGhlZCwgam9iSWQsIHtcbiAgICAgICAgICAgIG9uUHJvZ3Jlc3M6IChzbmFwKSA9PiB7XG4gICAgICAgICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5pbmdlc3Rpb24ucG9zdEludHJvc3BlY3Rpb24uc3RhdGUgPSAncnVubmluZyc7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLmluZ2VzdGlvbi5wb3N0SW50cm9zcGVjdGlvbi5zdGFnZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZVBvc3RJbnRyb3NwZWN0aW9uU3RhZ2Uoc25hcC5wcm9ncmVzc0xhYmVsKTtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuaW5nZXN0aW9uLnBvc3RJbnRyb3NwZWN0aW9uLnRva2Vuc0luID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNuYXAudG9rZW5zSW4gPz8gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuaW5nZXN0aW9uLnBvc3RJbnRyb3NwZWN0aW9uLnRva2Vuc091dCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBzbmFwLnRva2Vuc091dCA/PyBudWxsO1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5pbmdlc3Rpb24ucG9zdEludHJvc3BlY3Rpb24uY29sdW1uc0RvbmUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgc25hcC5jb2x1bW5zRG9uZSA/PyBudWxsO1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5pbmdlc3Rpb24ucG9zdEludHJvc3BlY3Rpb24uY29sdW1uc1RvdGFsID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNuYXAuY29sdW1uc1RvdGFsID8/IG51bGw7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICBpZiAoc25hcHNob3Quc3RhdHVzID09PSAnZmFpbGVkJykge1xuICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLmluZ2VzdGlvbi5wb3N0SW50cm9zcGVjdGlvbi5zdGF0ZSA9ICdlcnJvcic7XG4gICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuaW5nZXN0aW9uLnBvc3RJbnRyb3NwZWN0aW9uLmVycm9yID1cbiAgICAgICAgICAgICAgICAgICAgc25hcHNob3QuZXJyb3IgPz8gJ3Bvc3QtaW50cm9zcGVjdGlvbiBmYWlsZWQnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5pbmdlc3Rpb24ucG9zdEludHJvc3BlY3Rpb24uc3RhdGUgPSAnZG9uZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBzbmFwc2hvdDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3QgbXNnID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICBzdG9yZS5zdGVwcy5pbmdlc3Rpb24ucG9zdEludHJvc3BlY3Rpb24uc3RhdGUgPSAnZXJyb3InO1xuICAgICAgICAgICAgc3RvcmUuc3RlcHMuaW5nZXN0aW9uLnBvc3RJbnRyb3NwZWN0aW9uLmVycm9yID0gbXNnO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbn07XG5cbi8vIFRyaWdnZXJzIHBvc3Qtc2FtcGxpbmcgKHNlcnZlciBza2lwcyByZS1lbnF1ZXVlIGlmIGFscmVhZHkgYW5hbHl6ZWQpIGFuZCBiaW5kc1xuLy8gcHJvZ3Jlc3MgKyB0ZXJtaW5hbCBzdGF0ZSBvbnRvIHN0b3JlLnN0ZXBzLmluZ2VzdGlvbi5wb3N0U2FtcGxpbmcuXG5leHBvcnQgY29uc3QgZGlzcGF0Y2hBbmRTdHJlYW1Qb3N0U2FtcGxpbmcgPSBhc3luYyAoXG4gICAgYXV0aGVkOiBUUlBDQ2xpZW50PFRBcHBSb3V0ZXI+LFxuICAgIHJldmlzaW9uSWQ6IHN0cmluZyxcbiAgICBzdG9yZTogVFN0b3JlLFxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICBpZiAoc3RvcmUuc3RlcHMuaW5nZXN0aW9uLnBvc3RTYW1wbGluZy5zdGF0ZSA9PT0gJ2lkbGUnKSB7XG4gICAgICAgICAgICBzdG9yZS5zdGVwcy5pbmdlc3Rpb24ucG9zdFNhbXBsaW5nLnN0YXRlID0gJ3F1ZXVlZCc7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGF1dGhlZC5yZXZpc2lvbnMucnVuUG9zdFNhbXBsaW5nLm11dGF0ZSh7cmV2aXNpb25JZH0pO1xuXG4gICAgaWYgKHJlc3VsdC5hbHJlYWR5QW5hbHl6ZWQpIHtcbiAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYyA9IHN0b3JlLnN0ZXBzLmluZ2VzdGlvbi5wb3N0U2FtcGxpbmc7XG4gICAgICAgICAgICBjLnN0YXRlID0gJ2RvbmUnO1xuICAgICAgICAgICAgYy5qb2JJZCA9IG51bGw7XG4gICAgICAgICAgICBjLnJldXNlZCA9IHRydWU7XG4gICAgICAgICAgICBjLmNvdW50cy50b3RhbFRhYmxlcyA9IHJlc3VsdC5jb3VudHMudG90YWxUYWJsZXM7XG4gICAgICAgICAgICBjLmNvdW50cy5mb3JlaWduS2V5c0ZvdW5kID0gcmVzdWx0LmNvdW50cy5mb3JlaWduS2V5cztcbiAgICAgICAgfSk7XG4gICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgYHBvc3Qtc2FtcGxpbmcgcmV1c2VkIGZvciByZXZpc2lvbj0ke3JldmlzaW9uSWR9ICh0YWJsZXM9JHtyZXN1bHQuY291bnRzLnRvdGFsVGFibGVzfSBma3M9JHtyZXN1bHQuY291bnRzLmZvcmVpZ25LZXlzfSlgLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qge2pvYklkfSA9IHJlc3VsdDtcbiAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgIHN0b3JlLnN0ZXBzLmluZ2VzdGlvbi5wb3N0U2FtcGxpbmcuam9iSWQgPSBqb2JJZDtcbiAgICAgICAgc3RvcmUuc3RlcHMuaW5nZXN0aW9uLnBvc3RTYW1wbGluZy5zdGF0ZSA9ICdydW5uaW5nJztcbiAgICB9KTtcblxuICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgc3RyZWFtSm9iKGF1dGhlZCwgam9iSWQsIHtcbiAgICAgICAgb25Qcm9ncmVzczogKHNuYXApID0+IHtcbiAgICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjID0gc3RvcmUuc3RlcHMuaW5nZXN0aW9uLnBvc3RTYW1wbGluZztcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0ID0gcGFyc2VQb3N0U2FtcGxpbmdMYWJlbChzbmFwLnByb2dyZXNzTGFiZWwsIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhZ2U6IGMuc3RhZ2UsXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsVGFibGVzOiBjLmNvdW50cy50b3RhbFRhYmxlcyxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmVkVGFibGVzOiBjLmNvdW50cy5kZXNjcmliZWRUYWJsZXMsXG4gICAgICAgICAgICAgICAgICAgIGVtYmVkZGVkVGFibGVzOiBjLmNvdW50cy5lbWJlZGRlZFRhYmxlcyxcbiAgICAgICAgICAgICAgICAgICAgdG90YWxFbWJlZGRpbmdzOiBjLmNvdW50cy50b3RhbEVtYmVkZGluZ3MsXG4gICAgICAgICAgICAgICAgICAgIHNjYW5uZWRUYWJsZXM6IGMuY291bnRzLnNjYW5uZWRUYWJsZXMsXG4gICAgICAgICAgICAgICAgICAgIGZvcmVpZ25LZXlzRm91bmQ6IGMuY291bnRzLmZvcmVpZ25LZXlzRm91bmQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKG5leHQuc3RhZ2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgYy5zdGFnZSA9IG5leHQuc3RhZ2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChuZXh0LnRvdGFsVGFibGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYy5jb3VudHMudG90YWxUYWJsZXMgPSBuZXh0LnRvdGFsVGFibGVzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobmV4dC5kZXNjcmliZWRUYWJsZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBjLmNvdW50cy5kZXNjcmliZWRUYWJsZXMgPSBuZXh0LmRlc2NyaWJlZFRhYmxlcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5leHQuZW1iZWRkZWRUYWJsZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBjLmNvdW50cy5lbWJlZGRlZFRhYmxlcyA9IG5leHQuZW1iZWRkZWRUYWJsZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChuZXh0LnRvdGFsRW1iZWRkaW5ncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGMuY291bnRzLnRvdGFsRW1iZWRkaW5ncyA9IG5leHQudG90YWxFbWJlZGRpbmdzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobmV4dC5zY2FubmVkVGFibGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYy5jb3VudHMuc2Nhbm5lZFRhYmxlcyA9IG5leHQuc2Nhbm5lZFRhYmxlcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5leHQuZm9yZWlnbktleXNGb3VuZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGMuY291bnRzLmZvcmVpZ25LZXlzRm91bmQgPSBuZXh0LmZvcmVpZ25LZXlzRm91bmQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgIGlmIChzbmFwc2hvdC5zdGF0dXMgPT09ICdmYWlsZWQnKSB7XG4gICAgICAgICAgICBzdG9yZS5zdGVwcy5pbmdlc3Rpb24ucG9zdFNhbXBsaW5nLnN0YXRlID0gJ2Vycm9yJztcbiAgICAgICAgICAgIHN0b3JlLnN0ZXBzLmluZ2VzdGlvbi5wb3N0U2FtcGxpbmcuZXJyb3IgPVxuICAgICAgICAgICAgICAgIHNuYXBzaG90LmVycm9yID8/ICdwb3N0LXNhbXBsaW5nIGpvYiBmYWlsZWQnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RvcmUuc3RlcHMuaW5nZXN0aW9uLnBvc3RTYW1wbGluZy5zdGF0ZSA9ICdkb25lJztcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHNuYXBzaG90LnN0YXR1cyA9PT0gJ2ZhaWxlZCcpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgYHBvc3Qtc2FtcGxpbmcgam9iIGZhaWxlZDogJHtzbmFwc2hvdC5lcnJvciA/PyAndW5rbm93bid9YCxcbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuaW5mbyhgcG9zdC1zYW1wbGluZyBkb25lIGZvciByZXZpc2lvbj0ke3JldmlzaW9uSWR9YCk7XG4gICAgfVxufTtcblxuLy8gU2VxdWVudGlhbCB0YWlsIG9mIGEgc2VydmVyLXNpZGUgcmV2aXNpb246IHBvc3QtaW50cm9zcGVjdGlvbiBmaXJzdCBpZiBzdGlsbCBydW5uaW5nLFxuLy8gdGhlbiBwb3N0LXNhbXBsaW5nLiBVc2VkIGJ5IHRoZSBsaXN0LXN1YmNvbW1hbmQgZmxvdyBhZnRlciB0aGUgdXNlciBwaWNrcyBhXG4vLyBkYXRhYmFzZSB0byBtb25pdG9yLiBDYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIHByZS1maWxsaW5nIHRoZSB1cHN0cmVhbVxuLy8gc3RvcmUgc3RlcHMgKGludHJvc3BlY3Rpb24vc2FtcGxpbmcvc2FtcGxlcykgdG8gdGhlaXIgJ3NraXBwZWQnIHN0YXRlcy5cbi8vXG4vLyBBbHdheXMgY2FsbHMgZGlzcGF0Y2hBbmRTdHJlYW1Qb3N0U2FtcGxpbmcgZXZlbiB3aGVuIHBvc3Qtc2FtcGxpbmcgaXMgYWxyZWFkeSBjb21wbGV0ZVxuLy8gc2VydmVyLXNpZGUg4oCUIHJ1blBvc3RTYW1wbGluZyBpcyBpZGVtcG90ZW50IChgYWxyZWFkeUFuYWx5emVkOiB0cnVlYCBzaG9ydC1jaXJjdWl0KVxuLy8gYW5kIGlzIHRoZSBvbmx5IHdheSB0byBwb3B1bGF0ZSB0aGUgcmVsYXRpb25zL2ZvcmVpZ24ta2V5cyBjb3VudHMgdGhlIFVJXG4vLyByZW5kZXJzLiBTa2lwcGluZyBpdCBoZXJlIHdvdWxkIGxlYXZlIHRoZSBhbmFseXplIGxpbmUgc2hvd2luZyBcIjAgdGFibGVzLFxuLy8gMCBmb3JlaWduIGtleXNcIi5cbmV4cG9ydCBjb25zdCB0YWlsUmV2aXNpb24gPSBhc3luYyAoYXJnczoge1xuICAgIGF1dGhlZDogVFJQQ0NsaWVudDxUQXBwUm91dGVyPjtcbiAgICByZXZpc2lvbklkOiBzdHJpbmc7XG4gICAgc3RvcmU6IFRTdG9yZTtcbiAgICBwb3N0SW50cm9zcGVjdGlvbkRvbmU6IGJvb2xlYW47XG59KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3Qge2F1dGhlZCwgcmV2aXNpb25JZCwgc3RvcmUsIHBvc3RJbnRyb3NwZWN0aW9uRG9uZX0gPSBhcmdzO1xuXG4gICAgaWYgKCFwb3N0SW50cm9zcGVjdGlvbkRvbmUpIHtcbiAgICAgICAgLy8gRnVubmVsIHRocm91Z2ggZW5zdXJlUG9zdEludHJvc3BlY3Rpb24gKHJhdGhlciB0aGFuIGRlcml2aW5nIHRoZSBkZXRlcm1pbmlzdGljXG4gICAgICAgIC8vIGpvYiBJRCBpbmxpbmUpIHNvIHRoZSBzZXJ2ZXIgY2FuIHdpcGUgYW55IHByaW9yIGZhaWxlZCBwb3N0LWludHJvc3BlY3Rpb24gYW5kXG4gICAgICAgIC8vIGhhbmQgYmFjayBhIGZyZXNoIGpvYiBJRC4gV2l0aG91dCB0aGlzLCBhIGZhaWxlZCBwb3N0LWludHJvc3BlY3Rpb24gY2F1Z2h0IGJ5XG4gICAgICAgIC8vIHRoZSBsaXN0IGZsb3cgd291bGQganVzdCBzdHJlYW0gYmFjayB0aGUgc2FtZSBkZWFkIHNuYXBzaG90LlxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhdXRoZWQucmV2aXNpb25zLmVuc3VyZVBvc3RJbnRyb3NwZWN0aW9uLm11dGF0ZSh7XG4gICAgICAgICAgICByZXZpc2lvbklkLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3VsdC5hbHJlYWR5RW5yaWNoZWQpIHtcbiAgICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5pbmdlc3Rpb24ucG9zdEludHJvc3BlY3Rpb24uc3RhdGUgPSAnZG9uZSc7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5pbmdlc3Rpb24ucG9zdEludHJvc3BlY3Rpb24uam9iSWQgPSByZXN1bHQuam9iSWQ7XG4gICAgICAgICAgICAgICAgaWYgKHN0b3JlLnN0ZXBzLmluZ2VzdGlvbi5wb3N0SW50cm9zcGVjdGlvbi5zdGF0ZSA9PT0gJ2lkbGUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLmluZ2VzdGlvbi5wb3N0SW50cm9zcGVjdGlvbi5zdGF0ZSA9ICdxdWV1ZWQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3Qgc25hcCA9IGF3YWl0IHN0cmVhbVBvc3RJbnRyb3NwZWN0aW9uKFxuICAgICAgICAgICAgICAgIGF1dGhlZCxcbiAgICAgICAgICAgICAgICByZXN1bHQuam9iSWQsXG4gICAgICAgICAgICAgICAgc3RvcmUsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHNuYXAuc3RhdHVzID09PSAnZmFpbGVkJykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IGRpc3BhdGNoQW5kU3RyZWFtUG9zdFNhbXBsaW5nKGF1dGhlZCwgcmV2aXNpb25JZCwgc3RvcmUpO1xufTtcbiJdfQ==
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Pool } from 'pg';
|
|
2
|
+
export type TCheckConstraintInfo = {
|
|
3
|
+
relation_name: string;
|
|
4
|
+
name: string;
|
|
5
|
+
expression: string;
|
|
6
|
+
is_valid: boolean;
|
|
7
|
+
};
|
|
8
|
+
export declare const fetchPublicCheckConstraints: (pool: Pool) => Promise<TCheckConstraintInfo[]>;
|
|
9
|
+
//# sourceMappingURL=check-constraints.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-constraints.d.mts","sourceRoot":"./src/","sources":["db/check-constraints.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,IAAI,CAAC;AAE7B,MAAM,MAAM,oBAAoB,GAAG;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,2BAA2B,GACpC,MAAM,IAAI,KACX,OAAO,CAAC,oBAAoB,EAAE,CAgBhC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export const fetchPublicCheckConstraints = async (pool) => {
|
|
2
|
+
const result = await pool.query(`
|
|
3
|
+
SELECT
|
|
4
|
+
t.relname AS relation_name,
|
|
5
|
+
con.conname AS name,
|
|
6
|
+
pg_get_constraintdef(con.oid, true) AS expression,
|
|
7
|
+
con.convalidated AS is_valid
|
|
8
|
+
FROM pg_catalog.pg_constraint con
|
|
9
|
+
JOIN pg_catalog.pg_class t ON t.oid = con.conrelid
|
|
10
|
+
JOIN pg_catalog.pg_namespace n ON n.oid = t.relnamespace
|
|
11
|
+
WHERE n.nspname = 'public'
|
|
12
|
+
AND con.contype = 'c'
|
|
13
|
+
ORDER BY t.relname, con.conname
|
|
14
|
+
`);
|
|
15
|
+
return result.rows;
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2stY29uc3RyYWludHMubWpzIiwic291cmNlUm9vdCI6Ii4vc3JjLyIsInNvdXJjZXMiOlsiZGIvY2hlY2stY29uc3RyYWludHMubXRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVNBLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLEtBQUssRUFDNUMsSUFBVSxFQUNxQixFQUFFO0lBQ2pDLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBdUI7Ozs7Ozs7Ozs7OztLQVlyRCxDQUFDLENBQUM7SUFFSCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFDdkIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1Bvb2x9IGZyb20gJ3BnJztcblxuZXhwb3J0IHR5cGUgVENoZWNrQ29uc3RyYWludEluZm8gPSB7XG4gICAgcmVsYXRpb25fbmFtZTogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBleHByZXNzaW9uOiBzdHJpbmc7XG4gICAgaXNfdmFsaWQ6IGJvb2xlYW47XG59O1xuXG5leHBvcnQgY29uc3QgZmV0Y2hQdWJsaWNDaGVja0NvbnN0cmFpbnRzID0gYXN5bmMgKFxuICAgIHBvb2w6IFBvb2wsXG4pOiBQcm9taXNlPFRDaGVja0NvbnN0cmFpbnRJbmZvW10+ID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwb29sLnF1ZXJ5PFRDaGVja0NvbnN0cmFpbnRJbmZvPihgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgICAgdC5yZWxuYW1lIEFTIHJlbGF0aW9uX25hbWUsXG4gICAgICAgICAgICBjb24uY29ubmFtZSBBUyBuYW1lLFxuICAgICAgICAgICAgcGdfZ2V0X2NvbnN0cmFpbnRkZWYoY29uLm9pZCwgdHJ1ZSkgQVMgZXhwcmVzc2lvbixcbiAgICAgICAgICAgIGNvbi5jb252YWxpZGF0ZWQgQVMgaXNfdmFsaWRcbiAgICAgICAgRlJPTSBwZ19jYXRhbG9nLnBnX2NvbnN0cmFpbnQgY29uXG4gICAgICAgIEpPSU4gcGdfY2F0YWxvZy5wZ19jbGFzcyB0IE9OIHQub2lkID0gY29uLmNvbnJlbGlkXG4gICAgICAgIEpPSU4gcGdfY2F0YWxvZy5wZ19uYW1lc3BhY2UgbiBPTiBuLm9pZCA9IHQucmVsbmFtZXNwYWNlXG4gICAgICAgIFdIRVJFIG4ubnNwbmFtZSA9ICdwdWJsaWMnXG4gICAgICAgICAgICBBTkQgY29uLmNvbnR5cGUgPSAnYydcbiAgICAgICAgT1JERVIgQlkgdC5yZWxuYW1lLCBjb24uY29ubmFtZVxuICAgIGApO1xuXG4gICAgcmV0dXJuIHJlc3VsdC5yb3dzO1xufTtcbiJdfQ==
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Pool } from 'pg';
|
|
2
|
+
export type TCustomTypeKind = 'composite' | 'domain';
|
|
3
|
+
export type TDomainInfo = {
|
|
4
|
+
kind: 'domain';
|
|
5
|
+
name: string;
|
|
6
|
+
base_type: string;
|
|
7
|
+
not_null: boolean;
|
|
8
|
+
default_expression: string | null;
|
|
9
|
+
check_constraints: readonly {
|
|
10
|
+
name: string;
|
|
11
|
+
expression: string;
|
|
12
|
+
}[];
|
|
13
|
+
};
|
|
14
|
+
export type TCompositeAttribute = {
|
|
15
|
+
name: string;
|
|
16
|
+
type: string;
|
|
17
|
+
position: number;
|
|
18
|
+
};
|
|
19
|
+
export type TCompositeInfo = {
|
|
20
|
+
kind: 'composite';
|
|
21
|
+
name: string;
|
|
22
|
+
attributes: readonly TCompositeAttribute[];
|
|
23
|
+
};
|
|
24
|
+
export type TCustomTypeInfo = TDomainInfo | TCompositeInfo;
|
|
25
|
+
export declare const fetchPublicCustomTypes: (pool: Pool) => Promise<TCustomTypeInfo[]>;
|
|
26
|
+
//# sourceMappingURL=custom-types.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-types.d.mts","sourceRoot":"./src/","sources":["db/custom-types.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,IAAI,CAAC;AAE7B,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,QAAQ,CAAC;AAErD,MAAM,MAAM,WAAW,GAAG;IACtB,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,iBAAiB,EAAE,SAAS;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAC,EAAE,CAAC;CACpE,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IACzB,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,SAAS,mBAAmB,EAAE,CAAC;CAC9C,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,cAAc,CAAC;AAe3D,eAAO,MAAM,sBAAsB,GAC/B,MAAM,IAAI,KACX,OAAO,CAAC,eAAe,EAAE,CA8D3B,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export const fetchPublicCustomTypes = async (pool) => {
|
|
2
|
+
const [domains, composites] = await Promise.all([
|
|
3
|
+
pool.query(`
|
|
4
|
+
SELECT
|
|
5
|
+
t.typname AS name,
|
|
6
|
+
format_type(t.typbasetype, t.typtypmod) AS base_type,
|
|
7
|
+
t.typnotnull AS not_null,
|
|
8
|
+
t.typdefault AS default_expression,
|
|
9
|
+
(
|
|
10
|
+
SELECT json_agg(json_build_object(
|
|
11
|
+
'name', con.conname,
|
|
12
|
+
'expression', pg_get_constraintdef(con.oid, true)
|
|
13
|
+
) ORDER BY con.conname)
|
|
14
|
+
FROM pg_catalog.pg_constraint con
|
|
15
|
+
WHERE con.contypid = t.oid
|
|
16
|
+
) AS check_constraints
|
|
17
|
+
FROM pg_catalog.pg_type t
|
|
18
|
+
JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace
|
|
19
|
+
WHERE n.nspname = 'public'
|
|
20
|
+
AND t.typtype = 'd'
|
|
21
|
+
ORDER BY t.typname
|
|
22
|
+
`),
|
|
23
|
+
pool.query(`
|
|
24
|
+
SELECT
|
|
25
|
+
t.typname AS name,
|
|
26
|
+
(
|
|
27
|
+
SELECT json_agg(json_build_object(
|
|
28
|
+
'name', a.attname,
|
|
29
|
+
'type', format_type(a.atttypid, a.atttypmod),
|
|
30
|
+
'position', a.attnum
|
|
31
|
+
) ORDER BY a.attnum)
|
|
32
|
+
FROM pg_catalog.pg_attribute a
|
|
33
|
+
WHERE a.attrelid = t.typrelid
|
|
34
|
+
AND a.attnum > 0
|
|
35
|
+
AND NOT a.attisdropped
|
|
36
|
+
) AS attributes
|
|
37
|
+
FROM pg_catalog.pg_type t
|
|
38
|
+
JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace
|
|
39
|
+
JOIN pg_catalog.pg_class c ON c.oid = t.typrelid
|
|
40
|
+
WHERE n.nspname = 'public'
|
|
41
|
+
AND t.typtype = 'c'
|
|
42
|
+
AND c.relkind = 'c'
|
|
43
|
+
ORDER BY t.typname
|
|
44
|
+
`),
|
|
45
|
+
]);
|
|
46
|
+
const domainInfos = domains.rows.map((r) => ({
|
|
47
|
+
kind: 'domain',
|
|
48
|
+
name: r.name,
|
|
49
|
+
base_type: r.base_type,
|
|
50
|
+
not_null: r.not_null,
|
|
51
|
+
default_expression: r.default_expression,
|
|
52
|
+
check_constraints: r.check_constraints ?? [],
|
|
53
|
+
}));
|
|
54
|
+
const compositeInfos = composites.rows.map((r) => ({
|
|
55
|
+
kind: 'composite',
|
|
56
|
+
name: r.name,
|
|
57
|
+
attributes: r.attributes ?? [],
|
|
58
|
+
}));
|
|
59
|
+
return [...domainInfos, ...compositeInfos];
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLXR5cGVzLm1qcyIsInNvdXJjZVJvb3QiOiIuL3NyYy8iLCJzb3VyY2VzIjpbImRiL2N1c3RvbS10eXBlcy5tdHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBd0NBLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLEtBQUssRUFDdkMsSUFBVSxFQUNnQixFQUFFO0lBQzVCLE1BQU0sQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQzVDLElBQUksQ0FBQyxLQUFLLENBQWE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7U0FtQnRCLENBQUM7UUFDRixJQUFJLENBQUMsS0FBSyxDQUFnQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1NBcUJ6QixDQUFDO0tBQ0wsQ0FBQyxDQUFDO0lBRUgsTUFBTSxXQUFXLEdBQWtCLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELElBQUksRUFBRSxRQUFRO1FBQ2QsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO1FBQ1osU0FBUyxFQUFFLENBQUMsQ0FBQyxTQUFTO1FBQ3RCLFFBQVEsRUFBRSxDQUFDLENBQUMsUUFBUTtRQUNwQixrQkFBa0IsRUFBRSxDQUFDLENBQUMsa0JBQWtCO1FBQ3hDLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxpQkFBaUIsSUFBSSxFQUFFO0tBQy9DLENBQUMsQ0FBQyxDQUFDO0lBRUosTUFBTSxjQUFjLEdBQXFCLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pFLElBQUksRUFBRSxXQUFXO1FBQ2pCLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSTtRQUNaLFVBQVUsRUFBRSxDQUFDLENBQUMsVUFBVSxJQUFJLEVBQUU7S0FDakMsQ0FBQyxDQUFDLENBQUM7SUFFSixPQUFPLENBQUMsR0FBRyxXQUFXLEVBQUUsR0FBRyxjQUFjLENBQUMsQ0FBQztBQUMvQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7UG9vbH0gZnJvbSAncGcnO1xuXG5leHBvcnQgdHlwZSBUQ3VzdG9tVHlwZUtpbmQgPSAnY29tcG9zaXRlJyB8ICdkb21haW4nO1xuXG5leHBvcnQgdHlwZSBURG9tYWluSW5mbyA9IHtcbiAgICBraW5kOiAnZG9tYWluJztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgYmFzZV90eXBlOiBzdHJpbmc7XG4gICAgbm90X251bGw6IGJvb2xlYW47XG4gICAgZGVmYXVsdF9leHByZXNzaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIGNoZWNrX2NvbnN0cmFpbnRzOiByZWFkb25seSB7bmFtZTogc3RyaW5nOyBleHByZXNzaW9uOiBzdHJpbmd9W107XG59O1xuXG5leHBvcnQgdHlwZSBUQ29tcG9zaXRlQXR0cmlidXRlID0ge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgcG9zaXRpb246IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFRDb21wb3NpdGVJbmZvID0ge1xuICAgIGtpbmQ6ICdjb21wb3NpdGUnO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBhdHRyaWJ1dGVzOiByZWFkb25seSBUQ29tcG9zaXRlQXR0cmlidXRlW107XG59O1xuXG5leHBvcnQgdHlwZSBUQ3VzdG9tVHlwZUluZm8gPSBURG9tYWluSW5mbyB8IFRDb21wb3NpdGVJbmZvO1xuXG50eXBlIFREb21haW5Sb3cgPSB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGJhc2VfdHlwZTogc3RyaW5nO1xuICAgIG5vdF9udWxsOiBib29sZWFuO1xuICAgIGRlZmF1bHRfZXhwcmVzc2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICBjaGVja19jb25zdHJhaW50czogcmVhZG9ubHkge25hbWU6IHN0cmluZzsgZXhwcmVzc2lvbjogc3RyaW5nfVtdIHwgbnVsbDtcbn07XG5cbnR5cGUgVENvbXBvc2l0ZVJvdyA9IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgYXR0cmlidXRlczogcmVhZG9ubHkgVENvbXBvc2l0ZUF0dHJpYnV0ZVtdIHwgbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBmZXRjaFB1YmxpY0N1c3RvbVR5cGVzID0gYXN5bmMgKFxuICAgIHBvb2w6IFBvb2wsXG4pOiBQcm9taXNlPFRDdXN0b21UeXBlSW5mb1tdPiA9PiB7XG4gICAgY29uc3QgW2RvbWFpbnMsIGNvbXBvc2l0ZXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBwb29sLnF1ZXJ5PFREb21haW5Sb3c+KGBcbiAgICAgICAgICAgIFNFTEVDVFxuICAgICAgICAgICAgICAgIHQudHlwbmFtZSBBUyBuYW1lLFxuICAgICAgICAgICAgICAgIGZvcm1hdF90eXBlKHQudHlwYmFzZXR5cGUsIHQudHlwdHlwbW9kKSBBUyBiYXNlX3R5cGUsXG4gICAgICAgICAgICAgICAgdC50eXBub3RudWxsIEFTIG5vdF9udWxsLFxuICAgICAgICAgICAgICAgIHQudHlwZGVmYXVsdCBBUyBkZWZhdWx0X2V4cHJlc3Npb24sXG4gICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICBTRUxFQ1QganNvbl9hZ2coanNvbl9idWlsZF9vYmplY3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAnbmFtZScsIGNvbi5jb25uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2V4cHJlc3Npb24nLCBwZ19nZXRfY29uc3RyYWludGRlZihjb24ub2lkLCB0cnVlKVxuICAgICAgICAgICAgICAgICAgICApIE9SREVSIEJZIGNvbi5jb25uYW1lKVxuICAgICAgICAgICAgICAgICAgICBGUk9NIHBnX2NhdGFsb2cucGdfY29uc3RyYWludCBjb25cbiAgICAgICAgICAgICAgICAgICAgV0hFUkUgY29uLmNvbnR5cGlkID0gdC5vaWRcbiAgICAgICAgICAgICAgICApIEFTIGNoZWNrX2NvbnN0cmFpbnRzXG4gICAgICAgICAgICBGUk9NIHBnX2NhdGFsb2cucGdfdHlwZSB0XG4gICAgICAgICAgICBKT0lOIHBnX2NhdGFsb2cucGdfbmFtZXNwYWNlIG4gT04gbi5vaWQgPSB0LnR5cG5hbWVzcGFjZVxuICAgICAgICAgICAgV0hFUkUgbi5uc3BuYW1lID0gJ3B1YmxpYydcbiAgICAgICAgICAgICAgICBBTkQgdC50eXB0eXBlID0gJ2QnXG4gICAgICAgICAgICBPUkRFUiBCWSB0LnR5cG5hbWVcbiAgICAgICAgYCksXG4gICAgICAgIHBvb2wucXVlcnk8VENvbXBvc2l0ZVJvdz4oYFxuICAgICAgICAgICAgU0VMRUNUXG4gICAgICAgICAgICAgICAgdC50eXBuYW1lIEFTIG5hbWUsXG4gICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICBTRUxFQ1QganNvbl9hZ2coanNvbl9idWlsZF9vYmplY3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAnbmFtZScsIGEuYXR0bmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJywgZm9ybWF0X3R5cGUoYS5hdHR0eXBpZCwgYS5hdHR0eXBtb2QpLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3Bvc2l0aW9uJywgYS5hdHRudW1cbiAgICAgICAgICAgICAgICAgICAgKSBPUkRFUiBCWSBhLmF0dG51bSlcbiAgICAgICAgICAgICAgICAgICAgRlJPTSBwZ19jYXRhbG9nLnBnX2F0dHJpYnV0ZSBhXG4gICAgICAgICAgICAgICAgICAgIFdIRVJFIGEuYXR0cmVsaWQgPSB0LnR5cHJlbGlkXG4gICAgICAgICAgICAgICAgICAgICAgICBBTkQgYS5hdHRudW0gPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICBBTkQgTk9UIGEuYXR0aXNkcm9wcGVkXG4gICAgICAgICAgICAgICAgKSBBUyBhdHRyaWJ1dGVzXG4gICAgICAgICAgICBGUk9NIHBnX2NhdGFsb2cucGdfdHlwZSB0XG4gICAgICAgICAgICBKT0lOIHBnX2NhdGFsb2cucGdfbmFtZXNwYWNlIG4gT04gbi5vaWQgPSB0LnR5cG5hbWVzcGFjZVxuICAgICAgICAgICAgSk9JTiBwZ19jYXRhbG9nLnBnX2NsYXNzIGMgT04gYy5vaWQgPSB0LnR5cHJlbGlkXG4gICAgICAgICAgICBXSEVSRSBuLm5zcG5hbWUgPSAncHVibGljJ1xuICAgICAgICAgICAgICAgIEFORCB0LnR5cHR5cGUgPSAnYydcbiAgICAgICAgICAgICAgICBBTkQgYy5yZWxraW5kID0gJ2MnXG4gICAgICAgICAgICBPUkRFUiBCWSB0LnR5cG5hbWVcbiAgICAgICAgYCksXG4gICAgXSk7XG5cbiAgICBjb25zdCBkb21haW5JbmZvczogVERvbWFpbkluZm9bXSA9IGRvbWFpbnMucm93cy5tYXAoKHIpID0+ICh7XG4gICAgICAgIGtpbmQ6ICdkb21haW4nLFxuICAgICAgICBuYW1lOiByLm5hbWUsXG4gICAgICAgIGJhc2VfdHlwZTogci5iYXNlX3R5cGUsXG4gICAgICAgIG5vdF9udWxsOiByLm5vdF9udWxsLFxuICAgICAgICBkZWZhdWx0X2V4cHJlc3Npb246IHIuZGVmYXVsdF9leHByZXNzaW9uLFxuICAgICAgICBjaGVja19jb25zdHJhaW50czogci5jaGVja19jb25zdHJhaW50cyA/PyBbXSxcbiAgICB9KSk7XG5cbiAgICBjb25zdCBjb21wb3NpdGVJbmZvczogVENvbXBvc2l0ZUluZm9bXSA9IGNvbXBvc2l0ZXMucm93cy5tYXAoKHIpID0+ICh7XG4gICAgICAgIGtpbmQ6ICdjb21wb3NpdGUnLFxuICAgICAgICBuYW1lOiByLm5hbWUsXG4gICAgICAgIGF0dHJpYnV0ZXM6IHIuYXR0cmlidXRlcyA/PyBbXSxcbiAgICB9KSk7XG5cbiAgICByZXR1cm4gWy4uLmRvbWFpbkluZm9zLCAuLi5jb21wb3NpdGVJbmZvc107XG59O1xuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extensions.d.mts","sourceRoot":"./src/","sources":["db/extensions.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,IAAI,CAAC;AAE7B,MAAM,MAAM,cAAc,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACjC,MAAM,IAAI,KACX,OAAO,CAAC,cAAc,EAAE,CAa1B,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export const fetchInstalledExtensions = async (pool) => {
|
|
2
|
+
const result = await pool.query(`
|
|
3
|
+
SELECT
|
|
4
|
+
e.extname AS name,
|
|
5
|
+
e.extversion AS version,
|
|
6
|
+
n.nspname AS schema
|
|
7
|
+
FROM pg_catalog.pg_extension e
|
|
8
|
+
JOIN pg_catalog.pg_namespace n ON n.oid = e.extnamespace
|
|
9
|
+
WHERE e.extname <> 'plpgsql'
|
|
10
|
+
ORDER BY e.extname
|
|
11
|
+
`);
|
|
12
|
+
return result.rows;
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5zaW9ucy5tanMiLCJzb3VyY2VSb290IjoiLi9zcmMvIiwic291cmNlcyI6WyJkYi9leHRlbnNpb25zLm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFRQSxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxLQUFLLEVBQ3pDLElBQVUsRUFDZSxFQUFFO0lBQzNCLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBaUI7Ozs7Ozs7OztLQVMvQyxDQUFDLENBQUM7SUFFSCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFDdkIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1Bvb2x9IGZyb20gJ3BnJztcblxuZXhwb3J0IHR5cGUgVEV4dGVuc2lvbkluZm8gPSB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgICBzY2hlbWE6IHN0cmluZztcbn07XG5cbmV4cG9ydCBjb25zdCBmZXRjaEluc3RhbGxlZEV4dGVuc2lvbnMgPSBhc3luYyAoXG4gICAgcG9vbDogUG9vbCxcbik6IFByb21pc2U8VEV4dGVuc2lvbkluZm9bXT4gPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBvb2wucXVlcnk8VEV4dGVuc2lvbkluZm8+KGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgICBlLmV4dG5hbWUgQVMgbmFtZSxcbiAgICAgICAgICAgIGUuZXh0dmVyc2lvbiBBUyB2ZXJzaW9uLFxuICAgICAgICAgICAgbi5uc3BuYW1lIEFTIHNjaGVtYVxuICAgICAgICBGUk9NIHBnX2NhdGFsb2cucGdfZXh0ZW5zaW9uIGVcbiAgICAgICAgSk9JTiBwZ19jYXRhbG9nLnBnX25hbWVzcGFjZSBuIE9OIG4ub2lkID0gZS5leHRuYW1lc3BhY2VcbiAgICAgICAgV0hFUkUgZS5leHRuYW1lIDw+ICdwbHBnc3FsJ1xuICAgICAgICBPUkRFUiBCWSBlLmV4dG5hbWVcbiAgICBgKTtcblxuICAgIHJldHVybiByZXN1bHQucm93cztcbn07XG4iXX0=
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Pool } from 'pg';
|
|
2
|
+
export type TFunctionInfo = {
|
|
3
|
+
name: string;
|
|
4
|
+
language: string;
|
|
5
|
+
argument_types: string;
|
|
6
|
+
return_type: string;
|
|
7
|
+
definition: string;
|
|
8
|
+
is_trigger: boolean;
|
|
9
|
+
};
|
|
10
|
+
export declare const fetchPublicFunctions: (pool: Pool) => Promise<TFunctionInfo[]>;
|
|
11
|
+
//# sourceMappingURL=functions.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"functions.d.mts","sourceRoot":"./src/","sources":["db/functions.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,IAAI,CAAC;AAE7B,MAAM,MAAM,aAAa,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC7B,MAAM,IAAI,KACX,OAAO,CAAC,aAAa,EAAE,CAsBzB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export const fetchPublicFunctions = async (pool) => {
|
|
2
|
+
const result = await pool.query(`
|
|
3
|
+
SELECT
|
|
4
|
+
p.proname AS name,
|
|
5
|
+
l.lanname AS language,
|
|
6
|
+
pg_get_function_arguments(p.oid) AS argument_types,
|
|
7
|
+
pg_get_function_result(p.oid) AS return_type,
|
|
8
|
+
pg_get_functiondef(p.oid) AS definition,
|
|
9
|
+
p.prorettype = 'trigger'::regtype AS is_trigger
|
|
10
|
+
FROM pg_catalog.pg_proc p
|
|
11
|
+
JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
|
|
12
|
+
JOIN pg_catalog.pg_language l ON l.oid = p.prolang
|
|
13
|
+
WHERE n.nspname = 'public'
|
|
14
|
+
AND p.prokind = 'f'
|
|
15
|
+
AND NOT EXISTS (
|
|
16
|
+
SELECT 1 FROM pg_catalog.pg_depend d
|
|
17
|
+
WHERE d.objid = p.oid AND d.deptype = 'e'
|
|
18
|
+
)
|
|
19
|
+
ORDER BY p.proname
|
|
20
|
+
`);
|
|
21
|
+
return result.rows;
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb25zLm1qcyIsInNvdXJjZVJvb3QiOiIuL3NyYy8iLCJzb3VyY2VzIjpbImRiL2Z1bmN0aW9ucy5tdHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBV0EsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsS0FBSyxFQUNyQyxJQUFVLEVBQ2MsRUFBRTtJQUMxQixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQWdCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7S0FrQjlDLENBQUMsQ0FBQztJQUVILE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQztBQUN2QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7UG9vbH0gZnJvbSAncGcnO1xuXG5leHBvcnQgdHlwZSBURnVuY3Rpb25JbmZvID0ge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBsYW5ndWFnZTogc3RyaW5nO1xuICAgIGFyZ3VtZW50X3R5cGVzOiBzdHJpbmc7XG4gICAgcmV0dXJuX3R5cGU6IHN0cmluZztcbiAgICBkZWZpbml0aW9uOiBzdHJpbmc7XG4gICAgaXNfdHJpZ2dlcjogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBjb25zdCBmZXRjaFB1YmxpY0Z1bmN0aW9ucyA9IGFzeW5jIChcbiAgICBwb29sOiBQb29sLFxuKTogUHJvbWlzZTxURnVuY3Rpb25JbmZvW10+ID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwb29sLnF1ZXJ5PFRGdW5jdGlvbkluZm8+KGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgICBwLnByb25hbWUgQVMgbmFtZSxcbiAgICAgICAgICAgIGwubGFubmFtZSBBUyBsYW5ndWFnZSxcbiAgICAgICAgICAgIHBnX2dldF9mdW5jdGlvbl9hcmd1bWVudHMocC5vaWQpIEFTIGFyZ3VtZW50X3R5cGVzLFxuICAgICAgICAgICAgcGdfZ2V0X2Z1bmN0aW9uX3Jlc3VsdChwLm9pZCkgQVMgcmV0dXJuX3R5cGUsXG4gICAgICAgICAgICBwZ19nZXRfZnVuY3Rpb25kZWYocC5vaWQpIEFTIGRlZmluaXRpb24sXG4gICAgICAgICAgICBwLnByb3JldHR5cGUgPSAndHJpZ2dlcic6OnJlZ3R5cGUgQVMgaXNfdHJpZ2dlclxuICAgICAgICBGUk9NIHBnX2NhdGFsb2cucGdfcHJvYyBwXG4gICAgICAgIEpPSU4gcGdfY2F0YWxvZy5wZ19uYW1lc3BhY2UgbiBPTiBuLm9pZCA9IHAucHJvbmFtZXNwYWNlXG4gICAgICAgIEpPSU4gcGdfY2F0YWxvZy5wZ19sYW5ndWFnZSBsIE9OIGwub2lkID0gcC5wcm9sYW5nXG4gICAgICAgIFdIRVJFIG4ubnNwbmFtZSA9ICdwdWJsaWMnXG4gICAgICAgICAgICBBTkQgcC5wcm9raW5kID0gJ2YnXG4gICAgICAgICAgICBBTkQgTk9UIEVYSVNUUyAoXG4gICAgICAgICAgICAgICAgU0VMRUNUIDEgRlJPTSBwZ19jYXRhbG9nLnBnX2RlcGVuZCBkXG4gICAgICAgICAgICAgICAgV0hFUkUgZC5vYmppZCA9IHAub2lkIEFORCBkLmRlcHR5cGUgPSAnZSdcbiAgICAgICAgICAgIClcbiAgICAgICAgT1JERVIgQlkgcC5wcm9uYW1lXG4gICAgYCk7XG5cbiAgICByZXR1cm4gcmVzdWx0LnJvd3M7XG59O1xuIl19
|
package/dist/db/index.d.mts
CHANGED
|
@@ -7,4 +7,13 @@ export { fetchPostgresVersion, type TPostgresVersion, fetchDatabaseComment, fetc
|
|
|
7
7
|
export { fetchRelationFileStats, type TRelationFileStats, } from './file-stats.mjs';
|
|
8
8
|
export { analyzeRelation } from './analyze.mjs';
|
|
9
9
|
export { fetchRelationStats, type TRelationStats, type TAttributeStats, } from './stats.mjs';
|
|
10
|
+
export { sampleColumn, sampleCompositeSubField, fetchCompositeSubFields, type TSampleStrategy, type TColumnSample, type TCompositeSubField, type TRelationKind, } from './sample.mjs';
|
|
11
|
+
export { fetchPublicCheckConstraints, type TCheckConstraintInfo, } from './check-constraints.mjs';
|
|
12
|
+
export { fetchInstalledExtensions, type TExtensionInfo } from './extensions.mjs';
|
|
13
|
+
export { fetchPublicSequences, type TSequenceInfo } from './sequences.mjs';
|
|
14
|
+
export { fetchPublicTriggers, type TTriggerInfo } from './triggers.mjs';
|
|
15
|
+
export { fetchPublicFunctions, type TFunctionInfo } from './functions.mjs';
|
|
16
|
+
export { fetchPublicCustomTypes, type TCustomTypeInfo, type TDomainInfo, type TCompositeInfo, type TCompositeAttribute, type TCustomTypeKind, } from './custom-types.mjs';
|
|
17
|
+
export { fetchPublicRLS, type TRelationRLS, type TPolicyInfo, type TPolicyCommand, } from './rls.mjs';
|
|
18
|
+
export { fetchPublicPlannerStatistics, type TRelationPlannerStats, type TAttributePlannerStats, type TExtendedStatistic, } from './planner-stats.mjs';
|
|
10
19
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/db/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","sourceRoot":"./src/","sources":["db/index.mts"],"names":[],"mappings":"AAAA,OAAO,EACH,oBAAoB,EACpB,mBAAmB,EACnB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,iBAAiB,GACzB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACH,uBAAuB,EACvB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,cAAc,GACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACH,gBAAgB,EAChB,KAAK,SAAS,EACd,KAAK,aAAa,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAC,oBAAoB,EAAE,KAAK,UAAU,EAAC,MAAM,eAAe,CAAC;AACpE,OAAO,EACH,wBAAwB,EACxB,KAAK,eAAe,GACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACH,oBAAoB,EACpB,KAAK,gBAAgB,EACrB,oBAAoB,EACpB,uBAAuB,EACvB,KAAK,mBAAmB,GAC3B,MAAM,eAAe,CAAC;AACvB,OAAO,EACH,sBAAsB,EACtB,KAAK,kBAAkB,GAC1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAC,eAAe,EAAC,MAAM,eAAe,CAAC;AAC9C,OAAO,EACH,kBAAkB,EAClB,KAAK,cAAc,EACnB,KAAK,eAAe,GACvB,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"./src/","sources":["db/index.mts"],"names":[],"mappings":"AAAA,OAAO,EACH,oBAAoB,EACpB,mBAAmB,EACnB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,iBAAiB,GACzB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACH,uBAAuB,EACvB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,cAAc,GACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACH,gBAAgB,EAChB,KAAK,SAAS,EACd,KAAK,aAAa,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAC,oBAAoB,EAAE,KAAK,UAAU,EAAC,MAAM,eAAe,CAAC;AACpE,OAAO,EACH,wBAAwB,EACxB,KAAK,eAAe,GACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACH,oBAAoB,EACpB,KAAK,gBAAgB,EACrB,oBAAoB,EACpB,uBAAuB,EACvB,KAAK,mBAAmB,GAC3B,MAAM,eAAe,CAAC;AACvB,OAAO,EACH,sBAAsB,EACtB,KAAK,kBAAkB,GAC1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAC,eAAe,EAAC,MAAM,eAAe,CAAC;AAC9C,OAAO,EACH,kBAAkB,EAClB,KAAK,cAAc,EACnB,KAAK,eAAe,GACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EACH,YAAY,EACZ,uBAAuB,EACvB,uBAAuB,EACvB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,aAAa,GACrB,MAAM,cAAc,CAAC;AACtB,OAAO,EACH,2BAA2B,EAC3B,KAAK,oBAAoB,GAC5B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAC,wBAAwB,EAAE,KAAK,cAAc,EAAC,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EAAC,oBAAoB,EAAE,KAAK,aAAa,EAAC,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAC,mBAAmB,EAAE,KAAK,YAAY,EAAC,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAC,oBAAoB,EAAE,KAAK,aAAa,EAAC,MAAM,iBAAiB,CAAC;AACzE,OAAO,EACH,sBAAsB,EACtB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,eAAe,GACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACH,cAAc,EACd,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,cAAc,GACtB,MAAM,WAAW,CAAC;AACnB,OAAO,EACH,4BAA4B,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,GAC1B,MAAM,qBAAqB,CAAC"}
|
package/dist/db/index.mjs
CHANGED
|
@@ -7,4 +7,13 @@ export { fetchPostgresVersion, fetchDatabaseComment, fetchDatabaseIdentifier, }
|
|
|
7
7
|
export { fetchRelationFileStats, } from './file-stats.mjs';
|
|
8
8
|
export { analyzeRelation } from './analyze.mjs';
|
|
9
9
|
export { fetchRelationStats, } from './stats.mjs';
|
|
10
|
-
|
|
10
|
+
export { sampleColumn, sampleCompositeSubField, fetchCompositeSubFields, } from './sample.mjs';
|
|
11
|
+
export { fetchPublicCheckConstraints, } from './check-constraints.mjs';
|
|
12
|
+
export { fetchInstalledExtensions } from './extensions.mjs';
|
|
13
|
+
export { fetchPublicSequences } from './sequences.mjs';
|
|
14
|
+
export { fetchPublicTriggers } from './triggers.mjs';
|
|
15
|
+
export { fetchPublicFunctions } from './functions.mjs';
|
|
16
|
+
export { fetchPublicCustomTypes, } from './custom-types.mjs';
|
|
17
|
+
export { fetchPublicRLS, } from './rls.mjs';
|
|
18
|
+
export { fetchPublicPlannerStatistics, } from './planner-stats.mjs';
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwic291cmNlUm9vdCI6Ii4vc3JjLyIsInNvdXJjZXMiOlsiZGIvaW5kZXgubXRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxvQkFBb0IsRUFDcEIsbUJBQW1CLEdBSXRCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUNILHVCQUF1QixHQUkxQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDSCxnQkFBZ0IsR0FHbkIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFDLG9CQUFvQixFQUFrQixNQUFNLGVBQWUsQ0FBQztBQUNwRSxPQUFPLEVBQ0gsd0JBQXdCLEdBRTNCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUNILG9CQUFvQixFQUVwQixvQkFBb0IsRUFDcEIsdUJBQXVCLEdBRTFCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDSCxzQkFBc0IsR0FFekIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzlDLE9BQU8sRUFDSCxrQkFBa0IsR0FHckIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUNILFlBQVksRUFDWix1QkFBdUIsRUFDdkIsdUJBQXVCLEdBSzFCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFDSCwyQkFBMkIsR0FFOUIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQUMsd0JBQXdCLEVBQXNCLE1BQU0sa0JBQWtCLENBQUM7QUFDL0UsT0FBTyxFQUFDLG9CQUFvQixFQUFxQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pFLE9BQU8sRUFBQyxtQkFBbUIsRUFBb0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RSxPQUFPLEVBQUMsb0JBQW9CLEVBQXFCLE1BQU0saUJBQWlCLENBQUM7QUFDekUsT0FBTyxFQUNILHNCQUFzQixHQU16QixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFDSCxjQUFjLEdBSWpCLE1BQU0sV0FBVyxDQUFDO0FBQ25CLE9BQU8sRUFDSCw0QkFBNEIsR0FJL0IsTUFBTSxxQkFBcUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7XG4gICAgZmV0Y2hQdWJsaWNSZWxhdGlvbnMsXG4gICAgZmV0Y2hWaWV3RGVmaW5pdGlvbixcbiAgICB0eXBlIFRSZWxhdGlvblR5cGUsXG4gICAgdHlwZSBUUmVsYXRpb25JbmZvLFxuICAgIHR5cGUgVEdyb3VwZWRSZWxhdGlvbnMsXG59IGZyb20gJy4vcmVsYXRpb25zLm1qcyc7XG5leHBvcnQge1xuICAgIGZldGNoUmVsYXRpb25BdHRyaWJ1dGVzLFxuICAgIHR5cGUgVEF0dHJpYnV0ZUtpbmQsXG4gICAgdHlwZSBUR2VuZXJhdGVkU3RvcmFnZSxcbiAgICB0eXBlIFRBdHRyaWJ1dGVJbmZvLFxufSBmcm9tICcuL2F0dHJpYnV0ZXMubWpzJztcbmV4cG9ydCB7XG4gICAgZmV0Y2hQdWJsaWNFbnVtcyxcbiAgICB0eXBlIFRFbnVtSW5mbyxcbiAgICB0eXBlIFRHcm91cGVkRW51bXMsXG59IGZyb20gJy4vZW51bXMubWpzJztcbmV4cG9ydCB7ZmV0Y2hSZWxhdGlvbkluZGV4ZXMsIHR5cGUgVEluZGV4SW5mb30gZnJvbSAnLi9pbmRleGVzLm1qcyc7XG5leHBvcnQge1xuICAgIGZldGNoUmVsYXRpb25Gb3JlaWduS2V5cyxcbiAgICB0eXBlIFRGb3JlaWduS2V5SW5mbyxcbn0gZnJvbSAnLi9mb3JlaWduLWtleXMubWpzJztcbmV4cG9ydCB7XG4gICAgZmV0Y2hQb3N0Z3Jlc1ZlcnNpb24sXG4gICAgdHlwZSBUUG9zdGdyZXNWZXJzaW9uLFxuICAgIGZldGNoRGF0YWJhc2VDb21tZW50LFxuICAgIGZldGNoRGF0YWJhc2VJZGVudGlmaWVyLFxuICAgIHR5cGUgVERhdGFiYXNlSWRlbnRpZmllcixcbn0gZnJvbSAnLi92ZXJzaW9uLm1qcyc7XG5leHBvcnQge1xuICAgIGZldGNoUmVsYXRpb25GaWxlU3RhdHMsXG4gICAgdHlwZSBUUmVsYXRpb25GaWxlU3RhdHMsXG59IGZyb20gJy4vZmlsZS1zdGF0cy5tanMnO1xuZXhwb3J0IHthbmFseXplUmVsYXRpb259IGZyb20gJy4vYW5hbHl6ZS5tanMnO1xuZXhwb3J0IHtcbiAgICBmZXRjaFJlbGF0aW9uU3RhdHMsXG4gICAgdHlwZSBUUmVsYXRpb25TdGF0cyxcbiAgICB0eXBlIFRBdHRyaWJ1dGVTdGF0cyxcbn0gZnJvbSAnLi9zdGF0cy5tanMnO1xuZXhwb3J0IHtcbiAgICBzYW1wbGVDb2x1bW4sXG4gICAgc2FtcGxlQ29tcG9zaXRlU3ViRmllbGQsXG4gICAgZmV0Y2hDb21wb3NpdGVTdWJGaWVsZHMsXG4gICAgdHlwZSBUU2FtcGxlU3RyYXRlZ3ksXG4gICAgdHlwZSBUQ29sdW1uU2FtcGxlLFxuICAgIHR5cGUgVENvbXBvc2l0ZVN1YkZpZWxkLFxuICAgIHR5cGUgVFJlbGF0aW9uS2luZCxcbn0gZnJvbSAnLi9zYW1wbGUubWpzJztcbmV4cG9ydCB7XG4gICAgZmV0Y2hQdWJsaWNDaGVja0NvbnN0cmFpbnRzLFxuICAgIHR5cGUgVENoZWNrQ29uc3RyYWludEluZm8sXG59IGZyb20gJy4vY2hlY2stY29uc3RyYWludHMubWpzJztcbmV4cG9ydCB7ZmV0Y2hJbnN0YWxsZWRFeHRlbnNpb25zLCB0eXBlIFRFeHRlbnNpb25JbmZvfSBmcm9tICcuL2V4dGVuc2lvbnMubWpzJztcbmV4cG9ydCB7ZmV0Y2hQdWJsaWNTZXF1ZW5jZXMsIHR5cGUgVFNlcXVlbmNlSW5mb30gZnJvbSAnLi9zZXF1ZW5jZXMubWpzJztcbmV4cG9ydCB7ZmV0Y2hQdWJsaWNUcmlnZ2VycywgdHlwZSBUVHJpZ2dlckluZm99IGZyb20gJy4vdHJpZ2dlcnMubWpzJztcbmV4cG9ydCB7ZmV0Y2hQdWJsaWNGdW5jdGlvbnMsIHR5cGUgVEZ1bmN0aW9uSW5mb30gZnJvbSAnLi9mdW5jdGlvbnMubWpzJztcbmV4cG9ydCB7XG4gICAgZmV0Y2hQdWJsaWNDdXN0b21UeXBlcyxcbiAgICB0eXBlIFRDdXN0b21UeXBlSW5mbyxcbiAgICB0eXBlIFREb21haW5JbmZvLFxuICAgIHR5cGUgVENvbXBvc2l0ZUluZm8sXG4gICAgdHlwZSBUQ29tcG9zaXRlQXR0cmlidXRlLFxuICAgIHR5cGUgVEN1c3RvbVR5cGVLaW5kLFxufSBmcm9tICcuL2N1c3RvbS10eXBlcy5tanMnO1xuZXhwb3J0IHtcbiAgICBmZXRjaFB1YmxpY1JMUyxcbiAgICB0eXBlIFRSZWxhdGlvblJMUyxcbiAgICB0eXBlIFRQb2xpY3lJbmZvLFxuICAgIHR5cGUgVFBvbGljeUNvbW1hbmQsXG59IGZyb20gJy4vcmxzLm1qcyc7XG5leHBvcnQge1xuICAgIGZldGNoUHVibGljUGxhbm5lclN0YXRpc3RpY3MsXG4gICAgdHlwZSBUUmVsYXRpb25QbGFubmVyU3RhdHMsXG4gICAgdHlwZSBUQXR0cmlidXRlUGxhbm5lclN0YXRzLFxuICAgIHR5cGUgVEV4dGVuZGVkU3RhdGlzdGljLFxufSBmcm9tICcuL3BsYW5uZXItc3RhdHMubWpzJztcbiJdfQ==
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Pool } from 'pg';
|
|
2
|
+
export type TAttributePlannerStats = {
|
|
3
|
+
attribute_name: string;
|
|
4
|
+
inherited: boolean;
|
|
5
|
+
null_frac: number;
|
|
6
|
+
avg_width: number;
|
|
7
|
+
n_distinct: number;
|
|
8
|
+
most_common_vals: readonly string[] | null;
|
|
9
|
+
most_common_freqs: readonly number[] | null;
|
|
10
|
+
histogram_bounds: readonly string[] | null;
|
|
11
|
+
correlation: number | null;
|
|
12
|
+
most_common_elems: readonly string[] | null;
|
|
13
|
+
most_common_elem_freqs: readonly number[] | null;
|
|
14
|
+
elem_count_histogram: readonly number[] | null;
|
|
15
|
+
};
|
|
16
|
+
export type TExtendedStatistic = {
|
|
17
|
+
name: string;
|
|
18
|
+
kind: readonly string[];
|
|
19
|
+
columns: readonly string[];
|
|
20
|
+
ndistinct: string | null;
|
|
21
|
+
dependencies: string | null;
|
|
22
|
+
mcv: string | null;
|
|
23
|
+
};
|
|
24
|
+
export type TRelationPlannerStats = {
|
|
25
|
+
relation_name: string;
|
|
26
|
+
reltuples: number;
|
|
27
|
+
relpages: number;
|
|
28
|
+
relallvisible: number;
|
|
29
|
+
attributes: readonly TAttributePlannerStats[];
|
|
30
|
+
extended: readonly TExtendedStatistic[];
|
|
31
|
+
};
|
|
32
|
+
export declare const fetchPublicPlannerStatistics: (pool: Pool) => Promise<readonly TRelationPlannerStats[]>;
|
|
33
|
+
//# sourceMappingURL=planner-stats.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planner-stats.d.mts","sourceRoot":"./src/","sources":["db/planner-stats.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,IAAI,CAAC;AAE7B,MAAM,MAAM,sBAAsB,GAAG;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAC3C,iBAAiB,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAC5C,gBAAgB,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAC3C,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,iBAAiB,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAC5C,sBAAsB,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IACjD,oBAAoB,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;CAClD,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAC9C,QAAQ,EAAE,SAAS,kBAAkB,EAAE,CAAC;CAC3C,CAAC;AAsCF,eAAO,MAAM,4BAA4B,GACrC,MAAM,IAAI,KACX,OAAO,CAAC,SAAS,qBAAqB,EAAE,CAwG1C,CAAC"}
|