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,195 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.UpdateBuilder = void 0;
|
|
7
|
+
const pg_format_1 = __importDefault(require("../../addons/pg-format.js"));
|
|
8
|
+
const condition_collector_1 = require("../condition/condition-collector.cjs");
|
|
9
|
+
const case_converter_1 = require("../utils/case-converter.cjs");
|
|
10
|
+
const array_update_builder_1 = require("./array-update-builder.cjs");
|
|
11
|
+
const select_builder_1 = require("../select/select-builder.cjs");
|
|
12
|
+
const count_builder_1 = require("../count/count-builder.cjs");
|
|
13
|
+
class UpdateBuilder {
|
|
14
|
+
tableName;
|
|
15
|
+
updateData;
|
|
16
|
+
whereConditions = [];
|
|
17
|
+
returningClause;
|
|
18
|
+
_case = 'keep-case';
|
|
19
|
+
_convertCase = '2snake';
|
|
20
|
+
constructor(tableName, data) {
|
|
21
|
+
this.tableName = tableName;
|
|
22
|
+
this.updateData = data;
|
|
23
|
+
}
|
|
24
|
+
convertCase(type, conversionCase = '2snake') {
|
|
25
|
+
this._case = type;
|
|
26
|
+
this._convertCase = conversionCase;
|
|
27
|
+
return this;
|
|
28
|
+
}
|
|
29
|
+
where(callback) {
|
|
30
|
+
const conditionBuilder = new condition_collector_1.ConditionCollector();
|
|
31
|
+
callback(conditionBuilder);
|
|
32
|
+
this.whereConditions.push(...conditionBuilder.getConditions());
|
|
33
|
+
return this;
|
|
34
|
+
}
|
|
35
|
+
returning(columns) {
|
|
36
|
+
if (columns === null) {
|
|
37
|
+
this.returningClause = undefined;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
this.returningClause = {
|
|
41
|
+
type: 'columns',
|
|
42
|
+
columns: Array.isArray(columns) ? columns : [columns]
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
return this;
|
|
46
|
+
}
|
|
47
|
+
returningSelect(callback) {
|
|
48
|
+
const builder = new select_builder_1.SelectBuilder(this.tableName);
|
|
49
|
+
const result = callback(builder);
|
|
50
|
+
if (result === null) {
|
|
51
|
+
this.returningClause = undefined;
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
this.returningClause = {
|
|
55
|
+
type: 'select',
|
|
56
|
+
builder: result
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
return this;
|
|
60
|
+
}
|
|
61
|
+
returningCount(callback) {
|
|
62
|
+
const builder = new count_builder_1.CountBuilder(this.tableName);
|
|
63
|
+
const result = callback(builder);
|
|
64
|
+
if (result === null) {
|
|
65
|
+
this.returningClause = undefined;
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
this.returningClause = {
|
|
69
|
+
type: 'count',
|
|
70
|
+
builder: result
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
return this;
|
|
74
|
+
}
|
|
75
|
+
convertColumnName(name) {
|
|
76
|
+
if (this._case === 'to-lower')
|
|
77
|
+
return name.toLowerCase();
|
|
78
|
+
if (this._case === 'to-upper')
|
|
79
|
+
return name.toUpperCase();
|
|
80
|
+
if (this._case === 'convert-case')
|
|
81
|
+
return (0, case_converter_1.convertCase)(name, this._convertCase);
|
|
82
|
+
return name;
|
|
83
|
+
}
|
|
84
|
+
formatArrayValue(value) {
|
|
85
|
+
if (value.length === 0)
|
|
86
|
+
return 'ARRAY[]';
|
|
87
|
+
const firstElement = value[0];
|
|
88
|
+
const firstType = typeof firstElement;
|
|
89
|
+
const isHomogeneous = value.every(v => typeof v === firstType);
|
|
90
|
+
if (!isHomogeneous) {
|
|
91
|
+
const jsonValues = value.map(v => (0, pg_format_1.default)('%L::jsonb', JSON.stringify(v))).join(',');
|
|
92
|
+
return `ARRAY[${jsonValues}]`;
|
|
93
|
+
}
|
|
94
|
+
if (firstType === 'string') {
|
|
95
|
+
const stringValues = value.map(v => (0, pg_format_1.default)('%L', v)).join(',');
|
|
96
|
+
return `ARRAY[${stringValues}]`;
|
|
97
|
+
}
|
|
98
|
+
if (firstType === 'number') {
|
|
99
|
+
return `ARRAY[${value.join(',')}]`;
|
|
100
|
+
}
|
|
101
|
+
if (firstType === 'boolean') {
|
|
102
|
+
return `ARRAY[${value.map(v => v.toString()).join(',')}]`;
|
|
103
|
+
}
|
|
104
|
+
if (firstType === 'object' && firstElement !== null) {
|
|
105
|
+
const jsonValues = value.map(v => (0, pg_format_1.default)('%L::jsonb', JSON.stringify(v))).join(',');
|
|
106
|
+
return `ARRAY[${jsonValues}]`;
|
|
107
|
+
}
|
|
108
|
+
const stringValues = value.map(v => (0, pg_format_1.default)('%L', v)).join(',');
|
|
109
|
+
return `ARRAY[${stringValues}]`;
|
|
110
|
+
}
|
|
111
|
+
toString() {
|
|
112
|
+
const processedPairs = Object.entries(this.updateData).map(([col, val]) => {
|
|
113
|
+
const convertedCol = this.convertColumnName(col);
|
|
114
|
+
if (typeof val === 'function') {
|
|
115
|
+
const arrayBuilder = new array_update_builder_1.ArrayUpdateBuilder(col);
|
|
116
|
+
const result = val(arrayBuilder);
|
|
117
|
+
const finalResult = result.replace(/__COLUMN__/g, pg_format_1.default.ident(convertedCol));
|
|
118
|
+
return (0, pg_format_1.default)('%I = %s', convertedCol, finalResult);
|
|
119
|
+
}
|
|
120
|
+
if (Array.isArray(val)) {
|
|
121
|
+
return (0, pg_format_1.default)('%I = %s', convertedCol, this.formatArrayValue(val));
|
|
122
|
+
}
|
|
123
|
+
return (0, pg_format_1.default)('%I = %L', convertedCol, val);
|
|
124
|
+
});
|
|
125
|
+
let query = (0, pg_format_1.default)('UPDATE %I SET %s', this.tableName, processedPairs.join(', '));
|
|
126
|
+
if (this.whereConditions.length > 0) {
|
|
127
|
+
query += ' WHERE ' + (0, condition_collector_1.buildConditionsSQL)(this.whereConditions);
|
|
128
|
+
}
|
|
129
|
+
if (this.returningClause) {
|
|
130
|
+
query += this.buildReturningClause();
|
|
131
|
+
}
|
|
132
|
+
return query;
|
|
133
|
+
}
|
|
134
|
+
parseCountColumns(columnsStr) {
|
|
135
|
+
const columns = [];
|
|
136
|
+
let depth = 0;
|
|
137
|
+
let currentExpr = '';
|
|
138
|
+
let i = 0;
|
|
139
|
+
while (i < columnsStr.length) {
|
|
140
|
+
const char = columnsStr[i];
|
|
141
|
+
if (char === '(')
|
|
142
|
+
depth++;
|
|
143
|
+
else if (char === ')')
|
|
144
|
+
depth--;
|
|
145
|
+
else if (char === ',' && depth === 0) {
|
|
146
|
+
if (currentExpr.trim()) {
|
|
147
|
+
columns.push(this.parseColumnExpr(currentExpr.trim()));
|
|
148
|
+
}
|
|
149
|
+
currentExpr = '';
|
|
150
|
+
i++;
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
currentExpr += char;
|
|
154
|
+
i++;
|
|
155
|
+
}
|
|
156
|
+
if (currentExpr.trim()) {
|
|
157
|
+
columns.push(this.parseColumnExpr(currentExpr.trim()));
|
|
158
|
+
}
|
|
159
|
+
return columns;
|
|
160
|
+
}
|
|
161
|
+
parseColumnExpr(expr) {
|
|
162
|
+
const asMatch = expr.match(/^(.+?)\s+AS\s+(.+)$/i);
|
|
163
|
+
if (!asMatch) {
|
|
164
|
+
return { name: 'count', expr };
|
|
165
|
+
}
|
|
166
|
+
const [, expression, alias] = asMatch;
|
|
167
|
+
const name = alias.replace(/^["']|["']$/g, '');
|
|
168
|
+
return { name, expr: expression.trim() };
|
|
169
|
+
}
|
|
170
|
+
buildReturningClause() {
|
|
171
|
+
if (!this.returningClause)
|
|
172
|
+
return '';
|
|
173
|
+
switch (this.returningClause.type) {
|
|
174
|
+
case 'columns':
|
|
175
|
+
return (0, pg_format_1.default)(' RETURNING %I', this.returningClause.columns);
|
|
176
|
+
case 'select': {
|
|
177
|
+
const selectSQL = this.returningClause.builder.toString();
|
|
178
|
+
return ` RETURNING (${selectSQL})`;
|
|
179
|
+
}
|
|
180
|
+
case 'count': {
|
|
181
|
+
const countSQL = this.returningClause.builder.toString();
|
|
182
|
+
const selectMatch = countSQL.match(/^SELECT\s+(.+?)\s+FROM\s+(.+)$/is);
|
|
183
|
+
if (!selectMatch)
|
|
184
|
+
return ` RETURNING (${countSQL})`;
|
|
185
|
+
const [, columnsStr, fromClause] = selectMatch;
|
|
186
|
+
const columns = this.parseCountColumns(columnsStr);
|
|
187
|
+
const jsonArgs = columns.map(({ name, expr }) => `${(0, pg_format_1.default)('%L', name)}, ${expr}`).join(', ');
|
|
188
|
+
return ` RETURNING (SELECT json_build_object(${jsonArgs}) FROM ${fromClause})`;
|
|
189
|
+
}
|
|
190
|
+
default:
|
|
191
|
+
return '';
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
exports.UpdateBuilder = UpdateBuilder;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.convertCase = convertCase;
|
|
4
|
+
function convertCase(str, type) {
|
|
5
|
+
if (!str || typeof str !== 'string')
|
|
6
|
+
return str;
|
|
7
|
+
function toCamel(s) {
|
|
8
|
+
return s.split(/[_\s-]+/).filter(segment => segment.length > 0).map((segment, index) => {
|
|
9
|
+
if (index === 0)
|
|
10
|
+
return segment.charAt(0).toLowerCase() + segment.slice(1).toLowerCase();
|
|
11
|
+
return segment.charAt(0).toUpperCase() + segment.slice(1).toLowerCase();
|
|
12
|
+
}).join('').replace(/'/g, '');
|
|
13
|
+
}
|
|
14
|
+
function toPascal(s) {
|
|
15
|
+
return s.split(/[_\s-]+/).filter(segment => segment.length > 0).map(segment => {
|
|
16
|
+
return segment.charAt(0).toUpperCase() + segment.slice(1).toLowerCase();
|
|
17
|
+
}).join('').replace(/'/g, '');
|
|
18
|
+
}
|
|
19
|
+
function toSnake(s) {
|
|
20
|
+
return s.split(/[_\s-]+/).filter(segment => segment.length > 0).map(segment => {
|
|
21
|
+
return segment.replace(/([a-z])([A-Z])/g, '$1_$2').toLowerCase();
|
|
22
|
+
}).join('_').replace(/'/g, '');
|
|
23
|
+
}
|
|
24
|
+
switch (type) {
|
|
25
|
+
case 'snake2camel':
|
|
26
|
+
return /^[a-z0-9]+(_[a-z0-9]+)*$/.test(str)
|
|
27
|
+
? str.split('_').map((word, index) => index === 0 ? word : word.charAt(0).toUpperCase() + word.slice(1)).join('')
|
|
28
|
+
: str;
|
|
29
|
+
case 'snake2pascal':
|
|
30
|
+
return /^[a-z0-9]+(_[a-z0-9]+)*$/.test(str)
|
|
31
|
+
? str.split('_').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join('')
|
|
32
|
+
: str;
|
|
33
|
+
case 'camel2snake':
|
|
34
|
+
return /^[a-z][a-z0-9]*([A-Z][a-z0-9]*)*$/.test(str)
|
|
35
|
+
? str.replace(/([A-Z])/g, '_$1').toLowerCase()
|
|
36
|
+
: str;
|
|
37
|
+
case 'camel2pascal':
|
|
38
|
+
return /^[a-z][a-z0-9]*([A-Z][a-z0-9]*)*$/.test(str)
|
|
39
|
+
? str.charAt(0).toUpperCase() + str.slice(1)
|
|
40
|
+
: str;
|
|
41
|
+
case 'pascal2snake':
|
|
42
|
+
return /^[A-Z][a-z0-9]*([A-Z][a-z0-9]*)*$/.test(str)
|
|
43
|
+
? str.replace(/([A-Z])/g, (match, offset) => offset > 0 ? '_' + match : match).toLowerCase()
|
|
44
|
+
: str;
|
|
45
|
+
case 'pascal2camel':
|
|
46
|
+
return /^[A-Z][a-z0-9]*([A-Z][a-z0-9]*)*$/.test(str)
|
|
47
|
+
? str.charAt(0).toLowerCase() + str.slice(1)
|
|
48
|
+
: str;
|
|
49
|
+
case '2camel':
|
|
50
|
+
return toCamel(str);
|
|
51
|
+
case '2pascal':
|
|
52
|
+
return toPascal(str);
|
|
53
|
+
case '2snake':
|
|
54
|
+
return toSnake(str);
|
|
55
|
+
default:
|
|
56
|
+
return str;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.detectEnvironment = detectEnvironment;
|
|
4
|
+
exports.isServerless = isServerless;
|
|
5
|
+
exports.isTraditional = isTraditional;
|
|
6
|
+
exports.isEdge = isEdge;
|
|
7
|
+
exports.getEnvironmentDescription = getEnvironmentDescription;
|
|
8
|
+
function detectEnvironment() {
|
|
9
|
+
const detected = [];
|
|
10
|
+
const hasProcess = typeof process !== 'undefined' && process.env !== undefined;
|
|
11
|
+
if (!hasProcess) {
|
|
12
|
+
return {
|
|
13
|
+
type: 'edge',
|
|
14
|
+
provider: 'cloudflare',
|
|
15
|
+
detected: ['NO_PROCESS_OBJECT'],
|
|
16
|
+
hasProcess: false
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
if (process.env.VERCEL || process.env.VERCEL_ENV) {
|
|
20
|
+
if (process.env.VERCEL)
|
|
21
|
+
detected.push('VERCEL');
|
|
22
|
+
if (process.env.VERCEL_ENV)
|
|
23
|
+
detected.push('VERCEL_ENV');
|
|
24
|
+
return {
|
|
25
|
+
type: 'serverless',
|
|
26
|
+
provider: 'vercel',
|
|
27
|
+
detected,
|
|
28
|
+
hasProcess: true
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
if (process.env.AWS_LAMBDA_FUNCTION_NAME ||
|
|
32
|
+
process.env.AWS_EXECUTION_ENV ||
|
|
33
|
+
process.env.LAMBDA_TASK_ROOT) {
|
|
34
|
+
if (process.env.AWS_LAMBDA_FUNCTION_NAME)
|
|
35
|
+
detected.push('AWS_LAMBDA_FUNCTION_NAME');
|
|
36
|
+
if (process.env.AWS_EXECUTION_ENV)
|
|
37
|
+
detected.push('AWS_EXECUTION_ENV');
|
|
38
|
+
if (process.env.LAMBDA_TASK_ROOT)
|
|
39
|
+
detected.push('LAMBDA_TASK_ROOT');
|
|
40
|
+
return {
|
|
41
|
+
type: 'serverless',
|
|
42
|
+
provider: 'aws-lambda',
|
|
43
|
+
detected,
|
|
44
|
+
hasProcess: true
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
if (process.env.NETLIFY || process.env.NETLIFY_DEV) {
|
|
48
|
+
if (process.env.NETLIFY)
|
|
49
|
+
detected.push('NETLIFY');
|
|
50
|
+
if (process.env.NETLIFY_DEV)
|
|
51
|
+
detected.push('NETLIFY_DEV');
|
|
52
|
+
return {
|
|
53
|
+
type: 'serverless',
|
|
54
|
+
provider: 'netlify',
|
|
55
|
+
detected,
|
|
56
|
+
hasProcess: true
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
if (process.env.FUNCTION_NAME || process.env.FUNCTION_TARGET || process.env.GCP_PROJECT) {
|
|
60
|
+
if (process.env.FUNCTION_NAME)
|
|
61
|
+
detected.push('FUNCTION_NAME');
|
|
62
|
+
if (process.env.FUNCTION_TARGET)
|
|
63
|
+
detected.push('FUNCTION_TARGET');
|
|
64
|
+
if (process.env.GCP_PROJECT)
|
|
65
|
+
detected.push('GCP_PROJECT');
|
|
66
|
+
return {
|
|
67
|
+
type: 'serverless',
|
|
68
|
+
provider: 'google-cloud',
|
|
69
|
+
detected,
|
|
70
|
+
hasProcess: true
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
if (process.env.AZURE_FUNCTIONS_ENVIRONMENT || process.env.WEBSITE_INSTANCE_ID) {
|
|
74
|
+
if (process.env.AZURE_FUNCTIONS_ENVIRONMENT)
|
|
75
|
+
detected.push('AZURE_FUNCTIONS_ENVIRONMENT');
|
|
76
|
+
if (process.env.WEBSITE_INSTANCE_ID)
|
|
77
|
+
detected.push('WEBSITE_INSTANCE_ID');
|
|
78
|
+
return {
|
|
79
|
+
type: 'serverless',
|
|
80
|
+
provider: 'azure',
|
|
81
|
+
detected,
|
|
82
|
+
hasProcess: true
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
if (process.env.CLOUDFLARE_WORKERS || process.env.CF_PAGES) {
|
|
86
|
+
if (process.env.CLOUDFLARE_WORKERS)
|
|
87
|
+
detected.push('CLOUDFLARE_WORKERS');
|
|
88
|
+
if (process.env.CF_PAGES)
|
|
89
|
+
detected.push('CF_PAGES');
|
|
90
|
+
return {
|
|
91
|
+
type: 'edge',
|
|
92
|
+
provider: 'cloudflare',
|
|
93
|
+
detected,
|
|
94
|
+
hasProcess: true
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
type: 'traditional',
|
|
99
|
+
detected: [],
|
|
100
|
+
hasProcess: true
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
function isServerless() {
|
|
104
|
+
return detectEnvironment().type === 'serverless';
|
|
105
|
+
}
|
|
106
|
+
function isTraditional() {
|
|
107
|
+
return detectEnvironment().type === 'traditional';
|
|
108
|
+
}
|
|
109
|
+
function isEdge() {
|
|
110
|
+
return detectEnvironment().type === 'edge';
|
|
111
|
+
}
|
|
112
|
+
function getEnvironmentDescription(env) {
|
|
113
|
+
if (env.type === 'serverless') {
|
|
114
|
+
return `${env.provider} (serverless)`;
|
|
115
|
+
}
|
|
116
|
+
if (env.type === 'edge') {
|
|
117
|
+
return `${env.provider || 'edge'} runtime`;
|
|
118
|
+
}
|
|
119
|
+
return 'Traditional server';
|
|
120
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.format = exports.convertCase = void 0;
|
|
7
|
+
var case_converter_1 = require("./case-converter.cjs");
|
|
8
|
+
Object.defineProperty(exports, "convertCase", { enumerable: true, get: function () { return case_converter_1.convertCase; } });
|
|
9
|
+
var pg_format_1 = require("../../addons/pg-format.js");
|
|
10
|
+
Object.defineProperty(exports, "format", { enumerable: true, get: function () { return __importDefault(pg_format_1).default; } });
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getSmartPoolDefaults = getSmartPoolDefaults;
|
|
4
|
+
exports.validatePoolConfig = validatePoolConfig;
|
|
5
|
+
exports.mergeWithDefaults = mergeWithDefaults;
|
|
6
|
+
exports.formatPoolConfig = formatPoolConfig;
|
|
7
|
+
const environment_detection_1 = require("./environment-detection.cjs");
|
|
8
|
+
function getSmartPoolDefaults() {
|
|
9
|
+
const env = (0, environment_detection_1.detectEnvironment)();
|
|
10
|
+
const baseConfig = {
|
|
11
|
+
min: 0,
|
|
12
|
+
idleTimeoutMillis: 10000,
|
|
13
|
+
connectionTimeoutMillis: 10000,
|
|
14
|
+
pool: false
|
|
15
|
+
};
|
|
16
|
+
if (env.type === 'serverless') {
|
|
17
|
+
return {
|
|
18
|
+
...baseConfig,
|
|
19
|
+
max: 1,
|
|
20
|
+
idleTimeoutMillis: 1000,
|
|
21
|
+
recommendation: `Serverless environment detected (${env.provider}).\n` +
|
|
22
|
+
' Using single connection mode (recommended).\n' +
|
|
23
|
+
' If pooling enabled: min: 0, max: 1'
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
if (env.type === 'edge') {
|
|
27
|
+
return {
|
|
28
|
+
...baseConfig,
|
|
29
|
+
max: 0,
|
|
30
|
+
recommendation: 'Edge runtime detected. PostgreSQL connections not supported.\n' +
|
|
31
|
+
' Use query builder only: relq("table").select().toString()'
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
...baseConfig,
|
|
36
|
+
max: 10,
|
|
37
|
+
idleTimeoutMillis: 30000,
|
|
38
|
+
recommendation: 'Traditional server environment.\n' +
|
|
39
|
+
' Pooling disabled by default (single client).\n' +
|
|
40
|
+
' To enable pooling: new Relq(schema, { pool: true, ... })'
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function validatePoolConfig(config, env) {
|
|
44
|
+
const warnings = [];
|
|
45
|
+
const errors = [];
|
|
46
|
+
const min = config.min ?? 0;
|
|
47
|
+
const max = config.max ?? 10;
|
|
48
|
+
if (env.type === 'edge') {
|
|
49
|
+
errors.push('❌ Edge runtime detected (Cloudflare Workers/Deno Deploy).\n' +
|
|
50
|
+
' PostgreSQL connections are not supported in edge runtimes.\n' +
|
|
51
|
+
' \n' +
|
|
52
|
+
' Options:\n' +
|
|
53
|
+
' 1. Use query builder only: relq("table").select().toString()\n' +
|
|
54
|
+
' 2. Use HTTP-based database (Supabase, Neon, Xata)\n' +
|
|
55
|
+
' 3. Deploy to traditional Node.js runtime');
|
|
56
|
+
return { valid: false, warnings, errors };
|
|
57
|
+
}
|
|
58
|
+
if (min > max) {
|
|
59
|
+
warnings.push(`⚠️ Pool min (${min}) is greater than max (${max}).\n` +
|
|
60
|
+
` This is invalid. Min will be clamped to max (${max}).`);
|
|
61
|
+
}
|
|
62
|
+
if (env.type === 'serverless' && max > 1) {
|
|
63
|
+
warnings.push(`⚠️ Running in ${env.provider} with pool max: ${max}.\n` +
|
|
64
|
+
' Each serverless function will create up to ' + max + ' connections.\n' +
|
|
65
|
+
' With many concurrent functions, this can exhaust PostgreSQL connections.\n' +
|
|
66
|
+
' \n' +
|
|
67
|
+
' Recommended: pool: { min: 0, max: 1 }\n' +
|
|
68
|
+
' \n' +
|
|
69
|
+
' If you need connection pooling in serverless:\n' +
|
|
70
|
+
' - Use PgBouncer or connection pooler\n' +
|
|
71
|
+
' - Use Supabase (built-in pooling)\n' +
|
|
72
|
+
' - Use Neon serverless driver');
|
|
73
|
+
}
|
|
74
|
+
if (env.type === 'traditional' && min > 5) {
|
|
75
|
+
warnings.push(`⚠️ Pool min set to ${min}. This keeps ${min} connections always open.\n` +
|
|
76
|
+
' High min values waste resources when traffic is low.\n' +
|
|
77
|
+
' \n' +
|
|
78
|
+
' Recommended: min: 0 (connections created on demand)\n' +
|
|
79
|
+
' Pool will scale up to max: ' + max + ' under load automatically.');
|
|
80
|
+
}
|
|
81
|
+
if (max > 20) {
|
|
82
|
+
warnings.push(`⚠️ Pool max set to ${max}. This is very high.\n` +
|
|
83
|
+
' PostgreSQL connection limit is typically 100-200.\n' +
|
|
84
|
+
' Multiple app instances × max connections can exhaust the database.\n' +
|
|
85
|
+
' \n' +
|
|
86
|
+
' Recommended: max: 10-20 per app instance');
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
valid: errors.length === 0,
|
|
90
|
+
warnings,
|
|
91
|
+
errors
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
function mergeWithDefaults(userConfig) {
|
|
95
|
+
const defaults = getSmartPoolDefaults();
|
|
96
|
+
return {
|
|
97
|
+
min: userConfig?.min ?? defaults.min,
|
|
98
|
+
max: userConfig?.max ?? defaults.max,
|
|
99
|
+
idleTimeoutMillis: userConfig?.idleTimeoutMillis ?? defaults.idleTimeoutMillis,
|
|
100
|
+
connectionTimeoutMillis: userConfig?.connectionTimeoutMillis ?? defaults.connectionTimeoutMillis,
|
|
101
|
+
recommendation: defaults.recommendation
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
function formatPoolConfig(config) {
|
|
105
|
+
return `{ min: ${config.min}, max: ${config.max}, idleTimeout: ${config.idleTimeoutMillis}ms }`;
|
|
106
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.deserializeValue = deserializeValue;
|
|
4
|
+
exports.deserializeRow = deserializeRow;
|
|
5
|
+
exports.deserializeRows = deserializeRows;
|
|
6
|
+
exports.serializeValue = serializeValue;
|
|
7
|
+
exports.serializeRow = serializeRow;
|
|
8
|
+
exports.extractSchemaColumns = extractSchemaColumns;
|
|
9
|
+
const BIGINT_TYPES = new Set(['BIGINT', 'INT8', 'BIGSERIAL', 'SERIAL8']);
|
|
10
|
+
const DATE_TYPES = new Set(['TIMESTAMP', 'TIMESTAMPTZ', 'DATE', 'TIME', 'TIMETZ']);
|
|
11
|
+
const JSON_TYPES = new Set(['JSON', 'JSONB']);
|
|
12
|
+
function deserializeValue(value, pgType) {
|
|
13
|
+
if (value === null || value === undefined) {
|
|
14
|
+
return value;
|
|
15
|
+
}
|
|
16
|
+
const upperType = pgType.toUpperCase();
|
|
17
|
+
if (BIGINT_TYPES.has(upperType)) {
|
|
18
|
+
if (typeof value === 'string') {
|
|
19
|
+
return BigInt(value);
|
|
20
|
+
}
|
|
21
|
+
if (typeof value === 'number') {
|
|
22
|
+
return BigInt(value);
|
|
23
|
+
}
|
|
24
|
+
return value;
|
|
25
|
+
}
|
|
26
|
+
if (DATE_TYPES.has(upperType) || upperType.startsWith('TIMESTAMP')) {
|
|
27
|
+
if (value instanceof Date) {
|
|
28
|
+
return value;
|
|
29
|
+
}
|
|
30
|
+
if (typeof value === 'string' || typeof value === 'number') {
|
|
31
|
+
return new Date(value);
|
|
32
|
+
}
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
35
|
+
if (JSON_TYPES.has(upperType)) {
|
|
36
|
+
if (typeof value === 'string') {
|
|
37
|
+
try {
|
|
38
|
+
return JSON.parse(value);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return value;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return value;
|
|
45
|
+
}
|
|
46
|
+
if (upperType === 'BOOLEAN' || upperType === 'BOOL') {
|
|
47
|
+
if (typeof value === 'string') {
|
|
48
|
+
return value.toLowerCase() === 'true' || value === 't' || value === '1';
|
|
49
|
+
}
|
|
50
|
+
return Boolean(value);
|
|
51
|
+
}
|
|
52
|
+
return value;
|
|
53
|
+
}
|
|
54
|
+
function deserializeRow(row, schema) {
|
|
55
|
+
const result = {};
|
|
56
|
+
const columnMap = new Map();
|
|
57
|
+
for (const [key, config] of Object.entries(schema)) {
|
|
58
|
+
const dbColumnName = config.$columnName || key;
|
|
59
|
+
columnMap.set(dbColumnName, { key, type: config.$type });
|
|
60
|
+
}
|
|
61
|
+
for (const [dbColumn, value] of Object.entries(row)) {
|
|
62
|
+
const mapping = columnMap.get(dbColumn);
|
|
63
|
+
if (mapping) {
|
|
64
|
+
result[mapping.key] = deserializeValue(value, mapping.type);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
result[dbColumn] = value;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
function deserializeRows(rows, schema) {
|
|
73
|
+
return rows.map(row => deserializeRow(row, schema));
|
|
74
|
+
}
|
|
75
|
+
function serializeValue(value, pgType) {
|
|
76
|
+
if (value === null || value === undefined) {
|
|
77
|
+
return value;
|
|
78
|
+
}
|
|
79
|
+
const upperType = pgType.toUpperCase();
|
|
80
|
+
if (BIGINT_TYPES.has(upperType)) {
|
|
81
|
+
if (typeof value === 'bigint') {
|
|
82
|
+
return value.toString();
|
|
83
|
+
}
|
|
84
|
+
return value;
|
|
85
|
+
}
|
|
86
|
+
if (DATE_TYPES.has(upperType) || upperType.startsWith('TIMESTAMP')) {
|
|
87
|
+
if (value instanceof Date) {
|
|
88
|
+
return value.toISOString();
|
|
89
|
+
}
|
|
90
|
+
return value;
|
|
91
|
+
}
|
|
92
|
+
if (JSON_TYPES.has(upperType)) {
|
|
93
|
+
if (typeof value === 'object' && value !== null) {
|
|
94
|
+
return JSON.stringify(value);
|
|
95
|
+
}
|
|
96
|
+
return value;
|
|
97
|
+
}
|
|
98
|
+
return value;
|
|
99
|
+
}
|
|
100
|
+
function serializeRow(row, schema) {
|
|
101
|
+
const result = {};
|
|
102
|
+
for (const [key, value] of Object.entries(row)) {
|
|
103
|
+
const config = schema[key];
|
|
104
|
+
if (config) {
|
|
105
|
+
result[key] = serializeValue(value, config.$type);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
result[key] = value;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return result;
|
|
112
|
+
}
|
|
113
|
+
function extractSchemaColumns(tableDefinition) {
|
|
114
|
+
if (tableDefinition && tableDefinition.$columns) {
|
|
115
|
+
return tableDefinition.$columns;
|
|
116
|
+
}
|
|
117
|
+
return null;
|
|
118
|
+
}
|