relq 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +862 -0
- package/dist/addons/buffer.js +1869 -0
- package/dist/addons/pg-cursor.js +1425 -0
- package/dist/addons/pg-format.js +2248 -0
- package/dist/addons/pg.js +4790 -0
- package/dist/bin/relq.js +2 -0
- package/dist/cjs/cache/index.cjs +9 -0
- package/dist/cjs/cache/query-cache.cjs +311 -0
- package/dist/cjs/cli/commands/add.cjs +82 -0
- package/dist/cjs/cli/commands/commit.cjs +145 -0
- package/dist/cjs/cli/commands/diff.cjs +84 -0
- package/dist/cjs/cli/commands/export.cjs +333 -0
- package/dist/cjs/cli/commands/fetch.cjs +59 -0
- package/dist/cjs/cli/commands/generate.cjs +242 -0
- package/dist/cjs/cli/commands/history.cjs +165 -0
- package/dist/cjs/cli/commands/import.cjs +524 -0
- package/dist/cjs/cli/commands/init.cjs +437 -0
- package/dist/cjs/cli/commands/introspect.cjs +142 -0
- package/dist/cjs/cli/commands/log.cjs +62 -0
- package/dist/cjs/cli/commands/migrate.cjs +167 -0
- package/dist/cjs/cli/commands/pull.cjs +410 -0
- package/dist/cjs/cli/commands/push.cjs +165 -0
- package/dist/cjs/cli/commands/rollback.cjs +169 -0
- package/dist/cjs/cli/commands/status.cjs +110 -0
- package/dist/cjs/cli/commands/sync.cjs +79 -0
- package/dist/cjs/cli/index.cjs +275 -0
- package/dist/cjs/cli/utils/change-tracker.cjs +446 -0
- package/dist/cjs/cli/utils/commit-manager.cjs +239 -0
- package/dist/cjs/cli/utils/config-loader.cjs +127 -0
- package/dist/cjs/cli/utils/env-loader.cjs +62 -0
- package/dist/cjs/cli/utils/fast-introspect.cjs +398 -0
- package/dist/cjs/cli/utils/git-utils.cjs +404 -0
- package/dist/cjs/cli/utils/migration-generator.cjs +269 -0
- package/dist/cjs/cli/utils/relqignore.cjs +114 -0
- package/dist/cjs/cli/utils/repo-manager.cjs +515 -0
- package/dist/cjs/cli/utils/schema-comparator.cjs +313 -0
- package/dist/cjs/cli/utils/schema-diff.cjs +284 -0
- package/dist/cjs/cli/utils/schema-hash.cjs +108 -0
- package/dist/cjs/cli/utils/schema-introspect.cjs +455 -0
- package/dist/cjs/cli/utils/snapshot-manager.cjs +223 -0
- package/dist/cjs/cli/utils/spinner.cjs +108 -0
- package/dist/cjs/cli/utils/sql-generator.cjs +520 -0
- package/dist/cjs/cli/utils/sql-parser.cjs +999 -0
- package/dist/cjs/cli/utils/type-generator.cjs +2061 -0
- package/dist/cjs/condition/array-condition-builder.cjs +503 -0
- package/dist/cjs/condition/array-numeric-condition-builder.cjs +186 -0
- package/dist/cjs/condition/array-specialized-condition-builder.cjs +206 -0
- package/dist/cjs/condition/array-string-condition-builder.cjs +146 -0
- package/dist/cjs/condition/base-condition-builder.cjs +2 -0
- package/dist/cjs/condition/condition-collector.cjs +284 -0
- package/dist/cjs/condition/fulltext-condition-builder.cjs +61 -0
- package/dist/cjs/condition/geometric-condition-builder.cjs +208 -0
- package/dist/cjs/condition/index.cjs +25 -0
- package/dist/cjs/condition/jsonb-condition-builder.cjs +160 -0
- package/dist/cjs/condition/network-condition-builder.cjs +230 -0
- package/dist/cjs/condition/range-condition-builder.cjs +82 -0
- package/dist/cjs/config/config.cjs +190 -0
- package/dist/cjs/config/index.cjs +9 -0
- package/dist/cjs/constants/pg-values.cjs +68 -0
- package/dist/cjs/copy/copy-builder.cjs +316 -0
- package/dist/cjs/copy/index.cjs +6 -0
- package/dist/cjs/core/query-builder.cjs +440 -0
- package/dist/cjs/core/relq-client.cjs +1831 -0
- package/dist/cjs/core/typed-kuery-client.cjs +2 -0
- package/dist/cjs/count/count-builder.cjs +88 -0
- package/dist/cjs/count/index.cjs +5 -0
- package/dist/cjs/cte/cte-builder.cjs +89 -0
- package/dist/cjs/cte/index.cjs +5 -0
- package/dist/cjs/ddl/function.cjs +48 -0
- package/dist/cjs/ddl/index.cjs +7 -0
- package/dist/cjs/ddl/sql.cjs +54 -0
- package/dist/cjs/delete/delete-builder.cjs +135 -0
- package/dist/cjs/delete/index.cjs +5 -0
- package/dist/cjs/errors/relq-errors.cjs +329 -0
- package/dist/cjs/examples/fulltext-search-test.cjs +122 -0
- package/dist/cjs/explain/explain-builder.cjs +99 -0
- package/dist/cjs/explain/index.cjs +5 -0
- package/dist/cjs/function/create-function-builder.cjs +196 -0
- package/dist/cjs/function/index.cjs +6 -0
- package/dist/cjs/functions/advanced-functions.cjs +241 -0
- package/dist/cjs/functions/case-builder.cjs +66 -0
- package/dist/cjs/functions/geometric-functions.cjs +104 -0
- package/dist/cjs/functions/index.cjs +184 -0
- package/dist/cjs/functions/network-functions.cjs +86 -0
- package/dist/cjs/functions/sql-functions.cjs +431 -0
- package/dist/cjs/index.cjs +164 -0
- package/dist/cjs/indexing/create-index-builder.cjs +187 -0
- package/dist/cjs/indexing/drop-index-builder.cjs +89 -0
- package/dist/cjs/indexing/index-types.cjs +2 -0
- package/dist/cjs/indexing/index.cjs +8 -0
- package/dist/cjs/insert/conflict-builder.cjs +173 -0
- package/dist/cjs/insert/index.cjs +5 -0
- package/dist/cjs/insert/insert-builder.cjs +254 -0
- package/dist/cjs/introspect/index.cjs +229 -0
- package/dist/cjs/maintenance/index.cjs +6 -0
- package/dist/cjs/maintenance/vacuum-builder.cjs +166 -0
- package/dist/cjs/pubsub/index.cjs +7 -0
- package/dist/cjs/pubsub/listen-notify-builder.cjs +57 -0
- package/dist/cjs/pubsub/listener-connection.cjs +180 -0
- package/dist/cjs/raw/index.cjs +5 -0
- package/dist/cjs/raw/raw-query-builder.cjs +27 -0
- package/dist/cjs/schema/index.cjs +15 -0
- package/dist/cjs/schema/schema-builder.cjs +1167 -0
- package/dist/cjs/schema-builder.cjs +21 -0
- package/dist/cjs/schema-definition/column-types.cjs +829 -0
- package/dist/cjs/schema-definition/index.cjs +62 -0
- package/dist/cjs/schema-definition/introspection.cjs +620 -0
- package/dist/cjs/schema-definition/partitions.cjs +129 -0
- package/dist/cjs/schema-definition/pg-enum.cjs +76 -0
- package/dist/cjs/schema-definition/pg-function.cjs +91 -0
- package/dist/cjs/schema-definition/pg-sequence.cjs +56 -0
- package/dist/cjs/schema-definition/pg-trigger.cjs +108 -0
- package/dist/cjs/schema-definition/relations.cjs +98 -0
- package/dist/cjs/schema-definition/sql-expressions.cjs +202 -0
- package/dist/cjs/schema-definition/table-definition.cjs +636 -0
- package/dist/cjs/select/aggregate-builder.cjs +179 -0
- package/dist/cjs/select/index.cjs +5 -0
- package/dist/cjs/select/select-builder.cjs +233 -0
- package/dist/cjs/sequence/index.cjs +7 -0
- package/dist/cjs/sequence/sequence-builder.cjs +264 -0
- package/dist/cjs/table/alter-table-builder.cjs +146 -0
- package/dist/cjs/table/constraint-builder.cjs +102 -0
- package/dist/cjs/table/create-table-builder.cjs +248 -0
- package/dist/cjs/table/index.cjs +17 -0
- package/dist/cjs/table/partition-builder.cjs +131 -0
- package/dist/cjs/table/truncate-builder.cjs +70 -0
- package/dist/cjs/transaction/index.cjs +6 -0
- package/dist/cjs/transaction/transaction-builder.cjs +78 -0
- package/dist/cjs/trigger/create-trigger-builder.cjs +174 -0
- package/dist/cjs/trigger/index.cjs +6 -0
- package/dist/cjs/types/aggregate-types.cjs +2 -0
- package/dist/cjs/types/config-types.cjs +40 -0
- package/dist/cjs/types/inference-types.cjs +18 -0
- package/dist/cjs/types/pagination-types.cjs +7 -0
- package/dist/cjs/types/result-types.cjs +2 -0
- package/dist/cjs/types/schema-types.cjs +2 -0
- package/dist/cjs/types/subscription-types.cjs +2 -0
- package/dist/cjs/types.cjs +2 -0
- package/dist/cjs/update/array-update-builder.cjs +205 -0
- package/dist/cjs/update/index.cjs +13 -0
- package/dist/cjs/update/update-builder.cjs +195 -0
- package/dist/cjs/utils/case-converter.cjs +58 -0
- package/dist/cjs/utils/environment-detection.cjs +120 -0
- package/dist/cjs/utils/index.cjs +10 -0
- package/dist/cjs/utils/pool-defaults.cjs +106 -0
- package/dist/cjs/utils/type-coercion.cjs +118 -0
- package/dist/cjs/view/create-view-builder.cjs +180 -0
- package/dist/cjs/view/index.cjs +7 -0
- package/dist/cjs/window/index.cjs +5 -0
- package/dist/cjs/window/window-builder.cjs +80 -0
- package/dist/config.cjs +1 -0
- package/dist/config.d.ts +655 -0
- package/dist/config.js +1 -0
- package/dist/esm/cache/index.js +1 -0
- package/dist/esm/cache/query-cache.js +303 -0
- package/dist/esm/cli/commands/add.js +78 -0
- package/dist/esm/cli/commands/commit.js +109 -0
- package/dist/esm/cli/commands/diff.js +81 -0
- package/dist/esm/cli/commands/export.js +297 -0
- package/dist/esm/cli/commands/fetch.js +56 -0
- package/dist/esm/cli/commands/generate.js +206 -0
- package/dist/esm/cli/commands/history.js +129 -0
- package/dist/esm/cli/commands/import.js +488 -0
- package/dist/esm/cli/commands/init.js +401 -0
- package/dist/esm/cli/commands/introspect.js +106 -0
- package/dist/esm/cli/commands/log.js +59 -0
- package/dist/esm/cli/commands/migrate.js +131 -0
- package/dist/esm/cli/commands/pull.js +374 -0
- package/dist/esm/cli/commands/push.js +129 -0
- package/dist/esm/cli/commands/rollback.js +133 -0
- package/dist/esm/cli/commands/status.js +107 -0
- package/dist/esm/cli/commands/sync.js +76 -0
- package/dist/esm/cli/index.js +240 -0
- package/dist/esm/cli/utils/change-tracker.js +405 -0
- package/dist/esm/cli/utils/commit-manager.js +191 -0
- package/dist/esm/cli/utils/config-loader.js +86 -0
- package/dist/esm/cli/utils/env-loader.js +57 -0
- package/dist/esm/cli/utils/fast-introspect.js +362 -0
- package/dist/esm/cli/utils/git-utils.js +347 -0
- package/dist/esm/cli/utils/migration-generator.js +263 -0
- package/dist/esm/cli/utils/relqignore.js +74 -0
- package/dist/esm/cli/utils/repo-manager.js +444 -0
- package/dist/esm/cli/utils/schema-comparator.js +307 -0
- package/dist/esm/cli/utils/schema-diff.js +276 -0
- package/dist/esm/cli/utils/schema-hash.js +69 -0
- package/dist/esm/cli/utils/schema-introspect.js +418 -0
- package/dist/esm/cli/utils/snapshot-manager.js +179 -0
- package/dist/esm/cli/utils/spinner.js +101 -0
- package/dist/esm/cli/utils/sql-generator.js +504 -0
- package/dist/esm/cli/utils/sql-parser.js +992 -0
- package/dist/esm/cli/utils/type-generator.js +2058 -0
- package/dist/esm/condition/array-condition-builder.js +495 -0
- package/dist/esm/condition/array-numeric-condition-builder.js +182 -0
- package/dist/esm/condition/array-specialized-condition-builder.js +200 -0
- package/dist/esm/condition/array-string-condition-builder.js +142 -0
- package/dist/esm/condition/base-condition-builder.js +1 -0
- package/dist/esm/condition/condition-collector.js +275 -0
- package/dist/esm/condition/fulltext-condition-builder.js +53 -0
- package/dist/esm/condition/geometric-condition-builder.js +200 -0
- package/dist/esm/condition/index.js +7 -0
- package/dist/esm/condition/jsonb-condition-builder.js +152 -0
- package/dist/esm/condition/network-condition-builder.js +222 -0
- package/dist/esm/condition/range-condition-builder.js +74 -0
- package/dist/esm/config/config.js +150 -0
- package/dist/esm/config/index.js +1 -0
- package/dist/esm/constants/pg-values.js +63 -0
- package/dist/esm/copy/copy-builder.js +308 -0
- package/dist/esm/copy/index.js +1 -0
- package/dist/esm/core/query-builder.js +426 -0
- package/dist/esm/core/relq-client.js +1791 -0
- package/dist/esm/core/typed-kuery-client.js +1 -0
- package/dist/esm/count/count-builder.js +81 -0
- package/dist/esm/count/index.js +1 -0
- package/dist/esm/cte/cte-builder.js +82 -0
- package/dist/esm/cte/index.js +1 -0
- package/dist/esm/ddl/function.js +45 -0
- package/dist/esm/ddl/index.js +2 -0
- package/dist/esm/ddl/sql.js +51 -0
- package/dist/esm/delete/delete-builder.js +128 -0
- package/dist/esm/delete/index.js +1 -0
- package/dist/esm/errors/relq-errors.js +310 -0
- package/dist/esm/examples/fulltext-search-test.js +117 -0
- package/dist/esm/explain/explain-builder.js +95 -0
- package/dist/esm/explain/index.js +1 -0
- package/dist/esm/function/create-function-builder.js +188 -0
- package/dist/esm/function/index.js +1 -0
- package/dist/esm/functions/advanced-functions.js +231 -0
- package/dist/esm/functions/case-builder.js +58 -0
- package/dist/esm/functions/geometric-functions.js +97 -0
- package/dist/esm/functions/index.js +171 -0
- package/dist/esm/functions/network-functions.js +79 -0
- package/dist/esm/functions/sql-functions.js +421 -0
- package/dist/esm/index.js +34 -0
- package/dist/esm/indexing/create-index-builder.js +180 -0
- package/dist/esm/indexing/drop-index-builder.js +81 -0
- package/dist/esm/indexing/index-types.js +1 -0
- package/dist/esm/indexing/index.js +2 -0
- package/dist/esm/insert/conflict-builder.js +162 -0
- package/dist/esm/insert/index.js +1 -0
- package/dist/esm/insert/insert-builder.js +247 -0
- package/dist/esm/introspect/index.js +224 -0
- package/dist/esm/maintenance/index.js +1 -0
- package/dist/esm/maintenance/vacuum-builder.js +158 -0
- package/dist/esm/pubsub/index.js +1 -0
- package/dist/esm/pubsub/listen-notify-builder.js +48 -0
- package/dist/esm/pubsub/listener-connection.js +173 -0
- package/dist/esm/raw/index.js +1 -0
- package/dist/esm/raw/raw-query-builder.js +20 -0
- package/dist/esm/schema/index.js +1 -0
- package/dist/esm/schema/schema-builder.js +1150 -0
- package/dist/esm/schema-builder.js +2 -0
- package/dist/esm/schema-definition/column-types.js +738 -0
- package/dist/esm/schema-definition/index.js +10 -0
- package/dist/esm/schema-definition/introspection.js +614 -0
- package/dist/esm/schema-definition/partitions.js +123 -0
- package/dist/esm/schema-definition/pg-enum.js +70 -0
- package/dist/esm/schema-definition/pg-function.js +85 -0
- package/dist/esm/schema-definition/pg-sequence.js +50 -0
- package/dist/esm/schema-definition/pg-trigger.js +102 -0
- package/dist/esm/schema-definition/relations.js +90 -0
- package/dist/esm/schema-definition/sql-expressions.js +193 -0
- package/dist/esm/schema-definition/table-definition.js +630 -0
- package/dist/esm/select/aggregate-builder.js +172 -0
- package/dist/esm/select/index.js +1 -0
- package/dist/esm/select/select-builder.js +226 -0
- package/dist/esm/sequence/index.js +1 -0
- package/dist/esm/sequence/sequence-builder.js +255 -0
- package/dist/esm/table/alter-table-builder.js +138 -0
- package/dist/esm/table/constraint-builder.js +95 -0
- package/dist/esm/table/create-table-builder.js +241 -0
- package/dist/esm/table/index.js +5 -0
- package/dist/esm/table/partition-builder.js +121 -0
- package/dist/esm/table/truncate-builder.js +63 -0
- package/dist/esm/transaction/index.js +1 -0
- package/dist/esm/transaction/transaction-builder.js +70 -0
- package/dist/esm/trigger/create-trigger-builder.js +166 -0
- package/dist/esm/trigger/index.js +1 -0
- package/dist/esm/types/aggregate-types.js +1 -0
- package/dist/esm/types/config-types.js +36 -0
- package/dist/esm/types/inference-types.js +12 -0
- package/dist/esm/types/pagination-types.js +4 -0
- package/dist/esm/types/result-types.js +1 -0
- package/dist/esm/types/schema-types.js +1 -0
- package/dist/esm/types/subscription-types.js +1 -0
- package/dist/esm/types.js +1 -0
- package/dist/esm/update/array-update-builder.js +192 -0
- package/dist/esm/update/index.js +2 -0
- package/dist/esm/update/update-builder.js +188 -0
- package/dist/esm/utils/case-converter.js +55 -0
- package/dist/esm/utils/environment-detection.js +113 -0
- package/dist/esm/utils/index.js +2 -0
- package/dist/esm/utils/pool-defaults.js +100 -0
- package/dist/esm/utils/type-coercion.js +110 -0
- package/dist/esm/view/create-view-builder.js +171 -0
- package/dist/esm/view/index.js +1 -0
- package/dist/esm/window/index.js +1 -0
- package/dist/esm/window/window-builder.js +73 -0
- package/dist/index.cjs +1 -0
- package/dist/index.d.ts +10341 -0
- package/dist/index.js +1 -0
- package/dist/schema-builder.cjs +1 -0
- package/dist/schema-builder.d.ts +2272 -0
- package/dist/schema-builder.js +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.findConfigFile = findConfigFile;
|
|
37
|
+
exports.findConfigFileRecursive = findConfigFileRecursive;
|
|
38
|
+
exports.configExists = configExists;
|
|
39
|
+
exports.loadConfigWithEnv = loadConfigWithEnv;
|
|
40
|
+
exports.validateConfig = validateConfig;
|
|
41
|
+
exports.requireValidConfig = requireValidConfig;
|
|
42
|
+
const config_1 = require("../../config/config.cjs");
|
|
43
|
+
const env_loader_1 = require("./env-loader.cjs");
|
|
44
|
+
const fs = __importStar(require("fs"));
|
|
45
|
+
const path = __importStar(require("path"));
|
|
46
|
+
const CONFIG_FILENAMES = [
|
|
47
|
+
'relq.config.ts',
|
|
48
|
+
'relq.config.js',
|
|
49
|
+
'relq.config.mjs',
|
|
50
|
+
];
|
|
51
|
+
function findConfigFile(cwd = process.cwd()) {
|
|
52
|
+
for (const filename of CONFIG_FILENAMES) {
|
|
53
|
+
const filepath = path.join(cwd, filename);
|
|
54
|
+
if (fs.existsSync(filepath)) {
|
|
55
|
+
return filepath;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
function findConfigFileRecursive(startDir = process.cwd()) {
|
|
61
|
+
let currentDir = path.resolve(startDir);
|
|
62
|
+
const root = path.parse(currentDir).root;
|
|
63
|
+
while (currentDir !== root) {
|
|
64
|
+
const found = findConfigFile(currentDir);
|
|
65
|
+
if (found) {
|
|
66
|
+
return { path: found, directory: currentDir };
|
|
67
|
+
}
|
|
68
|
+
currentDir = path.dirname(currentDir);
|
|
69
|
+
}
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
function configExists(cwd = process.cwd()) {
|
|
73
|
+
return findConfigFile(cwd) !== null;
|
|
74
|
+
}
|
|
75
|
+
async function loadConfigWithEnv(configPath) {
|
|
76
|
+
let config;
|
|
77
|
+
if (configPath) {
|
|
78
|
+
config = await (0, config_1.loadConfig)(configPath);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
const foundPath = findConfigFile();
|
|
82
|
+
if (foundPath) {
|
|
83
|
+
config = await (0, config_1.loadConfig)(foundPath);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
config = {};
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (!config.connection?.host && !config.connection?.url) {
|
|
90
|
+
const envConfig = (0, env_loader_1.loadEnvConfig)();
|
|
91
|
+
if (envConfig) {
|
|
92
|
+
config = {
|
|
93
|
+
...config,
|
|
94
|
+
connection: {
|
|
95
|
+
...config.connection,
|
|
96
|
+
...envConfig,
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return config;
|
|
102
|
+
}
|
|
103
|
+
function validateConfig(config) {
|
|
104
|
+
const errors = [];
|
|
105
|
+
if (!config.connection?.host && !config.connection?.url) {
|
|
106
|
+
errors.push('No database connection configured. Set connection in relq.config.ts or use DATABASE_* env vars.');
|
|
107
|
+
}
|
|
108
|
+
const hasSchemaPath = typeof config.schema === 'string';
|
|
109
|
+
const hasSchemaDir = typeof config.schema === 'object' && config.schema?.directory;
|
|
110
|
+
const hasTypeGenOutput = config.typeGeneration?.output;
|
|
111
|
+
const hasGenerateOutDir = config.generate?.outDir;
|
|
112
|
+
if (!hasSchemaPath && !hasSchemaDir && !hasTypeGenOutput && !hasGenerateOutDir) {
|
|
113
|
+
errors.push('No schema output path configured. Set schema, generate.outDir, or typeGeneration.output in relq.config.ts.');
|
|
114
|
+
}
|
|
115
|
+
return errors;
|
|
116
|
+
}
|
|
117
|
+
function requireValidConfig(config) {
|
|
118
|
+
const errors = validateConfig(config);
|
|
119
|
+
if (errors.length > 0) {
|
|
120
|
+
console.error('Configuration errors:');
|
|
121
|
+
for (const error of errors) {
|
|
122
|
+
console.error(` • ${error}`);
|
|
123
|
+
}
|
|
124
|
+
console.error('\nRun "relq init" to create a configuration file.');
|
|
125
|
+
process.exit(1);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.loadEnvConfig = loadEnvConfig;
|
|
4
|
+
exports.hasEnvConfig = hasEnvConfig;
|
|
5
|
+
exports.getConnectionDescription = getConnectionDescription;
|
|
6
|
+
function loadEnvConfig() {
|
|
7
|
+
const connectionString = process.env.DATABASE_CONNECTION_STRING;
|
|
8
|
+
if (connectionString) {
|
|
9
|
+
return parseConnectionString(connectionString);
|
|
10
|
+
}
|
|
11
|
+
const host = process.env.DATABASE_HOST;
|
|
12
|
+
const database = process.env.DATABASE_NAME;
|
|
13
|
+
const user = process.env.DATABASE_USER;
|
|
14
|
+
const password = process.env.DATABASE_PASSWORD;
|
|
15
|
+
const port = process.env.DATABASE_PORT;
|
|
16
|
+
if (!host || !database) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
host,
|
|
21
|
+
port: port ? parseInt(port, 10) : 5432,
|
|
22
|
+
database,
|
|
23
|
+
user: user || 'postgres',
|
|
24
|
+
password: password || '',
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function parseConnectionString(url) {
|
|
28
|
+
try {
|
|
29
|
+
const parsed = new URL(url);
|
|
30
|
+
return {
|
|
31
|
+
url,
|
|
32
|
+
host: parsed.hostname,
|
|
33
|
+
port: parsed.port ? parseInt(parsed.port, 10) : 5432,
|
|
34
|
+
database: parsed.pathname.slice(1),
|
|
35
|
+
user: parsed.username || 'postgres',
|
|
36
|
+
password: parsed.password || '',
|
|
37
|
+
ssl: parsed.searchParams.get('sslmode'),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return { url };
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function hasEnvConfig() {
|
|
45
|
+
return !!(process.env.DATABASE_CONNECTION_STRING ||
|
|
46
|
+
process.env.DATABASE_HOST);
|
|
47
|
+
}
|
|
48
|
+
function getConnectionDescription(config) {
|
|
49
|
+
if (config.url) {
|
|
50
|
+
try {
|
|
51
|
+
const url = new URL(config.url);
|
|
52
|
+
if (url.password) {
|
|
53
|
+
url.password = '***';
|
|
54
|
+
}
|
|
55
|
+
return url.toString();
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return config.url.replace(/:([^:@]+)@/, ':***@');
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return `${config.user || 'postgres'}@${config.host}:${config.port || 5432}/${config.database}`;
|
|
62
|
+
}
|
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.fastIntrospectDatabase = fastIntrospectDatabase;
|
|
37
|
+
async function fastIntrospectDatabase(connection, onProgress, options) {
|
|
38
|
+
const { includeFunctions = false, includeTriggers = false } = options || {};
|
|
39
|
+
const { Pool } = await Promise.resolve().then(() => __importStar(require("../../../addons/pg.js")));
|
|
40
|
+
onProgress?.('connecting', connection.database);
|
|
41
|
+
const pool = new Pool({
|
|
42
|
+
host: connection.host,
|
|
43
|
+
port: connection.port || 5432,
|
|
44
|
+
database: connection.database,
|
|
45
|
+
user: connection.user,
|
|
46
|
+
password: connection.password,
|
|
47
|
+
connectionString: connection.url,
|
|
48
|
+
ssl: connection.ssl,
|
|
49
|
+
});
|
|
50
|
+
try {
|
|
51
|
+
onProgress?.('fetching_tables');
|
|
52
|
+
const tablesResult = await pool.query(`
|
|
53
|
+
SELECT
|
|
54
|
+
c.relname as table_name,
|
|
55
|
+
n.nspname as table_schema,
|
|
56
|
+
c.reltuples::bigint as row_count,
|
|
57
|
+
c.relispartition as is_partition,
|
|
58
|
+
c.relkind = 'p' as is_partitioned,
|
|
59
|
+
CASE
|
|
60
|
+
WHEN pt.partstrat = 'l' THEN 'LIST'
|
|
61
|
+
WHEN pt.partstrat = 'r' THEN 'RANGE'
|
|
62
|
+
WHEN pt.partstrat = 'h' THEN 'HASH'
|
|
63
|
+
END as partition_type,
|
|
64
|
+
-- Get partition key columns
|
|
65
|
+
(
|
|
66
|
+
SELECT array_agg(a.attname ORDER BY array_position(pt.partattrs, a.attnum))
|
|
67
|
+
FROM pg_attribute a
|
|
68
|
+
WHERE a.attrelid = c.oid
|
|
69
|
+
AND a.attnum = ANY(pt.partattrs)
|
|
70
|
+
) as partition_key
|
|
71
|
+
FROM pg_class c
|
|
72
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
73
|
+
LEFT JOIN pg_partitioned_table pt ON pt.partrelid = c.oid
|
|
74
|
+
WHERE n.nspname = 'public'
|
|
75
|
+
AND c.relkind IN ('r', 'p') -- Regular and partitioned tables
|
|
76
|
+
AND NOT c.relispartition
|
|
77
|
+
ORDER BY c.relname;
|
|
78
|
+
`);
|
|
79
|
+
onProgress?.('fetching_columns');
|
|
80
|
+
const columnsResult = await pool.query(`
|
|
81
|
+
SELECT
|
|
82
|
+
c.table_name,
|
|
83
|
+
c.column_name,
|
|
84
|
+
c.data_type,
|
|
85
|
+
c.udt_name,
|
|
86
|
+
c.is_nullable = 'YES' as is_nullable,
|
|
87
|
+
c.column_default,
|
|
88
|
+
c.character_maximum_length,
|
|
89
|
+
c.numeric_precision,
|
|
90
|
+
c.numeric_scale,
|
|
91
|
+
c.is_generated = 'ALWAYS' as is_generated,
|
|
92
|
+
c.generation_expression,
|
|
93
|
+
c.identity_generation,
|
|
94
|
+
col_description(pgc.oid, c.ordinal_position::int) as column_comment
|
|
95
|
+
FROM information_schema.columns c
|
|
96
|
+
JOIN pg_class pgc ON pgc.relname = c.table_name
|
|
97
|
+
JOIN pg_namespace pgn ON pgn.oid = pgc.relnamespace AND pgn.nspname = c.table_schema
|
|
98
|
+
WHERE c.table_schema = 'public'
|
|
99
|
+
ORDER BY c.table_name, c.ordinal_position;
|
|
100
|
+
`);
|
|
101
|
+
const constraintsResult = await pool.query(`
|
|
102
|
+
SELECT
|
|
103
|
+
tc.table_name,
|
|
104
|
+
tc.constraint_name,
|
|
105
|
+
tc.constraint_type,
|
|
106
|
+
array_agg(DISTINCT kcu.column_name ORDER BY kcu.column_name) as columns,
|
|
107
|
+
ccu.table_name as referenced_table,
|
|
108
|
+
array_agg(DISTINCT ccu.column_name) as referenced_columns,
|
|
109
|
+
rc.update_rule as on_update,
|
|
110
|
+
rc.delete_rule as on_delete
|
|
111
|
+
FROM information_schema.table_constraints tc
|
|
112
|
+
JOIN information_schema.key_column_usage kcu
|
|
113
|
+
ON tc.constraint_name = kcu.constraint_name AND tc.table_schema = kcu.table_schema
|
|
114
|
+
LEFT JOIN information_schema.constraint_column_usage ccu
|
|
115
|
+
ON tc.constraint_name = ccu.constraint_name AND tc.constraint_type = 'FOREIGN KEY'
|
|
116
|
+
LEFT JOIN information_schema.referential_constraints rc
|
|
117
|
+
ON tc.constraint_name = rc.constraint_name AND tc.table_schema = rc.constraint_schema
|
|
118
|
+
WHERE tc.table_schema = 'public'
|
|
119
|
+
GROUP BY tc.table_name, tc.constraint_name, tc.constraint_type, ccu.table_name, rc.update_rule, rc.delete_rule;
|
|
120
|
+
`);
|
|
121
|
+
const indexesResult = await pool.query(`
|
|
122
|
+
SELECT
|
|
123
|
+
t.relname as table_name,
|
|
124
|
+
i.relname as index_name,
|
|
125
|
+
am.amname as index_type,
|
|
126
|
+
ix.indisunique as is_unique,
|
|
127
|
+
ix.indisprimary as is_primary,
|
|
128
|
+
pg_get_indexdef(ix.indexrelid) as index_definition,
|
|
129
|
+
pg_get_expr(ix.indpred, ix.indrelid) as where_clause,
|
|
130
|
+
pg_get_expr(ix.indexprs, ix.indrelid) as expression,
|
|
131
|
+
array_agg(a.attname ORDER BY array_position(ix.indkey, a.attnum)) FILTER (WHERE a.attnum > 0) as columns
|
|
132
|
+
FROM pg_index ix
|
|
133
|
+
JOIN pg_class t ON t.oid = ix.indrelid
|
|
134
|
+
JOIN pg_class i ON i.oid = ix.indexrelid
|
|
135
|
+
JOIN pg_namespace n ON n.oid = t.relnamespace
|
|
136
|
+
JOIN pg_am am ON am.oid = i.relam
|
|
137
|
+
LEFT JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(ix.indkey)
|
|
138
|
+
WHERE n.nspname = 'public'
|
|
139
|
+
AND NOT ix.indisprimary
|
|
140
|
+
GROUP BY t.relname, i.relname, am.amname, ix.indisunique, ix.indisprimary, ix.indexrelid, ix.indpred, ix.indexprs, ix.indrelid;
|
|
141
|
+
`);
|
|
142
|
+
const checksResult = await pool.query(`
|
|
143
|
+
SELECT
|
|
144
|
+
c.relname as table_name,
|
|
145
|
+
con.conname as constraint_name,
|
|
146
|
+
pg_get_constraintdef(con.oid) as definition
|
|
147
|
+
FROM pg_constraint con
|
|
148
|
+
JOIN pg_class c ON c.oid = con.conrelid
|
|
149
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
150
|
+
WHERE n.nspname = 'public' AND con.contype = 'c';
|
|
151
|
+
`);
|
|
152
|
+
onProgress?.('fetching_enums');
|
|
153
|
+
const enumsResult = await pool.query(`
|
|
154
|
+
SELECT
|
|
155
|
+
t.typname as enum_name,
|
|
156
|
+
n.nspname as enum_schema,
|
|
157
|
+
array_agg(e.enumlabel ORDER BY e.enumsortorder) as enum_values
|
|
158
|
+
FROM pg_type t
|
|
159
|
+
JOIN pg_enum e ON t.oid = e.enumtypid
|
|
160
|
+
JOIN pg_namespace n ON t.typnamespace = n.oid
|
|
161
|
+
WHERE n.nspname = 'public'
|
|
162
|
+
GROUP BY t.typname, n.nspname
|
|
163
|
+
ORDER BY t.typname;
|
|
164
|
+
`);
|
|
165
|
+
const enums = enumsResult.rows.map(row => ({
|
|
166
|
+
name: row.enum_name,
|
|
167
|
+
schema: row.enum_schema,
|
|
168
|
+
values: row.enum_values || [],
|
|
169
|
+
}));
|
|
170
|
+
onProgress?.('processing');
|
|
171
|
+
const columnsByTable = new Map();
|
|
172
|
+
const constraintsByTable = new Map();
|
|
173
|
+
const indexesByTable = new Map();
|
|
174
|
+
const checksByTable = new Map();
|
|
175
|
+
for (const col of columnsResult.rows) {
|
|
176
|
+
if (!columnsByTable.has(col.table_name)) {
|
|
177
|
+
columnsByTable.set(col.table_name, []);
|
|
178
|
+
}
|
|
179
|
+
columnsByTable.get(col.table_name).push({
|
|
180
|
+
name: col.column_name,
|
|
181
|
+
dataType: col.udt_name || col.data_type,
|
|
182
|
+
isNullable: col.is_nullable,
|
|
183
|
+
defaultValue: col.column_default,
|
|
184
|
+
isPrimaryKey: false,
|
|
185
|
+
isUnique: false,
|
|
186
|
+
maxLength: col.character_maximum_length,
|
|
187
|
+
precision: col.numeric_precision,
|
|
188
|
+
scale: col.numeric_scale,
|
|
189
|
+
references: null,
|
|
190
|
+
comment: col.column_comment,
|
|
191
|
+
isGenerated: col.is_generated || false,
|
|
192
|
+
generationExpression: col.generation_expression || null,
|
|
193
|
+
identityGeneration: col.identity_generation || null,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
for (const con of constraintsResult.rows) {
|
|
197
|
+
if (!constraintsByTable.has(con.table_name)) {
|
|
198
|
+
constraintsByTable.set(con.table_name, new Map());
|
|
199
|
+
}
|
|
200
|
+
constraintsByTable.get(con.table_name).set(con.constraint_name, {
|
|
201
|
+
type: con.constraint_type,
|
|
202
|
+
columns: con.columns,
|
|
203
|
+
});
|
|
204
|
+
const columns = columnsByTable.get(con.table_name);
|
|
205
|
+
if (columns) {
|
|
206
|
+
for (const colName of con.columns) {
|
|
207
|
+
const col = columns.find(c => c.name === colName);
|
|
208
|
+
if (col) {
|
|
209
|
+
if (con.constraint_type === 'PRIMARY KEY')
|
|
210
|
+
col.isPrimaryKey = true;
|
|
211
|
+
if (con.constraint_type === 'UNIQUE')
|
|
212
|
+
col.isUnique = true;
|
|
213
|
+
if (con.constraint_type === 'FOREIGN KEY' && con.referenced_table) {
|
|
214
|
+
col.references = {
|
|
215
|
+
table: con.referenced_table,
|
|
216
|
+
column: con.referenced_columns?.[0] || 'id',
|
|
217
|
+
onDelete: con.on_delete || 'NO ACTION',
|
|
218
|
+
onUpdate: con.on_update || 'NO ACTION',
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
for (const idx of indexesResult.rows) {
|
|
226
|
+
if (!indexesByTable.has(idx.table_name)) {
|
|
227
|
+
indexesByTable.set(idx.table_name, []);
|
|
228
|
+
}
|
|
229
|
+
const opClassMatches = idx.index_definition?.match(/\b([a-z_]+_ops)\b/gi) ?? [];
|
|
230
|
+
const operatorClasses = Array.from(new Set(opClassMatches));
|
|
231
|
+
indexesByTable.get(idx.table_name).push({
|
|
232
|
+
name: idx.index_name,
|
|
233
|
+
columns: idx.columns || [],
|
|
234
|
+
isUnique: idx.is_unique,
|
|
235
|
+
isPrimary: idx.is_primary,
|
|
236
|
+
type: idx.index_type,
|
|
237
|
+
definition: idx.index_definition || undefined,
|
|
238
|
+
whereClause: idx.where_clause || null,
|
|
239
|
+
expression: idx.expression || null,
|
|
240
|
+
operatorClasses: operatorClasses.length > 0 ? operatorClasses : undefined,
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
for (const chk of checksResult.rows) {
|
|
244
|
+
if (!checksByTable.has(chk.table_name)) {
|
|
245
|
+
checksByTable.set(chk.table_name, []);
|
|
246
|
+
}
|
|
247
|
+
checksByTable.get(chk.table_name).push({
|
|
248
|
+
name: chk.constraint_name,
|
|
249
|
+
type: 'CHECK',
|
|
250
|
+
columns: [],
|
|
251
|
+
definition: chk.definition,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
const tables = [];
|
|
255
|
+
for (const row of tablesResult.rows) {
|
|
256
|
+
const tableName = row.table_name;
|
|
257
|
+
if (tableName.startsWith('_relq'))
|
|
258
|
+
continue;
|
|
259
|
+
tables.push({
|
|
260
|
+
name: tableName,
|
|
261
|
+
schema: row.table_schema,
|
|
262
|
+
columns: columnsByTable.get(tableName) || [],
|
|
263
|
+
indexes: indexesByTable.get(tableName) || [],
|
|
264
|
+
constraints: checksByTable.get(tableName) || [],
|
|
265
|
+
rowCount: parseInt(row.row_count) || 0,
|
|
266
|
+
isPartitioned: row.is_partitioned || false,
|
|
267
|
+
partitionType: row.partition_type,
|
|
268
|
+
partitionKey: row.partition_key || [],
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
onProgress?.('fetching_partitions');
|
|
272
|
+
const partitionsResult = await pool.query(`
|
|
273
|
+
SELECT
|
|
274
|
+
child.relname as partition_name,
|
|
275
|
+
parent.relname as parent_table,
|
|
276
|
+
pg_get_expr(child.relpartbound, child.oid) as partition_bound
|
|
277
|
+
FROM pg_class child
|
|
278
|
+
JOIN pg_inherits inh ON child.oid = inh.inhrelid
|
|
279
|
+
JOIN pg_class parent ON inh.inhparent = parent.oid
|
|
280
|
+
JOIN pg_namespace n ON n.oid = child.relnamespace
|
|
281
|
+
WHERE n.nspname = 'public'
|
|
282
|
+
AND child.relispartition = true
|
|
283
|
+
ORDER BY parent.relname, child.relname;
|
|
284
|
+
`);
|
|
285
|
+
const partitions = partitionsResult.rows.map(row => ({
|
|
286
|
+
name: row.partition_name,
|
|
287
|
+
parentTable: row.parent_table,
|
|
288
|
+
partitionBound: row.partition_bound,
|
|
289
|
+
partitionType: 'LIST',
|
|
290
|
+
partitionKey: [],
|
|
291
|
+
}));
|
|
292
|
+
const partitionsByParent = new Map();
|
|
293
|
+
for (const partition of partitions) {
|
|
294
|
+
if (!partitionsByParent.has(partition.parentTable)) {
|
|
295
|
+
partitionsByParent.set(partition.parentTable, []);
|
|
296
|
+
}
|
|
297
|
+
partitionsByParent.get(partition.parentTable).push(partition);
|
|
298
|
+
}
|
|
299
|
+
for (const table of tables) {
|
|
300
|
+
if (table.isPartitioned) {
|
|
301
|
+
table.childPartitions = partitionsByParent.get(table.name) || [];
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
onProgress?.('fetching_extensions');
|
|
305
|
+
const extensionsResult = await pool.query(`
|
|
306
|
+
SELECT extname FROM pg_extension WHERE extname != 'plpgsql';
|
|
307
|
+
`);
|
|
308
|
+
const extensions = extensionsResult.rows.map(r => r.extname);
|
|
309
|
+
let functions = [];
|
|
310
|
+
if (includeFunctions) {
|
|
311
|
+
onProgress?.('fetching_functions');
|
|
312
|
+
const functionsResult = await pool.query(`
|
|
313
|
+
SELECT
|
|
314
|
+
p.proname as name,
|
|
315
|
+
n.nspname as schema,
|
|
316
|
+
pg_get_function_result(p.oid) as return_type,
|
|
317
|
+
pg_get_function_arguments(p.oid) as arg_types,
|
|
318
|
+
l.lanname as language,
|
|
319
|
+
pg_get_functiondef(p.oid) as definition,
|
|
320
|
+
p.prokind = 'a' as is_aggregate,
|
|
321
|
+
p.provolatile as volatility
|
|
322
|
+
FROM pg_proc p
|
|
323
|
+
JOIN pg_namespace n ON p.pronamespace = n.oid
|
|
324
|
+
JOIN pg_language l ON p.prolang = l.oid
|
|
325
|
+
WHERE n.nspname = 'public'
|
|
326
|
+
AND p.prokind IN ('f', 'a')
|
|
327
|
+
ORDER BY p.proname;
|
|
328
|
+
`);
|
|
329
|
+
functions = functionsResult.rows.map(f => ({
|
|
330
|
+
name: f.name,
|
|
331
|
+
schema: f.schema,
|
|
332
|
+
returnType: f.return_type,
|
|
333
|
+
argTypes: f.arg_types ? f.arg_types.split(', ') : [],
|
|
334
|
+
language: f.language,
|
|
335
|
+
definition: f.definition || '',
|
|
336
|
+
isAggregate: f.is_aggregate || false,
|
|
337
|
+
volatility: f.volatility === 'i' ? 'IMMUTABLE' : f.volatility === 's' ? 'STABLE' : 'VOLATILE',
|
|
338
|
+
}));
|
|
339
|
+
}
|
|
340
|
+
let triggers = [];
|
|
341
|
+
if (includeTriggers) {
|
|
342
|
+
onProgress?.('fetching_triggers');
|
|
343
|
+
const triggersResult = await pool.query(`
|
|
344
|
+
SELECT
|
|
345
|
+
t.tgname as name,
|
|
346
|
+
c.relname as table_name,
|
|
347
|
+
CASE
|
|
348
|
+
WHEN t.tgtype & 2 > 0 THEN 'BEFORE'
|
|
349
|
+
WHEN t.tgtype & 64 > 0 THEN 'INSTEAD OF'
|
|
350
|
+
ELSE 'AFTER'
|
|
351
|
+
END as timing,
|
|
352
|
+
CASE
|
|
353
|
+
WHEN t.tgtype & 4 > 0 THEN 'INSERT'
|
|
354
|
+
WHEN t.tgtype & 8 > 0 THEN 'DELETE'
|
|
355
|
+
WHEN t.tgtype & 16 > 0 THEN 'UPDATE'
|
|
356
|
+
ELSE 'UNKNOWN'
|
|
357
|
+
END as event,
|
|
358
|
+
p.proname as function_name,
|
|
359
|
+
pg_get_triggerdef(t.oid) as definition,
|
|
360
|
+
t.tgenabled != 'D' as is_enabled
|
|
361
|
+
FROM pg_trigger t
|
|
362
|
+
JOIN pg_class c ON t.tgrelid = c.oid
|
|
363
|
+
JOIN pg_namespace n ON c.relnamespace = n.oid
|
|
364
|
+
JOIN pg_proc p ON t.tgfoid = p.oid
|
|
365
|
+
WHERE n.nspname = 'public'
|
|
366
|
+
AND NOT t.tgisinternal
|
|
367
|
+
ORDER BY c.relname, t.tgname;
|
|
368
|
+
`);
|
|
369
|
+
triggers = triggersResult.rows.map(t => ({
|
|
370
|
+
name: t.name,
|
|
371
|
+
tableName: t.table_name,
|
|
372
|
+
timing: t.timing,
|
|
373
|
+
event: t.event,
|
|
374
|
+
functionName: t.function_name,
|
|
375
|
+
definition: t.definition || '',
|
|
376
|
+
isEnabled: t.is_enabled,
|
|
377
|
+
}));
|
|
378
|
+
}
|
|
379
|
+
onProgress?.('complete');
|
|
380
|
+
return {
|
|
381
|
+
tables,
|
|
382
|
+
enums,
|
|
383
|
+
domains: [],
|
|
384
|
+
compositeTypes: [],
|
|
385
|
+
sequences: [],
|
|
386
|
+
functions,
|
|
387
|
+
triggers,
|
|
388
|
+
policies: [],
|
|
389
|
+
partitions,
|
|
390
|
+
foreignServers: [],
|
|
391
|
+
foreignTables: [],
|
|
392
|
+
extensions,
|
|
393
|
+
};
|
|
394
|
+
}
|
|
395
|
+
finally {
|
|
396
|
+
await pool.end();
|
|
397
|
+
}
|
|
398
|
+
}
|